Files
kupshop/bundles/KupShop/WarehouseBundle/Tests/ExpiringProductActionTest.php
2025-08-02 16:30:27 +02:00

178 lines
7.4 KiB
PHP

<?php
declare(strict_types=1);
namespace KupShop\WarehouseBundle\Tests;
use KupShop\KupShopBundle\Util\StringUtil;
use KupShop\WarehouseBundle\Util\ExpiringProductUtil;
use Query\Operator;
class ExpiringProductActionTest extends \DatabaseTestCase
{
protected ExpiringProductUtil $expiringProductUtil;
protected function setUp(): void
{
parent::setUp();
$this->expiringProductUtil = $this->get(ExpiringProductUtil::class);
}
public function testExpiringProductNoVariationsNoBatch()
{
$result = $this->expiringProductUtil->createFromPosition(124014, null, 27277, 'TEST');
$this->expiringProductUtil->addDiscountToProduct($result['oldIdProduct'],
$result['oldIdVariation'],
$result['idProduct'],
$result['idVariation'],
20);
$this->assertEquals(2, $result['movedPieces']);
$resultP = $this->getProduct($result['idProduct'], null);
$this->assertEquals(2, $resultP['p_in_store']);
$this->assertEquals(20, $resultP['p_discount']);
$this->assertEquals(2, $resultP['wp_pieces']);
$this->assertNotEmpty($resultP['p_ean']);
$this->assertTrue(StringUtil::startsWith($resultP['p_title'], 'TEST '));
}
public function testExpiringProductVariationsNoBatch()
{
$result = $this->expiringProductUtil->createFromPosition(110222, 1743255, 12880, 'TEST');
$this->expiringProductUtil->addDiscountToProduct($result['oldIdProduct'],
$result['oldIdVariation'],
$result['idProduct'],
$result['idVariation'],
10);
$this->assertEquals(3, $result['movedPieces']);
$resultP = $this->getProduct($result['idProduct'], $result['idVariation']);
$this->assertEquals(3, $resultP['p_in_store']);
$this->assertEquals(3, $resultP['pv_in_store']);
$this->assertEquals(0, $resultP['p_discount']);
$this->assertEquals(3, $resultP['wp_pieces']);
$this->assertEquals($resultP['pv_price'], $resultP['pv_price_for_discount'] * 0.9, delta: 0.01);
$this->assertEmpty($resultP['p_ean']);
$this->assertNotEmpty($resultP['pv_ean']);
$this->assertTrue(StringUtil::startsWith($resultP['p_title'], 'TEST '));
$result2 = $this->expiringProductUtil->createFromPosition(110222, 1743255, null, 'TEST 2');
$this->assertEquals(6, $result2['movedPieces']);
$resultP2 = $this->getProduct($result2['idProduct'], $result2['idVariation']);
$this->assertEquals(9, $resultP2['p_in_store']);
$this->assertEquals(9, $resultP2['pv_in_store']);
$this->assertEquals(0, $resultP2['p_discount']);
$this->assertEquals(9, $resultP2['wp_pieces']);
$this->assertEquals($resultP2['pv_price'], $resultP2['pv_price_for_discount'] * 0.9, delta: 0.01);
$this->assertTrue(StringUtil::startsWith($resultP2['p_title'], 'TEST '));
$result3 = $this->expiringProductUtil->createFromPosition(110222, 1752161, null, 'TEST 3');
$this->expiringProductUtil->addDiscountToProduct($result['oldIdProduct'],
$result3['oldIdVariation'],
$result3['idProduct'],
$result3['idVariation'],
20);
$this->assertEquals(5, $result3['movedPieces']);
$resultP3 = $this->getProduct($result3['idProduct'], $result3['idVariation']);
$this->assertEquals(14, $resultP3['p_in_store']);
$this->assertEquals(5, $resultP3['pv_in_store']);
$this->assertEquals(0, $resultP3['p_discount']);
$this->assertEquals(5, $resultP3['wp_pieces']);
$this->assertEmpty($resultP3['p_ean']);
$this->assertNotEmpty($resultP3['pv_ean']);
$this->assertEquals($resultP3['pv_price'], $resultP3['pv_price_for_discount'] * 0.8, delta: 0.01);
$this->assertTrue(StringUtil::startsWith($resultP3['p_title'], 'TEST '));
$this->assertTrue($resultP['p_id'] == $resultP2['p_id'] && $resultP2['p_id'] == $resultP3['p_id']);
$this->assertTrue($resultP['pv_id'] == $resultP2['pv_id'] && $resultP2['pv_id'] != $resultP3['pv_id']);
}
public function testExpiringProductVariationsBatch()
{
$resultEmptyPos = $this->expiringProductUtil->createFromBatch(90576, 2466, 13747, 'TEST');
$this->assertTrue(empty($resultEmptyPos['movedPieces']), 'No pieces should be transfered, the batch is not on the position');
$result = $this->expiringProductUtil->createFromBatch(90576, 2466, 13746, 'TEST');
$resultP = $this->getProduct($result['idProduct'], $result['idVariation']);
$this->assertEquals(14, $result['movedPieces']);
$this->assertEquals(14, $resultP['p_in_store']);
$this->assertEquals(14, $resultP['pv_in_store']);
$this->assertEquals(14, $resultP['wp_pieces']);
$this->assertTrue(StringUtil::startsWith($resultP['p_title'], 'TEST '));
$newBatches = $this->getProductBatches($result['idProduct'], $result['idVariation']);
$this->assertEquals('2025-01-28 00:00:00', $newBatches[0]['date_expiry'], 'Batch was not transfered to the new product');
$result = $this->expiringProductUtil->createFromBatch(90576, 2450, null, 'TEST');
$this->expiringProductUtil->addDiscountToProduct($result['oldIdProduct'],
$result['oldIdVariation'],
$result['idProduct'],
$result['idVariation'],
50);
$resultP2 = $this->getProduct($result['idProduct'], $result['idVariation']);
$this->assertEquals(14 + 12, $resultP2['p_in_store']);
$this->assertEquals(12, $resultP2['pv_in_store']);
$this->assertEquals(12, $resultP2['wp_pieces']);
$this->assertEquals(0, $resultP2['p_discount']);
$this->assertEmpty($resultP2['p_ean']);
$this->assertNotEmpty($resultP2['pv_ean']);
$this->assertEquals($resultP2['pv_price'], $resultP2['pv_price_for_discount'] * 0.5, delta: 0.01);
$newBatches = $this->getProductBatches($result['idProduct'], $result['idVariation']);
$this->assertEquals('2024-09-24 00:00:00', $newBatches[0]['date_expiry'], 'Batch was not transfered to the new product');
}
protected function getDataSet()
{
return $this->getJsonDataSetFromFile();
}
protected function getProduct($idP, $idV)
{
return sqlQueryBuilder()->select('p.id p_id, p.in_store p_in_store, p.discount p_discount, p.title p_title, p.ean p_ean,
pv.id pv_id, pv.in_store pv_in_store, pv.price pv_price, pv.price_for_discount pv_price_for_discount, pv.ean pv_ean,
COALESCE(SUM(COALESCE(wp.pieces, 0)),0) wp_pieces')
->from('products', 'p')->leftJoin('p', 'products_variations', 'pv', 'pv.id_product = p.id')
->leftJoin('pv', 'warehouse_products', 'wp', 'p.id = wp.id_product AND pv.id <=> wp.id_variation')
->where(Operator::equalsNullable([
'p.id' => $idP,
'pv.id' => $idV,
]))->execute()->fetchAssociative();
}
protected function getProductBatches($idP, $idV)
{
return sqlQueryBuilder()->select('pb.*')
->from('warehouse_products', 'wp')
->leftJoin('wp', 'products_batches', 'pb', 'wp.id_product = pb.id_product AND wp.id_variation <=> pb.id_variation')
->where(Operator::equalsNullable([
'wp.id_product' => $idP,
'wp.id_variation' => $idV,
]))->execute()->fetchAllAssociative();
}
}