ImportStockOrdersServiceTest.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. <?php
  2. declare(strict_types=1);
  3. namespace Tests\Unit\Services\Import;
  4. use App\Models\CommonCatalogItem;
  5. use App\Models\Import;
  6. use App\Models\StockMovement;
  7. use App\Models\StockOrder;
  8. use App\Models\User;
  9. use App\Services\Import\ImportStockOrdersService;
  10. use App\Services\StockInventoryService;
  11. use Illuminate\Foundation\Testing\RefreshDatabase;
  12. use Illuminate\Support\Facades\Storage;
  13. use PhpOffice\PhpSpreadsheet\Cell\DataType;
  14. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  15. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  16. use Tests\TestCase;
  17. class ImportStockOrdersServiceTest extends TestCase
  18. {
  19. use RefreshDatabase;
  20. protected bool $seed = true;
  21. public function test_import_creates_and_updates_order_by_number_and_article(): void
  22. {
  23. Storage::fake('upload');
  24. $user = User::factory()->create();
  25. CommonCatalogItem::factory()->create(['article' => '00125']);
  26. $firstImport = $this->createImport($user, 'Заказан', 5, 'Ожидаем поставку');
  27. $this->assertTrue($this->service($firstImport, $user)->handle());
  28. $this->assertDatabaseHas('stock_orders', [
  29. 'order_number' => 'СКЛ-100',
  30. 'status' => StockOrder::STATUS_ORDERED,
  31. 'ordered_quantity' => 5,
  32. 'available_quantity' => 0,
  33. ]);
  34. $secondImport = $this->createImport($user, 'На складе', 7, 'Поставка принята');
  35. $this->assertTrue($this->service($secondImport, $user)->handle());
  36. $this->assertDatabaseCount('stock_orders', 1);
  37. $this->assertDatabaseHas('stock_orders', [
  38. 'order_number' => 'СКЛ-100',
  39. 'status' => StockOrder::STATUS_IN_STOCK,
  40. 'ordered_quantity' => 7,
  41. 'available_quantity' => 7,
  42. 'note' => 'Поставка принята',
  43. ]);
  44. $this->assertDatabaseHas('stock_movements', [
  45. 'movement_type' => StockMovement::TYPE_RECEIPT,
  46. 'quantity' => 7,
  47. ]);
  48. $this->assertSame('DONE', $secondImport->refresh()->status);
  49. }
  50. public function test_import_does_not_choose_arbitrary_catalog_variant_for_duplicate_article(): void
  51. {
  52. Storage::fake('upload');
  53. $user = User::factory()->create();
  54. CommonCatalogItem::factory()->create([
  55. 'article' => '00125',
  56. 'calculator_name' => 'Обычное исполнение',
  57. ]);
  58. CommonCatalogItem::factory()->create([
  59. 'article' => '00125',
  60. 'calculator_name' => 'Исполнение Цинк',
  61. ]);
  62. $import = $this->createImport($user, 'Заказан', 5, 'Ожидаем поставку');
  63. $this->assertTrue($this->service($import, $user)->handle());
  64. $this->assertDatabaseCount('stock_orders', 0);
  65. $this->assertSame('DONE', $import->refresh()->status);
  66. $this->assertStringContainsString(
  67. 'соответствует нескольким вариантам',
  68. (string) $import->result,
  69. );
  70. }
  71. private function createImport(User $user, string $status, int $quantity, string $note): Import
  72. {
  73. $spreadsheet = new Spreadsheet;
  74. $sheet = $spreadsheet->getActiveSheet();
  75. $sheet->fromArray(ImportStockOrdersService::HEADERS, null, 'A1');
  76. $sheet->setCellValue('A2', 'СКЛ-100');
  77. $sheet->setCellValueExplicit('B2', '00125', DataType::TYPE_STRING);
  78. $sheet->setCellValue('C2', $status);
  79. $sheet->setCellValue('D2', $quantity);
  80. $sheet->setCellValue('E2', $note);
  81. $filename = 'stock_orders_'.uniqid().'.xlsx';
  82. (new Xlsx($spreadsheet))->save(Storage::disk('upload')->path($filename));
  83. return Import::query()->create([
  84. 'type' => 'stock_orders',
  85. 'filename' => $filename,
  86. 'status' => 'new',
  87. 'user_id' => $user->id,
  88. ]);
  89. }
  90. private function service(Import $import, User $user): ImportStockOrdersService
  91. {
  92. return new ImportStockOrdersService(
  93. $import,
  94. $user->id,
  95. app(StockInventoryService::class),
  96. );
  97. }
  98. }