refactor: extract transaction creation and account syncing to actions
- Introduce CreateRecordTransactionsAction to handle transaction creation for any model - Introduce SyncAccountsAction to encapsulate account synchronization logic - Refactor CreateSaleAction to use new actions and handle full sale creation flow - Simplify CreateExpense and CreateSale pages by delegating to actions - Ensure proper transaction handling with database rollback on failure
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
16
app/Actions/Sales/SyncAccountsAction.php
Normal file
16
app/Actions/Sales/SyncAccountsAction.php
Normal file
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
namespace App\Actions\Sales;
|
||||
|
||||
use App\Models\Sale;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class SyncAccountsAction
|
||||
{
|
||||
public function __invoke(Sale $sale, array $accounts): void
|
||||
{
|
||||
DB::transaction(function () use ($sale, $accounts) {
|
||||
$sale->accounts()->sync($accounts);
|
||||
}, attempts: 2);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user