clientId = request()->integer('client_id'); } public function getBreadcrumbs(): array { $client = $this->getClient(); if (! $client) { return parent::getBreadcrumbs(); } return [ ClientResource::getUrl('view', ['record' => $client->id]) => $client->company, ClientResource::getUrl('view', ['record' => $client->id]).'?activeRelationManager=4' => 'Expenses', $this->getResource()::getUrl('create', ['client_id' => $client->id]) => 'Create', ]; } protected function getClient(): Client|null { if (! $this->clientId) { return null; } return Client::find($this->clientId); } protected function mutateFormDataBeforeCreate(array $data): array { return $this->getFormDataMutation($data); } public function getFormDataMutation(array $data): array { $transactions = $data['transactions'] ?? []; $data['gross_amount'] = collect($transactions)->sum(fn (array $transaction) => (float) ($transaction['gross_amount'] ?? 0)); $data['exempt'] = collect($transactions)->sum(fn (array $transaction) => (float) ($transaction['exempt'] ?? 0)); $data['zero_rated'] = collect($transactions)->sum(fn (array $transaction) => (float) ($transaction['zero_rated'] ?? 0)); $data['vatable_amount'] = collect($transactions)->sum(fn (array $transaction) => (float) ($transaction['vatable_amount'] ?? 0)); $data['input_tax'] = collect($transactions)->sum(fn (array $transaction) => (float) ($transaction['input_tax'] ?? 0)); $data['payable_withholding_tax'] = collect($transactions)->sum(fn (array $transaction) => (float) ($transaction['payable_withholding_tax'] ?? 0)); $data['net_amount'] = collect($transactions)->sum(fn (array $transaction) => (float) ($transaction['net_amount'] ?? 0)); return Arr::except($data, ['client', 'transactions']); } protected function afterCreate(): void { $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(); } $accountIds = collect($transactions) ->pluck('account_id') ->filter() ->unique() ->values() ->all(); $this->getRecord()->accounts()->sync($accountIds); $this->commitDatabaseTransaction(); } catch (Exception $exception) { $this->rollBackDatabaseTransaction(); throw new LogicException('Failed to save transactions : '.$exception->getMessage()); } } }