Fix handling of discounts in invoiceSummary(), added invoiceSummaryCredit() to show invoices in credit

This commit is contained in:
Deon George 2024-07-05 23:36:28 +10:00
parent f0ec35f463
commit b3d5bf05a9

View File

@ -27,6 +27,13 @@ class Account extends Model implements IDs
/* STATIC */ /* STATIC */
public static function InvoicesCredit(Collection $invoices=NULL): Collection
{
return (new self)
->invoiceSummaryCredit($invoices,TRUE)
->get();
}
public static function InvoicesDue(Collection $invoices=NULL): Collection public static function InvoicesDue(Collection $invoices=NULL): Collection
{ {
return (new self) return (new self)
@ -255,11 +262,11 @@ class Account extends Model implements IDs
DB::raw('SUM(item) AS _item'), DB::raw('SUM(item) AS _item'),
DB::raw('SUM(tax) AS _tax'), DB::raw('SUM(tax) AS _tax'),
DB::raw('SUM(payments) AS _payment'), DB::raw('SUM(payments) AS _payment'),
DB::raw('SUM(discount) AS _discount'), DB::raw('SUM(discount)+COALESCE(invoices.discount_amt,0) AS _discount'),
DB::raw('SUM(item_total) AS _item_total'), DB::raw('SUM(item_total) AS _item_total'),
DB::raw('SUM(payment_fees) AS _payment_fee'), DB::raw('SUM(payment_fees) AS _payment_fee'),
DB::raw('ROUND(CAST(SUM(item_total)-SUM(COALESCE(discount,0))+COALESCE(invoices.discount_amt,0) AS NUMERIC),2) AS _total'), DB::raw('ROUND(CAST(SUM(item_total)-COALESCE(invoices.discount_amt,0) AS NUMERIC),2) AS _total'),
DB::raw('ROUND(CAST(SUM(item_total)-SUM(COALESCE(discount,0))+COALESCE(invoices.discount_amt,0)-SUM(payments) AS NUMERIC),2) AS _balance'), DB::raw('ROUND(CAST(SUM(item_total)-COALESCE(invoices.discount_amt,0)-SUM(payments) AS NUMERIC),2) AS _balance'),
'invoices.due_at', 'invoices.due_at',
'invoices.created_at', 'invoices.created_at',
]) ])
@ -284,8 +291,8 @@ class Account extends Model implements IDs
'invoice_id', 'invoice_id',
DB::raw('ROUND(CAST(SUM(quantity*price_base) AS NUMERIC),2) AS item'), DB::raw('ROUND(CAST(SUM(quantity*price_base) AS NUMERIC),2) AS item'),
DB::raw('ROUND(CAST(SUM(amount) AS NUMERIC),2) AS tax'), DB::raw('ROUND(CAST(SUM(amount) AS NUMERIC),2) AS tax'),
DB::raw('SUM(COALESCE(invoice_items.discount_amt,0)) AS discount'), DB::raw('ROUND(CAST(SUM(COALESCE(invoice_items.discount_amt,0)) AS NUMERIC),2) AS discount'),
DB::raw('ROUND(CAST(SUM(ROUND(CAST(quantity*price_base AS NUMERIC),2))+SUM(ROUND(CAST(amount AS NUMERIC),2))-SUM(COALESCE(invoice_items.discount_amt,0)) AS NUMERIC),2) AS item_total'), DB::raw('ROUND(CAST(SUM(ROUND(CAST(quantity*price_base AS NUMERIC),2))+SUM(ROUND(CAST(amount AS NUMERIC),2))-SUM(ROUND(CAST(COALESCE(invoice_items.discount_amt,0) AS NUMERIC),2)) AS NUMERIC),2) AS item_total'),
DB::raw('0 as payments'), DB::raw('0 as payments'),
DB::raw('0 as payment_fees'), DB::raw('0 as payment_fees'),
]) ])
@ -305,7 +312,13 @@ class Account extends Model implements IDs
public function invoiceSummaryDue(Collection $invoices=NULL,bool $all=FALSE): Builder public function invoiceSummaryDue(Collection $invoices=NULL,bool $all=FALSE): Builder
{ {
return $this->invoiceSummary($invoices,$all) return $this->invoiceSummary($invoices,$all)
->havingRaw('ROUND(CAST(SUM(item_total)-SUM(COALESCE(discount,0))+COALESCE(invoices.discount_amt,0)-SUM(payments) AS NUMERIC),2) > 0'); ->havingRaw('ROUND(CAST(SUM(item_total)-COALESCE(invoices.discount_amt,0)-SUM(payments) AS NUMERIC),2) > 0');
}
public function invoiceSummaryCredit(Collection $invoices=NULL,bool $all=FALSE): Builder
{
return $this->invoiceSummary($invoices,$all)
->havingRaw('ROUND(CAST(SUM(item_total)-COALESCE(invoices.discount_amt,0)-SUM(payments) AS NUMERIC),2) < 0');
} }
public function invoiceSummaryPast(Collection $invoices=NULL,bool $all=FALSE): Builder public function invoiceSummaryPast(Collection $invoices=NULL,bool $all=FALSE): Builder
@ -314,7 +327,7 @@ class Account extends Model implements IDs
->join('payment_items',['payment_items.invoice_id'=>'invoices.id']) ->join('payment_items',['payment_items.invoice_id'=>'invoices.id'])
->join('payments',['payments.id'=>'payment_items.payment_id']) ->join('payments',['payments.id'=>'payment_items.payment_id'])
->addSelect(DB::raw('max(paid_at) as _paid_at')) ->addSelect(DB::raw('max(paid_at) as _paid_at'))
->havingRaw('ROUND(CAST(SUM(item_total)-SUM(COALESCE(discount,0))+COALESCE(invoices.discount_amt,0)-SUM(payments) AS NUMERIC),2) <= 0'); ->havingRaw('ROUND(CAST(SUM(item_total)-COALESCE(invoices.discount_amt,0)-SUM(payments) AS NUMERIC),2) <= 0');
} }
/** /**