Skip to content
Merged
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
109 changes: 84 additions & 25 deletions Lib/StockRebuildManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@

use FacturaScripts\Core\Base\DataBase;
use FacturaScripts\Core\DataSrc\Almacenes;
use FacturaScripts\Core\KernelException;
use FacturaScripts\Core\Tools;
use FacturaScripts\Core\Where;
use FacturaScripts\Dinamic\Model\MovimientoStock;
Expand Down Expand Up @@ -115,6 +116,10 @@ protected static function clear(): void

protected static function calculateStockData(string $codalmacen): array
{
$stockData = [];
static::setPterecibir($stockData, $codalmacen);
static::setReservada($stockData, $codalmacen);

// obtenemos un array de referencias únicas
$sql = "SELECT referencia"
. " FROM stocks_movimientos"
Expand All @@ -127,10 +132,9 @@ protected static function calculateStockData(string $codalmacen): array

// si no hay referencias, devolvemos array vacío
if (empty($rows)) {
return [];
return $stockData;
}

$stockData = [];
foreach ($rows as $row) {
$where = [
Where::eq('codalmacen', $codalmacen),
Expand All @@ -142,18 +146,17 @@ protected static function calculateStockData(string $codalmacen): array
$lastMovement->loadWhere($where, ['fecha' => 'DESC', 'hora' => 'DESC', 'id' => 'DESC']);

$ref = trim($row['referencia']);
$stockData[$ref] = [
'cantidad' => $lastMovement->saldo,
'codalmacen' => $codalmacen,
'pterecibir' => 0,
'referencia' => $ref,
'reservada' => 0
];
if (!isset($stockData[$ref])) {
$stockData[$ref] = [
'codalmacen' => $codalmacen,
'pterecibir' => 0,
'referencia' => $ref,
'reservada' => 0
];
}
$stockData[$ref]['cantidad'] = $lastMovement->saldo;
}

static::setPterecibir($stockData, $codalmacen);
static::setReservada($stockData, $codalmacen);

return $stockData;
}

Expand All @@ -171,17 +174,59 @@ public static function setIdProducto(?int $idproducto): void
static::$idproducto = $idproducto;
}

/**
* Calcula las cantidades pendientes de recibir para un almacén
* para cada tipo de documento de proveedor.
*
* @param array $stockData
* @param string $codalmacen
* @return void
* @throws KernelException
*/
protected static function setPterecibir(array &$stockData, string $codalmacen): void
{
if (false === static::db()->tableExists('lineaspedidosprov')) {
static::applyPteRecibirFromTable($stockData, $codalmacen, 'pedidosprov', 'idpedido');
static::applyPteRecibirFromTable($stockData, $codalmacen, 'albaranesprov', 'idalbaran');
static::applyPteRecibirFromTable($stockData, $codalmacen, 'facturasprov', 'idfactura');
}

/**
* Calcula las cantidades reservadas para un almacén
* para cada tipo de documento de cliente.
*
* @param array $stockData
* @param string $codalmacen
* @return void
* @throws KernelException
*/
protected static function setReservada(array &$stockData, string $codalmacen): void
{
static::applyReservadaFromTable($stockData, $codalmacen, 'pedidoscli', 'idpedido');
static::applyReservadaFromTable($stockData, $codalmacen, 'albaranescli', 'idalbaran');
static::applyReservadaFromTable($stockData, $codalmacen, 'facturascli', 'idfactura');
}

/**
* Aplica las cantidades pendientes de recibir desde una tabla específica
*
* @param array $stockData
* @param string $codalmacen
* @param string $table
* @param string $field
* @return void
* @throws KernelException
*/
private static function applyPteRecibirFromTable(array &$stockData, string $codalmacen, string $table, string $field): void
{
$linesTable = 'lineas' . $table;
if (false === static::db()->tableExists($linesTable)) {
return;
}

$sql = "SELECT l.referencia,"
. " SUM(CASE WHEN l.cantidad > l.servido THEN l.cantidad - l.servido ELSE 0 END) as pte"
. " FROM lineaspedidosprov l"
. " JOIN pedidosprov p ON l.idpedido = p.idpedido"
. " JOIN variantes v ON v.referencia = l.referencia"
. " FROM {$linesTable} l"
. " JOIN {$table} p ON p.{$field} = l.{$field}"
. " WHERE l.referencia IS NOT NULL";

if (null !== static::$idproducto) {
Expand All @@ -191,32 +236,44 @@ protected static function setPterecibir(array &$stockData, string $codalmacen):
$sql .= " AND l.actualizastock = '2'"
. " AND p.codalmacen = " . static::db()->var2str($codalmacen)
. " GROUP BY 1;";

foreach (static::db()->select($sql) as $row) {
$ref = trim($row['referencia']);
if (!isset($stockData[$ref])) {
$stockData[$ref] = [
'cantidad' => 0,
'codalmacen' => $codalmacen,
'referencia' => $ref,
'reservada' => 0
'reservada' => 0,
'pterecibir' => 0,
];
}

$stockData[$ref]['pterecibir'] = (float)$row['pte'];
$stockData[$ref]['pterecibir'] += (float)$row['pte'];
}
}

protected static function setReservada(array &$stockData, string $codalmacen): void
/**
* Aplica las cantidades reservadas desde una tabla específica
*
* @param array $stockData
* @param string $codalmacen
* @param string $table
* @param string $field
* @return void
* @throws KernelException
*/
private static function applyReservadaFromTable(array &$stockData, string $codalmacen, string $table, string $field): void
{
if (false === static::db()->tableExists('lineaspedidoscli')) {
$linesTable = 'lineas' . $table;
if (false === static::db()->tableExists($linesTable)) {
return;
}

$sql = "SELECT l.referencia,"
. " SUM(CASE WHEN l.cantidad > l.servido THEN l.cantidad - l.servido ELSE 0 END) as reservada"
. " FROM lineaspedidoscli l"
. " JOIN pedidoscli p ON l.idpedido = p.idpedido"
. " JOIN variantes v ON v.referencia = l.referencia"
. " FROM {$linesTable} l"
. " JOIN {$table} p ON p.{$field} = l.{$field}"
. " WHERE l.referencia IS NOT NULL";

if (null !== static::$idproducto) {
Expand All @@ -226,18 +283,20 @@ protected static function setReservada(array &$stockData, string $codalmacen): v
$sql .= " AND l.actualizastock = '-2'"
. " AND p.codalmacen = " . static::db()->var2str($codalmacen)
. " GROUP BY 1;";

foreach (static::db()->select($sql) as $row) {
$ref = trim($row['referencia']);
if (!isset($stockData[$ref])) {
$stockData[$ref] = [
'cantidad' => 0,
'codalmacen' => $codalmacen,
'pterecibir' => 0,
'referencia' => $ref
'referencia' => $ref,
'reservada' => 0,
];
}

$stockData[$ref]['reservada'] = (float)$row['reservada'];
$stockData[$ref]['reservada'] += (float)$row['reservada'];
}
}
}