PROCEDURE sql_generer_fichier_indigo (
v_target_file IN VARCHAR2, -- Nom du fichier de sortie
v_target_directory IN VARCHAR2, -- Nom du chemin de sortie
v_output_file OUT t_varchar_1000
)
IS
ref_fichier UTL_FILE.file_type;
processus_name VARCHAR2 (60) := 'sql_generer_fichier_indigo';
err_msg VARCHAR2 (300);
err_num INTEGER;
num_flag INTEGER;
rc INTEGER;
pcf$table VARCHAR2 (30);
ligne_temp VARCHAR2 (500) := ' ';
l_nb INTEGER := 0;
l_rc INTEGER;
l_target_file VARCHAR2 (60);
v_type_evenement journal.detail%TYPE;
v_login utilisateur.login%TYPE;
l_code_table VARCHAR2 (60);
v_detail journal.detail%TYPE;
lc$montant NUMBER := 0;
lc$annee indigo.id_annee%TYPE;
lc$trimestre indigo.id_trimestre%TYPE;
lc$requete VARCHAR2 (10000);
CURSOR c_indigo
IS
SELECT t1.*
FROM indigo t1
WHERE t1.date_generation IS NOT NULL
AND t1.date_validation IS NOT NULL
AND t1.date_envoi IS NULL
ORDER BY t1.id_indigo;
CURSOR c_lignes_indigo (v_id_indigo indigo.id_indigo%TYPE)
IS
SELECT t1.ID_INDIGO, t1.EXERCICE, t1.CODE_COLLECTIVITE,
t1.CODE_BUDGET, t1.ARTICLE_BUDGETAIRE, t1.FONCTION,
t1.OPERATION, SUM (TO_NUMBER (t1.MONTANT)) AS MONTANT, t1.TVA,
t1.ETAT_CIVIL, t1.NOM_CREANTIER, t1.TITULAIRE_COMPTE,
t1.CODE_ETABLISSEMENT, t1.CODE_GUICHET, t1.NUMERO_COMPTE,
t1.CLE_RIB, t1.LIBELLE_BANQUE, t1.CORRESPONDANCE_1,
t1.CORRESPONDANCE_2, t1.NATURE_MANDAT, t1.SERVICE_EMETTEUR,
t1.NUMERO_REGIE, t1.MODE_REGLEMENT, t1.IDENTIFIANT_STABLE,
t1.FILLER1, t1.NUMERO_PROG, t1.EXERCICE_RATTAC,
t1.NUMERO_MANDAT_RATTAC, t1.NUMERO_ORDRE_RATTAC, t1.NUMERO_MARCHE,
t1.FILLER2, t1.CODE_MONNAIE, t1.SUIVI_DELAI,
t1.DATE_DEBUT_DELAI_GLOBAL, t1.DATE_FIN_DELAI_GLOBAL, t1.DUREE_DELAI_GLOBAL,
t1.TAUX_INTERETS_MORATOIRES, t1.FILLER3, t1.VERSION,
t1.TYPE_ENREGISTREMENT, t1.ID_RESPONSABLE, t1.NUMERO_ORDRE_RESPONSABLE,
t2.num_bordereau, t2.num_mandat
FROM lignes_indigo t1, indigo t2
WHERE t2.id_indigo = t1.id_indigo
AND t1.id_indigo = v_id_indigo
GROUP BY t1.ID_INDIGO, t1.EXERCICE, t1.CODE_COLLECTIVITE,
t1.CODE_BUDGET, t1.ARTICLE_BUDGETAIRE, t1.FONCTION,
t1.OPERATION, t1.TVA,
t1.ETAT_CIVIL, t1.NOM_CREANTIER, t1.TITULAIRE_COMPTE,
t1.CODE_ETABLISSEMENT, t1.CODE_GUICHET, t1.NUMERO_COMPTE,
t1.CLE_RIB, t1.LIBELLE_BANQUE, t1.CORRESPONDANCE_1,
t1.CORRESPONDANCE_2, t1.NATURE_MANDAT, t1.SERVICE_EMETTEUR,
t1.NUMERO_REGIE, t1.MODE_REGLEMENT, t1.IDENTIFIANT_STABLE,
t1.FILLER1, t1.NUMERO_PROG, t1.EXERCICE_RATTAC,
t1.NUMERO_MANDAT_RATTAC, t1.NUMERO_ORDRE_RATTAC, t1.NUMERO_MARCHE,
t1.FILLER2, t1.CODE_MONNAIE, t1.SUIVI_DELAI,
t1.DATE_DEBUT_DELAI_GLOBAL, t1.DATE_FIN_DELAI_GLOBAL, t1.DUREE_DELAI_GLOBAL,
t1.TAUX_INTERETS_MORATOIRES, t1.FILLER3, t1.VERSION,
t1.TYPE_ENREGISTREMENT, t1.ID_RESPONSABLE, t1.NUMERO_ORDRE_RESPONSABLE,
t2.num_bordereau, t2.num_mandat
ORDER BY TO_NUMBER (t1.NUMERO_ORDRE_RESPONSABLE);
-- * ************* BEGIN ****************
BEGIN
DBMS_OUTPUT.ENABLE (1000000);
num_flag := 1;
IF v_target_file IS NULL OR v_target_directory IS NULL
THEN
rc := 5;
err_msg := 'Nom de fichier ou de repertoire non renseigné ! ';
sql_print_error (num_flag, processus_name, err_msg, rc);
RETURN;
END IF;
num_flag := 2;
FOR v_indigo IN c_indigo
LOOP
v_output_file := t_varchar_1000 ();
l_nb := 0;
-- Verification des champs num_mandat et num_bordereau
num_flag := 3;
FOR i IN 1 .. LENGTH (v_indigo.num_mandat)
LOOP
num_flag := 4;
IF SUBSTR(v_indigo.num_mandat, i, 1) NOT IN ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9')
THEN
rc := 6;
err_msg := ' La valeur num_mandat=['|| v_indigo.num_mandat ||'] doit etre numerique !';
sql_print_error (num_flag, processus_name, err_msg, rc);
RETURN;
END IF;
END LOOP;
num_flag := 5;
FOR i IN 1 .. LENGTH (v_indigo.num_bordereau)
LOOP
num_flag := 6;
IF SUBSTR(v_indigo.num_bordereau, i, 1) NOT IN ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9')
THEN
rc := 7;
err_msg := ' La valeur num_bordereau=['|| v_indigo.num_bordereau ||'] doit etre numerique !';
sql_print_error (num_flag, processus_name, err_msg, rc);
RETURN;
END IF;
END LOOP;
num_flag := 7;
l_target_file := REPLACE(v_target_file, '%seq', TO_CHAR(v_indigo.id_indigo, 'fm0000'));
ref_fichier := UTL_FILE.fopen (v_target_directory, l_target_file, 'w');
l_nb := 0;
lc$annee := v_indigo.id_annee;
lc$trimestre := v_indigo.id_trimestre;
num_flag := 8;
FOR v_lignes_indigo IN c_lignes_indigo (v_indigo.id_indigo)
LOOP
ligne_temp := v_lignes_indigo.code_collectivite;
ligne_temp := ligne_temp || v_lignes_indigo.code_budget;
ligne_temp := ligne_temp || v_lignes_indigo.exercice;
ligne_temp := ligne_temp || TO_CHAR (TO_NUMBER (v_lignes_indigo.num_bordereau), 'fm0000000');
ligne_temp := ligne_temp || TO_CHAR (TO_NUMBER (v_lignes_indigo.num_mandat), 'fm00000000');
ligne_temp := ligne_temp || TO_CHAR (TO_NUMBER (v_lignes_indigo.numero_ordre_responsable),'fm000000');
ligne_temp := ligne_temp || v_lignes_indigo.article_budgetaire;
ligne_temp := ligne_temp || v_lignes_indigo.fonction;
ligne_temp := ligne_temp || v_lignes_indigo.operation;
ligne_temp := ligne_temp || SUBSTR (TO_CHAR (TO_NUMBER (v_lignes_indigo.montant), '00000000000000.00'), 2, 14);
ligne_temp := ligne_temp || SUBSTR (TO_CHAR (TO_NUMBER (v_lignes_indigo.montant), '00000000000000.00'), 17, 2);
ligne_temp := ligne_temp || v_lignes_indigo.tva;
ligne_temp := ligne_temp || v_lignes_indigo.etat_civil;
ligne_temp := ligne_temp || v_lignes_indigo.nom_creantier;
ligne_temp := ligne_temp || v_lignes_indigo.titulaire_compte;
ligne_temp := ligne_temp || v_lignes_indigo.code_etablissement;
ligne_temp := ligne_temp || v_lignes_indigo.code_guichet;
ligne_temp := ligne_temp || v_lignes_indigo.numero_compte;
ligne_temp := ligne_temp || TO_CHAR (TO_NUMBER (v_lignes_indigo.cle_rib), 'fm00');
ligne_temp := ligne_temp || v_lignes_indigo.libelle_banque;
ligne_temp := ligne_temp || RPAD (v_lignes_indigo.correspondance_1, 30);
ligne_temp := ligne_temp || RPAD (v_lignes_indigo.correspondance_2, 30);
ligne_temp := ligne_temp || v_lignes_indigo.nature_mandat;
ligne_temp := ligne_temp || v_lignes_indigo.service_emetteur;
ligne_temp := ligne_temp || v_lignes_indigo.numero_regie;
ligne_temp := ligne_temp || v_lignes_indigo.mode_reglement;
ligne_temp := ligne_temp || v_lignes_indigo.identifiant_stable;
ligne_temp := ligne_temp || v_lignes_indigo.filler1;
ligne_temp := ligne_temp || v_lignes_indigo.numero_prog;
ligne_temp := ligne_temp || v_lignes_indigo.exercice_rattac;
ligne_temp := ligne_temp || v_lignes_indigo.numero_mandat_rattac;
ligne_temp := ligne_temp || v_lignes_indigo.numero_ordre_rattac;
ligne_temp := ligne_temp || v_lignes_indigo.numero_marche;
ligne_temp := ligne_temp || v_lignes_indigo.filler2;
ligne_temp := ligne_temp || v_lignes_indigo.code_monnaie;
ligne_temp := ligne_temp || v_lignes_indigo.suivi_delai;
ligne_temp := ligne_temp || v_lignes_indigo.date_debut_delai_global;
ligne_temp := ligne_temp || v_lignes_indigo.date_fin_delai_global;
ligne_temp := ligne_temp || v_lignes_indigo.duree_delai_global;
ligne_temp := ligne_temp || v_lignes_indigo.taux_interets_moratoires;
ligne_temp := ligne_temp || v_lignes_indigo.filler3;
ligne_temp := ligne_temp || v_lignes_indigo.VERSION;
ligne_temp := ligne_temp || v_lignes_indigo.type_enregistrement;
num_flag := 9;
UTL_FILE.put_line (ref_fichier, ligne_temp);
-- Initialisation de la variable v_output_file par une structure null et
-- allocation memoire pour un élément dans cette structure
num_flag := 10;
v_output_file.EXTEND;
v_output_file (v_output_file.LAST) := ligne_temp;
rc := 3;
END LOOP;
-- Flager l'enregistrement par date_envoi pour qu'elle ne soit plus traité.
-- Un fichier généré est un fichier considéré comme à envoyer.
-- Si on a besoin de regenere le fihcier infigo, mettre a jour la date_envoi à null
-- puis relancer sql_genere_fichier_indigo .
num_flag := 11;
UPDATE indigo
SET date_envoi = SYSDATE
WHERE id_indigo = v_indigo.id_indigo;
num_flag := 12;
UTL_FILE.fflush (ref_fichier);
UTL_FILE.fclose (ref_fichier);
END LOOP;
err_msg := 'Processus=['|| processus_name ||'], génération du fichier indigo=['|| TRIM (v_target_directory) ||'\'|| TRIM(l_target_file) ||'], par l''utilisateur=['|| v_login ||']';
sql_add_journal (evt_indigo, err_msg, 1, l_rc);
err_msg := 'OK';
sql_print_ok (processus_name, err_msg);
-- * *********** EXCEPTION **************
EXCEPTION
-- Traitement des erreurs rencontrees
WHEN NO_DATA_FOUND
THEN
sql_print_dbms ('Pas de donnée trouvée.');
UTL_FILE.fclose (ref_fichier);
WHEN UTL_FILE.invalid_path
THEN
sql_print_dbms ('UTL_FILE.INVALID_PATH invalide.');
UTL_FILE.fclose (ref_fichier);
WHEN UTL_FILE.read_error
THEN
sql_print_dbms ('UTL_FILE.READ_ERROR invlide.');
UTL_FILE.fclose (ref_fichier);
WHEN UTL_FILE.write_error
THEN
sql_print_dbms ('UTL_FILE.WRITE_ERROR invalide.');
UTL_FILE.fclose (ref_fichier);
WHEN OTHERS
THEN
rc := 9;
err_num := SQLCODE;
err_msg := SUBSTR (SQLERRM, 1, 200);
sql_print_error (num_flag, processus_name, err_msg, rc);
UTL_FILE.fclose (ref_fichier);
END;
Partager