new RateSheetImport('export'), 'Import Rate' => new RateSheetImport('import'), 'DocEco' => new SimpleRateSheetImport(ShipmentType::DocEconomy, 'export'), ]; } } class RateSheetImport implements OnEachRow, WithStartRow { public function __construct(protected string $direction) {} public function startRow(): int { return 5; } public function onRow(Row $row) { $rowIndex = $row->getIndex(); $cells = $row->toArray(); if (empty($cells[0]) || !is_numeric($cells[0])) { return; } $type = $this->resolveType($rowIndex, $cells); $zones = []; for ($i = 1; $i <= 10; $i++) { $val = str_replace([',', ' '], '', (string) ($cells[$i] ?? 0)); $zones['zone_' . $i] = is_numeric($val) ? (float) $val : 0; } ShippingRate::updateOrCreate( [ 'direction' => $this->direction, 'type' => $type->value, 'weight' => (float) $cells[0], ], $zones ); } private function resolveType(int $rowIndex, array $cells): ShipmentType { $header = strtoupper((string) ($cells[3] ?? '')); if (str_contains($header, 'DOCUMENT') || str_contains($header, 'DOC')) { return ShipmentType::DocNormal; } if (str_contains($header, 'NON') || str_contains($header, 'PARCEL')) { return ShipmentType::Parcel; } return $rowIndex < 10 ? ShipmentType::DocNormal : ShipmentType::Parcel; } } class SimpleRateSheetImport implements OnEachRow, WithStartRow { public function __construct( protected ShipmentType $type, protected string $direction = 'export' ) {} public function startRow(): int { return 2; } public function onRow(Row $row) { $cells = $row->toArray(); if (empty($cells[0]) || !is_numeric($cells[0])) { return; } $weight = (float) $cells[0]; $zoneNumber = (int) $cells[1]; $rawValue = str_replace([',', ' '], '', (string) ($cells[2] ?? 0)); $rawValue = is_numeric($rawValue) ? (float) $rawValue : 0; if ($zoneNumber < 1 || $zoneNumber > 10 || $rawValue <= 0) { return; } $aedToIrr = (float) SystemSetting::get('aed_to_irr', 455000); $value = $aedToIrr > 0 ? $rawValue / $aedToIrr : $rawValue; $zoneColumn = 'zone_' . $zoneNumber; $defaults = []; for ($i = 1; $i <= 10; $i++) { $defaults['zone_' . $i] = 0; } $record = ShippingRate::firstOrCreate( [ 'direction' => $this->direction, 'type' => $this->type->value, 'weight' => $weight, ], $defaults ); $record->{$zoneColumn} = $value; $record->save(); } }