|
@@ -9,6 +9,7 @@ use App\Models\Accounting\JournalEntry;
|
9
|
9
|
use App\Models\Accounting\Transaction;
|
10
|
10
|
use App\Models\Banking\BankAccount;
|
11
|
11
|
use App\Utilities\Currency\CurrencyAccessor;
|
|
12
|
+use App\Utilities\Currency\CurrencyConverter;
|
12
|
13
|
use Awcodes\TableRepeater\Header;
|
13
|
14
|
use Closure;
|
14
|
15
|
use Filament\Forms;
|
|
@@ -251,20 +252,23 @@ trait HasTransactionAction
|
251
|
252
|
|
252
|
253
|
$hasDebit = false;
|
253
|
254
|
$hasCredit = false;
|
|
255
|
+ $totalDebits = 0;
|
|
256
|
+ $totalCredits = 0;
|
254
|
257
|
|
255
|
258
|
foreach ($value as $entry) {
|
256
|
|
- if (! isset($entry['type'])) {
|
|
259
|
+ if (! isset($entry['type']) || ! isset($entry['amount'])) {
|
257
|
260
|
continue;
|
258
|
261
|
}
|
259
|
262
|
|
260
|
|
- if (JournalEntryType::parse($entry['type'])->isDebit()) {
|
|
263
|
+ $entryType = JournalEntryType::parse($entry['type']);
|
|
264
|
+ $amount = CurrencyConverter::convertToCents($entry['amount'], 'USD');
|
|
265
|
+
|
|
266
|
+ if ($entryType->isDebit()) {
|
261
|
267
|
$hasDebit = true;
|
262
|
|
- } elseif (JournalEntryType::parse($entry['type'])->isCredit()) {
|
|
268
|
+ $totalDebits += $amount;
|
|
269
|
+ } elseif ($entryType->isCredit()) {
|
263
|
270
|
$hasCredit = true;
|
264
|
|
- }
|
265
|
|
-
|
266
|
|
- if ($hasDebit && $hasCredit) {
|
267
|
|
- break;
|
|
271
|
+ $totalCredits += $amount;
|
268
|
272
|
}
|
269
|
273
|
}
|
270
|
274
|
|
|
@@ -275,6 +279,12 @@ trait HasTransactionAction
|
275
|
279
|
if (! $hasCredit) {
|
276
|
280
|
$fail('At least one credit entry is required.');
|
277
|
281
|
}
|
|
282
|
+
|
|
283
|
+ if ($totalDebits !== $totalCredits) {
|
|
284
|
+ $debitFormatted = CurrencyConverter::formatCentsToMoney($totalDebits, CurrencyAccessor::getDefaultCurrency());
|
|
285
|
+ $creditFormatted = CurrencyConverter::formatCentsToMoney($totalCredits, CurrencyAccessor::getDefaultCurrency());
|
|
286
|
+ $fail("Total debits ({$debitFormatted}) must equal total credits ({$creditFormatted}).");
|
|
287
|
+ }
|
278
|
288
|
};
|
279
|
289
|
},
|
280
|
290
|
])
|
|
@@ -326,7 +336,7 @@ trait HasTransactionAction
|
326
|
336
|
->searchable(),
|
327
|
337
|
Forms\Components\TextInput::make('amount')
|
328
|
338
|
->label('Amount')
|
329
|
|
- ->live()
|
|
339
|
+ ->live(onBlur: true)
|
330
|
340
|
->money()
|
331
|
341
|
->afterStateUpdated(function (Forms\Get $get, Forms\Set $set, ?string $state, ?string $old) {
|
332
|
342
|
$this->updateJournalEntryAmount(JournalEntryType::parse($get('type')), $state, $old);
|