DP_Stock v3: sin COALESCE ni subconsultas (el analizador del Service Layer no los admite)
Suma OpenInvQty con JOIN + GROUP BY. Sin consignación no hay fila, y la nueva consulta DP_Articulo distingue artículo existente (0) de inexistente. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
cd748bb4ef
commit
67a80e18db
4 files changed
+59
-27
No files matched your search
@@ -29,7 +29,7 @@ import {
|
||||
import { CatalogosService } from '../catalogos/catalogos.service.js';
|
||||
import { ServiceLayerClient, ServiceLayerException } from '../service-layer/service-layer.client.js';
|
||||
import type { SapSession } from '../service-layer/session.store.js';
|
||||
import { CONSULTA_ENTRADAS_ABIERTAS, CONSULTA_STOCK } from '../sql-queries/sql-queries.definitions.js';
|
||||
import { CONSULTA_ARTICULO, CONSULTA_ENTRADAS_ABIERTAS, CONSULTA_STOCK } from '../sql-queries/sql-queries.definitions.js';
|
||||
import { SqlQueriesService } from '../sql-queries/sql-queries.service.js';
|
||||
import type { ProcesarDto } from './dto/planificaciones.dto.js';
|
||||
import { cabeceraAUdo, lineaAUdo, planificacionDesdeUdo } from './udo.mapper.js';
|
||||
@@ -38,7 +38,8 @@ import type { UdoSl } from './udo.mapper.js';
|
||||
interface FilaStock {
|
||||
ItemCode: string;
|
||||
ItemName: string | null;
|
||||
OnHand: number | string;
|
||||
/** Ausente cuando la fila viene de DP_Articulo (sin consignación). */
|
||||
OnHand?: number | string;
|
||||
}
|
||||
|
||||
interface FilaEntrada {
|
||||
@@ -100,21 +101,24 @@ export class PlanificacionesService {
|
||||
const { filas, errores } = parsearPortapapeles(texto);
|
||||
const lineas = [];
|
||||
|
||||
const consultas = await enLotes(filas, CONCURRENCIA_CONSULTAS, async (fila) => ({
|
||||
fila,
|
||||
stock: (await this.sql.consultar<FilaStock>(sesion, CONSULTA_STOCK, { whs: whsCode, item: fila.itemCode }))[0],
|
||||
}));
|
||||
const consultas = await enLotes(filas, CONCURRENCIA_CONSULTAS, async (fila) => {
|
||||
const params = { whs: whsCode, item: fila.itemCode };
|
||||
const stock = (await this.sql.consultar<FilaStock>(sesion, CONSULTA_STOCK, params))[0];
|
||||
// Sin consignación abierta no hay fila: el artículo puede existir con 0 o no existir.
|
||||
const articulo = stock ?? (await this.sql.consultar<FilaStock>(sesion, CONSULTA_ARTICULO, { item: fila.itemCode }))[0];
|
||||
return { fila, articulo };
|
||||
});
|
||||
|
||||
for (const { fila, stock } of consultas) {
|
||||
if (!stock) {
|
||||
for (const { fila, articulo: datos } of consultas) {
|
||||
if (!datos) {
|
||||
errores.push(`${fila.itemCode}: el artículo no existe.`);
|
||||
continue;
|
||||
}
|
||||
const articulo: ArticuloADevolver = {
|
||||
itemCode: stock.ItemCode,
|
||||
itemName: stock.ItemName ?? '',
|
||||
itemCode: datos.ItemCode,
|
||||
itemName: datos.ItemName ?? '',
|
||||
quantity: fila.quantity,
|
||||
onHand: Math.floor(Number(stock.OnHand)),
|
||||
onHand: Math.floor(Number(datos.OnHand ?? 0)),
|
||||
};
|
||||
lineas.push(crearLineaPadre(articulo));
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user