ExportOrdersService.php 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. <?php
  2. namespace App\Services;
  3. use App\Helpers\DateHelper;
  4. use App\Models\ProductSKU;
  5. use App\Models\Product;
  6. use Illuminate\Support\Collection;
  7. use Illuminate\Support\Facades\Log;
  8. use Illuminate\Support\Facades\Storage;
  9. use Illuminate\Support\Str;
  10. use PhpOffice\PhpSpreadsheet\IOFactory;
  11. use PhpOffice\PhpSpreadsheet\Style\Alignment;
  12. use PhpOffice\PhpSpreadsheet\Style\Border;
  13. use PhpOffice\PhpSpreadsheet\Style\Color;
  14. use PhpOffice\PhpSpreadsheet\Style\Fill;
  15. use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;
  16. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  17. class ExportOrdersService
  18. {
  19. /**
  20. * @throws \Exception
  21. */
  22. public function handle(Collection $orders, int $userId): string
  23. {
  24. $orderIds = $orders->pluck('id')->filter()->values();
  25. $orderYears = $orders->pluck('year')->filter()->unique()->values();
  26. $productsSkuByOrder = collect();
  27. if ($orderIds->isNotEmpty() && $orderYears->isNotEmpty()) {
  28. $productsSkuByOrder = ProductSKU::query()
  29. ->withoutGlobalScopes()
  30. ->whereIn('order_id', $orderIds)
  31. ->whereIn('year', $orderYears)
  32. ->get()
  33. ->groupBy('order_id');
  34. }
  35. $inputFileType = 'Xlsx'; // Xlsx - Xml - Ods - Slk - Gnumeric - Csv
  36. $inputFileName = './templates/Orders.xlsx';
  37. $reader = IOFactory::createReader($inputFileType);
  38. $spreadsheet = $reader->load($inputFileName);
  39. $sheet = $spreadsheet->getActiveSheet();
  40. $sheet->getPageSetup()->setOrientation(PageSetup::ORIENTATION_LANDSCAPE);
  41. $i = 3;
  42. $first = true;
  43. $from = '-';
  44. $prevInstDate = '';
  45. $j = 1;
  46. foreach ($orders as $order) {
  47. $orderProductsSku = ($productsSkuByOrder->get($order->id) ?? collect())
  48. ->where('year', (int) $order->year)
  49. ->values();
  50. $order->setRelation('products_sku', $orderProductsSku);
  51. $instDate = ($order->installation_date) ? DateHelper::getHumanDate($order->installation_date, true) : '';
  52. $readyDate = ($order->ready_date) ? DateHelper::getHumanDate($order->ready_date, true) : '';
  53. $mafs = Str::replace('<div>', '', $order->productsWithCount);
  54. $mafs = Str::replace('</div>', "\n", $mafs);
  55. $sheet->setCellValue('A' . $i, $order->id);
  56. $sheet->setCellValue('B' . $i, $order->name);
  57. $sheet->setCellValue('C' . $i, $order?->user?->name);
  58. $sheet->setCellValue('D' . $i, $order->district->shortname);
  59. $sheet->setCellValue('E' . $i, $order->area->name);
  60. $sheet->setCellValue('F' . $i, $order->object_address);
  61. $sheet->setCellValue('G' . $i, $order->objectType->name);
  62. $sheet->setCellValue('H' . $i, $order->comment);
  63. $sheet->setCellValue('I' . $i, $instDate);
  64. $sheet->setCellValue('J' . $i, $readyDate);
  65. $sheet->setCellValue('K' . $i, $order->brigadier?->name);
  66. $sheet->setCellValue('L' . $i, $order->orderStatus->name);
  67. $sheet->setCellValue('M' . $i, $order->tg_group_name);
  68. $sheet->setCellValue('N' . $i, $order->tg_group_link);
  69. $sheet->setCellValue('O' . $i, $mafs);
  70. $sheet->setCellValue('P' . $i, $order->ready_to_mount);
  71. $i++;
  72. }
  73. $sheet->getStyle('A1:P' . $i - 1)->getBorders()->getAllBorders()->setBorderStyle(Border::BORDER_THIN)->setColor(new Color('777777'));
  74. $sheet->getStyle('A1:P' . $i - 1)->getAlignment()->setWrapText(true);
  75. $sheet->getStyle('A1:P' . $i - 1)->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER);
  76. $fileName = fileName('Площадки ' . date('Y-m-d H-i-s') . '.xlsx');
  77. $writer = new Xlsx($spreadsheet);
  78. $fd = 'export/orders/tmp';
  79. Storage::disk('public')->makeDirectory($fd);
  80. $fp = storage_path('app/public/export/orders/') . '/tmp/' . $fileName;
  81. Storage::disk('public')->delete($fd . '/' . $fileName);
  82. $writer->save($fp);
  83. PdfConverterClient::convert($fp);
  84. // create zip archive
  85. $fileModel = (new FileService())->createZipArchive($fd, Str::replace('.xlsx', '.zip', $fileName), $userId);
  86. // remove temp files
  87. Storage::disk('public')->deleteDirectory($fd);
  88. // return link
  89. return $fileModel?->link ?? '';
  90. }
  91. }