GenerateDocumentsService.php 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. <?php
  2. namespace App\Services;
  3. use App\Models\Order;
  4. use Exception;
  5. use Illuminate\Support\Facades\Storage;
  6. use Illuminate\Support\Str;
  7. use PhpOffice\PhpSpreadsheet\IOFactory;
  8. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  9. class GenerateDocumentsService
  10. {
  11. const INSTALL_FILENAME = 'Монтаж ';
  12. const HANDOVER_FILENAME = 'Сдача ';
  13. /**
  14. * @param Order $order
  15. * @param int $userId
  16. * @return string
  17. * @throws Exception
  18. */
  19. public function generateInstallationPack(Order $order, int $userId): string
  20. {
  21. $techDocsPath = base_path('/tech-docs/');
  22. $products_sku = $order->products_sku;
  23. $articles = [];
  24. Storage::disk('public')->makeDirectory('orders/' . $order->id . '/tmp/Схемы сборки/');
  25. foreach ($products_sku as $sku) {
  26. if(!in_array($sku->product->article, $articles)) {
  27. $articles[] = $sku->product->article;
  28. // find and copy scheme files to installation directory
  29. if(file_exists($techDocsPath . $sku->product->article . '/')) {
  30. foreach(Storage::disk('base')->allFiles('tech-docs/' . $sku->product->article) as $p) {
  31. $content = Storage::disk('base')->get($p);
  32. Storage::disk('public')->put('orders/' . $order->id . '/tmp/Схемы сборки/' . basename($p), $content);
  33. }
  34. }
  35. }
  36. }
  37. // generate xlsx order file
  38. $this->generateOrderForMount($order);
  39. // create zip archive
  40. $fileModel = (new FileService())->createZipArchive('orders/' . $order->id . '/tmp', self::INSTALL_FILENAME . $order->common_name . '.zip', $userId);
  41. // remove temp files
  42. Storage::disk('public')->deleteDirectory('orders/' . $order->id . '/tmp');
  43. $order->documents()->syncWithoutDetaching($fileModel);
  44. // return link
  45. return $fileModel?->link ?? '';
  46. }
  47. private function generateOrderForMount(Order $order): void
  48. {
  49. $inputFileType = 'Xlsx'; // Xlsx - Xml - Ods - Slk - Gnumeric - Csv
  50. $inputFileName = './templates/OrderForMount.xlsx';
  51. $reader = IOFactory::createReader($inputFileType);
  52. $spreadsheet = $reader->load($inputFileName);
  53. $sheet = $spreadsheet->getActiveSheet();
  54. // менеджер
  55. $sheet->setCellValue('F8', $order->user->name);
  56. $sheet->setCellValue('X8', $order->user->phone);
  57. // округ и район
  58. $sheet->setCellValue('L10', $order->district->shortname);
  59. $sheet->setCellValue('W10', $order->area->name);
  60. if($order->area->responsible) {
  61. // ответственный
  62. $sheet->setCellValue('C12', $order->area->responsible?->name
  63. . ', ' . $order->area->responsible?->phone . ', ' . $order->area->responsible?->post);
  64. } else {
  65. $sheet->setCellValue('C12', '');
  66. }
  67. // адрес
  68. $sheet->setCellValue('L14', $order->object_address);
  69. $str = Str::replace('<div>', '', $order->products_with_count);
  70. $str = Str::replace('</div>', "\n", $str);
  71. // мафы
  72. $sheet->setCellValue('G33', Str::trim($str));
  73. //
  74. $fileName = 'Заявка на монтаж - ' . $order->object_address . '.xlsx';
  75. $writer = new Xlsx($spreadsheet);
  76. Storage::disk('public')->makeDirectory('orders/' . $order->id . '/tmp');
  77. $writer->save(storage_path('app/public/orders/') . $order->id .'/tmp/' . $fileName);
  78. }
  79. }