diff --git a/app/Mail/Engine/PaymentEmailEngine.php b/app/Mail/Engine/PaymentEmailEngine.php index 5c617935b87c..4395b662472e 100644 --- a/app/Mail/Engine/PaymentEmailEngine.php +++ b/app/Mail/Engine/PaymentEmailEngine.php @@ -237,6 +237,10 @@ class PaymentEmailEngine extends BaseEmailEngine $data['$invoice.po_number'] = ['value' => $this->formatPoNumber(), 'label' => ctrans('texts.po_number')]; $data['$poNumber'] = &$data['$invoice.po_number']; $data['$payment.status'] = ['value' => $this->payment->stringStatus($this->payment->status_id), 'label' => ctrans('texts.payment_status')]; + $data['$invoices.amount'] = ['value' => $this->formatInvoiceField('amount'), 'label' => ctrans('texts.invoices')]; + $data['$invoices.balance'] = ['value' => $this->formatInvoiceField('balance'), 'label' => ctrans('texts.invoices')]; + $data['$invoices.due_date'] = ['value' => $this->formatInvoiceField('due_date'), 'label' => ctrans('texts.invoices')]; + $data['$invoices.po_number'] = ['value' => $this->formatInvoiceField('po_number'), 'label' => ctrans('texts.invoices')]; $arrKeysLength = array_map('strlen', array_keys($data)); array_multisort($arrKeysLength, SORT_DESC, $data); @@ -244,6 +248,22 @@ class PaymentEmailEngine extends BaseEmailEngine return $data; } + private function formatInvoiceField($field) + { + $invoice = ''; + + foreach ($this->payment->invoices as $invoice) { + + $invoice_field = $invoice->{$field}; + + $invoice .= ctrans('texts.invoice_number_short') . "{$invoice->number} {$invoice_field}"; + + } + + return $invoice; + + } + private function formatInvoice() { $invoice = ''; @@ -282,11 +302,15 @@ class PaymentEmailEngine extends BaseEmailEngine $invoice_list = '

'; foreach ($this->payment->invoices as $invoice) { - $invoice_list .= ctrans('texts.po_number')." {$invoice->po_number}
"; + + if(strlen($invoice->po_number) > 1) + $invoice_list .= ctrans('texts.po_number')." {$invoice->po_number}
"; + $invoice_list .= ctrans('texts.invoice_number_short')." {$invoice->number}
"; $invoice_list .= ctrans('texts.invoice_amount').' '.Number::formatMoney($invoice->pivot->amount, $this->client).'
'; $invoice_list .= ctrans('texts.invoice_balance').' '.Number::formatMoney($invoice->fresh()->balance, $this->client).'
'; $invoice_list .= '-----
'; + } return $invoice_list; diff --git a/app/Services/Invoice/MarkPaid.php b/app/Services/Invoice/MarkPaid.php index e0a49b57cd0b..ccfd3e25cd1c 100644 --- a/app/Services/Invoice/MarkPaid.php +++ b/app/Services/Invoice/MarkPaid.php @@ -41,20 +41,37 @@ class MarkPaid extends AbstractService public function run() { - if ($this->invoice->status_id == Invoice::STATUS_DRAFT) { - $this->invoice->service()->markSent()->save(); - } /*Don't double pay*/ if ($this->invoice->status_id == Invoice::STATUS_PAID) { return $this->invoice; } + if ($this->invoice->status_id == Invoice::STATUS_DRAFT) { + $this->invoice->service()->markSent()->save(); + } + + $payable_balance = $this->invoice->balance; + + \DB::connection(config('database.default'))->transaction(function () use($payable_balance) { + + $this->invoice = Invoice::where('id', $this->invoice->id)->lockForUpdate()->first(); + + $this->invoice + ->service() + ->setExchangeRate() + ->updateBalance($payable_balance * -1) + ->updatePaidToDate($payable_balance) + ->setStatus(Invoice::STATUS_PAID) + ->save(); + + }, 1); + /* Create Payment */ $payment = PaymentFactory::create($this->invoice->company_id, $this->invoice->user_id); - $payment->amount = $this->invoice->balance; - $payment->applied = $this->invoice->balance; + $payment->amount = $payable_balance; + $payment->applied = $payable_balance; $payment->status_id = Payment::STATUS_COMPLETED; $payment->client_id = $this->invoice->client_id; $payment->transaction_reference = ctrans('texts.manual_entry'); @@ -79,20 +96,20 @@ class MarkPaid extends AbstractService /* Create a payment relationship to the invoice entity */ $payment->invoices()->attach($this->invoice->id, [ - 'amount' => $payment->amount, + 'amount' => $payable_balance, ]); event('eloquent.created: App\Models\Payment', $payment); $this->invoice->next_send_date = null; - $this->invoice - ->service() - ->setExchangeRate() - ->updateBalance($payment->amount * -1) - ->updatePaidToDate($payment->amount) - ->setStatus(Invoice::STATUS_PAID) - ->save(); + // $this->invoice + // ->service() + // ->setExchangeRate() + // ->updateBalance($payment->amount * -1) + // ->updatePaidToDate($payment->amount) + // ->setStatus(Invoice::STATUS_PAID) + // ->save(); $this->invoice ->service() @@ -101,7 +118,7 @@ class MarkPaid extends AbstractService ->save(); $payment->ledger() - ->updatePaymentBalance($payment->amount * -1); + ->updatePaymentBalance($payable_balance * -1); \DB::connection(config('database.default'))->transaction(function () use ($payment) { diff --git a/app/Services/Subscription/ZeroCostProduct.php b/app/Services/Subscription/ZeroCostProduct.php index f0947cb0a35e..b16aea48ce26 100644 --- a/app/Services/Subscription/ZeroCostProduct.php +++ b/app/Services/Subscription/ZeroCostProduct.php @@ -42,9 +42,9 @@ class ZeroCostProduct extends AbstractService $invoice = $this->subscription->service()->createInvoice($this->data); - $invoice->service() - ->markPaid() - ->save(); + $invoice = $invoice->service() + ->markPaid() + ->save(); $redirect_url = "/client/invoices/{$invoice->hashed_id}"; diff --git a/tests/Feature/EntityPaidToDateTest.php b/tests/Feature/EntityPaidToDateTest.php index 842806131c36..e39f3b3891d1 100644 --- a/tests/Feature/EntityPaidToDateTest.php +++ b/tests/Feature/EntityPaidToDateTest.php @@ -72,7 +72,7 @@ class EntityPaidToDateTest extends TestCase $this->assertEquals($invoice->balance, 20); - $invoice->service()->markPaid()->save(); + $invoice = $invoice->service()->markPaid()->save(); $this->assertEquals($invoice->paid_to_date, 20); } @@ -81,7 +81,7 @@ class EntityPaidToDateTest extends TestCase { $invoice = $this->bootNewInvoice(); - $invoice->service()->markPaid()->save(); + $invoice = $invoice->service()->markPaid()->save(); $this->assertEquals(20, $invoice->paid_to_date); diff --git a/tests/Feature/InvoiceAmountPaymentTest.php b/tests/Feature/InvoiceAmountPaymentTest.php index c9d7b1e1b599..51edeaf5b7f3 100644 --- a/tests/Feature/InvoiceAmountPaymentTest.php +++ b/tests/Feature/InvoiceAmountPaymentTest.php @@ -185,7 +185,7 @@ class InvoiceAmountPaymentTest extends TestCase $this->assertEquals(25, $invoice->balance); $this->assertEquals(25, $invoice->amount); - $invoice->service()->markPaid()->save(); + $invoice = $invoice->service()->markPaid()->save(); $invoice->fresh(); diff --git a/tests/Feature/PaymentTest.php b/tests/Feature/PaymentTest.php index a2a9a4d5c49c..f12e892cea6e 100644 --- a/tests/Feature/PaymentTest.php +++ b/tests/Feature/PaymentTest.php @@ -1422,7 +1422,7 @@ class PaymentTest extends TestCase $this->assertEquals(10, $this->invoice->balance); $this->assertEquals(10, $this->invoice->client->fresh()->balance); - $this->invoice->service()->markPaid()->save(); + $this->invoice = $this->invoice->service()->markPaid()->save(); $this->assertEquals(0, $this->invoice->balance); $this->assertEquals(0, $this->invoice->client->balance); diff --git a/tests/Unit/GoogleAnalyticsTest.php b/tests/Unit/GoogleAnalyticsTest.php index 0f2991f5971b..3f9730885801 100644 --- a/tests/Unit/GoogleAnalyticsTest.php +++ b/tests/Unit/GoogleAnalyticsTest.php @@ -40,7 +40,7 @@ class GoogleAnalyticsTest extends TestCase $invoice = $this->invoice; $client = $this->client; - $invoice->service()->markPaid()->save(); + $invoice = $invoice->service()->markPaid()->save(); $payment = $invoice->payments->first(); diff --git a/tests/Unit/InvoiceActionsTest.php b/tests/Unit/InvoiceActionsTest.php index 68e17ada0aa2..eefb6e59489a 100644 --- a/tests/Unit/InvoiceActionsTest.php +++ b/tests/Unit/InvoiceActionsTest.php @@ -45,7 +45,7 @@ class InvoiceActionsTest extends TestCase { $this->withoutEvents(); - $this->invoice->service()->markPaid()->save(); + $this->invoice = $this->invoice->service()->markPaid()->save(); $this->assertFalse($this->invoiceDeletable($this->invoice)); $this->assertTrue($this->invoiceReversable($this->invoice)); diff --git a/tests/Unit/SubscriptionsCalcTest.php b/tests/Unit/SubscriptionsCalcTest.php index 8b41565e1b77..93ded70631df 100644 --- a/tests/Unit/SubscriptionsCalcTest.php +++ b/tests/Unit/SubscriptionsCalcTest.php @@ -82,7 +82,7 @@ class SubscriptionsCalcTest extends TestCase $this->assertFalse($sub_calculator->isPaidUp()); - $invoice->service()->markPaid()->save(); + $invoice = $invoice->service()->markPaid()->save(); $this->assertTrue($sub_calculator->isPaidUp());