Skip to content

Commit ebf04c0

Browse files
authored
Merge pull request #37 from Yopli2k/rebuild-pdte
Aplica el calculo para cada tipo de documento
2 parents bb0e073 + 3575711 commit ebf04c0

1 file changed

Lines changed: 84 additions & 25 deletions

File tree

Lib/StockRebuildManager.php

Lines changed: 84 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
use FacturaScripts\Core\Base\DataBase;
2323
use FacturaScripts\Core\DataSrc\Almacenes;
24+
use FacturaScripts\Core\KernelException;
2425
use FacturaScripts\Core\Tools;
2526
use FacturaScripts\Core\Where;
2627
use FacturaScripts\Dinamic\Model\MovimientoStock;
@@ -115,6 +116,10 @@ protected static function clear(): void
115116

116117
protected static function calculateStockData(string $codalmacen): array
117118
{
119+
$stockData = [];
120+
static::setPterecibir($stockData, $codalmacen);
121+
static::setReservada($stockData, $codalmacen);
122+
118123
// obtenemos un array de referencias únicas
119124
$sql = "SELECT referencia"
120125
. " FROM stocks_movimientos"
@@ -127,10 +132,9 @@ protected static function calculateStockData(string $codalmacen): array
127132

128133
// si no hay referencias, devolvemos array vacío
129134
if (empty($rows)) {
130-
return [];
135+
return $stockData;
131136
}
132137

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

144148
$ref = trim($row['referencia']);
145-
$stockData[$ref] = [
146-
'cantidad' => $lastMovement->saldo,
147-
'codalmacen' => $codalmacen,
148-
'pterecibir' => 0,
149-
'referencia' => $ref,
150-
'reservada' => 0
151-
];
149+
if (!isset($stockData[$ref])) {
150+
$stockData[$ref] = [
151+
'codalmacen' => $codalmacen,
152+
'pterecibir' => 0,
153+
'referencia' => $ref,
154+
'reservada' => 0
155+
];
156+
}
157+
$stockData[$ref]['cantidad'] = $lastMovement->saldo;
152158
}
153159

154-
static::setPterecibir($stockData, $codalmacen);
155-
static::setReservada($stockData, $codalmacen);
156-
157160
return $stockData;
158161
}
159162

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

177+
/**
178+
* Calcula las cantidades pendientes de recibir para un almacén
179+
* para cada tipo de documento de proveedor.
180+
*
181+
* @param array $stockData
182+
* @param string $codalmacen
183+
* @return void
184+
* @throws KernelException
185+
*/
174186
protected static function setPterecibir(array &$stockData, string $codalmacen): void
175187
{
176-
if (false === static::db()->tableExists('lineaspedidosprov')) {
188+
static::applyPteRecibirFromTable($stockData, $codalmacen, 'pedidosprov', 'idpedido');
189+
static::applyPteRecibirFromTable($stockData, $codalmacen, 'albaranesprov', 'idalbaran');
190+
static::applyPteRecibirFromTable($stockData, $codalmacen, 'facturasprov', 'idfactura');
191+
}
192+
193+
/**
194+
* Calcula las cantidades reservadas para un almacén
195+
* para cada tipo de documento de cliente.
196+
*
197+
* @param array $stockData
198+
* @param string $codalmacen
199+
* @return void
200+
* @throws KernelException
201+
*/
202+
protected static function setReservada(array &$stockData, string $codalmacen): void
203+
{
204+
static::applyReservadaFromTable($stockData, $codalmacen, 'pedidoscli', 'idpedido');
205+
static::applyReservadaFromTable($stockData, $codalmacen, 'albaranescli', 'idalbaran');
206+
static::applyReservadaFromTable($stockData, $codalmacen, 'facturascli', 'idfactura');
207+
}
208+
209+
/**
210+
* Aplica las cantidades pendientes de recibir desde una tabla específica
211+
*
212+
* @param array $stockData
213+
* @param string $codalmacen
214+
* @param string $table
215+
* @param string $field
216+
* @return void
217+
* @throws KernelException
218+
*/
219+
private static function applyPteRecibirFromTable(array &$stockData, string $codalmacen, string $table, string $field): void
220+
{
221+
$linesTable = 'lineas' . $table;
222+
if (false === static::db()->tableExists($linesTable)) {
177223
return;
178224
}
179225

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

187232
if (null !== static::$idproducto) {
@@ -191,32 +236,44 @@ protected static function setPterecibir(array &$stockData, string $codalmacen):
191236
$sql .= " AND l.actualizastock = '2'"
192237
. " AND p.codalmacen = " . static::db()->var2str($codalmacen)
193238
. " GROUP BY 1;";
239+
194240
foreach (static::db()->select($sql) as $row) {
195241
$ref = trim($row['referencia']);
196242
if (!isset($stockData[$ref])) {
197243
$stockData[$ref] = [
198244
'cantidad' => 0,
199245
'codalmacen' => $codalmacen,
200246
'referencia' => $ref,
201-
'reservada' => 0
247+
'reservada' => 0,
248+
'pterecibir' => 0,
202249
];
203250
}
204251

205-
$stockData[$ref]['pterecibir'] = (float)$row['pte'];
252+
$stockData[$ref]['pterecibir'] += (float)$row['pte'];
206253
}
207254
}
208255

209-
protected static function setReservada(array &$stockData, string $codalmacen): void
256+
/**
257+
* Aplica las cantidades reservadas desde una tabla específica
258+
*
259+
* @param array $stockData
260+
* @param string $codalmacen
261+
* @param string $table
262+
* @param string $field
263+
* @return void
264+
* @throws KernelException
265+
*/
266+
private static function applyReservadaFromTable(array &$stockData, string $codalmacen, string $table, string $field): void
210267
{
211-
if (false === static::db()->tableExists('lineaspedidoscli')) {
268+
$linesTable = 'lineas' . $table;
269+
if (false === static::db()->tableExists($linesTable)) {
212270
return;
213271
}
214272

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

222279
if (null !== static::$idproducto) {
@@ -226,18 +283,20 @@ protected static function setReservada(array &$stockData, string $codalmacen): v
226283
$sql .= " AND l.actualizastock = '-2'"
227284
. " AND p.codalmacen = " . static::db()->var2str($codalmacen)
228285
. " GROUP BY 1;";
286+
229287
foreach (static::db()->select($sql) as $row) {
230288
$ref = trim($row['referencia']);
231289
if (!isset($stockData[$ref])) {
232290
$stockData[$ref] = [
233291
'cantidad' => 0,
234292
'codalmacen' => $codalmacen,
235293
'pterecibir' => 0,
236-
'referencia' => $ref
294+
'referencia' => $ref,
295+
'reservada' => 0,
237296
];
238297
}
239298

240-
$stockData[$ref]['reservada'] = (float)$row['reservada'];
299+
$stockData[$ref]['reservada'] += (float)$row['reservada'];
241300
}
242301
}
243302
}

0 commit comments

Comments
 (0)