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());