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