Files
MBS/WEBSERVICES/ordenes_insert.4gl
T

182 lines
6.9 KiB
Plaintext

IMPORT util
IMPORT security
FUNCTION orden_insert(xorden)
DEFINE
i SMALLINT,
xorden STRING,
ximpresor, xcopia SMALLINT,
xtipoOrden VARCHAR(30),
estado BOOLEAN,
pbodega INT
DEFINE data RECORD
generales RECORD
usuario VARCHAR(50),
clave VARCHAR(50),
cotizacion_no INT,
orden_cliente STRING,
comentario_adicional VARCHAR(100),
nosolicitud VARCHAR(200)
END RECORD,
archivos DYNAMIC ARRAY OF RECORD
tipo_file VARCHAR(3),
contenido STRING,
nombre_arch STRING
END RECORD
END RECORD
DEFINE
r_out RECORD
orden INT,
mensaje_out STRING,
cod_msg INT
END RECORD,
archivos DYNAMIC ARRAY OF RECORD
tipo_file VARCHAR(3),
contenido STRING,
nombre_arch STRING
END RECORD,
id_file, cuentaInstalacion SMALLINT
# LOCATE data.archivos.imagen IN MEMORY
CALL util.JSON.parse(xorden, data)
WHENEVER ANY ERROR CONTINUE
DISPLAY "DATOS orden_insert ", data.generales.cotizacion_no
CONNECT TO "smarmotech"
USER data.generales.usuario USING data.generales.clave
IF STATUS < 0 THEN
# Posible conexion "smarmotech" que quedo colgada de un request anterior
# (proceso servidor unico). La cierro y reintento una sola vez.
DISCONNECT ALL
CONNECT TO "smarmotech"
USER data.generales.usuario USING data.generales.clave
END IF
IF STATUS < 0 THEN
LET r_out.cod_msg = STATUS
LET r_out.orden = 0
LET r_out.mensaje_out =
'ERROR CONECTANDOSE A LA BASE DE DATOS: ', err_get(STATUS)
DISCONNECT CURRENT
RETURN util.JSON.stringify(r_out)
END IF
# Valida que el CRM haya enviado el numero de cotizacion en el JSON.
# Sin esto, los SELECT de abajo dan NOTFOUND y se responde el mensaje
# enganoso "COTIZACION SIN LUGAR DE ENTREGA".
IF data.generales.cotizacion_no IS NULL
OR data.generales.cotizacion_no = 0 THEN
LET r_out.cod_msg = 400
LET r_out.orden = 0
LET r_out.mensaje_out =
'NO SE RECIBIO EL NUMERO DE COTIZACION EN EL JSON (generales.cotizacion_no)'
DISPLAY "orden_insert: cotizacion_no vacio en el request"
DISCONNECT CURRENT
RETURN util.JSON.stringify(r_out)
END IF
SELECT a.num_oc
FROM prtb00012 a
WHERE a.cotizacion_no = data.generales.cotizacion_no
AND a.status_t IS NULL
IF STATUS <> NOTFOUND THEN
LET r_out.cod_msg = -10
LET r_out.orden = 0
LET r_out.mensaje_out = 'COTIZACION TIENE ORDEN DE PEDIDOS'
DISCONNECT CURRENT
DISPLAY "data orden ", data.archivos.getLength()
RETURN util.JSON.stringify(r_out)
ELSE
SELECT a.printerdefecto, a.otro_printer
INTO ximpresor, xcopia
FROM seg0001 a
WHERE a.usuario = data.generales.usuario
LET xtipoOrden = 'GENERAL'
LET archivos = data.archivos
SELECT a.bodega
INTO pbodega
FROM vetb00050 a
WHERE a.cotizacion_no = data.generales.cotizacion_no
# Distinguir "la cotizacion no existe" de "existe pero sin bodega".
IF STATUS = NOTFOUND THEN
LET r_out.cod_msg = 400
LET r_out.orden = 0
LET r_out.mensaje_out =
SFMT("LA COTIZACION %1 NO EXISTE EN VENTAS (vetb00050). Verifique el numero enviado por el CRM.",
data.generales.cotizacion_no)
DISPLAY "orden_insert: cotizacion inexistente ",
data.generales.cotizacion_no
DISCONNECT CURRENT
RETURN util.JSON.stringify(r_out)
END IF
IF pbodega IS NULL THEN
LET r_out.cod_msg = 400
LET r_out.orden = 0
LET r_out.mensaje_out =
SFMT("LA COTIZACION %1 NO TIENE BODEGA / LUGAR DE ENTREGA ASIGNADO.",
data.generales.cotizacion_no)
DISPLAY "orden_insert: sin bodega ", data.generales.cotizacion_no
DISCONNECT CURRENT
RETURN util.JSON.stringify(r_out)
END IF
# VERIFICA SI TIENE ITEM DE INSTALACION (cod_n = 12).
# OJO: cod_n esta en el DETALLE vetb00051, NO en vetb00050. El query
# anterior apuntaba a vetb00050 (columna inexistente) y reventaba en
# CADA cotizacion -> STATUS negativo -> devolvia el error a todas.
LET cuentaInstalacion = NULL
SELECT DISTINCT a.cod_n
INTO cuentaInstalacion
FROM vetb00051 a
WHERE a.cotizacion_no = data.generales.cotizacion_no
AND a.cod_n = 12
# Si tiene instalacion y el vendedor NO envio el numero de solicitud,
# se rechaza para que lo coloque en la orden.
IF cuentaInstalacion = 12 THEN
IF data.generales.nosolicitud IS NULL
OR LENGTH(data.generales.nosolicitud CLIPPED) = 0 THEN
LET r_out.cod_msg = 400
LET r_out.orden = 0
LET r_out.mensaje_out =
SFMT("LA COTIZACION %1 TIENE INSTALACION (cod_n=12): debe enviar el numero de solicitud.",
data.generales.cotizacion_no)
DISPLAY "orden_insert: falta nosolicitud (cod_n=12) ",
data.generales.cotizacion_no
DISCONNECT CURRENT
RETURN util.JSON.stringify(r_out)
END IF
END IF
CALL convierteorden(
data.generales.cotizacion_no,
data.generales.orden_cliente,
data.generales.usuario,
data.generales.clave,
ximpresor,
xcopia,
xtipoOrden,
data.generales.comentario_adicional,
data.generales.nosolicitud,
archivos)
RETURNING r_out.orden, estado
# Si convierteorden hizo ROLLBACK (estado=FALSE) NO reportar exito al CRM:
# devolver el motivo especifico para que el CRM lo muestre.
IF NOT estado THEN
LET r_out.cod_msg = 400
LET r_out.orden = 0
LET r_out.mensaje_out = convierte_error()
IF r_out.mensaje_out IS NULL OR LENGTH(r_out.mensaje_out) = 0 THEN
LET r_out.mensaje_out =
'NO SE PUDO CONVERTIR LA COTIZACION EN ORDEN (error en base de datos, se revirtio la transaccion)'
END IF
DISCONNECT CURRENT
RETURN util.JSON.stringify(r_out)
END IF
END IF
LET r_out.cod_msg = 13
LET r_out.mensaje_out = 'ADICION EXITOSA'
DISCONNECT CURRENT
RETURN util.JSON.stringify(r_out)
END FUNCTION