# Store procedures para la base de datos elabo

DELIMITER //

# ------------------------------------------------------------------------------------------------
# Store Procedure: calcule_saldo_paciente
# Descripci�n....: Suma los precios de los registros de ordenes al campo saldo de un paciente
# Par�metros.....: IN numero de cliente
# ------------------------------------------------------------------------------------------------
DROP PROCEDURE IF EXISTS calcule_saldo_paciente;//
CREATE PROCEDURE calcule_saldo_paciente
(IN num INTEGER)
BEGIN
  DECLARE totexa DOUBLE DEFAULT 0.00;
  DECLARE totex DOUBLE DEFAULT 0.00;
  DECLARE caltotpa CURSOR FOR SELECT sum(saldocli) FROM datosexa where datosexa.numerocli=num;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET totex = 0.00;

  OPEN caltotpa;

  FETCH caltotpa INTO totex;
  IF totex IS NULL THEN
	SET totex = 0.00;
  END IF;

  UPDATE pacientes SET saldo=totex WHERE numerocli = num;

  CLOSE caltotpa;

END;//


# ------------------------------------------------------------------------------------------------
# Store Procedure: calcule_total_orden
# Descripci�n....: Suma los precios de los registros de examenes al campo datosexa de una orden
#                  y luego calcula el total de la orden restando el descuento y sumando el cargo
#                  adicional.
# Par�metros.....: IN numero de orden
# ------------------------------------------------------------------------------------------------
DROP PROCEDURE IF EXISTS calcule_total_orden;//
CREATE PROCEDURE calcule_total_orden
(IN num INTEGER)
BEGIN
  DECLARE totexa DOUBLE DEFAULT 0.00;
  DECLARE totex DOUBLE DEFAULT 0.00;
  DECLARE totde DOUBLE DEFAULT 0.00;
  DECLARE totimp DOUBLE DEFAULT 0.00;
  DECLARE totpagp DOUBLE DEFAULT 0.00;
  DECLARE totpagc DOUBLE DEFAULT 0.00;

  DECLARE impid INTEGER DEFAULT 0;
  DECLARE totalimpuestos DOUBLE DEFAULT 0.00;
  DECLARE done INTEGER DEFAULT 0;

  DECLARE caltotor CURSOR FOR SELECT sum(precio) FROM examenes where examenes.numerex=num;
  DECLARE caldedor CURSOR FOR SELECT sum(deducible) FROM examenes where examenes.numerex=num;

  DECLARE calpagpac CURSOR FOR SELECT sum(monto) FROM pagos where pagos.numerex=num and tipo_factura = 'PACIENTE';
  DECLARE calpagcia CURSOR FOR SELECT sum(monto) FROM pagos where pagos.numerex=num and tipo_factura = 'CIA';

  DECLARE calimpfijo CURSOR FOR SELECT `impuestos`.`id`, sum(`impuestos`.`MONTO`) FROM `examenes`
	Inner Join `examenes_impuestos` ON `examenes`.`EXAMENID` = `examenes_impuestos`.`examenid`
	Inner Join `impuestos` ON `examenes_impuestos`.`impuestoid` = `impuestos`.`ID`
	WHERE `impuestos`.`FIJOPOR` =  'F' and `examenes`.`numerex` = num group by `impuestos`.`id`;

  DECLARE calimppor CURSOR FOR SELECT `impuestos`.`id`, sum(`examenes`.`precio`*`impuestos`.`MONTO`/100) FROM `examenes`
	Inner Join `examenes_impuestos` ON `examenes`.`EXAMENID` = `examenes_impuestos`.`examenid`
	Inner Join `impuestos` ON `examenes_impuestos`.`impuestoid` = `impuestos`.`ID`
	WHERE `impuestos`.`FIJOPOR` =  'P' and `examenes`.`numerex` = num group by `impuestos`.`id`;

  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

# Calculemos el total de los examenes
  OPEN caltotor;
  FETCH caltotor INTO totex;
  IF totex IS NULL THEN
	SET totex = 0.00;
  END IF;
  CLOSE caltotor;
# Calculemos el total de los deducibles de los examenes
  OPEN caldedor;
  FETCH caldedor INTO totde;
  IF totde IS NULL THEN
	SET totde = 0.00;
  END IF;
  CLOSE caldedor;

# Borremos todos los totales de impuestos de datosexa_totimpuestos
  DELETE from `datosexa_totimpuesto` where `datosexa_totimpuesto`.`numerex`= num;
  SET totalimpuestos = 0.00;

# Sumemos los impuestos fijos
  OPEN calimpfijo;
  SET done = 0;
  REPEAT
    SET totimp = 0.00;
    FETCH calimpfijo INTO impid, totimp;
    IF done = 0 THEN
      INSERT INTO datosexa_totimpuesto (NUMEREX,IMPUESTOID,TOTALIMPUESTO) values (num, impid, totimp);
      SET totalimpuestos = totalimpuestos + totimp;
    END IF;
  UNTIL done = 1 END REPEAT;
  close calimpfijo;

# Sumemos los impuestos con porcentaje
  OPEN calimppor;
  SET done = 0;
  REPEAT
    SET totimp = 0.00;
    FETCH calimppor INTO impid, totimp;
    IF done = 0 THEN
      INSERT INTO datosexa_totimpuesto (NUMEREX,IMPUESTOID,TOTALIMPUESTO) values (num, impid, totimp);
      SET totalimpuestos = totalimpuestos + totimp;
    END IF;
  UNTIL done = 1 END REPEAT;
  close calimppor;

# Calculemos el total pagos del paciente
  OPEN calpagpac;
  FETCH calpagpac INTO totpagp;
  IF totpagp IS NULL THEN
  SET totpagp = 0.00;
  END IF;
  CLOSE calpagpac;
# Calculemos el total pagos de la cia
  OPEN calpagcia;
  FETCH calpagcia INTO totpagc;
  IF totpagc IS NULL THEN
  SET totpagc = 0.00;
  END IF;
  CLOSE calpagcia;

  UPDATE datosexa set pagadocli = totpagp, pagadocia = totpagc, pagado = totpagc + totpagp where numerex = num;
  UPDATE datosexa SET totalexa=totex+totalimpuestos WHERE numerex = num;
  UPDATE datosexa SET deducible = totde where numerex=num;
  UPDATE datosexa SET totalexacia = totex - totde where numerex=num;

  UPDATE datosexa SET totalpagarcli= ((deducible*(1+descuento/100))+cargoadi) where numerex = num;
  UPDATE datosexa SET totalpagarcia= ((totalexacia*(1+descuentocia/100))+cargoadicia) where numerex = num;
  UPDATE datosexa SET totalpagar = ( totalpagarcli + totalpagarcia ) where numerex = num;

  UPDATE datosexa SET saldocli = ( totalpagarcli - pagadocli ) where numerex = num;
  UPDATE datosexa SET saldocia = ( totalpagarcia - pagadocia ) where numerex = num;
  UPDATE datosexa SET saldo = ( saldocli + saldocia ) where numerex=num;

END;//

# ------------------------------------------------------------------------------------------------
# Store Procedure: calcule_total_meta
# Descripci�n....: Suma los precios de los registros de las pruebas que componen un metaexamen
#                  y luego actualiza el precio del metaexamen
# Par�metros.....: IN codigo metaexamen
# ------------------------------------------------------------------------------------------------
DROP PROCEDURE IF EXISTS calcule_total_meta;//
CREATE PROCEDURE calcule_total_meta
(IN num CHAR(4))
BEGIN
  DECLARE totex DOUBLE DEFAULT 0.00;
  DECLARE totde DOUBLE DEFAULT 0.00;
  DECLARE caltotme CURSOR FOR SELECT sum(precio) FROM metaexas where metaexas.metacodiex=num COLLATE latin1_general_ci;
  DECLARE caldedme CURSOR FOR SELECT sum(deducible) FROM metaexas where metaexas.metacodiex=num COLLATE latin1_general_ci;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET totex = 0.00;

  OPEN caltotme;
  FETCH caltotme INTO totex;
  IF totex IS NULL THEN
	SET totex = 0.00;
  END IF;
  CLOSE caltotme;
  
  OPEN caldedme;
  FETCH caldedme INTO totde;
  IF totde IS NULL THEN
	SET totde = 0.00;
  END IF;
  CLOSE caldedme;

  UPDATE direxame SET precio=totex, deducible=totde WHERE codiex = num COLLATE latin1_general_ci;
END;//


# ------------------------------------------------------------------------------------------------
# Store Procedure: calcule_total_pagos
# Descripci�n....: Suma los montos de todos los pagos registrados al campo pagado de una orden
# Par�metros.....: IN numero de orden
# ------------------------------------------------------------------------------------------------
DROP PROCEDURE IF EXISTS calcule_total_pagos;//
CREATE PROCEDURE calcule_total_pagos
(IN num INTEGER)
BEGIN
  DECLARE totpaid DOUBLE DEFAULT 0.00;
  DECLARE totpaidpa DOUBLE DEFAULT 0.00;
  DECLARE totpaidcia DOUBLE DEFAULT 0.00;

  DECLARE caltotpa CURSOR FOR SELECT sum(monto) FROM pagos where pagos.numerex=num and tipo_factura='PACIENTE';
  DECLARE caltotcia CURSOR FOR SELECT sum(monto) FROM pagos where pagos.numerex=num and tipo_factura = 'CIA';
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET totpaid = 0.00;

  OPEN caltotpa;
  FETCH caltotpa INTO totpaidpa;
  IF totpaid IS NULL THEN
	SET totpaidpa = 0.00;
  END IF;
  CLOSE caltotpa;

  OPEN caltotcia;
  FETCH caltotcia INTO totpaidcia;
  IF totpaidcia IS NULL THEN
	SET totpaidcia = 0.00;
  END IF;
  CLOSE caltotcia;


  UPDATE datosexa SET pagadocli=totpaidpa, pagadocia=totpaidcia, pagado=(totpaidcia+totpaidpa) WHERE numerex = num;

END;//

# ------------------------------------------------------------------------------------------------
# Store Procedure: add_to_caja
# Descripci�n....: Agrega un registro a la caja despues de registrar un pago
# Par�metros.....: IN numero de orden
# ------------------------------------------------------------------------------------------------
DROP PROCEDURE IF EXISTS add_to_caja;//
CREATE PROCEDURE add_to_caja
(IN pnum INTEGER)
BEGIN
  CREATE TEMPORARY TABLE tmpcaja SELECT * FROM pagos WHERE pagos.pagonum=pnum;
  UPDATE tmpcaja SET tipomov='DB';
  INSERT INTO caja SELECT * FROM tmpcaja;
  INSERT INTO cajahist SELECT * FROM tmpcaja;
  DROP TEMPORARY TABLE tmpcaja;
  
END;//

# ------------------------------------------------------------------------------------------------
# Store Procedure: sub_to_caja
# Descripci�n....: Agrega un registro a la caja pero con monto negativo despues de borrar un pago
# Par�metros.....: IN numero de orden
# ------------------------------------------------------------------------------------------------
DROP PROCEDURE IF EXISTS sub_to_caja;//
CREATE PROCEDURE sub_to_caja
(IN pnum INTEGER)
BEGIN
  
  CREATE TEMPORARY TABLE tmpcaja SELECT * FROM pagos WHERE pagos.pagonum=pnum;
  UPDATE tmpcaja SET monto=monto*(-1.00), tipomov='CR';
  INSERT INTO caja SELECT * FROM tmpcaja;
  INSERT INTO cajahist SELECT * FROM tmpcaja;
  DROP TEMPORARY TABLE tmpcaja;
  
END;//

# ------------------------------------------------------------------------------------------------
# Store Procedure: llenarexamen
# Descripci�n....: Usuario digita el codiex de un ex�men, el procedimiento llena los otros campos.
# Par�metros.....: INOUT codigo del examen, INOUT nombre del examen, INOUT precio
# NOTAS..........: Este procedimiento es llamado el trigger before insert de examenes.
# ------------------------------------------------------------------------------------------------
DROP PROCEDURE IF EXISTS llenarexamen;//
CREATE PROCEDURE llenarexamen (INOUT codi CHAR(4), INOUT nom VARCHAR(30), INOUT conv INTEGER, INOUT pruebatipo CHAR(1))
BEGIN
  DECLARE cod_tmp CHAR(4);
  DECLARE done INTEGER DEFAULT 0;
  DECLARE cur1 CURSOR FOR SELECT direxame.codiex,direxame.nombrexa, direxame.convenio, direxame.u FROM direxame where direxame.codiex = codi;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
  OPEN cur1;

  REPEAT
    FETCH cur1 INTO cod_tmp, nom, conv, pruebatipo;
    IF (STRCMP(codi,cod_tmp)=0) THEN
      SET done = 1;
    END IF;
  UNTIL done END REPEAT;

  CLOSE cur1;

END;//

# ------------------------------------------------------------------------------------------------
# Store Procedure: llenarpresupuesto
# Descripci�n....: Usuario digita el codiex de un ex�men, el procedimiento llena los otros campos.
# Par�metros.....: INOUT codigo del examen, INOUT nombre del examen, INOUT precio
# NOTAS..........: Este procedimiento es llamado el trigger before insert de presupuestos.
# ------------------------------------------------------------------------------------------------
DROP PROCEDURE IF EXISTS llenarpresupuesto;//
CREATE PROCEDURE llenarpresupuesto (INOUT codi CHAR(4), INOUT nom VARCHAR(30), INOUT price DOUBLE, INOUT pruebatipo CHAR(1))
BEGIN
  DECLARE cod_tmp CHAR(4);
  DECLARE done INTEGER DEFAULT 0;
  DECLARE cur1 CURSOR FOR SELECT direxame.codiex,direxame.nombrexa, direxame.precio, direxame.u FROM direxame where
    direxame.codiex = codi COLLATE latin1_general_ci;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
  OPEN cur1;

  REPEAT
    FETCH cur1 INTO cod_tmp, nom, price, pruebatipo;
    IF (STRCMP(codi,cod_tmp)=0) THEN
      SET done = 1;
    END IF;
  UNTIL done END REPEAT;
  CLOSE cur1;

END;//

# ------------------------------------------------------------------------------------------------
# Store Procedure: sustituya_meta
# Descripci�n....: Este procedimiento sustituye un meta examen por los examenes que lo componen
# Par�metros.....: IN numerex
# NOTAS..........: Este procedimiento es llamado:  NO SE DONDE TODAVIA
# ------------------------------------------------------------------------------------------------
DROP PROCEDURE IF EXISTS sustituya_meta;//
CREATE PROCEDURE sustituya_meta (IN num INTEGER)
BEGIN
  DECLARE eid INTEGER;
  DECLARE nume INTEGER;
  DECLARE cod_tmp CHAR(4);
  DECLARE cod_tmp2 CHAR(4);
  DECLARE expa_tmp CHAR(4);
  DECLARE pre_tmp DOUBLE;
  DECLARE ded_tmp DOUBLE;
  DECLARE tipo_tmp CHAR(1);
  DECLARE conv INTEGER;
  DECLARE done INTEGER DEFAULT 0;
  DECLARE cur0 CURSOR FOR SELECT examenid,numerex, codiex, u from examenes where (numerex=num AND u="M");
  DECLARE cur1 CURSOR FOR SELECT metacodiex, expandcode, precio, deducible,convenio from metaexas;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
  
  OPEN cur0;

  REPEAT
    FETCH cur0 INTO eid, nume, cod_tmp, tipo_tmp;
    IF done = 0 THEN
      OPEN cur1;
      REPEAT
        FETCH cur1 into cod_tmp2, expa_tmp, pre_tmp, ded_tmp, conv;
        IF ((STRCMP(cod_tmp,cod_tmp2)=0) AND (done=0)) THEN
          INSERT INTO examenes (numerex, codiex, convenio) VALUES (nume, expa_tmp, conv);
          UPDATE examenes SET precio=pre_tmp, deducible=ded_tmp where numerex=nume and codiex like expa_tmp collate latin1_general_ci;
        END IF;
      UNTIL done END REPEAT;
      SET done=0;
      CLOSE cur1;
    END IF;
    INSERT INTO expandidos select * from examenes where (examenid = binary eid);
    DELETE from examenes where (examenid = binary eid);
    UNTIL done END REPEAT;


  CLOSE cur0;

END;//

# ------------------------------------------------------------------------------------------------
# Store Procedure: inserte_impuestos
# Descripci�n....: Se insertan los registros de impuestos correspondientes a cada prueba que se agrega a la orden
# Par�metros.....: IN n�mero de orden, IN c�digo del ex�men
# NOTAS..........: Este procedimiento es llamado el trigger after insert de examenes.
# ------------------------------------------------------------------------------------------------
DROP PROCEDURE IF EXISTS inserte_impuestos;//
CREATE PROCEDURE inserte_impuestos (IN num INTEGER, IN codi CHAR(4), IN exaid INTEGER)
BEGIN
  DECLARE impid INTEGER DEFAULT 0;
  DECLARE done INTEGER DEFAULT 0;

  DECLARE cur1 CURSOR FOR SELECT impuestoid from direxame_impuesto where (direxame_impuesto.codiex = codi);
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
  
  OPEN cur1;
  
  REPEAT
    FETCH cur1 INTO impid;
    IF done = 0 THEN
      INSERT INTO examenes_impuestos (examenid, impuestoid) values (exaid, impid);
    END IF;
  UNTIL done END REPEAT;
  CLOSE cur1;

END;//

# ------------------------------------------------------------------------------------------------
# Store Procedure: quite_impuestos
# Descripci�n....: Se eliminan los impuestos
# Par�metros.....: IN n�mero de examenid
# NOTAS..........: Este procedimiento es llamado el trigger before delete de examenes.
# ------------------------------------------------------------------------------------------------
DROP PROCEDURE IF EXISTS quite_impuestos;//
CREATE PROCEDURE quite_impuestos (IN exaid INTEGER)
BEGIN

  DELETE from examenes_impuestos where (examenes_impuestos.examenid = exaid);

END;//


# ------------------------------------------------------------------------------------------------
# Store Procedure: inserte_resultados
# Descripci�n....: Se insertan los registros de resultados desde la base defaults de acuerdo al
#                  sexo y edad del paciente.
# Par�metros.....: IN n�mero de orden, IN c�digo del ex�men
# NOTAS..........: Este procedimiento es llamado el trigger after insert de examenes.
# ------------------------------------------------------------------------------------------------
DROP PROCEDURE IF EXISTS inserte_resultados;//
CREATE PROCEDURE inserte_resultados (IN num INTEGER, IN codi CHAR(4), IN exaid INTEGER)
BEGIN
  DECLARE cod_tmp CHAR(4);
  DECLARE num_tmp INTEGER DEFAULT 0;
  DECLARE exa_tmp INTEGER DEFAULT 0;
  DECLARE cli_tmp INTEGER DEFAULT 0;
  DECLARE sex_tmp CHAR(1);
  DECLARE edad_tmp DOUBLE DEFAULT 0.00;
  DECLARE lang_tmp CHAR(2);
  DECLARE especie_tmp INTEGER DEFAULT 1;
  DECLARE done INTEGER DEFAULT 0;

  DECLARE cur1 CURSOR FOR SELECT `examenes`.`CODIEX`,`examenes`.`NUMEREX`,`examenes`.`EXAMENID`,`datosexa`.`NUMEROCLI`,
    `datosexa`.`IDIOMA`,`pacientes`.`SEXO`, `pacientes`.`edad`, `pacientes`.`especie`
    FROM `examenes` INNER JOIN `datosexa` ON (`examenes`.`NUMEREX` = `datosexa`.`NUMEREX`)
    INNER JOIN `pacientes` ON (`datosexa`.`NUMEROCLI` = `pacientes`.`NUMEROCLI`)
    WHERE (`examenes`.`NUMEREX` = num);
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
  
  OPEN cur1;
  
  REPEAT
    FETCH cur1 INTO cod_tmp, num_tmp, exa_tmp, cli_tmp, lang_tmp, sex_tmp, edad_tmp,especie_tmp;
    IF ((done = 0) AND (STRCMP(cod_tmp,codi)=0))  THEN
      CREATE TEMPORARY TABLE tmpdefaults COLLATE latin1_general_ci SELECT id, examenid, codiex, idioma, sexo, edadmin, edadmax, secuencia, tiporesult,
        imprime, bandera, leyenda, resultado, unidades, normales, minimo, maximo, panicminimo, panicmaximo, imposiblemin,
	imposiblemax, mnemonic, negrita, italica, subrayado, fuente, tamano, fechamod, status, variable, comparable, formula,
	alineacion, numdec, validado, validadopor, validadoel, tipomuestra, especie, tipocontrol, opcionescontrol, varcomparable
	FROM defaults
	WHERE defaults.codiex=cod_tmp COLLATE latin1_general_ci
	AND defaults.idioma=lang_tmp COLLATE latin1_general_ci
	AND defaults.especie=especie_tmp
        AND (edad_tmp BETWEEN defaults.edadmin AND defaults.edadmax)
	AND (defaults.sexo=sex_tmp COLLATE latin1_general_ci OR defaults.sexo= _latin1'A' COLLATE latin1_general_ci);
      UPDATE tmpdefaults SET examenid=exaid, id=0, fechamod=NOW(), status= _latin1'E' COLLATE latin1_general_ci;
      INSERT INTO resultados SELECT * from tmpdefaults;
      DROP TEMPORARY TABLE tmpdefaults;
      SET done=1;
    END IF;
  UNTIL done END REPEAT;
  CLOSE cur1;

END;//

# ------------------------------------------------------------------------------------------------
# Store Procedure: update_status
# Descripci�n....: Despues de actualizar un resultado, se actualiza el status del registro de examenes
# Par�metros.....: IN examenid del resultado
# NOTAS..........: Este procedimiento es llamado el trigger after update de resultados
# ------------------------------------------------------------------------------------------------
DROP PROCEDURE IF EXISTS update_status;//
CREATE PROCEDURE update_status (IN exaid INTEGER)
BEGIN
  DECLARE cuantos INTEGER DEFAULT 0;
  DECLARE modificados INTEGER DEFAULT 0;
  DECLARE tmpstatus CHAR(1) DEFAULT 'M';
  DECLARE nume INTEGER DEFAULT 0;
  DECLARE resucur1 CURSOR FOR SELECT count(status) FROM resultados where status='E' AND (TIPORESULT='C' OR TIPORESULT='N') AND examenid=exaid AND (CHAR_LENGTH(TRIM(RESULTADO)) = 0 OR RESULTADO is null);
  DECLARE resucur2 CURSOR FOR SELECT count(status) FROM resultados where status='F' AND (TIPORESULT='C' OR TIPORESULT='N') AND examenid=exaid;
  DECLARE getnume CURSOR FOR SELECT numerex from examenes where examenid = exaid;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET cuantos = 0;
  
  OPEN resucur1;
  FETCH resucur1 INTO cuantos;
  CLOSE resucur1;
  OPEN resucur2;
  FETCH resucur2 INTO modificados;
  CLOSE resucur2;

  IF (cuantos = 0 and modificados > 0) THEN
    UPDATE examenes SET fechafin=NOW(), fechamod=NOW(), status='F', imprime=1 where examenid=exaid;
  ELSE
    IF (modificados > 0) THEN
      UPDATE examenes SET fechamod=NOW(), status='M' where examenid=exaid;
    ELSE
      UPDATE examenes SET fechamod=NOW(), status='E' where examenid=exaid;
    END IF;
  END IF;
  OPEN getnume;
  FETCH getnume into nume;
  CLOSE getnume;

  UPDATE datosexa set validada=0 where numerex=nume;

END;//

# ------------------------------------------------------------------------------------------------
# Store Procedure: status_orden
# Descripci�n....: Este procedimiento revisa que todos los resultados de un examen hayan sido modificados
#                  Si todos fueron modificados, se asume que el examen est� terminado y se actualizan
#                  los campos de fechafin status y los campos de datosexa.
# Par�metros.....: IN nume numero de la orden
# NOTAS..........: Este procedimiento es llamado el trigger after update de resultados
# ------------------------------------------------------------------------------------------------
DROP PROCEDURE IF EXISTS status_orden;//
CREATE PROCEDURE status_orden (IN nume INTEGER)
BEGIN
  DECLARE cuantos INTEGER DEFAULT 0;
  DECLARE modificados INTEGER DEFAULT 0;
  DECLARE terminados INTEGER DEFAULT 0;
  DECLARE ordencur1 CURSOR FOR SELECT count(status) from examenes where (status='E') AND numerex=nume;
  DECLARE ordencur2 CURSOR FOR SELECT count(status) from examenes where (status='M') AND numerex=nume;
  DECLARE ordencur3 CURSOR FOR SELECT count(status) from examenes where (status='F') AND numerex=nume;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET cuantos = 0;

  OPEN ordencur1;
  FETCH ordencur1 INTO cuantos;
  CLOSE ordencur1;

  OPEN ordencur2;
  FETCH ordencur2 INTO modificados;
  CLOSE ordencur2;

  OPEN ordencur3;
  FETCH ordencur3 INTO terminados;
  CLOSE ordencur3;


  IF (cuantos = 0  AND modificados = 0 and terminados > 0) THEN
  	UPDATE datosexa SET fechafin=NOW(), fechamod=NOW(), status='F' where numerex=nume;
  ELSE
  	IF (modificados = 0 and terminados = 0) THEN
  		UPDATE datosexa SET fechamod=NOW(), validada=0,status='E' where numerex=nume;
	ELSE
		UPDATE datosexa SET fechamod=NOW(), validada=0,status='M' where numerex=nume;
	END IF;
  END IF;
 

END;//

# ------------------------------------------------------------------------------------------------
# Store Procedure: cierre_caja
# Descripci�n....: Este procedimiento cierra la caja de un operador
# Par�metros.....: usuario al que hay que cerrar la caja
# NOTAS..........:
# ------------------------------------------------------------------------------------------------
DROP PROCEDURE IF EXISTS cierre_caja;//
CREATE PROCEDURE cierre_caja (IN quien CHAR(15))
BEGIN
  CREATE TABLE IF NOT EXISTS cajahist like caja;
  INSERT INTO cajahist SELECT * FROM caja WHERE usuario=quien;
  DELETE FROM CAJA WHERE usuario=quien;
END;//

# ------------------------------------------------------------------------------------------------
# Store Procedure: borre_presupuestos
# Descripci�n....: Este procedimiento borra las lineas de un presupuesto
# Par�metros.....: id del presupuesto
# NOTAS..........:
# ------------------------------------------------------------------------------------------------
DROP PROCEDURE IF EXISTS borre_presupuestos;//
CREATE PROCEDURE borre_presupuestos (IN presuid INTEGER)
BEGIN
  DELETE FROM presupuestos WHERE presupuestoid=presuid;
END;//


# ------------------------------------------------------------------------------------------------
# Store Procedure: calcule_saldo_cia
# Descripci�n....: Este procedimiento calcula el saldo de una compañia de ordenes, facturas y total de saldo
#                  y acturaliza el registro de la compania
# Par�metros.....: codigo de la cia
# NOTAS..........:
# ------------------------------------------------------------------------------------------------
DROP PROCEDURE IF EXISTS calcule_saldo_cia;//
CREATE PROCEDURE calcule_saldo_cia (IN codigocia INTEGER)
BEGIN
  DECLARE sordenes decimal DEFAULT 0.00;
  DECLARE sfacturas decimal DEFAULT 0.00;
  DECLARE saldoordenes CURSOR FOR SELECT sum(saldocia) from datosexa where cia=codigocia;
  DECLARE saldofacturas CURSOR FOR SELECT sum(saldo) from factura_orden_cia where cia=codigocia;

  OPEN saldoordenes;
  FETCH saldoordenes INTO sordenes;
  CLOSE saldoordenes;
  IF sordenes IS NULL THEN
  SET sordenes = 0.00;
  END IF;

  OPEN saldofacturas;
  FETCH saldofacturas INTO sfacturas;
  CLOSE saldofacturas;
  IF sfacturas IS NULL THEN
  SET sfacturas = 0.00;
  END IF;

  UPDATE cias set SALDOORDENES=sordenes, SALDOFACTURAS=sfacturas, SALDO=SALDOORDENES+SALDOFACTURAS where codigo=codigocia;  

END;//


DELIMITER ;

