create or replace PACKAGE AABS_DG_WRITE is
    procedure InsScheda(codiCuaa in varchar2,codiScheda in varchar2,data_rife in date);
    procedure InsParc(atto_ammi in number);
END AABS_DG_WRITE;
/
create or replace PACKAGE BODY AABS_DG_WRITE is
    codOrpa constant number:= xxx; -- da modificare a seconda dell'OP
procedure InsParc(atto_ammi in number) is

    conta_apag number;
    conta_colt_appe number;
    cParc AABSPARC_DU_COL;
    cApag AABSPARC_COL;
    idParcella number;
    IdInvio number;

begin

    cParc:=AABS_DG_READ.getParcIns(atto_ammi);
    cApag := AABS_DG_READ.getParcDettIns(atto_ammi);
    
    select AABS_DG_INVIO.nextval into IdInvio from dual;
    
    -- check oggetti non vuoti
    begin
    
        if cParc.count = 0 then
            raise_application_error(-20001, 'Errore inserimento domanda: atto '||atto_ammi||' nessuna parcella da inserire.');
        end if;
    
        if cApag.count = 0 then
            raise_application_error(-20002, 'Errore inserimento domanda: atto '||atto_ammi||' nessun appezzamento da inserire.');
        end if;
    end;

    -- check domanda : esiste un dettaglio per ogni parcella
    begin
        
        select count(*) into conta_apag 
        from table(cParc) a 
        where not exists (select 1 from table(cApag) b where  a.ID_PARC=b.ID_PARC);
        
        if conta_apag>0 then
            raise_application_error(-20003, 'Errore inserimento domanda: atto '||atto_ammi||' parcelle senza appezzamenti.');
        end if;
    end;

    for i in 1..cParc.count loop
  
        select AABSPARC_SEQ.nextval into idParcella from dual;
  
        --dbms_output.put_line('parcella = '||cParc(i).id_parc);
        begin
    
          insert into
          AABSPARC_TAB (
          ID_ORPA,
          ID_INVIO,
          CAMPAGNA,
          CUAA,
          ID_ATTO_AMMI,
          ID_SCHEDA,
          ID_PARC,
          ID_INTE,
          SUPER_PARC ,
          SHAPE,
          PRG_PARC,
          DATA_INS) 
          values(codOrpa,
                 IdInvio,
                 cParc(i).CAMPAGNA,
                 cParc(i).CUAA,
                 cParc(i).ID_ATTO_AMMI,
                 cParc(i).ID_SCHEDA,
                 cParc(i).ID_PARC,
                 cParc(i).ID_INTE,
                 cParc(i).SUPERFICIE,
                 SDO_UTIL.TO_WKTGEOMETRY(cParc(i).SHAPE) ,
                 idParcella,
                 sysdate
                 );
      
        exception when dup_val_on_index then
          raise_application_error(-20004, 'Non è possibile sincronizzare un atto già sincronizzata');
        end ;

        insert into AABSAPAG_TAB(ID_INVIO,
                                 ID_ATTO_AMMI ,
                                 ID_PARC ,
                                 COD_COLT,
                                 ID_ORPA,
                                 prg_parc,
                                 DATA_INS)
          select
          IdInvio,
          ID_ATTO_AMMI,
          ID_PARC,
          COD_COLT,
          codOrpa ,
          idParcella,
          sysdate
          from table(cApag) 
          where id_parc=cParc(i).ID_PARC;
    end loop;


exception when others then
    raise_application_error(-20000, 'Errore inserimento sincronizzazione domanda:'||sqlerrm);
end InsParc;

procedure InsScheda(codiCuaa in varchar2,codiScheda in varchar2,data_rife in date) is
    data_inizio_isola date;
    data_fine_isola date;
    data_riferimento_isola date;
    identificativo_isola number;
    PRGSCHEDA NUMBER;
    identificativo_consolidamento number;
    identificativo_scheda varchar2(100);
    identificativo_appe number;
    identificativo_dett_appe number;
    codice_appe varchar2(100);
    codice_colti number;
    conta_isole number;
    conta_appe number;
    conta_appe_dett number;
    conta_part number;    
    cIsol AABSISOL_COL;
    cAppe AABSAPPE_COL;
    cAppeDett AABSAPPE_DETT_COL;
    cPart AABSPART_COL;
begin
    
    cIsol :=AABS_DG_READ.getIsolIns(codiScheda);
    cAppe := AABS_DG_READ.getAppeIns(codiScheda);
    cAppeDett := AABS_DG_READ.getAppeDettIns(codiScheda);
    cPart := AABS_DG_READ.getPartIns(codiScheda);
    
    
    -- check oggetti non vuoti
    begin
    
        if cIsol.count = 0 then
            raise_application_error(-20005, 'La scheda '||codiScheda||' non contiene isole.');
        end if;
    
        if cAppe.count = 0 then
            raise_application_error(-20006, 'La scheda '||codiScheda||' non contiene appezzamenti.');
        end if;
        if cAppeDett.count = 0 then
            raise_application_error(-20007, 'La scheda '||codiScheda||' non contiene dettagli delle colture.');
        end if;
    
        if cPart.count = 0 then
            raise_application_error(-20008, 'La scheda '||codiScheda||' non contiene particelle.');
        end if;
    end;
    
    -- Controlli di consistenza
    
    -- per ogni isola esiste almeno un appezzamento
	begin

        select count(*) into conta_appe
        from table(cIsol) a
            where not exists (select 1 from table(cAppe) b where a.CODI_ISOL=b.CODI_ISOL);

		if conta_appe>0 then
            raise_application_error(-20009, 'La scheda '||codiScheda||' contiene isole senza appezzamenti');
		end if;
	end;

	-- check per ogni appezzamento esiste almeno un dettaglio appezzamento
	begin

        select count(*) into conta_appe_dett
        from table(cAppe) a
            where not exists (select 1 from table(cAppeDett) b where a.COD_APPE=b.COD_APPE);
    
        if conta_appe_dett>0 then
            raise_application_error(-20010, 'la scheda '||codiScheda||' contiene isole con appezzamenti senza dettaglio');
        end if;
	end;

-- Fine controlli di consistenza


    ---------- sequence id_scheda ---- identificativo_scheda --------
    identificativo_scheda := codiScheda;
    
    select AABSSCHE_SEQ.nextval into PRGSCHEDA from dual;
    
    begin
        insert into AABSSCHE_TAB(
        PRG_SCHEDA,
        CUAA,
        ID_SCHEDA,
        DATA_SCHEDA ,
        DATA_RIFE ,
        ID_ORPA )
        values
        (PRGSCHEDA,codiCuaa,
         identificativo_scheda,
         sysdate,
         data_rife,
         codOrpa);
    exception when dup_val_on_index then
      raise_application_error(-20011, 'Non è possibile sincronizzare una scheda già sincronizzata');
    end;
    
    --------- Insert Isola -----------------
        
    begin
        insert into
            AABSISOL_TAB(
          PRG_SCHEDA,
            codi_isol,
            id_scheda,
            data_inizio,
            data_fine,
            data_rife,
            supe ,
            shape,
            id_orpa)
        select
          PRGSCHEDA,
            CODI_ISOL,
            identificativo_scheda,
            DATA_INIZ_ISOL,
            DATA_FINE_ISOL,
            DATA_RIFE_CONS,
            SUPE_ISOL,
            SDO_UTIL.TO_WKTGEOMETRY(SHAPE_ISOL) SHAPE_ISOL,
            codOrpa
            from
             table(cIsol);
    end;
    
    ------------ Insert Particelle -------------
    
    begin
    insert into AABSPART_TAB(
      PRG_SCHEDA,
        id_scheda,
        codi_nazi,
        fogl,
        part,
        sub ,
        tipo_cond,
        data_iniz,
        data_fine,
        supe_cata,
        supe_cond,
        shape,
        id_orpa,
        id_part)
    select
      PRGSCHEDA,
        identificativo_scheda,
        CODI_NAZI,
        NUME_FOGL,
        NUME_PART,
        CODI_SUBA,
        tipo_part,
        DATA_INIZ_PART ,
        DATA_FINE_PART ,
        SUPE_CATA,
        SUPE_COND,
        SDO_UTIL.TO_WKTGEOMETRY(SHAPE_PART) SHAPE_PART,
        codOrpa,
        ID_PART
        from table(cPart);
    end;
    
    ----------------------------------------
    ---------- Insert AABSAPPE_TAB ---------
    
    begin
    insert into AABSAPPE_TAB(
      PRG_SCHEDA,
        codi_isol,
        cod_appe,
        codi_rile,
        codi_prod_rile,
        supe,
        data_inizio,
        data_fine,
        shape,
        id_orpa,
        id_scheda)
    select
      PRGSCHEDA,
        codi_ISOL,
        COD_APPE,
        CODI_RILE,
        CODI_PROD_RILE,
        SUPE_APPE,
        DATA_INIZ_APPE,
            DATA_FINE_APPE,
        SDO_UTIL.TO_WKTGEOMETRY(SHAPE_APPE) SHAPE_APPE,
        codOrpa,
        identificativo_scheda
        from table(cAppe);
    end;
    
    ----------------------------------------
    ------- Insert into  AABSAPPE_DETT_TAB -----------
    begin
    
    insert into AABSAPPE_DETT_TAB(
    PRG_SCHEDA,
    COD_APPE,
    COD_COLT,
    DATA_INIZ_DETT,
    DATA_FINE_DETT,
    SUPE_DETT,
    CODI_DEST_UTIL,
    CODI_OCCU,
    CODI_DEST_USO,
    CODI_USOO,
    CODI_QUAL,
    CODI_OCCU_VARI,
    CODI_PRAT_PERM,
    CODI_PRAT_ALTR,
    FLAG_COLT_PRIN,
    FLAG_PROD_INTE,
    FLAG_DOP,
    TIPO_DI_SEMINA,
    TIPO_IRRIGAZIONE,
    ANNO_MESE,
    POTENZIALITA_IRRIGUA,
    SOSTANZE_PERICOLOSE,
    EFFLUENTI_ZOOTECNICI,
    PRESENZA_TERRAZZAMENTI,
    STRUTTURE_AZIENDALI ,
    TIPO_DI_IMPIANTO,
    TIPO_DI_ALLEVAMENTO,
    DESTINAZIONI_PRODUTTIVE,
    FASE_DI_ALLEVAMENTO,
    ROTAZIONE_COLTURALE,
    FORMA_DI_ALLEVAMENTO,
    ULTIMO_ANNO_DI_TAGLIO,
    id_orpa ,
    id_scheda
    )
    select
       PRGSCHEDA,
       cod_appe,
       COD_COLT,
       DATA_INIZ_DETT,
       DATA_FINE_DETT,
       SUPE_DETT,
       CODI_DEST_UTIL,
       CODI_OCCU,
       CODI_DEST_USO,
       CODI_USOO,
       CODI_QUAL,
       CODI_OCCU_VARI,
       CODI_PRAT_PERM,
       CODI_PRAT_ALTR,
       FLAG_COLT_PRIN,
       FLAG_PROD_INTE,
       FLAG_DOP ,
       TIPO_DI_SEMINA,
       TIPO_IRRIGAZIONE,
       ANNO_MESE,
       POTENZIALITA_IRRIGUA,
       SOSTANZE_PERICOLOSE,
       EFFLUENTI_ZOOTECNICI,
       PRESENZA_TERRAZZAMENTI,
       STRUTTURE_AZIENDALI,
       TIPO_DI_IMPIANTO,
       TIPO_DI_ALLEVAMENTO,
       DESTINAZIONI_PRODUTTIVE,
       FASE_DI_ALLEVAMENTO,
       ROTAZIONE_COLTURALE,
       FORMA_DI_ALLEVAMENTO,
       ULTIMO_ANNO_DI_TAGLIO,
       codOrpa,
       identificativo_scheda
         from table(cAppeDett) ;       
                    
               
    end;

exception when others then
    raise_application_error(-20100, 'Errore inserimento scheda:'||codiScheda||' - '||sqlerrm);
end InsScheda;
end AABS_DG_WRITE;
/