393 lines
18 KiB
PHP
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);
|
|
}
|
|
}
|