From c71d7ffeec7fced5efdf26635a20ef5619b4f73d Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 4 Sep 2024 09:17:46 +1000 Subject: [PATCH] Ensure line item gateway fees are not cloned --- app/Http/Requests/Credit/StoreCreditRequest.php | 1 + app/Http/Requests/Invoice/StoreInvoiceRequest.php | 1 + .../PurchaseOrder/StorePurchaseOrderRequest.php | 1 + app/Http/Requests/Quote/StoreQuoteRequest.php | 1 + .../StoreRecurringInvoiceRequest.php | 2 ++ app/Services/Invoice/AutoBillInvoice.php | 2 ++ app/Utils/Traits/CleanLineItems.php | 14 ++++++++++++++ tests/Feature/TaskStatusApiTest.php | 2 -- 8 files changed, 22 insertions(+), 2 deletions(-) diff --git a/app/Http/Requests/Credit/StoreCreditRequest.php b/app/Http/Requests/Credit/StoreCreditRequest.php index 626ee07fdc48..86cb9e1f2166 100644 --- a/app/Http/Requests/Credit/StoreCreditRequest.php +++ b/app/Http/Requests/Credit/StoreCreditRequest.php @@ -107,6 +107,7 @@ class StoreCreditRequest extends Request $input = $this->decodePrimaryKeys($input); $input['line_items'] = isset($input['line_items']) ? $this->cleanItems($input['line_items']) : []; + $input['line_items'] = $this->cleanFeeItems($input['line_items']); $input['amount'] = $this->entityTotalAmount($input['line_items']); if (array_key_exists('exchange_rate', $input) && is_null($input['exchange_rate'])) { diff --git a/app/Http/Requests/Invoice/StoreInvoiceRequest.php b/app/Http/Requests/Invoice/StoreInvoiceRequest.php index f76174d0ca9b..4617dd77340a 100644 --- a/app/Http/Requests/Invoice/StoreInvoiceRequest.php +++ b/app/Http/Requests/Invoice/StoreInvoiceRequest.php @@ -108,6 +108,7 @@ class StoreInvoiceRequest extends Request if (isset($input['line_items']) && is_array($input['line_items'])) { $input['line_items'] = isset($input['line_items']) ? $this->cleanItems($input['line_items']) : []; + $input['line_items'] = $this->cleanFeeItems($input['line_items']); $input['amount'] = $this->entityTotalAmount($input['line_items']); } if(isset($input['partial']) && $input['partial'] == 0) { diff --git a/app/Http/Requests/PurchaseOrder/StorePurchaseOrderRequest.php b/app/Http/Requests/PurchaseOrder/StorePurchaseOrderRequest.php index 27e6b1b8c7ad..8ab1e534de9e 100644 --- a/app/Http/Requests/PurchaseOrder/StorePurchaseOrderRequest.php +++ b/app/Http/Requests/PurchaseOrder/StorePurchaseOrderRequest.php @@ -95,6 +95,7 @@ class StorePurchaseOrderRequest extends Request if (isset($input['line_items']) && is_array($input['line_items'])) { $input['line_items'] = isset($input['line_items']) ? $this->cleanItems($input['line_items']) : []; + $input['line_items'] = $this->cleanFeeItems($input['line_items']); $input['amount'] = $this->entityTotalAmount($input['line_items']); } diff --git a/app/Http/Requests/Quote/StoreQuoteRequest.php b/app/Http/Requests/Quote/StoreQuoteRequest.php index 47264fc28d10..fb6f70a5121f 100644 --- a/app/Http/Requests/Quote/StoreQuoteRequest.php +++ b/app/Http/Requests/Quote/StoreQuoteRequest.php @@ -101,6 +101,7 @@ class StoreQuoteRequest extends Request if (isset($input['line_items']) && is_array($input['line_items'])) { $input['line_items'] = isset($input['line_items']) ? $this->cleanItems($input['line_items']) : []; + $input['line_items'] = $this->cleanFeeItems($input['line_items']); $input['amount'] = $this->entityTotalAmount($input['line_items']); } if(isset($input['partial']) && $input['partial'] == 0) { diff --git a/app/Http/Requests/RecurringInvoice/StoreRecurringInvoiceRequest.php b/app/Http/Requests/RecurringInvoice/StoreRecurringInvoiceRequest.php index 3bdecfa1e66e..2ff1df711c96 100644 --- a/app/Http/Requests/RecurringInvoice/StoreRecurringInvoiceRequest.php +++ b/app/Http/Requests/RecurringInvoice/StoreRecurringInvoiceRequest.php @@ -148,6 +148,8 @@ class StoreRecurringInvoiceRequest extends Request } $input['line_items'] = isset($input['line_items']) ? $this->cleanItems($input['line_items']) : []; + $input['line_items'] = $this->cleanFeeItems($input['line_items']); + $input['amount'] = $this->entityTotalAmount($input['line_items']); if (isset($input['auto_bill'])) { diff --git a/app/Services/Invoice/AutoBillInvoice.php b/app/Services/Invoice/AutoBillInvoice.php index 802bf4de6553..3c7fc0bb9c75 100644 --- a/app/Services/Invoice/AutoBillInvoice.php +++ b/app/Services/Invoice/AutoBillInvoice.php @@ -148,6 +148,7 @@ class AutoBillInvoice extends AbstractService ]); nlog("Payment hash created => {$payment_hash->id}"); + $this->invoice->saveQuietly(); $payment = false; try { @@ -162,6 +163,7 @@ class AutoBillInvoice extends AbstractService } + $this->invoice = $this->invoice->fresh(); $this->invoice->auto_bill_tries += 1; if ($this->invoice->auto_bill_tries == 3) { diff --git a/app/Utils/Traits/CleanLineItems.php b/app/Utils/Traits/CleanLineItems.php index e82623bd3f0a..786bff352020 100644 --- a/app/Utils/Traits/CleanLineItems.php +++ b/app/Utils/Traits/CleanLineItems.php @@ -34,6 +34,20 @@ trait CleanLineItems return $cleaned_items; } + public function cleanFeeItems($items): array + { + + //ensure we never allow gateway fees to be cloned across to new entities + foreach ($items as $key => $value) { + if (in_array($value->type_id, ['3','4'])) { + unset($items[$key]); + } + } + + return $items; + + } + /** * Sets default values for the line_items. * @param $item diff --git a/tests/Feature/TaskStatusApiTest.php b/tests/Feature/TaskStatusApiTest.php index dda27d76960a..8bc204ae2138 100644 --- a/tests/Feature/TaskStatusApiTest.php +++ b/tests/Feature/TaskStatusApiTest.php @@ -73,8 +73,6 @@ class TaskStatusApiTest extends TestCase ])->put('/api/v1/task_statuses/'.$task_status->hashed_id, $data); - $xx = TaskStatus::where('company_id', $this->company->id)->pluck('status_order'); - $t = TaskStatus::where('company_id', $this->company->id)->orderBy('status_order', 'asc')->first(); $this->assertEquals($id, $t->id);