DECLARE NREC NUMBER(9); BEGIN SELECT COUNT(*) INTO NREC FROM GPXTCELLA WHERE CODSISTEMA='CUD' AND CODCELLA= '002XAF'; IF NREC = 0 THEN INSERT INTO GPXTCELLA ("CODSISTEMA","CODGRUPPO","CODCELLA","DESCELLA","INDIMPORTI","INDDOMINIO","INDTRASCOD") VALUES ('CUD','PARTEB','002XAF','REDDITI PER FRUIRE DETRAZ. ART.13,C.5 TUIR, PER ANNO FISCALE','S','N','N'); END IF; COMMIT; END; / CREATE OR REPLACE PACKAGE BODY PKGPCONTAB AS -- Autore: SA20011022 -- Modifiche: SA20020116, Quando c'è il Join fra il curriculum e RAPLAV tramite l'IDRPERSONA, -- aggiunto il join anche con CODLINEALAV -- Occorre restituire l'elenco dei dipendenti/FunzionieServizi a partire dalle regole contabili -- per l'anno specificato e per ogni tipo dipendente specificato nel parametro lCODTIPODIPLst -- che può essere una concatenazione dei seguenti codici: -- 'DIP' = Singolo rapporto di lavoro -- 'GRP' = Gruppo individuato dal Funzione/ servizio -- 'ALL' = Tutti i dipendenti -- Se nella concatenazione è compreso il tipo 'DIP', allora occorre andare a leggere il parametro -- INDDIPFROMTMP = 'S' bisogna restituire l'elenco dei dipendenti presenti nella temporanea -- GPTMPELRLAV. -- CODTIPOELE può assumere uno solo dei valori seguenti: -- 'VOX' = Gruppo di voci -- 'TAX' = Tassazione -- 'CON' = Contributo -- 'ONE' = Onere -- Quindi a seconda del valore occorre fare il Join opportuno -- Restituire anche un campo nella vista che dia l'Ordine di visualizzazione nel modo che segue: -- 'DIP' --> ordine = 3 -- 'GRP' --> ordine = 2 -- 'ALL' --> ordine = 1 FUNCTION fnREGCONTABDvr ( lCODENTEAZ IN pkType.tyStringa%type, lCODANNO IN pkType.tyStringa%type, lCODTIPODIPLst IN pkType.tyStringa%type, -- Lista di CODTIPODIP concatenata da '§' lCODTIPOELE IN pkType.tyStringa%type, lINDDIPFROMTMP IN pkType.tyStringa%type, -- = 'S' --> restituire solo l'elenco dei dipendenti presenti -- nella temporanea GPTMPELRLAV, in tal caso devo inserire in GPTMPREGCONTAB i record dei dipendenti, -- eventualmente da cancellare lCODSESSIONE IN pkType.tyStringa%type, lNOMEVISTA OUT pktype.TyStringa%Type, ERRDIAG OUT pkType.tyStringa%type ) RETURN NUMERIC IS nRet NUMBER(9); sNomeVista pktype.TyStringa%Type:= 'REGCONTAB'; lQuery VARCHAR2(30000); sSELECT VARCHAR2(30000); sFROM VARCHAR2(30000); sWHERE VARCHAR2(30000); -- PER LO split nLastCODTIPODIP NUMBER(9); lTCODTIPODIP PKTYPE.TYTSTRINGA; sCODTIPODIP pktype.TyStringa%Type := NULL; -- stringa da comporre in base agli elementi nella Lista -- per inserire nella TMP lTimeStamp GPTMPREGCONTAB.TMSLOCK%type := TO_CHAR( SYSDATE, 'YYYYMMDDHH24MISS' ); BEGIN -- RIPULISCO LA TEMPORANEA DELETE FROM GPTMPREGCONTAB WHERE OWNER = lCODSESSIONE OR TO_CHAR(sysdate, 'YYYYMMDDHH24MI' ) - SUBSTR(TMSLOCK,1,12)> 2400; -- Splitto lCODTIPODIPLst e li metto in una stringa nRet := PKUTILITY.fnRealSplit( lCODTIPODIPLst,'§','',nLastCODTIPODIP,ERRDIAG,lTCODTIPODIP); IF nRet < 0 THEN ROLLBACK; RETURN nRet; END IF; FOR i IN 1..nLastCODTIPODIP LOOP IF lTCODTIPODIP(i) IS NOT NULL THEN sCODTIPODIP := sCODTIPODIP || ','''||lTCODTIPODIP(i) ||''''; END IF; END LOOP; sCODTIPODIP := LTRIM( sCODTIPODIP, ','); sSelect := ' SELECT CODANNO, CODPARTE, CODTIPOLEGAME, CODSEGNOVOCE,'|| 'CODTIPODIP, CODDIPENDENTE, CODTIPOELE, CODELEMENTO,'|| 'IDRCONTRIB, CODTIPOTASS, CODTPGRVOX, CODVALGRVOX,'|| 'IDRRLAV, CODFUNZIONE, CODSERVIZIO, IDRPERSONA, DESTIPODIP,'|| 'CODCDR, IDCAPITOLO,'|| 'CODANNOCONT, IDACCIMP, QTAMOLTIMPUTAZIONE, INDRIPARTIZIONE,'|| 'CODTIPOARROT, IMPARROT, CODTIPOBEN, CODBENEFICIARIO, ORDINE ORDINETIPODIP, '|| 'IDCAPITOLORIPART, IDACCIMPRIPART, QTAMOLTIMPRIPART, CODTIPOBENRIPART, '|| 'CODBENRIPART, CODCDRRIPART, CODANNOCONTRIPART, INDSOSPESO'; sFrom := ' FROM'|| '( ( ( SELECT GPREGCONTAB.CODANNO, GPREGCONTAB.CODPARTE, GPREGCONTAB.CODTIPOLEGAME,'|| 'GPREGCONTAB.CODSEGNOVOCE, GPREGCONTAB.CODTIPODIP, GPREGCONTAB.CODDIPENDENTE, GPREGCONTAB.CODTIPOELE,'|| 'GPREGCONTAB.CODELEMENTO, GPREGCONTAB.IDRCONTRIB, GPREGCONTAB.CODTIPOTASS, GPREGCONTAB.CODTPGRVOX,'|| 'GPREGCONTAB.CODVALGRVOX, GPREGCONTAB.IDRRLAV, GPREGCONTAB.CODFUNZIONE, GPREGCONTAB.CODSERVIZIO,'|| 'GPPERSONA.IDRPERSONA, GPPERSONA.DESCOGNOME || '' ''||GPPERSONA.DESNOME ||'|| ''' - '' ||''Rapporto: ''|| DECODE ( GPRAPLAV.CODLINEALAV, ''D'', ''Dipendente'', ''E'','|| '''Extra'' ) || '' Inizio '' || TO_CHAR ( GPRAPLAV.DTAINIZIO,''DD/MM/YYYY'' ) DESTIPODIP,'|| 'GPREGCONTAB.CODCDR, GPREGCONTAB.IDCAPITOLO, GPREGCONTAB.CODANNOCONT, GPREGCONTAB.IDACCIMP,'|| 'GPREGCONTAB.QTAMOLTIMPUTAZIONE, GPREGCONTAB.INDRIPARTIZIONE, GPREGCONTAB.CODTIPOARROT,'|| 'GPREGCONTAB.IMPARROT, GPREGCONTAB.CODTIPOBEN, GPREGCONTAB.CODBENEFICIARIO, ''3'' ORDINE, '|| 'GPREGCONTAB.IDCAPITOLORIPART, GPREGCONTAB.IDACCIMPRIPART, GPREGCONTAB.QTAMOLTIMPRIPART, '|| 'GPREGCONTAB.CODTIPOBENRIPART, GPREGCONTAB.CODBENRIPART, GPREGCONTAB.CODCDRRIPART, '|| 'GPREGCONTAB.CODANNOCONTRIPART, GPREGCONTAB.INDSOSPESO '|| ' FROM GPREGCONTAB, GPPERSONA, GPRAPLAV'|| ' WHERE GPREGCONTAB.CODENTEAZ = UPPER('''|| lCODENTEAZ ||''') AND'|| ' GPREGCONTAB.CODTIPODIP = ''DIP'' AND'|| ' GPREGCONTAB.CODANNO = '''|| lCODANNO ||''' AND'|| ' GPREGCONTAB.IDRRLAV = GPRAPLAV.IDRRLAV AND'|| ' GPPERSONA.IDRPERSONA = GPRAPLAV.IDRPERSONA AND'|| ' '''|| lINDDIPFROMTMP || ''' = ''N'' AND'|| ' CODTIPOELE = '''||lCODTIPOELE||''')'|| ' UNION'|| '( SELECT NVL(GPREGCONTAB.CODANNO, 0), GPREGCONTAB.CODPARTE, GPREGCONTAB.CODTIPOLEGAME,'|| ' GPREGCONTAB.CODSEGNOVOCE,'|| ' ''DIP'' CODTIPODIP, GPREGCONTAB.CODDIPENDENTE, GPREGCONTAB.CODTIPOELE, '|| ' GPREGCONTAB.CODELEMENTO,'|| ' NVL(GPREGCONTAB.IDRCONTRIB,0), GPREGCONTAB.CODTIPOTASS, GPREGCONTAB.CODTPGRVOX,'|| ' GPREGCONTAB.CODVALGRVOX,'|| ' GPTMPELRLAV.IDRRLAV, GPREGCONTAB.CODFUNZIONE, GPREGCONTAB.CODSERVIZIO,'|| ' GPTMPELRLAV.IDRPERSONA,'|| ' GPTMPELRLAV.DESCOGNOME || '' ''||GPTMPELRLAV.DESNOME ||'|| ' '' - '' ||''Rapporto: ''|| DECODE ( GPTMPELRLAV.CODTIPORL, ''D'', ''Dipendente'', ''E'','|| ' ''Extra'' ) || '' Inizio '' || TO_CHAR ( GPTMPELRLAV.DTAINIZIO,''DD/MM/YYYY'' ) '|| ' DESTIPODIP, GPREGCONTAB.CODCDR, NVL(GPREGCONTAB.IDCAPITOLO,0), '|| ' NVL(GPREGCONTAB.CODANNOCONT,0), nvl(GPREGCONTAB.IDACCIMP,0),'|| ' GPREGCONTAB.QTAMOLTIMPUTAZIONE, NULL INDRIPARTIZIONE, NULL CODTIPOARROT,'|| ' GPREGCONTAB.IMPARROT, GPREGCONTAB.CODTIPOBEN, GPREGCONTAB.CODBENEFICIARIO, ''3'' ORDINE, '|| 'NVL(GPREGCONTAB.IDCAPITOLORIPART,0), NVL(GPREGCONTAB.IDACCIMPRIPART,0), GPREGCONTAB.QTAMOLTIMPRIPART, '|| 'GPREGCONTAB.CODTIPOBENRIPART, GPREGCONTAB.CODBENRIPART, GPREGCONTAB.CODCDRRIPART, '|| 'NVL(GPREGCONTAB.CODANNOCONTRIPART,0), GPREGCONTAB.INDSOSPESO '|| ' FROM GPREGCONTAB, GPTMPELRLAV'|| ' WHERE OWNER = '''|| lCODSESSIONE ||''' AND'|| ' '''|| lINDDIPFROMTMP || ''' = ''S'' AND'|| ' CODTIPOELE(+) = '''||lCODTIPOELE||''' AND'|| ' GPTMPELRLAV.IDRRLAV = GPREGCONTAB.IDRRLAV(+) ) )'|| ' UNION'|| '( SELECT GPREGCONTAB.CODANNO, GPREGCONTAB.CODPARTE, GPREGCONTAB.CODTIPOLEGAME,'|| 'GPREGCONTAB.CODSEGNOVOCE, GPREGCONTAB.CODTIPODIP, GPREGCONTAB.CODDIPENDENTE, '|| 'GPREGCONTAB.CODTIPOELE, GPREGCONTAB.CODELEMENTO, GPREGCONTAB.IDRCONTRIB, '|| 'GPREGCONTAB.CODTIPOTASS, GPREGCONTAB.CODTPGRVOX, GPREGCONTAB.CODVALGRVOX, GPREGCONTAB.IDRRLAV,'|| 'GPREGCONTAB.CODFUNZIONE, GPREGCONTAB.CODSERVIZIO, TO_NUMBER(NULL) IDRPERSONA,'|| 'DESSERVIZIO DESTIPODIP, GPREGCONTAB.CODCDR, GPREGCONTAB.IDCAPITOLO,'|| 'GPREGCONTAB.CODANNOCONT, GPREGCONTAB.IDACCIMP, GPREGCONTAB.QTAMOLTIMPUTAZIONE,'|| 'GPREGCONTAB.INDRIPARTIZIONE, GPREGCONTAB.CODTIPOARROT, GPREGCONTAB.IMPARROT, '|| 'GPREGCONTAB.CODTIPOBEN, GPREGCONTAB.CODBENEFICIARIO, ''2'' ORDINE, '|| 'GPREGCONTAB.IDCAPITOLORIPART, GPREGCONTAB.IDACCIMPRIPART, GPREGCONTAB.QTAMOLTIMPRIPART, '|| 'GPREGCONTAB.CODTIPOBENRIPART, GPREGCONTAB.CODBENRIPART, GPREGCONTAB.CODCDRRIPART, '|| 'GPREGCONTAB.CODANNOCONTRIPART, GPREGCONTAB.INDSOSPESO '|| ' FROM GPREGCONTAB, GPFUNZSERV'|| ' WHERE GPREGCONTAB.CODENTEAZ = UPPER('''|| lCODENTEAZ ||''') AND'|| ' GPREGCONTAB.CODTIPODIP = ''GRP'' AND'|| ' GPREGCONTAB.CODANNO = '''|| lCODANNO ||''' AND'|| ' GPREGCONTAB.CODSERVIZIO = GPFUNZSERV.CODSERVIZIO AND'|| ' GPREGCONTAB.CODFUNZIONE = GPFUNZSERV.CODFUNZIONE AND'|| ' CODTIPOELE = '''||lCODTIPOELE||''')'|| ' UNION'|| ' ( SELECT DISTINCT 0 CODANNO, NULL CODPARTE, NULL CODTIPOLEGAME,'|| ' NULL CODSEGNOVOCE, ''GRP'' CODTIPODIP, NULL CODDIPENDENTE,'|| ' NULL CODTIPOELE, NULL CODELEMENTO, TO_NUMBER(NULL) IDRCONTRIB,'|| ' NULL CODTIPOTASS, NULL CODTPGRVOX, NULL CODVALGRVOX, TO_NUMBER(NULL) IDRRLAV,'|| ' CODFUNZIONE, CODSERVIZIO, TO_NUMBER(NULL) IDRPERSONA,'|| ' DESSERVIZIO DESTIPODIP, TO_NUMBER(NULL) CODCDR, 0 IDCAPITOLO,'|| ' TO_NUMBER(NULL) CODANNOCONT, 0 IDACCIMP, TO_NUMBER(NULL) QTAMOLTIMPUTAZIONE,'|| ' NULL INDRIPARTIZIONE, NULL CODTIPOARROT, TO_NUMBER(NULL) IMPARROT,'|| ' NULL CODTIPOBEN, NULL CODBENEFICIARIO, ''2'' ORDINE, '|| ' 0 IDCAPITOLORIPART, 0 IDACCIMPRIPART, 0 QTAMOLTIMPRIPART, '|| ' ''E'' CODTIPOBENRIPART, ''.'' CODBENRIPART, 0 CODCDRRIPART, '|| ' 0 CODANNOCONTRIPART, ''N'' INDSOSPESO '|| ' FROM GPFUNZSERV'|| ' WHERE CODENTEAZ = UPPER('''||lCODENTEAZ||''') AND'|| ' ( GPFUNZSERV.CODFUNZIONE, GPFUNZSERV.CODSERVIZIO ) NOT IN'|| ' (SELECT DISTINCT CODFUNZIONE, CODSERVIZIO'|| ' FROM GPREGCONTAB'|| ' WHERE GPREGCONTAB.CODENTEAZ = UPPER('''||lCODENTEAZ||''') AND'|| ' GPREGCONTAB.CODTIPODIP = ''GRP'' AND'|| ' CODTIPOELE = '''||lCODTIPOELE||''' AND'|| ' GPREGCONTAB.CODANNO = '''||lCODANNO||''') )'|| 'UNION'|| '( SELECT GPREGCONTAB.CODANNO, GPREGCONTAB.CODPARTE, GPREGCONTAB.CODTIPOLEGAME, '|| 'GPREGCONTAB.CODSEGNOVOCE, GPREGCONTAB.CODTIPODIP, GPREGCONTAB.CODDIPENDENTE, '|| 'GPREGCONTAB.CODTIPOELE, GPREGCONTAB.CODELEMENTO, GPREGCONTAB.IDRCONTRIB,'|| 'GPREGCONTAB.CODTIPOTASS, GPREGCONTAB.CODTPGRVOX, GPREGCONTAB.CODVALGRVOX,'|| 'GPREGCONTAB.IDRRLAV, GPREGCONTAB.CODFUNZIONE, GPREGCONTAB.CODSERVIZIO, '|| 'TO_NUMBER(NULL) IDRPERSONA, ''Tutti i Dipendenti'' DESTIPODIP, GPREGCONTAB.CODCDR,'|| 'GPREGCONTAB.IDCAPITOLO, GPREGCONTAB.CODANNOCONT, GPREGCONTAB.IDACCIMP,'|| 'GPREGCONTAB.QTAMOLTIMPUTAZIONE, GPREGCONTAB.INDRIPARTIZIONE, GPREGCONTAB.CODTIPOARROT,'|| 'GPREGCONTAB.IMPARROT, GPREGCONTAB.CODTIPOBEN, GPREGCONTAB.CODBENEFICIARIO, ''1'' ORDINE, '|| 'GPREGCONTAB.IDCAPITOLORIPART, GPREGCONTAB.IDACCIMPRIPART, GPREGCONTAB.QTAMOLTIMPRIPART, '|| 'GPREGCONTAB.CODTIPOBENRIPART, GPREGCONTAB.CODBENRIPART, GPREGCONTAB.CODCDRRIPART, '|| 'GPREGCONTAB.CODANNOCONTRIPART, GPREGCONTAB.INDSOSPESO '|| ' FROM GPREGCONTAB'|| ' WHERE GPREGCONTAB.CODENTEAZ = UPPER('''|| lCODENTEAZ ||''') AND'|| ' GPREGCONTAB.CODANNO = '''|| lCODANNO ||''' AND'|| ' GPREGCONTAB.CODTIPODIP = ''ALL'' AND'|| ' CODTIPOELE = '''||lCODTIPOELE||''')'|| 'UNION'|| '( SELECT 0 CODANNO, NULL CODPARTE, NULL CODTIPOLEGAME,'|| ' NULL CODSEGNOVOCE, ''ALL'' CODTIPODIP, NULL CODDIPENDENTE,'|| ' NULL CODTIPOELE, NULL CODELEMENTO, TO_NUMBER(NULL) IDRCONTRIB,'|| ' NULL CODTIPOTASS, NULL CODTPGRVOX, NULL CODVALGRVOX, TO_NUMBER(NULL) IDRRLAV,'|| ' NULL CODFUNZIONE, NULL CODSERVIZIO, TO_NUMBER(NULL) IDRPERSONA,'|| ' ''Tutti i Dipendenti'' DESTIPODIP, TO_NUMBER(NULL) CODCDR, 0 IDCAPITOLO,'|| ' TO_NUMBER(NULL) CODANNOCONT, 0 IDACCIMP, TO_NUMBER(NULL) QTAMOLTIMPUTAZIONE,'|| ' NULL INDRIPARTIZIONE, NULL CODTIPOARROT, TO_NUMBER(NULL) IMPARROT,'|| ' NULL CODTIPOBEN, NULL CODBENEFICIARIO, ''1'' ORDINE, '|| ' 0 IDCAPITOLORIPART, 0 IDACCIMPRIPART, 0 QTAMOLTIMPRIPART, '|| ' ''E'' CODTIPOBENRIPART, ''.'' CODBENRIPART, 0 CODCDRRIPART, '|| ' 0 CODANNOCONTRIPART, ''N'' INDSOSPESO '|| ' FROM DUAL'|| ' WHERE 0 = ( SELECT COUNT(*) FROM GPREGCONTAB '|| ' WHERE GPREGCONTAB.CODENTEAZ = UPPER('''|| lCODENTEAZ ||''') AND'|| ' GPREGCONTAB.CODANNO = '''|| lCODANNO ||''' AND'|| ' GPREGCONTAB.CODTIPODIP = ''ALL'' AND'|| ' CODTIPOELE = '''||lCODTIPOELE||''') ) )'; sWHERE := ' WHERE CODTIPODIP IN ( '||sCODTIPODIP || ' )'; lQUERY := sSELECT || sFROM || sWHERE; nRet := PKUTILITYPAG.fnCreateView ( lQuery, lCodSessione, sNomeVista, ERRDIAG ); IF nRet < 0 THEN RETURN nRet; END IF; lNOMEVISTA := sNOMEVISTA; -- Oltre a creare la vista dinamica devo inserire, eventualmente, dei record in GPTMPREGCONTAB, -- segnalando record da cancellare in fase di Sync IF lINDDIPFROMTMP = 'S' THEN INSERT INTO GPTMPREGCONTAB( OWNER, CODANNO, CODPARTE, CODTIPOLEGAME, CODSEGNOVOCE, CODTIPODIP, CODDIPENDENTE, CODTIPOELE, CODELEMENTO, IDRCONTRIB, CODTIPOTASS, CODTPGRVOX, CODVALGRVOX, IDRRLAV, CODFUNZIONE, CODSERVIZIO, CODCDR, IDCAPITOLO, CODANNOCONT, IDACCIMP, QTAMOLTIMPUTAZIONE, INDRIPARTIZIONE, CODTIPOARROT, IMPARROT, CODTIPOBEN, CODBENEFICIARIO , INDTODEL, INDREGRICH, IDCAPITOLORIPART, IDACCIMPRIPART, QTAMOLTIMPRIPART, CODTIPOBENRIPART, CODBENRIPART, CODCDRRIPART, CODANNOCONTRIPART, TMSLOCK, INDSOSPESO ) SELECT DISTINCT lCODSESSIONE, CODANNO, CODPARTE, CODTIPOLEGAME, CODSEGNOVOCE, CODTIPODIP, CODDIPENDENTE, CODTIPOELE, CODELEMENTO, IDRCONTRIB, CODTIPOTASS, CODTPGRVOX, CODVALGRVOX, IDRRLAV, CODFUNZIONE, CODSERVIZIO, CODCDR, IDCAPITOLO, CODANNOCONT, IDACCIMP, QTAMOLTIMPUTAZIONE, INDRIPARTIZIONE, CODTIPOARROT, IMPARROT, CODTIPOBEN, CODBENEFICIARIO, 'S', 'N', DECODE(IDCAPITOLORIPART, NULL, 0, IDCAPITOLORIPART), DECODE(IDACCIMPRIPART, NULL, 0, IDACCIMPRIPART), DECODE(QTAMOLTIMPRIPART, NULL, 0, QTAMOLTIMPRIPART), DECODE(CODTIPOBENRIPART, NULL, 'E', CODTIPOBENRIPART), DECODE(CODBENRIPART, NULL, '.', CODBENRIPART), DECODE(CODCDRRIPART, NULL, 0, CODCDRRIPART), DECODE(CODANNOCONTRIPART, NULL, 0, CODANNOCONTRIPART), lTimeStamp, GPREGCONTAB.INDSOSPESO FROM GPREGCONTAB WHERE CODENTEAZ = lCODENTEAZ AND CODANNO = lCODANNO AND CODTIPODIP = 'DIP' AND IDRRLAV NOT IN ( SELECT DISTINCT IDRRLAV FROM GPTMPELRLAV WHERE OWNER = lCODSESSIONE ); END IF; COMMIT; RETURN 1; EXCEPTION WHEN OTHERS THEN RETURN pkUtility.fnError( 'fnREGCONTABDvr', SQLCODE, ERRDIAG ); END fnREGCONTABDvr; /******************************************************************************* * Autore: Pace Marco, 24/10/2001 * *******************************************************************************/ -- Funzione per il riempimento della tabella temporanea GPTMPELRLAV a partire dagli -- IDRRLAV presenti nella GPTMPREGCONTAB con OWNER = lCodSessione FUNCTION fnGPTMPELRLAVInitContab ( lVIEWNAME IN pkType.tyStringa%type, lCOMMIT IN pkType.tyStringa%type, lCODSESSIONE IN pkType.tyStringa%type, ERRDIAG OUT pkType.tyStringa%type ) RETURN NUMERIC IS nIDRRLAV GPREGCONTAB.idrrlav%TYPE; nRET NUMBER(9); -- DEVO COSTRUIRMI DINAMICAMENTE LA QUERY: uso Dynamic SQL IGNORE INTEGER; SOURCE_CURSOR INTEGER; BEGIN -- Cancello dalla GPTMPELRLAV i record appartenenti all'OWNER attuale o vecchi DELETE FROM GPTMPELRLAV WHERE OWNER = lCODSESSIONE OR TO_CHAR ( sysdate, 'YYYYMMDDHH24MI' ) - SUBSTR ( TMSLOCK, 1, 12 ) > 2400 ; SOURCE_CURSOR := DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(SOURCE_CURSOR , 'SELECT DISTINCT IDRRLAV '|| ' FROM ' || lVIEWNAME || ' '|| ' WHERE CODTIPODIP = ''DIP'' ', dbms_sql.v7 ); -- definisco variabili in cui inserire i valori ottenuti dalla select DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR , 1, nIDRRLAV ); IGNORE:=DBMS_SQL.EXECUTE(SOURCE_CURSOR); -- scorro cursore LOOP IF DBMS_SQL.FETCH_ROWS( SOURCE_CURSOR ) > 0 THEN -- Istanzio le variabili ai valori trovati con il cursore SOURCE_CURSOR DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR , 1, nIDRRLAV ); nRet := pkGPPERSONA2.fngptmpelrlavins(nIDRRLAV, ''/*ldtainizio*/, ''/*ldtafine*/, ''/*lcodmatricola*/, ''/*lcodtiporl*/, ''/*lidrpersona*/, ''/*ldescognome*/, ''/*ldesnome*/, ''/*ldesrapporto*/, 'N'/*linderronexists*/,'N'/*lcommit*/, lCODSESSIONE, ERRDIAG); IF nRET < 0 THEN DBMS_SQL.close_CURSOR(SOURCE_CURSOR); ROLLBACK; RETURN nRET; END IF; ELSE EXIT; END IF; END LOOP; DBMS_SQL.close_CURSOR(SOURCE_CURSOR); IF lCOMMIT <> 'N' THEN COMMIT; END IF; RETURN 1; EXCEPTION WHEN OTHERS THEN IF DBMS_SQL.is_open(SOURCE_CURSOR) THEN DBMS_SQL.close_cursor(SOURCE_CURSOR); END IF; ROLLBACK; RETURN pkUtility.fnError('fnGPTMPELRLAVInitContab', SQLCODE, ERRDIAG); END fnGPTMPELRLAVInitContab; FUNCTION fnGPTMPREGCONTABInsUpd ( lCODANNO IN pkType.tyStringa%TYPE, lCODPARTE IN pkType.tyStringa%TYPE, lCODTIPOLEGAME IN pkType.tyStringa%TYPE, lCODSEGNOVOCE IN pkType.tyStringa%TYPE, lCODTIPODIP IN pkType.tyStringa%TYPE, lCODDIPENDENTE IN pkType.tyStringa%TYPE, lCODTIPOELE IN pkType.tyStringa%TYPE, lCODELEMENTO IN pkType.tyStringa%TYPE, lIDRCONTRIB IN pkType.tyStringa%TYPE, lCODTIPOTASS IN pkType.tyStringa%TYPE, lCODTPGRVOX IN pkType.tyStringa%TYPE, lCODVALGRVOX IN pkType.tyStringa%TYPE, lIDRRLAV IN pkType.tyStringa%TYPE, lCODFUNZIONE IN pkType.tyStringa%TYPE, lCODSERVIZIO IN pkType.tyStringa%TYPE, lCODCDR IN pkType.tyStringa%TYPE, lIDCAPITOLO IN pkType.tyStringa%TYPE, lCODANNOCONT IN pkType.tyStringa%TYPE, lIDACCIMP IN pkType.tyStringa%TYPE, lQTAMOLTIMPUTAZIONE IN pkType.tyStringa%TYPE, lINDRIPARTIZIONE IN pkType.tyStringa%TYPE, lCODTIPOARROT IN pkType.tyStringa%TYPE, lIMPARROT IN pkType.tyStringa%TYPE, lCODTIPOBEN IN pkType.tyStringa%TYPE, lCODBENEFICIARIO IN pkType.tyStringa%TYPE, lINDREGRICH IN pkType.tyStringa%TYPE, lIDCAPITOLORIPART IN pkType.tyStringa%TYPE, lIDACCIMPRIPART IN pkType.tyStringa%TYPE, lQTAMOLTIMPRIPART IN pkType.tyStringa%TYPE, lCODTIPOBENRIPART IN pkType.tyStringa%TYPE, lCODBENRIPART IN pkType.tyStringa%TYPE, lCODCDRRIPART IN pkType.tyStringa%TYPE, lCODANNOCONTRIPART IN pkType.tyStringa%TYPE, lINDSOSPESO IN pkType.tyStringa%TYPE, lIDRCONTRIBLst IN pkTypePag.tyLStringa%TYPE, -- GPTMPREGCONTABONE lIDCAPITOLORIPARTLst IN pkTypePag.tyLStringa%TYPE, -- GPTMPREGCONTABONE lIDACCIMPRIPARTLst IN pkTypePag.tyLStringa%TYPE, -- GPTMPREGCONTABONE lCODANNOCONTRIPARTLst IN pkTypePag.tyLStringa%TYPE, -- GPTMPREGCONTABONE lCOMMIT IN pkType.tyStringa%TYPE, lCODSESSIONE IN pkType.tyStringa%TYPE, ERRDIAG OUT pkType.tyStringa%TYPE ) RETURN NUMERIC IS bRet BOOLEAN; nRet NUMBER(9); ReturnError NUMBER(9); nCount NUMBER(9); nLastIDRCONTRIB NUMBER(9); lTIDRCONTRIB PKTYPE.TYTSTRINGA; nLastIDCAPITOLORIPART NUMBER(9); lTIDCAPITOLORIPART PKTYPE.TYTSTRINGA; nLastIDACCIMPRIPART NUMBER(9); lTIDACCIMPRIPART PKTYPE.TYTSTRINGA; nLastCODANNOCONTRIPART NUMBER(9); lTCODANNOCONTRIPART PKTYPE.TYTSTRINGA; lTimeStamp GPTMPREGCONTAB.TMSLOCK%TYPE := TO_CHAR( SYSDATE, 'YYYYMMDDHH24MISS' ); BEGIN SAVEPOINT mainfnGPTMPREGCONTABInsUpd; -- Controllo se è già presente un record con la chiave primaria passata in INPUT SELECT COUNT(*) INTO nCount FROM GPTMPREGCONTAB WHERE OWNER = lCODSESSIONE AND CODANNO = UPPER(lCODANNO) AND CODPARTE = UPPER(lCODPARTE) AND CODTIPOLEGAME = UPPER(lCODTIPOLEGAME) AND CODSEGNOVOCE = UPPER(lCODSEGNOVOCE) AND CODTIPODIP = UPPER(lCODTIPODIP) AND CODDIPENDENTE = UPPER(lCODDIPENDENTE) AND CODTIPOELE = UPPER(lCODTIPOELE) AND CODELEMENTO = UPPER(lCODELEMENTO); IF nCount = 0 THEN -- Il record non è presente => lo inserisco: INSERT INTO GPTMPREGCONTAB ( OWNER, CODANNO, CODPARTE, CODTIPOLEGAME, CODSEGNOVOCE, CODTIPODIP, CODDIPENDENTE, CODTIPOELE, CODELEMENTO, IDRCONTRIB, CODTIPOTASS, CODTPGRVOX, CODVALGRVOX, IDRRLAV, CODFUNZIONE, CODSERVIZIO, CODCDR, IDCAPITOLO, CODANNOCONT, IDACCIMP, QTAMOLTIMPUTAZIONE, INDRIPARTIZIONE, CODTIPOARROT, IMPARROT, CODTIPOBEN, CODBENEFICIARIO, INDTODEL, INDREGRICH, IDCAPITOLORIPART, IDACCIMPRIPART, QTAMOLTIMPRIPART, CODTIPOBENRIPART, CODBENRIPART, CODCDRRIPART, CODANNOCONTRIPART, TMSLOCK, INDSOSPESO ) VALUES ( TO_NUMBER(lCODSESSIONE), TO_NUMBER(lCODANNO), UPPER(lCODPARTE), UPPER(lCODTIPOLEGAME), UPPER(lCODSEGNOVOCE), UPPER(lCODTIPODIP), UPPER(lCODDIPENDENTE), UPPER(lCODTIPOELE), UPPER(lCODELEMENTO), TO_NUMBER(lIDRCONTRIB), UPPER(lCODTIPOTASS), UPPER(lCODTPGRVOX), UPPER(lCODVALGRVOX), TO_NUMBER(lIDRRLAV), UPPER(lCODFUNZIONE), UPPER(lCODSERVIZIO), TO_NUMBER(lCODCDR), TO_NUMBER(lIDCAPITOLO), TO_NUMBER(lCODANNOCONT), TO_NUMBER(lIDACCIMP), TO_NUMBER(lQTAMOLTIMPUTAZIONE), UPPER(lINDRIPARTIZIONE), UPPER(lCODTIPOARROT), TO_NUMBER(lIMPARROT), UPPER(lCODTIPOBEN), UPPER(lCODBENEFICIARIO), 'N', UPPER(lINDREGRICH), DECODE(lIDCAPITOLORIPART, NULL, 0, lIDCAPITOLORIPART), DECODE(lIDACCIMPRIPART, NULL, 0, lIDACCIMPRIPART), DECODE(lQTAMOLTIMPRIPART, NULL, 0, lQTAMOLTIMPRIPART), DECODE(lCODTIPOBENRIPART, NULL, 'E', lCODTIPOBENRIPART), DECODE(lCODBENRIPART, NULL, '.', lCODBENRIPART), DECODE(lCODCDRRIPART, NULL, 0, lCODCDRRIPART), DECODE(lCODANNOCONTRIPART, NULL, 0, lCODANNOCONTRIPART), lTimeStamp, NVL(UPPER(lINDSOSPESO),'N') ); ELSE -- C'è già un record con la stessa chiave => AGGIORNAMENTO UPDATE GPTMPREGCONTAB SET IDRCONTRIB = TO_NUMBER(lIDRCONTRIB), CODTIPOTASS = UPPER(lCODTIPOTASS), CODTPGRVOX = UPPER(lCODTPGRVOX), CODVALGRVOX = UPPER(lCODVALGRVOX), IDRRLAV = TO_NUMBER(lIDRRLAV), CODFUNZIONE = UPPER(lCODFUNZIONE), CODSERVIZIO = UPPER(lCODSERVIZIO), CODCDR = TO_NUMBER(lCODCDR), IDCAPITOLO = TO_NUMBER(lIDCAPITOLO), CODANNOCONT = TO_NUMBER(lCODANNOCONT), IDACCIMP = TO_NUMBER(lIDACCIMP), QTAMOLTIMPUTAZIONE = TO_NUMBER(lQTAMOLTIMPUTAZIONE), INDRIPARTIZIONE = UPPER(lINDRIPARTIZIONE), CODTIPOARROT = UPPER(lCODTIPOARROT), IMPARROT = TO_NUMBER(lIMPARROT), CODTIPOBEN = UPPER(lCODTIPOBEN), CODBENEFICIARIO = UPPER(lCODBENEFICIARIO), INDTODEL = 'N', INDREGRICH = UPPER(lINDREGRICH), IDCAPITOLORIPART = DECODE(lIDCAPITOLORIPART, NULL, 0, lIDCAPITOLORIPART), IDACCIMPRIPART = DECODE(lIDACCIMPRIPART, NULL, 0, lIDACCIMPRIPART), QTAMOLTIMPRIPART = DECODE(lQTAMOLTIMPRIPART, NULL, 0, lQTAMOLTIMPRIPART), CODTIPOBENRIPART = DECODE(lCODTIPOBENRIPART, NULL, 'E', lCODTIPOBENRIPART), CODBENRIPART = DECODE(lCODBENRIPART, NULL, '.', lCODBENRIPART), CODCDRRIPART = DECODE(lCODCDRRIPART, NULL, 0, lCODCDRRIPART), CODANNOCONTRIPART = DECODE(lCODANNOCONTRIPART, NULL, 0, lCODANNOCONTRIPART), TMSLOCK = lTimeStamp, INDSOSPESO = NVL(UPPER(lINDSOSPESO),'N') WHERE OWNER = lCODSESSIONE AND CODANNO = UPPER(lCODANNO) AND CODPARTE = UPPER(lCODPARTE) AND CODTIPOLEGAME = UPPER(lCODTIPOLEGAME) AND CODSEGNOVOCE = UPPER(lCODSEGNOVOCE) AND CODTIPODIP = UPPER(lCODTIPODIP) AND CODDIPENDENTE = UPPER(lCODDIPENDENTE) AND CODTIPOELE = UPPER(lCODTIPOELE) AND CODELEMENTO = UPPER(lCODELEMENTO); END IF; -- Gestione della tabella GPTmpRegContabOne -- Cancello i record della tabella DELETE FROM GPTMPREGCONTABONE WHERE OWNER = lCODSESSIONE AND CODANNO = UPPER(lCODANNO) AND CODPARTE = UPPER(lCODPARTE) AND CODTIPOLEGAME = UPPER(lCODTIPOLEGAME) AND CODSEGNOVOCE = UPPER(lCODSEGNOVOCE) AND CODTIPODIP = UPPER(lCODTIPODIP) AND CODDIPENDENTE = UPPER(lCODDIPENDENTE) AND CODTIPOELE = UPPER(lCODTIPOELE) AND CODELEMENTO = UPPER(lCODELEMENTO); -- Splitto le stringhe date in input IF lIDRCONTRIBLst IS NOT NULL THEN nRet := PKUTILITY.fnRealSplit(lIDRCONTRIBLst,'§','',nLastIDRCONTRIB,ERRDIAG,lTIDRCONTRIB); IF nRet < 0 THEN ROLLBACK TO mainfnGPTMPREGCONTABInsUpd; RETURN nRet; END IF; nRet := PKUTILITY.fnRealSplit(lIDCAPITOLORIPARTLst,'§','',nLastIDCAPITOLORIPART,ERRDIAG,lTIDCAPITOLORIPART); IF nRet < 0 THEN ROLLBACK TO mainfnGPTMPREGCONTABInsUpd; RETURN nRet; END IF; nRet := PKUTILITY.fnRealSplit(lIDACCIMPRIPARTLst,'§','',nLastIDACCIMPRIPART,ERRDIAG,lTIDACCIMPRIPART); IF nRet < 0 THEN ROLLBACK TO mainfnGPTMPREGCONTABInsUpd; RETURN nRet; END IF; nRet := PKUTILITY.fnRealSplit(lCODANNOCONTRIPARTLst,'§','',nLastCODANNOCONTRIPART,ERRDIAG,lTCODANNOCONTRIPART); IF nRet < 0 THEN ROLLBACK TO mainfnGPTMPREGCONTABInsUpd; RETURN nRet; END IF; FOR I IN 1..nLastIDRCONTRIB LOOP INSERT INTO GPTMPREGCONTABONE (OWNER, CODANNO, CODPARTE, CODTIPOLEGAME, CODSEGNOVOCE, CODTIPODIP, CODDIPENDENTE, CODTIPOELE, CODELEMENTO, IDRCONTRIB,IDCAPITOLORIPART, IDACCIMPRIPART, CODANNOCONTRIPART, TMSLOCK ) VALUES (lCodSessione,UPPER(lCODANNO), UPPER(lCODPARTE),UPPER(lCODTIPOLEGAME), UPPER(lCODSEGNOVOCE),UPPER(lCODTIPODIP),UPPER(lCODDIPENDENTE), UPPER(lCODTIPOELE),UPPER(lCODELEMENTO), lTIDRCONTRIB(I),NVL(lTIDCAPITOLORIPART(I),0), NVL(lTIDACCIMPRIPART(I),0),NVL(lTCODANNOCONTRIPART(I),0), lTimeStamp); END LOOP; END IF; IF lCommit <> 'N' THEN COMMIT; END IF; RETURN 1; EXCEPTION WHEN OTHERS THEN ROLLBACK TO mainfnGPTMPREGCONTABInsUpd; RETURN pkUtility.fnError('fnGPTMPREGCONTABInsUpd', SQLCODE, ERRDIAG); END fnGPTMPREGCONTABInsUpd; FUNCTION fnGPREGCONTABSync ( lCODANNO IN pkType.tyStringa%TYPE, lCODTIPOELE IN pkType.tyStringa%TYPE, lCODENTEAZ IN pkType.tyStringa%TYPE, lCODSESSIONE IN pkType.tyStringa%TYPE, ERRDIAG OUT pkType.tyStringa%TYPE ) RETURN NUMERIC IS TYPE TycurGPTMPREGCONTAB IS REF CURSOR; curGPTMPREGCONTAB TycurGPTMPREGCONTAB; rowGPTMPREGCONTAB GPTMPREGCONTAB%ROWTYPE; nCount NUMBER(9); BEGIN -- Cancellazione dei record delle tabelle figlie di GPREGCONTAB -- nel caso in cui CODTIPOELE = 'VOX' IF UPPER(lCodTipoEle) = 'VOX' THEN DELETE FROM GPREGCONTABONE WHERE CODENTEAZ = UPPER(lCODENTEAZ) AND CODANNO = TO_NUMBER(lCODANNO) AND CODTIPODIP = 'DIP' AND CODTIPOELE = UPPER(lCODTIPOELE) AND (CODPARTE,CODTIPOLEGAME, CODSEGNOVOCE, CODDIPENDENTE, CODELEMENTO) IN ( SELECT A.CODPARTE, A.CODTIPOLEGAME, A.CODSEGNOVOCE, A.CODDIPENDENTE, A.CODELEMENTO FROM GPREGCONTAB A WHERE A.CODANNO = TO_NUMBER(lCODANNO) AND A.CODENTEAZ = UPPER(lCODENTEAZ) AND A.CODTIPOELE = UPPER(lCODTIPOELE) AND A.CODTIPODIP = 'DIP' AND A.IDRRLAV IN ( SELECT B.IDRRLAV FROM GPTMPREGCONTAB B WHERE B.OWNER = lCODSESSIONE AND B.INDTODEL = 'S' )); END IF; -- Comincio con la cancellazione dalla GPREGCONTAB di tutti i record -- presenti nella GPTMPREGCONTAB aventi INDTODEL = 'S' DELETE FROM GPREGCONTAB WHERE CODANNO = TO_NUMBER(lCODANNO) AND CODENTEAZ = UPPER(lCODENTEAZ) AND CODTIPOELE = UPPER(lCODTIPOELE) AND CODTIPODIP = 'DIP' AND IDRRLAV IN ( SELECT A.IDRRLAV FROM GPTMPREGCONTAB A WHERE A.OWNER = lCODSESSIONE AND A.INDTODEL = 'S' ); -- Se lCodTipoEle = 'VOX', cancello dalla GPRegContab tutti i record -- aventi chiave uguale alla chiave del record tranne che per lCodSegnoVoce: IF UPPER(lCodTipoEle) = 'VOX' THEN -- Cancello prima i record delle tabelle figlie. DELETE FROM GPREGCONTABONE WHERE CODENTEAZ = UPPER(lCODENTEAZ) AND ( CODANNO, CODPARTE, CODTIPOLEGAME,CODSEGNOVOCE, CODTIPODIP, CODDIPENDENTE, CODTIPOELE, CODELEMENTO ) IN ( SELECT A.CODANNO, A.CODPARTE, A.CODTIPOLEGAME,A.CODSEGNOVOCE, A.CODTIPODIP, A.CODDIPENDENTE, A.CODTIPOELE, A.CODELEMENTO FROM GPREGCONTAB A WHERE A.CODENTEAZ = UPPER(lCODENTEAZ) AND ( A.CODANNO, A.CODPARTE, A.CODTIPOLEGAME, A.CODTIPODIP, A.CODDIPENDENTE, A.CODTIPOELE, A.CODELEMENTO ) IN ( SELECT B.CODANNO, B.CODPARTE, B.CODTIPOLEGAME, B.CODTIPODIP, B.CODDIPENDENTE, B.CODTIPOELE, B.CODELEMENTO FROM GPTMPREGCONTAB B WHERE B.OWNER = lCODSESSIONE AND B.INDTODEL <> 'S' )); DELETE FROM GPREGCONTAB WHERE CODENTEAZ = UPPER(lCODENTEAZ) AND ( CODANNO, CODPARTE, CODTIPOLEGAME, CODTIPODIP, CODDIPENDENTE, CODTIPOELE, CODELEMENTO ) IN ( SELECT A.CODANNO, A.CODPARTE, A.CODTIPOLEGAME, A.CODTIPODIP, A.CODDIPENDENTE, A.CODTIPOELE, A.CODELEMENTO FROM GPTMPREGCONTAB A WHERE A.OWNER = lCODSESSIONE AND A.INDTODEL <> 'S' ); END IF; -- Passo ora all'INS/UPD dei record rimanenti: -- Cancello tutti i record dalla GPREGCONTAB presenti nella GPTMPREGCONTAB -- (in base alla chiave) che devono essere modificati, e che non rientrano -- casi precedenti IF UPPER(lCodTipoEle) = 'VOX' THEN DELETE FROM GPREGCONTABONE WHERE CODENTEAZ = UPPER(lCODENTEAZ) AND ( CODANNO, CODPARTE, CODTIPOLEGAME,CODSEGNOVOCE, CODTIPODIP, CODDIPENDENTE, CODTIPOELE, CODELEMENTO ) IN ( SELECT A.CODANNO, A.CODPARTE, A.CODTIPOLEGAME,A.CODSEGNOVOCE, A.CODTIPODIP, A.CODDIPENDENTE, A.CODTIPOELE, A.CODELEMENTO FROM GPREGCONTAB A WHERE A.CODENTEAZ = UPPER(lCODENTEAZ) AND ( A.CODANNO, A.CODPARTE, A.CODTIPOLEGAME, A.CODSEGNOVOCE, A.CODTIPODIP, A.CODDIPENDENTE, A.CODTIPOELE, A.CODELEMENTO ) IN ( SELECT B.CODANNO, B.CODPARTE, B.CODTIPOLEGAME, B.CODSEGNOVOCE, B.CODTIPODIP, B.CODDIPENDENTE, B.CODTIPOELE, B.CODELEMENTO FROM GPTMPREGCONTAB B WHERE B.OWNER = lCODSESSIONE AND B.INDTODEL <> 'S' )); END IF; DELETE FROM GPREGCONTAB WHERE CODENTEAZ = UPPER(lCODENTEAZ) AND ( CODANNO, CODPARTE, CODTIPOLEGAME, CODSEGNOVOCE, CODTIPODIP, CODDIPENDENTE, CODTIPOELE, CODELEMENTO ) IN ( SELECT A.CODANNO, A.CODPARTE, A.CODTIPOLEGAME, A.CODSEGNOVOCE, A.CODTIPODIP, A.CODDIPENDENTE, A.CODTIPOELE, A.CODELEMENTO FROM GPTMPREGCONTAB A WHERE A.OWNER = lCODSESSIONE AND A.INDTODEL <> 'S' ); -- Inserimento: INSERT INTO GPREGCONTAB ( CODENTEAZ, CODANNO, CODPARTE, CODTIPOLEGAME, CODSEGNOVOCE, CODTIPODIP, CODDIPENDENTE, CODTIPOELE, CODELEMENTO, IDRCONTRIB, CODTIPOTASS, CODTPGRVOX, CODVALGRVOX, IDRRLAV, CODFUNZIONE, CODSERVIZIO, CODCDR, IDCAPITOLO, CODANNOCONT, IDACCIMP, QTAMOLTIMPUTAZIONE, INDRIPARTIZIONE, CODTIPOARROT, IMPARROT, CODTIPOBEN, CODBENEFICIARIO, IDCAPITOLORIPART, IDACCIMPRIPART, QTAMOLTIMPRIPART, CODTIPOBENRIPART, CODBENRIPART, CODCDRRIPART, CODANNOCONTRIPART, INDSOSPESO ) ( SELECT lCODENTEAZ, CODANNO, CODPARTE, CODTIPOLEGAME, CODSEGNOVOCE, CODTIPODIP, CODDIPENDENTE, CODTIPOELE, CODELEMENTO, IDRCONTRIB, CODTIPOTASS, CODTPGRVOX, CODVALGRVOX, IDRRLAV, CODFUNZIONE, CODSERVIZIO, CODCDR, IDCAPITOLO, CODANNOCONT, IDACCIMP, QTAMOLTIMPUTAZIONE, NVL( INDRIPARTIZIONE, 'N'), NVL(CODTIPOARROT,'A'), NVL(IMPARROT,0), CODTIPOBEN, DECODE(CODBENEFICIARIO, NULL, '.', CODBENEFICIARIO), IDCAPITOLORIPART, IDACCIMPRIPART, QTAMOLTIMPRIPART, CODTIPOBENRIPART, CODBENRIPART, CODCDRRIPART, CODANNOCONTRIPART, NVL(INDSOSPESO,'N') FROM GPTMPREGCONTAB WHERE OWNER = lCODSESSIONE AND INDTODEL <> 'S' AND -- Non inserisco i record da cancellare INDREGRICH = 'S' ); -- Inserimento nella tabella GPREGCONTABONE -- Solo se il parametro lCodTipoEle = 'VOX' IF UPPER(lCodTipoEle) = 'VOX' THEN INSERT INTO GPREGCONTABONE ( CODENTEAZ, CODANNO, CODPARTE, CODTIPOLEGAME, CODSEGNOVOCE,CODTIPODIP,CODDIPENDENTE,CODTIPOELE,CODELEMENTO,IDRCONTRIB, IDCAPITOLORIPART, IDACCIMPRIPART,CODANNOCONTRIPART ) ( SELECT lCODENTEAZ,CODANNO,CODPARTE,CODTIPOLEGAME,CODSEGNOVOCE, CODTIPODIP,CODDIPENDENTE,CODTIPOELE,CODELEMENTO,IDRCONTRIB, IDCAPITOLORIPART,IDACCIMPRIPART,CODANNOCONTRIPART FROM GPTMPREGCONTABONE WHERE OWNER = lCODSESSIONE AND ( CODANNO,CODPARTE,CODTIPOLEGAME,CODSEGNOVOCE,CODTIPODIP, CODDIPENDENTE,CODTIPOELE,CODELEMENTO ) IN ( SELECT CODANNO,CODPARTE,CODTIPOLEGAME,CODSEGNOVOCE,CODTIPODIP, CODDIPENDENTE,CODTIPOELE,CODELEMENTO FROM GPTMPREGCONTAB WHERE INDTODEL <> 'S' AND -- Non inserisco i record da cancellare INDREGRICH = 'S' )); END IF; /* -- Controlli 1. Che le voci di partite di giro abbiano l'entrata e la spesa 2. Che gli oneri di integrazione siano non ripartiti */ COMMIT; RETURN 1; EXCEPTION WHEN OTHERS THEN IF curGPTMPREGCONTAB%ISOPEN THEN CLOSE curGPTMPREGCONTAB; END IF; ROLLBACK; RETURN pkUtility.fnError('fnGPREGCONTABSync', SQLCODE, ERRDIAG); END fnGPREGCONTABSync; FUNCTION fnGPREGCONTABDel ( lCODENTEAZ IN pkType.tyStringa%TYPE, lVIEWNAME IN pkType.tyStringa%TYPE, lCOMMIT IN pkType.tyStringa%TYPE, ERRDIAG OUT pkType.tyStringa%TYPE ) RETURN NUMERIC IS nCur1 INTEGER; nEx NUMBER; BEGIN IF lCODENTEAZ IS NULL THEN ERRDIAG := 'Operazione impossibile: il Codice Ente/Azienda è nullo'; RETURN pkUtility.fnerror('3fnGPREGCONTABDel', -499, ERRDIAG); END IF; nCur1:=DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE( nCur1 , ' DELETE FROM GPREGCONTABONE ' || ' WHERE CODENTEAZ = UPPER('''||lCODENTEAZ||''') AND '|| ' (CODANNO, CODPARTE, CODTIPOLEGAME, CODSEGNOVOCE, CODTIPODIP, CODDIPENDENTE, CODTIPOELE, CODELEMENTO) IN '|| ' ( SELECT CODANNO, CODPARTE, CODTIPOLEGAME, CODSEGNOVOCE, CODTIPODIP, '|| ' CODDIPENDENTE, CODTIPOELE, CODELEMENTO '|| ' FROM '||lVIEWNAME|| ' WHERE CODANNO <> 0 )', dbms_sql.v7 ); nEx:=DBMS_SQL.EXECUTE( nCur1 ); DBMS_SQL.close_CURSOR( nCur1 ); nCur1:=DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE( nCur1 , ' DELETE FROM GPREGCONTAB ' || ' WHERE CODENTEAZ = UPPER('''||lCODENTEAZ||''') AND '|| ' (CODANNO, CODPARTE, CODTIPOLEGAME, CODSEGNOVOCE, CODTIPODIP, CODDIPENDENTE, CODTIPOELE, CODELEMENTO) IN '|| ' ( SELECT CODANNO, CODPARTE, CODTIPOLEGAME, CODSEGNOVOCE, CODTIPODIP, '|| ' CODDIPENDENTE, CODTIPOELE, CODELEMENTO '|| ' FROM '||lVIEWNAME|| ' WHERE CODANNO <> 0 )', dbms_sql.v7 ); nEx:=DBMS_SQL.EXECUTE( nCur1 ); DBMS_SQL.close_CURSOR( nCur1 ); IF lCommit <> 'N' THEN COMMIT; END IF; RETURN 1; EXCEPTION WHEN OTHERS THEN IF DBMS_SQL.is_open(nCur1) THEN DBMS_SQL.close_cursor(nCur1); END IF; ROLLBACK; RETURN pkUtility.fnerror('3fnGPREGCONTABDel', SQLCODE, ERRDIAG); END fnGPREGCONTABDel; -- Funzione che cancella tutti i record in base all'OWNER FUNCTION fnGPTMPREGCONTABClear ( lCOMMIT IN pkType.tyStringa%TYPE, lCODSESSIONE IN pkType.tyStringa%TYPE, ERRDIAG OUT pkType.tyStringa%TYPE ) RETURN NUMERIC IS BEGIN IF lCODSESSIONE IS NOT NULL THEN DELETE FROM GPTMPREGCONTABONE WHERE OWNER = lCODSESSIONE; DELETE FROM GPTMPREGCONTAB WHERE OWNER = lCODSESSIONE; END IF; IF lCOMMIT <> 'N' THEN COMMIT; END IF; RETURN 1; EXCEPTION WHEN OTHERS THEN ROLLBACK; RETURN pkUtility.fnerror('fnGPTMPREGCONTABClear', SQLCODE, ERRDIAG); END fnGPTMPREGCONTABClear; -- Autore: SA20011108, funzione che estrae informazioni sui Capitoli/CDR/Accertamenti/ -- Impegni da Contabilità FUNCTION fnGPCONTABILITADVR ( lCODANNO IN PKTYPE.TYSTRINGA%TYPE, -- NON LO GESTISCO lDESSCHEMASERFIN IN PKTYPE.TYSTRINGA%TYPE, lCODSESSIONE IN PKTYPE.TYSTRINGA%TYPE, lNOMEVISTACDR OUT PKTYPE.TYSTRINGA%TYPE, lNOMEVISTACAP OUT PKTYPE.TYSTRINGA%TYPE, lNOMEVISTAACC OUT PKTYPE.TYSTRINGA%TYPE, lNOMEVISTAIMP OUT PKTYPE.TYSTRINGA%TYPE, ERRDIAG OUT PKTYPE.TYSTRINGA%TYPE) RETURN NUMERIC IS nRet NUMBER(9); sNomeVistaCDR pktype.TyStringa%Type:= 'GPCDR'; sNomeVistaCAP pktype.TyStringa%Type:= 'GPCAPITOLI'; sNomeVistaACC pktype.TyStringa%Type:= 'GPACCERT'; sNomeVistaIMP pktype.TyStringa%Type:= 'GPIMPEGNI'; sQUERYCDR VARCHAR2(30000); sQUERYCAP VARCHAR2(30000); sQUERYACC VARCHAR2(30000); sQUERYIMP VARCHAR2(30000); nNumRec NUMBER(9); sNomeSchema VARCHAR2(255); sNomeDBLink VARCHAR2(255); sQuery VARCHAR2(4000); BEGIN -- Il campo DESSCHEMASERFIN ora può essere nella forma SCHEMA@DBLINK IF INSTR(lDESSCHEMASERFIN, '@') > 0 THEN sNomeSchema := SUBSTR(lDESSCHEMASERFIN, 1, INSTR(lDESSCHEMASERFIN, '@') - 1); sNomeDBLink := SUBSTR(lDESSCHEMASERFIN, INSTR(lDESSCHEMASERFIN, '@') + 1, LENGTH(lDESSCHEMASERFIN)); ELSE sNomeSchema := lDESSCHEMASERFIN; END IF; -- controllo se esiste lo schema con descrizione passata sQuery := 'SELECT COUNT(*) FROM ALL_USERS'; IF sNomeDBLink IS NOT NULL THEN sQuery := sQuery || '@' || sNomeDBLink; END IF; sQuery := sQuery || ' WHERE USERNAME = UPPER( ''' || sNomeSchema || ''' )'; EXECUTE IMMEDIATE sQuery INTO nNumRec; IF nNumRec = 0 THEN -- ritorno Errore ROLLBACK; ERRDIAG := 'L''Ente/Azienda selezionato non esiste in Contabilità'; RETURN pkUtility.fnError( 'fnGPCONTABILITADVR', -499, ERRDIAG ); END IF; sQuery := 'SELECT COUNT(*) FROM ALL_TABLES'; IF sNomeDBLink IS NOT NULL THEN sQuery := sQuery || '@' || sNomeDBLink; END IF; sQuery := sQuery || ' WHERE TABLE_NAME IN ( UPPER( ''CFCentriDiCostoRicavo''), UPPER(''CFCENTRIRESPONSABILITA''), ' || 'UPPER(''CFDESCENTRIRESP''), UPPER(''CFRESPONSABILI''), UPPER(''CFCAPITOLIPEG''), ' || 'UPPER(''CFACCERTAMENTI''), UPPER(''CFIMPEGNI'') ) AND ' || 'OWNER = UPPER( ''' || sNomeSchema || ''' )'; EXECUTE IMMEDIATE sQuery INTO nNumRec; IF nNumRec <> 7 THEN -- ritorno Errore ROLLBACK; ERRDIAG := 'Nello schema specificato non esistono alcune tabelle necessarie alla Contabilizzazione'; RETURN pkUtility.fnError( 'fnGPCONTABILITADVR', -499, ERRDIAG ); END IF; sQUERYCDR := 'SELECT A.CODCDR , A.CODRESP , A.NUMCDR , C.DESCDR , B.DESRESP,' || 'C.DESCDR ||'' - ''|| B.DESRESP DESESTESACDR'|| ' FROM '|| sNomeSchema||'.CFCENTRIRESPONSABILITA'; IF sNomeDBLink IS NOT NULL THEN sQUERYCDR := sQUERYCDR || '@' || sNomeDBLink; END IF; sQUERYCDR := sQUERYCDR || ' A,'|| sNomeSchema||'.CFDESCENTRIRESP'; IF sNomeDBLink IS NOT NULL THEN sQUERYCDR := sQUERYCDR || '@' || sNomeDBLink; END IF; sQUERYCDR := sQUERYCDR || ' C, '|| sNomeSchema|| '.CFRESPONSABILI'; IF sNomeDBLink IS NOT NULL THEN sQUERYCDR := sQUERYCDR || '@' || sNomeDBLink; END IF; sQUERYCDR := sQUERYCDR || ' B'|| ' WHERE A.CODRESP = B.CODRESP AND'|| ' A.NUMCDR = C.NUMCDR'; nRet := PKUTILITYPAG.fnCreateView ( sQUERYCDR, lCodSessione, sNomeVistaCDR, ERRDIAG ); IF nRet < 0 THEN RETURN nRet; END IF; lNOMEVISTACDR := sNOMEVISTACDR; sQUERYCAP := 'SELECT A.IDCAPITOLO , A.ESER , A.CODCDR , A.APP , A.UEB,'|| 'A.CODVOCE , A.CAP , A.ART , B.CODRESP, A.CAP||''/''|| A.ART || '' ('' || A.APP || '')'' ||'' ''||A.ESER DESCAPITOLO'|| ' FROM '|| sNomeSchema||'.CFCENTRIRESPONSABILITA'; IF sNomeDBLink IS NOT NULL THEN sQUERYCAP := sQUERYCAP || '@' || sNomeDBLink; END IF; sQUERYCAP := sQUERYCAP || ' B, '|| sNomeSchema||'.CFCAPITOLIPEG'; IF sNomeDBLink IS NOT NULL THEN sQUERYCAP := sQUERYCAP || '@' || sNomeDBLink; END IF; sQUERYCAP := sQUERYCAP || ' A'|| ' WHERE'|| ' A.CODCDR = B.CODCDR '; nRet := PKUTILITYPAG.fnCreateView ( sQUERYCAP, lCodSessione, sNOMEVISTACAP, ERRDIAG ); IF nRet < 0 THEN RETURN nRet; END IF; lNOMEVISTACAP := sNOMEVISTACAP; sQUERYACC := ' SELECT A.IDACC, A.ESER, A.NUMACC, A.NUMACC ||'' ''|| A.ESER DESESTESAACC,'|| ' A.IDCAPITOLO, B.CODCDR, B.CAP, B.ART, B.ESER ESERCAPITOLO, '|| ' B.CAP||''/''|| B.ART ||'' ''|| B.ESER DESCAPITOLO'|| ' FROM '|| sNomeSchema||'.CFACCERTAMENTI'; IF sNomeDBLink IS NOT NULL THEN sQUERYACC := sQUERYACC || '@' || sNomeDBLink; END IF; sQUERYACC := sQUERYACC || ' A, '||sNomeSchema||'.CFCAPITOLIPEG'; IF sNomeDBLink IS NOT NULL THEN sQUERYACC := sQUERYACC || '@' || sNomeDBLink; END IF; sQUERYACC := sQUERYACC || ' B'|| ' WHERE'|| ' A.IDCAPITOLO = B.IDCAPITOLO'; nRet := PKUTILITYPAG.fnCreateView ( sQUERYACC, lCodSessione, sNOMEVISTAACC, ERRDIAG ); IF nRet < 0 THEN RETURN nRet; END IF; lNOMEVISTAACC := sNOMEVISTAACC; sQUERYIMP := ' SELECT A.IDIMP, A.ESER, A.NUMIMP, A.NUMIMP ||'' ''|| A.ESER DESESTESAIMP,'|| ' A.IDCAPITOLO, B.CODCDR, B.CAP, B.ART, B.ESER ESERCAPITOLO,'|| ' B.CAP||''/''|| B.ART ||'' ''||B.ESER DESCAPITOLO'|| ' FROM '|| sNomeSchema||'.CFCAPITOLIPEG'; IF sNomeDBLink IS NOT NULL THEN sQUERYIMP := sQUERYIMP || '@' || sNomeDBLink; END IF; sQUERYIMP := sQUERYIMP || ' B, '|| sNomeSchema||'.CFIMPEGNI'; IF sNomeDBLink IS NOT NULL THEN sQUERYIMP := sQUERYIMP || '@' || sNomeDBLink; END IF; sQUERYIMP := sQUERYIMP || ' A'|| ' WHERE'|| ' A.IDCAPITOLO = B.IDCAPITOLO'; nRet := PKUTILITYPAG.fnCreateView ( sQUERYIMP, lCodSessione, sNOMEVISTAIMP, ERRDIAG ); IF nRet < 0 THEN RETURN nRet; END IF; lNOMEVISTAIMP := sNOMEVISTAIMP; RETURN 1; EXCEPTION WHEN OTHERS THEN ROLLBACK; RETURN pkUtility.fnError( 'fnGPCONTABILITADVR', SQLCODE, ERRDIAG ); END fnGPCONTABILITADVR; /************************************************************************** * CONTABILIZZAZIONE * ***************************************************************************/ -- Autore: SA20011213 -- funzione che riempie la GPRISCONT a partire dai dettagli ( GPDETRISCONT) e dalla -- temporanea delle regole; aggiorna inoltre la GPDETRISCONT con il codice che ogni record -- ha contribuito a costruire FUNCTION fnGPRISCONTFill ( lCODENTEAZ IN PKTYPE.TYSTRINGA%TYPE, lCODANNOGRUPPOCONT IN PKTYPE.TYSTRINGA%TYPE, lQTAGRUPPOCONT IN pkType.tyStringa%type, -- se é vuoto lo calcolo come progressivo lDTASCADENZA IN pkType.tyStringa%type, lCODSESSIONE IN PKTYPE.TYSTRINGA%TYPE, lCOMMIT IN PKTYPE.TYSTRINGA%TYPE, ERRDIAG OUT PKTYPE.TYSTRINGA%TYPE ) RETURN NUMERIC IS nIDRRISCONT GPRISCONT.IDRRISCONT%type; nQTAGRUPPOCONT GPRISCONT.QTAGRUPPOCONT%type := lQTAGRUPPOCONT; TYPE recTyGPDETRISCONT IS RECORD( rIDRELAB GPDETRISCONT.IDRELAB%type, rCODANNOGRUPPOCONT GPRISCONT.CODANNOGRUPPOCONT%type, rQTAGRUPPOCONT GPRISCONT.QTAGRUPPOCONT%type, rCODANNOESERCIZIO GPRISCONT.CODANNOESERCIZIO%type, rCODPARTE GPRISCONT.CODPARTE%type, rIDCAPITOLO GPRISCONT.IDCAPITOLO%type, rIDCDC GPRISCONT.IDCDC%type, rCODANNOCONT GPRISCONT.CODANNOCONT%type, rIDACCIMP GPRISCONT.IDACCIMP%type, rCODTIPOBEN GPRISCONT.CODTIPOBEN%type, rCODBENEFICIARIO GPRISCONT.CODBENEFICIARIO%type, rCODSIOPE GPRISCONT.CODSIOPE%TYPE, rIMPMANREV GPRISCONT.IMPMANREV%type, rINDCONTABILIZZATO GPRISCONT.INDCONTABILIZZATO%type, rCODTIPOARROT GPRISCONT.CODTIPOARROT%type, rIMPARROT GPRISCONT.IMPARROT%type, rCODMANREV GPRISCONT.CODMANREV%type, rDTAMANREV VARCHAR2(10), rIDMANREV GPRISCONT.IDMANREV%type, rINDSOSPESO GPRISCONT.INDSOSPESO%type); sCODTIPOARROT VARCHAR2(1):='A';-- IO LI PASSEREI IN INPUT sIMPARROT number(19,6):=0; -- IO LI PASSEREI IN INPUT -- come faccio a decidere quale arrotondamento applicare tra gli elementi che hanno contribuito -- a formare limporto calcolato recGPDETRISCONT recTyGPDETRISCONT; CURSOR curGPDETRISCONT IS SELECT GPDETRISCONT.IDRELAB, lCODANNOGRUPPOCONT , nQTAGRUPPOCONT , CODANNOESERCIZIO , CODPARTE , IDCAPITOLO , IDCDC , CODANNOCONT , IDACCIMP, CODTIPOBEN , CODBENEFICIARIO, CODSIOPE, SUM(IMPMANDATO) , 'N' INDCONTABILIZZATO, sCODTIPOARROT, sIMPARROT , '0' , TO_CHAR( PKTYPE.DTAMIN, 'DD/MM/YYYY') , NULL, GPDETRISCONT.INDSOSPESO FROM GPDETRISCONT, GPTMPELABXREGCONTAB WHERE OWNER = lCODSESSIONE AND GPTMPELABXREGCONTAB.IDRELAB = GPDETRISCONT.IDRELAB GROUP BY GPDETRISCONT.IDRELAB, CODANNOESERCIZIO, CODPARTE , IDCAPITOLO , IDCDC , CODSIOPE, CODANNOCONT , GPDETRISCONT.IDACCIMP, CODTIPOBEN , CODBENEFICIARIO, GPDETRISCONT.INDSOSPESO; BEGIN -- Cancello le righe di GpDetrisCont con importi a zero DELETE FROM GPDETRISCONT WHERE GPDETRISCONT.impmandato = 0 AND GPDETRISCONT.impnetto = 0 AND GPDETRISCONT.imptrattenute = 0 AND GPDETRISCONT.IDRELAB IN ( SELECT DISTINCT IDRELAB FROM GPTMPELABXREGCONTAB WHERE OWNER = lCODSESSIONE ) ; DELETE FROM GPELERISCONT WHERE GPELERISCONT.impmandato = 0 AND GPELERISCONT.IDRELAB IN ( SELECT DISTINCT IDRELAB FROM GPTMPELABXREGCONTAB WHERE OWNER = lCODSESSIONE ) ; IF nQTAGRUPPOCONT IS NULL THEN -- nuovo gruppo ( cancello tutte i record per -- le elaborazioni già esistenti) -- CANCELLO eventuali calcoli che già poteveno includere una elaborazione che ora ricalcolo DELETE FROM GPRISCONT WHERE IDRELAB IN ( SELECT DISTINCT IDRELAB FROM GPTMPELABXREGCONTAB WHERE OWNER = lCODSESSIONE ) ; -- me lo devo calcolare come progressivo... SELECT NVL(MAX( QTAGRUPPOCONT), 0 ) + 1 INTO nQTAGRUPPOCONT FROM GPRISCONT WHERE CODANNOGRUPPOCONT = lCODANNOGRUPPOCONT; ELSE -- gruppo già esistente ( cancello tutte i record per le elaborazioni già esistenti e quelli -- di quel gruppo ) DELETE FROM GPRISCONT WHERE ( CODANNOGRUPPOCONT = lCODANNOGRUPPOCONT AND QTAGRUPPOCONT = lQTAGRUPPOCONT AND IDRELAB IN ( SELECT IDRELAB FROM GPELAB WHERE CODENTEAZ = lCODENTEAZ ) ) OR ( IDRELAB IN ( SELECT IDRELAB FROM GPTMPELABXREGCONTAB WHERE OWNER = lCODSESSIONE ) ); END IF; SELECT NVL( MAX( IDRRISCONT ), 0 ) + 1 INTO nIDRRISCONT FROM GPRISCONT; -- la seguente insert dovrà essere migliorata con una Union per prendere -- la Descrizioni dei beneficiari OPEN curGPDETRISCONT; LOOP FETCH curGPDETRISCONT INTO recGPDETRISCONT; EXIT WHEN curGPDETRISCONT%NOTFOUND; INSERT INTO GPRISCONT( IDRRISCONT , IDRELAB , CODANNOGRUPPOCONT , QTAGRUPPOCONT , CODANNOESERCIZIO, CODPARTE , IDCAPITOLO , IDCDC ,CODSIOPE, CODANNOCONT , IDACCIMP, CODTIPOBEN , CODBENEFICIARIO , IMPMANREV , INDCONTABILIZZATO , CODTIPOARROT, IMPARROT , DESBENEFICIARIO , CODMANREV , DTAMANREV , IDMANREV, DTASCADENZA, IMPTOTMANDDET, INDSOSPESO ) VALUES( nIDRRISCONT, recGPDETRISCONT.rIDRELAB, recGPDETRISCONT.rCODANNOGRUPPOCONT, recGPDETRISCONT.rQTAGRUPPOCONT, recGPDETRISCONT.rCODANNOESERCIZIO, recGPDETRISCONT.rCODPARTE, recGPDETRISCONT.rIDCAPITOLO, recGPDETRISCONT.rIDCDC, recGPDETRISCONT.rCODSIOPE,recGPDETRISCONT.rCODANNOCONT, recGPDETRISCONT.rIDACCIMP, recGPDETRISCONT.rCODTIPOBEN, recGPDETRISCONT.rCODBENEFICIARIO, recGPDETRISCONT.rIMPMANREV, recGPDETRISCONT.rINDCONTABILIZZATO, recGPDETRISCONT.rCODTIPOARROT, recGPDETRISCONT.rIMPARROT, NULL, recGPDETRISCONT.rCODMANREV, TO_DATE( recGPDETRISCONT.rDTAMANREV, 'DD/MM/YYYY'), recGPDETRISCONT.rIDMANREV, NVL( TO_DATE( lDTASCADENZA, 'DD/MM/YYYY'), PKTYPE.DTAMIN ), recGPDETRISCONT.rIMPMANREV, recGPDETRISCONT.rINDSOSPESO ); -- Aggiorno qui il dettaglio che l'ha determinato -- tassazioni / Contributi in genere -- AGGIORNO GPDETRISCONT con l'IDRRISCONT UPDATE GPDETRISCONT SET IDRRISCONT = nIDRRISCONT WHERE IDRELAB = recGPDETRISCONT.rIDRELAB AND CODANNOESERCIZIO = recGPDETRISCONT.rCODANNOESERCIZIO AND CODPARTE = recGPDETRISCONT.rCODPARTE AND IDCAPITOLO = recGPDETRISCONT.rIDCAPITOLO AND CODANNOCONT = recGPDETRISCONT.rCODANNOCONT AND IDACCIMP = recGPDETRISCONT.rIDACCIMP AND CODSIOPE = recGPDETRISCONT.rCODSIOPE AND CODTIPOBEN = recGPDETRISCONT.rCODTIPOBEN AND CODBENEFICIARIO = recGPDETRISCONT.rCODBENEFICIARIO AND NVL(IDCDC,0) = NVL(recGPDETRISCONT.rIDCDC,0) AND INDSOSPESO = recGPDETRISCONT.rINDSOSPESO; -- AGGIORNO ANCHE LA TABELLA GPELERISCONT UPDATE GPELERISCONT SET IDRRISCONT = nIDRRISCONT WHERE IDRELAB = recGPDETRISCONT.rIDRELAB AND CODANNOESERCIZIO = recGPDETRISCONT.rCODANNOESERCIZIO AND CODPARTE = recGPDETRISCONT.rCODPARTE AND IDCAPITOLO = recGPDETRISCONT.rIDCAPITOLO AND CODANNOCONT = recGPDETRISCONT.rCODANNOCONT AND CODSIOPE = recGPDETRISCONT.rCODSIOPE AND IDACCIMP = recGPDETRISCONT.rIDACCIMP AND CODTIPOBEN = recGPDETRISCONT.rCODTIPOBEN AND CODBENEFICIARIO = recGPDETRISCONT.rCODBENEFICIARIO AND NVL(IDCDC,0) = NVL(recGPDETRISCONT.rIDCDC,0) AND INDSOSPESO = recGPDETRISCONT.rINDSOSPESO; nIDRRISCONT := nIDRRISCONT + 1; END LOOP; CLOSE curGPDETRISCONT; -- Update Dipendente UPDATE GPRISCONT SET DESBENEFICIARIO = (SELECT GPPERSONA.DESCOGNOME|| ' '||GPPERSONA.DESNOME DESBENEFICIARIO FROM GPPERSONA, GPRAPLAV WHERE GPPERSONA.IDRPERSONA = GPRAPLAV.IDRPERSONA AND CODBENEFICIARIO = TO_CHAR(GPRAPLAV.IDRRLAV)) WHERE GPRISCONT.CODTIPOBEN = 'D' AND GPRISCONT.IDRELAB IN ( SELECT GPTMPELABXREGCONTAB.IDRELAB FROM GPTMPELABXREGCONTAB WHERE OWNER = lCODSESSIONE ); -- Update Soggetti I,A UPDATE GPRISCONT SET DESBENEFICIARIO = (SELECT GPSOGGETTO.DESSOGG FROM GPSOGGETTO WHERE CODTIPOSOGG = GPRISCONT.CODTIPOBEN AND CODSOGG = GPRISCONT.CODBENEFICIARIO AND CODENTEAZ = lCODENTEAZ) WHERE GPRISCONT.CODTIPOBEN IN ( 'I', 'A') AND GPRISCONT.IDRELAB IN ( SELECT GPTMPELABXREGCONTAB.IDRELAB FROM GPTMPELABXREGCONTAB WHERE OWNER = lCODSESSIONE ); -- Update Banche UPDATE GPRISCONT SET DESBENEFICIARIO = (SELECT CPAGENZIA.DESAGENZIA FROM CPAGENZIA WHERE TO_CHAR(CPAGENZIA.IDRAGENZIA) = GPRISCONT.CODBENEFICIARIO) WHERE GPRISCONT.CODTIPOBEN = 'B' AND GPRISCONT.IDRELAB IN ( SELECT GPTMPELABXREGCONTAB.IDRELAB FROM GPTMPELABXREGCONTAB WHERE OWNER = lCODSESSIONE ); -- Update Ente/Azienda UPDATE GPRISCONT SET DESBENEFICIARIO = (SELECT GPENTEAZ.DESENTEAZI FROM GPENTEAZ WHERE GPENTEAZ.CODENTEAZ = GPRISCONT.CODBENEFICIARIO) WHERE GPRISCONT.CODTIPOBEN = 'E' AND GPRISCONT.IDRELAB IN ( SELECT GPTMPELABXREGCONTAB.IDRELAB FROM GPTMPELABXREGCONTAB WHERE OWNER = lCODSESSIONE ); -- Aggiornamento di GPRISCONT:caso delle tassazioni e contributi UPDATE GPRISCONT SET INDPARTITA = 'S' WHERE CODANNOGRUPPOCONT = lCODANNOGRUPPOCONT AND QTAGRUPPOCONT = nQTAGRUPPOCONT AND IDRELAB IN ( SELECT GPTMPELABXREGCONTAB.IDRELAB FROM GPTMPELABXREGCONTAB WHERE OWNER = lCODSESSIONE ) AND IDCAPITOLO IN (SELECT A.IDCAPITOLO FROM GPREGCONTAB A WHERE A.CODENTEAZ= lCODENTEAZ AND A.CODANNO = lCODANNOGRUPPOCONT AND A.CODTIPOELE IN ('CON','TAX') GROUP BY A.IDCAPITOLO); -- Aggiornamento di GPRISCONT: Caso delle voci UPDATE GPRISCONT SET INDPARTITA = 'S' WHERE CODANNOGRUPPOCONT = lCODANNOGRUPPOCONT AND QTAGRUPPOCONT = nQTAGRUPPOCONT AND IDRELAB IN ( SELECT GPTMPELABXREGCONTAB.IDRELAB FROM GPTMPELABXREGCONTAB WHERE OWNER = lCODSESSIONE ) AND IDCAPITOLO IN (SELECT B.IDCAPITOLO FROM GPREGCONTAB B, GPVALGRVOX C WHERE B.CODTPGRVOX = C.CODTPGRVOX AND B.CODVALGRVOX = C.CODVALGRVOX AND B.CODENTEAZ = lCODENTEAZ AND B.CODANNO = lCODANNOGRUPPOCONT AND B.CODTIPOELE ='VOX' AND C.INDPGIRO = 'S' and b.codtipoben = gpriscont.codtipoben and --rmnapoli b.codbeneficiario = gpriscont.codbeneficiario --rmnapoli GROUP BY B.IDCAPITOLO); --- IF lCOMMIT <> 'N' THEN COMMIT; END IF; RETURN 1; EXCEPTION WHEN OTHERS THEN IF curGPDETRISCONT%ISOPEN THEN CLOSE curGPDETRISCONT; END IF; ROLLBACK; RETURN pkUtility.fnError( 'fnGPRISCONTFill', SQLCODE, ERRDIAG ); END fnGPRISCONTFill; FUNCTION fnTruncTMPContab ( ERRDIAG OUT pkType.tyStringa%type ) RETURN NUMERIC IS BEGIN -- Ripulisco tutte le tabelle temporanee SYS.DBMS_UTILITY.exec_ddl_statement( 'TRUNCATE TABLE GPTMPELABXREGCONTAB'); SYS.DBMS_UTILITY.exec_ddl_statement( 'TRUNCATE TABLE GPTMPREGCONTXVOX'); SYS.DBMS_UTILITY.exec_ddl_statement( 'TRUNCATE TABLE GPTMPRIFXCONT'); SYS.DBMS_UTILITY.exec_ddl_statement( 'TRUNCATE TABLE GPTMPREGCONTCEDDET'); SYS.DBMS_UTILITY.exec_ddl_statement( 'TRUNCATE TABLE GPTMPELERISCONT'); SYS.DBMS_UTILITY.exec_ddl_statement( 'TRUNCATE TABLE GPTMPREGCONTCED'); COMMIT; RETURN 1; EXCEPTION WHEN OTHERS THEN ROLLBACK; RETURN pkUtility.fnError( 'fnTruncTMPContab', SQLCODE, ERRDIAG ); END fnTruncTMPContab; -- Sostituita Versione Base della Contabilizzazione con la Versione ormai consolidata dell'Evoluta /************************************************************************** * CONTABILIZZAZIONE * ***************************************************************************/ /* Funzione che esegue la contabilizzazione: assicura le stesse operazioni dell'originale ma con delle funzionalità aggiuntive Calcolo con casi particolari 1. Correzione da apportare 2. Con ripartizione percentuale 3. Con controllo di sfondamento e capitolo alternativo 1. Correzione da apportare Nella corrente versione non è stato preso in considerazione il caso in cui una persona può far parte di più Funzioni e Servizio/Cdc. In tal caso incorre nell'Errore Oracle di chiave duplicata (sulla temporanea delle Regole). Occorre perciò fare in modo di tenerne conto nel riempimento: gestire il campo IDR nella chiave( per ora era fisso a 1 ) delle Regole per indicare le regole valide all'i-esima iterazione; aggiungere una tabella Temporanea dei riferimenti contabili ( GPTMPRIFXCONT ), che contenga un campo GIRO per indicare al calcolo quale riferimento contabile considerare per la persona all'iterazione i-esima. Il calcolo verrà iterato tante volte quanti sono i differenti riferimenti contabili della persona. Si può lasciare inalterato il reperimento delle Regole di Calcolo, che però inserirà ad ogni giro le Regole che servono per il calcolo relativamente all'i-esimo rif.cont., con IDR pari al giro che si sta effettuando. Al primo giro si prenderà per ogni persona il primo riferimento contabile ( memorizzato nella TMP con GIRO = 1 ) e il calcolo per tutti quegli elementi avverrà considerando PRCAPPARTENENZA = 100. Nei giri successivi(i>0), il calcolo scorrerà tutte le regole e i rif.contabili del giro, applicando le regole specificate per il giro i-esimo andando a sottrarre il calcolato attuale dal calcolato del giro 1. 2. considerare l'appartenenza di una persona a più CDC e quindi ripartire su di essi in base alla % di appartenenza. Nell'applicazione delle regole tenevo conto solo dei rif. Contabili della persona per un periodo in particolare supponendo un solo CDC e una sola Funzione/Servizio, ma quando vado sui dettagli dei riferimenti contabili ne posso trovare n e quindi nel peggiore dei casi potrei avere n differenti regole di contabilizzazione quanti sono i CDC, o meglio, le Funzioni/Servizio a cui appartiene la persona; potrei inserire queste eventuali n regole di contabilizzazione nella TMP delle Regole da applicare( GPTMPREGCONTCED ). Vedi (1). Posso avere i seguenti casi: - un solo CDC al 100% ( no molteplicità di funzione/servizio) - diversi CDC con varie percentuali ma con medesima funzione/servizio( La Regola è la stessa); - diversi CDC con varie percentuali e diverse funzioni/servizio(potrebbero cambiare le Regole). NOTA: Una volta reperite le Regole, nel caso in cui INDXCDC = 'N' faranno fede le regole così come sono scritte nella GPTMPREGCONTCED, ma nella GPTMPRIFXCONT i campi relativi al CDC saranno 0 e, nel caso di stessa Funzione/Servizio, il calcolo così come è fatto, sommerà la PRCAPPARTENENZA. 3. Gestione degli alternativi( se è in linea Serfin) Notizie sugli alternativi già ce l'ho nella temporanea delle Regole. NOTA: Considero l'Alternativo come Alternativo di Capitolo e non di regola. Terminati i calcoli, mi scorrerò i Mandati e farò i controlli incrociati con le disponibilità dei Capitoli. Per ora avendo già memorizzato, nella temporanea delle Regole gli alternativi, per ogni capitolo/Impegno Individuo i Capitoli che superano le disonibilità in Serfin; individuo alternativi di Capitolo; non mi interessa vedere il Beneficiario indicato nell'Alternativo; quello che mi interessa è soltanto il Capitolo/Impegno. Scorro i dettagli che hanno contribuito a superare la Disponibilità e non appena individuo il primo che in tutto o in parte fa superare la Disponibilità lo aggiorno mettendo quello che entra sul Capitolo Principale e il resto sull'Alternativo. Aggiorno IMPNETTO soltanto se era > 0 NOTA: Questo controllo ha senso solo se esiste Serfin; e in tal caso CODANNOCONT = 0 SEMPRE. 20/11/2007: Aggiunto parametro INDSIOPE per scegliere se estrarre il SIOPE o meno, a questa data pkGPCONTAB.DOCONTAB e pkGPCONTABEVOL.DOCONTAB coincidono */ FUNCTION fnDoContab ( lCODENTEAZ IN pkType.tyStringa%type, lCODANNOGRUPPOCONT IN pkType.tyStringa%type, -- lQTAGRUPPOCONT IN pkType.tyStringa%type, -- se é vuoto lo calcolo come progressivo lDTARIFCONTAB IN pkType.tyStringa%type, -- per ora la passiamo in input, in seguito faremo -- dei calcoli per decidere quali regole applicare lIDRELABLst IN pkType.tyStringa%type,-- lista delle elaborazioni lINDXCDC IN pkType.tyStringa%type, -- 'S': distingui per CDC lDTASCADENZA IN pkType.tyStringa%type, lINDSIOPE IN pkType.tyStringa%type, lCODSESSIONE IN pkType.tyStringa%type, ERRDIAG OUT pkType.tyStringa%type ) RETURN NUMERIC IS nRet NUMBER(9); nRec NUMBER(9); lTimeStamp GPTMPREGCONTCED.TMSLOCK%type := TO_CHAR( SYSDATE, 'YYYYMMDDHH24MISS' ); -- PER LO SPLIT nLastIDRELAB NUMBER(9); lTIDRELAB pktype.TyTStringa; sIDRELAB pktype.TyStringa%Type := NULL; -- stringa da comporre in base agli elementi nella Lista ---- nIDRCONTRIB NUMBER(9) := 0; sNomeSchema VARCHAR2(255); sNomeDBLink VARCHAR2(255); -- PER ora le i campi DTAINIZIO,DTAFINE e IDR sono fissati sDTAMIN VARCHAR2(10):= TO_CHAR( PKTYPE.DTAMIN, 'DD/MM/YYYY'); sDTAMAX VARCHAR2(10):= TO_CHAR( PKTYPE.DTAMAX, 'DD/MM/YYYY'); nIDR NUMBER(9) := 1; -- PER ora è fissato sERRDIAG PKTYPE.TYSTRINGA%type; nGiro NUMBER(9); --rm2003 rIDCAPITOLORIPARTDET GPTMPREGCONTCEDDET.idcapitoloripart%type; rCODANNOCONTRIPARTDET GPTMPREGCONTCEDDET.codannocontripart%type; rIDACCIMPRIPARTDET GPTMPREGCONTCEDDET.idaccimpripart%type; nCOUNT NUMBER(9) :=0; -- rm2003 TYPE recTyONERI IS RECORD( rINDSPOSTA VARCHAR2(1), rIDCAPITOLODA GPTMPREGCONTCED.idcapitolo%type, rCODANNOCONTDA GPTMPREGCONTCED.codannocont%type, rIDACCIMPDA GPTMPREGCONTCED.idaccimp%type, rIDRCONTRIB GPSOCCED.IDRCONTRIB%type, rCODVOCE GPVOXASSOG.CODVOCE%type, rIDRRLAV GPTMPREGCONTCED.IDRRLAVCED%type, rIDRELAB GPTMPREGCONTCED.IDRELABCED%type, rCODTIPOELE GPTMPREGCONTCED.CODTIPOELE%type, rCODANNO GPTMPREGCONTCED.CODANNO%type, rCODANNOCOMP GPSOCCED.CODANNOCOMP%type, rCODPARTE GPTMPREGCONTCED.CODPARTE%type, rIDCAPITOLORIPART GPTMPREGCONTCED.IDCAPITOLORIPART%type, rCODANNOCONTRIPART GPTMPREGCONTCED.CODANNOCONTRIPART%type , rIDACCIMPRIPART GPTMPREGCONTCED.IDACCIMPRIPART%type, rIDCDC GPTMPREGCONTCED.IDRCDC%type, rCODTIPOBENRIPART GPTMPREGCONTCED.CODTIPOBENRIPART%type, rCODBENRIPART GPTMPREGCONTCED.CODBENRIPART%type, rPRCMOLTIP GPVOXASSOG.PRCMOLTIP%type, rSUMIMPTRATT GPSOCCED.IMPTRATTENUTA%type, --> IMPTRATTENUTA PER QUEL CONTRIBUTO rIMPVOX GPVOXCED.IMPVOX%type, rIMPMANDATO GPDETRISCONT.IMPMANDATO%type, rCODELEMENTO GPTMPREGCONTCED.CODELEMENTO%type, rGIRO GPTMPREGCONTCED.IDR%type, rINDSOSPESO GPTMPREGCONTCED.INDSOSPESO%type, rCODANNOMAT GPTMPREGCONTCED.CODANNOMAT%type, rQTASEZIONE GPTMPREGCONTCED.QTASEZIONE%type, rQTAPROGELE GPTMPREGCONTCED.QTAPROGELE%type); --rm2003 recONERI recTyONERI; recONERITMP recTyONERI; -- CURSORE SUGLI ONERI e VOCI ASSOGGETTATE ( Per la ripartizione degli Oneri ) CURSOR curONERI IS -- Riccardo - cambiato SELECT DECODE(VOXRIPART.INDRIPARTIZIONE ||GPTMPREGCONTCED.INDRIPARTIZIONE, 'SN', 'S', 'N') INDSPOSTA, GPTMPREGCONTCED.idcapitolo IDCAPITOLODA, GPTMPREGCONTCED.CODANNOCONT CODANNOCONTDA, GPTMPREGCONTCED.idaccimp IDACCIMPDA, GPSOCCED.IDRCONTRIB, GPVOXASSOG.CODVOCE, GPTMPREGCONTCED.IDRRLAVCED, GPTMPREGCONTCED.IDRELABCED, GPTMPREGCONTCED.CODTIPOELE, GPTMPREGCONTCED.CODANNO, GPSOCCED.CODANNOCOMP, GPTMPREGCONTCED.CODPARTE, VOXRIPART.IDCAPITOLORIPART, VOXRIPART.CODANNOCONTRIPART, VOXRIPART.IDACCIMPRIPART, VOXRIPART.idrcdc, GPTMPREGCONTCED.CODTIPOBEN, GPTMPREGCONTCED.CODBENEFICIARIO, --Riccardo 29-01-2002: cambiato Beneficiario GPVOXASSOG.PRCMOLTIP, GPSOCCED.IMPTRATTENUTA, VOXRIPART.impelemento, GPSOCCED.IMPIMPONIBPRIMO, VOXRIPART.CODELEMENTO, VOXRIPART.IDR, -- ( Delle Voci ) GPTMPREGCONTCED.INDSOSPESO, /* ( Dell'Onere ) */ VOXRIPART.codannomat, VOXRIPART.QTASEZIONE, VOXRIPART.QTAPROGELE FROM GPTMPRIFXCONT,GPTMPREGCONTCED VOXRIPART, GPSOCCED, GPTMPREGCONTCED, GPVOXASSOG, GPCONTRIB --Riccardo 2002-01-31 WHERE GPTMPREGCONTCED.OWNER = lCODSESSIONE AND GPTMPREGCONTCED.CODANNO = lCODANNOGRUPPOCONT AND GPTMPREGCONTCED.CODTIPOELE ='ONE' AND VOXRIPART.CODTIPOELE = 'IDV' AND ( ( gpcontrib.CODASSOGCONTRIB='M' AND EXISTS ( select r.idrrlav from gpraplav r,gpcurriculum i, gpmetaval m where r.IDRRLAV=gpsocced.IDRRLAV and r.IDRPERSONA= i.IDRPERSONA AND i.CODTPMETA='ISCPREV' AND to_char(i.DTAINIZIO,'yyyymm')<= VOXRIPART.qtasezione AND to_char(i.DTAfine,'yyyymm')>= VOXRIPART.qtasezione AND i.codtpmeta=m.codtpmeta AND i.IDRVALMETA=m.IDRVALMETA AND m.IDRQSOG = gpsocced.IDRQSOG) ) OR gpcontrib.CODASSOGCONTRIB <>'M' ) and ((VOXRIPART.INDRIPARTIZIONE = 'S' AND GPTMPREGCONTCED.INDRIPARTIZIONE ='N') -- DEROGHE DI RIPARTIZIONE SU VOCE OR ( GPTMPREGCONTCED.INDRIPARTIZIONE ='S')) -- ONERE DA RIPARTIRE AND GPTMPREGCONTCED.CODTIPOLEGAME ='P' AND VOXRIPART.CODPARTE = 'S' AND VOXRIPART.codtipolegame = 'P' AND VOXRIPART.codsegnovoce = 'X' AND GPTMPRIFXCONT.OWNER = GPTMPREGCONTCED.OWNER AND GPTMPRIFXCONT.IDRELAB = GPTMPREGCONTCED.IDRELABCED AND GPTMPRIFXCONT.IDRRLAV = GPTMPREGCONTCED.IDRRLAVCED AND GPTMPRIFXCONT.GIRO = GPTMPREGCONTCED.IDR AND GPTMPRIFXCONT.GIRO = VOXRIPART.IDR AND GPSOCCED.IDRRLAV = GPTMPREGCONTCED.IDRRLAVCED AND GPSOCCED.IDRELAB = GPTMPREGCONTCED.IDRELABCED AND GPSOCCED.IDRCONTRIB = GPTMPREGCONTCED.IDRCONTRIB AND GPSOCCED.IMPTRATTENUTA <> 0 AND -- Riccardo GPSOCCED.CODTIPOSOCIALE = 'E' AND -- Riccardo VOXRIPART.OWNER = lCODSESSIONE AND VOXRIPART.IDRRLAVCED = GPSOCCED.IDRRLAV AND VOXRIPART.IDRELABCED = GPSOCCED.IDRELAB AND VOXRIPART.CODVOCE = GPVOXASSOG.CODVOCE AND GPVOXASSOG.CODVERSIONE = 'STD' AND GPVOXASSOG.IDRCONTRIB = GPSOCCED.IDRCONTRIB AND VOXRIPART.CODPARTE = 'S' --Riccardo (il rischio per le partite di giro è che si abbia due volte ...? però è pericoloso ...) AND -- Riccardo 2002-01-31 Aggiunto GPCONTRIB.IDRCONTRIB = GPSOCCED.IDRCONTRIB AND ((GPCONTRIB.CODASSOGCONTRIB = 'M' AND GPSOCCED.CODANNOCOMP = VOXRIPART.CODANNOMAT) OR (GPCONTRIB.CODASSOGCONTRIB = 'L' AND GPSOCCED.CODANNOCOMP >= VOXRIPART.CODANNOMAT)) ORDER BY GPTMPREGCONTCED.IDRRLAVCED , GPTMPREGCONTCED.IDRELABCED, GPSOCCED.CODANNOCOMP, GPSOCCED.IDRCONTRIB, --Riccardo 2002-01-31 cambiato order VOXRIPART.IDCAPITOLORIPART, VOXRIPART.CODANNOCONTRIPART, VOXRIPART.IDACCIMPRIPART, VOXRIPART.IDRCDC, GPTMPREGCONTCED.CODTIPOBEN, GPTMPREGCONTCED.CODBENEFICIARIO, -- Riccardo 2002-01-31 cambiato beneficiario GPTMPREGCONTCED.CODPARTE, GPTMPREGCONTCED.INDSOSPESO; nOnereRipart NUMBER(19,6) := 0; nOnereTot NUMBER(19,6) := 0; nNettoTot NUMBER(19,6) := 0; nNettoRipart NUMBER(19,6) := 0; nResto NUMBER(19,6) := 0; nIMPTRATTRIPART NUMBER(19,6) := 0; --------------------- RIPARTIZIONE DEL NETTO -------------------------- TYPE recTyGPDETRISCONT IS RECORD( rIDRRLAV GPDETRISCONT.IDRRLAV%type, rIDRELAB GPDETRISCONT.IDRELAB%type, rCODTIPOELE GPDETRISCONT.CODTIPOELE%type, rCODANNOESERCIZIO GPDETRISCONT.CODANNOESERCIZIO%type, rCODANNOMAT GPDETRISCONT.CODANNOMAT%type, rCODPARTE GPDETRISCONT.CODPARTE%type, rIDCAPITOLO GPDETRISCONT.IDCAPITOLO%type, rCODSIOPE GPDETRISCONT.CODSIOPE%type, rCODANNOCONT GPDETRISCONT.CODANNOCONT%type , rIDACCIMP GPDETRISCONT.IDACCIMP%type, rIMPMANDATO GPDETRISCONT.IMPMANDATO%type, rIMPNETTO GPCEDOLINO.IMPNETTO%type, rIMPCOMPETENZE GPCEDOLINO.IMPCOMPETENZE%type); recGPDETRISCONT recTyGPDETRISCONT; recGPDETRISCONTPREC recTyGPDETRISCONT;-- ci memorizzo record da aggiornare che é sempre il precedente CURSOR curGPDETRISCONT IS SELECT GPDETRISCONT.IDRRLAV, GPDETRISCONT.IDRELAB, GPDETRISCONT.CODTIPOELE, GPDETRISCONT.CODANNOESERCIZIO, GPDETRISCONT.CODANNOMAT, GPDETRISCONT.CODPARTE, GPDETRISCONT.IDCAPITOLO, GPDETRISCONT.codsiope, GPDETRISCONT.CODANNOCONT, GPDETRISCONT.IDACCIMP, GPDETRISCONT.IMPMANDATO, GPCEDOLINO.IMPNETTO, GPCEDOLINO.IMPCOMPETENZE FROM GPCEDOLINO, GPRISCONT, GPDETRISCONT -- Riccardo: aggiunto per partite di giro WHERE GPCEDOLINO.IDRELAB IN ( SELECT IDRELAB FROM GPTMPELABXREGCONTAB WHERE OWNER = lCODSESSIONE) AND -- LISTA ELABORAZIONI GPRISCONT.CODANNOGRUPPOCONT=lCODANNOGRUPPOCONT and GPRISCONT.QTAGRUPPOCONT = lQTAGRUPPOCONT and GPCEDOLINO.IDRELAB = GPRISCONT.IDRELAB and GPDETRISCONT.IDRRISCONT = GPRISCONT.IDRRISCONT AND GPDETRISCONT.IDRRLAV = GPCEDOLINO.IDRRLAV AND GPDETRISCONT.IDRELAB = GPCEDOLINO.IDRELAB AND GPDETRISCONT.CODTIPOELE = 'VOX' AND GPDETRISCONT.CODPARTE = 'S' AND -- Riccardo -- NON è UNA PARTITA DI GIRO GPRISCONT.INDPARTITA <> 'S' AND GPDETRISCONT.CODANNOESERCIZIO = lCODANNOGRUPPOCONT ORDER BY GPDETRISCONT.IDRRLAV, GPDETRISCONT.IDRELAB, GPDETRISCONT.IMPMANDATO; -- Riccardo: è importante l'ordine per importo mandato er evitare di avere netti negativi (l'ultimo record deve avere l'importo + alto) nIMPNETTORIPART NUMBER(19,6) := 0; NumMax NUMBER(9); nIDCAPITOLO1 GPREGCONTAB.IDCAPITOLO%type; nCODANNOCONT1 GPREGCONTAB.CODANNOCONT%type; nIDACCIMP1 GPREGCONTAB.IDACCIMP%type; sCODTIPOBEN1 GPREGCONTAB.CODTIPOBEN%type; sCODBENEFICIARIO1 GPREGCONTAB.CODBENEFICIARIO%type; nIDCDC1 GPDETRISCONT.IDCDC%type; sINDSOSPESO GPDETRISCONT.INDSOSPESO%type; nIDRELABPrec GPCEDOLINO.IDRELAB%type :=0; -- per riempimento della GPTMPRIFXCONT nIDRRLAVPrec GPCEDOLINO.IDRRLAV%type := 0;-- per riempimento della GPTMPRIFXCONT ---------- Gestione Alternativo : Cerco quali elementi possono aver causato un superamento della Disponibilità di Serfin -- DEVO COSTRUIRMI DINAMICAMENTE LA QUERY: uso Dynamic SQL IGNORE INTEGER; SOURCE_CURSOR INTEGER; nIDCAPITOLOOut NUMBER; -- variabili che riportano i capitoli/Impegni che hanno un trabocco nIDACCIMPOut NUMBER; nIMPDISPONIBILITAOut NUMBER; ------------------------ sCODTIPOBEN VARCHAR2(255); sCODBENEFICIARIO VARCHAR2(255); sDESSCHEMASERFIN GPENTEAZ.DESSCHEMASERFIN%type;-- prelevo lo schema Serfin dell'Ente sQUERYOut varchar2(2000); -- Query per la selezione dei capitoli che presentano uno sforamento -- var. per l'alternativo nIDCAPITOLOAlt GPREGCONTAB.IDCAPITOLO%type; nCODANNOCONTAlt GPREGCONTAB.CODANNOCONT%type; nIDACCIMPAlt GPREGCONTAB.IDACCIMP%type; bESCI BOOLEAN; -- per prendere solo il primo alternativo sTPCOLCONT VARCHAR2(2); sINDPGIRO VARCHAR2(1); BEGIN -- Ripulisco le tabelle temporanee SELECT COUNT(*) INTO nCount FROM GPTMPELERISCONT WHERE OWNER <> lCODSESSIONE; IF nCount > 0 THEN DELETE FROM GPTMPELERISCONT WHERE OWNER = lCODSESSIONE OR TO_CHAR ( sysdate, 'YYYYMMDDHH24MI' ) - SUBSTR ( TMSLOCK, 1, 12 ) > 2400; COMMIT; ELSE SYS.DBMS_UTILITY.exec_ddl_statement( 'TRUNCATE TABLE GPTMPELERISCONT'); END IF; SELECT COUNT(*) INTO nCount FROM GPTMPREGCONTCED WHERE OWNER <> lCODSESSIONE; IF nCount > 0 THEN DELETE FROM GPTMPREGCONTCED WHERE OWNER = lCODSESSIONE OR TO_CHAR ( sysdate, 'YYYYMMDDHH24MI' ) - SUBSTR ( TMSLOCK, 1, 12 ) > 2400; COMMIT; ELSE SYS.DBMS_UTILITY.exec_ddl_statement( 'TRUNCATE TABLE GPTMPREGCONTCED'); END IF; DELETE FROM GPTMPELABXREGCONTAB WHERE OWNER = lCODSESSIONE OR TO_CHAR ( sysdate, 'YYYYMMDDHH24MI' ) - SUBSTR ( TMSLOCK, 1, 12 ) > 2400; DELETE FROM GPTMPREGCONTXVOX WHERE OWNER = lCODSESSIONE OR TO_CHAR ( sysdate, 'YYYYMMDDHH24MI' ) - SUBSTR ( TMSLOCK, 1, 12 ) > 2400; DELETE FROM GPTMPRIFXCONT WHERE OWNER = lCODSESSIONE OR TO_CHAR ( sysdate, 'YYYYMMDDHH24MI' ) - SUBSTR ( TMSLOCK, 1, 12 ) > 2400; DELETE FROM GPTMPREGCONTCEDDET --RM2003 WHERE OWNER = lCODSESSIONE OR TO_CHAR ( sysdate, 'YYYYMMDDHH24MI' ) - SUBSTR ( TMSLOCK, 1, 12 ) > 2400; COMMIT; -- Composizione lista delle elaborazioni da usare nelle Select IF lIDRELABLst IS NOT NULL THEN -- splitto la stringa nRet := PKUTILITY.fnRealSplit( lIDRELABLst,'§','', nLastIDRELAB, ERRDIAG, lTIDRELAB); IF nRet < 0 THEN ROLLBACK; RETURN nRet; END IF; ELSE ERRDIAG := 'Prevista Lista Elaborazioni'; RETURN pkUtility.fnError( 'fnDoContab', -499, ERRDIAG ); END IF; FOR i IN 1..nLastIDRELAB LOOP IF lTIDRELAB(i) IS NOT NULL THEN INSERT INTO GPTMPELABXREGCONTAB( OWNER, IDRELAB, TMSLOCK ) VALUES ( lCODSESSIONE, lTIDRELAB(i), lTIMESTAMP ); END IF; END LOOP; COMMIT; -- inserimento nella Temporanea dei Riferimenti Contabili nGiro := 1; FOR recGPDETCONPERS IN ( SELECT GPRAPLAV.IDRRLAV, GPELAB.IDRELAB, GPDETCONPERS.QTAPROGCONTAB , GPDETCONPERS.CODENTEAZ , GPDETCONPERS.CODFUNZIONE, GPDETCONPERS.CODSERVIZIO, GPDETCONPERS.IDRCDC,PRCAPPARTENENZA FROM GPCONTABPERS, GPDETCONPERS, GPELAB, GPRAPLAV, GPCEDOLINO,GPTMPELABXREGCONTAB -- ( Mettendo in Join la tmp, la Query ha costo 7 ) WHERE GPTMPELABXREGCONTAB.OWNER = lCODSESSIONE AND GPTMPELABXREGCONTAB.IDRELAB=GPELAB.IDRELAB AND GPCEDOLINO.CODSTATO = 2 AND GPRAPLAV.IDRRLAV = GPCONTABPERS.IDRRLAV AND GPCEDOLINO.IDRRLAV = GPRAPLAV.IDRRLAV AND GPCEDOLINO.IDRELAB = GPELAB.IDRELAB AND GPCONTABPERS.DTAINIZIO <= NVL( TO_DATE( lDTARIFCONTAB, 'DD/MM/YYYY'), LEAST( GPELAB.DTAVALUTA, GPRAPLAV.DTAFINE) ) AND NVL( TO_DATE( lDTARIFCONTAB, 'DD/MM/YYYY'), LEAST( GPELAB.DTAVALUTA, GPRAPLAV.DTAFINE) ) <= GPCONTABPERS.DTAFINE AND GPDETCONPERS.IDRRLAV = GPCONTABPERS.IDRRLAV AND GPDETCONPERS.QTAPROGCONTAB = GPCONTABPERS.QTAPROGCONTAB ORDER BY GPELAB.IDRELAB,GPRAPLAV.IDRRLAV, GPDETCONPERS.CODFUNZIONE, GPDETCONPERS.CODSERVIZIO, GPDETCONPERS.IDRCDC ) LOOP IF ( recGPDETCONPERS.IDRELAB <> nIDRELABPrec OR recGPDETCONPERS.IDRRLAV <> nIDRRLAVPrec ) THEN nGiro := 1; nIDRELABPrec := recGPDETCONPERS.IDRELAB; nIDRRLAVPrec := recGPDETCONPERS.IDRRLAV; ELSE nGiro := nGiro + 1; END IF; IF lINDXCDC = 'N' THEN recGPDETCONPERS.IDRCDC := 0; END IF; INSERT INTO GPTMPRIFXCONT ( OWNER , IDRELAB, IDRRLAV , GIRO, QTAPROGCONTAB , CODENTEAZ , CODFUNZIONE , CODSERVIZIO , IDRCDC , PRCAPPARTENENZA, TMSLOCK ) VALUES ( lCODSESSIONE , recGPDETCONPERS.IDRELAB, recGPDETCONPERS.IDRRLAV , nGiro, recGPDETCONPERS.QTAPROGCONTAB , recGPDETCONPERS.CODENTEAZ , recGPDETCONPERS.CODFUNZIONE , recGPDETCONPERS.CODSERVIZIO, recGPDETCONPERS.IDRCDC , recGPDETCONPERS.PRCAPPARTENENZA, lTIMESTAMP ); END LOOP; numMax := nGiro; --- nel Cursore precedente mi perdo le persone che non hanno Riferimenti Contabili --> -- le Inserisco ora e le metto al primo giro INSERT INTO GPTMPRIFXCONT ( OWNER , IDRELAB, IDRRLAV , GIRO, QTAPROGCONTAB , CODENTEAZ , CODFUNZIONE , CODSERVIZIO , IDRCDC , PRCAPPARTENENZA, TMSLOCK ) ( SELECT lCODSESSIONE, GPCEDOLINO.IDRELAB, GPCEDOLINO.IDRRLAV, 1, NULL, NULL , NULL, NULL, 0, 100, lTimeStamp FROM GPCEDOLINO,GPTMPELABXREGCONTAB WHERE GPTMPELABXREGCONTAB.OWNER = lCODSESSIONE AND GPTMPELABXREGCONTAB.IDRELAB=GPCEDOLINO.IDRELAB AND GPCEDOLINO.CODSTATO = 2 AND GPCEDOLINO.IDRRLAV NOT IN ( SELECT GPTMPRIFXCONT.IDRRLAV FROM GPTMPRIFXCONT WHERE OWNER = lCODSESSIONE AND GPTMPRIFXCONT.idrrlav = gpcedolino.idrrlav and GIRO = 1 ) ); commit; -- passo 1 : per ogni dipendente trovo le regole da applicare sui singoli elementi di cedolino ------------- al 1° giro riempo con IDR=1, ai successivi con IDR=2,3,..,n ( n = Numero funzioni/servizio di un dip ) nGiro := 1; LOOP EXIT WHEN nGiro > numMax; nIDR := nGiro; -- passo 1 : per ogni dipendente trovo le regole da applicare sui singoli elementi di cedolino INSERT INTO GPTMPREGCONTCED ( OWNER, CODANNO, CODPARTE, CODTIPOLEGAME, CODSEGNOVOCE, CODTIPODIP, CODDIPENDENTE, CODTIPOELE, CODELEMENTO, IDRRLAVCED, IDRELABCED, DTAINIZIO, IDR, DTAFINE, IDRCONTRIB, CODTIPOTASS, CODTPGRVOX, CODVALGRVOX, IDRRLAV, CODFUNZIONE, CODSERVIZIO, CODCDR, IDCAPITOLO, CODANNOCONT, IDACCIMP, QTAMOLTIMPUTAZIONE, INDRIPARTIZIONE, CODTIPOARROT, IMPARROT, CODTIPOBEN, CODBENEFICIARIO, IDCAPITOLORIPART, IDACCIMPRIPART, QTAMOLTIMPRIPART, CODTIPOBENRIPART, CODBENRIPART,CODCDRRIPART, CODANNOCONTRIPART, TMSLOCK, INDSOSPESO, codmesedet) SELECT lCODSESSIONE, GPREGCONTAB.CODANNO, GPREGCONTAB.CODPARTE, GPREGCONTAB.CODTIPOLEGAME, GPREGCONTAB.CODSEGNOVOCE, GPREGCONTAB.CODTIPODIP, GPREGCONTAB.coddipendente, GPREGCONTAB.CODTIPOELE, GPREGCONTAB.CODELEMENTO , GPCEDOLINO.IDRRLAV, GPCEDOLINO.IDRELAB, TO_DATE( sDTAMIN, 'DD/MM/YYYY'), nIDR, TO_DATE( sDTAMAX,'DD/MM/YYYY'), GPREGCONTAB.IDRCONTRIB, GPREGCONTAB.CODTIPOTASS , GPREGCONTAB.CODTPGRVOX , GPREGCONTAB.CODVALGRVOX, GPREGCONTAB.IDRRLAV, GPREGCONTAB.CODFUNZIONE, GPREGCONTAB.CODSERVIZIO , GPREGCONTAB.CODCDR , GPREGCONTAB.IDCAPITOLO, GPREGCONTAB.CODANNOCONT, GPREGCONTAB.IDACCIMP, GPREGCONTAB.QTAMOLTIMPUTAZIONE, GPREGCONTAB.INDRIPARTIZIONE, GPREGCONTAB.CODTIPOARROT, GPREGCONTAB.IMPARROT, GPREGCONTAB.CODTIPOBEN, GPREGCONTAB.CODBENEFICIARIO, GPREGCONTAB.IDCAPITOLORIPART, GPREGCONTAB.IDACCIMPRIPART, GPREGCONTAB.QTAMOLTIMPRIPART, GPREGCONTAB.CODTIPOBENRIPART, GPREGCONTAB.CODBENRIPART,GPREGCONTAB.CODCDRRIPART, GPREGCONTAB.CODANNOCONTRIPART, lTIMESTAMP, GPREGCONTAB.INDSOSPESO, 0 codmesedet FROM GPTMPRIFXCONT,GPREGCONTAB, GPCEDOLINO WHERE GPREGCONTAB.CODENTEAZ = lCODENTEAZ AND GPREGCONTAB.CODANNO = lCODANNOGRUPPOCONT AND GPREGCONTAB.CODTIPODIP = 'DIP' AND GPREGCONTAB.IDRRLAV = GPCEDOLINO.IDRRLAV AND GPCEDOLINO.IDRELAB IN ( SELECT IDRELAB FROM GPTMPELABXREGCONTAB WHERE OWNER = lCODSESSIONE) AND -- LISTA ELABORAZIONI GPCEDOLINO.CODSTATO = 2 AND GPTMPRIFXCONT.OWNER = lCODSESSIONE AND GPTMPRIFXCONT.IDRELAB = GPCEDOLINO.IDRELAB AND GPTMPRIFXCONT.IDRRLAV = GPCEDOLINO.IDRRLAV AND --- cercare solo per gli elementi che ci sono -- (GPREGCONTAB.codtipoele IN ('VOX') (EXISTS (SELECT GPVERVOCE.codvalgrvox FROM GPVOXCED A, GPVERVOCE WHERE GPREGCONTAB.codtipoele IN ('VOX') AND A.IDRRLAV = GPCEDOLINO.idrrlav AND A.idrelab = GPCEDOLINO.idrelab AND A.CODVOCE = GPVERVOCE.codvoce AND GPVERVOCE.codvalgrvox = GPREGCONTAB.CODVALGRVOX AND A.IMPVOX <> 0) OR EXISTS (SELECT A.codtipotass FROM GPFISCED A WHERE GPREGCONTAB.codtipoele IN ('TAX') AND A.IDRRLAV = GPCEDOLINO.idrrlav AND A.idrelab = GPCEDOLINO.idrelab AND A.CODTIPOTASS = GPREGCONTAB.codtipotass AND A.impimpostanetta <> 0) OR EXISTS (SELECT A.IDRCONTRIB FROM GPSOCCED A WHERE GPREGCONTAB.codtipoele IN ('CON','ONE') AND A.IDRRLAV = GPCEDOLINO.idrrlav AND A.idrelab = GPCEDOLINO.idrelab AND A.idrcontrib = GPREGCONTAB.idrcontrib AND A.imptrattenuta <> 0 AND A.codtiposociale = DECODE (GPREGCONTAB.codtipoele,'CON', 'D', 'ONE', 'E')) ) AND GPTMPRIFXCONT.GIRO = nGiro; commit; INSERT INTO GPTMPREGCONTCED ( OWNER, CODANNO, CODPARTE, CODTIPOLEGAME, CODSEGNOVOCE, CODTIPODIP, CODDIPENDENTE, CODTIPOELE, CODELEMENTO, IDRRLAVCED, IDRELABCED, DTAINIZIO, IDR, DTAFINE, IDRCONTRIB, CODTIPOTASS, CODTPGRVOX, CODVALGRVOX, IDRRLAV, CODFUNZIONE, CODSERVIZIO, CODCDR, IDCAPITOLO, CODANNOCONT, IDACCIMP, QTAMOLTIMPUTAZIONE, INDRIPARTIZIONE, CODTIPOARROT, IMPARROT, CODTIPOBEN, CODBENEFICIARIO, IDCAPITOLORIPART, IDACCIMPRIPART, QTAMOLTIMPRIPART, CODTIPOBENRIPART, CODBENRIPART,CODCDRRIPART, CODANNOCONTRIPART, TMSLOCK, INDSOSPESO, codmesedet ) SELECT lCODSESSIONE, GPREGCONTAB.CODANNO, GPREGCONTAB.CODPARTE, GPREGCONTAB.CODTIPOLEGAME, GPREGCONTAB.CODSEGNOVOCE, GPREGCONTAB.CODTIPODIP, GPREGCONTAB.coddipendente, GPREGCONTAB.CODTIPOELE, GPREGCONTAB.CODELEMENTO , GPCEDOLINO.IDRRLAV, GPCEDOLINO.IDRELAB, TO_DATE( sDTAMIN, 'DD/MM/YYYY'), nIDR, TO_DATE( sDTAMAX,'DD/MM/YYYY'), GPREGCONTAB.IDRCONTRIB, GPREGCONTAB.CODTIPOTASS , GPREGCONTAB.CODTPGRVOX , GPREGCONTAB.CODVALGRVOX, GPREGCONTAB.IDRRLAV, GPREGCONTAB.CODFUNZIONE, GPREGCONTAB.CODSERVIZIO, GPREGCONTAB.CODCDR, GPREGCONTAB.IDCAPITOLO, GPREGCONTAB.CODANNOCONT, GPREGCONTAB.IDACCIMP, GPREGCONTAB.QTAMOLTIMPUTAZIONE, GPREGCONTAB.INDRIPARTIZIONE, GPREGCONTAB.CODTIPOARROT, GPREGCONTAB.IMPARROT, GPREGCONTAB.CODTIPOBEN, GPREGCONTAB.CODBENEFICIARIO, GPREGCONTAB.IDCAPITOLORIPART, GPREGCONTAB.IDACCIMPRIPART, GPREGCONTAB.QTAMOLTIMPRIPART, GPREGCONTAB.CODTIPOBENRIPART, GPREGCONTAB.CODBENRIPART,GPREGCONTAB.CODCDRRIPART, GPREGCONTAB.CODANNOCONTRIPART, lTIMESTAMP, GPREGCONTAB.INDSOSPESO, 0 codmesedet FROM GPTMPRIFXCONT, GPREGCONTAB, GPELAB, GPRAPLAV, GPCEDOLINO WHERE GPREGCONTAB.CODENTEAZ = lCODENTEAZ AND GPREGCONTAB.CODANNO = lCODANNOGRUPPOCONT AND GPREGCONTAB.CODTIPODIP = 'GRP' AND GPCEDOLINO.IDRELAB IN ( SELECT IDRELAB FROM GPTMPELABXREGCONTAB WHERE OWNER = lCODSESSIONE) AND -- LISTA ELABORAZIONI GPCEDOLINO.CODSTATO = 2 AND GPTMPRIFXCONT.OWNER = lCODSESSIONE AND GPTMPRIFXCONT.IDRELAB = GPCEDOLINO.IDRELAB AND GPTMPRIFXCONT.IDRRLAV = GPCEDOLINO.IDRRLAV AND GPTMPRIFXCONT.GIRO = nGiro AND-- se c'é lo prende, altrimenti no GPREGCONTAB.CODSERVIZIO = GPTMPRIFXCONT.CODSERVIZIO AND GPREGCONTAB.CODFUNZIONE = GPTMPRIFXCONT.CODFUNZIONE AND GPCEDOLINO.IDRRLAV = GPRAPLAV.IDRRLAV AND GPCEDOLINO.IDRELAB = GPELAB.IDRELAB AND --- cercare solo per gli elementi che ci sono -- (GPREGCONTAB.codtipoele IN ('VOX') (EXISTS (SELECT GPVERVOCE.codvalgrvox FROM GPVOXCED A, GPVERVOCE WHERE GPREGCONTAB.codtipoele IN ('VOX') AND A.IDRRLAV = GPCEDOLINO.idrrlav AND A.idrelab = GPCEDOLINO.idrelab AND A.CODVOCE = GPVERVOCE.codvoce AND GPVERVOCE.codvalgrvox = GPREGCONTAB.CODVALGRVOX AND A.IMPVOX <> 0) OR EXISTS (SELECT A.codtipotass FROM GPFISCED A WHERE GPREGCONTAB.codtipoele IN ('TAX') AND A.IDRRLAV = GPCEDOLINO.idrrlav AND A.idrelab = GPCEDOLINO.idrelab AND A.CODTIPOTASS = GPREGCONTAB.codtipotass AND A.impimpostanetta <> 0) OR EXISTS (SELECT A.IDRCONTRIB FROM GPSOCCED A WHERE GPREGCONTAB.codtipoele IN ('CON','ONE') AND A.IDRRLAV = GPCEDOLINO.idrrlav AND A.idrelab = GPCEDOLINO.idrelab AND A.idrcontrib = GPREGCONTAB.idrcontrib AND A.imptrattenuta <> 0 AND A.codtiposociale = DECODE (GPREGCONTAB.codtipoele,'CON', 'D', 'ONE', 'E')) ) AND GPTMPRIFXCONT.IDRRLAV NOT IN ( SELECT DISTINCT IDRRLAVCED FROM GPTMPREGCONTCED WHERE GPREGCONTAB.CODTIPOELE = GPTMPREGCONTCED.CODTIPOELE AND GPREGCONTAB.CODELEMENTO = GPTMPREGCONTCED.CODELEMENTO AND GPTMPREGCONTCED.IDRRLAVCED = GPTMPRIFXCONT.IDRRLAV and OWNER = lCODSESSIONE AND IDR = nGiro) ; commit; INSERT INTO GPTMPREGCONTCED ( OWNER, CODANNO, CODPARTE, CODTIPOLEGAME, CODSEGNOVOCE, CODTIPODIP, CODDIPENDENTE, CODTIPOELE, CODELEMENTO, IDRRLAVCED, IDRELABCED, DTAINIZIO, IDR, DTAFINE, IDRCONTRIB, CODTIPOTASS, CODTPGRVOX, CODVALGRVOX, IDRRLAV, CODFUNZIONE, CODSERVIZIO, CODCDR, IDCAPITOLO, CODANNOCONT, IDACCIMP, QTAMOLTIMPUTAZIONE, INDRIPARTIZIONE, CODTIPOARROT, IMPARROT, CODTIPOBEN, CODBENEFICIARIO, IDCAPITOLORIPART, IDACCIMPRIPART, QTAMOLTIMPRIPART, CODTIPOBENRIPART, CODBENRIPART,CODCDRRIPART, CODANNOCONTRIPART, TMSLOCK, INDSOSPESO, codmesedet ) SELECT lCODSESSIONE, GPREGCONTAB.CODANNO, GPREGCONTAB.CODPARTE, GPREGCONTAB.CODTIPOLEGAME, GPREGCONTAB.CODSEGNOVOCE, GPREGCONTAB.CODTIPODIP, GPREGCONTAB.coddipendente, GPREGCONTAB.CODTIPOELE, GPREGCONTAB.CODELEMENTO , GPCEDOLINO.IDRRLAV, GPCEDOLINO.IDRELAB, TO_DATE( sDTAMIN, 'DD/MM/YYYY'), nIDR, TO_DATE( sDTAMAX,'DD/MM/YYYY'), GPREGCONTAB.IDRCONTRIB, GPREGCONTAB.CODTIPOTASS , GPREGCONTAB.CODTPGRVOX , GPREGCONTAB.CODVALGRVOX, GPREGCONTAB.IDRRLAV, GPREGCONTAB.CODFUNZIONE, GPREGCONTAB.CODSERVIZIO, GPREGCONTAB.CODCDR, GPREGCONTAB.IDCAPITOLO, GPREGCONTAB.CODANNOCONT, GPREGCONTAB.IDACCIMP, GPREGCONTAB.QTAMOLTIMPUTAZIONE, GPREGCONTAB.INDRIPARTIZIONE, GPREGCONTAB.CODTIPOARROT, GPREGCONTAB.IMPARROT, GPREGCONTAB.CODTIPOBEN, GPREGCONTAB.CODBENEFICIARIO, GPREGCONTAB.IDCAPITOLORIPART, GPREGCONTAB.IDACCIMPRIPART, GPREGCONTAB.QTAMOLTIMPRIPART, GPREGCONTAB.CODTIPOBENRIPART, GPREGCONTAB.CODBENRIPART,GPREGCONTAB.CODCDRRIPART, GPREGCONTAB.CODANNOCONTRIPART, lTIMESTAMP, GPREGCONTAB.INDSOSPESO, 0 codmesedet FROM GPTMPRIFXCONT,GPREGCONTAB, GPCEDOLINO WHERE GPREGCONTAB.CODENTEAZ = lCODENTEAZ AND GPREGCONTAB.CODANNO = lCODANNOGRUPPOCONT AND GPREGCONTAB.CODTIPODIP = 'ALL' AND GPCEDOLINO.IDRELAB IN ( SELECT IDRELAB FROM GPTMPELABXREGCONTAB WHERE OWNER = lCODSESSIONE) AND -- LISTA ELABORAZIONI GPCEDOLINO.CODSTATO = 2 AND GPTMPRIFXCONT.OWNER = lCODSESSIONE AND GPTMPRIFXCONT.IDRELAB = GPCEDOLINO.IDRELAB AND GPTMPRIFXCONT.IDRRLAV = GPCEDOLINO.IDRRLAV AND GPTMPRIFXCONT.GIRO = nGiro AND-- se c'é lo prende, altrimenti no --- cercare solo per gli elementi che ci sono -- (GPREGCONTAB.codtipoele IN ('VOX') (EXISTS (SELECT GPVERVOCE.codvalgrvox FROM GPVOXCED A, GPVERVOCE WHERE GPREGCONTAB.codtipoele IN ('VOX') AND A.IDRRLAV = GPCEDOLINO.idrrlav AND A.idrelab = GPCEDOLINO.idrelab AND A.CODVOCE = GPVERVOCE.codvoce AND GPVERVOCE.codvalgrvox = GPREGCONTAB.CODVALGRVOX AND A.IMPVOX <> 0) OR EXISTS (SELECT A.codtipotass FROM GPFISCED A WHERE GPREGCONTAB.codtipoele IN ('TAX') AND A.IDRRLAV = GPCEDOLINO.idrrlav AND A.idrelab = GPCEDOLINO.idrelab AND A.CODTIPOTASS = GPREGCONTAB.codtipotass AND A.impimpostanetta <> 0) OR EXISTS (SELECT A.IDRCONTRIB FROM GPSOCCED A WHERE GPREGCONTAB.codtipoele IN ('CON','ONE') AND A.IDRRLAV = GPCEDOLINO.idrrlav AND A.idrelab = GPCEDOLINO.idrelab AND A.idrcontrib = GPREGCONTAB.idrcontrib AND A.imptrattenuta <> 0 AND A.codtiposociale = DECODE (GPREGCONTAB.codtipoele,'CON', 'D', 'ONE', 'E')) ) AND GPCEDOLINO.IDRRLAV NOT IN ( SELECT DISTINCT IDRRLAVCED FROM GPTMPREGCONTCED WHERE GPREGCONTAB.CODTIPOELE = GPTMPREGCONTCED.CODTIPOELE AND GPREGCONTAB.CODELEMENTO = GPTMPREGCONTCED.CODELEMENTO AND GPTMPREGCONTCED.IDRRLAVCED = GPCEDOLINO.IDRRLAV and OWNER = lCODSESSIONE AND IDR = nGiro ); COMMIT; --- INSERISCO LE VOCI INSERT INTO GPTMPREGCONTCED ( codtipodip, coddipendente, OWNER , CODANNO , CODANNOMAT, codtpgrvox, CODVALGRVOX, CODVOCE, QTASEZIONE, QTAPROGELE , IMPELEMENTO, CODCOLONNA, INDPGIRO , CODPARTE , CODTIPOLEGAME , CODSEGNOVOCE , CODTIPOELE , CODELEMENTO , IDRRLAVCED , IDRELABCED , DTAINIZIO , IDR , DTAFINE , IDCAPITOLO , CODANNOCONT , IDACCIMP , QTAMOLTIMPUTAZIONE , INDRIPARTIZIONE , CODTIPOARROT , IMPARROT , CODTIPOBEN , CODBENEFICIARIO , IDRCDC , IDCAPITOLORIPART , IDACCIMPRIPART , QTAMOLTIMPRIPART , CODTIPOBENRIPART , CODBENRIPART , CODCDRRIPART , CODANNOCONTRIPART , INDSOSPESO , TMSLOCK , codmesedet) SELECT GPTMPREGCONTCED.CODTIPODIP, GPTMPREGCONTCED.coddipendente, GPTMPREGCONTCED.OWNER , GPTMPREGCONTCED.CODANNO , GPVOXCED.codanno CODANNOMAT, GPTMPREGCONTCED.codtpgrvox, GPTMPREGCONTCED.codvalgrvox, GPVOXCED.codvoce, GPVOXCED.QTASEZIONE, GPVOXCED.qtaprogr , SUM(GPVOXCED.impvox) , GPVOCE.CODCOLONNA, GPVALGRVOX.indpgiro, CODPARTE , CODTIPOLEGAME , CODSEGNOVOCE ,'IDV' CODTIPOELE , TO_CHAR(GPVOXCED.codvoce) CODELEMENTO , IDRRLAVCED , IDRELABCED , GPTMPREGCONTCED.DTAINIZIO , GPTMPREGCONTCED.IDR , GPTMPREGCONTCED.DTAFINE , IDCAPITOLO , CODANNOCONT , IDACCIMP , QTAMOLTIMPUTAZIONE , INDRIPARTIZIONE , CODTIPOARROT , IMPARROT , CODTIPOBEN , CODBENEFICIARIO , '0' CDC , IDCAPITOLORIPART , IDACCIMPRIPART , QTAMOLTIMPRIPART , CODTIPOBENRIPART , CODBENRIPART , CODCDRRIPART , CODANNOCONTRIPART , INDSOSPESO , 0 TMSLOCK , 0 codmesedet FROM GPTMPRIFXCONT, GPTMPREGCONTCED, GPVOXCED, GPVOCE, GPVERVOCE, GPVALGRVOX WHERE GPTMPREGCONTCED.owner = lCODSESSIONE AND GPTMPREGCONTCED.codtipoele = 'VOX' AND gptmpregcontced.idrrlavced = GPVOXCED.idrrlav AND GPTMPREGCONTCED.IDRELABCED = GPVOXCED.idrelab AND gptmpregcontced.IDR = GPTMPRIFXCONT.GIRO AND GPTMPRIFXCONT.OWNER = lCODSESSIONE AND GPTMPRIFXCONT.IDRELAB = GPTMPREGCONTCED.IDRELABCED AND GPTMPRIFXCONT.IDRRLAV = GPTMPREGCONTCED.IDRRLAVCED AND GPTMPRIFXCONT.GIRO = nGIRO AND (CODSEGNOVOCE = 'X' OR (CODSEGNOVOCE = 'P' AND GPVOXCED.IMPVOX >= 0) OR (CODSEGNOVOCE = 'N' AND GPVOXCED.IMPVOX <0)) AND GPVOXCED.CODVOCE = GPVOCE.CODVOCE AND GPVOCE.CODVOCE = GPVERVOCE.codvoce AND ((GPVERVOCE.indente = 'N' AND NOT EXISTS (SELECT A.codvoce FROM GPVERVOCE A WHERE A.CODVOCE = GPVERVOCE.CODVOCE AND A.indente = 'S' AND A.codenteaz = lCODENTEAZ)) OR ( GPVERVOCE.indente = 'N' AND GPVERVOCE.codenteaz = lCODENTEAZ)) AND GPVERVOCE.codtpgrvox = GPTMPREGCONTCED.codtpgrvox AND GPVERVOCE.codvalgrvox = GPTMPREGCONTCED.codvalgrvox AND GPVERVOCE.codtpgrvox = GPVALGRVOX.codtpgrvox AND GPVERVOCE.codvalgrvox = GPVALGRVOX.codvalgrvox AND GPTMPREGCONTCED.IDR = nGIRO GROUP BY GPTMPREGCONTCED.CODTIPODIP, GPTMPREGCONTCED.coddipendente, GPTMPREGCONTCED.OWNER , GPTMPREGCONTCED.CODANNO , GPVOXCED.CODANNO, GPTMPREGCONTCED.CODTPGRVOX, GPTMPREGCONTCED.CODVALGRVOX, GPVOXCED.CODVOCE, GPVOXCED.QTASEZIONE, GPVOXCED.qtaprogr, GPVOCE.CODCOLONNA, GPVALGRVOX.INDPGIRO, CODPARTE , CODTIPOLEGAME , CODSEGNOVOCE , CODTIPOELE , CODELEMENTO , IDRRLAVCED , IDRELABCED , GPTMPREGCONTCED.DTAINIZIO , GPTMPREGCONTCED.IDR , GPTMPREGCONTCED.DTAFINE , IDCAPITOLO , CODANNOCONT , IDACCIMP , QTAMOLTIMPUTAZIONE , INDRIPARTIZIONE , CODTIPOARROT , IMPARROT , CODTIPOBEN , CODBENEFICIARIO , IDCAPITOLORIPART , IDACCIMPRIPART , QTAMOLTIMPRIPART , CODTIPOBENRIPART , CODBENRIPART , CODCDRRIPART , CODANNOCONTRIPART , INDSOSPESO; COMMIT; IF lINDXCDC = 'S' THEN -- a chi ha il CDC nella data di riferimento lo Aggiorno UPDATE GPTMPREGCONTCED SET IDRCDC = ( SELECT MAX(GPTMPRIFXCONT.IDRCDC) FROM GPTMPRIFXCONT WHERE OWNER = GPTMPREGCONTCED.OWNER AND GPTMPREGCONTCED.IDRRLAVCED = GPTMPRIFXCONT.IDRRLAV AND GPTMPREGCONTCED.IDRELABCED = GPTMPRIFXCONT.IDRELAB AND GIRO = nGiro ) -- Aggiorno Regole del giro WHERE OWNER = lCODSESSIONE AND CODANNO = lCODANNOGRUPPOCONT AND CODTIPOELE IN ('IDV', 'ONE') AND -- RM2004 NON SERVE PER VOX E NEPPURE PER CON E TAX IDR = nGiro; COMMIT; END IF; IF nGiro = 1 THEN -- LE REGOLE SONO CORRELATE ALLE VOCI E NON ALLA ASSOCIAZIONE DIPENDENTE <-> FF.SS. INSERT INTO GPTMPREGCONTCEDDET ( OWNER , CODANNO , CODELEMENTO , IDRRLAVCED , IDRELABCED , DTAINIZIO , IDR , DTAFINE , IDRCONTRIB , IDCAPITOLORIPART , IDACCIMPRIPART , CODANNOCONTRIPART , TMSLOCK, CODANNOMAT, QTAPROGELE, CODVOCE, QTASEZIONE, codmesedet ) SELECT GPTMPREGCONTCED.OWNER , GPTMPREGCONTCED.CODANNO , GPTMPREGCONTCED.CODELEMENTO , GPTMPREGCONTCED.IDRRLAVCED, GPTMPREGCONTCED.IDRELABCED , GPTMPREGCONTCED.DTAINIZIO , GPTMPREGCONTCED.IDR , GPTMPREGCONTCED.DTAFINE , GPREGCONTABONE.IDRCONTRIB, GPREGCONTABONE.IDCAPITOLORIPART , GPREGCONTABONE.IDACCIMPRIPART , GPREGCONTABONE.CODANNOCONTRIPART , GPTMPREGCONTCED.TMSLOCK, REGVOX.CODANNOMAT, REGVOX.QTAPROGELE, REGVOX.CODVOCE, REGVOX.QTASEZIONE, gptmpregcontced.codmesedet FROM GPTMPREGCONTCED, GPREGCONTABONE, GPTMPREGCONTCED REGVOX WHERE GPREGCONTABONE.CODENTEAZ = lCODENTEAZ AND GPREGCONTABONE.CODANNO = GPTMPREGCONTCED.CODANNO AND GPREGCONTABONE.CODPARTE = GPTMPREGCONTCED.codparte AND GPREGCONTABONE.CODTIPOLEGAME = GPTMPREGCONTCED.codtipolegame AND GPREGCONTABONE.codsegnovoce = GPTMPREGCONTCED.CODSEGNOVOCE AND GPREGCONTABONE.CODTIPODIP = GPTMPREGCONTCED.CODTIPODIP AND GPREGCONTABONE.CODDIPENDENTE = GPTMPREGCONTCED.coddipendente AND GPREGCONTABONE.CODTIPOELE = GPTMPREGCONTCED.codtipoele AND GPREGCONTABONE.CODELEMENTO = GPTMPREGCONTCED.codelemento AND GPTMPREGCONTCED.owner = lCODSESSIONE AND REGVOX.OWNER = lCODSESSIONE AND REGVOX.codanno = GPTMPREGCONTCED.CODANNO AND REGVOX.codparte = GPTMPREGCONTCED.codparte AND REGVOX.codtipolegame = GPTMPREGCONTCED.CODTIPOLEGAME AND REGVOX.codsegnovoce = GPTMPREGCONTCED.CODSEGNOVOCE AND REGVOX.codtipoele = 'IDV' AND GPTMPREGCONTCED.CODTIPOELE = 'VOX' AND gptmpregcontced.idrelabced = regvox.idrelabced and gptmpregcontced.idrrlavced = regvox.idrrlavced and REGVOX.codvalgrvox = GPTMPREGCONTCED.codvalgrvox AND gptmpregcontced.codmesedet = regvox.codmesedet; COMMIT; -- RM2004 : TOLTA LA REGISTRAZIONE DI GPTMPREGCONTXVOX END IF; -------------------------------------------------------------------------------------------- -- Aggiorno tutte le righe delle Voci con le eventuali regole specificate sulla Tabella di -- Corrispondenza Anno Liq. --> Anno di Maturaz. FOR REC IN ( SELECT A.IDCAPITOLOLIQ , A.CODANNOLIQ, A.CODPARTE , A.CODANNOIMPLIQ , A.IDACCIMPLIQ , A.CODANNOMAT , A.IDCAPITOLORES , A.CODANNORES , A.IDACCIMPRES , B.IDRRLAVCED, B.IDRELABCED FROM GPCROSSCONTAB A, GPTMPREGCONTCED B WHERE A.CODANNOLIQ = lCODANNOGRUPPOCONT AND A.CODENTEAZ = UPPER(lCODENTEAZ ) AND B.CODTIPOELE= 'IDV' AND B.OWNER = lCODSESSIONE AND B.CODANNO = A.CODANNOLIQ AND B.IDCAPITOLO = A.IDCAPITOLOLIQ AND B.CODANNOCONT = A.CODANNOIMPLIQ AND B.IDACCIMP = A.IDACCIMPLIQ GROUP BY A.IDCAPITOLOLIQ , A.CODANNOLIQ, A.CODPARTE , A.CODANNOIMPLIQ , A.IDACCIMPLIQ , A.CODANNOMAT , A.IDCAPITOLORES , A.CODANNORES , A.IDACCIMPRES , B.IDRRLAVCED, B.IDRELABCED ) LOOP UPDATE GPTMPREGCONTCED SET IDCAPITOLO = REC.IDCAPITOLORES, CODANNOCONT = REC.CODANNORES, IDACCIMP = REC.IDACCIMPRES WHERE OWNER = lCODSESSIONE AND CODTIPOELE = 'IDV' AND IDRRLAVCED= REC.IDRRLAVCED AND IDRELABCED = REC.IDRELABCED AND CODANNOMAT = REC.CODANNOMAT AND CODPARTE = REC.CODPARTE AND CODANNO = REC.CODANNOLIQ AND IDCAPITOLO = REC.IDCAPITOLOLIQ AND CODANNOCONT = REC.CODANNOIMPLIQ AND IDACCIMP = REC.IDACCIMPLIQ; END LOOP; COMMIT; ---------------------------------------------------------------------------------------------- -- Aggiorno le righe delle Voci con le eventuali regole specificate sulla Comunicazione Voci -- sia per quello che concerne la singola Voce che la Regola Generale per l'onere da ripartire -- Aggiorno le righe della Deroga alla Regola Generale per l'onere da ripartire -- con le eventuali regole specificate sulla Comunicazione Voci FOR REC IN ( SELECT IDRRLAV , IDRELAB , CODVOCE , QTASEZIONE , QTAPROGRULT, IDRCONTRIB , INDVOX , INDSINGONE , IDCAPITOLO , CODANNOCONT, IDACCIMP , CODTIPOBEN , CODBENEFICIARIO , CODTIPOARROT , IMPARROT FROM GPCONTABVOXCED WHERE ( IDRRLAV, IDRELAB, CODVOCE, QTASEZIONE ) IN ( SELECT A.IDRRLAVCED, A.IDRELABCED, A.CODVOCE, A.QTASEZIONE FROM GPTMPREGCONTCED A WHERE A.OWNER = lCODSESSIONE AND GPCONTABVOXCED.IDRRLAV = A.IDRRLAVCED AND GPCONTABVOXCED.IDRELAB = A.IDRELABCED AND GPCONTABVOXCED.CODVOCE = A.CODVOCE AND GPCONTABVOXCED.QTASEZIONE = A.QTASEZIONE ) ORDER BY IDRRLAV , IDRELAB , CODVOCE , QTASEZIONE , INDVOX DESC, INDSINGONE ) LOOP IF REC.INDVOX = 'S' THEN UPDATE GPTMPREGCONTCED SET IDCAPITOLO = REC.IDCAPITOLO , CODANNOCONT = REC.CODANNOCONT , IDACCIMP = REC.IDACCIMP , CODTIPOARROT = REC.CODTIPOARROT , IMPARROT = REC.IMPARROT , CODTIPOBEN = REC.CODTIPOBEN , CODBENEFICIARIO = REC.CODBENEFICIARIO WHERE OWNER = lCODSESSIONE AND CODTIPOELE = 'IDV' AND IDRRLAVCED = REC.IDRRLAV AND IDRELABCED = REC.IDRELAB AND CODVOCE = REC.CODVOCE AND QTASEZIONE = REC.QTASEZIONE; ELSIF ( REC.INDSINGONE = 'N' ) THEN UPDATE GPTMPREGCONTCED SET IDCAPITOLORIPART = REC.IDCAPITOLO , CODANNOCONTRIPART = REC.CODANNOCONT , IDACCIMPRIPART = REC.IDACCIMP , CODTIPOARROT = REC.CODTIPOARROT , IMPARROT = REC.IMPARROT WHERE OWNER = lCODSESSIONE AND CODTIPOELE = 'IDV' AND IDRRLAVCED = REC.IDRRLAV AND IDRELABCED = REC.IDRELAB AND CODVOCE = REC.CODVOCE AND QTASEZIONE = REC.QTASEZIONE; ELSIF ( REC.INDSINGONE = 'S' ) AND ( nGIRO = 1 ) THEN UPDATE GPTMPREGCONTCEDDET SET IDRCONTRIB = REC.IDRCONTRIB , IDCAPITOLORIPART = REC.IDCAPITOLO , IDACCIMPRIPART = REC.IDACCIMP , CODANNOCONTRIPART = REC.CODANNOCONT WHERE OWNER = lCODSESSIONE AND IDRRLAVCED = REC.IDRRLAV AND IDRCONTRIB = REC.IDRCONTRIB AND IDRELABCED = REC.IDRELAB AND CODVOCE = REC.CODVOCE AND QTASEZIONE = REC.QTASEZIONE; END IF; END LOOP; COMMIT; -------------------------------------------------------- -- lancio le statistiche in modo da velocizzare l'esecuzione della query sugli oneri in particolare -- SYS.DBMS_UTILITY.exec_ddl_statement( 'ANALYZE TABLE GPTMPREGCONTXVOX COMPUTE STATISTICS'); SYS.DBMS_UTILITY.exec_ddl_statement('ANALYZE TABLE GPTMPREGCONTCED COMPUTE STATISTICS' ); SYS.DBMS_UTILITY.exec_ddl_statement('ANALYZE TABLE GPTMPREGCONTCEDDET COMPUTE STATISTICS'); -- passo 2: ( Riempimento GPDETRISCONT) Per ogni regole di gruppo voce carico l'importo della voce; -- poi continuo per oneri , contributi, ecc. -- per gruppo voce: fare cursore che lega la voce di cedolino alla regola identificata per il dipendente (principale) -- passando attraverso il gruppo voce -- PASSO 2: Contabilizzazione degli elementi in base alle regole specificate nella GPTMPREGCONTCED -- cancello se già calcolate per quell'anno IF nGiro = 1 THEN IF lQTAGRUPPOCONT IS NULL THEN -- nuovo gruppo ( cancello tutte i record per -- le elaborazioni già esistenti) DELETE FROM GPDETRISCONT WHERE IDRELAB IN ( SELECT DISTINCT IDRELAB FROM GPTMPELABXREGCONTAB WHERE OWNER = lCODSESSIONE ); DELETE FROM GPELERISCONT; ELSE -- gruppo già esistente ( cancello tutte i record per le elaborazioni già esistenti e quelli -- di quel gruppo ) DELETE FROM GPDETRISCONT WHERE ( IDRRISCONT IN ( SELECT IDRRISCONT FROM GPRISCONT WHERE CODANNOGRUPPOCONT = lCODANNOGRUPPOCONT AND QTAGRUPPOCONT = lQTAGRUPPOCONT AND IDRELAB IN ( SELECT IDRELAB FROM GPELAB WHERE CODENTEAZ = lCODENTEAZ ) ) ) OR ( IDRELAB IN ( SELECT IDRELAB FROM GPTMPELABXREGCONTAB WHERE OWNER = lCODSESSIONE ) ); DELETE FROM GPELERISCONT; END IF; COMMIT; -- 2.1. Contabilizzazione delle voci INSERT INTO GPTMPELERISCONT ( OWNER, IDRRLAV , IDRELAB , CODTIPOELE , CODELEMENTO, CODANNOESERCIZIO , CODANNOMAT, CODPARTE , IDCAPITOLO , CODANNOCONT, IDACCIMP, IDCDC, CODTIPOBEN, CODBENEFICIARIO, IMPMANDATO, IMPTRATTENUTE, IMPNETTO, INDALLEGATO, INDSOSPESO, INDPGIRO, TMSLOCK, codmesedet ) SELECT OWNER, IDRRLAVCED, IDRELABCED, 'VOX', CODELEMENTO, GPTMPREGCONTCED.CODANNO, GPTMPREGCONTCED.CODANNOMAT, CODPARTE, IDCAPITOLO, GPTMPREGCONTCED.CODANNOCONT, IDACCIMP, NVL(DECODE(GPTMPREGCONTCED.indpgiro, 'N', IDRCDC,0),0), CODTIPOBEN, CODBENEFICIARIO, SUM(DECODE( GPTMPREGCONTCED.CODCOLONNA, 'C', IMPELEMENTO, 'F', IMPELEMENTO, 'T', IMPELEMENTO*(-1),0)* QTAMOLTIMPUTAZIONE) , 0, 0, 'S', NVL(GPTMPREGCONTCED.INDSOSPESO,'N'),INDPGIRO, lTIMESTAMP, 0 FROM GPTMPREGCONTCED WHERE GPTMPREGCONTCED.OWNER = lCODSESSIONE AND GPTMPREGCONTCED.CODANNO = lCODANNOGRUPPOCONT AND IDR = nGiro AND GPTMPREGCONTCED.CODTIPOELE = 'IDV' AND GPTMPREGCONTCED.CODTIPOLEGAME ='P' AND (CODSEGNOVOCE = 'X' OR (CODSEGNOVOCE = 'P' AND IMPELEMENTO >= 0) OR (CODSEGNOVOCE = 'N' AND IMPELEMENTO<0)) GROUP BY owner, IDRRLAVCED, IDRELABCED, GPTMPREGCONTCED.CODANNO, codelemento, GPTMPREGCONTCED.CODANNOMAT, CODPARTE, IDCAPITOLO, GPTMPREGCONTCED.CODANNOCONT, IDACCIMP, CODTIPOBEN,CODBENEFICIARIO,NVL(DECODE(GPTMPREGCONTCED.indpgiro, 'N', IDRCDC,0),0), NVL(GPTMPREGCONTCED.INDSOSPESO,'N'), INDPGIRO; COMMIT; -- 2.2 Contabilizzazione delle imposte INSERT INTO GPTMPELERISCONT ( OWNER, IDRRLAV , IDRELAB , CODTIPOELE ,CODELEMENTO, CODANNOESERCIZIO , CODANNOMAT, CODPARTE, IDCAPITOLO , CODANNOCONT, IDACCIMP , IDCDC, CODTIPOBEN, CODBENEFICIARIO, IMPMANDATO, IMPTRATTENUTE , IMPNETTO, INDALLEGATO, INDSOSPESO, INDPGIRO, TMSLOCK,codmesedet) SELECT GPTMPREGCONTCED.owner,GPTMPREGCONTCED.IDRRLAVCED, GPTMPREGCONTCED.IDRELABCED,GPTMPREGCONTCED.CODTIPOELE, GPTMPREGCONTCED.codelemento, GPTMPREGCONTCED.CODANNO, GPTMPREGCONTCED.CODANNO, GPTMPREGCONTCED.CODPARTE, GPTMPREGCONTCED.IDCAPITOLO, GPTMPREGCONTCED.CODANNOCONT, GPTMPREGCONTCED.IDACCIMP, 0 IDRCDC, CODTIPOBEN, CODBENEFICIARIO, SUM( GPFISCED.IMPIMPOSTANETTA * QTAMOLTIMPUTAZIONE) , 0, SUM( GPFISCED.IMPIMPOSTANETTA * QTAMOLTIMPUTAZIONE), 'S', NVL(GPTMPREGCONTCED.INDSOSPESO,'N'), 'S' INDPGIRO, lTIMESTAMP, 0 FROM GPTMPREGCONTCED, GPLTIPOTASS, GPFISCED WHERE GPTMPREGCONTCED.OWNER = lCODSESSIONE AND GPTMPREGCONTCED.CODANNO = lCODANNOGRUPPOCONT AND IDR = nGiro AND GPTMPREGCONTCED.CODTIPOELE = 'TAX' AND GPTMPREGCONTCED.CODTIPOLEGAME ='P' AND GPTMPREGCONTCED.CODTIPOTASS = GPLTIPOTASS.CODTIPOTASS AND GPTMPREGCONTCED.IDRRLAVCED = GPFISCED.IDRRLAV AND GPTMPREGCONTCED.IDRELABCED = GPFISCED.IDRELAB AND GPLTIPOTASS.CODTIPOTASS = GPFISCED.CODTIPOTASS GROUP BY GPTMPREGCONTCED.owner, GPTMPREGCONTCED.IDRRLAVCED , GPTMPREGCONTCED.IDRELABCED ,GPTMPREGCONTCED.CODTIPOELE, GPTMPREGCONTCED.CODELEMENTO, GPTMPREGCONTCED.CODANNO, GPTMPREGCONTCED.CODPARTE, GPTMPREGCONTCED.IDCAPITOLO, GPTMPREGCONTCED.CODANNOCONT, GPTMPREGCONTCED.IDACCIMP, CODTIPOBEN, CODBENEFICIARIO, NVL(GPTMPREGCONTCED.INDSOSPESO,'N'); COMMIT; -- 2.3.1 Contabilizzazione degli oneri e contributi da non ripartire INSERT INTO GPTMPELERISCONT( OWNER, IDRRLAV , IDRELAB , CODTIPOELE , CODELEMENTO, CODANNOESERCIZIO , CODANNOMAT, CODPARTE , IDCAPITOLO , CODANNOCONT, IDACCIMP , IDCDC, CODTIPOBEN, CODBENEFICIARIO, IMPMANDATO, IMPTRATTENUTE , IMPNETTO, INDALLEGATO, INDSOSPESO, INDPGIRO, TMSLOCK, codmesedet ) SELECT GPTMPREGCONTCED.OWNER, GPTMPREGCONTCED.IDRRLAVCED , GPTMPREGCONTCED.IDRELABCED ,GPTMPREGCONTCED.CODTIPOELE, GPTMPREGCONTCED.CODELEMENTO, GPTMPREGCONTCED.CODANNO, GPSOCCED.CODANNOCOMP, GPTMPREGCONTCED.CODPARTE, GPTMPREGCONTCED.IDCAPITOLO, GPTMPREGCONTCED.CODANNOCONT, GPTMPREGCONTCED.IDACCIMP, NVL(DECODE (GPTMPREGCONTCED.CODTIPOELE, 'ONE', GPTMPREGCONTCED.IDRCDC,0),0), GPTMPREGCONTCED.CODTIPOBEN, GPTMPREGCONTCED.CODBENEFICIARIO, SUM( GPSOCCED.IMPTRATTENUTA * QTAMOLTIMPUTAZIONE), 0, SUM( GPSOCCED.IMPTRATTENUTA * QTAMOLTIMPUTAZIONE), 'S', NVL(GPTMPREGCONTCED.INDSOSPESO,'N'), 'N' INDPGIRO, lTIMESTAMP, 0 FROM GPTMPREGCONTCED, GPCONTRIB, GPSOCCED WHERE GPTMPREGCONTCED.OWNER = lCODSESSIONE AND GPTMPREGCONTCED.CODANNO = lCODANNOGRUPPOCONT AND IDR = nGiro AND ( (GPTMPREGCONTCED.CODTIPOELE ='CON' AND GPSOCCED.CODTIPOSOCIALE ='D' ) OR (GPTMPREGCONTCED.CODTIPOELE ='ONE' AND GPSOCCED.CODTIPOSOCIALE ='E' ) ) AND GPTMPREGCONTCED.INDRIPARTIZIONE ='N' AND GPTMPREGCONTCED.CODTIPOLEGAME ='P' AND GPTMPREGCONTCED.IDRCONTRIB = GPCONTRIB.IDRCONTRIB AND GPTMPREGCONTCED.IDRRLAVCED = GPSOCCED.IDRRLAV AND GPTMPREGCONTCED.IDRELABCED = GPSOCCED.IDRELAB AND GPCONTRIB.IDRCONTRIB = GPSOCCED.IDRCONTRIB GROUP BY GPTMPREGCONTCED.OWNER, GPTMPREGCONTCED.IDRRLAVCED , GPTMPREGCONTCED.IDRELABCED ,GPTMPREGCONTCED.CODTIPOELE, GPTMPREGCONTCED.CODELEMENTO, GPTMPREGCONTCED.CODANNO, GPSOCCED.CODANNOCOMP, GPTMPREGCONTCED.CODPARTE, GPTMPREGCONTCED.IDCAPITOLO, GPTMPREGCONTCED.CODANNOCONT, GPTMPREGCONTCED.IDACCIMP, DECODE (GPTMPREGCONTCED.CODTIPOELE, 'ONE', GPTMPREGCONTCED.IDRCDC,0), CODTIPOBEN, CODBENEFICIARIO , NVL(GPTMPREGCONTCED.INDSOSPESO,'N'); COMMIT; ELSE -- nGiro>1 FOR rec IN -- 2.1. Contabilizzazione delle voci ( ( SELECT GPTMPREGCONTCED.IDRRLAVCED, GPTMPREGCONTCED.IDRELABCED, GPTMPREGCONTCED.CODTIPOELE, GPTMPREGCONTCED.CODANNO CODANNOESERCIZIO, GPTMPREGCONTCED.codannomat CODANNOMAT, CODPARTE, IDCAPITOLO, GPTMPREGCONTCED.CODANNOCONT, IDACCIMP, NVL(DECODE(GPTMPREGCONTCED.indpgiro, 'N', GPTMPREGCONTCED.IDRCDC,0),0) IDRCDC, CODTIPOBEN, CODBENEFICIARIO, NULL IDRRISCONT, -- Riccardo inizio 2004 ROUND( SUM(DECODE( CODCOLONNA, 'C', IMPELEMENTO, 'F', IMPELEMENTO, 'T', IMPELEMENTO*(-1),0)* QTAMOLTIMPUTAZIONE) * GPTMPRIFXCONT.PRCAPPARTENENZA/100, 2) IMPMANDATO -- Riccardo fine , 0 IMPTRATTENUTE, 0 IMPNETTO, 'S' INDALLEGATO, GPTMPREGCONTCED.CODELEMENTO, NVL(GPTMPREGCONTCED.INDSOSPESO,'N') INDSOSPESO, INDPGIRO, GPTMPREGCONTCED.QTASEZIONE, GPTMPREGCONTCED.QTAPROGELE FROM GPTMPREGCONTCED, GPTMPRIFXCONT WHERE GPTMPREGCONTCED.OWNER = lCODSESSIONE AND GPTMPREGCONTCED.CODANNO = lCODANNOGRUPPOCONT AND GPTMPREGCONTCED.CODTIPOELE = 'IDV' AND GPTMPRIFXCONT.OWNER = lCODSESSIONE AND GPTMPRIFXCONT.IDRELAB = GPTMPREGCONTCED.IDRELABCED AND GPTMPRIFXCONT.IDRRLAV = GPTMPREGCONTCED.IDRRLAVCED AND GPTMPRIFXCONT.GIRO = nGiro AND-- se c'é lo prende, altrimenti no IDR = GPTMPRIFXCONT.Giro AND GPTMPREGCONTCED.CODTIPOLEGAME ='P' AND (CODSEGNOVOCE = 'X' OR (CODSEGNOVOCE = 'P' AND IMPELEMENTO >= 0) OR (CODSEGNOVOCE = 'N' AND IMPELEMENTO <0)) GROUP BY GPTMPREGCONTCED.IDRRLAVCED, GPTMPREGCONTCED.IDRELABCED, GPTMPREGCONTCED.CODTIPOELE, GPTMPREGCONTCED.CODANNO, GPTMPREGCONTCED.CODANNOMAT, CODPARTE, IDCAPITOLO, GPTMPREGCONTCED.CODANNOCONT, IDACCIMP, GPTMPREGCONTCED.QTASEZIONE, GPTMPREGCONTCED.QTAPROGELE, CODTIPOBEN,CODBENEFICIARIO,DECODE(GPTMPREGCONTCED.indpgiro, 'N', GPTMPREGCONTCED.IDRCDC,0), GPTMPREGCONTCED.CODELEMENTO, NVL(GPTMPREGCONTCED.INDSOSPESO,'N'), INDPGIRO, GPTMPRIFXCONT.PRCAPPARTENENZA ) UNION ( SELECT GPTMPREGCONTCED.IDRRLAVCED , GPTMPREGCONTCED.IDRELABCED ,GPTMPREGCONTCED.CODTIPOELE, GPTMPREGCONTCED.CODANNO CODANNOESERCIZIO, GPTMPREGCONTCED.CODANNO CODANNOMAT, GPTMPREGCONTCED.CODPARTE, GPTMPREGCONTCED.IDCAPITOLO, GPTMPREGCONTCED.CODANNOCONT,GPTMPREGCONTCED.IDACCIMP, 0 IDRCDC, CODTIPOBEN, CODBENEFICIARIO, NULL IDRRISCONT, -- Riccardo inizio ROUND(SUM( GPFISCED.IMPIMPOSTANETTA * QTAMOLTIMPUTAZIONE) * GPTMPRIFXCONT.PRCAPPARTENENZA/100, 2) IMPMANDATO, 0 IMPTRATTENUTE, ROUND(SUM( GPFISCED.IMPIMPOSTANETTA * QTAMOLTIMPUTAZIONE) * GPTMPRIFXCONT.PRCAPPARTENENZA/100, 2) IMPNETTO, 'S' INDALLEGATO, GPTMPREGCONTCED.CODELEMENTO, NVL(GPTMPREGCONTCED.INDSOSPESO,'N') INDSOSPESO, 'S' INDPGIRO , GPTMPREGCONTCED.QTASEZIONE, GPTMPREGCONTCED.QTAPROGELE -- Riccardo fine FROM GPTMPRIFXCONT,GPTMPREGCONTCED, GPLTIPOTASS, GPFISCED WHERE GPTMPREGCONTCED.OWNER = lCODSESSIONE AND GPTMPREGCONTCED.CODANNO = lCODANNOGRUPPOCONT AND GPTMPRIFXCONT.OWNER = lCODSESSIONE AND GPTMPRIFXCONT.IDRELAB = GPTMPREGCONTCED.IDRELABCED AND GPTMPRIFXCONT.IDRRLAV = GPTMPREGCONTCED.IDRRLAVCED AND GPTMPRIFXCONT.GIRO = nGiro AND-- se c'é lo prende, altrimenti no IDR = GPTMPRIFXCONT.Giro AND GPTMPREGCONTCED.CODTIPOELE = 'TAX' AND GPTMPREGCONTCED.CODTIPOLEGAME ='P' AND GPTMPREGCONTCED.CODTIPOTASS = GPLTIPOTASS.CODTIPOTASS AND GPTMPREGCONTCED.IDRRLAVCED = GPFISCED.IDRRLAV AND GPTMPREGCONTCED.IDRELABCED = GPFISCED.IDRELAB AND GPLTIPOTASS.CODTIPOTASS = GPFISCED.CODTIPOTASS GROUP BY GPTMPREGCONTCED.IDRRLAVCED , GPTMPREGCONTCED.IDRELABCED ,GPTMPREGCONTCED.CODTIPOELE, GPTMPREGCONTCED.CODANNO , GPTMPREGCONTCED.CODPARTE, GPTMPREGCONTCED.IDCAPITOLO, GPTMPREGCONTCED.CODANNOCONT, GPTMPREGCONTCED.IDACCIMP, GPTMPREGCONTCED.QTASEZIONE, GPTMPREGCONTCED.QTAPROGELE, CODTIPOBEN, CODBENEFICIARIO, GPTMPRIFXCONT.PRCAPPARTENENZA, GPTMPREGCONTCED.CODELEMENTO, NVL(GPTMPREGCONTCED.INDSOSPESO,'N'),GPTMPRIFXCONT.PRCAPPARTENENZA ) UNION -- 2.3.1 Contabilizzazione degli oneri e contributi da non ripartire ( SELECT GPTMPREGCONTCED.IDRRLAVCED , GPTMPREGCONTCED.IDRELABCED ,GPTMPREGCONTCED.CODTIPOELE, GPTMPREGCONTCED.CODANNO CODANNOESERCIZIO, GPSOCCED.CODANNOCOMP CODANNOMAT, GPTMPREGCONTCED.CODPARTE, GPTMPREGCONTCED.IDCAPITOLO, GPTMPREGCONTCED.CODANNOCONT,GPTMPREGCONTCED.IDACCIMP, NVL(DECODE(GPTMPREGCONTCED.CODTIPOELE, 'ONE', GPTMPREGCONTCED.IDRCDC,0),0) IDRCDC, GPTMPREGCONTCED.CODTIPOBEN, GPTMPREGCONTCED.CODBENEFICIARIO,NULL IDRRISCONT, -- Riccardo inizio ROUND( SUM( GPSOCCED.IMPTRATTENUTA * QTAMOLTIMPUTAZIONE) * GPTMPRIFXCONT.PRCAPPARTENENZA/100, 2) IMPMANDATO, 0 IMPTRATTENUTE, ROUND( SUM( GPSOCCED.IMPTRATTENUTA * QTAMOLTIMPUTAZIONE) * GPTMPRIFXCONT.PRCAPPARTENENZA/100, 2) IMPNETTO, 'S' INDALLEGATO, GPTMPREGCONTCED.CODELEMENTO, NVL(GPTMPREGCONTCED.INDSOSPESO,'N') INDSOSPESO, DECODE(GPTMPREGCONTCED.CODTIPOELE, 'ONE', 'N', 'S') INDPGIRO , GPTMPREGCONTCED.QTASEZIONE, GPTMPREGCONTCED.QTAPROGELE -- Riccardo fine FROM GPTMPRIFXCONT,GPTMPREGCONTCED, GPCONTRIB, GPSOCCED WHERE GPTMPREGCONTCED.OWNER = lCODSESSIONE AND GPTMPREGCONTCED.CODANNO = lCODANNOGRUPPOCONT AND GPTMPRIFXCONT.OWNER = lCODSESSIONE AND GPTMPRIFXCONT.IDRELAB = GPTMPREGCONTCED.IDRELABCED AND GPTMPRIFXCONT.IDRRLAV = GPTMPREGCONTCED.IDRRLAVCED AND GPTMPRIFXCONT.GIRO = nGiro AND-- se c'é lo prende, altrimenti no IDR = GPTMPRIFXCONT.Giro AND ( (GPTMPREGCONTCED.CODTIPOELE ='CON' AND GPSOCCED.CODTIPOSOCIALE ='D' ) OR (GPTMPREGCONTCED.CODTIPOELE ='ONE' AND GPSOCCED.CODTIPOSOCIALE ='E' ) ) AND GPTMPREGCONTCED.INDRIPARTIZIONE ='N' AND GPTMPREGCONTCED.CODTIPOLEGAME ='P' AND GPTMPREGCONTCED.IDRCONTRIB = GPCONTRIB.IDRCONTRIB AND GPTMPREGCONTCED.IDRRLAVCED = GPSOCCED.IDRRLAV AND GPTMPREGCONTCED.IDRELABCED = GPSOCCED.IDRELAB AND GPCONTRIB.IDRCONTRIB = GPSOCCED.IDRCONTRIB GROUP BY GPTMPREGCONTCED.IDRRLAVCED , GPTMPREGCONTCED.IDRELABCED ,GPTMPREGCONTCED.CODTIPOELE, GPTMPREGCONTCED.CODANNO, GPSOCCED.CODANNOCOMP, GPTMPREGCONTCED.CODPARTE, GPTMPREGCONTCED.IDCAPITOLO, GPTMPREGCONTCED.CODANNOCONT, GPTMPREGCONTCED.IDACCIMP, DECODE(GPTMPREGCONTCED.CODTIPOELE, 'ONE', GPTMPREGCONTCED.IDRCDC,0), GPTMPREGCONTCED.QTASEZIONE, GPTMPREGCONTCED.QTAPROGELE, CODTIPOBEN, CODBENEFICIARIO,GPTMPRIFXCONT.PRCAPPARTENENZA, GPTMPREGCONTCED.CODELEMENTO, NVL(GPTMPREGCONTCED.INDSOSPESO,'N') ) ) LOOP sINDPGIRO := rec.INDPGIRO; --RM2004 BEGIN SELECT DISTINCT IDCAPITOLO, CODANNOCONT, IDACCIMP, CODTIPOBEN, CODBENEFICIARIO, NVL(DECODE (rec.CODTIPOELE, 'ONE', GPTMPREGCONTCED.IDRCDC, 'IDV', DECODE( sINDPGIRO , 'S', 0, GPTMPREGCONTCED.IDRCDC ),0),0) , --???? INDSOSPESO INTO nIDCAPITOLO1, nCODANNOCONT1,nIDACCIMP1, sCODTIPOBEN1, sCODBENEFICIARIO1, nIDCDC1, sINDSOSPESO FROM GPTMPREGCONTCED WHERE GPTMPREGCONTCED.OWNER = lCODSESSIONE AND GPTMPREGCONTCED.CODANNO = rec.CODANNOESERCIZIO AND GPTMPREGCONTCED.CODPARTE = rec.CODPARTE AND GPTMPREGCONTCED.QTAPROGELE = rec.QTAPROGELE AND GPTMPREGCONTCED.QTASEZIONE = rec.QTASEZIONE AND CODANNOMAT = DECODE( rec.CODTIPOELE, 'IDV', rec.CODANNOMAT, '0') AND -- NELLE regole nn è specificato l'anno di maturazione se nn è una voce GPTMPREGCONTCED.DTAINIZIO = TO_DATE( sDTAMIN, 'DD/MM/YYYY') AND GPTMPREGCONTCED.CODTIPOELE = rec.CODTIPOELE AND GPTMPREGCONTCED.CODELEMENTO = rec.CODELEMENTO AND GPTMPREGCONTCED.IDRRLAVCED= rec.IDRRLAVCED AND GPTMPREGCONTCED.IDRELABCED = rec.IDRELABCED AND GPTMPREGCONTCED.CODTIPOLEGAME ='P' AND GPTMPREGCONTCED.IDR = 1; EXCEPTION WHEN OTHERS THEN NULL; END; -- TOLGO IL CALCOLATO DA DOVE è stato messo al primo Giro IF ( ( REC.IMPMANDATO>0 OR REC.IMPTRATTENUTE > 0 ) AND ( nIDCAPITOLO1 <> rec.IDCAPITOLO OR nCODANNOCONT1 <> rec.CODANNOCONT OR nIDACCIMP1 <> rec.IDACCIMP OR sCODTIPOBEN1 <> rec.CODTIPOBEN OR sCODBENEFICIARIO1 <> rec.CODBENEFICIARIO OR nIDCDC1 <> rec.IDRCDC OR rec.INDSOSPESO <> sINDSOSPESO ) ) THEN UPDATE GPTMPELERISCONT SET IMPMANDATO = NVL(IMPMANDATO,0) - REC.IMPMANDATO, IMPTRATTENUTE = NVL(IMPTRATTENUTE,0) - REC.IMPTRATTENUTE, IMPNETTO = NVL(IMPNETTO,0) - REC.IMPNETTO WHERE IDRRLAV = rec.IDRRLAVCED AND IDRELAB = rec.IDRELABCED AND CODTIPOELE = DECODE( rec.CODTIPOELE, 'IDV','VOX', rec.CODTIPOELE ) AND CODELEMENTO = rec.CODELEMENTO AND CODANNOESERCIZIO = rec.CODANNOESERCIZIO AND CODANNOMAT = rec.CODANNOMAT AND CODPARTE = rec.CODPARTE AND IDCAPITOLO = nIDCAPITOLO1 AND CODANNOCONT = nCODANNOCONT1 AND IDACCIMP = nIDACCIMP1 AND IDCDC = nIDCDC1 AND CODTIPOBEN = sCODTIPOBEN1 AND CODBENEFICIARIO = sCODBENEFICIARIO1 AND INDSOSPESO = sINDSOSPESO AND OWNER = lCODSESSIONE; -- ora devo trattare il calcolato e aggiungerlo eventualmente a uno già esistente o inserirlo ex-novo UPDATE GPTMPELERISCONT SET IMPMANDATO = NVL(IMPMANDATO,0) + REC.IMPMANDATO, IMPTRATTENUTE = NVL(IMPTRATTENUTE,0) + REC.IMPTRATTENUTE, IMPNETTO = NVL(IMPNETTO,0) + REC.IMPNETTO WHERE IDRRLAV = rec.IDRRLAVCED AND IDRELAB = rec.IDRELABCED AND CODTIPOELE = DECODE( rec.CODTIPOELE, 'IDV','VOX', rec.CODTIPOELE ) AND CODELEMENTO = rec.CODELEMENTO AND CODANNOESERCIZIO = rec.CODANNOESERCIZIO AND CODANNOMAT = rec.CODANNOMAT AND CODPARTE = rec.CODPARTE AND IDCAPITOLO = rec.IDCAPITOLO AND CODANNOCONT = rec.CODANNOCONT AND IDACCIMP = rec.IDACCIMP AND IDCDC = rec.IDRCDC AND CODTIPOBEN = rec.CODTIPOBEN AND CODBENEFICIARIO = rec.CODBENEFICIARIO AND INDSOSPESO = rec.INDSOSPESO AND OWNER = lCODSESSIONE; IF SQL%ROWCOUNT = 0 THEN INSERT INTO GPTMPELERISCONT( OWNER, IDRRLAV , IDRELAB , CODTIPOELE , CODELEMENTO, CODANNOESERCIZIO , CODANNOMAT , CODPARTE , IDCAPITOLO , IDCDC , CODANNOCONT , IDACCIMP , CODTIPOBEN , CODBENEFICIARIO , IMPMANDATO , IMPTRATTENUTE , IMPNETTO , INDALLEGATO , INDSOSPESO, INDPGIRO, TMSLOCK, codmesedet ) VALUES ( lCODSESSIONE, rec.IDRRLAVCED, rec.IDRELABCED, DECODE( rec.CODTIPOELE, 'IDV','VOX', rec.CODTIPOELE ), rec.CODELEMENTO, rec.CODANNOESERCIZIO, rec.CODANNOMAT, rec.CODPARTE, rec.IDCAPITOLO, NVL(rec.IDRCDC,0),rec.CODANNOCONT, rec.IDACCIMP, rec.CODTIPOBEN, rec.CODBENEFICIARIO, rec.IMPMANDATO,rec.IMPTRATTENUTE, rec.IMPNETTO, 'S', rec.INDSOSPESO, sINDPGIRO,lTIMESTAMP, 0 ); END IF; END IF; END LOOP; END IF; nGiro := nGiro + 1; END LOOP; -- Aggiorno la TMP delle Voci sottraendo le eventuali somme dei giri successivi al primo UPDATE GPTMPREGCONTCED A SET A.IMPELEMENTO = ( SELECT NVL(A.IMPELEMENTO,0)-NVL(MAX(SUM(B.IMPELEMENTO)),0) -- se non trova nulla RESTITUISCE almeno una riga, senza MAX non la resituiva FROM GPTMPREGCONTCED B WHERE A.OWNER = B.OWNER AND B.IDR > 1 AND A.IDRRLAVCED = B.IDRRLAVCED AND A.IDRELABCED = B.IDRELABCED AND A.CODVOCE = B.CODVOCE AND A.CODANNO = B.CODANNO AND A.CODANNOMAT = B.CODANNOMAT AND A.CODPARTE = B.CODPARTE AND A.QTASEZIONE = B.QTASEZIONE AND A.QTAPROGELE = B.QTAPROGELE AND A.DTAINIZIO = B.DTAINIZIO AND A.CODTIPOELE = B.CODTIPOELE AND A.CODTIPOELE = 'IDV' GROUP BY A.IMPELEMENTO ) WHERE A.IDR=1 AND A.OWNER = lCODSESSIONE AND EXISTS ( SELECT B.IDR FROM GPTMPREGCONTCED B WHERE A.OWNER = B.OWNER AND B.IDR > 1 AND A.IDRRLAVCED = B.IDRRLAVCED AND A.IDRELABCED = B.IDRELABCED AND A.CODVOCE = B.CODVOCE AND A.CODANNO = B.CODANNO AND A.CODANNOMAT = B.CODANNOMAT AND A.CODPARTE = B.CODPARTE AND A.QTASEZIONE = B.QTASEZIONE AND A.QTAPROGELE = B.QTAPROGELE AND A.DTAINIZIO = B.DTAINIZIO AND A.CODTIPOELE = B.CODTIPOELE AND A.CODTIPOELE = 'IDV'); -- 2.3.2 Contabilizzazione degli oneri da ripartire --INDRIPARTIZIONE: 'S', l'Onere va ripartito sui capitoli delle voci che lo hanno determinato, -- in proporzione a come queste lo hanno determinato. Ho le voci, queste sono assoggettate a -- dei contributi, vedo l'Importo dovuto per ogni voce singolarmente -- ( IMPVOX1, IMPVOX2, IMPVOX3, .. IMPVOXn) e l'importo totale del mandato delle Voci(IMPMANDATO), da qui la proporzione: --x1:IMPVOX1=(IMPTRATTENUTA * PRCMOLTIP):IMPMANDATO, -- x1= ( IMPTRATTENUTA*PRCMOLTIP/100*IMPVOX1)/IMPMANDATO sul CapitoloC1 --x2:IMPVOX2=(IMPTRATTENUTA * PRCMOLTIP):IMPMANDATO, -- x2= ( IMPTRATTENUTA*PRCMOLTIP/100*IMPVOX2)/IMPMANDATO sul CapitoloC2 -- ¿¿¿¿¿¿ --xn:IMPVOXn=(IMPTRATTENUTA * PRCMOLTIP):IMPMANDATO, -- xn= ( IMPTRATTENUTA*PRCMOLTIP/100*IMPVOXn)/IMPMANDATO sul CapitoloCn --- NON METTO ONERI DENTRO --RICCARDO : LETTURA FUORI CICLO OPEN curONERI; FETCH curONERI INTO recONERI; nOnereRipart :=0; nOnereTot := recONERI.rSUMIMPTRATT; BEGIN SELECT COUNT(*),IDCAPITOLORIPART, IDACCIMPRIPART, CODANNOCONTRIPART into nCOUNT, rIDCAPITOLORIPARTDET, rIDACCIMPRIPARTDET, rCODANNOCONTRIPARTDET FROM GPTMPREGCONTCEDDET WHERE OWNER = lCODSESSIONE AND CODANNO = recONERI.rCODANNO AND CODVOCE = recONERI.rCODVOCE AND CODANNOMAT = recONERI.rCODANNOMAT AND QTAPROGELE = recONERI.rQTAPROGELE AND QTASEZIONE = recONERI.rQTASEZIONE AND IDRRLAVCED = recONERI.rIDRRLAV AND IDRELABCED = recONERI.rIDRELAB AND DTAINIZIO = TO_DATE( sDTAMIN, 'DD/MM/YYYY') --AL MOMENTO NON GESTITO AND IDR = recONERI.rGIRO -- PRELEVO LE REGOLE PREVISTE PER FF/SS AND IDRCONTRIB = recONERI.rIDRCONTRIB GROUP BY IDCAPITOLORIPART, IDACCIMPRIPART, CODANNOCONTRIPART; IF nCOUNT = 1 THEN recONERI.rIDCAPITOLORIPART := rIDCAPITOLORIPARTDET; recONERI.rCODANNOCONTRIPART := rCODANNOCONTRIPARTDET; recONERI.rIDACCIMPRIPART := rIDACCIMPRIPARTDET; END IF; EXCEPTION WHEN NO_DATA_FOUND THEN nCOUNT :=0; END; LOOP EXIT WHEN curONERI%NOTFOUND; ---- Inizializzo variabili recONERITMP.rCODPARTE := recONERI.rCODPARTE; recONERITMP.rIDCAPITOLORIPART := recONERI.rIDCAPITOLORIPART; recONERITMP.rCODANNOCONTRIPART := recONERI.rCODANNOCONTRIPART; recONERITMP.rCODANNO := recONERI.rCODANNO; recONERITMP.rCODANNOCOMP := recONERI.rCODANNOCOMP; recONERITMP.rIDACCIMPRIPART := recONERI.rIDACCIMPRIPART; recONERITMP.rIDCDC := recONERI.rIDCDC; recONERITMP.rCODTIPOBENRIPART := recONERI.rCODTIPOBENRIPART; recONERITMP.rCODBENRIPART := recONERI.rCODBENRIPART; recONERITMP.rIDRRLAV := recONERI.rIDRRLAV ; recONERITMP.rIDRELAB := recONERI.rIDRELAB; recONERITMP.rIDRCONTRIB := recONERI.rIDRCONTRIB; recONERITMP.rINDSOSPESO := recONERI.rINDSOSPESO; recONERITMP.rINDSPOSTA := recONERI.rINDSPOSTA; recONERITMP.rIDCAPITOLODA := recONERI.rIDCAPITOLODA; recONERITMP.rCODANNOCONTDA := recONERI.rCODANNOCONTDA; recONERITMP.rIDACCIMPDA := recONERI.rIDACCIMPDA; recONERITMP.rCODELEMENTO := recONERI.rCODELEMENTO; -- ELABORAZIONE IF recONERI.rIMPMANDATO = 0 THEN nIMPTRATTRIPART := 0; ELSE nIMPTRATTRIPART := ROUND( ( recONERI.rSUMIMPTRATT * recONERI.rPRCMOLTIP * recONERI.rIMPVOX ) / ( recONERI.rIMPMANDATO * 100),2); END IF; UPDATE GPTMPELERISCONT SET IMPMANDATO = NVL(IMPMANDATO,0) + nIMPTRATTRIPART, IMPNETTO = NVL(IMPNETTO,0) + nIMPTRATTRIPART WHERE IDRRLAV = recONERI.rIDRRLAV AND IDRELAB = recONERI.rIDRELAB AND CODTIPOELE = 'ONE' AND CODELEMENTO = recONERI.rIDRCONTRIB AND CODANNOESERCIZIO = recONERI.rCODANNO AND CODANNOMAT = recONERI.rCODANNOCOMP AND CODPARTE = recONERI.rCODPARTE AND IDCAPITOLO = recONERI.rIDCAPITOLORIPART AND CODANNOCONT = recONERI.rCODANNOCONTRIPART AND IDACCIMP = recONERI.rIDACCIMPRIPART AND IDCDC = recONERI.rIDCDC AND CODTIPOBEN = recONERI.rCODTIPOBENRIPART AND CODBENEFICIARIO = recONERI.rCODBENRIPART AND INDSOSPESO = recONERI.rINDSOSPESO AND OWNER = lCODSESSIONE; IF SQL%ROWCOUNT = 0 THEN INSERT INTO GPTMPELERISCONT(OWNER, IDRRLAV , IDRELAB , CODTIPOELE , CODELEMENTO, CODANNOESERCIZIO , CODANNOMAT, CODPARTE , IDCAPITOLO , CODANNOCONT, IDACCIMP , IDCDC, CODTIPOBEN, CODBENEFICIARIO, IMPMANDATO, IMPTRATTENUTE, IMPNETTO, INDALLEGATO, INDSOSPESO, INDPGIRO, codmesedet ) VALUES ( lCODSESSIONE, recONERI.rIDRRLAV, recONERI.rIDRELAB, 'ONE', recONERI.rIDRCONTRIB, recONERI.rCODANNO, recONERI.rCODANNOCOMP, recONERI.rCODPARTE, recONERI.rIDCAPITOLORIPART, recONERI.rCODANNOCONTRIPART, recONERI.rIDACCIMPRIPART, NVL(recONERI.rIDCDC,0), recONERI.rCODTIPOBENRIPART, recONERI.rCODBENRIPART, NVL(nIMPTRATTRIPART,0), 0, nIMPTRATTRIPART, 'S', recONERI.rINDSOSPESO, 'N' , 0 ); END IF; --RM2004 : TOLGO DAL CAPITOLO/IMPEGNO GIà CONTABILIZZATO SE AVEVO DEROGHE SULLA VOCE IF (recONERI.rINDSPOSTA = 'S') THEN UPDATE GPTMPELERISCONT SET IMPMANDATO = NVL(IMPMANDATO,0) - nIMPTRATTRIPART, IMPNETTO = NVL(IMPNETTO,0) - nIMPTRATTRIPART WHERE IDRRLAV = recONERI.rIDRRLAV AND IDRELAB = recONERI.rIDRELAB AND CODTIPOELE = 'ONE' AND CODELEMENTO = recONERI.rIDRCONTRIB AND CODANNOESERCIZIO = recONERI.rCODANNO AND CODANNOMAT = recONERI.rCODANNOCOMP AND CODPARTE = recONERI.rCODPARTE AND IDCAPITOLO = recONERI.rIDCAPITOLODA AND CODANNOCONT = recONERI.rCODANNOCONTDA AND IDACCIMP = recONERI.rIDACCIMPDA AND IDCDC = recONERI.rIDCDC AND CODTIPOBEN = recONERI.rCODTIPOBENRIPART AND CODBENEFICIARIO = recONERI.rCODBENRIPART AND INDSOSPESO = recONERI.rINDSOSPESO AND OWNER = lCODSESSIONE; END IF; nOnereRipart := nOnereRipart + nIMPTRATTRIPART; FETCH curONERI INTO recONERI; -- Se cambia o not found update IF ( recONERITMP.rIDRRLAV <> recONERI.rIDRRLAV OR recONERITMP.rIDRELAB <> recONERI.rIDRELAB OR recONERITMP.rCODANNOCOMP <> recONERI.rCODANNOCOMP OR --Riccardo 2002-01-31 recONERITMP.rIDRCONTRIB <> recONERI.rIDRCONTRIB OR curONERI%NOTFOUND OR recONERITMP.rINDSOSPESO <> recONERI.rINDSOSPESO ) THEN -- DEVO AGGIUNGERE GLI SFRIDI ALL'ULTIMO CAPITOLO INSERITO PER QUEL RAPLAV/ELAB/CONTRIB -- al precedente devo aggiungere gli sfridi nResto := nOnereTot - nOnereRipart; UPDATE GPTMPELERISCONT SET IMPMANDATO = NVL(IMPMANDATO,0) + nResto, IMPNETTO = NVL(IMPNETTO,0) + nResto WHERE IDRRLAV = recONERITMP.rIDRRLAV AND IDRELAB = recONERITMP.rIDRELAB AND CODTIPOELE = 'ONE' AND CODELEMENTO = recONERITMP.rIDRCONTRIB AND CODANNOESERCIZIO = recONERITMP.rCODANNO AND CODANNOMAT = recONERITMP.rCODANNOCOMP AND CODPARTE = recONERITMP.rCODPARTE AND IDCAPITOLO = recONERITMP.rIDCAPITOLORIPART AND CODANNOCONT = recONERITMP.rCODANNOCONTRIPART AND IDACCIMP = recONERITMP.rIDACCIMPRIPART AND IDCDC = recONERITMP.rIDCDC AND CODTIPOBEN = recONERITMP.rCODTIPOBENRIPART AND CODBENEFICIARIO = recONERITMP.rCODBENRIPART AND INDSOSPESO = recONERITMP.rINDSOSPESO and owner = lCODSESSIONE; IF (recONERITMP.rINDSPOSTA = 'S') THEN UPDATE GPTMPELERISCONT SET IMPMANDATO = NVL(IMPMANDATO,0) - nResto, IMPNETTO = NVL(IMPNETTO,0) - nResto WHERE IDRRLAV = recONERITMP.rIDRRLAV AND IDRELAB = recONERITMP.rIDRELAB AND CODTIPOELE = 'ONE' AND CODELEMENTO = recONERITMP.rIDRCONTRIB AND CODANNOESERCIZIO = recONERITMP.rCODANNO AND CODANNOMAT = recONERITMP.rCODANNOCOMP AND CODPARTE = recONERITMP.rCODPARTE AND --anto inizio IDCAPITOLO = recONERITMP.rIDCAPITOLORIPART AND CODANNOCONT = recONERITMP.rCODANNOCONTRIPART AND IDACCIMP = recONERITMP.rIDACCIMPRIPART AND --anto fine IDCDC = recONERITMP.rIDCDC AND CODTIPOBEN = recONERITMP.rCODTIPOBENRIPART AND CODBENEFICIARIO = recONERITMP.rCODBENRIPART AND INDSOSPESO = recONERITMP.rINDSOSPESO and owner = lCODSESSIONE; END IF; -- Aggiorno variabili nOnereTot := recONERI.rSUMIMPTRATT; nOnereRipart:=0; END IF; BEGIN SELECT COUNT(*),IDCAPITOLORIPART, IDACCIMPRIPART, CODANNOCONTRIPART into nCOUNT, rIDCAPITOLORIPARTDET, rIDACCIMPRIPARTDET, rCODANNOCONTRIPARTDET FROM GPTMPREGCONTCEDDET WHERE OWNER = lCODSESSIONE AND CODANNO = recONERI.rCODANNO AND IDRRLAVCED = recONERI.rIDRRLAV AND IDRELABCED = recONERI.rIDRELAB AND DTAINIZIO = TO_DATE( sDTAMIN, 'DD/MM/YYYY') --AL MOMENTO NON GESTITO AND IDR = recONERI.rGIRO -- PRELEVO LE REGOLE PREVISTE PER FF/SS AND IDRCONTRIB = recONERI.rIDRCONTRIB AND CODVOCE = recONERI.rCODVOCE AND CODANNOMAT = recONERI.rCODANNOMAT AND QTASEZIONE = recONERI.rQTASEZIONE AND QTAPROGELE = recONERI.rQTAPROGELE GROUP BY IDCAPITOLORIPART, IDACCIMPRIPART, CODANNOCONTRIPART; IF nCOUNT = 1 THEN recONERI.rIDCAPITOLORIPART := rIDCAPITOLORIPARTDET; recONERI.rCODANNOCONTRIPART := rCODANNOCONTRIPARTDET; recONERI.rIDACCIMPRIPART := rIDACCIMPRIPARTDET; END IF; EXCEPTION WHEN NO_DATA_FOUND THEN nCOUNT :=0; END; END LOOP; CLOSE curONERI; COMMIT; /******************************************************************** Gestione dell'Alternativo Occorre sapere quale tipo di contabilizzazione è stata scelta per l'Ente specificato, dato che la verifica della Disponibilità sarà indirizzata a tabelle diverse a seconda di quale contabilizzazione occorre fare. Dalla GPINFO, con TIPOINFO='TPCOLCONT' e CODINFO=lCODENTEAZ estraiamo il CODULT: -- '0': Assenza di Contabilizzazione -- '1': Contabilizzazione per @-Serfin -- '2': Contabilizzazione per StudioK ********************************************************************/ SELECT NVL(MAX(CODULT),1) -- per default metto Contabilizzazione con Serfin INTO sTPCOLCONT FROM GPINFO WHERE TIPOINFO = 'TPCOLCONT' AND CODINFO = UPPER(lCODENTEAZ); IF sTPCOLCONT > 0 THEN IF sTPCOLCONT = 1 THEN SELECT DESSCHEMASERFIN INTO sDESSCHEMASERFIN FROM GPENTEAZ WHERE CODENTEAZ = UPPER(lCODENTEAZ); IF sDESSCHEMASERFIN IS NOT NULL THEN -- Il campo DESSCHEMASERFIN ora può essere nella forma SCHEMA@DBLINK IF INSTR(sDESSCHEMASERFIN, '@') > 0 THEN sNomeSchema := SUBSTR(sDESSCHEMASERFIN, 1, INSTR(sDESSCHEMASERFIN, '@') - 1); sNomeDBLink := SUBSTR(sDESSCHEMASERFIN, INSTR(sDESSCHEMASERFIN, '@') + 1, LENGTH(sDESSCHEMASERFIN)); ELSE sNomeSchema := sDESSCHEMASERFIN; END IF; sQueryOut := 'SELECT IDCAPITOLO, IDACCIMP, IMPDISPONIBILITA FROM (' || 'SELECT MANPAGHE.IDCAPITOLO, 0 IDACCIMP,A.DISPONIBILITA IMPDISPONIBILITA, IMPMANDATO ' || 'FROM '||sNomeSchema||'.VWFRMDISPEXPERS'; IF sNomeDBLink IS NOT NULL THEN sQueryOut := sQueryOut || '@' || sNomeDBLink; END IF; sQueryOut := sQueryOut || ' A,' || ' ( SELECT IDCAPITOLO, SUM(IMPMANDATO) IMPMANDATO ' || ' FROM GPTMPELERISCONT ' || ' WHERE IDRELAB IN ( SELECT IDRELAB FROM GPTMPELABXREGCONTAB WHERE OWNER = '''|| lCODSESSIONE||''') AND -- LISTA ELABORAZIONI ' || ' GPTMPELERISCONT.CODPARTE = ''S'' AND -- controllo solo la parte spesa ' || ' GPTMPELERISCONT.IDACCIMP = ''0'' AND -- non ha impegni specificati ' || ' CODANNOESERCIZIO = ''' || lCODANNOGRUPPOCONT ||''' ' || ' GROUP BY IDCAPITOLO ) MANPAGHE ' || ' WHERE A.CODTIPOELE = ''CAPITOLO'' ' || ' AND MANPAGHE.IDCAPITOLO = A.IDCAPITOLO(+) ' || ' GROUP BY MANPAGHE.IDCAPITOLO,DISPONIBILITA, IMPMANDATO ' || ' UNION '|| --se non ha sforato un capitolo, magari è stato sforato l'impegno --> devo gestirne l'alternativo 'SELECT MANPAGHE.IDCAPITOLO, MANPAGHE.IDACCIMP IDACCIMP, NVL(A.DISPONIBILITA,0) IMPDISPONIBILITA, IMPMANDATO ' || 'FROM '||sNomeSchema||'.VWFRMDISPEXPERS'; IF sNomeDBLink IS NOT NULL THEN sQueryOut := sQueryOut || '@' || sNomeDBLink; END IF; sQueryOut := sQueryOut || ' A, ' || ' ( SELECT IDCAPITOLO, IDACCIMP, SUM(IMPMANDATO) IMPMANDATO ' || ' FROM GPTMPELERISCONT ' || ' WHERE IDRELAB IN ( SELECT IDRELAB FROM GPTMPELABXREGCONTAB WHERE OWNER ='''|| lCODSESSIONE||''') AND -- LISTA ELABORAZIONI ' || ' GPTMPELERISCONT.CODPARTE = ''S'' AND -- controllo solo la parte spesa ' || ' CODANNOESERCIZIO = ''' || lCODANNOGRUPPOCONT ||''' ' || ' GROUP BY IDCAPITOLO,IDACCIMP ) MANPAGHE ' || ' WHERE A.CODTIPOELE = ''IMPACC'' AND ' || ' A.APP = ''S'' AND ' || ' MANPAGHE.IDCAPITOLO = A.IDCAPITOLO(+) AND ' || ' MANPAGHE.IDACCIMP = A.IDACCIMP(+) ) ' || ' WHERE IMPDISPONIBILITA < IMPMANDATO ' || ' GROUP BY IDCAPITOLO, IDACCIMP,IMPDISPONIBILITA'; END IF; ELSE --IF sTPCOLCONT = 2 THEN sQueryOut := 'SELECT IDCAPITOLO, IDACCIMP, IMPDISPONIBILITA FROM ( ' || ' SELECT MANPAGHE.IDCAPITOLO IDCAPITOLO, 0 IDACCIMP, NVL(A.IMPSTANZATT-SUM(NVL(B.IMPSTANZATT,0)),0) IMPDISPONIBILITA, IMPMANDATO ' || ' FROM GPCAPSISTEXT A, GPACCIMPSE B, ' || ' ( SELECT IDCAPITOLO, SUM(IMPMANDATO) IMPMANDATO ' || ' FROM GPTMPELERISCONT ' || ' WHERE IDRELAB IN ( SELECT IDRELAB FROM GPTMPELABXREGCONTAB WHERE OWNER = '''|| lCODSESSIONE||''') AND -- LISTA ELABORAZIONI ' || ' GPTMPELERISCONT.CODPARTE = ''S'' AND -- controllo solo la parte spesa ' || ' GPTMPELERISCONT.IDACCIMP = 0 AND -- non ha impegni specificati ' || ' CODANNOESERCIZIO = ''' || lCODANNOGRUPPOCONT ||''' ' || ' GROUP BY IDCAPITOLO ) MANPAGHE ' || ' WHERE A.IDRCAPSISTEXT = B.IDRCAPSISTEXT(+) ' || ' AND MANPAGHE.IDCAPITOLO = A.IDRCAPSISTEXT(+) ' || ' GROUP BY MANPAGHE.IDCAPITOLO, A.IMPSTANZATT, IMPMANDATO ' || ' UNION ' || ' SELECT MANPAGHE.IDCAPITOLO IDCAPITOLO, A.IDRACCIMPSE IDACCIMP, NVL(A.IMPSTANZATT,0) IMPDISPONIBILITA, IMPMANDATO ' || ' FROM GPACCIMPSE A, GPCAPSISTEXT B, ' || ' ( SELECT IDCAPITOLO, IDACCIMP, SUM(IMPMANDATO) IMPMANDATO ' || ' FROM GPTMPELERISCONT ' || ' WHERE IDRELAB IN ( SELECT IDRELAB FROM GPTMPELABXREGCONTAB WHERE OWNER ='''|| lCODSESSIONE||''') AND -- LISTA ELABORAZIONI ' || ' GPTMPELERISCONT.CODPARTE = ''S'' AND -- controllo solo la parte spesa ' || ' CODANNOESERCIZIO = ''' || lCODANNOGRUPPOCONT ||''' ' || ' GROUP BY IDCAPITOLO,IDACCIMP ) MANPAGHE ' || ' WHERE A.IDRCAPSISTEXT = B.IDRCAPSISTEXT AND ' || ' MANPAGHE.IDCAPITOLO = A.IDRCAPSISTEXT(+) AND ' || ' MANPAGHE.IDACCIMP = A.IDRACCIMPSE(+)) ' || ' WHERE IMPDISPONIBILITA < IMPMANDATO ' || ' GROUP BY IDCAPITOLO, IDACCIMP,IMPDISPONIBILITA'; END IF; IF sQueryOut IS NULL THEN sERRDIAG := 'Non è possibile gestire gli Alternativi: problemi nelle Impostazioni della Contabilizzazione'; RETURN pkUtility.fnError( 'fnDoContab', -499, sERRDIAG ); END IF; SOURCE_CURSOR := DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(SOURCE_CURSOR , sQueryOut ,dbms_sql.v7 ); -- definisco variabili in cui inserire i valori ottenuti dalla select DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR , 1, nIDCAPITOLOOut ); DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR , 2, nIDACCIMPOut ); DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR , 3, nIMPDISPONIBILITAOut ); IGNORE:=DBMS_SQL.EXECUTE(SOURCE_CURSOR); -- scorro cursore LOOP IF DBMS_SQL.FETCH_ROWS( SOURCE_CURSOR ) > 0 THEN -- Istanzio le variabili ai valori trovati con il cursore SOURCE_CURSOR DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR , 1, nIDCAPITOLOOut ); DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR , 2, nIDACCIMPOut ); DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR , 3, nIMPDISPONIBILITAOut ); bEsci := FALSE; FOR RECALT IN ( -- estraggo alternativo di Capitolo/Impegno SELECT IDCAPITOLO, CODANNOCONT, IDACCIMP FROM GPREGCONTAB WHERE ( CODENTEAZ, CODANNO, CODPARTE, CODSEGNOVOCE, CODTIPODIP, CODDIPENDENTE, CODTIPOELE, CODELEMENTO ) IN ( SELECT CODENTEAZ, CODANNO, CODPARTE, CODSEGNOVOCE, CODTIPODIP, CODDIPENDENTE, CODTIPOELE, CODELEMENTO FROM GPREGCONTAB WHERE CODENTEAZ = lCODENTEAZ AND CODANNO = lCODANNOGRUPPOCONT AND CODPARTE = 'S' AND IDCAPITOLO = nIDCAPITOLOOut AND ( ( CODANNOCONT = 0 AND sTPCOLCONT = 1 ) OR -- se c'è SERFIN presuppongo sia sempre 0 ( sTPCOLCONT >= 2 ) ) AND -- StudioK o altre IDACCIMP = nIDACCIMPOut ) AND -- 0 oppure IDACCIMPOUT CODTIPOLEGAME = 'A' GROUP BY IDCAPITOLO, CODANNOCONT, IDACCIMP ) LOOP IF bESCI THEN -- per prendere solo il primo alternativo EXIT; END IF; bESCI := NOT( bESCI ); nIDCAPITOLOAlt := RECALT.IDCAPITOLO; nCODANNOCONTAlt := RECALT.CODANNOCONT; nIDACCIMPAlt := RECALT.IDACCIMP; -- estraggo record da scorrere nella GPTMPELERISCONT FOR RECDET IN( SELECT IDRRLAV, IDRELAB, CODTIPOELE, CODELEMENTO, CODANNOESERCIZIO, CODANNOMAT, CODPARTE, IDCAPITOLO, IDCDC, CODANNOCONT, IDACCIMP, CODTIPOBEN, CODBENEFICIARIO, IMPMANDATO , IMPTRATTENUTE, IMPNETTO, INDALLEGATO, INDSOSPESO, INDPGIRO FROM GPTMPELERISCONT WHERE GPTMPELERISCONT.CODANNOESERCIZIO = lCODANNOGRUPPOCONT AND OWNER = lCODSESSIONE AND IDRELAB IN (SELECT IDRELAB FROM GPTMPELABXREGCONTAB WHERE OWNER = lCODSESSIONE ) AND CODPARTE = 'S' AND IDCAPITOLO = nIDCAPITOLOOut AND ( ( CODANNOCONT = 0 AND sTPCOLCONT = 1 ) OR -- se c'è SERFIN presuppongo sia sempre 0 ( ( sTPCOLCONT >= 2 ) ) ) AND -- StudioK o Altre IDACCIMP = nIDACCIMPOut ORDER BY IDCAPITOLO, CODANNOCONT, IDACCIMP, CODTIPOBEN, CODBENEFICIARIO, CODTIPOELE, IMPMANDATO DESC,IDRELAB,IDRRLAV, INDSOSPESO ) LOOP IF ( RECDET.IMPMANDATO < nIMPDISPONIBILITAOut AND RECDET.IMPMANDATO > 0 ) THEN nIMPDISPONIBILITAOut := nIMPDISPONIBILITAOut - RECDET.IMPMANDATO; -- non devo usare l'Alternativo ELSE -- per quello che basta uso il Capitolo, per il resto l'Alternativo UPDATE GPTMPELERISCONT SET IMPMANDATO = nIMPDISPONIBILITAOut, IMPNETTO = LEAST( IMPNETTO, nIMPDISPONIBILITAOut ) -- se IMPNETTO = 0 rimane 0, altrimenti metto nIMPDISPONIBILITAOut WHERE IDRRLAV = RECDET.IDRRLAV AND IDRELAB = RECDET.IDRELAB AND CODTIPOELE = RECDET.CODTIPOELE AND CODELEMENTO = RECDET.CODELEMENTO AND CODANNOESERCIZIO = RECDET.CODANNOESERCIZIO AND CODANNOMAT = RECDET.CODANNOMAT AND CODPARTE = RECDET.CODPARTE AND IDCAPITOLO = RECDET.IDCAPITOLO AND CODANNOCONT = RECDET.CODANNOCONT AND IDACCIMP = RECDET.IDACCIMP AND CODTIPOBEN = RECDET.CODTIPOBEN AND CODBENEFICIARIO = RECDET.CODBENEFICIARIO AND IDCDC = RECDET.IDCDC AND INDSOSPESO = RECDET.INDSOSPESO AND OWNER = lCODSESSIONE; -- Devo Aggiornare/Inserire il resto sull'Alternativo IF RECDET.IMPNETTO > 0 THEN -- se IMPNETTO = 0 rimane 0 RECDET.IMPNETTO := RECDET.IMPNETTO - nIMPDISPONIBILITAOut; END IF; UPDATE GPTMPELERISCONT SET IMPMANDATO = IMPMANDATO + RECDET.IMPMANDATO - nIMPDISPONIBILITAOut, IMPNETTO = RECDET.IMPNETTO WHERE IDRRLAV = RECDET.IDRRLAV AND IDRELAB = RECDET.IDRELAB AND CODTIPOELE = RECDET.CODTIPOELE AND CODELEMENTO = RECDET.CODELEMENTO AND CODANNOESERCIZIO = RECDET.CODANNOESERCIZIO AND CODANNOMAT = RECDET.CODANNOMAT AND CODPARTE = RECDET.CODPARTE AND IDCAPITOLO = nIDCAPITOLOAlt AND CODANNOCONT = nCODANNOCONTAlt AND IDACCIMP = nIDACCIMPAlt AND IDCDC = RECDET.IDCDC AND CODTIPOBEN = RECDET.CODTIPOBEN AND CODBENEFICIARIO = RECDET.CODBENEFICIARIO AND INDSOSPESO = RECDET.INDSOSPESO AND -- OCCORRE OWNER = lCODSESSIONE; IF SQL%ROWCOUNT = 0 THEN INSERT INTO GPTMPELERISCONT( OWNER, IDRRLAV , IDRELAB , CODTIPOELE ,CODELEMENTO, CODANNOESERCIZIO , CODANNOMAT, CODPARTE , IDCAPITOLO , CODANNOCONT, IDACCIMP , IDCDC, CODTIPOBEN, CODBENEFICIARIO, IMPMANDATO, IMPTRATTENUTE , IMPNETTO, INDALLEGATO, INDSOSPESO, INDPGIRO, codmesedet ) VALUES (lCODSESSIONE, RECDET.IDRRLAV, RECDET.IDRELAB, RECDET.CODTIPOELE, RECDET.CODELEMENTO, RECDET.CODANNOESERCIZIO, RECDET.CODANNOMAT, RECDET.CODPARTE, nIDCAPITOLOAlt, nCODANNOCONTAlt, nIDACCIMPAlt, NVL(RECDET.IDCDC,0), RECDET.CODTIPOBEN, RECDET.CODBENEFICIARIO, RECDET.IMPMANDATO - nIMPDISPONIBILITAOut, RECDET.IMPTRATTENUTE, RECDET.IMPNETTO, 'S', RECDET.INDSOSPESO, RECDET.INDPGIRO, 0 ); END IF; nIMPDISPONIBILITAOut := 0; END IF; END LOOP; END LOOP; ELSE EXIT; END IF; END LOOP; DBMS_SQL.close_CURSOR(SOURCE_CURSOR); END IF; -- SOLO NEL CASO DI CONTABILIZZAZIONE CON @-Serfin/StudioK --- Aggiornamento Codice siope IF lINDSIOPE ='S' THEN -- TEMPO DETERMINATO, LSU, COCOCO UPDATE GPTMPELERISCONT SET CODSIOPE = (SELECT DECODE(codtipoinps, 'S', '1104','D', '1104', '1105' ) from gpltprlav, gpraplav where GPTMPELERISCONT.OWNER = lCODSESSIONE and GPLTPRLAV.codtipoinps IN ('S', 'D','C') AND gpraplav.codtiporl = gpltprlav.codtiporl and gpraplav.idrrlav = gptmpeleriscont.idrrlav and GPTMPELERISCONT.codtipoele = 'VOX' and gptmpeleriscont.indpgiro = 'N') WHERE EXISTS (SELECT DECODE(codtipoinps, 'S', '1104','D', '1104', '1105' ) from gpltprlav, gpraplav where GPTMPELERISCONT.OWNER = lCODSESSIONE and GPLTPRLAV.codtipoinps IN ('S', 'D','C') AND gpraplav.codtiporl = gpltprlav.codtiporl and gpraplav.idrrlav = gptmpeleriscont.idrrlav and GPTMPELERISCONT.codtipoele = 'VOX' and gptmpeleriscont.indpgiro = 'N'); END IF; ----+++ VA AGGIUNTA LA CODIFICA DEGLI ALTRI CODICI SIOPE -- ORA , A PARTIRE DA GPTMPELERISCONT, POPOLIAMO SIA GPDETRISCONT CHE GPELERISCONT INSERT INTO GPDETRISCONT( IDRRLAV , IDRELAB , CODTIPOELE , CODANNOESERCIZIO , CODANNOMAT, CODPARTE , IDCAPITOLO , CODANNOCONT, IDACCIMP , IDCDC, CODTIPOBEN, CODBENEFICIARIO, IDRRISCONT , IMPMANDATO, IMPTRATTENUTE, IMPNETTO, INDALLEGATO, INDSOSPESO, CODSIOPE ) SELECT IDRRLAV , IDRELAB , CODTIPOELE, CODANNOESERCIZIO , CODANNOMAT, CODPARTE , IDCAPITOLO , CODANNOCONT, IDACCIMP , IDCDC, CODTIPOBEN, CODBENEFICIARIO, NULL , SUM(IMPMANDATO), SUM(IMPTRATTENUTE), SUM(IMPNETTO), INDALLEGATO, INDSOSPESO, CODSIOPE FROM GPTMPELERISCONT WHERE OWNER = lCODSESSIONE GROUP BY IDRRLAV , IDRELAB , CODTIPOELE, CODANNOESERCIZIO , CODANNOMAT, CODPARTE , IDCAPITOLO , CODANNOCONT, IDACCIMP , IDCDC, CODTIPOBEN, CODBENEFICIARIO, INDALLEGATO, INDSOSPESO, CODSIOPE; COMMIT; INSERT INTO GPELERISCONT( IDRELAB , CODTIPOELE ,CODELEMENTO, CODANNOESERCIZIO , CODANNOMAT, CODPARTE , IDCAPITOLO , CODANNOCONT, IDACCIMP , IDCDC, CODTIPOBEN, CODBENEFICIARIO, IDRRISCONT , IMPMANDATO, INDALLEGATO, INDSOSPESO, CODSIOPE ) SELECT IDRELAB , CODTIPOELE, CODELEMENTO, CODANNOESERCIZIO , CODANNOMAT, CODPARTE , IDCAPITOLO , CODANNOCONT, IDACCIMP , IDCDC, CODTIPOBEN, CODBENEFICIARIO, NULL , SUM(IMPMANDATO), INDALLEGATO, INDSOSPESO, CODSIOPE FROM GPTMPELERISCONT WHERE OWNER = lCODSESSIONE GROUP BY IDRELAB , CODTIPOELE, CODELEMENTO, CODANNOESERCIZIO , CODANNOMAT, CODPARTE , IDCAPITOLO , CODANNOCONT, IDACCIMP , IDCDC, CODTIPOBEN, CODBENEFICIARIO, INDALLEGATO, INDSOSPESO,CODSIOPE; --------------------------------------------------- nRet := pkGPCONTAB.fnGPRISCONTFill ( lCODENTEAZ, lCODANNOGRUPPOCONT, lQTAGRUPPOCONT, lDTASCADENZA, lCODSESSIONE, 'N', ERRDIAG ); IF nRet < 0 THEN sERRDIAG := ' E'' stata riempita soltanto la tabella dei Dettagli '; RETURN pkUtility.fnError( 'fnDoContab', -499, sERRDIAG ); END IF; COMMIT; -- Ripartizione Netto sui Mandati -- SOLO SU GPDETRISCONT -- Il Netto del Cedolino va ripartito sul Mandato in base al totale Competenze ( per ogni rapporto di lavoro), -- IMPNETTOCEDOLINO :IMPCOMPETENZECEDOLINO=x1:IMPMANDATO, -- x1= ( IMPNETTOCEDOLINO * IMPMANDATO ) / IMPCOMPETENZECEDOLINO -- .................... recGPDETRISCONTPREC.rIDRRLAV :=0; recGPDETRISCONTPREC.rIDRELAB :=0; recGPDETRISCONTPREC.rCODPARTE :='Z'; recGPDETRISCONTPREC.rIDCAPITOLO :=0; recGPDETRISCONTPREC.rCODANNOCONT :=0; recGPDETRISCONTPREC.rIDACCIMP :=0; -- Per ogni record che scorro, dato l'ordine che ho scelto nel cursore, posso avere la -- seguente situazione: -- RLAV, ELAB, CODPARTE, MANDATO -- 29 15 E M1 -- 29 15 S M1 -- 29 15 E M2 -- 29 16 S M1 -- 29 16 S M1 -- 30 15 S M1 --............................ --- OPEN curGPDETRISCONT; -- FETCH curGPDETRISCONT INTO recGPDETRISCONT; nNettoRipart :=0; nNettoTot := recGPDETRISCONT.rIMPNETTO; --Totale netto del cedolino LOOP EXIT WHEN curGPDETRISCONT%NOTFOUND; ---- Inizializzo variabili recGPDETRISCONTPREC.rIDRRLAV := recGPDETRISCONT.rIDRRLAV; recGPDETRISCONTPREC.rIDRELAB := recGPDETRISCONT.rIDRELAB; recGPDETRISCONTPREC.rCODANNOESERCIZIO:= recGPDETRISCONT.rCODANNOESERCIZIO; recGPDETRISCONTPREC.rCODANNOMAT := recGPDETRISCONT.rCODANNOMAT; recGPDETRISCONTPREC.rCODPARTE := recGPDETRISCONT.rCODPARTE; recGPDETRISCONTPREC.rIDCAPITOLO := recGPDETRISCONT.rIDCAPITOLO; recGPDETRISCONTPREC.rCODANNOCONT := recGPDETRISCONT.rCODANNOCONT; recGPDETRISCONTPREC.rIDACCIMP := recGPDETRISCONT.rIDACCIMP; recGPDETRISCONTPREC.rCODSIOPE := recGPDETRISCONT.rCODSIOPE; -- Elaborazione IF recGPDETRISCONT.rIMPCOMPETENZE = 0 THEN nIMPNETTORIPART := 0; ELSE nIMPNETTORIPART := ROUND( ( recGPDETRISCONT.rIMPNETTO * recGPDETRISCONT.rIMPMANDATO ) / recGPDETRISCONT.rIMPCOMPETENZE, 2 ); END IF; nNettoRipart := nNettoRipart + nIMPNETTORIPART; UPDATE GPDETRISCONT SET IMPNETTO = nIMPNETTORIPART, IMPTRATTENUTE = (IMPMANDATO - nIMPNETTORIPART) WHERE IDRRLAV = recGPDETRISCONTPREC.rIDRRLAV AND IDRELAB = recGPDETRISCONTPREC.rIDRELAB AND CODTIPOELE = 'VOX' AND CODANNOESERCIZIO = recGPDETRISCONTPREC.rCODANNOESERCIZIO AND CODANNOMAT = recGPDETRISCONTPREC.rCODANNOMAT AND CODPARTE = recGPDETRISCONTPREC.rCODPARTE AND IDCAPITOLO = recGPDETRISCONTPREC.rIDCAPITOLO AND CODANNOCONT = recGPDETRISCONTPREC.rCODANNOCONT AND IDACCIMP = recGPDETRISCONTPREC.rIDACCIMP AND CODSIOPE = recGPDETRISCONTPREC.rCODSIOPE; FETCH curGPDETRISCONT INTO recGPDETRISCONT; IF ((recGPDETRISCONTPREC.rIDRRLAV <> recGPDETRISCONT.rIDRRLAV) or (recGPDETRISCONTPREC.rIDRELAB <> recGPDETRISCONT.rIDRELAB) or curGPDETRISCONT%NOTFOUND) THEN nResto := nNettoTot - nNettoRipart; UPDATE GPDETRISCONT SET IMPNETTO = IMPNETTO + nResto, IMPTRATTENUTE = IMPTRATTENUTE - nResto WHERE IDRRLAV = recGPDETRISCONTPREC.rIDRRLAV AND IDRELAB = recGPDETRISCONTPREC.rIDRELAB AND CODTIPOELE = 'VOX' AND CODANNOESERCIZIO = recGPDETRISCONTPREC.rCODANNOESERCIZIO AND CODANNOMAT = recGPDETRISCONTPREC.rCODANNOMAT AND CODPARTE = recGPDETRISCONTPREC.rCODPARTE AND IDCAPITOLO = recGPDETRISCONTPREC.rIDCAPITOLO AND CODANNOCONT = recGPDETRISCONTPREC.rCODANNOCONT AND IDACCIMP = recGPDETRISCONTPREC.rIDACCIMP AND CODSIOPE = recGPDETRISCONTPREC.rCODSIOPE; -- Aggiorno variabili nNettoTot := recGPDETRISCONT.rIMPNETTO; nNettoRipart:=0; END IF; END LOOP; CLOSE curGPDETRISCONT; COMMIT; -- CANCELLO LE TEMPORANEE ... SELECT COUNT(*) INTO nCount FROM GPTMPELERISCONT WHERE OWNER <> lCODSESSIONE; IF nCount > 0 THEN DELETE FROM GPTMPELERISCONT WHERE OWNER = lCODSESSIONE OR TO_CHAR ( sysdate, 'YYYYMMDDHH24MI' ) - SUBSTR ( TMSLOCK, 1, 12 ) > 2400; COMMIT; ELSE SYS.DBMS_UTILITY.exec_ddl_statement( 'TRUNCATE TABLE GPTMPELERISCONT'); END IF; SELECT COUNT(*) INTO nCount FROM GPTMPREGCONTCED WHERE OWNER <> lCODSESSIONE; IF nCount > 0 THEN DELETE FROM GPTMPREGCONTCED WHERE OWNER = lCODSESSIONE OR TO_CHAR ( sysdate, 'YYYYMMDDHH24MI' ) - SUBSTR ( TMSLOCK, 1, 12 ) > 2400; COMMIT; ELSE SYS.DBMS_UTILITY.exec_ddl_statement( 'TRUNCATE TABLE GPTMPREGCONTCED'); END IF; RETURN 1; EXCEPTION WHEN OTHERS THEN IF curONERI%ISOPEN THEN CLOSE curONERI; END IF; IF curGPDETRISCONT%ISOPEN THEN CLOSE curGPDETRISCONT; END IF; IF DBMS_SQL.IS_OPEN(SOURCE_CURSOR) THEN DBMS_SQL.CLOSE_CURSOR(SOURCE_CURSOR); END IF; ROLLBACK; RETURN pkUtility.fnError( 'fnDoContab', SQLCODE, ERRDIAG ); END fnDoContab; --- - Funzione interna per il test dell'univocità di PK e AK FUNCTION fnGPRISCONTTestKey( lIDRELAB IN pkType.tyStringa%TYPE,--AK1.1 lCODANNOGRUPPOCONT IN pkType.tyStringa%TYPE,--AK1.2 lQTAGRUPPOCONT IN pkType.tyStringa%TYPE,--AK1.3 lCODANNOESERCIZIO IN pkType.tyStringa%TYPE,--AK1.4 lCODPARTE IN pkType.tyStringa%TYPE,--AK1.5 lIDCAPITOLO IN pkType.tyStringa%TYPE, --XAK1GPRISCONT lIDCDC IN pkType.tyStringa%TYPE, --XAK1GPRISCONT lCODANNOCONT IN pkType.tyStringa%TYPE, --XAK1GPRISCONT lIDACCIMP IN pkType.tyStringa%TYPE, --XAK1GPRISCONT lCODTIPOBEN IN pkType.tyStringa%TYPE, --XAK1GPRISCONT lCODBENEFICIARIO IN pkType.tyStringa%TYPE, --XAK1GPRISCONT lCODSIOPE IN pkType.tyStringa%TYPE, --XAK1GPRISCONT lINDOPERAZ IN pkType.tyStringa%type, -- se TRATTASI DI ins( I )/upd( U ) ERRDIAG OUT pkType.tyStringa%type ) RETURN NUMERIC IS -- messaggio d'errore nRec NUMBER(9); -- numero record trovati in GPLEVRLAV con quello stesso Codice BEGIN IF lINDOPERAZ = 'I' THEN SELECT COUNT(*) INTO nRec FROM GPRISCONT WHERE IDRELAB = lIDRELAB AND CODANNOGRUPPOCONT = lCODANNOGRUPPOCONT AND QTAGRUPPOCONT = lQTAGRUPPOCONT AND CODANNOESERCIZIO = lCODANNOESERCIZIO AND CODPARTE = lCODPARTE AND IDCAPITOLO = lIDCAPITOLO AND NVL(IDCDC,0) = NVL(lIDCDC,0) AND CODANNOCONT = lCODANNOCONT AND IDACCIMP = lIDACCIMP AND CODTIPOBEN = lCODTIPOBEN AND CODBENEFICIARIO = lCODBENEFICIARIO AND CODSIOPE = lCODSIOPE; IF nRec > 0 THEN ERRDIAG := 'Inserimento Impossibile: Esiste già in archivio un Mandato con le caratteristiche specificate'; RETURN pkUtility.fnError( 'fnGPRISCONTTestKey', -499, ERRDIAG ); END IF; ELSE -- Aggiorna con nuovo codice, non funzionerebbe se la funzione di aggiornamento non la chiamasse -- sse codice vecchio e nuovo non coincidono SELECT COUNT(*) INTO nRec FROM GPRISCONT WHERE IDRELAB = lIDRELAB AND CODANNOGRUPPOCONT = lCODANNOGRUPPOCONT AND QTAGRUPPOCONT = lQTAGRUPPOCONT AND CODANNOESERCIZIO = lCODANNOESERCIZIO AND CODPARTE = lCODPARTE AND IDCAPITOLO = lIDCAPITOLO AND NVL(IDCDC,0) = NVL(lIDCDC,0) AND CODANNOCONT = lCODANNOCONT AND IDACCIMP = lIDACCIMP AND CODTIPOBEN = lCODTIPOBEN AND CODBENEFICIARIO = lCODBENEFICIARIO AND CODSIOPE = lCODSIOPE; IF nRec > 0 THEN ERRDIAG := 'Aggiornamento Impossibile: Esiste già in archivio un Mandato con le caratteristiche specificate'; RETURN pkUtility.fnError( 'fnGPRISCONTTestKey', -499, ERRDIAG ); END IF; END IF; RETURN 1; EXCEPTION WHEN OTHERS THEN RETURN pkUtility.fnError( 'fnGPRISCONTTestKey', SQLCODE, ERRDIAG ); END fnGPRISCONTTestKey; -- SA20020228, funzione che inserisce un mandato per ogni elaborazione del gruppo di Contabilizz. -- AS20020417 catturato errore di chiave duplicata( per l'AK). FUNCTION fnGPRISCONTManRevIns ( lCODANNOGRUPPOCONT IN pkType.tyStringa%TYPE, lQTAGRUPPOCONT IN pkType.tyStringa%TYPE, lCODANNOESERCIZIO IN pkType.tyStringa%TYPE, lCODPARTE IN pkType.tyStringa%TYPE, lIDCAPITOLO IN pkType.tyStringa%TYPE, lIDCDC IN pkType.tyStringa%TYPE, lCODANNOCONT IN pkType.tyStringa%TYPE, lIDACCIMP IN pkType.tyStringa%TYPE, lCODTIPOBEN IN pkType.tyStringa%TYPE, lCODBENEFICIARIO IN pkType.tyStringa%TYPE, lIMPMANREV IN pkType.tyStringa%TYPE, lINDCONTABILIZZATO IN pkType.tyStringa%TYPE, lCODTIPOARROT IN pkType.tyStringa%TYPE, lIMPARROT IN pkType.tyStringa%TYPE, lDESBENEFICIARIO IN pkType.tyStringa%TYPE, lCODMANREV IN pkType.tyStringa%TYPE, lDTAMANREV IN pkType.tyStringa%TYPE, lIDMANREV IN pkType.tyStringa%TYPE, lINDPARTITA IN pkType.tyStringa%TYPE, lDTASCADENZA IN pkType.tyStringa%TYPE, lCODENTEAZ IN pkType.tyStringa%TYPE, lINDSOSPESO IN pkType.tyStringa%TYPE, lCODSIOPE IN pkType.tyStringa%TYPE, lCODSESSIONE IN pkType.tyStringa%TYPE, lIDRRISCONT OUT pkType.tyStringa%TYPE, ERRDIAG OUT pkType.tyStringa%TYPE ) RETURN NUMERIC IS nRet NUMBER(9); nIDRELAB GPELAB.IDRELAB%type; BEGIN SELECT MAX(GPRISCONT.IDRELAB) INTO nIDRELAB FROM GPRISCONT,GPELAB WHERE CODANNOGRUPPOCONT = lCODANNOGRUPPOCONT AND QTAGRUPPOCONT = lQTAGRUPPOCONT AND GPELAB.IDRELAB = GPRISCONT.IDRELAB AND CODENTEAZ = lCODENTEAZ; -- AND GPELAB.CODCONTRATTO = 'ENTE'; --RM PEZZA PER AQUILA nRet := fnGPRISCONTTestKey( nIDRELAB, lCODANNOGRUPPOCONT, lQTAGRUPPOCONT, lCODANNOESERCIZIO, lCODPARTE, lIDCAPITOLO, NVL(lIDCDC,0), lCODANNOCONT, NVL(lIDACCIMP,0), lCODTIPOBEN, lCODBENEFICIARIO, lCODSIOPE, 'I', ERRDIAG ); IF nRet < 0 THEN ROLLBACK; RETURN nRet; END IF; SELECT NVL( MAX( IDRRISCONT ),0) + 1 INTO lIDRRISCONT FROM GPRISCONT; INSERT INTO GPRISCONT ( IDRRISCONT , IDRELAB , CODANNOGRUPPOCONT , QTAGRUPPOCONT , CODANNOESERCIZIO , CODPARTE , IDCAPITOLO , IDCDC , CODANNOCONT , IDACCIMP , CODTIPOBEN , CODBENEFICIARIO , IMPMANREV , INDCONTABILIZZATO , CODTIPOARROT , IMPARROT , DESBENEFICIARIO , CODMANREV , DTAMANREV , IDMANREV , INDPARTITA , DTASCADENZA, IMPTOTMANDDET, INDSOSPESO, CODSIOPE ) VALUES ( lIDRRISCONT , nIDRELAB , NVL(lCODANNOGRUPPOCONT,0) , NVL(lQTAGRUPPOCONT,0) , NVL(lCODANNOESERCIZIO,0), lCODPARTE , NVL(lIDCAPITOLO,0) , NVL(lIDCDC,0) , NVL(lCODANNOCONT,0) , NVL(lIDACCIMP,0), NVL(lCODTIPOBEN,'N') , NVL(lCODBENEFICIARIO,'.') , NVL(lIMPMANREV,0) , NVL(lINDCONTABILIZZATO,'N') , NVL(lCODTIPOARROT,'N'), NVL(lIMPARROT, 0) , NVL(lDESBENEFICIARIO,'.') , NVL(lCODMANREV,0) , NVL(TO_DATE(lDTAMANREV,'DD/MM/YYYY'),PKTYPE.DTAMIN ) , NVL(lIDMANREV,0), NVL(lINDPARTITA,'N'), NVL(TO_DATE(lDTASCADENZA,'DD/MM/YYYY'),PKTYPE.DTAMIN ), 0, NVL(lINDSOSPESO,'N'), lCODSIOPE); -- inserisco il log nRet := pkPagPerson.fnGPLogIns( 'GPRISCONT', 'I', 'Inserimento nella tabella GPRISCONT', lCODANNOGRUPPOCONT ||'§'|| lQTAGRUPPOCONT, NULL, NULL, 'N', lCODSESSIONE, ERRDIAG ); COMMIT; RETURN 1; EXCEPTION WHEN OTHERS THEN ROLLBACK; RETURN pkUtility.fnError( '1fnGPRISCONTManRevIns', SQLCODE, ERRDIAG ); END; -- Autore: Pace Marco, 11/12/2001 -- Modifiche: SA20020228, modificati parametri di input -- Pace, 20020328: aggiunta la gestione del campo IMPTOTMANDDET -- AS20020417 catturato errore di chiave duplicata( per l'AK). -- Gestito aggiornamento anche dei campi IDCAPITOLO,CODANNOCONT,IDACCIMP, IDCDC della AK FUNCTION fnGPRisContManRevUpd ( lCODANNOGRUPPOCONT IN pkType.tyStringa%TYPE, --XAK1GPRISCONT lQTAGRUPPOCONT IN pkType.tyStringa%TYPE, --XAK1GPRISCONT lCODANNOESERCIZIO IN pkType.tyStringa%TYPE, --XAK1GPRISCONT lCODPARTE IN pkType.tyStringa%TYPE, --XAK1GPRISCONT lIDCAPITOLONEW IN pkType.tyStringa%TYPE, --XAK1GPRISCONT lIDCDCNEW IN pkType.tyStringa%TYPE, --XAK1GPRISCONT lCODANNOCONTNEW IN pkType.tyStringa%TYPE, --XAK1GPRISCONT lIDACCIMPNEW IN pkType.tyStringa%TYPE, --XAK1GPRISCONT lCODTIPOBENNEW IN pkType.tyStringa%TYPE, --XAK1GPRISCONT lCODBENEFICIARIONEW IN pkType.tyStringa%TYPE, --XAK1GPRISCONT lDESBENEFICIARIO IN pkType.tyStringa%TYPE, --XAK1GPRISCONT lCODSIOPENEW IN pkType.tyStringa%TYPE, --XAK1GPRISCONT lIDCAPITOLOOLD IN pkType.tyStringa%TYPE, --XAK1GPRISCONT lIDCDCOLD IN pkType.tyStringa%TYPE, --XAK1GPRISCONT lCODANNOCONTOLD IN pkType.tyStringa%TYPE, --XAK1GPRISCONT lIDACCIMPOLD IN pkType.tyStringa%TYPE, --XAK1GPRISCONT lCODTIPOBENOLD IN pkType.tyStringa%TYPE, --XAK1GPRISCONT lCODBENEFICIARIOOLD IN pkType.tyStringa%TYPE, --XAK1GPRISCONT lCODSIOPEOLD IN pkType.tyStringa%TYPE, --XAK1GPRISCONT lCODENTEAZ IN pkType.tyStringa%TYPE, lCODMANREV IN pkType.tyStringa%TYPE, -- da aggiornare lDTAMANREV IN pkType.tyStringa%TYPE, -- da aggiornare lINDCONTABILIZZATO IN pkType.tyStringa%TYPE, -- da aggiornare lDTASCADENZA IN pkType.tyStringa%TYPE, -- da aggiornare lIMPMANREVNEW IN pkType.tyStringa%TYPE, lIMPMANREVOLD IN pkType.tyStringa%TYPE, lINDSOSPESO IN pkType.tyStringa%TYPE, lCODSESSIONE IN pkType.tyStringa%TYPE, ERRDIAG OUT pkType.tyStringa%TYPE ) RETURN NUMERIC IS nRet NUMBER(9); -- Differenza tra lIMPMANREVNEW e lIMPMANREVOLD: nImpTotDiff NUMBER(19,6) := NVL(lIMPMANREVNEW,0) - NVL(lIMPMANREVOLD,0); nIDRRISCONTFirst GPRISCONT.idrriscont%TYPE; -- Contiene il minimo IDRRISCONT dei -- record che verificano la AK; è il record in cui verrà aggiornato IMPMANREV CURSOR curGPELAB IS SELECT DISTINCT GPRISCONT.IDRELAB FROM GPRISCONT,GPELAB WHERE CODANNOGRUPPOCONT = lCODANNOGRUPPOCONT AND QTAGRUPPOCONT = lQTAGRUPPOCONT AND GPELAB.IDRELAB = GPRISCONT.IDRELAB AND CODENTEAZ = lCODENTEAZ; BEGIN IF ( lIDCAPITOLOOLD <> lIDCAPITOLONEW OR NVL(lIDCDCOLD,0) <> NVL(lIDCDCNEW,0) OR lCODANNOCONTOLD <> lCODANNOCONTNEW OR NVL(lIDACCIMPOLD,0) <> NVL(lIDACCIMPNEW,0) OR lCODTIPOBENOLD <> lCODTIPOBENNEW OR lCODBENEFICIARIOOLD <> lCODBENEFICIARIONEW OR lCODSIOPEOLD <> lCODSIOPENEW) THEN FOR REC IN curGPELAB LOOP nRet := fnGPRISCONTTestKey( REC.IDRELAB,lCODANNOGRUPPOCONT, lQTAGRUPPOCONT, lCODANNOESERCIZIO, lCODPARTE, lIDCAPITOLONEW, NVL(lIDCDCNEW,0), lCODANNOCONTNEW, NVL(lIDACCIMPNEW,0), lCODTIPOBENNEW, lCODBENEFICIARIONEW, 'U', lCODSIOPENEW, ERRDIAG ); IF nRet < 0 THEN ROLLBACK; RETURN nRet; END IF; END LOOP; -- nel caso che posso modificare l'AK devo aggiornare tutti i dettagli UPDATE GPDETRISCONT SET IDCAPITOLO = lIDCAPITOLONEW, IDCDC = NVL(lIDCDCNEW,0), CODANNOCONT = lCODANNOCONTNEW, IDACCIMP = NVL(lIDACCIMPNEW,0), CODTIPOBEN = lCODTIPOBENNEW, CODBENEFICIARIO = lCODBENEFICIARIONEW, CODSIOPE = lCODSIOPENEW WHERE IDRRISCONT IN ( SELECT IDRRISCONT FROM GPRISCONT WHERE CODANNOGRUPPOCONT = lCODANNOGRUPPOCONT AND QTAGRUPPOCONT = lQTAGRUPPOCONT AND CODANNOESERCIZIO = lCODANNOESERCIZIO AND CODPARTE = lCODPARTE AND IDCAPITOLO = lIDCAPITOLOOLD AND NVL(IDCDC,0) = NVL(lIDCDCOLD,0) AND CODANNOCONT = lCODANNOCONTOLD AND IDACCIMP = NVL(lIDACCIMPOLD,0) AND CODTIPOBEN = lCODTIPOBENOLD AND CODBENEFICIARIO = lCODBENEFICIARIOOLD AND CODSIOPE = lCODSIOPEOLD AND ( IDRELAB IN (SELECT IDRELAB FROM GPELAB WHERE CODENTEAZ = lCODENTEAZ) ) ); END IF; UPDATE GPRISCONT SET IDCAPITOLO = lIDCAPITOLONEW, IDCDC = NVL(lIDCDCNEW,0), CODANNOCONT = lCODANNOCONTNEW, IDACCIMP = NVL(lIDACCIMPNEW,0), CODTIPOBEN = lCODTIPOBENNEW, CODBENEFICIARIO = lCODBENEFICIARIONEW, CODSIOPE = lCODSIOPENEW, DESBENEFICIARIO = lDESBENEFICIARIO, CODMANREV = lCODMANREV, DTAMANREV = NVL(TO_DATE(lDTAMANREV, 'DD/MM/YYYY'), pkType.DTAMIN), --Riccardo 04-01-2002 INDCONTABILIZZATO = UPPER(lINDCONTABILIZZATO), DTASCADENZA = NVL( TO_DATE( lDTASCADENZA, 'DD/MM/YYYY'), PKTYPE.DTAMIN ), INDSOSPESO= NVL(lINDSOSPESO,'N') WHERE CODANNOGRUPPOCONT = lCODANNOGRUPPOCONT AND QTAGRUPPOCONT = lQTAGRUPPOCONT AND CODANNOESERCIZIO = lCODANNOESERCIZIO AND CODPARTE = lCODPARTE AND IDCAPITOLO = lIDCAPITOLOOLD AND NVL(IDCDC,0) = NVL(lIDCDCOLD,0) AND CODANNOCONT = lCODANNOCONTOLD AND IDACCIMP = NVL(lIDACCIMPOLD,0) AND CODTIPOBEN = lCODTIPOBENOLD AND CODBENEFICIARIO = lCODBENEFICIARIOOLD AND CODSIOPE = lCODSIOPEOLD AND ( IDRELAB IN (SELECT IDRELAB FROM GPELAB WHERE CODENTEAZ = lCODENTEAZ) ) ; -- Seleziono il minimo IDRRISCONT dei record che verificano la AK: SELECT MIN(IDRRISCONT) INTO nIDRRISCONTFirst FROM GPRISCONT WHERE CODANNOGRUPPOCONT = lCODANNOGRUPPOCONT AND QTAGRUPPOCONT = lQTAGRUPPOCONT AND CODANNOESERCIZIO = lCODANNOESERCIZIO AND CODPARTE = lCODPARTE AND IDCAPITOLO = lIDCAPITOLONEW AND NVL(IDCDC,0) = NVL(lIDCDCNEW,0) AND CODANNOCONT = lCODANNOCONTNEW AND IDACCIMP = lIDACCIMPNEW AND CODTIPOBEN = lCODTIPOBENNEW AND CODBENEFICIARIO = lCODBENEFICIARIONEW AND CODSIOPE = lCODSIOPENEW AND ( IDRELAB IN (SELECT IDRELAB FROM GPELAB WHERE CODENTEAZ = lCODENTEAZ) ); -- Aggiorno IMPMANREV del record trovato, aggiungendo la differenza tra lIMPMANREVNEW e lIMPMANDREVOLD UPDATE GPRISCONT SET IMPMANREV = IMPMANREV + nImpTotDiff WHERE IDRRISCONT = nIDRRISCONTFirst; -- inserisco il log nRet := pkPagPerson.fnGPLogIns( 'GPRISCONT', 'U', 'Aggiornamento nella tabella GPRISCONT', lCODANNOGRUPPOCONT ||'§'|| lQTAGRUPPOCONT, NULL, NULL, 'N', lCODSESSIONE, ERRDIAG ); COMMIT; RETURN 1; EXCEPTION WHEN OTHERS THEN ROLLBACK; RETURN pkUtility.fnerror('2fnGPRisContManRevUpd', SQLCODE, ERRDIAG); END fnGPRisContManRevUpd; -- SA20020228, cancella tutti i mandati identificati dalla AK1, ESCLUSO l'IDRELAB ( le -- cancello tutte a parità del resto di AK ) FUNCTION fnGPRisContManRevDel ( lCODANNOGRUPPOCONT IN pkType.tyStringa%TYPE, --XAK1GPRISCONT lQTAGRUPPOCONT IN pkType.tyStringa%TYPE, --XAK1GPRISCONT lCODANNOESERCIZIO IN pkType.tyStringa%TYPE, --XAK1GPRISCONT lCODPARTE IN pkType.tyStringa%TYPE, --XAK1GPRISCONT lIDCAPITOLO IN pkType.tyStringa%TYPE, --XAK1GPRISCONT lIDCDC IN pkType.tyStringa%TYPE, --XAK1GPRISCONT lCODANNOCONT IN pkType.tyStringa%TYPE, --XAK1GPRISCONT lIDACCIMP IN pkType.tyStringa%TYPE, --XAK1GPRISCONT lCODTIPOBEN IN pkType.tyStringa%TYPE, --XAK1GPRISCONT lCODBENEFICIARIO IN pkType.tyStringa%TYPE, --XAK1GPRISCONT lCODSIOPE IN pkType.tyStringa%TYPE, --XAK1GPRISCONT lCODENTEAZ IN pkType.tyStringa%TYPE, lCODSESSIONE IN pkType.tyStringa%TYPE, ERRDIAG OUT pkType.tyStringa%TYPE ) RETURN NUMERIC IS nREC number(9); nRet number(9); BEGIN SELECT COUNT(*) INTO nREC FROM GPDETRISCONT WHERE IDRRISCONT IN ( SELECT IDRRISCONT FROM GPRISCONT WHERE CODANNOGRUPPOCONT = lCODANNOGRUPPOCONT AND QTAGRUPPOCONT = lQTAGRUPPOCONT AND CODANNOESERCIZIO = lCODANNOESERCIZIO AND CODPARTE = lCODPARTE AND IDCAPITOLO = lIDCAPITOLO AND NVL(IDCDC,0) = NVL(lIDCDC,0) AND CODANNOCONT = lCODANNOCONT AND IDACCIMP = NVL(lIDACCIMP,0) AND CODTIPOBEN = lCODTIPOBEN AND CODBENEFICIARIO = lCODBENEFICIARIO AND CODSIOPE = lCODSIOPE AND ( IDRELAB IN (SELECT IDRELAB FROM GPELAB WHERE CODENTEAZ = lCODENTEAZ) ) ) ; IF nREC > 0 THEN ERRDIAG := 'Cancellazione Impossibile: Esistono dei Dettagli collegati al Mandato/Reversale scelto'; RETURN pkUtility.fnerror('fnGPRisContManRevDel', -499, ERRDIAG); END IF; DELETE GPRISCONT WHERE CODANNOGRUPPOCONT = lCODANNOGRUPPOCONT AND QTAGRUPPOCONT = lQTAGRUPPOCONT AND CODANNOESERCIZIO = lCODANNOESERCIZIO AND CODPARTE = lCODPARTE AND IDCAPITOLO = lIDCAPITOLO AND NVL(IDCDC,0) = NVL(lIDCDC,0) AND CODANNOCONT = lCODANNOCONT AND IDACCIMP = NVL(lIDACCIMP,0) AND CODTIPOBEN = lCODTIPOBEN AND CODBENEFICIARIO = lCODBENEFICIARIO AND CODSIOPE = lCODSIOPE AND ( IDRELAB IN (SELECT IDRELAB FROM GPELAB WHERE CODENTEAZ = lCODENTEAZ) ); -- inserisco il log nRet := pkPagPerson.fnGPLogIns( 'GPRISCONT', 'D', 'Cancellazione dalla tabella GPRISCONT', lCODANNOGRUPPOCONT ||'§'|| lQTAGRUPPOCONT, NULL, NULL, 'N', lCODSESSIONE, ERRDIAG ); COMMIT; RETURN 1; EXCEPTION WHEN OTHERS THEN ROLLBACK; RETURN pkUtility.fnerror('fnGPRisContManRevDel', SQLCODE, ERRDIAG); END fnGPRisContManRevDel; -- Autore: SA20020301 -- ************************************************************************************************** -- Spostamenti di massa da un mandato/reversale( singolo o da alcuni suoi dettagli ) -- a un mandato/reversale destinazione -- > Translate -- ************************************************************************************************** -- Viene passata la AK( esclusa l'elaborazione poichè ce ne può essere più di una in un gruppo -- di contabilizzazione ) del mandato/reversale da trasferire; si possono avere i seguenti casi: -- 1) la AK è tutta avvalorata --> sposto tutti i dettagli del mandato/reversale specificato -- 2) se oltre alla AK vengono scelti dei dettagli -- 3) Inoltre la AK può essere incompleta poichè la funzione viene chiamata dalla maschera nella quale si -- può scegliere soltanto il Capitolo e/o l'Impegno/accertamento e/o Tipo di Elemento e/o -- Anno di Maturazione -- Il Mand/Rev di destinazione mi viene specificato dal Front-End chiamando la Init della temporanea che -- inizialmente conterrà tutti i suoi dettagli che tra l'altro non possone essere toccati; -- Quando poi l'utente ha scelto chi aggiungere alla temporanea( tramite scelta del singolo mandato/reversale -- OPPURE solo alcuni dettagli di un certo Mandato/reversale OPPURE il Capitolo e/o l'Impegno/accertamento -- e/o Tipo di Elemento e/o Anno di Maturazione di un gruppo di mandati/reversali ) -- verrà fatta una funzione di Inserimento nella Temporanea che il F-E chiamerà tante volte quanti sono -- gli elementi scelti dall'utente( nel caso (2) ).NB: nell'ultimo inserimento il F-E avvalora un flag per dirmi di restituirgli -- in output il totale ImpManRev aggiornato. -- Negli altri due casi devo essere io da funzione a riempire la TMP in base alle scelte dell'utente, -- escludendo eventuali dettagli sorgente appartenenti al Destinatario -- Se l'utente Conferma gli inserimenti --> il FE chiama la funzione fnGPRISCONTManRevTrans che prende in -- input il resto della AK( esclusi i campi che già sono avvalorati nella TMP) del mandato sorgente. -- Nel caso in cui sarà più di un mandato sorgente ovviamente non avrò avvalorata tutta la AK. FUNCTION fnGPTMPDETRISCONTInsDet ( lCODANNOGRUPPOCONT IN pkType.tyStringa%TYPE, -- Avvalorati solo se vuole un singolo mandato lQTAGRUPPOCONT IN pkType.tyStringa%TYPE, -- Avvalorati solo se vuole un singolo mandato lCODANNOESERCIZIOD IN pkType.tyStringa%TYPE, -- Destinazione lCODPARTED IN pkType.tyStringa%TYPE, -- Destinazione lIDCAPITOLOD IN pkType.tyStringa%TYPE, -- Destinazione lIDCDCD IN pkType.tyStringa%TYPE, -- Destinazione lCODANNOCONTD IN pkType.tyStringa%TYPE, -- Destinazione lIDACCIMPD IN pkType.tyStringa%TYPE, -- Destinazione lCODTIPOBEND IN pkType.tyStringa%TYPE, -- Destinazione lCODBENEFICIARIOD IN pkType.tyStringa%TYPE, -- Destinazione lCODSIOPED IN pkType.tyStringa%TYPE, -- Destinazione --- mandato/rev da spostare lIDRRLAV IN pkType.tyStringa%TYPE, lIDRELAB IN pkType.tyStringa%TYPE, lCODTIPOELE IN pkType.tyStringa%TYPE, lCODANNOESERCIZIO IN pkType.tyStringa%TYPE, lCODANNOMAT IN pkType.tyStringa%TYPE, lCODPARTE IN pkType.tyStringa%TYPE, lIDCAPITOLO IN pkType.tyStringa%TYPE, lCODANNOCONT IN pkType.tyStringa%TYPE, lIDACCIMP IN pkType.tyStringa%TYPE, lCODTIPOBEN IN pkType.tyStringa%TYPE, lCODBENEFICIARIO IN pkType.tyStringa%TYPE, lCODSIOPE IN pkType.tyStringa%TYPE, lIDCDC IN pkType.tyStringa%TYPE, lIMPMANDATO IN pkType.tyStringa%TYPE, lIMPTRATTENUTE IN pkType.tyStringa%TYPE, lIMPNETTO IN pkType.tyStringa%TYPE, lCODENTEAZ IN pkType.tyStringa%TYPE, lINDDELALL IN pkType.tyStringa%TYPE, -- il FE me lo avvalora a 'S' se voule cancellare tutti -- i record cancellabili lINDTOTMANREV IN pkType.tyStringa%TYPE, -- 'S' --> restituire l'Importo del Mandato lCOMMIT IN pkType.tyStringa%TYPE, lCODSESSIONE IN pkType.tyStringa%TYPE, lIMPTOTMANREV OUT pkType.tyStringa%TYPE, -- avvalorato se occorre restituire l'Importo del Mandato ERRDIAG OUT pkType.tyStringa%TYPE ) RETURN NUMERIC IS sTMSLOCK GPTMPDETRISCONT.TMSLOCK%TYPE := TO_CHAR( SYSDATE,'YYYYMMDDHH24MISS' ); CURSOR curGPDETRISCONT IS SELECT GPDETRISCONT.IDRRLAV, GPDETRISCONT.IDRELAB, GPDETRISCONT.CODTIPOELE, GPDETRISCONT.CODANNOESERCIZIO, GPDETRISCONT.CODANNOMAT, GPDETRISCONT.CODPARTE, GPDETRISCONT.IDCAPITOLO, GPDETRISCONT.CODANNOCONT, GPDETRISCONT.IDACCIMP, GPDETRISCONT.CODTIPOBEN,GPDETRISCONT.CODBENEFICIARIO, GPDETRISCONT.CODSIOPE, GPDETRISCONT.IDCDC,GPDETRISCONT.IMPMANDATO, GPDETRISCONT.IMPTRATTENUTE, GPDETRISCONT.IMPNETTO, DECODE( GPDETRISCONT.CODTIPOELE, 'VOX', 'Voci', 'TAX', 'Tassazioni', 'CON', 'Contributi', 'ONE','Oneri') DESELEMENTO, GPELAB.DESELAB ||' '||GPELAB.CODANNOELAB ||' ('|| GPCONTRATTO.DESCONTRATTO ||' '|| GPGRPPAGA.DESGRPPAGA|| ')' DESELABESTESA, VWRAPLAV.DESRAPPORTO FROM GPRISCONT, GPDETRISCONT, GPELAB, GPCONTRATTO, GPGRPPAGA, VWRAPLAV WHERE ( GPRISCONT.CODANNOGRUPPOCONT = lCODANNOGRUPPOCONT ) AND ( GPRISCONT.QTAGRUPPOCONT = lQTAGRUPPOCONT ) AND ( GPRISCONT.CODANNOESERCIZIO = lCODANNOESERCIZIO OR lCODANNOESERCIZIO IS NULL ) AND ( GPRISCONT.CODPARTE = lCODPARTE ) AND ( GPRISCONT.IDCAPITOLO = lIDCAPITOLO OR lIDCAPITOLO IS NULL )AND ( GPRISCONT.IDCDC = lIDCDC OR lIDCDC IS NULL )AND ( GPRISCONT.CODANNOCONT = lCODANNOCONT OR lCODANNOCONT IS NULL )AND ( GPRISCONT.IDACCIMP = lIDACCIMP OR lIDACCIMP IS NULL )AND ( GPRISCONT.CODTIPOBEN = lCODTIPOBEN OR lCODTIPOBEN IS NULL )AND ( GPRISCONT.CODBENEFICIARIO = lCODBENEFICIARIO OR lCODBENEFICIARIO IS NULL )AND ( GPRISCONT.CODSIOPE = lCODSIOPE OR lCODSIOPE IS NULL )AND -- Per identificare eventuali dettagli ( GPDETRISCONT.IDRRLAV = lIDRRLAV OR lIDRRLAV IS NULL )AND ( GPDETRISCONT.CODTIPOELE = lCODTIPOELE OR lCODTIPOELE IS NULL )AND ( GPDETRISCONT.CODANNOMAT = lCODANNOMAT OR lCODANNOMAT IS NULL )AND GPDETRISCONT.IDRRISCONT = GPRISCONT.IDRRISCONT AND GPELAB.IDRELAB = GPDETRISCONT.IDRELAB AND GPELAB.CODENTEAZ = lCODENTEAZ AND GPELAB.CODCONTRATTO = GPCONTRATTO.CODCONTRATTO AND GPELAB.CODGRUPPOPAGA = GPGRPPAGA.CODGRUPPOPAGA AND GPELAB.CODENTEAZ = GPGRPPAGA.CODENTEAZ AND GPDETRISCONT.IDRRLAV = VWRAPLAV.IDRRLAV AND gpriscont.codtipoben = lCODTIPOBEND and --RM Aquila gpriscont.codbeneficiario = lCODBENEFICIARIOD and --RM Aquila gpriscont.idcdc = lIDCDCD and -- RM Aquila 0 = ( SELECT COUNT(*) FROM GPRISCONT A WHERE ( A.CODANNOGRUPPOCONT = lCODANNOGRUPPOCONT ) AND A.QTAGRUPPOCONT = lQTAGRUPPOCONT AND A.CODANNOESERCIZIO = lCODANNOESERCIZIOD AND A.CODPARTE = lCODPARTED AND A.IDCAPITOLO = lIDCAPITOLOD AND A.IDCDC = lIDCDCD AND A.CODANNOCONT = lCODANNOCONTD AND A.IDACCIMP = lIDACCIMPD AND A.CODTIPOBEN = lCODTIPOBEND AND A.CODBENEFICIARIO = lCODBENEFICIARIOD AND A.CODSIOPE = lCODSIOPED AND A.IDRRISCONT = GPRISCONT.IDRRISCONT ); nRec NUMBER(9); BEGIN IF lINDDELALL = 'S' THEN DELETE FROM GPTMPDETRISCONT WHERE OWNER = lCODSESSIONE AND INDSORG = 'S'; END IF; FOR recGPDETRISCONT IN curGPDETRISCONT LOOP INSERT INTO GPTMPDETRISCONT ( OWNER , IDRRLAV , IDRELAB , CODTIPOELE , CODANNOESERCIZIO , CODANNOMAT , CODPARTE , IDCAPITOLO , CODANNOCONT , IDACCIMP , CODTIPOBEN , CODBENEFICIARIO , CODSIOPE, IDCDC , IMPMANDATO, IMPTRATTENUTE,IMPNETTO,INDSORG, DESELEMENTO, DESELABESTESA, DESRAPPORTO, TMSLOCK ) VALUES( lCODSESSIONE, recGPDETRISCONT.IDRRLAV , recGPDETRISCONT.IDRELAB , recGPDETRISCONT.CODTIPOELE, NVL(recGPDETRISCONT.CODANNOESERCIZIO,0) , NVL(recGPDETRISCONT.CODANNOMAT,0) , recGPDETRISCONT.CODPARTE , NVL(recGPDETRISCONT.IDCAPITOLO,0), NVL(recGPDETRISCONT.CODANNOCONT,0), NVL(recGPDETRISCONT.IDACCIMP,0) , recGPDETRISCONT.CODTIPOBEN, recGPDETRISCONT.CODBENEFICIARIO , recGPDETRISCONT.CODSIOPE, NVL(recGPDETRISCONT.IDCDC,0), NVL(recGPDETRISCONT.IMPMANDATO,0), NVL(recGPDETRISCONT.IMPTRATTENUTE,0), NVL(recGPDETRISCONT.IMPNETTO,0), 'S', recGPDETRISCONT.DESELEMENTO, recGPDETRISCONT.DESELABESTESA, recGPDETRISCONT.DESRAPPORTO, sTMSLOCK ) ; END LOOP; IF lINDTOTMANREV = 'S' THEN SELECT SUM( IMPMANDATO) INTO lIMPTOTMANREV FROM GPTMPDETRISCONT WHERE OWNER = lCODSESSIONE; END IF; IF lCOMMIT <> 'N' THEN COMMIT; END IF; RETURN 1; EXCEPTION WHEN OTHERS THEN ROLLBACK; RETURN pkUtility.fnError( '1fnGPTMPDETRISCONTInsDet', SQLCODE, ERRDIAG ); END fnGPTMPDETRISCONTInsDet; -- inserisce eventuali Dettagli destinazione FUNCTION fnGPTMPDETRISCONTInit ( --- mandato/rev in cui spostare lCODANNOGRUPPOCONT IN pkType.tyStringa%TYPE, -- AK1 lQTAGRUPPOCONT IN pkType.tyStringa%TYPE, lCODANNOESERCIZIO IN pkType.tyStringa%TYPE, lCODPARTE IN pkType.tyStringa%TYPE, lIDCAPITOLO IN pkType.tyStringa%TYPE, lIDCDC IN pkType.tyStringa%TYPE, lCODANNOCONT IN pkType.tyStringa%TYPE, lIDACCIMP IN pkType.tyStringa%TYPE, lCODTIPOBEN IN pkType.tyStringa%TYPE, lCODBENEFICIARIO IN pkType.tyStringa%TYPE, lCODSIOPE IN pkType.tyStringa%TYPE, lCODENTEAZ IN pkType.tyStringa%TYPE, lCODSESSIONE IN pkType.tyStringa%TYPE, ERRDIAG OUT pkType.tyStringa%TYPE ) RETURN NUMERIC IS sTMSLOCK GPTMPDETRISCONT.TMSLOCK%TYPE := TO_CHAR( SYSDATE,'YYYYMMDDHH24MISS' ); CURSOR curGPDETRISCONT IS SELECT GPDETRISCONT.IDRRLAV, GPDETRISCONT.IDRELAB, GPDETRISCONT.CODTIPOELE, GPDETRISCONT.CODANNOESERCIZIO, GPDETRISCONT.CODANNOMAT, GPDETRISCONT.CODPARTE, GPDETRISCONT.IDCAPITOLO, GPDETRISCONT.CODANNOCONT, GPDETRISCONT.IDACCIMP, GPDETRISCONT.CODTIPOBEN,GPDETRISCONT.CODBENEFICIARIO, GPDETRISCONT.CODSIOPE, GPDETRISCONT.IDCDC,GPDETRISCONT.IMPMANDATO, GPDETRISCONT.IMPTRATTENUTE, GPDETRISCONT.IMPNETTO, 'N' INDSORG, -- non saranno cancellabili DECODE( GPDETRISCONT.CODTIPOELE, 'VOX', 'Voci', 'TAX', 'Tassazioni', 'CON', 'Contributi', 'ONE','Oneri') DESELEMENTO, GPELAB.DESELAB ||' '||GPELAB.CODANNOELAB ||' ('|| GPCONTRATTO.DESCONTRATTO ||' '|| GPGRPPAGA.DESGRPPAGA|| ')' DESELABESTESA, GPPERSONA.descognome||' '||GPPERSONA.desnome||' - '||'Rapporto: '|| DECODE(GPRAPLAV.codlinealav, 'D', 'Dipendente', 'E', 'Extra')||' '|| 'Inizio: '||TO_CHAR(GPRAPLAV.dtainizio, 'DD/MM/YYYY')|| DECODE(TO_CHAR(GPRAPLAV.dtafine, 'DD/MM/YYYY'), '31/12/2999', NULL, ' Fine: '||TO_CHAR(GPRAPLAV.dtafine, 'DD/MM/YYYY') )|| ' Matr. '||GPRAPLAV.codmatricola DESRAPPORTO FROM GPRISCONT, GPDETRISCONT, GPELAB, GPCONTRATTO, GPGRPPAGA, GPRAPLAV,GPPERSONA WHERE GPRISCONT.CODANNOGRUPPOCONT = lCODANNOGRUPPOCONT AND GPRISCONT.QTAGRUPPOCONT = lQTAGRUPPOCONT AND GPRISCONT.CODANNOESERCIZIO = lCODANNOESERCIZIO AND GPRISCONT.CODPARTE = lCODPARTE AND GPRISCONT.IDCAPITOLO = lIDCAPITOLO AND GPRISCONT.IDCDC = lIDCDC AND GPRISCONT.CODANNOCONT = lCODANNOCONT AND GPRISCONT.IDACCIMP = lIDACCIMP AND GPRISCONT.CODTIPOBEN = lCODTIPOBEN AND GPRISCONT.CODBENEFICIARIO = lCODBENEFICIARIO AND GPRISCONT.CODSIOPE = lCODSIOPE AND GPDETRISCONT.IDRRISCONT = GPRISCONT.IDRRISCONT AND GPDETRISCONT.IDRELAB = GPELAB.IDRELAB AND GPELAB.CODENTEAZ = lCODENTEAZ AND GPELAB.CODCONTRATTO = GPCONTRATTO.CODCONTRATTO AND GPELAB.CODGRUPPOPAGA = GPGRPPAGA.CODGRUPPOPAGA AND GPELAB.CODENTEAZ = GPGRPPAGA.CODENTEAZ AND GPDETRISCONT.IDRRLAV = GPRAPLAV.IDRRLAV AND GPRAPLAV.IDRPERSONA = GPPERSONA.IDRPERSONA; BEGIN -- ripulisco la temporanea DELETE GPTMPDETRISCONT WHERE OWNER = lCODSESSIONE OR TO_CHAR( sysdate, 'YYYYMMDDHH24MI' ) - SUBSTR( TMSLOCK,1,12 ) > 2400; FOR recGPDETRISCONT IN curGPDETRISCONT LOOP -- uso funzione di ins nella TMP per il caso Singolo e dicendogli che il record non è cancellabile INSERT INTO GPTMPDETRISCONT ( OWNER , IDRRLAV , IDRELAB , CODTIPOELE , CODANNOESERCIZIO , CODANNOMAT , CODPARTE , IDCAPITOLO , CODANNOCONT , IDACCIMP , CODTIPOBEN , CODBENEFICIARIO , CODSIOPE, IDCDC , IMPMANDATO, IMPTRATTENUTE,IMPNETTO,INDSORG, DESELEMENTO, DESELABESTESA, DESRAPPORTO, TMSLOCK ) VALUES( lCODSESSIONE, recGPDETRISCONT.IDRRLAV, recGPDETRISCONT.IDRELAB, recGPDETRISCONT.CODTIPOELE, recGPDETRISCONT.CODANNOESERCIZIO, recGPDETRISCONT.CODANNOMAT, recGPDETRISCONT.CODPARTE, recGPDETRISCONT.IDCAPITOLO, recGPDETRISCONT.CODANNOCONT, recGPDETRISCONT.IDACCIMP, recGPDETRISCONT.CODTIPOBEN, recGPDETRISCONT.CODBENEFICIARIO, recGPDETRISCONT.CODSIOPE, recGPDETRISCONT.IDCDC, recGPDETRISCONT.IMPMANDATO, recGPDETRISCONT.IMPTRATTENUTE, recGPDETRISCONT.IMPNETTO, recGPDETRISCONT.INDSORG, recGPDETRISCONT.DESELEMENTO, recGPDETRISCONT.DESELABESTESA, recGPDETRISCONT.DESRAPPORTO, sTMSLOCK ) ; END LOOP; COMMIT; RETURN 1; EXCEPTION WHEN OTHERS THEN ROLLBACK; RETURN pkUtility.fnError( 'fnGPTMPDETRISCONTInit', SQLCODE, ERRDIAG ); END fnGPTMPDETRISCONTInit; FUNCTION fnGPRISCONTManRevTrans ( --- mandato/rev in cui spostare ( Il resto dell'AK è nella TMP con INDSORG = 'N' lCODANNOGRUPPOCONT IN pkType.tyStringa%TYPE, -- AK1 lQTAGRUPPOCONT IN pkType.tyStringa%TYPE, lCODANNOESERCIZIO IN pkType.tyStringa%TYPE, lCODPARTE IN pkType.tyStringa%TYPE, lIDCAPITOLO IN pkType.tyStringa%TYPE, lIDCDC IN pkType.tyStringa%TYPE, lCODANNOCONT IN pkType.tyStringa%TYPE, lIDACCIMP IN pkType.tyStringa%TYPE, lCODTIPOBEN IN pkType.tyStringa%TYPE, lCODBENEFICIARIO IN pkType.tyStringa%TYPE, lCODSIOPE IN pkType.tyStringa%TYPE, lCODENTEAZ IN pkType.tyStringa%TYPE, lCODSESSIONE IN pkType.tyStringa%TYPE, ERRDIAG OUT pkType.tyStringa%TYPE ) RETURN NUMERIC IS sCODPARTEDEST GPTMPDETRISCONT.CODPARTE%type; nRec NUMBER(9); sDESBENEFICIARIO GPRISCONT.DESBENEFICIARIO%type; -- estrazione dei sorgenti CURSOR curGPTMPDETRISCONTSORG IS SELECT GPTMPDETRISCONT.IDRRLAV, GPTMPDETRISCONT.IDRELAB, GPTMPDETRISCONT.CODTIPOELE, GPTMPDETRISCONT.CODANNOESERCIZIO, GPTMPDETRISCONT.CODANNOMAT, GPTMPDETRISCONT.CODPARTE, GPTMPDETRISCONT.IDCAPITOLO, GPTMPDETRISCONT.CODANNOCONT, GPTMPDETRISCONT.IDACCIMP, GPTMPDETRISCONT.CODTIPOBEN,GPTMPDETRISCONT.CODBENEFICIARIO, GPTMPDETRISCONT.CODSIOPE, GPTMPDETRISCONT.IDCDC,GPTMPDETRISCONT.IMPMANDATO,GPTMPDETRISCONT.IMPTRATTENUTE, GPTMPDETRISCONT.IMPNETTO FROM GPTMPDETRISCONT WHERE OWNER = lCODSESSIONE AND INDSORG = 'S'; nIDRRISCONT GPRISCONT.IDRRISCONT%type; BEGIN -- controllo che il CODPARTE del/la mandato/rev sorgente sia uguale a quello di destinazione SELECT COUNT(*) INTO nRec FROM GPTMPDETRISCONT WHERE OWNER = lCODSESSIONE AND INDSORG = 'S' AND CODPARTE <> lCODPARTE; -- i record non cancellabili sono quelli del Mand/Rev destinazione IF nREC > 0 THEN -- esiste un qualche dettaglio con CODPARTE differente dal Man/Rev di detinazione ERRDIAG := 'Operazione Impossibile: I dettagli da spostare devono essere dello stesso tipo del'|| ' Mandato/Reversale in cui andranno spostati'; RETURN pkUtility.fnError( 'fnGPRISCONTManRevTrans', -499, ERRDIAG ); END IF; -- cerco il desbeneficiario associato al tipo / Cod indipendentemente dalla elaborazione -- (nel caso che non trovi un record della stessa elaborazione) SELECT NVL(MAX(GPRISCONT.DESBENEFICIARIO), lCODTIPOBEN || ' - ' || lCODBENEFICIARIO) INTO sDESBENEFICIARIO FROM GPRISCONT,GPELAB WHERE CODANNOGRUPPOCONT = lCODANNOGRUPPOCONT AND QTAGRUPPOCONT = lQTAGRUPPOCONT AND CODANNOESERCIZIO = lCODANNOESERCIZIO AND CODPARTE = lCODPARTE AND IDCAPITOLO = lIDCAPITOLO AND IDCDC = lIDCDC AND CODANNOCONT = lCODANNOCONT AND IDACCIMP = lIDACCIMP AND CODTIPOBEN = lCODTIPOBEN AND CODBENEFICIARIO = lCODBENEFICIARIO AND CODSIOPE = lCODSIOPE AND GPELAB.CODENTEAZ = lCODENTEAZ AND GPELAB.IDRELAB = GPRISCONT.IDRELAB; FOR recGPDETRISCONTSORG IN curGPTMPDETRISCONTSORG LOOP -- Aggiorno/Inserisco Sorgente per il dettaglio che sto analizzando? -- PRENDO i dettagli del Sorgente ( solo i campi che compongono l'AK di GPRISCONT ) -- e cerco di estrarre gli eventuali IDRRISCONT -- Aggiorno IMPTOTMANDDET con il Totale giusto, mentre in IMPMANREV Metto la differenza fra IMPTOTMANREVNEW e IMPTOTMANREVOLD BEGIN -- vedo eventuale IDRRISCONT da dare al dettaglio SELECT IDRRISCONT INTO nIDRRISCONT FROM GPRISCONT,GPELAB WHERE GPRISCONT.IDRELAB = recGPDETRISCONTSORG.IDRELAB AND -- VADO PER ELABORAZIONE ( da questo campo -- il FE prescinde per fare le somme da attribuire ad uno stesso man/rev ) CODANNOGRUPPOCONT = lCODANNOGRUPPOCONT AND QTAGRUPPOCONT = lQTAGRUPPOCONT AND CODANNOESERCIZIO = lCODANNOESERCIZIO AND CODPARTE = lCODPARTE AND IDCAPITOLO = lIDCAPITOLO AND IDCDC = lIDCDC AND CODANNOCONT = lCODANNOCONT AND IDACCIMP = lIDACCIMP AND CODTIPOBEN = lCODTIPOBEN AND CODBENEFICIARIO = lCODBENEFICIARIO AND CODSIOPE = lCODSIOPE AND GPELAB.CODENTEAZ = lCODENTEAZ AND GPELAB.IDRELAB = GPRISCONT.IDRELAB; EXCEPTION WHEN NO_DATA_FOUND THEN -- se non c'è ( per l'Elaborazione specificata ) devo inserirlo SELECT NVL( MAX( IDRRISCONT ), 0 ) + 1 INTO nIDRRISCONT FROM GPRISCONT; INSERT INTO GPRISCONT( IDRRISCONT , IDRELAB , CODANNOGRUPPOCONT , QTAGRUPPOCONT , CODANNOESERCIZIO, CODPARTE , IDCAPITOLO , IDCDC , CODANNOCONT , IDACCIMP, CODTIPOBEN , CODBENEFICIARIO, IMPMANREV , INDCONTABILIZZATO , CODTIPOARROT, IMPARROT , DESBENEFICIARIO , CODMANREV , DTAMANREV , IDMANREV, DTASCADENZA, IMPTOTMANDDET, CODSIOPE ) VALUES( nIDRRISCONT, recGPDETRISCONTSORG.IDRELAB, lCODANNOGRUPPOCONT, lQTAGRUPPOCONT, lCODANNOESERCIZIO, lCODPARTE, lIDCAPITOLO, lIDCDC, lCODANNOCONT, NVL(lIDACCIMP,0), lCODTIPOBEN, lCODBENEFICIARIO, recGPDETRISCONTSORG.IMPMANDATO, 'N', 'A', 0, sDESBENEFICIARIO, 0, PKTYPE.DTAMIN, 0, PKTYPE.DTAMIN, recGPDETRISCONTSORG.IMPMANDATO, lCODSIOPE ); END; -- Controllo che non esista già per il Mandato Destinazione un dettaglio con identica PK -- se esiste devo : --- aggiornarne IMPMANDATO,IMPTRATTENUTE e IMPNETTO --- cancellare il sorgente; -- se NON esiste devo inserirlo SELECT COUNT(*) INTO nRec FROM GPDETRISCONT WHERE IDRRLAV = recGPDETRISCONTSORG.IDRRLAV AND IDRELAB = recGPDETRISCONTSORG.IDRELAB AND CODTIPOELE = recGPDETRISCONTSORG.CODTIPOELE AND CODANNOESERCIZIO = lCODANNOESERCIZIO AND CODANNOMAT = recGPDETRISCONTSORG.CODANNOMAT AND CODPARTE = lCODPARTE AND IDCAPITOLO = lIDCAPITOLO AND CODANNOCONT = lCODANNOCONT AND IDACCIMP = lIDACCIMP AND CODTIPOBEN = lCODTIPOBEN AND CODBENEFICIARIO = lCODBENEFICIARIO AND CODSIOPE = lCODSIOPE AND IDCDC = lIDCDC; IF nRec = 0 THEN -- se non esiste posso aggiornare vecchio record con i nuovi valori nell'AK UPDATE GPDETRISCONT SET CODANNOESERCIZIO = lCODANNOESERCIZIO, CODPARTE = lCODPARTE, IDCAPITOLO = lIDCAPITOLO, IDCDC = lIDCDC, CODANNOCONT = lCODANNOCONT, IDACCIMP = lIDACCIMP, CODTIPOBEN = lCODTIPOBEN, CODBENEFICIARIO = lCODBENEFICIARIO, CODSIOPE = lCODSIOPE, IDRRISCONT = nIDRRISCONT WHERE IDRRLAV = recGPDETRISCONTSORG.IDRRLAV AND IDRELAB = recGPDETRISCONTSORG.IDRELAB AND CODTIPOELE = recGPDETRISCONTSORG.CODTIPOELE AND CODANNOESERCIZIO = recGPDETRISCONTSORG.CODANNOESERCIZIO AND CODANNOMAT = recGPDETRISCONTSORG.CODANNOMAT AND CODPARTE = recGPDETRISCONTSORG.CODPARTE AND IDCAPITOLO = recGPDETRISCONTSORG.IDCAPITOLO AND CODANNOCONT = recGPDETRISCONTSORG.CODANNOCONT AND IDACCIMP = recGPDETRISCONTSORG.IDACCIMP AND CODTIPOBEN = recGPDETRISCONTSORG.CODTIPOBEN AND CODBENEFICIARIO = recGPDETRISCONTSORG.CODBENEFICIARIO AND CODSIOPE = recGPDETRISCONTSORG.CODSIOPE AND IDCDC = recGPDETRISCONTSORG.IDCDC; ELSE -- AGGIORNO soltanto il totale Mandato,Trattenute,Netto e cancello record che non posso -- modificare dato che esiste Già!!! UPDATE GPDETRISCONT SET IMPMANDATO = NVL( IMPMANDATO + recGPDETRISCONTSORG.IMPMANDATO, 0), IMPTRATTENUTE = NVL( IMPTRATTENUTE + recGPDETRISCONTSORG.IMPTRATTENUTE, 0), IMPNETTO = NVL( IMPNETTO + recGPDETRISCONTSORG.IMPNETTO, 0) WHERE IDRRLAV = recGPDETRISCONTSORG.IDRRLAV AND IDRELAB = recGPDETRISCONTSORG.IDRELAB AND CODTIPOELE = recGPDETRISCONTSORG.CODTIPOELE AND CODANNOESERCIZIO = lCODANNOESERCIZIO AND CODANNOMAT = recGPDETRISCONTSORG.CODANNOMAT AND CODPARTE = lCODPARTE AND IDCAPITOLO = lIDCAPITOLO AND CODANNOCONT = lCODANNOCONT AND IDACCIMP = lIDACCIMP AND CODTIPOBEN = lCODTIPOBEN AND CODBENEFICIARIO = lCODBENEFICIARIO AND CODSIOPE = lCODSIOPE AND IDCDC = lIDCDC; DELETE FROM GPDETRISCONT WHERE IDRRLAV = recGPDETRISCONTSORG.IDRRLAV AND IDRELAB = recGPDETRISCONTSORG.IDRELAB AND CODTIPOELE = recGPDETRISCONTSORG.CODTIPOELE AND CODANNOESERCIZIO = recGPDETRISCONTSORG.CODANNOESERCIZIO AND CODANNOMAT = recGPDETRISCONTSORG.CODANNOMAT AND CODPARTE = recGPDETRISCONTSORG.CODPARTE AND IDCAPITOLO = recGPDETRISCONTSORG.IDCAPITOLO AND CODANNOCONT = recGPDETRISCONTSORG.CODANNOCONT AND IDACCIMP = recGPDETRISCONTSORG.IDACCIMP AND CODTIPOBEN = recGPDETRISCONTSORG.CODTIPOBEN AND CODBENEFICIARIO = recGPDETRISCONTSORG.CODBENEFICIARIO AND IDCDC = recGPDETRISCONTSORG.IDCDC AND CODSIOPE = recGPDETRISCONTSORG.CODSIOPE; END IF; END LOOP; -- devo aggiornare i totali di GPRISCONT ( per tutti i Mandati dell'Ente Considerato ) UPDATE GPRISCONT -- old -- new SET IMPMANREV = ( SELECT IMPMANREV - IMPTOTMANDDET + NVL(SUM ( IMPMANDATO ),0) FROM GPDETRISCONT WHERE IDRRISCONT = GPRISCONT.IDRRISCONT ) WHERE CODANNOGRUPPOCONT = lCODANNOGRUPPOCONT AND QTAGRUPPOCONT = lQTAGRUPPOCONT AND IDRELAB IN ( SELECT GPELAB.IDRELAB FROM GPELAB WHERE CODENTEAZ = lCODENTEAZ ); -- METTO LA DIFFERENZA UPDATE GPRISCONT SET IMPTOTMANDDET = ( SELECT NVL(SUM ( IMPMANDATO ),0) FROM GPDETRISCONT -- nuovo WHERE IDRRISCONT = GPRISCONT.IDRRISCONT ) WHERE CODANNOGRUPPOCONT = lCODANNOGRUPPOCONT AND QTAGRUPPOCONT = lQTAGRUPPOCONT AND IDRELAB IN ( SELECT GPELAB.IDRELAB FROM GPELAB WHERE CODENTEAZ = lCODENTEAZ ); -- METTO LA SOMMA EFFETTIVA -- ripulisco la TMP DELETE FROM GPTMPDETRISCONT WHERE OWNER = lCODSESSIONE; COMMIT; RETURN 1; EXCEPTION WHEN OTHERS THEN ROLLBACK; RETURN pkUtility.fnError( 'fnGPRISCONTManRevTrans', SQLCODE, ERRDIAG ); END fnGPRISCONTManRevTrans; FUNCTION fnDelContab ( lCODANNOGRUPPOCONT IN pkType.tyStringa%TYPE, lQTAGRUPPOCONT IN pkType.tyStringa%TYPE, lCODENTEAZ IN pkType.tyStringa%TYPE, ERRDIAG OUT pkType.tyStringa%TYPE ) RETURN NUMERIC IS BEGIN -- Cancello i figli della tabella GPRISCONT DELETE FROM GPELERISCONT WHERE IDRRISCONT IN ( SELECT IDRRISCONT FROM GPELAB, GPRISCONT WHERE GPRISCONT.CODANNOGRUPPOCONT = lCODANNOGRUPPOCONT AND GPRISCONT.QTAGRUPPOCONT = lQTAGRUPPOCONT AND GPRISCONT.IDRELAB = GPELAB.IDRELAB AND GPELAB.CODENTEAZ = UPPER(lCODENTEAZ) ); DELETE FROM GPDETRISCONT WHERE IDRRISCONT IN ( SELECT IDRRISCONT FROM GPELAB, GPRISCONT WHERE GPRISCONT.CODANNOGRUPPOCONT = lCODANNOGRUPPOCONT AND GPRISCONT.QTAGRUPPOCONT = lQTAGRUPPOCONT AND GPRISCONT.IDRELAB = GPELAB.IDRELAB AND GPELAB.CODENTEAZ = UPPER(lCODENTEAZ) ); DELETE FROM GPRISCONT WHERE GPRISCONT.CODANNOGRUPPOCONT = lCODANNOGRUPPOCONT AND GPRISCONT.QTAGRUPPOCONT = lQTAGRUPPOCONT AND GPRISCONT.IDRELAB IN ( SELECT IDRELAB FROM GPELAB WHERE CODENTEAZ = UPPER(lCODENTEAZ) ); COMMIT; RETURN 1; EXCEPTION WHEN OTHERS THEN ROLLBACK; RETURN pkUtility.fnerror('fnDelContab', SQLCODE,ERRDIAG); END fnDelContab; -- Modifiche: Pace, 20020328: Nella GPRISCONT aggiorno anche IMPTOTMANDDET FUNCTION fnGPDETRISCONTUpd ( lIDRRLAV IN pkType.tyStringa%TYPE, lIDRELAB IN pkType.tyStringa%TYPE, lCODTIPOELE IN pkType.tyStringa%TYPE, lCODANNOESERCIZIO IN pkType.tyStringa%TYPE, lCODANNOMAT IN pkType.tyStringa%TYPE, lCODPARTE IN pkType.tyStringa%TYPE, lIDCAPITOLO IN pkType.tyStringa%TYPE, lCODANNOCONT IN pkType.tyStringa%TYPE, lIDACCIMP IN pkType.tyStringa%TYPE, lIDCDC IN pkType.tyStringa%TYPE, lCODTIPOBEN IN pkType.tyStringa%TYPE, lCODBENEFICIARIO IN pkType.tyStringa%TYPE, lCODSIOPE IN pkType.tyStringa%TYPE, lIDRRISCONT IN pkType.tyStringa%TYPE, lIMPMANDATONEW IN pkType.tyStringa%TYPE, lIMPMANDATOOLD IN pkType.tyStringa%TYPE, lIMPTRATTENUTE IN pkType.tyStringa%TYPE, lIMPNETTO IN pkType.tyStringa%TYPE, ERRDIAG OUT pkType.tyStringa%TYPE ) RETURN NUMERIC IS BEGIN IF lIMPMANDATONEW <> lIMPMANDATOOLD THEN UPDATE GPRISCONT SET IMPMANREV = IMPMANREV - lIMPMANDATOOLD + lIMPMANDATONEW, IMPTOTMANDDET = IMPTOTMANDDET - lIMPMANDATOOLD + lIMPMANDATONEW WHERE IDRRISCONT = lIDRRISCONT; END IF; UPDATE GPDETRISCONT SET IMPMANDATO = lIMPMANDATONEW, IMPNETTO = lIMPNETTO, IMPTRATTENUTE = lIMPTRATTENUTE WHERE IDRRLAV = lIDRRLAV AND IDRELAB = lIDRELAB AND CODTIPOELE = lCODTIPOELE AND CODANNOESERCIZIO = lCODANNOESERCIZIO AND CODANNOMAT = lCODANNOMAT AND CODPARTE = lCODPARTE AND IDCAPITOLO = lIDCAPITOLO AND CODANNOCONT = lCODANNOCONT AND IDACCIMP = lIDACCIMP AND IDCDC = lIDCDC AND CODTIPOBEN = lCODTIPOBEN AND CODBENEFICIARIO = lCODBENEFICIARIO AND CODSIOPE = lCODSIOPE; COMMIT; RETURN 1; EXCEPTION WHEN OTHERS THEN ROLLBACK; RETURN pkUtility.fnerror('fnGPDETRISCONTUpd', SQLCODE, ERRDIAG); END fnGPDETRISCONTUpd; -- Autore: SA20020114, funzione che estrae informazioni sulla Contabilizzazione FUNCTION fnCONTABILIZZAZIONEDVR ( lCODENTEAZ IN PKTYPE.TYSTRINGA%TYPE, lCODANNOGRUPPOCONT IN PKTYPE.TYSTRINGA%TYPE, lQTAGRUPPOCONT IN PKTYPE.TYSTRINGA%TYPE, lQTAGRUPPOCONTIni IN PKTYPE.TYSTRINGA%TYPE, -- gruppo contabilizzato iniziale lQTAGRUPPOCONTFine IN PKTYPE.TYSTRINGA%TYPE, -- gruppo contabilizzato finale lINDDETTAGLIO IN PKTYPE.TYSTRINGA%TYPE, -- 'S' prende i dettagli dei Mandati lINDVOX IN PKTYPE.TYSTRINGA%TYPE, -- 'S' prende i dettagli delle Voci lINDTAX IN PKTYPE.TYSTRINGA%TYPE, -- 'S' prende i dettagli delle Tasse lINDCON IN PKTYPE.TYSTRINGA%TYPE, -- 'S' prende i dettagli dei Contributi lINDONE IN PKTYPE.TYSTRINGA%TYPE, -- 'S' prende i dettagli degli Oneri lCODPARTE IN PKTYPE.TYSTRINGA%TYPE, -- 'S': Solo Parte Spesa, 'E': solo Entrata, altrimenti tutto lINDPARTITAGIRO IN PKTYPE.TYSTRINGA%TYPE, -- 'S': include le voci partita di giro, 'N': esclude le partite di giro, altirmenti entrambe lDESSCHEMASERFIN IN PKTYPE.TYSTRINGA%TYPE,-- schema dal quale prendere tabelle Contabilità, -- Se é NULL --> non esiste schema contabilità lCODSESSIONE IN PKTYPE.TYSTRINGA%TYPE, lVIEWGPRISCONT OUT PKTYPE.TYSTRINGA%TYPE, lVIEWGPDETRISCONT OUT PKTYPE.TYSTRINGA%TYPE, ERRDIAG OUT PKTYPE.TYSTRINGA%TYPE) RETURN NUMERIC IS nRet NUMBER(9); sVIEWGPRISCONT pktype.TyStringa%Type:= 'GPRISCONT'; sVIEWGPDETRISCONT pktype.TyStringa%Type:= 'GPDETRISCONT'; sQUERYGPRISCONT VARCHAR2(30000); sQUERYGPRISCONTE VARCHAR2(30000); sQUERYGPRISCONTS VARCHAR2(30000); sQUERYGPDETRISCONT VARCHAR2(30000); sQUERYIN VARCHAR2(50); -- riporta la lista dell'IN nNumRec NUMBER(9); sTpContab GPINFO.TIPOINFO%TYPE; sNomeSchema VARCHAR2(255); sNomeDBLink VARCHAR2(255); sQuery VARCHAR2(4000); BEGIN IF lDESSCHEMASERFIN IS NOT NULL THEN -- Il campo DESSCHEMASERFIN ora può essere nella forma SCHEMA@DBLINK IF INSTR(lDESSCHEMASERFIN, '@') > 0 THEN sNomeSchema := SUBSTR(lDESSCHEMASERFIN, 1, INSTR(lDESSCHEMASERFIN, '@') - 1); sNomeDBLink := SUBSTR(lDESSCHEMASERFIN, INSTR(lDESSCHEMASERFIN, '@') + 1, LENGTH(lDESSCHEMASERFIN)); ELSE sNomeSchema := lDESSCHEMASERFIN; END IF; -- controllo se esiste lo schema con descrizione passata sQuery := 'SELECT COUNT(*) FROM ALL_USERS'; IF sNomeDBLink IS NOT NULL THEN sQuery := sQuery || '@' || sNomeDBLink; END IF; sQuery := sQuery || ' WHERE USERNAME = UPPER( ''' || sNomeSchema || ''' )'; EXECUTE IMMEDIATE sQuery INTO nNumRec; IF nNumRec = 0 THEN -- ritorno Errore ROLLBACK; ERRDIAG := 'L''Ente/Azienda selezionato non esiste in Contabilità'; RETURN pkUtility.fnError( 'fnCONTABILIZZAZIONEDVR', -499, ERRDIAG ); END IF; sQuery := 'SELECT COUNT(*) FROM ALL_TABLES'; IF sNomeDBLink IS NOT NULL THEN sQuery := sQuery || '@' || sNomeDBLink; END IF; sQuery := sQuery || ' WHERE TABLE_NAME IN ( UPPER(''CFCENTRIRESPONSABILITA''), UPPER(''CFDESCENTRIRESP''), UPPER(''CFRESPONSABILI'') ) AND OWNER = UPPER( ''' || sNomeSchema || ''' )'; EXECUTE IMMEDIATE sQuery INTO nNumRec; sQuery := 'SELECT COUNT(*) + ' || nNumRec || ' FROM ALL_VIEWS'; IF sNomeDBLink IS NOT NULL THEN sQuery := sQuery || '@' || sNomeDBLink; END IF; sQuery := sQuery || ' WHERE OWNER= UPPER( ''' || sNomeSchema || ''' ) AND UPPER(VIEW_NAME)=''VWFRMDISPEXPERS'''; EXECUTE IMMEDIATE sQuery INTO nNumRec; IF nNumRec <> 4 THEN -- ritorno Errore ROLLBACK; ERRDIAG := 'Nello schema specificato non esistono alcune tabelle necessarie alla Contabilizzazione'; RETURN pkUtility.fnError( 'fnCONTABILIZZAZIONEDVR', -499, ERRDIAG ); END IF; END IF; -- vedo che tipo di contabilizzazione abbiamo: 0 = nessuna, 1= Serfin, 2 = Sistemi esterni (Studio K) SELECT NVL(MAX(CODULT),0) -- per default metto 0 = Nessuna contabilizzazione INTO sTpContab FROM GPINFO WHERE TIPOINFO= 'TPCOLCONT' AND CODINFO= UPPER(lCODENTEAZ); IF sTpContab = 0 THEN -- Caso Nessuna Contabilizzazione sQUERYGPRISCONT := 'SELECT DECODE(A.CODPARTE,''E'',''Entrata'',''S'',''Spesa'') DESPARTE, '|| ' A.IDCAPITOLO DESCAPITOLO, A.IDACCIMP || '' '' || A.CODANNOCONT DESESTESAACCIMP,'|| ' SUM(A.IMPMANREV) IMPMANREV, A.INDCONTABILIZZATO, A.DESBENEFICIARIO, A.CODMANREV, A.DTAMANREV,'|| ' B.DESCDC, A.CODPARTE, A.IDCAPITOLO, A.CODANNOCONT, A.IDACCIMP, A.IDCDC, A.CODTIPOBEN,'|| ' A.CODBENEFICIARIO, A.CODSIOPE, '''' UEB FROM GPRISCONT A, GPLCDC B, GPELAB C '|| ' WHERE C.CODENTEAZ = '''|| lCODENTEAZ ||''' AND ' || ' A.CODANNOGRUPPOCONT = ''' || lCODANNOGRUPPOCONT ||''' AND '|| ' A.INDSOSPESO = ''N'' AND'|| ' A.IDRELAB = C.IDRELAB AND A.IDCDC = B.IDRCDC(+)'; IF lQTAGRUPPOCONT IS NOT NULL THEN -- caso stampa mandati/reversali unico gruppocont sQUERYGPRISCONT := sQUERYGPRISCONT ||' AND A.QTAGRUPPOCONT = ' || lQTAGRUPPOCONT; ELSE -- caso mandati/reversali da gruppo contabile a gruppo contabile sQUERYGPRISCONT := sQUERYGPRISCONT || ' AND A.QTAGRUPPOCONT >= ''' || lQTAGRUPPOCONTIni || ''' AND ' || ' A.QTAGRUPPOCONT <= ' || lQTAGRUPPOCONTFine; END IF; IF lCODPARTE = 'E' THEN sQUERYGPRISCONT := sQUERYGPRISCONT ||' AND A.CODPARTE = ''E''' ; ELSIF lCODPARTE = 'S' THEN sQUERYGPRISCONT := sQUERYGPRISCONT ||' AND A.CODPARTE = ''S''' ; END IF; -- else non filtro nulla IF lINDPARTITAGIRO = 'S' THEN -- solo voci di partita di giro sQUERYGPRISCONT := sQUERYGPRISCONT ||' AND A.INDPARTITA = ''S'''; ELSIF lINDPARTITAGIRO = 'N' THEN -- voci che non sono partita di giro sQUERYGPRISCONT := sQUERYGPRISCONT ||' AND A.INDPARTITA = ''N'''; END IF; -- non filtro nulla quindi prendo entrambe (partite di giro e non) sQUERYGPRISCONT := sQUERYGPRISCONT || ' GROUP BY INDCONTABILIZZATO, DESBENEFICIARIO, CODMANREV, ' || 'DTAMANREV, DESCDC, CODPARTE, IDCAPITOLO, CODANNOCONT, IDACCIMP, IDCDC, CODTIPOBEN, CODBENEFICIARIO, CODSIOPE '; ELSIF sTpContab = 1 THEN -- Caso Contabilizzazione con Serfin -- query per entrata sQUERYGPRISCONTE := 'SELECT DECODE(A.CODPARTE,''E'',''Entrata'',''S'',''Spesa'') DESPARTE, ' || ' F.DESCAPITOLO, '|| ' C.DESESTESAACCIMP DESESTESAACCIMP, SUM(A.IMPMANREV) IMPMANREV, ' || 'A.INDCONTABILIZZATO, A.DESBENEFICIARIO, A.CODMANREV, A.DTAMANREV, B.DESCDC, ' || 'A.CODPARTE, A.IDCAPITOLO, A.CODANNOCONT, A.IDACCIMP, A.IDCDC, A.CODTIPOBEN, A.CODBENEFICIARIO, A.CODSIOPE, ' || 'F.UEB FROM GPLCDC B, '|| sNomeSchema||'.VWFRMDISPEXPERS'; IF sNomeDBLink IS NOT NULL THEN sQUERYGPRISCONTE := sQUERYGPRISCONTE || '@' || sNomeDBLink; END IF; sQUERYGPRISCONTE := sQUERYGPRISCONTE || ' C,'|| ' GPELAB E, GPRISCONT A,'||sNomeSchema||'.VWFRMDISPEXPERS'; IF sNomeDBLink IS NOT NULL THEN sQUERYGPRISCONTE := sQUERYGPRISCONTE || '@' || sNomeDBLink; END IF; sQUERYGPRISCONTE := sQUERYGPRISCONTE || ' F'|| ' WHERE A.CODPARTE = ''E''' || ' AND A.INDSOSPESO = ''N'''|| ' AND E.CODENTEAZ = '''|| lCODENTEAZ ||''' AND ' || ' A.CODANNOGRUPPOCONT = ''' || lCODANNOGRUPPOCONT ||''' AND '|| ' A.IDCAPITOLO = F.IDCAPITOLO AND F.CODTIPOELE=''CAPITOLO'' AND'|| ' C.CODTIPOELE(+)=''IMPACC'' AND C.APP(+)=''E'' AND C.IDACCIMP(+)=A.IDACCIMP AND'|| ' A.IDCDC = B.IDRCDC(+) ' || ' AND A.IDRELAB = E.IDRELAB '; IF lQTAGRUPPOCONT IS NOT NULL THEN -- caso stampa mandati/reversali unico gruppocont sQUERYGPRISCONTE := sQUERYGPRISCONTE || ' AND A.QTAGRUPPOCONT = ' || lQTAGRUPPOCONT; ELSE sQUERYGPRISCONTE := sQUERYGPRISCONTE || ' AND A.QTAGRUPPOCONT >= ''' || lQTAGRUPPOCONTIni ||''' AND '|| ' A.QTAGRUPPOCONT <= ' || lQTAGRUPPOCONTFine; END IF; IF lINDPARTITAGIRO = 'S' THEN -- solo voci di partita di giro sQUERYGPRISCONTE := sQUERYGPRISCONTE ||' AND A.INDPARTITA = ''S'''; ELSIF lINDPARTITAGIRO = 'N' THEN -- voci che non sono partita di giro sQUERYGPRISCONTE := sQUERYGPRISCONTE ||' AND A.INDPARTITA = ''N'''; END IF; -- non filtro nulla quindi prendo entrambe (partite di giro e non) sQUERYGPRISCONTE := sQUERYGPRISCONTE || ' GROUP BY A.CODPARTE, F.DESCAPITOLO, A.INDCONTABILIZZATO, A.DESBENEFICIARIO,'|| ' A.CODMANREV, A.DTAMANREV, B.DESCDC, A.CODPARTE, A.IDCAPITOLO, A.CODANNOCONT, A.IDACCIMP,C.DESESTESAACCIMP,'|| ' A.IDCDC, A.CODTIPOBEN, A.CODBENEFICIARIO, A.CODSIOPE, F.UEB'; -- query per spesa sQUERYGPRISCONTS := ' SELECT DECODE(A.CODPARTE,''E'',''Entrata'',''S'',''Spesa'') DESPARTE, '|| ' F.DESCAPITOLO,'|| ' C.DESESTESAACCIMP DESESTESAACCIMP, SUM(A.IMPMANREV) IMPMANREV, ' || 'A.INDCONTABILIZZATO, A.DESBENEFICIARIO, A.CODMANREV, A.DTAMANREV, B.DESCDC, ' || 'A.CODPARTE, A.IDCAPITOLO, A.CODANNOCONT, A.IDACCIMP, A.IDCDC, A.CODTIPOBEN, A.CODBENEFICIARIO, A.CODSIOPE, ' || 'F.UEB FROM GPLCDC B, '|| sNomeSchema||'.VWFRMDISPEXPERS'; IF sNomeDBLink IS NOT NULL THEN sQUERYGPRISCONTS := sQUERYGPRISCONTS || '@' || sNomeDBLink; END IF; sQUERYGPRISCONTS := sQUERYGPRISCONTS || ' C,'|| 'GPELAB E, GPRISCONT A, '||sNomeSchema||'.VWFRMDISPEXPERS'; IF sNomeDBLink IS NOT NULL THEN sQUERYGPRISCONTS := sQUERYGPRISCONTS || '@' || sNomeDBLink; END IF; sQUERYGPRISCONTS := sQUERYGPRISCONTS || ' F'|| ' WHERE A.CODPARTE = ''S''' || ' AND A.INDSOSPESO = ''N'''|| ' AND E.CODENTEAZ = '''|| lCODENTEAZ ||''' AND'|| ' A.CODANNOGRUPPOCONT = ''' || lCODANNOGRUPPOCONT ||''' AND'|| ' A.IDCAPITOLO = F.IDCAPITOLO AND F.CODTIPOELE=''CAPITOLO'' AND'|| ' C.CODTIPOELE(+)=''IMPACC'' AND C.APP(+)=''S'' AND C.IDACCIMP(+)=A.IDACCIMP AND'|| ' A.IDCDC = B.IDRCDC(+)' || ' AND A.IDRELAB = E.IDRELAB '; IF lQTAGRUPPOCONT IS NOT NULL THEN -- caso stampa mandati/reversali unico gruppocont sQUERYGPRISCONTS := sQUERYGPRISCONTS || ' AND A.QTAGRUPPOCONT = ' || lQTAGRUPPOCONT; ELSE sQUERYGPRISCONTS := sQUERYGPRISCONTS || ' AND A.QTAGRUPPOCONT >= ''' || lQTAGRUPPOCONTIni ||''' AND '|| ' A.QTAGRUPPOCONT <= ' || lQTAGRUPPOCONTFine; END IF; IF lINDPARTITAGIRO = 'S' THEN -- solo voci di partita di giro sQUERYGPRISCONTS := sQUERYGPRISCONTS ||' AND A.INDPARTITA = ''S'''; ELSIF lINDPARTITAGIRO = 'N' THEN -- voci che non sono partita di giro sQUERYGPRISCONTS := sQUERYGPRISCONTS ||' AND A.INDPARTITA = ''N'''; END IF; -- non filtro nulla quindi prendo entrambe (partite di giro e non) sQUERYGPRISCONTS := sQUERYGPRISCONTS || ' GROUP BY A.CODPARTE, F.DESCAPITOLO,C.DESESTESAACCIMP, A.INDCONTABILIZZATO, A.DESBENEFICIARIO,'|| ' A.CODMANREV, A.DTAMANREV, B.DESCDC, A.CODPARTE, A.IDCAPITOLO, A.CODANNOCONT, A.IDACCIMP, A.IDCDC,'|| ' A.CODTIPOBEN, A.CODBENEFICIARIO, A.CODSIOPE, F.UEB'; IF lCODPARTE = 'E' THEN -- entrata sQUERYGPRISCONT := sQUERYGPRISCONTE; ELSIF lCODPARTE = 'S' THEN -- spesa sQUERYGPRISCONT := sQUERYGPRISCONTS; ELSE -- prendo tutte e due sQUERYGPRISCONT := sQUERYGPRISCONTE || ' UNION '|| sQUERYGPRISCONTS; END IF; ELSIF sTpContab >= 2 THEN -- Caso Contabilizzazione con Sistemi Esterni (Studio K) sQUERYGPRISCONT := 'SELECT DECODE(A.CODPARTE,''E'',''Entrata'',''S'',''Spesa'') DESPARTE, '|| 'C.CODCAPITOLO || '' ''|| C.ANNOCAPITOLO DESCAPITOLO, '|| 'D.CODACCIMP ||'' ''|| D.ANNOACCIMP DESESTESAACCIMP, '|| 'SUM(A.IMPMANREV) IMPMANREV, A.INDCONTABILIZZATO, '|| 'A.DESBENEFICIARIO, A.CODMANREV, A.DTAMANREV, B.DESCDC, A.CODPARTE, '|| 'A.IDCAPITOLO, A.CODANNOCONT, A.IDACCIMP, A.IDCDC, A.CODTIPOBEN, '|| 'A.CODBENEFICIARIO, A.CODSIOPE, '''' UEB '|| 'FROM GPLCDC B, GPCAPSISTEXT C, GPACCIMPSE D, GPELAB E, GPRISCONT A '|| 'WHERE E.CODENTEAZ = '''|| lCODENTEAZ ||''' AND ' || 'A.CODANNOGRUPPOCONT = ''' || lCODANNOGRUPPOCONT ||''' AND '|| 'A.IDCAPITOLO = C.IDRCAPSISTEXT AND A.IDCDC = B.IDRCDC(+) AND '|| 'A.IDRELAB = E.IDRELAB AND A.IDACCIMP = D.IDRACCIMPSE(+)'; IF lQTAGRUPPOCONT IS NOT NULL THEN -- caso stampa mandati/reversali unico gruppocont sQUERYGPRISCONT := sQUERYGPRISCONT ||' AND A.QTAGRUPPOCONT = ' || lQTAGRUPPOCONT; ELSE -- caso mandati/reversali da gruppo contabile a gruppo contabile sQUERYGPRISCONT := sQUERYGPRISCONT || ' AND A.QTAGRUPPOCONT >= ''' || lQTAGRUPPOCONTIni || ''' AND ' || ' A.QTAGRUPPOCONT <= ' || lQTAGRUPPOCONTFine; END IF; IF lCODPARTE = 'E' THEN sQUERYGPRISCONT := sQUERYGPRISCONT ||' AND A.CODPARTE = ''E''' ; ELSIF lCODPARTE = 'S' THEN sQUERYGPRISCONT := sQUERYGPRISCONT ||' AND A.CODPARTE = ''S''' ; END IF; -- else non filtro nulla IF lINDPARTITAGIRO = 'S' THEN -- solo voci di partita di giro sQUERYGPRISCONT := sQUERYGPRISCONT ||' AND A.INDPARTITA = ''S'''; ELSIF lINDPARTITAGIRO = 'N' THEN -- voci che non sono partita di giro sQUERYGPRISCONT := sQUERYGPRISCONT ||' AND A.INDPARTITA = ''N'''; END IF; -- non filtro nulla quindi prendo entrambe (partite di giro e non) sQUERYGPRISCONT := sQUERYGPRISCONT || ' GROUP BY A.CODPARTE, C.CODCAPITOLO,C.ANNOCAPITOLO, ' || 'D.CODACCIMP,D.ANNOACCIMP, A.INDCONTABILIZZATO, A.DESBENEFICIARIO, A.CODMANREV, '|| 'A.DTAMANREV, B.DESCDC, A.CODPARTE, A.IDCAPITOLO, A.CODANNOCONT, '|| 'A.IDACCIMP, A.IDCDC, A.CODTIPOBEN, A.CODBENEFICIARIO, A.CODSIOPE '; END IF; -- chiude il controllo sul tipo di contabilizzazione sQUERYGPRISCONT := 'SELECT DESPARTE, DESCAPITOLO, DESESTESAACCIMP DESACCIMP, UEB, IMPMANREV, INDCONTABILIZZATO,'|| ' DESBENEFICIARIO, CODMANREV, DTAMANREV, DESCDC, CODPARTE, IDCAPITOLO, CODANNOCONT,'|| ' IDACCIMP, IDCDC, CODTIPOBEN, CODBENEFICIARIO, CODSIOPE, ROWNUM IDRGRUPPORISCONT FROM ('|| sQUERYGPRISCONT ||')'; nRet := PKUTILITYPAG.fnCreateView ( sQUERYGPRISCONT, lCodSessione, sVIEWGPRISCONT, ERRDIAG ); IF nRet < 0 THEN RETURN nRet; END IF; lVIEWGPRISCONT := sVIEWGPRISCONT; -- abbiamo fissato il CODTIPOMETA ='ACCREDITO' IF lINDDETTAGLIO = 'S' THEN sQUERYGPDETRISCONT := 'SELECT DECODE(A.CODTIPOELE,' || '''VOX'',''Voci'',''TAX'',''Tassazioni'',''CON'',''Contributi'',''ONE'',''Oneri'') DESELEMENTO, ' || 'A.CODANNOESERCIZIO, A.CODANNOMAT, A.IMPMANDATO, A.IMPTRATTENUTE, A.IMPNETTO, A.INDALLEGATO, ' || 'B.DESELAB || '' '' || B.CODANNOELAB || '' ('' || C.DESCONTRATTO || '' '' || D.DESGRPPAGA || '')'' ' || 'DESELABESTESA, A.IDCDC, A.CODTIPOBEN, A.CODBENEFICIARIO, A.CODSIOPE, ' || 'A.IDRRLAV, A.IDRELAB, A.CODTIPOELE, A.IDRRISCONT, F.IDRGRUPPORISCONT, '|| 'GPPERSONA.descognome||'' ''||GPPERSONA.desnome||'' - ''||''Rapporto: ''|| DECODE(E.codlinealav, ''D'', ''Dipendente'', ''E'', ''Extra'')||'' ''|| ''Inizio: ''||TO_CHAR(E.dtainizio, ''DD/MM/YYYY'')|| DECODE(TO_CHAR(E.dtafine, ''DD/MM/YYYY''), ''31/12/2999'', NULL, '' Fine: ''||TO_CHAR(E.dtafine, ''DD/MM/YYYY'') )|| '' Matr. ''||E.codmatricola || '' - Accredito: '' || NVL((SELECT MAX(DECODE(GPMETAVAL.CODVALLST, ''A'', GPMETAVAL.DESVALLST, ''C'', GPMETAVAL.DESVALLST, ''B'', '' '' || '' ABI: '' || CPBANCA.CODABI ||'' CAB: ''||CPAGENZIA.CODCAB ||'' C/C ''|| GPCURRICULUM.DESULT, ''Q'', GPMETAVAL.DESVALLST||'': ''||GPCURRICULUM.DESULT, GPMETAVAL.DESVALLST )) ACCREDITO FROM GPCURRICULUM, GPMETAVAL, CPAGENZIA, CPBANCA WHERE GPCURRICULUM.IDRPERSONA = E.IDRPERSONA AND GPCURRICULUM.CODTPMETA = ''ACCREDITO'' AND GPCURRICULUM.CODTPMETA = GPMETAVAL.CODTPMETA AND GPCURRICULUM.IDRVALMETA = GPMETAVAL.IDRVALMETA AND CPAGENZIA.IDRBANCA = CPBANCA.IDRBANCA(+) AND GPCURRICULUM.IDRAGENZIA = CPAGENZIA.IDRAGENZIA (+) ),''Non Definito'') DESRAPPORTO ' || 'FROM GPDETRISCONT A, GPELAB B, GPCONTRATTO C, GPGRPPAGA D, GPRAPLAV E, GPPERSONA, GPRISCONT G,'|| sVIEWGPRISCONT||' F'|| ' WHERE G.CODANNOGRUPPOCONT = ' || lCODANNOGRUPPOCONT || ' AND G.QTAGRUPPOCONT = ' ||lQTAGRUPPOCONT || ' AND G.CODPARTE = F.CODPARTE'|| ' AND G.IDCAPITOLO = F.IDCAPITOLO'|| ' AND G.CODANNOCONT = F.CODANNOCONT'|| ' AND G.IDACCIMP = F.IDACCIMP'|| ' AND NVL(G.IDCDC,0) = NVL( F.IDCDC,0 )'|| ' AND G.CODTIPOBEN = F.CODTIPOBEN'|| ' AND G.CODBENEFICIARIO = F.CODBENEFICIARIO'|| ' AND G.CODSIOPE = F.CODSIOPE ' || ' AND G.CODMANREV = F.CODMANREV'|| ' AND B.CODENTEAZ = '''||lCODENTEAZ ||''''|| ' AND A.IDRELAB = B.IDRELAB AND B.CODCONTRATTO = C.CODCONTRATTO' || ' AND B.CODGRUPPOPAGA = D.CODGRUPPOPAGA AND B.CODENTEAZ = D.CODENTEAZ' || ' AND A.IDRRISCONT = G.IDRRISCONT AND A.IDRRLAV = E.IDRRLAV'|| ' AND E.IDRPERSONA = GPPERSONA.IDRPERSONA'; IF lINDVOX = 'S' THEN -- prende i dettagli delle Voci sQUERYIN := '''VOX'','; END IF; IF lINDTAX = 'S' THEN -- prende i dettagli delle Tasse sQUERYIN := sQUERYIN|| '''TAX'','; END IF; IF lINDCON = 'S' THEN -- prende i dettagli dei Contributi sQUERYIN := sQUERYIN|| '''CON'','; END IF; IF lINDONE = 'S' THEN -- prende i dettagli degli Oneri sQUERYIN := sQUERYIN|| '''ONE'','; END IF; IF sQueryIN IS NOT NULL THEN sQUERYGPDETRISCONT := sQUERYGPDETRISCONT || ' AND A.CODTIPOELE IN ( '|| RTRIM(sQueryIN,',') || ')'; END IF; IF lCODPARTE = 'S' THEN sQUERYGPDETRISCONT := sQUERYGPDETRISCONT || ' AND G.CODPARTE = ''S'''; ELSIF lCODPARTE = 'E' THEN sQUERYGPDETRISCONT := sQUERYGPDETRISCONT || ' AND G.CODPARTE = ''E'''; END IF; -- altrimenti non filtro nRet := PKUTILITYPAG.fnCreateView ( sQUERYGPDETRISCONT, lCodSessione, sVIEWGPDETRISCONT, ERRDIAG ); IF nRet < 0 THEN RETURN nRet; END IF; lVIEWGPDETRISCONT := sVIEWGPDETRISCONT; END IF; RETURN 1; EXCEPTION WHEN OTHERS THEN ROLLBACK; RETURN pkUtility.fnError( 'fnCONTABILIZZAZIONEDVR', SQLCODE, ERRDIAG ); END fnCONTABILIZZAZIONEDVR; /* Funzione che riassume tutti i calcoli effettuati dalla contabilizzazione e li mette a confronto con gli importi originali che stanno dul Cedolino; la vista che effettua il confronto è la lVIEWTestContab che riporta il CODTIPOELE e gli importi del Cedolino insieme a quelli derivanti dalla Contabilizzazione*/ -- AS20020211: Per il Test prendo solo i cedolini con Stato = 2 FUNCTION fnTestContabDVR ( lCODENTEAZ IN PKTYPE.TYSTRINGA%TYPE, lCODANNOGRUPPOCONT IN PKTYPE.TYSTRINGA%TYPE, lQTAGRUPPOCONT IN PKTYPE.TYSTRINGA%TYPE, lCODSESSIONE IN PKTYPE.TYSTRINGA%TYPE, lVIEWCONTABVOX OUT PKTYPE.TYSTRINGA%TYPE, lVIEWCONTABCON OUT PKTYPE.TYSTRINGA%TYPE, lVIEWCONTABONE OUT PKTYPE.TYSTRINGA%TYPE, lVIEWCONTABTAX OUT PKTYPE.TYSTRINGA%TYPE, lVIEWONESUCED OUT PKTYPE.TYSTRINGA%TYPE, lVIEWTestContab OUT PKTYPE.TYSTRINGA%TYPE, ERRDIAG OUT PKTYPE.TYSTRINGA%TYPE ) RETURN NUMERIC IS nRet NUMBER(9); sVIEWCONTABVOX PKTYPE.TYSTRINGA%TYPE := 'GPCONTABVOX'; sVIEWVOXFROMCED PKTYPE.TYSTRINGA%TYPE := 'GPVOXFROMCED'; sVIEWCONTABCON PKTYPE.TYSTRINGA%TYPE := 'GPCONTABCON'; sVIEWCONTABONE PKTYPE.TYSTRINGA%TYPE := 'GPCONTABONE'; sVIEWCONTABTAX PKTYPE.TYSTRINGA%TYPE := 'GPCONTABTAX'; sVIEWONESUCED PKTYPE.TYSTRINGA%TYPE := 'GPONESUCED'; sVIEWTestContab PKTYPE.TYSTRINGA%TYPE := 'GPTESTCONTAB'; sQUERYCONTABVOX VARCHAR2(30000); sQUERYVOXFROMCED VARCHAR2(30000); sQUERYCONTABCON VARCHAR2(30000); sQUERYCONTABONE VARCHAR2(30000); sQUERYCONTABTAX VARCHAR2(30000); sQUERYONESUCED VARCHAR2(30000); sQUERYTestContab VARCHAR2(30000); nCountIDRELAB NUMBER(9); -- conta quante Elaborazioni ci sono per il gruppo Scelto BEGIN /* View per controllo voci */ sQUERYCONTABVOX := 'SELECT B.IDRRLAV, B.IDRELAB, SUM (DECODE(B.CODPARTE, ''E'', IMPMANDATO *(-1), IMPMANDATO)) IMPMANDATO'|| ' FROM GPRISCONT A, GPDETRISCONT B, GPELAB C'|| ' WHERE C.CODENTEAZ = '''|| lCODENTEAZ ||''' AND'|| -- ho messo l'Ente poichè potrei avere -- lo stesso CODANNOGRUPPOCONT e QTAGRUPPOCONT per una elaborazione che non è dell'Ente -- che sto considerando ' A.CODANNOGRUPPOCONT = ''' || lCODANNOGRUPPOCONT ||''' AND'|| ' A.QTAGRUPPOCONT = ''' || lQTAGRUPPOCONT ||''' AND'|| ' A.IDRELAB = C.IDRELAB AND'|| ' A.IDRRISCONT = B.IDRRISCONT AND'|| ' A.INDPARTITA <> ''S'' AND'|| ' B.CODTIPOELE = ''VOX'''|| ' GROUP BY B.IDRRLAV, B.IDRELAB'; nRet := PKUTILITYPAG.fnCreateView ( sQUERYCONTABVOX, lCodSessione, sVIEWCONTABVOX, ERRDIAG ); IF nRet < 0 THEN RETURN nRet; END IF; lVIEWCONTABVOX := sVIEWCONTABVOX; sQUERYVOXFROMCED := ' SELECT GPCEDOLINO.IDRRLAV, GPCEDOLINO.IDRELAB, SUM(DECODE ( GPVOCE.CODCOLONNA,''T'', GPVOXCED.IMPVOX * (-1), GPVOXCED.IMPVOX)) IMPCED FROM GPELAB, GPCEDOLINO, GPVOXCED, GPVOCE, GPVERVOCE, GPVALGRVOX WHERE GPELAB.CODENTEAZ = '''|| lCODENTEAZ ||''' AND'|| ' GPCEDOLINO.CODSTATO = 2 AND GPELAB.IDRELAB = GPCEDOLINO.IDRELAB AND GPCEDOLINO.IDRELAB = GPVOXCED.IDRELAB AND GPCEDOLINO.IDRRLAV = GPVOXCED.IDRRLAV AND GPVOXCED.CODVOCE = GPVOCE.CODVOCE AND ( GPVOCE.CODCOLONNA IN (''T'', ''C'') OR GPVOCE.CODVOCE IN (SELECT A.CODVOCEARROT FROM gpentecontr A WHERE A.CODENTEAZ = GPELAB.CODENTEAZ AND A.CODCONTRATTO = GPELAB.CODCONTRATTO UNION SELECT A.CODVOCEARRPREC FROM gpentecontr A WHERE A.CODENTEAZ = GPELAB.CODENTEAZ AND A.CODCONTRATTO = GPELAB.CODCONTRATTO)) AND GPVOCE.CODVOCE = GPVERVOCE.CODVOCE AND (GPVERVOCE.INDENTE = ''N'' OR GPVERVOCE.CODENTEAZ = GPELAB.CODENTEAZ ) AND GPVERVOCE.CODTPGRVOX = GPVALGRVOX.CODTPGRVOX AND GPVERVOCE.CODVALGRVOX = GPVALGRVOX.CODVALGRVOX AND GPVALGRVOX.INDPGIRO = ''N'' GROUP BY GPCEDOLINO.IDRRLAV, GPCEDOLINO.IDRELAB '; nRet := PKUTILITYPAG.fnCreateView ( sQUERYVOXFROMCED, lCodSessione, sVIEWVOXFROMCED, ERRDIAG ); IF nRet < 0 THEN RETURN nRet; END IF; /* View per controllo contributi */ sQUERYCONTABCON :='SELECT B.IDRRLAV, B.IDRELAB, SUM (IMPMANDATO) IMPCONTRIBUTO'|| ' FROM GPRISCONT A, GPDETRISCONT B,GPELAB C'|| ' WHERE C.CODENTEAZ = '''|| lCODENTEAZ ||''' AND'|| ' A.CODANNOGRUPPOCONT = ''' || lCODANNOGRUPPOCONT ||''' AND'|| ' A.QTAGRUPPOCONT = ''' || lQTAGRUPPOCONT ||''' AND'|| ' A.IDRELAB = C.IDRELAB AND'|| ' A.IDRRISCONT = B.IDRRISCONT AND'|| ' B.CODTIPOELE = ''CON'' AND'|| ' B.CODPARTE = ''S''' || ' GROUP BY B.IDRRLAV, B.IDRELAB' ; nRet := PKUTILITYPAG.fnCreateView ( sQUERYCONTABCON, lCodSessione, sVIEWCONTABCON, ERRDIAG ); IF nRet < 0 THEN RETURN nRet; END IF; lVIEWCONTABCON := sVIEWCONTABCON; /* View per controllo oneri */ sQUERYCONTABONE :='SELECT B.IDRRLAV, B.IDRELAB, SUM (B.IMPMANDATO) IMPONERE'|| ' FROM GPRISCONT A, GPDETRISCONT B,GPELAB C'|| ' WHERE C.CODENTEAZ = '''|| lCODENTEAZ ||''' AND'|| ' A.CODANNOGRUPPOCONT = ''' || lCODANNOGRUPPOCONT ||''' AND'|| ' A.QTAGRUPPOCONT = ''' || lQTAGRUPPOCONT ||''' AND'|| ' A.IDRELAB = C.IDRELAB AND'|| ' A.IDRRISCONT = B.IDRRISCONT AND'|| ' B.CODTIPOELE = ''ONE'' AND'|| ' B.CODPARTE = ''S''' || ' GROUP BY B.IDRRLAV, B.IDRELAB' ; nRet := PKUTILITYPAG.fnCreateView ( sQUERYCONTABONE, lCodSessione, sVIEWCONTABONE, ERRDIAG ); IF nRet < 0 THEN RETURN nRet; END IF; lVIEWCONTABONE := sVIEWCONTABONE; /* View per controllo imposte */ sQUERYCONTABTAX :='SELECT B.IDRRLAV, B.IDRELAB, SUM (B.IMPMANDATO) IMPTASSA'|| ' FROM GPRISCONT A, GPDETRISCONT B,GPELAB C'|| ' WHERE C.CODENTEAZ = '''|| lCODENTEAZ ||''' AND'|| ' A.CODANNOGRUPPOCONT = ''' || lCODANNOGRUPPOCONT ||''' AND'|| ' A.QTAGRUPPOCONT = ''' || lQTAGRUPPOCONT ||''' AND'|| ' A.IDRELAB = C.IDRELAB AND'|| ' A.IDRRISCONT = B.IDRRISCONT AND'|| ' B.CODTIPOELE = ''TAX'' AND'|| ' B.CODPARTE = ''S''' || ' GROUP BY B.IDRRLAV, B.IDRELAB' ; nRet := PKUTILITYPAG.fnCreateView ( sQUERYCONTABTAX, lCodSessione, sVIEWCONTABTAX, ERRDIAG ); IF nRet < 0 THEN RETURN nRet; END IF; lVIEWCONTABTAX := sVIEWCONTABTAX; /* View per oneri su cedolini */ sQUERYONESUCED :='SELECT B.IDRRLAV, B.IDRELAB, SUM(B.IMPTRATTENUTA) IMPONEREDACONTAB'|| ' FROM GPSOCCED B'|| ' WHERE B.IDRELAB IN ( SELECT A.IDRELAB FROM GPRISCONT A, GPELAB C WHERE'|| ' C.CODENTEAZ = '''|| lCODENTEAZ ||''' AND'|| ' A.CODANNOGRUPPOCONT = ''' || lCODANNOGRUPPOCONT ||''' AND'|| ' A.QTAGRUPPOCONT = ''' || lQTAGRUPPOCONT ||''' AND'|| ' A.IDRELAB = C.IDRELAB ) AND'|| ' B.CODTIPOSOCIALE = ''E'''|| ' GROUP BY B.IDRRLAV, B.IDRELAB' ; nRet := PKUTILITYPAG.fnCreateView ( sQUERYONESUCED, lCodSessione, sVIEWONESUCED, ERRDIAG ); IF nRet < 0 THEN RETURN nRet; END IF; lVIEWONESUCED := sVIEWONESUCED; -- devo ricavarmi gli IDRELAB delle Elaborazioni che sono state contabilizzate per il gruppo -- scelto SELECT COUNT(*) INTO nCountIDRELAB FROM GPRISCONT A,GPELAB B WHERE B.CODENTEAZ = lCODENTEAZ AND A.CODANNOGRUPPOCONT = lCODANNOGRUPPOCONT AND A.QTAGRUPPOCONT = lQTAGRUPPOCONT AND B.IDRELAB = A.IDRELAB; IF nCountIDRELAB = 0 THEN ERRDIAG := 'Non è stato contabilizzato alcun elemento del gruppo Scelto'; RETURN pkUtility.fnError( 'fnTestContab', -499, ERRDIAG ); END IF; -- Elenca i cedolini con le differenze fra il netto del Cedolino e il Netto Contabilizzato sQUERYTestContab :=' SELECT ''VOX'' CODTIPOELE, A.IDRELAB, A.IDRRLAV, A.IMPCED IMPCED, B.IMPMANDATO IMPCONT FROM '||sVIEWVOXFROMCED||' A, '||sVIEWCONTABVOX ||' B'|| ' WHERE A.IDRELAB IN ( SELECT DISTINCT GPELAB.IDRELAB FROM GPRISCONT,GPELAB WHERE GPELAB.CODENTEAZ = '''|| lCODENTEAZ ||''' AND'|| ' GPRISCONT.CODANNOGRUPPOCONT = ''' || lCODANNOGRUPPOCONT ||''' AND'|| ' GPRISCONT.QTAGRUPPOCONT = ''' || lQTAGRUPPOCONT ||''' AND'|| ' GPRISCONT.IDRELAB = GPELAB.IDRELAB ) AND A.IDRELAB = B.IDRELAB (+) AND A.IDRRLAV = B.IDRRLAV (+) AND (A.IMPCED <> B.IMPMANDATO OR (B.IMPMANDATO IS NULL AND A.IMPCED <> 0))'|| ' UNION '|| ' SELECT ''CON'' CODTIPOELE, A.IDRELAB, A.IDRRLAV, A.IMPTRSOC IMPCED, B.IMPCONTRIBUTO IMPCONT'|| ' FROM GPCEDOLINO A,'|| sVIEWCONTABCON || ' B'|| ' WHERE A.CODSTATO = ''2'' AND A.IDRELAB IN'|| '( SELECT DISTINCT GPELAB.IDRELAB FROM GPRISCONT ,GPELAB '|| ' WHERE GPELAB.CODENTEAZ = '''|| lCODENTEAZ ||''' AND'|| ' GPRISCONT.CODANNOGRUPPOCONT = ''' || lCODANNOGRUPPOCONT ||''' AND'|| ' GPRISCONT.QTAGRUPPOCONT = ''' || lQTAGRUPPOCONT ||''' AND'|| ' GPELAB.IDRELAB = GPRISCONT.IDRELAB ) AND'|| ' A.IDRELAB = B.IDRELAB (+) AND'|| ' A.IDRRLAV = B.IDRRLAV (+) AND'|| ' (A.IMPTRSOC <> B.IMPCONTRIBUTO OR'|| ' (B.IMPCONTRIBUTO IS NULL AND A.IMPTRSOC <>0))'|| ' UNION '|| ' SELECT ''TAX'' CODTIPOELE, A.IDRELAB, A.IDRRLAV, A.IMPTRFISC IMPCED, B.IMPTASSA IMPCONT'|| ' FROM GPCEDOLINO A,'|| sVIEWCONTABTAX ||' B'|| ' WHERE A.CODSTATO = ''2'' AND A.IDRELAB IN'|| '( SELECT DISTINCT GPELAB.IDRELAB FROM GPRISCONT,GPELAB '|| ' WHERE GPELAB.CODENTEAZ = '''|| lCODENTEAZ ||''' AND'|| ' GPRISCONT.CODANNOGRUPPOCONT = ''' || lCODANNOGRUPPOCONT ||''' AND'|| ' GPRISCONT.QTAGRUPPOCONT = ''' || lQTAGRUPPOCONT ||''' AND'|| ' GPELAB.IDRELAB = GPRISCONT.IDRELAB ) AND'|| ' A.IDRELAB = B.IDRELAB (+) AND'|| ' A.IDRRLAV = B.IDRRLAV (+) AND'|| ' (A.IMPTRFISC <> B.IMPTASSA OR'|| ' (B.IMPTASSA IS NULL AND A.IMPTRFISC <> 0))'|| ' UNION '|| ' SELECT ''ONE'' CODTIPOELE, A.IDRELAB, A.IDRRLAV, A.IMPONEREDACONTAB IMPCED, B.IMPONERE IMPCONT'|| ' FROM GPCEDOLINO C,'|| sVIEWONESUCED || ' A,'|| sVIEWCONTABONE ||' B'|| ' WHERE C.IDRELAB = A.IDRELAB AND C.IDRRLAV = A.IDRRLAV AND C.CODSTATO = ''2'' AND A.IDRELAB IN'|| '( SELECT DISTINCT GPELAB.IDRELAB FROM GPRISCONT ,GPELAB '|| ' WHERE GPELAB.CODENTEAZ = '''|| lCODENTEAZ ||''' AND'|| ' GPRISCONT.CODANNOGRUPPOCONT = ''' || lCODANNOGRUPPOCONT ||''' AND'|| ' GPRISCONT.QTAGRUPPOCONT = ''' || lQTAGRUPPOCONT ||''' AND'|| ' GPELAB.IDRELAB = GPRISCONT.IDRELAB ) AND'|| ' A.IDRRLAV = B.IDRRLAV (+) AND'|| ' A.IDRELAB = B.IDRELAB (+) AND'|| '(A.IMPONEREDACONTAB <> B.IMPONERE OR'|| ' (B.IMPONERE IS NULL AND A.IMPONEREDACONTAB <> 0))'; nRet := PKUTILITYPAG.fnCreateView ( sQUERYTestContab, lCodSessione, sVIEWTestContab, ERRDIAG ); IF nRet < 0 THEN RETURN nRet; END IF; lVIEWTestContab := sVIEWTestContab; RETURN 1; EXCEPTION WHEN OTHERS THEN RETURN pkUtility.fnError( 'fnTestContab', SQLCODE, ERRDIAG ); END fnTestContabDVR ; FUNCTION fnTestDispContDVR ( lCODENTEAZ IN PKTYPE.TYSTRINGA%TYPE, lCODANNOGRUPPOCONT IN PKTYPE.TYSTRINGA%TYPE, lQTAGRUPPOCONT IN PKTYPE.TYSTRINGA%TYPE, lDESSCHEMASERFIN IN PKTYPE.TYSTRINGA%TYPE,-- schema dal quale prendere tabelle Contabilità, -- Se é NULL --> non esiste schema contabilità lCODSESSIONE IN PKTYPE.TYSTRINGA%TYPE, lVIEWTestCont OUT PKTYPE.TYSTRINGA%TYPE, ERRDIAG OUT PKTYPE.TYSTRINGA%TYPE ) RETURN NUMERIC IS nNumRec NUMBER(9); nRet NUMBER(9); sQUERYTESTCONT VARCHAR2(30000); sVIEWTESTCONT VARCHAR2(50) := 'TSTDISPCONT'; sTPCOLCONT VARCHAR2(2); sNomeSchema VARCHAR2(255); sNomeDBLink VARCHAR2(255); sQuery VARCHAR2(4000); BEGIN SELECT NVL(MAX(CODULT),1) -- per default metto Contabilizzazione con Serfin INTO sTPCOLCONT FROM GPINFO WHERE TIPOINFO = 'TPCOLCONT' AND CODINFO = UPPER(lCODENTEAZ); IF sTPCOLCONT = 1 THEN IF lDESSCHEMASERFIN IS NULL THEN RETURN 1; END IF; -- Il campo DESSCHEMASERFIN ora può essere nella forma SCHEMA@DBLINK IF INSTR(lDESSCHEMASERFIN, '@') > 0 THEN sNomeSchema := SUBSTR(lDESSCHEMASERFIN, 1, INSTR(lDESSCHEMASERFIN, '@') - 1); sNomeDBLink := SUBSTR(lDESSCHEMASERFIN, INSTR(lDESSCHEMASERFIN, '@') + 1, LENGTH(lDESSCHEMASERFIN)); ELSE sNomeSchema := lDESSCHEMASERFIN; END IF; -- controllo se esiste lo schema con descrizione passata sQuery := 'SELECT COUNT(*) FROM ALL_USERS'; IF sNomeDBLink IS NOT NULL THEN sQuery := sQuery || '@' || sNomeDBLink; END IF; sQuery := sQuery || ' WHERE USERNAME = UPPER( ''' || sNomeSchema || ''' )'; EXECUTE IMMEDIATE sQuery INTO nNumRec; IF nNumRec = 0 THEN -- ritorno Errore ROLLBACK; ERRDIAG := 'L''Ente/Azienda selezionato non esiste in Contabilità'; RETURN pkUtility.fnError( 'fnTestDispContDVR', -499, ERRDIAG ); END IF; sQuery := 'SELECT COUNT(*) FROM ALL_VIEWS'; IF sNomeDBLink IS NOT NULL THEN sQuery := sQuery || '@' || sNomeDBLink; END IF; sQuery := sQuery || ' WHERE OWNER = UPPER( ''' || sNomeSchema || ''' ) AND UPPER(VIEW_NAME)=''VWFRMDISPEXPERS'''; EXECUTE IMMEDIATE sQuery INTO nNumRec; IF nNumRec <> 1 THEN -- ritorno Errore ROLLBACK; ERRDIAG := 'Nello schema specificato non esistono alcune tabelle necessarie alla Contabilizzazione'; RETURN pkUtility.fnError( 'fnTestDispContDVR', -499, ERRDIAG ); END IF; sQUERYTESTCONT := 'SELECT CODTIPOELE,IDCAPITOLO,ESER,CAP,ART,DESCAPITOLO,IDACCIMP,ESERACCIMP, NUMACCIMP, DESESTESAACCIMP,IMPDISPONIBILITA,IMPMANDATO FROM ( SELECT ''CAPITOLO'' CODTIPOELE,A.IDCAPITOLO, A.ESER, A.CAP, A.ART, A.CODCDR, A.DESCAPITOLO, TO_NUMBER(NULL) IDACCIMP, TO_NUMBER(NULL) ESERACCIMP, TO_NUMBER(NULL) NUMACCIMP, NULL DESESTESAACCIMP, A.DISPONIBILITA IMPDISPONIBILITA, IMPMANDATO FROM '||sNomeSchema||'.VWFRMDISPEXPERS'; IF sNomeDBLink IS NOT NULL THEN sQUERYTESTCONT := sQUERYTESTCONT || '@' || sNomeDBLink; END IF; sQUERYTESTCONT := sQUERYTESTCONT || ' A, ( SELECT IDCAPITOLO, SUM(IMPMANREV) IMPMANDATO FROM GPRISCONT, GPELAB WHERE CODANNOGRUPPOCONT = ''' || lCODANNOGRUPPOCONT ||''' AND QTAGRUPPOCONT = ''' || lQTAGRUPPOCONT ||''' AND GPRISCONT.CODPARTE = ''S'' AND -- controllo solo la parte spesa IDACCIMP = ''0'' AND -- non ha impegni specificati GPELAB.CODENTEAZ = ''' || lCODENTEAZ ||''' AND GPELAB.IDRELAB = GPRISCONT.IDRELAB GROUP BY IDCAPITOLO ) MANPAGHE WHERE A.CODTIPOELE = ''CAPITOLO'' AND MANPAGHE.IDCAPITOLO = A.IDCAPITOLO(+) GROUP BY A.IDCAPITOLO, A.ESER, A.CAP, A.ART,A.CODCDR,A.DESCAPITOLO,A.DISPONIBILITA,IMPMANDATO UNION SELECT ''IMPEGNO'' CODTIPOELE,A.IDCAPITOLO, A.ESER, A.CAP, A.ART, A.CODCDR,A.DESCAPITOLO, A.IDACCIMP IDACCIMP, A.ESER ESERACCIMP, A.NUMACCIMP NUMACCIMP, A.DESESTESAACCIMP, A.DISPONIBILITA IMPDISPONIBILITA, IMPMANDATO FROM '||sNomeSchema||'.VWFRMDISPEXPERS'; IF sNomeDBLink IS NOT NULL THEN sQUERYTESTCONT := sQUERYTESTCONT || '@' || sNomeDBLink; END IF; sQUERYTESTCONT := sQUERYTESTCONT || ' A, ( SELECT IDCAPITOLO,IDACCIMP, SUM(IMPMANREV) IMPMANDATO FROM GPRISCONT, GPELAB WHERE CODANNOGRUPPOCONT = ''' || lCODANNOGRUPPOCONT ||''' AND QTAGRUPPOCONT = ''' || lQTAGRUPPOCONT ||''' AND GPRISCONT.CODPARTE = ''S'' AND -- controllo solo la parte spesa GPELAB.CODENTEAZ = ''' || lCODENTEAZ ||''' AND GPELAB.IDRELAB = GPRISCONT.IDRELAB GROUP BY IDCAPITOLO,IDACCIMP ) MANPAGHE WHERE A.CODTIPOELE = ''IMPACC'' AND A.APP=''S'' AND MANPAGHE.IDCAPITOLO = A.IDCAPITOLO AND MANPAGHE.IDACCIMP = A.IDACCIMP ) WHERE IMPDISPONIBILITA < IMPMANDATO'; nRet := PKUTILITYPAG.fnCreateView ( sQUERYTESTCONT, lCodSessione, sVIEWTESTCONT, ERRDIAG ); IF nRet < 0 THEN RETURN nRet; END IF; lVIEWTESTCONT := sVIEWTESTCONT; END IF; RETURN 1; EXCEPTION WHEN OTHERS THEN RETURN pkUtility.fnError( 'fnTestDispContDVR', SQLCODE, ERRDIAG ); END fnTestDispContDVR; FUNCTION fnTestBenefDVR ( lCODENTEAZ IN PKTYPE.TYSTRINGA%TYPE, lCODANNOGRUPPOCONT IN PKTYPE.TYSTRINGA%TYPE, lQTAGRUPPOCONT IN PKTYPE.TYSTRINGA%TYPE, lCODSESSIONE IN PKTYPE.TYSTRINGA%TYPE, lVIEWTestBen OUT PKTYPE.TYSTRINGA%TYPE, ERRDIAG OUT PKTYPE.TYSTRINGA%TYPE ) RETURN NUMERIC IS nRet NUMBER(9); sQUERYTESTBEN VARCHAR2(30000); sVIEWTESTBEN VARCHAR2(50) := 'TSTBENEF'; BEGIN sQUERYTESTBEN := 'SELECT A.CODTIPOBEN, A.CODBENEFICIARIO, C.DESBENEFICIARIO, B.IDDEBBEN FROM GPELAB, GPRISCONT A,GPDEBBEN B, vwBENEFICIARIO C WHERE A.CODANNOGRUPPOCONT ='|| lCODANNOGRUPPOCONT ||' AND A.QTAGRUPPOCONT ='|| lQTAGRUPPOCONT ||' AND A.IDRELAB = GPELAB.IDRELAB AND GPELAB.CODENTEAZ = '''|| lCODENTEAZ ||''' AND A.CODTIPOBEN = B.CODTIPOBEN(+) AND A.CODBENEFICIARIO = B.CODBENEFICIARIO(+) AND B.CODENTEAZ(+)='''||lCODENTEAZ||''' AND A.CODTIPOBEN = C.CODTIPOSOGG AND A.CODBENEFICIARIO = C.CODBENEFICIARIO AND B.IDDEBBEN IS NULL GROUP BY A.CODTIPOBEN, A.CODBENEFICIARIO, C.DESBENEFICIARIO, B.IDDEBBEN UNION SELECT A.CODTIPOBEN, A.CODBENEFICIARIO, C.DESBENEFICIARIO, B.IDDEBBEN FROM GPRISCONT A,GPDEBBEN B,vwBENEFICIARIO C, GPELAB WHERE A.CODANNOGRUPPOCONT ='|| lCODANNOGRUPPOCONT ||' AND A.QTAGRUPPOCONT ='|| lQTAGRUPPOCONT ||' AND A.IDRELAB = GPELAB.IDRELAB AND GPELAB.CODENTEAZ = '''|| lCODENTEAZ ||''' AND A.CODTIPOBEN = B.CODTIPOBEN AND A.CODBENEFICIARIO = B.CODBENEFICIARIO AND B.CODENTEAZ='''||lCODENTEAZ||''' AND INDESISTE = ''N'' AND A.CODTIPOBEN = C.CODTIPOSOGG AND A.CODBENEFICIARIO = C.CODBENEFICIARIO GROUP BY A.CODTIPOBEN, A.CODBENEFICIARIO, C.DESBENEFICIARIO, B.IDDEBBEN'; nRet := PKUTILITYPAG.fnCreateView ( sQUERYTESTBEN, lCodSessione, sVIEWTESTBEN, ERRDIAG ); IF nRet < 0 THEN RETURN nRet; END IF; lVIEWTESTBEN := sVIEWTESTBEN; RETURN 1; EXCEPTION WHEN OTHERS THEN RETURN pkUtility.fnError( 'fnTestBenefDVR', SQLCODE, ERRDIAG ); END fnTestBenefDVR; -- SA20020328, funzione di controllo sia sui singoli mandati/reversali che sull'Importo totale di essi FUNCTION fnTestIMPMANREVDVR ( lCODENTEAZ IN PKTYPE.TYSTRINGA%TYPE, lCODANNOGRUPPOCONT IN PKTYPE.TYSTRINGA%TYPE, lQTAGRUPPOCONT IN PKTYPE.TYSTRINGA%TYPE, lDESSCHEMASERFIN IN PKTYPE.TYSTRINGA%TYPE,-- schema dal quale prendere tabelle Contabilità, -- Se é NULL --> non esiste schema contabilità lCODSESSIONE IN PKTYPE.TYSTRINGA%TYPE, lVIEWIMPMANREVDIFF OUT PKTYPE.TYSTRINGA%TYPE,-- riporta la lista dei mandati/reversali che hanno delle differenze fra l'IMPORTO CALCOLATO -- e l'IMPORTO MODIFICATO dall'utente lIMPMANLst OUT PKTYPE.TYSTRINGA%TYPE,-- IMPCALCOLATO||§||IMPMODIFICATO per la somma dei mandati lIMPREVLst OUT PKTYPE.TYSTRINGA%TYPE,-- IMPCALCOLATO||§||IMPMODIFICATO per la somma delle reversali ERRDIAG OUT PKTYPE.TYSTRINGA%TYPE ) RETURN NUMERIC IS nRet NUMBER(9); sQUERYIMPMANREV VARCHAR2(30000); sVIEWIMPMANREVDIFF VARCHAR2(50) := 'GPIMPMANREV'; sNomeSchema VARCHAR2(255); sNomeDBLink VARCHAR2(255); CURSOR curIMPMANREV IS SELECT A.CODPARTE, SUM(A.IMPMANREV) IMPMANREV, SUM(A.IMPTOTMANDDET) IMPTOTMANDDET FROM GPRISCONT A, GPELAB C WHERE C.CODENTEAZ = lCODENTEAZ AND A.CODANNOGRUPPOCONT = lCODANNOGRUPPOCONT AND A.QTAGRUPPOCONT = lQTAGRUPPOCONT AND A.IDRELAB = C.IDRELAB GROUP BY CODPARTE; sTpCont GPINFO.TIPOINFO%TYPE; BEGIN SELECT MAX(CODULT) INTO sTpCont FROM GPINFO WHERE TIPOINFO='TPCOLCONT' AND CODINFO=lCODENTEAZ; IF sTpCont = 1 THEN --SERFIN -- Il campo DESSCHEMASERFIN ora può essere nella forma SCHEMA@DBLINK IF INSTR(lDESSCHEMASERFIN, '@') > 0 THEN sNomeSchema := SUBSTR(lDESSCHEMASERFIN, 1, INSTR(lDESSCHEMASERFIN, '@') - 1); sNomeDBLink := SUBSTR(lDESSCHEMASERFIN, INSTR(lDESSCHEMASERFIN, '@') + 1, LENGTH(lDESSCHEMASERFIN)); ELSE sNomeSchema := lDESSCHEMASERFIN; END IF; sQUERYIMPMANREV := 'SELECT DECODE(A.CODPARTE,''E'',''Entrata'',''S'',''Spesa'') DESPARTE, ' || ' C.CAP||''/''|| C.ART || '' ('' || C.APP || '')''||'' ''|| C.ESER DESCAPITOLO, '|| ' D.NUMACC ||'' ''|| D.ESER DESACCIMP, SUM(A.IMPMANREV) IMPMANREV, SUM(A.IMPTOTMANDDET) IMPTOTMANDDET,' || ' A.DESBENEFICIARIO, A.CODMANREV, A.DTAMANREV, B.DESCDC, ' || 'A.CODPARTE, A.IDCAPITOLO, A.CODANNOCONT, A.IDACCIMP, A.IDCDC, A.CODTIPOBEN, A.CODBENEFICIARIO, A.CODANNOESERCIZIO'|| ' FROM GPLCDC B, '|| sNomeSchema||'.CFCAPITOLIPEG'; IF sNomeDBLink IS NOT NULL THEN sQUERYIMPMANREV := sQUERYIMPMANREV || '@' || sNomeDBLink; END IF; sQUERYIMPMANREV := sQUERYIMPMANREV || ' C,'|| sNomeSchema||'.CFACCERTAMENTI'; IF sNomeDBLink IS NOT NULL THEN sQUERYIMPMANREV := sQUERYIMPMANREV || '@' || sNomeDBLink; END IF; sQUERYIMPMANREV := sQUERYIMPMANREV || ' D,'|| ' GPELAB E, GPRISCONT A'|| ' WHERE A.CODPARTE = ''E''' || ' AND E.CODENTEAZ = '''|| lCODENTEAZ ||''' AND'|| ' A.CODANNOGRUPPOCONT = ''' || lCODANNOGRUPPOCONT ||''' AND'|| ' A.QTAGRUPPOCONT = ''' || lQTAGRUPPOCONT ||''' AND'|| ' A.IDCAPITOLO = C.IDCAPITOLO AND A.IDCDC = B.IDRCDC(+)' || ' AND A.IDRELAB = E.IDRELAB AND A.IDACCIMP = D.IDACC(+)'|| ' GROUP BY A.CODPARTE, C.CAP,C.ART, C.APP, C.ESER, D.NUMACC, D.ESER, A.DESBENEFICIARIO,'|| ' A.CODMANREV, A.DTAMANREV, B.DESCDC, A.CODPARTE, A.IDCAPITOLO, A.CODANNOCONT, A.IDACCIMP,'|| ' A.IDCDC, A.CODTIPOBEN, A.CODBENEFICIARIO, A.CODANNOESERCIZIO'|| ' HAVING SUM(A.IMPMANREV) <> SUM(A.IMPTOTMANDDET)'|| ' UNION'|| ' SELECT DECODE(A.CODPARTE,''E'',''Entrata'',''S'',''Spesa'') DESPARTE, '|| ' C.CAP||''/''|| C.ART || '' ('' || C.APP || '')'' ||'' ''|| C.ESER DESCAPITOLO,'|| ' D.NUMIMP ||'' ''|| D.ESER DESACCIMP, SUM(A.IMPMANREV) IMPMANREV, SUM(A.IMPTOTMANDDET) IMPTOTMANDDET,' || ' A.DESBENEFICIARIO, A.CODMANREV, A.DTAMANREV, B.DESCDC, ' || 'A.CODPARTE, A.IDCAPITOLO, A.CODANNOCONT, A.IDACCIMP, A.IDCDC, A.CODTIPOBEN, A.CODBENEFICIARIO, A.CODANNOESERCIZIO'|| ' FROM GPLCDC B, '|| sNomeSchema||'.CFCAPITOLIPEG'; IF sNomeDBLink IS NOT NULL THEN sQUERYIMPMANREV := sQUERYIMPMANREV || '@' || sNomeDBLink; END IF; sQUERYIMPMANREV := sQUERYIMPMANREV || ' C,'|| sNomeSchema||'.CFIMPEGNI'; IF sNomeDBLink IS NOT NULL THEN sQUERYIMPMANREV := sQUERYIMPMANREV || '@' || sNomeDBLink; END IF; sQUERYIMPMANREV := sQUERYIMPMANREV || ' D,'|| 'GPELAB E, GPRISCONT A '|| ' WHERE A.CODPARTE = ''S''' || ' AND E.CODENTEAZ = '''|| lCODENTEAZ ||''' AND'|| ' A.CODANNOGRUPPOCONT = ''' || lCODANNOGRUPPOCONT ||''' AND'|| ' A.QTAGRUPPOCONT = ''' || lQTAGRUPPOCONT ||''' AND'|| ' A.IDCAPITOLO = C.IDCAPITOLO AND A.IDCDC = B.IDRCDC(+)' || ' AND A.IDRELAB = E.IDRELAB AND A.IDACCIMP = D.IDIMP(+)'|| ' GROUP BY A.CODPARTE, C.CAP,C.ART,C.APP, C.ESER, D.NUMIMP , D.ESER, A.DESBENEFICIARIO,'|| ' A.CODMANREV, A.DTAMANREV, B.DESCDC, A.CODPARTE, A.IDCAPITOLO, A.CODANNOCONT, A.IDACCIMP, A.IDCDC,'|| ' A.CODTIPOBEN, A.CODBENEFICIARIO, A.CODANNOESERCIZIO'|| ' HAVING SUM(A.IMPMANREV) <> SUM(A.IMPTOTMANDDET)'; ELSIF sTpCont = 0 THEN sQUERYIMPMANREV := 'SELECT DECODE(A.CODPARTE,''E'',''Entrata'',''S'',''Spesa'') DESPARTE, A.IDCAPITOLO DESCAPITOLO, ' || 'A.IDACCIMP || '' '' || A.CODANNOCONT DESACCIMP, SUM(A.IMPMANREV) IMPMANREV, ' || 'SUM(A.IMPTOTMANDDET) IMPTOTMANDDET, A.DESBENEFICIARIO, A.CODMANREV, A.DTAMANREV, B.DESCDC, ' || 'A.CODPARTE, A.IDCAPITOLO, A.CODANNOCONT, A.IDACCIMP, A.IDCDC, A.CODTIPOBEN, ' || 'A.CODBENEFICIARIO, A.CODANNOESERCIZIO' || ' FROM GPRISCONT A, GPLCDC B, GPELAB C' || ' WHERE C.CODENTEAZ = ''' ||lCODENTEAZ ||''''|| ' AND A.CODANNOGRUPPOCONT = '''|| lCODANNOGRUPPOCONT||''''|| ' AND A.QTAGRUPPOCONT = ''' || lQTAGRUPPOCONT ||''''|| ' AND A.IDRELAB = C.IDRELAB AND A.IDCDC = B.IDRCDC(+)'|| ' GROUP BY DESBENEFICIARIO, CODMANREV, ' || ' DTAMANREV, DTASCADENZA, DESCDC, CODPARTE, IDCAPITOLO, CODANNOCONT, IDACCIMP, IDCDC, ' || ' CODTIPOBEN, CODBENEFICIARIO, CODANNOESERCIZIO'|| ' HAVING SUM(A.IMPMANREV) <> SUM(A.IMPTOTMANDDET)'; ELSE --Cont.Esterna sQUERYIMPMANREV := 'SELECT DECODE(A.CODPARTE,''E'',''Entrata'',''S'',''Spesa'') DESPARTE, ' || ' C.CODCAPITOLO|| '' ('' || A.CODPARTE || '')'' || '' ''|| C.ANNOCAPITOLO DESCAPITOLO, '|| ' D.CODACCIMP ||'' ''|| D.ANNOACCIMP DESACCIMP, SUM(A.IMPMANREV) IMPMANREV, SUM(A.IMPTOTMANDDET) IMPTOTMANDDET,' || ' A.DESBENEFICIARIO, A.CODMANREV, A.DTAMANREV, B.DESCDC, ' || 'A.CODPARTE, A.IDCAPITOLO, A.CODANNOCONT, A.IDACCIMP, A.IDCDC, A.CODTIPOBEN, A.CODBENEFICIARIO, A.CODANNOESERCIZIO'|| ' FROM GPLCDC B, GPCAPSISTEXT C, GPACCIMPSE D,'|| ' GPELAB E, GPRISCONT A'|| ' WHERE E.CODENTEAZ = '''|| lCODENTEAZ ||''' AND'|| ' A.CODANNOGRUPPOCONT = ''' || lCODANNOGRUPPOCONT ||''' AND'|| ' A.QTAGRUPPOCONT = ''' || lQTAGRUPPOCONT ||''' AND'|| ' A.IDCAPITOLO = C.IDRCAPSISTEXT AND A.IDCDC = B.IDRCDC(+)' || ' AND A.IDRELAB = E.IDRELAB AND A.IDACCIMP = D.IDRACCIMPSE(+)'|| ' GROUP BY A.CODPARTE, C.CODCAPITOLO,C.ANNOCAPITOLO, D.CODACCIMP,D.ANNOACCIMP, A.DESBENEFICIARIO,'|| ' A.CODMANREV, A.DTAMANREV, B.DESCDC, A.CODPARTE, A.IDCAPITOLO, A.CODANNOCONT, A.IDACCIMP,'|| ' A.IDCDC, A.CODTIPOBEN, A.CODBENEFICIARIO, A.CODANNOESERCIZIO'|| ' HAVING SUM(A.IMPMANREV) <> SUM(A.IMPTOTMANDDET)'; END IF; nRet := PKUTILITYPAG.fnCreateView ( sQUERYIMPMANREV, lCodSessione, sVIEWIMPMANREVDIFF, ERRDIAG ); IF nRet < 0 THEN RETURN nRet; END IF; lVIEWIMPMANREVDIFF:= sVIEWIMPMANREVDIFF; FOR recIMPMANREV IN curIMPMANREV LOOP IF recIMPMANREV.CODPARTE= 'E' THEN lIMPREVLst := recIMPMANREV.IMPTOTMANDDET||'§'||recIMPMANREV.IMPMANREV; ELSE lIMPMANLst := recIMPMANREV.IMPTOTMANDDET||'§'||recIMPMANREV.IMPMANREV; END IF; END LOOP; RETURN 1; EXCEPTION WHEN OTHERS THEN RETURN pkUtility.fnError( 'fnTestIMPMANREVDVR', SQLCODE, ERRDIAG ); END fnTestIMPMANREVDVR; FUNCTION fnGPCredDebDVR ( lDESSCHEMASERFIN IN PKTYPE.TYSTRINGA%TYPE, lCODSESSIONE IN PKTYPE.TYSTRINGA%TYPE, lVIEWCredDeb OUT PKTYPE.TYSTRINGA%TYPE, ERRDIAG OUT PKTYPE.TYSTRINGA%TYPE ) RETURN NUMERIC IS nNumRec NUMBER(9); nRet NUMBER(9); sQUERYCredDeb VARCHAR2(30000); sVIEWCredDeb VARCHAR2(50) := 'GPCREDDEB'; sNomeSchema VARCHAR2(255); sNomeDBLink VARCHAR2(255); sQuery VARCHAR2(4000); BEGIN -- Il campo DESSCHEMASERFIN ora può essere nella forma SCHEMA@DBLINK IF INSTR(lDESSCHEMASERFIN, '@') > 0 THEN sNomeSchema := SUBSTR(lDESSCHEMASERFIN, 1, INSTR(lDESSCHEMASERFIN, '@') - 1); sNomeDBLink := SUBSTR(lDESSCHEMASERFIN, INSTR(lDESSCHEMASERFIN, '@') + 1, LENGTH(lDESSCHEMASERFIN)); ELSE sNomeSchema := lDESSCHEMASERFIN; END IF; -- controllo se esiste lo schema con descrizione passata sQuery := 'SELECT COUNT(*) FROM ALL_USERS'; IF sNomeDBLink IS NOT NULL THEN sQuery := sQuery || '@' || sNomeDBLink; END IF; sQuery := sQuery || ' WHERE USERNAME = UPPER( ''' || sNomeSchema || ''' )'; EXECUTE IMMEDIATE sQuery INTO nNumRec; IF nNumRec = 0 THEN -- ritorno Errore ROLLBACK; ERRDIAG := 'L''Ente/Azienda selezionato non esiste in Contabilità'; RETURN pkUtility.fnError( 'fnGPCredDebDVR', -499, ERRDIAG ); END IF; sQUERYCredDeb := -- Diversi ha sempre Ragione Sociale 'SELECT A.IDCREDDEB, DECODE( A.FLTIPOSOGG, ''F'', A.COGNOME||'' ''|| A.NOME,''G'',A.RAGSOC, ''D'', A.RAGSOC ) DESBENEFICIARIO'|| ' FROM '|| sNomeSchema||'.CFANAGRCREDDEB'; IF sNomeDBLink IS NOT NULL THEN sQUERYCredDeb := sQUERYCredDeb || '@' || sNomeDBLink; END IF; sQUERYCredDeb := sQUERYCredDeb || ' A'; nRet := PKUTILITYPAG.fnCreateView ( sQUERYCredDeb, lCodSessione, sVIEWCredDeb, ERRDIAG ); IF nRet < 0 THEN RETURN nRet; END IF; lVIEWCredDeb := sVIEWCredDeb; RETURN 1; EXCEPTION WHEN OTHERS THEN RETURN pkUtility.fnError( 'fnGPCredDebDVR', SQLCODE, ERRDIAG ); END fnGPCredDebDVR; -- la funzione seguente inserisce i collegamenti se non esistono o li aggiorna se già esistono mettendo -- eventualmente il flag INDESISTE a 'N' se l'IDDEBBEN è null FUNCTION fnGPDebBenInsUpd ( lCODENTEAZ IN PKTYPE.TYSTRINGA%TYPE, lCODTIPOBENLst1 IN PKTYPE.TYSTRINGA%TYPE, lCODTIPOBENLst2 IN PKTYPE.TYSTRINGA%TYPE, lCODTIPOBENLst3 IN PKTYPE.TYSTRINGA%TYPE, lCODTIPOBENLst4 IN PKTYPE.TYSTRINGA%TYPE, lCODTIPOBENLst5 IN PKTYPE.TYSTRINGA%TYPE, lCODTIPOBENLst6 IN PKTYPE.TYSTRINGA%TYPE, lCODBENEFICIARIOLst1 IN PKTYPE.TYSTRINGA%TYPE, lCODBENEFICIARIOLst2 IN PKTYPE.TYSTRINGA%TYPE, lCODBENEFICIARIOLst3 IN PKTYPE.TYSTRINGA%TYPE, lCODBENEFICIARIOLst4 IN PKTYPE.TYSTRINGA%TYPE, lCODBENEFICIARIOLst5 IN PKTYPE.TYSTRINGA%TYPE, lCODBENEFICIARIOLst6 IN PKTYPE.TYSTRINGA%TYPE, lIDDEBBENLst1 IN PKTYPE.TYSTRINGA%TYPE, lIDDEBBENLst2 IN PKTYPE.TYSTRINGA%TYPE, lIDDEBBENLst3 IN PKTYPE.TYSTRINGA%TYPE, lIDDEBBENLst4 IN PKTYPE.TYSTRINGA%TYPE, lIDDEBBENLst5 IN PKTYPE.TYSTRINGA%TYPE, lIDDEBBENLst6 IN PKTYPE.TYSTRINGA%TYPE, lCODSESSIONE IN PKTYPE.TYSTRINGA%TYPE, ERRDIAG OUT PKTYPE.TYSTRINGA%TYPE ) RETURN NUMERIC IS nRet NUMBER(9); sCODTIPOBENLst VARCHAR2(1600) :=lCODTIPOBENLst1||lCODTIPOBENLst2||lCODTIPOBENLst3|| lCODTIPOBENLst4||lCODTIPOBENLst5||lCODTIPOBENLst6; sCODBENEFICIARIOLst VARCHAR2(1600) := lCODBENEFICIARIOLst1||lCODBENEFICIARIOLst2||lCODBENEFICIARIOLst3|| lCODBENEFICIARIOLst4||lCODBENEFICIARIOLst5||lCODBENEFICIARIOLst6; sIDDEBBENLst VARCHAR2(1600) := lIDDEBBENLst1||lIDDEBBENLst2||lIDDEBBENLst3||lIDDEBBENLst4|| lIDDEBBENLst5||lIDDEBBENLst6; nLastCODTIPOBEN NUMBER(9); nLastCODBENEFICIARIO NUMBER(9); nLastIDDEBBEN NUMBER(9); lTCODTIPOBEN PKTYPE.TYTSTRINGA; lTCODBENEFICIARIO PKTYPE.TYTSTRINGA; lTIDDEBBEN PKTYPE.TYTSTRINGA; BEGIN IF sCODTIPOBENLst IS NOT NULL THEN -- splitto le stringhe nRet := PKUTILITY.fnRealSplit( sCODTIPOBENLst,'§','',nLastCODTIPOBEN,ERRDIAG,lTCODTIPOBEN); IF nRet < 0 THEN RETURN nRet; END IF; END IF; IF sCODBENEFICIARIOLst IS NOT NULL THEN -- splitto le stringhe nRet := PKUTILITY.fnRealSplit( sCODBENEFICIARIOLst,'§','',nLastCODBENEFICIARIO,ERRDIAG,lTCODBENEFICIARIO); IF nRet < 0 THEN RETURN nRet; END IF; END IF; IF sIDDEBBENLst IS NOT NULL THEN -- splitto le stringhe nRet := PKUTILITY.fnRealSplit( sIDDEBBENLst,'§','',nLastIDDEBBEN,ERRDIAG,lTIDDEBBEN); IF nRet < 0 THEN RETURN nRet; END IF; END IF; -- una volta traslate le liste in array so che i dati che mi sono stati passati devono essere -- inseriti/modificati FOR i IN 1..nLastCODTIPOBEN LOOP UPDATE GPDEBBEN SET INDESISTE = DECODE ( lTIDDEBBEN(i), NULL,'N','S' ), IDDEBBEN = lTIDDEBBEN(i) WHERE CODENTEAZ = UPPER( lCODENTEAZ ) AND CODTIPOBEN = lTCODTIPOBEN(i) AND CODBENEFICIARIO = lTCODBENEFICIARIO(i); IF SQL%ROWCOUNT = 0 THEN -- devo inserire il record INSERT INTO GPDEBBEN( CODENTEAZ , CODTIPOBEN , CODBENEFICIARIO , INDESISTE , IDDEBBEN ) VALUES ( UPPER( lCODENTEAZ ), lTCODTIPOBEN(i) , lTCODBENEFICIARIO(i) , DECODE ( lTIDDEBBEN(i), NULL,'N','S' ) , lTIDDEBBEN(i) ); END IF; END LOOP; COMMIT; RETURN 1; EXCEPTION WHEN OTHERS THEN RETURN pkUtility.fnError( '1fnGPDebBenInsUpd', SQLCODE, ERRDIAG ); END fnGPDebBenInsUpd; -- la seguente funzione crea la vista dinamica per la nuova stampa della contabilizzazione -- "Stampa voci per capitolo" FUNCTION fnGpEleRiscontDVR ( lCODENTEAZ IN PKTYPE.TYSTRINGA%TYPE, lCODANNOGRUPPOCONT IN PKTYPE.TYSTRINGA%TYPE, lQTAGRUPPOCONT IN PKTYPE.TYSTRINGA%TYPE, lINDGRVOX IN PKTYPE.TYSTRINGA%TYPE, -- 'S' prende le voci raggruppate per gruppo, lCODVALGRVOX IN PKTYPE.TYSTRINGA%TYPE, -- VALORE DI GRUPPO prende le voci raggruppate per gruppo, lINDVOX IN PKTYPE.TYSTRINGA%TYPE, -- 'S' prende le voci raggruppate per gruppo, lCODVOCE IN PKTYPE.TYSTRINGA%TYPE, -- serve per filtrare per la singola voce lCODPARTE IN PKTYPE.TYSTRINGA%TYPE, -- 'S': Solo Parte Spesa, 'E': solo Entrata, altrimenti tutto lDESSCHEMASERFIN IN PKTYPE.TYSTRINGA%TYPE, -- schema dal quale prendere tabelle Contabilità, non so se serve Se é NULL --> non esiste schema contabilità lCODSESSIONE IN PKTYPE.TYSTRINGA%TYPE, lVIEWGPELERISCONT OUT PKTYPE.TYSTRINGA%TYPE, ERRDIAG OUT PKTYPE.TYSTRINGA%TYPE) RETURN NUMERIC IS nRet NUMBER(9); sVIEWGPELERISCONT pktype.TyStringa%Type:= 'GPELERISCONT'; sQUERYGPELERISCONT VARCHAR2(30000); sQUERYGPELERISCONT1 VARCHAR2(30000); sQUERYGPELERISCONTE VARCHAR2(30000); sQUERYGPELERISCONTS VARCHAR2(30000); nNumRec NUMBER(9); sTpContab GPINFO.TIPOINFO%TYPE; sNomeSchema VARCHAR2(255); sNomeDBLink VARCHAR2(255); sQuery VARCHAR2(4000); BEGIN -- Il campo DESSCHEMASERFIN ora può essere nella forma SCHEMA@DBLINK IF INSTR(lDESSCHEMASERFIN, '@') > 0 THEN sNomeSchema := SUBSTR(lDESSCHEMASERFIN, 1, INSTR(lDESSCHEMASERFIN, '@') - 1); sNomeDBLink := SUBSTR(lDESSCHEMASERFIN, INSTR(lDESSCHEMASERFIN, '@') + 1, LENGTH(lDESSCHEMASERFIN)); ELSE sNomeSchema := lDESSCHEMASERFIN; END IF; IF lDESSCHEMASERFIN IS NOT NULL THEN -- controllo se esiste lo schema con descrizione passata sQuery := 'SELECT COUNT(*) FROM ALL_USERS'; IF sNomeDBLink IS NOT NULL THEN sQuery := sQuery || '@' || sNomeDBLink; END IF; sQuery := sQuery || ' WHERE USERNAME = UPPER( ''' || sNomeSchema || ''' )'; EXECUTE IMMEDIATE sQuery INTO nNumRec; IF nNumRec = 0 THEN -- ritorno Errore ROLLBACK; ERRDIAG := 'L''Ente/Azienda selezionato non esiste in Contabilità'; RETURN pkUtility.fnError( 'fnGpEleRiscontDVR', -499, ERRDIAG ); END IF; sQuery := 'SELECT COUNT(*) FROM ALL_TABLES'; IF sNomeDBLink IS NOT NULL THEN sQuery := sQuery || '@' || sNomeDBLink; END IF; sQuery := sQuery || ' WHERE TABLE_NAME IN ( UPPER(''CFCENTRIRESPONSABILITA''), UPPER(''CFDESCENTRIRESP''), UPPER(''CFRESPONSABILI'') ) AND OWNER = UPPER( ''' || sNomeSchema || ''' )'; EXECUTE IMMEDIATE sQuery INTO nNumRec; sQuery := 'SELECT COUNT(*) + ' || nNumRec || 'FROM ALL_VIEWS'; IF sNomeDBLink IS NOT NULL THEN sQuery := sQuery || '@' || sNomeDBLink; END IF; sQuery := sQuery || ' WHERE OWNER= UPPER( ''' || sNomeSchema || ''' ) AND UPPER(VIEW_NAME)=''VWFRMDISPEXPERS'''; EXECUTE IMMEDIATE sQuery INTO nNumRec; IF nNumRec <> 4 THEN -- ritorno Errore ROLLBACK; ERRDIAG := 'Nello schema specificato non esistono alcune tabelle necessarie alla Contabilizzazione'; RETURN pkUtility.fnError( 'fnGpEleRiscontDVR', -499, ERRDIAG ); END IF; END IF; -- vedo che tipo di contabilizzazione abbiamo: 0 = nessuna, 1= Serfin, 2 = Sistemi esterni (Studio K) SELECT NVL(MAX(CODULT),0) -- per default metto 0 = Nessuna contabilizzazione INTO sTpContab FROM GPINFO WHERE TIPOINFO= 'TPCOLCONT' AND CODINFO= UPPER(lCODENTEAZ); IF sTpContab = 0 THEN -- Caso Nessuna Contabilizzazione sQUERYGPELERISCONT1 := 'SELECT DECODE(A.CODPARTE,''E'',''Entrata'',''S'',''Spesa'') DESPARTE, A.CODELEMENTO, A.IDRELAB, '|| 'A.CODELEMENTO ||'' - ''||E.desvoce DESVOCE, A.CODPARTE, '|| 'A.IDCAPITOLO DESCAPITOLO, A.IDACCIMP || '' '' || A.CODANNOCONT DESACCIMP, '|| 'A.IMPMANDATO IMPMANDATO, B.INDCONTABILIZZATO, B.DESBENEFICIARIO, B.CODMANREV, B.DTAMANREV, '|| 'C.DESCDC, A.IDCAPITOLO, A.CODANNOCONT, A.IDACCIMP, A.IDCDC, A.CODTIPOBEN, '|| 'A.CODBENEFICIARIO, A.CODSIOPE, '''' UEB, F.CODVALGRVOX, F.CODTPGRVOX, RTRIM(G.DESVALGRVOX, '' '') DESVALGRVOX '|| 'FROM GPVERVOCE F, GPVOCE E , GPVALGRVOX G , GPTPGRVOX H, GPLCDC C, GPELAB D , GPELERISCONT A, GPRISCONT B '|| 'WHERE D.CODENTEAZ = '''|| lCODENTEAZ ||''' AND '|| 'B.CODANNOGRUPPOCONT = ''' || lCODANNOGRUPPOCONT ||''' AND '|| 'B.QTAGRUPPOCONT = '''|| lQTAGRUPPOCONT || ''' AND '|| 'A.INDSOSPESO = ''N'' AND '|| 'A.CODTIPOELE = ''VOX'' AND '|| 'A.IDRRISCONT = B.IDRRISCONT AND '|| 'B.IDRELAB = D.IDRELAB AND B.IDCDC = C.IDRCDC(+) AND '|| 'A.CODELEMENTO = E.CODVOCE AND '|| 'F.codvoce = E.CODVOCE AND '|| 'G.CODTPGRVOX = F.CODTPGRVOX AND '|| 'G.CODVALGRVOX = F.CODVALGRVOX AND '|| 'G.CODTPGRVOX = ''GRUPPOCONT'' AND '|| ' ( ( 0 = ( SELECT COUNT(*) FROM GPVERVOCE WHERE CODVERSIONE = '||''''||lCODENTEAZ ||''''||' AND CODVOCE = E.CODVOCE) AND '|| ' F.CODVERSIONE = ''STD'') OR (F.CODVERSIONE = '||''''||lCODENTEAZ ||''''||' ) ) AND '|| ' H.CODTPGRVOX = F.CODTPGRVOX '; IF lCODPARTE = 'E' THEN sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || ' AND A.CODPARTE = ''E'''; -- caso entrata ELSIF lCODPARTE = 'S' THEN sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || ' AND A.CODPARTE = ''S'''; -- caso spesa END IF; -- altrimenti prendo entrambe (entrata e spesa) IF lINDGRVOX = 'S' THEN -- FILTRO PER GRUPPO VOCE sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || ' AND G.CODVALGRVOX = ' || lCODVALGRVOX; END IF; IF lINDVOX = 'S' THEN IF lCODVOCE IS NOT NULL THEN sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || ' AND E.CODVOCE = ' || lCODVOCE; END IF; END IF; -- chiude il controllo del fitro per voce ELSIF sTpContab = 1 THEN -- Caso Contabilizzazione con Serfin sQUERYGPELERISCONTE := 'SELECT DECODE(A.CODPARTE,''E'',''Entrata'',''S'',''Spesa'') DESPARTE, ' || 'A.CODELEMENTO, D.IDRELAB, '|| ' A.codelemento ||'' - ''||L.desvoce DESVOCE, A.CODPARTE, '|| ' F.DESCAPITOLO, '|| ' C.DESESTESAACCIMP DESACCIMP, A.IMPMANDATO IMPMANDATO, ' || 'D.INDCONTABILIZZATO, D.DESBENEFICIARIO, D.CODMANREV, B.DESCDC, D.DTAMANREV, '|| 'A.IDCAPITOLO, A.CODANNOCONT, A.IDACCIMP, A.IDCDC, A.CODTIPOBEN, A.CODBENEFICIARIO, A.CODSIOPE, ' || 'F.UEB , h.codvalgrvox, T.destpgrvox, h.codtpgrvox, RTRIM(P.DESVALGRVOX,'' '') DESVALGRVOX '|| 'FROM GPLCDC B, '|| sNomeSchema ||'.VWFRMDISPEXPERS'; IF sNomeDBLink IS NOT NULL THEN sQUERYGPELERISCONTE := sQUERYGPELERISCONTE || '@' || sNomeDBLink; END IF; sQUERYGPELERISCONTE := sQUERYGPELERISCONTE || ' C,'|| ' GPELAB E, GPELERISCONT A,'||sNomeSchema||'.VWFRMDISPEXPERS'; IF sNomeDBLink IS NOT NULL THEN sQUERYGPELERISCONTE := sQUERYGPELERISCONTE || '@' || sNomeDBLink; END IF; sQUERYGPELERISCONTE := sQUERYGPELERISCONTE || ' F, '|| ' GPRISCONT D , gpvervoce h, GPVOCE L, '|| ' GPVALGRVOX P , GPTPGRVOX T '|| 'WHERE E.CODENTEAZ = '''|| UPPER(lCODENTEAZ) ||''' AND ' || ' A.IDRELAB = E.IDRELAB AND ' || ' A.CODPARTE = ''E'' AND ' || ' A.INDSOSPESO = ''N'' AND '|| 'D.CODANNOGRUPPOCONT = ''' || lCODANNOGRUPPOCONT ||''' AND '|| 'D.QTAGRUPPOCONT = '''|| lQTAGRUPPOCONT || ''' AND '|| 'A.CODTIPOELE = ''VOX'' AND '|| -- METTO LA CHIAVE 'A.IDRRISCONT = D.IDRRISCONT AND '|| 'D.IDRELAB = E.IDRELAB AND '|| 'D.IDCDC = B.IDRCDC(+) AND ' || 'A.CODELEMENTO = H.CODVOCE AND '|| 'H.codvoce = L.CODVOCE AND '|| 'P.CODTPGRVOX = h.CODTPGRVOX AND '|| 'P.codvalgrvox = h.codvalgrvox AND '|| 'P.codtpgrvox = ''GRUPPOCONT'' AND '|| 'D.IDCAPITOLO = F.IDCAPITOLO AND F.CODTIPOELE=''CAPITOLO'' AND '|| 'C.CODTIPOELE(+)=''IMPACC'' AND C.APP(+)=''E'' AND C.IDACCIMP(+)=D.IDACCIMP AND '|| 'P.CODTPGRVOX = ''GRUPPOCONT'' AND '|| ' ( ( 0 = ( SELECT COUNT(*) FROM GPVERVOCE WHERE CODVERSIONE = '||''''||UPPER(lCODENTEAZ) ||''''||' AND CODVOCE = L.CODVOCE) AND '|| ' H.CODVERSIONE = ''STD'') OR (H.CODVERSIONE = '||''''|| UPPER(lCODENTEAZ) ||''''||' ) ) AND '|| ' T.CODTPGRVOX = H.CODTPGRVOX AND ' || ' D.IDCDC = B.IDRCDC(+) '; IF lINDGRVOX = 'S' THEN -- FILTRO PER GRUPPO VOCE sQUERYGPELERISCONTE := sQUERYGPELERISCONTE || ' AND P.CODVALGRVOX = ' || lCODVALGRVOX; END IF; IF lINDVOX = 'S' THEN IF lCODVOCE IS NOT NULL THEN sQUERYGPELERISCONTE := sQUERYGPELERISCONTE || ' AND A.CODELEMENTO = ' || lCODVOCE; END IF; END IF; -- chiude il controllo del fitro per SINGOLA voce -- query per spesa sQUERYGPELERISCONTS := 'SELECT DECODE(A.CODPARTE,''E'',''Entrata'',''S'',''Spesa'') DESPARTE, ' || 'A.CODELEMENTO, D.IDRELAB, '|| 'A.codelemento ||'' - ''||L.desvoce DESVOCE, A.CODPARTE, '|| 'F.DESCAPITOLO, '|| 'C.DESESTESAACCIMP DESACCIMP, A.IMPMANDATO IMPMANDATO, ' || 'D.INDCONTABILIZZATO, D.DESBENEFICIARIO, D.CODMANREV, B.DESCDC, D.DTAMANREV, '|| 'A.IDCAPITOLO, A.CODANNOCONT, A.IDACCIMP, A.IDCDC, A.CODTIPOBEN, A.CODBENEFICIARIO, A.CODSIOPE, ' || 'F.UEB , h.codvalgrvox, T.destpgrvox, h.codtpgrvox, RTRIM(P.DESVALGRVOX,'' '') DESVALGRVOX '|| 'FROM GPLCDC B, '|| sNomeSchema||'.VWFRMDISPEXPERS'; IF sNomeDBLink IS NOT NULL THEN sQUERYGPELERISCONTS := sQUERYGPELERISCONTS || '@' || sNomeDBLink; END IF; sQUERYGPELERISCONTS := sQUERYGPELERISCONTS || ' C,'|| ' GPELAB E, GPELERISCONT A, '|| sNomeSchema ||'.VWFRMDISPEXPERS'; IF sNomeDBLink IS NOT NULL THEN sQUERYGPELERISCONTS := sQUERYGPELERISCONTS || '@' || sNomeDBLink; END IF; sQUERYGPELERISCONTS := sQUERYGPELERISCONTS || ' F, '|| ' GPRISCONT D , '|| 'gpvervoce h, GPVOCE L, GPVALGRVOX P , GPTPGRVOX T '|| 'WHERE E.CODENTEAZ = '''|| UPPER(lCODENTEAZ) ||''' AND ' || ' A.IDRELAB = E.IDRELAB AND ' || ' A.CODPARTE = ''S'' AND ' || ' A.INDSOSPESO = ''N'' AND '|| 'D.CODANNOGRUPPOCONT = ''' || lCODANNOGRUPPOCONT ||''' AND '|| 'D.QTAGRUPPOCONT = '''|| lQTAGRUPPOCONT || ''' AND '|| 'A.CODTIPOELE = ''VOX'' AND '|| -- METTO LA CHIAVE 'A.IDRRISCONT = D.IDRRISCONT AND '|| 'D.IDRELAB = E.IDRELAB AND '|| 'D.IDCDC = B.IDRCDC(+) AND ' || --B.IDCDC = C.IDCDC(+) AND '|| --C.IDRCDC(+) AND '|| --C.IDRCDC(+) AND '|| 'A.CODELEMENTO = H.CODVOCE AND '|| 'H.codvoce = L.CODVOCE AND '|| 'P.CODTPGRVOX = h.CODTPGRVOX AND '|| 'P.codvalgrvox = h.codvalgrvox AND '|| 'P.codtpgrvox = ''GRUPPOCONT'' AND '|| 'D.IDCAPITOLO = F.IDCAPITOLO AND F.CODTIPOELE=''CAPITOLO'' AND '|| 'C.CODTIPOELE(+)=''IMPACC'' AND C.APP(+)=''E'' AND C.IDACCIMP(+)=D.IDACCIMP AND '|| 'P.CODTPGRVOX = ''GRUPPOCONT'' AND '|| '( ( 0 = ( SELECT COUNT(*) FROM GPVERVOCE WHERE CODVERSIONE = '||''''||UPPER(lCODENTEAZ) ||''''||' AND CODVOCE = L.CODVOCE) AND '|| 'H.CODVERSIONE = ''STD'') OR (H.CODVERSIONE = '||''''||UPPER(lCODENTEAZ) ||''''||' ) ) AND '|| 'T.CODTPGRVOX = H.CODTPGRVOX AND ' || 'D.IDCDC = B.IDRCDC(+) '; IF lINDGRVOX = 'S' THEN -- FILTRO PER GRUPPO VOCE sQUERYGPELERISCONTS := sQUERYGPELERISCONTS || ' AND P.CODVALGRVOX = ' || lCODVALGRVOX; END IF; IF lINDVOX = 'S' THEN IF lCODVOCE IS NOT NULL THEN sQUERYGPELERISCONTS := sQUERYGPELERISCONTS || ' AND A.CODELEMENTO = ' || lCODVOCE; END IF; END IF; -- chiude il controllo del fitro per SINGOLA voce IF lCODPARTE = 'E' THEN -- entrata sQUERYGPELERISCONT1 := sQUERYGPELERISCONTE; ELSIF lCODPARTE = 'S' THEN -- spesa sQUERYGPELERISCONT1 := sQUERYGPELERISCONTS; ELSE -- prendo tutte e due sQUERYGPELERISCONT1 := sQUERYGPELERISCONTE || ' UNION '|| sQUERYGPELERISCONTS; END IF; ELSIF sTpContab >= 2 THEN -- Caso Contabilizzazione con Sistemi Esterni (Studio K) sQUERYGPELERISCONT1 := 'SELECT DECODE(A.CODPARTE,''E'',''Entrata'',''S'',''Spesa'') DESPARTE, A.CODELEMENTO, L.CODVOCE, A.IDRELAB, '|| '(a.codelemento ||'' - ''||L.desvoce) DESVOCE, A.CODPARTE, '|| 'E.CODCAPITOLO || '' ''|| E.ANNOCAPITOLO DESCAPITOLO, '|| 'F.CODACCIMP ||'' ''|| F.ANNOACCIMP DESACCIMP, '|| 'A.IMPMANDATO IMPMANDATO, B.INDCONTABILIZZATO, B.DESBENEFICIARIO, B.CODMANREV, B.DTAMANREV, '|| 'C.DESCDC, A.IDCAPITOLO, A.CODANNOCONT, A.IDACCIMP, A.IDCDC, A.CODTIPOBEN, '|| 'A.CODBENEFICIARIO, A.CODSIOPE, '''' UEB, '|| 'h.codvalgrvox, h.codtpgrvox, RTRIM(P.DESVALGRVOX, '' '') DESVALGRVOX '|| 'FROM GPELERISCONT A, GPRISCONT B, GPLCDC C, GPELAB D , gpvervoce h, GPVOCE L, GPVALGRVOX P, gptpgrvox T, '|| 'GPCAPSISTEXT E, GPACCIMPSE F ' || 'WHERE D.CODENTEAZ = '''|| UPPER(lCODENTEAZ) ||''' AND '|| 'B.CODANNOGRUPPOCONT = ''' || lCODANNOGRUPPOCONT ||''' AND '|| 'B.QTAGRUPPOCONT = '''|| lQTAGRUPPOCONT || ''' AND '|| 'A.INDSOSPESO = ''N'' AND '|| 'A.CODTIPOELE = ''VOX'' AND '|| -- METTO LA CHIAVE 'A.IDRRISCONT = B.IDRRISCONT AND '|| 'B.IDRELAB = D.IDRELAB AND B.IDCDC = C.IDRCDC(+) AND '|| 'A.IDCAPITOLO = E.IDRCAPSISTEXT AND '|| 'A.IDACCIMP = F.IDRACCIMPSE(+) AND ' || 'A.CODELEMENTO = H.CODVOCE AND '|| 'H.codvoce = L.CODVOCE AND ' || 'P.CODTPGRVOX = h.CODTPGRVOX AND '|| 'P.codvalgrvox = h.codvalgrvox AND '|| 'P.codtpgrvox = ''GRUPPOCONT'' AND '|| ' ( ( 0 = ( SELECT COUNT(*) FROM GPVERVOCE WHERE CODVERSIONE = '||''''||UPPER(lCODENTEAZ) ||''''||' AND CODVOCE = L.CODVOCE) AND '|| ' h.CODVERSIONE = ''STD'') OR (h.CODVERSIONE = '||''''||UPPER(lCODENTEAZ) ||''''||' ) ) AND '|| ' T.CODTPGRVOX = h.CODTPGRVOX '; IF lCODPARTE = 'E' THEN sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || ' AND A.CODPARTE = ''E'''; -- caso entrata ELSIF lCODPARTE = 'S' THEN sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || ' AND A.CODPARTE = ''S'''; -- caso spesa END IF; -- altrimenti prendo entrambe (entrata e spesa) IF lINDGRVOX = 'S' THEN -- FILTRO PER GRUPPO VOCE sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || ' AND P.CODVALGRVOX = ' || lCODVALGRVOX; END IF; IF lINDVOX = 'S' THEN IF lCODVOCE IS NOT NULL THEN sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || ' AND L.CODVOCE = ' || lCODVOCE; END IF; END IF; -- chiude il controllo del fitro per voce END IF; nRet := PKUTILITYPAG.fnCreateView ( sQUERYGPELERISCONT1, lCodSessione, sVIEWGPELERISCONT, ERRDIAG ); IF nRet < 0 THEN RETURN nRet; END IF; lVIEWGPELERISCONT := sVIEWGPELERISCONT; RETURN 1; EXCEPTION WHEN OTHERS THEN ROLLBACK; RETURN pkUtility.fnError( 'fnGpEleRiscontDVR', SQLCODE, ERRDIAG ); END fnGpEleRiscontDVR; -- la seguente funzione crea la vista dinamica per la nuova stampa della contabilizzazione -- "Stampa voci per capitolo ARTICOLO e anno richiesto da Napoli" FUNCTION fnTotVociXCapArtDVR ( lCODENTEAZ IN PKTYPE.TYSTRINGA%TYPE, lCODANNOGRUPPOCONT IN PKTYPE.TYSTRINGA%TYPE, lQTAGRUPPOCONT IN PKTYPE.TYSTRINGA%TYPE, lCODPARTE IN PKTYPE.TYSTRINGA%TYPE, lCODVALGRVOX IN PKTYPE.TYSTRINGA%TYPE, -- VALORE DI GRUPPO prende le voci raggruppate per gruppo, lCODVOCE IN PKTYPE.TYSTRINGA%TYPE, -- Indica la voce iniziale per il range di voci lDESSCHEMASERFIN IN PKTYPE.TYSTRINGA%TYPE, -- schema dal quale prendere tabelle Contabilità, non so se serve Se é NULL --> non esiste schema contabilità lCODSESSIONE IN PKTYPE.TYSTRINGA%TYPE, lVIEWGPELERISCONT OUT PKTYPE.TYSTRINGA%TYPE, ERRDIAG OUT PKTYPE.TYSTRINGA%TYPE) RETURN NUMERIC IS nRet NUMBER(9); sVIEWGPELERISCONT pktype.TyStringa%Type:= 'GPVOXCAPART'; sQUERYGPELERISCONT VARCHAR2(30000); sQUERYGPELERISCONT1 VARCHAR2(30000); sQUERYGPELERISCONTE VARCHAR2(30000); sQUERYGPELERISCONTS VARCHAR2(30000); nNumRec NUMBER(9); sTpContab GPINFO.TIPOINFO%TYPE; sNomeSchema VARCHAR2(255); sNomeDBLink VARCHAR2(255); sQuery VARCHAR2(4000); BEGIN IF lDESSCHEMASERFIN IS NOT NULL THEN -- Il campo DESSCHEMASERFIN ora può essere nella forma SCHEMA@DBLINK IF INSTR(lDESSCHEMASERFIN, '@') > 0 THEN sNomeSchema := SUBSTR(lDESSCHEMASERFIN, 1, INSTR(lDESSCHEMASERFIN, '@') - 1); sNomeDBLink := SUBSTR(lDESSCHEMASERFIN, INSTR(lDESSCHEMASERFIN, '@') + 1, LENGTH(lDESSCHEMASERFIN)); ELSE sNomeSchema := lDESSCHEMASERFIN; END IF; -- controllo se esiste lo schema con descrizione passata sQuery := 'SELECT COUNT(*) FROM ALL_USERS'; IF sNomeDBLink IS NOT NULL THEN sQuery := sQuery || '@' || sNomeDBLink; END IF; sQuery := sQuery || ' WHERE USERNAME = UPPER( ''' || sNomeSchema || ''' )'; EXECUTE IMMEDIATE sQuery INTO nNumRec; IF nNumRec = 0 THEN -- ritorno Errore ROLLBACK; ERRDIAG := 'L''Ente/Azienda selezionato non esiste in Contabilità'; RETURN pkUtility.fnError( 'fnTotVociXCapArtDVR', -499, ERRDIAG ); END IF; sQuery := 'SELECT COUNT(*) FROM ALL_TABLES'; IF sNomeDBLink IS NOT NULL THEN sQuery := sQuery || '@' || sNomeDBLink; END IF; sQuery := sQuery || ' WHERE TABLE_NAME IN ( UPPER(''CFCENTRIRESPONSABILITA''), ' || 'UPPER(''CFDESCENTRIRESP''), UPPER(''CFRESPONSABILI'') ) AND ' || 'OWNER = UPPER( ''' || sNomeSchema || ''' )'; EXECUTE IMMEDIATE sQuery INTO nNumRec; sQuery := 'SELECT COUNT(*) + ' || nNumRec || 'FROM ALL_VIEWS'; IF sNomeDBLink IS NOT NULL THEN sQuery := sQuery || '@' || sNomeDBLink; END IF; sQuery := sQuery || ' WHERE OWNER= UPPER( ''' || sNomeSchema || ''' ) AND UPPER(VIEW_NAME)=''VWFRMDISPEXPERS'''; EXECUTE IMMEDIATE sQuery INTO nNumRec; IF nNumRec <> 4 THEN -- ritorno Errore ROLLBACK; ERRDIAG := 'Nello schema specificato non esistono alcune tabelle necessarie alla Contabilizzazione'; RETURN pkUtility.fnError( 'fnTotVociXCapArtDVR', -499, ERRDIAG ); END IF; END IF; -- vedo che tipo di contabilizzazione abbiamo: 0 = nessuna, 1= Serfin, 2 = Sistemi esterni (Studio K) SELECT NVL(MAX(CODULT),0) -- per default metto 0 = Nessuna contabilizzazione INTO sTpContab FROM GPINFO WHERE TIPOINFO= 'TPCOLCONT' AND CODINFO= UPPER(lCODENTEAZ); IF sTpContab = 0 THEN -- Caso Nessuna Contabilizzazione sQUERYGPELERISCONT1 := 'SELECT GPVOCE.CODVOCE, GPELERISCONT.IDRELAB, GPELERISCONT.CODPARTE, '|| 'DECODE(GPVOCE.CODCOLONNA , ''F'', (GPVOCE.DESVOCE || '' - (FIGURATIVA)''), GPVOCE.DESVOCE) DESVOCE, '|| 'SUM(GPVOXCED.QTAVOX) QTAVOX, '|| 'SUM(DECODE(GPVOCE.CODCOLONNA , ''C'', GPVOXCED.impvox,0)) IMPVOCECOMP , '|| 'SUM(DECODE(GPVOCE.CODCOLONNA , ''T'', GPVOXCED.impvox, 0)) IMPVOCETRATT , '|| 'SUM(DECODE(GPVOCE.CODCOLONNA , ''F'', GPVOXCED.impvox, 0)) IMPVOCEFIG , '|| 'sum(GPVOXCED.impvox) IMPVOCE , '|| 'GPELERISCONT.IDCAPITOLO DESCAPITOLOART, GPELERISCONT.CODANNOMAT CODANNOCOMP, '|| 'RTRIM(GPVALGRVOX.DESVALGRVOX, '' '') DESVALGRVOX, GPVOCE.CODCOLONNA '|| 'FROM GPVERVOCE, GPVOCE, GPVOXCED, GPVALGRVOX, '|| 'GPTPGRVOX,GPELAB, GPELERISCONT, GPRISCONT, GPDETRISCONT '|| 'WHERE GPELAB.CODENTEAZ = '''|| UPPER(lCODENTEAZ) ||''' AND '|| 'GPRISCONT.CODANNOGRUPPOCONT = ''' || lCODANNOGRUPPOCONT ||''' AND '|| 'GPRISCONT.QTAGRUPPOCONT = '''|| lQTAGRUPPOCONT || ''' AND '|| 'GPELERISCONT.INDSOSPESO = ''N'' AND '|| 'GPELERISCONT.CODTIPOELE = ''VOX'' AND '|| 'GPELERISCONT.IDRRISCONT = GPRISCONT.IDRRISCONT AND '|| 'GPRISCONT.IDRELAB = GPELAB.IDRELAB AND '|| 'GPELERISCONT.IDRELAB = GPRISCONT.IDRELAB '|| 'AND GPDETRISCONT.IDRELAB = GPELERISCONT.IDRELAB '|| 'AND GPDETRISCONT.CODTIPOELE = GPELERISCONT.CODTIPOELE '|| 'AND GPDETRISCONT.CODANNOESERCIZIO = GPELERISCONT.CODANNOESERCIZIO '|| 'AND GPDETRISCONT.CODANNOMAT = GPELERISCONT.CODANNOMAT '|| 'AND GPDETRISCONT.CODPARTE = GPELERISCONT.CODPARTE '|| 'AND GPDETRISCONT.IDCAPITOLO = GPELERISCONT.IDCAPITOLO '|| 'AND GPDETRISCONT.IDCDC = GPELERISCONT.IDCDC '|| 'AND GPDETRISCONT.CODANNOCONT = GPELERISCONT.CODANNOCONT '|| 'AND GPDETRISCONT.IDACCIMP = GPELERISCONT.IDACCIMP '|| 'AND GPDETRISCONT.CODTIPOBEN = GPELERISCONT.CODTIPOBEN '|| 'AND GPDETRISCONT.CODBENEFICIARIO = GPELERISCONT.CODBENEFICIARIO '|| 'AND GPDETRISCONT.IDRRISCONT = GPELERISCONT.IDRRISCONT '|| 'AND GPDETRISCONT.IDRRLAV = GPVOXCED.IDRRLAV AND '|| 'GPDETRISCONT.IDRELAB = GPVOXCED.IDRELAB AND '|| 'GPELERISCONT.CODELEMENTO = GPVOXCED.CODVOCE AND '|| 'GPELERISCONT.CODANNOMAT = GPVOXCED.CODANNO AND '|| 'GPELERISCONT.CODELEMENTO = GPVOCE.CODVOCE AND '|| 'GPVOXCED.IDRELAB = GPELAB.IDRELAB AND '|| 'GPVOXCED.CODVOCE = GPVOCE.CODVOCE AND '|| 'GPVERVOCE.CODVOCE = GPVOCE.CODVOCE AND '|| 'GPVALGRVOX.CODTPGRVOX = GPVERVOCE.CODTPGRVOX AND '|| 'GPVALGRVOX.CODVALGRVOX = GPVERVOCE.CODVALGRVOX AND '|| 'GPVALGRVOX.CODTPGRVOX = ''GRUPPOCONT'' AND '|| '(( 0 = (SELECT COUNT (*) FROM GPVERVOCE '|| 'WHERE CODVERSIONE = '''|| UPPER(lCODENTEAZ) ||''' AND CODVOCE = GPVOCE.CODVOCE) '|| ' AND GPVERVOCE.CODVERSIONE = ''STD'' ) '|| ' OR (GPVERVOCE.CODVERSIONE = '''|| UPPER(lCODENTEAZ) ||''')) '|| ' AND GPTPGRVOX.CODTPGRVOX = GPVERVOCE.CODTPGRVOX '; --condizione per la parte di sola entrata o solo spesa IF lCODPARTE = 'E' THEN --PARTE ENTRATA sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || ' AND GPELERISCONT.CODPARTE = ''E'' '; ELSIF lCODPARTE = 'S' THEN --PARTE SPESA sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || ' AND GPELERISCONT.CODPARTE = ''S'' '; END IF; IF lCODVALGRVOX IS NOT NULL THEN -- FILTRO PER GRUPPO VOCE sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || ' AND GPVALGRVOX.CODVALGRVOX = ' || lCODVALGRVOX; END IF; -- IF lINDVOX = 'S' THEN IF lCODVOCE IS NOT NULL THEN sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || ' AND GPVOCE.CODVOCE = ' || lCODVOCE; END IF; -- END IF; sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || ' GROUP BY GPVOCE.CODVOCE, GPELERISCONT.IDRELAB, GPELERISCONT.CODPARTE, GPVOCE.DESVOCE, '|| ' GPELERISCONT.IDCAPITOLO , '|| 'GPELERISCONT.CODANNOMAT ,GPVALGRVOX.DESVALGRVOX, GPVOCE.CODCOLONNA '|| 'ORDER BY 3,4'; ELSIF sTpContab = 1 THEN -- Caso Contabilizzazione con Serfin sQUERYGPELERISCONTE := 'SELECT GPVOCE.CODVOCE, GPELERISCONT.IDRELAB,GPELERISCONT.CODPARTE, '|| 'DECODE(GPVOCE.CODCOLONNA , ''F'', (GPVOCE.DESVOCE || '' - (FIGURATIVA)''), GPVOCE.DESVOCE) DESVOCE, '|| 'SUM(GPVOXCED.QTAVOX) QTAVOX, '|| 'SUM(DECODE(GPVOCE.CODCOLONNA , ''C'', GPVOXCED.IMPVOX,0)) IMPVOCECOMP , '|| 'SUM(DECODE(GPVOCE.CODCOLONNA , ''T'', GPVOXCED.IMPVOX, 0)) IMPVOCETRATT , '|| 'SUM(DECODE(GPVOCE.CODCOLONNA , ''F'', GPVOXCED.IMPVOX, 0)) IMPVOCEFIG , '|| 'SUM(GPVOXCED.IMPVOX) IMPVOCE , '|| '(F.CAP || ''/''|| F.ART) DESCAPITOLOART , '|| 'GPELERISCONT.CODANNOMAT CODANNOCOMP, '|| 'RTRIM(GPVALGRVOX.DESVALGRVOX, '' '') DESVALGRVOX,GPVOCE.CODCOLONNA '|| 'FROM GPVERVOCE, GPVOCE, GPVOXCED, GPVALGRVOX, '|| 'GPTPGRVOX,GPELAB, GPELERISCONT, GPDETRISCONT, '|| 'GPRISCONT, '|| sNomeSchema ||'.VWFRMDISPEXPERS'; IF sNomeDBLink IS NOT NULL THEN sQUERYGPELERISCONTE := sQUERYGPELERISCONTE || '@' || sNomeDBLink; END IF; sQUERYGPELERISCONTE := sQUERYGPELERISCONTE || ' C, '||sNomeSchema||'.VWFRMDISPEXPERS'; IF sNomeDBLink IS NOT NULL THEN sQUERYGPELERISCONTE := sQUERYGPELERISCONTE || '@' || sNomeDBLink; END IF; sQUERYGPELERISCONTE := sQUERYGPELERISCONTE || ' F '|| ' WHERE GPELAB.CODENTEAZ = '''|| UPPER(lCODENTEAZ) ||''' AND '|| 'GPRISCONT.CODANNOGRUPPOCONT = ''' || lCODANNOGRUPPOCONT ||''' AND '|| 'GPRISCONT.QTAGRUPPOCONT = '''|| lQTAGRUPPOCONT || ''' AND '|| 'GPRISCONT.IDCAPITOLO = F.IDCAPITOLO AND F.CODTIPOELE=''CAPITOLO'' AND '|| 'C.CODTIPOELE(+)=''IMPACC'' AND C.APP(+)=''E'' AND C.IDACCIMP(+)=GPRISCONT.IDACCIMP AND '|| 'gpeleriscont.indsospeso = ''N'' AND '|| 'gpeleriscont.codtipoele = ''VOX'' AND '|| 'GPELERISCONT.CODPARTE =''E'' AND '|| 'gpeleriscont.idrriscont = gpriscont.idrriscont AND '|| 'gpriscont.idrelab = gpelab.idrelab AND '|| 'gpeleriscont.idrelab = gpriscont.idrelab '|| 'AND GPDETRISCONT.IDRELAB = GPELERISCONT.IDRELAB '|| 'AND GPDETRISCONT.CODTIPOELE = GPELERISCONT.CODTIPOELE '|| 'AND GPDETRISCONT.CODANNOESERCIZIO = GPELERISCONT.CODANNOESERCIZIO '|| 'AND GPDETRISCONT.CODANNOMAT = GPELERISCONT.CODANNOMAT '|| 'AND GPDETRISCONT.CODPARTE = GPELERISCONT.CODPARTE '|| 'AND GPDETRISCONT.IDCAPITOLO = GPELERISCONT.IDCAPITOLO '|| 'AND GPDETRISCONT.IDCDC = GPELERISCONT.IDCDC '|| 'AND GPDETRISCONT.CODANNOCONT = GPELERISCONT.CODANNOCONT '|| 'AND GPDETRISCONT.IDACCIMP = GPELERISCONT.IDACCIMP '|| 'AND GPDETRISCONT.CODTIPOBEN = GPELERISCONT.CODTIPOBEN '|| 'AND GPDETRISCONT.CODBENEFICIARIO = GPELERISCONT.CODBENEFICIARIO '|| 'AND GPDETRISCONT.IDRRISCONT = GPELERISCONT.IDRRISCONT '|| 'AND gpdetriscont.idrrlav = gpvoxced.idrrlav '|| 'AND gpdetriscont.idrelab = gpvoxced.idrelab '|| 'AND GPELERISCONT.CODELEMENTO = GPVOXCED.CODVOCE '|| 'AND GPELERISCONT.CODANNOMAT = GPVOXCED.CODANNO '|| 'AND gpeleriscont.codelemento = gpvoce.codvoce(+) AND '|| 'GPVOXCED.idrelab = GPELAB.idrelab AND '|| 'GPVOXCED.CODVOCE = GPVOCE.CODVOCE AND '|| 'GPVERVOCE.CODVOCE = GPVOCE.CODVOCE AND '|| 'GPVALGRVOX.CODTPGRVOX = GPVERVOCE.CODTPGRVOX AND '|| 'GPVALGRVOX.CODVALGRVOX = GPVERVOCE.CODVALGRVOX AND '|| 'GPVALGRVOX.CODTPGRVOX = ''GRUPPOCONT'' AND '|| '(( 0 = (SELECT COUNT (*) FROM GPVERVOCE '|| 'WHERE CODVERSIONE = '''|| UPPER(lCODENTEAZ) ||''' AND CODVOCE = GPVOCE.CODVOCE) '|| ' AND GPVERVOCE.CODVERSIONE = ''STD'' ) '|| ' OR (GPVERVOCE.CODVERSIONE = '''|| UPPER(lCODENTEAZ) ||''')) '|| ' AND GPTPGRVOX.CODTPGRVOX = GPVERVOCE.CODTPGRVOX '; IF lCODVALGRVOX IS NOT NULL THEN -- FILTRO PER GRUPPO VOCE sQUERYGPELERISCONTE := sQUERYGPELERISCONTE || ' AND GPVALGRVOX.CODVALGRVOX = ' || lCODVALGRVOX; END IF; -- IF lINDVOX = 'S' THEN IF lCODVOCE IS NOT NULL THEN sQUERYGPELERISCONTE := sQUERYGPELERISCONTE || ' AND GPVOCE.CODVOCE = ' || lCODVOCE; END IF; -- END IF; sQUERYGPELERISCONTE := sQUERYGPELERISCONTE || ' GROUP BY GPVOCE.CODVOCE, GPELERISCONT.IDRELAB,GPELERISCONT.CODPARTE, GPVOCE.DESVOCE, '|| 'F.CAP , F.ART, '|| 'GPELERISCONT.CODANNOMAT ,GPVALGRVOX.DESVALGRVOX, GPVOCE.CODCOLONNA '; ---PARTE DI SPESA sQUERYGPELERISCONTS := 'SELECT GPVOCE.CODVOCE, GPELERISCONT.IDRELAB,GPELERISCONT.CODPARTE, '|| 'DECODE(GPVOCE.CODCOLONNA , ''F'', (GPVOCE.DESVOCE || '' - (FIGURATIVA)''), GPVOCE.DESVOCE) DESVOCE, '|| 'SUM(GPVOXCED.QTAVOX) QTAVOX, '|| 'SUM(DECODE(GPVOCE.CODCOLONNA , ''C'', GPVOXCED.IMPVOX,0)) IMPVOCECOMP , '|| 'SUM(DECODE(GPVOCE.CODCOLONNA , ''T'', GPVOXCED.IMPVOX, 0)) IMPVOCETRATT , '|| 'SUM(DECODE(GPVOCE.CODCOLONNA , ''F'', GPVOXCED.IMPVOX, 0)) IMPVOCEFIG , '|| 'SUM(GPVOXCED.IMPVOX) IMPVOCE , '|| '(F.CAP || ''/''|| F.ART) DESCAPITOLOART , '|| 'GPELERISCONT.CODANNOMAT CODANNOCOMP, '|| 'RTRIM(GPVALGRVOX.DESVALGRVOX, '' '') DESVALGRVOX,GPVOCE.CODCOLONNA '|| 'FROM GPVERVOCE, GPVOCE, GPVOXCED, GPVALGRVOX, '|| 'GPTPGRVOX,GPELAB, GPELERISCONT, GPDETRISCONT, '|| 'GPRISCONT, '|| sNomeSchema ||'.VWFRMDISPEXPERS'; IF sNomeDBLink IS NOT NULL THEN sQUERYGPELERISCONTS := sQUERYGPELERISCONTS || '@' || sNomeDBLink; END IF; sQUERYGPELERISCONTS := sQUERYGPELERISCONTS || ' C, '||sNomeSchema||'.VWFRMDISPEXPERS'; IF sNomeDBLink IS NOT NULL THEN sQUERYGPELERISCONTS := sQUERYGPELERISCONTS || '@' || sNomeDBLink; END IF; sQUERYGPELERISCONTS := sQUERYGPELERISCONTS || ' F '|| ' WHERE GPELAB.CODENTEAZ = '''|| UPPER(lCODENTEAZ) ||''' AND '|| 'GPRISCONT.CODANNOGRUPPOCONT = ''' || lCODANNOGRUPPOCONT ||''' AND '|| 'GPRISCONT.QTAGRUPPOCONT = '''|| lQTAGRUPPOCONT || ''' AND '|| 'GPRISCONT.IDCAPITOLO = F.IDCAPITOLO AND F.CODTIPOELE=''CAPITOLO'' AND '|| 'C.CODTIPOELE(+)=''IMPACC'' AND C.APP(+)=''E'' AND C.IDACCIMP(+)=GPRISCONT.IDACCIMP AND '|| 'gpeleriscont.indsospeso = ''N'' AND '|| 'gpeleriscont.codtipoele = ''VOX'' AND '|| 'GPELERISCONT.CODPARTE =''S'' AND '|| 'gpeleriscont.idrriscont = gpriscont.idrriscont AND '|| 'gpriscont.idrelab = gpelab.idrelab AND '|| 'gpeleriscont.idrelab = gpriscont.idrelab '|| 'AND GPDETRISCONT.IDRELAB = GPELERISCONT.IDRELAB '|| 'AND GPDETRISCONT.CODTIPOELE = GPELERISCONT.CODTIPOELE '|| 'AND GPDETRISCONT.CODANNOESERCIZIO = GPELERISCONT.CODANNOESERCIZIO '|| 'AND GPDETRISCONT.CODANNOMAT = GPELERISCONT.CODANNOMAT '|| 'AND GPDETRISCONT.CODPARTE = GPELERISCONT.CODPARTE '|| 'AND GPDETRISCONT.IDCAPITOLO = GPELERISCONT.IDCAPITOLO '|| 'AND GPDETRISCONT.IDCDC = GPELERISCONT.IDCDC '|| 'AND GPDETRISCONT.CODANNOCONT = GPELERISCONT.CODANNOCONT '|| 'AND GPDETRISCONT.IDACCIMP = GPELERISCONT.IDACCIMP '|| 'AND GPDETRISCONT.CODTIPOBEN = GPELERISCONT.CODTIPOBEN '|| 'AND GPDETRISCONT.CODBENEFICIARIO = GPELERISCONT.CODBENEFICIARIO '|| 'AND GPDETRISCONT.IDRRISCONT = GPELERISCONT.IDRRISCONT '|| 'AND gpdetriscont.idrrlav = gpvoxced.idrrlav '|| 'AND gpdetriscont.idrelab = gpvoxced.idrelab '|| 'AND GPELERISCONT.CODELEMENTO = GPVOXCED.CODVOCE '|| 'AND GPELERISCONT.CODANNOMAT = GPVOXCED.CODANNO '|| 'and gpeleriscont.codelemento = gpvoce.codvoce AND '|| 'GPVOXCED.idrelab = GPELAB.idrelab AND '|| 'GPVOXCED.CODVOCE = GPVOCE.CODVOCE AND '|| 'GPVERVOCE.CODVOCE = GPVOCE.CODVOCE AND '|| 'GPVALGRVOX.CODTPGRVOX = GPVERVOCE.CODTPGRVOX AND '|| 'GPVALGRVOX.CODVALGRVOX = GPVERVOCE.CODVALGRVOX AND '|| 'GPVALGRVOX.CODTPGRVOX = ''GRUPPOCONT'' AND '|| '(( 0 = (SELECT COUNT (*) FROM GPVERVOCE '|| 'WHERE CODVERSIONE = '''|| UPPER(lCODENTEAZ) ||''' AND CODVOCE = GPVOCE.CODVOCE) '|| ' AND GPVERVOCE.CODVERSIONE = ''STD'' ) '|| ' OR (GPVERVOCE.CODVERSIONE = '''|| UPPER(lCODENTEAZ) ||''')) '|| ' AND GPTPGRVOX.CODTPGRVOX = GPVERVOCE.CODTPGRVOX '; IF lCODVALGRVOX IS NOT NULL THEN -- FILTRO PER GRUPPO VOCE sQUERYGPELERISCONTS := sQUERYGPELERISCONTS || ' AND GPVALGRVOX.CODVALGRVOX = ' || lCODVALGRVOX; END IF; -- IF lINDVOX = 'S' THEN IF lCODVOCE IS NOT NULL THEN -- filtro per voce sQUERYGPELERISCONTS := sQUERYGPELERISCONTS || ' AND GPVOCE.CODVOCE = ' || lCODVOCE; END IF; -- END IF; sQUERYGPELERISCONTS := sQUERYGPELERISCONTS || ' GROUP BY GPVOCE.CODVOCE, GPELERISCONT.IDRELAB, GPELERISCONT.CODPARTE, GPVOCE.DESVOCE, '|| ' F.CAP , F.ART, '|| 'GPELERISCONT.CODANNOMAT ,GPVALGRVOX.DESVALGRVOX, GPVOCE.CODCOLONNA '; IF lCODPARTE = 'E' THEN --PARTE ENTRATA sQUERYGPELERISCONT1 := sQUERYGPELERISCONTE || ' ORDER BY 3,4'; ELSIF lCODPARTE = 'S' THEN sQUERYGPELERISCONT1 := sQUERYGPELERISCONTS || ' ORDER BY 3,4'; ELSE sQUERYGPELERISCONT1 := sQUERYGPELERISCONTE || ' UNION '|| sQUERYGPELERISCONTS || ' ORDER BY 3,4'; END IF; ELSIF sTpContab >= 2 THEN -- Caso Contabilizzazione con Sistemi Esterni (Studio K) sQUERYGPELERISCONT1 := 'SELECT GPVOCE.CODVOCE, GPELERISCONT.IDRELAB, GPELERISCONT.CODPARTE, '|| 'DECODE(GPVOCE.CODCOLONNA , ''F'', (GPVOCE.DESVOCE || '' - (FIGURATIVA)''), GPVOCE.DESVOCE) DESVOCE, '|| 'SUM(GPVOXCED.QTAVOX) QTAVOX, '|| 'SUM(DECODE(GPVOCE.CODCOLONNA , ''C'', GPVOXCED.IMPVOX,0)) IMPVOCECOMP , '|| 'SUM(DECODE(GPVOCE.CODCOLONNA , ''T'', GPVOXCED.IMPVOX, 0)) IMPVOCETRATT , '|| 'SUM(DECODE(GPVOCE.CODCOLONNA , ''F'', GPVOXCED.IMPVOX, 0)) IMPVOCEFIG , '|| -- 'SUM(GPELERISCONT.IMPMANDATO) IMPVOCE , '|| 'SUM(GPVOXCED.IMPVOX) IMPVOCE, '|| 'GPCAPSISTEXT.CODCAPITOLO DESCAPITOLOART, '|| 'GPELERISCONT.CODANNOMAT CODANNOCOMP, '|| 'RTRIM(GPVALGRVOX.DESVALGRVOX, '' '') DESVALGRVOX, GPVOCE.CODCOLONNA '|| 'FROM GPVERVOCE, GPVOCE, GPVOXCED, GPVALGRVOX, '|| 'GPTPGRVOX,GPELAB, GPELERISCONT, GPRISCONT, GPCAPSISTEXT , GPACCIMPSE, GPDETRISCONT ' || 'WHERE GPELAB.CODENTEAZ = '''|| UPPER(lCODENTEAZ) ||''' AND '|| 'GPRISCONT.CODANNOGRUPPOCONT = ''' || lCODANNOGRUPPOCONT ||''' AND '|| 'GPRISCONT.QTAGRUPPOCONT = '''|| lQTAGRUPPOCONT || ''' AND '|| 'GPELERISCONT.INDSOSPESO = ''N'' AND '|| 'GPELERISCONT.CODTIPOELE = ''VOX'' AND '|| 'GPELERISCONT.IDRRISCONT = GPRISCONT.IDRRISCONT AND '|| 'GPRISCONT.IDRELAB = GPELAB.IDRELAB AND '|| 'GPELERISCONT.IDRELAB = GPRISCONT.IDRELAB AND '|| 'GPDETRISCONT.IDRELAB = GPELERISCONT.IDRELAB AND '|| 'GPDETRISCONT.CODTIPOELE = GPELERISCONT.CODTIPOELE AND '|| 'GPDETRISCONT.CODANNOESERCIZIO = GPELERISCONT.CODANNOESERCIZIO AND '|| 'GPDETRISCONT.CODANNOMAT = GPELERISCONT.CODANNOMAT AND '|| 'GPDETRISCONT.CODPARTE = GPELERISCONT.CODPARTE AND '|| 'GPDETRISCONT.IDCAPITOLO = GPELERISCONT.IDCAPITOLO AND '|| 'GPDETRISCONT.IDCDC = GPELERISCONT.IDCDC AND '|| 'GPDETRISCONT.CODANNOCONT = GPELERISCONT.CODANNOCONT AND '|| 'GPDETRISCONT.IDACCIMP = GPELERISCONT.IDACCIMP AND '|| 'GPDETRISCONT.CODTIPOBEN = GPELERISCONT.CODTIPOBEN AND '|| 'GPDETRISCONT.CODBENEFICIARIO = GPELERISCONT.CODBENEFICIARIO AND '|| 'GPDETRISCONT.IDRRISCONT = GPELERISCONT.IDRRISCONT AND '|| 'GPDETRISCONT.IDRRLAV = GPVOXCED.IDRRLAV AND '|| 'GPDETRISCONT.IDRELAB = GPVOXCED.IDRELAB AND '|| 'GPELERISCONT.CODELEMENTO = GPVOCE.CODVOCE AND '|| 'GPELERISCONT.CODELEMENTO = GPVOXCED.CODVOCE AND '|| 'GPELERISCONT.CODANNOMAT = GPVOXCED.CODANNO AND '|| 'GPELERISCONT.IDCAPITOLO = GPCAPSISTEXT.IDRCAPSISTEXT AND '|| 'GPELERISCONT.IDACCIMP = GPACCIMPSE.IDRACCIMPSE(+) AND ' || 'GPVOXCED.IDRELAB = GPELAB.IDRELAB AND '|| 'GPVOXCED.CODVOCE = GPVOCE.CODVOCE AND '|| 'GPVERVOCE.CODVOCE = GPVOCE.CODVOCE AND '|| 'GPVALGRVOX.CODTPGRVOX = GPVERVOCE.CODTPGRVOX AND '|| 'GPVALGRVOX.CODVALGRVOX = GPVERVOCE.CODVALGRVOX AND '|| 'GPVALGRVOX.CODTPGRVOX = ''GRUPPOCONT'' AND '|| '(( 0 = (SELECT COUNT (*) FROM GPVERVOCE '|| 'WHERE CODVERSIONE = '''|| UPPER(lCODENTEAZ) ||''' AND CODVOCE = GPVOCE.CODVOCE) '|| ' AND GPVERVOCE.CODVERSIONE = ''STD'' ) '|| ' OR (GPVERVOCE.CODVERSIONE = '''|| UPPER(lCODENTEAZ) ||''')) '|| ' AND GPTPGRVOX.CODTPGRVOX = GPVERVOCE.CODTPGRVOX '; IF lCODPARTE = 'E' THEN --PARTE ENTRATA sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || ' AND GPELERISCONT.CODPARTE = ''E'' '; ELSIF lCODPARTE = 'S' THEN --PARTE SPESA sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || ' AND GPELERISCONT.CODPARTE = ''S'' '; END IF; IF lCODVALGRVOX IS NOT NULL THEN -- FILTRO PER GRUPPO VOCE sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || ' AND GPVALGRVOX.CODVALGRVOX = ' || lCODVALGRVOX; END IF; --IF lINDVOX = 'S' THEN IF lCODVOCE IS NOT NULL THEN sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || ' AND GPVOCE.CODVOCE = ' || lCODVOCE; END IF; --END IF; sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || ' GROUP BY GPVOCE.CODVOCE, GPELERISCONT.IDRELAB,'|| ' GPELERISCONT.CODPARTE, GPVOCE.DESVOCE, '|| ' GPELERISCONT.IDCAPITOLO, GPCAPSISTEXT.CODCAPITOLO, '|| ' GPELERISCONT.CODANNOMAT ,GPVALGRVOX.DESVALGRVOX, GPVOCE.CODCOLONNA '|| 'ORDER BY 3'; END IF; nRet := PKUTILITYPAG.fnCreateView ( sQUERYGPELERISCONT1, lCodSessione, sVIEWGPELERISCONT, ERRDIAG ); IF nRet < 0 THEN RETURN nRet; END IF; lVIEWGPELERISCONT := sVIEWGPELERISCONT; RETURN 1; EXCEPTION WHEN OTHERS THEN ROLLBACK; RETURN pkUtility.fnError( 'fnTotVociXCapArtDVR', SQLCODE, ERRDIAG ); END fnTotVociXCapArtDVR; FUNCTION fnElnDipVociPrtGiroDVR ( lCODENTEAZ IN PKTYPE.TYSTRINGA%TYPE, lCODANNOGRUPPOCONT IN PKTYPE.TYSTRINGA%TYPE, lQTAGRUPPOCONT IN PKTYPE.TYSTRINGA%TYPE, lCODVALGRVOX IN PKTYPE.TYSTRINGA%TYPE, -- VALORE DI GRUPPO prende le voci raggruppate per gruppo, lCODVOCE IN PKTYPE.TYSTRINGA%TYPE, -- Indica la voce iniziale per il range di voci lDESSCHEMASERFIN IN PKTYPE.TYSTRINGA%TYPE, -- schema dal quale prendere tabelle Contabilità, non so se serve Se é NULL --> non esiste schema contabilità lCODTPMETAVAL IN PKTYPE.TYSTRINGA%TYPE, lCODSESSIONE IN PKTYPE.TYSTRINGA%TYPE, lVIEWGPELERISCONT OUT PKTYPE.TYSTRINGA%TYPE, ERRDIAG OUT PKTYPE.TYSTRINGA%TYPE) RETURN NUMERIC IS nRet NUMBER(9); sVIEWGPELERISCONT pktype.TyStringa%Type:= 'GPDIPXPRTGIRO'; sQUERYGPELERISCONT VARCHAR2(30000); sQUERYGPELERISCONT1 VARCHAR2(30000); sQUERYGPELERISCONTE VARCHAR2(30000); sQUERYGPELERISCONTS VARCHAR2(30000); nNumRec NUMBER(9); sTpContab GPINFO.TIPOINFO%TYPE; sNomeSchema VARCHAR2(255); sNomeDBLink VARCHAR2(255); sQuery VARCHAR2(4000); BEGIN IF lDESSCHEMASERFIN IS NOT NULL THEN -- Il campo DESSCHEMASERFIN ora può essere nella forma SCHEMA@DBLINK IF INSTR(lDESSCHEMASERFIN, '@') > 0 THEN sNomeSchema := SUBSTR(lDESSCHEMASERFIN, 1, INSTR(lDESSCHEMASERFIN, '@') - 1); sNomeDBLink := SUBSTR(lDESSCHEMASERFIN, INSTR(lDESSCHEMASERFIN, '@') + 1, LENGTH(lDESSCHEMASERFIN)); ELSE sNomeSchema := lDESSCHEMASERFIN; END IF; -- controllo se esiste lo schema con descrizione passata sQuery := 'SELECT COUNT(*) FROM ALL_USERS'; IF sNomeDBLink IS NOT NULL THEN sQuery := sQuery || '@' || sNomeDBLink; END IF; sQuery := sQuery || ' WHERE USERNAME = UPPER( ''' || sNomeSchema || ''' )'; EXECUTE IMMEDIATE sQuery INTO nNumRec; IF nNumRec = 0 THEN -- ritorno Errore ROLLBACK; ERRDIAG := 'L''Ente/Azienda selezionato non esiste in Contabilità'; RETURN pkUtility.fnError( 'fnElnDipVociPrtGiroDVR', -499, ERRDIAG ); END IF; sQuery := 'SELECT COUNT(*) FROM ALL_TABLES'; IF sNomeDBLink IS NOT NULL THEN sQuery := sQuery || '@' || sNomeDBLink; END IF; sQuery := sQuery || ' WHERE TABLE_NAME IN ( UPPER(''CFCENTRIRESPONSABILITA''), UPPER(''CFDESCENTRIRESP''), UPPER(''CFRESPONSABILI'') ) AND OWNER = UPPER( ''' || sNomeSchema || ''' )'; EXECUTE IMMEDIATE sQuery INTO nNumRec; sQuery := 'SELECT COUNT(*) + ' || nNumRec || ' FROM ALL_VIEWS'; IF sNomeDBLink IS NOT NULL THEN sQuery := sQuery || '@' || sNomeDBLink; END IF; sQuery := sQuery || ' WHERE OWNER= UPPER( ''' || sNomeSchema || ''' ) AND UPPER(VIEW_NAME)=''VWFRMDISPEXPERS'''; EXECUTE IMMEDIATE sQuery INTO nNumRec; IF nNumRec <> 4 THEN -- ritorno Errore ROLLBACK; ERRDIAG := 'Nello schema specificato non esistono alcune tabelle necessarie alla Contabilizzazione'; RETURN pkUtility.fnError( 'fnElnDipVociPrtGiroDVR', -499, ERRDIAG ); END IF; END IF; -- vedo che tipo di contabilizzazione abbiamo: 0 = nessuna, 1= Serfin, 2 = Sistemi esterni (Studio K) SELECT NVL(MAX(CODULT),0) -- per default metto 0 = Nessuna contabilizzazione INTO sTpContab FROM GPINFO WHERE TIPOINFO= 'TPCOLCONT' AND CODINFO= UPPER(lCODENTEAZ); IF sTpContab = 0 THEN -- Caso Nessuna Contabilizzazione sQUERYGPELERISCONT1 := 'SELECT DISTINCT GPRAPLAV.CODMATRICOLA, GPELAB.IDRELAB, GPRISCONT.CODPARTE, gppersona.idrpersona, '|| '(GPPERSONA.DESCOGNOME ||'' ''|| GPPERSONA.DESNOME) NOMINATIVO, to_char(GPPERSONA.DTANASCITA, ''dd/mm/yyyy'') dtanascita, '|| 'GPVOXCED.CODVOCE , GPVOCE.DESVOCE , GPVOXCED.CODVOCE || ''-'' ||GPVOCE.DESVOCE DESVOCEESTESA, '|| 'ENTRATA.idcapitolo CAPENTRATA, SPESA.idcapitolo CAPSPESA, GPVOXCED.IMPVOX IMPORTOVOX, gpvalgrvox.desvalgrvox '|| 'FROM GPVALGRVOX, GPTPGRVOX, GPVERVOCE, GPVOCE, GPVOXCED, GPPERSONA, GPRAPLAV, '|| 'GPCEDOLINO ,GPCURRICULUM , gpelab ,GPELERISCONT ENTRATA, GPELERISCONT SPESA, GPRISCONT '; IF lCODTPMETAVAL IS NOT NULL THEN sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || ',GPMETAVAL '; END IF; sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || ' WHERE GPCURRICULUM.IDRPERSONA = GPRAPLAV.IDRPERSONA AND '; IF lCODTPMETAVAL IS NOT NULL THEN sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || 'GPCURRICULUM.CODTPMETAVAL = UPPER('''|| lCODTPMETAVAL ||''') AND '|| 'GPCURRICULUM.CODTPMETAVAL = GPMETAVAL.CODTPMETA AND '|| 'GPCURRICULUM.IDRVALMETA = GPMETAVAL.IDRVALMETA AND '; END IF; sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || 'GPRISCONT.CODANNOGRUPPOCONT = ''' || lCODANNOGRUPPOCONT ||''' AND '|| 'GPRISCONT.QTAGRUPPOCONT = '''|| lQTAGRUPPOCONT || ''' AND '|| 'ENTRATA.INDSOSPESO = ''N'' AND '|| 'ENTRATA.CODTIPOELE = ''VOX'' AND '|| 'ENTRATA.IDRRISCONT = GPRISCONT.IDRRISCONT AND '|| 'ENTRATA.IDRELAB = GPRISCONT.IDRELAB AND '|| 'ENTRATA.INDSOSPESO = SPESA.INDSOSPESO AND '|| 'ENTRATA.CODTIPOELE = SPESA.CODTIPOELE AND '|| 'ENTRATA.IDRELAB = SPESA.IDRELAB AND '|| 'ENTRATA.CODELEMENTO = SPESA.CODELEMENTO AND '|| 'ENTRATA.CODPARTE = ''E'' AND SPESA.CODPARTE = ''S'' AND '|| 'GPRISCONT.IDRELAB = GPELAB.IDRELAB AND '|| 'GPVOCE.CODVOCE = ENTRATA.CODELEMENTO AND '|| 'GPCEDOLINO.IDRELAB = gpelab.idrelab AND '|| 'GPELAB.CODENTEAZ = GPPERSONA.CODENTEAZ AND '|| 'GPCEDOLINO.CODSTATO = ''2'' AND '|| 'GPCEDOLINO.IDRRLAV = GPRAPLAV.IDRRLAV AND '|| 'GPPERSONA.IDRPERSONA = GPRAPLAV.IDRPERSONA AND '|| 'GPPERSONA.CODENTEAZ = '''|| UPPER(lCODENTEAZ) ||''' AND '|| 'GPVOXCED.IDRRLAV = GPCEDOLINO.IDRRLAV AND '|| 'GPVOXCED.IDRELAB = GPCEDOLINO.IDRELAB AND '|| 'GPVOXCED.CODVOCE = GPVOCE.CODVOCE AND '|| 'GPVERVOCE.CODVOCE = GPVOCE.CODVOCE AND '|| '( ( 0 = ( SELECT COUNT(*) FROM GPVERVOCE WHERE CODVERSIONE = '''|| UPPER(lCODENTEAZ) ||''' AND CODVOCE = GPVOCE.CODVOCE) AND '|| 'GPVERVOCE.CODVERSIONE = ''STD'') OR (GPVERVOCE.CODVERSIONE = '''|| UPPER(lCODENTEAZ) ||''' ) ) AND '|| 'GPVOXCED.IMPVOX <> 0 AND '|| 'GPTPGRVOX.CODTPGRVOX = GPVERVOCE.CODTPGRVOX AND '|| 'GPVALGRVOX.CODTPGRVOX = GPVERVOCE.CODTPGRVOX AND '|| 'GPVALGRVOX.CODVALGRVOX = GPVERVOCE.CODVALGRVOX AND '|| 'GPVALGRVOX.INDPGIRO = ''S'' '; IF lCODVALGRVOX IS NOT NULL THEN -- FILTRO PER GRUPPO VOCE sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || ' AND GPVALGRVOX.CODVALGRVOX = ' || lCODVALGRVOX; END IF; IF lCODVOCE IS NOT NULL THEN sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || ' AND GPVOCE.CODVOCE = ' || lCODVOCE; END IF; sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || ' ORDER BY GPVOXCED.CODVOCE, NOMINATIVO'; ELSIF sTpContab = 1 THEN -- Caso Contabilizzazione con Serfin sQUERYGPELERISCONT1 := 'SELECT DISTINCT GPRAPLAV.CODMATRICOLA, GPELAB.IDRELAB, GPRISCONT.CODPARTE, gppersona.idrpersona, '|| '(GPPERSONA.DESCOGNOME || '' '' ||GPPERSONA.DESNOME) NOMINATIVO, to_char(GPPERSONA.DTANASCITA, ''dd/mm/yyyy'') dtanascita, '|| 'GPVOXCED.CODVOCE , GPVOCE.DESVOCE , GPVOXCED.CODVOCE || ''-'' ||GPVOCE.DESVOCE DESVOCEESTESA, '|| '(FENTRATA.CAP || ''/''|| FENTRATA.ART) CAPENTRATA, (FSPESA.CAP || ''/''|| FSPESA.ART) CAPSPESA, '|| 'GPVOXCED.IMPVOX IMPORTOVOX ,gpvalgrvox.desvalgrvox '|| 'FROM GPVALGRVOX, GPTPGRVOX, GPVERVOCE, GPVOCE, GPVOXCED, GPPERSONA, GPRAPLAV, '|| 'GPCEDOLINO ,GPCURRICULUM , GPELAB, '||sNomeSchema||'.VWFRMDISPEXPERS'; IF sNomeDBLink IS NOT NULL THEN sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || '@' || sNomeDBLink; END IF; sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || ' FENTRATA, '||sNomeSchema||'.VWFRMDISPEXPERS'; IF sNomeDBLink IS NOT NULL THEN sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || '@' || sNomeDBLink; END IF; sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || ' FSPESA, '|| ' GPELERISCONT ENTRATA, GPELERISCONT SPESA, GPRISCONT '; IF lCODTPMETAVAL IS NOT NULL THEN sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || ', GPMETAVAL '; END IF; sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || ' WHERE GPCURRICULUM.IDRPERSONA = GPRAPLAV.IDRPERSONA AND '; IF lCODTPMETAVAL IS NOT NULL THEN sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || 'GPCURRICULUM.CODTPMETAVAL = UPPER('''|| lCODTPMETAVAL ||''') AND '|| 'GPCURRICULUM.CODTPMETAVAL = GPMETAVAL.CODTPMETA AND '|| 'GPCURRICULUM.IDRVALMETA = GPMETAVAL.IDRVALMETA AND '; END IF; sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || 'GPRISCONT.CODANNOGRUPPOCONT = ''' || lCODANNOGRUPPOCONT ||''' AND '|| 'GPRISCONT.QTAGRUPPOCONT = '''|| lQTAGRUPPOCONT || ''' AND '|| 'GPRISCONT.IDCAPITOLO = FENTRATA.IDCAPITOLO AND FENTRATA.CODTIPOELE=''CAPITOLO'' AND '|| 'GPRISCONT.IDCAPITOLO = FSPESA.IDCAPITOLO AND FSPESA.CODTIPOELE=''CAPITOLO'' AND '|| 'GPRISCONT.IDRELAB = GPELAB.IDRELAB AND '|| 'ENTRATA.INDSOSPESO = ''N'' AND '|| 'ENTRATA.CODTIPOELE = ''VOX'' AND '|| 'ENTRATA.IDRRISCONT = GPRISCONT.IDRRISCONT AND '|| 'ENTRATA.IDRELAB = GPRISCONT.IDRELAB AND '|| 'ENTRATA.INDSOSPESO = SPESA.INDSOSPESO AND '|| 'ENTRATA.CODTIPOELE = SPESA.CODTIPOELE AND '|| 'ENTRATA.IDRELAB = SPESA.IDRELAB AND '|| 'ENTRATA.CODELEMENTO = SPESA.CODELEMENTO AND '|| 'ENTRATA.CODELEMENTO = GPVOCE.CODVOCE AND '|| 'ENTRATA.CODPARTE = ''E'' AND SPESA.CODPARTE =''S'' AND '|| 'GPCEDOLINO.IDRELAB = gpelab.idrelab AND '|| 'GPELAB.CODENTEAZ = GPPERSONA.CODENTEAZ AND '|| 'GPCEDOLINO.CODSTATO = ''2'' AND '|| 'GPCEDOLINO.IDRRLAV = GPRAPLAV.IDRRLAV AND '|| 'GPPERSONA.IDRPERSONA = GPRAPLAV.IDRPERSONA AND '|| 'GPPERSONA.CODENTEAZ = '''|| UPPER(lCODENTEAZ) ||''' AND '|| 'GPVOXCED.IDRRLAV = GPCEDOLINO.IDRRLAV AND '|| 'GPVOXCED.IDRELAB = GPCEDOLINO.IDRELAB AND '|| 'GPVOXCED.CODVOCE = GPVOCE.CODVOCE AND '|| 'GPVERVOCE.CODVOCE = GPVOCE.CODVOCE AND '|| '( ( 0 = ( SELECT COUNT(*) FROM GPVERVOCE WHERE CODVERSIONE = '''|| UPPER(lCODENTEAZ) ||''' AND CODVOCE = GPVOCE.CODVOCE) AND '|| 'GPVERVOCE.CODVERSIONE = ''STD'') OR (GPVERVOCE.CODVERSIONE = '''|| UPPER(lCODENTEAZ) ||''' ) ) AND '|| 'GPVOXCED.IMPVOX <> 0 AND '|| 'GPTPGRVOX.CODTPGRVOX = GPVERVOCE.CODTPGRVOX AND '|| 'GPVALGRVOX.CODTPGRVOX = GPVERVOCE.CODTPGRVOX AND '|| 'GPVALGRVOX.CODVALGRVOX = GPVERVOCE.CODVALGRVOX AND '|| 'GPVALGRVOX.INDPGIRO = ''S'''; IF lCODVALGRVOX IS NOT NULL THEN -- FILTRO PER GRUPPO VOCE sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || ' AND GPVALGRVOX.CODVALGRVOX = ' || lCODVALGRVOX; END IF; IF lCODVOCE IS NOT NULL THEN sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || ' AND GPVOCE.CODVOCE = ' || lCODVOCE; END IF; sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || ' ORDER BY GPVOXCED.CODVOCE, NOMINATIVO'; ELSIF sTpContab >= 2 THEN -- Caso Contabilizzazione con Sistemi Esterni (Studio K) sQUERYGPELERISCONT1 := 'SELECT DISTINCT GPRAPLAV.CODMATRICOLA, GPELAB.IDRELAB, GPRISCONT.CODPARTE, gppersona.idrpersona, '|| '(GPPERSONA.DESCOGNOME || '' ''||GPPERSONA.DESNOME) NOMINATIVO, to_char(GPPERSONA.DTANASCITA, ''dd/mm/yyyy'') dtanascita, '|| 'GPVOXCED.CODVOCE , GPVOCE.DESVOCE , GPVOXCED.CODVOCE || ''-'' ||GPVOCE.DESVOCE DESVOCEESTESA, '|| 'GPCAPSISTEXTE.CODCAPITOLO CAPENTRATA, GPCAPSISTEXTS.CODCAPITOLO CAPSPESA ,GPVOXCED.IMPVOX IMPORTOVOX ,gpvalgrvox.desvalgrvox '|| 'FROM GPVALGRVOX, GPTPGRVOX, GPVERVOCE, GPVOCE, GPVOXCED, GPPERSONA, GPRAPLAV, '|| 'GPCEDOLINO ,GPCURRICULUM , gpelab ,GPELERISCONT ENTRATA, GPELERISCONT SPESA, GPRISCONT, '|| 'GPCAPSISTEXT GPCAPSISTEXTE , GPCAPSISTEXT GPCAPSISTEXTS '; IF lCODTPMETAVAL IS NOT NULL THEN sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || ', GPMETAVAL '; END IF; sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || ' WHERE GPCURRICULUM.IDRPERSONA = GPRAPLAV.IDRPERSONA AND '; IF lCODTPMETAVAL IS NOT NULL THEN sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || 'GPCURRICULUM.CODTPMETAVAL = UPPER('''|| lCODTPMETAVAL ||''') AND '|| 'GPCURRICULUM.CODTPMETAVAL = GPMETAVAL.CODTPMETA AND '|| 'GPCURRICULUM.IDRVALMETA = GPMETAVAL.IDRVALMETA AND '; END IF; sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || 'GPRISCONT.CODANNOGRUPPOCONT = ''' || lCODANNOGRUPPOCONT ||''' AND '|| 'GPRISCONT.QTAGRUPPOCONT = '''|| lQTAGRUPPOCONT || ''' AND '|| 'ENTRATA.INDSOSPESO = ''N'' AND '|| 'ENTRATA.CODTIPOELE = ''VOX'' AND '|| 'ENTRATA.IDRRISCONT = GPRISCONT.IDRRISCONT AND '|| 'ENTRATA.IDRELAB = GPRISCONT.IDRELAB AND '|| 'ENTRATA.INDSOSPESO = SPESA.INDSOSPESO AND '|| 'ENTRATA.CODTIPOELE = SPESA.CODTIPOELE AND '|| 'ENTRATA.IDRELAB = SPESA.IDRELAB AND '|| 'ENTRATA.CODELEMENTO = SPESA.CODELEMENTO AND '|| 'ENTRATA.CODPARTE = ''E'' AND SPESA.CODPARTE =''S'' AND '|| 'ENTRATA.IDCAPITOLO = GPCAPSISTEXTE.IDRCAPSISTEXT AND '|| 'SPESA.IDCAPITOLO = GPCAPSISTEXTS.IDRCAPSISTEXT AND '|| 'GPRISCONT.IDRELAB = GPELAB.IDRELAB AND '|| 'GPVOCE.CODVOCE = ENTRATA.CODELEMENTO AND '|| 'GPCEDOLINO.IDRELAB = gpelab.idrelab AND '|| 'GPELAB.CODENTEAZ = GPPERSONA.CODENTEAZ AND '|| 'GPCEDOLINO.CODSTATO = ''2'' AND '|| 'GPCEDOLINO.IDRRLAV = GPRAPLAV.IDRRLAV AND '|| 'GPPERSONA.IDRPERSONA = GPRAPLAV.IDRPERSONA AND '|| 'GPPERSONA.CODENTEAZ = '''|| UPPER(lCODENTEAZ) ||''' AND '|| 'GPVOXCED.IDRRLAV = GPCEDOLINO.IDRRLAV AND '|| 'GPVOXCED.IDRELAB = GPCEDOLINO.IDRELAB AND '|| 'GPVOXCED.CODVOCE = GPVOCE.CODVOCE AND '|| 'GPVERVOCE.CODVOCE = GPVOCE.CODVOCE AND '|| '( ( 0 = ( SELECT COUNT(*) FROM GPVERVOCE WHERE CODVERSIONE = '''|| UPPER(lCODENTEAZ) ||''' AND CODVOCE = GPVOCE.CODVOCE) AND '|| 'GPVERVOCE.CODVERSIONE = ''STD'') OR (GPVERVOCE.CODVERSIONE = '''|| UPPER(lCODENTEAZ) ||''' ) ) AND '|| 'GPVOXCED.IMPVOX <> 0 AND '|| 'GPTPGRVOX.CODTPGRVOX = GPVERVOCE.CODTPGRVOX AND '|| 'GPVALGRVOX.CODTPGRVOX = GPVERVOCE.CODTPGRVOX AND '|| 'GPVALGRVOX.CODVALGRVOX = GPVERVOCE.CODVALGRVOX AND '|| 'GPVALGRVOX.INDPGIRO = ''S'''; IF lCODVALGRVOX IS NOT NULL THEN -- FILTRO PER GRUPPO VOCE sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || ' AND GPVALGRVOX.CODVALGRVOX = ' || lCODVALGRVOX; END IF; IF lCODVOCE IS NOT NULL THEN sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || ' AND GPVOCE.CODVOCE = ' || lCODVOCE; END IF; sQUERYGPELERISCONT1 := sQUERYGPELERISCONT1 || ' ORDER BY GPVOXCED.CODVOCE, NOMINATIVO'; END IF; nRet := PKUTILITYPAG.fnCreateView ( sQUERYGPELERISCONT1, lCodSessione, sVIEWGPELERISCONT, ERRDIAG ); IF nRet < 0 THEN RETURN nRet; END IF; lVIEWGPELERISCONT := sVIEWGPELERISCONT; RETURN 1; EXCEPTION WHEN OTHERS THEN ROLLBACK; RETURN pkUtility.fnError( 'fnElnDipVociPrtGiroDVR', SQLCODE, ERRDIAG ); END fnElnDipVociPrtGiroDVR; -- funzione che genera la vista per il controllo sulla contabilizzazione Mandati/Reversali -- con importo negativo. FUNCTION fnTestContNegativoDVR ( lCODENTEAZ IN PKTYPE.TYSTRINGA%TYPE, lCODANNOGRUPPOCONT IN PKTYPE.TYSTRINGA%TYPE, lQTAGRUPPOCONT IN PKTYPE.TYSTRINGA%TYPE, lvwSerfinCap IN PKTYPE.TYSTRINGA%TYPE, lvwSerfinAcc IN PKTYPE.TYSTRINGA%TYPE, lCODSESSIONE IN PKTYPE.TYSTRINGA%TYPE, lVIEWIMPNEGATIVO OUT PKTYPE.TYSTRINGA%TYPE, ERRDIAG OUT PKTYPE.TYSTRINGA%TYPE ) RETURN NUMERIC IS nRet NUMBER(9); sQUERYIMPMANREVNEG VARCHAR2(30000); SVIEWIMPNEGATIVO VARCHAR2(50) := 'GPIMPMANREVNEG'; sTpCont GPINFO.TIPOINFO%TYPE; BEGIN SELECT MAX(CODULT) INTO sTpCont FROM GPINFO WHERE TIPOINFO='TPCOLCONT' AND CODINFO=lCODENTEAZ; IF sTpCont = 0 THEN --NESSUNA CONTABILIZAZIONE sQUERYIMPMANREVNEG := 'SELECT DECODE(A.CODPARTE,''E'',''Entrata'',''S'',''Spesa'') DESPARTE, '|| 'A.IDCAPITOLO DESCAPITOLO, A.IDACCIMP || '' '' || A.CODANNOCONT DESACCIMP, '|| 'A.DESBENEFICIARIO, B.DESCDC, SUM(A.IMPMANREV) IMPMANREV '|| 'FROM GPRISCONT A, GPLCDC B, GPELAB C '|| 'WHERE C.CODENTEAZ = upper('''|| lCODENTEAZ ||''') AND '|| 'A.CODANNOGRUPPOCONT = ''' || lCODANNOGRUPPOCONT ||''' AND '|| 'A.QTAGRUPPOCONT = ''' || lQTAGRUPPOCONT ||''' AND '|| 'A.IDRELAB = C.IDRELAB AND '|| 'A.IDCDC = B.IDRCDC(+) '|| 'GROUP BY CODPARTE , IDCAPITOLO, IDACCIMP, '|| 'CODANNOCONT,DESBENEFICIARIO, DESCDC '|| 'HAVING SUM (A.IMPMANREV) < 0 ' || 'ORDER BY DESPARTE, DESCAPITOLO, DESACCIMP, DESBENEFICIARIO '; ELSIF sTpCont = 1 THEN -- Contabilizzazione con Serfin sQUERYIMPMANREVNEG := 'SELECT DECODE(A.CODPARTE,''E'',''Entrata'',''S'',''Spesa'') DESPARTE, ' || 'C.DESCAPITOLO, D.DESESTESAACC DESACCIMP, A.DESBENEFICIARIO, B.DESCDC, SUM(A.IMPMANREV) IMPMANREV ' || 'FROM GPLCDC B, ' ||lvwSerfinCap ||' C, '||lvwSerfinAcc ||' D, GPELAB E, GPRISCONT A '|| 'WHERE A.CODPARTE = ''E'' '|| 'AND E.CODENTEAZ = UPPER('''|| lCODENTEAZ ||''') '|| 'AND A.CODANNOGRUPPOCONT = '''||lCODANNOGRUPPOCONT ||''' '|| 'AND A.QTAGRUPPOCONT = '''|| lQTAGRUPPOCONT||''' '|| 'AND A.IDCAPITOLO = C.IDCAPITOLO(+) AND A.IDCDC = B.IDRCDC(+) '|| 'AND A.IDRELAB = E.IDRELAB AND A.IDACCIMP = D.IDACC(+) ' || 'GROUP BY A.CODPARTE, C.DESCAPITOLO, D.DESESTESAACC,A.DESBENEFICIARIO, B.DESCDC '|| 'HAVING SUM (A.IMPMANREV) < 0 ' || 'UNION SELECT DECODE(A.CODPARTE,''E'',''Entrata'',''S'',''Spesa'') DESPARTE, '|| 'C.DESCAPITOLO, D.DESESTESAACC DESACCIMP, A.DESBENEFICIARIO, B.DESCDC, SUM(A.IMPMANREV) IMPMANREV '|| 'FROM GPLCDC B, ' ||lvwSerfinCap ||' C, '||lvwSerfinAcc ||' D, GPELAB E, GPRISCONT A '|| 'WHERE A.CODPARTE = ''S'' '|| 'AND E.CODENTEAZ = UPPER('''|| lCODENTEAZ ||''') '|| 'AND A.CODANNOGRUPPOCONT = '''||lCODANNOGRUPPOCONT ||''' '|| 'AND A.QTAGRUPPOCONT = '''|| lQTAGRUPPOCONT||''' '|| 'AND A.IDCAPITOLO = C.IDCAPITOLO(+) AND A.IDCDC = B.IDRCDC(+) '|| 'AND A.IDRELAB = E.IDRELAB AND A.IDACCIMP = D.IDACC(+) '|| 'GROUP BY A.CODPARTE, C.DESCAPITOLO, D.DESESTESAACC,A.DESBENEFICIARIO, B.DESCDC '|| 'HAVING SUM (A.IMPMANREV) < 0 ' || 'ORDER BY 1, 2, 3'; ELSE --Cont.Esterna sQUERYIMPMANREVNEG := 'SELECT DECODE(A.CODPARTE,''E'',''Entrata'',''S'',''Spesa'') DESPARTE, ' || 'C.CODCAPITOLO || '' '' || C.ANNOCAPITOLO DESCAPITOLO, ' || 'D.CODACCIMP || '' '' || D.ANNOACCIMP DESACCIMP, A.DESBENEFICIARIO, B.DESCDC, SUM(A.IMPMANREV) IMPMANREV ' || 'FROM GPLCDC B, GPCAPSISTEXT C, GPACCIMPSE D, GPELAB E, GPRISCONT A ' || 'WHERE A.CODPARTE = ''E'' ' || 'AND E.CODENTEAZ = UPPER(''' || lCODENTEAZ|| ''') ' || 'AND A.CODANNOGRUPPOCONT = '''|| lCODANNOGRUPPOCONT||''' '|| 'AND A.QTAGRUPPOCONT = '''||lQTAGRUPPOCONT ||''' ' || 'AND A.IDCAPITOLO = C.IDRCAPSISTEXT(+) AND A.IDCDC = B.IDRCDC(+) ' || 'AND A.IDRELAB = E.IDRELAB AND A.IDACCIMP = D.IDRACCIMPSE(+) ' || 'GROUP BY A.CODPARTE, C.CODCAPITOLO, C.ANNOCAPITOLO, D.CODACCIMP, D.ANNOACCIMP, ' || ' A.DESBENEFICIARIO, B.DESCDC ' || 'HAVING SUM (A.IMPMANREV) < 0 ' || 'UNION '|| 'SELECT DECODE(A.CODPARTE,''E'',''Entrata'',''S'',''Spesa'') DESPARTE, ' || 'C.CODCAPITOLO || '' '' || C.ANNOCAPITOLO DESCAPITOLO, ' || 'D.CODACCIMP || '' '' || D.ANNOACCIMP DESACCIMP, A.DESBENEFICIARIO, B.DESCDC, SUM(A.IMPMANREV) IMPMANREV ' || 'FROM GPLCDC B, GPCAPSISTEXT C, GPACCIMPSE D, GPELAB E, GPRISCONT A '|| 'WHERE A.CODPARTE = ''S'' ' || 'AND E.CODENTEAZ = upper('''|| lCODENTEAZ || ''') ' || 'AND A.CODANNOGRUPPOCONT = '''||lCODANNOGRUPPOCONT ||''' ' || 'AND A.QTAGRUPPOCONT = ''' || lQTAGRUPPOCONT ||''' ' || 'AND A.IDCAPITOLO = C.IDRCAPSISTEXT(+) AND A.IDCDC = B.IDRCDC(+) ' || 'AND A.IDRELAB = E.IDRELAB AND A.IDACCIMP = D.IDRACCIMPSE(+) ' || 'GROUP BY A.CODPARTE, C.CODCAPITOLO, C.ANNOCAPITOLO, D.CODACCIMP, D.ANNOACCIMP, ' || 'A.DESBENEFICIARIO, B.DESCDC ' || 'HAVING SUM (A.IMPMANREV) < 0 ' || 'ORDER BY 1, 2, 3'; END IF; nRet := PKUTILITYPAG.fnCreateView ( sQUERYIMPMANREVNEG, lCodSessione, sVIEWIMPNEGATIVO, ERRDIAG ); IF nRet < 0 THEN RETURN nRet; END IF; lVIEWIMPNEGATIVO:= sVIEWIMPNEGATIVO; RETURN 1; EXCEPTION WHEN OTHERS THEN ROLLBACK; RETURN pkUtility.fnError( 'fnTestContNegativoDVR', SQLCODE, ERRDIAG ); END fnTestContNegativoDVR; END pkGPContab; / -- End of DDL Script for Package Body NAPOLICONT.PKGPCONTAB CREATE OR REPLACE PACKAGE BODY PKGPCONTABEVOL AS FUNCTION fnTestCedMov( lTIDRELAB IN pkType.tyTStringa, ERRDIAG OUT pkType.tyStringa%TYPE) RETURN NUMERIC IS nCount NUMBER(9); sListaElab VARCHAR2(4000); sDesElab GPELAB.DESELAB%TYPE; BEGIN FOR J In 1..NVL(lTIDRELAB.LAST,0) LOOP SELECT COUNT(*) INTO nCount FROM GPCEDOLINO WHERE IDRELAB = lTIDRELAB(J) AND CODSTATO = 4; IF nCount > 0 THEN SELECT DESELAB INTO sDesElab FROM GPELAB WHERE IDRELAB = lTIDRELAB(J); IF TRIM(sListaElab) IS NULL THEN sListaElab := sDesElab; ELSE sListaElab := sListaElab || ', ' || sDesElab; END IF; END IF; END LOOP; IF TRIM(sListaElab) IS NOT NULL THEN ERRDIAG := 'Operazione impossibile: sono presenti dei cedolini movimentati nelle seguenti elaborazioni: ' || sListaElab; RETURN pkUtility.fnError( 'fnTestCedMov', -499, ERRDIAG ); END IF; RETURN 1; END fnTestCedMov; -- Autore: SA20020419 /************************************************************************** * CONTABILIZZAZIONE * ***************************************************************************/ /* Funzione che esegue la contabilizzazione: assicura le stesse operazioni dell'originale ma con delle funzionalità aggiuntive Calcolo con casi particolari 1. Correzione da apportare 2. Con ripartizione percentuale 3. Con controllo di sfondamento e capitolo alternativo 1. Correzione da apportare Nella corrente versione non è stato preso in considerazione il caso in cui una persona può far parte di più Funzioni e Servizio/Cdc. In tal caso incorre nell'Errore Oracle di chiave duplicata (sulla temporanea delle Regole). Occorre perciò fare in modo di tenerne conto nel riempimento: gestire il campo IDR nella chiave( per ora era fisso a 1 ) delle Regole per indicare le regole valide all'i-esima iterazione; aggiungere una tabella Temporanea dei riferimenti contabili ( GPTMPRIFXCONT ), che contenga un campo GIRO per indicare al calcolo quale riferimento contabile considerare per la persona all'iterazione i-esima. Il calcolo verrà iterato tante volte quanti sono i differenti riferimenti contabili della persona. Si può lasciare inalterato il reperimento delle Regole di Calcolo, che però inserirà ad ogni giro le Regole che servono per il calcolo relativamente all'i-esimo rif.cont., con IDR pari al giro che si sta effettuando. Al primo giro si prenderà per ogni persona il primo riferimento contabile ( memorizzato nella TMP con GIRO = 1 ) e il calcolo per tutti quegli elementi avverrà considerando PRCAPPARTENENZA = 100. Nei giri successivi(i>0), il calcolo scorrerà tutte le regole e i rif.contabili del giro, applicando le regole specificate per il giro i-esimo andando a sottrarre il calcolato attuale dal calcolato del giro 1. 2. considerare l'appartenenza di una persona a più CDC e quindi ripartire su di essi in base alla % di appartenenza. Nell'applicazione delle regole tenevo conto solo dei rif. Contabili della persona per un periodo in particolare supponendo un solo CDC e una sola Funzione/Servizio, ma quando vado sui dettagli dei riferimenti contabili ne posso trovare n e quindi nel peggiore dei casi potrei avere n differenti regole di contabilizzazione quanti sono i CDC, o meglio, le Funzioni/Servizio a cui appartiene la persona; potrei inserire queste eventuali n regole di contabilizzazione nella TMP delle Regole da applicare( GPTMPREGCONTCED ). Vedi (1). Posso avere i seguenti casi: - un solo CDC al 100% ( no molteplicità di funzione/servizio) - diversi CDC con varie percentuali ma con medesima funzione/servizio( La Regola è la stessa); - diversi CDC con varie percentuali e diverse funzioni/servizio(potrebbero cambiare le Regole). NOTA: Una volta reperite le Regole, nel caso in cui INDXCDC = 'N' faranno fede le regole così come sono scritte nella GPTMPREGCONTCED, ma nella GPTMPRIFXCONT i campi relativi al CDC saranno 0 e, nel caso di stessa Funzione/Servizio, il calcolo così come è fatto, sommerà la PRCAPPARTENENZA. 3. Gestione degli alternativi( se è in linea Serfin) Notizie sugli alternativi già ce l'ho nella temporanea delle Regole. NOTA: Considero l'Alternativo come Alternativo di Capitolo e non di regola. Terminati i calcoli, mi scorrerò i Mandati e farò i controlli incrociati con le disponibilità dei Capitoli. Per ora avendo già memorizzato, nella temporanea delle Regole gli alternativi, per ogni capitolo/Impegno Individuo i Capitoli che superano le disonibilità in Serfin; individuo alternativi di Capitolo; non mi interessa vedere il Beneficiario indicato nell'Alternativo; quello che mi interessa è soltanto il Capitolo/Impegno. Scorro i dettagli che hanno contribuito a superare la Disponibilità e non appena individuo il primo che in tutto o in parte fa superare la Disponibilità lo aggiorno mettendo quello che entra sul Capitolo Principale e il resto sull'Alternativo. Aggiorno IMPNETTO soltanto se era > 0 NOTA: Questo controllo ha senso solo se esiste Serfin; e in tal caso CODANNOCONT = 0 SEMPRE. 20/11/2007: Aggiunto parametro INDSIOPE per scegliere se estrarre il SIOPE o meno, a questa data pkGPCONTAB.DOCONTAB e pkGPCONTABEVOL.DOCONTAB coincidono */ FUNCTION fnDoContab ( lCODENTEAZ IN pkType.tyStringa%type, lCODANNOGRUPPOCONT IN pkType.tyStringa%type, -- lQTAGRUPPOCONT IN pkType.tyStringa%type, -- se é vuoto lo calcolo come progressivo lDTARIFCONTAB IN pkType.tyStringa%type, -- per ora la passiamo in input, in seguito faremo -- dei calcoli per decidere quali regole applicare lIDRELABLst IN pkType.tyStringa%type,-- lista delle elaborazioni lINDXCDC IN pkType.tyStringa%type, -- 'S': distingui per CDC lDTASCADENZA IN pkType.tyStringa%type, lINDSIOPE IN pkType.tyStringa%type, lINDCONTRXANNO IN pkType.tyStringa%type, lINDONERIXANNO IN pkType.tyStringa%type, lCODSESSIONE IN pkType.tyStringa%type, ERRDIAG OUT pkType.tyStringa%type ) RETURN NUMERIC IS nRet NUMBER(9); nRec NUMBER(9); lTimeStamp GPTMPREGCONTCED.TMSLOCK%type := TO_CHAR( SYSDATE, 'YYYYMMDDHH24MISS' ); -- PER LO SPLIT nLastIDRELAB NUMBER(9); lTIDRELAB pktype.TyTStringa; sIDRELAB pktype.TyStringa%Type := NULL; -- stringa da comporre in base agli elementi nella Lista ---- nIDRCONTRIB NUMBER(9) := 0; -- PER ora le i campi DTAINIZIO,DTAFINE e IDR sono fissati sDTAMIN VARCHAR2(10):= TO_CHAR( PKTYPE.DTAMIN, 'DD/MM/YYYY'); sDTAMAX VARCHAR2(10):= TO_CHAR( PKTYPE.DTAMAX, 'DD/MM/YYYY'); nIDR NUMBER(9) := 1; -- PER ora è fissato sERRDIAG PKTYPE.TYSTRINGA%type; nGiro NUMBER(9); --rm2003 rIDCAPITOLORIPARTDET GPTMPREGCONTCEDDET.idcapitoloripart%type; rCODANNOCONTRIPARTDET GPTMPREGCONTCEDDET.codannocontripart%type; rIDACCIMPRIPARTDET GPTMPREGCONTCEDDET.idaccimpripart%type; nCOUNT NUMBER(9) :=0; -- rm2003 TYPE recTyONERI IS RECORD( rINDSPOSTA VARCHAR2(1), rIDCAPITOLODA GPTMPREGCONTCED.idcapitolo%type, rCODANNOCONTDA GPTMPREGCONTCED.codannocont%type, rIDACCIMPDA GPTMPREGCONTCED.idaccimp%type, rIDRCONTRIB GPSOCCED.IDRCONTRIB%type, rCODVOCE GPVOXASSOG.CODVOCE%type, rIDRRLAV GPTMPREGCONTCED.IDRRLAVCED%type, rIDRELAB GPTMPREGCONTCED.IDRELABCED%type, rCODTIPOELE GPTMPREGCONTCED.CODTIPOELE%type, rCODANNO GPTMPREGCONTCED.CODANNO%type, rCODANNOCOMP GPSOCCED.CODANNOCOMP%type, rCODPARTE GPTMPREGCONTCED.CODPARTE%type, rIDCAPITOLORIPART GPTMPREGCONTCED.IDCAPITOLORIPART%type, rCODANNOCONTRIPART GPTMPREGCONTCED.CODANNOCONTRIPART%type , rIDACCIMPRIPART GPTMPREGCONTCED.IDACCIMPRIPART%type, rIDCDC GPTMPREGCONTCED.IDRCDC%type, rCODTIPOBENRIPART GPTMPREGCONTCED.CODTIPOBENRIPART%type, rCODBENRIPART GPTMPREGCONTCED.CODBENRIPART%type, rPRCMOLTIP GPVOXASSOG.PRCMOLTIP%type, rSUMIMPTRATT GPSOCCED.IMPTRATTENUTA%type, --> IMPTRATTENUTA PER QUEL CONTRIBUTO rIMPVOX GPVOXCED.IMPVOX%type, rIMPMANDATO GPDETRISCONT.IMPMANDATO%type, rCODELEMENTO GPTMPREGCONTCED.CODELEMENTO%type, rGIRO GPTMPREGCONTCED.IDR%type, rINDSOSPESO GPTMPREGCONTCED.INDSOSPESO%type, rCODANNOMAT GPTMPREGCONTCED.CODANNOMAT%type, rQTASEZIONE GPTMPREGCONTCED.QTASEZIONE%type, rQTAPROGELE GPTMPREGCONTCED.QTAPROGELE%type); --rm2003 recONERI recTyONERI; recONERITMP recTyONERI; -- CURSORE SUGLI ONERI e VOCI ASSOGGETTATE ( Per la ripartizione degli Oneri ) CURSOR curONERI IS -- Riccardo - cambiato SELECT DECODE(VOXRIPART.INDRIPARTIZIONE ||GPTMPREGCONTCED.INDRIPARTIZIONE, 'SN', 'S', 'N') INDSPOSTA, GPTMPREGCONTCED.idcapitolo IDCAPITOLODA, GPTMPREGCONTCED.CODANNOCONT CODANNOCONTDA, GPTMPREGCONTCED.idaccimp IDACCIMPDA, GPSOCCED.IDRCONTRIB, GPVOXASSOG.CODVOCE, GPTMPREGCONTCED.IDRRLAVCED, GPTMPREGCONTCED.IDRELABCED, GPTMPREGCONTCED.CODTIPOELE, GPTMPREGCONTCED.CODANNO, GPSOCCED.CODANNOCOMP, GPTMPREGCONTCED.CODPARTE, VOXRIPART.IDCAPITOLORIPART, VOXRIPART.CODANNOCONTRIPART, VOXRIPART.IDACCIMPRIPART, VOXRIPART.idrcdc, GPTMPREGCONTCED.CODTIPOBEN, GPTMPREGCONTCED.CODBENEFICIARIO, --Riccardo 29-01-2002: cambiato Beneficiario GPVOXASSOG.PRCMOLTIP, SUM(GPSOCCED.IMPTRATTENUTA) IMPTRATTENUTA, SUM(VOXRIPART.impelemento) impelemento, SUM(GPSOCCED.IMPIMPONIBPRIMO) IMPIMPONIBPRIMO, VOXRIPART.CODELEMENTO, VOXRIPART.IDR, -- ( Delle Voci ) GPTMPREGCONTCED.INDSOSPESO, /* ( Dell'Onere ) */ VOXRIPART.codannomat, DECODE(GPCONTRIB.CODASSOGCONTRIB, 'M', VOXRIPART.QTASEZIONE, TO_CHAR(GPSOCCED.DTAINIZIO, 'YYYYMM') ) QTASEZIONE, VOXRIPART.QTAPROGELE FROM GPTMPRIFXCONT,GPTMPREGCONTCED VOXRIPART, GPSOCCED, GPTMPREGCONTCED, GPVOXASSOG, GPCONTRIB --Riccardo 2002-01-31 WHERE GPTMPREGCONTCED.OWNER = lCODSESSIONE AND GPTMPREGCONTCED.CODANNO = lCODANNOGRUPPOCONT AND GPTMPREGCONTCED.CODTIPOELE ='ONE' AND VOXRIPART.CODTIPOELE = 'IDV' AND ( ( gpcontrib.CODASSOGCONTRIB='M' AND EXISTS ( select r.idrrlav from gpraplav r,gpcurriculum i, gpmetaval m where r.IDRRLAV=gpsocced.IDRRLAV and r.IDRPERSONA= i.IDRPERSONA AND i.CODTPMETA='ISCPREV' AND to_char(i.DTAINIZIO,'yyyymm')<= VOXRIPART.qtasezione AND to_char(i.DTAfine,'yyyymm')>= VOXRIPART.qtasezione AND i.codtpmeta=m.codtpmeta AND i.IDRVALMETA=m.IDRVALMETA AND m.IDRQSOG = gpsocced.IDRQSOG) ) OR gpcontrib.CODASSOGCONTRIB <>'M' ) and ((VOXRIPART.INDRIPARTIZIONE = 'S' AND GPTMPREGCONTCED.INDRIPARTIZIONE ='N') -- DEROGHE DI RIPARTIZIONE SU VOCE OR ( GPTMPREGCONTCED.INDRIPARTIZIONE ='S')) -- ONERE DA RIPARTIRE AND GPTMPREGCONTCED.CODTIPOLEGAME = 'P' AND --VOXRIPART.CODPARTE = 'S' AND VOXRIPART.codtipolegame = 'P' AND VOXRIPART.codsegnovoce = 'X' AND (((VOXRIPART.CODANNOMAT = GPTMPREGCONTCED.CODANNOMAT) AND (lINDONERIXANNO = 'S')) OR ((VOXRIPART.CODANNOMAT <> GPTMPREGCONTCED.CODANNOMAT) AND (lINDONERIXANNO = 'S') AND GPCONTRIB.CODASSOGCONTRIB <> 'M') OR (lINDONERIXANNO = 'N')) AND GPTMPRIFXCONT.OWNER = GPTMPREGCONTCED.OWNER AND GPTMPRIFXCONT.IDRELAB = GPTMPREGCONTCED.IDRELABCED AND GPTMPRIFXCONT.IDRRLAV = GPTMPREGCONTCED.IDRRLAVCED AND GPTMPRIFXCONT.GIRO = GPTMPREGCONTCED.IDR AND GPTMPRIFXCONT.GIRO = VOXRIPART.IDR AND GPSOCCED.IDRRLAV = GPTMPREGCONTCED.IDRRLAVCED AND GPSOCCED.IDRELAB = GPTMPREGCONTCED.IDRELABCED AND GPSOCCED.IDRCONTRIB = GPTMPREGCONTCED.IDRCONTRIB AND GPSOCCED.IMPTRATTENUTA <> 0 AND -- Riccardo GPSOCCED.CODTIPOSOCIALE = 'E' AND -- Riccardo VOXRIPART.OWNER = lCODSESSIONE AND VOXRIPART.IDRRLAVCED = GPSOCCED.IDRRLAV AND VOXRIPART.IDRELABCED = GPSOCCED.IDRELAB AND VOXRIPART.CODVOCE = GPVOXASSOG.CODVOCE AND GPVOXASSOG.CODVERSIONE = 'STD' AND GPVOXASSOG.IDRCONTRIB = GPSOCCED.IDRCONTRIB AND --VOXRIPART.CODPARTE = 'S' --Riccardo (il rischio per le partite di giro è che si abbia due volte ...? però è pericoloso ...) --AND -- Riccardo 2002-01-31 Aggiunto GPCONTRIB.IDRCONTRIB = GPSOCCED.IDRCONTRIB AND ((GPCONTRIB.CODASSOGCONTRIB = 'M' AND GPSOCCED.CODANNOCOMP = VOXRIPART.CODANNOMAT AND TO_CHAR(GPSOCCED.DTAFINE, 'YYYYMM') = VOXRIPART.QTASEZIONE) OR (GPCONTRIB.CODASSOGCONTRIB = 'L' AND GPSOCCED.CODANNOCOMP >= VOXRIPART.CODANNOMAT)) GROUP BY DECODE(VOXRIPART.INDRIPARTIZIONE || GPTMPREGCONTCED.INDRIPARTIZIONE, 'SN', 'S', 'N'), GPTMPREGCONTCED.idcapitolo, GPTMPREGCONTCED.CODANNOCONT, GPTMPREGCONTCED.idaccimp, GPSOCCED.IDRCONTRIB, GPVOXASSOG.CODVOCE, GPTMPREGCONTCED.IDRRLAVCED, GPTMPREGCONTCED.IDRELABCED, GPTMPREGCONTCED.CODTIPOELE, GPTMPREGCONTCED.CODANNO, GPSOCCED.CODANNOCOMP, GPTMPREGCONTCED.CODPARTE, VOXRIPART.IDCAPITOLORIPART, VOXRIPART.CODANNOCONTRIPART, VOXRIPART.IDACCIMPRIPART, VOXRIPART.idrcdc, GPTMPREGCONTCED.CODTIPOBEN, GPTMPREGCONTCED.CODBENEFICIARIO, --Riccardo 29-01-2002: cambiato Beneficiario GPVOXASSOG.PRCMOLTIP, VOXRIPART.CODELEMENTO, VOXRIPART.IDR, -- ( Delle Voci ) GPTMPREGCONTCED.INDSOSPESO, /* ( Dell'Onere ) */ VOXRIPART.codannomat, DECODE(GPCONTRIB.CODASSOGCONTRIB, 'M', VOXRIPART.QTASEZIONE, TO_CHAR(GPSOCCED.DTAINIZIO, 'YYYYMM') ), VOXRIPART.QTAPROGELE ORDER BY GPTMPREGCONTCED.IDRRLAVCED , GPTMPREGCONTCED.IDRELABCED, GPSOCCED.CODANNOCOMP, GPSOCCED.IDRCONTRIB, --Riccardo 2002-01-31 cambiato order DECODE(GPCONTRIB.CODASSOGCONTRIB, 'M', VOXRIPART.QTASEZIONE, TO_CHAR(GPSOCCED.DTAINIZIO, 'YYYYMM') ), VOXRIPART.IDCAPITOLORIPART, VOXRIPART.CODANNOCONTRIPART, VOXRIPART.IDACCIMPRIPART, VOXRIPART.IDRCDC, GPTMPREGCONTCED.CODTIPOBEN, GPTMPREGCONTCED.CODBENEFICIARIO, -- Riccardo 2002-01-31 cambiato beneficiario GPTMPREGCONTCED.CODPARTE, GPTMPREGCONTCED.INDSOSPESO; nOnereRipart NUMBER(19,6) := 0; nOnereTot NUMBER(19,6) := 0; nNettoTot NUMBER(19,6) := 0; nNettoRipart NUMBER(19,6) := 0; nResto NUMBER(19,6) := 0; nIMPTRATTRIPART NUMBER(19,6) := 0; --------------------- RIPARTIZIONE DEL NETTO -------------------------- TYPE recTyGPDETRISCONT IS RECORD( rIDRRLAV GPDETRISCONT.IDRRLAV%type, rIDRELAB GPDETRISCONT.IDRELAB%type, rCODTIPOELE GPDETRISCONT.CODTIPOELE%type, rCODANNOESERCIZIO GPDETRISCONT.CODANNOESERCIZIO%type, rCODANNOMAT GPDETRISCONT.CODANNOMAT%type, rCODPARTE GPDETRISCONT.CODPARTE%type, rIDCAPITOLO GPDETRISCONT.IDCAPITOLO%type, rCODSIOPE GPDETRISCONT.CODSIOPE%type, rCODANNOCONT GPDETRISCONT.CODANNOCONT%type , rIDACCIMP GPDETRISCONT.IDACCIMP%type, rIMPMANDATO GPDETRISCONT.IMPMANDATO%type, rIMPNETTO GPCEDOLINO.IMPNETTO%type, rIMPCOMPETENZE GPCEDOLINO.IMPCOMPETENZE%type); recGPDETRISCONT recTyGPDETRISCONT; recGPDETRISCONTPREC recTyGPDETRISCONT;-- ci memorizzo record da aggiornare che é sempre il precedente CURSOR curGPDETRISCONT IS SELECT GPDETRISCONT.IDRRLAV, GPDETRISCONT.IDRELAB, GPDETRISCONT.CODTIPOELE, GPDETRISCONT.CODANNOESERCIZIO, GPDETRISCONT.CODANNOMAT, GPDETRISCONT.CODPARTE, GPDETRISCONT.IDCAPITOLO, GPDETRISCONT.codsiope, GPDETRISCONT.CODANNOCONT, GPDETRISCONT.IDACCIMP, GPDETRISCONT.IMPMANDATO, GPCEDOLINO.IMPNETTO, GPCEDOLINO.IMPCOMPETENZE FROM GPCEDOLINO, GPRISCONT, GPDETRISCONT -- Riccardo: aggiunto per partite di giro WHERE GPCEDOLINO.IDRELAB IN ( SELECT IDRELAB FROM GPTMPELABXREGCONTAB WHERE OWNER = lCODSESSIONE) AND -- LISTA ELABORAZIONI GPRISCONT.CODANNOGRUPPOCONT=lCODANNOGRUPPOCONT and GPRISCONT.QTAGRUPPOCONT = lQTAGRUPPOCONT and GPCEDOLINO.IDRELAB = GPRISCONT.IDRELAB and GPDETRISCONT.IDRRISCONT = GPRISCONT.IDRRISCONT AND GPDETRISCONT.IDRRLAV = GPCEDOLINO.IDRRLAV AND GPDETRISCONT.IDRELAB = GPCEDOLINO.IDRELAB AND GPDETRISCONT.CODTIPOELE = 'VOX' AND GPDETRISCONT.CODPARTE = 'S' AND -- Riccardo -- NON è UNA PARTITA DI GIRO GPRISCONT.INDPARTITA <> 'S' AND GPDETRISCONT.CODANNOESERCIZIO = lCODANNOGRUPPOCONT ORDER BY GPDETRISCONT.IDRRLAV, GPDETRISCONT.IDRELAB, GPDETRISCONT.IMPMANDATO; -- Riccardo: è importante l'ordine per importo mandato er evitare di avere netti negativi (l'ultimo record deve avere l'importo + alto) nIMPNETTORIPART NUMBER(19,6) := 0; NumMax NUMBER(9); nIDCAPITOLO1 GPREGCONTAB.IDCAPITOLO%type; nCODANNOCONT1 GPREGCONTAB.CODANNOCONT%type; nIDACCIMP1 GPREGCONTAB.IDACCIMP%type; sCODTIPOBEN1 GPREGCONTAB.CODTIPOBEN%type; sCODBENEFICIARIO1 GPREGCONTAB.CODBENEFICIARIO%type; nIDCDC1 GPDETRISCONT.IDCDC%type; sINDSOSPESO GPDETRISCONT.INDSOSPESO%type; nIDRELABPrec GPCEDOLINO.IDRELAB%type :=0; -- per riempimento della GPTMPRIFXCONT nIDRRLAVPrec GPCEDOLINO.IDRRLAV%type := 0;-- per riempimento della GPTMPRIFXCONT ---------- Gestione Alternativo : Cerco quali elementi possono aver causato un superamento della Disponibilità di Serfin -- DEVO COSTRUIRMI DINAMICAMENTE LA QUERY: uso Dynamic SQL IGNORE INTEGER; SOURCE_CURSOR INTEGER; nIDCAPITOLOOut NUMBER; -- variabili che riportano i capitoli/Impegni che hanno un trabocco nIDACCIMPOut NUMBER; nIMPDISPONIBILITAOut NUMBER; ------------------------ sCODTIPOBEN VARCHAR2(255); sCODBENEFICIARIO VARCHAR2(255); sDESSCHEMASERFIN GPENTEAZ.DESSCHEMASERFIN%type;-- prelevo lo schema Serfin dell'Ente sQUERYOut varchar2(2000); -- Query per la selezione dei capitoli che presentano uno sforamento -- var. per l'alternativo nIDCAPITOLOAlt GPREGCONTAB.IDCAPITOLO%type; nCODANNOCONTAlt GPREGCONTAB.CODANNOCONT%type; nIDACCIMPAlt GPREGCONTAB.IDACCIMP%type; bESCI BOOLEAN; -- per prendere solo il primo alternativo sTPCOLCONT VARCHAR2(2); sINDPGIRO VARCHAR2(1); sNomeSchema VARCHAR2(255); sNomeDBLink VARCHAR2(255); sQuery VARCHAR2(4000); BEGIN -- Ripulisco le tabelle temporanee SELECT COUNT(*) INTO nCount FROM GPTMPELERISCONT WHERE OWNER <> lCODSESSIONE; IF nCount > 0 THEN DELETE FROM GPTMPELERISCONT WHERE OWNER = lCODSESSIONE OR TO_CHAR ( sysdate, 'YYYYMMDDHH24MI' ) - SUBSTR ( TMSLOCK, 1, 12 ) > 2400; COMMIT; ELSE SYS.DBMS_UTILITY.exec_ddl_statement( 'TRUNCATE TABLE GPTMPELERISCONT'); END IF; SELECT COUNT(*) INTO nCount FROM GPTMPREGCONTCED WHERE OWNER <> lCODSESSIONE; IF nCount > 0 THEN DELETE FROM GPTMPREGCONTCED WHERE OWNER = lCODSESSIONE OR TO_CHAR ( sysdate, 'YYYYMMDDHH24MI' ) - SUBSTR ( TMSLOCK, 1, 12 ) > 2400; COMMIT; ELSE SYS.DBMS_UTILITY.exec_ddl_statement( 'TRUNCATE TABLE GPTMPREGCONTCED'); END IF; DELETE FROM GPTMPELABXREGCONTAB WHERE OWNER = lCODSESSIONE OR TO_CHAR ( sysdate, 'YYYYMMDDHH24MI' ) - SUBSTR ( TMSLOCK, 1, 12 ) > 2400; DELETE FROM GPTMPREGCONTXVOX WHERE OWNER = lCODSESSIONE OR TO_CHAR ( sysdate, 'YYYYMMDDHH24MI' ) - SUBSTR ( TMSLOCK, 1, 12 ) > 2400; DELETE FROM GPTMPRIFXCONT WHERE OWNER = lCODSESSIONE OR TO_CHAR ( sysdate, 'YYYYMMDDHH24MI' ) - SUBSTR ( TMSLOCK, 1, 12 ) > 2400; DELETE FROM GPTMPREGCONTCEDDET --RM2003 WHERE OWNER = lCODSESSIONE OR TO_CHAR ( sysdate, 'YYYYMMDDHH24MI' ) - SUBSTR ( TMSLOCK, 1, 12 ) > 2400; COMMIT; -- Composizione lista delle elaborazioni da usare nelle Select IF lIDRELABLst IS NOT NULL THEN -- splitto la stringa nRet := PKUTILITY.fnRealSplit( lIDRELABLst,'§','', nLastIDRELAB, ERRDIAG, lTIDRELAB); IF nRet < 0 THEN ROLLBACK; RETURN nRet; END IF; ELSE ERRDIAG := 'Prevista Lista Elaborazioni'; RETURN pkUtility.fnError( 'fnDoContab', -499, ERRDIAG ); END IF; nRet := fnTestCedMov(lTIDRELAB, ERRDIAG); IF nRet < 0 THEN ROLLBACK; RETURN nRet; END IF; FOR i IN 1..nLastIDRELAB LOOP IF lTIDRELAB(i) IS NOT NULL THEN INSERT INTO GPTMPELABXREGCONTAB( OWNER, IDRELAB, TMSLOCK ) VALUES ( lCODSESSIONE, lTIDRELAB(i), lTIMESTAMP ); END IF; END LOOP; COMMIT; -- inserimento nella Temporanea dei Riferimenti Contabili nGiro := 1; FOR recGPDETCONPERS IN ( SELECT GPRAPLAV.IDRRLAV, GPELAB.IDRELAB, GPDETCONPERS.QTAPROGCONTAB , GPDETCONPERS.CODENTEAZ , GPDETCONPERS.CODFUNZIONE, GPDETCONPERS.CODSERVIZIO, GPDETCONPERS.IDRCDC,PRCAPPARTENENZA FROM GPCONTABPERS, GPDETCONPERS, GPELAB, GPRAPLAV, GPCEDOLINO,GPTMPELABXREGCONTAB -- ( Mettendo in Join la tmp, la Query ha costo 7 ) WHERE GPTMPELABXREGCONTAB.OWNER = lCODSESSIONE AND GPTMPELABXREGCONTAB.IDRELAB=GPELAB.IDRELAB AND GPCEDOLINO.CODSTATO = 2 AND GPRAPLAV.IDRRLAV = GPCONTABPERS.IDRRLAV AND GPCEDOLINO.IDRRLAV = GPRAPLAV.IDRRLAV AND GPCEDOLINO.IDRELAB = GPELAB.IDRELAB AND GPCONTABPERS.DTAINIZIO <= NVL( TO_DATE( lDTARIFCONTAB, 'DD/MM/YYYY'), LEAST( GPELAB.DTAVALUTA, GPRAPLAV.DTAFINE) ) AND NVL( TO_DATE( lDTARIFCONTAB, 'DD/MM/YYYY'), LEAST( GPELAB.DTAVALUTA, GPRAPLAV.DTAFINE) ) <= GPCONTABPERS.DTAFINE AND GPDETCONPERS.IDRRLAV = GPCONTABPERS.IDRRLAV AND GPDETCONPERS.QTAPROGCONTAB = GPCONTABPERS.QTAPROGCONTAB ORDER BY GPELAB.IDRELAB,GPRAPLAV.IDRRLAV, GPDETCONPERS.CODFUNZIONE, GPDETCONPERS.CODSERVIZIO, GPDETCONPERS.IDRCDC ) LOOP IF ( recGPDETCONPERS.IDRELAB <> nIDRELABPrec OR recGPDETCONPERS.IDRRLAV <> nIDRRLAVPrec ) THEN nGiro := 1; nIDRELABPrec := recGPDETCONPERS.IDRELAB; nIDRRLAVPrec := recGPDETCONPERS.IDRRLAV; ELSE nGiro := nGiro + 1; END IF; IF lINDXCDC = 'N' THEN recGPDETCONPERS.IDRCDC := 0; END IF; INSERT INTO GPTMPRIFXCONT ( OWNER , IDRELAB, IDRRLAV , GIRO, QTAPROGCONTAB , CODENTEAZ , CODFUNZIONE , CODSERVIZIO , IDRCDC , PRCAPPARTENENZA, TMSLOCK ) VALUES ( lCODSESSIONE , recGPDETCONPERS.IDRELAB, recGPDETCONPERS.IDRRLAV , nGiro, recGPDETCONPERS.QTAPROGCONTAB , recGPDETCONPERS.CODENTEAZ , recGPDETCONPERS.CODFUNZIONE , recGPDETCONPERS.CODSERVIZIO, recGPDETCONPERS.IDRCDC , recGPDETCONPERS.PRCAPPARTENENZA, lTIMESTAMP ); END LOOP; numMax := nGiro; --- nel Cursore precedente mi perdo le persone che non hanno Riferimenti Contabili --> -- le Inserisco ora e le metto al primo giro INSERT INTO GPTMPRIFXCONT ( OWNER , IDRELAB, IDRRLAV , GIRO, QTAPROGCONTAB , CODENTEAZ , CODFUNZIONE , CODSERVIZIO , IDRCDC , PRCAPPARTENENZA, TMSLOCK ) ( SELECT lCODSESSIONE, GPCEDOLINO.IDRELAB, GPCEDOLINO.IDRRLAV, 1, NULL, NULL , NULL, NULL, 0, 100, lTimeStamp FROM GPCEDOLINO,GPTMPELABXREGCONTAB WHERE GPTMPELABXREGCONTAB.OWNER = lCODSESSIONE AND GPTMPELABXREGCONTAB.IDRELAB=GPCEDOLINO.IDRELAB AND GPCEDOLINO.CODSTATO = 2 AND GPCEDOLINO.IDRRLAV NOT IN ( SELECT GPTMPRIFXCONT.IDRRLAV FROM GPTMPRIFXCONT WHERE OWNER = lCODSESSIONE AND GPTMPRIFXCONT.idrrlav = gpcedolino.idrrlav and GIRO = 1 ) ); commit; -- passo 1 : per ogni dipendente trovo le regole da applicare sui singoli elementi di cedolino ------------- al 1° giro riempo con IDR=1, ai successivi con IDR=2,3,..,n ( n = Numero funzioni/servizio di un dip ) nGiro := 1; LOOP EXIT WHEN nGiro > numMax; nIDR := nGiro; -- passo 1 : per ogni dipendente trovo le regole da applicare sui singoli elementi di cedolino INSERT INTO GPTMPREGCONTCED ( OWNER, CODANNO, CODPARTE, CODTIPOLEGAME, CODSEGNOVOCE, CODTIPODIP, CODDIPENDENTE, CODTIPOELE, CODELEMENTO, IDRRLAVCED, IDRELABCED, DTAINIZIO, IDR, DTAFINE, IDRCONTRIB, CODTIPOTASS, CODTPGRVOX, CODVALGRVOX, IDRRLAV, CODFUNZIONE, CODSERVIZIO, CODCDR, IDCAPITOLO, CODANNOCONT, IDACCIMP, QTAMOLTIMPUTAZIONE, INDRIPARTIZIONE, CODTIPOARROT, IMPARROT, CODTIPOBEN, CODBENEFICIARIO, IDCAPITOLORIPART, IDACCIMPRIPART, QTAMOLTIMPRIPART, CODTIPOBENRIPART, CODBENRIPART,CODCDRRIPART, CODANNOCONTRIPART, TMSLOCK, INDSOSPESO, codmesedet ) SELECT lCODSESSIONE, GPREGCONTAB.CODANNO, GPREGCONTAB.CODPARTE, GPREGCONTAB.CODTIPOLEGAME, GPREGCONTAB.CODSEGNOVOCE, GPREGCONTAB.CODTIPODIP, GPREGCONTAB.coddipendente, GPREGCONTAB.CODTIPOELE, GPREGCONTAB.CODELEMENTO , GPCEDOLINO.IDRRLAV, GPCEDOLINO.IDRELAB, TO_DATE( sDTAMIN, 'DD/MM/YYYY'), nIDR, TO_DATE( sDTAMAX,'DD/MM/YYYY'), GPREGCONTAB.IDRCONTRIB, GPREGCONTAB.CODTIPOTASS , GPREGCONTAB.CODTPGRVOX , GPREGCONTAB.CODVALGRVOX, GPREGCONTAB.IDRRLAV, GPREGCONTAB.CODFUNZIONE, GPREGCONTAB.CODSERVIZIO , GPREGCONTAB.CODCDR , GPREGCONTAB.IDCAPITOLO, GPREGCONTAB.CODANNOCONT, GPREGCONTAB.IDACCIMP, GPREGCONTAB.QTAMOLTIMPUTAZIONE, GPREGCONTAB.INDRIPARTIZIONE, GPREGCONTAB.CODTIPOARROT, GPREGCONTAB.IMPARROT, GPREGCONTAB.CODTIPOBEN, GPREGCONTAB.CODBENEFICIARIO, GPREGCONTAB.IDCAPITOLORIPART, GPREGCONTAB.IDACCIMPRIPART, GPREGCONTAB.QTAMOLTIMPRIPART, GPREGCONTAB.CODTIPOBENRIPART, GPREGCONTAB.CODBENRIPART,GPREGCONTAB.CODCDRRIPART, GPREGCONTAB.CODANNOCONTRIPART, lTIMESTAMP, GPREGCONTAB.INDSOSPESO, 0 FROM GPTMPRIFXCONT,GPREGCONTAB, GPCEDOLINO WHERE GPREGCONTAB.CODENTEAZ = lCODENTEAZ AND GPREGCONTAB.CODANNO = lCODANNOGRUPPOCONT AND GPREGCONTAB.CODTIPODIP = 'DIP' AND GPREGCONTAB.IDRRLAV = GPCEDOLINO.IDRRLAV AND GPCEDOLINO.IDRELAB IN ( SELECT IDRELAB FROM GPTMPELABXREGCONTAB WHERE OWNER = lCODSESSIONE) AND -- LISTA ELABORAZIONI GPCEDOLINO.CODSTATO = 2 AND GPTMPRIFXCONT.OWNER = lCODSESSIONE AND GPTMPRIFXCONT.IDRELAB = GPCEDOLINO.IDRELAB AND GPTMPRIFXCONT.IDRRLAV = GPCEDOLINO.IDRRLAV AND --- cercare solo per gli elementi che ci sono -- (GPREGCONTAB.codtipoele IN ('VOX') (EXISTS (SELECT GPVERVOCE.codvalgrvox FROM GPVOXCED A, GPVERVOCE WHERE GPREGCONTAB.codtipoele IN ('VOX') AND A.IDRRLAV = GPCEDOLINO.idrrlav AND A.idrelab = GPCEDOLINO.idrelab AND A.CODVOCE = GPVERVOCE.codvoce AND GPVERVOCE.codvalgrvox = GPREGCONTAB.CODVALGRVOX AND A.IMPVOX <> 0) OR EXISTS (SELECT A.codtipotass FROM GPFISCED A WHERE GPREGCONTAB.codtipoele IN ('TAX') AND A.IDRRLAV = GPCEDOLINO.idrrlav AND A.idrelab = GPCEDOLINO.idrelab AND A.CODTIPOTASS = GPREGCONTAB.codtipotass AND A.impimpostanetta <> 0) OR EXISTS (SELECT A.IDRCONTRIB FROM GPSOCCED A WHERE GPREGCONTAB.codtipoele IN ('CON','ONE') AND A.IDRRLAV = GPCEDOLINO.idrrlav AND A.idrelab = GPCEDOLINO.idrelab AND A.idrcontrib = GPREGCONTAB.idrcontrib AND A.imptrattenuta <> 0 AND A.codtiposociale = DECODE (GPREGCONTAB.codtipoele,'CON', 'D', 'ONE', 'E')) ) AND GPTMPRIFXCONT.GIRO = nGiro; commit; INSERT INTO GPTMPREGCONTCED ( OWNER, CODANNO, CODPARTE, CODTIPOLEGAME, CODSEGNOVOCE, CODTIPODIP, CODDIPENDENTE, CODTIPOELE, CODELEMENTO, IDRRLAVCED, IDRELABCED, DTAINIZIO, IDR, DTAFINE, IDRCONTRIB, CODTIPOTASS, CODTPGRVOX, CODVALGRVOX, IDRRLAV, CODFUNZIONE, CODSERVIZIO, CODCDR, IDCAPITOLO, CODANNOCONT, IDACCIMP, QTAMOLTIMPUTAZIONE, INDRIPARTIZIONE, CODTIPOARROT, IMPARROT, CODTIPOBEN, CODBENEFICIARIO, IDCAPITOLORIPART, IDACCIMPRIPART, QTAMOLTIMPRIPART, CODTIPOBENRIPART, CODBENRIPART,CODCDRRIPART, CODANNOCONTRIPART, TMSLOCK, INDSOSPESO, codmesedet ) SELECT lCODSESSIONE, GPREGCONTAB.CODANNO, GPREGCONTAB.CODPARTE, GPREGCONTAB.CODTIPOLEGAME, GPREGCONTAB.CODSEGNOVOCE, GPREGCONTAB.CODTIPODIP, GPREGCONTAB.coddipendente, GPREGCONTAB.CODTIPOELE, GPREGCONTAB.CODELEMENTO , GPCEDOLINO.IDRRLAV, GPCEDOLINO.IDRELAB, TO_DATE( sDTAMIN, 'DD/MM/YYYY'), nIDR, TO_DATE( sDTAMAX,'DD/MM/YYYY'), GPREGCONTAB.IDRCONTRIB, GPREGCONTAB.CODTIPOTASS , GPREGCONTAB.CODTPGRVOX , GPREGCONTAB.CODVALGRVOX, GPREGCONTAB.IDRRLAV, GPREGCONTAB.CODFUNZIONE, GPREGCONTAB.CODSERVIZIO, GPREGCONTAB.CODCDR, GPREGCONTAB.IDCAPITOLO, GPREGCONTAB.CODANNOCONT, GPREGCONTAB.IDACCIMP, GPREGCONTAB.QTAMOLTIMPUTAZIONE, GPREGCONTAB.INDRIPARTIZIONE, GPREGCONTAB.CODTIPOARROT, GPREGCONTAB.IMPARROT, GPREGCONTAB.CODTIPOBEN, GPREGCONTAB.CODBENEFICIARIO, GPREGCONTAB.IDCAPITOLORIPART, GPREGCONTAB.IDACCIMPRIPART, GPREGCONTAB.QTAMOLTIMPRIPART, GPREGCONTAB.CODTIPOBENRIPART, GPREGCONTAB.CODBENRIPART,GPREGCONTAB.CODCDRRIPART, GPREGCONTAB.CODANNOCONTRIPART, lTIMESTAMP, GPREGCONTAB.INDSOSPESO, 0 FROM GPTMPRIFXCONT, GPREGCONTAB, GPELAB, GPRAPLAV, GPCEDOLINO WHERE GPREGCONTAB.CODENTEAZ = lCODENTEAZ AND GPREGCONTAB.CODANNO = lCODANNOGRUPPOCONT AND GPREGCONTAB.CODTIPODIP = 'GRP' AND GPCEDOLINO.IDRELAB IN ( SELECT IDRELAB FROM GPTMPELABXREGCONTAB WHERE OWNER = lCODSESSIONE) AND -- LISTA ELABORAZIONI GPCEDOLINO.CODSTATO = 2 AND GPTMPRIFXCONT.OWNER = lCODSESSIONE AND GPTMPRIFXCONT.IDRELAB = GPCEDOLINO.IDRELAB AND GPTMPRIFXCONT.IDRRLAV = GPCEDOLINO.IDRRLAV AND GPTMPRIFXCONT.GIRO = nGiro AND-- se c'é lo prende, altrimenti no GPREGCONTAB.CODSERVIZIO = GPTMPRIFXCONT.CODSERVIZIO AND GPREGCONTAB.CODFUNZIONE = GPTMPRIFXCONT.CODFUNZIONE AND GPCEDOLINO.IDRRLAV = GPRAPLAV.IDRRLAV AND GPCEDOLINO.IDRELAB = GPELAB.IDRELAB AND --- cercare solo per gli elementi che ci sono -- (GPREGCONTAB.codtipoele IN ('VOX') (EXISTS (SELECT GPVERVOCE.codvalgrvox FROM GPVOXCED A, GPVERVOCE WHERE GPREGCONTAB.codtipoele IN ('VOX') AND A.IDRRLAV = GPCEDOLINO.idrrlav AND A.idrelab = GPCEDOLINO.idrelab AND A.CODVOCE = GPVERVOCE.codvoce AND GPVERVOCE.codvalgrvox = GPREGCONTAB.CODVALGRVOX AND A.IMPVOX <> 0) OR EXISTS (SELECT A.codtipotass FROM GPFISCED A WHERE GPREGCONTAB.codtipoele IN ('TAX') AND A.IDRRLAV = GPCEDOLINO.idrrlav AND A.idrelab = GPCEDOLINO.idrelab AND A.CODTIPOTASS = GPREGCONTAB.codtipotass AND A.impimpostanetta <> 0) OR EXISTS (SELECT A.IDRCONTRIB FROM GPSOCCED A WHERE GPREGCONTAB.codtipoele IN ('CON','ONE') AND A.IDRRLAV = GPCEDOLINO.idrrlav AND A.idrelab = GPCEDOLINO.idrelab AND A.idrcontrib = GPREGCONTAB.idrcontrib AND A.imptrattenuta <> 0 AND A.codtiposociale = DECODE (GPREGCONTAB.codtipoele,'CON', 'D', 'ONE', 'E')) ) AND GPTMPRIFXCONT.IDRRLAV NOT IN ( SELECT DISTINCT IDRRLAVCED FROM GPTMPREGCONTCED WHERE GPREGCONTAB.CODTIPOELE = GPTMPREGCONTCED.CODTIPOELE AND GPREGCONTAB.CODELEMENTO = GPTMPREGCONTCED.CODELEMENTO AND GPTMPREGCONTCED.IDRRLAVCED = GPTMPRIFXCONT.IDRRLAV and OWNER = lCODSESSIONE AND IDR = nGiro) ; commit; INSERT INTO GPTMPREGCONTCED ( OWNER, CODANNO, CODPARTE, CODTIPOLEGAME, CODSEGNOVOCE, CODTIPODIP, CODDIPENDENTE, CODTIPOELE, CODELEMENTO, IDRRLAVCED, IDRELABCED, DTAINIZIO, IDR, DTAFINE, IDRCONTRIB, CODTIPOTASS, CODTPGRVOX, CODVALGRVOX, IDRRLAV, CODFUNZIONE, CODSERVIZIO, CODCDR, IDCAPITOLO, CODANNOCONT, IDACCIMP, QTAMOLTIMPUTAZIONE, INDRIPARTIZIONE, CODTIPOARROT, IMPARROT, CODTIPOBEN, CODBENEFICIARIO, IDCAPITOLORIPART, IDACCIMPRIPART, QTAMOLTIMPRIPART, CODTIPOBENRIPART, CODBENRIPART,CODCDRRIPART, CODANNOCONTRIPART, TMSLOCK, INDSOSPESO, codmesedet) SELECT lCODSESSIONE, GPREGCONTAB.CODANNO, GPREGCONTAB.CODPARTE, GPREGCONTAB.CODTIPOLEGAME, GPREGCONTAB.CODSEGNOVOCE, GPREGCONTAB.CODTIPODIP, GPREGCONTAB.coddipendente, GPREGCONTAB.CODTIPOELE, GPREGCONTAB.CODELEMENTO , GPCEDOLINO.IDRRLAV, GPCEDOLINO.IDRELAB, TO_DATE( sDTAMIN, 'DD/MM/YYYY'), nIDR, TO_DATE( sDTAMAX,'DD/MM/YYYY'), GPREGCONTAB.IDRCONTRIB, GPREGCONTAB.CODTIPOTASS , GPREGCONTAB.CODTPGRVOX , GPREGCONTAB.CODVALGRVOX, GPREGCONTAB.IDRRLAV, GPREGCONTAB.CODFUNZIONE, GPREGCONTAB.CODSERVIZIO, GPREGCONTAB.CODCDR, GPREGCONTAB.IDCAPITOLO, GPREGCONTAB.CODANNOCONT, GPREGCONTAB.IDACCIMP, GPREGCONTAB.QTAMOLTIMPUTAZIONE, GPREGCONTAB.INDRIPARTIZIONE, GPREGCONTAB.CODTIPOARROT, GPREGCONTAB.IMPARROT, GPREGCONTAB.CODTIPOBEN, GPREGCONTAB.CODBENEFICIARIO, GPREGCONTAB.IDCAPITOLORIPART, GPREGCONTAB.IDACCIMPRIPART, GPREGCONTAB.QTAMOLTIMPRIPART, GPREGCONTAB.CODTIPOBENRIPART, GPREGCONTAB.CODBENRIPART,GPREGCONTAB.CODCDRRIPART, GPREGCONTAB.CODANNOCONTRIPART, lTIMESTAMP, GPREGCONTAB.INDSOSPESO, 0 FROM GPTMPRIFXCONT,GPREGCONTAB, GPCEDOLINO WHERE GPREGCONTAB.CODENTEAZ = lCODENTEAZ AND GPREGCONTAB.CODANNO = lCODANNOGRUPPOCONT AND GPREGCONTAB.CODTIPODIP = 'ALL' AND GPCEDOLINO.IDRELAB IN ( SELECT IDRELAB FROM GPTMPELABXREGCONTAB WHERE OWNER = lCODSESSIONE) AND -- LISTA ELABORAZIONI GPCEDOLINO.CODSTATO = 2 AND GPTMPRIFXCONT.OWNER = lCODSESSIONE AND GPTMPRIFXCONT.IDRELAB = GPCEDOLINO.IDRELAB AND GPTMPRIFXCONT.IDRRLAV = GPCEDOLINO.IDRRLAV AND GPTMPRIFXCONT.GIRO = nGiro AND-- se c'é lo prende, altrimenti no --- cercare solo per gli elementi che ci sono -- (GPREGCONTAB.codtipoele IN ('VOX') (EXISTS (SELECT GPVERVOCE.codvalgrvox FROM GPVOXCED A, GPVERVOCE WHERE GPREGCONTAB.codtipoele IN ('VOX') AND A.IDRRLAV = GPCEDOLINO.idrrlav AND A.idrelab = GPCEDOLINO.idrelab AND A.CODVOCE = GPVERVOCE.codvoce AND GPVERVOCE.codvalgrvox = GPREGCONTAB.CODVALGRVOX AND A.IMPVOX <> 0) OR EXISTS (SELECT A.codtipotass FROM GPFISCED A WHERE GPREGCONTAB.codtipoele IN ('TAX') AND A.IDRRLAV = GPCEDOLINO.idrrlav AND A.idrelab = GPCEDOLINO.idrelab AND A.CODTIPOTASS = GPREGCONTAB.codtipotass AND A.impimpostanetta <> 0) OR EXISTS (SELECT A.IDRCONTRIB FROM GPSOCCED A WHERE GPREGCONTAB.codtipoele IN ('CON','ONE') AND A.IDRRLAV = GPCEDOLINO.idrrlav AND A.idrelab = GPCEDOLINO.idrelab AND A.idrcontrib = GPREGCONTAB.idrcontrib AND A.imptrattenuta <> 0 AND A.codtiposociale = DECODE (GPREGCONTAB.codtipoele,'CON', 'D', 'ONE', 'E')) ) AND GPCEDOLINO.IDRRLAV NOT IN ( SELECT DISTINCT IDRRLAVCED FROM GPTMPREGCONTCED WHERE GPREGCONTAB.CODTIPOELE = GPTMPREGCONTCED.CODTIPOELE AND GPREGCONTAB.CODELEMENTO = GPTMPREGCONTCED.CODELEMENTO AND GPTMPREGCONTCED.IDRRLAVCED = GPCEDOLINO.IDRRLAV and OWNER = lCODSESSIONE AND IDR = nGiro ); COMMIT; --- INSERISCO LE VOCI INSERT INTO GPTMPREGCONTCED ( codtipodip, coddipendente, OWNER , CODANNO , CODANNOMAT, codtpgrvox, CODVALGRVOX, CODVOCE, QTASEZIONE, QTAPROGELE , IMPELEMENTO, CODCOLONNA, INDPGIRO , CODPARTE , CODTIPOLEGAME , CODSEGNOVOCE , CODTIPOELE , CODELEMENTO , IDRRLAVCED , IDRELABCED , DTAINIZIO , IDR , DTAFINE , IDCAPITOLO , CODANNOCONT , IDACCIMP , QTAMOLTIMPUTAZIONE , INDRIPARTIZIONE , CODTIPOARROT , IMPARROT , CODTIPOBEN , CODBENEFICIARIO , IDRCDC , IDCAPITOLORIPART , IDACCIMPRIPART , QTAMOLTIMPRIPART , CODTIPOBENRIPART , CODBENRIPART , CODCDRRIPART , CODANNOCONTRIPART , INDSOSPESO , TMSLOCK, codmesedet ) SELECT GPTMPREGCONTCED.CODTIPODIP, GPTMPREGCONTCED.coddipendente, GPTMPREGCONTCED.OWNER , GPTMPREGCONTCED.CODANNO , GPVOXCED.codanno CODANNOMAT, GPTMPREGCONTCED.codtpgrvox, GPTMPREGCONTCED.codvalgrvox, GPVOXCED.codvoce, GPVOXCED.QTASEZIONE, GPVOXCED.qtaprogr , SUM(GPVOXCED.impvox) , GPVOCE.CODCOLONNA, GPVALGRVOX.indpgiro, CODPARTE , CODTIPOLEGAME , CODSEGNOVOCE ,'IDV' CODTIPOELE , TO_CHAR(GPVOXCED.codvoce) CODELEMENTO , IDRRLAVCED , IDRELABCED , GPTMPREGCONTCED.DTAINIZIO , GPTMPREGCONTCED.IDR , GPTMPREGCONTCED.DTAFINE , IDCAPITOLO , CODANNOCONT , IDACCIMP , QTAMOLTIMPUTAZIONE , INDRIPARTIZIONE , CODTIPOARROT , IMPARROT , CODTIPOBEN , CODBENEFICIARIO , '0' CDC , IDCAPITOLORIPART , IDACCIMPRIPART , QTAMOLTIMPRIPART , CODTIPOBENRIPART , CODBENRIPART , CODCDRRIPART , CODANNOCONTRIPART , INDSOSPESO , 0 TMSLOCK, 0 codmesedet FROM GPTMPRIFXCONT, GPTMPREGCONTCED, GPVOXCED, GPVOCE, GPVERVOCE, GPVALGRVOX WHERE GPTMPREGCONTCED.owner = lCODSESSIONE AND GPTMPREGCONTCED.codtipoele = 'VOX' AND gptmpregcontced.idrrlavced = GPVOXCED.idrrlav AND GPTMPREGCONTCED.IDRELABCED = GPVOXCED.idrelab AND gptmpregcontced.IDR = GPTMPRIFXCONT.GIRO AND GPTMPRIFXCONT.OWNER = lCODSESSIONE AND GPTMPRIFXCONT.IDRELAB = GPTMPREGCONTCED.IDRELABCED AND GPTMPRIFXCONT.IDRRLAV = GPTMPREGCONTCED.IDRRLAVCED AND GPTMPRIFXCONT.GIRO = nGIRO AND (CODSEGNOVOCE = 'X' OR (CODSEGNOVOCE = 'P' AND GPVOXCED.IMPVOX >= 0) OR (CODSEGNOVOCE = 'N' AND GPVOXCED.IMPVOX <0)) AND GPVOXCED.CODVOCE = GPVOCE.CODVOCE AND GPVOCE.CODVOCE = GPVERVOCE.codvoce AND ((GPVERVOCE.indente = 'N' AND NOT EXISTS (SELECT A.codvoce FROM GPVERVOCE A WHERE A.CODVOCE = GPVERVOCE.CODVOCE AND A.indente = 'S' AND A.codenteaz = lCODENTEAZ)) OR ( GPVERVOCE.indente = 'N' AND GPVERVOCE.codenteaz = lCODENTEAZ)) AND GPVERVOCE.codtpgrvox = GPTMPREGCONTCED.codtpgrvox AND GPVERVOCE.codvalgrvox = GPTMPREGCONTCED.codvalgrvox AND GPVERVOCE.codtpgrvox = GPVALGRVOX.codtpgrvox AND GPVERVOCE.codvalgrvox = GPVALGRVOX.codvalgrvox AND GPTMPREGCONTCED.IDR = nGIRO GROUP BY GPTMPREGCONTCED.CODTIPODIP, GPTMPREGCONTCED.coddipendente, GPTMPREGCONTCED.OWNER , GPTMPREGCONTCED.CODANNO , GPVOXCED.CODANNO, GPTMPREGCONTCED.CODTPGRVOX, GPTMPREGCONTCED.CODVALGRVOX, GPVOXCED.CODVOCE, GPVOXCED.QTASEZIONE, GPVOXCED.qtaprogr, GPVOCE.CODCOLONNA, GPVALGRVOX.INDPGIRO, CODPARTE , CODTIPOLEGAME , CODSEGNOVOCE , CODTIPOELE , CODELEMENTO , IDRRLAVCED , IDRELABCED , GPTMPREGCONTCED.DTAINIZIO , GPTMPREGCONTCED.IDR , GPTMPREGCONTCED.DTAFINE , IDCAPITOLO , CODANNOCONT , IDACCIMP , QTAMOLTIMPUTAZIONE , INDRIPARTIZIONE , CODTIPOARROT , IMPARROT , CODTIPOBEN , CODBENEFICIARIO , IDCAPITOLORIPART , IDACCIMPRIPART , QTAMOLTIMPRIPART , CODTIPOBENRIPART , CODBENRIPART , CODCDRRIPART , CODANNOCONTRIPART , INDSOSPESO; COMMIT; IF lINDXCDC = 'S' THEN -- a chi ha il CDC nella data di riferimento lo Aggiorno UPDATE GPTMPREGCONTCED SET IDRCDC = ( SELECT MAX(GPTMPRIFXCONT.IDRCDC) FROM GPTMPRIFXCONT WHERE OWNER = GPTMPREGCONTCED.OWNER AND GPTMPREGCONTCED.IDRRLAVCED = GPTMPRIFXCONT.IDRRLAV AND GPTMPREGCONTCED.IDRELABCED = GPTMPRIFXCONT.IDRELAB AND GIRO = nGiro ) -- Aggiorno Regole del giro WHERE OWNER = lCODSESSIONE AND CODANNO = lCODANNOGRUPPOCONT AND CODTIPOELE IN ('IDV', 'ONE') AND -- RM2004 NON SERVE PER VOX E NEPPURE PER CON E TAX IDR = nGiro; COMMIT; END IF; -- duplico i contributi per Anno di competenza IF lINDCONTRXANNO='S' THEN INSERT INTO GPTMPREGCONTCED( CODTIPODIP, CODDIPENDENTE, OWNER , CODANNO , CODANNOMAT,IDRCONTRIB, QTAPROGELE, IMPELEMENTO, INDPGIRO, CODPARTE , CODTIPOLEGAME , CODSEGNOVOCE, CODTIPOELE , CODELEMENTO , IDRRLAVCED, IDRELABCED, DTAINIZIO , IDR , DTAFINE, IDCAPITOLO , CODANNOCONT , IDACCIMP, QTAMOLTIMPUTAZIONE , INDRIPARTIZIONE , CODTIPOARROT , IMPARROT , CODTIPOBEN, CODBENEFICIARIO , IDRCDC , IDCAPITOLORIPART , IDACCIMPRIPART , QTAMOLTIMPRIPART, CODTIPOBENRIPART , CODBENRIPART , CODCDRRIPART , CODANNOCONTRIPART , INDSOSPESO, TMSLOCK, codmesedet ) SELECT GPTMPREGCONTCED.CODTIPODIP, GPTMPREGCONTCED.CODDIPENDENTE, GPTMPREGCONTCED.OWNER , GPTMPREGCONTCED.CODANNO , GPSOCCED.CODANNOCOMP CODANNOMAT, GPCONTRIB.IDRCONTRIB, GPSOCCED.QTAPROGR, SUM(GPSOCCED.IMPTRATTENUTA), GPTMPREGCONTCED.INDPGIRO, CODPARTE , CODTIPOLEGAME , CODSEGNOVOCE,'IDC' CODTIPOELE , TO_CHAR(GPCONTRIB.IDRCONTRIB) CODELEMENTO , IDRRLAVCED, IDRELABCED, GPTMPREGCONTCED.DTAINIZIO, GPTMPREGCONTCED.IDR , GPTMPREGCONTCED.DTAFINE, IDCAPITOLO , CODANNOCONT , IDACCIMP, QTAMOLTIMPUTAZIONE , INDRIPARTIZIONE , CODTIPOARROT , GPTMPREGCONTCED.IMPARROT , CODTIPOBEN, CODBENEFICIARIO , '0' CDC , IDCAPITOLORIPART , IDACCIMPRIPART , QTAMOLTIMPRIPART, CODTIPOBENRIPART , CODBENRIPART , CODCDRRIPART , CODANNOCONTRIPART , INDSOSPESO, 0 TMSLOCK, 0 codmesedet FROM GPTMPRIFXCONT, GPTMPREGCONTCED, GPSOCCED, GPCONTRIB WHERE GPTMPREGCONTCED.owner = lCODSESSIONE AND GPTMPREGCONTCED.codtipoele = 'CON' AND gptmpregcontced.idrrlavced = GPSOCCED.idrrlav AND GPTMPREGCONTCED.IDRELABCED = GPSOCCED.idrelab AND GPTMPREGCONTCED.IDRCONTRIB = GPSOCCED.IDRCONTRIB AND gptmpregcontced.IDR = GPTMPRIFXCONT.GIRO AND GPTMPRIFXCONT.OWNER = lCODSESSIONE AND GPTMPRIFXCONT.IDRELAB = GPTMPREGCONTCED.IDRELABCED AND GPTMPRIFXCONT.IDRRLAV = GPTMPREGCONTCED.IDRRLAVCED AND GPTMPRIFXCONT.GIRO = nGIRO AND GPSOCCED.IDRCONTRIB = GPCONTRIB.IDRCONTRIB AND GPSOCCED.CODTIPOSOCIALE = 'D' AND GPTMPREGCONTCED.IDR = nGIRO GROUP BY GPTMPREGCONTCED.CODTIPODIP, GPTMPREGCONTCED.CODDIPENDENTE, GPTMPREGCONTCED.OWNER , GPTMPREGCONTCED.CODANNO , GPSOCCED.CODANNOCOMP , GPCONTRIB.IDRCONTRIB, GPSOCCED.QTAPROGR, GPTMPREGCONTCED.INDPGIRO, CODPARTE , CODTIPOLEGAME , CODSEGNOVOCE, TO_CHAR(GPCONTRIB.IDRCONTRIB) , IDRRLAVCED, IDRELABCED, GPTMPREGCONTCED.DTAINIZIO, GPTMPREGCONTCED.IDR , GPTMPREGCONTCED.DTAFINE, IDCAPITOLO , CODANNOCONT , IDACCIMP, QTAMOLTIMPUTAZIONE , INDRIPARTIZIONE , CODTIPOARROT , GPTMPREGCONTCED.IMPARROT , CODTIPOBEN, CODBENEFICIARIO , IDCAPITOLORIPART , IDACCIMPRIPART , QTAMOLTIMPRIPART, CODTIPOBENRIPART , CODBENRIPART , CODCDRRIPART , CODANNOCONTRIPART , INDSOSPESO; COMMIT; DELETE FROM GPTMPREGCONTCED WHERE GPTMPREGCONTCED.OWNER = lCODSESSIONE AND GPTMPREGCONTCED.CODTIPOELE = 'CON' AND CODANNOMAT=0; COMMIT; UPDATE GPTMPREGCONTCED SET GPTMPREGCONTCED.CODTIPOELE = 'CON' WHERE GPTMPREGCONTCED.OWNER = lCODSESSIONE AND GPTMPREGCONTCED.CODTIPOELE = 'IDC'; COMMIT; END IF; -- Marco: inizio -- duplico gli oneri per Anno di competenza IF lINDONERIXANNO='S' THEN INSERT INTO GPTMPREGCONTCED( CODTIPODIP, CODDIPENDENTE, OWNER , CODANNO , CODANNOMAT,IDRCONTRIB, QTAPROGELE, IMPELEMENTO, INDPGIRO, CODPARTE , CODTIPOLEGAME , CODSEGNOVOCE, CODTIPOELE , CODELEMENTO , IDRRLAVCED, IDRELABCED, DTAINIZIO , IDR , DTAFINE, IDCAPITOLO , CODANNOCONT , IDACCIMP, QTAMOLTIMPUTAZIONE , INDRIPARTIZIONE , CODTIPOARROT , IMPARROT , CODTIPOBEN, CODBENEFICIARIO , IDRCDC , IDCAPITOLORIPART , IDACCIMPRIPART , QTAMOLTIMPRIPART, CODTIPOBENRIPART , CODBENRIPART , CODCDRRIPART , CODANNOCONTRIPART , INDSOSPESO, TMSLOCK, codmesedet ) SELECT GPTMPREGCONTCED.CODTIPODIP, GPTMPREGCONTCED.CODDIPENDENTE, GPTMPREGCONTCED.OWNER , GPTMPREGCONTCED.CODANNO , GPSOCCED.CODANNOCOMP CODANNOMAT, GPCONTRIB.IDRCONTRIB, GPSOCCED.QTAPROGR, SUM(GPSOCCED.IMPTRATTENUTA), GPTMPREGCONTCED.INDPGIRO, CODPARTE , CODTIPOLEGAME , CODSEGNOVOCE,'XYZ' CODTIPOELE , TO_CHAR(GPCONTRIB.IDRCONTRIB) CODELEMENTO , IDRRLAVCED, IDRELABCED, GPTMPREGCONTCED.DTAINIZIO, GPTMPREGCONTCED.IDR , GPTMPREGCONTCED.DTAFINE, IDCAPITOLO , CODANNOCONT , IDACCIMP, QTAMOLTIMPUTAZIONE , INDRIPARTIZIONE , CODTIPOARROT , GPTMPREGCONTCED.IMPARROT , CODTIPOBEN, CODBENEFICIARIO , '0' CDC , IDCAPITOLORIPART , IDACCIMPRIPART , QTAMOLTIMPRIPART, CODTIPOBENRIPART , CODBENRIPART , CODCDRRIPART , CODANNOCONTRIPART , INDSOSPESO, 0 TMSLOCK , 0 codmesedet FROM GPTMPRIFXCONT, GPTMPREGCONTCED, GPSOCCED, GPCONTRIB WHERE GPTMPREGCONTCED.owner = lCODSESSIONE AND GPTMPREGCONTCED.codtipoele = 'ONE' AND gptmpregcontced.idrrlavced = GPSOCCED.idrrlav AND GPTMPREGCONTCED.IDRELABCED = GPSOCCED.idrelab AND GPTMPREGCONTCED.IDRCONTRIB = GPSOCCED.IDRCONTRIB AND gptmpregcontced.IDR = GPTMPRIFXCONT.GIRO AND GPTMPRIFXCONT.OWNER = lCODSESSIONE AND GPTMPRIFXCONT.IDRELAB = GPTMPREGCONTCED.IDRELABCED AND GPTMPRIFXCONT.IDRRLAV = GPTMPREGCONTCED.IDRRLAVCED AND GPTMPRIFXCONT.GIRO = nGIRO AND GPSOCCED.IDRCONTRIB = GPCONTRIB.IDRCONTRIB AND GPSOCCED.CODTIPOSOCIALE = 'E' AND GPTMPREGCONTCED.IDR = nGIRO AND -- Solo gli oneri da non ripartire GPTMPREGCONTCED.INDRIPARTIZIONE = 'N' AND GPTMPREGCONTCED.CODANNOMAT = 0 -- aggiunto per sicurezza per riprendere gli stessi oneri che poi vado a cancellare/modificare GROUP BY GPTMPREGCONTCED.CODTIPODIP, GPTMPREGCONTCED.CODDIPENDENTE, GPTMPREGCONTCED.OWNER , GPTMPREGCONTCED.CODANNO , GPSOCCED.CODANNOCOMP , GPCONTRIB.IDRCONTRIB, GPSOCCED.QTAPROGR, GPTMPREGCONTCED.INDPGIRO, CODPARTE , CODTIPOLEGAME , CODSEGNOVOCE, TO_CHAR(GPCONTRIB.IDRCONTRIB) , IDRRLAVCED, IDRELABCED, GPTMPREGCONTCED.DTAINIZIO, GPTMPREGCONTCED.IDR , GPTMPREGCONTCED.DTAFINE, IDCAPITOLO , CODANNOCONT , IDACCIMP, QTAMOLTIMPUTAZIONE , INDRIPARTIZIONE , CODTIPOARROT , GPTMPREGCONTCED.IMPARROT , CODTIPOBEN, CODBENEFICIARIO , IDCAPITOLORIPART , IDACCIMPRIPART , QTAMOLTIMPRIPART, CODTIPOBENRIPART , CODBENRIPART , CODCDRRIPART , CODANNOCONTRIPART , INDSOSPESO; COMMIT; DELETE FROM GPTMPREGCONTCED WHERE GPTMPREGCONTCED.OWNER = lCODSESSIONE AND GPTMPREGCONTCED.CODTIPOELE = 'ONE' AND GPTMPREGCONTCED.INDRIPARTIZIONE = 'N' AND CODANNOMAT=0; COMMIT; UPDATE GPTMPREGCONTCED SET GPTMPREGCONTCED.CODTIPOELE = 'ONE' WHERE GPTMPREGCONTCED.OWNER = lCODSESSIONE AND GPTMPREGCONTCED.CODTIPOELE = 'XYZ'; COMMIT; END IF; -- Marco: fine IF nGiro = 1 THEN -- LE REGOLE SONO CORRELATE ALLE VOCI E NON ALLA ASSOCIAZIONE DIPENDENTE <-> FF.SS. INSERT INTO GPTMPREGCONTCEDDET ( OWNER , CODANNO , CODELEMENTO , IDRRLAVCED , IDRELABCED , DTAINIZIO , IDR , DTAFINE , IDRCONTRIB , IDCAPITOLORIPART , IDACCIMPRIPART , CODANNOCONTRIPART , TMSLOCK, CODANNOMAT, QTAPROGELE, CODVOCE, QTASEZIONE, codmesedet ) SELECT GPTMPREGCONTCED.OWNER , GPTMPREGCONTCED.CODANNO , GPTMPREGCONTCED.CODELEMENTO , GPTMPREGCONTCED.IDRRLAVCED, GPTMPREGCONTCED.IDRELABCED , GPTMPREGCONTCED.DTAINIZIO , GPTMPREGCONTCED.IDR , GPTMPREGCONTCED.DTAFINE , GPREGCONTABONE.IDRCONTRIB, GPREGCONTABONE.IDCAPITOLORIPART , GPREGCONTABONE.IDACCIMPRIPART , GPREGCONTABONE.CODANNOCONTRIPART , GPTMPREGCONTCED.TMSLOCK, REGVOX.CODANNOMAT, REGVOX.QTAPROGELE, REGVOX.CODVOCE, REGVOX.QTASEZIONE, GPTMPREGCONTCED.codmesedet FROM GPTMPREGCONTCED, GPREGCONTABONE, GPTMPREGCONTCED REGVOX WHERE -- Marco: prima della ripartizione oneri spesa alternativa la tabella -- GPREGCONTABONE conteneva solamente i dati per CODTIPOLEGAME = 'P' GPREGCONTABONE.CODTIPOLEGAME = 'P' AND -- GPREGCONTABONE.CODENTEAZ = lCODENTEAZ AND GPREGCONTABONE.CODANNO = GPTMPREGCONTCED.CODANNO AND GPREGCONTABONE.CODPARTE = GPTMPREGCONTCED.codparte AND GPREGCONTABONE.CODTIPOLEGAME = GPTMPREGCONTCED.codtipolegame AND GPREGCONTABONE.codsegnovoce = GPTMPREGCONTCED.CODSEGNOVOCE AND GPREGCONTABONE.CODTIPODIP = GPTMPREGCONTCED.CODTIPODIP AND GPREGCONTABONE.CODDIPENDENTE = GPTMPREGCONTCED.coddipendente AND GPREGCONTABONE.CODTIPOELE = GPTMPREGCONTCED.codtipoele AND GPREGCONTABONE.CODELEMENTO = GPTMPREGCONTCED.codelemento AND GPTMPREGCONTCED.owner = lCODSESSIONE AND REGVOX.OWNER = lCODSESSIONE AND REGVOX.codanno = GPTMPREGCONTCED.CODANNO AND REGVOX.codparte = GPTMPREGCONTCED.codparte AND REGVOX.codtipolegame = GPTMPREGCONTCED.CODTIPOLEGAME AND REGVOX.codsegnovoce = GPTMPREGCONTCED.CODSEGNOVOCE AND REGVOX.codtipoele = 'IDV' AND GPTMPREGCONTCED.CODTIPOELE = 'VOX' AND gptmpregcontced.idrelabced = regvox.idrelabced and gptmpregcontced.idrrlavced = regvox.idrrlavced and REGVOX.codvalgrvox = GPTMPREGCONTCED.codvalgrvox AND REGVOX.codmesedet = GPTMPREGCONTCED.codmesedet; COMMIT; -- RM2004 : TOLTA LA REGISTRAZIONE DI GPTMPREGCONTXVOX END IF; -------------------------------------------------------------------------------------------- -- Aggiorno tutte le righe delle Voci con le eventuali regole specificate sulla Tabella di -- Corrispondenza Anno Liq. --> Anno di Maturaz. FOR REC IN ( SELECT A.IDCAPITOLOLIQ , A.CODANNOLIQ, A.CODPARTE , A.CODANNOIMPLIQ , A.IDACCIMPLIQ , A.CODANNOMAT , A.IDCAPITOLORES , A.CODANNORES , A.IDACCIMPRES , B.IDRRLAVCED, B.IDRELABCED FROM GPCROSSCONTAB A, GPTMPREGCONTCED B WHERE A.CODANNOLIQ = lCODANNOGRUPPOCONT AND A.CODENTEAZ = UPPER(lCODENTEAZ ) AND B.CODTIPOELE= 'IDV' AND B.OWNER = lCODSESSIONE AND B.CODANNO = A.CODANNOLIQ AND B.IDCAPITOLO = A.IDCAPITOLOLIQ AND B.CODANNOCONT = A.CODANNOIMPLIQ AND B.IDACCIMP = A.IDACCIMPLIQ GROUP BY A.IDCAPITOLOLIQ , A.CODANNOLIQ, A.CODPARTE , A.CODANNOIMPLIQ , A.IDACCIMPLIQ , A.CODANNOMAT , A.IDCAPITOLORES , A.CODANNORES , A.IDACCIMPRES , B.IDRRLAVCED, B.IDRELABCED ) LOOP UPDATE GPTMPREGCONTCED SET IDCAPITOLO = REC.IDCAPITOLORES, CODANNOCONT = REC.CODANNORES, IDACCIMP = REC.IDACCIMPRES WHERE OWNER = lCODSESSIONE AND CODTIPOELE = 'IDV' AND IDRRLAVCED= REC.IDRRLAVCED AND IDRELABCED = REC.IDRELABCED AND CODANNOMAT = REC.CODANNOMAT AND CODPARTE = REC.CODPARTE AND CODANNO = REC.CODANNOLIQ AND IDCAPITOLO = REC.IDCAPITOLOLIQ AND CODANNOCONT = REC.CODANNOIMPLIQ AND IDACCIMP = REC.IDACCIMPLIQ; END LOOP; COMMIT; IF lINDCONTRXANNO = 'S' THEN FOR REC IN ( SELECT A.IDCAPITOLOLIQ , A.CODANNOLIQ, A.CODPARTE , A.CODANNOIMPLIQ , A.IDACCIMPLIQ , A.CODANNOMAT , A.IDCAPITOLORES , A.CODANNORES , A.IDACCIMPRES , B.IDRRLAVCED, B.IDRELABCED FROM GPCROSSCONTAB A, GPTMPREGCONTCED B WHERE A.CODANNOLIQ = lCODANNOGRUPPOCONT AND A.CODENTEAZ = UPPER(lCODENTEAZ ) AND B.CODTIPOELE= 'CON' AND B.OWNER = lCODSESSIONE AND B.CODANNO = A.CODANNOLIQ AND B.IDCAPITOLO = A.IDCAPITOLOLIQ AND B.CODANNOCONT = A.CODANNOIMPLIQ AND B.IDACCIMP = A.IDACCIMPLIQ GROUP BY A.IDCAPITOLOLIQ , A.CODANNOLIQ, A.CODPARTE , A.CODANNOIMPLIQ , A.IDACCIMPLIQ , A.CODANNOMAT , A.IDCAPITOLORES , A.CODANNORES , A.IDACCIMPRES , B.IDRRLAVCED, B.IDRELABCED ) LOOP UPDATE GPTMPREGCONTCED SET IDCAPITOLO = REC.IDCAPITOLORES, CODANNOCONT = REC.CODANNORES, IDACCIMP = REC.IDACCIMPRES WHERE OWNER = lCODSESSIONE AND CODTIPOELE = 'CON' AND IDRRLAVCED= REC.IDRRLAVCED AND IDRELABCED = REC.IDRELABCED AND CODANNOMAT = REC.CODANNOMAT AND CODPARTE = REC.CODPARTE AND CODANNO = REC.CODANNOLIQ AND IDCAPITOLO = REC.IDCAPITOLOLIQ AND CODANNOCONT = REC.CODANNOIMPLIQ AND IDACCIMP = REC.IDACCIMPLIQ; END LOOP; END IF; COMMIT; -- Marco: inizio IF lINDONERIXANNO = 'S' THEN FOR REC IN ( SELECT A.IDCAPITOLOLIQ , A.CODANNOLIQ, A.CODPARTE , A.CODANNOIMPLIQ , A.IDACCIMPLIQ , A.CODANNOMAT , A.IDCAPITOLORES , A.CODANNORES , A.IDACCIMPRES , B.IDRRLAVCED, B.IDRELABCED FROM GPCROSSCONTAB A, GPTMPREGCONTCED B WHERE A.CODANNOLIQ = lCODANNOGRUPPOCONT AND A.CODENTEAZ = UPPER(lCODENTEAZ ) AND B.CODTIPOELE= 'ONE' AND B.OWNER = lCODSESSIONE AND B.CODANNO = A.CODANNOLIQ AND B.IDCAPITOLO = A.IDCAPITOLOLIQ AND B.CODANNOCONT = A.CODANNOIMPLIQ AND B.IDACCIMP = A.IDACCIMPLIQ GROUP BY A.IDCAPITOLOLIQ , A.CODANNOLIQ, A.CODPARTE , A.CODANNOIMPLIQ , A.IDACCIMPLIQ , A.CODANNOMAT , A.IDCAPITOLORES , A.CODANNORES , A.IDACCIMPRES , B.IDRRLAVCED, B.IDRELABCED ) LOOP UPDATE GPTMPREGCONTCED SET IDCAPITOLO = REC.IDCAPITOLORES, CODANNOCONT = REC.CODANNORES, IDACCIMP = REC.IDACCIMPRES WHERE OWNER = lCODSESSIONE AND CODTIPOELE = 'ONE' AND IDRRLAVCED= REC.IDRRLAVCED AND IDRELABCED = REC.IDRELABCED AND CODANNOMAT = REC.CODANNOMAT AND CODPARTE = REC.CODPARTE AND CODANNO = REC.CODANNOLIQ AND IDCAPITOLO = REC.IDCAPITOLOLIQ AND CODANNOCONT = REC.CODANNOIMPLIQ AND IDACCIMP = REC.IDACCIMPLIQ; -- Aggiorno la parte relativa alla ripartizione delle Voci /*UPDATE GPTMPREGCONTCED SET IDCAPITOLORIPART = REC.IDCAPITOLORES, CODANNOCONTRIPART = REC.CODANNORES, IDACCIMPRIPART = REC.IDACCIMPRES WHERE OWNER = lCODSESSIONE AND CODTIPOELE = 'IDV' AND IDRRLAVCED= REC.IDRRLAVCED AND IDRELABCED = REC.IDRELABCED AND CODANNOMAT = REC.CODANNOMAT AND CODPARTE = REC.CODPARTE AND CODANNO = REC.CODANNOLIQ AND IDCAPITOLORIPART = REC.IDCAPITOLOLIQ AND CODANNOCONTRIPART = REC.CODANNOIMPLIQ AND IDACCIMPRIPART = REC.IDACCIMPLIQ;*/ END LOOP; UPDATE GPTMPREGCONTCED SET (IDCAPITOLORIPART, CODANNOCONTRIPART, IDACCIMPRIPART) = (SELECT IDCAPITOLORES, CODANNORES, IDACCIMPRES FROM GPCROSSCONTAB WHERE CODANNOMAT = GPTMPREGCONTCED.CODANNOMAT AND CODPARTE = GPTMPREGCONTCED.CODPARTE AND CODANNOLIQ = GPTMPREGCONTCED.CODANNO AND IDCAPITOLOLIQ = GPTMPREGCONTCED.IDCAPITOLORIPART AND CODANNOIMPLIQ = GPTMPREGCONTCED.CODANNOCONTRIPART AND IDACCIMPLIQ = GPTMPREGCONTCED.IDACCIMPRIPART) WHERE OWNER = lCODSESSIONE AND -- solo le voci CODTIPOELE = 'IDV' AND -- solo per anni di maturazione diversi dall'attuale CODANNOMAT <> lCODANNOGRUPPOCONT AND -- Modifico solo quei capitoli che riesco a ritrovare, -- altrimenti imposta a null il capitolo di ripartizione EXISTS (SELECT IDCAPITOLORES, CODANNORES, IDACCIMPRES FROM GPCROSSCONTAB WHERE CODANNOMAT = GPTMPREGCONTCED.CODANNOMAT AND CODPARTE = GPTMPREGCONTCED.CODPARTE AND CODANNOLIQ = GPTMPREGCONTCED.CODANNO AND IDCAPITOLOLIQ = GPTMPREGCONTCED.IDCAPITOLORIPART AND CODANNOIMPLIQ = GPTMPREGCONTCED.CODANNOCONTRIPART AND IDACCIMPLIQ = GPTMPREGCONTCED.IDACCIMPRIPART); END IF; COMMIT; -- Marco: fine ---------------------------------------------------------------------------------------------- -- Aggiorno le righe delle Voci con le eventuali regole specificate sulla Comunicazione Voci -- sia per quello che concerne la singola Voce che la Regola Generale per l'onere da ripartire -- Aggiorno le righe della Deroga alla Regola Generale per l'onere da ripartire -- con le eventuali regole specificate sulla Comunicazione Voci FOR REC IN ( SELECT IDRRLAV , IDRELAB , CODVOCE , QTASEZIONE , QTAPROGRULT, IDRCONTRIB , INDVOX , INDSINGONE , IDCAPITOLO , CODANNOCONT, IDACCIMP , CODTIPOBEN , CODBENEFICIARIO , CODTIPOARROT , IMPARROT FROM GPCONTABVOXCED WHERE ( IDRRLAV, TO_CHAR(IDRELAB), CODVOCE, QTASEZIONE ) IN ( SELECT A.IDRRLAVCED, A.IDRELABCED, A.CODVOCE, A.QTASEZIONE FROM GPTMPREGCONTCED A WHERE A.OWNER = lCODSESSIONE AND GPCONTABVOXCED.IDRRLAV = A.IDRRLAVCED AND GPCONTABVOXCED.IDRELAB = A.IDRELABCED AND GPCONTABVOXCED.CODVOCE = A.CODVOCE AND GPCONTABVOXCED.QTASEZIONE = A.QTASEZIONE ) ORDER BY IDRRLAV , IDRELAB , CODVOCE , QTASEZIONE , INDVOX DESC, INDSINGONE ) LOOP IF REC.INDVOX = 'S' THEN UPDATE GPTMPREGCONTCED SET IDCAPITOLO = REC.IDCAPITOLO , CODANNOCONT = REC.CODANNOCONT , IDACCIMP = REC.IDACCIMP , CODTIPOARROT = REC.CODTIPOARROT , IMPARROT = REC.IMPARROT , CODTIPOBEN = REC.CODTIPOBEN , CODBENEFICIARIO = REC.CODBENEFICIARIO WHERE OWNER = lCODSESSIONE AND CODTIPOELE = 'IDV' AND IDRRLAVCED = REC.IDRRLAV AND IDRELABCED = REC.IDRELAB AND CODVOCE = REC.CODVOCE AND QTASEZIONE = REC.QTASEZIONE; ELSIF ( REC.INDSINGONE = 'N' ) THEN UPDATE GPTMPREGCONTCED SET IDCAPITOLORIPART = REC.IDCAPITOLO , CODANNOCONTRIPART = REC.CODANNOCONT , IDACCIMPRIPART = REC.IDACCIMP , CODTIPOARROT = REC.CODTIPOARROT , IMPARROT = REC.IMPARROT WHERE OWNER = lCODSESSIONE AND CODTIPOELE = 'IDV' AND IDRRLAVCED = REC.IDRRLAV AND IDRELABCED = REC.IDRELAB AND CODVOCE = REC.CODVOCE AND QTASEZIONE = REC.QTASEZIONE; ELSIF ( REC.INDSINGONE = 'S' ) AND ( nGIRO = 1 ) THEN UPDATE GPTMPREGCONTCEDDET SET IDRCONTRIB = REC.IDRCONTRIB , IDCAPITOLORIPART = REC.IDCAPITOLO , IDACCIMPRIPART = REC.IDACCIMP , CODANNOCONTRIPART = REC.CODANNOCONT WHERE OWNER = lCODSESSIONE AND IDRRLAVCED = REC.IDRRLAV AND IDRCONTRIB = REC.IDRCONTRIB AND IDRELABCED = REC.IDRELAB AND CODVOCE = REC.CODVOCE AND QTASEZIONE = REC.QTASEZIONE; END IF; END LOOP; COMMIT; -------------------------------------------------------- -- lancio le statistiche in modo da velocizzare l'esecuzione della query sugli oneri in particolare -- SYS.DBMS_UTILITY.exec_ddl_statement( 'ANALYZE TABLE GPTMPREGCONTXVOX COMPUTE STATISTICS'); SYS.DBMS_UTILITY.exec_ddl_statement('ANALYZE TABLE GPTMPREGCONTCED COMPUTE STATISTICS' ); SYS.DBMS_UTILITY.exec_ddl_statement('ANALYZE TABLE GPTMPREGCONTCEDDET COMPUTE STATISTICS'); -- passo 2: ( Riempimento GPDETRISCONT) Per ogni regole di gruppo voce carico l'importo della voce; -- poi continuo per oneri , contributi, ecc. -- per gruppo voce: fare cursore che lega la voce di cedolino alla regola identificata per il dipendente (principale) -- passando attraverso il gruppo voce -- PASSO 2: Contabilizzazione degli elementi in base alle regole specificate nella GPTMPREGCONTCED -- cancello se già calcolate per quell'anno IF nGiro = 1 THEN IF lQTAGRUPPOCONT IS NULL THEN -- nuovo gruppo ( cancello tutte i record per -- le elaborazioni già esistenti) DELETE FROM GPDETRISCONT WHERE IDRELAB IN ( SELECT DISTINCT IDRELAB FROM GPTMPELABXREGCONTAB WHERE OWNER = lCODSESSIONE ); DELETE FROM GPELERISCONT; ELSE -- gruppo già esistente ( cancello tutte i record per le elaborazioni già esistenti e quelli -- di quel gruppo ) DELETE FROM GPDETRISCONT WHERE ( IDRRISCONT IN ( SELECT IDRRISCONT FROM GPRISCONT WHERE CODANNOGRUPPOCONT = lCODANNOGRUPPOCONT AND QTAGRUPPOCONT = lQTAGRUPPOCONT AND IDRELAB IN ( SELECT IDRELAB FROM GPELAB WHERE CODENTEAZ = lCODENTEAZ ) ) ) OR ( IDRELAB IN ( SELECT IDRELAB FROM GPTMPELABXREGCONTAB WHERE OWNER = lCODSESSIONE ) ); DELETE FROM GPELERISCONT; END IF; COMMIT; -- 2.1. Contabilizzazione delle voci INSERT INTO GPTMPELERISCONT ( OWNER, IDRRLAV , IDRELAB , CODTIPOELE , CODELEMENTO, CODANNOESERCIZIO , CODANNOMAT, CODPARTE , IDCAPITOLO , CODANNOCONT, IDACCIMP, IDCDC, CODTIPOBEN, CODBENEFICIARIO, IMPMANDATO, IMPTRATTENUTE, IMPNETTO, INDALLEGATO, INDSOSPESO, INDPGIRO, TMSLOCK, codmesedet ) SELECT OWNER, IDRRLAVCED, IDRELABCED, 'VOX', CODELEMENTO, GPTMPREGCONTCED.CODANNO, GPTMPREGCONTCED.CODANNOMAT, CODPARTE, IDCAPITOLO, GPTMPREGCONTCED.CODANNOCONT, IDACCIMP, NVL(DECODE(GPTMPREGCONTCED.indpgiro, 'N', IDRCDC,0),0), CODTIPOBEN, CODBENEFICIARIO, SUM(DECODE( GPTMPREGCONTCED.CODCOLONNA, 'C', IMPELEMENTO, 'F', IMPELEMENTO, 'T', IMPELEMENTO*(-1),0)* QTAMOLTIMPUTAZIONE) , 0, 0, 'S', NVL(GPTMPREGCONTCED.INDSOSPESO,'N'),INDPGIRO, lTIMESTAMP, 0 FROM GPTMPREGCONTCED WHERE GPTMPREGCONTCED.OWNER = lCODSESSIONE AND GPTMPREGCONTCED.CODANNO = lCODANNOGRUPPOCONT AND IDR = nGiro AND GPTMPREGCONTCED.CODTIPOELE = 'IDV' AND GPTMPREGCONTCED.CODTIPOLEGAME = 'P' AND (CODSEGNOVOCE = 'X' OR (CODSEGNOVOCE = 'P' AND IMPELEMENTO >= 0) OR (CODSEGNOVOCE = 'N' AND IMPELEMENTO<0)) GROUP BY owner, IDRRLAVCED, IDRELABCED, GPTMPREGCONTCED.CODANNO, codelemento, GPTMPREGCONTCED.CODANNOMAT, CODPARTE, IDCAPITOLO, GPTMPREGCONTCED.CODANNOCONT, IDACCIMP, CODTIPOBEN,CODBENEFICIARIO,NVL(DECODE(GPTMPREGCONTCED.indpgiro, 'N', IDRCDC,0),0), NVL(GPTMPREGCONTCED.INDSOSPESO,'N'), INDPGIRO; COMMIT; -- 2.2 Contabilizzazione delle imposte INSERT INTO GPTMPELERISCONT ( OWNER, IDRRLAV , IDRELAB , CODTIPOELE ,CODELEMENTO, CODANNOESERCIZIO , CODANNOMAT, CODPARTE, IDCAPITOLO , CODANNOCONT, IDACCIMP , IDCDC, CODTIPOBEN, CODBENEFICIARIO, IMPMANDATO, IMPTRATTENUTE , IMPNETTO, INDALLEGATO, INDSOSPESO, INDPGIRO, TMSLOCK, codmesedet) SELECT GPTMPREGCONTCED.owner,GPTMPREGCONTCED.IDRRLAVCED, GPTMPREGCONTCED.IDRELABCED,GPTMPREGCONTCED.CODTIPOELE, GPTMPREGCONTCED.codelemento, GPTMPREGCONTCED.CODANNO, GPTMPREGCONTCED.CODANNO, GPTMPREGCONTCED.CODPARTE, GPTMPREGCONTCED.IDCAPITOLO, GPTMPREGCONTCED.CODANNOCONT, GPTMPREGCONTCED.IDACCIMP, 0 IDRCDC, CODTIPOBEN, CODBENEFICIARIO, SUM( GPFISCED.IMPIMPOSTANETTA * QTAMOLTIMPUTAZIONE) , 0, SUM( GPFISCED.IMPIMPOSTANETTA * QTAMOLTIMPUTAZIONE), 'S', NVL(GPTMPREGCONTCED.INDSOSPESO,'N'), 'S' INDPGIRO, lTIMESTAMP, 0 FROM GPTMPREGCONTCED, GPLTIPOTASS, GPFISCED WHERE GPTMPREGCONTCED.OWNER = lCODSESSIONE AND GPTMPREGCONTCED.CODANNO = lCODANNOGRUPPOCONT AND IDR = nGiro AND GPTMPREGCONTCED.CODTIPOELE = 'TAX' AND GPTMPREGCONTCED.CODTIPOLEGAME ='P' AND GPTMPREGCONTCED.CODTIPOTASS = GPLTIPOTASS.CODTIPOTASS AND GPTMPREGCONTCED.IDRRLAVCED = GPFISCED.IDRRLAV AND GPTMPREGCONTCED.IDRELABCED = GPFISCED.IDRELAB AND GPLTIPOTASS.CODTIPOTASS = GPFISCED.CODTIPOTASS GROUP BY GPTMPREGCONTCED.owner, GPTMPREGCONTCED.IDRRLAVCED , GPTMPREGCONTCED.IDRELABCED ,GPTMPREGCONTCED.CODTIPOELE, GPTMPREGCONTCED.CODELEMENTO, GPTMPREGCONTCED.CODANNO, GPTMPREGCONTCED.CODPARTE, GPTMPREGCONTCED.IDCAPITOLO, GPTMPREGCONTCED.CODANNOCONT, GPTMPREGCONTCED.IDACCIMP, CODTIPOBEN, CODBENEFICIARIO, NVL(GPTMPREGCONTCED.INDSOSPESO,'N'); COMMIT; -- 2.3.1 Contabilizzazione degli oneri e contributi da non ripartire INSERT INTO GPTMPELERISCONT( OWNER, IDRRLAV , IDRELAB , CODTIPOELE , CODELEMENTO, CODANNOESERCIZIO , CODANNOMAT, CODPARTE , IDCAPITOLO , CODANNOCONT, IDACCIMP , IDCDC, CODTIPOBEN, CODBENEFICIARIO, IMPMANDATO, IMPTRATTENUTE , IMPNETTO, INDALLEGATO, INDSOSPESO, INDPGIRO, TMSLOCK, codmesedet ) SELECT GPTMPREGCONTCED.OWNER, GPTMPREGCONTCED.IDRRLAVCED , GPTMPREGCONTCED.IDRELABCED ,GPTMPREGCONTCED.CODTIPOELE, GPTMPREGCONTCED.CODELEMENTO, GPTMPREGCONTCED.CODANNO, GPSOCCED.CODANNOCOMP, GPTMPREGCONTCED.CODPARTE, GPTMPREGCONTCED.IDCAPITOLO, GPTMPREGCONTCED.CODANNOCONT, GPTMPREGCONTCED.IDACCIMP, NVL(DECODE (GPTMPREGCONTCED.CODTIPOELE, 'ONE', GPTMPREGCONTCED.IDRCDC,0),0), GPTMPREGCONTCED.CODTIPOBEN, GPTMPREGCONTCED.CODBENEFICIARIO, SUM( GPSOCCED.IMPTRATTENUTA * QTAMOLTIMPUTAZIONE), 0, SUM( GPSOCCED.IMPTRATTENUTA * QTAMOLTIMPUTAZIONE), 'S', NVL(GPTMPREGCONTCED.INDSOSPESO,'N'), 'N' INDPGIRO, lTIMESTAMP, 0 FROM GPTMPREGCONTCED, GPCONTRIB, GPSOCCED WHERE GPTMPREGCONTCED.OWNER = lCODSESSIONE AND GPTMPREGCONTCED.CODANNO = lCODANNOGRUPPOCONT AND IDR = nGiro AND ( (GPTMPREGCONTCED.CODTIPOELE ='CON' AND GPSOCCED.CODTIPOSOCIALE ='D' ) OR (GPTMPREGCONTCED.CODTIPOELE ='ONE' AND GPSOCCED.CODTIPOSOCIALE ='E' ) ) AND GPTMPREGCONTCED.INDRIPARTIZIONE ='N' AND GPTMPREGCONTCED.CODTIPOLEGAME ='P' AND GPTMPREGCONTCED.IDRCONTRIB = GPCONTRIB.IDRCONTRIB AND GPTMPREGCONTCED.IDRRLAVCED = GPSOCCED.IDRRLAV AND GPTMPREGCONTCED.IDRELABCED = GPSOCCED.IDRELAB AND GPCONTRIB.IDRCONTRIB = GPSOCCED.IDRCONTRIB AND ( ( lINDCONTRXANNO = 'S' AND GPSOCCED.CODANNOCOMP=GPTMPREGCONTCED.CODANNOMAT AND GPSOCCED.QTAPROGR = GPTMPREGCONTCED.QTAPROGELE AND GPTMPREGCONTCED.CODTIPOELE ='CON' ) OR -- Marco: inizio (lINDONERIXANNO = 'S' AND GPSOCCED.CODANNOCOMP=GPTMPREGCONTCED.CODANNOMAT AND GPSOCCED.QTAPROGR = GPTMPREGCONTCED.QTAPROGELE AND GPTMPREGCONTCED.CODTIPOELE ='ONE') OR ( lINDCONTRXANNO= 'N' AND lINDONERIXANNO = 'N') OR (lINDCONTRXANNO= 'S' AND lINDONERIXANNO = 'N' AND GPTMPREGCONTCED.CODTIPOELE ='ONE') OR (lINDCONTRXANNO= 'N' AND lINDONERIXANNO = 'S' AND GPTMPREGCONTCED.CODTIPOELE ='CON')) -- Marco: fine GROUP BY GPTMPREGCONTCED.OWNER, GPTMPREGCONTCED.IDRRLAVCED , GPTMPREGCONTCED.IDRELABCED ,GPTMPREGCONTCED.CODTIPOELE, GPTMPREGCONTCED.CODELEMENTO, GPTMPREGCONTCED.CODANNO, GPSOCCED.CODANNOCOMP, GPTMPREGCONTCED.CODPARTE, GPTMPREGCONTCED.IDCAPITOLO, GPTMPREGCONTCED.CODANNOCONT, GPTMPREGCONTCED.IDACCIMP, DECODE (GPTMPREGCONTCED.CODTIPOELE, 'ONE', GPTMPREGCONTCED.IDRCDC,0), CODTIPOBEN, CODBENEFICIARIO , NVL(GPTMPREGCONTCED.INDSOSPESO,'N'); COMMIT; ELSE -- nGiro>1 FOR rec IN -- 2.1. Contabilizzazione delle voci ( ( SELECT GPTMPREGCONTCED.IDRRLAVCED, GPTMPREGCONTCED.IDRELABCED, GPTMPREGCONTCED.CODTIPOELE, GPTMPREGCONTCED.CODANNO CODANNOESERCIZIO, GPTMPREGCONTCED.codannomat CODANNOMAT, CODPARTE, IDCAPITOLO, GPTMPREGCONTCED.CODANNOCONT, IDACCIMP, NVL(DECODE(GPTMPREGCONTCED.indpgiro, 'N', GPTMPREGCONTCED.IDRCDC,0),0) IDRCDC, CODTIPOBEN, CODBENEFICIARIO, NULL IDRRISCONT, -- Riccardo inizio 2004 ROUND( SUM(DECODE( CODCOLONNA, 'C', IMPELEMENTO, 'F', IMPELEMENTO, 'T', IMPELEMENTO*(-1),0)* QTAMOLTIMPUTAZIONE) * GPTMPRIFXCONT.PRCAPPARTENENZA/100, 2) IMPMANDATO -- Riccardo fine , 0 IMPTRATTENUTE, 0 IMPNETTO, 'S' INDALLEGATO, GPTMPREGCONTCED.CODELEMENTO, NVL(GPTMPREGCONTCED.INDSOSPESO,'N') INDSOSPESO, INDPGIRO, GPTMPREGCONTCED.QTASEZIONE, GPTMPREGCONTCED.QTAPROGELE FROM GPTMPREGCONTCED, GPTMPRIFXCONT WHERE GPTMPREGCONTCED.OWNER = lCODSESSIONE AND GPTMPREGCONTCED.CODANNO = lCODANNOGRUPPOCONT AND GPTMPREGCONTCED.CODTIPOELE = 'IDV' AND GPTMPRIFXCONT.OWNER = lCODSESSIONE AND GPTMPRIFXCONT.IDRELAB = GPTMPREGCONTCED.IDRELABCED AND GPTMPRIFXCONT.IDRRLAV = GPTMPREGCONTCED.IDRRLAVCED AND GPTMPRIFXCONT.GIRO = nGiro AND-- se c'é lo prende, altrimenti no IDR = GPTMPRIFXCONT.Giro AND GPTMPREGCONTCED.CODTIPOLEGAME ='P' AND (CODSEGNOVOCE = 'X' OR (CODSEGNOVOCE = 'P' AND IMPELEMENTO >= 0) OR (CODSEGNOVOCE = 'N' AND IMPELEMENTO <0)) GROUP BY GPTMPREGCONTCED.IDRRLAVCED, GPTMPREGCONTCED.IDRELABCED, GPTMPREGCONTCED.CODTIPOELE, GPTMPREGCONTCED.CODANNO, GPTMPREGCONTCED.CODANNOMAT, CODPARTE, IDCAPITOLO, GPTMPREGCONTCED.CODANNOCONT, IDACCIMP, GPTMPREGCONTCED.QTASEZIONE, GPTMPREGCONTCED.QTAPROGELE, CODTIPOBEN,CODBENEFICIARIO,DECODE(GPTMPREGCONTCED.indpgiro, 'N', GPTMPREGCONTCED.IDRCDC,0), GPTMPREGCONTCED.CODELEMENTO, NVL(GPTMPREGCONTCED.INDSOSPESO,'N'), INDPGIRO, GPTMPRIFXCONT.PRCAPPARTENENZA ) UNION ( SELECT GPTMPREGCONTCED.IDRRLAVCED , GPTMPREGCONTCED.IDRELABCED ,GPTMPREGCONTCED.CODTIPOELE, GPTMPREGCONTCED.CODANNO CODANNOESERCIZIO, GPTMPREGCONTCED.CODANNO CODANNOMAT, GPTMPREGCONTCED.CODPARTE, GPTMPREGCONTCED.IDCAPITOLO, GPTMPREGCONTCED.CODANNOCONT,GPTMPREGCONTCED.IDACCIMP, 0 IDRCDC, CODTIPOBEN, CODBENEFICIARIO, NULL IDRRISCONT, -- Riccardo inizio ROUND(SUM( GPFISCED.IMPIMPOSTANETTA * QTAMOLTIMPUTAZIONE) * GPTMPRIFXCONT.PRCAPPARTENENZA/100, 2) IMPMANDATO, 0 IMPTRATTENUTE, ROUND(SUM( GPFISCED.IMPIMPOSTANETTA * QTAMOLTIMPUTAZIONE) * GPTMPRIFXCONT.PRCAPPARTENENZA/100, 2) IMPNETTO, 'S' INDALLEGATO, GPTMPREGCONTCED.CODELEMENTO, NVL(GPTMPREGCONTCED.INDSOSPESO,'N') INDSOSPESO, 'S' INDPGIRO , GPTMPREGCONTCED.QTASEZIONE, GPTMPREGCONTCED.QTAPROGELE -- Riccardo fine FROM GPTMPRIFXCONT,GPTMPREGCONTCED, GPLTIPOTASS, GPFISCED WHERE GPTMPREGCONTCED.OWNER = lCODSESSIONE AND GPTMPREGCONTCED.CODANNO = lCODANNOGRUPPOCONT AND GPTMPRIFXCONT.OWNER = lCODSESSIONE AND GPTMPRIFXCONT.IDRELAB = GPTMPREGCONTCED.IDRELABCED AND GPTMPRIFXCONT.IDRRLAV = GPTMPREGCONTCED.IDRRLAVCED AND GPTMPRIFXCONT.GIRO = nGiro AND-- se c'é lo prende, altrimenti no IDR = GPTMPRIFXCONT.Giro AND GPTMPREGCONTCED.CODTIPOELE = 'TAX' AND GPTMPREGCONTCED.CODTIPOLEGAME ='P' AND GPTMPREGCONTCED.CODTIPOTASS = GPLTIPOTASS.CODTIPOTASS AND GPTMPREGCONTCED.IDRRLAVCED = GPFISCED.IDRRLAV AND GPTMPREGCONTCED.IDRELABCED = GPFISCED.IDRELAB AND GPLTIPOTASS.CODTIPOTASS = GPFISCED.CODTIPOTASS GROUP BY GPTMPREGCONTCED.IDRRLAVCED , GPTMPREGCONTCED.IDRELABCED ,GPTMPREGCONTCED.CODTIPOELE, GPTMPREGCONTCED.CODANNO , GPTMPREGCONTCED.CODPARTE, GPTMPREGCONTCED.IDCAPITOLO, GPTMPREGCONTCED.CODANNOCONT, GPTMPREGCONTCED.IDACCIMP, GPTMPREGCONTCED.QTASEZIONE, GPTMPREGCONTCED.QTAPROGELE, CODTIPOBEN, CODBENEFICIARIO, GPTMPRIFXCONT.PRCAPPARTENENZA, GPTMPREGCONTCED.CODELEMENTO, NVL(GPTMPREGCONTCED.INDSOSPESO,'N'),GPTMPRIFXCONT.PRCAPPARTENENZA ) UNION -- 2.3.1 Contabilizzazione degli oneri e contributi da non ripartire ( SELECT GPTMPREGCONTCED.IDRRLAVCED , GPTMPREGCONTCED.IDRELABCED ,GPTMPREGCONTCED.CODTIPOELE, GPTMPREGCONTCED.CODANNO CODANNOESERCIZIO, GPSOCCED.CODANNOCOMP CODANNOMAT, GPTMPREGCONTCED.CODPARTE, GPTMPREGCONTCED.IDCAPITOLO, GPTMPREGCONTCED.CODANNOCONT,GPTMPREGCONTCED.IDACCIMP, NVL(DECODE(GPTMPREGCONTCED.CODTIPOELE, 'ONE', GPTMPREGCONTCED.IDRCDC,0),0) IDRCDC, GPTMPREGCONTCED.CODTIPOBEN, GPTMPREGCONTCED.CODBENEFICIARIO,NULL IDRRISCONT, -- Riccardo inizio ROUND( SUM( GPSOCCED.IMPTRATTENUTA * QTAMOLTIMPUTAZIONE) * GPTMPRIFXCONT.PRCAPPARTENENZA/100, 2) IMPMANDATO, 0 IMPTRATTENUTE, ROUND( SUM( GPSOCCED.IMPTRATTENUTA * QTAMOLTIMPUTAZIONE) * GPTMPRIFXCONT.PRCAPPARTENENZA/100, 2) IMPNETTO, 'S' INDALLEGATO, GPTMPREGCONTCED.CODELEMENTO, NVL(GPTMPREGCONTCED.INDSOSPESO,'N') INDSOSPESO, DECODE(GPTMPREGCONTCED.CODTIPOELE, 'ONE', 'N', 'S') INDPGIRO , GPTMPREGCONTCED.QTASEZIONE, GPTMPREGCONTCED.QTAPROGELE -- Riccardo fine FROM GPTMPRIFXCONT,GPTMPREGCONTCED, GPCONTRIB, GPSOCCED WHERE GPTMPREGCONTCED.OWNER = lCODSESSIONE AND GPTMPREGCONTCED.CODANNO = lCODANNOGRUPPOCONT AND GPTMPRIFXCONT.OWNER = lCODSESSIONE AND GPTMPRIFXCONT.IDRELAB = GPTMPREGCONTCED.IDRELABCED AND GPTMPRIFXCONT.IDRRLAV = GPTMPREGCONTCED.IDRRLAVCED AND GPTMPRIFXCONT.GIRO = nGiro AND-- se c'é lo prende, altrimenti no IDR = GPTMPRIFXCONT.Giro AND ( (GPTMPREGCONTCED.CODTIPOELE ='CON' AND GPSOCCED.CODTIPOSOCIALE ='D' ) OR (GPTMPREGCONTCED.CODTIPOELE ='ONE' AND GPSOCCED.CODTIPOSOCIALE ='E' ) ) AND GPTMPREGCONTCED.INDRIPARTIZIONE ='N' AND GPTMPREGCONTCED.CODTIPOLEGAME ='P' AND GPTMPREGCONTCED.IDRCONTRIB = GPCONTRIB.IDRCONTRIB AND GPTMPREGCONTCED.IDRRLAVCED = GPSOCCED.IDRRLAV AND GPTMPREGCONTCED.IDRELABCED = GPSOCCED.IDRELAB AND GPCONTRIB.IDRCONTRIB = GPSOCCED.IDRCONTRIB AND ( ( lINDCONTRXANNO = 'S' AND GPSOCCED.CODANNOCOMP=GPTMPREGCONTCED.CODANNOMAT AND GPSOCCED.QTAPROGR = GPTMPREGCONTCED.QTAPROGELE AND GPTMPREGCONTCED.CODTIPOELE ='CON' ) OR -- Marco: inizio ( lINDONERIXANNO = 'S' AND GPSOCCED.CODANNOCOMP=GPTMPREGCONTCED.CODANNOMAT AND GPSOCCED.QTAPROGR = GPTMPREGCONTCED.QTAPROGELE AND GPTMPREGCONTCED.CODTIPOELE ='ONE' ) OR ( lINDCONTRXANNO= 'N' AND lINDONERIXANNO = 'N') OR (lINDCONTRXANNO= 'S' AND lINDONERIXANNO = 'N' AND GPTMPREGCONTCED.CODTIPOELE ='ONE') OR (lINDCONTRXANNO= 'N' AND lINDONERIXANNO = 'S' AND GPTMPREGCONTCED.CODTIPOELE ='CON') ) -- Marco: fine GROUP BY GPTMPREGCONTCED.IDRRLAVCED , GPTMPREGCONTCED.IDRELABCED ,GPTMPREGCONTCED.CODTIPOELE, GPTMPREGCONTCED.CODANNO, GPSOCCED.CODANNOCOMP, GPTMPREGCONTCED.CODPARTE, GPTMPREGCONTCED.IDCAPITOLO, GPTMPREGCONTCED.CODANNOCONT, GPTMPREGCONTCED.IDACCIMP, DECODE(GPTMPREGCONTCED.CODTIPOELE, 'ONE', GPTMPREGCONTCED.IDRCDC,0), GPTMPREGCONTCED.QTASEZIONE, GPTMPREGCONTCED.QTAPROGELE, CODTIPOBEN, CODBENEFICIARIO,GPTMPRIFXCONT.PRCAPPARTENENZA, GPTMPREGCONTCED.CODELEMENTO, NVL(GPTMPREGCONTCED.INDSOSPESO,'N') ) ) LOOP sINDPGIRO := rec.INDPGIRO; --RM2004 BEGIN SELECT DISTINCT IDCAPITOLO, CODANNOCONT, IDACCIMP, CODTIPOBEN, CODBENEFICIARIO, NVL(DECODE (rec.CODTIPOELE, 'ONE', GPTMPREGCONTCED.IDRCDC, 'IDV', DECODE( sINDPGIRO , 'S', 0, GPTMPREGCONTCED.IDRCDC ),0),0) , --???? INDSOSPESO INTO nIDCAPITOLO1, nCODANNOCONT1,nIDACCIMP1, sCODTIPOBEN1, sCODBENEFICIARIO1, nIDCDC1, sINDSOSPESO FROM GPTMPREGCONTCED WHERE GPTMPREGCONTCED.OWNER = lCODSESSIONE AND GPTMPREGCONTCED.CODANNO = rec.CODANNOESERCIZIO AND GPTMPREGCONTCED.CODPARTE = rec.CODPARTE AND GPTMPREGCONTCED.QTAPROGELE = rec.QTAPROGELE AND GPTMPREGCONTCED.QTASEZIONE = rec.QTASEZIONE AND CODANNOMAT = DECODE( rec.CODTIPOELE, 'IDV', rec.CODANNOMAT, '0') AND -- NELLE regole nn è specificato l'anno di maturazione se nn è una voce GPTMPREGCONTCED.DTAINIZIO = TO_DATE( sDTAMIN, 'DD/MM/YYYY') AND GPTMPREGCONTCED.CODTIPOELE = rec.CODTIPOELE AND GPTMPREGCONTCED.CODELEMENTO = rec.CODELEMENTO AND GPTMPREGCONTCED.IDRRLAVCED= rec.IDRRLAVCED AND GPTMPREGCONTCED.IDRELABCED = rec.IDRELABCED AND GPTMPREGCONTCED.CODTIPOLEGAME ='P' AND GPTMPREGCONTCED.IDR = 1; EXCEPTION WHEN OTHERS THEN NULL; END; -- TOLGO IL CALCOLATO DA DOVE è stato messo al primo Giro IF ( ( REC.IMPMANDATO>0 OR REC.IMPTRATTENUTE > 0 ) AND ( nIDCAPITOLO1 <> rec.IDCAPITOLO OR nCODANNOCONT1 <> rec.CODANNOCONT OR nIDACCIMP1 <> rec.IDACCIMP OR sCODTIPOBEN1 <> rec.CODTIPOBEN OR sCODBENEFICIARIO1 <> rec.CODBENEFICIARIO OR nIDCDC1 <> rec.IDRCDC OR rec.INDSOSPESO <> sINDSOSPESO ) ) THEN UPDATE GPTMPELERISCONT SET IMPMANDATO = NVL(IMPMANDATO,0) - REC.IMPMANDATO, IMPTRATTENUTE = NVL(IMPTRATTENUTE,0) - REC.IMPTRATTENUTE, IMPNETTO = NVL(IMPNETTO,0) - REC.IMPNETTO WHERE IDRRLAV = rec.IDRRLAVCED AND IDRELAB = rec.IDRELABCED AND CODTIPOELE = DECODE( rec.CODTIPOELE, 'IDV','VOX', rec.CODTIPOELE ) AND CODELEMENTO = rec.CODELEMENTO AND CODANNOESERCIZIO = rec.CODANNOESERCIZIO AND CODANNOMAT = rec.CODANNOMAT AND CODPARTE = rec.CODPARTE AND IDCAPITOLO = nIDCAPITOLO1 AND CODANNOCONT = nCODANNOCONT1 AND IDACCIMP = nIDACCIMP1 AND IDCDC = nIDCDC1 AND CODTIPOBEN = sCODTIPOBEN1 AND CODBENEFICIARIO = sCODBENEFICIARIO1 AND INDSOSPESO = sINDSOSPESO AND OWNER = lCODSESSIONE; -- ora devo trattare il calcolato e aggiungerlo eventualmente a uno già esistente o inserirlo ex-novo UPDATE GPTMPELERISCONT SET IMPMANDATO = NVL(IMPMANDATO,0) + REC.IMPMANDATO, IMPTRATTENUTE = NVL(IMPTRATTENUTE,0) + REC.IMPTRATTENUTE, IMPNETTO = NVL(IMPNETTO,0) + REC.IMPNETTO WHERE IDRRLAV = rec.IDRRLAVCED AND IDRELAB = rec.IDRELABCED AND CODTIPOELE = DECODE( rec.CODTIPOELE, 'IDV','VOX', rec.CODTIPOELE ) AND CODELEMENTO = rec.CODELEMENTO AND CODANNOESERCIZIO = rec.CODANNOESERCIZIO AND CODANNOMAT = rec.CODANNOMAT AND CODPARTE = rec.CODPARTE AND IDCAPITOLO = rec.IDCAPITOLO AND CODANNOCONT = rec.CODANNOCONT AND IDACCIMP = rec.IDACCIMP AND IDCDC = rec.IDRCDC AND CODTIPOBEN = rec.CODTIPOBEN AND CODBENEFICIARIO = rec.CODBENEFICIARIO AND INDSOSPESO = rec.INDSOSPESO AND OWNER = lCODSESSIONE; IF SQL%ROWCOUNT = 0 THEN INSERT INTO GPTMPELERISCONT( OWNER, IDRRLAV , IDRELAB , CODTIPOELE , CODELEMENTO, CODANNOESERCIZIO , CODANNOMAT , CODPARTE , IDCAPITOLO , IDCDC , CODANNOCONT , IDACCIMP , CODTIPOBEN , CODBENEFICIARIO , IMPMANDATO , IMPTRATTENUTE , IMPNETTO , INDALLEGATO , INDSOSPESO, INDPGIRO, TMSLOCK , codmesedet ) VALUES ( lCODSESSIONE, rec.IDRRLAVCED, rec.IDRELABCED, DECODE( rec.CODTIPOELE, 'IDV','VOX', rec.CODTIPOELE ), rec.CODELEMENTO, rec.CODANNOESERCIZIO, rec.CODANNOMAT, rec.CODPARTE, rec.IDCAPITOLO, NVL(rec.IDRCDC,0),rec.CODANNOCONT, rec.IDACCIMP, rec.CODTIPOBEN, rec.CODBENEFICIARIO, rec.IMPMANDATO,rec.IMPTRATTENUTE, rec.IMPNETTO, 'S', rec.INDSOSPESO, sINDPGIRO,lTIMESTAMP , 0); END IF; END IF; END LOOP; END IF; nGiro := nGiro + 1; END LOOP; -- Aggiorno la TMP delle Voci sottraendo le eventuali somme dei giri successivi al primo UPDATE GPTMPREGCONTCED A SET A.IMPELEMENTO = ( SELECT NVL(A.IMPELEMENTO,0)-NVL(MAX(SUM(B.IMPELEMENTO)),0) -- se non trova nulla RESTITUISCE almeno una riga, senza MAX non la resituiva FROM GPTMPREGCONTCED B WHERE A.OWNER = B.OWNER AND B.IDR > 1 AND A.IDRRLAVCED = B.IDRRLAVCED AND A.IDRELABCED = B.IDRELABCED AND A.CODVOCE = B.CODVOCE AND A.CODANNO = B.CODANNO AND A.CODANNOMAT = B.CODANNOMAT AND A.CODPARTE = B.CODPARTE AND A.QTASEZIONE = B.QTASEZIONE AND A.QTAPROGELE = B.QTAPROGELE AND A.DTAINIZIO = B.DTAINIZIO AND A.CODTIPOELE = B.CODTIPOELE AND A.CODTIPOELE = 'IDV' GROUP BY A.IMPELEMENTO ) WHERE A.IDR=1 AND A.OWNER = lCODSESSIONE AND EXISTS ( SELECT B.IDR FROM GPTMPREGCONTCED B WHERE A.OWNER = B.OWNER AND B.IDR > 1 AND A.IDRRLAVCED = B.IDRRLAVCED AND A.IDRELABCED = B.IDRELABCED AND A.CODVOCE = B.CODVOCE AND A.CODANNO = B.CODANNO AND A.CODANNOMAT = B.CODANNOMAT AND A.CODPARTE = B.CODPARTE AND A.QTASEZIONE = B.QTASEZIONE AND A.QTAPROGELE = B.QTAPROGELE AND A.DTAINIZIO = B.DTAINIZIO AND A.CODTIPOELE = B.CODTIPOELE AND A.CODTIPOELE = 'IDV'); -- 2.3.2 Contabilizzazione degli oneri da ripartire --INDRIPARTIZIONE: 'S', l'Onere va ripartito sui capitoli delle voci che lo hanno determinato, -- in proporzione a come queste lo hanno determinato. Ho le voci, queste sono assoggettate a -- dei contributi, vedo l'Importo dovuto per ogni voce singolarmente -- ( IMPVOX1, IMPVOX2, IMPVOX3, .. IMPVOXn) e l'importo totale del mandato delle Voci(IMPMANDATO), da qui la proporzione: --x1:IMPVOX1=(IMPTRATTENUTA * PRCMOLTIP):IMPMANDATO, -- x1= ( IMPTRATTENUTA*PRCMOLTIP/100*IMPVOX1)/IMPMANDATO sul CapitoloC1 --x2:IMPVOX2=(IMPTRATTENUTA * PRCMOLTIP):IMPMANDATO, -- x2= ( IMPTRATTENUTA*PRCMOLTIP/100*IMPVOX2)/IMPMANDATO sul CapitoloC2 -- ¿¿¿¿¿¿ --xn:IMPVOXn=(IMPTRATTENUTA * PRCMOLTIP):IMPMANDATO, -- xn= ( IMPTRATTENUTA*PRCMOLTIP/100*IMPVOXn)/IMPMANDATO sul CapitoloCn --- NON METTO ONERI DENTRO --RICCARDO : LETTURA FUORI CICLO OPEN curONERI; FETCH curONERI INTO recONERI; nOnereRipart :=0; nOnereTot := recONERI.rSUMIMPTRATT; BEGIN SELECT COUNT(*),IDCAPITOLORIPART, IDACCIMPRIPART, CODANNOCONTRIPART into nCOUNT, rIDCAPITOLORIPARTDET, rIDACCIMPRIPARTDET, rCODANNOCONTRIPARTDET FROM GPTMPREGCONTCEDDET WHERE OWNER = lCODSESSIONE AND CODANNO = recONERI.rCODANNO AND CODVOCE = recONERI.rCODVOCE AND CODANNOMAT = recONERI.rCODANNOMAT AND QTAPROGELE = recONERI.rQTAPROGELE AND QTASEZIONE = recONERI.rQTASEZIONE AND IDRRLAVCED = recONERI.rIDRRLAV AND IDRELABCED = recONERI.rIDRELAB AND DTAINIZIO = TO_DATE( sDTAMIN, 'DD/MM/YYYY') --AL MOMENTO NON GESTITO AND IDR = recONERI.rGIRO -- PRELEVO LE REGOLE PREVISTE PER FF/SS AND IDRCONTRIB = recONERI.rIDRCONTRIB GROUP BY IDCAPITOLORIPART, IDACCIMPRIPART, CODANNOCONTRIPART; IF nCOUNT = 1 THEN recONERI.rIDCAPITOLORIPART := rIDCAPITOLORIPARTDET; recONERI.rCODANNOCONTRIPART := rCODANNOCONTRIPARTDET; recONERI.rIDACCIMPRIPART := rIDACCIMPRIPARTDET; -- Marco: ulteriore (eventuale) aggiornamento dei campi recONERI.rIDCAPITOLORIPART, -- recONERI.rCODANNOCONTRIPART, recONERI.rIDACCIMPRIPART in base alle associazioni -- impostate nella tabella GPCROSSCONTAB (Corrispondenze Elementi Contabili) IF lINDONERIXANNO = 'S' THEN BEGIN SELECT COUNT(*), IDCAPITOLORES, IDACCIMPRES, CODANNORES INTO nCOUNT, rIDCAPITOLORIPARTDET, rIDACCIMPRIPARTDET, rCODANNOCONTRIPARTDET FROM GPCROSSCONTAB WHERE CODANNOMAT = recONERI.rCODANNOMAT AND CODPARTE = recONERI.rCODPARTE AND CODANNOLIQ = recONERI.rCODANNO AND IDCAPITOLOLIQ = recONERI.rIDCAPITOLORIPART AND CODANNOIMPLIQ = recONERI.rCODANNOCONTRIPART AND IDACCIMPLIQ = recONERI.rIDACCIMPRIPART GROUP BY IDCAPITOLORES, CODANNORES, IDACCIMPRES; IF nCOUNT = 1 THEN recONERI.rIDCAPITOLORIPART := rIDCAPITOLORIPARTDET; recONERI.rCODANNOCONTRIPART := rCODANNOCONTRIPARTDET; recONERI.rIDACCIMPRIPART := rIDACCIMPRIPARTDET; END IF; EXCEPTION WHEN NO_DATA_FOUND THEN NULL; END; END IF; END IF; EXCEPTION WHEN NO_DATA_FOUND THEN nCOUNT :=0; END; LOOP EXIT WHEN curONERI%NOTFOUND; ---- Inizializzo variabili recONERITMP.rCODPARTE := recONERI.rCODPARTE; recONERITMP.rIDCAPITOLORIPART := recONERI.rIDCAPITOLORIPART; recONERITMP.rCODANNOCONTRIPART := recONERI.rCODANNOCONTRIPART; recONERITMP.rCODANNO := recONERI.rCODANNO; recONERITMP.rCODANNOCOMP := recONERI.rCODANNOCOMP; recONERITMP.rIDACCIMPRIPART := recONERI.rIDACCIMPRIPART; recONERITMP.rIDCDC := recONERI.rIDCDC; recONERITMP.rCODTIPOBENRIPART := recONERI.rCODTIPOBENRIPART; recONERITMP.rCODBENRIPART := recONERI.rCODBENRIPART; recONERITMP.rIDRRLAV := recONERI.rIDRRLAV ; recONERITMP.rIDRELAB := recONERI.rIDRELAB; recONERITMP.rIDRCONTRIB := recONERI.rIDRCONTRIB; recONERITMP.rINDSOSPESO := recONERI.rINDSOSPESO; recONERITMP.rINDSPOSTA := recONERI.rINDSPOSTA; recONERITMP.rIDCAPITOLODA := recONERI.rIDCAPITOLODA; recONERITMP.rCODANNOCONTDA := recONERI.rCODANNOCONTDA; recONERITMP.rIDACCIMPDA := recONERI.rIDACCIMPDA; recONERITMP.rCODELEMENTO := recONERI.rCODELEMENTO; recONERITMP.rQTASEZIONE := recONERI.rQTASEZIONE; -- ELABORAZIONE IF recONERI.rIMPMANDATO = 0 THEN nIMPTRATTRIPART := 0; ELSE nIMPTRATTRIPART := ROUND( ( recONERI.rSUMIMPTRATT * recONERI.rPRCMOLTIP * recONERI.rIMPVOX ) / ( recONERI.rIMPMANDATO * 100),2); END IF; UPDATE GPTMPELERISCONT SET IMPMANDATO = NVL(IMPMANDATO,0) + nIMPTRATTRIPART, IMPNETTO = NVL(IMPNETTO,0) + nIMPTRATTRIPART WHERE IDRRLAV = recONERI.rIDRRLAV AND IDRELAB = recONERI.rIDRELAB AND CODTIPOELE = 'ONE' AND CODELEMENTO = recONERI.rIDRCONTRIB AND CODANNOESERCIZIO = recONERI.rCODANNO AND CODANNOMAT = recONERI.rCODANNOCOMP AND CODPARTE = recONERI.rCODPARTE AND IDCAPITOLO = recONERI.rIDCAPITOLORIPART AND CODANNOCONT = recONERI.rCODANNOCONTRIPART AND IDACCIMP = recONERI.rIDACCIMPRIPART AND IDCDC = recONERI.rIDCDC AND CODTIPOBEN = recONERI.rCODTIPOBENRIPART AND CODBENEFICIARIO = recONERI.rCODBENRIPART AND INDSOSPESO = recONERI.rINDSOSPESO AND OWNER = lCODSESSIONE; IF SQL%ROWCOUNT = 0 THEN INSERT INTO GPTMPELERISCONT(OWNER, IDRRLAV , IDRELAB , CODTIPOELE , CODELEMENTO, CODANNOESERCIZIO , CODANNOMAT, CODPARTE , IDCAPITOLO , CODANNOCONT, IDACCIMP , IDCDC, CODTIPOBEN, CODBENEFICIARIO, IMPMANDATO, IMPTRATTENUTE, IMPNETTO, INDALLEGATO, INDSOSPESO, INDPGIRO, codmesedet ) VALUES ( lCODSESSIONE, recONERI.rIDRRLAV, recONERI.rIDRELAB, 'ONE', recONERI.rIDRCONTRIB, recONERI.rCODANNO, recONERI.rCODANNOCOMP, recONERI.rCODPARTE, recONERI.rIDCAPITOLORIPART, recONERI.rCODANNOCONTRIPART, recONERI.rIDACCIMPRIPART, NVL(recONERI.rIDCDC,0), recONERI.rCODTIPOBENRIPART, recONERI.rCODBENRIPART, NVL(nIMPTRATTRIPART,0), 0, nIMPTRATTRIPART, 'S', recONERI.rINDSOSPESO, 'N', 0 ); END IF; --RM2004 : TOLGO DAL CAPITOLO/IMPEGNO GIà CONTABILIZZATO SE AVEVO DEROGHE SULLA VOCE IF (recONERI.rINDSPOSTA = 'S') THEN UPDATE GPTMPELERISCONT SET IMPMANDATO = NVL(IMPMANDATO,0) - nIMPTRATTRIPART, IMPNETTO = NVL(IMPNETTO,0) - nIMPTRATTRIPART WHERE IDRRLAV = recONERI.rIDRRLAV AND IDRELAB = recONERI.rIDRELAB AND CODTIPOELE = 'ONE' AND CODELEMENTO = recONERI.rIDRCONTRIB AND CODANNOESERCIZIO = recONERI.rCODANNO AND CODANNOMAT = recONERI.rCODANNOCOMP AND CODPARTE = recONERI.rCODPARTE AND IDCAPITOLO = recONERI.rIDCAPITOLODA AND CODANNOCONT = recONERI.rCODANNOCONTDA AND IDACCIMP = recONERI.rIDACCIMPDA AND IDCDC = recONERI.rIDCDC AND CODTIPOBEN = recONERI.rCODTIPOBENRIPART AND CODBENEFICIARIO = recONERI.rCODBENRIPART AND INDSOSPESO = recONERI.rINDSOSPESO AND OWNER = lCODSESSIONE; END IF; nOnereRipart := nOnereRipart + nIMPTRATTRIPART; FETCH curONERI INTO recONERI; -- Se cambia o not found update IF ( recONERITMP.rIDRRLAV <> recONERI.rIDRRLAV OR recONERITMP.rIDRELAB <> recONERI.rIDRELAB OR recONERITMP.rCODANNOCOMP <> recONERI.rCODANNOCOMP OR --Riccardo 2002-01-31 recONERITMP.rIDRCONTRIB <> recONERI.rIDRCONTRIB OR curONERI%NOTFOUND OR recONERITMP.rINDSOSPESO <> recONERI.rINDSOSPESO OR recONERITMP.rQTASEZIONE <> recONERI.rQTASEZIONE ) THEN -- DEVO AGGIUNGERE GLI SFRIDI ALL'ULTIMO CAPITOLO INSERITO PER QUEL RAPLAV/ELAB/CONTRIB -- al precedente devo aggiungere gli sfridi nResto := nOnereTot - nOnereRipart; UPDATE GPTMPELERISCONT SET IMPMANDATO = NVL(IMPMANDATO,0) + nResto, IMPNETTO = NVL(IMPNETTO,0) + nResto WHERE IDRRLAV = recONERITMP.rIDRRLAV AND IDRELAB = recONERITMP.rIDRELAB AND CODTIPOELE = 'ONE' AND CODELEMENTO = recONERITMP.rIDRCONTRIB AND CODANNOESERCIZIO = recONERITMP.rCODANNO AND CODANNOMAT = recONERITMP.rCODANNOCOMP AND CODPARTE = recONERITMP.rCODPARTE AND IDCAPITOLO = recONERITMP.rIDCAPITOLORIPART AND CODANNOCONT = recONERITMP.rCODANNOCONTRIPART AND IDACCIMP = recONERITMP.rIDACCIMPRIPART AND IDCDC = recONERITMP.rIDCDC AND CODTIPOBEN = recONERITMP.rCODTIPOBENRIPART AND CODBENEFICIARIO = recONERITMP.rCODBENRIPART AND INDSOSPESO = recONERITMP.rINDSOSPESO and owner = lCODSESSIONE; IF (recONERITMP.rINDSPOSTA = 'S') THEN UPDATE GPTMPELERISCONT SET IMPMANDATO = NVL(IMPMANDATO,0) - nResto, IMPNETTO = NVL(IMPNETTO,0) - nResto WHERE IDRRLAV = recONERITMP.rIDRRLAV AND IDRELAB = recONERITMP.rIDRELAB AND CODTIPOELE = 'ONE' AND CODELEMENTO = recONERITMP.rIDRCONTRIB AND CODANNOESERCIZIO = recONERITMP.rCODANNO AND CODANNOMAT = recONERITMP.rCODANNOCOMP AND CODPARTE = recONERITMP.rCODPARTE AND --anto inizio IDCAPITOLO = recONERITMP.rIDCAPITOLORIPART AND CODANNOCONT = recONERITMP.rCODANNOCONTRIPART AND IDACCIMP = recONERITMP.rIDACCIMPRIPART AND --anto fine IDCDC = recONERITMP.rIDCDC AND CODTIPOBEN = recONERITMP.rCODTIPOBENRIPART AND CODBENEFICIARIO = recONERITMP.rCODBENRIPART AND INDSOSPESO = recONERITMP.rINDSOSPESO and owner = lCODSESSIONE; END IF; -- Aggiorno variabili nOnereTot := recONERI.rSUMIMPTRATT; nOnereRipart:=0; END IF; BEGIN SELECT COUNT(*),IDCAPITOLORIPART, IDACCIMPRIPART, CODANNOCONTRIPART into nCOUNT, rIDCAPITOLORIPARTDET, rIDACCIMPRIPARTDET, rCODANNOCONTRIPARTDET FROM GPTMPREGCONTCEDDET WHERE OWNER = lCODSESSIONE AND CODANNO = recONERI.rCODANNO AND IDRRLAVCED = recONERI.rIDRRLAV AND IDRELABCED = recONERI.rIDRELAB AND DTAINIZIO = TO_DATE( sDTAMIN, 'DD/MM/YYYY') --AL MOMENTO NON GESTITO AND IDR = recONERI.rGIRO -- PRELEVO LE REGOLE PREVISTE PER FF/SS AND IDRCONTRIB = recONERI.rIDRCONTRIB AND CODVOCE = recONERI.rCODVOCE AND CODANNOMAT = recONERI.rCODANNOMAT AND QTASEZIONE = recONERI.rQTASEZIONE AND QTAPROGELE = recONERI.rQTAPROGELE GROUP BY IDCAPITOLORIPART, IDACCIMPRIPART, CODANNOCONTRIPART; IF nCOUNT = 1 THEN recONERI.rIDCAPITOLORIPART := rIDCAPITOLORIPARTDET; recONERI.rCODANNOCONTRIPART := rCODANNOCONTRIPARTDET; recONERI.rIDACCIMPRIPART := rIDACCIMPRIPARTDET; -- Marco: ulteriore (eventuale) aggiornamento dei campi recONERI.rIDCAPITOLORIPART, -- recONERI.rCODANNOCONTRIPART, recONERI.rIDACCIMPRIPART in base alle associazioni -- impostate nella tabella GPCROSSCONTAB (Corrispondenze Elementi Contabili) IF lINDONERIXANNO = 'S' THEN BEGIN SELECT COUNT(*), IDCAPITOLORES, CODANNORES, IDACCIMPRES INTO nCOUNT, rIDCAPITOLORIPARTDET, rCODANNOCONTRIPARTDET, rIDACCIMPRIPARTDET FROM GPCROSSCONTAB WHERE CODANNOMAT = recONERI.rCODANNOMAT AND CODPARTE = recONERI.rCODPARTE AND CODANNOLIQ = recONERI.rCODANNO AND IDCAPITOLOLIQ = recONERI.rIDCAPITOLORIPART AND CODANNOIMPLIQ = recONERI.rCODANNOCONTRIPART AND IDACCIMPLIQ = recONERI.rIDACCIMPRIPART GROUP BY IDCAPITOLORES, CODANNORES, IDACCIMPRES; IF nCOUNT = 1 THEN recONERI.rIDCAPITOLORIPART := rIDCAPITOLORIPARTDET; recONERI.rCODANNOCONTRIPART := rCODANNOCONTRIPARTDET; recONERI.rIDACCIMPRIPART := rIDACCIMPRIPARTDET; END IF; EXCEPTION WHEN NO_DATA_FOUND THEN NULL; END; END IF; END IF; EXCEPTION WHEN NO_DATA_FOUND THEN nCOUNT :=0; END; END LOOP; CLOSE curONERI; COMMIT; /******************************************************************** Gestione dell'Alternativo Occorre sapere quale tipo di contabilizzazione è stata scelta per l'Ente specificato, dato che la verifica della Disponibilità sarà indirizzata a tabelle diverse a seconda di quale contabilizzazione occorre fare. Dalla GPINFO, con TIPOINFO='TPCOLCONT' e CODINFO=lCODENTEAZ estraiamo il CODULT: -- '0': Assenza di Contabilizzazione -- '1': Contabilizzazione per @-Serfin -- '2': Contabilizzazione per StudioK ********************************************************************/ SELECT NVL(MAX(CODULT),1) -- per default metto Contabilizzazione con Serfin INTO sTPCOLCONT FROM GPINFO WHERE TIPOINFO = 'TPCOLCONT' AND CODINFO = UPPER(lCODENTEAZ); IF sTPCOLCONT > 0 THEN IF sTPCOLCONT = 1 THEN SELECT DESSCHEMASERFIN INTO sDESSCHEMASERFIN FROM GPENTEAZ WHERE CODENTEAZ = UPPER(lCODENTEAZ); -- Il campo DESSCHEMASERFIN ora può essere nella forma SCHEMA@DBLINK IF INSTR(sDESSCHEMASERFIN, '@') > 0 THEN sNomeSchema := SUBSTR(sDESSCHEMASERFIN, 1, INSTR(sDESSCHEMASERFIN, '@') - 1); sNomeDBLink := SUBSTR(sDESSCHEMASERFIN, INSTR(sDESSCHEMASERFIN, '@') + 1, LENGTH(sDESSCHEMASERFIN)); ELSE sNomeSchema := sDESSCHEMASERFIN; END IF; IF sDESSCHEMASERFIN IS NOT NULL THEN sQueryOut := 'SELECT IDCAPITOLO, IDACCIMP, IMPDISPONIBILITA FROM ( SELECT MANPAGHE.IDCAPITOLO, 0 IDACCIMP,A.DISPONIBILITA IMPDISPONIBILITA, IMPMANDATO FROM '||sNomeSchema||'.VWFRMDISPEXPERS'; IF sNomeDBLink IS NOT NULL THEN sQueryOut := sQueryOut || '@' || sNomeDBLink; END IF; sQueryOut := sQueryOut || ' A, ( SELECT IDCAPITOLO, SUM(IMPMANDATO) IMPMANDATO FROM GPTMPELERISCONT WHERE IDRELAB IN ( SELECT IDRELAB FROM GPTMPELABXREGCONTAB WHERE OWNER = '''|| lCODSESSIONE||''') AND -- LISTA ELABORAZIONI GPTMPELERISCONT.CODPARTE = ''S'' AND -- controllo solo la parte spesa GPTMPELERISCONT.IDACCIMP = ''0'' AND -- non ha impegni specificati CODANNOESERCIZIO = ''' || lCODANNOGRUPPOCONT ||''' GROUP BY IDCAPITOLO ) MANPAGHE WHERE A.CODTIPOELE = ''CAPITOLO'' AND MANPAGHE.IDCAPITOLO = A.IDCAPITOLO(+) GROUP BY MANPAGHE.IDCAPITOLO,DISPONIBILITA, IMPMANDATO UNION '|| --se non ha sforato un capitolo, magari è stato sforato l'impegno --> devo gestirne l'alternativo 'SELECT MANPAGHE.IDCAPITOLO, MANPAGHE.IDACCIMP IDACCIMP, NVL(A.DISPONIBILITA,0) IMPDISPONIBILITA, IMPMANDATO FROM '||sNomeSchema||'.VWFRMDISPEXPERS'; IF sNomeDBLink IS NOT NULL THEN sQueryOut := sQueryOut || '@' || sNomeDBLink; END IF; sQueryOut := sQueryOut || ' A, ( SELECT IDCAPITOLO, IDACCIMP, SUM(IMPMANDATO) IMPMANDATO FROM GPTMPELERISCONT WHERE IDRELAB IN ( SELECT IDRELAB FROM GPTMPELABXREGCONTAB WHERE OWNER ='''|| lCODSESSIONE||''') AND -- LISTA ELABORAZIONI GPTMPELERISCONT.CODPARTE = ''S'' AND -- controllo solo la parte spesa CODANNOESERCIZIO = ''' || lCODANNOGRUPPOCONT ||''' GROUP BY IDCAPITOLO,IDACCIMP ) MANPAGHE WHERE A.CODTIPOELE = ''IMPACC'' AND A.APP = ''S'' AND MANPAGHE.IDCAPITOLO = A.IDCAPITOLO(+) AND MANPAGHE.IDACCIMP = A.IDACCIMP(+) ) WHERE IMPDISPONIBILITA < IMPMANDATO GROUP BY IDCAPITOLO, IDACCIMP,IMPDISPONIBILITA'; END IF; ELSE --IF sTPCOLCONT = 2 THEN sQueryOut := 'SELECT IDCAPITOLO, IDACCIMP, IMPDISPONIBILITA FROM ( SELECT MANPAGHE.IDCAPITOLO IDCAPITOLO, 0 IDACCIMP, NVL(A.IMPSTANZATT-SUM(NVL(B.IMPSTANZATT,0)),0) IMPDISPONIBILITA, IMPMANDATO FROM GPCAPSISTEXT A, GPACCIMPSE B, ( SELECT IDCAPITOLO, SUM(IMPMANDATO) IMPMANDATO FROM GPTMPELERISCONT WHERE IDRELAB IN ( SELECT IDRELAB FROM GPTMPELABXREGCONTAB WHERE OWNER = '''|| lCODSESSIONE||''') AND -- LISTA ELABORAZIONI GPTMPELERISCONT.CODPARTE = ''S'' AND -- controllo solo la parte spesa GPTMPELERISCONT.IDACCIMP = 0 AND -- non ha impegni specificati CODANNOESERCIZIO = ''' || lCODANNOGRUPPOCONT ||''' GROUP BY IDCAPITOLO ) MANPAGHE WHERE A.IDRCAPSISTEXT = B.IDRCAPSISTEXT(+) AND MANPAGHE.IDCAPITOLO = A.IDRCAPSISTEXT(+) GROUP BY MANPAGHE.IDCAPITOLO, A.IMPSTANZATT, IMPMANDATO UNION SELECT MANPAGHE.IDCAPITOLO IDCAPITOLO, A.IDRACCIMPSE IDACCIMP, NVL(A.IMPSTANZATT,0) IMPDISPONIBILITA, IMPMANDATO FROM GPACCIMPSE A, GPCAPSISTEXT B, ( SELECT IDCAPITOLO, IDACCIMP, SUM(IMPMANDATO) IMPMANDATO FROM GPTMPELERISCONT WHERE IDRELAB IN ( SELECT IDRELAB FROM GPTMPELABXREGCONTAB WHERE OWNER ='''|| lCODSESSIONE||''') AND -- LISTA ELABORAZIONI GPTMPELERISCONT.CODPARTE = ''S'' AND -- controllo solo la parte spesa CODANNOESERCIZIO = ''' || lCODANNOGRUPPOCONT ||''' GROUP BY IDCAPITOLO,IDACCIMP ) MANPAGHE WHERE A.IDRCAPSISTEXT = B.IDRCAPSISTEXT AND MANPAGHE.IDCAPITOLO = A.IDRCAPSISTEXT(+) AND MANPAGHE.IDACCIMP = A.IDRACCIMPSE(+)) WHERE IMPDISPONIBILITA < IMPMANDATO GROUP BY IDCAPITOLO, IDACCIMP,IMPDISPONIBILITA'; END IF; IF sQueryOut IS NULL THEN sERRDIAG := 'Non è possibile gestire gli Alternativi: problemi nelle Impostazioni della Contabilizzazione'; RETURN pkUtility.fnError( 'fnDoContab', -499, sERRDIAG ); END IF; SOURCE_CURSOR := DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(SOURCE_CURSOR , sQueryOut ,dbms_sql.v7 ); -- definisco variabili in cui inserire i valori ottenuti dalla select DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR , 1, nIDCAPITOLOOut ); DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR , 2, nIDACCIMPOut ); DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR , 3, nIMPDISPONIBILITAOut ); IGNORE:=DBMS_SQL.EXECUTE(SOURCE_CURSOR); -- scorro cursore LOOP IF DBMS_SQL.FETCH_ROWS( SOURCE_CURSOR ) > 0 THEN -- Istanzio le variabili ai valori trovati con il cursore SOURCE_CURSOR DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR , 1, nIDCAPITOLOOut ); DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR , 2, nIDACCIMPOut ); DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR , 3, nIMPDISPONIBILITAOut ); bEsci := FALSE; FOR RECALT IN ( -- estraggo alternativo di Capitolo/Impegno SELECT IDCAPITOLO, CODANNOCONT, IDACCIMP FROM GPREGCONTAB WHERE ( CODENTEAZ, CODANNO, CODPARTE, CODSEGNOVOCE, CODTIPODIP, CODDIPENDENTE, CODTIPOELE, CODELEMENTO ) IN ( SELECT CODENTEAZ, CODANNO, CODPARTE, CODSEGNOVOCE, CODTIPODIP, CODDIPENDENTE, CODTIPOELE, CODELEMENTO FROM GPREGCONTAB WHERE CODENTEAZ = lCODENTEAZ AND CODANNO = lCODANNOGRUPPOCONT AND CODPARTE = 'S' AND IDCAPITOLO = nIDCAPITOLOOut AND ( ( CODANNOCONT = 0 AND sTPCOLCONT = 1 ) OR -- se c'è SERFIN presuppongo sia sempre 0 ( sTPCOLCONT >= 2 ) ) AND -- StudioK o altre IDACCIMP = nIDACCIMPOut ) AND -- 0 oppure IDACCIMPOUT CODTIPOLEGAME = 'A' GROUP BY IDCAPITOLO, CODANNOCONT, IDACCIMP -- Marco: inizio UNION SELECT IDCAPITOLORIPART, CODANNOCONTRIPART, IDACCIMPRIPART FROM GPREGCONTAB WHERE ( CODENTEAZ, CODANNO, CODPARTE, CODSEGNOVOCE, CODTIPODIP, CODDIPENDENTE, CODTIPOELE, CODELEMENTO ) IN ( SELECT CODENTEAZ, CODANNO, CODPARTE, CODSEGNOVOCE, CODTIPODIP, CODDIPENDENTE, CODTIPOELE, CODELEMENTO FROM GPREGCONTAB WHERE CODENTEAZ = lCODENTEAZ AND CODANNO = lCODANNOGRUPPOCONT AND CODPARTE = 'S' AND IDCAPITOLORIPART = nIDCAPITOLOOut AND ( ( CODANNOCONTRIPART = 0 AND sTPCOLCONT = 1 ) OR -- se c'è SERFIN presuppongo sia sempre 0 ( sTPCOLCONT >= 2 ) ) AND -- StudioK o altre IDACCIMPRIPART = nIDACCIMPOut ) AND -- 0 oppure IDACCIMPOUT CODTIPOLEGAME = 'A' GROUP BY IDCAPITOLORIPART, CODANNOCONTRIPART, IDACCIMPRIPART UNION SELECT IDCAPITOLORIPART, CODANNOCONTRIPART, IDACCIMPRIPART FROM GPREGCONTABONE WHERE (CODENTEAZ, CODANNO, CODPARTE, CODSEGNOVOCE, CODTIPODIP, CODDIPENDENTE, CODTIPOELE, CODELEMENTO) IN ( SELECT CODENTEAZ, CODANNO, CODPARTE, CODSEGNOVOCE, CODTIPODIP, CODDIPENDENTE, CODTIPOELE, CODELEMENTO FROM GPREGCONTABONE WHERE CODENTEAZ = lCODENTEAZ AND CODANNO = lCODANNOGRUPPOCONT AND CODPARTE = 'S' AND IDCAPITOLORIPART = nIDCAPITOLOOut AND ((CODANNOCONTRIPART = 0 AND sTPCOLCONT = 1) OR -- se c'è SERFIN presuppongo sia sempre 0 (sTPCOLCONT >= 2)) AND -- StudioK o altre IDACCIMPRIPART = nIDACCIMPOut) AND -- 0 oppure IDACCIMPOUT CODTIPOLEGAME = 'A' GROUP BY IDCAPITOLORIPART, CODANNOCONTRIPART, IDACCIMPRIPART -- Marco: fine ) LOOP IF bESCI THEN -- per prendere solo il primo alternativo EXIT; END IF; bESCI := NOT( bESCI ); nIDCAPITOLOAlt := RECALT.IDCAPITOLO; nCODANNOCONTAlt := RECALT.CODANNOCONT; nIDACCIMPAlt := RECALT.IDACCIMP; -- estraggo record da scorrere nella GPTMPELERISCONT FOR RECDET IN( SELECT IDRRLAV, IDRELAB, CODTIPOELE, CODELEMENTO, CODANNOESERCIZIO, CODANNOMAT, CODPARTE, IDCAPITOLO, IDCDC, CODANNOCONT, IDACCIMP, CODTIPOBEN, CODBENEFICIARIO, IMPMANDATO , IMPTRATTENUTE, IMPNETTO, INDALLEGATO, INDSOSPESO, INDPGIRO FROM GPTMPELERISCONT WHERE GPTMPELERISCONT.CODANNOESERCIZIO = lCODANNOGRUPPOCONT AND OWNER = lCODSESSIONE AND IDRELAB IN (SELECT IDRELAB FROM GPTMPELABXREGCONTAB WHERE OWNER = lCODSESSIONE ) AND CODPARTE = 'S' AND IDCAPITOLO = nIDCAPITOLOOut AND ( ( CODANNOCONT = 0 AND sTPCOLCONT = 1 ) OR -- se c'è SERFIN presuppongo sia sempre 0 ( ( sTPCOLCONT >= 2 ) ) ) AND -- StudioK o Altre IDACCIMP = nIDACCIMPOut ORDER BY IDCAPITOLO, CODANNOCONT, IDACCIMP, CODTIPOBEN, CODBENEFICIARIO, CODTIPOELE, IMPMANDATO DESC,IDRELAB,IDRRLAV, INDSOSPESO ) LOOP IF ( RECDET.IMPMANDATO < nIMPDISPONIBILITAOut AND RECDET.IMPMANDATO > 0 ) THEN nIMPDISPONIBILITAOut := nIMPDISPONIBILITAOut - RECDET.IMPMANDATO; -- non devo usare l'Alternativo ELSE -- per quello che basta uso il Capitolo, per il resto l'Alternativo UPDATE GPTMPELERISCONT SET IMPMANDATO = nIMPDISPONIBILITAOut, IMPNETTO = LEAST( IMPNETTO, nIMPDISPONIBILITAOut ) -- se IMPNETTO = 0 rimane 0, altrimenti metto nIMPDISPONIBILITAOut WHERE IDRRLAV = RECDET.IDRRLAV AND IDRELAB = RECDET.IDRELAB AND CODTIPOELE = RECDET.CODTIPOELE AND CODELEMENTO = RECDET.CODELEMENTO AND CODANNOESERCIZIO = RECDET.CODANNOESERCIZIO AND CODANNOMAT = RECDET.CODANNOMAT AND CODPARTE = RECDET.CODPARTE AND IDCAPITOLO = RECDET.IDCAPITOLO AND CODANNOCONT = RECDET.CODANNOCONT AND IDACCIMP = RECDET.IDACCIMP AND CODTIPOBEN = RECDET.CODTIPOBEN AND CODBENEFICIARIO = RECDET.CODBENEFICIARIO AND IDCDC = RECDET.IDCDC AND INDSOSPESO = RECDET.INDSOSPESO AND OWNER = lCODSESSIONE; -- Devo Aggiornare/Inserire il resto sull'Alternativo IF RECDET.IMPNETTO > 0 THEN -- se IMPNETTO = 0 rimane 0 RECDET.IMPNETTO := RECDET.IMPNETTO - nIMPDISPONIBILITAOut; END IF; UPDATE GPTMPELERISCONT SET IMPMANDATO = IMPMANDATO + RECDET.IMPMANDATO - nIMPDISPONIBILITAOut, IMPNETTO = RECDET.IMPNETTO WHERE IDRRLAV = RECDET.IDRRLAV AND IDRELAB = RECDET.IDRELAB AND CODTIPOELE = RECDET.CODTIPOELE AND CODELEMENTO = RECDET.CODELEMENTO AND CODANNOESERCIZIO = RECDET.CODANNOESERCIZIO AND CODANNOMAT = RECDET.CODANNOMAT AND CODPARTE = RECDET.CODPARTE AND IDCAPITOLO = nIDCAPITOLOAlt AND CODANNOCONT = nCODANNOCONTAlt AND IDACCIMP = nIDACCIMPAlt AND IDCDC = RECDET.IDCDC AND CODTIPOBEN = RECDET.CODTIPOBEN AND CODBENEFICIARIO = RECDET.CODBENEFICIARIO AND INDSOSPESO = RECDET.INDSOSPESO AND -- OCCORRE OWNER = lCODSESSIONE; IF SQL%ROWCOUNT = 0 THEN INSERT INTO GPTMPELERISCONT( OWNER, IDRRLAV , IDRELAB , CODTIPOELE ,CODELEMENTO, CODANNOESERCIZIO , CODANNOMAT, CODPARTE , IDCAPITOLO , CODANNOCONT, IDACCIMP , IDCDC, CODTIPOBEN, CODBENEFICIARIO, IMPMANDATO, IMPTRATTENUTE , IMPNETTO, INDALLEGATO, INDSOSPESO, INDPGIRO, codmesedet ) VALUES (lCODSESSIONE, RECDET.IDRRLAV, RECDET.IDRELAB, RECDET.CODTIPOELE, RECDET.CODELEMENTO, RECDET.CODANNOESERCIZIO, RECDET.CODANNOMAT, RECDET.CODPARTE, nIDCAPITOLOAlt, nCODANNOCONTAlt, nIDACCIMPAlt, NVL(RECDET.IDCDC,0), RECDET.CODTIPOBEN, RECDET.CODBENEFICIARIO, RECDET.IMPMANDATO - nIMPDISPONIBILITAOut, RECDET.IMPTRATTENUTE, RECDET.IMPNETTO, 'S', RECDET.INDSOSPESO, RECDET.INDPGIRO, 0 ); END IF; nIMPDISPONIBILITAOut := 0; END IF; END LOOP; END LOOP; ELSE EXIT; END IF; END LOOP; DBMS_SQL.close_CURSOR(SOURCE_CURSOR); END IF; -- SOLO NEL CASO DI CONTABILIZZAZIONE CON @-Serfin/StudioK --- Aggiornamento Codice siope IF lINDSIOPE ='S' THEN -- TEMPO DETERMINATO, LSU, COCOCO UPDATE GPTMPELERISCONT SET CODSIOPE = (SELECT DECODE(codtipoinps, 'S', '1104','D', '1104', '1105' ) from gpltprlav, gpraplav where GPTMPELERISCONT.OWNER = lCODSESSIONE and GPLTPRLAV.codtipoinps IN ('S', 'D','C') AND gpraplav.codtiporl = gpltprlav.codtiporl and gpraplav.idrrlav = gptmpeleriscont.idrrlav and GPTMPELERISCONT.codtipoele = 'VOX' and gptmpeleriscont.indpgiro = 'N') WHERE EXISTS (SELECT DECODE(codtipoinps, 'S', '1104','D', '1104', '1105' ) from gpltprlav, gpraplav where GPTMPELERISCONT.OWNER = lCODSESSIONE and GPLTPRLAV.codtipoinps IN ('S', 'D','C') AND gpraplav.codtiporl = gpltprlav.codtiporl and gpraplav.idrrlav = gptmpeleriscont.idrrlav and GPTMPELERISCONT.codtipoele = 'VOX' and gptmpeleriscont.indpgiro = 'N'); END IF; ----+++ VA AGGIUNTA LA CODIFICA DEGLI ALTRI CODICI SIOPE -- ORA , A PARTIRE DA GPTMPELERISCONT, POPOLIAMO SIA GPDETRISCONT CHE GPELERISCONT INSERT INTO GPDETRISCONT( IDRRLAV , IDRELAB , CODTIPOELE , CODANNOESERCIZIO , CODANNOMAT, CODPARTE , IDCAPITOLO , CODANNOCONT, IDACCIMP , IDCDC, CODTIPOBEN, CODBENEFICIARIO, IDRRISCONT , IMPMANDATO, IMPTRATTENUTE, IMPNETTO, INDALLEGATO, INDSOSPESO, CODSIOPE ) SELECT IDRRLAV , IDRELAB , CODTIPOELE, CODANNOESERCIZIO , CODANNOMAT, CODPARTE , IDCAPITOLO , CODANNOCONT, IDACCIMP , IDCDC, CODTIPOBEN, CODBENEFICIARIO, NULL , SUM(IMPMANDATO), SUM(IMPTRATTENUTE), SUM(IMPNETTO), INDALLEGATO, INDSOSPESO, CODSIOPE FROM GPTMPELERISCONT WHERE OWNER = lCODSESSIONE GROUP BY IDRRLAV , IDRELAB , CODTIPOELE, CODANNOESERCIZIO , CODANNOMAT, CODPARTE , IDCAPITOLO , CODANNOCONT, IDACCIMP , IDCDC, CODTIPOBEN, CODBENEFICIARIO, INDALLEGATO, INDSOSPESO, CODSIOPE; COMMIT; INSERT INTO GPELERISCONT( IDRELAB , CODTIPOELE ,CODELEMENTO, CODANNOESERCIZIO , CODANNOMAT, CODPARTE , IDCAPITOLO , CODANNOCONT, IDACCIMP , IDCDC, CODTIPOBEN, CODBENEFICIARIO, IDRRISCONT , IMPMANDATO, INDALLEGATO, INDSOSPESO, CODSIOPE ) SELECT IDRELAB , CODTIPOELE, CODELEMENTO, CODANNOESERCIZIO , CODANNOMAT, CODPARTE , IDCAPITOLO , CODANNOCONT, IDACCIMP , IDCDC, CODTIPOBEN, CODBENEFICIARIO, NULL , SUM(IMPMANDATO), INDALLEGATO, INDSOSPESO, CODSIOPE FROM GPTMPELERISCONT WHERE OWNER = lCODSESSIONE GROUP BY IDRELAB , CODTIPOELE, CODELEMENTO, CODANNOESERCIZIO , CODANNOMAT, CODPARTE , IDCAPITOLO , CODANNOCONT, IDACCIMP , IDCDC, CODTIPOBEN, CODBENEFICIARIO, INDALLEGATO, INDSOSPESO,CODSIOPE; --------------------------------------------------- nRet := pkGPCONTAB.fnGPRISCONTFill ( lCODENTEAZ, lCODANNOGRUPPOCONT, lQTAGRUPPOCONT, lDTASCADENZA, lCODSESSIONE, 'N', ERRDIAG ); IF nRet < 0 THEN sERRDIAG := ' E'' stata riempita soltanto la tabella dei Dettagli '; RETURN pkUtility.fnError( 'fnDoContab', -499, sERRDIAG ); END IF; COMMIT; -- Ripartizione Netto sui Mandati -- SOLO SU GPDETRISCONT -- Il Netto del Cedolino va ripartito sul Mandato in base al totale Competenze ( per ogni rapporto di lavoro), -- IMPNETTOCEDOLINO :IMPCOMPETENZECEDOLINO=x1:IMPMANDATO, -- x1= ( IMPNETTOCEDOLINO * IMPMANDATO ) / IMPCOMPETENZECEDOLINO -- .................... recGPDETRISCONTPREC.rIDRRLAV :=0; recGPDETRISCONTPREC.rIDRELAB :=0; recGPDETRISCONTPREC.rCODPARTE :='Z'; recGPDETRISCONTPREC.rIDCAPITOLO :=0; recGPDETRISCONTPREC.rCODANNOCONT :=0; recGPDETRISCONTPREC.rIDACCIMP :=0; -- Per ogni record che scorro, dato l'ordine che ho scelto nel cursore, posso avere la -- seguente situazione: -- RLAV, ELAB, CODPARTE, MANDATO -- 29 15 E M1 -- 29 15 S M1 -- 29 15 E M2 -- 29 16 S M1 -- 29 16 S M1 -- 30 15 S M1 --............................ --- OPEN curGPDETRISCONT; -- FETCH curGPDETRISCONT INTO recGPDETRISCONT; nNettoRipart :=0; nNettoTot := recGPDETRISCONT.rIMPNETTO; --Totale netto del cedolino LOOP EXIT WHEN curGPDETRISCONT%NOTFOUND; ---- Inizializzo variabili recGPDETRISCONTPREC.rIDRRLAV := recGPDETRISCONT.rIDRRLAV; recGPDETRISCONTPREC.rIDRELAB := recGPDETRISCONT.rIDRELAB; recGPDETRISCONTPREC.rCODANNOESERCIZIO:= recGPDETRISCONT.rCODANNOESERCIZIO; recGPDETRISCONTPREC.rCODANNOMAT := recGPDETRISCONT.rCODANNOMAT; recGPDETRISCONTPREC.rCODPARTE := recGPDETRISCONT.rCODPARTE; recGPDETRISCONTPREC.rIDCAPITOLO := recGPDETRISCONT.rIDCAPITOLO; recGPDETRISCONTPREC.rCODANNOCONT := recGPDETRISCONT.rCODANNOCONT; recGPDETRISCONTPREC.rIDACCIMP := recGPDETRISCONT.rIDACCIMP; recGPDETRISCONTPREC.rCODSIOPE := recGPDETRISCONT.rCODSIOPE; -- Elaborazione IF recGPDETRISCONT.rIMPCOMPETENZE = 0 THEN nIMPNETTORIPART := 0; ELSE nIMPNETTORIPART := ROUND( ( recGPDETRISCONT.rIMPNETTO * recGPDETRISCONT.rIMPMANDATO ) / recGPDETRISCONT.rIMPCOMPETENZE, 2 ); END IF; nNettoRipart := nNettoRipart + nIMPNETTORIPART; UPDATE GPDETRISCONT SET IMPNETTO = nIMPNETTORIPART, IMPTRATTENUTE = (IMPMANDATO - nIMPNETTORIPART) WHERE IDRRLAV = recGPDETRISCONTPREC.rIDRRLAV AND IDRELAB = recGPDETRISCONTPREC.rIDRELAB AND CODTIPOELE = 'VOX' AND CODANNOESERCIZIO = recGPDETRISCONTPREC.rCODANNOESERCIZIO AND CODANNOMAT = recGPDETRISCONTPREC.rCODANNOMAT AND CODPARTE = recGPDETRISCONTPREC.rCODPARTE AND IDCAPITOLO = recGPDETRISCONTPREC.rIDCAPITOLO AND CODANNOCONT = recGPDETRISCONTPREC.rCODANNOCONT AND IDACCIMP = recGPDETRISCONTPREC.rIDACCIMP AND CODSIOPE = recGPDETRISCONTPREC.rCODSIOPE; FETCH curGPDETRISCONT INTO recGPDETRISCONT; IF ((recGPDETRISCONTPREC.rIDRRLAV <> recGPDETRISCONT.rIDRRLAV) or (recGPDETRISCONTPREC.rIDRELAB <> recGPDETRISCONT.rIDRELAB) or curGPDETRISCONT%NOTFOUND) THEN nResto := nNettoTot - nNettoRipart; UPDATE GPDETRISCONT SET IMPNETTO = IMPNETTO + nResto, IMPTRATTENUTE = IMPTRATTENUTE - nResto WHERE IDRRLAV = recGPDETRISCONTPREC.rIDRRLAV AND IDRELAB = recGPDETRISCONTPREC.rIDRELAB AND CODTIPOELE = 'VOX' AND CODANNOESERCIZIO = recGPDETRISCONTPREC.rCODANNOESERCIZIO AND CODANNOMAT = recGPDETRISCONTPREC.rCODANNOMAT AND CODPARTE = recGPDETRISCONTPREC.rCODPARTE AND IDCAPITOLO = recGPDETRISCONTPREC.rIDCAPITOLO AND CODANNOCONT = recGPDETRISCONTPREC.rCODANNOCONT AND IDACCIMP = recGPDETRISCONTPREC.rIDACCIMP AND CODSIOPE = recGPDETRISCONTPREC.rCODSIOPE; -- Aggiorno variabili nNettoTot := recGPDETRISCONT.rIMPNETTO; nNettoRipart:=0; END IF; END LOOP; CLOSE curGPDETRISCONT; COMMIT; -- CANCELLO LE TEMPORANEE ... SELECT COUNT(*) INTO nCount FROM GPTMPELERISCONT WHERE OWNER <> lCODSESSIONE; IF nCount > 0 THEN DELETE FROM GPTMPELERISCONT WHERE OWNER = lCODSESSIONE OR TO_CHAR ( sysdate, 'YYYYMMDDHH24MI' ) - SUBSTR ( TMSLOCK, 1, 12 ) > 2400; COMMIT; ELSE SYS.DBMS_UTILITY.exec_ddl_statement( 'TRUNCATE TABLE GPTMPELERISCONT'); END IF; SELECT COUNT(*) INTO nCount FROM GPTMPREGCONTCED WHERE OWNER <> lCODSESSIONE; IF nCount > 0 THEN DELETE FROM GPTMPREGCONTCED WHERE OWNER = lCODSESSIONE OR TO_CHAR ( sysdate, 'YYYYMMDDHH24MI' ) - SUBSTR ( TMSLOCK, 1, 12 ) > 2400; COMMIT; ELSE SYS.DBMS_UTILITY.exec_ddl_statement( 'TRUNCATE TABLE GPTMPREGCONTCED'); END IF; RETURN 1; EXCEPTION WHEN OTHERS THEN IF curONERI%ISOPEN THEN CLOSE curONERI; END IF; IF curGPDETRISCONT%ISOPEN THEN CLOSE curGPDETRISCONT; END IF; IF DBMS_SQL.IS_OPEN(SOURCE_CURSOR) THEN DBMS_SQL.CLOSE_CURSOR(SOURCE_CURSOR); END IF; ROLLBACK; RETURN pkUtility.fnError( 'fnDoContab', SQLCODE, ERRDIAG ); END fnDoContab; -- la funzione seguente restituisce una vista con l'elenco delle persone e le voci del loro cedolino che non hanno delle Regole di -- Contabilizzazione specificate. -- Può essere eseguita sia prima del calcolo della Contabilizzazione che dopo, dato che come input prende l'elenco delle eventuali -- elaborazioni da controllare. -- E' possibile inoltre scegliere se controllare una voce specificata tramite il Codice, oppure tutte, oppure quelle di competenza -- e/o di trattenuta e/o Figurative. FUNCTION fnRegoleVociChk ( lCODENTEAZ IN pkType.tyStringa%type, lCODANNOGRUPPOCONT IN pkType.tyStringa%type, lDTARIFCONTAB IN pkType.tyStringa%type, lIDRELABLst IN pkType.tyStringa%type, -- lista delle elaborazioni lCODSELVOCE IN pkType.tyStringa%type, -- 'S':Singola Voce, 'A':( All ) Tutte le voci, 'C': per CODCOLONNA lCODVOCE IN pkType.tyStringa%type, -- Singola Voce lCODCOLONNALst IN pkType.tyStringa%type, --'C': Competenza, 'T':Trattenuta,'F': Figurativa, concatenate da '§' lCODSESSIONE IN pkType.tyStringa%type, lVIEWVOXNOCONTAB OUT pkType.tyStringa%type, ERRDIAG OUT pkType.tyStringa%type ) RETURN NUMERIC IS nRet NUMBER(9); nRec NUMBER(9); lTimeStamp GPTMPREGCONTCED.TMSLOCK%type := TO_CHAR( SYSDATE, 'YYYYMMDDHH24MISS' ); -- PER LO SPLIT nLastIDRELAB NUMBER(9); lTIDRELAB pktype.TyTStringa; ---- nLast NUMBER(9); lTCODCOLONNA pktype.TyTStringa; sCODCOLONNA pktype.TyStringa%Type := NULL; -- stringa da comporre in base agli elementi nella Lista ------------- sDTAMIN VARCHAR2(10):= TO_CHAR( PKTYPE.DTAMIN, 'DD/MM/YYYY'); sDTAMAX VARCHAR2(10):= TO_CHAR( PKTYPE.DTAMAX, 'DD/MM/YYYY'); nIDR NUMBER(9) := 1; nGiro NUMBER(9); nIDRELABPrec GPCEDOLINO.IDRELAB%type :=0; -- per riempimento della GPTMPRIFXCONT nIDRRLAVPrec GPCEDOLINO.IDRRLAV%type := 0;-- per riempimento della GPTMPRIFXCONT NumMax NUMBER(9); sVIEWVOXNOCONTAB pktype.TyStringa%Type:= 'GPVOXNOCONTAB'; sQUERYVOXNOCONTAB VARCHAR2(30000); sSELVOCI VARCHAR2(500); sQUERYGPREGCONTXVOX VARCHAR2(30000); sVIEWGPREGCONTXVOX VARCHAR2(500):='GPREGCONTXVOX'; BEGIN -- Ripulisco le tabelle temporanee DELETE FROM GPTMPELABXREGCONTAB WHERE OWNER = lCODSESSIONE OR TO_CHAR ( sysdate, 'YYYYMMDDHH24MI' ) - SUBSTR ( TMSLOCK, 1, 12 ) > 2400; DELETE FROM GPTMPRIFXCONT WHERE OWNER = lCODSESSIONE OR TO_CHAR ( sysdate, 'YYYYMMDDHH24MI' ) - SUBSTR ( TMSLOCK, 1, 12 ) > 2400; COMMIT; IF lCODSELVOCE = 'S' THEN IF lCODVOCE IS NULL THEN ERRDIAG := 'Occorre specificare su quale voce effettuare il controllo'; RETURN pkUtility.fnError( 'fnRegoleVociChk', -499, ERRDIAG ); END IF; ELSIF lCODSELVOCE = 'C' THEN -- Composizione lista delle eventuali colonne da usare nelle Select IF lCODCOLONNALst IS NOT NULL THEN -- splitto la stringa nRet := PKUTILITY.fnRealSplit( lCODCOLONNALst,'§','', nLast, ERRDIAG, lTCODCOLONNA); IF nRet < 0 THEN ROLLBACK; RETURN nRet; END IF; ELSE ERRDIAG := 'Occorre specificare la tipologia delle voci sulle quali effettuare il controllo'; RETURN pkUtility.fnError( 'fnRegoleVociChk', -499, ERRDIAG ); END IF; FOR i IN 1..nLast LOOP IF lTCODCOLONNA(i) IS NOT NULL THEN sCODCOLONNA := sCODCOLONNA ||','''||lTCODCOLONNA(i)||''''; END IF; END LOOP; sCODCOLONNA := LTRIM(sCODCOLONNA,','); END IF; -- Composizione lista delle elaborazioni da usare nelle Select IF lIDRELABLst IS NOT NULL THEN -- splitto la stringa nRet := PKUTILITY.fnRealSplit( lIDRELABLst,'§','', nLastIDRELAB, ERRDIAG, lTIDRELAB); IF nRet < 0 THEN ROLLBACK; RETURN nRet; END IF; ELSE ERRDIAG := 'Prevista Lista Elaborazioni'; RETURN pkUtility.fnError( 'fnRegoleVociChk', -499, ERRDIAG ); END IF; FOR i IN 1..nLastIDRELAB LOOP IF lTIDRELAB(i) IS NOT NULL THEN INSERT INTO GPTMPELABXREGCONTAB( OWNER, IDRELAB, TMSLOCK ) VALUES ( lCODSESSIONE, lTIDRELAB(i), lTIMESTAMP ); END IF; END LOOP; COMMIT; -- inserimento nella Temporanea dei Riferimenti Contabili nGiro := 1; FOR recGPDETCONPERS IN -- ( Costo = 18 ) ( SELECT GPCEDOLINO.IDRRLAV, GPCEDOLINO.IDRELAB, GPDETCONPERS.QTAPROGCONTAB , GPDETCONPERS.CODENTEAZ , GPDETCONPERS.CODFUNZIONE, GPDETCONPERS.CODSERVIZIO, GPDETCONPERS.IDRCDC,PRCAPPARTENENZA FROM GPCONTABPERS, GPDETCONPERS, GPELAB, GPRAPLAV, GPCEDOLINO,GPTMPELABXREGCONTAB -- ( Mettendo in Join la tmp, la Query ha costo minore ) WHERE GPTMPELABXREGCONTAB.OWNER = lCODSESSIONE AND GPTMPELABXREGCONTAB.IDRELAB=GPCEDOLINO.IDRELAB AND GPCEDOLINO.CODSTATO = 2 AND GPCEDOLINO.IDRRLAV = GPCONTABPERS.IDRRLAV AND GPCEDOLINO.IDRRLAV = GPRAPLAV.IDRRLAV AND GPCEDOLINO.IDRELAB = GPELAB.IDRELAB AND GPCONTABPERS.DTAINIZIO <= NVL( TO_DATE( lDTARIFCONTAB, 'DD/MM/YYYY'), LEAST( GPELAB.DTAVALUTA, GPRAPLAV.DTAFINE) ) AND NVL( TO_DATE( lDTARIFCONTAB, 'DD/MM/YYYY'), LEAST( GPELAB.DTAVALUTA, GPRAPLAV.DTAFINE) ) <= GPCONTABPERS.DTAFINE AND GPDETCONPERS.IDRRLAV = GPCONTABPERS.IDRRLAV AND GPDETCONPERS.QTAPROGCONTAB = GPCONTABPERS.QTAPROGCONTAB ORDER BY GPCEDOLINO.IDRELAB,GPCEDOLINO.IDRRLAV, GPDETCONPERS.CODFUNZIONE, GPDETCONPERS.CODSERVIZIO, GPDETCONPERS.IDRCDC ) LOOP IF ( recGPDETCONPERS.IDRELAB <> nIDRELABPrec OR recGPDETCONPERS.IDRRLAV <> nIDRRLAVPrec ) THEN nGiro := 1; nIDRELABPrec := recGPDETCONPERS.IDRELAB; nIDRRLAVPrec := recGPDETCONPERS.IDRRLAV; ELSE nGiro := nGiro + 1; END IF; recGPDETCONPERS.IDRCDC := 0; IF nGiro = 1 THEN -- metto solo quelli del Giro 1 INSERT INTO GPTMPRIFXCONT ( OWNER , IDRELAB, IDRRLAV , GIRO, QTAPROGCONTAB , CODENTEAZ , CODFUNZIONE , CODSERVIZIO , IDRCDC , PRCAPPARTENENZA, TMSLOCK ) VALUES ( lCODSESSIONE , recGPDETCONPERS.IDRELAB, recGPDETCONPERS.IDRRLAV , nGiro, recGPDETCONPERS.QTAPROGCONTAB , recGPDETCONPERS.CODENTEAZ , recGPDETCONPERS.CODFUNZIONE , recGPDETCONPERS.CODSERVIZIO, recGPDETCONPERS.IDRCDC , recGPDETCONPERS.PRCAPPARTENENZA, lTIMESTAMP ); END IF; END LOOP; --- nel Cursore precedente mi perdo le persone che non hanno Riferimenti Contabili --> -- le Inserisco ora e le metto al primo giro ( Costo = 5 ) INSERT INTO GPTMPRIFXCONT ( OWNER , IDRELAB, IDRRLAV , GIRO, QTAPROGCONTAB , CODENTEAZ , CODFUNZIONE , CODSERVIZIO , IDRCDC , PRCAPPARTENENZA, TMSLOCK ) ( SELECT lCODSESSIONE, GPCEDOLINO.IDRELAB, GPCEDOLINO.IDRRLAV, 1, NULL, NULL , NULL, NULL, 0, 100, lTimeStamp FROM GPCEDOLINO,GPTMPELABXREGCONTAB WHERE GPTMPELABXREGCONTAB.OWNER = lCODSESSIONE AND GPTMPELABXREGCONTAB.IDRELAB=GPCEDOLINO.IDRELAB AND GPCEDOLINO.CODSTATO = 2 AND GPCEDOLINO.IDRRLAV NOT IN ( SELECT IDRRLAV FROM GPTMPRIFXCONT WHERE OWNER = lCODSESSIONE AND GIRO = 1 ) ); -- Creo vista dinamica con tutti i cedolini e le regole delle voci da applicare -- struttura query: -- REGOLE 'ALL' MENO ( REGOLE PER I 'GRP' E I 'DIP' ) -- UNION -- REGOLE 'GRP' MENO ( REGOLE PER I 'DIP' ) -- UNION -- REGOLE 'DIP' sQueryGPREGCONTXVOX:=' ( SELECT GPCEDOLINO.IDRRLAV, GPCEDOLINO.IDRELAB, GPREGCONTAB.CODENTEAZ, GPREGCONTAB.CODANNO, GPREGCONTAB.CODPARTE, GPREGCONTAB.CODTIPOLEGAME, GPREGCONTAB.CODSEGNOVOCE, GPREGCONTAB.CODTIPOELE, GPREGCONTAB.CODELEMENTO, GPREGCONTAB.IDRCONTRIB, GPREGCONTAB.CODTIPOTASS, GPREGCONTAB.CODTPGRVOX, GPREGCONTAB.CODVALGRVOX, GPREGCONTAB.CODFUNZIONE, GPREGCONTAB.CODSERVIZIO FROM GPTMPRIFXCONT,GPREGCONTAB,GPTMPELABXREGCONTAB, GPCEDOLINO WHERE GPREGCONTAB.CODENTEAZ = '''||lCODENTEAZ||''' AND GPREGCONTAB.CODANNO = '''||lCODANNOGRUPPOCONT||''' AND GPREGCONTAB.CODTIPODIP = ''ALL'' AND GPREGCONTAB.CODTIPOELE = ''VOX'' AND GPTMPELABXREGCONTAB.OWNER ='|| lCODSESSIONE||' AND GPCEDOLINO.IDRELAB = GPTMPELABXREGCONTAB.IDRELAB AND GPCEDOLINO.CODSTATO = ''2'' AND GPTMPRIFXCONT.OWNER ='|| lCODSESSIONE||' AND GPTMPRIFXCONT.GIRO = ''1'' AND GPTMPRIFXCONT.IDRELAB = GPCEDOLINO.IDRELAB AND GPTMPRIFXCONT.IDRRLAV = GPCEDOLINO.IDRRLAV and gpregcontab.codvalgrvox in (select gpvervoce.codvalgrvox from gpvervoce, gpvoxced where gpvoxced.idrrlav = gpcedolino.idrrlav and gpvoxced.idrelab = gpcedolino.idrelab and gpvoxced.codvoce = gpvervoce.codvoce and gpvervoce.codvalgrvox = gpregcontab.codvalgrvox and gpvervoce.codtpgrvox = gpregcontab.codtpgrvox) MINUS ( SELECT GPCEDOLINO.IDRRLAV, GPCEDOLINO.IDRELAB, GPREGCONTAB.CODENTEAZ, GPREGCONTAB.CODANNO, GPREGCONTAB.CODPARTE, GPREGCONTAB.CODTIPOLEGAME, GPREGCONTAB.CODSEGNOVOCE, GPREGCONTAB.CODTIPOELE, GPREGCONTAB.CODELEMENTO, GPREGCONTAB.IDRCONTRIB, GPREGCONTAB.CODTIPOTASS, GPREGCONTAB.CODTPGRVOX, GPREGCONTAB.CODVALGRVOX, GPREGCONTAB.CODFUNZIONE, GPREGCONTAB.CODSERVIZIO FROM GPTMPRIFXCONT, GPREGCONTAB, GPTMPELABXREGCONTAB, GPELAB, GPRAPLAV, GPCEDOLINO WHERE GPREGCONTAB.CODENTEAZ ='''|| lCODENTEAZ||''' AND GPREGCONTAB.CODANNO ='''|| lCODANNOGRUPPOCONT||''' AND GPREGCONTAB.CODTIPODIP = ''GRP'' AND GPREGCONTAB.CODTIPOELE = ''VOX'' AND GPTMPELABXREGCONTAB.OWNER ='|| lCODSESSIONE||' AND GPCEDOLINO.IDRELAB = GPTMPELABXREGCONTAB.IDRELAB AND GPCEDOLINO.CODSTATO = ''2'' AND GPTMPRIFXCONT.OWNER ='|| lCODSESSIONE||' AND GPTMPRIFXCONT.GIRO = ''1'' AND GPTMPRIFXCONT.IDRELAB = GPCEDOLINO.IDRELAB AND GPTMPRIFXCONT.IDRRLAV = GPCEDOLINO.IDRRLAV AND GPREGCONTAB.CODSERVIZIO = GPTMPRIFXCONT.CODSERVIZIO AND GPREGCONTAB.CODFUNZIONE = GPTMPRIFXCONT.CODFUNZIONE AND GPCEDOLINO.IDRRLAV = GPRAPLAV.IDRRLAV AND GPCEDOLINO.IDRELAB = GPELAB.IDRELAB and gpregcontab.codvalgrvox in (select gpvervoce.codvalgrvox from gpvervoce, gpvoxced where gpvoxced.idrrlav = gpcedolino.idrrlav and gpvoxced.idrelab = gpcedolino.idrelab and gpvoxced.codvoce = gpvervoce.codvoce and gpvervoce.codvalgrvox = gpregcontab.codvalgrvox and gpvervoce.codtpgrvox = gpregcontab.codtpgrvox) UNION SELECT GPCEDOLINO.IDRRLAV, GPCEDOLINO.IDRELAB, GPREGCONTAB.CODENTEAZ, GPREGCONTAB.CODANNO, GPREGCONTAB.CODPARTE, GPREGCONTAB.CODTIPOLEGAME, GPREGCONTAB.CODSEGNOVOCE, GPREGCONTAB.CODTIPOELE, GPREGCONTAB.CODELEMENTO, GPREGCONTAB.IDRCONTRIB, GPREGCONTAB.CODTIPOTASS, GPREGCONTAB.CODTPGRVOX, GPREGCONTAB.CODVALGRVOX, GPREGCONTAB.CODFUNZIONE, GPREGCONTAB.CODSERVIZIO FROM GPTMPRIFXCONT,GPREGCONTAB, GPTMPELABXREGCONTAB,GPCEDOLINO WHERE GPREGCONTAB.CODENTEAZ ='''|| lCODENTEAZ||''' AND GPREGCONTAB.CODANNO ='''|| lCODANNOGRUPPOCONT||''' AND GPREGCONTAB.CODTIPODIP = ''DIP'' AND GPREGCONTAB.CODTIPOELE = ''VOX'' AND GPREGCONTAB.IDRRLAV = GPCEDOLINO.IDRRLAV AND GPTMPELABXREGCONTAB.OWNER ='|| lCODSESSIONE||' AND GPCEDOLINO.IDRELAB = GPTMPELABXREGCONTAB.IDRELAB AND GPCEDOLINO.CODSTATO = ''2'' AND GPTMPRIFXCONT.OWNER ='|| lCODSESSIONE||' AND GPTMPRIFXCONT.GIRO = ''1'' AND GPTMPRIFXCONT.IDRELAB = GPCEDOLINO.IDRELAB AND GPTMPRIFXCONT.IDRRLAV = GPCEDOLINO.IDRRLAV and gpregcontab.codvalgrvox in (select gpvervoce.codvalgrvox from gpvervoce, gpvoxced where gpvoxced.idrrlav = gpcedolino.idrrlav and gpvoxced.idrelab = gpcedolino.idrelab and gpvoxced.codvoce = gpvervoce.codvoce and gpvervoce.codvalgrvox = gpregcontab.codvalgrvox and gpvervoce.codtpgrvox = gpregcontab.codtpgrvox) ) ) UNION ( SELECT GPCEDOLINO.IDRRLAV, GPCEDOLINO.IDRELAB, GPREGCONTAB.CODENTEAZ, GPREGCONTAB.CODANNO, GPREGCONTAB.CODPARTE, GPREGCONTAB.CODTIPOLEGAME, GPREGCONTAB.CODSEGNOVOCE, GPREGCONTAB.CODTIPOELE, GPREGCONTAB.CODELEMENTO, GPREGCONTAB.IDRCONTRIB, GPREGCONTAB.CODTIPOTASS, GPREGCONTAB.CODTPGRVOX, GPREGCONTAB.CODVALGRVOX, GPREGCONTAB.CODFUNZIONE, GPREGCONTAB.CODSERVIZIO FROM GPTMPRIFXCONT, GPREGCONTAB, GPTMPELABXREGCONTAB, GPELAB, GPRAPLAV, GPCEDOLINO WHERE GPREGCONTAB.CODENTEAZ ='''|| lCODENTEAZ||''' AND GPREGCONTAB.CODANNO ='''|| lCODANNOGRUPPOCONT||''' AND GPREGCONTAB.CODTIPODIP = ''GRP'' AND GPREGCONTAB.CODTIPOELE = ''VOX'' AND GPTMPELABXREGCONTAB.OWNER ='|| lCODSESSIONE||' AND GPCEDOLINO.IDRELAB = GPTMPELABXREGCONTAB.IDRELAB AND GPCEDOLINO.CODSTATO = ''2'' AND GPTMPRIFXCONT.OWNER ='|| lCODSESSIONE||' AND GPTMPRIFXCONT.GIRO = ''1'' AND GPTMPRIFXCONT.IDRELAB = GPCEDOLINO.IDRELAB AND GPTMPRIFXCONT.IDRRLAV = GPCEDOLINO.IDRRLAV AND GPREGCONTAB.CODSERVIZIO = GPTMPRIFXCONT.CODSERVIZIO AND GPREGCONTAB.CODFUNZIONE = GPTMPRIFXCONT.CODFUNZIONE AND GPCEDOLINO.IDRRLAV = GPRAPLAV.IDRRLAV AND GPCEDOLINO.IDRELAB = GPELAB.IDRELAB and gpregcontab.codvalgrvox in (select gpvervoce.codvalgrvox from gpvervoce, gpvoxced where gpvoxced.idrrlav = gpcedolino.idrrlav and gpvoxced.idrelab = gpcedolino.idrelab and gpvoxced.codvoce = gpvervoce.codvoce and gpvervoce.codvalgrvox = gpregcontab.codvalgrvox and gpvervoce.codtpgrvox = gpregcontab.codtpgrvox) MINUS SELECT GPCEDOLINO.IDRRLAV, GPCEDOLINO.IDRELAB, GPREGCONTAB.CODENTEAZ, GPREGCONTAB.CODANNO, GPREGCONTAB.CODPARTE, GPREGCONTAB.CODTIPOLEGAME, GPREGCONTAB.CODSEGNOVOCE, GPREGCONTAB.CODTIPOELE, GPREGCONTAB.CODELEMENTO, GPREGCONTAB.IDRCONTRIB, GPREGCONTAB.CODTIPOTASS, GPREGCONTAB.CODTPGRVOX, GPREGCONTAB.CODVALGRVOX, GPREGCONTAB.CODFUNZIONE, GPREGCONTAB.CODSERVIZIO FROM GPTMPRIFXCONT,GPREGCONTAB, GPTMPELABXREGCONTAB,GPCEDOLINO WHERE GPREGCONTAB.CODENTEAZ ='''|| lCODENTEAZ||''' AND GPREGCONTAB.CODANNO ='''|| lCODANNOGRUPPOCONT||''' AND GPREGCONTAB.CODTIPODIP = ''DIP'' AND GPREGCONTAB.CODTIPOELE = ''VOX'' AND GPREGCONTAB.IDRRLAV = GPCEDOLINO.IDRRLAV AND GPTMPELABXREGCONTAB.OWNER ='|| lCODSESSIONE||' AND GPCEDOLINO.IDRELAB = GPTMPELABXREGCONTAB.IDRELAB AND GPCEDOLINO.CODSTATO = ''2'' AND GPTMPRIFXCONT.OWNER ='|| lCODSESSIONE||' AND GPTMPRIFXCONT.GIRO = ''1'' AND GPTMPRIFXCONT.IDRELAB = GPCEDOLINO.IDRELAB AND GPTMPRIFXCONT.IDRRLAV = GPCEDOLINO.IDRRLAV and gpregcontab.codvalgrvox in (select gpvervoce.codvalgrvox from gpvervoce, gpvoxced where gpvoxced.idrrlav = gpcedolino.idrrlav and gpvoxced.idrelab = gpcedolino.idrelab and gpvoxced.codvoce = gpvervoce.codvoce and gpvervoce.codvalgrvox = gpregcontab.codvalgrvox and gpvervoce.codtpgrvox = gpregcontab.codtpgrvox) ) UNION ( SELECT GPCEDOLINO.IDRRLAV, GPCEDOLINO.IDRELAB, GPREGCONTAB.CODENTEAZ, GPREGCONTAB.CODANNO, GPREGCONTAB.CODPARTE, GPREGCONTAB.CODTIPOLEGAME, GPREGCONTAB.CODSEGNOVOCE, GPREGCONTAB.CODTIPOELE, GPREGCONTAB.CODELEMENTO, GPREGCONTAB.IDRCONTRIB, GPREGCONTAB.CODTIPOTASS, GPREGCONTAB.CODTPGRVOX, GPREGCONTAB.CODVALGRVOX, GPREGCONTAB.CODFUNZIONE, GPREGCONTAB.CODSERVIZIO FROM GPTMPRIFXCONT,GPREGCONTAB, GPTMPELABXREGCONTAB,GPCEDOLINO WHERE GPREGCONTAB.CODENTEAZ ='''|| lCODENTEAZ||''' AND GPREGCONTAB.CODANNO ='''|| lCODANNOGRUPPOCONT||''' AND GPREGCONTAB.CODTIPODIP = ''DIP'' AND GPREGCONTAB.CODTIPOELE = ''VOX'' AND GPREGCONTAB.IDRRLAV = GPCEDOLINO.IDRRLAV AND GPTMPELABXREGCONTAB.OWNER ='|| lCODSESSIONE||' AND GPCEDOLINO.IDRELAB = GPTMPELABXREGCONTAB.IDRELAB AND GPCEDOLINO.CODSTATO = ''2'' AND GPTMPRIFXCONT.OWNER = '||lCODSESSIONE ||' AND GPTMPRIFXCONT.GIRO = ''1'' AND GPTMPRIFXCONT.IDRELAB = GPCEDOLINO.IDRELAB AND GPTMPRIFXCONT.IDRRLAV = GPCEDOLINO.IDRRLAV and gpregcontab.codvalgrvox in (select gpvervoce.codvalgrvox from gpvervoce, gpvoxced where gpvoxced.idrrlav = gpcedolino.idrrlav and gpvoxced.idrelab = gpcedolino.idrelab and gpvoxced.codvoce = gpvervoce.codvoce and gpvervoce.codvalgrvox = gpregcontab.codvalgrvox and gpvervoce.codtpgrvox = gpregcontab.codtpgrvox))'; nRet := PKUTILITYPAG.fnCreateView ( sQueryGPREGCONTXVOX, lCodSessione, sVIEWGPREGCONTXVOX, ERRDIAG ); IF nRet < 0 THEN RETURN nRet; END IF; -- passo 1 : per ogni dipendente trovo le regole da applicare sui singoli elementi di cedolino ------------- al 1° giro riempo con IDR=1, ai successivi con IDR=2,3,..,n ( n = Numero funzioni/servizio di un dip ) nGiro := 1; IF lCODSELVOCE = 'S' THEN sSELVOCI := 'GPVOCE.CODVOCE = '||lCODVOCE||' AND '; ELSIF lCODSELVOCE = 'C' THEN sSELVOCI := 'GPVOCE.CODCOLONNA IN ('||sCODCOLONNA||') AND '; ELSE sSELVOCI := ''; END IF; sQUERYVOXNOCONTAB := 'SELECT GPCEDOLINO.IDRRLAV, GPCEDOLINO.IDRELAB, GPPERSONA.IDRPERSONA, GPPERSONA.DESCOGNOME, GPPERSONA.DESNOME, GPPERSONA.DESCOGNOME||'' '' ||GPPERSONA.DESNOME DESPERSONA, GPVOXCED.CODVOCE, GPVOCE.DESVOCE,GPVERVOCE.CODTPGRVOX, GPVALGRVOX.CODVALGRVOX,GPVALGRVOX.DESVALGRVOX, SUM( IMPVOX ) IMPVOX FROM GPPERSONA,GPRAPLAV, GPVALGRVOX, GPVERVOCE, GPVOCE,GPVOXCED,GPCEDOLINO, GPTMPELABXREGCONTAB WHERE OWNER = '|| lCODSESSIONE ||' AND GPCEDOLINO.IDRELAB = GPTMPELABXREGCONTAB.IDRELAB AND GPCEDOLINO.CODSTATO = ''2'' AND GPVOXCED.IDRRLAV = GPCEDOLINO.IDRRLAV AND GPVOXCED.IDRELAB = GPCEDOLINO.IDRELAB AND GPVOCE.CODVOCE= GPVOXCED.CODVOCE AND GPRAPLAV.IDRRLAV=GPCEDOLINO.IDRRLAV AND GPRAPLAV.IDRRLAV=GPVOXCED.IDRRLAV AND GPRAPLAV.IDRPERSONA=GPPERSONA.IDRPERSONA AND GPVOCE.CODVOCE= GPVOXCED.CODVOCE AND '|| sSELVOCI || ' ( ( GPVERVOCE.CODTPGRVOX, GPVERVOCE.CODVALGRVOX ) NOT IN ( SELECT CODTPGRVOX, CODVALGRVOX FROM '||sVIEWGPREGCONTXVOX||' A WHERE A.IDRRLAV = GPCEDOLINO.IDRRLAV AND A.IDRELAB = GPCEDOLINO.IDRELAB AND A.CODANNO = '''||lCODANNOGRUPPOCONT||''' AND A.CODTIPOLEGAME =''P'' AND a.codtipoele = ''VOX'' and a.codtpgrvox = gpvervoce.codtpgrvox and a.codvalgrvox = gpvervoce.codvalgrvox ) ) AND GPVOCE.CODVOCE = GPVERVOCE.CODVOCE AND -- cerco versione voce da considerare ( ( 0 = ( SELECT COUNT(*) FROM GPVERVOCE WHERE CODVERSIONE = '''||lCODENTEAZ||''') AND GPVERVOCE.CODVERSIONE = ''STD'') OR (GPVERVOCE.CODVERSIONE = '''||lCODENTEAZ||''' ) ) AND GPVERVOCE.CODTPGRVOX = GPVALGRVOX.CODTPGRVOX AND GPVERVOCE.CODVALGRVOX = GPVALGRVOX.CODVALGRVOX GROUP BY GPCEDOLINO.IDRRLAV, GPCEDOLINO.IDRELAB, GPPERSONA.IDRPERSONA, GPPERSONA.DESCOGNOME, GPPERSONA.DESNOME, GPVOXCED.CODVOCE, GPVOCE.DESVOCE,GPVERVOCE.CODTPGRVOX, GPVALGRVOX.CODVALGRVOX,GPVALGRVOX.DESVALGRVOX'; nRet := PKUTILITYPAG.fnCreateView ( sQUERYVOXNOCONTAB, lCodSessione, sVIEWVOXNOCONTAB, ERRDIAG ); IF nRet < 0 THEN RETURN nRet; END IF; lVIEWVOXNOCONTAB := sVIEWVOXNOCONTAB; COMMIT; RETURN 1; EXCEPTION WHEN OTHERS THEN ROLLBACK; RETURN pkUtility.fnError( 'fnRegoleVociChk', SQLCODE, ERRDIAG ); END fnRegoleVociChk; -- Autore: M. Sbarra 20030930 -- vista dinamica per la stampa di controllo delle regole di contabilizzazione FUNCTION fnCtrlRegContabDvr( lCODENTEAZ IN pktype.TyStringa%Type, lCODANNO IN pktype.TyStringa%Type, lCodSessione IN pktype.TyStringa%Type, lNOMEVISTA OUT pktype.TyStringa%Type, ERRDIAG OUT pktype.TyStringa%Type) RETURN NUMERIC IS nRet NUMBER(9); sNomeVista pktype.TyStringa%Type := 'CTRLREGCONTAB'; sQuery varchar2(25000); BEGIN -- Caso 1: Partite di giro senza doppia imputazione (Entrata/Spesa) sQuery := 'SELECT DISTINCT ''1'' FLAGINT, ''Partita di giro senza doppia imputazione (Entrata/Spesa)'' ERRORE, '|| 'CODTIPOELE, VOCESPESA.CODVALGRVOX CODELEMENTO, '|| 'VOCESPESA.DESVALGRVOX DESELEMENTO '|| 'FROM GPREGCONTAB REGOLASPESA, GPVALGRVOX VOCESPESA '|| 'WHERE REGOLASPESA.CODENTEAZ = '''|| lCODENTEAZ ||''' AND '|| 'REGOLASPESA.CODANNO = '''|| lCODANNO ||''' AND '|| '((REGOLASPESA.CODTIPOELE = ''VOX'' AND VOCESPESA.INDPGIRO = ''S'')) AND '|| 'REGOLASPESA.CODTPGRVOX = VOCESPESA.CODTPGRVOX AND '|| 'REGOLASPESA.CODVALGRVOX = VOCESPESA.CODVALGRVOX AND NOT EXISTS '|| -- È UNA PARTITA DI GIRO E NON ESISTE L'ALTRA IMPUTAZIONE '(SELECT REGOLAENTRATA.CODVALGRVOX '|| 'FROM GPREGCONTAB REGOLAENTRATA '|| 'WHERE REGOLAENTRATA.CODPARTE <> REGOLASPESA.CODPARTE AND '|| 'REGOLAENTRATA.CODENTEAZ = REGOLASPESA.CODENTEAZ AND '|| 'REGOLAENTRATA.CODANNO = REGOLASPESA.CODANNO AND '|| 'REGOLAENTRATA.CODTIPOELE = REGOLASPESA.CODTIPOELE AND '|| 'REGOLAENTRATA.CODELEMENTO = REGOLASPESA.CODELEMENTO AND '|| 'REGOLAENTRATA.CODTIPODIP = REGOLASPESA.CODTIPODIP AND '|| 'REGOLAENTRATA.CODDIPENDENTE = REGOLASPESA.CODDIPENDENTE ) '|| 'UNION '|| -- 'CONTRIBUTI' 'SELECT DISTINCT ''1'' FLAGINT, ''Partita di giro senza doppia imputazione (Entrata/Spesa)'' ERRORE, '|| 'CODTIPOELE, GPCONTRIB.CODSOGG || '' - '' || GPCONTRIB.CODCONTRIB CODELEMENTO, '|| 'GPCONTRIB.DESCONTRIB DESELEMENTO '|| 'FROM GPREGCONTAB REGOLASPESA, GPCONTRIB '|| 'WHERE REGOLASPESA.CODENTEAZ = '''|| lCODENTEAZ ||''' AND '|| 'REGOLASPESA.CODANNO = '''|| lCODANNO ||''' AND '|| 'REGOLASPESA.CODTIPOELE = ''CON'' AND '|| 'REGOLASPESA.IDRCONTRIB = GPCONTRIB.IDRCONTRIB AND NOT EXISTS '|| -- È UNA PARTITA DI GIRO E NON ESISTE L'ALTRA IMPUTAZIONE '(SELECT TO_CHAR(REGOLAENTRATA.IDRCONTRIB) '|| 'FROM GPREGCONTAB REGOLAENTRATA '|| 'WHERE REGOLAENTRATA.CODPARTE <> REGOLASPESA.CODPARTE AND '|| 'REGOLAENTRATA.CODENTEAZ = REGOLASPESA.CODENTEAZ AND '|| 'REGOLAENTRATA.CODANNO = REGOLASPESA.CODANNO AND '|| 'REGOLAENTRATA.CODTIPOELE = REGOLASPESA.CODTIPOELE AND '|| 'REGOLAENTRATA.CODELEMENTO = REGOLASPESA.CODELEMENTO AND '|| 'REGOLAENTRATA.CODTIPODIP = REGOLASPESA.CODTIPODIP AND '|| 'REGOLAENTRATA.CODDIPENDENTE = REGOLASPESA.CODDIPENDENTE ) '|| 'UNION '|| --'TASSAZIONI' 'SELECT DISTINCT ''1'' FLAGINT, ''Partita di giro senza doppia imputazione (Entrata/Spesa)'' ERRORE, '|| 'CODTIPOELE, REGOLASPESA.CODTIPOTASS CODELEMENTO, '|| 'GPLTIPOTASS.DESTIPOTASS DESELEMENTO '|| 'FROM GPREGCONTAB REGOLASPESA, GPLTIPOTASS '|| 'WHERE REGOLASPESA.CODENTEAZ = '''|| lCODENTEAZ ||''' AND '|| 'REGOLASPESA.CODANNO = '''|| lCODANNO ||''' AND '|| 'REGOLASPESA.CODTIPOELE = ''TAX'' AND '|| 'REGOLASPESA.CODTIPOTASS = GPLTIPOTASS.CODTIPOTASS AND NOT EXISTS '|| --È UNA PARTITA DI GIRO E NON ESISTE L'ALTRA IMPUTAZIONE '( SELECT REGOLAENTRATA.CODTIPOTASS '|| 'FROM GPREGCONTAB REGOLAENTRATA '|| 'WHERE REGOLAENTRATA.CODPARTE <> REGOLASPESA.CODPARTE AND '|| 'REGOLAENTRATA.CODENTEAZ = REGOLASPESA.CODENTEAZ AND '|| 'REGOLAENTRATA.CODANNO = REGOLASPESA.CODANNO AND '|| 'REGOLAENTRATA.CODTIPOELE = REGOLASPESA.CODTIPOELE AND '|| 'REGOLAENTRATA.CODELEMENTO = REGOLASPESA.CODELEMENTO AND '|| 'REGOLAENTRATA.CODTIPODIP = REGOLASPESA.CODTIPODIP AND '|| 'REGOLAENTRATA.CODDIPENDENTE = REGOLASPESA.CODDIPENDENTE ) '|| 'UNION '|| -- Caso 2: Partite non di giro con doppia imputazione (Entrata/Spesa) 'SELECT DISTINCT ''2'' FLAGINT, ''Elemento non Partita di giro con doppia imputazione (Entrata/Spesa)'' ERRORE, '|| 'CODTIPOELE, VOCESPESA.CODVALGRVOX CODELEMENTO, '|| 'VOCESPESA.DESVALGRVOX DESELEMENTO '|| 'FROM GPREGCONTAB REGOLASPESA, GPVALGRVOX VOCESPESA '|| 'WHERE REGOLASPESA.CODENTEAZ = '''||lCODENTEAZ||''' AND '|| 'REGOLASPESA.CODANNO = '''||lCODANNO||''' AND '|| '((REGOLASPESA.CODTIPOELE = ''VOX'' AND VOCESPESA.INDPGIRO = ''N'' )) AND '|| 'REGOLASPESA.CODTPGRVOX = VOCESPESA.CODTPGRVOX AND '|| 'REGOLASPESA.CODVALGRVOX = VOCESPESA.CODVALGRVOX AND EXISTS '|| -- NON È UNA PARTITA DI GIRO ED ESISTE LA REGOLA PER ALTRA IMPUTAZIONE '(SELECT REGOLAENTRATA.CODVALGRVOX '|| 'FROM GPREGCONTAB REGOLAENTRATA '|| 'WHERE REGOLAENTRATA.CODPARTE <> REGOLASPESA.CODPARTE AND '|| 'REGOLAENTRATA.CODENTEAZ = REGOLASPESA.CODENTEAZ AND '|| 'REGOLAENTRATA.CODANNO = REGOLASPESA.CODANNO AND '||--PARAMETRI 'REGOLAENTRATA.CODENTEAZ = '''||lCODENTEAZ||''' AND '|| 'REGOLAENTRATA.CODANNO = '''||lCODANNO||''' AND '|| 'REGOLAENTRATA.CODTIPOELE = REGOLASPESA.CODTIPOELE AND '|| 'REGOLAENTRATA.CODELEMENTO = REGOLASPESA.CODELEMENTO AND '|| 'REGOLAENTRATA.CODTIPODIP = REGOLASPESA.CODTIPODIP AND '|| 'REGOLAENTRATA.CODDIPENDENTE = REGOLASPESA.CODDIPENDENTE ) '|| 'UNION '|| 'SELECT DISTINCT ''2'' FLAGINT, ''Elemento non Partita di giro con doppia imputazione (Entrata/Spesa)'' ERRORE, '|| 'REGOLASPESA.CODTIPOELE, GPCONTRIB.CODSOGG || '' - '' || GPCONTRIB.CODCONTRIB CODELEMENTO, '|| 'GPCONTRIB.DESCONTRIB DESELEMENTO '|| 'FROM GPREGCONTAB REGOLASPESA, GPCONTRIB '|| 'WHERE REGOLASPESA.CODENTEAZ = '''||lCODENTEAZ||''' AND '|| 'REGOLASPESA.CODANNO = '''||lCODANNO||''' AND '|| 'REGOLASPESA.CODTIPOELE =''ONE'' AND '|| 'REGOLASPESA.IDRCONTRIB = GPCONTRIB.IDRCONTRIB AND EXISTS ' || -- NON È UNA PARTITA DI GIRO ED ESISTE LA REGOLA PER ALTRA IMPUTAZIONE '(SELECT REGOLAENTRATA.IDRCONTRIB '|| 'FROM GPREGCONTAB REGOLAENTRATA '|| 'WHERE REGOLAENTRATA.CODPARTE <> REGOLASPESA.CODPARTE AND '|| 'REGOLAENTRATA.CODENTEAZ = REGOLASPESA.CODENTEAZ AND '|| 'REGOLAENTRATA.CODANNO = REGOLASPESA.CODANNO AND '||--PARAMETRI 'REGOLAENTRATA.CODENTEAZ = '''||lCODENTEAZ||''' AND '|| 'REGOLAENTRATA.CODANNO = '''||lCODANNO||''' AND '|| 'REGOLAENTRATA.CODTIPOELE = REGOLASPESA.CODTIPOELE AND '|| 'REGOLAENTRATA.CODELEMENTO = REGOLASPESA.CODELEMENTO AND '|| 'REGOLAENTRATA.CODTIPODIP = REGOLASPESA.CODTIPODIP AND '|| 'REGOLAENTRATA.CODDIPENDENTE = REGOLASPESA.CODDIPENDENTE ) '|| 'UNION '|| -- Caso 3: Oneri ad integrazione ente con indicazione di ripartizione 'SELECT DISTINCT ''3'' FLAGINT, ''Oneri ad integrazione ente con indicazione di ripartizione'' ERRORE, '|| 'CODTIPOELE, GPCONTRIB.CODSOGG || '' - '' || GPCONTRIB.CODCONTRIB CODELEMENTO, '|| 'GPCONTRIB.DESCONTRIB DESELEMENTO '|| 'FROM GPREGCONTAB, GPCONTRIB '|| 'WHERE GPREGCONTAB.CODENTEAZ = '''||lCODENTEAZ||''' AND '|| 'GPREGCONTAB.CODANNO = '''||lCODANNO||''' AND '|| 'GPREGCONTAB.CODTIPOELE =''ONE'' AND '|| 'GPREGCONTAB.IDRCONTRIB = GPCONTRIB.IDRCONTRIB AND '|| 'GPCONTRIB.INDCONTRIBSEC = ''S'' AND '|| 'GPREGCONTAB.INDRIPARTIZIONE = ''S'''; nRet := pkUtilityPag.fnCreateView(sQuery, lCodSessione, sNomeVista,ERRDIAG); IF nRet < 0 THEN RETURN nRet; END IF; lNOMEVISTA := sNomeVista; RETURN 1; EXCEPTION WHEN OTHERS THEN RETURN pkUtility.fnError('fnCtrlRegContabDvr', SQLCODE, ERRDIAG); END fnCtrlRegContabDvr; -- funzione di controllo sulla tabella temporanea GpTmpRegContab. -- M. Sbarra 20031007 FUNCTION fnCtrlRegContabCHK ( lCODANNO IN pkType.TyStringa%type, -- anno lCODTIPOLEGAME IN pkType.TyStringa%type, -- CodTipoLegame di GpTmpRegContab lCODSEGNOVOCE IN pkType.TyStringa%type, -- CodSegnoVoce " lCODTIPODIP IN pkType.TyStringa%type, -- CodTipoDip " lCODDIPENDENTE IN pkType.TyStringa%type, -- CodDipendente " lCODTIPOELE IN pkType.TyStringa%type, -- CodTipoEle " lCODELEMENTO IN pkType.TyStringa%type, -- CodElemento " lCodSessione IN pkType.TyStringa%type, -- OWNER ERRDIAG OUT pkType.TyStringa%type) RETURN NUMERIC IS nConta NUMBER(9); sErrore varchar2(255) := NULL; TYPE tycurRicercaErrori IS REF CURSOR; curRicercaErrori tycurRicercaErrori; BEGIN IF lCODTIPOELE = 'VOX' THEN -- VOCI -- vedo se è una partitta di giro e non ho doppia imputazione oppure -- se non è una partita di giro ed ha doppia imputazione OPEN curRicercaErrori FOR SELECT COUNT(*),'Attenzione: Partita di giro senza doppia imputazione' ERRORE FROM GPTMPREGCONTAB REGOLASPESA, GPVALGRVOX VOCESPESA WHERE VOCESPESA.INDPGIRO = 'S' AND REGOLASPESA.INDTODEL <> 'S' AND REGOLASPESA.INDREGRICH = 'S' AND REGOLASPESA.CODTIPOLEGAME <> 'A' AND REGOLASPESA.CODELEMENTO = lCODELEMENTO AND REGOLASPESA.CODANNO = lCODANNO AND REGOLASPESA.CODTPGRVOX = VOCESPESA.CODTPGRVOX AND REGOLASPESA.CODVALGRVOX = VOCESPESA.CODVALGRVOX AND NOT EXISTS -- È UNA PARTITA DI GIRO E NON ESISTE L'ALTRA IMPUTAZIONE (SELECT REGOLAENTRATA.CODVALGRVOX FROM GPTMPREGCONTAB REGOLAENTRATA WHERE REGOLAENTRATA.CODPARTE <> REGOLASPESA.CODPARTE AND REGOLAENTRATA.INDTODEL <> 'S' AND REGOLAENTRATA.INDREGRICH = 'S' AND REGOLAENTRATA.CODTIPOLEGAME <> 'A' AND REGOLAENTRATA.CODANNO = REGOLASPESA.CODANNO AND REGOLAENTRATA.CODTIPOELE = REGOLASPESA.CODTIPOELE AND REGOLAENTRATA.CODELEMENTO = REGOLASPESA.CODELEMENTO AND REGOLAENTRATA.CODTIPOLEGAME = REGOLASPESA.CODTIPOLEGAME AND REGOLAENTRATA.CODSEGNOVOCE = REGOLASPESA.CODSEGNOVOCE AND REGOLAENTRATA.CODTIPODIP = REGOLASPESA.CODTIPODIP AND REGOLAENTRATA.CODDIPENDENTE = REGOLASPESA.CODDIPENDENTE AND REGOLAENTRATA.OWNER = REGOLASPESA.OWNER ) UNION SELECT COUNT(*),'Attenzione:Elemento non Partita di giro con doppia imputazione' ERRORE FROM GPTMPREGCONTAB REGOLASPESA, GPVALGRVOX VOCESPESA WHERE VOCESPESA.INDPGIRO = 'N' AND REGOLASPESA.CODANNO = lCODANNO AND --lCodAnno REGOLASPESA.INDTODEL <> 'S' AND REGOLASPESA.INDREGRICH = 'S' AND REGOLASPESA.CODTIPOLEGAME <> 'A' AND REGOLASPESA.CODELEMENTO = lCODELEMENTO AND REGOLASPESA.OWNER = lCodSessione AND REGOLASPESA.CODTPGRVOX = VOCESPESA.CODTPGRVOX AND REGOLASPESA.CODVALGRVOX = VOCESPESA.CODVALGRVOX AND EXISTS -- È UNA PARTITA DI GIRO E NON ESISTE L'ALTRA IMPUTAZIONE (SELECT REGOLAENTRATA.CODVALGRVOX FROM GPTMPREGCONTAB REGOLAENTRATA WHERE REGOLAENTRATA.CODPARTE <> REGOLASPESA.CODPARTE AND REGOLAENTRATA.INDTODEL <> 'S' AND REGOLAENTRATA.INDREGRICH = 'S' AND REGOLAENTRATA.CODANNO = REGOLASPESA.CODANNO AND REGOLAENTRATA.CODTIPOELE = REGOLASPESA.CODTIPOELE AND REGOLAENTRATA.CODTIPOLEGAME = REGOLASPESA.CODTIPOLEGAME AND REGOLASPESA.CODTIPOLEGAME <> 'A' AND REGOLAENTRATA.CODSEGNOVOCE = REGOLASPESA.CODSEGNOVOCE and REGOLAENTRATA.CODELEMENTO = REGOLASPESA.CODELEMENTO AND REGOLAENTRATA.CODTIPODIP = REGOLASPESA.CODTIPODIP AND REGOLAENTRATA.CODDIPENDENTE = REGOLASPESA.CODDIPENDENTE AND REGOLAENTRATA.OWNER = REGOLASPESA.OWNER); ELSIF lCODTIPOELE = 'CON' THEN -- CONTRIBUTI OPEN curRicercaErrori FOR SELECT DISTINCT COUNT(*),'Attenzione: Partita di giro senza doppia imputazione' ERRORE FROM GPTMPREGCONTAB REGOLASPESA, GPCONTRIB WHERE REGOLASPESA.CODANNO = lCODANNO AND REGOLASPESA.CODTIPOELE = lCODTIPOELE AND REGOLASPESA.CODELEMENTO = lCODELEMENTO AND REGOLASPESA.CODTIPOLEGAME <> 'A' AND REGOLASPESA.INDTODEL <> 'S' AND REGOLASPESA.INDREGRICH = 'S' AND REGOLASPESA.OWNER = lCodSessione AND REGOLASPESA.IDRCONTRIB = GPCONTRIB.IDRCONTRIB AND NOT EXISTS -- È UNA PARTITA DI GIRO E NON ESISTE LALTRA IMPUTAZIONE (SELECT TO_CHAR(REGOLAENTRATA.IDRCONTRIB) FROM GPTMPREGCONTAB REGOLAENTRATA WHERE REGOLAENTRATA.CODPARTE <> REGOLASPESA.CODPARTE AND REGOLAENTRATA.INDTODEL <> 'S' AND REGOLAENTRATA.INDREGRICH = 'S' AND REGOLAENTRATA.CODTIPOLEGAME <> 'A' AND REGOLAENTRATA.CODANNO = REGOLASPESA.CODANNO AND REGOLAENTRATA.CODTIPOELE = REGOLASPESA.CODTIPOELE AND REGOLAENTRATA.CODELEMENTO = REGOLASPESA.CODELEMENTO AND REGOLAENTRATA.CODTIPOLEGAME = REGOLASPESA.CODTIPOLEGAME AND REGOLAENTRATA.CODSEGNOVOCE = REGOLASPESA.CODSEGNOVOCE AND REGOLAENTRATA.CODTIPODIP = REGOLASPESA.CODTIPODIP AND REGOLAENTRATA.CODDIPENDENTE = REGOLASPESA.CODDIPENDENTE AND REGOLAENTRATA.OWNER = REGOLASPESA.OWNER ); ELSIF lCODTIPOELE = 'TAX' THEN -- TASSAZIONE OPEN curRicercaErrori FOR SELECT DISTINCT COUNT(*), 'Attenzione: Partita di giro senza doppia imputazione' ERRORE FROM GPTMPREGCONTAB REGOLASPESA, GPLTIPOTASS WHERE REGOLASPESA.INDTODEL <> 'S' AND REGOLASPESA.INDREGRICH = 'S' AND REGOLASPESA.CODTIPOLEGAME <> 'A' AND REGOLASPESA.CODANNO = lCODANNO AND REGOLASPESA.CODTIPOELE = lCODTIPOELE AND REGOLASPESA.CODELEMENTO = lCODELEMENTO AND REGOLASPESA.OWNER = lCodSessione AND REGOLASPESA.CODTIPOTASS = GPLTIPOTASS.CODTIPOTASS AND NOT EXISTS --È UNA PARTITA DI GIRO E NON ESISTE L'ALTRA IMPUTAZIONE ( SELECT REGOLAENTRATA.CODTIPOELE FROM GPTMPREGCONTAB REGOLAENTRATA WHERE REGOLAENTRATA.CODPARTE <> REGOLASPESA.CODPARTE AND REGOLAENTRATA.INDTODEL <> 'S' AND REGOLAENTRATA.INDREGRICH = 'S' AND REGOLAENTRATA.CODTIPOLEGAME <> 'A' AND REGOLAENTRATA.CODANNO = REGOLASPESA.CODANNO AND REGOLAENTRATA.CODTIPOELE = REGOLASPESA.CODTIPOELE AND REGOLAENTRATA.CODELEMENTO = REGOLASPESA.CODELEMENTO AND REGOLAENTRATA.CODTIPOLEGAME = REGOLASPESA.CODTIPOLEGAME AND REGOLAENTRATA.CODSEGNOVOCE = REGOLASPESA.CODSEGNOVOCE AND REGOLAENTRATA.CODTIPODIP = REGOLASPESA.CODTIPODIP AND REGOLAENTRATA.CODDIPENDENTE = REGOLASPESA.CODDIPENDENTE AND REGOLAENTRATA.OWNER = REGOLASPESA.OWNER); ELSIF lCODTIPOELE = 'ONE' THEN -- ONERI OPEN curRicercaErrori FOR ---- SELECT DISTINCT COUNT(*), 'Attenzione: Elemento non Partita di giro con doppia imputazione' ERRORE FROM GPTMPREGCONTAB REGOLASPESA, GPCONTRIB WHERE REGOLASPESA.INDTODEL <> 'S' AND REGOLASPESA.INDREGRICH = 'S' AND REGOLASPESA.CODTIPOLEGAME <> 'A' AND REGOLASPESA.CODANNO = lCODANNO AND REGOLASPESA.CODELEMENTO = lCODELEMENTO AND REGOLASPESA.CODTIPOELE = lCODTIPOELE AND GPCONTRIB.INDCONTRIBSEC = 'S' AND REGOLASPESA.INDRIPARTIZIONE = 'S' AND EXISTS -- NON È UNA PARTITA DI GIRO ED ESISTE LA REGOLA PER ALTRA IMPUTAZIONE (SELECT REGOLAENTRATA.IDRCONTRIB FROM GPTMPREGCONTAB REGOLAENTRATA WHERE REGOLAENTRATA.CODPARTE <> REGOLASPESA.CODPARTE AND REGOLAENTRATA.INDTODEL <> 'S' AND REGOLAENTRATA.INDREGRICH = 'S' AND REGOLASPESA.CODTIPOLEGAME <> 'A' AND REGOLAENTRATA.CODANNO = REGOLASPESA.CODANNO AND --PARAMETRI REGOLAENTRATA.CODTIPOELE = REGOLASPESA.CODTIPOELE AND REGOLAENTRATA.CODELEMENTO = REGOLASPESA.CODELEMENTO AND REGOLAENTRATA.CODTIPODIP = REGOLASPESA.CODTIPODIP AND REGOLAENTRATA.CODDIPENDENTE = REGOLASPESA.CODDIPENDENTE AND REGOLAENTRATA.OWNER = REGOLASPESA.OWNER) UNION -- Caso 3: Oneri ad integrazione ente con indicazione di ripartizione SELECT DISTINCT COUNT(*), 'Attenzione: Onere ad integrazione ente con indicazione di ripartizione' ERRORE FROM GPTMPREGCONTAB, GPCONTRIB WHERE GPTMPREGCONTAB.INDTODEL <> 'S' AND GPTMPREGCONTAB.INDREGRICH = 'S' AND GPTMPREGCONTAB.CODTIPOLEGAME <> 'A' AND GPTMPREGCONTAB.OWNER = lCodSessione AND GPTMPREGCONTAB.CODANNO = lCODANNO AND GPTMPREGCONTAB.CODELEMENTO = lCODELEMENTO AND GPTMPREGCONTAB.CODTIPOELE = lCODTIPOELE AND GPTMPREGCONTAB.IDRCONTRIB = GPCONTRIB.IDRCONTRIB AND GPCONTRIB.INDCONTRIBSEC = 'S' AND GPTMPREGCONTAB.INDRIPARTIZIONE = 'S'; END IF; LOOP FETCH curRicercaErrori INTO nConta,sErrore; EXIT WHEN curRicercaErrori%NOTFOUND; END LOOP; IF curRicercaErrori%ROWCOUNT = 0 THEN -- RAISE NO_DATA_FOUND; sErrore := ''; END IF; CLOSE curRicercaErrori; IF nConta > 0 THEN ERRDIAG := sErrore; RETURN pkUtility.fnError('fnCtrlRegContabCHK', -499, ERRDIAG); END IF; RETURN 1; EXCEPTION WHEN OTHERS THEN IF curRicercaErrori%ISOPEN THEN CLOSE curRicercaErrori; END IF; RETURN pkUtility.fnError('fnCtrlRegContabCHK', SQLCODE, ERRDIAG); END fnCtrlRegContabCHK; -- Funzione che restituisce la vista con l'elenco dei Capitoli e degli Impegni con il Pagato e la Disponibilità residua FUNCTION fnTestCapienzaDVR ( lCODENTEAZ IN PKTYPE.TYSTRINGA%TYPE, lCODANNOGRUPPOCONT IN PKTYPE.TYSTRINGA%TYPE, lINDSOLOCONTABIL IN PKTYPE.TYSTRINGA%TYPE, -- 'S': solo i Contabilizzati, 'N' : Tutti lDTASCADENZA IN PKTYPE.TYSTRINGA%TYPE, -- Entro tale Data di Scadenza, per Default '31/12/2999' lCODSESSIONE IN PKTYPE.TYSTRINGA%TYPE, lVIEWTestCapienza OUT PKTYPE.TYSTRINGA%TYPE, ERRDIAG OUT PKTYPE.TYSTRINGA%TYPE ) RETURN NUMERIC IS sTPCOLCONT VARCHAR2(1); nRet NUMBER(9); nNumRec NUMBER(9); sQUERYTestCapienza VARCHAR2(30000); sVIEWTestCapienza VARCHAR2(50) := 'TESTCAPIENZA'; sDTASCADENZA VARCHAR2(10) := NVL( lDTASCADENZA, TO_CHAR( PKTYPE.DTAMAX, 'DD/MM/YYYY')); sDESSCHEMASERFIN GPENTEAZ.DESSCHEMASERFIN%TYPE; sNomeSchema VARCHAR2(255); sNomeDBLink VARCHAR2(255); sQuery VARCHAR2(4000); BEGIN SELECT NVL(MAX(CODULT),1) -- per default metto Contabilizzazione con Serfin INTO sTPCOLCONT FROM GPINFO WHERE TIPOINFO = 'TPCOLCONT' AND CODINFO = UPPER(lCODENTEAZ); IF sTPCOLCONT = 1 THEN SELECT MAX(DESSCHEMASERFIN) INTO sDESSCHEMASERFIN FROM GPENTEAZ WHERE CODENTEAZ = UPPER(lCODENTEAZ); IF sDESSCHEMASERFIN IS NULL THEN RETURN 1; END IF; -- Il campo DESSCHEMASERFIN ora può essere nella forma SCHEMA@DBLINK IF INSTR(sDESSCHEMASERFIN, '@') > 0 THEN sNomeSchema := SUBSTR(sDESSCHEMASERFIN, 1, INSTR(sDESSCHEMASERFIN, '@') - 1); sNomeDBLink := SUBSTR(sDESSCHEMASERFIN, INSTR(sDESSCHEMASERFIN, '@') + 1, LENGTH(sDESSCHEMASERFIN)); ELSE sNomeSchema := sDESSCHEMASERFIN; END IF; -- controllo se esiste lo schema con descrizione passata sQuery := 'SELECT COUNT(*) FROM ALL_USERS'; IF sNomeDBLink IS NOT NULL THEN sQuery := sQuery || '@' || sNomeDBLink; END IF; sQuery := sQuery || ' WHERE USERNAME = UPPER( ''' || sNomeSchema || ''' )'; EXECUTE IMMEDIATE sQuery INTO nNumRec; IF nNumRec = 0 THEN -- ritorno Errore ROLLBACK; ERRDIAG := 'L''Ente/Azienda selezionato non esiste in Contabilità'; RETURN pkUtility.fnError( 'fnTestCapienzaDVR', -499, ERRDIAG ); END IF; ELSE RETURN 1; -- il controllo lo faccio solo per Serfin END IF; sQUERYTestCapienza := 'SELECT GPCAPITOLI.CODPARTE, DECODE(GPCAPITOLI.CODPARTE,''S'',''Spesa'',''E'', ''Entrata'') DESPARTE, ''CAPITOLO'' CODTIPOELE, A.IDCAPITOLO, A.ESER, A.CAP, A.ART, A.CAP||''/''|| A.ART || '' ('' || A.APP || '')'' || '' ''|| A.ESER DESCAPITOLO, TO_NUMBER(NULL) IDACCIMP, TO_NUMBER(NULL) ESERACCIMP, TO_NUMBER(NULL) NUMACCIMP, NULL DESESTESAACCIMP, IMPPAGATO, STANZINI+VARAUM-VARDIM-SUM(NVL(B.IMPINI,0)) IMPDISPONIBILITA FROM '||sNomeSchema||'.CFCAPITOLIPEG'; IF sNomeDBLink IS NOT NULL THEN sQUERYTestCapienza := sQUERYTestCapienza || '@' || sNomeDBLink; END IF; sQUERYTestCapienza := sQUERYTestCapienza || ' A, '||sNomeSchema||'.CFIMPEGNI'; IF sNomeDBLink IS NOT NULL THEN sQUERYTestCapienza := sQUERYTestCapienza || '@' || sNomeDBLink; END IF; sQUERYTestCapienza := sQUERYTestCapienza || ' B, ( SELECT GPRISCONT.CODPARTE, GPRISCONT.IDCAPITOLO,SUM( IMPMANREV ) IMPPAGATO FROM GPRISCONT, GPELAB WHERE CODANNOGRUPPOCONT = '''|| lCODANNOGRUPPOCONT||''' AND GPELAB.IDRELAB = GPRISCONT.IDRELAB AND GPELAB.CODENTEAZ = '''|| lCODENTEAZ||''' AND IDACCIMP = ''0'' '; -- non ha impegni specificati IF lINDSOLOCONTABIL = 'S' THEN sQUERYTestCapienza := sQUERYTestCapienza || 'AND INDCONTABILIZZATO = ''S'''; END IF; sQUERYTestCapienza := sQUERYTestCapienza || ' AND DTASCADENZA <= TO_DATE( '''||sDTASCADENZA||''',''DD/MM/YYYY'')' || ' GROUP BY GPRISCONT.CODPARTE, GPRISCONT.IDCAPITOLO ) GPCAPITOLI WHERE A.IDCAPITOLO = B.IDCAPITOLO AND A.IDCAPITOLO = GPCAPITOLI.IDCAPITOLO GROUP BY GPCAPITOLI.CODPARTE, A.IDCAPITOLO, A.ESER, A.CAP, A.ART, A.APP,STANZINI,VARAUM,VARDIM, IMPPAGATO UNION SELECT ''S'' CODPARTE, ''Spesa'' DESPARTE, ''IMPEGNO'' CODTIPOELE, A.IDCAPITOLO, B.ESER, B.CAP, B.ART, B.CAP||''/''|| B.ART|| '' ''||A.ESER DESCAPITOLO, A.IDIMP IDACCIMP, A.ESER ESERACCIMP, A.NUMIMP NUMACCIMP, A.NUMIMP ||'' ''|| A.ESER DESESTESAACCIMP, IMPPAGATO, SUM(NVL(C.DISPONIB,0)) IMPDISPONIBILITA FROM '||sNomeSchema||'.VWFRMCFIMPDISP'; IF sNomeDBLink IS NOT NULL THEN sQUERYTestCapienza := sQUERYTestCapienza || '@' || sNomeDBLink; END IF; sQUERYTestCapienza := sQUERYTestCapienza || ' C, '||sNomeSchema||'.CFIMPEGNI'; IF sNomeDBLink IS NOT NULL THEN sQUERYTestCapienza := sQUERYTestCapienza || '@' || sNomeDBLink; END IF; sQUERYTestCapienza := sQUERYTestCapienza || ' A, '||sNomeSchema||'.CFCAPITOLIPEG'; IF sNomeDBLink IS NOT NULL THEN sQUERYTestCapienza := sQUERYTestCapienza || '@' || sNomeDBLink; END IF; sQUERYTestCapienza := sQUERYTestCapienza || ' B, ( SELECT GPRISCONT.IDCAPITOLO,IDACCIMP,SUM( IMPMANREV ) IMPPAGATO FROM GPRISCONT, GPELAB WHERE GPRISCONT.CODANNOGRUPPOCONT = '''|| lCODANNOGRUPPOCONT||''' AND GPELAB.IDRELAB = GPRISCONT.IDRELAB AND GPRISCONT.CODPARTE = ''S'' AND GPELAB.CODENTEAZ = '''|| lCODENTEAZ||''''; IF lINDSOLOCONTABIL = 'S' THEN sQUERYTestCapienza := sQUERYTestCapienza || ' AND INDCONTABILIZZATO = ''S'''; END IF; sQUERYTestCapienza := sQUERYTestCapienza || ' AND DTASCADENZA <= TO_DATE( '''||sDTASCADENZA||''',''DD/MM/YYYY'') GROUP BY GPRISCONT.IDCAPITOLO,IDACCIMP) GPCAPITOLI WHERE A.IDCAPITOLO = B.IDCAPITOLO AND A.IDIMP = C.IDIMP(+) AND B.IDCAPITOLO = A.IDCAPITOLO AND GPCAPITOLI.IDCAPITOLO = B.IDCAPITOLO AND GPCAPITOLI.IDACCIMP = A.IDIMP GROUP BY A.IDCAPITOLO, B.ESER, B.CAP, B.ART, A.ESER, A.IDIMP , A.NUMIMP, IMPPAGATO UNION SELECT '' E'' CODPARTE, ''Entrata'' DESPARTE, ''ACCERTAMENTO'' CODTIPOELE, A.IDCAPITOLO, B.ESER, B.CAP, B.ART, B.CAP||''/''|| B.ART|| '' ''||A.ESER DESCAPITOLO, A.IDACC IDACCIMP, A.ESER ESERACCIMP, A.NUMACC NUMACCIMP, A.NUMACC ||'' ''|| A.ESER DESESTESAACCIMP, IMPPAGATO, SUM(NVL(C.DISPONIB,0)) IMPDISPONIBILITA FROM '||sNomeSchema||'.VWFRMCFACCDISP'; IF sNomeDBLink IS NOT NULL THEN sQUERYTestCapienza := sQUERYTestCapienza || '@' || sNomeDBLink; END IF; sQUERYTestCapienza := sQUERYTestCapienza || ' C, '||sNomeSchema||'.CFACCERTAMENTI'; IF sNomeDBLink IS NOT NULL THEN sQUERYTestCapienza := sQUERYTestCapienza || '@' || sNomeDBLink; END IF; sQUERYTestCapienza := sQUERYTestCapienza || ' A, '||sNomeSchema||'.CFCAPITOLIPEG'; IF sNomeDBLink IS NOT NULL THEN sQUERYTestCapienza := sQUERYTestCapienza || '@' || sNomeDBLink; END IF; sQUERYTestCapienza := sQUERYTestCapienza || ' B, ( SELECT GPRISCONT.IDCAPITOLO,IDACCIMP,SUM( IMPMANREV ) IMPPAGATO FROM GPRISCONT, GPELAB WHERE GPRISCONT.CODANNOGRUPPOCONT = '''|| lCODANNOGRUPPOCONT||''' AND GPELAB.IDRELAB = GPRISCONT.IDRELAB AND GPRISCONT.CODPARTE = ''E'' AND GPELAB.CODENTEAZ = '''|| lCODENTEAZ||''''; IF lINDSOLOCONTABIL = 'S' THEN sQUERYTestCapienza := sQUERYTestCapienza || ' AND INDCONTABILIZZATO = ''S'''; END IF; sQUERYTestCapienza := sQUERYTestCapienza || ' AND DTASCADENZA <= TO_DATE( '''||sDTASCADENZA||''',''DD/MM/YYYY'') GROUP BY GPRISCONT.IDCAPITOLO,IDACCIMP) GPCAPITOLI WHERE A.IDCAPITOLO = B.IDCAPITOLO AND A.IDACC = C.IDACC(+) AND B.IDCAPITOLO = A.IDCAPITOLO AND GPCAPITOLI.IDCAPITOLO = B.IDCAPITOLO AND GPCAPITOLI.IDACCIMP = A.IDACC GROUP BY A.IDCAPITOLO, B.ESER, B.CAP, B.ART, A.ESER, A.IDACC , A.NUMACC, IMPPAGATO'; nRet := PKUTILITYPAG.fnCreateView ( sQUERYTestCapienza, lCodSessione, sVIEWTestCapienza, ERRDIAG ); IF nRet < 0 THEN RETURN nRet; END IF; lVIEWTestCapienza := sVIEWTestCapienza; RETURN 1; EXCEPTION WHEN OTHERS THEN RETURN pkUtility.fnError( 'fnTestCapienzaDVR', SQLCODE, ERRDIAG ); END; FUNCTION fnExtractCrossCont( lCODENTEAZ IN pkType.tyStringa%type, lCODANNOLIQ IN pkType.tyStringa%type, lCODANNOMAT IN pkType.tyStringa%type, lCODSESSIONE IN PKTYPE.TYSTRINGA%TYPE, ERRDIAG OUT pkType.tyStringa%type ) RETURN NUMERIC IS sDESSCHEMASERFIN GPENTEAZ.desschemaserfin%TYPE; sTPCOLCONT VARCHAR2(1); sQuery VARCHAR2(30000); nIDCAPITOLORES GPCROSSCONTAB.IDCAPITOLORES%TYPE; nCODANNORES GPCROSSCONTAB.CODANNORES%TYPE; nIDACCIMPRES GPCROSSCONTAB.IDACCIMPRES%TYPE; IGNORE INTEGER; SOURCE_CURSOR INTEGER; nRet NUMBER(9); sNomeSchema VARCHAR2(255); sNomeDBLink VARCHAR2(255); BEGIN -- Cancello eventuali associazioni già fatte DELETE FROM GPCROSSCONTAB WHERE CODANNOLIQ = lCODANNOLIQ AND CODENTEAZ = UPPER( lCODENTEAZ ) AND CODANNOMAT = lCODANNOMAT; COMMIT; SELECT NVL(MAX(CODULT),1) -- per default metto Contabilizzazione con Serfin INTO sTPCOLCONT FROM GPINFO WHERE TIPOINFO = 'TPCOLCONT' AND CODINFO = UPPER(lCODENTEAZ); IF sTPCOLCONT = 1 THEN SELECT DESSCHEMASERFIN INTO sDESSCHEMASERFIN FROM GPENTEAZ WHERE CODENTEAZ = UPPER(lCODENTEAZ); -- Il campo DESSCHEMASERFIN ora può essere nella forma SCHEMA@DBLINK IF INSTR(sDESSCHEMASERFIN, '@') > 0 THEN sNomeSchema := SUBSTR(sDESSCHEMASERFIN, 1, INSTR(sDESSCHEMASERFIN, '@') - 1); sNomeDBLink := SUBSTR(sDESSCHEMASERFIN, INSTR(sDESSCHEMASERFIN, '@') + 1, LENGTH(sDESSCHEMASERFIN)); ELSE sNomeSchema := sDESSCHEMASERFIN; END IF; END IF; FOR REC IN ( SELECT A.IDCAPITOLO IDCAPITOLOLIQ, A.IDACCIMP IDACCIMPLIQ, DECODE( sTPCOLCONT,1,0, A.CODANNOCONT) CODANNOIMPLIQ, A.CODPARTE FROM GPREGCONTAB A WHERE A.CODANNO = lCODANNOLIQ AND -- lCODANNOLIQ A.CODENTEAZ = UPPER(lCODENTEAZ) -- lCODENTEAZ GROUP BY A.IDCAPITOLO , A.IDACCIMP , DECODE( sTPCOLCONT,1,0, A.CODANNOCONT), A.CODPARTE UNION SELECT A.IDCAPITOLORIPART IDCAPITOLOLIQ, A.IDACCIMPRIPART IDACCIMPLIQ, DECODE( sTPCOLCONT,1,0, A.CODANNOCONTRIPART) CODANNOIMPLIQ , A.CODPARTE FROM GPREGCONTAB A WHERE A.CODANNO = lCODANNOLIQ AND -- lCODANNOLIQ A.CODENTEAZ = UPPER(lCODENTEAZ) -- lCODENTEAZ GROUP BY A.IDCAPITOLORIPART , A.IDACCIMPRIPART , DECODE( sTPCOLCONT,1,0, A.CODANNOCONTRIPART), A.CODPARTE UNION SELECT A.IDCAPITOLORIPART IDCAPITOLOLIQ, A.IDACCIMPRIPART IDACCIMPLIQ, DECODE( sTPCOLCONT,1,0, A.CODANNOCONTRIPART) CODANNOIMPLIQ , A.CODPARTE FROM GPREGCONTABONE A WHERE A.CODANNO = lCODANNOLIQ AND -- lCODANNOLIQ A.CODENTEAZ = UPPER(lCODENTEAZ) -- lCODENTEAZ GROUP BY A.IDCAPITOLORIPART , A.IDACCIMPRIPART , DECODE( sTPCOLCONT,1,0, A.CODANNOCONTRIPART), A.CODPARTE ) LOOP IF (sDESSCHEMASERFIN IS NOT NULL AND sTPCOLCONT = 1) THEN -- PER SERFIN prendo l'impegno con più disponibilità sul Capitolo che tra i possibili candidati a -- parità di CodCdr, App, UEB, Cap, e Art ha il minimo CodVoce. A parità di disponibilità prendiamo quello con Id minore sQuery :='SELECT IDCAPITOLO,IDACCIMP,ESER,DISPONIBILITA FROM '|| sNomeSchema || '.VWFRMDISPEXPERS'; IF sNomeDBLink IS NOT NULL THEN sQuery := sQuery || '@' || sNomeDBLink; END IF; sQuery := sQuery || ' B'|| ' WHERE B.CODTIPOELE = ''IMPACC'' AND'|| ' B.ESER = '||lCODANNOMAT||' AND'|| ' DISPONIBILITA > 0 AND'|| ' (B.CODCDR , B.APP , B.UEB, B.CAP , B.ART, B.CODVOCE ) IN'|| ' ( SELECT A.CODCDR , A.APP , A.UEB, A.CAP , A.ART, MIN(A.CODVOCE)'|| ' FROM '|| sNomeSchema || '.VWFRMDISPEXPERS'; IF sNomeDBLink IS NOT NULL THEN sQuery := sQuery || '@' || sNomeDBLink; END IF; sQuery := sQuery || ' A'|| ' WHERE A.CODTIPOELE = ''CAPITOLO'' AND A.IDCAPITOLO = '|| rec.IDCAPITOLOLIQ || ' GROUP BY A.CODCDR , A.APP , A.UEB, A.CAP , A.ART )'|| ' ORDER BY DISPONIBILITA DESC, IDACCIMP'; END IF; IF (sTPCOLCONT = 2) THEN -- Caso di contabilizzazione sistemi esterni sQuery :=' select gpaccimpse.idrcapsistext, DECODE(gpaccimpse.CODACCIMP,''0'',''0'',gpaccimpse.idraccimpse) IDRACCIMPSE, gpaccimpse.annoaccimp, GPACCIMPSE.impstanzatt from gpaccimpse, gpcapsistext where gpaccimpse.idrcapsistext = gpcapsistext.idrcapsistext and gpcapsistext.annocapitolo = '||lCODANNOMAT||' and (nvl(gpcapsistext.codtitolo,0), nvl(gpcapsistext.codfunzione,0), nvl(gpcapsistext.codservizio,0), nvl(gpcapsistext.codcategoria,0), nvl(gpcapsistext.codintervrisorsa,0), nvl(gpcapsistext.codcapitolo,0), nvl(gpcapsistext.codvoceec,0)) in (select nvl(a.codtitolo,0), nvl(a.codfunzione,0), nvl(a.codservizio,0), nvl(a.codcategoria,0), nvl(a.codintervrisorsa,0), nvl(a.codcapitolo,0), nvl(a.codvoceec,0) from gpcapsistext a where a.codparte = gpcapsistext.codparte and a.codenteaz = gpcapsistext.codenteaz and a.idrcapsistext = '|| rec.IDCAPITOLOLIQ ||' and -- quello che interessa a.annocapitolo = '||lCODANNOLIQ||' ) order by ANNOACCIMP desc'; END IF; IF ((sTPCOLCONT = 1 and sDESSCHEMASERFIN IS NOT NULL) or sTPCOLCONT = 2) THEN SOURCE_CURSOR := DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(SOURCE_CURSOR , sQuery ,dbms_sql.v7 ); -- definisco variabili in cui inserire i valori ottenuti dalla select DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR , 1, nIDCAPITOLORES ); DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR , 2, nIDACCIMPRES ); DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR , 3, nCODANNORES ); IGNORE:=DBMS_SQL.EXECUTE(SOURCE_CURSOR); -- scorro cursore, ma inserisco solo il primo: poi tutti gli altri li inserisco in una tabella -- d'appoggio LOOP IF DBMS_SQL.FETCH_ROWS( SOURCE_CURSOR ) > 0 THEN -- Istanzio le variabili ai valori trovati con il cursore SOURCE_CURSOR DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR , 1, nIDCAPITOLORES ); DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR , 2, nIDACCIMPRES ); DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR , 3, nCODANNORES ); EXIT; ELSE nIDCAPITOLORES := ''; nIDACCIMPRES := ''; nCODANNORES := ''; EXIT; END IF; END LOOP; DBMS_SQL.close_CURSOR(SOURCE_CURSOR); END IF; IF sTPCOLCONT = 0 THEN --Nessuna Contabilizzazione nIDCAPITOLORES := REC.IDCAPITOLOLIQ; nIDACCIMPRES := 0; nCODANNORES := 0; END IF; IF sTpColCont in (1,2) THEN REC.CODANNOIMPLIQ := '0'; nCODANNORES := '0'; END IF; IF nIDACCIMPRES IS NOT NULL THEN INSERT INTO GPCROSSCONTAB( IDCAPITOLOLIQ , CODANNOLIQ , CODENTEAZ , CODPARTE , CODANNOIMPLIQ , IDACCIMPLIQ , CODANNOMAT , IDCAPITOLORES , CODANNORES , IDACCIMPRES ) VALUES ( REC.IDCAPITOLOLIQ , lCODANNOLIQ , UPPER(lCODENTEAZ), REC.CODPARTE , REC.CODANNOIMPLIQ , REC.IDACCIMPLIQ , lCODANNOMAT, nIDCAPITOLORES , nCODANNORES , nIDACCIMPRES ); END IF; END LOOP; -- inserisco il log nRet := pkPagPerson.fnGPLogIns( 'GPCROSSCONTAB', 'I', 'Inserimento in automatico nella tabella GPCROSSCONTAB', lCODANNOLIQ||'§'|| lCODENTEAZ||'§'|| lCODANNOMAT, NULL, NULL, 'N', lCODSESSIONE, ERRDIAG ); COMMIT; RETURN 1; EXCEPTION WHEN OTHERS THEN RETURN pkUtility.fnError( 'fnExtractCrossCont', SQLCODE, ERRDIAG ); END fnExtractCrossCont; FUNCTION fnGPCROSSCONTABUpd ( lIDCAPITOLOLIQ IN pkType.tyStringa%TYPE, lCODANNOLIQ IN pkType.tyStringa%TYPE, lCODENTEAZ IN pkType.tyStringa%TYPE, lCODPARTE IN pkType.tyStringa%TYPE, lCODANNOIMPLIQ IN pkType.tyStringa%TYPE, lIDACCIMPLIQ IN pkType.tyStringa%TYPE, lCODANNOMAT IN pkType.tyStringa%TYPE, lIDCAPITOLORES IN pkType.tyStringa%TYPE, lCODANNORES IN pkType.tyStringa%TYPE, lIDACCIMPRES IN pkType.tyStringa%TYPE, lCODSESSIONE IN PKTYPE.TYSTRINGA%TYPE, ERRDIAG OUT pkType.tyStringa%TYPE ) RETURN NUMERIC IS nRet NUMBER(9); BEGIN IF lIDCAPITOLORES > 0 OR lIDACCIMPRES > 0 THEN UPDATE GPCROSSCONTAB SET IDCAPITOLORES = lIDCAPITOLORES, CODANNORES = NVL(lCODANNORES,0), IDACCIMPRES = NVL(lIDACCIMPRES,0) WHERE IDCAPITOLOLIQ = lIDCAPITOLOLIQ AND CODANNOLIQ = lCODANNOLIQ AND CODENTEAZ = UPPER( lCODENTEAZ ) AND CODPARTE = UPPER( lCODPARTE ) AND CODANNOIMPLIQ = lCODANNOIMPLIQ AND IDACCIMPLIQ = lIDACCIMPLIQ AND CODANNOMAT = lCODANNOMAT; IF SQL%ROWCOUNT=0 THEN INSERT INTO GPCROSSCONTAB( IDCAPITOLOLIQ , CODANNOLIQ , CODENTEAZ , CODPARTE , CODANNOIMPLIQ , IDACCIMPLIQ , CODANNOMAT , IDCAPITOLORES , CODANNORES , IDACCIMPRES ) VALUES ( lIDCAPITOLOLIQ , lCODANNOLIQ , UPPER(lCODENTEAZ), lCODPARTE , lCODANNOIMPLIQ , NVL(lIDACCIMPLIQ,0) , lCODANNOMAT, lIDCAPITOLORES , NVL(lCODANNORES,0), NVL(lIDACCIMPRES,0) ); END IF; ELSE -- Lo tolgo DELETE FROM GPCROSSCONTAB WHERE IDCAPITOLOLIQ = lIDCAPITOLOLIQ AND CODANNOLIQ = lCODANNOLIQ AND CODENTEAZ = UPPER( lCODENTEAZ ) AND CODPARTE = UPPER( lCODPARTE ) AND CODANNOIMPLIQ = lCODANNOIMPLIQ AND IDACCIMPLIQ = lIDACCIMPLIQ AND CODANNOMAT = lCODANNOMAT; END IF; -- inserisco il log nRet := pkPagPerson.fnGPLogIns( 'GPCROSSCONTAB', 'U', 'Aggiornamento della tabella GPCROSSCONTAB', lIDCAPITOLOLIQ ||'§'|| lCODANNOLIQ||'§'|| lCODENTEAZ||'§'|| lCODPARTE||'§'|| lCODANNOIMPLIQ ||'§'|| lIDACCIMPLIQ||'§'|| lCODANNOMAT, NULL, NULL, 'N', lCODSESSIONE, ERRDIAG ); COMMIT; RETURN 1; EXCEPTION WHEN OTHERS THEN ROLLBACK; RETURN pkUtility.fnerror('2fnGPCROSSCONTABUpd', SQLCODE, ERRDIAG); END fnGPCROSSCONTABUpd; -- CANCELLA tutti i record di Ente, Annoliq e AnnoMat specificati FUNCTION fnGPCROSSCONTABDel ( lCODANNOLIQ IN pkType.tyStringa%TYPE, lCODENTEAZ IN pkType.tyStringa%TYPE, lCODANNOMAT IN pkType.tyStringa%TYPE, lCODSESSIONE IN PKTYPE.TYSTRINGA%TYPE, ERRDIAG OUT pkType.tyStringa%TYPE ) RETURN NUMERIC IS nRet NUMBER(9); BEGIN DELETE FROM GPCROSSCONTAB WHERE CODANNOLIQ = lCODANNOLIQ AND CODENTEAZ = UPPER( lCODENTEAZ ) AND CODANNOMAT = lCODANNOMAT; -- inserisco il log nRet := pkPagPerson.fnGPLogIns( 'GPCROSSCONTAB', 'D', 'Cancellazione dalla tabella GPCROSSCONTAB', lCODANNOLIQ||'§'|| lCODENTEAZ||'§'|| lCODANNOMAT, NULL, NULL, 'N', lCODSESSIONE, ERRDIAG ); COMMIT; RETURN 1; EXCEPTION WHEN OTHERS THEN ROLLBACK; RETURN pkUtility.fnerror('3fnGPCROSSCONTABDel', SQLCODE, ERRDIAG); END fnGPCROSSCONTABDel; FUNCTION fnCrossContabDvr( lCODENTEAZ IN pkType.tyStringa%type, lCODANNOLIQ IN pkType.tyStringa%type, lCODANNOMAT IN pkType.tyStringa%type, lINDVEDISCART IN pkType.tyStringa%type, -- 'S' vedi ANCHE tutte le possibili corrispondenze scartate lCODSESSIONE IN PKTYPE.TYSTRINGA%TYPE, lVIEWCrossContab OUT PKTYPE.TYSTRINGA%TYPE, ERRDIAG OUT PKTYPE.TYSTRINGA%TYPE ) RETURN NUMERIC IS sTPCOLCONT VARCHAR2(1); nRet NUMBER(9); nNumRec NUMBER(9); sQUERYCrossContab VARCHAR2(30000):=''; sVIEWCrossContab VARCHAR2(50) := 'CROSSCONTAB'; sDESSCHEMASERFIN GPENTEAZ.DESSCHEMASERFIN%TYPE; sNomeSchema VARCHAR2(255); sNomeDBLink VARCHAR2(255); sQuery VARCHAR2(4000); BEGIN SELECT NVL(MAX(CODULT),1) -- per default metto Contabilizzazione con Serfin INTO sTPCOLCONT FROM GPINFO WHERE TIPOINFO = 'TPCOLCONT' AND CODINFO = UPPER(lCODENTEAZ); IF sTPCOLCONT = 1 THEN SELECT DESSCHEMASERFIN INTO sDESSCHEMASERFIN FROM GPENTEAZ WHERE CODENTEAZ = UPPER(lCODENTEAZ); -- Il campo DESSCHEMASERFIN ora può essere nella forma SCHEMA@DBLINK IF INSTR(sDESSCHEMASERFIN, '@') > 0 THEN sNomeSchema := SUBSTR(sDESSCHEMASERFIN, 1, INSTR(sDESSCHEMASERFIN, '@') - 1); sNomeDBLink := SUBSTR(sDESSCHEMASERFIN, INSTR(sDESSCHEMASERFIN, '@') + 1, LENGTH(sDESSCHEMASERFIN)); ELSE sNomeSchema := sDESSCHEMASERFIN; END IF; IF lINDVEDISCART = 'S' THEN -- Prendo TUTTE le possibili associazioni che si potevano fare, ORDINANDOLE in modo che il primo -- dell'Elenco per ogni CAP, IMP, CODANNOCONT di liquidazione e Parte, si vede il capitolo con codice voce minore e Disponibilità -- Maggiore ( cioè quello che abbiamo associato in automatico ) IF sDESSCHEMASERFIN IS NOT NULL THEN sQUERYCrossContab := ' SELECT C.IDCAPITOLOLIQ, C.IDACCIMPLIQ, C.CODANNOIMPLIQ, C.CODPARTE, B.IDCAPITOLO IDCAPITOLORES,B.IDACCIMP IDACCIMPRES, B.ESER CODANNORES,B.CODVOCE,B.DISPONIBILITA, B.DESCAPITOLO DESCAPITOLORES, B.DESESTESAACCIMP DESACCIMPRES, C.DESCAPITOLOLIQ, C.DESACCIMPLIQ FROM '|| sNomeSchema || '.VWFRMDISPEXPERS'; IF sNomeDBLink IS NOT NULL THEN sQUERYCrossContab := sQUERYCrossContab || '@' || sNomeDBLink; END IF; sQUERYCrossContab := sQUERYCrossContab || ' B, (SELECT REGOLE.IDCAPITOLOLIQ, REGOLE.IDACCIMPLIQ, REGOLE.CODANNOIMPLIQ, REGOLE.CODPARTE, A.CODCDR,A.app,A.UEB,A.cap,A.ART,A.CODVOCE, A.DESCAPITOLO DESCAPITOLOLIQ, A.DESESTESAACCIMP DESACCIMPLIQ FROM '|| sNomeSchema || '.VWFRMDISPEXPERS'; IF sNomeDBLink IS NOT NULL THEN sQUERYCrossContab := sQUERYCrossContab || '@' || sNomeDBLink; END IF; sQUERYCrossContab := sQUERYCrossContab || ' A, (SELECT REG.IDCAPITOLO IDCAPITOLOLIQ, REG.IDACCIMP IDACCIMPLIQ, REG.CODANNOCONT CODANNOIMPLIQ, CODPARTE FROM GPREGCONTAB REG WHERE REG.CODANNO = '||lCODANNOLIQ||' AND REG.CODENTEAZ = UPPER('''|| lCODENTEAZ||''') UNION SELECT REG.IDCAPITOLORIPART IDCAPITOLOLIQ, REG.IDACCIMPRIPART IDACCIMPLIQ, REG.CODANNOCONTRIPART CODANNOIMPLIQ , CODPARTE FROM GPREGCONTAB REG WHERE REG.CODANNO = '||lCODANNOLIQ||' AND REG.CODENTEAZ = UPPER('''|| lCODENTEAZ||''') UNION SELECT REG.IDCAPITOLORIPART IDCAPITOLOLIQ, REG.IDACCIMPRIPART IDACCIMPLIQ, REG.CODANNOCONTRIPART CODANNOIMPLIQ, CODPARTE FROM GPREGCONTABONE REG WHERE REG.CODANNO = '||lCODANNOLIQ||' AND REG.CODENTEAZ = UPPER('''|| lCODENTEAZ||''') ) REGOLE WHERE A.CODTIPOELE = ''CAPITOLO'' AND A.IDCAPITOLO = REGOLE.IDCAPITOLOLIQ GROUP BY REGOLE.IDCAPITOLOLIQ, REGOLE.IDACCIMPLIQ, REGOLE.CODANNOIMPLIQ, REGOLE.CODPARTE, A.CODCDR , A.APP , A.UEB, A.CAP , A.ART,A.CODVOCE, A.DESCAPITOLO, A.DESESTESAACCIMP) C WHERE B.CODTIPOELE = ''IMPACC'' AND B.ESER = '||lCODANNOMAT||' AND DISPONIBILITA > 0 AND B.CODCDR = C.CODCDR AND B.APP =C.APP AND B.UEB = C.UEB AND B.CAP=C.CAP AND B.ART=C.ART AND B.CODVOCE =C.CODVOCE'; --anto: da fare nel Report --ORDER BY C.CODPARTE,C.IDCAPITOLOLIQ, C.IDACCIMPLIQ, C.CODANNOIMPLIQ,B.CODVOCE ASC,B.DISPONIBILITA DESC '; END IF; ELSE sQUERYCrossContab := ' SELECT A.IDCAPITOLOLIQ , A.IDACCIMPLIQ , A.CODANNOIMPLIQ, A.CODPARTE, A.IDCAPITOLORES , A.IDACCIMPRES, A.CODANNORES , B.DESCAPITOLO DESCAPITOLORES, B.DESESTESAACCIMP DESACCIMPRES, C.DESCAPITOLO DESCAPITOLOLIQ, C.DESESTESAACCIMP DESACCIMPLIQ FROM GPCROSSCONTAB A, '|| sNomeSchema ||'.VWFRMDISPEXPERS'; IF sNomeDBLink IS NOT NULL THEN sQUERYCrossContab := sQUERYCrossContab || '@' || sNomeDBLink; END IF; sQUERYCrossContab := sQUERYCrossContab || ' B,'|| sNomeSchema ||'.VWFRMDISPEXPERS'; IF sNomeDBLink IS NOT NULL THEN sQUERYCrossContab := sQUERYCrossContab || '@' || sNomeDBLink; END IF; sQUERYCrossContab := sQUERYCrossContab || ' C WHERE A.CODANNOLIQ = '||lCODANNOLIQ||' AND A.CODENTEAZ = UPPER('''|| lCODENTEAZ||''') AND A.CODANNOMAT = '|| lCODANNOMAT||' AND ( B.CODTIPOELE = ''IMPACC'' AND A.IDACCIMPRES = B.IDACCIMP ) AND B.APP = A.CODPARTE AND C.APP = A.CODPARTE AND (( C.CODTIPOELE = ''IMPACC'' AND A.IDACCIMPLIQ = C.IDACCIMP AND A.IDACCIMPLIQ >0) OR ( C.CODTIPOELE = ''CAPITOLO'' AND A.IDCAPITOLOLIQ = C.IDCAPITOLO AND A.IDACCIMPLIQ=0))'; --anto: da fare nel Report ORDER BY A.CODPARTE,A.IDCAPITOLOLIQ, A.IDACCIMPLIQ, A.CODANNOIMPLIQ'; END IF; ELSIF sTPCOLCON