ExportProductionOrdersServiceTest.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. <?php
  2. declare(strict_types=1);
  3. namespace Tests\Unit\Services\Export;
  4. use App\Enums\ProductionOrderExecutionType;
  5. use App\Enums\ProductionOrderStatus;
  6. use App\Models\CommonCatalogItem;
  7. use App\Models\ProductionOrder;
  8. use App\Models\ProductionOrderItem;
  9. use App\Models\User;
  10. use App\Services\Export\ExportProductionOrdersService;
  11. use Illuminate\Foundation\Testing\RefreshDatabase;
  12. use Illuminate\Support\Facades\Storage;
  13. use PhpOffice\PhpSpreadsheet\IOFactory;
  14. use Tests\TestCase;
  15. class ExportProductionOrdersServiceTest extends TestCase
  16. {
  17. use RefreshDatabase;
  18. protected bool $seed = true;
  19. public function test_export_contains_all_order_fields_and_aggregated_equipment(): void
  20. {
  21. Storage::fake('local');
  22. $user = User::factory()->admin()->create();
  23. $manager = User::factory()->manager()->create(['name' => 'Менеджер экспорта']);
  24. $playground = CommonCatalogItem::factory()->create([
  25. 'article' => '0007',
  26. 'calculator_name' => 'Игровой комплекс',
  27. ]);
  28. $swing = CommonCatalogItem::factory()->create([
  29. 'article' => '0011',
  30. 'calculator_name' => 'Качели',
  31. ]);
  32. $order = ProductionOrder::factory()->create([
  33. 'order_number' => '0000123',
  34. 'order_year' => 2026,
  35. 'customer_name' => 'ООО Заказчик',
  36. 'object_address' => 'г. Москва, ул. Строителей, 1',
  37. 'invoice_number' => '0000456',
  38. 'invoice_date' => '2026-08-30',
  39. 'contract_number' => '0000789',
  40. 'contract_date' => '2026-08-31',
  41. 'payment_date' => '2026-09-01',
  42. 'supply_working_days' => 10,
  43. 'contract_shipment_date' => '2026-09-15',
  44. 'application_shipment_date' => '2026-09-20',
  45. 'status' => ProductionOrderStatus::InStock,
  46. 'execution_type' => ProductionOrderExecutionType::DeliveryAndInstallation,
  47. 'manager_id' => $manager->id,
  48. 'note' => 'Примечание к заказу',
  49. ]);
  50. ProductionOrderItem::factory()->count(2)->create([
  51. 'production_order_id' => $order->id,
  52. 'common_catalog_item_id' => $playground->id,
  53. ]);
  54. ProductionOrderItem::factory()->create([
  55. 'production_order_id' => $order->id,
  56. 'common_catalog_item_id' => $swing->id,
  57. ]);
  58. $excluded = ProductionOrder::factory()->create(['manager_id' => $manager->id]);
  59. $file = app(ExportProductionOrdersService::class)->handle([$order->id], $user->id);
  60. Storage::disk('local')->assertExists($file->path);
  61. $this->assertTrue($file->is_generated);
  62. $this->assertSame($user->id, $file->user_id);
  63. $this->assertStringContainsString('/schedules/orders/files/', $file->link);
  64. $sheet = IOFactory::load(Storage::disk('local')->path($file->path))->getActiveSheet();
  65. $this->assertSame(
  66. ExportProductionOrdersService::HEADERS,
  67. $sheet->rangeToArray('A1:R1')[0],
  68. );
  69. $this->assertSame($order->id, $sheet->getCell('A2')->getValue());
  70. $this->assertSame('0000123', $sheet->getCell('B2')->getValue());
  71. $this->assertSame('0000456', $sheet->getCell('F2')->getValue());
  72. $this->assertSame('0000789', $sheet->getCell('H2')->getValue());
  73. $this->assertSame('01.09.2026', $sheet->getCell('J2')->getValue());
  74. $this->assertSame(ProductionOrderStatus::InStock->label(), $sheet->getCell('N2')->getValue());
  75. $this->assertSame(
  76. ProductionOrderExecutionType::DeliveryAndInstallation->label(),
  77. $sheet->getCell('O2')->getValue(),
  78. );
  79. $this->assertSame('Менеджер экспорта', $sheet->getCell('P2')->getValue());
  80. $this->assertStringContainsString('0007 — Игровой комплекс — 2 шт.', $sheet->getCell('Q2')->getValue());
  81. $this->assertStringContainsString('0011 — Качели — 1 шт.', $sheet->getCell('Q2')->getValue());
  82. $this->assertSame('Примечание к заказу', $sheet->getCell('R2')->getValue());
  83. $this->assertNull($sheet->getCell('A3')->getValue());
  84. $this->assertNotSame($excluded->id, $sheet->getCell('A2')->getValue());
  85. }
  86. public function test_export_can_create_an_empty_workbook(): void
  87. {
  88. Storage::fake('local');
  89. $user = User::factory()->admin()->create();
  90. $file = app(ExportProductionOrdersService::class)->handle([], $user->id);
  91. Storage::disk('local')->assertExists($file->path);
  92. $sheet = IOFactory::load(Storage::disk('local')->path($file->path))->getActiveSheet();
  93. $this->assertSame(ExportProductionOrdersService::HEADERS, $sheet->rangeToArray('A1:R1')[0]);
  94. $this->assertNull($sheet->getCell('A2')->getValue());
  95. }
  96. }