new RateSheetImport('import'), 'Export Rate' => new RateSheetImport('export'), ]; } } class RateSheetImport implements OnEachRow { private $direction; public function __construct($direction) { $this->direction = $direction; } public function onRow(Row $row) { $rowIndex = $row->getIndex(); $cells = $row->toArray(); // ردیف اول و دوم معمولاً هدرهای نامرتب هستند، رد می‌کنیم if ($rowIndex < 2) { return; } // اگر سطر حاوی کلمه DOCUMENT یا NON - DOCUMENT بود، رد می‌کنیم (فقط برای تفکیک نوع استفاده می‌شوند) if (isset($cells[3]) && (strtoupper($cells[3]) === 'DOCUMENT' || strtoupper($cells[3]) === 'NON - DOCUMENT')) { return; } // اگر وزن خالی بود، ردیف را رد کن if (empty($cells[0]) || !is_numeric($cells[0])) { return; } // تعیین نوع بسته (DOCUMENT یا NON DOC) بر اساس شماره ردیف در فایل اکسل // در فایل شما، ردیف‌های 2 تا 7 مدارک و ردیف‌های 9 به بعد غیر مدارک بودند $type = ($rowIndex >= 2 && $rowIndex <= 7) ? 'DOCUMENT' : 'NON DOC'; // اگر در بخش غیر مدارک هستیم و به هدرها رسیدیم، رد می‌کنیم if ($type === 'NON DOC' && isset($cells[0]) && strtoupper(trim($cells[0])) === 'WEIGHT (KG)') { return; } // پاکسازی قیمت‌ها (حذف کاماها و تبدیل به عدد) $zones = []; for ($i = 1; $i <= 10; $i++) { $val = str_replace(',', '', $cells[$i] ?? 0); $zones["zone_{$i}"] = is_numeric($val) ? floatval($val) : 0; } // درج یا آپدیت رکورد در دیتابیس ShippingRate::updateOrCreate( [ 'direction' => $this->direction, 'type' => $type, 'weight' => floatval($cells[0]), ], $zones ); } }