From 7dd09635533186372d4b75c61ee95c332a012a74 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 28 Aug 2025 15:31:00 +1000 Subject: [PATCH] Updates for merge/purge activity events --- app/Events/Client/ClientWasMerged.php | 37 +++++++++++ app/Events/Client/ClientWasPurged.php | 37 +++++++++++ app/Events/Vendor/VendorWasMerged.php | 37 +++++++++++ .../Activity/ClientMergedActivity.php | 61 +++++++++++++++++++ .../Activity/ClientPurgedActivity.php | 61 +++++++++++++++++++ .../Activity/VendorMergedActivity.php | 61 +++++++++++++++++++ app/Models/Activity.php | 7 +++ app/Providers/EventServiceProvider.php | 23 +++++++ app/Repositories/ClientRepository.php | 6 ++ app/Services/Client/Merge.php | 5 ++ app/Services/Vendor/Merge.php | 4 ++ lang/en/texts.php | 7 ++- 12 files changed, 344 insertions(+), 2 deletions(-) create mode 100644 app/Events/Client/ClientWasMerged.php create mode 100644 app/Events/Client/ClientWasPurged.php create mode 100644 app/Events/Vendor/VendorWasMerged.php create mode 100644 app/Listeners/Activity/ClientMergedActivity.php create mode 100644 app/Listeners/Activity/ClientPurgedActivity.php create mode 100644 app/Listeners/Activity/VendorMergedActivity.php diff --git a/app/Events/Client/ClientWasMerged.php b/app/Events/Client/ClientWasMerged.php new file mode 100644 index 0000000000..24a3a93bf6 --- /dev/null +++ b/app/Events/Client/ClientWasMerged.php @@ -0,0 +1,37 @@ +activity_repo = $activity_repo; + } + + /** + * Handle the event. + * + * @param object $event + * @return void + */ + public function handle($event) + { + MultiDB::setDb($event->company->db); + + $client = $event->client; + + $fields = new stdClass(); + + $user_id = array_key_exists('user_id', $event->event_vars) + ? $event->event_vars['user_id'] + : $event->client->user_id; + + $fields->client_id = $client->id; + $fields->user_id = $user_id; + $fields->company_id = $client->company_id; + $fields->activity_type_id = Activity::MERGE_CLIENT; + $fields->notes = $event->mergeable_client; + + $this->activity_repo->save($fields, $client, $event->event_vars); + } +} diff --git a/app/Listeners/Activity/ClientPurgedActivity.php b/app/Listeners/Activity/ClientPurgedActivity.php new file mode 100644 index 0000000000..dce33dd9a3 --- /dev/null +++ b/app/Listeners/Activity/ClientPurgedActivity.php @@ -0,0 +1,61 @@ +activity_repo = $activity_repo; + } + + /** + * Handle the event. + * + * @param object $event + * @return void + */ + public function handle($event) + { + MultiDB::setDb($event->company->db); + + $client = $event->client; + + $fields = new stdClass(); + + $user_id = array_key_exists('user_id', $event->event_vars) + ? $event->event_vars['user_id'] + : $event->client->user_id; + + $fields->client_id = $client->id; + $fields->user_id = $user_id; + $fields->company_id = $client->company_id; + $fields->activity_type_id = Activity::PURGE_CLIENT; + $fields->notes = $event->purged_client; + + $this->activity_repo->save($fields, $client, $event->event_vars); + } +} diff --git a/app/Listeners/Activity/VendorMergedActivity.php b/app/Listeners/Activity/VendorMergedActivity.php new file mode 100644 index 0000000000..e7c7bdec40 --- /dev/null +++ b/app/Listeners/Activity/VendorMergedActivity.php @@ -0,0 +1,61 @@ +activity_repo = $activity_repo; + } + + /** + * Handle the event. + * + * @param object $event + * @return void + */ + public function handle($event) + { + MultiDB::setDb($event->company->db); + + $vendor = $event->vendor; + + $fields = new stdClass(); + + $user_id = array_key_exists('user_id', $event->event_vars) + ? $event->event_vars['user_id'] + : $event->client->user_id; + + $fields->vendor_id = $vendor->id; + $fields->user_id = $user_id; + $fields->company_id = $vendor->company_id; + $fields->activity_type_id = Activity::MERGE_VENDOR; + $fields->notes = $event->mergeable_vendor; + + $this->activity_repo->save($fields, $vendor, $event->event_vars); + } +} diff --git a/app/Models/Activity.php b/app/Models/Activity.php index 3fb63b728a..8f96ba4216 100644 --- a/app/Models/Activity.php +++ b/app/Models/Activity.php @@ -281,6 +281,13 @@ class Activity extends StaticModel public const EMAIL_CREDIT = 149; public const ACCOUNT_DELETED = 150; + + public const MERGE_CLIENT = 151; + + public const MERGE_VENDOR = 152; + + public const PURGE_CLIENT = 153; + protected $casts = [ 'is_system' => 'boolean', diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index 3e29be0da8..803a4a0b56 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -61,17 +61,22 @@ use App\Events\Task\TaskWasRestored; use App\Events\User\UserLoginFailed; use App\Events\User\UserWasArchived; use App\Events\User\UserWasRestored; +use App\Listeners\LogRequestSending; use App\Events\Quote\QuoteWasCreated; use App\Events\Quote\QuoteWasDeleted; use App\Events\Quote\QuoteWasEmailed; use App\Events\Quote\QuoteWasUpdated; use App\Events\Account\AccountCreated; use App\Events\Account\AccountDeleted; +use App\Events\Client\ClientWasMerged; +use App\Events\Client\ClientWasPurged; use App\Events\Credit\CreditWasViewed; use App\Events\Invoice\InvoiceWasPaid; use App\Events\Quote\QuoteWasApproved; use App\Events\Quote\QuoteWasArchived; use App\Events\Quote\QuoteWasRestored; +use App\Events\Vendor\VendorWasMerged; +use App\Listeners\LogResponseReceived; use Illuminate\Queue\Events\JobFailed; use App\Events\Client\ClientWasCreated; use App\Events\Client\ClientWasDeleted; @@ -166,12 +171,15 @@ use App\Listeners\Activity\TaskUpdatedActivity; use App\Listeners\Invoice\InvoiceEmailActivity; use App\Listeners\SendVerificationNotification; use App\Events\Credit\CreditWasEmailedAndFailed; +use App\Listeners\Activity\ClientMergedActivity; +use App\Listeners\Activity\ClientPurgedActivity; use App\Listeners\Activity\CreatedQuoteActivity; use App\Listeners\Activity\DeleteClientActivity; use App\Listeners\Activity\DeleteCreditActivity; use App\Listeners\Activity\QuoteUpdatedActivity; use App\Listeners\Activity\TaskArchivedActivity; use App\Listeners\Activity\TaskRestoredActivity; +use App\Listeners\Activity\VendorMergedActivity; use App\Listeners\Credit\CreditRestoredActivity; use App\Listeners\Invoice\CreateInvoiceActivity; use App\Listeners\Invoice\InvoiceViewedActivity; @@ -194,6 +202,7 @@ use App\Listeners\Payment\PaymentBalanceActivity; use App\Listeners\Payment\PaymentEmailedActivity; use App\Listeners\Quote\QuoteCreatedNotification; use App\Listeners\Quote\QuoteEmailedNotification; +use Illuminate\Http\Client\Events\RequestSending; use App\Events\Invoice\InvoiceWasEmailedAndFailed; use App\Events\Payment\PaymentWasEmailedAndFailed; use App\Listeners\Activity\ArchivedClientActivity; @@ -212,6 +221,8 @@ use App\Listeners\Invoice\InvoiceRestoredActivity; use App\Listeners\Invoice\InvoiceReversedActivity; use App\Listeners\Payment\PaymentRestoredActivity; use App\Listeners\Quote\QuoteApprovedNotification; +use SocialiteProviders\Apple\AppleExtendSocialite; +use SocialiteProviders\Manager\SocialiteWasCalled; use App\Events\Subscription\SubscriptionWasCreated; use App\Events\Subscription\SubscriptionWasDeleted; use App\Events\Subscription\SubscriptionWasUpdated; @@ -223,6 +234,7 @@ use App\Listeners\Credit\CreditCreatedNotification; use App\Listeners\Credit\CreditEmailedNotification; use App\Listeners\Invoice\InvoiceCancelledActivity; use App\Listeners\Quote\QuoteReminderEmailActivity; +use Illuminate\Http\Client\Events\ResponseReceived; use App\Events\PurchaseOrder\PurchaseOrderWasViewed; use App\Events\Subscription\SubscriptionWasArchived; use App\Events\Subscription\SubscriptionWasRestored; @@ -238,6 +250,7 @@ use App\Listeners\Statement\StatementEmailedActivity; use App\Events\PurchaseOrder\PurchaseOrderWasAccepted; use App\Events\PurchaseOrder\PurchaseOrderWasArchived; use App\Events\PurchaseOrder\PurchaseOrderWasRestored; +use App\Listeners\Payment\PaymentEmailFailureActivity; use App\Listeners\Vendor\UpdateVendorContactLastLogin; use App\Events\RecurringQuote\RecurringQuoteWasCreated; use App\Events\RecurringQuote\RecurringQuoteWasDeleted; @@ -254,6 +267,7 @@ use App\Listeners\Activity\SubscriptionRestoredActivity; use App\Listeners\Invoice\InvoiceAutoBillFailedActivity; use App\Listeners\Invoice\InvoiceAutoBillSuccessActivity; use App\Listeners\Invoice\InvoiceFailedEmailNotification; +use SocialiteProviders\Microsoft\MicrosoftExtendSocialite; use App\Events\RecurringExpense\RecurringExpenseWasCreated; use App\Events\RecurringExpense\RecurringExpenseWasDeleted; use App\Events\RecurringExpense\RecurringExpenseWasUpdated; @@ -385,6 +399,12 @@ class EventServiceProvider extends ServiceProvider ClientWasRestored::class => [ RestoreClientActivity::class, ], + ClientWasMerged::class => [ + ClientMergedActivity::class, + ], + ClientWasPurged::class => [ + ClientPurgedActivity::class, + ], // Documents DocumentWasCreated::class => [ ], @@ -671,6 +691,9 @@ class EventServiceProvider extends ServiceProvider VendorContactLoggedIn::class => [ UpdateVendorContactLastLogin::class, ], + VendorWasMerged::class => [ + VendorMergedActivity::class, + ], \SocialiteProviders\Manager\SocialiteWasCalled::class => [ // ... Manager won't register drivers that are not added to this listener. \SocialiteProviders\Apple\AppleExtendSocialite::class.'@handle', diff --git a/app/Repositories/ClientRepository.php b/app/Repositories/ClientRepository.php index 15f17b52ca..bff53b5d96 100644 --- a/app/Repositories/ClientRepository.php +++ b/app/Repositories/ClientRepository.php @@ -147,6 +147,12 @@ class ClientRepository extends BaseRepository public function purge($client) { + $purged_client = $client->present()->name(); + $user = auth()->user() ?? $client->user; + $company = $client->company; + + event(new \App\Events\Client\ClientWasPurged($purged_client, $user, $company, \App\Utils\Ninja::eventVars())); + nlog("Purging client id => {$client->id} => {$client->number}"); $client->contacts()->forceDelete(); diff --git a/app/Services/Client/Merge.php b/app/Services/Client/Merge.php index 5fcb838d51..2262e22170 100644 --- a/app/Services/Client/Merge.php +++ b/app/Services/Client/Merge.php @@ -36,6 +36,8 @@ class Merge extends AbstractService nlog("balance pre {$this->client->balance}"); nlog("paid_to_date pre {$this->client->paid_to_date}"); + $mergeable_client = $this->mergable_client->present()->name(); + $this->client->balance += $this->mergable_client->balance; $this->client->paid_to_date += $this->mergable_client->paid_to_date; $this->client->save(); @@ -71,11 +73,14 @@ class Merge extends AbstractService } }); + $this->mergable_client->forceDelete(); $this->client->credit_balance = $this->client->service()->getCreditBalance(); $this->client->saveQuietly(); + event(new \App\Events\Client\ClientWasMerged($mergeable_client, $this->client, $this->client->company, \App\Utils\Ninja::eventVars())); + return $this->client; } diff --git a/app/Services/Vendor/Merge.php b/app/Services/Vendor/Merge.php index 2d68ddf34b..c41c9c2519 100644 --- a/app/Services/Vendor/Merge.php +++ b/app/Services/Vendor/Merge.php @@ -33,6 +33,8 @@ class Merge extends AbstractService public function run() { + $_mergeable_vendor = $this->mergable_vendor->present()->name(); + $this->mergable_vendor->activities()->update(['vendor_id' => $this->vendor->id]); $this->mergable_vendor->contacts()->update(['vendor_id' => $this->vendor->id]); $this->mergable_vendor->credits()->update(['vendor_id' => $this->vendor->id]); @@ -56,6 +58,8 @@ class Merge extends AbstractService $this->mergable_vendor->forceDelete(); + event(new \App\Events\Vendor\VendorWasMerged($_mergeable_vendor, $this->vendor, $this->vendor->company, \App\Utils\Ninja::eventVars())); + return $this->vendor; } diff --git a/lang/en/texts.php b/lang/en/texts.php index 0d9aa30173..07dfbd8fd0 100644 --- a/lang/en/texts.php +++ b/lang/en/texts.php @@ -5617,8 +5617,11 @@ $lang = array( 'creator' => 'Created by', 'ses_topic_arn_help' => 'The SES topic (optional, only for webhook tracking)', 'ses_region_help' => 'The AWS region, ie us-east-1', -'ses_secret_key' => 'SES Secret Key', -'ses_access_key' => 'SES Access Key ID' + 'ses_secret_key' => 'SES Secret Key', + 'ses_access_key' => 'SES Access Key ID', + 'activity_151' => 'Client :notes merged into :client by :user', + 'activity_152' => 'Vendor :notes merged into :vendor by :user', + 'activity_153' => 'Client :notes purged by :user', ); return $lang;