belongsTo( 'Project' ); } public function payments() { return $this->hasMany( 'Payment' ); } public function vat() { return $this->belongsTo( 'Vat' ); } public static function invoicePerYear( $projectID, $year, $thatYear = TRUE ) { $invoices = Invoice::selectRAW( 'SUM(invoiceamount * ( 1 +(vatrate / 100))) AS invoicetotal' ) ->join( 'vats', 'vats.id', '=', 'invoices.vat_id' ) ->whereProjectId( $projectID ); if ( $thatYear ) { $invoices = $invoices->whereRaw( "YEAR(invoicedate) = {$year}" ); } else { $invoices = $invoices->whereRaw( "YEAR(invoicedate) != {$year}" ); } if ( $invoices->count() == 0 ) return 0; $invoices = $invoices->first(); return $invoices->invoicetotal; } public static function saveInvoice( $invoiceID, $invoice ) { $invoice = (array) $invoice; if ( $invoiceID == 0 ) { $invoice = Invoice::create( $invoice ); $invoiceID = $invoice['id']; } else { Invoice::whereId( $invoiceID )->update( $invoice ); } return $invoiceID; } public static function getInvoiced( $year, $orderType='invoicedate', $orderDirection='DESC' ) { $invoiced = Invoice::selectRaw('invoicenumber, PRJ.projectname, projectnumber, CUS.name, invoicedate, CUS.name, ROUND(invoiceamount, 0) AS invoiceamount') ->join('projects AS PRJ', 'PRJ.id', '=', 'invoices.project_id') ->join('customers AS CUS', 'CUS.id', '=', 'PRJ.customer_id') ->whereRaw("DATE_FORMAT(invoicedate, '%Y') = {$year}") ->orderBy($orderType, $orderDirection) ->get(); return $invoiced; } public static function getInvoicedPerYearPerProject($projectID) { $invoiced = Invoice::selectRaw('ROUND(COALESCE(SUM(invoiceamount), 0), 0) AS invoiced, YEAR(invoicedate) AS invoiceyear') ->where('project_id', $projectID) ->groupByRaw('YEAR(invoicedate)') ->orderByRaw('YEAR(invoicedate)') ->get(); return $invoiced; } public static function getTotalsOutstandingPerProject($archive = true) { $sql = " SELECT PRJ.id, projectnumber, projectname, SUM(invoiced) AS invoiced, SUM(payment) AS payment, revenues, costs, COALESCE(payedcosts, 0) AS payedcosts FROM ( SELECT project_id, ROUND(SUM(invoiceamount * (1 + (vatrate / 100))), 0) AS invoiced, payment FROM invoices INV JOIN vats VAT ON VAT.id = INV.vat_id LEFT JOIN ( SELECT ROUND(COALESCE(SUM(paymentamount), 0), 0) AS payment, invoice_id FROM payments GROUP BY invoice_id) AS Q1 ON INV.id = Q1.invoice_id GROUP BY INV.id) Q2 JOIN projects PRJ ON PRJ.id = Q2.project_id JOIN ( SELECT ROUND((own_revenue + other_revenue + costs) * (1 + (vatrate / 100)), 0) revenues, ROUND(costs * (1 + (vatrate / 100)), 0) costs, OFF.project_id FROM offers OFF JOIN projects PRJ ON PRJ.id = OFF.project_id JOIN vats VAT ON VAT.id = PRJ.vat_id) Q3 ON Q3.project_id = PRJ.id LEFT JOIN ( SELECT SUM(costs) AS payedcosts, project_id FROM projectcosts GROUP BY project_id) Q4 ON Q4.project_id = PRJ.id "; if ($archive === false) { $sql .= "WHERE PRJ.archive = 'F' "; } $sql .= "GROUP BY PRJ.id"; $db = \Config\Database::connect(); return $db->query($sql)->getResult(); } }