| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- <?php
- declare(strict_types=1);
- namespace Tests\Unit\Services\Import;
- use App\Models\CommonCatalogItem;
- use App\Models\Import;
- use App\Models\StockMovement;
- use App\Models\StockOrder;
- use App\Models\User;
- use App\Services\Import\ImportStockOrdersService;
- use App\Services\StockInventoryService;
- use Illuminate\Foundation\Testing\RefreshDatabase;
- use Illuminate\Support\Facades\Storage;
- use PhpOffice\PhpSpreadsheet\Cell\DataType;
- use PhpOffice\PhpSpreadsheet\Spreadsheet;
- use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
- use Tests\TestCase;
- class ImportStockOrdersServiceTest extends TestCase
- {
- use RefreshDatabase;
- protected bool $seed = true;
- public function test_import_creates_and_updates_order_by_number_and_article(): void
- {
- Storage::fake('upload');
- $user = User::factory()->create();
- CommonCatalogItem::factory()->create(['article' => '00125']);
- $firstImport = $this->createImport($user, 'Заказан', 5, 'Ожидаем поставку');
- $this->assertTrue($this->service($firstImport, $user)->handle());
- $this->assertDatabaseHas('stock_orders', [
- 'order_number' => 'СКЛ-100',
- 'status' => StockOrder::STATUS_ORDERED,
- 'ordered_quantity' => 5,
- 'available_quantity' => 0,
- ]);
- $secondImport = $this->createImport($user, 'На складе', 7, 'Поставка принята');
- $this->assertTrue($this->service($secondImport, $user)->handle());
- $this->assertDatabaseCount('stock_orders', 1);
- $this->assertDatabaseHas('stock_orders', [
- 'order_number' => 'СКЛ-100',
- 'status' => StockOrder::STATUS_IN_STOCK,
- 'ordered_quantity' => 7,
- 'available_quantity' => 7,
- 'note' => 'Поставка принята',
- ]);
- $this->assertDatabaseHas('stock_movements', [
- 'movement_type' => StockMovement::TYPE_RECEIPT,
- 'quantity' => 7,
- ]);
- $this->assertSame('DONE', $secondImport->refresh()->status);
- }
- private function createImport(User $user, string $status, int $quantity, string $note): Import
- {
- $spreadsheet = new Spreadsheet;
- $sheet = $spreadsheet->getActiveSheet();
- $sheet->fromArray(ImportStockOrdersService::HEADERS, null, 'A1');
- $sheet->setCellValue('A2', 'СКЛ-100');
- $sheet->setCellValueExplicit('B2', '00125', DataType::TYPE_STRING);
- $sheet->setCellValue('C2', $status);
- $sheet->setCellValue('D2', $quantity);
- $sheet->setCellValue('E2', $note);
- $filename = 'stock_orders_'.uniqid().'.xlsx';
- (new Xlsx($spreadsheet))->save(Storage::disk('upload')->path($filename));
- return Import::query()->create([
- 'type' => 'stock_orders',
- 'filename' => $filename,
- 'status' => 'new',
- 'user_id' => $user->id,
- ]);
- }
- private function service(Import $import, User $user): ImportStockOrdersService
- {
- return new ImportStockOrdersService(
- $import,
- $user->id,
- app(StockInventoryService::class),
- );
- }
- }
|