Files
MBS/WEBSERVICES/orden_cocinas.4gl

209 lines
6.5 KiB
Plaintext

IMPORT util
-- Tipos reutilizables para evitar duplicar la definición de campos
TYPE t_master RECORD
ventas CHAR(1),
cotizacion_no INT,
num_oc INT,
fecha_oc DATE,
orden_compra CHAR(15),
sec_vend SMALLINT,
nombreVendedor VARCHAR(100),
tipo_cliente SMALLINT,
sec_cliente SMALLINT,
cliente VARCHAR(100),
direccion CHAR(80),
telefono CHAR(20),
fax CHAR(20),
fecha_entrega DATE,
cond_pago SMALLINT,
cantidad_i DEC(8, 2),
precio_i DEC(8, 2),
cantidad_mo DEC(10, 2),
precio_mo DEC(10, 2),
transporte DEC(10, 2),
itbis DEC(10, 2),
ubicacion VARCHAR(170),
estado_orden CHAR(10),
fecha_cierre DATE,
observacion VARCHAR(100),
nombre_file2 VARCHAR(100)
END RECORD
TYPE t_detalle RECORD
num_oc INT,
secuencia SMALLINT,
area SMALLINT,
cod_n SMALLINT,
cod_grupo SMALLINT,
cod_tipo SMALLINT,
cod_sec SMALLINT,
descripcion VARCHAR(100),
precio DEC(10, 2),
cantidad_1 DEC(12, 4),
cantidad DEC(12, 5),
descuento DEC(10, 2),
fecha_compromiso DATE,
estado_produccion VARCHAR(20),
observacion VARCHAR(100),
id_kit INT
END RECORD
FUNCTION ordenesCocinas(data)
DEFINE
i SMALLINT,
idx SMALLINT,
data STRING
DEFINE credenciales RECORD
usuario VARCHAR(50),
clave VARCHAR(50),
orden INT
END RECORD
-- Estructura de salida: ORDEN { master, [detalle] }
DEFINE o RECORD
ordenes DYNAMIC ARRAY OF RECORD
master t_master,
detalle DYNAMIC ARRAY OF t_detalle
END RECORD,
menajes RECORD
cod_msg INT,
descripcion STRING
END RECORD
END RECORD
-- Registros temporales donde cae cada FETCH antes de copiarlo al arreglo
DEFINE orden_master t_master
DEFINE orden_detalle t_detalle
DEFINE v_num_oc INT
CALL util.JSON.parse(data, credenciales)
DISPLAY "USUARIO ", credenciales.usuario, " clave ", credenciales.clave
CONNECT TO "smarmotech" USER credenciales.usuario USING credenciales.clave
IF STATUS < 0 THEN
LET o.menajes.cod_msg = 400
LET o.menajes.descripcion = "USUARIO NO VALIDO ", SQLCA.SQLERRM
DISCONNECT CURRENT
RETURN util.JSON.stringify(o)
END IF
DISPLAY "DATOS: ", credenciales.orden
-- Cursor maestro: una fila por orden de cocina (cod_n = 52)
-- NOTA: aqui van 25 columnas para 25 campos del maestro.
-- En tu version original habia un a.num_oc repetido al final
-- (26 columnas vs 25 campos), que lo quite.
DECLARE buscaOrden CURSOR FOR
SELECT DISTINCT
a.ventas,
a.cotizacion_no,
a.num_oc,
a.fecha_oc,
RTRIM(a.nombre_file),
a.sec_vend,
RTRIM(c.nom1_emp) || ' '|| RTRIM(c.apell1_emp),
a.tipo_cliente,
a.sec_cliente,
RTRIM(d.nombre),
RTRIM(a.direccion),
a.telefono,
a.fax,
a.fecha_entrega,
ISNULL(a.cond_pago, 0),
ISNULL(a.cantidad_i, 0),
ISNULL(a.precio_i, 0),
ISNULL(a.cantidad_mo, 0),
ISNULL(a.precio_mo, 0),
a.transporte,
a.itbis,
RTRIM(a.ubicacion),
a.cerrada,
a.fecha_cierre,
a.observacion,
a.nombre_file2
FROM prtb00012 a
INNER JOIN adtb00003 c ON c.num_emp = a.sec_vend
INNER JOIN prtb00013 k ON k.num_oc = a.num_oc,
vetb00004 d
WHERE k.cod_n IN (52,56,40,43)
AND a.cerrada = 'N'
AND a.tipo_cliente = d.tipo_cliente
AND a.sec_cliente = d.sec_cliente
AND a.status_t IS NULL
-- Cursor de detalle: items de UNA sola orden, parametrizado por v_num_oc.
-- Se declara una sola vez; el valor de v_num_oc se lee al abrir el FOREACH.
DECLARE u27 CURSOR FOR
SELECT
b.num_oc,
b.secuencia,
b.area,
b.cod_n,
b.cod_grupo,
b.cod_tipo,
b.cod_sec,
RTRIM(k.descrip_esp),
b.precio,
b.cantidad,
c.cantidad_1,
b.descuento,
b.fecha_compromiso,
b.estado_produccion,
b.observacion,
b.id_kit
FROM prtb00012 a,
prtb00013 b
INNER JOIN iptb00002 k
ON k.cod_n = b.cod_n
AND k.cod_grupo = b.cod_grupo
AND k.cod_tipo = b.cod_tipo
AND k.cod_sec = b.cod_sec,
prtb00023 c
WHERE a.num_oc = b.num_oc
AND b.num_oc = v_num_oc
AND b.num_oc = c.num_oc
AND a.cerrada = 'N'
AND b.cod_n = c.cod_n
AND b.cod_grupo = c.cod_grupo
AND b.cod_tipo = c.cod_tipo
AND b.cod_sec = c.cod_sec
AND a.status_t IS NULL
LET idx = 0
CALL o.ordenes.clear()
FOREACH buscaOrden INTO orden_master.*
LET idx = idx + 1
-- Estado de la orden
IF orden_master.estado_orden = 'N' THEN
LET orden_master.estado_orden = 'ABIERTA'
ELSE
LET orden_master.estado_orden = 'CERRADA'
END IF
-- Copio el maestro a su posicion en el arreglo de ordenes
LET o.ordenes[idx].master.* = orden_master.*
-- Parametro para traer el detalle de ESTA orden
LET v_num_oc = orden_master.num_oc
-- Detalle anidado dentro de la orden actual
LET i = 0
FOREACH u27 INTO orden_detalle.*
LET i = i + 1
LET o.ordenes[idx].detalle[i].* = orden_detalle.*
END FOREACH
END FOREACH
FREE u27
FREE buscaOrden
DISCONNECT CURRENT
LET o.menajes.cod_msg = 200
LET o.menajes.descripcion = 'OPERACION EXITOSA'
RETURN util.JSON.stringify(o)
END FUNCTION