ImportSparePartsServiceTest.php 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. <?php
  2. namespace Tests\Unit\Services\Import;
  3. use App\Models\PricingCode;
  4. use App\Models\SparePart;
  5. use App\Services\Import\ImportSparePartsService;
  6. use Illuminate\Foundation\Testing\RefreshDatabase;
  7. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  8. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  9. use Tests\TestCase;
  10. class ImportSparePartsServiceTest extends TestCase
  11. {
  12. use RefreshDatabase;
  13. protected $seed = true;
  14. private string $tempFilePath;
  15. protected function tearDown(): void
  16. {
  17. if (isset($this->tempFilePath) && file_exists($this->tempFilePath)) {
  18. unlink($this->tempFilePath);
  19. }
  20. parent::tearDown();
  21. }
  22. public function test_import_stores_prices_in_kopecks_from_rubles(): void
  23. {
  24. $this->createTestFile([
  25. ['SP-IMPORT-001', 'Для теста', 'Заметка', 1500, 1999.99, 0, 'ТСН-1', 'PC-001', 3],
  26. ]);
  27. $service = new ImportSparePartsService($this->tempFilePath, 1);
  28. $result = $service->handle();
  29. $this->assertTrue($result['success']);
  30. $sparePart = SparePart::where('article', 'SP-IMPORT-001')->firstOrFail();
  31. $this->assertSame(150000, $sparePart->getRawOriginal('purchase_price'));
  32. $this->assertSame(199999, $sparePart->getRawOriginal('customer_price'));
  33. $this->assertSame(0, $sparePart->getRawOriginal('expertise_price'));
  34. $this->assertEquals(1500.0, $sparePart->purchase_price);
  35. $this->assertEquals(1999.99, $sparePart->customer_price);
  36. $this->assertEquals(0.0, $sparePart->expertise_price);
  37. $this->assertDatabaseHas('pricing_codes', [
  38. 'type' => PricingCode::TYPE_PRICING_CODE,
  39. 'code' => 'PC-001',
  40. ]);
  41. }
  42. private function createTestFile(array $rows): void
  43. {
  44. $spreadsheet = new Spreadsheet();
  45. $sheet = $spreadsheet->getActiveSheet();
  46. $sheet->setCellValue('A1', 'ID');
  47. $sheet->setCellValue('B1', 'Артикул');
  48. $sheet->setCellValue('C1', 'Где используется');
  49. $sheet->setCellValue('D1', 'Кол-во без док');
  50. $sheet->setCellValue('E1', 'Кол-во с док');
  51. $sheet->setCellValue('F1', 'Кол-во общее');
  52. $sheet->setCellValue('G1', 'Примечание');
  53. $sheet->setCellValue('H1', 'Цена закупки');
  54. $sheet->setCellValue('I1', 'Цена для заказчика');
  55. $sheet->setCellValue('J1', 'Цена экспертизы');
  56. $sheet->setCellValue('K1', '№ по ТСН');
  57. $sheet->setCellValue('L1', 'Шифры расценки');
  58. $sheet->setCellValue('M1', 'Мин. остаток');
  59. $rowNum = 2;
  60. foreach ($rows as $row) {
  61. $sheet->setCellValue('B' . $rowNum, $row[0] ?? '');
  62. $sheet->setCellValue('C' . $rowNum, $row[1] ?? '');
  63. $sheet->setCellValue('G' . $rowNum, $row[2] ?? '');
  64. $sheet->setCellValue('H' . $rowNum, $row[3] ?? '');
  65. $sheet->setCellValue('I' . $rowNum, $row[4] ?? '');
  66. $sheet->setCellValue('J' . $rowNum, $row[5] ?? '');
  67. $sheet->setCellValue('K' . $rowNum, $row[6] ?? '');
  68. $sheet->setCellValue('L' . $rowNum, $row[7] ?? '');
  69. $sheet->setCellValue('M' . $rowNum, $row[8] ?? 0);
  70. $rowNum++;
  71. }
  72. $pricingCodesSheet = $spreadsheet->createSheet(1);
  73. $pricingCodesSheet->setCellValue('A1', 'ID');
  74. $pricingCodesSheet->setCellValue('B1', 'Тип');
  75. $pricingCodesSheet->setCellValue('C1', 'Код');
  76. $pricingCodesSheet->setCellValue('D1', 'Расшифровка');
  77. $this->tempFilePath = sys_get_temp_dir() . '/test_spare_parts_' . uniqid() . '.xlsx';
  78. $writer = new Xlsx($spreadsheet);
  79. $writer->save($this->tempFilePath);
  80. }
  81. }