Andrew Wallo 4 months ago
parent
commit
6b442dd5b2

+ 4
- 0
app/Filament/Company/Resources/Sales/InvoiceResource/Pages/ListInvoices.php View File

7
 use App\Filament\Company\Resources\Sales\InvoiceResource;
7
 use App\Filament\Company\Resources\Sales\InvoiceResource;
8
 use App\Filament\Company\Resources\Sales\InvoiceResource\Widgets;
8
 use App\Filament\Company\Resources\Sales\InvoiceResource\Widgets;
9
 use App\Filament\Company\Resources\Sales\RecurringInvoiceResource\Pages\ViewRecurringInvoice;
9
 use App\Filament\Company\Resources\Sales\RecurringInvoiceResource\Pages\ViewRecurringInvoice;
10
+use App\Filament\Exports\Accounting\InvoiceExporter;
10
 use App\Filament\Infolists\Components\BannerEntry;
11
 use App\Filament\Infolists\Components\BannerEntry;
11
 use App\Models\Accounting\RecurringInvoice;
12
 use App\Models\Accounting\RecurringInvoice;
12
 use Filament\Actions;
13
 use Filament\Actions;
79
     protected function getHeaderActions(): array
80
     protected function getHeaderActions(): array
80
     {
81
     {
81
         return [
82
         return [
83
+            Actions\ExportAction::make()
84
+                ->slideOver()
85
+                ->exporter(InvoiceExporter::class),
82
             Actions\Action::make('recordPayments')
86
             Actions\Action::make('recordPayments')
83
                 ->outlined()
87
                 ->outlined()
84
                 ->url(RecordPayments::getUrl()),
88
                 ->url(RecordPayments::getUrl()),

+ 70
- 0
app/Filament/Exports/Accounting/InvoiceExporter.php View File

1
+<?php
2
+
3
+namespace App\Filament\Exports\Accounting;
4
+
5
+use App\Enums\Accounting\InvoiceStatus;
6
+use App\Models\Accounting\Invoice;
7
+use Filament\Actions\Exports\ExportColumn;
8
+use Filament\Actions\Exports\Exporter;
9
+use Filament\Actions\Exports\Models\Export;
10
+
11
+class InvoiceExporter extends Exporter
12
+{
13
+    protected static ?string $model = Invoice::class;
14
+
15
+    public static function getColumns(): array
16
+    {
17
+        return [
18
+            ExportColumn::make('invoice_number'),
19
+            ExportColumn::make('date')
20
+                ->date(),
21
+            ExportColumn::make('due_date')
22
+                ->date(),
23
+            ExportColumn::make('client.name'),
24
+            ExportColumn::make('status')
25
+                ->formatStateUsing(function (?InvoiceStatus $state) {
26
+                    return $state?->getLabel();
27
+                }),
28
+            ExportColumn::make('total')
29
+                ->money(),
30
+            ExportColumn::make('amount_paid')
31
+                ->money(),
32
+            ExportColumn::make('amount_due')
33
+                ->money(),
34
+            ExportColumn::make('subtotal')
35
+                ->money(),
36
+            ExportColumn::make('tax_total')
37
+                ->money(),
38
+            ExportColumn::make('discount_total')
39
+                ->money(),
40
+            ExportColumn::make('discount_rate'),
41
+            ExportColumn::make('currency_code'),
42
+            ExportColumn::make('order_number'),
43
+            ExportColumn::make('approved_at')
44
+                ->dateTime(),
45
+            ExportColumn::make('paid_at')
46
+                ->dateTime(),
47
+            ExportColumn::make('last_sent_at')
48
+                ->dateTime(),
49
+            ExportColumn::make('estimate.estimate_number')
50
+                ->label('Estimate number')
51
+                ->enabledByDefault(false),
52
+            ExportColumn::make('recurringInvoice.order_number')
53
+                ->label('Recurring invoice number')
54
+                ->enabledByDefault(false),
55
+            ExportColumn::make('discount_method')
56
+                ->enabledByDefault(false),
57
+        ];
58
+    }
59
+
60
+    public static function getCompletedNotificationBody(Export $export): string
61
+    {
62
+        $body = 'Your invoice export has completed and ' . number_format($export->successful_rows) . ' ' . str('row')->plural($export->successful_rows) . ' exported.';
63
+
64
+        if ($failedRowsCount = $export->getFailedRowsCount()) {
65
+            $body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to export.';
66
+        }
67
+
68
+        return $body;
69
+    }
70
+}

+ 3
- 5
app/Filament/Exports/Accounting/TransactionExporter.php View File

5
 use App\Enums\Accounting\PaymentMethod;
5
 use App\Enums\Accounting\PaymentMethod;
6
 use App\Enums\Accounting\TransactionType;
6
 use App\Enums\Accounting\TransactionType;
7
 use App\Models\Accounting\Transaction;
7
 use App\Models\Accounting\Transaction;
8
-use Carbon\Carbon;
9
 use Filament\Actions\Exports\ExportColumn;
8
 use Filament\Actions\Exports\ExportColumn;
10
 use Filament\Actions\Exports\Exporter;
9
 use Filament\Actions\Exports\Exporter;
11
 use Filament\Actions\Exports\Models\Export;
10
 use Filament\Actions\Exports\Models\Export;
18
     {
17
     {
19
         return [
18
         return [
20
             ExportColumn::make('posted_at')
19
             ExportColumn::make('posted_at')
21
-                ->formatStateUsing(function (?Carbon $state) {
22
-                    return $state?->toDateString();
23
-                }),
20
+                ->date(),
24
             ExportColumn::make('description'),
21
             ExportColumn::make('description'),
25
-            ExportColumn::make('amount'),
22
+            ExportColumn::make('amount')
23
+                ->money(),
26
             ExportColumn::make('account.name')
24
             ExportColumn::make('account.name')
27
                 ->label('Category'),
25
                 ->label('Category'),
28
             ExportColumn::make('bankAccount.account.name')
26
             ExportColumn::make('bankAccount.account.name')

+ 29
- 0
app/Providers/MacroServiceProvider.php View File

15
 use BackedEnum;
15
 use BackedEnum;
16
 use Carbon\CarbonInterface;
16
 use Carbon\CarbonInterface;
17
 use Closure;
17
 use Closure;
18
+use Filament\Actions\Exports\ExportColumn;
18
 use Filament\Forms\Components\DatePicker;
19
 use Filament\Forms\Components\DatePicker;
19
 use Filament\Forms\Components\Field;
20
 use Filament\Forms\Components\Field;
20
 use Filament\Forms\Components\TextInput;
21
 use Filament\Forms\Components\TextInput;
475
 
476
 
476
             return $this->setTimezone($timezone)->format($dateFormat);
477
             return $this->setTimezone($timezone)->format($dateFormat);
477
         });
478
         });
479
+
480
+        ExportColumn::macro('money', function () {
481
+            $this->formatStateUsing(static function ($state) {
482
+                if (blank($state) || ! is_int($state)) {
483
+                    return 0.00;
484
+                }
485
+
486
+                return CurrencyConverter::convertCentsToFloat($state);
487
+            });
488
+
489
+            return $this;
490
+        });
491
+
492
+        ExportColumn::macro('date', function () {
493
+            $this->formatStateUsing(static function (?Carbon $state) {
494
+                return $state?->toDateString();
495
+            });
496
+
497
+            return $this;
498
+        });
499
+
500
+        ExportColumn::macro('dateTime', function () {
501
+            $this->formatStateUsing(static function (?Carbon $state) {
502
+                return $state?->toDateTimeString();
503
+            });
504
+
505
+            return $this;
506
+        });
478
     }
507
     }
479
 }
508
 }

+ 1
- 1
app/Utilities/Currency/CurrencyConverter.php View File

83
 
83
 
84
     public static function convertCentsToFloat(int $amount, ?string $currency = null): float
84
     public static function convertCentsToFloat(int $amount, ?string $currency = null): float
85
     {
85
     {
86
-        $currency ??= CurrencyAccessor::getDefaultCurrency();
86
+        $currency ??= 'USD';
87
 
87
 
88
         return money($amount, $currency)->getValue();
88
         return money($amount, $currency)->getValue();
89
     }
89
     }

Loading…
Cancel
Save