SET TERM ^ ;
EXECUTE BLOCK AS BEGIN
if (exists(select 1 from RDB$PROCEDURES where rdb$Procedure_name = 'PREVISIONE_PRODUZIONE')) then 
execute statement 'drop procedure PREVISIONE_PRODUZIONE;';
END^
SET TERM ; ^

SET TERM ^ ;
CREATE PROCEDURE PREVISIONE_PRODUZIONE (
    DALLADATA TIMESTAMP,
    ALLADATA TIMESTAMP )
RETURNS (
    GIORNO TIMESTAMP,
    PRESENZE INTEGER,
    CAMERE INTEGER,
    PRODUZIONE NUMERIC(10,2) )
AS
DECLARE VARIABLE codice_pren INTEGER;
DECLARE VARIABLE tariffa NUMERIC(10,2);
DECLARE VARIABLE old_codice_pren INTEGER; 
BEGIN
  for select CONTEGGIA_GIORNI.DATA_GIORNO from CONTEGGIA_GIORNI(:DALLADATA,:ALLADATA) 
        into :giorno
    do
    BEGIN
    select sum(wghpren.ADULTI+wghpren.BAMBINI) from wghpren 
            where WGHPREN.arrivo<=:GIORNO and WGHPREN.PARTENZA>:GIORNO into :presenze;
    select sum(case when (WGHPRENCAM.QTA is null) then 1 else WGHPRENCAM.QTA END) 
            from WGHPRENCAM inner join WGHPREN on WGHPRENCAM.CODPREN=WGHPREN.CODICE 
            where WGHPREN.arrivo<=:GIORNO and WGHPREN.PARTENZA>:GIORNO into :camere;
    produzione=0;
    codice_pren=0;
    old_codice_pren=0;
    for select WGHPRENTAR.CODPREN,coalesce(WGHPRENTAR.TARIFFA,0) from WGHPRENTAR inner join WGHPREN on WGHPRENTAR.CODPREN=WGHPREN.CODICE
        where WGHPREN.ARRIVO<=:GIORNO and WGHPREN.PARTENZA>:GIORNO and WGHPRENTAR.DAL<=:GIORNO
        order by 1,WGHPRENTAR.DAL DESC into :codice_pren,:tariffa
        do
        BEGIN
        if(codice_pren<>old_codice_pren) then 
            BEGIN
            old_codice_pren=codice_pren;
            produzione=produzione+tariffa;
            END
        END
    SUSPEND;
    END
END^
SET TERM ; ^

GRANT EXECUTE
 ON PROCEDURE PREVISIONE_PRODUZIONE TO  SYSDBA;

