ExportMafRegistryServiceTest.php 3.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. <?php
  2. namespace Tests\Unit\Services\Export;
  3. use App\Models\File;
  4. use App\Models\Order;
  5. use App\Models\Product;
  6. use App\Models\ProductSKU;
  7. use App\Models\User;
  8. use App\Services\ExportMafRegistryService;
  9. use Illuminate\Foundation\Testing\RefreshDatabase;
  10. use Illuminate\Support\Facades\Storage;
  11. use PhpOffice\PhpSpreadsheet\IOFactory;
  12. use Tests\TestCase;
  13. class ExportMafRegistryServiceTest extends TestCase
  14. {
  15. use RefreshDatabase;
  16. protected $seed = true;
  17. public function test_handle_exports_matching_mafs_and_sets_upd_number(): void
  18. {
  19. if (!file_exists('./templates/MafRegistry.xlsx')) {
  20. $this->markTestSkipped('Excel template MafRegistry.xlsx not found');
  21. }
  22. Storage::fake('public');
  23. $user = User::factory()->create();
  24. $year = (int) date('Y');
  25. $order = Order::factory()->create([
  26. 'year' => $year,
  27. 'name' => 'Площадка 1',
  28. ]);
  29. $product = Product::factory()->create([
  30. 'year' => $year,
  31. 'article' => 'ART-001',
  32. 'nomenclature_number' => 'NOM-001',
  33. 'statement_name' => 'Наименование в ведомости',
  34. 'total_price' => 1234.56,
  35. ]);
  36. $targetSku = ProductSKU::factory()
  37. ->forOrder($order)
  38. ->forProduct($product)
  39. ->create([
  40. 'year' => $year,
  41. 'statement_number' => 'STAT-001',
  42. 'statement_date' => '2026-05-19',
  43. 'upd_number' => null,
  44. ]);
  45. $blankStatementSku = ProductSKU::factory()->create([
  46. 'year' => $year,
  47. 'statement_number' => ' ',
  48. 'upd_number' => null,
  49. ]);
  50. $alreadyExportedSku = ProductSKU::factory()->create([
  51. 'year' => $year,
  52. 'statement_number' => 'STAT-002',
  53. 'upd_number' => 'OLD-UPD',
  54. ]);
  55. $link = (new ExportMafRegistryService())->handle($user->id, 'UPD-001', $year);
  56. $this->assertStringContainsString('/storage/export/maf-registry/', $link);
  57. $this->assertSame('UPD-001', $targetSku->fresh()->upd_number);
  58. $this->assertNull($blankStatementSku->fresh()->upd_number);
  59. $this->assertSame('OLD-UPD', $alreadyExportedSku->fresh()->upd_number);
  60. $file = File::query()->where('user_id', $user->id)->latest()->firstOrFail();
  61. $this->assertTrue($file->is_generated);
  62. Storage::disk('public')->assertExists($file->path);
  63. $spreadsheet = IOFactory::load(Storage::disk('public')->path($file->path));
  64. $sheet = $spreadsheet->getActiveSheet();
  65. $this->assertSame('НАШ ДВОР', $sheet->getTitle());
  66. $this->assertSame('Реестр оборудования и ведомостей "технической приемки" к УПД UPD-001', $sheet->getCell('C2')->getValue());
  67. $this->assertSame('НАШ ДВОР', $sheet->getCell('A4')->getValue());
  68. $this->assertSame('UPD-001', $sheet->getCell('C4')->getValue());
  69. $this->assertSame('NOM-001', $sheet->getCell('D4')->getValue());
  70. $this->assertSame('Наименование в ведомости', $sheet->getCell('E4')->getValue());
  71. $this->assertSame('ART-001', $sheet->getCell('F4')->getValue());
  72. $this->assertSame('STAT-001', $sheet->getCell('G4')->getValue());
  73. $this->assertSame('Площадка 1', $sheet->getCell('I4')->getValue());
  74. $this->assertSame(1, $sheet->getCell('M4')->getValue());
  75. $this->assertSame(0, $sheet->getCell('N4')->getValue());
  76. $this->assertSame(1234.56, $sheet->getCell('O4')->getValue());
  77. $this->assertSame('С бетоном', $sheet->getCell('P4')->getValue());
  78. $this->assertSame('=SUM(M4:M4)', $sheet->getCell('M1')->getValue());
  79. $this->assertSame(0, $sheet->getCell('N1')->getValue());
  80. $this->assertSame('=SUM(O4:O4)', $sheet->getCell('O1')->getValue());
  81. }
  82. }