File: /www/wwwroot/erp.nhatnamsst.com/domains/PurchaseOrder/Exports/PurchaseOrderExport.php
<?php
namespace Domains\PurchaseOrder\Exports;
use Domains\Core\Enums\AdminRole;
use Domains\Core\Enums\PurchaseOrderStatus;
use Domains\PurchaseOrder\Models\PurchaseOrder;
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 PurchaseOrderExport 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 = PurchaseOrder::with(['sale', 'customer', 'quoteRequest', 'details']);
$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('quoteRequest', function($q) use ($currentAdmin) {
$q->where(function($subQ) use ($currentAdmin) {
$subQ->where(function($selectedQ) use ($currentAdmin) {
$selectedQ->whereNotNull('selected_inter_id')
->where('selected_inter_id', $currentAdmin->id);
})
->orWhere(function($listQ) use ($currentAdmin) {
$listQ->whereNull('selected_inter_id')
->whereHas('inters', function($interQ) use ($currentAdmin) {
$interQ->where('admin_id', $currentAdmin->id);
});
});
});
});
} elseif ($currentAdmin->role === AdminRole::LEADER_INTER) {
$teamMemberIds = $currentAdmin->getTeamMemberIds();
$query->whereHas('quoteRequest', function($q) use ($teamMemberIds) {
$q->where(function($subQ) use ($teamMemberIds) {
$subQ->where(function($selectedQ) use ($teamMemberIds) {
$selectedQ->whereNotNull('selected_inter_id')
->whereIn('selected_inter_id', $teamMemberIds);
})
->orWhere(function($listQ) use ($teamMemberIds) {
$listQ->whereNull('selected_inter_id')
->whereHas('inters', function($interQ) use ($teamMemberIds) {
$interQ->whereIn('admin_id', $teamMemberIds);
});
});
});
});
}
}
return $query->get();
}
public function headings(): array
{
return [
'Số PO',
'Nhân viên sale',
'Khách hàng',
'Báo giá',
'Ngày PO',
'Ngày đặt hàng',
'Tổng giá PO',
'Trạng thái chung',
];
}
public function map($purchaseOrder): array
{
$saleName = $purchaseOrder->sale
? ($purchaseOrder->sale->code ?? '') . ($purchaseOrder->sale->code ? ' - ' : '') . $purchaseOrder->sale->fullname
: '-';
$customerName = $purchaseOrder->customer ? $purchaseOrder->customer->name : '-';
$quoteRequestCode = $purchaseOrder->quoteRequest ? $purchaseOrder->quoteRequest->code : '-';
$poDate = $purchaseOrder->po_date
? $purchaseOrder->po_date->format('d/m/Y')
: '-';
$orderDate = $purchaseOrder->order_date
? $purchaseOrder->order_date->format('d/m/Y')
: '-';
$totalPoPrice = number_format($purchaseOrder->details->sum('total_po_unit_price'), 0, ',', '.');
$status = $purchaseOrder->status instanceof PurchaseOrderStatus
? $purchaseOrder->status
: PurchaseOrderStatus::from($purchaseOrder->status ?? 1);
$statusText = $status->description();
return [
$purchaseOrder->po_number,
$saleName,
$customerName,
$quoteRequestCode,
$poDate,
$orderDate,
$totalPoPrice,
$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' => 20, // Số PO
'B' => 30, // Nhân viên sale
'C' => 30, // Khách hàng
'D' => 20, // Báo giá
'E' => 15, // Ngày PO
'F' => 15, // Ngày đặt hàng
'G' => 20, // Tổng giá PO
'H' => 25, // Trạng thái chung
];
}
}