From 8c6fa6cb08c00e5fb89431ce13ee253f5663c33b Mon Sep 17 00:00:00 2001 From: Jp Date: Mon, 16 Feb 2026 02:02:26 +0800 Subject: [PATCH] refactor(client): extract base account generation to command Move the logic for generating base accounts for a new client from the ClientObserver into a dedicated command class (GenerateBaseAccountCommand). This improves code organization and reusability. - The command is now used in the ClientObserver::created method. - The command is also made available as a manual action in the AccountsRelationManager table header, allowing admins to generate base accounts for existing clients that lack them. - Added necessary imports to the CreateSale page, though the command is not directly used there in this diff, suggesting preparatory work for future integration. --- .../Clients/GenerateBaseAccountCommand.php | 64 +++++++++++++++++++ .../AccountsRelationManager.php | 15 +++++ .../SaleResource/Pages/CreateSale.php | 3 + app/Observers/ClientObserver.php | 41 +----------- 4 files changed, 84 insertions(+), 39 deletions(-) create mode 100644 app/Commands/Clients/GenerateBaseAccountCommand.php diff --git a/app/Commands/Clients/GenerateBaseAccountCommand.php b/app/Commands/Clients/GenerateBaseAccountCommand.php new file mode 100644 index 0000000..f688412 --- /dev/null +++ b/app/Commands/Clients/GenerateBaseAccountCommand.php @@ -0,0 +1,64 @@ +accounts()->createMany([ + [ + 'account_type_id' => 1, + 'account' => 'Cash', + 'normal_balance' => 'debit', + ], + [ + 'account_type_id' => 1, + 'account' => 'Input Tax', + 'normal_balance' => 'debit', + ], + [ + 'account_type_id' => 1, + 'account' => 'Creditable Withholding Tax', + 'normal_balance' => 'debit', + ], + [ + 'account_type_id' => 2, + 'account' => 'Output Tax', + 'normal_balance' => 'credit', + ], + [ + 'account_type_id' => 2, + 'account' => 'Payable Withholding Tax', + 'normal_balance' => 'credit', + ], + [ + 'account_type_id' => 5, + 'account' => 'Vat Exempt Revenue', + 'normal_balance' => 'credit', + ], + [ + 'account_type_id' => 4, + 'account' => 'Sales Discount', + 'normal_balance' => 'debit', + ], + ]); + }); + } + +} diff --git a/app/Filament/Resources/ClientResource/RelationManagers/AccountsRelationManager.php b/app/Filament/Resources/ClientResource/RelationManagers/AccountsRelationManager.php index 548121d..a34a448 100644 --- a/app/Filament/Resources/ClientResource/RelationManagers/AccountsRelationManager.php +++ b/app/Filament/Resources/ClientResource/RelationManagers/AccountsRelationManager.php @@ -2,6 +2,7 @@ namespace App\Filament\Resources\ClientResource\RelationManagers; +use App\Commands\Clients\GenerateBaseAccountCommand; use App\Filament\Exports\ClientAccountsExporter; use App\Models\Account; use Filament\Actions\Exports\Enums\ExportFormat; @@ -43,6 +44,20 @@ class AccountsRelationManager extends RelationManager // ]) ->headerActions([ + Tables\Actions\Action::make('generate-base-accounts') + ->requiresConfirmation() + ->label('Generate Base Accounts') + ->action(function () { + $client = $this->getOwnerRecord(); + if (! $client ) { + return; + } + + if($client->accounts()->count() > 0) { + return; + } + app(GenerateBaseAccountCommand::class)->execute($client); + }), Tables\Actions\ExportAction::make('Export Accounts')->exporter(ClientAccountsExporter::class)->formats([ExportFormat::Csv]), Tables\Actions\CreateAction::make()->label('New Account')->icon('heroicon-o-plus')->slideOver(), ]) diff --git a/app/Filament/Resources/SaleResource/Pages/CreateSale.php b/app/Filament/Resources/SaleResource/Pages/CreateSale.php index 0699b82..b6f063f 100644 --- a/app/Filament/Resources/SaleResource/Pages/CreateSale.php +++ b/app/Filament/Resources/SaleResource/Pages/CreateSale.php @@ -5,12 +5,15 @@ namespace App\Filament\Resources\SaleResource\Pages; use App\Actions\Sales\CreateSaleAction; use App\Actions\Sales\SyncAccountsAction; use App\Actions\Transactions\CreateRecordTransactionsAction; +use App\Commands\Clients\GenerateBaseAccountCommand; use App\Filament\Resources\ClientResource; use App\Filament\Resources\SaleResource; use App\Models\Branch; use App\Models\Client; use App\Models\Sale; use App\Services\Sales\SaleService; +use Filament\Actions\Action; +use Filament\Forms\Components\Actions; use Filament\Resources\Pages\CreateRecord; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Arr; diff --git a/app/Observers/ClientObserver.php b/app/Observers/ClientObserver.php index 19678c2..7db967a 100644 --- a/app/Observers/ClientObserver.php +++ b/app/Observers/ClientObserver.php @@ -2,6 +2,7 @@ namespace App\Observers; +use App\Commands\Clients\GenerateBaseAccountCommand; use App\Models\Client; use Illuminate\Support\Facades\DB; @@ -12,45 +13,7 @@ class ClientObserver */ public function created(Client $client): void { - DB::transaction(function () use ($client) { - $client->accounts()->createMany([ - [ - 'account_type_id' => 1, - 'account' => 'Cash', - 'normal_balance' => 'debit', - ], - [ - 'account_type_id' => 1, - 'account' => 'Input Tax', - 'normal_balance' => 'debit', - ], - [ - 'account_type_id' => 1, - 'account' => 'Creditable Withholding Tax', - 'normal_balance' => 'debit', - ], - [ - 'account_type_id' => 2, - 'account' => 'Output Tax', - 'normal_balance' => 'credit', - ], - [ - 'account_type_id' => 2, - 'account' => 'Payable Withholding Tax', - 'normal_balance' => 'credit', - ], - [ - 'account_type_id' => 5, - 'account' => 'Vat Exempt Revenue', - 'normal_balance' => 'credit', - ], - [ - 'account_type_id' => 4, - 'account' => 'Sales Discount', - 'normal_balance' => 'debit', - ], - ]); - }); + app(GenerateBaseAccountCommand::class)->execute($client); } /**