diff --git a/app/Actions/Sales/CreateSaleAction.php b/app/Actions/Sales/CreateSaleAction.php index 6f46b0f..77ccf50 100644 --- a/app/Actions/Sales/CreateSaleAction.php +++ b/app/Actions/Sales/CreateSaleAction.php @@ -2,21 +2,54 @@ namespace App\Actions\Sales; +use App\Actions\Transactions\CreateRecordTransactionsAction; use App\Commands\Sales\CreateSaleCommand; +use App\Commands\Series\CreateSeriesCommand; use App\Models\Sale; +use Illuminate\Support\Facades\DB; class CreateSaleAction { /** * Create a new class instance. */ - public function __construct(private CreateSaleCommand $createSaleCommand) - { - // - } + public function __construct( + private CreateSaleCommand $createSaleCommand, + private CreateSeriesCommand $createSeriesCommand, + ){ } - public function __invoke(array $data): Sale + public function __invoke(array $data, array $transactions): Sale { - return $this->createSaleCommand->execute($data); + $record = $this->createSaleCommand->execute($data); + + try { + DB::beginTransaction(); + + //create transactions for the sale + app(CreateRecordTransactionsAction::class)($record, $transactions); + + $accountIds = collect($transactions) + ->pluck('account_id') + ->filter() + ->unique() + ->values() + ->all(); + + //sync accounts to sale + app(SyncAccountsAction::class)($record, $accountIds); + + //increment current_series + $this->createSeriesCommand->execute([ + 'branch_id' => $record->branch_id, + 'series' => $record->reference_number, + ]); + + DB::commit(); + } catch (\Exception $exception) { + DB::rollBack(); + throw new \Exception('Failed to save transactions : '.$exception->getMessage()); + } + + return $record; } } diff --git a/app/Actions/Sales/SyncAccountsAction.php b/app/Actions/Sales/SyncAccountsAction.php new file mode 100644 index 0000000..95277bc --- /dev/null +++ b/app/Actions/Sales/SyncAccountsAction.php @@ -0,0 +1,16 @@ +accounts()->sync($accounts); + }, attempts: 2); + } +} diff --git a/app/Actions/Transactions/CreateRecordTransactionsAction.php b/app/Actions/Transactions/CreateRecordTransactionsAction.php new file mode 100644 index 0000000..f855086 --- /dev/null +++ b/app/Actions/Transactions/CreateRecordTransactionsAction.php @@ -0,0 +1,30 @@ + $record->branch_id, + 'happened_on' => $record->happened_on, + ...$transaction, + ]; + + $payload = new CreateTransactionDTO(data: $tData, transactionable: $record); + + Pipeline::send(passable: $payload)->through( + [ + CreateTransactionAction::class, + ] + )->thenReturn(); + } + } +} + diff --git a/app/Filament/Resources/ExpenseResource/Pages/CreateExpense.php b/app/Filament/Resources/ExpenseResource/Pages/CreateExpense.php index 8e0acc6..e133af8 100644 --- a/app/Filament/Resources/ExpenseResource/Pages/CreateExpense.php +++ b/app/Filament/Resources/ExpenseResource/Pages/CreateExpense.php @@ -2,15 +2,13 @@ namespace App\Filament\Resources\ExpenseResource\Pages; -use App\Actions\Transactions\CreateTransactionAction; -use App\DataObjects\CreateTransactionDTO; +use App\Actions\Transactions\CreateRecordTransactionsAction; use App\Filament\Resources\ClientResource; use App\Filament\Resources\ExpenseResource; use App\Models\Client; use Exception; use Filament\Resources\Pages\CreateRecord; use Illuminate\Support\Arr; -use Illuminate\Support\Facades\Pipeline; use Symfony\Component\Console\Exception\LogicException; class CreateExpense extends CreateRecord @@ -76,24 +74,7 @@ class CreateExpense extends CreateRecord $transactions = $this->form->getState()['transactions'] ?? []; try { - $branch = $this->getRecord()->branch; - - foreach ($transactions as $transaction) { - - $data = [ - 'branch_id' => $branch->id, - 'happened_on' => $this->getRecord()->happened_on, - ...$transaction, - ]; - - $payload = new CreateTransactionDTO(data: $data, transactionable: $this->getRecord()); - - Pipeline::send(passable: $payload)->through( - [ - CreateTransactionAction::class, - ] - )->thenReturn(); - } + app(CreateRecordTransactionsAction::class)($this->getRecord(), $transactions); $accountIds = collect($transactions) ->pluck('account_id') diff --git a/app/Filament/Resources/SaleResource/Pages/CreateSale.php b/app/Filament/Resources/SaleResource/Pages/CreateSale.php index 189f1fb..0699b82 100644 --- a/app/Filament/Resources/SaleResource/Pages/CreateSale.php +++ b/app/Filament/Resources/SaleResource/Pages/CreateSale.php @@ -3,8 +3,8 @@ namespace App\Filament\Resources\SaleResource\Pages; use App\Actions\Sales\CreateSaleAction; -use App\Actions\Transactions\CreateTransactionAction; -use App\DataObjects\CreateTransactionDTO; +use App\Actions\Sales\SyncAccountsAction; +use App\Actions\Transactions\CreateRecordTransactionsAction; use App\Filament\Resources\ClientResource; use App\Filament\Resources\SaleResource; use App\Models\Branch; @@ -15,7 +15,6 @@ use Filament\Resources\Pages\CreateRecord; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Arr; use Illuminate\Support\Facades\DB; -use Illuminate\Support\Facades\Pipeline; class CreateSale extends CreateRecord { @@ -82,41 +81,7 @@ class CreateSale extends CreateRecord public function processCreate(array $data, array $transactions): Model { - try { - DB::beginTransaction(); - $record = app(CreateSaleAction::class)($this->getFormDataMutation($data)); - $branch = $record->branch; - - foreach ($transactions as $transaction) { - $tData = [ - 'branch_id' => $branch->id, - 'happened_on' => $record->happened_on, - ...$transaction, - ]; - - $payload = new CreateTransactionDTO(data: $tData, transactionable: $record); - - Pipeline::send(passable: $payload)->through( - [ - CreateTransactionAction::class, - ] - )->thenReturn(); - } - - $accountIds = collect($transactions) - ->pluck('account_id') - ->filter() - ->unique() - ->values() - ->all(); - - $record->accounts()->sync($accountIds); - - DB::commit(); - } catch (\Exception $exception) { - DB::rollBack(); - throw new \Exception('Failed to save transactions : '.$exception->getMessage()); - } + $record = app(CreateSaleAction::class)($this->getFormDataMutation($data), $transactions); return $record; }