ifnex/04_Laravel/app/Imports/ShippingRatesImport.php

78 lines
2.7 KiB
PHP

<?php
namespace App\Imports;
use App\Models\ShippingRate;
use Maatwebsite\Excel\Concerns\OnEachRow;
use Maatwebsite\Excel\Concerns\WithMultipleSheets;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
use Maatwebsite\Excel\Row;
class ShippingRatesImport implements WithMultipleSheets
{
// این متد می‌گه که فایل اکسل چند شیت دارد و هر کدام را با کلاس جداگانه می‌خواند
public function sheets(): array
{
return [
'Import Rate' => 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
);
}
}