year = $year; $this->orderType = $orderType; $this->orderDirection = $orderDirection; $this->archive = $archive; $this->handle(); } public function getInvoiceReport() { return $this->invoiceReport; } private function handle() { $this->setProjects(); $this->loopProjects(); //only projects with payments also archived projects $this->setMonthPayments(); $this->setInvoiceReport(); } private function setProjects() { $this->projects = Project::getProjectsForReport( $this->orderType, $this->orderDirection, $this->archive ); } private function loopProjects() { foreach ( $this->projects as $this->project ) { $this->setInvoiceOverview(); $this->setInvoiceForecasts(); $this->setMonthForecasts(); } } private function setInvoiceOverview() { $this->invoiceOverview = new InvoiceOverview( $this->project, $this->year ); $this->invoiceOverviews[] = $this->invoiceOverview->getProjectDetails(); } private function setInvoiceForecasts() { $this->invoiceForecast = new InvoiceForecast( $this->project, $this->invoiceOverview->getNeedinvoice(), $this->year ); $this->invoiceForecasts[] = $this->invoiceForecast->getProjectDetails(); } public function setMonthForecasts() { $this->monthForecast = new MonthForecast( $this->invoiceForecast, $this->project, $this->year ); $this->monthForecasts[] = $this->monthForecast->getProjectDetails(); } public function setMonthPayments() { $monthPayment = new MonthPayments( $this->year, $this->orderType, $this->orderDirection ); $this->monthPayments = $monthPayment->getProjectDetails(); } private function setInvoiceReport() { $this->invoiceReport = [ 'invoiceOverview' => $this->invoiceOverviews, 'forecasts' => $this->invoiceForecasts, 'monthForecasts' => $this->monthForecasts, 'monthPayments' => $this->monthPayments ]; } }