瀏覽代碼

wip: Accounting Module

3.x
wallo 2 年之前
父節點
當前提交
ad2b86abbe

app/Actions/Banking/CreateCurrencyFromAccount.php → app/Actions/OptionAction/CreateCurrency.php 查看文件

1
 <?php
1
 <?php
2
 
2
 
3
-namespace App\Actions\Banking;
3
+namespace App\Actions\OptionAction;
4
 
4
 
5
 use App\Models\Setting\Currency;
5
 use App\Models\Setting\Currency;
6
 use Illuminate\Support\Facades\Auth;
6
 use Illuminate\Support\Facades\Auth;
7
 
7
 
8
-class CreateCurrencyFromAccount
8
+class CreateCurrency
9
 {
9
 {
10
     public function create(string $code, string $name, string $rate): Currency
10
     public function create(string $code, string $name, string $rate): Currency
11
     {
11
     {
12
         $companyId = Auth::user()->currentCompany->id;
12
         $companyId = Auth::user()->currentCompany->id;
13
 
13
 
14
-        $hasDefaultCurrency = Currency::where('company_id', $companyId)->where('enabled', true)->exists();
14
+        $defaultCurrency = Currency::getDefaultCurrency();
15
+
16
+        $hasDefaultCurrency = $defaultCurrency !== null;
15
 
17
 
16
         return Currency::create([
18
         return Currency::create([
17
             'name' => $name,
19
             'name' => $name,
26
             'company_id' => $companyId,
28
             'company_id' => $companyId,
27
         ]);
29
         ]);
28
     }
30
     }
29
-}
31
+}

+ 2
- 3
app/Filament/Pages/Companies.php 查看文件

2
 
2
 
3
 namespace App\Filament\Pages;
3
 namespace App\Filament\Pages;
4
 
4
 
5
-use App\Filament\Pages\Widgets\Companies\Charts\CumulativeTotal;
6
 use Filament\Pages\Page;
5
 use Filament\Pages\Page;
7
 use Illuminate\Support\Facades\Auth;
6
 use Illuminate\Support\Facades\Auth;
8
 use Wallo\FilamentCompanies\FilamentCompanies;
7
 use Wallo\FilamentCompanies\FilamentCompanies;
15
 
14
 
16
     protected static function shouldRegisterNavigation(): bool
15
     protected static function shouldRegisterNavigation(): bool
17
     {
16
     {
18
-        return Auth::user()->currentCompany->name === 'ERPSAAS';
17
+        return Auth::user()->currentCompany->id === 1;
19
     }
18
     }
20
 
19
 
21
     public function mount(): void
20
     public function mount(): void
22
     {
21
     {
23
-        abort_unless(Auth::user()->currentCompany->name === 'ERPSAAS', 403);
22
+        abort_unless(Auth::user()->currentCompany->id === 1, 403);
24
     }
23
     }
25
 
24
 
26
     protected function getHeaderWidgets(): array
25
     protected function getHeaderWidgets(): array

+ 2
- 2
app/Filament/Pages/Employees.php 查看文件

14
 
14
 
15
     protected static function shouldRegisterNavigation(): bool
15
     protected static function shouldRegisterNavigation(): bool
16
     {
16
     {
17
-        return Auth::user()->currentCompany->name === 'ERPSAAS';
17
+        return Auth::user()->currentCompany->id === 1;
18
     }
18
     }
19
 
19
 
20
     public function mount(): void
20
     public function mount(): void
21
     {
21
     {
22
-        abort_unless(Auth::user()->currentCompany->name === 'ERPSAAS', 403);
22
+        abort_unless(Auth::user()->currentCompany->id === 1, 403);
23
     }
23
     }
24
 
24
 
25
     protected function getHeaderWidgets(): array
25
     protected function getHeaderWidgets(): array

+ 2
- 2
app/Filament/Pages/Users.php 查看文件

14
 
14
 
15
     protected static function shouldRegisterNavigation(): bool
15
     protected static function shouldRegisterNavigation(): bool
16
     {
16
     {
17
-        return Auth::user()->currentCompany->name === 'ERPSAAS';
17
+        return Auth::user()->currentCompany->id === 1;
18
     }
18
     }
19
 
19
 
20
     public function mount(): void
20
     public function mount(): void
21
     {
21
     {
22
-        abort_unless(Auth::user()->currentCompany->name === 'ERPSAAS', 403);
22
+        abort_unless(Auth::user()->currentCompany->id === 1, 403);
23
     }
23
     }
24
 
24
 
25
     protected function getHeaderWidgets(): array
25
     protected function getHeaderWidgets(): array

+ 22
- 14
app/Filament/Resources/AccountResource.php 查看文件

2
 
2
 
3
 namespace App\Filament\Resources;
3
 namespace App\Filament\Resources;
4
 
4
 
5
-use App\Actions\Banking\CreateCurrencyFromAccount;
5
+use App\Actions\OptionAction\CreateCurrency;
6
 use App\Filament\Resources\AccountResource\Pages;
6
 use App\Filament\Resources\AccountResource\Pages;
7
 use App\Filament\Resources\AccountResource\RelationManagers;
7
 use App\Filament\Resources\AccountResource\RelationManagers;
8
 use App\Models\Banking\Account;
8
 use App\Models\Banking\Account;
9
 use App\Models\Setting\Currency;
9
 use App\Models\Setting\Currency;
10
+use App\Services\CurrencyService;
10
 use Closure;
11
 use Closure;
11
 use Exception;
12
 use Exception;
12
 use Filament\Forms;
13
 use Filament\Forms;
33
 
34
 
34
     public static function getEloquentQuery(): Builder
35
     public static function getEloquentQuery(): Builder
35
     {
36
     {
36
-        return parent::getEloquentQuery()->where('company_id', Auth::user()->currentCompany->id);
37
+        return parent::getEloquentQuery()
38
+            ->where('company_id', Auth::user()->currentCompany->id);
37
     }
39
     }
38
 
40
 
39
     public static function form(Form $form): Form
41
     public static function form(Form $form): Form
89
                                             ->options(Currency::getCurrencyCodes())
91
                                             ->options(Currency::getCurrencyCodes())
90
                                             ->reactive()
92
                                             ->reactive()
91
                                             ->afterStateUpdated(static function (callable $set, $state) {
93
                                             ->afterStateUpdated(static function (callable $set, $state) {
94
+                                                if ($state === null) {
95
+                                                    return;
96
+                                                }
97
+
92
                                                 $code = $state;
98
                                                 $code = $state;
93
-                                                $name = config("money.{$code}.name");
94
-                                                $set('currency.name', $name);
99
+                                                $currencyConfig = config("money.{$code}", []);
100
+                                                $currencyService = app(CurrencyService::class);
101
+
102
+                                                $defaultCurrency = Currency::getDefaultCurrency();
103
+
104
+                                                $rate = 1;
105
+
106
+                                                if ($defaultCurrency !== null) {
107
+                                                    $rate = $currencyService->getCachedExchangeRate($defaultCurrency, $code);
108
+                                                }
109
+
110
+                                                $set('currency.name', $currencyConfig['name'] ?? '');
111
+                                                $set('currency.rate', $rate);
95
                                             })
112
                                             })
96
                                             ->required(),
113
                                             ->required(),
97
                                         Forms\Components\TextInput::make('currency.name')
114
                                         Forms\Components\TextInput::make('currency.name')
101
                                         Forms\Components\TextInput::make('currency.rate')
118
                                         Forms\Components\TextInput::make('currency.rate')
102
                                             ->label('Rate')
119
                                             ->label('Rate')
103
                                             ->numeric()
120
                                             ->numeric()
104
-                                            ->mask(static fn (Forms\Components\TextInput\Mask $mask) => $mask
105
-                                                ->numeric()
106
-                                                ->decimalPlaces(4)
107
-                                                ->signed(false)
108
-                                                ->padFractionalZeros(false)
109
-                                                ->normalizeZeros(false)
110
-                                                ->minValue(0.0001)
111
-                                                ->maxValue(999999.9999)
112
-                                                ->lazyPlaceholder(false))
113
                                             ->required(),
121
                                             ->required(),
114
                                     ])->createOptionAction(static function (Forms\Components\Actions\Action $action) {
122
                                     ])->createOptionAction(static function (Forms\Components\Actions\Action $action) {
115
                                         return $action
123
                                         return $action
122
                                                     $name = $data['currency']['name'];
130
                                                     $name = $data['currency']['name'];
123
                                                     $rate = $data['currency']['rate'];
131
                                                     $rate = $data['currency']['rate'];
124
 
132
 
125
-                                                    return (new CreateCurrencyFromAccount())->create($code, $name, $rate);
133
+                                                    return (new CreateCurrency())->create($code, $name, $rate);
126
                                                 });
134
                                                 });
127
                                             });
135
                                             });
128
                                     }),
136
                                     }),

+ 8
- 0
app/Filament/Resources/CategoryResource.php 查看文件

4
 
4
 
5
 use App\Filament\Resources\CategoryResource\Pages;
5
 use App\Filament\Resources\CategoryResource\Pages;
6
 use App\Filament\Resources\CategoryResource\RelationManagers;
6
 use App\Filament\Resources\CategoryResource\RelationManagers;
7
+use Illuminate\Database\Eloquent\Builder;
8
+use Illuminate\Support\Facades\Auth;
7
 use Wallo\FilamentSelectify\Components\ToggleButton;
9
 use Wallo\FilamentSelectify\Components\ToggleButton;
8
 use App\Models\Setting\Category;
10
 use App\Models\Setting\Category;
9
 use Exception;
11
 use Exception;
23
 
25
 
24
     protected static ?string $navigationGroup = 'Settings';
26
     protected static ?string $navigationGroup = 'Settings';
25
 
27
 
28
+    public static function getEloquentQuery(): Builder
29
+    {
30
+        return parent::getEloquentQuery()
31
+            ->where('company_id', Auth::user()->currentCompany->id);
32
+    }
33
+
26
     public static function form(Form $form): Form
34
     public static function form(Form $form): Form
27
     {
35
     {
28
         return $form
36
         return $form

+ 2
- 2
app/Filament/Resources/CurrencyResource.php 查看文件

18
 use Illuminate\Database\Eloquent\Builder;
18
 use Illuminate\Database\Eloquent\Builder;
19
 use Illuminate\Support\Collection;
19
 use Illuminate\Support\Collection;
20
 use Illuminate\Support\Facades\Auth;
20
 use Illuminate\Support\Facades\Auth;
21
-use Illuminate\Support\Facades\Cache;
22
 use Wallo\FilamentSelectify\Components\ToggleButton;
21
 use Wallo\FilamentSelectify\Components\ToggleButton;
23
 
22
 
24
 class CurrencyResource extends Resource
23
 class CurrencyResource extends Resource
31
 
30
 
32
     public static function getEloquentQuery(): Builder
31
     public static function getEloquentQuery(): Builder
33
     {
32
     {
34
-        return parent::getEloquentQuery()->where('company_id', Auth::user()->currentCompany->id);
33
+        return parent::getEloquentQuery()
34
+            ->where('company_id', Auth::user()->currentCompany->id);
35
     }
35
     }
36
 
36
 
37
     public static function form(Form $form): Form
37
     public static function form(Form $form): Form

+ 21
- 14
app/Filament/Resources/CustomerResource.php 查看文件

2
 
2
 
3
 namespace App\Filament\Resources;
3
 namespace App\Filament\Resources;
4
 
4
 
5
-use App\Actions\Banking\CreateCurrencyFromAccount;
5
+use App\Actions\OptionAction\CreateCurrency;
6
 use App\Filament\Resources\CustomerResource\Pages;
6
 use App\Filament\Resources\CustomerResource\Pages;
7
 use App\Filament\Resources\CustomerResource\RelationManagers;
7
 use App\Filament\Resources\CustomerResource\RelationManagers;
8
 use App\Models\Setting\Currency;
8
 use App\Models\Setting\Currency;
9
+use App\Services\CurrencyService;
9
 use Wallo\FilamentSelectify\Components\ButtonGroup;
10
 use Wallo\FilamentSelectify\Components\ButtonGroup;
10
 use App\Models\Contact;
11
 use App\Models\Contact;
11
 use Filament\Forms;
12
 use Filament\Forms;
101
                                     ->options(Currency::getCurrencyCodes())
102
                                     ->options(Currency::getCurrencyCodes())
102
                                     ->reactive()
103
                                     ->reactive()
103
                                     ->afterStateUpdated(static function (callable $set, $state) {
104
                                     ->afterStateUpdated(static function (callable $set, $state) {
105
+                                        if ($state === null) {
106
+                                            return;
107
+                                        }
108
+
104
                                         $code = $state;
109
                                         $code = $state;
105
-                                        $name = config("money.{$code}.name");
106
-                                        $set('currency.name', $name);
110
+                                        $currencyConfig = config("money.{$code}", []);
111
+                                        $currencyService = app(CurrencyService::class);
112
+
113
+                                        $defaultCurrency = Currency::getDefaultCurrency();
114
+
115
+                                        $rate = 1;
116
+
117
+                                        if ($defaultCurrency !== null) {
118
+                                            $rate = $currencyService->getCachedExchangeRate($defaultCurrency, $code);
119
+                                        }
120
+
121
+                                        $set('currency.name', $currencyConfig['name'] ?? '');
122
+                                        $set('currency.rate', $rate);
107
                                     })
123
                                     })
108
                                     ->required(),
124
                                     ->required(),
109
                                 Forms\Components\TextInput::make('currency.name')
125
                                 Forms\Components\TextInput::make('currency.name')
113
                                 Forms\Components\TextInput::make('currency.rate')
129
                                 Forms\Components\TextInput::make('currency.rate')
114
                                     ->label('Rate')
130
                                     ->label('Rate')
115
                                     ->numeric()
131
                                     ->numeric()
116
-                                    ->mask(static fn (Forms\Components\TextInput\Mask $mask) => $mask
117
-                                        ->numeric()
118
-                                        ->decimalPlaces(4)
119
-                                        ->signed(false)
120
-                                        ->padFractionalZeros(false)
121
-                                        ->normalizeZeros(false)
122
-                                        ->minValue(0.0001)
123
-                                        ->maxValue(999999.9999)
124
-                                        ->lazyPlaceholder(false))
125
                                     ->required(),
132
                                     ->required(),
126
                             ])->createOptionAction(static function (Forms\Components\Actions\Action $action) {
133
                             ])->createOptionAction(static function (Forms\Components\Actions\Action $action) {
127
                                 return $action
134
                                 return $action
134
                                             $name = $data['currency']['name'];
141
                                             $name = $data['currency']['name'];
135
                                             $rate = $data['currency']['rate'];
142
                                             $rate = $data['currency']['rate'];
136
 
143
 
137
-                                            return (new CreateCurrencyFromAccount())->create($code, $name, $rate);
144
+                                            return (new CreateCurrency())->create($code, $name, $rate);
138
                                         });
145
                                         });
139
                                     });
146
                                     });
140
                             }),
147
                             }),
141
-                ])->columns(2),
148
+                    ])->columns(),
142
                 Forms\Components\Section::make('Address')
149
                 Forms\Components\Section::make('Address')
143
                     ->schema([
150
                     ->schema([
144
                         Forms\Components\TextInput::make('address')
151
                         Forms\Components\TextInput::make('address')

+ 7
- 6
app/Filament/Resources/DiscountResource.php 查看文件

5
 use App\Filament\Resources\DiscountResource\Pages;
5
 use App\Filament\Resources\DiscountResource\Pages;
6
 use App\Filament\Resources\DiscountResource\RelationManagers;
6
 use App\Filament\Resources\DiscountResource\RelationManagers;
7
 use App\Models\Setting\Discount;
7
 use App\Models\Setting\Discount;
8
-use App\Models\Setting\Tax;
9
 use Filament\Forms;
8
 use Filament\Forms;
10
 use Filament\Forms\Components\TextInput\Mask;
9
 use Filament\Forms\Components\TextInput\Mask;
11
 use Filament\Resources\Form;
10
 use Filament\Resources\Form;
13
 use Filament\Resources\Table;
12
 use Filament\Resources\Table;
14
 use Filament\Tables;
13
 use Filament\Tables;
15
 use Illuminate\Database\Eloquent\Builder;
14
 use Illuminate\Database\Eloquent\Builder;
16
-use Illuminate\Database\Eloquent\SoftDeletingScope;
15
+use Illuminate\Support\Facades\Auth;
17
 use Wallo\FilamentSelectify\Components\ToggleButton;
16
 use Wallo\FilamentSelectify\Components\ToggleButton;
18
 
17
 
19
 class DiscountResource extends Resource
18
 class DiscountResource extends Resource
24
 
23
 
25
     protected static ?string $navigationGroup = 'Settings';
24
     protected static ?string $navigationGroup = 'Settings';
26
 
25
 
26
+    public static function getEloquentQuery(): Builder
27
+    {
28
+        return parent::getEloquentQuery()
29
+            ->where('company_id', Auth::user()->currentCompany->id);
30
+    }
31
+
27
     public static function form(Form $form): Form
32
     public static function form(Form $form): Form
28
     {
33
     {
29
         return $form
34
         return $form
128
                     ->formatStateUsing(static function (Discount $record) {
133
                     ->formatStateUsing(static function (Discount $record) {
129
                         $rate = $record->rate;
134
                         $rate = $record->rate;
130
 
135
 
131
-                        if (str_contains($rate, '.')) {
132
-                            $rate = rtrim(rtrim($rate, '0'), '.');
133
-                        }
134
-
135
                         return $rate . ($record->computation === 'percentage' ? '%' : null);
136
                         return $rate . ($record->computation === 'percentage' ? '%' : null);
136
                     })
137
                     })
137
                     ->searchable()
138
                     ->searchable()

+ 8
- 6
app/Filament/Resources/TaxResource.php 查看文件

4
 
4
 
5
 use App\Filament\Resources\TaxResource\Pages;
5
 use App\Filament\Resources\TaxResource\Pages;
6
 use App\Filament\Resources\TaxResource\RelationManagers;
6
 use App\Filament\Resources\TaxResource\RelationManagers;
7
-use App\Models\Setting\Category;
8
 use App\Models\Setting\Tax;
7
 use App\Models\Setting\Tax;
9
-use Closure;
10
 use Exception;
8
 use Exception;
11
 use Filament\Forms;
9
 use Filament\Forms;
12
 use Filament\Forms\Components\TextInput\Mask;
10
 use Filament\Forms\Components\TextInput\Mask;
15
 use Filament\Resources\Resource;
13
 use Filament\Resources\Resource;
16
 use Filament\Resources\Table;
14
 use Filament\Resources\Table;
17
 use Filament\Tables;
15
 use Filament\Tables;
16
+use Illuminate\Database\Eloquent\Builder;
18
 use Illuminate\Support\Collection;
17
 use Illuminate\Support\Collection;
18
+use Illuminate\Support\Facades\Auth;
19
 use Wallo\FilamentSelectify\Components\ToggleButton;
19
 use Wallo\FilamentSelectify\Components\ToggleButton;
20
 
20
 
21
 class TaxResource extends Resource
21
 class TaxResource extends Resource
26
 
26
 
27
     protected static ?string $navigationGroup = 'Settings';
27
     protected static ?string $navigationGroup = 'Settings';
28
 
28
 
29
+    public static function getEloquentQuery(): Builder
30
+    {
31
+        return parent::getEloquentQuery()
32
+            ->where('company_id', Auth::user()->currentCompany->id);
33
+    }
34
+
29
     public static function form(Form $form): Form
35
     public static function form(Form $form): Form
30
     {
36
     {
31
         return $form
37
         return $form
109
                     ->formatStateUsing(static function (Tax $record) {
115
                     ->formatStateUsing(static function (Tax $record) {
110
                         $rate = $record->rate;
116
                         $rate = $record->rate;
111
 
117
 
112
-                        if (str_contains($rate, '.')) {
113
-                            $rate = rtrim(rtrim($rate, '0'), '.');
114
-                        }
115
-
116
                         return $rate . ($record->computation === 'percentage' || $record->computation === 'compound' ? '%' : null);
118
                         return $rate . ($record->computation === 'percentage' || $record->computation === 'compound' ? '%' : null);
117
                     })
119
                     })
118
                     ->searchable()
120
                     ->searchable()

Loading…
取消
儲存