ExportScheduleService.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. <?php
  2. namespace App\Services;
  3. use App\Helpers\DateHelper;
  4. use App\Models\Product;
  5. use Illuminate\Support\Collection;
  6. use Illuminate\Support\Facades\Log;
  7. use Illuminate\Support\Facades\Storage;
  8. use Illuminate\Support\Str;
  9. use PhpOffice\PhpSpreadsheet\IOFactory;
  10. use PhpOffice\PhpSpreadsheet\Style\Alignment;
  11. use PhpOffice\PhpSpreadsheet\Style\Border;
  12. use PhpOffice\PhpSpreadsheet\Style\Color;
  13. use PhpOffice\PhpSpreadsheet\Style\Fill;
  14. use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;
  15. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  16. class ExportScheduleService
  17. {
  18. /**
  19. * @throws \Exception
  20. */
  21. public function handle(Collection $schedules, int $userId): string
  22. {
  23. $inputFileType = 'Xlsx'; // Xlsx - Xml - Ods - Slk - Gnumeric - Csv
  24. $inputFileName = './templates/Schedule.xlsx';
  25. $reader = IOFactory::createReader($inputFileType);
  26. $spreadsheet = $reader->load($inputFileName);
  27. $sheet = $spreadsheet->getActiveSheet();
  28. $sheet->getPageSetup()->setOrientation(PageSetup::ORIENTATION_LANDSCAPE);
  29. $i = 3;
  30. $first = true;
  31. $from = '-';
  32. $prevInstDate = '';
  33. $j = 1;
  34. foreach ($schedules as $schedule) {
  35. if($first) {
  36. $first = false;
  37. $from = $schedule->installation_date;
  38. $prevInstDate = $schedule->installation_date;
  39. } elseif($prevInstDate === $schedule->installation_date) {
  40. $j++;
  41. } else {
  42. if($j > 1) {
  43. $sheet->mergeCells('A' . $i - $j . ':A' . $i - 1);
  44. $sheet->mergeCells('B' . $i - $j . ':B' . $i - 1);
  45. }
  46. $j = 1;
  47. $prevInstDate = $schedule->installation_date;
  48. }
  49. $sheet->setCellValue('A' . $i, DateHelper::getHumanDayOfWeek($schedule->installation_date));
  50. $sheet->setCellValue('B' . $i, DateHelper::getHumanDate($schedule->installation_date, true));
  51. $sheet->setCellValue('C' . $i, $schedule->address_code);
  52. $sheet->setCellValue('D' . $i, $schedule->district->shortname);
  53. $sheet->setCellValue('E' . $i, $schedule->area->name);
  54. $sheet->setCellValue('F' . $i, $schedule->object_address);
  55. $sheet->setCellValue('G' . $i, $schedule->object_type);
  56. $sheet->setCellValue('H' . $i, Str::trim($schedule->mafs));
  57. $sheet->setCellValue('I' . $i, $schedule->mafs_count);
  58. $sheet->setCellValue('J' . $i, $schedule->brigadier->name);
  59. $sheet->setCellValue('K' . $i, $schedule->comment);
  60. $sheet->getStyle('C' . $i . ':K' . $i)->getFill()->setFillType(Fill::FILL_SOLID)->getStartColor()->setRGB(Str::replace('#', '', $schedule->brigadier->color));
  61. $i++;
  62. }
  63. // merge last cells if $j > 1
  64. if($j > 1) {
  65. $sheet->mergeCells('A' . $i - $j . ':A' . $i - 1);
  66. $sheet->mergeCells('B' . $i - $j . ':B' . $i - 1);
  67. }
  68. $sheet->getStyle('A2:B' . $i -1)->getAlignment()->setTextRotation(90);
  69. $sheet->getStyle('A2:K' . $i - 1)->getBorders()->getAllBorders()->setBorderStyle(Border::BORDER_THIN)->setColor(new Color('777777'));
  70. $sheet->getStyle('A2:K' . $i - 1)->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER);
  71. $sheet->getStyle('C2:K' . $i - 1)->getAlignment()->setWrapText(true);
  72. $fromText = (DateHelper::isDate($from)) ? DateHelper::getHumanDate($from) : '-';
  73. $toText = (isset($schedule) && $schedule->installation_date) ? DateHelper::getHumanDate($schedule->installation_date) : '-';
  74. $header = 'График монтажей с ' . $fromText . ' по ' . $toText;
  75. $sheet->setCellValue('A1', $header);
  76. $sheet->getStyle('A1')->getFont()->setBold(true);
  77. $fileName = $header . '.xlsx';
  78. $writer = new Xlsx($spreadsheet);
  79. $fd = 'export/schedule/tmp';
  80. Storage::disk('public')->makeDirectory($fd);
  81. $fp = storage_path('app/public/export/schedule/') . '/tmp/' . $fileName;
  82. Storage::disk('public')->delete($fd . '/' . $fileName);
  83. $writer->save($fp);
  84. PdfConverterClient::convert($fp);
  85. // create zip archive
  86. $fileModel = (new FileService())->createZipArchive($fd, Str::replace('.xlsx', '.zip', $fileName), $userId);
  87. // remove temp files
  88. Storage::disk('public')->deleteDirectory($fd);
  89. // return link
  90. return $fileModel?->link ?? '';
  91. }
  92. }