From e809fa156d90b4698fca1931da21984a58a4c64b Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 15 Mar 2023 16:17:24 +1100 Subject: [PATCH] Recurring invoice update / upgrade pricing --- app/Models/RecurringInvoice.php | 4 +- app/Services/Recurring/IncreasePrices.php | 49 ++++++++++++++++++++ app/Services/Recurring/RecurringService.php | 29 ++++++++++-- app/Services/Recurring/UpdatePrices.php | 51 +++++++++++++++++++++ tests/Feature/RecurringInvoiceTest.php | 49 ++++++++++++++++++++ 5 files changed, 176 insertions(+), 6 deletions(-) create mode 100644 app/Services/Recurring/IncreasePrices.php create mode 100644 app/Services/Recurring/UpdatePrices.php diff --git a/app/Models/RecurringInvoice.php b/app/Models/RecurringInvoice.php index f95a941723f0..4a5de7fc39aa 100644 --- a/app/Models/RecurringInvoice.php +++ b/app/Models/RecurringInvoice.php @@ -735,7 +735,9 @@ class RecurringInvoice extends BaseModel } /** - * Service entry points. + * service + * + * @return RecurringService */ public function service() :RecurringService { diff --git a/app/Services/Recurring/IncreasePrices.php b/app/Services/Recurring/IncreasePrices.php new file mode 100644 index 000000000000..60c18332d358 --- /dev/null +++ b/app/Services/Recurring/IncreasePrices.php @@ -0,0 +1,49 @@ +ids) + ->cursor() + ->each(function ($recurring_invoice) { + + $line_items = $recurring_invoice->line_items; + foreach ($line_items as $key => $line_item) { + + $line_items[$key]->cost = $line_item->cost * (1 + round(($this->percentage / 100), 2)); + + } + + $recurring_invoice->line_items = $line_items; + $recurring_invoice->calc()->getInvoice()->save(); + }); + + + } + + +} diff --git a/app/Services/Recurring/RecurringService.php b/app/Services/Recurring/RecurringService.php index 7a056a5c1d32..359c7e2e88e5 100644 --- a/app/Services/Recurring/RecurringService.php +++ b/app/Services/Recurring/RecurringService.php @@ -11,18 +11,22 @@ namespace App\Services\Recurring; -use App\Jobs\RecurringInvoice\SendRecurring; use App\Jobs\Util\UnlinkFile; -use App\Models\RecurringInvoice; use Illuminate\Support\Carbon; +use App\Models\RecurringExpense; +use App\Models\RecurringInvoice; +use App\Services\Recurring\ApplyNumber; +use App\Services\Recurring\UpdatePrices; +use App\Services\Recurring\GetInvoicePdf; +use App\Services\Recurring\IncreasePrices; +use App\Jobs\RecurringInvoice\SendRecurring; +use App\Services\Recurring\CreateRecurringInvitations; class RecurringService { - protected $recurring_entity; - public function __construct($recurring_entity) + public function __construct(public RecurringInvoice | RecurringExpense $recurring_entity) { - $this->recurring_entity = $recurring_entity; } //set schedules - update next_send_dates @@ -135,6 +139,21 @@ class RecurringService { return $this; } + + public function increasePrices(array $ids, float $percentage) + { + (new IncreasePrices($ids, $percentage))->run(); + + return $ids; + + } + + public function updatePrices(array $ids) + { + (new UpdatePrices($ids))->run(); + + return $ids; + } public function save() { diff --git a/app/Services/Recurring/UpdatePrices.php b/app/Services/Recurring/UpdatePrices.php new file mode 100644 index 000000000000..8e1710f67a6e --- /dev/null +++ b/app/Services/Recurring/UpdatePrices.php @@ -0,0 +1,51 @@ +ids) + ->cursor() + ->each(function ($recurring_invoice){ + + $line_items = $recurring_invoice->line_items; + foreach($line_items as $key => $line_item) + { + + $product = Product::where('company_id', $recurring_invoice->company_id) + ->where('product_key', $line_item->product_key) + ->where('is_deleted', 0) + ->first(); + + if($product){ + + $line_items[$key]->cost = $product->cost; + } + + } + + $recurring_invoice->line_items = $line_items; + $recurring_invoice->calc()->getInvoice()->save(); + + }); + } +} \ No newline at end of file diff --git a/tests/Feature/RecurringInvoiceTest.php b/tests/Feature/RecurringInvoiceTest.php index f772c5aa714e..23a837795318 100644 --- a/tests/Feature/RecurringInvoiceTest.php +++ b/tests/Feature/RecurringInvoiceTest.php @@ -13,12 +13,14 @@ namespace Tests\Feature; use App\Factory\InvoiceItemFactory; use App\Factory\InvoiceToRecurringInvoiceFactory; +use App\Factory\RecurringInvoiceFactory; use App\Factory\RecurringInvoiceToInvoiceFactory; use App\Models\Client; use App\Models\ClientContact; use App\Models\RecurringInvoice; use App\Utils\Helpers; use App\Utils\Traits\MakesHash; +use App\Models\Product; use Illuminate\Database\Eloquent\Model; use Illuminate\Foundation\Testing\DatabaseTransactions; use Illuminate\Routing\Middleware\ThrottleRequests; @@ -53,6 +55,53 @@ class RecurringInvoiceTest extends TestCase $this->makeTestData(); } + public function testBulkUpdatePrices() + { + $p = Product::factory()->create([ + 'company_id' => $this->company->id, + 'user_id' => $this->user->id, + 'cost' => 10, + 'product_key' => 'pink', + ]); + + $recurring_invoice = RecurringInvoiceFactory::create($this->company->id, $this->user->id); + $recurring_invoice->client_id = $this->client->id; + $line_items[] = [ + 'product_key' => 'pink', + 'notes' => 'test', + 'cost' => 10, + 'quantity' => 1, + 'tax_name1' => '', + 'tax_rate1' => 0, + 'tax_name2' => '', + 'tax_rate2' => 0, + 'tax_name3' => '', + 'tax_rate3' => 0, + ]; + $recurring_invoice->line_items = $line_items; + + $recurring_invoice->calc()->getInvoice()->service()->start()->save()->fresh(); + + $this->assertEquals(10, $recurring_invoice->amount); + + $p->cost = 20; + $p->save(); + + $recurring_invoice->service()->updatePrices([$recurring_invoice->id]); + + $recurring_invoice->refresh(); + + $this->assertEquals(20, $recurring_invoice->amount); + + $recurring_invoice->service()->increasePrices([$recurring_invoice->id], 10); + + $recurring_invoice->refresh(); + + $this->assertEquals(22, $recurring_invoice->amount); + + + } + public function testRecurringGetStatus() { $response = $this->withHeaders([