diff --git a/app/Helpers/Invoice/InvoiceSum.php b/app/Helpers/Invoice/InvoiceSum.php index 349d0271c36c..2aeb3e962194 100644 --- a/app/Helpers/Invoice/InvoiceSum.php +++ b/app/Helpers/Invoice/InvoiceSum.php @@ -242,9 +242,9 @@ class InvoiceSum if ($this->invoice->status_id != Invoice::STATUS_DRAFT) { if ($this->invoice->amount != $this->invoice->balance) { - $paid_to_date = $this->invoice->amount - $this->invoice->balance; + // $paid_to_date = $this->invoice->amount - $this->invoice->balance; - $this->invoice->balance = Number::roundValue($this->getTotal(), $this->precision) - $paid_to_date; + $this->invoice->balance = Number::roundValue($this->getTotal(), $this->precision) - $this->invoice->paid_to_date; } else { $this->invoice->balance = Number::roundValue($this->getTotal(), $this->precision); } diff --git a/app/Helpers/Invoice/InvoiceSumInclusive.php b/app/Helpers/Invoice/InvoiceSumInclusive.php index 9afbe1c76db7..8a7df5e68def 100644 --- a/app/Helpers/Invoice/InvoiceSumInclusive.php +++ b/app/Helpers/Invoice/InvoiceSumInclusive.php @@ -259,9 +259,9 @@ class InvoiceSumInclusive /* If amount != balance then some money has been paid on the invoice, need to subtract this difference from the total to set the new balance */ if ($this->invoice->status_id != Invoice::STATUS_DRAFT) { if ($this->invoice->amount != $this->invoice->balance) { - $paid_to_date = $this->invoice->amount - $this->invoice->balance; + // $paid_to_date = $this->invoice->amount - $this->invoice->balance; - $this->invoice->balance = $this->formatValue($this->getTotal(), $this->precision) - $paid_to_date; + $this->invoice->balance = $this->formatValue($this->getTotal(), $this->precision) - $this->invoice->paid_to_date; } else { $this->invoice->balance = $this->formatValue($this->getTotal(), $this->precision); } diff --git a/tests/Unit/InvoiceBalanceTest.php b/tests/Unit/InvoiceBalanceTest.php new file mode 100644 index 000000000000..d3e31b6479ad --- /dev/null +++ b/tests/Unit/InvoiceBalanceTest.php @@ -0,0 +1,241 @@ +makeTestData(); + } + + public function testInvoiceBalances() + { + + $item = new InvoiceItem(); + $item->quantity = 1; + $item->cost = 100; + $item->type_id = '1'; + + $i = Invoice::factory()->create([ + 'company_id' => $this->company->id, + 'user_id' => $this->user->id, + 'client_id' => $this->client->id, + 'line_items' => [$item], + 'status_id' => 1, + 'tax_rate1' => 0, + 'tax_rate2' => 0, + 'tax_rate3' => 0, + 'tax_name1' => '', + 'tax_name2' => '', + 'tax_name3' => '', + 'discount' => 0, + 'paid_to_date' => 0, + ]); + + + $this->assertEquals(1, $i->status_id); + + $i = $i->calc()->getInvoice()->service()->markSent()->save(); + + $this->assertEquals(100, $i->amount); + $this->assertEquals(100, $i->balance); + $this->assertEquals(2, $i->status_id); + $this->assertEquals(0, $i->paid_to_date); + + + $item = new InvoiceItem(); + $item->quantity = 1; + $item->cost = 30.37; + $item->type_id = '1'; + + $i->line_items = [$item]; + + $i = $i->calc()->getInvoice(); + + // nlog($i->withoutRelations()->toArray()); + + $this->assertEquals(30.37, $i->amount); + $this->assertEquals(30.37, $i->balance); + $this->assertEquals(2, $i->status_id); + $this->assertEquals(0, $i->paid_to_date); + + $i = $i->service()->applyPaymentAmount(10.37, 'paid')->save(); + + // nlog($i->withoutRelations()->toArray()); + + $this->assertEquals(30.37, $i->amount); + $this->assertEquals(20.00, $i->balance); + $this->assertEquals(3, $i->status_id); + $this->assertEquals(10.37, $i->paid_to_date); + + $item = new InvoiceItem(); + $item->quantity = 1; + $item->cost = 15; + $item->type_id = '1'; + + $i->line_items = [$item]; + + $i = $i->calc()->getInvoice(); + + $this->assertEquals(15, $i->amount); + $this->assertEquals(15-10.37, $i->balance); + $this->assertEquals(3, $i->status_id); + $this->assertEquals(10.37, $i->paid_to_date); + + + } + + + public function testInvoiceBalancesWithNegatives() + { + + $item = new InvoiceItem(); + $item->quantity = 1; + $item->cost = -100; + $item->type_id = '1'; + + $i = Invoice::factory()->create([ + 'company_id' => $this->company->id, + 'user_id' => $this->user->id, + 'client_id' => $this->client->id, + 'line_items' => [$item], + 'status_id' => 1, + 'tax_rate1' => 0, + 'tax_rate2' => 0, + 'tax_rate3' => 0, + 'tax_name1' => '', + 'tax_name2' => '', + 'tax_name3' => '', + 'discount' => 0, + 'paid_to_date' => 0, + ]); + + + $this->assertEquals(1, $i->status_id); + + $i = $i->calc()->getInvoice()->service()->markSent()->save(); + + $this->assertEquals(-100, $i->amount); + $this->assertEquals(-100, $i->balance); + $this->assertEquals(2, $i->status_id); + $this->assertEquals(0, $i->paid_to_date); + + + $item = new InvoiceItem(); + $item->quantity = 1; + $item->cost = -30.37; + $item->type_id = '1'; + + $i->line_items = [$item]; + + $i = $i->calc()->getInvoice(); + + $this->assertEquals(-30.37, $i->amount); + $this->assertEquals(-30.37, $i->balance); + $this->assertEquals(2, $i->status_id); + $this->assertEquals(0, $i->paid_to_date); + + $i = $i->service()->markPaid()->save(); + + $this->assertEquals(0, $i->balance); + $this->assertEquals(-30.37, $i->paid_to_date); + } + + + + + public function testPurchaseOrderBalances() + { + + $item = new InvoiceItem(); + $item->quantity = 1; + $item->cost = 100; + $item->type_id = '1'; + + $i = PurchaseOrder::factory()->create([ + 'company_id' => $this->company->id, + 'user_id' => $this->user->id, + 'vendor_id' => $this->vendor->id, + 'line_items' => [$item], + 'status_id' => 1, + 'tax_rate1' => 0, + 'tax_rate2' => 0, + 'tax_rate3' => 0, + 'tax_name1' => '', + 'tax_name2' => '', + 'tax_name3' => '', + 'discount' => 0, + 'paid_to_date' => 0, + ]); + + $this->assertEquals(1, $i->status_id); + + $i = $i->calc()->getPurchaseOrder(); + $i = $i->service()->markSent()->save(); + + $this->assertEquals(100, $i->amount); + $this->assertEquals(100, $i->balance); + $this->assertEquals(2, $i->status_id); + $this->assertEquals(0, $i->paid_to_date); + + + $item = new InvoiceItem(); + $item->quantity = 1; + $item->cost = 30.37; + $item->type_id = '1'; + + $i->line_items = [$item]; + + $i = $i->calc()->getPurchaseOrder(); + $i = $i->service()->markSent()->save(); + + $this->assertEquals(30.37, $i->amount); + $this->assertEquals(30.37, $i->balance); + $this->assertEquals(2, $i->status_id); + $this->assertEquals(0, $i->paid_to_date); + + $item = new InvoiceItem(); + $item->quantity = 1; + $item->cost =10.37; + $item->type_id = '1'; + + $i->line_items = [$item]; + + $i = $i->calc()->getPurchaseOrder(); + $i = $i->service()->markSent()->save(); + + $this->assertEquals(10.37, $i->amount); + $this->assertEquals(10.37, $i->balance); + $this->assertEquals(2, $i->status_id); + $this->assertEquals(0, $i->paid_to_date); + + + + } + +}