ExportMafService.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. <?php
  2. namespace App\Services;
  3. use App\Helpers\DateHelper;
  4. use App\Models\File;
  5. use App\Models\MafView;
  6. use App\Models\Scopes\YearScope;
  7. use Illuminate\Database\Eloquent\Builder;
  8. use Illuminate\Support\Facades\Storage;
  9. use Illuminate\Support\Str;
  10. use PhpOffice\PhpSpreadsheet\IOFactory;
  11. use PhpOffice\PhpSpreadsheet\Style\Border;
  12. use PhpOffice\PhpSpreadsheet\Style\Color;
  13. use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
  14. use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;
  15. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  16. class ExportMafService
  17. {
  18. public function handle(int $userId, array|int $filters = []): string
  19. {
  20. if (is_int($filters)) {
  21. $filters = ['year' => $filters];
  22. }
  23. $inputFileType = 'Xlsx'; // Xlsx - Xml - Ods - Slk - Gnumeric - Csv
  24. $inputFileName = './templates/Mafs.xlsx';
  25. $reader = IOFactory::createReader($inputFileType);
  26. $spreadsheet = $reader->load($inputFileName);
  27. $sheet = $spreadsheet->getActiveSheet();
  28. $sheet->getPageSetup()->setOrientation(PageSetup::ORIENTATION_LANDSCAPE);
  29. $year = (int) ($filters['year'] ?? date('Y'));
  30. $query = MafView::query()
  31. ->withoutGlobalScope(YearScope::class)
  32. ->where('year', $year);
  33. $this->applyFilters($query, $filters);
  34. $mafs = $query->get();
  35. $i = 2;
  36. foreach ($mafs as $maf) {
  37. $sheet->setCellValue('A' . $i, $maf->id);
  38. $sheet->setCellValue('B' . $i, $maf->year);
  39. $sheet->setCellValue('C' . $i, $maf->district_name);
  40. $sheet->setCellValue('D' . $i, $maf->area_name);
  41. $sheet->setCellValue('E' . $i, $maf->object_address);
  42. $sheet->setCellValue('F' . $i, $maf->order_number);
  43. $sheet->setCellValue('G' . $i, $maf->status);
  44. $sheet->setCellValue('H' . $i, $maf->rfid);
  45. $sheet->setCellValue('I' . $i, $maf->factory_number);
  46. $sheet->setCellValue('J' . $i, (is_string($maf->manufacture_date)) ? DateHelper::ISODateToExcelDate($maf->manufacture_date) : '');
  47. $sheet->setCellValue('K' . $i, $maf->statement_number);
  48. $sheet->setCellValue('L' . $i, (is_string($maf->statement_date)) ? DateHelper::ISODateToExcelDate($maf->statement_date) : '');
  49. $sheet->setCellValue('M' . $i, $maf->upd_number);
  50. $sheet->setCellValue('N' . $i, $maf->nomenclature_number);
  51. $sheet->setCellValue('O' . $i, $maf->article);
  52. $sheet->setCellValue('P' . $i, $maf->name_tz);
  53. $sheet->setCellValue('Q' . $i, $maf->type_tz);
  54. $sheet->setCellValue('R' . $i, $maf->type);
  55. $sheet->setCellValue('S' . $i, $maf->manufacturer_name);
  56. $sheet->setCellValue('T' . $i, $maf->comment);
  57. $sheet->getStyle('J' . $i)
  58. ->getNumberFormat()
  59. ->setFormatCode(NumberFormat::FORMAT_DATE_DDMMYYYY);
  60. $sheet->getStyle('L' . $i)
  61. ->getNumberFormat()
  62. ->setFormatCode(NumberFormat::FORMAT_DATE_DDMMYYYY);
  63. $i++;
  64. }
  65. $sheet->getStyle('A1:T' . $i - 1)->getBorders()->getAllBorders()->setBorderStyle(Border::BORDER_THIN)->setColor(new Color('777777'));
  66. $fileName = 'export_mafs_' . date('Y-m-d_H-i-s') . '.xlsx';
  67. $writer = new Xlsx($spreadsheet);
  68. $fd = 'export';
  69. Storage::disk('public')->makeDirectory($fd);
  70. $fp = storage_path('app/public/export/') . $fileName;
  71. Storage::disk('public')->delete($fd . '/' . $fileName);
  72. $writer->save($fp);
  73. // create zip archive
  74. $fileModel = File::query()->create([
  75. 'link' => url('/storage/') . '/export/' . $fileName,
  76. 'path' => $fp,
  77. 'user_id' => $userId,
  78. 'original_name' => $fileName,
  79. 'mime_type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
  80. ]);
  81. // return link
  82. return $fileName;
  83. }
  84. private function applyFilters(Builder $query, array $filters): void
  85. {
  86. $allowedColumns = array_flip((new MafView())->getFillable());
  87. foreach ($filters as $filterName => $filterValue) {
  88. if ($filterName === 'year' || $filterValue === null || $filterValue === '') {
  89. continue;
  90. }
  91. if ($filterName === 's') {
  92. $searchFields = [
  93. 'rfid',
  94. 'factory_number',
  95. 'statement_number',
  96. 'upd_number',
  97. 'object_address',
  98. 'nomenclature_number',
  99. 'article',
  100. ];
  101. $query->where(function ($subQuery) use ($searchFields, $filterValue) {
  102. foreach ($searchFields as $searchField) {
  103. $subQuery->orWhere($searchField, 'LIKE', '%' . $filterValue . '%');
  104. }
  105. });
  106. continue;
  107. }
  108. if (Str::endsWith($filterName, '_from') || Str::endsWith($filterName, '_to')) {
  109. $operator = Str::endsWith($filterName, '_from') ? '>=' : '<=';
  110. $column = Str::replace(['_from', '_to'], '', $filterName);
  111. if (!isset($allowedColumns[$column])) {
  112. continue;
  113. }
  114. $query->where($column, $operator, $filterValue);
  115. continue;
  116. }
  117. if (!isset($allowedColumns[$filterName])) {
  118. continue;
  119. }
  120. if (is_string($filterValue) && Str::contains($filterValue, '||')) {
  121. $values = explode('||', $filterValue);
  122. $query->where(function ($subQuery) use ($filterName, $values) {
  123. $nonNullValues = [];
  124. foreach ($values as $value) {
  125. if ($value === '-пусто-') {
  126. $subQuery->orWhereNull($filterName);
  127. } else {
  128. $nonNullValues[] = $value;
  129. }
  130. }
  131. if (!empty($nonNullValues)) {
  132. $subQuery->orWhereIn($filterName, $nonNullValues);
  133. }
  134. });
  135. continue;
  136. }
  137. if ($filterValue === '-пусто-') {
  138. $query->whereNull($filterName);
  139. } else {
  140. $query->where($filterName, $filterValue);
  141. }
  142. }
  143. }
  144. }