mirror of
				https://github.com/invoiceninja/invoiceninja.git
				synced 2025-11-04 08:07:34 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			176 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			176 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace App\Http\Controllers;
 | 
						|
 | 
						|
use App\Jobs\ExportReportResults;
 | 
						|
use App\Jobs\RunReport;
 | 
						|
use App\Models\Account;
 | 
						|
use App\Models\ScheduledReport;
 | 
						|
use Auth;
 | 
						|
use Input;
 | 
						|
use Utils;
 | 
						|
use View;
 | 
						|
use Carbon;
 | 
						|
use Validator;
 | 
						|
 | 
						|
/**
 | 
						|
 * Class ReportController.
 | 
						|
 */
 | 
						|
class ReportController extends BaseController
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * @return \Illuminate\Contracts\View\View
 | 
						|
     */
 | 
						|
    public function d3()
 | 
						|
    {
 | 
						|
        $message = '';
 | 
						|
        $fileName = storage_path().'/dataviz_sample.txt';
 | 
						|
 | 
						|
        if (Auth::user()->account->hasFeature(FEATURE_REPORTS)) {
 | 
						|
            $account = Account::where('id', '=', Auth::user()->account->id)
 | 
						|
                            ->with(['clients.invoices.invoice_items', 'clients.contacts'])
 | 
						|
                            ->first();
 | 
						|
            $account = $account->hideFieldsForViz();
 | 
						|
            $clients = $account->clients;
 | 
						|
        } elseif (file_exists($fileName)) {
 | 
						|
            $clients = file_get_contents($fileName);
 | 
						|
            $message = trans('texts.sample_data');
 | 
						|
        } else {
 | 
						|
            $clients = '[]';
 | 
						|
        }
 | 
						|
 | 
						|
        $data = [
 | 
						|
            'clients' => $clients,
 | 
						|
            'message' => $message,
 | 
						|
        ];
 | 
						|
 | 
						|
        return View::make('reports.d3', $data);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return \Illuminate\Contracts\View\View
 | 
						|
     */
 | 
						|
    public function showReports()
 | 
						|
    {
 | 
						|
        if (! Auth::user()->hasPermission('view_all')) {
 | 
						|
            return redirect('/');
 | 
						|
        }
 | 
						|
 | 
						|
        $action = Input::get('action');
 | 
						|
        $format = Input::get('format');
 | 
						|
 | 
						|
        if (Input::get('report_type')) {
 | 
						|
            $reportType = Input::get('report_type');
 | 
						|
            $dateField = Input::get('date_field');
 | 
						|
            $startDate = date_create(Input::get('start_date'));
 | 
						|
            $endDate = date_create(Input::get('end_date'));
 | 
						|
        } else {
 | 
						|
            $reportType = ENTITY_INVOICE;
 | 
						|
            $dateField = FILTER_INVOICE_DATE;
 | 
						|
            $startDate = Utils::today(false)->modify('-3 month');
 | 
						|
            $endDate = Utils::today(false);
 | 
						|
        }
 | 
						|
 | 
						|
        $reportTypes = [
 | 
						|
            'activity',
 | 
						|
            'aging',
 | 
						|
            'client',
 | 
						|
            'document',
 | 
						|
            'expense',
 | 
						|
            'invoice',
 | 
						|
            'payment',
 | 
						|
            'product',
 | 
						|
            'profit_and_loss',
 | 
						|
            'task',
 | 
						|
            'tax_rate',
 | 
						|
            'quote',
 | 
						|
        ];
 | 
						|
 | 
						|
        $params = [
 | 
						|
            'startDate' => $startDate->format('Y-m-d'),
 | 
						|
            'endDate' => $endDate->format('Y-m-d'),
 | 
						|
            'reportTypes' => array_combine($reportTypes, Utils::trans($reportTypes)),
 | 
						|
            'reportType' => $reportType,
 | 
						|
            'title' => trans('texts.charts_and_reports'),
 | 
						|
            'account' => Auth::user()->account,
 | 
						|
        ];
 | 
						|
 | 
						|
        if (Auth::user()->account->hasFeature(FEATURE_REPORTS)) {
 | 
						|
            $isExport = $action == 'export';
 | 
						|
            $config = [
 | 
						|
                'date_field' => $dateField,
 | 
						|
                'status_ids' => request()->status_ids,
 | 
						|
                'group_dates_by' => request()->group_dates_by,
 | 
						|
                'document_filter' => request()->document_filter,
 | 
						|
                'currency_type' => request()->currency_type,
 | 
						|
                'export_format' => $format,
 | 
						|
                'start_date' => $params['startDate'],
 | 
						|
                'end_date' => $params['endDate'],
 | 
						|
            ];
 | 
						|
            $report = dispatch(new RunReport(auth()->user(), $reportType, $config, $isExport));
 | 
						|
            $params = array_merge($params, $report->exportParams);
 | 
						|
            switch ($action) {
 | 
						|
                case 'export':
 | 
						|
                    return dispatch(new ExportReportResults(auth()->user(), $format, $reportType, $params))->export($format);
 | 
						|
                    break;
 | 
						|
                case 'schedule':
 | 
						|
                    self::schedule($params, $config);
 | 
						|
                    return redirect('/reports');
 | 
						|
                    break;
 | 
						|
                case 'cancel_schedule':
 | 
						|
                    self::cancelSchdule();
 | 
						|
                    return redirect('/reports');
 | 
						|
                    break;
 | 
						|
            }
 | 
						|
        } else {
 | 
						|
            $params['columns'] = [];
 | 
						|
            $params['displayData'] = [];
 | 
						|
            $params['reportTotals'] = [];
 | 
						|
            $params['report'] = false;
 | 
						|
        }
 | 
						|
 | 
						|
        $params['scheduledReports'] = ScheduledReport::scope()->whereUserId(auth()->user()->id)->get();
 | 
						|
 | 
						|
        return View::make('reports.report_builder', $params);
 | 
						|
    }
 | 
						|
 | 
						|
    private function schedule($params, $options)
 | 
						|
    {
 | 
						|
        $validator = Validator::make(request()->all(), [
 | 
						|
            'frequency' => 'required|in:daily,weekly,biweekly,monthly',
 | 
						|
            'send_date' => 'required',
 | 
						|
        ]);
 | 
						|
 | 
						|
        if ($validator->fails()) {
 | 
						|
            session()->now('message', trans('texts.scheduled_report_error'));
 | 
						|
        } else {
 | 
						|
            $options['report_type'] = $params['reportType'];
 | 
						|
            $options['range'] = request('range');
 | 
						|
            $options['start_date_offset'] = $options['range'] ? '' : Carbon::parse($params['startDate'])->diffInDays(null, false); // null,false to get the relative/non-absolute diff
 | 
						|
            $options['end_date_offset'] = $options['range'] ? '' : Carbon::parse($params['endDate'])->diffInDays(null, false);
 | 
						|
 | 
						|
            unset($options['start_date']);
 | 
						|
            unset($options['end_date']);
 | 
						|
            unset($options['group_dates_by']);
 | 
						|
 | 
						|
            $schedule = ScheduledReport::createNew();
 | 
						|
            $schedule->config = json_encode($options);
 | 
						|
            $schedule->frequency = request('frequency');
 | 
						|
            $schedule->send_date = Utils::toSqlDate(request('send_date'));
 | 
						|
            $schedule->save();
 | 
						|
 | 
						|
            session()->flash('message', trans('texts.created_scheduled_report'));
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    private function cancelSchdule()
 | 
						|
    {
 | 
						|
        ScheduledReport::scope()
 | 
						|
            ->whereUserId(auth()->user()->id)
 | 
						|
            ->wherePublicId(request('scheduled_report_id'))
 | 
						|
            ->delete();
 | 
						|
 | 
						|
        session()->flash('message', trans('texts.deleted_scheduled_report'));
 | 
						|
    }
 | 
						|
}
 |