ManagementSystem/BACKEND/app/Exports/LeaveManagementExport.php

134 lines
4.3 KiB
PHP

<?php
namespace App\Exports;
use Carbon\Carbon;
use Maatwebsite\Excel\Concerns\FromArray;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithStyles;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
class LeaveManagementExport implements FromArray, WithHeadings, WithStyles
{
protected $data;
protected $year;
public function __construct($data)
{
$this->data = $data;
$this->year = Carbon::now()->year;
}
public function headings(): array
{
$months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
return array_merge(
['No.', 'User'],
$months,
['Total', 'Off', 'Remaining', 'Notes']
);
}
public function array(): array
{
$headers = $this->headings(); // Lấy tiêu đề
$rows = [];
foreach ($this->data as $index => $user) {
$totalDayOff = 0;
$totalDayLeave = $user['leaveDay']['ld_day'] + $user['leaveDay']['ld_date_additional'];
// Tính tổng ngày nghỉ theo tháng
$monthlyLeaves = array_fill(1, 12, 0);
foreach ($user['monthlyLeaveDays'] as $leaveDay) {
$monthlyLeaves[$leaveDay['month']] += $leaveDay['leave_days'];
$totalDayOff += $leaveDay['leave_days'];
}
// Tạo dòng dữ liệu
$row = [
$index + 1,
$user['user']['name']
];
// Thêm dữ liệu các tháng
for ($month = 1; $month <= 12; $month++) {
$row[] = $monthlyLeaves[$month] ?: '';
}
// Thêm tổng số ngày
$row[] = $totalDayLeave;
$row[] = $totalDayOff;
$row[] = $totalDayLeave - $totalDayOff;
$row[] = $user['leaveDay']['ld_note'] ?? '';
$rows[] = $row;
}
return array_merge([$headers], $rows); // Thêm tiêu đề vào đầu mảng
}
public function styles(Worksheet $sheet)
{
$lastRow = count($this->data) + 2;
$lastColumn = 'R';
// Thêm và style title
$sheet->mergeCells("A1:{$lastColumn}1");
$sheet->setCellValue('A1', "DANH SÁCH NGÀY NGHỈ NĂM {$this->year}");
$sheet->getStyle("A1:{$lastColumn}1")->applyFromArray([
'font' => [
'bold' => true,
'size' => 14
],
'alignment' => [
'horizontal' => Alignment::HORIZONTAL_CENTER,
'vertical' => Alignment::VERTICAL_CENTER
]
]);
// Style cho header (dời xuống row 2)
$sheet->getStyle("A2:{$lastColumn}2")->applyFromArray([
'font' => ['bold' => true],
'alignment' => [
'horizontal' => Alignment::HORIZONTAL_CENTER,
'vertical' => Alignment::VERTICAL_CENTER
]
]);
// Style cho toàn bộ bảng (bắt đầu từ row 1)
$sheet->getStyle("A1:{$lastColumn}{$lastRow}")->applyFromArray([
'borders' => [
'allBorders' => [
'borderStyle' => Border::BORDER_THIN
]
],
'alignment' => [
'vertical' => Alignment::VERTICAL_CENTER
]
]);
// Căn giữa cho các cột số liệu (điều chỉnh range bắt đầu từ row 3)
for ($col = 'C'; $col <= 'P'; $col++) {
$sheet->getStyle("{$col}3:{$col}{$lastRow}")
->getAlignment()
->setHorizontal(Alignment::HORIZONTAL_CENTER);
}
// Set độ rộng cột
$sheet->getColumnDimension('A')->setWidth(5); // No.
$sheet->getColumnDimension('B')->setWidth(30); // User
// Các tháng
for ($i = 'C'; $i <= 'N'; $i++) {
$sheet->getColumnDimension($i)->setWidth(8);
}
$sheet->getColumnDimension('O')->setWidth(8); // Total
$sheet->getColumnDimension('P')->setWidth(8); // Off
$sheet->getColumnDimension('Q')->setWidth(12); // Remaining
$sheet->getColumnDimension('R')->setWidth(30); // Notes
return $sheet;
}
}