create or replace FUNCTION LLEVAR_KARDEX ( -- -- NUEVOS PARAMETROS -- CONTROL_BODEGA IN VARCHAR2, CONTROL_BODEGA2 IN VARCHAR2, GLOBAL_EMPRESA IN VARCHAR2, GLOBAL_USUARIO_SP6 IN VARCHAR2, CONTROL_C_COS IN VARCHAR2, CONTROL_FECHA_RECIBIDO IN VARCHAR2, CONTROL_C_CLA IN VARCHAR2, CONTROL_N_IDE IN VARCHAR2, CONTROL_C_CTA_PUENTE IN VARCHAR2, CONTROL_VAL_PARAM1 IN VARCHAR2, CONTROL_PARAM1 IN VARCHAR2, CONTROL_PARAM2 IN VARCHAR2, CONTROL_VAL_PARAM2 IN VARCHAR2, CONTROL_PARAM3 IN VARCHAR2, CONTROL_VAL_PARAM3 IN VARCHAR2, CONTROL_OPE IN VARCHAR2) RETURN VARCHAR2 IS RETORNO VARCHAR2(200); -- -- SE PASAN SOLO REGISTROS QUE SEAN DE LA BODEGA Y ADEMAS NO SEAN DE RECIBO DE -- MEDICAMENTO (RM) -- EL ESTADO A CONTROL QUE SE PASEN SOLO AQUELLOS QUE NO SE HAN PASADO -- Y AQUELLOS QUE NO SE HAN ANULADO -- CURSOR KK IS SELECT BOD,COD,FECHA,HORA, CAN,FUE,N_FUE,OPE,LOTE,ESTADO FROM PE_KARDEX WHERE BOD=CONTROL_BODEGA AND FUE<>'RM' AND ESTADO='A' AND OPE=CONTROL_OPE ORDER BY COD,TO_CHAR(FECHA,'YYYYMMDD'),TO_CHAR(HORA,'YYYYMMDD HH24:MI:SS'); -- A KK%ROWTYPE; -- UNIDAD_PE ARTICULO.UNI%TYPE; UNIDAD_CEN ARTICULO.UNI%TYPE; FACT FACTOR.FAC%TYPE; COSTO_UNI COSTO_ART.C_PPO%TYPE; HUBO_ERROR EXCEPTION; SALTO_LOOP EXCEPTION; XCOSTO_ART COSTO_ART.C_PPO%TYPE; CERR NUMBER(4); MERR VARCHAR2(2000); XMON MONEDA.MON%TYPE; XN_FUE KARDEX.N_FUE%TYPE; NUM_CPTE CPTE_ENC.CPTE%TYPE; CUENTA_INV PLAN_CTA.C_CTA%TYPE; CUENTA_CONT PLAN_CTA.C_CTA%TYPE; XREQ1 CPTE_DET.REQ1%TYPE; XREQ2 CPTE_DET.REQ3%TYPE; XREQ3 CPTE_DET.REQ3%TYPE; XREQ4 CPTE_DET.REQ4%TYPE; XC_COS CPTE_DET.C_COS%TYPE; XSEQ CPTE_DET.SEQ%TYPE; TOTAL_CPTE CPTE_ENC.TOTDEB%TYPE; CONTROL_FECHA DATE; N_FUE_CRUCE VARCHAR2(2000); NUMERROR NUMBER; CONTER NUMBER; CONTER2 NUMBER; BEGIN CONTROL_FECHA := TO_DATE(CONTROL_FECHA_RECIBIDO); NUMERROR:=0; CONTER:=0; CONTER2:=0; -- -- NOS TRAEMOS LA MONEDA POR DEFECTO... -- BEGIN SELECT MON INTO XMON FROM MONEDA WHERE C_EMP=GLOBAL_EMPRESA AND M_DEFAULT='S'; EXCEPTION WHEN OTHERS THEN CERR:=1; MERR:='Problemas al traer la moneda por defecto. '||SQLERRM; RETURN MERR; RAISE HUBO_ERROR; END; -- FIN CONSULTA MONEDA OPEN KK; LOOP FETCH KK INTO A; EXIT WHEN KK%NOTFOUND; -- Último registro. -------------------------------- BEGIN -- -- LA UNIDAD QUE SE TRAE ES LA UNIDAD ALTERNA DEL ARTICULO -- BEGIN SELECT VAL_DEF INTO UNIDAD_PE FROM ART_ATRIB WHERE C_EMP=GLOBAL_EMPRESA AND COD_ART=A.COD AND COD_ATR='UALT'; EXCEPTION WHEN NO_DATA_FOUND THEN MERR:='No se encontró el codigo del articulo : '||A.cod; RAISE SALTO_LOOP; END; -- INICIO KJM -- SE BUSCA UNIDAD ORIGINAL DEL ARTICULO BEGIN SELECT UNI INTO UNIDAD_CEN FROM ARTICULO WHERE C_EMP=GLOBAL_EMPRESA AND COD=A.COD; EXCEPTION WHEN NO_DATA_FOUND THEN MERR:='No se encontró La Unidad del Articulo : '||A.cod; RAISE SALTO_LOOP; END; -- FIN KJM -- -- AHORA NOS TRAEMOS EL COSTO DEL ARTICULO -- XCOSTO_ART:=INVTRAECOSTO(GLOBAL_EMPRESA,CONTROL_BODEGA,TO_CHAR(A.FECHA,'YYYYMM'),A.COD,CERR,MERR); IF CERR<>0 THEN MERR:='Error al momento de traer el costo del articulo '||sqlerrm; RAISE SALTO_LOOP; END IF; -- INICIO KJM IF(UNIDAD_PE<>UNIDAD_CEN)THEN BEGIN SELECT FAC INTO FACT FROM FACTOR WHERE C_EMP=GLOBAL_EMPRESA AND UNI1=UNIDAD_CEN AND UNI2=UNIDAD_PE; EXCEPTION WHEN NO_DATA_FOUND THEN MERR:='No se encontró El Factor De Conversión de la Unidad : '||UNIDAD_CEN ||' A La Unidad : '||UNIDAD_PE; RAISE SALTO_LOOP; END; IF(FACT = 0)THEN FACT:=1; END IF; COSTO_UNI:=XCOSTO_ART/FACT; ELSE --SI LA UNIDAD DEFINIDA EN LA TABLA ARTI ES IGUAL A LA UNIDAD ALTERNA COSTO_UNI:=XCOSTO_ART; END IF; --FIN KJM -- -- POR ULTIMO SE INSERTA EN KARDEX -- BEGIN XN_FUE:=CONSECINV(GLOBAL_EMPRESA,A.FUE,TO_CHAR(A.FECHA,'YYYYMM'),CONTROL_BODEGA); EXCEPTION WHEN OTHERS THEN MERR:='Problemas al traer el consecutivo de el fuente : '||A.FUE||'. Mensaje de Error : '||sqlerrm; RAISE SALTO_LOOP; END; BEGIN INSERT INTO KARDEX (C_EMP,BOD,PER, COD,OPE,CAN, UNI,P_ENT,M_ENT, P_SAL,M_SAL,TAS, FEC,FUE, N_FUE,OBSER,RESP, SEC,BOD2,LOTE,C_ARE, HORA,AQ_APL,N_APL) VALUES (GLOBAL_EMPRESA,CONTROL_BODEGA,TO_CHAR(A.FECHA,'YYYYMM'), A.COD,A.OPE,A.CAN, UNIDAD_PE,DECODE(A.OPE,'E',COSTO_UNI,'S',NULL),DECODE(A.OPE,'E',XMON,'S',NULL), DECODE(A.OPE,'S',COSTO_UNI,'E',NULL),DECODE(A.OPE,'S',XMON,'E',NULL),1, A.FECHA,A.FUE, XN_FUE,'KARDEX DE PUNTO DE ENTREGA FUENTE '||A.FUE||'. NUMERO ORIGINAL '||A.N_FUE,GLOBAL_USUARIO_SP6, 1,CONTROL_BODEGA2,A.LOTE,CONTROL_C_COS, A.HORA,A.FUE,XN_FUE); EXCEPTION WHEN OTHERS THEN MERR:='Problemas al insertar en kardex. Fuente : '||A.fue||'. Movimiento en el punto de entrega: '||A.n_fue||'. Movimiento a generar en Kardex : '||xn_fue||'. Mensaje de Error : '||SQLERRM; RAISE SALTO_LOOP; END; -- -- GENERAMOS EL COMPROBANTE CONTABLE -- IF NUM_CPTE IS NULL THEN NUM_CPTE:=CONSEC_CONTABLE(GLOBAL_EMPRESA, CONTROL_FECHA_RECIBIDO, CONTROL_C_CLA); BEGIN INSERT INTO CPTE_ENC (C_EMP,PER,C_CLA,CPTE, CLCONS,FEC,DES,EST, RESP,USR,TOTDEB,TOTCRE) VALUES (GLOBAL_EMPRESA,TO_CHAR(CONTROL_FECHA,'YYYYMM'),CONTROL_C_CLA,NUM_CPTE, NUM_CPTE,CONTROL_FECHA,'COMPROBANTE GENERADO PARA EL PUNTO DE ENTREGA : '||CONTROL_BODEGA,'J', GLOBAL_USUARIO_SP6,GLOBAL_USUARIO_SP6,0,0); EXCEPTION WHEN OTHERS THEN RETORNO := 'No se pudo generar el comprobante contable. Mensaje : '||SQLERRM; MERR:=RETORNO; RAISE SALTO_LOOP; --RETURN RETORNO; --DESHACER; --RAISE FORM_TRIGGER_FAILURE; END; END IF; CERR:=0; CUENTAS (A.COD, CUENTA_INV, CUENTA_CONT, CERR, MERR, -- --NUEVOS PARAMETROS -- GLOBAL_EMPRESA, CONTROL_VAL_PARAM1, CONTROL_PARAM1, CONTROL_PARAM2, CONTROL_VAL_PARAM2, CONTROL_PARAM3, CONTROL_VAL_PARAM3); IF CERR<>0 THEN RETORNO := MERR; --RAISE FORM_TRIGGER_FAILURE; END IF; TOTAL_CPTE:=NVL(TOTAL_CPTE,0)+(A.CAN*COSTO_UNI); IF A.OPE='S' THEN IF (CUENTA_INV IS NOT NULL) AND (CUENTA_CONT IS NOT NULL) THEN ANALIZA_REQS (CUENTA_INV,XN_FUE,A.CAN*COSTO_UNI,CONTROL_N_IDE,XREQ1,XREQ2,XREQ3,XREQ3,XC_COS, -- --NUEVOS PARAMETROS -- CONTROL_C_COS, GLOBAL_EMPRESA); XSEQ:=NVL(XSEQ,0)+1; -- -- SALIDA --> ACREDITA LA CUENTA DE INVENTARIOS -- BEGIN INSERT INTO CPTE_DET (C_EMP,PER,C_CLA,CPTE, SEQ,FEC,C_CTA,C_COS, REQ1,REQ2,REQ3,REQ4, CR,DB,DES) VALUES (GLOBAL_EMPRESA,TO_CHAR(CONTROL_FECHA,'YYYYMM'),CONTROL_C_CLA,NUM_CPTE, XSEQ,CONTROL_FECHA,CUENTA_INV,XC_COS, XREQ1,XREQ2,XREQ3,XREQ4, A.CAN*COSTO_UNI,0,'Bodega : '||CONTROL_BODEGA||'. Movimiento Fuente : '||A.fue||'. Numero : '||xn_fue); EXCEPTION WHEN OTHERS THEN RETORNO := 'Problemas al insertar la cuenta contable. '||SQLERRM; MERR:=RETORNO; RAISE SALTO_LOOP; END; -- -- AHORA SE INSERTA LA CONTRAPARTIDA -- ANALIZA_REQS (CUENTA_CONT,XN_FUE,A.CAN*COSTO_UNI,CONTROL_N_IDE,XREQ1,XREQ2,XREQ3,XREQ3,XC_COS, -- --NUEVOS PARAMETROS -- CONTROL_C_COS, GLOBAL_EMPRESA); XSEQ:=NVL(XSEQ,0)+1; BEGIN INSERT INTO CPTE_DET (C_EMP,PER,C_CLA,CPTE, SEQ,FEC,C_CTA,C_COS, REQ1,REQ2,REQ3,REQ4, CR,DB,DES) VALUES (GLOBAL_EMPRESA,TO_CHAR(CONTROL_FECHA,'YYYYMM'),CONTROL_C_CLA,NUM_CPTE, XSEQ,CONTROL_FECHA,CUENTA_CONT,XC_COS, XREQ1,XREQ2,XREQ3,XREQ4, 0,A.CAN*COSTO_UNI,'Bodega : '||CONTROL_BODEGA||'. Movimiento Fuente : '||A.fue||'. Numero : '||xn_fue); EXCEPTION WHEN OTHERS THEN --MESSAGEBOX ('Problemas al insertar la cuenta contable.'); RETORNO := 'Problemas al insertar la cuenta contable.'; MERR:=RETORNO; RAISE SALTO_LOOP; END; ELSE --MESSAGEBOX ('La cuenta de Inventarios o contrapartida para el codigo : '||Acod||' o su familia, no se ha definido adecuadamente.'); RETORNO := 'La cuenta de Inventarios o contrapartida para el codigo : '||A.cod||' o su familia, no se ha definido adecuadamente.'; END IF; ELSIF A.OPE='E' THEN IF CUENTA_INV IS NOT NULL THEN ANALIZA_REQS(CUENTA_INV,XN_FUE,A.CAN*COSTO_UNI,CONTROL_N_IDE,XREQ1,XREQ2,XREQ3,XREQ4,XC_COS, -- --NUEVOS PARAMETROS -- CONTROL_C_COS, GLOBAL_EMPRESA); XSEQ:=NVL(XSEQ,0)+1; -- -- ENTRADA --> DEBITA LA CUENTA DE INVENTARIOS -- BEGIN INSERT INTO CPTE_DET (C_EMP,PER,C_CLA,CPTE, SEQ,FEC,C_CTA,C_COS, REQ1,REQ2,REQ3,REQ4, CR,DB,DES) VALUES (GLOBAL_EMPRESA,TO_CHAR(CONTROL_FECHA,'YYYYMM'),CONTROL_C_CLA,NUM_CPTE, XSEQ,CONTROL_FECHA,CUENTA_INV,XC_COS, XREQ1,XREQ2,XREQ3,XREQ4, 0,A.CAN*COSTO_UNI,'Bodega : '||CONTROL_BODEGA||'. Movimiento Fuente : '||A.fue||'. Numero : '||xn_fue); EXCEPTION WHEN OTHERS THEN RETORNO := 'Problemas al insertar la cuenta contable en la salida. '||SQLERRM; MERR:=RETORNO; RAISE SALTO_LOOP; END; ANALIZA_REQS(CONTROL_C_CTA_PUENTE,XN_FUE,A.CAN*COSTO_UNI,CONTROL_N_IDE,XREQ1,XREQ2,XREQ3,XREQ4,XC_COS, -- --NUEVOS PARAMETROS -- CONTROL_C_COS, GLOBAL_EMPRESA); XSEQ:=NVL(XSEQ,0)+1; BEGIN INSERT INTO CPTE_DET (C_EMP,PER,C_CLA,CPTE, SEQ,FEC,C_CTA,C_COS, REQ1,REQ2,REQ3,REQ4, CR,DB,DES) VALUES (GLOBAL_EMPRESA,TO_CHAR(CONTROL_FECHA,'YYYYMM'),CONTROL_C_CLA,NUM_CPTE, XSEQ,CONTROL_FECHA,CONTROL_C_CTA_PUENTE,XC_COS, XREQ1,XREQ2,XREQ3,XREQ4, A.CAN*COSTO_UNI,0,'Bodega : '||CONTROL_BODEGA||'. Movimiento Fuente : '||A.fue||'. Numero : '||xn_fue); EXCEPTION WHEN OTHERS THEN RETORNO := 'Problemas al insertar la cuenta contable en la salida. '||SQLERRM; MERR:=RETORNO; RAISE SALTO_LOOP; END; ELSE RETORNO := 'No se ha definido la cuenta de inventarios para el código : '||A.cod; MERR:=RETORNO; RAISE SALTO_LOOP; END IF; END IF; N_FUE_CRUCE := A.N_FUE; -- -- AHORA SE ASIENTA EL REGISTRO GENERADO EN KARDEX -- ACTUALIZAKARDEX(GLOBAL_EMPRESA,CONTROL_BODEGA,TO_CHAR(A.FECHA,'YYYYMM'),A.fue,xn_fue,cerr,merr); IF CERR<>0 THEN MERR:='ACTUALIZA KARDEX . '||MERR; RAISE SALTO_LOOP; END IF; -- -- POR ULTIMO SE ACTUALIZA LA TABLA DE KARDEX CON EL ESTADO P QUE INDICA QUE -- EL REGISTRO YA SE HALLA ASENTADO EN EL SP6 -- BEGIN UPDATE PE_KARDEX SET ESTADO='P' WHERE BOD=CONTROL_BODEGA AND COD=A.COD AND FUE=A.FUE AND N_FUE=A.N_FUE; dbms_output.put_line('PE_KARDEX: '||CONTROL_BODEGA||':.:'||A.COD||':.:'||A.FUE||':.:'||A.N_FUE); EXCEPTION WHEN OTHERS THEN MERR:='Problemas al actualizar el estado en la tabla de movimientos del punto de EntregA '||Sqlerrm; RAISE SALTO_LOOP; END; BEGIN UPDATE RIPSMEDICAMENTOS SET ESTADO = 1 WHERE id_med = A.COD AND punto_id = A.BOD AND lote_id = A.LOTE AND fecha_sol = A.FECHA AND fue = A.FUE AND ope = A.OPE; EXCEPTION WHEN OTHERS THEN dbms_output.put_line('Error al intentar actualizar el estado del medicamento '||A.COD||' en ripsmedicamento '||SQLERRM); END; EXCEPTION WHEN SALTO_LOOP THEN REGISTRAR_ERROR(A.BOD,A.COD,A.FECHA,A.HORA,A.CAN,A.FUE,A.N_FUE,A.OPE,A.LOTE,A.ESTADO,'03','CA',MERR); END; END LOOP; CLOSE KK; -- -- ACUALIZAMOS Y ASENTAMOS EL COMPROBANTE CONTABLE -- IF NVL(XSEQ,0)<>0 THEN BEGIN UPDATE CPTE_ENC SET TOTDEB=TOTAL_CPTE, TOTCRE=TOTAL_CPTE WHERE C_EMP=GLOBAL_EMPRESA AND PER=TO_CHAR(CONTROL_FECHA,'YYYYMM') AND C_CLA=CONTROL_C_CLA AND CPTE=NUM_CPTE; IF SQL%NOTFOUND THEN --MESSAGEBOX ('Comprobante contable no fue generado'); RETORNO := 'Comprobante contable no fue generado'; RETURN RETORNO; END IF; EXCEPTION WHEN OTHERS THEN --MESSAGEBOX ('No se pudo actualizar el comprobante contable. '||SQLERRM); RETORNO := 'No se pudo actualizar el comprobante contable. '||SQLERRM; RETURN RETORNO; --RAISE FORM_TRIGGER_FAILURE; END; CERR:=0; ASIENTOSINCOMMIT(GLOBAL_EMPRESA,TO_CHAR(CONTROL_FECHA,'YYYYMM'),CONTROL_C_CLA,NUM_CPTE,CERR,MERR); IF CERR<>0 THEN --MESSAGEBOX ('Problemas al asentar el comprobante contable. '||MERR); RETORNO := 'Problemas al asentar el comprobante contable. '||MERR; RETURN RETORNO; --RAISE FORM_TRIGGER_FAILURE; END IF; --MESSAGEBOX ('Proceso Terminado con éxito. Comprobante contable generado Nro : '||Num_Cpte); RETORNO := 'Proceso Terminado con exito. Comprobante contable generado Nro : '||Num_Cpte; INSERT INTO COMPROBANTE_NFUE(NFUE, COMPROBANTE) VALUES (N_FUE_CRUCE, Num_Cpte); COMMIT; --COMMIT_FORM; ELSE --MESSAGEBOX ('No existe ningun movimiento por generar.'); RETORNO := 'No existe ningun movimiento por generar.'; END IF; RETURN RETORNO; EXCEPTION WHEN HUBO_ERROR THEN --MESSAGEBOX(MERR); RETORNO := MERR; --DESHACER; --RAISE FORM_TRIGGER_FAILURE; RETURN RETORNO; END;