From 784d28ef0f631073c23968d919194728f263fe5a Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 20 Jan 2023 15:55:05 +1100 Subject: [PATCH] Improve app state by ensuring a invitation is always present for an entity when a contact is deleted --- app/Observers/ClientContactObserver.php | 31 +++++++++ app/Observers/VendorContactObserver.php | 85 +++++++++++++++++++++++++ app/Providers/EventServiceProvider.php | 3 + 3 files changed, 119 insertions(+) create mode 100644 app/Observers/VendorContactObserver.php diff --git a/app/Observers/ClientContactObserver.php b/app/Observers/ClientContactObserver.php index 398db1c8a2f5..2e98506958af 100644 --- a/app/Observers/ClientContactObserver.php +++ b/app/Observers/ClientContactObserver.php @@ -12,6 +12,9 @@ namespace App\Observers; use App\Models\ClientContact; +use App\Models\InvoiceInvitation; +use App\Models\QuoteInvitation; +use App\Models\RecurringInvoiceInvitation; class ClientContactObserver { @@ -45,10 +48,38 @@ class ClientContactObserver */ public function deleted(ClientContact $clientContact) { + $client_contact_id = $clientContact->id; + $clientContact->invoice_invitations()->delete(); $clientContact->quote_invitations()->delete(); $clientContact->credit_invitations()->delete(); $clientContact->recurring_invoice_invitations()->delete(); + + //ensure entity state is preserved + + InvoiceInvitation::withTrashed()->where('client_contact_id', 1)->cursor()->each(function ($invite){ + + if($invite->invoice()->doesnthave('invitations')) + $invite->invoice->service()->createInvitations(); + + }); + + + QuoteInvitation::withTrashed()->where('client_contact_id', 1)->cursor()->each(function ($invite){ + + if($invite->invoice()->doesnthave('invitations')) + $invite->quote->service()->createInvitations(); + + }); + + RecurringInvoiceInvitation::withTrashed()->where('client_contact_id', 1)->cursor()->each(function ($invite){ + + if($invite->recurring_invoice()->doesnthave('invitations')) + $invite->quote->service()->createInvitations(); + + }); + + } /** diff --git a/app/Observers/VendorContactObserver.php b/app/Observers/VendorContactObserver.php new file mode 100644 index 000000000000..41e9833fa61c --- /dev/null +++ b/app/Observers/VendorContactObserver.php @@ -0,0 +1,85 @@ +id; + + $vendorContact->purchase_order_invitations()->delete(); + + PurchaseOrderInvitation::withTrashed()->where('vendor_contact_id', 1)->cursor()->each(function ($invite){ + + if($invite->purchase_order()->doesnthave('invitations')) + $invite->purchase_order->service()->createInvitations(); + + }); + + + } + + /** + * Handle the vendor contact "restored" event. + * + * @param VendorContact $vendorContact + * @return void + */ + public function restored(VendorContact $vendorContact) + { + + } + + /** + * Handle the vendor contact "force deleted" event. + * + * @param VendorContact $vendorContact + * @return void + */ + public function forceDeleted(VendorContact $vendorContact) + { + // + } +} diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index c176963823ee..00294a6eb2f8 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -241,6 +241,7 @@ use App\Models\Quote; use App\Models\Subscription; use App\Models\Task; use App\Models\User; +use App\Models\VendorContact; use App\Observers\AccountObserver; use App\Observers\ClientContactObserver; use App\Observers\ClientObserver; @@ -257,6 +258,7 @@ use App\Observers\ProposalObserver; use App\Observers\PurchaseOrderObserver; use App\Observers\QuoteObserver; use App\Observers\SubscriptionObserver; +use App\Observers\VendorContactObserver; use App\Observers\TaskObserver; use App\Observers\UserObserver; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; @@ -649,6 +651,7 @@ class EventServiceProvider extends ServiceProvider Quote::observe(QuoteObserver::class); Task::observe(TaskObserver::class); User::observe(UserObserver::class); + VendorContact::observe(VendorContactObserver::class); PurchaseOrder::observe(PurchaseOrderObserver::class); }