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

393 lines
18 KiB
PHP

<?php
namespace KupShop\WarehouseBundle\Tests;
use KupShop\KupShopBundle\Util\Mail\EmailSender;
use KupShop\KupShopBundle\Util\System\UrlFinder;
use KupShop\WarehouseBundle\EventListener\CronListener;
use KupShop\WarehouseBundle\Exception\WarehouseBaseException;
use KupShop\WarehouseBundle\Util\StockInWorker;
use KupShop\WarehouseBundle\Util\StoreItemWorker;
use Query\Operator;
class CheckAppTest extends \DatabaseTestCase
{
public function getDataSet()
{
return $this->getJsonDataSetFromFile();
}
public function testAddEanToProduct()
{
$productEan = sqlQueryBuilder()->select('ean')->from('products')->where(Operator::equals(['id' => 3822]))->execute()->fetchColumn();
$this->assertNull($productEan);
$worker = $this->get(StockInWorker::class);
$worker->addEan(371506, 4524667014270);
$newProductEan = sqlQueryBuilder()->select('ean')->from('products')->where(Operator::equals(['id' => 3822]))->execute()->fetchColumn();
$this->assertEquals(4524667014270, $newProductEan);
}
public function testAddEanToVariation()
{
$productEan = sqlQueryBuilder()->select('ean')->from('products_variations')->where(Operator::equals(['id' => 1718603]))->execute()->fetchColumn();
$this->assertEquals(1234567891234, $productEan);
$worker = $this->get(StockInWorker::class);
$worker->addEan(371505, 1111111111111);
$newProductEan = sqlQueryBuilder()->select('ean')->from('products_variations')->where(Operator::equals(['id' => 1718603]))->execute()->fetchColumn();
$this->assertEquals(1111111111111, $newProductEan);
}
public function testSubmitStockIn()
{
$productStockIn = sqlQueryBuilder()->select('in_store')->from('products')->where(Operator::equals(['id' => 3822]))->execute()->fetchColumn();
$variationStockIn = sqlQueryBuilder()->select('in_store')->from('products_variations')->where(Operator::equals(['id' => 1718603]))->execute()->fetchColumn();
$this->assertEquals(0, $productStockIn);
$this->assertEquals(0, $variationStockIn);
$worker = $this->get(StockInWorker::class);
$result = $worker->SubmitStockIn(21886, $this->getStockInRows());
$this->assertTrue($result);
$productStockIn = sqlQueryBuilder()->select('in_store')->from('products')->where(Operator::equals(['id' => 3822]))->execute()->fetchColumn();
$variationStockIn = sqlQueryBuilder()->select('in_store')->from('products_variations')->where(Operator::equals(['id' => 1718603]))->execute()->fetchColumn();
$this->assertEquals(2, $productStockIn);
$this->assertEquals(3, $variationStockIn);
}
public function testSubmitMassStockIn()
{
$productStockIn = sqlQueryBuilder()->select('in_store')->from('products')->where(Operator::equals(['id' => 3822]))->execute()->fetchColumn();
$variationStockIn = sqlQueryBuilder()->select('in_store')->from('products_variations')->where(Operator::equals(['id' => 1718603]))->execute()->fetchColumn();
$this->assertEquals(0, $productStockIn);
$this->assertEquals(0, $variationStockIn);
$data = [
371506 => new \stdClass(),
371505 => new \stdClass(),
371507 => new \stdClass(),
];
$data[371506]->checked = 8; // z celkem 6 + 6 je v naskladnenich
$data[371506]->id = 371506;
$data[371506]->id_product = 3822;
$data[371506]->id_variation = null;
$data[371505]->checked = 12; // celkem 5 + 5 v naskladnenich
$data[371505]->id = 371505;
$data[371505]->id_product = 101900;
$data[371505]->id_variation = 1718603;
$data[371507]->checked = 0; // celkem 5 + 5 v naskladnenich
$data[371507]->id = 371507;
$data[371507]->id_product = 101900;
$data[371507]->id_variation = 1718604;
$worker = $this->get(StockInWorker::class);
$result = $worker->SubmitStockIn('21886_21887', $data);
$new_stock_in_id = sqlQueryBuilder()
->select('id')
->from('stock_in')
->setMaxResults(1)
->orderBy('id', 'DESC')
->execute()
->fetchColumn();
$this->assertTrue($result);
$this->assertEquals(8, sqlQueryBuilder()->select('in_store')->from('products')->where(Operator::equals(['id' => 3822]))->execute()->fetchColumn());
$this->assertEquals(12, sqlQueryBuilder()->select('in_store')->from('products_variations')->where(Operator::equals(['id' => 1718603]))->execute()->fetchColumn());
// z 12 to vzalo 6 sem
$this->assertEquals(6,
sqlQueryBuilder()
->select('quantity')
->from('stock_in_items')
->where(Operator::equals(['id_product' => 3822, 'id_stock_in' => 21886]))
->execute()->fetchColumn());
// tak sem musely zbyt dva
$this->assertEquals(2,
sqlQueryBuilder()
->select('quantity')
->from('stock_in_items')
->where(Operator::equals(['id_product' => 3822, 'id_stock_in' => 21887]))
->execute()->fetchColumn());
// a do treti faktury jich musely jit 4
$this->assertEquals(4, sqlQueryBuilder()
->select('quantity')
->from('stock_in_items')
->where(Operator::equals(['id_product' => 3822, 'id_stock_in' => $new_stock_in_id]))
->execute()->fetchColumn());
// tady nebylo nic, takze smazat
$this->assertFalse(sqlQueryBuilder()
->select('quantity')
->from('stock_in_items')
->where(Operator::equalsNullable(['id_product' => 101900, 'id_variation' => 1718604, 'id_stock_in' => 21886]))
->execute()->fetchColumn());
// tady nebylo nic, takze smazat
$this->assertFalse(sqlQueryBuilder()
->select('quantity')
->from('stock_in_items')
->where(Operator::equalsNullable(['id_product' => 101900, 'id_variation' => 1718604, 'id_stock_in' => 21887]))
->execute()->fetchColumn());
// zbylo 10 tak se da do novy faktury
$this->assertEquals(10, sqlQueryBuilder()
->select('quantity')
->from('stock_in_items')
->where(Operator::equalsNullable(['id_product' => 101900, 'id_variation' => 1718604, 'id_stock_in' => $new_stock_in_id]))
->execute()->fetchColumn());
// tady melo bejt 5, jelikoz je dvanact tak musi byt pet
$this->assertEquals(5,
sqlQueryBuilder()
->select('quantity')
->from('stock_in_items')
->where(Operator::equals(['id_product' => 101900, 'id_variation' => 1718603, 'id_stock_in' => 21886]))
->execute()->fetchColumn());
// tady melo bejt taky pet + 2 byly navic, takze se pridaj do posledni faktury
$this->assertEquals(7,
sqlQueryBuilder()
->select('quantity')
->from('stock_in_items')
->where(Operator::equals(['id_product' => 101900, 'id_variation' => 1718603, 'id_stock_in' => 21887]))
->execute()->fetchColumn());
$this->assertFalse(sqlQueryBuilder()
->select('quantity')
->from('stock_in_items')
->where(Operator::equals(['id_product' => 101900, 'id_variation' => 1718603, 'id_stock_in' => $new_stock_in_id]))
->execute()->fetchColumn());
}
public function testStockInCreateWarehouseProducts()
{
$this->insertSQL('warehouse_products', ['id_product' => 3822, 'pieces' => 3, 'id_position' => 7]);
$worker = $this->get(StockInWorker::class);
$result = $worker->SubmitStockIn(21886, $this->getStockInRows());
$this->assertTrue($result);
$this->assertEquals('invoice', sqlQueryBuilder()->select('id_index')->from('stock_in')->where(Operator::equals(['id' => 21886]))->execute()->fetchColumn());
$this->assertEquals(5, sqlQueryBuilder()->select('SUM(pieces)')->from('warehouse_products')->where(Operator::equals(['id_product' => 3822]))->groupBy('id_product')->execute()->fetchColumn());
$this->assertEquals(5, sqlQueryBuilder()->select('pieces')->from('warehouse_products')->where(Operator::equals(['id_variation' => 1718603]))->execute()->fetchColumn());
$this->assertEquals(1, sqlQueryBuilder()->select('pieces')->from('warehouse_products')->where(Operator::equals(['id_variation' => 1718604]))->execute()->fetchColumn());
}
protected function getStockInRows()
{
$data = [
371506 => new \stdClass(),
371505 => new \stdClass(),
371507 => new \stdClass(),
];
$data[371506]->checked = 2;
$data[371506]->id = 371506;
$data[371506]->id_product = 3822;
$data[371506]->id_variation = null;
$data[371505]->checked = 3;
$data[371505]->id = 371505;
$data[371505]->id_product = 101900;
$data[371505]->id_variation = 1718603;
$data[371507]->checked = 0;
$data[371507]->id = 371507;
$data[371507]->id_product = 101900;
$data[371507]->id_variation = 1718604;
return $data;
}
public function testSubmitNegativePiecesError()
{
$productStockIn = sqlQueryBuilder()->select('in_store')->from('products')->where(Operator::equals(['id' => 3822]))->execute()->fetchColumn();
$variationStockIn = sqlQueryBuilder()->select('in_store')->from('products_variations')->where(Operator::equals(['id' => 1718604]))->execute()->fetchColumn();
$this->assertEquals(0, $productStockIn);
$this->assertEquals(0, $variationStockIn);
$data = $this->prepValues();
$worker = $this->get(StockInWorker::class);
$this->expectException(WarehouseBaseException::class);
$result = $worker->SubmitStockIn(21888, $data);
$this->assertTrue($result);
}
public function testSubmitNegativePieces()
{
$this->updateSQL('products_variations', ['in_store' => 5], ['id' => 1718604]);
$productStockIn = sqlQueryBuilder()->select('in_store')->from('products')->where(Operator::equals(['id' => 3822]))->execute()->fetchColumn();
$variationStockIn = sqlQueryBuilder()->select('in_store')->from('products_variations')->where(Operator::equals(['id' => 1718604]))->execute()->fetchColumn();
$this->assertEquals(0, $productStockIn);
$this->assertEquals(5, $variationStockIn);
// Na stole by mělo být 5 ks variant které chci zničit
$this->insertSQL('warehouse_products', [
'id_product' => 101900,
'id_variation' => 1718604,
'pieces' => 5,
'over_supply' => 'N',
'id_position' => 7,
]);
// Zkontroluji že jsou na stole
$piecesOnTable = sqlQueryBuilder()->select('pieces')->from('warehouse_products')->where(Operator::equals([
'id_product' => 101900,
'id_variation' => 1718604,
'id_position' => 7,
]))->execute()->fetchColumn();
$this->assertEquals(5, $piecesOnTable);
$data = $this->prepValues();
$worker = $this->get(StockInWorker::class);
$result = $worker->SubmitStockIn(21888, $data);
$this->assertTrue($result);
// Zkontroluji, že se odebraly ze stolu
$piecesOnTable = sqlQueryBuilder()->select('pieces')->from('warehouse_products')
->where(Operator::equals([
'id_product' => 3822,
'id_variation' => 1718603,
'id_position' => 7,
]))
->execute()->fetchColumn();
$this->assertFalse($piecesOnTable);
$productStockIn = sqlQueryBuilder()->select('in_store')->from('products')->where(Operator::equals(['id' => 3822]))->execute()->fetchColumn();
$variationStockIn = sqlQueryBuilder()->select('in_store')->from('products_variations')->where(Operator::equals(['id' => 1718603]))->execute()->fetchColumn();
$this->assertEquals(5, $productStockIn);
// in_store varianty je na nule
$this->assertEquals(0, $variationStockIn);
}
public function prepValues()
{
$data = [
371506 => new \stdClass(),
371505 => new \stdClass(),
];
$data[371506]->checked = 5;
$data[371506]->id = 3715072;
$data[371506]->id_product = 3822;
$data[371506]->id_variation = null;
$data[371505]->checked = -5;
$data[371505]->id = 3715073;
$data[371505]->id_product = 101900;
$data[371505]->id_variation = 1718604;
return $data;
}
public function testUpdatePriceBuy()
{
$productStockInBefore = sqlQueryBuilder()->select('price_buy')->from('products')->andWhere(Operator::equals(['id' => 3822]))->execute()->fetchColumn();
$variationStockInBefore = sqlQueryBuilder()->select('price_buy')->from('products_variations')->andWhere(Operator::equals(['id' => 1718603]))->execute()->fetchColumn();
$this->assertEquals(null, $productStockInBefore);
$this->assertEquals(null, $variationStockInBefore);
/** @var StockInWorker $worker */
$worker = $this->get(StockInWorker::class);
$worker->submitStockIn(21886, $this->getStockInRows());
$productStockInAfter = sqlQueryBuilder()->select('price_buy')->from('products')->andWhere(Operator::equals(['id' => 3822]))->execute()->fetchColumn();
$variationStockInAfter = sqlQueryBuilder()->select('price_buy')->from('products_variations')->andWhere(Operator::equals(['id' => 1718603]))->execute()->fetchColumn();
$this->assertEquals(105.4504, $productStockInAfter);
$this->assertEquals(1150, $variationStockInAfter);
}
public function testDeleteEmptyPositions()
{
/** @var StoreItemWorker $worker */
$worker = $this->get(StoreItemWorker::class);
$cron = new CronListener($worker, $this->get(EmailSender::class), $this->get(UrlFinder::class));
$productPositions = $worker->getProductPositions(Operator::equals(['p.id' => 4000]));
$positions = [
['code' => 'A1-3', 'pieces' => 200, 'id_product_batch' => null, 'batch_code' => null, 'date_expiry' => null],
['code' => 'A2-3', 'pieces' => 5, 'id_product_batch' => null, 'batch_code' => null, 'date_expiry' => null],
['code' => 'PRIJEM', 'pieces' => 0, 'id_product_batch' => null, 'batch_code' => null, 'date_expiry' => null], // STUL "delete_empty": "Y"
['code' => 'A2-2', 'pieces' => 0, 'id_product_batch' => null, 'batch_code' => null, 'date_expiry' => null], // A2 "delete_empty": "N"
];
$this->assertEquals($positions, $productPositions);
$cron->deleteEmptyPositions();
$productPositions = $worker->getProductPositions(Operator::equals(['p.id' => 4000]));
$positions = [
['code' => 'A1-3', 'pieces' => 200, 'id_product_batch' => null, 'batch_code' => null, 'date_expiry' => null],
['code' => 'A2-3', 'pieces' => 5, 'id_product_batch' => null, 'batch_code' => null, 'date_expiry' => null],
['code' => 'A2-2', 'pieces' => 0, 'id_product_batch' => null, 'batch_code' => null, 'date_expiry' => null], // A2 - "delete_empty": "N"
];
$this->assertEquals($positions, $productPositions);
}
public function testSubmitStockInToStore()
{
$productStockIn = sqlQueryBuilder()->select('in_store')->from('products')->where(Operator::equals(['id' => 3822]))->execute()->fetchColumn();
$variationStockIn = sqlQueryBuilder()->select('in_store')->from('products_variations')->where(Operator::equals(['id' => 1718603]))->execute()->fetchColumn();
$storesItems = sqlQueryBuilder()->select('quantity')->from('stores_items')->where(Operator::equals(['id_variation' => 1718603, 'id_store' => 2]))->execute()->fetchColumn();
$this->assertEquals(0, $productStockIn);
$this->assertEquals(0, $variationStockIn);
$this->assertEquals(0, $storesItems);
$worker = $this->get(StockInWorker::class);
$result = $worker->SubmitStockIn(21886, $this->getStockInRows());
$this->assertTrue($result);
$productStockIn = sqlQueryBuilder()->select('in_store')->from('products')->where(Operator::equals(['id' => 3822]))->execute()->fetchColumn();
$variationStockIn = sqlQueryBuilder()->select('in_store')->from('products_variations')->where(Operator::equals(['id' => 1718603]))->execute()->fetchColumn();
$storesItems = sqlQueryBuilder()->select('quantity')->from('stores_items')->where(Operator::equals(['id_variation' => 1718603, 'id_store' => 2]))->execute()->fetchColumn();
$this->assertEquals(2, $productStockIn);
$this->assertEquals(3, $variationStockIn);
$this->assertEquals(3, $storesItems);
}
/** Testuju, že naskladnění do externího skladu nepovýší webový sklad, jen přesune na daný sklad */
public function testSubmitStockInToExternalStore()
{
$productStockIn = sqlQueryBuilder()->select('in_store')->from('products')->where(Operator::equals(['id' => 3822]))->execute()->fetchColumn();
$variationStockIn = sqlQueryBuilder()->select('in_store')->from('products_variations')->where(Operator::equals(['id' => 1718603]))->execute()->fetchColumn();
$storesItems = sqlQueryBuilder()->select('quantity')->from('stores_items')->where(Operator::equals(['id_variation' => 1718603, 'id_store' => 2]))->execute()->fetchColumn();
// Set store 2 to be external store
sqlQuery('UPDATE stores SET type=2 WHERE id=2');
$this->assertEquals(0, $productStockIn);
$this->assertEquals(0, $variationStockIn);
$this->assertEquals(0, $storesItems);
$worker = $this->get(StockInWorker::class);
$result = $worker->SubmitStockIn(21886, $this->getStockInRows());
$this->assertTrue($result);
$productStockIn = sqlQueryBuilder()->select('in_store')->from('products')->where(Operator::equals(['id' => 3822]))->execute()->fetchColumn();
$variationStockIn = sqlQueryBuilder()->select('in_store')->from('products_variations')->where(Operator::equals(['id' => 1718603]))->execute()->fetchColumn();
$storesItems = sqlQueryBuilder()->select('quantity')->from('stores_items')->where(Operator::equals(['id_variation' => 1718603, 'id_store' => 2]))->execute()->fetchColumn();
$this->assertEquals(0, $productStockIn);
$this->assertEquals(0, $variationStockIn);
$this->assertEquals(3, $storesItems);
}
}