|
|
@@ -3,6 +3,9 @@
|
|
3
|
3
|
namespace App\Filament\Company\Resources\Sales;
|
|
4
|
4
|
|
|
5
|
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
|
9
|
use App\Enums\Accounting\DocumentDiscountMethod;
|
|
7
|
10
|
use App\Enums\Accounting\DocumentType;
|
|
8
|
11
|
use App\Enums\Accounting\InvoiceStatus;
|
|
|
@@ -11,6 +14,7 @@ use App\Filament\Company\Resources\Sales\ClientResource\RelationManagers\Invoice
|
|
11
|
14
|
use App\Filament\Company\Resources\Sales\InvoiceResource\Pages;
|
|
12
|
15
|
use App\Filament\Company\Resources\Sales\InvoiceResource\RelationManagers;
|
|
13
|
16
|
use App\Filament\Company\Resources\Sales\InvoiceResource\Widgets;
|
|
|
17
|
+use App\Filament\Forms\Components\CreateAdjustmentSelect;
|
|
14
|
18
|
use App\Filament\Forms\Components\CreateCurrencySelect;
|
|
15
|
19
|
use App\Filament\Forms\Components\DocumentFooterSection;
|
|
16
|
20
|
use App\Filament\Forms\Components\DocumentHeaderSection;
|
|
|
@@ -19,6 +23,7 @@ use App\Filament\Tables\Actions\ReplicateBulkAction;
|
|
19
|
23
|
use App\Filament\Tables\Columns;
|
|
20
|
24
|
use App\Filament\Tables\Filters\DateRangeFilter;
|
|
21
|
25
|
use App\Models\Accounting\Adjustment;
|
|
|
26
|
+use App\Models\Accounting\DocumentLineItem;
|
|
22
|
27
|
use App\Models\Accounting\Invoice;
|
|
23
|
28
|
use App\Models\Banking\BankAccount;
|
|
24
|
29
|
use App\Models\Common\Client;
|
|
|
@@ -137,17 +142,17 @@ class InvoiceResource extends Resource
|
|
137
|
142
|
Header::make($settings->resolveColumnLabel('item_name', 'Items'))
|
|
138
|
143
|
->width($hasDiscounts ? '15%' : '20%'),
|
|
139
|
144
|
Header::make('Description')
|
|
140
|
|
- ->width($hasDiscounts ? '25%' : '30%'),
|
|
|
145
|
+ ->width($hasDiscounts ? '15%' : '20%'),
|
|
141
|
146
|
Header::make($settings->resolveColumnLabel('unit_name', 'Quantity'))
|
|
142
|
147
|
->width('10%'),
|
|
143
|
148
|
Header::make($settings->resolveColumnLabel('price_name', 'Price'))
|
|
144
|
149
|
->width('10%'),
|
|
145
|
150
|
Header::make('Taxes')
|
|
146
|
|
- ->width($hasDiscounts ? '15%' : '20%'),
|
|
|
151
|
+ ->width($hasDiscounts ? '20%' : '30%'),
|
|
147
|
152
|
];
|
|
148
|
153
|
|
|
149
|
154
|
if ($hasDiscounts) {
|
|
150
|
|
- $headers[] = Header::make('Discounts')->width('15%');
|
|
|
155
|
+ $headers[] = Header::make('Discounts')->width('20%');
|
|
151
|
156
|
}
|
|
152
|
157
|
|
|
153
|
158
|
$headers[] = Header::make($settings->resolveColumnLabel('amount_name', 'Amount'))
|
|
|
@@ -163,9 +168,40 @@ class InvoiceResource extends Resource
|
|
163
|
168
|
->searchable()
|
|
164
|
169
|
->required()
|
|
165
|
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
|
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
|
206
|
if (! $offeringRecord) {
|
|
171
|
207
|
return;
|
|
|
@@ -177,8 +213,7 @@ class InvoiceResource extends Resource
|
|
177
|
213
|
$set('unit_price', $unitPrice);
|
|
178
|
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
|
217
|
$set('salesDiscounts', $offeringRecord->salesDiscounts->pluck('id')->toArray());
|
|
183
|
218
|
}
|
|
184
|
219
|
}),
|
|
|
@@ -195,19 +230,24 @@ class InvoiceResource extends Resource
|
|
195
|
230
|
->live()
|
|
196
|
231
|
->maxValue(9999999999.99)
|
|
197
|
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
|
238
|
->saveRelationshipsUsing(null)
|
|
201
|
239
|
->dehydrated(true)
|
|
202
|
240
|
->preload()
|
|
203
|
241
|
->multiple()
|
|
204
|
242
|
->live()
|
|
205
|
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
|
249
|
->saveRelationshipsUsing(null)
|
|
209
|
250
|
->dehydrated(true)
|
|
210
|
|
- ->preload()
|
|
211
|
251
|
->multiple()
|
|
212
|
252
|
->live()
|
|
213
|
253
|
->hidden(function (Forms\Get $get) {
|