78 lines
2.7 KiB
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
|
|
);
|
|
}
|
|
} |