Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions Extension/Model/TrabajoAT.php
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,11 @@ protected function onUpdate(): Closure
protected function setStockMovement(): Closure
{
return function () {
// si la gestión de stock en servicios está desactivada, no generamos movimientos
if (Tools::settings('servicios', 'disablestockmanagement', false)) {
return;
}

// solamente algunos estados modifican el stock
$estados = [
\FacturaScripts\Plugins\Servicios\Model\TrabajoAT::STATUS_NONE,
Expand Down
169 changes: 94 additions & 75 deletions Test/StockAvanzado/StockAvanzadoTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@

use FacturaScripts\Core\Tools;
use FacturaScripts\Core\Where;
use FacturaScripts\Dinamic\Model\Cliente;
use FacturaScripts\Dinamic\Model\MovimientoStock;
use FacturaScripts\Dinamic\Model\Producto;
use FacturaScripts\Dinamic\Model\ServicioAT;
use FacturaScripts\Dinamic\Model\Stock;
use FacturaScripts\Dinamic\Model\TrabajoAT;
Expand All @@ -20,11 +22,90 @@ final class StockAvanzadoTest extends TestCase
use LogErrorsTrait;
use RandomDataTrait;

public function testUpdateStock(): void
public function testUpdateStockWhenStockManagementEnabled(): void
{
Tools::settingsSet('servicios', 'disablestockmanagement', false);

[$customer, $service, $product, $stock] = $this->createServiceWithStock();

// creamos un trabajo
$work = new TrabajoAT();
$work->idservicio = $service->idservicio;
$work->referencia = $product->referencia;
$work->cantidad = 3;
$work->estado = TrabajoAT::STATUS_MAKE_INVOICE;
$this->assertTrue($work->save(), 'Error creating TrabajoAT with stock');

// comprobamos que se ha restado el stock
$stock->load($stock->id());
$this->assertEquals(7, $stock->cantidad);

// comprobamos que hay un movimiento del trabajo
$movement = new MovimientoStock();
$where = [
Where::eq('referencia', $product->referencia),
Where::eq('codalmacen', $service->codalmacen),
Where::eq('docmodel', $work->modelClassName()),
Where::eq('docid', $work->id())
];
$this->assertTrue($movement->loadWhere($where), 'No stock movement found for TrabajoAT');

// eliminamos el trabajo
$this->assertTrue($work->delete(), 'Error deleting TrabajoAT with stock');

// comprobamos que ya no existe el movimiento del trabajo
$this->assertFalse($movement->loadWhere($where), 'Stock movement for TrabajoAT still exists after deletion');

// comprobamos que se ha devuelto el stock
$stock->load($stock->id());
$this->assertEquals(10, $stock->cantidad);

$this->cleanUp($customer, $service, $product, $stock);
}

public function testUpdateStockWhenStockManagementDisabled(): void
{
// desactivamos la opción de restar stock
Tools::settingsSet('servicios', 'disablestockmanagement', true);

[$customer, $service, $product, $stock] = $this->createServiceWithStock();

// creamos un trabajo
$work = new TrabajoAT();
$work->idservicio = $service->idservicio;
$work->referencia = $product->referencia;
$work->cantidad = 2;
$work->estado = TrabajoAT::STATUS_MAKE_INVOICE;
$this->assertTrue($work->save(), 'Error creating TrabajoAT with stock');

// comprobamos que NO se ha restado el stock
$stock->load($stock->id());
$this->assertEquals(10, $stock->cantidad);

// comprobamos que NO hay movimiento del trabajo, porque la gestión de stock está desactivada
$movement = new MovimientoStock();
$where = [
Where::eq('referencia', $product->referencia),
Where::eq('codalmacen', $service->codalmacen),
Where::eq('docmodel', $work->modelClassName()),
Where::eq('docid', $work->id())
];
$this->assertFalse($movement->loadWhere($where), 'Stock movement found for TrabajoAT with stock management disabled');

// eliminamos el trabajo
$this->assertTrue($work->delete(), 'Error deleting TrabajoAT with stock');

// seguimos sin encontrar movimiento del trabajo (nunca se llegó a crear)
$this->assertFalse($movement->loadWhere($where), 'Stock movement for TrabajoAT still exists after deletion');

// comprobamos que el stock sigue igual
$stock->load($stock->id());
$this->assertEquals(10, $stock->cantidad);

$this->cleanUp($customer, $service, $product, $stock);
}

protected function createServiceWithStock(): array
{
// creamos un cliente
$customer = $this->getRandomCustomer();
$this->assertTrue($customer->save());
Expand All @@ -51,86 +132,24 @@ public function testUpdateStock(): void
$stock->cantidad = 10;
$this->assertTrue($stock->save(), 'Error creating Stock');

// creamos un trabajo
$work1 = new TrabajoAT();
$work1->idservicio = $service->idservicio;
$work1->referencia = $product->referencia;
$work1->cantidad = 2;
$work1->estado = TrabajoAT::STATUS_MAKE_INVOICE;
$this->assertTrue($work1->save(), 'Error creating TrabajoAT with stock');

// comprobamos que no se ha restado el stock
$stock->load($stock->id());
$this->assertEquals(10, $stock->cantidad);

// comprobamos que hay un movimiento del trabajo
$movements1 = new MovimientoStock();
$where1 = [
Where::eq('referencia', $product->referencia),
Where::eq('codalmacen', $service->codalmacen),
Where::eq('docmodel', $work1->modelClassName()),
Where::eq('docid', $work1->id())
];
$this->assertTrue($movements1->loadWhere($where1), 'No stock movement found for TrabajoAT');

// activamos la opción de restar stock
Tools::settingsSet('servicios', 'disablestockmanagement', false);

// creamos otro trabajo
$work2 = new TrabajoAT();
$work2->idservicio = $service->idservicio;
$work2->referencia = $product->referencia;
$work2->cantidad = 3;
$work2->estado = TrabajoAT::STATUS_MAKE_INVOICE;
$this->assertTrue($work2->save(), 'Error creating TrabajoAT with stock');

// comprobamos que se ha restado el stock
$stock->load($stock->id());
$this->assertEquals(7, $stock->cantidad);

// comprobamos que hay un movimiento del trabajo
$movements2 = new MovimientoStock();
$where2 = [
Where::eq('referencia', $product->referencia),
Where::eq('codalmacen', $service->codalmacen),
Where::eq('docmodel', $work2->modelClassName()),
Where::eq('docid', $work2->id())
];
$this->assertTrue($movements2->loadWhere($where2), 'No stock movement found for TrabajoAT');

// eliminamos el trabajo 2
$this->assertTrue($work2->delete(), 'Error deleting TrabajoAT with stock');

// comprobamos que no existe el movimiento del trabajo 2
$movements2->reload();
$this->assertFalse($movements2->loadWhere($where2), 'Stock movement for TrabajoAT still exists after deletion');

// comprobamos que se ha sumado el stock
$stock->load($stock->id());
$this->assertEquals(10, $stock->cantidad);

// desactivamos la opción de restar stock
Tools::settingsSet('servicios', 'disablestockmanagement', true);

//eliminamos el trabajo 1
$this->assertTrue($work1->delete(), 'Error deleting TrabajoAT with stock');

// comprobamos que no existe el movimiento del trabajo 1
$movements1->reload();
$this->assertFalse($movements1->loadWhere($where1), 'Stock movement for TrabajoAT still exists after deletion');

// comprobamos que no se ha restado el stock
$stock->load($stock->id());
$this->assertEquals(10, $stock->cantidad);
return [$customer, $service, $product, $stock];
}

// eliminamos
protected function cleanUp(Cliente $customer, ServicioAT $service, Producto $product, Stock $stock): void
{
$this->assertTrue($service->delete());
$this->assertTrue($customer->delete());

$stock->reload();
if ($stock->exists()) {
$this->assertTrue($stock->delete());
}

$this->assertTrue($product->delete());
}

protected function tearDown(): void
{
$this->logErrors();
}
}
}