|  | @@ -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) {
 |