2121
2222use FacturaScripts \Core \Base \DataBase ;
2323use FacturaScripts \Core \DataSrc \Almacenes ;
24+ use FacturaScripts \Core \KernelException ;
2425use FacturaScripts \Core \Tools ;
2526use FacturaScripts \Core \Where ;
2627use 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