Kimi chinh sua

This commit is contained in:
2026-04-24 08:58:53 +00:00
parent 91ff4a5e4d
commit 86216ef872
43 changed files with 2868 additions and 597 deletions

View File

@@ -0,0 +1,116 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\Models\Customer;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Shared\Date as ExcelDate;
use Carbon\Carbon;
class ImportCustomersExcel extends Command
{
protected $signature = 'import:customers-excel {file=khachhang.xlsx}';
protected $description = 'Import khách hàng từ file Excel và tạo dữ liệu mẫu Công ty';
public function handle()
{
$filePath = $this->argument('file');
if (!file_exists($filePath)) {
$this->error("Không tìm thấy file: {$filePath}");
return 1;
}
$this->info("Đang đọc file Excel...");
$spreadsheet = IOFactory::load($filePath);
$worksheet = $spreadsheet->getActiveSheet();
$rows = $worksheet->toArray();
$count = 0;
foreach ($rows as $index => $row) {
if ($index === 0 || empty($row[1])) continue; // Bỏ qua header hoặc CMND trống
// 1. Xử lý số điện thoại (Tách nếu có nhiều số)
$phoneRaw = $row[5] ?? '';
$phones = preg_split('/[,\/ \n]+/', $phoneRaw, -1, PREG_SPLIT_NO_EMPTY);
$mainPhone = $phones[0] ?? null;
$secondaryPhones = array_slice($phones, 1);
// 2. Xử lý ngày tháng (Excel thường lưu ngày là số serial)
$dob = $this->parseExcelDate($row[4]);
$issueDate = $this->parseExcelDate($row[7]);
Customer::updateOrCreate(
['cmnd_cccd' => (string)$row[1]],
[
'title' => $row[2],
'full_name' => $row[3],
'dob' => $dob,
'phone' => $mainPhone,
'secondary_phones' => $secondaryPhones,
'email' => $row[6],
'id_issue_date' => $issueDate,
'id_issue_place' => $row[8],
'permanent_address' => $row[9],
'contact_address' => $row[10],
'type' => 'INDIVIDUAL',
]
);
$count++;
if ($count % 10 === 0) $this->line("Đã import: {$count} khách hàng...");
}
$this->info("--- TẠO DỮ LIỆU MẪU CÔNG TY ---");
$this->createSampleCompany();
$this->info("Thành công! Đã import {$count} khách hàng và tạo 1 cặp Công ty + Người đại diện mẫu.");
return 0;
}
private function parseExcelDate($value)
{
if (empty($value)) return null;
try {
if (is_numeric($value)) {
return Carbon::instance(ExcelDate::excelToDateTimeObject($value))->format('Y-m-d');
}
return Carbon::parse(str_replace('/', '-', $value))->format('Y-m-d');
} catch (\Exception $e) {
return null;
}
}
private function createSampleCompany()
{
// 1. Tạo người đại diện (Cá nhân)
$rep = Customer::updateOrCreate(
['cmnd_cccd' => '079083000123'],
[
'title' => 'Ông',
'full_name' => 'NGUYỄN VĂN ĐẠI DIỆN',
'phone' => '0909123456',
'permanent_address' => '123 Đường ABC, Phường 1, Quận 1, TP.HCM',
'contact_address' => '123 Đường ABC, Phường 1, Quận 1, TP.HCM',
'type' => 'INDIVIDUAL',
]
);
// 2. Tạo công ty liên kết với người đại diện trên
Customer::updateOrCreate(
['tax_code' => '0102030405'],
[
'type' => 'COMPANY',
'full_name' => 'CÔNG TY TNHH BẤT ĐỘNG SẢN THỊNH VƯỢNG',
'cmnd_cccd' => '0102030405', // GPKD
'representative_id' => $rep->id,
'permanent_address' => '456 Đường XYZ, Phường 2, Quận Tân Bình, TP.HCM', // Trụ sở chính
'contact_address' => '456 Đường XYZ, Phường 2, Quận Tân Bình, TP.HCM',
'phone' => '02838111222',
]
);
$this->info("Đã tạo: Công ty Thịnh Vượng (Đại diện bởi: {$rep->full_name})");
}
}