182 lines
6.9 KiB
Plaintext
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
|