new RateSheetImport('import'), 'Export Rate' => new RateSheetImport('export'), 'DocNor' => new SimpleRateSheetImport(ShipmentType::DocNormal), 'DocEco' => new SimpleRateSheetImport(ShipmentType::DocEconomy), 'Parcel' => new SimpleRateSheetImport(ShipmentType::Parcel), ]; } } 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 <= 7 ? ShipmentType::DocNormal : ShipmentType::Parcel; } } class SimpleRateSheetImport implements OnEachRow, WithStartRow { public function __construct(protected ShipmentType $type) {} 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]; $value = str_replace([',', ' '], '', (string) ($cells[2] ?? 0)); $value = is_numeric($value) ? (float) $value : 0; $zoneColumn = 'zone_' . $zoneNumber; $data = [ 'direction' => 'export', 'type' => $this->type->value, 'weight' => $weight, ]; for ($i = 1; $i <= 10; $i++) { $data['zone_' . $i] = 0; } $record = ShippingRate::updateOrCreate($data, $data); $record->{$zoneColumn} = $value; $record->save(); } }