Andrew Wallo 6 月之前
父節點
當前提交
5323fe2864

+ 3
- 3
app/Filament/Company/Resources/Purchases/BillResource.php 查看文件

122
                                     Header::make($settings->resolveColumnLabel('item_name', 'Items'))
122
                                     Header::make($settings->resolveColumnLabel('item_name', 'Items'))
123
                                         ->width($hasDiscounts ? '15%' : '20%'),
123
                                         ->width($hasDiscounts ? '15%' : '20%'),
124
                                     Header::make('Description')
124
                                     Header::make('Description')
125
-                                        ->width($hasDiscounts ? '15%' : '20%'), // Reduced from 25%/30%
125
+                                        ->width($hasDiscounts ? '15%' : '20%'),
126
                                     Header::make($settings->resolveColumnLabel('unit_name', 'Quantity'))
126
                                     Header::make($settings->resolveColumnLabel('unit_name', 'Quantity'))
127
                                         ->width('10%'),
127
                                         ->width('10%'),
128
                                     Header::make($settings->resolveColumnLabel('price_name', 'Price'))
128
                                     Header::make($settings->resolveColumnLabel('price_name', 'Price'))
129
                                         ->width('10%'),
129
                                         ->width('10%'),
130
                                     Header::make('Taxes')
130
                                     Header::make('Taxes')
131
-                                        ->width($hasDiscounts ? '20%' : '30%'), // Increased from 15%/20%
131
+                                        ->width($hasDiscounts ? '20%' : '30%'),
132
                                 ];
132
                                 ];
133
 
133
 
134
                                 if ($hasDiscounts) {
134
                                 if ($hasDiscounts) {
135
-                                    $headers[] = Header::make('Discounts')->width('20%'); // Increased from 15%
135
+                                    $headers[] = Header::make('Discounts')->width('20%');
136
                                 }
136
                                 }
137
 
137
 
138
                                 $headers[] = Header::make($settings->resolveColumnLabel('amount_name', 'Amount'))
138
                                 $headers[] = Header::make($settings->resolveColumnLabel('amount_name', 'Amount'))

+ 52
- 12
app/Filament/Company/Resources/Sales/EstimateResource.php 查看文件

2
 
2
 
3
 namespace App\Filament\Company\Resources\Sales;
3
 namespace App\Filament\Company\Resources\Sales;
4
 
4
 
5
+use App\Enums\Accounting\AdjustmentCategory;
6
+use App\Enums\Accounting\AdjustmentStatus;
7
+use App\Enums\Accounting\AdjustmentType;
5
 use App\Enums\Accounting\DocumentDiscountMethod;
8
 use App\Enums\Accounting\DocumentDiscountMethod;
6
 use App\Enums\Accounting\DocumentType;
9
 use App\Enums\Accounting\DocumentType;
7
 use App\Enums\Accounting\EstimateStatus;
10
 use App\Enums\Accounting\EstimateStatus;
8
 use App\Filament\Company\Resources\Sales\ClientResource\RelationManagers\EstimatesRelationManager;
11
 use App\Filament\Company\Resources\Sales\ClientResource\RelationManagers\EstimatesRelationManager;
9
 use App\Filament\Company\Resources\Sales\EstimateResource\Pages;
12
 use App\Filament\Company\Resources\Sales\EstimateResource\Pages;
10
 use App\Filament\Company\Resources\Sales\EstimateResource\Widgets;
13
 use App\Filament\Company\Resources\Sales\EstimateResource\Widgets;
14
+use App\Filament\Forms\Components\CreateAdjustmentSelect;
11
 use App\Filament\Forms\Components\CreateCurrencySelect;
15
 use App\Filament\Forms\Components\CreateCurrencySelect;
12
 use App\Filament\Forms\Components\DocumentFooterSection;
16
 use App\Filament\Forms\Components\DocumentFooterSection;
13
 use App\Filament\Forms\Components\DocumentHeaderSection;
17
 use App\Filament\Forms\Components\DocumentHeaderSection;
16
 use App\Filament\Tables\Columns;
20
 use App\Filament\Tables\Columns;
17
 use App\Filament\Tables\Filters\DateRangeFilter;
21
 use App\Filament\Tables\Filters\DateRangeFilter;
18
 use App\Models\Accounting\Adjustment;
22
 use App\Models\Accounting\Adjustment;
23
+use App\Models\Accounting\DocumentLineItem;
19
 use App\Models\Accounting\Estimate;
24
 use App\Models\Accounting\Estimate;
20
 use App\Models\Common\Client;
25
 use App\Models\Common\Client;
21
 use App\Models\Common\Offering;
26
 use App\Models\Common\Offering;
124
                                     Header::make($settings->resolveColumnLabel('item_name', 'Items'))
129
                                     Header::make($settings->resolveColumnLabel('item_name', 'Items'))
125
                                         ->width($hasDiscounts ? '15%' : '20%'),
130
                                         ->width($hasDiscounts ? '15%' : '20%'),
126
                                     Header::make('Description')
131
                                     Header::make('Description')
127
-                                        ->width($hasDiscounts ? '25%' : '30%'),
132
+                                        ->width($hasDiscounts ? '15%' : '20%'),
128
                                     Header::make($settings->resolveColumnLabel('unit_name', 'Quantity'))
133
                                     Header::make($settings->resolveColumnLabel('unit_name', 'Quantity'))
129
                                         ->width('10%'),
134
                                         ->width('10%'),
130
                                     Header::make($settings->resolveColumnLabel('price_name', 'Price'))
135
                                     Header::make($settings->resolveColumnLabel('price_name', 'Price'))
131
                                         ->width('10%'),
136
                                         ->width('10%'),
132
                                     Header::make('Taxes')
137
                                     Header::make('Taxes')
133
-                                        ->width($hasDiscounts ? '15%' : '20%'),
138
+                                        ->width($hasDiscounts ? '20%' : '30%'),
134
                                 ];
139
                                 ];
135
 
140
 
136
                                 if ($hasDiscounts) {
141
                                 if ($hasDiscounts) {
137
-                                    $headers[] = Header::make('Discounts')->width('15%');
142
+                                    $headers[] = Header::make('Discounts')->width('20%');
138
                                 }
143
                                 }
139
 
144
 
140
                                 $headers[] = Header::make($settings->resolveColumnLabel('amount_name', 'Amount'))
145
                                 $headers[] = Header::make($settings->resolveColumnLabel('amount_name', 'Amount'))
150
                                     ->searchable()
155
                                     ->searchable()
151
                                     ->required()
156
                                     ->required()
152
                                     ->live()
157
                                     ->live()
153
-                                    ->afterStateUpdated(function (Forms\Set $set, Forms\Get $get, $state) {
158
+                                    ->afterStateUpdated(function (Forms\Set $set, Forms\Get $get, $state, ?DocumentLineItem $record) {
154
                                         $offeringId = $state;
159
                                         $offeringId = $state;
155
-                                        $offeringRecord = Offering::with(['salesTaxes', 'salesDiscounts'])->find($offeringId);
160
+                                        $discountMethod = DocumentDiscountMethod::parse($get('../../discount_method'));
161
+                                        $isPerLineItem = $discountMethod->isPerLineItem();
162
+
163
+                                        $existingTaxIds = [];
164
+                                        $existingDiscountIds = [];
165
+
166
+                                        if ($record) {
167
+                                            $existingTaxIds = $record->salesTaxes()->pluck('adjustments.id')->toArray();
168
+                                            if ($isPerLineItem) {
169
+                                                $existingDiscountIds = $record->salesDiscounts()->pluck('adjustments.id')->toArray();
170
+                                            }
171
+                                        }
172
+
173
+                                        $with = [
174
+                                            'salesTaxes' => static function ($query) use ($existingTaxIds) {
175
+                                                $query->where(static function ($query) use ($existingTaxIds) {
176
+                                                    $query->where('status', AdjustmentStatus::Active)
177
+                                                        ->orWhereIn('adjustments.id', $existingTaxIds);
178
+                                                });
179
+                                            },
180
+                                        ];
181
+
182
+                                        if ($isPerLineItem) {
183
+                                            $with['salesDiscounts'] = static function ($query) use ($existingDiscountIds) {
184
+                                                $query->where(static function ($query) use ($existingDiscountIds) {
185
+                                                    $query->where('status', AdjustmentStatus::Active)
186
+                                                        ->orWhereIn('adjustments.id', $existingDiscountIds);
187
+                                                });
188
+                                            };
189
+                                        }
190
+
191
+                                        $offeringRecord = Offering::with($with)->find($offeringId);
156
 
192
 
157
                                         if (! $offeringRecord) {
193
                                         if (! $offeringRecord) {
158
                                             return;
194
                                             return;
164
                                         $set('unit_price', $unitPrice);
200
                                         $set('unit_price', $unitPrice);
165
                                         $set('salesTaxes', $offeringRecord->salesTaxes->pluck('id')->toArray());
201
                                         $set('salesTaxes', $offeringRecord->salesTaxes->pluck('id')->toArray());
166
 
202
 
167
-                                        $discountMethod = DocumentDiscountMethod::parse($get('../../discount_method'));
168
-                                        if ($discountMethod->isPerLineItem()) {
203
+                                        if ($isPerLineItem) {
169
                                             $set('salesDiscounts', $offeringRecord->salesDiscounts->pluck('id')->toArray());
204
                                             $set('salesDiscounts', $offeringRecord->salesDiscounts->pluck('id')->toArray());
170
                                         }
205
                                         }
171
                                     }),
206
                                     }),
182
                                     ->live()
217
                                     ->live()
183
                                     ->maxValue(9999999999.99)
218
                                     ->maxValue(9999999999.99)
184
                                     ->default(0),
219
                                     ->default(0),
185
-                                Forms\Components\Select::make('salesTaxes')
186
-                                    ->relationship('salesTaxes', 'name')
220
+                                CreateAdjustmentSelect::make('salesTaxes')
221
+                                    ->label('Taxes')
222
+                                    ->category(AdjustmentCategory::Tax)
223
+                                    ->type(AdjustmentType::Sales)
224
+                                    ->adjustmentsRelationship('salesTaxes')
187
                                     ->saveRelationshipsUsing(null)
225
                                     ->saveRelationshipsUsing(null)
188
                                     ->dehydrated(true)
226
                                     ->dehydrated(true)
189
                                     ->preload()
227
                                     ->preload()
190
                                     ->multiple()
228
                                     ->multiple()
191
                                     ->live()
229
                                     ->live()
192
                                     ->searchable(),
230
                                     ->searchable(),
193
-                                Forms\Components\Select::make('salesDiscounts')
194
-                                    ->relationship('salesDiscounts', 'name')
231
+                                CreateAdjustmentSelect::make('salesDiscounts')
232
+                                    ->label('Discounts')
233
+                                    ->category(AdjustmentCategory::Discount)
234
+                                    ->type(AdjustmentType::Sales)
235
+                                    ->adjustmentsRelationship('salesDiscounts')
195
                                     ->saveRelationshipsUsing(null)
236
                                     ->saveRelationshipsUsing(null)
196
                                     ->dehydrated(true)
237
                                     ->dehydrated(true)
197
-                                    ->preload()
198
                                     ->multiple()
238
                                     ->multiple()
199
                                     ->live()
239
                                     ->live()
200
                                     ->hidden(function (Forms\Get $get) {
240
                                     ->hidden(function (Forms\Get $get) {

+ 52
- 12
app/Filament/Company/Resources/Sales/InvoiceResource.php 查看文件

3
 namespace App\Filament\Company\Resources\Sales;
3
 namespace App\Filament\Company\Resources\Sales;
4
 
4
 
5
 use App\Collections\Accounting\DocumentCollection;
5
 use App\Collections\Accounting\DocumentCollection;
6
+use App\Enums\Accounting\AdjustmentCategory;
7
+use App\Enums\Accounting\AdjustmentStatus;
8
+use App\Enums\Accounting\AdjustmentType;
6
 use App\Enums\Accounting\DocumentDiscountMethod;
9
 use App\Enums\Accounting\DocumentDiscountMethod;
7
 use App\Enums\Accounting\DocumentType;
10
 use App\Enums\Accounting\DocumentType;
8
 use App\Enums\Accounting\InvoiceStatus;
11
 use App\Enums\Accounting\InvoiceStatus;
11
 use App\Filament\Company\Resources\Sales\InvoiceResource\Pages;
14
 use App\Filament\Company\Resources\Sales\InvoiceResource\Pages;
12
 use App\Filament\Company\Resources\Sales\InvoiceResource\RelationManagers;
15
 use App\Filament\Company\Resources\Sales\InvoiceResource\RelationManagers;
13
 use App\Filament\Company\Resources\Sales\InvoiceResource\Widgets;
16
 use App\Filament\Company\Resources\Sales\InvoiceResource\Widgets;
17
+use App\Filament\Forms\Components\CreateAdjustmentSelect;
14
 use App\Filament\Forms\Components\CreateCurrencySelect;
18
 use App\Filament\Forms\Components\CreateCurrencySelect;
15
 use App\Filament\Forms\Components\DocumentFooterSection;
19
 use App\Filament\Forms\Components\DocumentFooterSection;
16
 use App\Filament\Forms\Components\DocumentHeaderSection;
20
 use App\Filament\Forms\Components\DocumentHeaderSection;
19
 use App\Filament\Tables\Columns;
23
 use App\Filament\Tables\Columns;
20
 use App\Filament\Tables\Filters\DateRangeFilter;
24
 use App\Filament\Tables\Filters\DateRangeFilter;
21
 use App\Models\Accounting\Adjustment;
25
 use App\Models\Accounting\Adjustment;
26
+use App\Models\Accounting\DocumentLineItem;
22
 use App\Models\Accounting\Invoice;
27
 use App\Models\Accounting\Invoice;
23
 use App\Models\Banking\BankAccount;
28
 use App\Models\Banking\BankAccount;
24
 use App\Models\Common\Client;
29
 use App\Models\Common\Client;
137
                                     Header::make($settings->resolveColumnLabel('item_name', 'Items'))
142
                                     Header::make($settings->resolveColumnLabel('item_name', 'Items'))
138
                                         ->width($hasDiscounts ? '15%' : '20%'),
143
                                         ->width($hasDiscounts ? '15%' : '20%'),
139
                                     Header::make('Description')
144
                                     Header::make('Description')
140
-                                        ->width($hasDiscounts ? '25%' : '30%'),
145
+                                        ->width($hasDiscounts ? '15%' : '20%'),
141
                                     Header::make($settings->resolveColumnLabel('unit_name', 'Quantity'))
146
                                     Header::make($settings->resolveColumnLabel('unit_name', 'Quantity'))
142
                                         ->width('10%'),
147
                                         ->width('10%'),
143
                                     Header::make($settings->resolveColumnLabel('price_name', 'Price'))
148
                                     Header::make($settings->resolveColumnLabel('price_name', 'Price'))
144
                                         ->width('10%'),
149
                                         ->width('10%'),
145
                                     Header::make('Taxes')
150
                                     Header::make('Taxes')
146
-                                        ->width($hasDiscounts ? '15%' : '20%'),
151
+                                        ->width($hasDiscounts ? '20%' : '30%'),
147
                                 ];
152
                                 ];
148
 
153
 
149
                                 if ($hasDiscounts) {
154
                                 if ($hasDiscounts) {
150
-                                    $headers[] = Header::make('Discounts')->width('15%');
155
+                                    $headers[] = Header::make('Discounts')->width('20%');
151
                                 }
156
                                 }
152
 
157
 
153
                                 $headers[] = Header::make($settings->resolveColumnLabel('amount_name', 'Amount'))
158
                                 $headers[] = Header::make($settings->resolveColumnLabel('amount_name', 'Amount'))
163
                                     ->searchable()
168
                                     ->searchable()
164
                                     ->required()
169
                                     ->required()
165
                                     ->live()
170
                                     ->live()
166
-                                    ->afterStateUpdated(function (Forms\Set $set, Forms\Get $get, $state) {
171
+                                    ->afterStateUpdated(function (Forms\Set $set, Forms\Get $get, $state, ?DocumentLineItem $record) {
167
                                         $offeringId = $state;
172
                                         $offeringId = $state;
168
-                                        $offeringRecord = Offering::with(['salesTaxes', 'salesDiscounts'])->find($offeringId);
173
+                                        $discountMethod = DocumentDiscountMethod::parse($get('../../discount_method'));
174
+                                        $isPerLineItem = $discountMethod->isPerLineItem();
175
+
176
+                                        $existingTaxIds = [];
177
+                                        $existingDiscountIds = [];
178
+
179
+                                        if ($record) {
180
+                                            $existingTaxIds = $record->salesTaxes()->pluck('adjustments.id')->toArray();
181
+                                            if ($isPerLineItem) {
182
+                                                $existingDiscountIds = $record->salesDiscounts()->pluck('adjustments.id')->toArray();
183
+                                            }
184
+                                        }
185
+
186
+                                        $with = [
187
+                                            'salesTaxes' => static function ($query) use ($existingTaxIds) {
188
+                                                $query->where(static function ($query) use ($existingTaxIds) {
189
+                                                    $query->where('status', AdjustmentStatus::Active)
190
+                                                        ->orWhereIn('adjustments.id', $existingTaxIds);
191
+                                                });
192
+                                            },
193
+                                        ];
194
+
195
+                                        if ($isPerLineItem) {
196
+                                            $with['salesDiscounts'] = static function ($query) use ($existingDiscountIds) {
197
+                                                $query->where(static function ($query) use ($existingDiscountIds) {
198
+                                                    $query->where('status', AdjustmentStatus::Active)
199
+                                                        ->orWhereIn('adjustments.id', $existingDiscountIds);
200
+                                                });
201
+                                            };
202
+                                        }
203
+
204
+                                        $offeringRecord = Offering::with($with)->find($offeringId);
169
 
205
 
170
                                         if (! $offeringRecord) {
206
                                         if (! $offeringRecord) {
171
                                             return;
207
                                             return;
177
                                         $set('unit_price', $unitPrice);
213
                                         $set('unit_price', $unitPrice);
178
                                         $set('salesTaxes', $offeringRecord->salesTaxes->pluck('id')->toArray());
214
                                         $set('salesTaxes', $offeringRecord->salesTaxes->pluck('id')->toArray());
179
 
215
 
180
-                                        $discountMethod = DocumentDiscountMethod::parse($get('../../discount_method'));
181
-                                        if ($discountMethod->isPerLineItem()) {
216
+                                        if ($isPerLineItem) {
182
                                             $set('salesDiscounts', $offeringRecord->salesDiscounts->pluck('id')->toArray());
217
                                             $set('salesDiscounts', $offeringRecord->salesDiscounts->pluck('id')->toArray());
183
                                         }
218
                                         }
184
                                     }),
219
                                     }),
195
                                     ->live()
230
                                     ->live()
196
                                     ->maxValue(9999999999.99)
231
                                     ->maxValue(9999999999.99)
197
                                     ->default(0),
232
                                     ->default(0),
198
-                                Forms\Components\Select::make('salesTaxes')
199
-                                    ->relationship('salesTaxes', 'name')
233
+                                CreateAdjustmentSelect::make('salesTaxes')
234
+                                    ->label('Taxes')
235
+                                    ->category(AdjustmentCategory::Tax)
236
+                                    ->type(AdjustmentType::Sales)
237
+                                    ->adjustmentsRelationship('salesTaxes')
200
                                     ->saveRelationshipsUsing(null)
238
                                     ->saveRelationshipsUsing(null)
201
                                     ->dehydrated(true)
239
                                     ->dehydrated(true)
202
                                     ->preload()
240
                                     ->preload()
203
                                     ->multiple()
241
                                     ->multiple()
204
                                     ->live()
242
                                     ->live()
205
                                     ->searchable(),
243
                                     ->searchable(),
206
-                                Forms\Components\Select::make('salesDiscounts')
207
-                                    ->relationship('salesDiscounts', 'name')
244
+                                CreateAdjustmentSelect::make('salesDiscounts')
245
+                                    ->label('Discounts')
246
+                                    ->category(AdjustmentCategory::Discount)
247
+                                    ->type(AdjustmentType::Sales)
248
+                                    ->adjustmentsRelationship('salesDiscounts')
208
                                     ->saveRelationshipsUsing(null)
249
                                     ->saveRelationshipsUsing(null)
209
                                     ->dehydrated(true)
250
                                     ->dehydrated(true)
210
-                                    ->preload()
211
                                     ->multiple()
251
                                     ->multiple()
212
                                     ->live()
252
                                     ->live()
213
                                     ->hidden(function (Forms\Get $get) {
253
                                     ->hidden(function (Forms\Get $get) {

+ 52
- 12
app/Filament/Company/Resources/Sales/RecurringInvoiceResource.php 查看文件

2
 
2
 
3
 namespace App\Filament\Company\Resources\Sales;
3
 namespace App\Filament\Company\Resources\Sales;
4
 
4
 
5
+use App\Enums\Accounting\AdjustmentCategory;
6
+use App\Enums\Accounting\AdjustmentStatus;
7
+use App\Enums\Accounting\AdjustmentType;
5
 use App\Enums\Accounting\DocumentDiscountMethod;
8
 use App\Enums\Accounting\DocumentDiscountMethod;
6
 use App\Enums\Accounting\DocumentType;
9
 use App\Enums\Accounting\DocumentType;
7
 use App\Enums\Accounting\RecurringInvoiceStatus;
10
 use App\Enums\Accounting\RecurringInvoiceStatus;
8
 use App\Enums\Setting\PaymentTerms;
11
 use App\Enums\Setting\PaymentTerms;
9
 use App\Filament\Company\Resources\Sales\ClientResource\RelationManagers\RecurringInvoicesRelationManager;
12
 use App\Filament\Company\Resources\Sales\ClientResource\RelationManagers\RecurringInvoicesRelationManager;
10
 use App\Filament\Company\Resources\Sales\RecurringInvoiceResource\Pages;
13
 use App\Filament\Company\Resources\Sales\RecurringInvoiceResource\Pages;
14
+use App\Filament\Forms\Components\CreateAdjustmentSelect;
11
 use App\Filament\Forms\Components\CreateCurrencySelect;
15
 use App\Filament\Forms\Components\CreateCurrencySelect;
12
 use App\Filament\Forms\Components\DocumentFooterSection;
16
 use App\Filament\Forms\Components\DocumentFooterSection;
13
 use App\Filament\Forms\Components\DocumentHeaderSection;
17
 use App\Filament\Forms\Components\DocumentHeaderSection;
14
 use App\Filament\Forms\Components\DocumentTotals;
18
 use App\Filament\Forms\Components\DocumentTotals;
15
 use App\Filament\Tables\Columns;
19
 use App\Filament\Tables\Columns;
16
 use App\Models\Accounting\Adjustment;
20
 use App\Models\Accounting\Adjustment;
21
+use App\Models\Accounting\DocumentLineItem;
17
 use App\Models\Accounting\RecurringInvoice;
22
 use App\Models\Accounting\RecurringInvoice;
18
 use App\Models\Common\Client;
23
 use App\Models\Common\Client;
19
 use App\Models\Common\Offering;
24
 use App\Models\Common\Offering;
108
                                     Header::make($settings->resolveColumnLabel('item_name', 'Items'))
113
                                     Header::make($settings->resolveColumnLabel('item_name', 'Items'))
109
                                         ->width($hasDiscounts ? '15%' : '20%'),
114
                                         ->width($hasDiscounts ? '15%' : '20%'),
110
                                     Header::make('Description')
115
                                     Header::make('Description')
111
-                                        ->width($hasDiscounts ? '25%' : '30%'),
116
+                                        ->width($hasDiscounts ? '15%' : '20%'),
112
                                     Header::make($settings->resolveColumnLabel('unit_name', 'Quantity'))
117
                                     Header::make($settings->resolveColumnLabel('unit_name', 'Quantity'))
113
                                         ->width('10%'),
118
                                         ->width('10%'),
114
                                     Header::make($settings->resolveColumnLabel('price_name', 'Price'))
119
                                     Header::make($settings->resolveColumnLabel('price_name', 'Price'))
115
                                         ->width('10%'),
120
                                         ->width('10%'),
116
                                     Header::make('Taxes')
121
                                     Header::make('Taxes')
117
-                                        ->width($hasDiscounts ? '15%' : '20%'),
122
+                                        ->width($hasDiscounts ? '20%' : '30%'),
118
                                 ];
123
                                 ];
119
 
124
 
120
                                 if ($hasDiscounts) {
125
                                 if ($hasDiscounts) {
121
-                                    $headers[] = Header::make('Discounts')->width('15%');
126
+                                    $headers[] = Header::make('Discounts')->width('20%');
122
                                 }
127
                                 }
123
 
128
 
124
                                 $headers[] = Header::make($settings->resolveColumnLabel('amount_name', 'Amount'))
129
                                 $headers[] = Header::make($settings->resolveColumnLabel('amount_name', 'Amount'))
134
                                     ->searchable()
139
                                     ->searchable()
135
                                     ->required()
140
                                     ->required()
136
                                     ->live()
141
                                     ->live()
137
-                                    ->afterStateUpdated(function (Forms\Set $set, Forms\Get $get, $state) {
142
+                                    ->afterStateUpdated(function (Forms\Set $set, Forms\Get $get, $state, ?DocumentLineItem $record) {
138
                                         $offeringId = $state;
143
                                         $offeringId = $state;
139
-                                        $offeringRecord = Offering::with(['salesTaxes', 'salesDiscounts'])->find($offeringId);
144
+                                        $discountMethod = DocumentDiscountMethod::parse($get('../../discount_method'));
145
+                                        $isPerLineItem = $discountMethod->isPerLineItem();
146
+
147
+                                        $existingTaxIds = [];
148
+                                        $existingDiscountIds = [];
149
+
150
+                                        if ($record) {
151
+                                            $existingTaxIds = $record->salesTaxes()->pluck('adjustments.id')->toArray();
152
+                                            if ($isPerLineItem) {
153
+                                                $existingDiscountIds = $record->salesDiscounts()->pluck('adjustments.id')->toArray();
154
+                                            }
155
+                                        }
156
+
157
+                                        $with = [
158
+                                            'salesTaxes' => static function ($query) use ($existingTaxIds) {
159
+                                                $query->where(static function ($query) use ($existingTaxIds) {
160
+                                                    $query->where('status', AdjustmentStatus::Active)
161
+                                                        ->orWhereIn('adjustments.id', $existingTaxIds);
162
+                                                });
163
+                                            },
164
+                                        ];
165
+
166
+                                        if ($isPerLineItem) {
167
+                                            $with['salesDiscounts'] = static function ($query) use ($existingDiscountIds) {
168
+                                                $query->where(static function ($query) use ($existingDiscountIds) {
169
+                                                    $query->where('status', AdjustmentStatus::Active)
170
+                                                        ->orWhereIn('adjustments.id', $existingDiscountIds);
171
+                                                });
172
+                                            };
173
+                                        }
174
+
175
+                                        $offeringRecord = Offering::with($with)->find($offeringId);
140
 
176
 
141
                                         if (! $offeringRecord) {
177
                                         if (! $offeringRecord) {
142
                                             return;
178
                                             return;
148
                                         $set('unit_price', $unitPrice);
184
                                         $set('unit_price', $unitPrice);
149
                                         $set('salesTaxes', $offeringRecord->salesTaxes->pluck('id')->toArray());
185
                                         $set('salesTaxes', $offeringRecord->salesTaxes->pluck('id')->toArray());
150
 
186
 
151
-                                        $discountMethod = DocumentDiscountMethod::parse($get('../../discount_method'));
152
-                                        if ($discountMethod->isPerLineItem()) {
187
+                                        if ($isPerLineItem) {
153
                                             $set('salesDiscounts', $offeringRecord->salesDiscounts->pluck('id')->toArray());
188
                                             $set('salesDiscounts', $offeringRecord->salesDiscounts->pluck('id')->toArray());
154
                                         }
189
                                         }
155
                                     }),
190
                                     }),
166
                                     ->live()
201
                                     ->live()
167
                                     ->maxValue(9999999999.99)
202
                                     ->maxValue(9999999999.99)
168
                                     ->default(0),
203
                                     ->default(0),
169
-                                Forms\Components\Select::make('salesTaxes')
170
-                                    ->relationship('salesTaxes', 'name')
204
+                                CreateAdjustmentSelect::make('salesTaxes')
205
+                                    ->label('Taxes')
206
+                                    ->category(AdjustmentCategory::Tax)
207
+                                    ->type(AdjustmentType::Sales)
208
+                                    ->adjustmentsRelationship('salesTaxes')
171
                                     ->saveRelationshipsUsing(null)
209
                                     ->saveRelationshipsUsing(null)
172
                                     ->dehydrated(true)
210
                                     ->dehydrated(true)
173
                                     ->preload()
211
                                     ->preload()
174
                                     ->multiple()
212
                                     ->multiple()
175
                                     ->live()
213
                                     ->live()
176
                                     ->searchable(),
214
                                     ->searchable(),
177
-                                Forms\Components\Select::make('salesDiscounts')
178
-                                    ->relationship('salesDiscounts', 'name')
215
+                                CreateAdjustmentSelect::make('salesDiscounts')
216
+                                    ->label('Discounts')
217
+                                    ->category(AdjustmentCategory::Discount)
218
+                                    ->type(AdjustmentType::Sales)
219
+                                    ->adjustmentsRelationship('salesDiscounts')
179
                                     ->saveRelationshipsUsing(null)
220
                                     ->saveRelationshipsUsing(null)
180
                                     ->dehydrated(true)
221
                                     ->dehydrated(true)
181
-                                    ->preload()
182
                                     ->multiple()
222
                                     ->multiple()
183
                                     ->live()
223
                                     ->live()
184
                                     ->hidden(function (Forms\Get $get) {
224
                                     ->hidden(function (Forms\Get $get) {

Loading…
取消
儲存