Vous êtes sur la page 1sur 7

create or replace

PACKAGE BODY PKG_PAR_APIS


IS

-- ========== ========== ====================================================


-- ----------- --------- ----------------------------------------------------
-- ORGANIZACION: Asmet Salud
-- DESCRIPCION: Paquete con los procedimientos para realizar diferentes
operaciones sobre la
-- tabla PAR_APIS
-- Autor: Fabio Hernán Cerón Calvo
-- FECHA: 11-07-2016 3:26:00
-- ----------- --------- ----------------------------------------------------
-- FECHA ACTUALIZACIÓN: 22-06-2017
-- AUTOR : Eduar Elexis Peña Velasco
-- ACTUALIZACIÓN : Se realiza la modificación del insert y el update de la
tabla PAR_APIS
-- para asignar el valor numerico uno(1) a la columna
VISIBLE_IPS. Y
-- permitir que los medicamentos creados en Hnull se
vean en Hnull Prestador.
-- ========== ========== ====================================================

--
===================================================================================
=========================================
-- HISTORIAL DE MODIFICACIONES
--
===================================================================================
=========================================
-- Fecha Autor Descripcion
--
===================================================================================
=========================================
-- 12/07/2018 Fabián Alveiro Burbano Robles Se ajusta que
la bandera editable sea actualizada cuando el
--
el valor ACTIVA venga en 1, esta accion se hara solo con la
--
combinacion de roles si_contratacion_niv3 y
si_contratacion_niv4.
--
-----------------------------------------------------------------------------------
-----------------------------------------
--
===================================================================================
=========================================
-- ----------- --------- ----------------------------------------------------
-- PROCEDIMIENTO ALMACENADO SP_CREAR_MEDICAMENTO
-- ----------- --------- ----------------------------------------------------

PROCEDURE SP_CREAR_MEDICAMENTO(
VAR_LABORATORIO IN PAR_LABORATORIO_MEDICAMENTO.DESCRIPCION_LABORATORIO%TYPE
, VAR_ATC IN PAR_ATC.CODIGO_ATC%TYPE
, VAR_CODIGO_MEDICAMENTO IN PAR_APIS.CODIGO_APIS%TYPE
, VAR_DESCRIPCION_MEDICAMENTO IN PAR_APIS.DESCRIPCION_APIS%TYPE
, VAR_PRESENTACION_MEDICAMENTO IN PAR_APIS.DESCRIPCION_APIS%TYPE
, VAR_FECHA_VENCIMIENTO IN VARCHAR2
, VAR_REGISTRO_SANITARIO IN PAR_MEDICAMENTO_DETALLE.REGISTRO_INVIMA%TYPE
, VAR_CODIGO_USUARIO IN PAR_APIS.COD_USER%TYPE
, VAR_NO_POSS IN PAR_APIS.NO_POSS%TYPE
, VAR_ACTIVA IN PAR_APIS.ACTIVA%TYPE
, VAR_CONTROL IN NUMBER
, VAR_ACLARACION_CONDICIONADA IN VARCHAR2
, LIST_PRINCMEDDETALLE IN PAR_PRINC_MED_TABLE
, VAR_RESPUESTA OUT NUMBER
) AS

-----------------------------------------------------------------------------------
--------------------
------------ DECLARACIÓN DEL CURSOR CSR_CODIGOS_MEDICAMENTOS
------------

-----------------------------------------------------------------------------------
--------------------
CURSOR CSR_CODIGO_MEDICAMENTO(VAR_CODIGO_MEDICAMENTO PAR_APIS.CODIGO_APIS
%TYPE) IS
SELECT CODIGO_APIS FROM PAR_APIS WHERE CODIGO_APIS =
VAR_CODIGO_MEDICAMENTO;

-----------------------------------------------------------------------------------
--------------------
------------ DECLARACIÓN DEL CURSOR CSR_ATC
------------

-----------------------------------------------------------------------------------
--------------------
CURSOR CSR_ATC(VAR_ATC PAR_ATC.CODIGO_ATC%TYPE) IS
SELECT CODIGO_ATC FROM PAR_ATC WHERE CODIGO_ATC = VAR_ATC;

-----------------------------------------------------------------------------------
--------------------
------------ DECLARACIÓN DEL CURSOR CSR_LABORATORIO
------------

-----------------------------------------------------------------------------------
--------------------
CURSOR CSR_LABORATORIO(VAR_LABORATORIO
PAR_LABORATORIO_MEDICAMENTO.DESCRIPCION_LABORATORIO%TYPE) IS
SELECT DESCRIPCION_LABORATORIO FROM PAR_LABORATORIO_MEDICAMENTO WHERE
DESCRIPCION_LABORATORIO = VAR_LABORATORIO;

--------------------------------------------------
--- VARIABLES USADAS PARA CONTROLAR EL FOR ---
--------------------------------------------------
LABORATORIO NUMBER:=0;
CODIGO_A_T_C NUMBER:=0;
CODIGO_MEDICAMENTO NUMBER:=0;
ID_LABORATORIO_MEDICAMENTO NUMBER:=0;
ID_APIS_ NUMBER:=0;
ID_MEDICAMENTO_DETALLE NUMBER:=0;
IDATC NUMBER:=0;
nContPrincActivo NUMBER:=0;
nIdMedicamentoDetalle NUMBER:=0;

BEGIN
FOR LAB IN CSR_LABORATORIO(VAR_LABORATORIO) LOOP
LABORATORIO := 1;
END LOOP;

FOR A_T_C IN CSR_ATC(VAR_ATC) LOOP


CODIGO_A_T_C := 1;
END LOOP;

FOR CODMEDICAMENTO IN CSR_CODIGO_MEDICAMENTO(VAR_CODIGO_MEDICAMENTO) LOOP


CODIGO_MEDICAMENTO := 1;
END LOOP;

IF VAR_CONTROL = 1 THEN
BEGIN

UPDATE PAR_APIS
SET DESCRIPCION_APIS = VAR_DESCRIPCION_MEDICAMENTO,
NO_POSS = VAR_NO_POSS,
ACTIVA = VAR_ACTIVA,
EDITABLE = case when VAR_ACTIVA = 1 OR (SELECT EDITABLE FROM
PAR_APIS WHERE codigo_apis = VAR_CODIGO_MEDICAMENTO) = 1 THEN 1 ELSE 0 END,
ACLARACION_CONDICIONADA = VAR_ACLARACION_CONDICIONADA,
COD_USER = VAR_CODIGO_USUARIO,
VISIBLE_IPS = 1
WHERE CODIGO_APIS = VAR_CODIGO_MEDICAMENTO;

--OBTENER ID_MEDICAMENTO_DETALLE DEL MEDICAMENTO A EDITAR


SELECT ID_MEDICAMENTO_DETALLE INTO nIdMedicamentoDetalle FROM
PAR_MEDICAMENTO_DETALLE PMD
INNER JOIN PAR_APIS PA ON (PMD.ID_APIS = PA.ID_APIS)
WHERE PA.CODIGO_APIS = VAR_CODIGO_MEDICAMENTO;

--VERIFICAR SI EL MEDICAMENTO TIENE PRINCIPIOS ACTIVOS RELACIONADOS


SELECT COUNT(1) INTO nContPrincActivo FROM PAR_PRINC_ACT_MED_DETALLE
WHERE ID_MEDICAMENTO_DETALLE = nIdMedicamentoDetalle;

--SI nContPrincActivo ES IGUAL A CERO CREA LOS PRINCIPIOS ACTIVOS QUE


SE QUIEREN INSERTAR.
IF(nContPrincActivo = 0) THEN

FOR i IN 1 .. LIST_PRINCMEDDETALLE.LAST LOOP

INSERT INTO
PAR_PRINC_ACT_MED_DETALLE(ID_PRINCIPIO_ACTIVO,ID_MEDICAMENTO_DETALLE,ID_UNIDAD_MEDI
CAMENTO,CANTIDAD)

VALUES(LIST_PRINCMEDDETALLE(i).nIdPrincipioActivo,nIdMedicamentoDetalle,LIST_PRINCM
EDDETALLE(i).nIdUnidadMedicamento,REPLACE(LIST_PRINCMEDDETALLE(i).nCantidad,'.',','
));
END LOOP;

ELSE --SE ELIMINAN LOS PRINCIPIOS ACTIVOS DEL MEDICAMENTO Y SE


INSERTAN LOS NUEVOS.
DELETE PAR_PRINC_ACT_MED_DETALLE WHERE ID_MEDICAMENTO_DETALLE =
nIdMedicamentoDetalle ;

FOR i IN 1 .. LIST_PRINCMEDDETALLE.LAST LOOP

INSERT INTO
PAR_PRINC_ACT_MED_DETALLE(ID_PRINCIPIO_ACTIVO,ID_MEDICAMENTO_DETALLE,ID_UNIDAD_MEDI
CAMENTO,CANTIDAD)

VALUES(LIST_PRINCMEDDETALLE(i).nIdPrincipioActivo,nIdMedicamentoDetalle,LIST_PRINCM
EDDETALLE(i).nIdUnidadMedicamento,REPLACE(LIST_PRINCMEDDETALLE(i).nCantidad,'.',','
));
END LOOP;
END IF;

VAR_RESPUESTA := 5;

END;
-- SI LABORATORIO = 0, QUIERE DECIR QUE EL LABORATORIO NO EXISTE POR LO TANTO
EL MEDICAMENTONO NO SE CREA --
ELSIF LABORATORIO = 0 THEN
VAR_RESPUESTA := 1;

-- SI CODIGO_A_T_C = 0, QUIERE DECIR QUE EL CODIGO ATC NO EXISTE POR LO TANTO


EL MEDICAMENTONO NO SE CREA --
ELSIF CODIGO_A_T_C = 0 THEN
VAR_RESPUESTA := 2;

-- SI CODIGO_MEDICAMENTO = 1, QUIERE DECIR QUE EL MEDICAMENTO EXISTE POR LO


TANTO NO SE CREA --
ELSIF CODIGO_MEDICAMENTO = 1 THEN
VAR_RESPUESTA := 3;

ELSE
BEGIN

INSERT INTO PAR_APIS


(ID_APIS,ID_CODIFICADOR,ID_AGRUPACION_APIS,CODIGO_APIS,DESCRIPCION_APIS,PAQUETE,APL
ICA_UNICA_GRUPO,FACTOR_API,

REQUIERE_ESPECIALIDAD,ID_APIS_CUPS_OLD,BILATERAL,ID_GRUPO_QX_SOAT,INCRUENTO,ID_HONO
RARIO,COSTOSA,NO_POSS,PROCEDIMIENTO_QX,

ESTANCIA,MIGRACION,UVR,ID_CUPS_TEMP,COD_USER,NO_POSS_BK,ACTIVA,FECHA_INACTIVA,
VISIBLE_IPS, ACLARACION_CONDICIONADA)
VALUES
(S_PAR_APIS.NEXTVAL,'5','32979',VAR_CODIGO_MEDICAMENTO,VAR_DESCRIPCION_MEDICAMENTO,

'0','0',null,'0',null,'0',null,'0',null,'0',VAR_NO_POSS,'0','0','100',null,null,VAR
_CODIGO_USUARIO,'1',VAR_ACTIVA,null,1,VAR_ACLARACION_CONDICIONADA);

SELECT ID_APIS INTO ID_APIS_ FROM PAR_APIS WHERE CODIGO_APIS =


VAR_CODIGO_MEDICAMENTO AND ID_CODIFICADOR = 5;
SELECT ID_LABORATORIO_MEDICAMENTO INTO ID_LABORATORIO_MEDICAMENTO
FROM PAR_LABORATORIO_MEDICAMENTO WHERE DESCRIPCION_LABORATORIO = VAR_LABORATORIO;

INSERT INTO PAR_MEDICAMENTO_DETALLE


(ID_MEDICAMENTO_DETALLE,ID_APIS,ID_LABORATORIO_MEDICAMENTO,PRESENTACION_MEDICAMENTO
,FECHA_VENCIMIENTO,REGISTRO_INVIMA,ID_FORMA_FARMACEUTICA,NOMBRE_COMERCIAL)
VALUES
(S_PAR_MEDICAMENTO_DETALLE.NEXTVAL,ID_APIS_,ID_LABORATORIO_MEDICAMENTO,VAR_PRESENTA
CION_MEDICAMENTO,TO_DATE(VAR_FECHA_VENCIMIENTO,'DD/MM/YYYY'),VAR_REGISTRO_SANITARIO
,null,null);

SELECT ID_MEDICAMENTO_DETALLE INTO ID_MEDICAMENTO_DETALLE FROM


PAR_MEDICAMENTO_DETALLE WHERE ID_APIS = ID_APIS_;
SELECT ID_ATC INTO IDATC FROM PAR_ATC WHERE CODIGO_ATC = VAR_ATC;

INSERT INTO PAR_ATC_DETALLE_MEDICAMENTO(ID_ATC,


ID_MEDICAMENTO_DETALLE) VALUES(IDATC,ID_MEDICAMENTO_DETALLE);

--INSERTAR LOS PRINCIPIOS ACTIVOS DEL MEDICAMENTO


FOR i IN 1 .. LIST_PRINCMEDDETALLE.LAST LOOP
INSERT INTO
PAR_PRINC_ACT_MED_DETALLE(ID_PRINCIPIO_ACTIVO,ID_MEDICAMENTO_DETALLE,ID_UNIDAD_MEDI
CAMENTO,CANTIDAD)

VALUES(LIST_PRINCMEDDETALLE(i).nIdPrincipioActivo,S_PAR_MEDICAMENTO_DETALLE.CURRVAL
,LIST_PRINCMEDDETALLE(i).nIdUnidadMedicamento,REPLACE(LIST_PRINCMEDDETALLE(i).nCant
idad,'.',','));
END LOOP;

VAR_RESPUESTA := 4;
END;

END IF;

COMMIT;

END SP_CREAR_MEDICAMENTO;

-----------------------------------------------------------------------------------
-----------

PROCEDURE SP_CONSULTA_NO_POSS(NID_APIS IN PAR_HISTORIAL_APIS.ID_APIS%TYPE,


TFEC_ACT IN VARCHAR2,
NRESPUESTA OUT NUMBER) AS

---------------------------------------------------------------------
--- VARIABLES USADAS PARA CONTROLAR EL FOR ---
---------------------------------------------------------------------
TFECHA_INICIAL NUMBER := -1;
TFECHA_FINAL NUMBER := -1;
CONTADOR NUMBER := 0;
NUMFEC_INGRESO NUMBER := 0;

BEGIN

EXECUTE IMMEDIATE 'ALTER SESSION SET nls_date_format=''DD/MM/YYYY''';


NUMFEC_INGRESO := TO_NUMBER(REPLACE(TFEC_ACT,'/',''));

FOR J IN (SELECT FEC_ACT, VALOR_ANTERIOR


FROM PAR_HISTORIAL_APIS
WHERE ID_APIS = NID_APIS
AND ID_COLUMNA = 312)
LOOP
IF (CONTADOR = 0) THEN
TFECHA_INICIAL :=
TO_NUMBER(REPLACE(TO_CHAR(J.FEC_ACT,'DD/MM/YYYY'),'/',''));
CONTADOR := CONTADOR + 1;
ELSE
TFECHA_FINAL :=
TO_NUMBER(REPLACE(TO_CHAR(J.FEC_ACT,'DD/MM/YYYY'),'/',''));
CONTADOR := CONTADOR + 1;

SELECT CASE WHEN (NUMFEC_INGRESO >= TFECHA_INICIAL AND


NUMFEC_INGRESO < TFECHA_FINAL AND J.VALOR_ANTERIOR = 1) THEN
1
ELSE
0
END RESULTADO INTO NRESPUESTA
FROM DUAL;

IF NRESPUESTA = 0 THEN
TFECHA_INICIAL := TFECHA_FINAL;
ELSIF NRESPUESTA = 1 THEN
EXIT;
END IF;

END IF;

END LOOP;

EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.put_line('ERROR INESPERADO:::: ');

COMMIT;

END SP_CONSULTA_NO_POSS;

-----------------------------------------------------------------------------------
--------
-- FECHA ACTUALIZACIÓN: 16-04-2018
-- AUTOR : Jaime Herney Meneses Ruiz
-- ACTUALIZACIÓN : Se realiza la modificación para traer el campo EDITABLE
de PAR_APIS
-- ========== ========== ====================================================

PROCEDURE SP_BUSCAR_MEDICAMENTO(vCodigoApis IN PAR_APIS.CODIGO_APIS%TYPE,


cTecnologia OUT NOCOPY SYS_REFCURSOR,
vError OUT VARCHAR2,
vMensaje OUT VARCHAR2)
IS
eCodigoApis EXCEPTION;
BEGIN
IF (vCodigoApis IS NULL) THEN
RAISE eCodigoApis;
END IF;

OPEN cTecnologia
FOR SELECT PA.CODIGO_APIS, PATC.CODIGO_ATC, PLM.DESCRIPCION_LABORATORIO,
PMD.PRESENTACION_MEDICAMENTO,
PA.DESCRIPCION_APIS, PMD.REGISTRO_INVIMA,
PA.ACLARACION_CONDICIONADA, PMD.FECHA_VENCIMIENTO,
PA.NO_POSS, PA.ACTIVA, PA.EDITABLE
FROM PAR_APIS PA
LEFT JOIN PAR_MEDICAMENTO_DETALLE PMD ON PMD.ID_APIS = PA.ID_APIS
LEFT JOIN PAR_ATC_DETALLE_MEDICAMENTO PADM ON PADM.ID_MEDICAMENTO_DETALLE =
PMD.ID_MEDICAMENTO_DETALLE
LEFT JOIN PAR_ATC PATC ON PATC.ID_ATC = PADM.ID_ATC
LEFT JOIN PAR_LABORATORIO_MEDICAMENTO PLM ON PLM.ID_LABORATORIO_MEDICAMENTO
= PMD.ID_LABORATORIO_MEDICAMENTO
WHERE CODIGO_APIS = vCodigoApis
AND PA.ID_CODIFICADOR = 5;

vError := 0;
vMensaje := 'Consulta éxitosa';

EXCEPTION

WHEN eCodigoApis THEN


verror := '-1';
vmensaje := 'Es necesario un codigo api valido, este parametro no puede
estar vacio';

WHEN NO_DATA_FOUND THEN

verror := '-2';
vmensaje := 'La consulta no arrojo datos';

WHEN OTHERS THEN

verror := '-3';
vmensaje := ('Error no controlado' || SQLERRM);

END SP_BUSCAR_MEDICAMENTO;

END PKG_PAR_APIS;

Vous aimerez peut-être aussi