| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- <?php
- declare(strict_types=1);
- namespace Tests\Unit\Services\Export;
- use App\Enums\ProductionOrderExecutionType;
- use App\Enums\ProductionOrderStatus;
- use App\Models\CommonCatalogItem;
- use App\Models\ProductionOrder;
- use App\Models\ProductionOrderItem;
- use App\Models\User;
- use App\Services\Export\ExportProductionOrdersService;
- use Illuminate\Foundation\Testing\RefreshDatabase;
- use Illuminate\Support\Facades\Storage;
- use PhpOffice\PhpSpreadsheet\IOFactory;
- use Tests\TestCase;
- class ExportProductionOrdersServiceTest extends TestCase
- {
- use RefreshDatabase;
- protected bool $seed = true;
- public function test_export_contains_all_order_fields_and_aggregated_equipment(): void
- {
- Storage::fake('local');
- $user = User::factory()->admin()->create();
- $manager = User::factory()->manager()->create(['name' => 'Менеджер экспорта']);
- $playground = CommonCatalogItem::factory()->create([
- 'article' => '0007',
- 'calculator_name' => 'Игровой комплекс',
- ]);
- $swing = CommonCatalogItem::factory()->create([
- 'article' => '0011',
- 'calculator_name' => 'Качели',
- ]);
- $order = ProductionOrder::factory()->create([
- 'order_number' => '0000123',
- 'order_year' => 2026,
- 'customer_name' => 'ООО Заказчик',
- 'object_address' => 'г. Москва, ул. Строителей, 1',
- 'invoice_number' => '0000456',
- 'invoice_date' => '2026-08-30',
- 'contract_number' => '0000789',
- 'contract_date' => '2026-08-31',
- 'payment_date' => '2026-09-01',
- 'supply_working_days' => 10,
- 'contract_shipment_date' => '2026-09-15',
- 'application_shipment_date' => '2026-09-20',
- 'status' => ProductionOrderStatus::InStock,
- 'execution_type' => ProductionOrderExecutionType::DeliveryAndInstallation,
- 'manager_id' => $manager->id,
- 'note' => 'Примечание к заказу',
- ]);
- ProductionOrderItem::factory()->count(2)->create([
- 'production_order_id' => $order->id,
- 'common_catalog_item_id' => $playground->id,
- ]);
- ProductionOrderItem::factory()->create([
- 'production_order_id' => $order->id,
- 'common_catalog_item_id' => $swing->id,
- ]);
- $excluded = ProductionOrder::factory()->create(['manager_id' => $manager->id]);
- $file = app(ExportProductionOrdersService::class)->handle([$order->id], $user->id);
- Storage::disk('local')->assertExists($file->path);
- $this->assertTrue($file->is_generated);
- $this->assertSame($user->id, $file->user_id);
- $this->assertStringContainsString('/schedules/orders/files/', $file->link);
- $spreadsheet = IOFactory::load(Storage::disk('local')->path($file->path));
- $sheet = $spreadsheet->getSheetByName(ExportProductionOrdersService::ORDERS_SHEET);
- $this->assertNotNull($sheet);
- $this->assertSame(
- ExportProductionOrdersService::HEADERS,
- $sheet->rangeToArray('A1:R1')[0],
- );
- $this->assertSame($order->id, $sheet->getCell('A2')->getValue());
- $this->assertSame('0000123', $sheet->getCell('B2')->getValue());
- $this->assertSame('0000456', $sheet->getCell('F2')->getValue());
- $this->assertSame('0000789', $sheet->getCell('H2')->getValue());
- $this->assertSame('01.09.2026', $sheet->getCell('J2')->getValue());
- $this->assertSame(ProductionOrderStatus::InStock->label(), $sheet->getCell('N2')->getValue());
- $this->assertSame(
- ProductionOrderExecutionType::DeliveryAndInstallation->label(),
- $sheet->getCell('O2')->getValue(),
- );
- $this->assertSame('Менеджер экспорта', $sheet->getCell('P2')->getValue());
- $this->assertStringContainsString('0007 — Игровой комплекс — 2 шт.', $sheet->getCell('Q2')->getValue());
- $this->assertStringContainsString('0011 — Качели — 1 шт.', $sheet->getCell('Q2')->getValue());
- $this->assertSame('Примечание к заказу', $sheet->getCell('R2')->getValue());
- $this->assertNull($sheet->getCell('A3')->getValue());
- $this->assertNotSame($excluded->id, $sheet->getCell('A2')->getValue());
- $itemsSheet = $spreadsheet->getSheetByName(ExportProductionOrdersService::ITEMS_SHEET);
- $this->assertNotNull($itemsSheet);
- $this->assertSame(
- ExportProductionOrdersService::ITEM_HEADERS,
- $itemsSheet->rangeToArray('A1:H1')[0],
- );
- $this->assertSame(2, $itemsSheet->getCell('A2')->getValue());
- $this->assertSame($playground->id, $itemsSheet->getCell('C2')->getValue());
- $this->assertSame('0007', $itemsSheet->getCell('D2')->getValue());
- $this->assertSame('Игровой комплекс', $itemsSheet->getCell('E2')->getValue());
- $this->assertSame(2, $itemsSheet->getCell('A3')->getValue());
- $this->assertSame(2, $itemsSheet->getCell('A4')->getValue());
- }
- public function test_export_can_create_an_empty_workbook(): void
- {
- Storage::fake('local');
- $user = User::factory()->admin()->create();
- $file = app(ExportProductionOrdersService::class)->handle([], $user->id);
- Storage::disk('local')->assertExists($file->path);
- $spreadsheet = IOFactory::load(Storage::disk('local')->path($file->path));
- $sheet = $spreadsheet->getSheetByName(ExportProductionOrdersService::ORDERS_SHEET);
- $this->assertNotNull($sheet);
- $this->assertSame(ExportProductionOrdersService::HEADERS, $sheet->rangeToArray('A1:R1')[0]);
- $this->assertNull($sheet->getCell('A2')->getValue());
- $itemsSheet = $spreadsheet->getSheetByName(ExportProductionOrdersService::ITEMS_SHEET);
- $this->assertNotNull($itemsSheet);
- $this->assertSame(ExportProductionOrdersService::ITEM_HEADERS, $itemsSheet->rangeToArray('A1:H1')[0]);
- }
- }
|