Andrew Wallo 10 mesi fa
parent
commit
3c0c236824

+ 9
- 49
app/Filament/Company/Resources/Accounting/DocumentResource.php Vedi File

339
     {
339
     {
340
         return $table
340
         return $table
341
             ->columns([
341
             ->columns([
342
-                Tables\Columns\TextColumn::make('client.name')
343
-                    ->numeric()
344
-                    ->sortable(),
345
-                Tables\Columns\TextColumn::make('vendor.name')
346
-                    ->numeric()
347
-                    ->sortable(),
348
-                Tables\Columns\TextColumn::make('type')
349
-                    ->searchable(),
350
-                Tables\Columns\TextColumn::make('logo')
351
-                    ->searchable(),
352
-                Tables\Columns\TextColumn::make('header')
353
-                    ->searchable(),
354
-                Tables\Columns\TextColumn::make('subheader')
355
-                    ->searchable(),
356
-                Tables\Columns\TextColumn::make('document_number')
357
-                    ->searchable(),
358
-                Tables\Columns\TextColumn::make('order_number')
342
+                Tables\Columns\TextColumn::make('status')
359
                     ->searchable(),
343
                     ->searchable(),
360
-                Tables\Columns\TextColumn::make('date')
344
+                Tables\Columns\TextColumn::make('due_date')
361
                     ->date()
345
                     ->date()
362
                     ->sortable(),
346
                     ->sortable(),
363
-                Tables\Columns\TextColumn::make('due_date')
347
+                Tables\Columns\TextColumn::make('date')
364
                     ->date()
348
                     ->date()
365
                     ->sortable(),
349
                     ->sortable(),
366
-                Tables\Columns\TextColumn::make('status')
367
-                    ->searchable(),
368
-                Tables\Columns\TextColumn::make('currency_code')
350
+                Tables\Columns\TextColumn::make('document_number')
351
+                    ->label('Number')
369
                     ->searchable(),
352
                     ->searchable(),
370
-                Tables\Columns\TextColumn::make('subtotal')
371
-                    ->numeric()
372
-                    ->sortable(),
373
-                Tables\Columns\TextColumn::make('tax_total')
374
-                    ->numeric()
375
-                    ->sortable(),
376
-                Tables\Columns\TextColumn::make('discount_total')
353
+                Tables\Columns\TextColumn::make('client.name')
377
                     ->numeric()
354
                     ->numeric()
378
                     ->sortable(),
355
                     ->sortable(),
379
                 Tables\Columns\TextColumn::make('total')
356
                 Tables\Columns\TextColumn::make('total')
380
-                    ->numeric()
381
-                    ->sortable(),
357
+                    ->money(),
382
                 Tables\Columns\TextColumn::make('amount_paid')
358
                 Tables\Columns\TextColumn::make('amount_paid')
383
-                    ->numeric()
384
-                    ->sortable(),
359
+                    ->money(),
385
                 Tables\Columns\TextColumn::make('amount_due')
360
                 Tables\Columns\TextColumn::make('amount_due')
386
-                    ->numeric()
387
-                    ->sortable(),
388
-                Tables\Columns\TextColumn::make('created_by')
389
-                    ->numeric()
390
-                    ->sortable(),
391
-                Tables\Columns\TextColumn::make('updated_by')
392
-                    ->numeric()
393
-                    ->sortable(),
394
-                Tables\Columns\TextColumn::make('created_at')
395
-                    ->dateTime()
396
-                    ->sortable()
397
-                    ->toggleable(isToggledHiddenByDefault: true),
398
-                Tables\Columns\TextColumn::make('updated_at')
399
-                    ->dateTime()
400
-                    ->sortable()
401
-                    ->toggleable(isToggledHiddenByDefault: true),
361
+                    ->money(),
402
             ])
362
             ])
403
             ->filters([
363
             ->filters([
404
                 //
364
                 //

+ 4
- 0
app/Models/Accounting/Document.php Vedi File

9
 use App\Models\Banking\Payment;
9
 use App\Models\Banking\Payment;
10
 use App\Models\Common\Client;
10
 use App\Models\Common\Client;
11
 use App\Models\Common\Vendor;
11
 use App\Models\Common\Vendor;
12
+use App\Observers\DocumentObserver;
13
+use Illuminate\Database\Eloquent\Attributes\ObservedBy;
12
 use Illuminate\Database\Eloquent\Factories\HasFactory;
14
 use Illuminate\Database\Eloquent\Factories\HasFactory;
13
 use Illuminate\Database\Eloquent\Model;
15
 use Illuminate\Database\Eloquent\Model;
14
 use Illuminate\Database\Eloquent\Relations\BelongsTo;
16
 use Illuminate\Database\Eloquent\Relations\BelongsTo;
15
 use Illuminate\Database\Eloquent\Relations\HasMany;
17
 use Illuminate\Database\Eloquent\Relations\HasMany;
16
 
18
 
19
+#[ObservedBy(DocumentObserver::class)]
17
 class Document extends Model
20
 class Document extends Model
18
 {
21
 {
19
     use Blamable;
22
     use Blamable;
56
         'discount_total' => MoneyCast::class,
59
         'discount_total' => MoneyCast::class,
57
         'total' => MoneyCast::class,
60
         'total' => MoneyCast::class,
58
         'amount_paid' => MoneyCast::class,
61
         'amount_paid' => MoneyCast::class,
62
+        'amount_due' => MoneyCast::class,
59
     ];
63
     ];
60
 
64
 
61
     public function client(): BelongsTo
65
     public function client(): BelongsTo

+ 3
- 0
app/Models/Accounting/DocumentLineItem.php Vedi File

8
 use App\Enums\Accounting\AdjustmentCategory;
8
 use App\Enums\Accounting\AdjustmentCategory;
9
 use App\Enums\Accounting\AdjustmentType;
9
 use App\Enums\Accounting\AdjustmentType;
10
 use App\Models\Common\Offering;
10
 use App\Models\Common\Offering;
11
+use App\Observers\DocumentLineItemObserver;
12
+use Illuminate\Database\Eloquent\Attributes\ObservedBy;
11
 use Illuminate\Database\Eloquent\Factories\HasFactory;
13
 use Illuminate\Database\Eloquent\Factories\HasFactory;
12
 use Illuminate\Database\Eloquent\Model;
14
 use Illuminate\Database\Eloquent\Model;
13
 use Illuminate\Database\Eloquent\Relations\BelongsTo;
15
 use Illuminate\Database\Eloquent\Relations\BelongsTo;
14
 use Illuminate\Database\Eloquent\Relations\MorphToMany;
16
 use Illuminate\Database\Eloquent\Relations\MorphToMany;
15
 
17
 
18
+#[ObservedBy(DocumentLineItemObserver::class)]
16
 class DocumentLineItem extends Model
19
 class DocumentLineItem extends Model
17
 {
20
 {
18
     use Blamable;
21
     use Blamable;

+ 60
- 0
app/Observers/DocumentLineItemObserver.php Vedi File

1
+<?php
2
+
3
+namespace App\Observers;
4
+
5
+use App\Models\Accounting\DocumentLineItem;
6
+
7
+class DocumentLineItemObserver
8
+{
9
+    /**
10
+     * Handle the DocumentLineItem "created" event.
11
+     */
12
+    public function created(DocumentLineItem $documentLineItem): void
13
+    {
14
+        //
15
+    }
16
+
17
+    /**
18
+     * Handle the DocumentLineItem "updated" event.
19
+     */
20
+    public function updated(DocumentLineItem $documentLineItem): void
21
+    {
22
+        //
23
+    }
24
+
25
+    public function saving(DocumentLineItem $lineItem): void
26
+    {
27
+        // Calculate the base total (quantity * unit price)
28
+        $lineItem->total = $lineItem->quantity * $lineItem->unit_price;
29
+
30
+        // Calculate tax total (if applicable)
31
+        $lineItem->tax_total = $lineItem->taxes->sum(fn ($tax) => $lineItem->total * ($tax->rate / 100));
32
+
33
+        // Calculate discount total (if applicable)
34
+        $lineItem->discount_total = $lineItem->discounts->sum(fn ($discount) => $lineItem->total * ($discount->rate / 100));
35
+    }
36
+
37
+    /**
38
+     * Handle the DocumentLineItem "deleted" event.
39
+     */
40
+    public function deleted(DocumentLineItem $documentLineItem): void
41
+    {
42
+        //
43
+    }
44
+
45
+    /**
46
+     * Handle the DocumentLineItem "restored" event.
47
+     */
48
+    public function restored(DocumentLineItem $documentLineItem): void
49
+    {
50
+        //
51
+    }
52
+
53
+    /**
54
+     * Handle the DocumentLineItem "force deleted" event.
55
+     */
56
+    public function forceDeleted(DocumentLineItem $documentLineItem): void
57
+    {
58
+        //
59
+    }
60
+}

+ 78
- 0
app/Observers/DocumentObserver.php Vedi File

1
+<?php
2
+
3
+namespace App\Observers;
4
+
5
+use App\Models\Accounting\Document;
6
+
7
+class DocumentObserver
8
+{
9
+    /**
10
+     * Handle the Document "created" event.
11
+     */
12
+    public function created(Document $document): void
13
+    {
14
+        //
15
+    }
16
+
17
+    /**
18
+     * Handle the Document "deleted" event.
19
+     */
20
+    public function deleted(Document $document): void
21
+    {
22
+        //
23
+    }
24
+
25
+    /**
26
+     * Handle the Document "restored" event.
27
+     */
28
+    public function restored(Document $document): void
29
+    {
30
+        //
31
+    }
32
+
33
+    public function updated(Document $document): void
34
+    {
35
+        $this->recalculateTotals($document);
36
+    }
37
+
38
+    public function saved(Document $document): void
39
+    {
40
+        $this->recalculateTotals($document);
41
+    }
42
+
43
+    protected function recalculateTotals(Document $document): void
44
+    {
45
+        // Sum up totals in cents
46
+        $subtotalCents = $document->lineItems()->sum('total');
47
+        $taxTotalCents = $document->lineItems()->sum('tax_total');
48
+        $discountTotalCents = $document->lineItems()->sum('discount_total');
49
+        $grandTotalCents = $subtotalCents + $taxTotalCents - $discountTotalCents;
50
+
51
+        $subtotal = $subtotalCents / 100; // Convert to dollars
52
+        $taxTotal = $taxTotalCents / 100;
53
+        $discountTotal = $discountTotalCents / 100;
54
+        $grandTotal = $grandTotalCents / 100;
55
+
56
+        ray([
57
+            'subtotal' => $subtotal,
58
+            'tax_total' => $taxTotal,
59
+            'discount_total' => $discountTotal,
60
+            'grand_total' => $grandTotal,
61
+        ]);
62
+
63
+        $document->updateQuietly([
64
+            'subtotal' => $subtotal,
65
+            'tax_total' => $taxTotal,
66
+            'discount_total' => $discountTotal,
67
+            'total' => $grandTotal,
68
+        ]);
69
+    }
70
+
71
+    /**
72
+     * Handle the Document "force deleted" event.
73
+     */
74
+    public function forceDeleted(Document $document): void
75
+    {
76
+        //
77
+    }
78
+}

Loading…
Annulla
Salva