File: /www/wwwroot/erp.nhatnamsst.com/domains/QuoteRequest/Exports/QuoteRequestExport.php
<?php
namespace Domains\QuoteRequest\Exports;
use Domains\Core\Enums\AdminRole;
use Domains\Core\Enums\QuoteRequestStatus;
use Domains\QuoteRequest\Models\QuoteRequest;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithMapping;
use Maatwebsite\Excel\Concerns\WithStyles;
use Maatwebsite\Excel\Concerns\WithColumnWidths;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
use PhpOffice\PhpSpreadsheet\Style\Fill;
class QuoteRequestExport implements FromCollection, WithHeadings, WithMapping, WithStyles, WithColumnWidths
{
protected $query;
public function __construct($query = null)
{
$this->query = $query;
}
public function collection()
{
if ($this->query) {
return $this->query->get();
}
$query = QuoteRequest::with(['sale', 'brand', 'customer', 'inters']);
$currentAdmin = get_auth_admin();
if ($currentAdmin && !$currentAdmin->checkIsSuperAdmin()) {
if ($currentAdmin->role === AdminRole::SALE) {
$query->where('sale_id', $currentAdmin->id);
} elseif ($currentAdmin->role === AdminRole::LEADER_SALE) {
$teamMemberIds = $currentAdmin->getTeamMemberIds();
$query->whereIn('sale_id', $teamMemberIds);
} elseif ($currentAdmin->role === AdminRole::INTER) {
$query->whereHas('inters', function($q) use ($currentAdmin) {
$q->where('admin_id', $currentAdmin->id);
});
} elseif ($currentAdmin->role === AdminRole::LEADER_INTER) {
$teamMemberIds = $currentAdmin->getTeamMemberIds();
$query->whereHas('inters', function($q) use ($teamMemberIds) {
$q->whereIn('admin_id', $teamMemberIds);
});
}
}
return $query->get();
}
public function headings(): array
{
return [
'Mã yêu cầu báo giá',
'Nhân viên Sales',
'Hãng',
'Tên khách hàng',
'Loại KH',
'Ngày yêu cầu',
'Inter lấy giá',
'Nhân viên quản lý',
'Trạng thái',
];
}
public function map($quoteRequest): array
{
$saleName = $quoteRequest->sale
? ($quoteRequest->sale->code ?? '') . ($quoteRequest->sale->code ? ' - ' : '') . $quoteRequest->sale->fullname
: '-';
$brandName = $quoteRequest->brand ? $quoteRequest->brand->name : '-';
$customerName = $quoteRequest->customer ? $quoteRequest->customer->name : '-';
$customerType = $quoteRequest->customer_type
? $quoteRequest->customer_type->label()
: ($quoteRequest->customer && $quoteRequest->customer->type ? $quoteRequest->customer->type->label() : '-');
$requestDate = $quoteRequest->request_date
? $quoteRequest->request_date->format('d/m/Y')
: '-';
$inters = $quoteRequest->inters->map(function($admin) {
if (!$admin->code) {
return '';
}
$roleName = $admin->role ? $admin->role->description() : '';
return $admin->code . ($roleName ? '_' . $roleName : '');
})->filter()->join('; ');
$manager = '-';
if ($quoteRequest->sale && $quoteRequest->sale->code) {
$roleName = $quoteRequest->sale->role ? $quoteRequest->sale->role->description() : '';
$manager = $quoteRequest->sale->code . ($roleName ? '_' . $roleName : '');
}
$status = $quoteRequest->status instanceof QuoteRequestStatus
? $quoteRequest->status
: QuoteRequestStatus::from($quoteRequest->status ?? 1);
$statusText = $status->description();
return [
$quoteRequest->code,
$saleName,
$brandName,
$customerName,
$customerType,
$requestDate,
$inters ?: '-',
$manager,
$statusText,
];
}
public function styles(Worksheet $sheet)
{
return [
1 => [
'font' => ['bold' => true, 'size' => 12],
'fill' => [
'fillType' => Fill::FILL_SOLID,
'startColor' => ['rgb' => 'E2E8F0']
],
'alignment' => [
'horizontal' => Alignment::HORIZONTAL_CENTER,
'vertical' => Alignment::VERTICAL_CENTER,
],
],
];
}
public function columnWidths(): array
{
return [
'A' => 25, // Mã yêu cầu
'B' => 30, // Nhân viên Sales
'C' => 20, // Hãng
'D' => 30, // Tên khách hàng
'E' => 15, // Loại KH
'F' => 15, // Ngày yêu cầu
'G' => 30, // Inter lấy giá
'H' => 30, // Nhân viên quản lý
'I' => 20, // Trạng thái
];
}
}