├── src ├── rapports │ └── .gitignore └── testeur │ ├── log │ └── .gitignore │ ├── Version_Alto2.txt │ ├── fmt_arrete │ ├── trt_xml.pl │ ├── StdInParse.exe │ ├── formats_xsd.tar │ ├── xerces-c_3_1.dll │ ├── xerces-c_3_1D.dll │ ├── Licence_CeCILL_V2.1-en.txt │ ├── Licence_CeCILL_V2.1-fr.txt │ ├── xsd │ └── installation_xerces.txt │ ├── SQL │ ├── IDX_LISTE.sql │ ├── IDX_FEC_NUMECR.sql │ ├── LIASSE.sql │ ├── EXERCICE.sql │ ├── PARAMETRE.sql │ ├── IDX_ECRITURE.sql │ ├── ECRITURE.sql │ ├── PANIER.sql │ ├── VUEPANIER.sql │ ├── VUES_FECCOM.sql │ ├── VUES_FECBAT.sql │ ├── VUES_FECBIC.sql │ ├── VUES_FECBNCT.sql │ ├── IDX_FEC.sql │ ├── FECBNCT.sql │ ├── FECBAT.sql │ ├── FECBIC.sql │ ├── FECCOM.sql │ ├── VUES_BALANCE_TVA.sql │ ├── BALANCE.sql │ ├── VUES.sql │ └── BALANCE_TVA.sql │ ├── environnement_alto2.pl │ ├── testeur.bat │ ├── init.sh │ ├── alto2_testtype.pl │ ├── trt_entete.pl │ ├── alto2_pdf.pl │ ├── alto2_fonctions.pl │ ├── init.pl │ └── trt_txt.pl ├── doc └── Notice Test Compta Demat_maj 2021 .pdf └── README.md /src/rapports/.gitignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/testeur/log/.gitignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/testeur/Version_Alto2.txt: -------------------------------------------------------------------------------- 1 | 1_00_10b 2 | -------------------------------------------------------------------------------- /src/testeur/fmt_arrete: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DGFiP/Test-Compta-Demat/HEAD/src/testeur/fmt_arrete -------------------------------------------------------------------------------- /src/testeur/trt_xml.pl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DGFiP/Test-Compta-Demat/HEAD/src/testeur/trt_xml.pl -------------------------------------------------------------------------------- /src/testeur/StdInParse.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DGFiP/Test-Compta-Demat/HEAD/src/testeur/StdInParse.exe -------------------------------------------------------------------------------- /src/testeur/formats_xsd.tar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DGFiP/Test-Compta-Demat/HEAD/src/testeur/formats_xsd.tar -------------------------------------------------------------------------------- /src/testeur/xerces-c_3_1.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DGFiP/Test-Compta-Demat/HEAD/src/testeur/xerces-c_3_1.dll -------------------------------------------------------------------------------- /src/testeur/xerces-c_3_1D.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DGFiP/Test-Compta-Demat/HEAD/src/testeur/xerces-c_3_1D.dll -------------------------------------------------------------------------------- /src/testeur/Licence_CeCILL_V2.1-en.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DGFiP/Test-Compta-Demat/HEAD/src/testeur/Licence_CeCILL_V2.1-en.txt -------------------------------------------------------------------------------- /src/testeur/Licence_CeCILL_V2.1-fr.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DGFiP/Test-Compta-Demat/HEAD/src/testeur/Licence_CeCILL_V2.1-fr.txt -------------------------------------------------------------------------------- /src/testeur/xsd/installation_xerces.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DGFiP/Test-Compta-Demat/HEAD/src/testeur/xsd/installation_xerces.txt -------------------------------------------------------------------------------- /doc/Notice Test Compta Demat_maj 2021 .pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DGFiP/Test-Compta-Demat/HEAD/doc/Notice Test Compta Demat_maj 2021 .pdf -------------------------------------------------------------------------------- /src/testeur/SQL/IDX_LISTE.sql: -------------------------------------------------------------------------------- 1 | DROP INDEX IF EXISTS idx_listcomptegenaux_ ; 2 | 3 | CREATE INDEX idx_listcomptegenaux_ ON listcomptegenaux_ USING btree (num_cpte_gen_aux, lib_cpte_gen_aux) ; 4 | 5 | -------------------------------------------------------------------------------- /src/testeur/SQL/IDX_FEC_NUMECR.sql: -------------------------------------------------------------------------------- 1 | DROP INDEX IF EXISTS idx_num_ecr_fec_; 2 | -- Index permettant l'affichage de l'onglet journal ainsi que les filtres sur les dates comptables 3 | CREATE INDEX idx_num_ecr_fec_ ON fec_ USING btree (num_ecr); 4 | -------------------------------------------------------------------------------- /src/testeur/environnement_alto2.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl -- -*- C -*- 2 | 3 | # suivant l utilisation locale des utilisateurs les chemins sont a modifier 4 | sub Env_Path { 5 | $ENV{ProgramFiles} = "/A/MODIFIER/chemin/vers/src"; 6 | $ENV{ProgramData} = "/A/MODIFIER/chemin/vers/src"; 7 | } 8 | 1; #return true 9 | 10 | -------------------------------------------------------------------------------- /src/testeur/SQL/LIASSE.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE IF EXISTS LIASSE CASCADE; 2 | DROP TABLE IF EXISTS ca3 CASCADE; 3 | 4 | 5 | CREATE TABLE liasse (liasse text, code text, cloture date, valeur text,CONSTRAINT pk_liasse PRIMARY KEY (liasse, code, cloture) ); 6 | 7 | CREATE TABLE ca3 (annee int, mois int, code text, valeur text, CONSTRAINT pk_ca3 PRIMARY KEY (annee, mois, code)); -------------------------------------------------------------------------------- /src/testeur/SQL/EXERCICE.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE IF EXISTS EXERCICE; 2 | 3 | CREATE TABLE EXERCICE 4 | ( 5 | DATE_CLOTURE Date NOT NULL, 6 | CONSTRAINT PK_EXERCICE PRIMARY KEY(DATE_CLOTURE) 7 | ); 8 | 9 | CREATE OR REPLACE FUNCTION unaccent_string(text) 10 | RETURNS text IMMUTABLE STRICT LANGUAGE SQL 11 | AS $$ SELECT translate( 12 | $1, 13 | 'âãäåÁÂÃÄÅèééêëÈÉÉÊËìíîïìÌÍÎÏÌóôõöÒÓÔÕÖùúûüÙÚÛÜÿ', 14 | 'aaaaAAAAAeeeeeEEEEEiiiiiIIIIIooooOOOOOuuuuUUUUy' 15 | ); $$; 16 | -------------------------------------------------------------------------------- /src/testeur/SQL/PARAMETRE.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE IF EXISTS parametre CASCADE; 2 | 3 | CREATE TABLE parametre(id text NOT NULL, valeur text, CONSTRAINT pk_parametre PRIMARY KEY (id)) ; 4 | INSERT INTO parametre(id, valeur) VALUES ('ready', 'false') ; 5 | INSERT INTO parametre(id, valeur) VALUES ('version', '') ; 6 | --INSERT INTO parametre(id, valeur) VALUES ('plan_compte', 'PCG') ; 7 | INSERT INTO parametre(id, valeur) VALUES ('clause_tva', '') ; 8 | INSERT INTO parametre(id, valeur) VALUES ('societe', '') ; 9 | -------------------------------------------------------------------------------- /src/testeur/testeur.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | set curdir = %~dp0 4 | cd %curdir% 5 | 6 | set curdirtest=%cd% 7 | set curdirtest=%curdirtest:\=/% 8 | set curdirtest=%curdirtest:/testeur=% 9 | echo #!/usr/bin/perl -- -*- C -*- > environnement_alto2.pl 10 | echo sub Env_Path { >> environnement_alto2.pl 11 | echo $ENV{ProgramFiles} = ^"%curdirtest%^"; >> environnement_alto2.pl 12 | echo $ENV{ProgramData} = ^"%curdirtest%^"; >> environnement_alto2.pl 13 | echo } >> environnement_alto2.pl 14 | echo 1; #return true >> environnement_alto2.pl 15 | 16 | init.exe CTL 17 | 18 | -------------------------------------------------------------------------------- /src/testeur/SQL/IDX_ECRITURE.sql: -------------------------------------------------------------------------------- 1 | DROP INDEX IF EXISTS idx_num_ecr_ecriture_ ; 2 | DROP INDEX IF EXISTS idx_date_ecriture_; 3 | DROP INDEX IF EXISTS idx_jrn_ecriture_ ; 4 | DROP INDEX IF EXISTS idx_tva_ecriture_ ; 5 | DROP INDEX IF EXISTS idx_ecr_type_ecriture_ ; 6 | commit ; 7 | 8 | CREATE INDEX idx_num_ecr_ecriture_ ON ecriture_ USING btree(num_ecr); 9 | commit ; 10 | CREATE INDEX idx_date_ecriture_ ON ecriture_ USING btree(date_cpt); 11 | commit ; 12 | CREATE INDEX idx_jrn_ecriture_ ON ecriture_ USING btree(code_jrnal, lib_jrnal); 13 | commit ; 14 | CREATE INDEX idx_tva_ecriture_ ON ecriture_ USING btree(taux_tva); 15 | commit ; 16 | CREATE INDEX idx_ecr_type_ecriture_ ON ecriture_ (ecr_type) WHERE ecr_type != 0; 17 | -------------------------------------------------------------------------------- /src/testeur/init.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | OLD_IFS=${IFS} 3 | IFS="$(printf '\n')" 4 | OLD_PATH=${PATH} 5 | 6 | CMD_HOME_DIR="$(cd "$(dirname "$1")"; pwd -P)/" 7 | GARBAGE_SCRIPT_PATH=${CMD_HOME_DIR}$(echo -n $0 | sed -e 's%'${CMD_HOME_DIR}'%%gm') 8 | cd "$(dirname ${GARBAGE_SCRIPT_PATH})" 9 | 10 | SCRIPT_PATH=$(pwd -P) 11 | SCRIPT_NAME=$(basename ${GARBAGE_SCRIPT_PATH}) 12 | cd .. 13 | 14 | SOURCE_DIR=$(pwd -P | sed 's/[]['\''!"#$%& ()*,:;<=>?`{|}~]/\\&/gm') # Escaping characters 15 | 16 | cd "${SCRIPT_PATH}" 17 | 18 | cat > ${SCRIPT_PATH}/environnement_alto2.pl < cascade ; 2 | 3 | CREATE TABLE ecriture_ ( 4 | num_ecr text NOT NULL, 5 | date_cpt date NOT NULL, 6 | code_jrnal text DEFAULT '', 7 | idem_codejrnal boolean, 8 | idem_debcre boolean, 9 | idem_datecpt boolean, 10 | idem_numpiece boolean, 11 | idem_datepiece boolean, -- 12 | idem_codelet boolean , -- 13 | lib_jrnal text DEFAULT '', 14 | lib_ecriture text[], 15 | date_piece date, 16 | num_piece text DEFAULT '', 17 | code_lettrage text, 18 | nb_ligne integer, 19 | taux_tva numeric, 20 | ecr_type int DEFAULT 0, 21 | sum_debit numeric, 22 | sum_credit numeric, 23 | CONSTRAINT pk_ecriture_ PRIMARY KEY (num_ecr)); 24 | 25 | 26 | 27 | commit ; 28 | 29 | 30 | INSERT INTO ecriture_ 31 | SELECT num_ecr, min(date_cpt), min(code_jrnal), 32 | min(code_jrnal) = max(code_jrnal), 33 | sum(mtn_debit) = sum(mtn_credit), 34 | min(date_cpt) = max(date_cpt), 35 | min(num_piece) = max(num_piece), 36 | min(date_piece) = max(date_piece), 37 | min(code_lettrage) = max(code_lettrage), 38 | min(lib_jrnal), array_agg(distinct lib_ecriture), min(date_piece), min(num_piece), min(code_lettrage), count(*), 39 | , 40 | min(ecr_type), sum(mtn_debit), sum(mtn_credit) 41 | FROM fec_ GROUP BY num_ecr ; 42 | 43 | -------------------------------------------------------------------------------- /src/testeur/SQL/PANIER.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE IF EXISTS panier_dir CASCADE; 2 | DROP TABLE IF EXISTS panier_axe CASCADE; 3 | DROP TABLE IF EXISTS panier_ligne CASCADE; 4 | DROP SEQUENCE IF EXISTS panier_dir_id_panier_dir ; 5 | DROP SEQUENCE IF EXISTS panier_axe_id_panier_axe ; 6 | 7 | CREATE SEQUENCE panier_dir_id_panier_dir 8 | INCREMENT 1 9 | MINVALUE 1 10 | MAXVALUE 9223372036854775807 11 | START 1 12 | CACHE 1; 13 | 14 | CREATE SEQUENCE panier_axe_id_panier_axe 15 | INCREMENT 1 16 | MINVALUE 1 17 | MAXVALUE 9223372036854775807 18 | START 1 19 | CACHE 1; 20 | 21 | -- Tables du panier 22 | 23 | CREATE TABLE panier_dir ( 24 | id_panier_dir serial NOT NULL, 25 | id_parent integer, 26 | lib_dir text, 27 | CONSTRAINT pk_panier_dir PRIMARY KEY (id_panier_dir )); 28 | 29 | CREATE TABLE panier_axe ( 30 | id_panier_dir integer NOT NULL, 31 | lib_axe text NOT NULL, 32 | id_panier_axe serial NOT NULL, 33 | lib_comment text, 34 | CONSTRAINT pk_panier_axe PRIMARY KEY (id_panier_axe ), 35 | CONSTRAINT fk_panier_axe FOREIGN KEY (id_panier_dir) 36 | REFERENCES panier_dir (id_panier_dir)); 37 | 38 | CREATE TABLE panier_ligne ( 39 | exercice date NOT NULL, 40 | id_panier_axe integer NOT NULL, 41 | id_ligne integer NOT NULL, 42 | CONSTRAINT fk_panier_ligne_axe FOREIGN KEY (id_panier_axe) 43 | REFERENCES panier_axe (id_panier_axe), 44 | CONSTRAINT fk_panier_ligne_cloture FOREIGN KEY (exercice) 45 | REFERENCES exercice (date_cloture)); -------------------------------------------------------------------------------- /src/testeur/SQL/VUEPANIER.sql: -------------------------------------------------------------------------------- 1 | 2 | 3 | SELECT d.lib_dir AS "Dossier", a.lib_axe AS "Libellé axe", ''::date AS "Exercice", t.code_jrnal AS "Code Journal", t.lib_jrnal AS "Journal", t.num_ecr AS "Numéro Ecriture", t.date_cpt AS "Date comptable", ltrim(t.num_cpte_gen, '0'::text) AS "Numéro Compte", t.lib_cpte_gen AS "Libellé Compte", t.num_cpt_aux AS "Numéro Compte auxiliaire", t.lib_cpt_aux AS "Libellé Compte auxiliaire", 4 | t.num_cpte_gen||COALESCE('-'||t.num_cpt_aux,'') AS "Numéro Compte Gén-Aux", t.lib_cpte_gen||COALESCE('-'||t.lib_cpt_aux,'') AS "Libellé Compte Gén-Aux", 5 | t.num_piece AS "Numéro Pièce", t.date_piece AS "Date Pièce", t.lib_ecriture AS "Libellé", t.mtn_debit AS "Débit", t.mtn_credit AS "Crédit", t.code_lettrage AS "Lettrage", t.date_lettrage AS "Date Lettrage", t.valid_date AS "Date Validation", t.mtn_devise AS "Montant Devise", t.idevise AS "Devise", 6 | CASE 7 | WHEN t.ecr_type = 1 OR t.ecr_type = 11 THEN 'Clôture'::text 8 | WHEN t.ecr_type = 2 OR t.ecr_type = 12 THEN 'A. Nouveau'::text 9 | ELSE ''::text 10 | END AS "Type écriture", 11 | CASE 12 | WHEN t.ecr_type = 11 OR t.ecr_type = 12 THEN 'Générée'::text 13 | ELSE ''::text 14 | END AS "Générée lecode", a.id_panier_dir AS "ID_DIR", a.id_panier_axe AS "ID_AXE", p.id_ligne AS "ID_LIGNE" 15 | FROM panier_axe a 16 | JOIN panier_dir d ON d.id_panier_dir = a.id_panier_dir 17 | JOIN panier_ligne p ON p.id_panier_axe = a.id_panier_axe 18 | JOIN fec_ t ON p.id_ligne = t.id_ligne AND p.exercice = ''::date 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Test-Compta-Demat 2 | ================= 3 | 4 | Copyright 2014 Direction Générale des Finances Publiques - France 5 | 6 | Ce logiciel permet de contrôler le respect des normes des fichiers d'écritures comptables (FEC) conformément aux dispositions de l'article A.47 A-1 du livre des procédures fiscales. 7 | 8 | Ce logiciel est régi par la licence CeCILL V2.1 soumise au droit français et 9 | respectant les principes de diffusion des logiciels libres. Vous pouvez 10 | utiliser, modifier et/ou redistribuer ce programme sous les conditions 11 | de la licence CeCILL V2.1 telle que diffusée par le CEA, le CNRS et l'INRIA 12 | sur le site "http://www.cecill.info". 13 | 14 | Récupération des sources du programme 15 | ===================================== 16 | Pour les visualiser se rendre dans le dossier src/. 17 | Les sources utilisées sont disponibles pour adaptation sur des environnements différents. 18 | Pour cela, cloner le dépôt git (cf doc de git). 19 | 20 | Récupération des distributions Windows 21 | ===================================== 22 | Le programme est disponible sous la forme d'une distribution exécutable livrée dans une archive autoextractive. 23 | 24 | Version windows 32 bits 25 | ----------------------------------------------------------- 26 | Cliquer sur release pour voir les exécutables windows 27 | puis cliquer sur le bouton vert qui correspond à la version windows (x86.exe) pour le télécharger. 28 | 29 | Version spécifique pour windows 64 bits : 30 | ------------------------------------------ 31 | Cliquer sur release pour voir les exécutables windows 32 | puis cliquer sur le bouton vert qui correspond à la version windows en 64 bits (x86_64.exe) pour le télécharger. 33 | 34 | Documentations 35 | ============ 36 | voir le contenu du dossier doc : 37 | pour visualiser un pdf, il faut le télécharger (cliquer sur View Raw) puis ouvrir le fichier téléchargé. 38 | 39 | 40 | -------------------------------------------------------------------------------- /src/testeur/SQL/VUES_FECCOM.sql: -------------------------------------------------------------------------------- 1 | -- attention syntaxe : 2 | -- fichier lu à 3 endroits dans le code source, syntaxe strict obligatoire 3 | 4 | DROP VIEW IF EXISTS vue_journal_; 5 | 6 | -- modif 27/06/2014 : concaténation cpt gén(sans enlever les 0) - cpt aux 7 | CREATE OR REPLACE VIEW vue_journal_ AS 8 | SELECT t.id_ligne AS "ID", 9 | t.code_jrnal AS "Code Journal", 10 | t.lib_jrnal AS "Journal", 11 | t.num_ecr AS "Numéro Ecriture", 12 | t.date_cpt AS "Date comptable", 13 | ltrim(t.num_cpte_gen, 14 | '0'::text) AS "Numéro Compte", 15 | t.lib_cpte_gen AS "Libellé Compte", 16 | t.num_cpte_gen||COALESCE('-'||t.num_cpt_aux,'') AS "Numéro Compte Gén-Aux", 17 | t.lib_cpte_gen||COALESCE('-'||t.lib_cpt_aux,'') AS "Libellé Compte Gén-Aux", 18 | t.mtn_debit AS "Débit", 19 | t.mtn_credit AS "Crédit", 20 | t.lib_ecriture AS "Libellé", 21 | t.date_piece AS "Date Pièce", 22 | t.num_piece AS "Numéro Pièce", 23 | t.code_lettrage AS "Lettrage", 24 | t.num_cpt_aux AS "Numéro Compte auxiliaire", 25 | t.lib_cpt_aux AS "Libellé Compte auxiliaire", 26 | CASE 27 | WHEN t.ecr_type = 1 OR t.ecr_type = 11 THEN 'Clôture'::text 28 | WHEN t.ecr_type = 2 OR t.ecr_type = 12 THEN 'A. Nouveau'::text 29 | ELSE ''::text 30 | END AS "Type écriture", 31 | CASE 32 | WHEN t.ecr_type = 11 OR t.ecr_type = 12 THEN 'Générée'::text 33 | ELSE ''::text 34 | END AS "Générée lecode", 35 | t.date_lettrage AS "Date Lettrage", 36 | t.valid_date AS "Date Validation", 37 | t.mtn_devise AS "Montant Devise", 38 | t.idevise AS "Devise", 39 | CASE 40 | WHEN t.alto2_taux_tva > 0::numeric THEN 'Créditeur' 41 | WHEN t.alto2_taux_tva < 0::numeric THEN 'Débiteur' 42 | ELSE 'Nul' 43 | END AS "Sens TVA", 44 | -- 31/07/2015 : ajout de la colonne TVA type 45 | t.tva_type AS "TVA type", 46 | abs(t.alto2_taux_tva) AS "Taux TVA" 47 | 48 | FROM fec_ t 49 | WHERE ((ecr_type != 11) AND (ecr_type != 12)); 50 | -------------------------------------------------------------------------------- /src/testeur/SQL/VUES_FECBAT.sql: -------------------------------------------------------------------------------- 1 | -- attention syntaxe : 2 | -- fichier lu à 3 endroits dans le code source, syntaxe strict obligatoire 3 | 4 | 5 | 6 | 7 | DROP VIEW IF EXISTS vue_journal_; 8 | 9 | -- modif 27/06/2014 : concaténation cpt gén(sans enlever les 0) - cpt aux 10 | CREATE OR REPLACE VIEW vue_journal_ AS 11 | SELECT t.id_ligne AS "ID", 12 | t.code_jrnal AS "Code Journal", 13 | t.lib_jrnal AS "Journal", 14 | t.num_ecr AS "Numéro Ecriture", 15 | t.date_cpt AS "Date comptable", 16 | ltrim(t.num_cpte_gen,'0'::text) AS "Numéro Compte", 17 | t.lib_cpte_gen AS "Libellé Compte", 18 | t.num_cpte_gen||COALESCE('-'||t.num_cpt_aux,'') AS "Numéro Compte Gén-Aux", 19 | t.lib_cpte_gen||COALESCE('-'||t.lib_cpt_aux,'') AS "Libellé Compte Gén-Aux", 20 | t.mtn_debit AS "Débit", 21 | t.mtn_credit AS "Crédit", 22 | t.lib_ecriture AS "Libellé", 23 | t.date_piece AS "Date Pièce", 24 | t.num_piece AS "Numéro Pièce", 25 | t.code_lettrage AS "Lettrage", 26 | t.num_cpt_aux AS "Numéro Compte auxiliaire", 27 | t.lib_cpt_aux AS "Libellé Compte auxiliaire", 28 | CASE 29 | WHEN t.ecr_type = 1 OR t.ecr_type = 11 THEN 'Clôture'::text 30 | WHEN t.ecr_type = 2 OR t.ecr_type = 12 THEN 'A. Nouveau'::text 31 | ELSE ''::text 32 | END AS "Type écriture", 33 | CASE 34 | WHEN t.ecr_type = 11 OR t.ecr_type = 12 THEN 'Générée'::text 35 | ELSE ''::text 36 | END AS "Générée lecode", 37 | t.date_lettrage AS "Date Lettrage", 38 | t.valid_date AS "Date Validation", 39 | t.mtn_devise AS "Montant Devise", 40 | t.idevise AS "Devise", 41 | CASE 42 | WHEN t.alto2_taux_tva > 0::numeric THEN 'Créditeur' 43 | WHEN t.alto2_taux_tva < 0::numeric THEN 'Débiteur' 44 | ELSE 'Nul' 45 | END AS "Sens TVA", 46 | -- 31/07/2015 : ajout de la colonne TVA type 47 | t.tva_type AS "TVA type", 48 | abs(t.alto2_taux_tva) AS "Taux TVA" 49 | 50 | FROM fec_ t 51 | WHERE ((ecr_type != 11) AND (ecr_type != 12)); 52 | -------------------------------------------------------------------------------- /src/testeur/SQL/VUES_FECBIC.sql: -------------------------------------------------------------------------------- 1 | -- attention syntaxe : 2 | -- fichier lu à 3 endroits dans le code source, syntaxe strict obligatoire 3 | 4 | 5 | 6 | 7 | DROP VIEW IF EXISTS vue_journal_; 8 | 9 | -- modif 27/06/2014 : concaténation cpt gén(sans enlever les 0) - cpt aux 10 | CREATE OR REPLACE VIEW vue_journal_ AS 11 | SELECT t.id_ligne AS "ID", 12 | t.code_jrnal AS "Code Journal", 13 | t.lib_jrnal AS "Journal", 14 | t.num_ecr AS "Numéro Ecriture", 15 | t.date_cpt AS "Date comptable", 16 | ltrim(t.num_cpte_gen,'0'::text) AS "Numéro Compte", 17 | t.lib_cpte_gen AS "Libellé Compte", 18 | t.num_cpte_gen||COALESCE('-'||t.num_cpt_aux,'') AS "Numéro Compte Gén-Aux", 19 | t.lib_cpte_gen||COALESCE('-'||t.lib_cpt_aux,'') AS "Libellé Compte Gén-Aux", 20 | t.mtn_debit AS "Débit", 21 | t.mtn_credit AS "Crédit", 22 | t.lib_ecriture AS "Libellé", 23 | t.date_piece AS "Date Pièce", 24 | t.num_piece AS "Numéro Pièce", 25 | t.code_lettrage AS "Lettrage", 26 | t.num_cpt_aux AS "Numéro Compte auxiliaire", 27 | t.lib_cpt_aux AS "Libellé Compte auxiliaire", 28 | CASE 29 | WHEN t.ecr_type = 1 OR t.ecr_type = 11 THEN 'Clôture'::text 30 | WHEN t.ecr_type = 2 OR t.ecr_type = 12 THEN 'A. Nouveau'::text 31 | ELSE ''::text 32 | END AS "Type écriture", 33 | CASE 34 | WHEN t.ecr_type = 11 OR t.ecr_type = 12 THEN 'Générée'::text 35 | ELSE ''::text 36 | END AS "Générée lecode", 37 | t.date_lettrage AS "Date Lettrage", 38 | t.valid_date AS "Date Validation", 39 | t.mtn_devise AS "Montant Devise", 40 | t.idevise AS "Devise", 41 | CASE 42 | WHEN t.alto2_taux_tva > 0::numeric THEN 'Créditeur' 43 | WHEN t.alto2_taux_tva < 0::numeric THEN 'Débiteur' 44 | ELSE 'Nul' 45 | END AS "Sens TVA", 46 | -- 31/07/2015 : ajout de la colonne TVA type 47 | t.tva_type AS "TVA type", 48 | abs(t.alto2_taux_tva) AS "Taux TVA" 49 | 50 | FROM fec_ t 51 | WHERE ((ecr_type != 11) AND (ecr_type != 12)); 52 | -------------------------------------------------------------------------------- /src/testeur/alto2_testtype.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | 3 | #Copyright (C) 2014 Direction Generale des Finances Publiques 4 | # 5 | #This software is governed by the CeCILL license under French law and 6 | #abiding by the rules of distribution of free software. You can use, 7 | #modify and/ or redistribute the software under the terms of the CeCILL 8 | #license as circulated by CEA, CNRS and INRIA at the following URL 9 | #"http://www.cecill.info". 10 | # 11 | #As a counterpart to the access to the source code and rights to copy, 12 | #modify and redistribute granted by the license, users are provided only 13 | #with a limited warranty and the software's author, the holder of the 14 | #economic rights, and the successive licensors have only limited 15 | #liability. 16 | # 17 | #In this respect, the user's attention is drawn to the risks associated 18 | #with loading, using, modifying and/or developing or reproducing the 19 | #software by the user in light of its specific status of free software, 20 | #that may mean that it is complicated to manipulate, and that also 21 | #therefore means that it is reserved for developers and experienced 22 | #professionals having in-depth computer knowledge. Users are therefore 23 | #encouraged to load and test the software's suitability as regards their 24 | #requirements in conditions enabling the security of their systems and/or 25 | #data to be ensured and, more generally, to use and operate it in the 26 | #same conditions as regards security. 27 | # 28 | #The fact that you are presently reading this means that you have had 29 | #knowledge of the CeCILL license and that you accept its terms. 30 | # 31 | #!/usr/bin/perl 32 | 33 | my $currdir = dirname( abs_path($0) ); 34 | require "$currdir/environnement_alto2.pl"; 35 | &Env_Path; 36 | our $ProgramFiles = "$ENV{ProgramFiles}"; 37 | our $ProgramData = "$ENV{ProgramData}"; 38 | 39 | require "alto2_fonctions.pl"; 40 | 41 | our $Rep_Alim_ou_Testeur = "alimentation"; 42 | our $Aorte = &aorte(); 43 | if ( $Aorte eq "t" ) { 44 | $Rep_Alim_ou_Testeur = "testeur"; 45 | } 46 | 47 | 1; -------------------------------------------------------------------------------- /src/testeur/SQL/VUES_FECBNCT.sql: -------------------------------------------------------------------------------- 1 | -- attention syntaxe : 2 | -- fichier lu à 3 endroits dans le code source, syntaxe strict obligatoire 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | DROP VIEW IF EXISTS vue_journal_; 11 | 12 | -- modif 27/06/2014 : concaténation cpt gén(sans enlever les 0) - cpt aux 13 | CREATE OR REPLACE VIEW vue_journal_ AS 14 | SELECT t.id_ligne AS "ID", 15 | t.code_jrnal AS "Code Journal", 16 | t.lib_jrnal AS "Journal", 17 | t.num_ecr AS "Numéro Ecriture", 18 | t.date_cpt AS "Date comptable", 19 | ltrim(t.num_cpte_gen,'0'::text) AS "Numéro Compte", 20 | t.lib_cpte_gen AS "Libellé Compte", 21 | t.num_cpte_gen||COALESCE('-'||t.num_cpt_aux,'') AS "Numéro Compte Gén-Aux", 22 | t.lib_cpte_gen||COALESCE('-'||t.lib_cpt_aux,'') AS "Libellé Compte Gén-Aux", 23 | t.mtn_debit AS "Débit", 24 | t.mtn_credit AS "Crédit", 25 | t.lib_ecriture AS "Libellé", 26 | t.date_piece AS "Date Pièce", 27 | t.num_piece AS "Numéro Pièce", 28 | t.code_lettrage AS "Lettrage", 29 | t.num_cpt_aux AS "Numéro Compte auxiliaire", 30 | t.lib_cpt_aux AS "Libellé Compte auxiliaire", 31 | CASE 32 | WHEN t.ecr_type = 1 OR t.ecr_type = 11 THEN 'Clôture'::text 33 | WHEN t.ecr_type = 2 OR t.ecr_type = 12 THEN 'A. Nouveau'::text 34 | ELSE ''::text 35 | END AS "Type écriture", 36 | CASE 37 | WHEN t.ecr_type = 11 OR t.ecr_type = 12 THEN 'Générée'::text 38 | ELSE ''::text 39 | END AS "Générée lecode", 40 | t.date_lettrage AS "Date Lettrage", 41 | t.valid_date AS "Date Validation", 42 | t.mtn_devise AS "Montant Devise", 43 | t.idevise AS "Devise", 44 | t.paiement_date AS "Date Règlement", 45 | t.paiement_mode as "Mode Règlement", 46 | t.prestation as "Nature Opération", 47 | t.client as "Identification Client", 48 | CASE 49 | WHEN t.alto2_taux_tva > 0::numeric THEN 'Créditeur' 50 | WHEN t.alto2_taux_tva < 0::numeric THEN 'Débiteur' 51 | ELSE 'Nul' 52 | END AS "Sens TVA", 53 | -- 31/07/2015 : ajout de la colonne TVA type 54 | t.tva_type AS "TVA type", 55 | abs(t.alto2_taux_tva) AS "Taux TVA" 56 | 57 | FROM fec_ t 58 | WHERE ((ecr_type != 11) AND (ecr_type != 12)); 59 | -------------------------------------------------------------------------------- /src/testeur/SQL/IDX_FEC.sql: -------------------------------------------------------------------------------- 1 | DROP INDEX IF EXISTS idx_cpt_date_fec_ ; 2 | DROP INDEX IF EXISTS idx_date_num_ecr_fec_; 3 | DROP INDEX IF EXISTS idx_cpt_fec_ ; 4 | DROP INDEX IF EXISTS idx_cpt_aux_fec_; 5 | DROP INDEX IF EXISTS idx_jrn_fec_; 6 | DROP INDEX IF EXISTS idx_piece_fec_; 7 | DROP INDEX IF EXISTS idx_devise_fec_; 8 | DROP INDEX IF EXISTS idx_trgm_libelle_fec_ ; 9 | DROP INDEX IF EXISTS idx_trgm_unaccent_libelle_fec_ ; 10 | 11 | commit ; 12 | 13 | -- Index sur le numéro d'écriture (nécessaire pour les jointures avec la table ecriture_) 14 | CREATE INDEX idx_date_num_ecr_fec_ ON fec_ USING btree (date_cpt, num_ecr); 15 | commit ; 16 | 17 | 18 | -- Index permettant l'affichage de l'onglet grand-livre 19 | -- RQ : "text_pattern_ops" est supprimé pour permettre les tris sur les numéros de comptes 20 | CREATE INDEX idx_cpt_date_fec_ 21 | ON fec_ 22 | USING btree 23 | (ltrim(num_cpte_gen, '0'::text), lib_cpte_gen, date_cpt); 24 | commit ; 25 | 26 | -- Index permettant les filtres sur les comptes généraux 27 | CREATE INDEX idx_cpt_fec_ ON fec_ USING btree(ltrim(num_cpte_gen, '0') text_pattern_ops, lib_cpte_gen); 28 | commit ; 29 | 30 | -- Index permettant les filtres sur les comptes auxiliaires 31 | -- modif 26/06/2014 : concaténation cpt gén(sans enlever les 0) - cpt aux 32 | CREATE INDEX idx_cpt_aux_fec_ ON fec_ USING btree ((fec_.num_cpte_gen||COALESCE('-'||fec_.num_cpt_aux,'')) text_pattern_ops, 33 | (fec_.lib_cpte_gen||COALESCE('-'||fec_.lib_cpt_aux,''))); 34 | 35 | 36 | -- Index permettant les filtres sur les journaux 37 | commit ; 38 | CREATE INDEX idx_jrn_fec_ ON fec_ USING btree(code_jrnal, lib_jrnal); 39 | -- Index permettant de retrouver une pièce 40 | commit ; 41 | CREATE INDEX idx_piece_fec_ ON fec_ USING btree(num_piece); 42 | -- Index permettant un filtre sur les devises 43 | commit ; 44 | CREATE INDEX idx_devise_fec_ ON fec_ USING btree(idevise) WHERE idevise IS NOT NULL AND idevise <> ''; 45 | 46 | -- Index permettant la recherche text sur le champ libellé d'écriture 47 | commit ; 48 | CREATE EXTENSION IF NOT EXISTS pg_trgm ; 49 | commit ; 50 | CREATE INDEX idx_trgm_libelle_fec_ ON fec_ USING gin (lib_ecriture gin_trgm_ops) ; 51 | commit ; 52 | CREATE INDEX idx_trgm_unaccent_libelle_fec_ ON fec_ USING gin (unaccent_string(lib_ecriture) gin_trgm_ops) ; -------------------------------------------------------------------------------- /src/testeur/SQL/FECBNCT.sql: -------------------------------------------------------------------------------- 1 | -- attention syntaxe : 2 | -- fichier lu à 3 endroits dans le code source, syntaxe strict obligatoire 3 | 4 | DROP TABLE IF EXISTS fec_ CASCADE; 5 | DROP INDEX IF EXISTS idx_cpt_date_fec_ ; 6 | DROP INDEX IF EXISTS idx_date_num_ecr_fec_; 7 | DROP INDEX IF EXISTS idx_num_ecr_fec_; 8 | DROP INDEX IF EXISTS idx_cpt_aux_fec_; 9 | DROP INDEX IF EXISTS idx_jrn_fec_; 10 | DROP INDEX IF EXISTS idx_piece_fec_; 11 | -- DROP INDEX IF EXISTS idx_debit_fec_; 12 | -- DROP INDEX IF EXISTS idx_credit_fec_; 13 | DROP INDEX IF EXISTS idx_cpt_debit_fec_; 14 | DROP INDEX IF EXISTS idx_cpt_credit_fec_; 15 | 16 | -- lib_jrnal text default 'inconnu', 17 | 18 | CREATE TABLE fec_ ( -- La clôture est au format AAAAMMJJ 19 | id_ligne serial NOT NULL, -- Numéro généré par le système 20 | code_jrnal text DEFAULT '', -- Champ "JournalCode" de l'arrêté CF1:OBLIGATOIRE 21 | lib_jrnal text DEFAULT '', -- Champ "JournalLib" de l'arrêté 22 | num_ecr text NOT NULL, -- Champ "EcritureNum" de l'arrêté (Champ Obligatoire) 23 | date_cpt date NOT NULL, -- Champ "EcritureDate" de l'arrêté (Champ Obligatoire) 24 | num_cpte_gen text NOT NULL, -- Champ "CompteNum" de l'arrêté (Champ Obligatoire, les 3 premiers caractères doivent être numériques) 25 | lib_cpte_gen text NOT NULL , -- Champ "CompteLib" de l'arrêté 26 | num_cpt_aux text DEFAULT '', -- Champ "CompteAuxNum" de l'arrêté 27 | lib_cpt_aux text DEFAULT '', -- Champ "CompteAuxLib" de l'arrêté 28 | num_piece text DEFAULT '', -- Champ "PièceRef" de l'arrêté 29 | date_piece date ,-- Champ "PièceDate" de l'arrêté 30 | lib_ecriture text NOT NULL , -- Champ "EcritureLib" de l'arrêté 31 | mtn_debit numeric NOT NULL, -- Champ "Debit" de l'arrêté (Champ Obligatoire) 32 | mtn_credit numeric NOT NULL, -- Champ "Credit" de l'arrêté (Champ Obligatoire) 33 | ecr_type int DEFAULT 0 , -- Champ "Résultat" de l'arrêté. Ce champ vaut 1 si c'est une écriture de résultat et 0 sinon. 34 | code_lettrage text, -- Champ "EcritureLet" de l'arrêté 35 | date_lettrage date, 36 | valid_date date , -- Champ ValidDate " de l'arrêté CF1:OBLIGATOIRE 37 | idevise text DEFAULT '', --Champ idevise arrêté 38 | mtn_devise numeric, --Champ montantdevise arrêté 39 | paiement_date date , -- Champ "DateRglt" 40 | paiement_mode text DEFAULT '', -- Champ "ModeRglt" 41 | prestation text DEFAULT '', -- Champ "Natpresta" ou "NatOp" 42 | client text DEFAULT '', -- Champ "idClient" 43 | 44 | tva_type text DEFAULT '', -- champs calculé 45 | alto2_taux_tva numeric DEFAULT 0 ,-- champs calculé 46 | CONSTRAINT pk_fec_ PRIMARY KEY (id_ligne) 47 | ); 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /src/testeur/SQL/FECBAT.sql: -------------------------------------------------------------------------------- 1 | -- attention syntaxe : 2 | -- fichier lu à 3 endroits dans le code source, syntaxe strict obligatoire 3 | 4 | DROP TABLE IF EXISTS fec_ CASCADE; 5 | DROP INDEX IF EXISTS idx_cpt_date_fec_ ; 6 | DROP INDEX IF EXISTS idx_date_num_ecr_fec_; 7 | DROP INDEX IF EXISTS idx_num_ecr_fec_; 8 | DROP INDEX IF EXISTS idx_cpt_aux_fec_; 9 | DROP INDEX IF EXISTS idx_jrn_fec_; 10 | DROP INDEX IF EXISTS idx_piece_fec_; 11 | -- DROP INDEX IF EXISTS idx_debit_fec_; 12 | -- DROP INDEX IF EXISTS idx_credit_fec_; 13 | DROP INDEX IF EXISTS idx_cpt_debit_fec_; 14 | DROP INDEX IF EXISTS idx_cpt_credit_fec_; 15 | 16 | -- lib_jrnal text default 'inconnu', 17 | 18 | CREATE TABLE fec_ ( -- La clôture est au format AAAAMMJJ 19 | id_ligne serial NOT NULL, -- Numéro généré par le système 20 | code_jrnal text DEFAULT '', -- Champ "JournalCode" de l'arrêté CF1:OBLIGATOIRE 21 | lib_jrnal text DEFAULT '', -- Champ "JournalLib" de l'arrêté 22 | num_ecr text NOT NULL, -- Champ "EcritureNum" de l'arrêté (Champ Obligatoire) 23 | date_cpt date NOT NULL, -- Champ "EcritureDate" de l'arrêté (Champ Obligatoire) 24 | num_cpte_gen text NOT NULL , -- Champ "CompteNum" de l'arrêté (Champ Obligatoire, les 3 premiers caractères doivent être numériques) 25 | lib_cpte_gen text NOT NULL , -- Champ "CompteLib" de l'arrêté 26 | num_cpt_aux text DEFAULT '', -- Champ "CompteAuxNum" de l'arrêté 27 | lib_cpt_aux text DEFAULT '', -- Champ "CompteAuxLib" de l'arrêté 28 | num_piece text DEFAULT '', -- Champ "PièceRef" de l'arrêté 29 | date_piece date, -- Champ "PièceDate" de l'arrêté 30 | lib_ecriture text NOT NULL , -- Champ "EcritureLib" de l'arrêté 31 | mtn_debit numeric NOT NULL, -- Champ "Debit" de l'arrêté (Champ Obligatoire) 32 | mtn_credit numeric NOT NULL, -- Champ "Credit" de l'arrêté (Champ Obligatoire) 33 | ecr_type int DEFAULT 0 , -- Champ "Résultat" de l'arrêté. Ce champ vaut 1 si c'est une écriture de résultat et 0 sinon. 34 | code_lettrage text, -- Champ "EcritureLet" de l'arrêté 35 | date_lettrage date, 36 | valid_date date, -- Champ ValidDate " de l'arrêté CF1:OBLIGATOIRE 37 | idevise text DEFAULT '', --Champ idevise arrêté 38 | mtn_devise numeric, --Champ montantdevise arrêté 39 | paiement_date date , -- Champ "DateRglt" 40 | paiement_mode text DEFAULT '', -- Champ "ModeRglt" 41 | prestation text DEFAULT '', -- Champ "Natpresta" ou "NatOp" 42 | -- client text DEFAULT '', -- Champ "idClient" 43 | 44 | tva_type text DEFAULT '', -- champs calculé 45 | alto2_taux_tva numeric DEFAULT 0, -- champs calculé 46 | CONSTRAINT pk_fec_ PRIMARY KEY (id_ligne) 47 | ); 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /src/testeur/SQL/FECBIC.sql: -------------------------------------------------------------------------------- 1 | -- attention syntaxe : 2 | -- fichier lu à 3 endroits dans le code source, syntaxe strict obligatoire 3 | 4 | DROP TABLE IF EXISTS fec_ CASCADE; 5 | DROP INDEX IF EXISTS idx_cpt_date_fec_ ; 6 | DROP INDEX IF EXISTS idx_date_num_ecr_fec_; 7 | DROP INDEX IF EXISTS idx_num_ecr_fec_; 8 | DROP INDEX IF EXISTS idx_cpt_aux_fec_; 9 | DROP INDEX IF EXISTS idx_jrn_fec_; 10 | DROP INDEX IF EXISTS idx_piece_fec_; 11 | -- DROP INDEX IF EXISTS idx_debit_fec_; 12 | -- DROP INDEX IF EXISTS idx_credit_fec_; 13 | DROP INDEX IF EXISTS idx_cpt_debit_fec_; 14 | DROP INDEX IF EXISTS idx_cpt_credit_fec_; 15 | 16 | -- lib_jrnal text default 'inconnu', 17 | 18 | CREATE TABLE fec_ ( -- La clôture est au format AAAAMMJJ 19 | id_ligne serial NOT NULL , -- Numéro généré par le système 20 | code_jrnal text DEFAULT '' , -- Champ "JournalCode" de l'arrêté CF1:OBLIGATOIRE 21 | lib_jrnal text DEFAULT '' , -- Champ "JournalLib" de l'arrêté 22 | num_ecr text NOT NULL , -- Champ "EcritureNum" de l'arrêté (Champ Obligatoire) 23 | date_cpt date NOT NULL , -- Champ "EcritureDate" de l'arrêté (Champ Obligatoire) 24 | num_cpte_gen text NOT NULL , -- Champ "CompteNum" de l'arrêté (Champ Obligatoire, les 3 premiers caractères doivent être numériques) 25 | lib_cpte_gen text NOT NULL , -- Champ "CompteLib" de l'arrêté modifie 2019 RB 26 | num_cpt_aux text DEFAULT '' , -- Champ "CompteAuxNum" de l'arrêté 27 | lib_cpt_aux text DEFAULT '' , -- Champ "CompteAuxLib" de l'arrêté 28 | num_piece text DEFAULT '' , -- Champ "PièceRef" de l'arrêté 29 | date_piece date , -- Champ "PièceDate" de l'arrêté 30 | lib_ecriture text NOT NULL , -- Champ "EcritureLib" de l'arrêté modifie 2019 RB CF1:OBLIGATOIRE 31 | mtn_debit numeric NOT NULL , -- Champ "Debit" de l'arrêté (Champ Obligatoire) 32 | mtn_credit numeric NOT NULL , -- Champ "Credit" de l'arrêté (Champ Obligatoire) 33 | ecr_type int DEFAULT 0 , -- Champ "Résultat" de l'arrêté. Ce champ vaut 1 si c'est une écriture de résultat et 0 sinon. 34 | code_lettrage text , -- Champ "EcritureLet" de l'arrêté 35 | date_lettrage date , 36 | valid_date date , -- Champ ValidDate " de l'arrêté CF1:OBLIGATOIRE 37 | idevise text DEFAULT '', --Champ idevise arrêté 38 | mtn_devise numeric , --Champ montantdevise arrêté 39 | --paiement_date date, -- Champ "DatePaiemt" 40 | --paiement_mode text DEFAULT '', -- Champ "ModePaiemt" 41 | --prestation text DEFAULT '', -- Champ "Natpresta" ou "NatOp" 42 | --client text DEFAULT '', -- Champ "Client" 43 | 44 | tva_type text DEFAULT '', -- champs calculé 45 | alto2_taux_tva numeric DEFAULT 0 , -- champs calculé 46 | CONSTRAINT pk_fec_ PRIMARY KEY (id_ligne) 47 | ); 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /src/testeur/SQL/FECCOM.sql: -------------------------------------------------------------------------------- 1 | -- attention syntaxe : 2 | -- fichier lu à 3 endroits dans le code source, syntaxe strict obligatoire 3 | 4 | DROP TABLE IF EXISTS fec_ CASCADE; 5 | DROP INDEX IF EXISTS idx_cpt_date_fec_ ; 6 | DROP INDEX IF EXISTS idx_date_num_ecr_fec_; 7 | DROP INDEX IF EXISTS idx_num_ecr_fec_; 8 | DROP INDEX IF EXISTS idx_cpt_aux_fec_; 9 | DROP INDEX IF EXISTS idx_jrn_fec_; 10 | DROP INDEX IF EXISTS idx_piece_fec_; 11 | -- DROP INDEX IF EXISTS idx_debit_fec_; 12 | -- DROP INDEX IF EXISTS idx_credit_fec_; 13 | DROP INDEX IF EXISTS idx_cpt_debit_fec_; 14 | DROP INDEX IF EXISTS idx_cpt_credit_fec_; 15 | -- lib_jrnal text default 'inconnu', 16 | 17 | CREATE TABLE fec_ ( -- La clôture est au format AAAAMMJJ 18 | id_ligne serial NOT NULL, -- Numéro généré par le système 19 | code_jrnal text DEFAULT '', -- Champ "JournalCode" de l'arrêté CF1:OBLIGATOIRE 20 | lib_jrnal text DEFAULT '', -- Champ "JournalLib" de l'arrêté 21 | num_ecr text NOT NULL, -- Champ "EcritureNum" de l'arrêté (Champ Obligatoire) 22 | date_cpt date NOT NULL, -- Champ "EcritureDate" de l'arrêté (Champ Obligatoire) 23 | num_cpte_gen text NOT NULL, -- Champ "CompteNum" de l'arrêté (Champ Obligatoire, les 3 premiers caractères doivent être numériques) 24 | lib_cpte_gen text NOT NULL, -- Champ "CompteLib" de l'arrêté modifie RB 2020 25 | num_cpt_aux text DEFAULT '', -- Champ "CompteAuxNum" de l'arrêté 26 | lib_cpt_aux text DEFAULT '', -- Champ "CompteAuxLib" de l'arrêté 27 | num_piece text DEFAULT '', -- Champ "PièceRef" de l'arrêté 28 | date_piece date, -- Champ "PièceDate" de l'arrêté 29 | lib_ecriture text NOT NULL, -- Champ "EcritureLib" de l'arrêté modifie RB 2020 CF1:OBLIGATOIRE 30 | mtn_debit numeric NOT NULL, -- Champ "Debit" de l'arrêté (Champ Obligatoire) 31 | mtn_credit numeric NOT NULL, -- Champ "Credit" de l'arrêté (Champ Obligatoire) 32 | ecr_type int DEFAULT 0 , -- Champ "Résultat" de l'arrêté. Ce champ vaut 1 si c'est une écriture de résultat et 0 sinon. 33 | code_lettrage text, -- Champ "EcritureLet" de l'arrêté 34 | date_lettrage date, 35 | valid_date date, -- Champ ValidDate " de l'arrêté CF1:OBLIGATOIRE 36 | idevise text DEFAULT '', --Champ idevise arrêté 37 | mtn_devise numeric, --Champ montantdevise arrêté 38 | --paiement_date date, -- Champ "DatePaiemt" 39 | --paiement_mode text DEFAULT '', -- Champ "ModePaiemt" 40 | --prestation text DEFAULT '', -- Champ "Natpresta" ou "NatOp" 41 | --client text DEFAULT '', -- Champ "Client" 42 | 43 | tva_type text DEFAULT '', -- champs calculé 44 | alto2_taux_tva numeric DEFAULT 0 ,-- champs calculé 45 | CONSTRAINT pk_fec_ PRIMARY KEY (id_ligne) 46 | ); 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /src/testeur/SQL/VUES_BALANCE_TVA.sql: -------------------------------------------------------------------------------- 1 | DROP VIEW IF EXISTS vue_balance_tva_; 2 | 3 | COMMIT; 4 | 5 | CREATE OR REPLACE VIEW vue_balance_tva_ AS 6 | SELECT ltrim(balance_tva_.ecr_cte_lig_gen_nid, '0'::text) AS "Numéro Compte", 7 | balance_tva_.ecr_cte_lig_gen_lib AS "Libellé Compte", 8 | balance_tva_.num_cpt_aux AS "Numéro Compte auxiliaire", 9 | balance_tva_.lib_cpt_aux AS "Libellé Compte auxiliaire", 10 | balance_tva_.ecr_cte_lig_gen_nid || COALESCE('-'::text || balance_tva_.num_cpt_aux, ''::text) AS "Numéro Compte Gén-Aux", 11 | balance_tva_.ecr_cte_lig_gen_lib || COALESCE('-'::text || balance_tva_.lib_cpt_aux, ''::text) AS "Libellé Compte Gén-Aux", 12 | balance_tva_.mass_av_clo_deb AS "Débit (av. clôture)", 13 | balance_tva_.mass_av_clo_cre AS "Crédit (av. clôture)", 14 | balance_tva_.sup_m200 AS "TVA débitrice > 20.0%", 15 | balance_tva_._m200 AS "TVA débitrice 20.0%", 16 | balance_tva_._m200_m196 AS "TVA débitrice 19.6% - 20.0%", 17 | balance_tva_._m196 AS "TVA débitrice 19.6%", 18 | balance_tva_._m196_m100 AS "TVA débitrice 10.0% - 19.6%", 19 | balance_tva_._m100 AS "TVA débitrice 10.0%", 20 | balance_tva_._m100_m70 AS "TVA débitrice 7.0% - 10.0%", 21 | balance_tva_._m70 AS "TVA débitrice 7.0%", 22 | balance_tva_._m70_m55 AS "TVA débitrice 5.5% - 7.0%", 23 | balance_tva_._m55 AS "TVA débitrice 5.5%", 24 | balance_tva_._m55_m21 AS "TVA débitrice 2.1% - 5.5%", 25 | balance_tva_._m21 AS "TVA débitrice 2.1%", 26 | balance_tva_._m21_00 AS "TVA débitrice -0.0% - 2.1%", 27 | balance_tva_._00 AS "TVA nulle", 28 | balance_tva_._00_21 AS "TVA créditrice 0.0% - 2.1%", 29 | balance_tva_._21 AS "TVA créditrice 2.1%", 30 | balance_tva_._21_55 AS "TVA créditrice 2.1% - 5.5%", 31 | balance_tva_._55 AS "TVA créditrice 5.5%", 32 | balance_tva_._55_70 AS "TVA créditrice 5.5% - 7.0%", 33 | balance_tva_._70 AS "TVA créditrice 7.0%", 34 | balance_tva_._70_100 AS "TVA créditrice 7.0% - 10.0%", 35 | balance_tva_._100 AS "TVA créditrice 10.0%", 36 | balance_tva_._100_196 AS "TVA créditrice 10.0% - 19.6%", 37 | balance_tva_._196 AS "TVA créditrice 19.6%", 38 | balance_tva_._196_200 AS "TVA créditrice 19.6% - 20.0%", 39 | balance_tva_._200 AS "TVA créditrice 20.0%", 40 | balance_tva_.sup_200 AS "TVA créditrice > 20.0%", 41 | balance_tva_._00 AS "TVA 0.0%", 42 | balance_tva_._m21_00 + balance_tva_._00_21 AS "TVA 0.0% - 2.1%", 43 | balance_tva_._m21 + balance_tva_._21 AS "TVA 2.1%", 44 | balance_tva_._m55_m21 + balance_tva_._21_55 AS "TVA 2.1% - 5.5%", 45 | balance_tva_._m55 + balance_tva_._55 AS "TVA 5.5%", 46 | balance_tva_._m70_m55 + balance_tva_._55_70 AS "TVA 5.5% - 7.0%", 47 | balance_tva_._m70 + balance_tva_._70 AS "TVA 7.0%", 48 | balance_tva_._m100_m70 + balance_tva_._70_100 AS "TVA 7.0% - 10.0%", 49 | balance_tva_._m100 + balance_tva_._100 AS "TVA 10.0%", 50 | balance_tva_._m196_m100 + balance_tva_._100_196 AS "TVA 10.0% - 19.6%", 51 | balance_tva_._m196 + balance_tva_._196 AS "TVA 19.6%", 52 | balance_tva_._m200_m196 + balance_tva_._196_200 AS "TVA 19.6% - 20.0%", 53 | balance_tva_._m200 + balance_tva_._200 AS "TVA 20.0%", 54 | balance_tva_.sup_m200 + balance_tva_.sup_200 AS "TVA > 20.0%", 55 | balance_tva_._inv21 AS "Inversion 2.1%", 56 | balance_tva_._inv55 AS "Inversion 5.5%", 57 | balance_tva_._inv70 AS "Inversion 7.0%", 58 | balance_tva_._inv100 AS "Inversion 10.0%", 59 | balance_tva_._inv196 AS "Inversion 19.6%", 60 | balance_tva_._inv200 AS "Inversion 20.0%" 61 | FROM balance_tva_; 62 | 63 | COMMIT; 64 | 65 | -- La ligne existe déjà : cas des dossiers existants ---- 66 | UPDATE PARAMETRE set valeur='true' where id='BalanceTVAInit'; 67 | COMMIT; 68 | 69 | --- La ligne n'existe pas : cas des nouveaux dossiers --------------- 70 | INSERT INTO parametre VALUES ('BalanceTVAInit', 'true'); 71 | COMMIT; 72 | 73 | ----- La ligne existe déjà ---------- 74 | UPDATE PARAMETRE set valeur='2.1#5.5#7.0#10.0#19.6#20.0#' where id='TxTVA'; 75 | COMMIT; 76 | 77 | ----- La ligne n'existe pas ---------- 78 | INSERT INTO parametre VALUES ('TxTVA', '2.1#5.5#7.0#10.0#19.6#20.0#'); 79 | COMMIT; -------------------------------------------------------------------------------- /src/testeur/SQL/BALANCE.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE IF EXISTS balance_ CASCADE; 2 | 3 | commit ; 4 | 5 | -- Tables balance 6 | CREATE TABLE balance_ ( 7 | id_balance serial NOT NULL, 8 | ecr_cte_lig_gen_lib text , 9 | ecr_cte_lig_gen_nid text NOT NULL, 10 | num_cpt_aux text, 11 | lib_cpt_aux text, -- Ligne ajoutée 12 | sld_an_deb numeric, 13 | sld_an_cre numeric, 14 | mass_av_clo_deb numeric NOT NULL, 15 | mass_av_clo_cre numeric NOT NULL, 16 | mass_ap_clo_deb numeric NOT NULL, 17 | mass_ap_clo_cre numeric NOT NULL, 18 | sld_av_clo_mtn_deb numeric NOT NULL, 19 | sld_av_clo_mtn_cre numeric NOT NULL, 20 | sld_ap_clo_mtn_deb numeric NOT NULL, 21 | sld_ap_clo_mtn_cre numeric NOT NULL, 22 | nbr_lign integer NOT NULL, 23 | avr_lign_ecr numeric NOT NULL, 24 | max_lign numeric NOT NULL, 25 | CONSTRAINT pk_balance_ PRIMARY KEY (id_balance)) ; 26 | commit ; 27 | 28 | -- Insertion des données dans la table balance 29 | INSERT INTO balance_ ( 30 | ecr_cte_lig_gen_nid, ecr_cte_lig_gen_lib, num_cpt_aux, lib_cpt_aux, sld_an_deb, sld_an_cre, mass_av_clo_deb, 31 | mass_av_clo_cre, mass_ap_clo_deb, mass_ap_clo_cre, sld_av_clo_mtn_deb, sld_av_clo_mtn_cre, sld_ap_clo_mtn_deb, 32 | sld_ap_clo_mtn_cre, nbr_lign, avr_lign_ecr, max_lign) ( 33 | 34 | SELECT num_cpte_gen, lib_cpte_gen, num_cpt_aux, lib_cpt_aux, 35 | 36 | -- Débit et crédit AN 37 | sum(CASE WHEN ((ecr_type = 2) OR (ecr_type = 12)) THEN mtn_debit ELSE 0.0 END), 38 | sum(CASE WHEN ((ecr_type = 2) OR (ecr_type = 12)) THEN mtn_credit ELSE 0.0 END), 39 | 40 | -- Masse débit et crédit avant Cloture 41 | sum(CASE WHEN ((ecr_type != 1) AND (ecr_type != 11)) THEN mtn_debit ELSE 0.0 END), 42 | sum(CASE WHEN ((ecr_type != 1) AND (ecr_type != 11)) THEN mtn_credit ELSE 0.0 END), 43 | 44 | -- Masse débit et crédit après Cloture 45 | sum(mtn_debit), sum(mtn_credit), 46 | 47 | -- Solde débit avant cloture 48 | CASE WHEN sum(CASE WHEN ((ecr_type != 1) AND (ecr_type != 11)) THEN mtn_debit ELSE 0.0 END) > sum(CASE WHEN ((ecr_type != 1) AND (ecr_type != 11)) THEN mtn_credit ELSE 0.0 END) THEN 49 | sum(CASE WHEN ((ecr_type != 1) AND (ecr_type != 11)) THEN mtn_debit ELSE 0.0 END) - sum(CASE WHEN ((ecr_type != 1) AND (ecr_type != 11)) THEN mtn_credit ELSE 0.0 END) ELSE 0.0 END, 50 | 51 | -- Solde crédit avant cloture 52 | CASE WHEN sum(CASE WHEN ((ecr_type != 1) AND (ecr_type != 11)) THEN mtn_debit ELSE 0.0 END) < sum(CASE WHEN ((ecr_type != 1) AND (ecr_type != 11)) THEN mtn_credit ELSE 0.0 END) THEN 53 | sum(CASE WHEN ((ecr_type != 1) AND (ecr_type != 11)) THEN mtn_credit ELSE 0.0 END) - sum(CASE WHEN ((ecr_type != 1) AND (ecr_type != 11)) THEN mtn_debit ELSE 0.0 END) ELSE 0.0 END, 54 | 55 | -- Solde débit après cloture 56 | CASE WHEN sum(mtn_debit) > sum(mtn_credit) THEN sum(mtn_debit) - sum(mtn_credit) ELSE 0.0 END, 57 | 58 | -- Solde crédit après cloture 59 | CASE WHEN sum(mtn_debit) < sum(mtn_credit) THEN sum(mtn_credit) - sum(mtn_debit) ELSE 0.0 END, --COUNT(*), 60 | 61 | -- Count sauf écritures générées 62 | sum(CASE WHEN ((ecr_type != 11) AND (ecr_type != 12)) THEN 1 ELSE 0 END), 63 | 64 | -- Moyenne hors écritures générées 65 | CASE WHEN (avg(CASE WHEN ((ecr_type != 11) AND (ecr_type != 12)) THEN mtn_debit+mtn_credit ELSE NULL END)) IS NULL THEN 0.0 ELSE 66 | avg(CASE WHEN ((ecr_type != 11) AND (ecr_type != 12)) THEN mtn_debit+mtn_credit ELSE NULL END) END, 67 | 68 | -- Maximum hors écritures générées 69 | GREATEST(max(CASE WHEN ((ecr_type != 11) AND (ecr_type != 12)) THEN mtn_debit ELSE 0.0 END), max(CASE WHEN ((ecr_type != 11) AND (ecr_type != 12)) THEN mtn_credit ELSE 0.0 END)) 70 | 71 | FROM fec_ 72 | GROUP BY num_cpte_gen, lib_cpte_gen, num_cpt_aux, lib_cpt_aux); 73 | 74 | commit ; 75 | 76 | 77 | -- Mise en place des listes 78 | 79 | DROP TABLE IF EXISTS listcompte_ ; 80 | DROP TABLE IF EXISTS listcptaux_; 81 | DROP TABLE IF EXISTS listdatecomptable_; 82 | DROP TABLE IF EXISTS listdatelettrage_; 83 | DROP TABLE IF EXISTS listdatepiece_; 84 | DROP TABLE IF EXISTS listdatevalidation_; 85 | DROP TABLE IF EXISTS listjournal_ ; 86 | DROP TABLE IF EXISTS listcomptegenaux_ ; 87 | DROP TABLE IF EXISTS listdevise_ ; 88 | DROP TABLE IF EXISTS listtxtva_; 89 | -- Tables list... qui permettent d'accélérer l'affichage 90 | commit ; 91 | 92 | CREATE TABLE listcompte_ (num_cpte_gen , lib_cpte_gen ) 93 | AS 94 | ( SELECT LTRIM(ecr_cte_lig_gen_nid, '0'), ecr_cte_lig_gen_lib 95 | FROM balance_ 96 | GROUP BY ecr_cte_lig_gen_nid, ecr_cte_lig_gen_lib ); 97 | 98 | commit ; 99 | 100 | 101 | CREATE TABLE listcptaux_ (num_cpt_aux , lib_cpt_aux ) 102 | AS 103 | (SELECT num_cpt_aux , lib_cpt_aux 104 | FROM balance_ 105 | WHERE num_cpt_aux IS NOT NULL 106 | AND lib_cpt_aux IS NOT NULL 107 | AND ( num_cpt_aux != '' 108 | OR lib_cpt_aux!= '') 109 | GROUP BY num_cpt_aux ,lib_cpt_aux 110 | ORDER BY num_cpt_aux ,lib_cpt_aux ); 111 | commit ; 112 | 113 | CREATE TABLE listdatecomptable_ (date_cpt ) AS 114 | ( SELECT distinct(date_cpt) FROM fec_ ORDER BY date_cpt ); 115 | commit ; 116 | 117 | CREATE TABLE listdatelettrage_ (date_lettrage ) 118 | AS 119 | ( SELECT distinct(date_lettrage) 120 | FROM fec_ 121 | WHERE date_lettrage IS NOT NULL 122 | GROUP BY date_lettrage 123 | ORDER BY date_lettrage ); 124 | commit ; 125 | 126 | CREATE TABLE listdatepiece_ (date_piece ) AS 127 | (SELECT distinct(date_piece ) 128 | FROM fec_ 129 | WHERE date_piece IS NOT NULL 130 | GROUP BY date_piece); 131 | commit ; 132 | 133 | CREATE TABLE listdatevalidation_ (valid_date ) AS 134 | ( SELECT distinct(valid_date) 135 | FROM fec_ 136 | WHERE valid_date IS NOT NULL 137 | GROUP BY valid_date); 138 | commit ; 139 | 140 | CREATE TABLE listjournal_ (code_jrnal , lib_jrnal ) AS 141 | (SELECT code_jrnal, lib_jrnal 142 | FROM fec_ 143 | GROUP BY code_jrnal, lib_jrnal); 144 | commit ; 145 | 146 | CREATE TABLE listcomptegenaux_ ( num_cpte_gen_aux , lib_cpte_gen_aux ) AS 147 | ( SELECT "Numéro Compte Gén-Aux","Libellé Compte Gén-Aux" 148 | FROM vue_journal_ 149 | GROUP BY "Numéro Compte Gén-Aux", "Libellé Compte Gén-Aux" ); 150 | commit ; 151 | 152 | CREATE TABLE listdevise_ (devise ) AS 153 | (SELECT idevise 154 | FROM fec_ WHERE idevise IS NOT NULL AND idevise <> '' 155 | GROUP BY idevise); 156 | commit ; 157 | 158 | CREATE TABLE listtxtva_ (taux_tva ) AS 159 | (SELECT taux_tva FROM ecriture_ WHERE taux_tva IS NOT NULL GROUP BY taux_tva ORDER BY taux_tva ) ; 160 | commit ; 161 | 162 | alter table listtxtva_ add CONSTRAINT pk_listtxtva_ PRIMARY KEY (taux_tva) ; 163 | 164 | 165 | -------------------------------------------------------------------------------- /src/testeur/SQL/VUES.sql: -------------------------------------------------------------------------------- 1 | DROP VIEW IF EXISTS vue_balance_ ; 2 | DROP VIEW IF EXISTS vue_ecriture_; 3 | DROP VIEW IF EXISTS vue_ecriture_simple_; 4 | DROP VIEW IF EXISTS vue_erreur_; 5 | 6 | 7 | -- Création des vues 8 | CREATE OR REPLACE VIEW vue_balance_ AS 9 | SELECT min(balance_.id_balance) AS "ID", 10 | ltrim(balance_.ecr_cte_lig_gen_nid, '0'::text) AS "Numéro Compte", 11 | balance_.ecr_cte_lig_gen_lib AS "Libellé Compte", 12 | NULL::unknown AS "Numéro Compte auxiliaire", 13 | NULL::unknown AS "Libellé Compte auxiliaire", 14 | NULL::unknown AS "Numéro Compte Gén-Aux", 15 | NULL::unknown AS "Libellé Compte Gén-Aux", 16 | sum(balance_.sld_an_deb) AS "Débit à Nouveau", 17 | sum(balance_.sld_an_cre) AS "Crédit à Nouveau", 18 | sum(balance_.mass_av_clo_deb) AS "Débit (av. clôture)", 19 | sum(balance_.mass_av_clo_cre) AS "Crédit (av. clôture)", 20 | sum(balance_.mass_ap_clo_deb) AS "Débit (ap. clôture)", 21 | sum(balance_.mass_ap_clo_cre) AS "Crédit (ap. clôture)", 22 | GREATEST(sum(balance_.mass_av_clo_deb)-sum(balance_.mass_av_clo_cre), 0.0) AS "Solde Débit (av. clôture)", 23 | GREATEST(sum(balance_.mass_av_clo_cre)-sum(balance_.mass_av_clo_deb), 0.0) AS "Solde Crédit (av. clôture)", 24 | GREATEST(sum(balance_.mass_ap_clo_deb)-sum(balance_.mass_ap_clo_cre), 0.0) AS "Solde Débit (ap. clôture)", 25 | GREATEST(sum(balance_.mass_ap_clo_cre)-sum(balance_.mass_ap_clo_deb), 0.0) AS "Solde Crédit (ap. clôture)", 26 | sum(balance_.nbr_lign) AS "Nombre lignes", 27 | CASE WHEN sum(nbr_lign) != 0.0 THEN (sum(mass_av_clo_deb)+sum(mass_av_clo_cre)) / sum(nbr_lign) ELSE 0.0 END AS "Montant moyen", 28 | max(balance_.max_lign) AS "Maximum" 29 | FROM balance_ 30 | GROUP BY ltrim(balance_.ecr_cte_lig_gen_nid, '0'::text), balance_.ecr_cte_lig_gen_lib; 31 | 32 | -- modif 26/06/2014 : concaténation cpt gén(sans enlever les 0) - cpt aux 33 | CREATE OR REPLACE VIEW vue_balance_aux_ AS 34 | SELECT balance_.id_balance AS "ID", 35 | ltrim(balance_.ecr_cte_lig_gen_nid, '0'::text) AS "Numéro Compte", 36 | balance_.ecr_cte_lig_gen_lib AS "Libellé Compte", 37 | balance_.num_cpt_aux AS "Numéro Compte auxiliaire", 38 | balance_.lib_cpt_aux AS "Libellé Compte auxiliaire", 39 | balance_.ecr_cte_lig_gen_nid||COALESCE('-'||balance_.num_cpt_aux,'') AS "Numéro Compte Gén-Aux", 40 | balance_.ecr_cte_lig_gen_lib||COALESCE('-'||balance_.lib_cpt_aux,'') AS "Libellé Compte Gén-Aux", 41 | balance_.sld_an_deb AS "Débit à Nouveau", 42 | balance_.sld_an_cre AS "Crédit à Nouveau", 43 | balance_.mass_av_clo_deb AS "Débit (av. clôture)", 44 | balance_.mass_av_clo_cre AS "Crédit (av. clôture)", 45 | balance_.mass_ap_clo_deb AS "Débit (ap. clôture)", 46 | balance_.mass_ap_clo_cre AS "Crédit (ap. clôture)", 47 | balance_.sld_av_clo_mtn_deb AS "Solde Débit (av. clôture)", 48 | balance_.sld_av_clo_mtn_cre AS "Solde Crédit (av. clôture)", 49 | balance_.sld_ap_clo_mtn_deb AS "Solde Débit (ap. clôture)", 50 | balance_.sld_ap_clo_mtn_cre AS "Solde Crédit (ap. clôture)", 51 | balance_.nbr_lign AS "Nombre lignes", 52 | balance_.avr_lign_ecr AS "Montant moyen", 53 | balance_.max_lign AS "Maximum" 54 | FROM balance_; 55 | 56 | CREATE OR REPLACE VIEW vue_ecriture_simple_ AS 57 | SELECT num_ecr AS "Numéro Ecriture", 58 | code_jrnal AS "Code Journal", 59 | lib_jrnal AS "Journal", 60 | date_cpt AS "Date comptable", 61 | lib_ecriture AS "Tous les Libellés", 62 | sum_debit AS "Débit", 63 | sum_credit AS "Crédit", 64 | date_piece AS "Date Pièce", 65 | num_piece AS "Numéro Pièce", 66 | CASE 67 | WHEN taux_tva > 0::numeric THEN 'Créditeur'::text 68 | WHEN taux_tva < 0::numeric THEN 'Débiteur'::text 69 | ELSE 'Nul'::text 70 | END AS "Sens TVA", 71 | abs(taux_tva) AS "Taux TVA", 72 | nb_ligne AS "Nombre de lignes", 73 | CASE 74 | WHEN ecr_type = 1 OR ecr_type = 11 THEN 'Clôture'::text 75 | WHEN ecr_type = 2 OR ecr_type = 12 THEN 'A. Nouveau'::text 76 | ELSE ''::text 77 | END AS "Type écriture", 78 | CASE 79 | WHEN ecr_type = 11 OR ecr_type = 12 THEN 'Générée'::text 80 | ELSE ''::text 81 | END AS "Générée lecode" 82 | FROM ecriture_ 83 | WHERE ((ecr_type != 11) AND (ecr_type != 12)); 84 | 85 | CREATE OR REPLACE VIEW vue_ecriture_ AS 86 | SELECT 87 | CASE 88 | WHEN NOT e.idem_codejrnal THEN 'X'::text 89 | ELSE ''::text 90 | END AS "Différents codes journaux", 91 | CASE 92 | WHEN NOT e.idem_debcre THEN 'X'::text 93 | ELSE ''::text 94 | END AS "Ecriture non équilibrée", 95 | CASE 96 | WHEN NOT e.idem_datecpt THEN 'X'::text 97 | ELSE ''::text 98 | END AS "Différentes dates comptables", 99 | CASE 100 | WHEN NOT e.idem_numpiece THEN 'X'::text 101 | ELSE ''::text 102 | END AS "Différents numéros de pièce", 103 | CASE 104 | WHEN NOT e.idem_datepiece THEN 'X'::text 105 | ELSE ''::text 106 | END AS "Différentes dates pièce", 107 | CASE 108 | WHEN NOT e.idem_codelet THEN 'X'::text 109 | ELSE ''::text 110 | END AS "Différents lettrages", 111 | e.num_ecr AS "Numéro Ecriture", 112 | l.code_jrnal AS "Code Journal", 113 | l.lib_jrnal AS "Journal", 114 | l.date_cpt AS "Date comptable", 115 | l.lib_ecriture AS "Libellé", 116 | e.lib_ecriture AS "Tous les Libellés", 117 | ltrim(l.num_cpte_gen, 118 | '0'::text) AS "Numéro Compte", 119 | l.lib_cpte_gen AS "Libellé Compte", 120 | l.mtn_debit AS "Débit", 121 | l.mtn_credit AS "Crédit", 122 | l.date_piece AS "Date Pièce", 123 | l.num_piece AS "Numéro Pièce", 124 | l.code_lettrage AS "Lettrage", 125 | l.id_ligne AS "ID", 126 | CASE 127 | WHEN e.taux_tva > 0::numeric THEN 'Créditeur'::text 128 | WHEN e.taux_tva < 0::numeric THEN 'Débiteur'::text 129 | ELSE 'Nul'::text 130 | END AS "Sens TVA", 131 | -- 31/07/2015 : ajout de la colonne TVA type 132 | l.tva_type AS "TVA type", 133 | abs(e.taux_tva) AS "Taux TVA", 134 | e.nb_ligne AS "Nombre de lignes", 135 | CASE 136 | --23/11/2015 : prise en compte proposition M. FERARD 137 | -- WHEN e.ecr_type = 1 OR e.ecr_type = 11 THEN 'Clôture'::text 138 | -- WHEN e.ecr_type = 2 OR e.ecr_type = 12 THEN 'A. Nouveau'::text 139 | WHEN l.ecr_type = 1 OR l.ecr_type = 11 THEN 'Clôture'::text 140 | WHEN l.ecr_type = 2 OR l.ecr_type = 12 THEN 'A. Nouveau'::text 141 | ELSE ''::text 142 | END AS "Type écriture", 143 | CASE 144 | WHEN e.ecr_type = 11 OR e.ecr_type = 12 THEN 'Générée'::text 145 | ELSE ''::text 146 | END AS "Générée lecode", 147 | l.num_cpt_aux AS "Numéro Compte auxiliaire", 148 | l.lib_cpt_aux AS "Libellé Compte auxiliaire" 149 | FROM (select * from ecriture_ WHERE ((ecr_type != 11) AND (ecr_type != 12)) ) e 150 | JOIN fec_ l ON e.num_ecr = l.num_ecr; 151 | 152 | CREATE VIEW vue_erreur_ AS 153 | SELECT "Différents codes journaux", 154 | "Ecriture non équilibrée", 155 | "Différentes dates comptables", 156 | "Différents numéros de pièce", 157 | "Différentes dates pièce", 158 | "Différents lettrages", 159 | "Numéro Ecriture", 160 | "Code Journal", 161 | "Journal", 162 | "Date comptable", 163 | "Libellé", 164 | "Tous les Libellés", 165 | "Numéro Compte", 166 | "Libellé Compte", 167 | "Débit", 168 | "Crédit", 169 | "Date Pièce", 170 | "Numéro Pièce", 171 | "Lettrage", 172 | "ID", 173 | "Sens TVA", 174 | -- 31/07/2015 : ajout de la colonne TVA type 175 | "TVA type", 176 | "Taux TVA", 177 | "Nombre de lignes", 178 | "Type écriture", 179 | "Générée lecode", 180 | "Numéro Compte auxiliaire", 181 | "Libellé Compte auxiliaire" 182 | FROM vue_ecriture_ 183 | WHERE "Différents codes journaux" = 'X'::text 184 | OR "Ecriture non équilibrée" = 'X'::text 185 | OR "Différentes dates comptables" = 'X'::text 186 | OR "Différents numéros de pièce" = 'X'::text 187 | OR "Différentes dates pièce" = 'X'::text 188 | OR "Différents lettrages" = 'X'::text ; 189 | 190 | 191 | 192 | -------------------------------------------------------------------------------- /src/testeur/trt_entete.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | 3 | #Copyright (C) 2014 Direction Generale des Finances Publiques 4 | # 5 | #This software is governed by the CeCILL license under French law and 6 | #abiding by the rules of distribution of free software. You can use, 7 | #modify and/ or redistribute the software under the terms of the CeCILL 8 | #license as circulated by CEA, CNRS and INRIA at the following URL 9 | #"http://www.cecill.info". 10 | # 11 | #As a counterpart to the access to the source code and rights to copy, 12 | #modify and redistribute granted by the license, users are provided only 13 | #with a limited warranty and the software's author, the holder of the 14 | #economic rights, and the successive licensors have only limited 15 | #liability. 16 | # 17 | #In this respect, the user's attention is drawn to the risks associated 18 | #with loading, using, modifying and/or developing or reproducing the 19 | #software by the user in light of its specific status of free software, 20 | #that may mean that it is complicated to manipulate, and that also 21 | #therefore means that it is reserved for developers and experienced 22 | #professionals having in-depth computer knowledge. Users are therefore 23 | #encouraged to load and test the software's suitability as regards their 24 | #requirements in conditions enabling the security of their systems and/or 25 | #data to be ensured and, more generally, to use and operate it in the 26 | #same conditions as regards security. 27 | # 28 | #The fact that you are presently reading this means that you have had 29 | #knowledge of the CeCILL license and that you accept its terms. 30 | # 31 | #!/usr/bin/perl 32 | 33 | use Cwd; 34 | use Env; 35 | use Config; 36 | use Getopt::Std; 37 | use File::Copy; 38 | use utf8; 39 | no utf8; 40 | 41 | # Extraction des paramètres 42 | our %opts; 43 | our $enc_open = ""; # encodage du fichier de travail 44 | 45 | sub sub_entete() { 46 | ( $opts{o}, $opts{f}, $opts{s}, $opts{n} ) = @_; 47 | 48 | # logs en base pg 49 | our $dbhlog; 50 | our $dbh; 51 | our $log_seq = 0; 52 | $dbhlog = &connexion_log( "altoweb2", $dbh ); 53 | our $log_seq = 0; 54 | # Vérification des paramètres 55 | &verif_param; 56 | 57 | my $file = $opts{f}; 58 | my $ofile = $opts{o}; 59 | my $sep = $opts{s}; 60 | $log_seq = $opts{n}; 61 | my @champs; 62 | my @champs_entete; 63 | my $separateur; 64 | my $trouve; 65 | my $errdc = 0; 66 | # rustine mac fin chariot 67 | open( my $hf, "$file"); 68 | 69 | my $crlf = &detecte_macfile($hf); 70 | 71 | close $hf; 72 | 73 | open( F, "$file" ) 74 | or ( $errmsg = "Impossible de trouver $file" && return 1 ); 75 | # or ( &erreur( "E", "Impossible de trouver $file" ) && return 1 ); 76 | 77 | local $/ = $crlf; 78 | binmode F, ":raw" ; 79 | 80 | if ( $sep eq "T" ) { $separateur = '\t'; } 81 | if ( $sep eq "P" ) { $separateur = '\|'; } 82 | if ( $sep eq "V" ) { $separateur = ','; } 83 | if ( $sep eq "PV" ) { $separateur = ';'; } 84 | 85 | # 12092013 : correction bug : espace suivant champs a neutraliser 86 | # 19122013 : suppression du bom dans le cas utf8 87 | my $k=0; 88 | while ( $line = ) { 89 | $line =~ s/\r\n|\r$//; 90 | #$line =~ s/\x0D\x0A$//; 91 | $line =~ s/\c@//g; 92 | chomp $line; 93 | $line =~ s/^\xEF\xBB\xBF//; 94 | 95 | @champs = split ' *' . $separateur . ' *', $line; 96 | 97 | if ( $line =~ /${separateur} *$/ ) { 98 | push @champs, "ZFICTIFZ"; 99 | &erreur( "I", 100 | "Le fichier contient un séparateur de plus en fin de ligne " 101 | ); 102 | } 103 | last; 104 | } 105 | close(F); 106 | undef $/; 107 | for ( $i = 0; $i <= $#champs; $i++ ) { 108 | $champs[$i] = &isotoutf8($champs[$i]); 109 | $champs[$i] =~ s/é/e/gi; 110 | $champs[$i] =~ s/è/e/gi; 111 | $champs[$i] =~ s/ +$//; 112 | $champs[$i] =~ s/[^A-Za-z0-9]/_/g; 113 | $champs_entete[$i] = $champs[$i]; 114 | } 115 | 116 | #RG:T: mapping des entetes fournies dans le fichier avec le format arrêté:I 117 | open( STRUC, "< ${ProgramData}/${Rep_Alim_ou_Testeur}/fmt_arrete" ) 118 | or ( $errmsg = "Impossible de trouver fmt_arrete" && return 1 ); 119 | # or ( &erreur( "E", "Impossible de trouver fmt_arrete" ) && return 1 ); 120 | local $/ = "\n"; 121 | 122 | my $entete; 123 | while ( $line = ) { 124 | 125 | $line =~ s/\x0D\x0A$//; 126 | chomp $line; 127 | my ( $plat, $base ) = split /;/, $line; 128 | 129 | # $trouve=$plat; 130 | for ( $i = 0; $i <= $#champs; $i++ ) { 131 | if ( uc($plat) eq uc( $champs[$i] ) ) { 132 | $champs_entete[$i] = uc($base); 133 | last; 134 | } 135 | } 136 | 137 | #$entete.=$trouve.$separateur; 138 | } 139 | 140 | close(STRUC); 141 | my $i = -1; 142 | my $rang_d = 0; 143 | my $rang_c = 0; 144 | 145 | #RG:F: retraitement debit / credit du fichier en présence de Montant/sens :I 146 | #RG:F: retraitement debit / credit du fichier , sens hors plage D C +1 -1 :E 147 | foreach $l (@champs) { 148 | $i++; 149 | if ( uc($l) eq "MONTANT" ) { 150 | $rang_d = $i; 151 | &erreur( "D", "Sens " ); 152 | } 153 | if ( uc($l) eq "SENS" ) { 154 | $rang_c = $i; 155 | &erreur( "D", "Sens " ); 156 | } 157 | } 158 | 159 | open( F, "> $ofile" ) 160 | or ( $errmsg = "Impossible d'ouvrir $ofile en ecriture" 161 | && return 1 ); 162 | # or ( &erreur( "E", "Impossible d'ouvrir $ofile en ecriture" ) 163 | # && return 1 ); 164 | 165 | my $separateur_esc = $separateur; 166 | $separateur_esc =~ s/\\\|/|/; 167 | $separateur_esc =~ s/\\t/\t/; 168 | 169 | print F join( $separateur_esc, @champs_entete ); 170 | my $nb_attendu = $#champs_entete; 171 | close F; 172 | my @valeurs; 173 | 174 | if ( $rang_c > 0 && $rang_d > 0 ) { 175 | $i = 0; 176 | move( $opts{f}, $opts{f} . "_ori2" ); 177 | 178 | 179 | 180 | open( I, $opts{f} . '_ori2' ) 181 | or ( $errmsg = "Impossible de trouver {$file}_ori2 " 182 | && return 1 ); 183 | # or ( &erreur( "E", "Impossible de trouver {$file}_ori2 " ) 184 | # && return 1 ); 185 | local $/ = $crlf; 186 | binmode I, ":raw" ; 187 | open( O, "> $file" ) 188 | or ( $errmsg = "Impossible d'ouvrir $file en ecriture" 189 | && return 1 ); 190 | # or ( &erreur( "E", "Impossible d'ouvrir $file en ecriture" ) 191 | # && return 1 ); 192 | 193 | binmode O, ":raw" ; 194 | 195 | while ( $line = ) { 196 | $line =~ s/\r\n|\r$//; 197 | chomp $line; 198 | if ( $i == 0 ) { print O $line . "\n"; } 199 | else { 200 | @valeurs = split $separateur, $line; 201 | 202 | if ( uc( $valeurs[$rang_c] ) =~ /^\s*D\s*$/ 203 | || $valeurs[$rang_c] =~ /^\s*\+1\s*$/ ) 204 | { 205 | $valeurs[$rang_c] = 0; 206 | } 207 | elsif ( uc( $valeurs[$rang_c] ) =~ /^\s*C\s*$/ 208 | || $valeurs[$rang_c] =~ /^\s*\-1\s*$/ ) 209 | { 210 | $valeurs[$rang_c] = $valeurs[$rang_d]; 211 | $valeurs[$rang_d] = 0; 212 | } 213 | else { 214 | $errmsg .= "Code D/C mal renseigne a la ligne " . ($i + 1) . " : $valeurs[$rang_c] \n" ; 215 | $errdc++; 216 | #&erreur( "E", "Code D/C mal renseigné : ligne $i : " . ( uc( $valeurs[$rang_c] ) ) ); 217 | #return 1; 218 | } 219 | my $nb_reel = $#valeurs; 220 | 221 | # 23072013 : correction bug dans le cas cegid dernière colonne : num_ecr=1 , remplacé par "" 222 | for ( my $compl = $nb_reel; $compl <= $nb_attendu; $compl++ ) 223 | { 224 | if ( !defined( $valeurs[$compl] ) ) { 225 | $valeurs[$compl] = ""; 226 | } 227 | } 228 | print O join( $separateur_esc, @valeurs ) . "\n"; 229 | } 230 | $i++; 231 | 232 | } 233 | close I; 234 | close O; 235 | if ($errdc > 0) { 236 | return 1; 237 | } 238 | } 239 | 240 | return 0; 241 | } 242 | 1; 243 | 244 | -------------------------------------------------------------------------------- /src/testeur/alto2_pdf.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | 3 | #Copyright (C) 2014 Direction Generale des Finances Publiques 4 | # 5 | #This software is governed by the CeCILL license under French law and 6 | #abiding by the rules of distribution of free software. You can use, 7 | #modify and/ or redistribute the software under the terms of the CeCILL 8 | #license as circulated by CEA, CNRS and INRIA at the following URL 9 | #"http://www.cecill.info". 10 | # 11 | #As a counterpart to the access to the source code and rights to copy, 12 | #modify and redistribute granted by the license, users are provided only 13 | #with a limited warranty and the software's author, the holder of the 14 | #economic rights, and the successive licensors have only limited 15 | #liability. 16 | # 17 | #In this respect, the user's attention is drawn to the risks associated 18 | #with loading, using, modifying and/or developing or reproducing the 19 | #software by the user in light of its specific status of free software, 20 | #that may mean that it is complicated to manipulate, and that also 21 | #therefore means that it is reserved for developers and experienced 22 | #professionals having in-depth computer knowledge. Users are therefore 23 | #encouraged to load and test the software's suitability as regards their 24 | #requirements in conditions enabling the security of their systems and/or 25 | #data to be ensured and, more generally, to use and operate it in the 26 | #same conditions as regards security. 27 | # 28 | #The fact that you are presently reading this means that you have had 29 | #knowledge of the CeCILL license and that you accept its terms. 30 | # 31 | #!/usr/bin/perl 32 | my $currdir = dirname( abs_path($0) ); 33 | require "$currdir/alto2_fonctions.pl"; 34 | use PDF::API2; 35 | use PDF::Table; 36 | use constant mm => 25.4 / 72; 37 | use constant in => 1 / 72; 38 | use constant pt => 1; 39 | use utf8; 40 | 41 | # pas de use strict pour définir en global les variables du module 42 | my $p = 0; 43 | my $pdf = PDF::API2->new(); 44 | my $pdftable = new PDF::Table; 45 | 46 | #$font=$pdf->ttfont('georgia', -encode=>'utf8'); 47 | &new_page; 48 | $font_name = 'Helvetica'; 49 | $left_edge_of_table = 5 / mm; 50 | 51 | # $ypos_of_last_line=280 / mm; 52 | 53 | &meta; 54 | &ajoute_rect( 210, 110 ); 55 | &ajoute_arc; 56 | $font_size = 18; 57 | 58 | sub meta() { 59 | my ( $sec, $min, $hour, $mday, $mon, $year ) = localtime(time); 60 | $year += 1900; 61 | $mon += 1; 62 | my $datecreate = sprintf( "%04d%02d%02d%02d%02d%02d", 63 | ${year}, ${mon}, ${mday}, ${hour}, ${min}, ${sec} ); 64 | my %h = $pdf->info( 65 | 'Author' => "ALTO2", 66 | 'CreationDate' => ${datecreate}, 67 | 'ModDate' => ${datecreate}, 68 | 'Creator' => "ALTO2 $vers_java", 69 | 'Producer' => "PDF::API", 70 | 'Title' => "Rapport Technique Conformité A.47 A-1 du LPF", 71 | 'Subject' => "", 72 | 'Keywords' => "$file" 73 | ); 74 | 75 | } 76 | 77 | sub new_page() { 78 | $p++; 79 | $page[$p] = $pdf->page( -mediabox => 'A4' ); 80 | $page[$p]->cropbox( 5 / mm, 5 / mm, 200 / mm, 287 / mm ); 81 | $gfx = $page[$p]->gfx; 82 | 83 | $txt = $page[$p]->text; 84 | 85 | $ypos_of_last_line = 284 / mm; 86 | 87 | } 88 | 89 | sub ajoute_rect() { 90 | 91 | my ( $w, $h ) = @_; 92 | 93 | #my $gfx= $page->gfx; 94 | 95 | # $ypos_of_last_line 96 | $gfx->fillcolor('lightcyan'); 97 | $gfx->rect( 5 / mm, $ypos_of_last_line - 36 / mm, $w / mm, $h / mm ); 98 | $gfx->fill; 99 | } 100 | 101 | sub ajoute_arc() { 102 | 103 | # my $gfx= $page->gfx; 104 | 105 | $gfx->strokecolor('white'); 106 | 107 | # The ->circle() function takes three parameters: The first two are the X and Y coordinates of the centre (in relation to the bottom left), the third is the radius. 108 | $gfx->circle( 180 / mm, $ypos_of_last_line - 45 / mm, 45 / mm ); 109 | $gfx->circle( 170 / mm, $ypos_of_last_line - 48 / mm, 43 / mm ); 110 | $gfx->circle( 160 / mm, $ypos_of_last_line - 40 / mm, 46 / mm ); 111 | $gfx->stroke; 112 | } 113 | 114 | sub ajoute_liste() { 115 | my ( $table0, $width, $model ) = @_; 116 | if ( !defined($model) ) { 117 | $model = 1; 118 | } 119 | my @tref; 120 | foreach my $elt (@$table0) { 121 | my @tlis; 122 | push @tlis, "\x{BA} " . &conv_to_iso($elt); 123 | push @tref, \@tlis; 124 | } 125 | my $rsome = [@tref]; 126 | &ajoute_table( $rsome, $width, $model ); 127 | } 128 | 129 | sub ajoute_table() { 130 | 131 | # ref à une table de refs, taille, modele 1-2-3-4 colonnes 132 | my ( $table0, $width, $model ) = @_; 133 | my $border = 0; 134 | undef $hdr_props; 135 | if ( !defined($model) ) { 136 | $model = 1; 137 | } 138 | if ( $model == 1 ) { 139 | $col_props = [ 140 | { 141 | min_w => $width / mm, # Minimum column width. 142 | max_w => $width / mm, # Maximum column width. 143 | justify => 'left', # One of left|center|right , 144 | 145 | }, 146 | ]; 147 | $hdr_props = { 148 | bg_color => 'lightgrey', 149 | repeat => 1 150 | }; 151 | $border = 1; 152 | } 153 | elsif ( $model == 3 ) { 154 | $col_props = [ 155 | { 156 | min_w => ( $width - 32 ) / 2 / mm, # Minimum column width. 157 | max_w => $width / 2 / mm, # Maximum column width. 158 | justify => 'left', # One of left|center|right , 159 | 160 | }, 161 | { 162 | min_w => ( $width - 32 ) / 4 / mm, # Minimum column width. 163 | max_w => $width / 4 / mm, # Maximum column width. 164 | justify => 'center', # One of left|center|right , 165 | 166 | }, 167 | { 168 | min_w => ( $width - 32 ) / 4 / mm, # Minimum column width. 169 | max_w => $width / 4 / mm, # Maximum column width. 170 | justify => 'center', # One of left|center|right , 171 | 172 | }, 173 | ]; 174 | $hdr_props = { 175 | bg_color => 'lightgrey', 176 | font_size => 11, 177 | repeat => 1 178 | }; 179 | $border = 1; 180 | } 181 | elsif ( $model == 2 ) { 182 | $col_props = [ 183 | { 184 | min_w => $width / 2 / mm, # Minimum column width. 185 | max_w => 90 / mm, # Maximum column width. 186 | justify => 'left', # One of left|center|right , 187 | 188 | }, 189 | { 190 | min_w => $width / 2 / mm, # Minimum column width. 191 | max_w => 90 / mm, # Maximum column width. 192 | justify => 'center', # One of left|center|right , 193 | 194 | } 195 | ]; 196 | $hdr_props = { 197 | bg_color => 'white', 198 | font_size => 11, 199 | repeat => 1 200 | }; 201 | $border = 1; 202 | } 203 | elsif ( $model == 0 ) { 204 | $col_props = [ 205 | { 206 | min_w => $width / mm, # Minimum column width. 207 | max_w => $width / mm, # Maximum column width. 208 | justify => 'left', # One of left|center|right , 209 | 210 | }, 211 | ]; 212 | 213 | } 214 | 215 | # font => $pdf->corefont("Times", -encoding => "latin1"), 216 | # font_size => 10, 217 | # font_color=> 'blue', 218 | # background_color => '#FFFF00', 219 | 220 | # font => $pdf->corefont("Times", -encoding => "utf8"), 221 | # font_size => 10, 222 | # font_color => '#006666', 223 | 224 | ( $end_page, $pages_spanned, $table_bot_y ) = $pdftable->table( 225 | 226 | # required params 227 | $pdf, 228 | $page[$p], 229 | $table0, 230 | x => $left_edge_of_table / mm, 231 | start_y => $ypos_of_last_line - 5 / mm, 232 | next_y => $ypos_of_last_line - 5 / mm, 233 | start_h => $ypos_of_last_line - 5 / mm, 234 | next_h => $ypos_of_last_line - 5 / mm, 235 | w => ($width) / mm, 236 | padding => 4, 237 | padding_right => 5, 238 | padding_top => 5, 239 | padding_bottom => 5, 240 | # -gfx_color_odd => "blue", 241 | # -gfx_color_even => "red", #cell gfx color for even rows 242 | border => $border, 243 | border_color => 'grey', 244 | font_size => $font_size, 245 | font => $pdf->corefont( $font_name, -encoding => "utf8" ), 246 | column_props => $col_props, 247 | header_props => $hdr_props, 248 | ); 249 | 250 | # [-padding => "5",] # cell padding 251 | # [-padding_top => "10",] #top cell padding, overides -pad 252 | # [-padding_right => "10",] #right cell padding, overides -pad 253 | # [-padding_left => "10",] #left padding padding, overides -pad 254 | # [-padding_bottom => "10",] #bottom padding, overides -pad 255 | # [-border => 1,] # border width, default 1, use 0 for no border 256 | # [-border_color => "red",] # default black 257 | # [-font => $pdf->corefont("Helvetica", -encoding => "latin1"),] # default font 258 | # [-font_size => 12,] 259 | # [-font_color_odd => "purple",] 260 | # [-font_color_even => "black",] 261 | 262 | if ( $pages_spanned > 1 ) { 263 | $p++; 264 | $page[$p] = $pdf->page( -mediabox => 'A4' ); 265 | $page[$p]->cropbox( 5 / mm, 5 / mm, 200 / mm, 287 / mm ); 266 | $txt = $page[$p]->text; 267 | $ypos_of_last_line = 284 / mm; 268 | } 269 | else { 270 | $ypos_of_last_line = $table_bot_y 271 | if $ypos_of_last_line > $table_bot_y; 272 | } 273 | } 274 | 275 | sub ajoute_paragraphe() { 276 | 277 | # paragraphe , larg en millimetre, haut en milimetre 278 | my ( $text0, $width, $height, $color ) = @_; 279 | 280 | if ( defined $color ) { 281 | $txt->fillcolor($color); 282 | } 283 | else { 284 | $txt->fillcolor('black'); 285 | } 286 | $font = $pdf->corefont( $font_name, -encoding => "utf8" ); 287 | $txt->font( $font, $font_size ); 288 | 289 | # $txt->fillcolor('black'); 290 | ( $width_of_last_line, $ypos_of_last_line, $left_over_text ) = 291 | $pdftable->text_block( 292 | $txt, 293 | $text0, 294 | -x => $left_edge_of_table / mm, 295 | -y => $ypos_of_last_line - 15 / mm, 296 | -w => $width / mm, 297 | -h => $height / mm, 298 | -lead => $font_size * 1.2, 299 | -align => $align, 300 | -parspace => 0 301 | ); 302 | 303 | # [-parspace => 0 | $extra_distance_between_paragraphs,] 304 | # [-align => "left|right|center|justify|fulljustify",] 305 | # [-hang => $optional_hanging_indent,] 306 | 307 | } 308 | 309 | sub sauve_pdf() { 310 | my ($nom_pdf) = @_; 311 | $pdf->saveas("$nom_pdf"); 312 | } 313 | 314 | sub ombre() { 315 | my @a = @_; 316 | my $old_y = $ypos_of_last_line; 317 | my $old_x = $left_edge_of_table; 318 | $a[3] = 'lightgrey'; 319 | &ajoute_paragraphe(@a); 320 | $ypos_of_last_line = $old_y + 0.11 / mm; 321 | $left_edge_of_table = $old_x + ( $font_size / 220 ) / mm; 322 | $a[3] = 'grey'; 323 | 324 | &ajoute_paragraphe(@a); 325 | $ypos_of_last_line = $old_y + 0.22 / mm; 326 | $left_edge_of_table = $old_x + ( $font_size / 110 ) / mm; 327 | 328 | $a[3] = 'black'; 329 | &ajoute_paragraphe(@a); 330 | $left_edge_of_table = $old_x; 331 | } 332 | 333 | 1; 334 | -------------------------------------------------------------------------------- /src/testeur/alto2_fonctions.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | 3 | #Copyright (C) 2014 Direction Generale des Finances Publiques 4 | # 5 | #This software is governed by the CeCILL license under French law and 6 | #abiding by the rules of distribution of free software. You can use, 7 | #modify and/ or redistribute the software under the terms of the CeCILL 8 | #license as circulated by CEA, CNRS and INRIA at the following URL 9 | #"http://www.cecill.info". 10 | # 11 | #As a counterpart to the access to the source code and rights to copy, 12 | #modify and redistribute granted by the license, users are provided only 13 | #with a limited warranty and the software's author, the holder of the 14 | #economic rights, and the successive licensors have only limited 15 | #liability. 16 | # 17 | #In this respect, the user's attention is drawn to the risks associated 18 | #with loading, using, modifying and/or developing or reproducing the 19 | #software by the user in light of its specific status of free software, 20 | #that may mean that it is complicated to manipulate, and that also 21 | #therefore means that it is reserved for developers and experienced 22 | #professionals having in-depth computer knowledge. Users are therefore 23 | #encouraged to load and test the software's suitability as regards their 24 | #requirements in conditions enabling the security of their systems and/or 25 | #data to be ensured and, more generally, to use and operate it in the 26 | #same conditions as regards security. 27 | # 28 | #The fact that you are presently reading this means that you have had 29 | #knowledge of the CeCILL license and that you accept its terms. 30 | # 31 | #!/usr/bin/perl 32 | 33 | # Vérifier que les définitions des appelants sont faites avant la ligne require et avec our 34 | use utf8; 35 | no utf8; 36 | use DBI; 37 | use Config; 38 | use XML::Simple; 39 | use Net::LDAP; 40 | use Net::Ping; 41 | use File::Copy; 42 | use File::Basename; 43 | 44 | $OS = $Config{osname}; 45 | our %log_type; 46 | our %log_type_nb; 47 | 48 | sub isotoutf8 ( ) { 49 | 50 | #use Encode; 51 | #RG:T:fonction encode en utf8, vérification que l'entree est en iso (si utf8 => conv en iso au préalable ) :I 52 | $_ = shift; 53 | my $iso = &conv_to_iso($_); 54 | 55 | # la chaine forcée en iso est conv en utf8 56 | $utf8 = enc_utf8($iso); 57 | return $utf8; 58 | } 59 | 60 | sub enc_utf8() { 61 | use Encode; 62 | my $iso = shift; 63 | my $utf8 = encode_utf8($iso); 64 | return $utf8; 65 | } 66 | 67 | sub connexion () { 68 | my ( $dbname, $dbhl, $connexion ) = @_; 69 | my $username; 70 | my $password; 71 | if ( ${OS} =~ m/linux/i ) { 72 | $dbconnect = "dbi:Pg"; 73 | } 74 | else { 75 | eval "use DBD::Pg"; 76 | if ($@) { 77 | $dbconnect = "dbi:PgPP"; 78 | } 79 | else { 80 | $dbconnect = "dbi:Pg"; 81 | } 82 | } 83 | 84 | if ( defined $connexion ) { 85 | ( $username, $password, $host ) = split /\|/, $connexion; 86 | 87 | } 88 | else { 89 | $username = "postgres"; 90 | $password = "postgres"; 91 | 92 | $host = "localhost"; 93 | } 94 | $dbhl->disconnect() if ( defined($dbhl) ); 95 | $dbhl = DBI->connect( "${dbconnect}:dbname=$dbname;host=$host", 96 | $username, $password ) 97 | or &erreur( "E", "$DBI::errstr" ); 98 | 99 | # DBI->trace( 2 ); pour détailler les traces 100 | return $dbhl; 101 | } 102 | 103 | sub connexion_log () { 104 | my ( $dbname, $dbhl, $create ) = @_; 105 | $dbhl->disconnect() if ( defined($dbhl) ); 106 | $dbhl = DBI->connect( "dbi:SQLite:dbname=" . "${ProgramData}/${Rep_Alim_ou_Testeur}/" . "log/${dbname}.db", 107 | "", "", { RaiseError => 1, sqlite_unicode => 1, } ) 108 | or die $DBI::errstr; 109 | 110 | #$dbhl->do("PRAGMA cache_size = 2000000"); 111 | $dbhl->do( 112 | "PRAGMA synchronous = OFF ;" 113 | ); 114 | 115 | if ( ( !defined $create ) || ( $create != "nocreate" ) ) { 116 | my $ref_dump = 117 | $dbhl->selectall_hashref( "select id_type,fixe_log from log_type", 118 | 'id_type' ); 119 | foreach my $id_ecr ( keys %$ref_dump ) { 120 | 121 | my $log_temp = &conv_to_iso( $ref_dump->{$id_ecr}->{fixe_log} ); 122 | 123 | $log_type{$log_temp} = $id_ecr; 124 | } 125 | } 126 | return $dbhl; 127 | } 128 | 129 | sub maj_log() { 130 | my ($dbhl) = @_; 131 | 132 | # $dbhl->do("COMMIT;"); 133 | $dbhl->do("PRAGMA synchronous = FULL ;"); 134 | $| = 1; # Disable output buffering 135 | 136 | $dbhl->do("drop table if exists log_type ;"); 137 | $dbhl->do( 138 | "CREATE TABLE if not exists log_type 139 | ( id_type INTEGER , 140 | fixe_log text unique on conflict ignore 141 | ) " 142 | ) or print STDERR $DBI::errstr ; 143 | 144 | foreach 145 | my $id_ecr ( sort { $log_type{$a} <=> $log_type{$b} } keys %log_type ) 146 | { 147 | #print STDOUT "\n maj_log : ". $log_type{$id_ecr} . $id_ecr ; 148 | my $index_id = $log_type{$id_ecr}; 149 | $id_ecr =~ s/\'/\'\'/g; 150 | $REQ = 151 | "INSERT into log_type (id_type,fixe_log) values ( $index_id ,'$id_ecr');"; 152 | 153 | $dbhl->do($REQ) 154 | or &trace( " Insert en table fixe_log impossible", '' ); 155 | } 156 | 157 | return 1; 158 | } 159 | 160 | sub create_log() { 161 | my ($fic_log) = @_; 162 | my $dbh_safe = $dbh; 163 | my $dbhl = &connexion_log( "altoweb2", $dbh ); 164 | $| = 1; # Disable output buffering 165 | 166 | # log info 167 | $dbh = $dbhl; 168 | open( FL, "> ${ProgramData}/${Rep_Alim_ou_Testeur}/log/log_" . basename($fic_log) . ".log" ) 169 | or ( print STDERR "Impossible de tracer les logs" && return 1 ); 170 | 171 | my @dump = &sql_1col( 172 | "select distinct id_ligne,replace(replace (t.fixe_log,'#1',ifnull(l.val1,'')),'#2',ifnull(l.val2,'')) 173 | from log_alim l, log_type t 174 | where id_trait = $log_seq and type_log='I' and t.id_type=l.texte_log order by 1 ;" 175 | , "Supprime 1ere colonne"); 176 | 177 | print FL join( "\n", @dump ); 178 | 179 | close(FL); 180 | 181 | # log E et A 182 | open( FL, "> ${ProgramData}/${Rep_Alim_ou_Testeur}/log/err_" . basename($fic_log) . ".log" ) 183 | or ( print STDERR "Impossible de tracer les logs" && return 1 ); 184 | 185 | @dump = &sql_1col( 186 | "select distinct id_ligne,replace(replace (t.fixe_log,'#1',l.val1),'#2',l.val2) fixe 187 | from log_alim l, log_type t 188 | where id_trait = $log_seq and type_log in ('A','E') and t.id_type=l.texte_log order by 1 ;" 189 | ); 190 | print FL join( "\n", @dump ); 191 | close(FL); 192 | &deconnexion($dbhl); 193 | $dbh = $dbh_safe; 194 | return "${ProgramData}/${Rep_Alim_ou_Testeur}/log/err_" . basename($fic_log) . ".log"; 195 | 196 | } 197 | 198 | sub deconnexion() { 199 | my ($dbhl) = @_; 200 | $dbhl->disconnect() if ( defined($dbhl) ); 201 | } 202 | 203 | sub recup_noseq() { 204 | 205 | # 206 | # my @seq_suivi = $dbhlog->selectrow_array("select currval('suivi_alim_id_trait_seq');"); 207 | 208 | my @seq_suivi = $dbhlog->selectrow_array( 209 | "select seq from sqlite_sequence where name ='suivi_alim'; "); 210 | return $seq_suivi[0]; 211 | } 212 | 213 | sub conv_to_iso() { 214 | 215 | #RG:T:fonction encode en iso, vérification que l'entree est en utf8 ; si utf8 => conv en iso :I 216 | use Encode; 217 | $_ = shift; 218 | my $utf8; 219 | $_ =~ s/\x{20AC}/~E/; 220 | 221 | # vérification si la chaine est en utf8 222 | 223 | # print STDERR $_ ; 224 | eval { $utf8 = decode( "utf-8", $_, Encode::FB_CROAK ) }; 225 | 226 | # sinon decode chaine iso en var perl interne 227 | if ($@) { 228 | $utf8 = decode( "iso-8859-15", $_ ); #, Encode::FB_WARN ); 229 | } 230 | return $utf8; 231 | } 232 | 233 | sub supprime_accent ( ) { 234 | my ($utf) = @_; 235 | if ( $utf =~ /^\s*$/ ) { return ""; } 236 | 237 | # my $iso = $utf; 238 | my $iso = &conv_to_iso($utf); 239 | $iso =~ s/[^A-Za-z0-9]/_/g; 240 | 241 | return $iso; 242 | 243 | # $iso =~ s/[ÈÉÊËèéêë]/e/ig; # supp € 244 | # $iso =~ s/[ÀÁÂÃÄÅÆâãäåæàá]/a/ig; 245 | # $iso =~ s/[Ð]/d/ig; 246 | # $iso =~ s/[Ññ]/n/ig; 247 | # $iso =~ s/[ÌÍÎÏìíîï]/i/ig; 248 | # $iso =~ s/[ÙÚÛÜüùûúµ]/u/ig; 249 | # $iso =~ s/[ÒÓÔÕÖØŒðòóõöœô]/o/ig; 250 | # $iso =~ s/[Ç©ç]/c/ig; 251 | # $iso =~ s/[ŠŠ]/s/ig; 252 | # $iso =~ s/[ÝŸýÿ]/y/ig; 253 | # $iso =~ s/[ª²³¹º]/_/ig; 254 | # $iso =~ s/[^\n\r\w:,\+\=&-;\|\/\.()"%'\s\$]/_/ig; 255 | # $iso =~ s/\s+$//; 256 | # return $iso; 257 | } 258 | 259 | sub utf8toutf8 ( ) { 260 | 261 | #RG:T:fonction decodage interne utf8 => raw:I 262 | my ($iso) = @_; 263 | my $utf8 = &isotoutf8($iso); 264 | utf8::decode($utf8); 265 | return ($utf8); 266 | } 267 | 268 | sub erreur() { 269 | my ( $type, $log ) = @_; 270 | if ( defined($dbhlog) ) { 271 | 272 | my $log_init = $log; 273 | my $val_1 = ""; 274 | my $val_2 = ""; 275 | if ( 276 | ( 277 | $log_init =~ 278 | m/^(.+):([A-Za-z0-9\-\._,\/ ]+):(.+):([A-Za-z0-9\.,_\-\/ ]+):(.*)$/ 279 | ) 280 | || ( $log_init =~ m/^(.+):([A-Za-z0-9\-\._,\/ ]+):( .*)$/ ) 281 | || ( $log_init =~ 282 | m/^(.+)(\= *[A-Za-z0-9_\-\+\.,]+ *)( )(\=\s*[A-Za-z0-9_\-\+\.,]+ *)$/ 283 | ) 284 | || ( $log_init =~ m/^(.+)(\= *[A-Za-z0-9_\-\+\.,]+ *)( .*)$/ ) 285 | ) 286 | { 287 | $log = $1; 288 | if ( defined($2) ) { 289 | $val_1 = $2; 290 | $log .= ' #1 '; 291 | } 292 | $log .= $3; 293 | if ( defined($4) ) { 294 | $val_2 = $4; 295 | $log .= ' #2 '; 296 | } 297 | $log .= $5; 298 | 299 | } 300 | else { 301 | # log fixe$ 302 | } 303 | if ( ( $type eq "I" ) && ( $val_1 eq "" ) ) { 304 | $log = "[ #1 ]\t" . $log; 305 | } 306 | 307 | # $REQ = "INSERT into log_type(fixe_log) values ('$log')"; 308 | # $dbhlog->do($REQ) or die " Insert en table log_type impossible \n $REQ \n "; 309 | my $seq_type = 0; 310 | $log = &conv_to_iso($log); 311 | if ( exists $log_type{$log} ) { 312 | 313 | $seq_type = $log_type{$log}; 314 | $log_type_nb{$log}++; 315 | 316 | } 317 | else { 318 | $seq_type = keys %log_type; 319 | $seq_type += 1; 320 | $log_type{$log} = $seq_type; 321 | $log_type_nb{$log}=1; 322 | } 323 | $log =~ s/\'/\'\'/g; 324 | 325 | # my @seq_type = $dbhlog->selectrow_array( "select id_type from log_type where fixe_log= '$log';"); 326 | if ( ( $type eq "I" ) && ( $val_1 eq "" ) ) { 327 | $log = " #1 " . $log; 328 | $REQ = 329 | "INSERT into log_alim( id_trait , type_log , texte_log,val1 ) values ($log_seq,'$type',${seq_type},datetime('now'))"; 330 | 331 | } 332 | else { 333 | $REQ = 334 | "INSERT into log_alim( id_trait , type_log , texte_log,val1,val2 ) values ($log_seq,'$type',${seq_type},'$val_1','$val_2')"; 335 | } 336 | 337 | if ($log_type_nb{$log} < 50000) { 338 | $dbhlog->do($REQ) 339 | or print STDERR " Insert en table de suivi impossible \n $REQ \n "; 340 | } 341 | 342 | } 343 | else { 344 | print STDOUT "Traces non disponible\n $log \n "; 345 | } 346 | } 347 | 348 | sub usage { 349 | print " 350 | Aide : 351 | ====== 352 | 353 | Cf documentation avec : 354 | perldoc $0 355 | 356 | "; 357 | exit; 358 | } 359 | 360 | sub verif_param { 361 | &usage unless exists $opts{f}; 362 | die 363 | "$0 : impossible de trouver le fichier \"$opts{f}\" passé en paramètre\n\n" 364 | unless -f $opts{f}; 365 | my $enc_xml = $opts{e}; # encodage du fichier supposé ligne entete xml... 366 | 367 | $enc_open = ":raw"; 368 | if ( exists $opts{o} ) { 369 | open( OFILE, "> $enc_open ", $opts{o} ) 370 | or die "Impossible d'ouvrir le fichier \"$opts{o}\" en écriture\n\n"; 371 | binmode( OFILE, " $enc_open" ); 372 | select(OFILE); 373 | } 374 | } 375 | 376 | sub ChercheEncodage { 377 | my $encodage = 378 | ""; # cp1252 sous windows mais ne fonctionne pas bien avec car utf8 379 | # TODO : Windows7 64bits non géré actuellement 380 | if ( lc($^O) eq 'mswin32' ) { 381 | eval { 382 | #my ($codepage) = ( `chcp` =~ m/:\s+(\d+)/ ); 383 | #$encodage = "cp$codepage"; 384 | $encodage = ":raw"; 385 | foreach my $h ( \*STDOUT, \*STDERR, \*STDIN, ) { 386 | binmode $h, "$encodage"; 387 | } 388 | }; 389 | } 390 | else { 391 | $encodage = `locale charmap`; 392 | eval { 393 | foreach my $h ( \*STDOUT, \*STDERR, \*STDIN, ) 394 | { 395 | binmode $h, ":encoding($encodage)"; 396 | } 397 | }; 398 | } 399 | return $encodage; 400 | } 401 | 402 | sub trier_fichier() { 403 | my $ligne; 404 | my @elemts; 405 | 406 | # trier sur 3 colonnes 407 | my ( $fic_in, $ordre_tri ) = @_; 408 | move( "$fic_in", "${fic_in}_travail" ); 409 | open( FIN, "< ", "${fic_in}_travail" ); 410 | open( FOUT, "> ", ${fic_in} ) 411 | or die "Impossible d'ouvrir le fichier ${fic_in} en écriture\n\n"; 412 | my @rangs = split /\|/, $ordre_tri; 413 | my @entree = ; 414 | $entete = shift(@entree); 415 | 416 | #RG:T:Trie de certains format logiciels sage, pour que les écritures soient renumérotées:I 417 | 418 | # le fichier en entree est splité par |, 419 | # puis les champs demandés en entrée de fonction ex 0,1,4 sont triés dans l'ordre demandé en format alpha 420 | # les éléments de tableau trié sont join par | pour reconstituer le fichier initial 421 | 422 | my @sortie = map { join '|', @{$_} } sort { 423 | $a->[ $rangs[0] ] cmp $b->[ $rangs[0] ] 424 | || $a->[ $rangs[1] ] cmp $b->[ $rangs[1] ] 425 | || $a->[ $rangs[2] ] cmp $b->[ $rangs[2] ] 426 | } map { [ split /\|/, $_ ] } @entree; 427 | print FOUT $entete; 428 | print FOUT join( "", @sortie ); 429 | close FOUT; 430 | 431 | } 432 | 433 | sub modif_acces_direct() { 434 | 435 | # nom fic, taille a lire, expreg a chercher ,ereg de substitution 436 | # retourne 0 : ok, 1 : rien fait, 2 : mal modifié 437 | my ( $fic, $taille_buf, $er1, $er2 ) = @_; 438 | 439 | open( FT, "+< :raw", $fic ) or die "impossible"; 440 | 441 | $nb = sysread FT, $buffer, $taille_buf; 442 | if ( ( !defined $nb ) || ( $nb == 0 ) ) { 443 | close FT; 444 | return 1; 445 | } 446 | 447 | $buffer =~ s/${er1}/${er2}/; 448 | my $er3=$er2 ; 449 | $er3 =~ s/ *//g; 450 | 451 | 452 | 453 | if ( length($buffer) != $taille_buf ) { close FT; return 1; } 454 | 455 | sysseek FT, 0, SEEK_SET; 456 | 457 | $nb = syswrite FT, $buffer, $taille_buf; 458 | close FT; 459 | if ( ( !defined $nb ) || ( $nb == 0 ) ) { 460 | return 2; 461 | } 462 | 463 | if ( $buffer !~ m/${er3}/ ) { 464 | return 3 ; 465 | } 466 | 467 | return 0; 468 | } 469 | 470 | sub parse_xml() { 471 | 472 | my ($fic) = @_; 473 | $fic = "${ProgramData}/client/" . &verif_version_java . "/ressources/" . $fic; 474 | if ( !-f "$fic" ) { 475 | &trace( "$fic introuvable" ); 476 | return ( "", "", "" ); 477 | } 478 | # balise : local ou autre 479 | my @elements; 480 | 481 | my $parser = XML::Simple->new( KeepRoot => 1 ); 482 | 483 | my $doc = $parser->XMLin("$fic"); 484 | 485 | my $connect_ldap = ""; 486 | my $db_local = ""; 487 | my $db_distant = ""; 488 | my @listeserveurs; 489 | 490 | # Tout le fichier XML est dans $doc sous forme d'arbre 491 | 492 | eval { my $a = @{ $doc->{alto2}->{serveur} }; }; 493 | if ( $@ =~ /^Not an ARRAY reference/ ) { 494 | push @listeserveurs, $doc->{alto2}->{serveur}; 495 | } 496 | else { 497 | @listeserveurs = @{ $doc->{alto2}->{serveur} }; 498 | } 499 | 500 | foreach my $serveur (@listeserveurs) { 501 | 502 | if ( $serveur->{nom} =~ m/local/i ) { 503 | my $dbase = $serveur->{database}; 504 | $db_local = 505 | $dbase->{user} . '|' . $dbase->{password} . '|' . $dbase->{url}; 506 | 507 | } 508 | else { 509 | 510 | my $ldap = $serveur->{ldap}; 511 | 512 | $connect_ldap = 513 | $ldap->{defautuser} . '@' 514 | . $ldap->{domain} . '|' 515 | . $ldap->{serverUrl}; 516 | 517 | my $dbase = $serveur->{database}; 518 | $db_distant = 519 | $dbase->{user} . '|' . $dbase->{password} . '|' . $dbase->{url}; 520 | my $p = Net::Ping->new( 'tcp', 3 ); 521 | my $rc = $p->ping( $dbase->{url} ); 522 | if ( !defined $rc ) { 523 | &trace( "Serveur distant non disponible" ); 524 | 525 | $db_distant = ""; 526 | $connect_ldap = ""; 527 | } 528 | else { 529 | &trace( "Serveur distant disponible" ); 530 | 531 | } 532 | 533 | } 534 | 535 | #} 536 | 537 | } 538 | 539 | # 540 | push @elements, $db_local, $db_distant, $connect_ldap; 541 | 542 | return @elements; 543 | 544 | } 545 | 546 | sub verif_ldap () { 547 | my ( $passwd, $connexion ) = @_; 548 | 549 | ( $user, $url ) = split /\|/, $connexion; 550 | 551 | my $ldap = Net::LDAP->new("$url") 552 | or ( &erreur( "I", "connexion ldap impossible" ) && return 0 ); 553 | 554 | my $mesg = $ldap->bind( $user, password => "$passwd" ); 555 | 556 | # $mesg = $ldap->bind ( ); 557 | my $rc = $mesg->code; 558 | if ( $rc eq 0 ) { 559 | &erreur( "I", "Login ldap correct" ); 560 | return 1; 561 | } 562 | else { 563 | &erreur( "I", "Login ldap incorrect" . $mesg->error_text ); 564 | return 0; 565 | } 566 | 567 | } 568 | 569 | sub verif_version_java() { 570 | if ( &aorte() eq "t") { 571 | open(CONF, "< ${ProgramData}/${Rep_Alim_ou_Testeur}/Version_Alto2.txt ") or die "Version_Alto2.txt introuvable dans $currdir"; 572 | my @temp_version=; 573 | close CONF; 574 | 575 | return $temp_version[0]; 576 | 577 | } 578 | 579 | my @dossiers; 580 | $dossiers[0] = 0; 581 | opendir REP, "${ProgramData}/client" or ( return 0 ); 582 | @dossiers = 583 | sort { sanspoint($b) cmp sanspoint($a) } grep { /^version/ } readdir REP; 584 | closedir REP; 585 | 586 | return $dossiers[0]; 587 | 588 | } 589 | 590 | sub sanspoint() { 591 | my ($v) = @_; 592 | if ( $v =~ m/(\d*)\.(\d*)\.(\d*)([a-z]?)/ ) { 593 | $v = sprintf( "%02d%03d%03d%s", $1, $2, $3, $4 ); 594 | return $v; 595 | } 596 | } 597 | 598 | # reports fonctions trt_txt : 599 | sub sql_array() { 600 | ($REQ) = shift; 601 | 602 | # en entree un tableau de colonne, en sortie un tableau 603 | my @result; 604 | 605 | my $ref_dump = $dbh->selectall_arrayref("$REQ") 606 | or &erreur( "E", "Echec Requête - $DBI::errstr" . $REQ ); 607 | foreach my $id_ecr (@$ref_dump) { 608 | @val_ecr = @$id_ecr; 609 | push @result, join( "\t", @val_ecr ); 610 | } 611 | 612 | return @result; 613 | } 614 | 615 | sub sql() { 616 | ($REQ) = shift; 617 | 618 | # en entree une ligne avec 1 ou n colonne, en sortie un tableau contenant les colonnes 619 | my @result = $dbh->selectrow_array("$REQ") 620 | or &erreur( "E", "Echec Requête - $DBI::errstr" . $REQ ); 621 | return @result; 622 | } 623 | 624 | sub sql_1col() { 625 | my ($REQ,$IgnoreFirst) = @_; 626 | 627 | # en entree 1 colonne sur n lignes , en sortie tableau contient les valeurs de chaque ligne 628 | my @result; 629 | my $ref_result = $dbh->selectall_arrayref("$REQ") 630 | or &erreur( "E", "Echec Requête - $DBI::errstr" . $REQ ); 631 | foreach my $id_ecr (@$ref_result) { 632 | if (defined $IgnoreFirst) { 633 | shift @$id_ecr; 634 | } 635 | push @result, join( "|", @$id_ecr ); 636 | } 637 | 638 | return @result; 639 | } 640 | 641 | sub aorte() { 642 | # a_lim or t_esteur 643 | my $sourcefile=".\alto2_testtype.pl"; 644 | eval "require \"$sourcefile\" ;" ; 645 | if ($@) { return "t"; } 646 | return "a"; 647 | } 648 | 649 | sub arrete2013() { 650 | my ($dc ) = @_; 651 | if ( substr($dc,0,4) >= 2013 ) { return 1; } else { return 0; } 652 | } 653 | 654 | 655 | sub detecte_macfile() { 656 | my ($fh) =@_; 657 | my $buffer; 658 | 659 | my $nb= sysread $fh,$buffer, 4096 or return undef; 660 | if ($nb == 0) { return undef; } 661 | if ($buffer =~ m/\x0D\x0A/) { return "\r\n"; } 662 | elsif ($buffer =~ m/\x0D/) { return "\r"; } 663 | elsif ($buffer =~ m/\x0A/) { return "\n"; } 664 | 665 | return undef; 666 | 667 | } 668 | 669 | 670 | 1; 671 | 672 | -------------------------------------------------------------------------------- /src/testeur/SQL/BALANCE_TVA.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE IF EXISTS balance_tva_ CASCADE; 2 | 3 | COMMIT; 4 | 5 | --Creation Table balance TVA 6 | CREATE TABLE balance_tva_ ( 7 | ecr_cte_lig_gen_nid text NOT NULL, 8 | ecr_cte_lig_gen_lib text NOT NULL, 9 | num_cpt_aux text, 10 | lib_cpt_aux text, 11 | mass_av_clo_deb numeric NOT NULL, 12 | mass_av_clo_cre numeric NOT NULL, 13 | sup_m200 numeric, 14 | _m200 numeric, 15 | _m200_m196 numeric, 16 | _m196 numeric, 17 | _m196_m100 numeric, 18 | _m100 numeric, 19 | _m100_m70 numeric, 20 | _m70 numeric, 21 | _m70_m55 numeric, 22 | _m55 numeric, 23 | _m55_m21 numeric, 24 | _m21 numeric, 25 | _m21_00 numeric, 26 | _00 numeric, 27 | _00_21 numeric, 28 | _21 numeric, 29 | _21_55 numeric, 30 | _55 numeric, 31 | _55_70 numeric, 32 | _70 numeric, 33 | _70_100 numeric, 34 | _100 numeric, 35 | _100_196 numeric, 36 | _196 numeric, 37 | _196_200 numeric, 38 | _200 numeric, 39 | sup_200 numeric, 40 | _inv21 numeric, 41 | _inv55 numeric, 42 | _inv70 numeric, 43 | _inv100 numeric, 44 | _inv196 numeric, 45 | _inv200 numeric 46 | ); 47 | 48 | COMMIT; 49 | 50 | -- Insertion des donnees dans la table balance TVA 51 | INSERT INTO balance_tva_ 52 | SELECT b."Numéro Compte", 53 | CASE WHEN (b."Libellé Compte") IS NULL THEN '' ELSE b."Libellé Compte" END, 54 | b."Numéro Compte auxiliaire", 55 | b."Libellé Compte auxiliaire", 56 | b."Débit (av. clôture)", 57 | b."Crédit (av. clôture)", 58 | sup_m200 59 | ,_m200 60 | ,_m200_m196 61 | ,_m196 62 | ,_m196_m100 63 | ,_m100 64 | ,_m100_m70 65 | ,_m70 66 | ,_m70_m55 67 | ,_m55 68 | ,_m55_m21 69 | ,_m21 70 | ,_m21_00 71 | ,_00 72 | ,_00_21 73 | , _21 74 | ,_21_55 75 | ,_55 76 | ,_55_70 77 | ,_70 78 | ,_70_100 79 | ,_100 80 | ,_100_196 81 | ,_196 82 | ,_196_200 83 | ,_200 84 | ,sup_200 85 | FROM vue_balance_aux_ b 86 | LEFT OUTER JOIN (SELECT ltrim(num_cpte_gen, '0') AS num_cpte_gen, lib_cpte_gen, (sum(mtn_debit)-sum(mtn_credit)) AS sup_m200, l.num_cpt_aux FROM fec_ l 87 | INNER JOIN (SELECT num_ecr, taux_tva FROM ecriture_ e) AS t ON l.num_ecr = t.num_ecr 88 | WHERE t.taux_tva < -20.05 AND ((ecr_type != 1) AND (ecr_type != 11)) GROUP BY num_cpte_gen, lib_cpte_gen,l.num_cpt_aux) 89 | AS sup_m200 ON sup_m200.num_cpte_gen = b."Numéro Compte" AND sup_m200.lib_cpte_gen = b."Libellé Compte" and COALESCE(b."Numéro Compte auxiliaire",'') = COALESCE(sup_m200.num_cpt_aux,'') 90 | LEFT OUTER JOIN (SELECT ltrim(num_cpte_gen, '0') AS num_cpte_gen, lib_cpte_gen, (sum(mtn_debit)-sum(mtn_credit)) AS _m200, l.num_cpt_aux FROM fec_ l 91 | INNER JOIN (SELECT num_ecr, taux_tva FROM ecriture_ e) AS t ON l.num_ecr = t.num_ecr 92 | WHERE t.taux_tva >= -20.05 AND t.taux_tva <= -19.95 AND ((ecr_type != 1) AND (ecr_type != 11)) GROUP BY num_cpte_gen, lib_cpte_gen,l.num_cpt_aux) 93 | AS _m200 ON _m200.num_cpte_gen = b."Numéro Compte" AND _m200.lib_cpte_gen = b."Libellé Compte" and COALESCE(b."Numéro Compte auxiliaire",'') = COALESCE(_m200.num_cpt_aux,'') 94 | LEFT OUTER JOIN (SELECT ltrim(num_cpte_gen, '0') AS num_cpte_gen, lib_cpte_gen, (sum(mtn_debit)-sum(mtn_credit)) AS _m200_m196, l.num_cpt_aux FROM fec_ l 95 | INNER JOIN (SELECT num_ecr, taux_tva FROM ecriture_ e) AS t ON l.num_ecr = t.num_ecr 96 | WHERE t.taux_tva > -19.95 AND t.taux_tva < -19.65 AND ((ecr_type != 1) AND (ecr_type != 11)) GROUP BY num_cpte_gen, lib_cpte_gen,l.num_cpt_aux) 97 | AS _m200_m196 ON _m200_m196.num_cpte_gen = b."Numéro Compte" AND _m200_m196.lib_cpte_gen = b."Libellé Compte" and COALESCE(b."Numéro Compte auxiliaire",'') = COALESCE(_m200_m196.num_cpt_aux,'') 98 | LEFT OUTER JOIN (SELECT ltrim(num_cpte_gen, '0') AS num_cpte_gen, lib_cpte_gen, (sum(mtn_debit)-sum(mtn_credit)) AS _m196, l.num_cpt_aux FROM fec_ l 99 | INNER JOIN (SELECT num_ecr, taux_tva FROM ecriture_ e) AS t ON l.num_ecr = t.num_ecr 100 | WHERE t.taux_tva >= -19.65 AND t.taux_tva <= -19.55 AND ((ecr_type != 1) AND (ecr_type != 11)) GROUP BY num_cpte_gen, lib_cpte_gen,l.num_cpt_aux) 101 | AS _m196 ON _m196.num_cpte_gen = b."Numéro Compte" AND _m196.lib_cpte_gen = b."Libellé Compte" and COALESCE(b."Numéro Compte auxiliaire",'') = COALESCE(_m196.num_cpt_aux,'') 102 | LEFT OUTER JOIN (SELECT ltrim(num_cpte_gen, '0') AS num_cpte_gen, lib_cpte_gen, (sum(mtn_debit)-sum(mtn_credit)) AS _m196_m100, l.num_cpt_aux FROM fec_ l 103 | INNER JOIN (SELECT num_ecr, taux_tva FROM ecriture_ e) AS t ON l.num_ecr = t.num_ecr 104 | WHERE t.taux_tva > -19.55 AND t.taux_tva < -10.05 AND ((ecr_type != 1) AND (ecr_type != 11)) GROUP BY num_cpte_gen, lib_cpte_gen,l.num_cpt_aux) 105 | AS _m196_m100 ON _m196_m100.num_cpte_gen = b."Numéro Compte" AND _m196_m100.lib_cpte_gen = b."Libellé Compte" and COALESCE(b."Numéro Compte auxiliaire",'') = COALESCE(_m196_m100.num_cpt_aux,'') 106 | LEFT OUTER JOIN (SELECT ltrim(num_cpte_gen, '0') AS num_cpte_gen, lib_cpte_gen, (sum(mtn_debit)-sum(mtn_credit)) AS _m100, l.num_cpt_aux FROM fec_ l 107 | INNER JOIN (SELECT num_ecr, taux_tva FROM ecriture_ e) AS t ON l.num_ecr = t.num_ecr 108 | WHERE t.taux_tva >= -10.05 AND t.taux_tva <= -9.95 AND ((ecr_type != 1) AND (ecr_type != 11)) GROUP BY num_cpte_gen, lib_cpte_gen, l.num_cpt_aux ) 109 | AS _m100 ON _m100.num_cpte_gen = b."Numéro Compte" AND _m100.lib_cpte_gen = b."Libellé Compte" and COALESCE(b."Numéro Compte auxiliaire",'') = COALESCE(_m100.num_cpt_aux,'') 110 | LEFT OUTER JOIN (SELECT ltrim(num_cpte_gen, '0') AS num_cpte_gen, lib_cpte_gen, (sum(mtn_debit)-sum(mtn_credit)) AS _m100_m70, l.num_cpt_aux FROM fec_ l 111 | INNER JOIN (SELECT num_ecr, taux_tva FROM ecriture_ e) AS t ON l.num_ecr = t.num_ecr 112 | WHERE t.taux_tva > -9.95 AND t.taux_tva < -7.05 AND ((ecr_type != 1) AND (ecr_type != 11)) GROUP BY num_cpte_gen, lib_cpte_gen, l.num_cpt_aux) 113 | AS _m100_m70 ON _m100_m70.num_cpte_gen = b."Numéro Compte" AND _m100_m70.lib_cpte_gen = b."Libellé Compte" and COALESCE(b."Numéro Compte auxiliaire",'') = COALESCE(_m100_m70.num_cpt_aux,'') 114 | LEFT OUTER JOIN (SELECT ltrim(num_cpte_gen, '0') AS num_cpte_gen, lib_cpte_gen, (sum(mtn_debit)-sum(mtn_credit)) AS _m70, l.num_cpt_aux FROM fec_ l 115 | INNER JOIN (SELECT num_ecr, taux_tva FROM ecriture_ e) AS t ON l.num_ecr = t.num_ecr 116 | WHERE t.taux_tva >= -7.05 AND t.taux_tva <= -6.95 AND ((ecr_type != 1) AND (ecr_type != 11)) GROUP BY num_cpte_gen, lib_cpte_gen, l.num_cpt_aux) 117 | AS _m70 ON _m70.num_cpte_gen = b."Numéro Compte" AND _m70.lib_cpte_gen = b."Libellé Compte" and COALESCE(b."Numéro Compte auxiliaire",'') = COALESCE(_m70.num_cpt_aux,'') 118 | LEFT OUTER JOIN (SELECT ltrim(num_cpte_gen, '0') AS num_cpte_gen, lib_cpte_gen, (sum(mtn_debit)-sum(mtn_credit)) AS _m70_m55, l.num_cpt_aux FROM fec_ l 119 | INNER JOIN (SELECT num_ecr, taux_tva FROM ecriture_ e) AS t ON l.num_ecr = t.num_ecr 120 | WHERE t.taux_tva > -6.95 AND t.taux_tva < -5.55 AND ((ecr_type != 1) AND (ecr_type != 11)) GROUP BY num_cpte_gen, lib_cpte_gen, l.num_cpt_aux) 121 | AS _m70_m55 ON _m70_m55.num_cpte_gen = b."Numéro Compte" AND _m70_m55.lib_cpte_gen = b."Libellé Compte" and COALESCE(b."Numéro Compte auxiliaire",'') = COALESCE(_m70_m55.num_cpt_aux,'') 122 | LEFT OUTER JOIN (SELECT ltrim(num_cpte_gen, '0') AS num_cpte_gen, lib_cpte_gen, (sum(mtn_debit)-sum(mtn_credit)) AS _m55, l.num_cpt_aux FROM fec_ l 123 | INNER JOIN (SELECT num_ecr, taux_tva FROM ecriture_ e) AS t ON l.num_ecr = t.num_ecr 124 | WHERE t.taux_tva >= -5.55 AND t.taux_tva <= -5.45 AND ((ecr_type != 1) AND (ecr_type != 11)) GROUP BY num_cpte_gen, lib_cpte_gen, l.num_cpt_aux) 125 | AS _m55 ON _m55.num_cpte_gen = b."Numéro Compte" AND _m55.lib_cpte_gen = b."Libellé Compte" and COALESCE(b."Numéro Compte auxiliaire",'') = COALESCE(_m55.num_cpt_aux,'') 126 | LEFT OUTER JOIN (SELECT ltrim(num_cpte_gen, '0') AS num_cpte_gen, lib_cpte_gen, (sum(mtn_debit)-sum(mtn_credit)) AS _m55_m21, l.num_cpt_aux FROM fec_ l 127 | INNER JOIN (SELECT num_ecr, taux_tva FROM ecriture_ e) AS t ON l.num_ecr = t.num_ecr 128 | WHERE t.taux_tva > -5.45 AND t.taux_tva < -2.15 AND ((ecr_type != 1) AND (ecr_type != 11)) GROUP BY num_cpte_gen, lib_cpte_gen, l.num_cpt_aux) 129 | AS _m55_m21 ON _m55_m21.num_cpte_gen = b."Numéro Compte" AND _m55_m21.lib_cpte_gen = b."Libellé Compte" and COALESCE(b."Numéro Compte auxiliaire",'') = COALESCE(_m55_m21.num_cpt_aux,'') 130 | LEFT OUTER JOIN (SELECT ltrim(num_cpte_gen, '0') AS num_cpte_gen, lib_cpte_gen, (sum(mtn_debit)-sum(mtn_credit)) AS _m21, l.num_cpt_aux FROM fec_ l 131 | INNER JOIN (SELECT num_ecr, taux_tva FROM ecriture_ e) AS t ON l.num_ecr = t.num_ecr 132 | WHERE t.taux_tva >= -2.15 AND t.taux_tva <= -2.05 AND ((ecr_type != 1) AND (ecr_type != 11)) GROUP BY num_cpte_gen, lib_cpte_gen, l.num_cpt_aux) 133 | AS _m21 ON _m21.num_cpte_gen = b."Numéro Compte" AND _m21.lib_cpte_gen = b."Libellé Compte" and COALESCE(b."Numéro Compte auxiliaire",'') = COALESCE(_m21.num_cpt_aux,'') 134 | LEFT OUTER JOIN (SELECT ltrim(num_cpte_gen, '0') AS num_cpte_gen, lib_cpte_gen, (sum(mtn_debit)-sum(mtn_credit)) AS _m21_00, l.num_cpt_aux FROM fec_ l 135 | INNER JOIN (SELECT num_ecr, taux_tva FROM ecriture_ e) AS t ON l.num_ecr = t.num_ecr 136 | WHERE t.taux_tva > -2.05 AND t.taux_tva < -0.05 AND ((ecr_type != 1) AND (ecr_type != 11)) GROUP BY num_cpte_gen, lib_cpte_gen, l.num_cpt_aux) 137 | AS _m21_00 ON _m21_00.num_cpte_gen = b."Numéro Compte" AND _m21_00.lib_cpte_gen = b."Libellé Compte" and COALESCE(b."Numéro Compte auxiliaire",'') = COALESCE(_m21_00.num_cpt_aux,'') 138 | LEFT OUTER JOIN (SELECT ltrim(num_cpte_gen, '0') AS num_cpte_gen, lib_cpte_gen, (sum(mtn_debit)-sum(mtn_credit)) AS _00, l.num_cpt_aux FROM fec_ l 139 | INNER JOIN (SELECT num_ecr, taux_tva FROM ecriture_ e) AS t ON l.num_ecr = t.num_ecr 140 | WHERE t.taux_tva >= -0.05 AND t.taux_tva <= 0.05 AND ((ecr_type != 1) AND (ecr_type != 11)) GROUP BY num_cpte_gen, lib_cpte_gen, l.num_cpt_aux) 141 | AS _00 ON _00.num_cpte_gen = b."Numéro Compte" AND _00.lib_cpte_gen = b."Libellé Compte" and COALESCE(b."Numéro Compte auxiliaire",'') = COALESCE(_00.num_cpt_aux,'') 142 | LEFT OUTER JOIN (SELECT ltrim(num_cpte_gen, '0') AS num_cpte_gen, lib_cpte_gen, (sum(mtn_debit)-sum(mtn_credit)) AS _00_21, l.num_cpt_aux FROM fec_ l 143 | INNER JOIN (SELECT num_ecr, taux_tva FROM ecriture_ e) AS t ON l.num_ecr = t.num_ecr 144 | WHERE t.taux_tva > 0.05 AND t.taux_tva < 2.05 AND ((ecr_type != 1) AND (ecr_type != 11)) GROUP BY num_cpte_gen, lib_cpte_gen, l.num_cpt_aux) 145 | AS _00_21 ON _00_21.num_cpte_gen = b."Numéro Compte" AND _00_21.lib_cpte_gen = b."Libellé Compte" and COALESCE(b."Numéro Compte auxiliaire",'') = COALESCE(_00_21.num_cpt_aux,'') 146 | LEFT OUTER JOIN (SELECT ltrim(num_cpte_gen, '0') AS num_cpte_gen, lib_cpte_gen, (sum(mtn_debit)-sum(mtn_credit)) AS _21, l.num_cpt_aux FROM fec_ l 147 | INNER JOIN (SELECT num_ecr, taux_tva FROM ecriture_ e) AS t ON l.num_ecr = t.num_ecr 148 | WHERE t.taux_tva <= 2.15 AND t.taux_tva >= 2.05 AND ((ecr_type != 1) AND (ecr_type != 11)) GROUP BY num_cpte_gen, lib_cpte_gen, l.num_cpt_aux) 149 | AS _21 ON _21.num_cpte_gen = b."Numéro Compte" AND _21.lib_cpte_gen = b."Libellé Compte" and COALESCE(b."Numéro Compte auxiliaire",'') = COALESCE(_21.num_cpt_aux,'') 150 | LEFT OUTER JOIN (SELECT ltrim(num_cpte_gen, '0') AS num_cpte_gen, lib_cpte_gen, (sum(mtn_debit)-sum(mtn_credit)) AS _21_55, l.num_cpt_aux FROM fec_ l 151 | INNER JOIN (SELECT num_ecr, taux_tva FROM ecriture_ e) AS t ON l.num_ecr = t.num_ecr 152 | WHERE t.taux_tva > 2.15 AND t.taux_tva < 5.45 AND ((ecr_type != 1) AND (ecr_type != 11)) GROUP BY num_cpte_gen, lib_cpte_gen, l.num_cpt_aux) 153 | AS _21_55 ON _21_55.num_cpte_gen = b."Numéro Compte" AND _21_55.lib_cpte_gen = b."Libellé Compte" and COALESCE(b."Numéro Compte auxiliaire",'') = COALESCE(_21_55.num_cpt_aux,'') 154 | LEFT OUTER JOIN (SELECT ltrim(num_cpte_gen, '0') AS num_cpte_gen, lib_cpte_gen, (sum(mtn_debit)-sum(mtn_credit)) AS _55, l.num_cpt_aux FROM fec_ l 155 | INNER JOIN (SELECT num_ecr, taux_tva FROM ecriture_ e) AS t ON l.num_ecr = t.num_ecr 156 | WHERE t.taux_tva <= 5.55 AND t.taux_tva >= 5.45 AND ((ecr_type != 1) AND (ecr_type != 11)) GROUP BY num_cpte_gen, lib_cpte_gen, l.num_cpt_aux) 157 | AS _55 ON _55.num_cpte_gen = b."Numéro Compte" AND _55.lib_cpte_gen = b."Libellé Compte" and COALESCE(b."Numéro Compte auxiliaire",'') = COALESCE(_55.num_cpt_aux,'') 158 | LEFT OUTER JOIN (SELECT ltrim(num_cpte_gen, '0') AS num_cpte_gen, lib_cpte_gen, (sum(mtn_debit)-sum(mtn_credit)) AS _55_70, l.num_cpt_aux FROM fec_ l 159 | INNER JOIN (SELECT num_ecr, taux_tva FROM ecriture_ e) AS t ON l.num_ecr = t.num_ecr 160 | WHERE t.taux_tva > 5.55 AND t.taux_tva < 6.95 AND ((ecr_type != 1) AND (ecr_type != 11)) GROUP BY num_cpte_gen, lib_cpte_gen, l.num_cpt_aux) 161 | AS _55_70 ON _55_70.num_cpte_gen = b."Numéro Compte" AND _55_70.lib_cpte_gen = b."Libellé Compte" and COALESCE(b."Numéro Compte auxiliaire",'') = COALESCE(_55_70.num_cpt_aux,'') 162 | LEFT OUTER JOIN (SELECT ltrim(num_cpte_gen, '0') AS num_cpte_gen, lib_cpte_gen, (sum(mtn_debit)-sum(mtn_credit)) AS _70, l.num_cpt_aux FROM fec_ l 163 | INNER JOIN (SELECT num_ecr, taux_tva FROM ecriture_ e) AS t ON l.num_ecr = t.num_ecr 164 | WHERE t.taux_tva <= 7.05 AND t.taux_tva >= 6.95 AND ((ecr_type != 1) AND (ecr_type != 11)) GROUP BY num_cpte_gen, lib_cpte_gen, l.num_cpt_aux) 165 | AS _70 ON _70.num_cpte_gen = b."Numéro Compte" AND _70.lib_cpte_gen = b."Libellé Compte" and COALESCE(b."Numéro Compte auxiliaire",'') = COALESCE(_70.num_cpt_aux,'') 166 | LEFT OUTER JOIN (SELECT ltrim(num_cpte_gen, '0') AS num_cpte_gen, lib_cpte_gen, (sum(mtn_debit)-sum(mtn_credit)) AS _70_100, l.num_cpt_aux FROM fec_ l 167 | INNER JOIN (SELECT num_ecr, taux_tva FROM ecriture_ e) AS t ON l.num_ecr = t.num_ecr 168 | WHERE t.taux_tva > 7.05 AND t.taux_tva < 9.95 AND ((ecr_type != 1) AND (ecr_type != 11)) GROUP BY num_cpte_gen, lib_cpte_gen, l.num_cpt_aux) 169 | AS _70_100 ON _70_100.num_cpte_gen = b."Numéro Compte" AND _70_100.lib_cpte_gen = b."Libellé Compte" and COALESCE(b."Numéro Compte auxiliaire",'') = COALESCE(_70_100.num_cpt_aux,'') 170 | LEFT OUTER JOIN (SELECT ltrim(num_cpte_gen, '0') AS num_cpte_gen, lib_cpte_gen, (sum(mtn_debit)-sum(mtn_credit)) AS _100, l.num_cpt_aux FROM fec_ l 171 | INNER JOIN (SELECT num_ecr, taux_tva FROM ecriture_ e) AS t ON l.num_ecr = t.num_ecr 172 | WHERE t.taux_tva <= 10.05 AND t.taux_tva >= 9.95 AND ((ecr_type != 1) AND (ecr_type != 11)) GROUP BY num_cpte_gen, lib_cpte_gen, l.num_cpt_aux) 173 | AS _100 ON _100.num_cpte_gen = b."Numéro Compte" AND _100.lib_cpte_gen = b."Libellé Compte" and COALESCE(b."Numéro Compte auxiliaire",'') = COALESCE(_100.num_cpt_aux,'') 174 | LEFT OUTER JOIN (SELECT ltrim(num_cpte_gen, '0') AS num_cpte_gen, lib_cpte_gen, (sum(mtn_debit)-sum(mtn_credit)) AS _100_196, l.num_cpt_aux FROM fec_ l 175 | INNER JOIN (SELECT num_ecr, taux_tva FROM ecriture_ e) AS t ON l.num_ecr = t.num_ecr 176 | WHERE t.taux_tva > 10.05 AND t.taux_tva < 19.55 AND ((ecr_type != 1) AND (ecr_type != 11)) GROUP BY num_cpte_gen, lib_cpte_gen, l.num_cpt_aux) 177 | AS _100_196 ON _100_196.num_cpte_gen = b."Numéro Compte" AND _100_196.lib_cpte_gen = b."Libellé Compte" and COALESCE(b."Numéro Compte auxiliaire",'') = COALESCE(_100_196.num_cpt_aux,'') 178 | LEFT OUTER JOIN (SELECT ltrim(num_cpte_gen, '0') AS num_cpte_gen, lib_cpte_gen, (sum(mtn_debit)-sum(mtn_credit)) AS _196, l.num_cpt_aux FROM fec_ l 179 | INNER JOIN (SELECT num_ecr, taux_tva FROM ecriture_ e) AS t ON l.num_ecr = t.num_ecr 180 | WHERE t.taux_tva <= 19.65 AND t.taux_tva >= 19.55 AND ((ecr_type != 1) AND (ecr_type != 11)) GROUP BY num_cpte_gen, lib_cpte_gen, l.num_cpt_aux) 181 | AS _196 ON _196.num_cpte_gen = b."Numéro Compte" AND _196.lib_cpte_gen = b."Libellé Compte" and COALESCE(b."Numéro Compte auxiliaire",'') = COALESCE(_196.num_cpt_aux,'') 182 | LEFT OUTER JOIN (SELECT ltrim(num_cpte_gen, '0') AS num_cpte_gen, lib_cpte_gen, (sum(mtn_debit)-sum(mtn_credit)) AS _196_200, l.num_cpt_aux FROM fec_ l 183 | INNER JOIN (SELECT num_ecr, taux_tva FROM ecriture_ e) AS t ON l.num_ecr = t.num_ecr 184 | WHERE t.taux_tva > 19.65 AND t.taux_tva < 19.95 AND ((ecr_type != 1) AND (ecr_type != 11)) GROUP BY num_cpte_gen, lib_cpte_gen, l.num_cpt_aux) 185 | AS _196_200 ON _196_200.num_cpte_gen = b."Numéro Compte" AND _196_200.lib_cpte_gen = b."Libellé Compte" and COALESCE(b."Numéro Compte auxiliaire",'') = COALESCE(_196_200.num_cpt_aux,'') 186 | LEFT OUTER JOIN (SELECT ltrim(num_cpte_gen, '0') AS num_cpte_gen, lib_cpte_gen, (sum(mtn_debit)-sum(mtn_credit)) AS _200, l.num_cpt_aux FROM fec_ l 187 | INNER JOIN (SELECT num_ecr, taux_tva FROM ecriture_ e) AS t ON l.num_ecr = t.num_ecr 188 | WHERE t.taux_tva <= 20.05 AND t.taux_tva >= 19.95 AND ((ecr_type != 1) AND (ecr_type != 11)) GROUP BY num_cpte_gen, lib_cpte_gen, l.num_cpt_aux) 189 | AS _200 ON _200.num_cpte_gen = b."Numéro Compte" AND _200.lib_cpte_gen = b."Libellé Compte" and COALESCE(b."Numéro Compte auxiliaire",'') = COALESCE(_200.num_cpt_aux,'') 190 | LEFT OUTER JOIN (SELECT ltrim(num_cpte_gen, '0') AS num_cpte_gen, lib_cpte_gen, (sum(mtn_debit)-sum(mtn_credit)) AS sup_200, l.num_cpt_aux FROM fec_ l 191 | INNER JOIN (SELECT num_ecr, taux_tva FROM ecriture_ e) AS t ON l.num_ecr = t.num_ecr 192 | WHERE t.taux_tva > 20.05 AND ((ecr_type != 1) AND (ecr_type != 11)) GROUP BY num_cpte_gen, lib_cpte_gen, l.num_cpt_aux) 193 | AS sup_200 ON sup_200.num_cpte_gen = b."Numéro Compte" AND sup_200.lib_cpte_gen = b."Libellé Compte" and COALESCE(b."Numéro Compte auxiliaire",'') = COALESCE(sup_200.num_cpt_aux,'') 194 | order by b."Numéro Compte", b."Numéro Compte auxiliaire" 195 | ; 196 | 197 | COMMIT; 198 | 199 | UPDATE balance_tva_ SET sup_m200=0.0 WHERE sup_m200 IS NULL; 200 | UPDATE balance_tva_ SET _m200=0.0 WHERE _m200 IS NULL; 201 | UPDATE balance_tva_ SET _m200_m196=0.0 WHERE _m200_m196 IS NULL; 202 | UPDATE balance_tva_ SET _m196=0.0 WHERE _m196 IS NULL; 203 | UPDATE balance_tva_ SET _m196_m100=0.0 WHERE _m196_m100 IS NULL; 204 | UPDATE balance_tva_ SET _m100=0.0 WHERE _m100 IS NULL; 205 | UPDATE balance_tva_ SET _m100_m70=0.0 WHERE _m100_m70 IS NULL; 206 | UPDATE balance_tva_ SET _m70=0.0 WHERE _m70 IS NULL; 207 | UPDATE balance_tva_ SET _m70_m55=0.0 WHERE _m70_m55 IS NULL; 208 | UPDATE balance_tva_ SET _m55=0.0 WHERE _m55 IS NULL; 209 | UPDATE balance_tva_ SET _m55_m21=0.0 WHERE _m55_m21 IS NULL; 210 | UPDATE balance_tva_ SET _m21=0.0 WHERE _m21 IS NULL; 211 | UPDATE balance_tva_ SET _m21_00=0.0 WHERE _m21_00 IS NULL; 212 | UPDATE balance_tva_ SET _00=0.0 WHERE _00 IS NULL; 213 | UPDATE balance_tva_ SET _00_21=0.0 WHERE _00_21 IS NULL; 214 | UPDATE balance_tva_ SET _21=0.0 WHERE _21 IS NULL; 215 | UPDATE balance_tva_ SET _21_55=0.0 WHERE _21_55 IS NULL; 216 | UPDATE balance_tva_ SET _55=0.0 WHERE _55 IS NULL; 217 | UPDATE balance_tva_ SET _55_70=0.0 WHERE _55_70 IS NULL; 218 | UPDATE balance_tva_ SET _70=0.0 WHERE _70 IS NULL; 219 | UPDATE balance_tva_ SET _70_100=0.0 WHERE _70_100 IS NULL; 220 | UPDATE balance_tva_ SET _100=0.0 WHERE _100 IS NULL; 221 | UPDATE balance_tva_ SET _100_196=0.0 WHERE _100_196 IS NULL; 222 | UPDATE balance_tva_ SET _196=0.0 WHERE _196 IS NULL; 223 | UPDATE balance_tva_ SET _196_200=0.0 WHERE _196_200 IS NULL; 224 | UPDATE balance_tva_ SET _200=0.0 WHERE _200 IS NULL; 225 | UPDATE balance_tva_ SET sup_200=0.0 WHERE sup_200 IS NULL; 226 | 227 | UPDATE balance_tva_ SET _inv21 = val FROM ( SELECT ltrim(num_cpte_gen, '0') AS num_cpte_gen, lib_cpte_gen, sum(mtn_debit)+sum(mtn_credit) AS val FROM fec_ WHERE num_ecr IN (SELECT num_ecr FROM ecriture_ WHERE @taux_tva = round(@ 100/(2.1/100), 1)) GROUP BY ltrim(num_cpte_gen, '0'), lib_cpte_gen ) AS t WHERE ecr_cte_lig_gen_nid = t.num_cpte_gen AND ecr_cte_lig_gen_lib = t.lib_cpte_gen; 228 | UPDATE balance_tva_ SET _inv55 = val FROM ( SELECT ltrim(num_cpte_gen, '0') AS num_cpte_gen, lib_cpte_gen, sum(mtn_debit)+sum(mtn_credit) AS val FROM fec_ WHERE num_ecr IN (SELECT num_ecr FROM ecriture_ WHERE @taux_tva = round(@ 100/(5.5/100), 1)) GROUP BY ltrim(num_cpte_gen, '0'), lib_cpte_gen ) AS t WHERE ecr_cte_lig_gen_nid = t.num_cpte_gen AND ecr_cte_lig_gen_lib = t.lib_cpte_gen; 229 | UPDATE balance_tva_ SET _inv70 = val FROM ( SELECT ltrim(num_cpte_gen, '0') AS num_cpte_gen, lib_cpte_gen, sum(mtn_debit)+sum(mtn_credit) AS val FROM fec_ WHERE num_ecr IN (SELECT num_ecr FROM ecriture_ WHERE @taux_tva = round(@ 100/(7.0/100), 1)) GROUP BY ltrim(num_cpte_gen, '0'), lib_cpte_gen ) AS t WHERE ecr_cte_lig_gen_nid = t.num_cpte_gen AND ecr_cte_lig_gen_lib = t.lib_cpte_gen; 230 | UPDATE balance_tva_ SET _inv100 = val FROM ( SELECT ltrim(num_cpte_gen, '0') AS num_cpte_gen, lib_cpte_gen, sum(mtn_debit)+sum(mtn_credit) AS val FROM fec_ WHERE num_ecr IN (SELECT num_ecr FROM ecriture_ WHERE @taux_tva = round(@ 100/(10.0/100), 1)) GROUP BY ltrim(num_cpte_gen, '0'), lib_cpte_gen ) AS t WHERE ecr_cte_lig_gen_nid = t.num_cpte_gen AND ecr_cte_lig_gen_lib = t.lib_cpte_gen; 231 | UPDATE balance_tva_ SET _inv196 = val FROM ( SELECT ltrim(num_cpte_gen, '0') AS num_cpte_gen, lib_cpte_gen, sum(mtn_debit)+sum(mtn_credit) AS val FROM fec_ WHERE num_ecr IN (SELECT num_ecr FROM ecriture_ WHERE @taux_tva = round(@ 100/(19.6/100), 1)) GROUP BY ltrim(num_cpte_gen, '0'), lib_cpte_gen ) AS t WHERE ecr_cte_lig_gen_nid = t.num_cpte_gen AND ecr_cte_lig_gen_lib = t.lib_cpte_gen; 232 | UPDATE balance_tva_ SET _inv200 = val FROM ( SELECT ltrim(num_cpte_gen, '0') AS num_cpte_gen, lib_cpte_gen, sum(mtn_debit)+sum(mtn_credit) AS val FROM fec_ WHERE num_ecr IN (SELECT num_ecr FROM ecriture_ WHERE @taux_tva = round(@ 100/(20.0/100), 1)) GROUP BY ltrim(num_cpte_gen, '0'), lib_cpte_gen ) AS t WHERE ecr_cte_lig_gen_nid = t.num_cpte_gen AND ecr_cte_lig_gen_lib = t.lib_cpte_gen; 233 | 234 | UPDATE balance_tva_ SET _inv21=0.0 WHERE _inv21 IS NULL; 235 | UPDATE balance_tva_ SET _inv55=0.0 WHERE _inv55 IS NULL; 236 | UPDATE balance_tva_ SET _inv70=0.0 WHERE _inv70 IS NULL; 237 | UPDATE balance_tva_ SET _inv100=0.0 WHERE _inv100 IS NULL; 238 | UPDATE balance_tva_ SET _inv196=0.0 WHERE _inv196 IS NULL; 239 | UPDATE balance_tva_ SET _inv200=0.0 WHERE _inv200 IS NULL; 240 | 241 | 242 | COMMIT; -------------------------------------------------------------------------------- /src/testeur/init.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | 3 | #Copyright (C) 2014 Direction Generale des Finances Publiques 4 | # 5 | #This software is governed by the CeCILL license under French law and 6 | #abiding by the rules of distribution of free software. You can use, 7 | #modify and/ or redistribute the software under the terms of the CeCILL 8 | #license as circulated by CEA, CNRS and INRIA at the following URL 9 | #"http://www.cecill.info". 10 | # 11 | #As a counterpart to the access to the source code and rights to copy, 12 | #modify and redistribute granted by the license, users are provided only 13 | #with a limited warranty and the software's author, the holder of the 14 | #economic rights, and the successive licensors have only limited 15 | #liability. 16 | # 17 | #In this respect, the user's attention is drawn to the risks associated 18 | #with loading, using, modifying and/or developing or reproducing the 19 | #software by the user in light of its specific status of free software, 20 | #that may mean that it is complicated to manipulate, and that also 21 | #therefore means that it is reserved for developers and experienced 22 | #professionals having in-depth computer knowledge. Users are therefore 23 | #encouraged to load and test the software's suitability as regards their 24 | #requirements in conditions enabling the security of their systems and/or 25 | #data to be ensured and, more generally, to use and operate it in the 26 | #same conditions as regards security. 27 | # 28 | #The fact that you are presently reading this means that you have had 29 | #knowledge of the CeCILL license and that you accept its terms. 30 | # 31 | #!/usr/bin/perl 32 | 33 | use Tk; 34 | use Cwd qw ( abs_path ); 35 | use Env; 36 | use Config; 37 | use utf8; 38 | no utf8; 39 | use Encode; 40 | use strict; 41 | use File::Basename; 42 | use File::Copy; 43 | use File::Path; 44 | use Archive::Tar; 45 | 46 | my $currdir = dirname( abs_path($0) ); 47 | require "$currdir/environnement_alto2.pl"; 48 | &Env_Path; 49 | our $ProgramFiles = "$ENV{ProgramFiles}"; 50 | our $ProgramData = "$ENV{ProgramData}"; 51 | 52 | 53 | require "$currdir/alto2_fonctions.pl"; 54 | require "$currdir/trt_entete.pl"; 55 | 56 | 57 | 58 | 59 | # logs en base pg 60 | our $dbhlog; 61 | my $dbh; 62 | our $REQ; 63 | our $log_seq; 64 | our $errmsg; 65 | 66 | # fin logs 67 | my $OS = $Config{osname}; 68 | my $Archi = $Config{archname}; 69 | 70 | my $start_dir; 71 | my $alpage; 72 | my $file; 73 | my $xml_file; 74 | my $plat_file; 75 | my $entetefile; 76 | my $line; 77 | my $i; 78 | my $rc; 79 | my $sep = ""; 80 | my $text_alert = ""; 81 | my $bic; 82 | my @files; 83 | my $log_file = ""; 84 | my $err_file = ""; 85 | my $siren = ""; 86 | my $datecloture = ""; 87 | my $nom_societe; 88 | my $exe_ou_pl = basename($0); 89 | my $dirname = dirname($0); 90 | my $currdir = dirname( abs_path($0) ); 91 | our $Rep_Alim_ou_Testeur = "alimentation"; 92 | my $ctl = $ARGV[0]; 93 | our $Aorte = &aorte(); 94 | if ( $Aorte eq "t" ) { 95 | $Rep_Alim_ou_Testeur = "testeur"; 96 | } 97 | #my $workdir = $currdir . "/temp/"; 98 | my $workdir = $ProgramData . "/${Rep_Alim_ou_Testeur}/temp/"; 99 | #my $err_init = "log/err_" . basename( $0, qw(.exe) ) . "_.log"; 100 | my $err_init = $ProgramData . "/${Rep_Alim_ou_Testeur}/log/err_" . basename( $0, qw(.exe) ) . "_.log"; 101 | our $conn_local = ""; 102 | our $conn_distant = ""; 103 | our $ldap_distant = ""; 104 | my $id = ""; 105 | our $conn_base = ""; 106 | # RG:T:$mot_passe ne doit pas être défini, testé plus tard dans le code /!\ 107 | our $mot_passe ; 108 | our $serveur_choisi = ""; 109 | open( IF, "> $err_init" ); 110 | close IF; # creation vide , ensuite trace en ajout... 111 | 112 | if ( $Aorte ne "t" ) { 113 | # parsing xml config 114 | ( $conn_local, $conn_distant, $ldap_distant ) = &parse_xml("alto2.xml"); 115 | } 116 | 117 | # print STDERR "$conn_local, $conn_distant, $ldap_distant"; 118 | $serveur_choisi = $conn_local; 119 | 120 | my $tar; 121 | if ( $exe_ou_pl !~ m/\./ ) { 122 | $exe_ou_pl = ".exe"; 123 | } 124 | else { 125 | $exe_ou_pl =~ s/^.*(\..+)$/$1/; 126 | } 127 | 128 | if ( ${OS} =~ m/linux/i ) { 129 | $start_dir = "./"; 130 | } 131 | else { 132 | # todo : remplacer par dirname ? 133 | 134 | # $workdir = "${currdir}/temp/"; 135 | # $start_dir = substr( "${currdir}", 0, 2 ); 136 | $workdir = "${ProgramData}/${Rep_Alim_ou_Testeur}/temp/"; 137 | $start_dir = substr( "${currdir}", 0, 2 ); 138 | } 139 | if ( !-d $workdir ) { 140 | mkdir($workdir); 141 | } 142 | 143 | if ( !defined $ctl ) { 144 | $ctl = "IMP"; 145 | } 146 | my $fen = MainWindow->new(); 147 | $fen->geometry("360x380+20+20"); 148 | 149 | if ( $Aorte eq "t" ) { 150 | $fen->title( &utf8toutf8("Test de Compta Démat") ); 151 | } 152 | else { 153 | if ( lc($ctl) eq "ctl" ) { 154 | $fen->title( &utf8toutf8("Alto2 - Contrôle") ); 155 | } 156 | else { 157 | $fen->title("Alto2 - Alimentation"); 158 | } 159 | } 160 | my $fen1 = $fen->Frame; 161 | my $label1 = $fen1->Label( 162 | -text => &utf8toutf8("Entrer le numéro alpage\n du dossier :") ) 163 | ->pack( -side => 'left' ); 164 | my $entree = 165 | $fen1->Entry( -textvariable => \$alpage, -background => 'cyan' ) 166 | ->pack( -side => 'right' ); 167 | $fen1->pack( -side => 'top', -pady => '5' ); 168 | my $fen_nom = $fen->Frame; 169 | my $label2 = $fen_nom->Label( 170 | -text => &utf8toutf8("Entrer le nom de \nla société :") ) 171 | ->pack( -side => 'left' ); 172 | my $entree2 = 173 | $fen_nom->Entry( -textvariable => \$nom_societe, -background => 'cyan' ) 174 | ->pack( -side => 'right' ); 175 | $fen_nom->pack( -side => 'top', -pady => '5' ); 176 | 177 | my $pcg; 178 | my $fen3 = $fen->Frame->pack(); 179 | my $fen3g = $fen3->Frame->pack( -side => 'left' ); 180 | my $fen3d = $fen3->Frame->pack( -side => 'right' ); 181 | my $lbl_pc = $fen3g->Label( -text => "Type de plan comptable " )->pack(); 182 | my @lst_pc = ( 183 | &utf8toutf8('PCGénéral'), 184 | "PC assurance \net capitalisation", 185 | &utf8toutf8("PC établissements \nde crédit"), 186 | &utf8toutf8("PC établissements \nd'investissement") 187 | ); 188 | my @lst_code = ( 'PCG', 'PCPAC', 'PCEC', 'PCEI' ); 189 | my @lbl_r; 190 | 191 | for ( $i = 0 ; $i <= $#lst_pc ; $i++ ) { 192 | $lbl_r[$i] = $fen3g->Radiobutton( 193 | -text => $lst_pc[$i], 194 | -value => $lst_code[$i], 195 | -variable => \$pcg, 196 | -anchor => 'w' 197 | )->pack( -side => "top", -anchor => 'w' ); 198 | } 199 | $lbl_r[0]->select(); 200 | 201 | my $lbl_pc_1 = $fen3d->Label( -text => "Type de revenus " )->pack(); 202 | my @lst_rev = ( 203 | 'BIC/IS', 204 | "BNC ou BA\n Droit commercial", 205 | &utf8toutf8("BA, \nTrésorerie"), 206 | &utf8toutf8("BNC \nTrésorerie") 207 | ); 208 | my @lst_coderev = ( 'BIC', 'COM', 'BAT', 'BNCT' ); 209 | my @lbl_rb; 210 | for ( $i = 0 ; $i <= $#lst_rev ; $i++ ) { 211 | $lbl_rb[$i] = $fen3d->Radiobutton( 212 | -text => $lst_rev[$i], 213 | -value => $lst_coderev[$i], 214 | -variable => \$bic, 215 | -anchor => 'w' 216 | )->pack( -side => "top", -anchor => 'w' ); 217 | } 218 | $lbl_rb[0]->select(); 219 | 220 | # ACCES LOCAL/DISTANT 221 | my $butlocal; 222 | my $butdistant; 223 | my $fen4; 224 | my $entree3; 225 | if ( $conn_distant ne "" ) { 226 | my @list_dist = split /\@/, $ldap_distant; 227 | $id = $list_dist[0]; 228 | $fen4 = $fen->Frame->pack( -side => 'top', -pady => '5' ); 229 | my $fen41 = $fen4->Frame->pack( -side => 'left', -pady => '5' ); 230 | my $fen42 = $fen4->Frame->pack( -side => 'right', -pady => '5' ); 231 | 232 | $butlocal = $fen41->Button( 233 | -text => "Portable", 234 | -command => \&choix_serveur, 235 | -relief => 'sunken' 236 | )->pack( -side => 'left' ); 237 | $butdistant = $fen41->Button( 238 | -text => "Serveur", 239 | -command => \&choix_serveur, 240 | -relief => 'raised' 241 | )->pack( -side => 'left' ); 242 | 243 | my $label7 = 244 | $fen42->Label( -text => &utf8toutf8( "identifiant : " . $id ) ) 245 | ->pack( -side => 'top' ); 246 | my $label6 = 247 | $fen42->Label( -text => &utf8toutf8("mot passe :") ) 248 | ->pack( -side => 'left' ); 249 | $entree3 = $fen42->Entry( 250 | -textvariable => \$mot_passe, 251 | -background => 'cyan', 252 | -show => '*', 253 | -state => 'disabled' 254 | )->pack( -side => 'right' ); 255 | 256 | } 257 | 258 | my $fen2 = $fen->Frame; 259 | 260 | my $alerte = 261 | $fen2->Label( -textvariable => \$text_alert, -foreground => 'red' )->pack(); 262 | my $Button1 = $fen2->Button( 263 | -text => &utf8toutf8('Selectionner un fichier à traiter'), 264 | -command => \&traitement 265 | )->pack(); 266 | 267 | $fen2->pack( -side => 'bottom' ); 268 | 269 | sub traitement() { 270 | $text_alert = ""; 271 | my $fille; 272 | $conn_base = $conn_local; 273 | if ( ( &aorte() ne "t" ) and ( defined $mot_passe ) ) { 274 | if ( &verif_ldap( $mot_passe, $ldap_distant ) ) { 275 | $conn_base = $conn_distant; 276 | $entree3->configure( -background => 'cyan' ); 277 | $fen->update; 278 | } 279 | else { 280 | $entree3->configure( -background => 'red' ); 281 | $text_alert .= &utf8toutf8( 282 | " Le mot de passe est incorrect pour cet identifiant "); 283 | 284 | $fen->update; 285 | return; 286 | } 287 | } 288 | $fille = MainWindow->new(); 289 | $fille->geometry("150x50+420+0"); 290 | $fille->title("Fichier :"); 291 | $fille->Label( -text => "\nVeuillez patientez svp...\n\n" )->pack(); 292 | 293 | # Modif pour compatibilite Windows/Linux 294 | # my @af_files = 295 | my $af_files = 296 | $fille->getOpenFile( -initialdir => $start_dir, -multiple => 1 ); 297 | 298 | #RG:F:Numéro alpage saisi au format a-z, A-Z, 0-9 ou - :E 299 | if ( $alpage eq "" || $alpage !~ /^[a-zA-Z0-9-]*$/ ) { 300 | $text_alert .= &utf8toutf8(" Le numéro au format alpage est requis "); 301 | $entree->configure( -background => 'red' ); 302 | undef @files; 303 | undef $af_files; 304 | $fille->destroy() if defined $fille; 305 | $fen->update; 306 | } 307 | else { 308 | #RG:T:Remplacement du - par _ dans le numéro alpage :I 309 | $alpage =~ s/-/_/g; 310 | $alpage = lc($alpage); 311 | $entree->configure( -background => 'cyan' ); 312 | $fen->update; 313 | } 314 | 315 | #RG:T:Traitement des accents dans le nom du fichier 316 | 317 | #spec 02-2014 : nom société quote doublée 318 | $nom_societe =~ s/\'/\'\'/g; 319 | 320 | # Modif pour compatibilite Windows/Linux 321 | # foreach my $file1 (@af_files) { 322 | foreach my $file1 ( @{$af_files} ) { 323 | if ( ${OS} !~ m/linux/i ) { 324 | $file1 = encode( 'iso-8859-1', $file1 ); 325 | } 326 | my $filename = basename($file1); 327 | my $copie_a_faire = 1; 328 | if ( -f $workdir . $filename ) { 329 | my $taille1 = ( stat("$file1") )[7]; 330 | my $taille2 = ( stat( $workdir . $filename ) )[7]; 331 | if ( $taille1 == $taille2 && $taille1 > 1000000 ) { 332 | $copie_a_faire = 0; 333 | } 334 | 335 | } 336 | 337 | copy( $file1, $workdir . $filename ) if ( $copie_a_faire == 1 ); 338 | $file = $workdir . $filename; 339 | push( @files, $file ); 340 | } 341 | 342 | #RG:T:Traitement anciens formats 343 | if ( &aorte eq "a" ) { 344 | 345 | if ( 346 | ( uc($file) =~ m/(.*)\.TRA$/ ) 347 | || ( uc($file) =~ m/(.*)\.TXT$/ 348 | && uc($file) !~ 349 | m/^.*\/(.*)FEC(20[0-9]{2}[0-1][0-9][0-3][0-9])/ ) 350 | || ( uc($file) =~ m/(.*)\.DBF$/ ) 351 | ) 352 | { 353 | if ( $#files > 1 ) { 354 | $text_alert .= &utf8toutf8( 355 | " Les anciens formats doivent être sélectionnés un par un \n" 356 | ); 357 | $fen->update; 358 | return; 359 | } 360 | 361 | #RG:T:Traitement spécifique pour les anciens formats ebp... :I 362 | &init_dossier or die "Probleme d'accès à Postgres"; 363 | my $curdir = dirname( @{$af_files}[0] ); 364 | $err_file = "${ProgramData}" . "/${Rep_Alim_ou_Testeur}/log/err_" . basename( ${file} ) . "_AF.log"; 365 | $rc = 366 | `trt_old_format_cpta$exe_ou_pl -f \"$file\" -n $log_seq -t \"$exe_ou_pl\" -c \"$curdir\" 2> \"${err_file}\"`; 367 | if ( $rc eq "Abort" ) { 368 | $text_alert .= &utf8toutf8( 369 | " Problème dans le traitement de l'ancien format de compta\n Veuillez analyser les logs\n" 370 | ); 371 | $fen->update; 372 | return; 373 | } 374 | else { 375 | undef @files; 376 | push( @files, $rc ); 377 | $file = $files[0]; 378 | } 379 | } 380 | 381 | # RG:T:Traitement fichiers access mdb 382 | if ( lc($file) =~ m/(.*)\.mdb$/ ) { 383 | if ( $#files > 1 ) { 384 | $text_alert .= &utf8toutf8( 385 | " Les fichiers access doivent être séléctionnés un par un \n" 386 | ); 387 | $fen->update; 388 | return; 389 | } 390 | $err_file = "${ProgramData}" . "/${Rep_Alim_ou_Testeur}/log/err_" . basename( ${file} ) . "_access.log"; 391 | &init_dossier or die "Probleme d'accès à Postgres"; 392 | $rc = 393 | `trt_mdb$exe_ou_pl -f \"$file\" -l \"${err_file}_mdb\" -n $log_seq 2> \"${err_file}_mdb\"`; 394 | @files = split /;/, $rc; 395 | } 396 | } 397 | if ( $text_alert ne "" ) { return; } 398 | foreach my $file1 (@files) { 399 | $file = $file1; 400 | $entetefile = $file; 401 | $plat_file = $file; 402 | $entetefile =~ s/$/.entete/; 403 | uc($file) =~ m/^.*\/(.*)FEC(20[0-9]{2}[0-1][0-9][0-3][0-9])/; 404 | $siren = $1; 405 | $datecloture = $2; 406 | 407 | #RG:T:Vérification que le nom du fichier en entree correspond à l'attendu de l'arrêté :E 408 | 409 | if ( ( $siren eq "" ) || ( $datecloture eq "" ) ) { 410 | $text_alert .= &utf8toutf8( 411 | "\n Le nom du fichier $file est incorrect \n attendu sirenFECAAAAMMJJ \n re-essayez en ne sélectionnant qu'un fichier'" 412 | ); 413 | $fille->destroy() if defined $fille; 414 | undef @files; 415 | $fen->update; 416 | 417 | return; 418 | } 419 | $log_file = "${ProgramData}" . "/${Rep_Alim_ou_Testeur}/log/log_${siren}_$datecloture.log"; 420 | $err_file = "${ProgramData}" . "/${Rep_Alim_ou_Testeur}/log/err_${siren}_$datecloture.log"; 421 | 422 | &init_dossier or die "Probleme d'accès à Postgres"; 423 | 424 | open( my $hf, "<", "$file" ) 425 | or &trace( "Impossible de trouver $file", "finko" ); 426 | my $crlf = &detecte_macfile($hf); 427 | close $hf; 428 | 429 | open( F, "< $file" ) 430 | or &trace( "Impossible de trouver $file", "finko" ); 431 | binmode F, ":raw"; 432 | local $/ = $crlf; 433 | 434 | my $pref_chem = ""; 435 | if ( ${OS} =~ m/linux/i ) { 436 | #$pref_chem = "./"; 437 | $pref_chem = "$currdir/"; 438 | } 439 | 440 | while ( $line = ) { last; } 441 | close F; 442 | 443 | $line =~ s/\r\n|\r$//; 444 | $line =~ s/\c@//g; 445 | 446 | chomp $line; 447 | if ( $line =~ m/^<\?xml/i || $line =~ m/^...<\?xml/i ) 448 | { # traitement xml_file 449 | # /$1/; 452 | 453 | # chdir "$dirname" ; 454 | # copie des format xsd arrêté 455 | # print STDERR cwd(); 456 | if ( $line =~ /ISO-8859-15/ ) { 457 | my $cont_iso = 458 | &modif_acces_direct( $file, 80, 'ISO-8859-15"', 459 | 'ISO-8859-1" ' ); 460 | if ( $cont_iso == 2 ) { 461 | &trace( "Problème sur la gestion de l'encodage xml", 462 | "finko" ); 463 | } 464 | 465 | } 466 | elsif ( $line =~ /iso-8859-15/ ) { 467 | my $cont_iso = 468 | &modif_acces_direct( $file, 80, 'iso-8859-15"', 469 | 'iso-8859-1" ' ); 470 | if ( $cont_iso == 2 ) { 471 | &trace( "Problème sur la gestion de l'encodage xml", 472 | "finko" ); 473 | } 474 | } 475 | 476 | # if ( ${OS} !~ m/linux/i ) { 477 | 478 | my $cont_xsd = &modif_acces_direct( 479 | $file, 300, 480 | 'xsi:noNamespaceSchemaLocation="file:formatA47A', 481 | ' xsi:noNamespaceSchemaLocation="formatA47A' 482 | ); 483 | if ( $cont_xsd == 2 ) { 484 | &trace( "Problème sur la gestion du lien file xsd", 485 | "finko" ); 486 | } 487 | elsif ( $cont_xsd == 3 ) { 488 | &faire_pdf( 489 | "Le fichier XML ne respecte pas les spécifications publiés sur le site impots.gouv.fr, relatives à la structure du fichier XSD." 490 | ); 491 | exit 1; 492 | } 493 | 494 | chdir "${ProgramData}/${Rep_Alim_ou_Testeur}"; 495 | $tar = Archive::Tar->new("formats_xsd.tar"); 496 | &trace( $tar->error, "finko" ) unless $tar->extract; 497 | chdir "${ProgramFiles}/${Rep_Alim_ou_Testeur}"; 498 | 499 | my $xmllintpath = ""; 500 | if ( ${OS} !~ m/linux/i ) { 501 | if ( -d "${ProgramFiles}/xmllint_x86_64" ) { 502 | $xmllintpath = "${ProgramFiles}/xmllint_x86_64/"; 503 | } else { 504 | # $tar = Archive::Tar->new("xmllint.tar"); 505 | # &trace( $tar->error, "finko" ) unless $tar->extract; 506 | # if ( $Archi =~ /win32-x64/i ) { 507 | # $xmllintpath = "${currdir}/xmllint_x86_64/"; 508 | # } else { 509 | # if ( $Archi =~ /win32/i ) { 510 | # $xmllintpath = "${currdir}/xmllint_x86/"; 511 | # } else { 512 | # $xmllintpath = "${currdir}/xmllint_AMD64/"; 513 | # } 514 | # } 515 | $xmllintpath = "${ProgramFiles}/xmllint_x86/"; 516 | } 517 | } 518 | 519 | my $rc2 = 0; 520 | # if ( ${OS} !~ m/linux/i ) { 521 | # 522 | # # $? retourne 0 ok, ou 1 ko , le $rc est mis en base 523 | # # if ($ctl ne "NOX" ) { 524 | # $rc = `StdInParse.exe -n -f -s -v=always < \"$file\" 2>&1 `; 525 | # 526 | # # } 527 | # #else { 528 | # # $ctl='CTL'; 529 | # # $rc=""; 530 | # #} 531 | # $rc2 = $?; 532 | # } 533 | # else { 534 | my $read_buffer = ""; 535 | open( FT, "+< :raw", $file ) or die "impossible"; 536 | 537 | my $read_nb = 0; 538 | $read_nb = sysread FT, $read_buffer, 300; 539 | close FT; 540 | if ( $read_buffer =~ m/noNamespaceSchemaLocation(.*)=(.*)"(.*).xsd"(.*)/i ) { 541 | my $xsdfile = $3 . ".xsd"; 542 | $xsdfile =~ s/file://; 543 | $xsdfile = "${ProgramData}/${Rep_Alim_ou_Testeur}/${xsdfile}"; 544 | $rc = `\"${xmllintpath}xmllint\" --noout \"$file\" --schema \"$xsdfile\" 2>&1 `; 545 | $rc2 = $?; 546 | } else { 547 | $rc2 = 1; 548 | } 549 | # } 550 | if ( $rc2 ne 0 ) { 551 | 552 | # erreur 553 | $text_alert .= &utf8toutf8( 554 | "Format de fichier non pris en charge \n Fichier xml non conforme au xsd " 555 | ); 556 | 557 | &trace( "Pb au parseur xml : $rc ", "" ); 558 | $fille->destroy() if defined $fille; 559 | undef @files; 560 | $fen->update; 561 | 562 | # fiche 14 563 | &faire_pdf( 564 | "Le fichier XML ne respecte pas les spécifications publiés sur le site impots.gouv.fr, relatives à la structure du fichier XSD." 565 | ); 566 | exit 1; 567 | 568 | # return; 569 | } 570 | my $xmllint_dir = "${currdir}/xmllint_x86"; 571 | rmtree(${xmllint_dir}); 572 | $xmllint_dir = "${currdir}/xmllint_x86_64"; 573 | rmtree(${xmllint_dir}); 574 | $xmllint_dir = "${currdir}/xmllint_AMD64"; 575 | rmtree(${xmllint_dir}); 576 | unlink ; 577 | # } 578 | $xml_file = $file; 579 | $file =~ s/[\.xml]*$/.dat/i; 580 | 581 | $rc = system( 582 | "${pref_chem}trt_xml$exe_ou_pl -o \"$file\" -f \"$xml_file\" -T EXERCICE -t JOURNAL -n $log_seq -e \"$line\" 2>${err_file}_xml" 583 | ); # ajouter -d pour activer les traces sur xml 584 | if ( $rc > 0 ) { &finko("${err_file}_xml"); } 585 | 586 | system( 587 | "${pref_chem}trt_txt$exe_ou_pl \"$file\" P $siren $alpage $datecloture $err_file $pcg $bic \"$nom_societe\" \"$ctl\" $log_seq \"$conn_base\" \"$id\" " 588 | ); #>$log_file 2>$err_file "); 589 | } # fin traitement xml_file 590 | else { # traitement plat 591 | #RG:T:recherche du séparateur dans le fichier tab ou | traitement spécifique:I 592 | # détection type fichier 593 | #RG:F:fiche 16 : à compter 1/1/2013 vir et pvi interdits 594 | my @comp_tab = split /\t/, $line; 595 | my @comp_pip = split /\|/, $line; 596 | my @comp_pvi = split /;/, $line; 597 | my @comp_vir = split /,/, $line; 598 | if ( $#comp_tab >= 8 ) { $sep = "T"; } 599 | elsif ( $#comp_pip >= 8 ) { $sep = "P"; } 600 | elsif ( ( not &arrete2013($datecloture) ) and $#comp_vir >= 8 ) { 601 | $sep = "V"; 602 | } 603 | elsif ( ( not &arrete2013($datecloture) ) and $#comp_pvi >= 8 ) { 604 | $sep = "PV"; 605 | } 606 | else { 607 | $text_alert .= &utf8toutf8( 608 | "Format de fichier non conforme.\n Séparateur dans le fichier non conforme" 609 | ); 610 | $fen->update; 611 | return; 612 | } 613 | 614 | 615 | #RG:F:transformation entete champs arrete => champs base:I 616 | #$rc = system("trt_entete$exe_ou_pl -o \"$entetefile\" -f \"$plat_file\" -s \"$sep\" -n $log_seq 2>${err_file}_entete" ); 617 | $rc = &sub_entete( "$entetefile", "$plat_file", "$sep", $log_seq ); 618 | if ( $rc > 0 ) { 619 | &trace( "$errmsg", "finko" ); 620 | #&finko("${err_file}_entete"); 621 | } 622 | $rc = system( 623 | "${pref_chem}trt_txt$exe_ou_pl \"$file\" $sep $siren $alpage $datecloture $err_file $pcg $bic \"$nom_societe\" \"$ctl\" $log_seq \"$conn_base\" \"$id\" " 624 | ); #>$log_file 2>$err_file "); 625 | if ( $rc > 0 ) { 626 | print STDERR 627 | "${pref_chem}trt_txt$exe_ou_pl \"$file\" $sep $siren $alpage $datecloture $err_file $pcg $bic \"$nom_societe\" \"$ctl\" $log_seq \"$conn_base\" \"$id\" " 628 | ; # &finko("${err_file}"; 629 | exit 1; 630 | } 631 | } # fin traitement plat 632 | } # fin foreach 633 | &fin(); 634 | } # fin sub traitement 635 | 636 | sub choix_serveur () { 637 | if ( $serveur_choisi eq $conn_local ) { 638 | $butlocal->configure( -relief => 'raised' ); 639 | $butdistant->configure( -relief => 'sunken' ); 640 | $serveur_choisi = $conn_distant; 641 | $entree3->configure( -state => 'normal' ); 642 | 643 | } 644 | else { 645 | $serveur_choisi = $conn_local; 646 | $butlocal->configure( -relief => 'sunken' ); 647 | $butdistant->configure( -relief => 'raised' ); 648 | $entree3->configure( -state => 'disabled' ); 649 | 650 | } 651 | $fen4->update(); 652 | 653 | } 654 | 655 | sub finko () { 656 | my ($log_temp) = @_; 657 | print STDERR "Sortie KO"; 658 | close IF; 659 | if ( ${OS} =~ m/linux/i ) { 660 | exec("gedit ${log_temp}"); 661 | } 662 | else { 663 | #exec("start wordpad \"${log_temp}\""); 664 | exec("start notepad \"${log_temp}\" "); 665 | } 666 | 667 | exit 1; 668 | } 669 | 670 | sub fin () { 671 | 672 | #todo : chemin variable 673 | my $workdir = "${ProgramData}/${Rep_Alim_ou_Testeur}/temp"; 674 | if ( ${OS} =~ m/linux/i ) { 675 | $workdir = "${ProgramData}/${Rep_Alim_ou_Testeur}/temp"; 676 | rmtree($workdir); 677 | } 678 | else { 679 | rmtree($workdir); 680 | } 681 | close IF; 682 | exit 0; 683 | } 684 | 685 | sub trace() { 686 | 687 | my ( $log_trace, $fin ) = @_; 688 | open( IF, ">> $err_init" ); 689 | print IF "$log_trace"; 690 | close IF; 691 | if ( $fin eq "finko" ) { 692 | &finko("${err_init}"); 693 | } 694 | } 695 | 696 | sub init_dossier() { 697 | 698 | # Mise en place base sqlite pour les traces en vue d'être plus portable 699 | 700 | # ouverture des logs 701 | # si $dblogname n'existe pas, création du fichier vide automatiquement 702 | $dbhlog = &connexion_log( "altoweb2", $dbh, "nocreate" ); 703 | 704 | # --heure_etape TEXT DEFAULT (strftime('%Y-%m-%d %H:%M:%S','now', 'localtime')), 705 | 706 | $dbhlog->do( 707 | "CREATE TABLE if not exists log_alim 708 | ( id_trait INT , 709 | id_ligne INTEGER PRIMARY KEY AUTOINCREMENT, 710 | type_log TEXT, 711 | texte_log INTEGER, 712 | val1 text, 713 | val2 text 714 | )" 715 | ) or &trace( $DBI::errstr, 'finko' ); 716 | 717 | #unique on conflict ignore 718 | $dbhlog->do( 719 | "CREATE TABLE if not exists log_type 720 | ( id_type INTEGER , 721 | fixe_log text unique on conflict ignore 722 | ) " 723 | ) or &trace( $DBI::errstr, 'finko' ); 724 | 725 | $dbhlog->do( 726 | "CREATE TABLE if not exists suivi_alim 727 | ( id_trait INTEGER PRIMARY KEY AUTOINCREMENT, 728 | num_alpage text, 729 | nom_fichier text, 730 | date_cloture text, 731 | heure_etape text DEFAULT (strftime('%Y-%m-%d %H:%M:%S','now', 'localtime')), 732 | db_cree boolean 733 | )" 734 | ) or &trace( $DBI::errstr, 'finko' ); 735 | 736 | $REQ = 737 | "INSERT into suivi_alim ( num_alpage , nom_fichier, date_cloture , db_cree ) 738 | values ('$alpage','$file','$datecloture',0);"; 739 | $dbhlog->do($REQ) 740 | or &trace( " Insert en table de suivi impossible", 'finko' ); 741 | $log_seq = &recup_noseq; 742 | $REQ = "INSERT into log_type (id_type,fixe_log) values (1,'init');"; 743 | 744 | $dbhlog->do($REQ) 745 | or &trace( " Insert en table fixe_log impossible", 'finko' ); 746 | } 747 | 748 | sub faire_pdf() { 749 | my ($texte_erreur) = @_; 750 | require "$currdir/alto2_pdf.pl"; 751 | 752 | use utf8; 753 | my $text_to_place ; 754 | if ( &aorte() ne "t" ) { 755 | 756 | $text_to_place = " ANNEXE\n"; 757 | } 758 | $text_to_place .= " CONTROLE DE LA STRUCTURE DU FEC 759 | 760 | (Conformément aux dispositions prévues à l'article A.47 A-1\n du livre des procédures fiscales)"; 761 | 762 | 763 | our $font_size = 13; 764 | our $align = "center"; 765 | my @result; 766 | my $vers_java=&verif_version_java(); 767 | chomp $vers_java; 768 | my $rResult = \@result; 769 | 770 | &ombre( $text_to_place, 185, 80 ); 771 | $align = "center"; 772 | $font_size = 11; 773 | $dbh = $dbhlog; 774 | $text_to_place ="Concerne le SIREN : $siren , Exercice clos le : $datecloture, Version : $vers_java " ; 775 | &ombre( $text_to_place, 190, 50 ); 776 | $align = "left"; 777 | 778 | # Champs oblig manquant 779 | 780 | $text_to_place = 781 | " La structure du fichier des écritures comptables remis ne peut être considérée comme conforme aux dispositions de l’article A.47 A-1 du Livre des Procédures Fiscales pour les raisons ci-dessous :"; 782 | 783 | &ajoute_paragraphe( $text_to_place, 180, 75 ); 784 | 785 | # ajoute le message d'erreur : 786 | &ajoute_paragraphe( &utf8toutf8($texte_erreur), 180, 75 ); 787 | 788 | 789 | &ajoute_paragraphe("La conformité structurelle du FEC ne présage pas de la régularité de la comptabilité, \nni de sa valeur probante.", 790 | 180, 50 ); 791 | 792 | 793 | if ( &aorte() eq "t" ) { 794 | &ajoute_paragraphe("Ce test a été effectué avec l'application Test Compta Démat version $vers_java. La synthèse des résultats ne constitue pas une attestation de conformité, elle ne saurait engager l'administration.",180,50); 795 | } 796 | my ( $sec, $min, $hour, $mday, $mon, $year ) = localtime(time); 797 | my $nouv_pdf = "${ProgramData}" . '/rapports/rapport_' . basename($file) . "_$hour$min$sec" . '.pdf'; 798 | 799 | &sauve_pdf($nouv_pdf); 800 | 801 | if ( ${OS} =~ m/linux/i ) { 802 | # system("evince $nouv_pdf"); 803 | system("xdg-open $nouv_pdf 2> /dev/null"); 804 | } 805 | else { 806 | system("start $nouv_pdf"); 807 | } 808 | } 809 | 810 | sub Tk::Error { 811 | my ( $Widget, $Error, @Locations ) = @_; 812 | &trace( "Erreur system : contacter l' AT : " . $Error, 'finko' ); 813 | 814 | } 815 | 816 | MainLoop; 817 | -------------------------------------------------------------------------------- /src/testeur/trt_txt.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | 3 | #Copyright (C) 2014 Direction Generale des Finances Publiques 4 | # 5 | #This software is governed by the CeCILL license under French law and 6 | #abiding by the rules of distribution of free software. You can use, 7 | #modify and/ or redistribute the software under the terms of the CeCILL 8 | #license as circulated by CEA, CNRS and INRIA at the following URL 9 | #"http://www.cecill.info". 10 | # 11 | #As a counterpart to the access to the source code and rights to copy, 12 | #modify and redistribute granted by the license, users are provided only 13 | #with a limited warranty and the software's author, the holder of the 14 | #economic rights, and the successive licensors have only limited 15 | #liability. 16 | # 17 | #In this respect, the user's attention is drawn to the risks associated 18 | #with loading, using, modifying and/or developing or reproducing the 19 | #software by the user in light of its specific status of free software, 20 | #that may mean that it is complicated to manipulate, and that also 21 | #therefore means that it is reserved for developers and experienced 22 | #professionals having in-depth computer knowledge. Users are therefore 23 | #encouraged to load and test the software's suitability as regards their 24 | #requirements in conditions enabling the security of their systems and/or 25 | #data to be ensured and, more generally, to use and operate it in the 26 | #same conditions as regards security. 27 | # 28 | #The fact that you are presently reading this means that you have had 29 | #knowledge of the CeCILL license and that you accept its terms. 30 | # 31 | #!/usr/bin/perl 32 | 33 | ## a enregistrer en utf8 34 | our $dbhlog; 35 | 36 | use Config; 37 | use POSIX qw/ceil/; 38 | use DBI; 39 | use Tk; 40 | use Tk::ProgressBar; 41 | use Tk::Pane; 42 | use Tk::Dialog; 43 | use Tk::MsgBox; 44 | #use Cwd; 45 | use Cwd qw ( abs_path ); 46 | use Env; 47 | use strict; 48 | use utf8; 49 | no utf8; 50 | use File::Basename; 51 | use File::Copy; 52 | use File::Path; 53 | use Encode; 54 | 55 | my $currdir = dirname( abs_path($0) ); 56 | require "$currdir/environnement_alto2.pl"; 57 | &Env_Path; 58 | our $ProgramFiles = "$ENV{ProgramFiles}"; 59 | our $ProgramData = "$ENV{ProgramData}"; 60 | 61 | 62 | require "$currdir/alto2_fonctions.pl"; 63 | 64 | 65 | our $Rep_Alim_ou_Testeur = "alimentation"; 66 | our $Aorte = &aorte(); 67 | if ( $Aorte eq "t" ) { 68 | $Rep_Alim_ou_Testeur = "testeur"; 69 | } 70 | 71 | 72 | our $OS = $Config{osname}; 73 | our $Archi = $Config{archname}; 74 | our $dbconnect; 75 | our $baseconnue = 0; 76 | my $REQ; 77 | our $nom_societe = $ARGV[8]; 78 | our $ctl = $ARGV[9]; 79 | my $crlf; 80 | 81 | # TODO : remplacer or die ... finko 82 | our $vers_java; 83 | my $dbname; 84 | our $file = $ARGV[0]; 85 | my $sep = $ARGV[1]; 86 | our $separateur = $sep; 87 | our @champs; 88 | my @champs_1; 89 | our @champs_base; 90 | my $i = 0; 91 | our $dbh; 92 | our $table; 93 | my $sth; 94 | my $j = 0; 95 | my $k = 0; 96 | my $trouve = 0; 97 | our %champs_arrete; 98 | our %mapping; 99 | my @val_ecr; 100 | my $line; 101 | my @Coche; 102 | my @chk; 103 | my @ZoneRep; 104 | our %r_mapping = (); # Table de hash multidim 105 | our $ref_mapping = \%r_mapping; 106 | our $alpage = $ARGV[3]; 107 | our $siren = $ARGV[2]; 108 | our $erreurs = 0; 109 | our $CREATE; 110 | our $datecloture = $ARGV[4]; 111 | my ($codepage) = ( `chcp` =~ m/: +(\d+)/ ); 112 | my $l = 0; 113 | my $lig1 = 0; 114 | my @list_5lig; 115 | our $majdrop = 'drop'; 116 | our $pcg = $ARGV[6]; 117 | our $cat_revenus = $ARGV[7]; 118 | our $conn_base = $ARGV[11]; 119 | our $id_util = $ARGV[12]; 120 | my $nligne = 0; 121 | my $auto = 0; 122 | my $auto_pos = 0; 123 | my $auto_num_enr = 0; 124 | my $old_date_cpt = ""; 125 | my $old_code_jrnal = ""; 126 | my $old_num_piece = ""; 127 | our $clause_tva = ""; 128 | our %somme; # d/c ecriture d/c cumul 129 | my $entetefile = $file; 130 | my $erreur_pg; 131 | our $log_seq = $ARGV[10]; 132 | my $encodage = ChercheEncodage(); 133 | our $nblines = 0; 134 | our %r_bilanctl = (); # Table de hash multidim _ trié : our ! 135 | our $rr_bilanctl = \%r_bilanctl; 136 | our $nb_bilanctl = 0; 137 | our $nb_errs = 0; 138 | 139 | # exp reg formatage date 140 | our $dt_sep = '[\/\-\.]*'; 141 | our $dt_a1 = '(?20[0-9]{2})'; 142 | our $dt_a2 = '(?19[0-9]{2})'; 143 | our $dt_a3 = '(?[0-9]{4})'; 144 | our $dt_m = '(?[0-1][0-9])'; 145 | our $dt_j = '(?[0-3][0-9])'; 146 | our $dt_h = '[T ][0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}'; 147 | 148 | #var traitement 149 | our $doublon = 0; 150 | our $nb_ligne_base ; 151 | our @liste_precedents_champs = ""; 152 | our $lu = 0; 153 | our $percent_done = 0; 154 | our $percent_sav = 0; 155 | our $Ligne_Tete; 156 | our $fentop; 157 | our $fen; 158 | our $fen2; 159 | our $Ligne_vide; 160 | our $progress; 161 | our $Alert_Texte; 162 | our $Ligne_Alert; 163 | our $nb_l = 0; 164 | our $rang_d = 0; 165 | our $rang_c = 0; 166 | our $type_champs = "Text"; 167 | # Ajout SPECs 22 11/01/2015 168 | our %Donnees_Absentes; 169 | our $don_abs; 170 | 171 | #our $conn_local ; 172 | #our $conn_distant; 173 | #our $ldap_distant; 174 | 175 | # Variable pour le calcul du taux de tva . 176 | my $taux_tva_reel = qq(round (CASE WHEN sum(CASE WHEN THEN mtn_credit-mtn_debit ELSE 0.0 END) > 0.0 THEN 177 | CASE WHEN sum(CASE WHEN NOT THEN mtn_credit ELSE 0.0 END) != 0.0 THEN 178 | sum(CASE WHEN THEN mtn_credit-mtn_debit ELSE 0.0 END) * 100 / 179 | sum(CASE WHEN NOT THEN mtn_credit ELSE 0.0 END) 180 | ELSE 0.0 END 181 | WHEN sum(CASE WHEN THEN mtn_credit-mtn_debit ELSE 0.0 END) < 0.0 THEN 182 | CASE WHEN sum(CASE WHEN NOT THEN mtn_debit ELSE 0.0 END) != 0.0 THEN 183 | -sum(CASE WHEN THEN mtn_debit-mtn_credit ELSE 0.0 END) * 100 / 184 | sum(CASE WHEN NOT THEN mtn_debit ELSE 0.0 END) 185 | ELSE 0.0 END ELSE 0.0 END, 4)); 186 | our $Calcul_Taux_TVA = qq( 187 | case 188 | when (-20.05 <= ($taux_tva_reel) and ($taux_tva_reel) <= -19.95) then -20.0000 189 | when (-19.65 <= ($taux_tva_reel) and ($taux_tva_reel) <= -19.55) then -19.6000 190 | when (-13.05 <= ($taux_tva_reel) and ($taux_tva_reel) <= -12.95) then -13.0000 191 | when (-10.05 <= ($taux_tva_reel) and ($taux_tva_reel) <= -9.95) then -10.0000 192 | when (-8.55 <= ($taux_tva_reel) and ($taux_tva_reel) <= -8.45) then -8.5000 193 | when (-7.05 <= ($taux_tva_reel) and ($taux_tva_reel) <= -6.95) then -7.0000 194 | when (-5.55 <= ($taux_tva_reel) and ($taux_tva_reel) <= -5.45) then -5.5000 195 | when (-2.15 <= ($taux_tva_reel) and ($taux_tva_reel) <= -2.05) then -2.1000 196 | when (-1.80 <= ($taux_tva_reel) and ($taux_tva_reel) <= -1.70) then -1.7500 197 | when (-1.10 <= ($taux_tva_reel) and ($taux_tva_reel) <= -1.00) then -1.0500 198 | when (-0.95 <= ($taux_tva_reel) and ($taux_tva_reel) <= -0.85) then -0.9000 199 | when (-0.05 <= ($taux_tva_reel) and ($taux_tva_reel) <= 0.05) then 0.0000 200 | when (0.85 <= ($taux_tva_reel) and ($taux_tva_reel) <= 0.95) then 0.9000 201 | when (1.00 <= ($taux_tva_reel) and ($taux_tva_reel) <= 1.10) then 1.0500 202 | when (1.70 <= ($taux_tva_reel) and ($taux_tva_reel) <= 1.80) then 1.7500 203 | when (2.05 <= ($taux_tva_reel) and ($taux_tva_reel) <= 2.15) then 2.1000 204 | when (5.45 <= ($taux_tva_reel) and ($taux_tva_reel) <= 5.55) then 5.5000 205 | when (6.95 <= ($taux_tva_reel) and ($taux_tva_reel) <= 7.05) then 7.0000 206 | when (8.45 <= ($taux_tva_reel) and ($taux_tva_reel) <= 8.55) then 8.5000 207 | when (9.95 <= ($taux_tva_reel) and ($taux_tva_reel) <= 10.05) then 10.0000 208 | when (12.95 <= ($taux_tva_reel) and ($taux_tva_reel) <= 13.05) then 13.0000 209 | when (19.55 <= ($taux_tva_reel) and ($taux_tva_reel) <= 19.65) then 19.6000 210 | when (19.95 <= ($taux_tva_reel) and ($taux_tva_reel) <= 20.05) then 20.0000 211 | else $taux_tva_reel 212 | end 213 | ); 214 | 215 | #RG:T:vérification présence module perl Postgres:E 216 | 217 | # ancienne gestion des logs 218 | 219 | $dbhlog = &connexion_log( "altoweb2", $dbh ); 220 | 221 | #RG:T:vérification connection postgres:I 222 | # récupération paramètre version dans le nom du dossier java 223 | $entetefile =~ s/$/.entete/; 224 | 225 | open( F, ${entetefile} ) or die "Impossible de trouver ${entetefile}"; 226 | if ( $sep eq "T" ) { $separateur = '\t'; } 227 | if ( $sep eq "P" ) { $separateur = '\|'; } 228 | if ( $sep eq "V" ) { $separateur = ','; } 229 | if ( $sep eq "PV" ) { $separateur = ';'; } 230 | while ( $line = ) { 231 | 232 | $line =~ s/ +$//; 233 | $line =~ s/\r\n|\r$//; 234 | #$line =~ s/\x0D\x0A$//; 235 | chomp $line; 236 | @champs_1 = split $separateur, $line; 237 | foreach $l (@champs_1) { 238 | $champs[ ++$#champs ] = uc($l); 239 | } 240 | $list_5lig[0] = $line; 241 | } 242 | close(F); 243 | 244 | # parsing xml config 245 | #($conn_local, $conn_distant , $ldap_distant)=&parse_xml("alto2.xml"); 246 | 247 | #&erreur("E","$conn_local, $conn_distant, $ldap_distant"); 248 | 249 | #open( F, "< :encoding(latin9) ", ${file} ) or die "Impossible de trouver $file "; 250 | open( my $hf, "<","$file"); 251 | $crlf = &detecte_macfile($hf); 252 | close $hf; 253 | 254 | open( F, "< ", ${file} ) or die "Impossible de trouver $file "; 255 | binmode F, ":raw"; 256 | local $/ = $crlf; 257 | 258 | while ( $line = ) { 259 | $line =~ s/ +$//; 260 | $line =~ s/\r\n|\r$//; 261 | #$line =~ s/\x0D\x0A$//; 262 | chomp $line; 263 | 264 | if ( $lig1 == 0 ) { 265 | $lig1++; 266 | next; 267 | } 268 | 269 | $list_5lig[ $lig1++ ] = $line; 270 | 271 | last if ( $lig1 > 5 ); 272 | } 273 | close(F); 274 | local $/ = "\n"; 275 | #RG:F:récupérer les noms de l'arrêté pour afficher les champs absents :I 276 | open( STRUC, "< ${ProgramData}/${Rep_Alim_ou_Testeur}/fmt_arrete" ) 277 | or ( &erreur( "E", "Impossible de trouver fmt_arrete" ) && &finko ); 278 | my $bil_rang = 0; 279 | 280 | 281 | #RG:T:Lire en log entete si fichier initial D/C ou M/S:I 282 | $REQ = 283 | "SELECT distinct(texte_log) from log_alim where id_trait = '$log_seq' and type_log='D' "; 284 | $dbh = $dbhlog; 285 | my @res_lotseq = &sql_1col($REQ); 286 | $dbh = undef; 287 | local $/ = "\n"; 288 | # print STDOUT $res_lotseq[0] . "\n"; 289 | while ( $line = ) { 290 | $line =~ s/\x0D\x0A$//; 291 | chomp $line; 292 | my ( $plat, $base, $libl_arrete ) = split /;/, $line; 293 | $plat = uc($plat); 294 | 295 | unless ( 296 | ( 297 | $res_lotseq[0] =~ /Sens/ 298 | && ( uc($plat) eq 'DEBIT' || uc($plat) eq 'CREDIT' ) 299 | ) 300 | || ( $res_lotseq[0] !~ /Sens/ 301 | && ( uc($plat) eq 'MONTANT' || uc($plat) eq 'SENS' ) ) 302 | ) 303 | { 304 | $champs_arrete{ uc($base) } = uc($plat); 305 | $bil_rang = $libl_arrete; 306 | $bil_rang =~ s/\..*$//; 307 | $r_bilanctl{$plat}{'rang'} = $bil_rang; 308 | $r_bilanctl{$plat}{'lib'} = conv_to_iso($libl_arrete); 309 | $r_bilanctl{$plat}{'nomFEC'} = ''; 310 | 311 | } 312 | 313 | } 314 | close(STRUC); 315 | #fin structure 316 | 317 | open( SQL, "< ${ProgramData}/${Rep_Alim_ou_Testeur}/SQL/FEC${cat_revenus}.sql" ) 318 | or die "Impossible de trouver ${ProgramData}/${Rep_Alim_ou_Testeur}/SQL/FEC${cat_revenus}.sql"; 319 | 320 | # Ajout SPECs 22 11/01/2015 321 | if ( ${cat_revenus} eq "COM" || ${cat_revenus} eq "BIC") { 322 | $Donnees_Absentes{"code_jrnal"} = 0; 323 | $Donnees_Absentes{"lib_jrnal"} = 0; 324 | $Donnees_Absentes{"lib_cpte_gen"} = 0; 325 | $Donnees_Absentes{"num_piece"} = 0; 326 | $Donnees_Absentes{"date_piece"} = 0; 327 | $Donnees_Absentes{"lib_ecriture"} = 0; 328 | $Donnees_Absentes{"valid_date"} = 0; 329 | } 330 | if ( ${cat_revenus} eq "BAT" || ${cat_revenus} eq "BNCT") { 331 | $Donnees_Absentes{"num_piece"} = 0; 332 | $Donnees_Absentes{"date_piece"} = 0; 333 | # Specs 22 modifiée le 23/01/2015 (on ne doit plus controler les champs suivants...) 334 | # $Donnees_Absentes{"paiement_date"} = 0; 335 | # $Donnees_Absentes{"paiement_mode"} = 0; 336 | } 337 | # Fin ajout SPECs 22 11/01/2015 338 | 339 | # 20130821 : SQL est parcouru pour chercher les champs des lignes contenant ',' ne contenant pas ';' ni serial 340 | local $/="\n"; 341 | while ( $line = ) { 342 | $trouve = 0; 343 | 344 | $line =~ s/\x0D\x0A$//; 345 | 346 | $line =~ s/\-\-.*$//; 347 | chomp $line; 348 | if ( $line =~ m/CONSTRAINT/i ) { 349 | last; 350 | } 351 | if ( $line !~ m/Serial/i 352 | && $line =~ /,/ 353 | && $line !~ /;/ 354 | && $line !~ m/tva_type/i 355 | && $line !~ m/alto2_/i ) 356 | { 357 | $line =~ /^\s*([a-zA-Z0-9_-]+)\s*([a-zA-Z]+).*,/; 358 | my $champs_test = uc($1); 359 | my $format_test = $2; 360 | 361 | $champs_base[$i] = $champs_test; 362 | for ( $k = 0 ; $k <= $#champs ; $k++ ) { 363 | if ( $champs_test eq uc( $champs[$k] ) ) { 364 | $r_mapping{ uc( $champs[$k] ) }{'champs_base'} = $champs_test; 365 | $r_mapping{ uc( $champs[$k] ) }{'champs_arrete'} = 366 | $champs_arrete{$champs_test}; 367 | $r_mapping{ uc( $champs[$k] ) }{'rang_fichier'} = $k; 368 | $r_mapping{ uc( $champs[$k] ) }{'rang_base'} = $i; 369 | $r_mapping{ uc( $champs[$k] ) }{'type'} = $format_test; 370 | $r_mapping{ uc( $champs[$k] ) }{'champs_oblig'} = 0; 371 | $r_mapping{ uc( $champs[$k] ) }{'champs_oblig'} = 1 372 | if ( $line =~ m/NOT NULL/i ); 373 | $trouve = 1; 374 | 375 | &erreur( "I", 376 | "mappé :" 377 | . $champs_test 378 | . ": format :" 379 | . $format_test 380 | . ":" ); 381 | $r_bilanctl{ $champs_arrete{$champs_test} }{'nomFEC'} = 382 | $champs_arrete{$champs_test}; 383 | last; 384 | } 385 | 386 | } 387 | 388 | if ( $trouve eq 0 ) { 389 | if ( $line =~ m/NOT NULL/i 390 | && $line !~ m/DEFAULT/i 391 | && $line !~ m/alto2_/i ) 392 | { 393 | 394 | #RG:F:vérification que tous les champs obligatoires sont présents:E 395 | 396 | my $text_tempo = 397 | &enc_utf8( 398 | $r_bilanctl{ $champs_arrete{$champs_test} }{'lib'} ); 399 | $text_tempo =~ s/^[0-9]+\. //; 400 | $text_tempo =~ s/^ *le /au /; 401 | $text_tempo =~ s/^ *l/à l/; 402 | 403 | #print STDOUT $text_tempo."\n"; 404 | $text_tempo = 405 | "Le champ «" 406 | . $champs_arrete{$champs_test} 407 | . "» n'est pas présent dans le fichier, l'information relative " 408 | . $text_tempo 409 | . " n'a pas été trouvée dans la ligne d'entête ;"; 410 | 411 | #print STDOUT $text_tempo."\n"; 412 | &erreur( "O", $text_tempo ); 413 | $nb_errs++; 414 | 415 | # &finko("paschargé"); 416 | } 417 | else { 418 | $r_mapping{ uc($champs_test) }{'champs_base'} = $champs_test; 419 | $r_mapping{ uc($champs_test) }{'rang_fichier'} = -1; 420 | $r_mapping{ uc($champs_test) }{'rang_base'} = $i; 421 | $r_mapping{ uc($champs_test) }{'type'} = $format_test; 422 | 423 | } 424 | } 425 | 426 | $i++; 427 | } 428 | } 429 | close(SQL); 430 | #RG:T: fmt_arrete dispose de plus de lignes que fec...sql , purge fonction type compta les lignes en trop:I 431 | $nb_bilanctl = $i - 1; 432 | foreach my $col_bilan ( keys %r_bilanctl ) { 433 | delete( $r_bilanctl{$col_bilan} ) 434 | if ( $r_bilanctl{$col_bilan}{'rang'} > $nb_bilanctl ); 435 | 436 | # delete($r_bilanctl{ $col_bilan} ) if (! defined $r_bilanctl{ $col_bilan}{'lib'}) ; 437 | } 438 | 439 | # contrôles métiers 440 | #RG:F:Détection des champs supplémentaires présents:I 441 | 442 | # ajouter champs manquants : 443 | $trouve = -1; 444 | for ( $k = 0 ; $k <= $#champs ; $k++ ) { 445 | 446 | if ( !exists $r_mapping{ uc( $champs[$k] ) } ) { 447 | if ( uc( $champs[$k] ) eq "ZFICTIFZ" ) { next; } 448 | $r_mapping{ uc( $champs[$k] ) }{'champs_base'} = "0"; 449 | $r_mapping{ uc( $champs[$k] ) }{'rang_fichier'} = $k; 450 | $r_mapping{ uc( $champs[$k] ) }{'rang_base'} = "NULL"; 451 | $r_mapping{ uc( $champs[$k] ) }{'type'} = "VIDE"; 452 | $trouve = $k; 453 | &erreur( "S", $champs[$k] ); 454 | } 455 | } 456 | 457 | # if ($nb_errs>0) { &finko("paschargé"); } 458 | 459 | $fentop = MainWindow->new; 460 | 461 | $fentop->geometry("640x480"); 462 | 463 | $fen = $fentop->Scrolled( 464 | 'Pane', 465 | -height => 1, 466 | -width => 1, 467 | -scrollbars => 'e' 468 | )->pack( -expand => 1, -fill => 'both' ); 469 | my $Ligne_Alert; 470 | my $fenliste = $fen->Frame; 471 | 472 | #RG:F:mapping des champs inconnus en surnombre:I 473 | &erreur( "I", "mapping manuel du fichier" ); 474 | my $params1 = $fen->Frame; 475 | my $params2; 476 | if ( $trouve > -1 ) { 477 | my @frames; 478 | 479 | $fentop->title( 480 | "Correspondance des champs du fichier avec la table journal"); 481 | my $Ligne_Tete = $fen->Label( 482 | -text => " Dossier : $alpage, fichier : " . basename($file), 483 | -font => '{Sansserif} 14' 484 | )->pack(); 485 | $Ligne_Tete = $fen->Label( 486 | -text => " Renommage des champs inconnus ...", 487 | -font => '{Sansserif} 14' 488 | )->pack(); 489 | $Ligne_Alert = 490 | $fen->Label( -text => 491 | &utf8toutf8("Choisir le nom du champs à creer dans la base ") ) 492 | ->pack(); 493 | 494 | for ( $k = 0 ; $k <= $trouve ; $k++ ) { 495 | if ( $r_mapping{ $champs[$k] }{'champs_base'} eq "0" ) { 496 | $frames[$k] = $params1->Frame; 497 | $chk[$k] = 498 | $frames[$k]->Checkbutton( -text => "", -variable => \$Coche[$k] ) 499 | ->pack( -side => 'left' ); 500 | $chk[$k]->select(); 501 | $ZoneRep[$k] = $frames[$k]->Entry( 502 | -textvariable => \$champs[$k], 503 | -background => 'cyan' 504 | )->pack( -side => 'right' ); 505 | $frames[$k]->pack(); 506 | } 507 | } 508 | 509 | my $Button1 = 510 | $params1->Button( -text => 'Valider', -command => \&traitement ) 511 | ->pack(qw / -pady 25 /); 512 | $params1->pack(); 513 | $params2 = $fenliste->Scrolled( 514 | 'Pane', 515 | -height => 100, 516 | -width => 600, 517 | -scrollbars => 's' 518 | )->pack( -expand => 1, -fill => 'both' ); 519 | my @temp_list; 520 | my @listsbox; 521 | my $taille = 0; 522 | for ( $k = 0 ; $k <= $#champs ; $k++ ) { 523 | $taille = 0; 524 | for ( $i = 0 ; $i <= $#list_5lig ; $i++ ) { 525 | my @list_ligne = split $separateur, &utf8toutf8( $list_5lig[$i] ); 526 | $temp_list[$i] = $list_ligne[$k]; 527 | $taille = length( $list_ligne[$k] ) 528 | if ( length( $list_ligne[$k] ) > $taille ); 529 | } 530 | $taille = 30 if ( $taille > 30 ); 531 | $listsbox[$k] = 532 | $params2->Listbox( -width => $taille )->pack( -side => 'left' ); 533 | $listsbox[$k]->insert( 'end', @temp_list ); 534 | } 535 | $fenliste->pack(); 536 | } 537 | else { 538 | &traitement; 539 | } 540 | 541 | sub traitement() { 542 | 543 | 544 | &controle(); 545 | if ( ( &aorte() eq "a" ) and ( uc($ctl) ne "CTL" ) ) { 546 | my $MODULE ="alto2_alim.pl"; 547 | do $MODULE ; 548 | &alimentation( ) ; 549 | } 550 | } 551 | 552 | sub controle() { 553 | 554 | my $nb_sep_milliers = 0; 555 | # $params1->destroy(); 556 | $nb_ligne_base = $#champs_base + 1; 557 | for ( $i = 0 ; $i <= $#champs ; $i++ ) { 558 | if ( $Coche[$i] eq "1" ) { 559 | $champs[$i] = &supprime_accent( $champs[$i] ); 560 | for ( $j = 0 ; $j <= $#champs_base + 1 ; $j++ ) { 561 | if ( uc( $champs[$i] ) eq $champs_base[$j] ) { 562 | $doublon = 1; 563 | $ZoneRep[$i]->configure( -background => 'red' ); 564 | $Ligne_Alert->configure( 565 | -text => "Le champs existe en base, renommez-le svp", 566 | -background => 'red' 567 | ); 568 | $fentop->update; 569 | } 570 | } 571 | for ( $j = 0 ; $j <= $#champs ; $j++ ) { 572 | if ( $i != $j && ( uc( $champs[$i] ) eq $champs[$j] ) ) { 573 | $doublon = 1; 574 | $ZoneRep[$i]->configure( -background => 'red' ); 575 | $Ligne_Alert->configure( 576 | -text => "Le champs existe en base, renommez-le svp", 577 | -background => 'red' 578 | ); 579 | $fentop->update; 580 | } 581 | } 582 | if ( $doublon == 0 ) { 583 | $r_mapping{ uc( $champs[$i] ) }{'champs_base'} = 584 | uc( $champs[$i] ); 585 | $r_mapping{ uc( $champs[$i] ) }{'rang_base'} = $nb_ligne_base++; 586 | $r_mapping{ uc( $champs[$i] ) }{'rang_fichier'} = $i; 587 | $r_mapping{ uc( $champs[$i] ) }{'type'} = "VIDE"; 588 | } 589 | } 590 | else { 591 | push @liste_precedents_champs, uc( $champs[$i] ); 592 | } 593 | } 594 | 595 | if ( $doublon > 0 ) { return; } 596 | for ( $k = 0 ; $k <= $#champs ; $k++ ) { 597 | 598 | if ( !exists $r_mapping{ uc( $champs[$k] ) } ) { 599 | if ( uc( $champs[$k] ) eq "ZFICTIFZ" ) { next; } 600 | $r_mapping{ uc( $champs[$k] ) }{'champs_base'} = "0"; 601 | $r_mapping{ uc( $champs[$k] ) }{'rang_fichier'} = $k; 602 | $r_mapping{ uc( $champs[$k] ) }{'rang_base'} = "NULL"; 603 | $r_mapping{ uc( $champs[$k] ) }{'type'} = "VIDE"; 604 | $trouve = $k; 605 | &erreur( "S", $champs[$k] ); 606 | } 607 | } 608 | 609 | #$Ligne_Alert->configure( -text=> "", -background => 'grey'); 610 | $Ligne_Alert->destroy() if defined $Ligne_Alert; 611 | $params1->destroy(); 612 | $fenliste->destroy(); 613 | $lu = 0; 614 | 615 | &erreur( "I", "Contrôle du fichier" ); 616 | $Ligne_Tete = $fen->Label( 617 | -text => " Controle du fichier en cours ...", 618 | -font => '{Sansserif} 14' 619 | )->pack(); 620 | $fen2 = $fen->Frame; 621 | $Ligne_vide = 622 | $fen2->Label( -text => "" )->grid( -row => 0, -column => 0 ); #pack( ); 623 | $progress = $fen2->ProgressBar( 624 | -borderwidth => 3, 625 | -relief => 'ridge', 626 | -width => 30, 627 | -from => 0, 628 | -to => 100, 629 | -blocks => 10, 630 | -gap => 1, 631 | -colors => [ 0, 'green' ], 632 | -variable => \$percent_done 633 | )->grid( -row => 0, -column => 0 ); #pack(-fill => 'x'); 634 | $Alert_Texte = int($percent_done) . " %"; 635 | $Ligne_Alert = $fen2->Label( 636 | -textvariable => \$Alert_Texte, 637 | -foreground => 'black', 638 | -background => 'green' 639 | )->grid( -row => 0, -column => 0 ); #pack( ); 640 | $fen2->pack(); 641 | 642 | open( my $hf, "<","$file"); 643 | $crlf = &detecte_macfile($hf); 644 | close $hf; 645 | 646 | open( F, "< ", "$file" ) or die "Impossible de trouver $file"; 647 | binmode F, ":raw" ; 648 | local $/ = $crlf; 649 | while () { $nblines++; } 650 | close(F); 651 | 652 | 653 | 654 | #RG:F:comptage du nombre de ligne du fichier:I 655 | &erreur( "I", "Nb lignes fichiers : " . $nblines . " : " ); 656 | if ( $nblines <= 1 ) { 657 | &erreur( "E", "Le fichier ne contient pas de ligne : fichier vide" ); 658 | &finko; 659 | } 660 | 661 | $fentop->update; 662 | open( F, "< ", "$file" ); 663 | binmode F, ":raw" ; 664 | local $/ = $crlf; 665 | # si on veut corriger le bug lié à la presence simultanée des separateurs tabulation et pipe decommenter les lignes 666 | # 634 et 650 a 656 667 | # my $pattern = '\|'; 668 | while ( $line = ) { 669 | # Modif le 10/04/2015 pour remplace les espaces insécables par un espace normal 670 | # Les espaces insécables pour les fichiers UTF-8 671 | $line =~ s/\xC2\xA0/ /g; 672 | # Les espaces insécables pour les autres types de fichiers 673 | $line =~ s/\xA0/ /g; 674 | # Fin modif du 10/04/2015 675 | 676 | $line =~ s/\r\n|\r$//; 677 | $line =~ s/\c@//g; 678 | $line =~ s/ *(${separateur}) */$1/g; 679 | $line =~ s/ +$//; 680 | chomp $line; 681 | $nb_l++; 682 | # if ($separateur == '\t'){ 683 | # if ($line=~m/$pattern/){ 684 | # &erreur( "E","la structure du fichier est incorrecte, une ligne :$nb_l contient le separateur tabulation et le separateur pipe " 685 | # ); 686 | # $nb_errs++; 687 | # } 688 | # } 689 | if ( $nb_l == 1 ) { next; } 690 | 691 | $percent_sav = int($percent_done); 692 | $percent_done = int( ( $nb_l * 100 ) / $nblines ); 693 | if ( $percent_done > $percent_sav ) { 694 | $Alert_Texte = $percent_done . " %"; 695 | $fen2->update; 696 | } 697 | my @valeurs = split $separateur, $line . "²"; 698 | 699 | # 20140214 suppression du ² ajouté en fin de ligne.... ne change rien .... 700 | 701 | chomp $valeurs[$#valeurs]; 702 | $valeurs[$#valeurs] =~ s/\²$//; 703 | 704 | # voir 821 si ligne vide dans le fichier devient non bloquant 705 | if ( $#valeurs == 0 ) { 706 | &erreur( "E", 707 | "la structure du fichier est incorrecte, une ligne :$nb_l: est vide ;" 708 | ); 709 | 710 | # && &finko("paschargé"); 711 | #$nb_errs++; 712 | next; 713 | } 714 | if ( $#valeurs != $#champs ) { 715 | 716 | #RG:F:vérification que les champs de l'entête sont tous présents sur chaque ligne du fichier :E 717 | #RG:F:vérification que seuls le nombre de champs de l'entête sont présents sur chaque ligne du fichier:E 718 | #RG:T:vérification du format des champs supplémentaires à partir des 300 premières lignes du fichier:E 719 | #RG:T:vérification du format des champs supplémentaires à partir des 300 premières lignes du fichier:E 720 | #RG:T:vérification du format des champs supplémentaires détection numérique sur les 300lignes > numérique, date sur les 300 lignes > date, sinon text:E 721 | # Modification MC le 04/10/2016 car le nombre de champs attendus n'est pas correct. Le compteur donne la dernière valeur du tableau et on par de zéro. Il faut donc ajouter 1 dans le compteur pour l'affichage... 722 | my $valeurs_affichage = $#valeurs + 1; 723 | my $champs_affichage = $#champs + 1; 724 | &erreur( "E", 725 | "La structure du fichier est incorrecte : en ligne $nb_l : il y a $valeurs_affichage champs au lieu des $champs_affichage champs attendus ;" 726 | ); 727 | $nb_errs++; #&finko("paschargé"); 728 | } 729 | # Fin Modification MC du 04/10/2016 730 | 731 | # débit credit 732 | #RG:F:Tous les champs numériques contenant des , sont remplacés par des .:I 733 | #RG:F:Si débit présent, et crédit absent crédit=0:I 734 | #RG:F:Si crédit présent, et débit absent débit=0:I 735 | for ( $i = 0 ; $i <= $#champs ; $i++ ) { 736 | my $champs_log = $r_mapping{ uc( $champs[$i] ) }{'champs_arrete'}; 737 | 738 | if ( ( $r_mapping{ uc( $champs[$i] ) }{'rang_base'} eq "NULL" ) ) { 739 | next; 740 | } 741 | 742 | if ( $r_mapping{ uc( $champs[$i] ) }{'type'} eq "VIDE" ) { 743 | if ( $valeurs[$i] =~ /^ *$/ ) { 744 | next; 745 | } 746 | if ( exists $r_mapping{ uc($champs[$i]) }{'type_prov'} ) { 747 | if ( $r_mapping{ uc($champs[$i]) }{'type_prov'} eq "Text" ) { 748 | next; 749 | } 750 | } 751 | 752 | if ( $valeurs[$i] =~ m/^[0-9 ]+$/ 753 | && $valeurs[$i] =~ m/[0-9]{1,}/ ) 754 | { 755 | $type_champs = "bigint"; 756 | } 757 | 758 | elsif ($valeurs[$i] =~ m/^[0-9]+,[0-9]*$/ 759 | || $valeurs[$i] =~ m/^[0-9]+\.[0-9]*$/ ) 760 | # elsif ($valeurs[$i] =~ m/^[0-9]+,[0-9]{1,11}$/ 761 | # || $valeurs[$i] =~ m/^[0-9]+\.[0-9]{1,11}$/ ) 762 | { 763 | $type_champs = "Numeric"; # (19,6)"; 764 | } 765 | 766 | #elsif ( $valeurs[$i] =~ m/^[0-9]+$/ ) { $type_champs="Numeric(19)"; } 767 | elsif ( $valeurs[$i] =~ 768 | m/^20[0-9]{2}[\/\-\.]*[0-1][0-9][\/\-\.]*[0-3][0-9]$/ 769 | || $valeurs[$i] =~ 770 | m/^[0-3][0-9][\/\-\.]*[0-1][0-9][\/\-\.]*20[0-9]{2}$/ ) 771 | { 772 | $type_champs = "date"; 773 | } 774 | else { $type_champs = "Text"; } 775 | 776 | if ( not exists $r_mapping{ uc($champs[$i]) }{'type_prov'} ) { 777 | #$r_mapping{ uc($champs[$i]) }{'type_prov'} = $type_champs; 778 | 779 | } 780 | else { 781 | if ( $r_mapping { uc( $champs[$i] ) }{'type_prov'} ne 782 | $type_champs ) 783 | { 784 | $type_champs = "Text"; 785 | } 786 | } 787 | $r_mapping{ uc($champs[$i]) }{'type_prov'} = $type_champs; 788 | 789 | } 790 | elsif ( ( $r_mapping{ uc($champs[$i]) }{'champs_oblig'} == 1 ) 791 | && ( $valeurs[$i] =~ /^ *$/ ) 792 | && ( lc( $r_mapping{ uc($champs[$i]) }{'type'} ) ne "numeric" ) ) 793 | 794 | { 795 | &erreur( "E", 796 | "Le champ " 797 | . $champs_log 798 | . " n'est pas au bon format, il ne contient aucune valeur : en ligne $nb_l : " 799 | ); 800 | 801 | $nb_errs++; 802 | } 803 | else { 804 | # Ajout SPECs 22 11/01/2015 805 | $don_abs = lc($champs[$i]); 806 | if ( defined($Donnees_Absentes{$don_abs}) ) { 807 | if ( &arrete2013($datecloture) ) { 808 | if ( (length ($valeurs[$i]) == 0) || $valeurs[$i] =~ m/^ {1,}$/) { 809 | &erreur( "V", 810 | "Au moins un enregistrement dans le FEC ne contient pas de valeur pour le champ " 811 | . $champs_log 812 | . " : : : ligne $nb_l : \n" ); 813 | } 814 | } 815 | } 816 | # Fin ajout SPECs 22 11/01/2015 817 | if ( $champs[$i] =~ m/num_cpte_gen/i ) { 818 | if ( $valeurs[$i] !~ m/^[0-9]{3}.*$/ ) { 819 | &erreur( "A", 820 | "Le champ " 821 | . $champs_log 822 | . " est incorrect , le numéro de compte doit commencer par trois chiffres ; : " 823 | . $valeurs[$i] 824 | . " : : ligne $nb_l : \n" ); 825 | 826 | } 827 | } 828 | 829 | elsif ( lc( $r_mapping{ uc($champs[$i]) }{'type'} ) eq "numeric" ) { 830 | 831 | if ( $valeurs[$i] eq "" ) { 832 | $valeurs[$i] = 0; 833 | } 834 | # dans un premier temps on controle si il y a un point pour les formats numeriques 835 | # si il y a un point on met le traitement en erreur 836 | # dans un second temps pour des questions de compatibilites de formats perl on remplace les virgules des formats numeriques par des points 837 | 838 | # RB 2019 Interdiction du point en entree pour les formats numeriques 839 | if ( ( $valeurs[$i] =~ m/\./ ) ) { 840 | &erreur( "E", 841 | "Le champ " 842 | . $champs_log 843 | . " n'est pas au bon format, : ligne $nb_l : un format numérique avec un separateur , au lieu de . est attendu : " 844 | . $valeurs[$i] 845 | . " : ;" ); 846 | $nb_errs++; 847 | } 848 | # RB 2019 Remplacement des virgules par des points 849 | if ( !( $valeurs[$i] =~ /\./ ) ) { 850 | $valeurs[$i] =~ s/,/./; 851 | } 852 | $nb_sep_milliers = $valeurs[$i]; 853 | $nb_sep_milliers =~ s/[^ \.,]//g; 854 | if ( $valeurs[$i] =~ m/^ *[0-9]+ [0-9]+/ || length($nb_sep_milliers) > 1 ) { 855 | &erreur( "E", 856 | "Le champ " 857 | . $champs_log 858 | . " n'est pas au bon format, : ligne $nb_l : un format numérique sans séparateur de milliers est attendu : " 859 | . $valeurs[$i] 860 | . " : ;" ); 861 | $nb_errs++; 862 | } 863 | elsif ( 864 | !( ( 865 | $valeurs[$i] =~ m/^ *[+-]*[0-9\.,]{1,} *[+-]* *$/ 866 | && $valeurs[$i] !~ m/^.*[-]{1}.*[-]{1}.*$/ 867 | ) 868 | || $valeurs[$i] =~ m/^ *[+-]*[0-9\.,]{1,}[Ee]{1}[0-9\+-]{1,} *$/ 869 | 870 | ) 871 | ) 872 | { 873 | &erreur( "E", 874 | "Le champ " 875 | . $champs_log 876 | . " n'est pas au bon format, : ligne $nb_l : un format numérique est attendu ; :" 877 | . $valeurs[$i] 878 | . " : " ); 879 | 880 | $nb_errs++; 881 | } 882 | # RB EVOLUTION 2019 la correction attendue sur les separations virgules et point des chiffres se trouvent surement ici 883 | if ( $champs[$i] =~ m/MTN_DEBIT/i ) { 884 | $rang_d = $i; 885 | $valeurs[$i] = 0 if ( !defined $valeurs[$i] ); 886 | if ( !( $valeurs[$i] =~ /\./ ) ) { 887 | $valeurs[$i] =~ s/,/./; 888 | } 889 | if ( $valeurs[$i] =~ m/^ *([0-9\.,]{1,}) *([+-]) *$/ ) { 890 | $valeurs[$i] = $2 . $1; 891 | 892 | } 893 | 894 | $somme{'DCC'} += $valeurs[$i]; 895 | 896 | } 897 | elsif ( $champs[$i] =~ m/MTN_CREDIT/i ) { 898 | $rang_c = $i; 899 | $valeurs[$i] = 0 if ( !defined $valeurs[$i] ); 900 | if ( !( $valeurs[$i] =~ /\./ ) ) { 901 | $valeurs[$i] =~ s/,/./; 902 | } 903 | if ( $valeurs[$i] =~ m/^ *([0-9\.,]{1,}) *([+-]) *$/ ) { 904 | $valeurs[$i] = $2 . $1; 905 | 906 | } 907 | 908 | $somme{'CCC'} += $valeurs[$i]; 909 | } 910 | 911 | elsif ( $champs[$i] =~ m/MTN_DEVISE/i ) { 912 | 913 | $valeurs[$i] = 0 if ( !defined $valeurs[$i] ); 914 | if ( !( $valeurs[$i] =~ /\./ ) ) { 915 | $valeurs[$i] =~ s/,/./; 916 | } 917 | if ( $valeurs[$i] =~ m/^ *([0-9\.,]{1,}) *([+-]) *$/ ) { 918 | $valeurs[$i] = $2 . $1; 919 | 920 | } 921 | } 922 | 923 | } 924 | elsif ( lc( $r_mapping{ uc($champs[$i]) }{'type'} ) eq "date" ) { 925 | 926 | #RG:F: champs null autorisé et considéré vide au sens date 0... :I 927 | if ( 928 | $valeurs[$i] =~ m/^[0\-\/\.]{1,}$|^ *$/ 929 | ) 930 | { 931 | if ( $r_mapping{ uc($champs[$i]) }{'champs_oblig'} == 0 ) 932 | { 933 | next; 934 | } 935 | else { 936 | &erreur( "E", 937 | "Le champ obligatoire " 938 | . $champs_log 939 | . " n'est pas au bon format, : ligne $nb_l : un format date est attendu ; :" 940 | . $valeurs[$i] 941 | . " : " ); 942 | 943 | $nb_errs++; 944 | next; 945 | } 946 | } 947 | # RG:T:??? notés dans les init en debut de source:I 948 | my $date_heure=$valeurs[$i]; 949 | $date_heure=~ s/\:/ /g; 950 | if ( $valeurs[$i] =~ m/^${dt_a1}${dt_sep}${dt_m}${dt_sep}${dt_j}$/ || 951 | $valeurs[$i] =~ m/^${dt_a2}${dt_sep}${dt_m}${dt_sep}${dt_j}$/ || 952 | $valeurs[$i] =~ m/^${dt_a1}${dt_sep}${dt_m}${dt_sep}${dt_j}${dt_h}$/ || 953 | $valeurs[$i] =~ m/^${dt_a2}${dt_sep}${dt_m}${dt_sep}${dt_j}${dt_h}$/ ) 954 | { 955 | #RG:F:Date valide a m j avec separateur / - . :I 956 | #RG:F:Date valide j m a avec separateur / - . :I 957 | if ( ( $+{m} > 12 ) || ( $+{j} > 31 ) ) { 958 | &erreur( "E", 959 | "Des dates (" 960 | . $champs_log 961 | . ") ne correspondant pas à des dates calendaires sont présentes dans le fichier, : ligne $nb_l : :" 962 | . $date_heure 963 | . " : " ); 964 | 965 | $nb_errs++; 966 | 967 | } 968 | } 969 | elsif ( $valeurs[$i] =~ m/^${dt_j}${dt_sep}${dt_m}${dt_sep}${dt_a1}${dt_h}$/ || 970 | $valeurs[$i] =~ m/^${dt_j}${dt_sep}${dt_m}${dt_sep}${dt_a2}${dt_h}$/ || 971 | $valeurs[$i] =~ m/^${dt_j}${dt_sep}${dt_m}${dt_sep}${dt_a1}$/ || 972 | $valeurs[$i] =~ m/^${dt_j}${dt_sep}${dt_m}${dt_sep}${dt_a2}$/ ) 973 | { 974 | #RG:F:Date valide a m j avec separateur / - . et Theure:I 975 | #RG:F:Date valide j m a avec separateur / - . et Theure:I 976 | if ( ( $+{m} > 12 ) || ( $+{j} > 31 ) ) { 977 | &erreur( "E", 978 | "Des dates (" 979 | . $champs_log 980 | . ") ne correspondant pas à des dates calendaires sont présentes dans le fichier, : ligne $nb_l : :" 981 | . $date_heure 982 | . " : " ); 983 | 984 | $nb_errs++; 985 | 986 | } 987 | } 988 | elsif ( $valeurs[$i] =~ m/^${dt_a3}${dt_sep}${dt_m}${dt_sep}${dt_j}$/|| 989 | $valeurs[$i] =~ m/^${dt_j}${dt_sep}${dt_m}${dt_sep}${dt_a3}$/|| 990 | $valeurs[$i] =~ m/^${dt_a3}${dt_sep}${dt_m}${dt_sep}${dt_j}${dt_h}$/|| 991 | $valeurs[$i] =~ m/^${dt_j}${dt_sep}${dt_m}${dt_sep}${dt_a3}${dt_h}$/ ) 992 | { 993 | #RG:F:Année incorrecte <1900 ou >2099 :I 994 | &erreur( "A", 995 | "Le champ " 996 | . $champs_log 997 | . " contient une date en dehors de la période, : ligne $nb_l : ; :" 998 | . $date_heure 999 | . " : " ); 1000 | 1001 | } 1002 | else { 1003 | &erreur( "E", 1004 | "Le champ " 1005 | . $champs_log 1006 | . " n'est pas au bon format, : ligne $nb_l : un format date est incorrect ; :" 1007 | . $date_heure 1008 | . " : " ); 1009 | 1010 | $nb_errs++; 1011 | 1012 | } 1013 | } 1014 | } 1015 | } # next for 1016 | unless ( 1017 | ( $valeurs[$rang_d] == 0 && $valeurs[$rang_c] != 0 ) 1018 | || ( $valeurs[$rang_d] != 0 1019 | && $valeurs[$rang_c] == 0 ) 1020 | ) 1021 | { 1022 | 1023 | #RG:F:vérification que tous les lignes d'écritures n'ont pas un débit et un crédit servis:A 1024 | # 11/02/2014 : Mise en alerte, evolution fonctionnelle 1025 | &erreur( "A", 1026 | "Structure fichier incorrecte, débit/crédit :" 1027 | . $valeurs[$rang_d] . " / " 1028 | . $valeurs[$rang_c] 1029 | . ": renseignés sur une même ligne :$nb_l: , ou débit=crédit=0 " 1030 | ); #&& &finko ; 1031 | } 1032 | 1033 | } # fin parcours fichier wend 1034 | 1035 | close(F); 1036 | local $/ = "\n"; 1037 | 1038 | $somme{'DCC'} = int( $somme{'DCC'} * 100 + 0.500001 ) / 100; 1039 | $somme{'CCC'} = int( $somme{'CCC'} * 100 + 0.500001 ) / 100; 1040 | &erreur( "I", "Cumul Débit =" . $somme{'DCC'} . " " ); 1041 | &erreur( "I", "Cumul Crédit =" . $somme{'CCC'} . " " ); 1042 | 1043 | # 11/02/2014 : Mise en alerte, evolution fonctionnelle 1044 | # 02/09/2014 fiche 20 : désactivation alerte debit <>credit 1045 | 1046 | # if ( $somme{'DCC'} - $somme{'CCC'} != 0 ) { 1047 | # &erreur( "A", 1048 | #"Erreur sur la somme des écritures fournies par l'entreprise \n cumul débit : " 1049 | # . $somme{'DCC'} 1050 | # . " : cumul crédit : " 1051 | # . $somme{'CCC'} 1052 | # . " : " ); 1053 | # 1054 | # #$nb_errs++; 1055 | # } 1056 | $vers_java = &verif_version_java; 1057 | $vers_java =~ s/version //; 1058 | # --> fin controle 1059 | &erreur( "I", "Fin de Contrôle" ); 1060 | &maj_log($dbhlog); # mise en persistance table hash 1061 | # Ajout de cette fonction suite à la SPEC 23 le 16/02/2015 1062 | if ( ( $nb_errs > 0 ) && ( uc($ctl) eq "CTL" ) && ( &aorte() ne "t" ) ) { 1063 | &Fenetre_KO(); 1064 | &faire_pdf(); 1065 | # pour laisser le temps au pdf de s'afficher... 1066 | sleep(5); 1067 | #si on veut un affichage avec un contenu dans la fenetre en cas d'erreur decommenter la ligne suivante 1068 | #&finko("paschargé"); 1069 | &finko; 1070 | } else { 1071 | # Fin ade cette fonction suite à la SPEC 23 le 16/02/2015 1072 | # partie controle java ou testeur perl 1073 | if ( uc($ctl) eq "CTL" or &aorte() eq "t" ) { 1074 | if ($nb_errs > 0){ 1075 | # pour laisser le temps au pdf de s'afficher... 1076 | sleep(5); 1077 | &Fenetre_KO(); 1078 | } 1079 | &faire_pdf(); 1080 | #on ajoute le exit 0 : si pas d'erreur il faut sortir du programme 1081 | exit 0; 1082 | } 1083 | # partie alim java avec erreur 1084 | if ( ( $nb_errs > 0 ) && ( uc($ctl) ne "CTL" ) ) { 1085 | &faire_pdf(); 1086 | &finko("paschargé"); 1087 | } 1088 | } 1089 | 1090 | 1091 | } 1092 | 1093 | 1094 | 1095 | sub req () { 1096 | ($REQ) = shift; 1097 | my @result = 1098 | $dbh->selectrow_array( "SELECT COUNT(*) from (" . $REQ . ") as D" ) 1099 | or die $DBI::errstr; 1100 | if ( $result[0] > 0 ) { 1101 | &erreur( "E", 1102 | " $REQ \n retourne " . $result[0] . " écriture(s) ! \n" ); 1103 | &erreur( "I", 1104 | " $REQ \n retourne " . $result[0] . " écriture(s) ! \n" ); 1105 | 1106 | #my $ref_dump = $dbh->selectall_arrayref( "SELECT * from $table where num_ecr in (" . $REQ . ") limit 10 " ) or die $DBI::errstr; 1107 | #foreach my $id_ecr (@$ref_dump) { 1108 | # @val_ecr = @$id_ecr; 1109 | # print STDERR join( "\t", @val_ecr ) . "\n"; 1110 | #} 1111 | } 1112 | else { 1113 | &erreur( "I", "$REQ \n ne retourne aucune ligne" ); 1114 | } 1115 | } 1116 | 1117 | # sub sql => alto2_fonctions.pl 1118 | 1119 | sub voir_logs () { 1120 | &finko; 1121 | } 1122 | 1123 | #sub sanspoint() { 1124 | # my ($v) = @_; 1125 | # if ( $v =~ m/(\d*)\.(\d*)\.(\d*)/ ) { 1126 | # $v = sprintf( "%02d%03d%03d", $1, $2, $3 ); 1127 | # return $v; 1128 | # } 1129 | #} 1130 | 1131 | sub fin () { 1132 | &maj_log($dbhlog); 1133 | &deconnexion($dbhlog); 1134 | 1135 | my $rc = &create_log($file); 1136 | exit 0; 1137 | } 1138 | 1139 | sub finko () { 1140 | my ($fin) = @_; 1141 | if ( defined($fin) ) { 1142 | &erreur( "E", 1143 | "La comptabilité n'a pas pu être chargée, vérifier les logs et le fichier en entree" 1144 | ); 1145 | &erreur( "I", 1146 | "La comptabilité n'a pas pu être chargée, vérifier les logs et le fichier en entree" 1147 | ); 1148 | } 1149 | &maj_log($dbhlog); 1150 | &deconnexion($dbhlog); 1151 | my $rc = &create_log($file); 1152 | if ( &aorte() ne "t" ) { 1153 | if ( -f $rc ) { 1154 | if ( ${OS} =~ m/linux/i ) { 1155 | exec("gedit $rc "); 1156 | } 1157 | else { 1158 | #exec("start wordpad $rc "); 1159 | exec("start notepad \"${rc}\" "); 1160 | } 1161 | } 1162 | } 1163 | exit 1; 1164 | } 1165 | 1166 | 1167 | 1168 | 1169 | 1170 | sub faire_pdf() { 1171 | 1172 | require "$currdir/alto2_pdf.pl"; 1173 | 1174 | use utf8; 1175 | my $text_to_place ; 1176 | if ( &aorte() ne "t" ) { 1177 | 1178 | $text_to_place = " ANNEXE\n"; 1179 | } 1180 | $text_to_place .= " CONTROLE DE LA STRUCTURE DU FEC 1181 | 1182 | (Conformément aux dispositions prévues à l'article A.47 A-1\n du livre des procédures fiscales)"; 1183 | 1184 | our $font_size = 13; 1185 | our $align = "center"; 1186 | my @result; 1187 | my @rech_donnees_absentes; 1188 | chomp $vers_java; 1189 | my $rResult = \@result; 1190 | 1191 | &ombre( $text_to_place, 185, 80 ); 1192 | $align = "center"; 1193 | $font_size = 11; 1194 | $dbh = $dbhlog; 1195 | $text_to_place = 1196 | "Concerne le SIREN : $siren , Exercice clos le : $datecloture, Version : $vers_java "; 1197 | &ombre( $text_to_place, 190, 50 ); 1198 | $align = "left"; 1199 | 1200 | # table bilan 1201 | #&ajoute_table_r(@$some_data); 1202 | my $pas_complet=0; 1203 | foreach my $col_bilan ( 1204 | sort { $rr_bilanctl->{$a}{'lib'} <=> $rr_bilanctl->{$b}{'lib'} } 1205 | keys %r_bilanctl 1206 | ) 1207 | { 1208 | if ($r_bilanctl{$col_bilan}{'nomFEC'} eq '' ) { $pas_complet=1; last ;} 1209 | 1210 | } 1211 | 1212 | $REQ = 1213 | "SELECT count(*) from log_alim where id_trait = '$log_seq' and type_log in ('E','O') "; 1214 | @result = &sql_1col($REQ); 1215 | 1216 | # Ajout SPECs 22 11/01/2015 1217 | $REQ = 1218 | "SELECT count(*) from log_alim where id_trait = '$log_seq' and type_log in ('V') "; 1219 | @rech_donnees_absentes = &sql_1col($REQ); 1220 | 1221 | # Champs oblig manquant 1222 | 1223 | if ( not &arrete2013($datecloture) ) { 1224 | if ( $result[0] == 0 ) { 1225 | # &ombre("Les champs obligatoires prévus par l'arrêté sont présents ",190,50); 1226 | $text_to_place = 1227 | "La structure du fichier des écritures comptables remis apparaît conforme aux dispositions de l’article A.47 A-1 du Livre des Procédures Fiscales."; 1228 | &ajoute_paragraphe( $text_to_place, 180, 75 ); 1229 | undef @result; 1230 | } else { 1231 | $text_to_place = 1232 | " La structure du fichier des écritures comptables remis ne peut être considérée comme conforme aux dispositions de l’article A.47 A-1 du Livre des Procédures Fiscales pour les raisons ci-dessous :"; 1233 | 1234 | &ajoute_paragraphe( $text_to_place, 180, 75 ); 1235 | undef @result; 1236 | #push @result,""; 1237 | $REQ = 1238 | "SELECT replace(replace (t.fixe_log,'#1',l.val1),'#2',l.val2) from log_alim l,log_type t where id_trait = '$log_seq' and type_log ='O' and t.id_type=l.texte_log"; 1239 | push @result, &sql_1col($REQ); 1240 | $REQ = 1241 | "select distinct(replace(replace (t.fixe_log,'#1','...'),'#2','...')) || '\n [' || count (*) || '] fois dans le fichier' from log_alim l, log_type t where id_trait = '$log_seq' and type_log='E' and t.id_type=l.texte_log group by l.texte_log having count (distinct l.id_ligne) >1"; 1242 | 1243 | push @result, &sql_1col($REQ); 1244 | $REQ = 1245 | "select distinct(replace(replace (t.fixe_log,'#1',l.val1),'#2',l.val2)) from log_alim l, log_type t where id_trait = '$log_seq' and type_log='E' and t.id_type=l.texte_log group by l.texte_log having count (distinct l.id_ligne)=1"; 1246 | push @result, &sql_1col($REQ); 1247 | 1248 | &ajoute_liste( \@result, 180, 0 ); 1249 | 1250 | &ajoute_paragraphe( 1251 | "Vérifiez que le nom des champs est correctement libellé, que le nombre de séparateurs de champs est correct sur l’ensemble du fichier.", 1252 | 180, 50 1253 | ); 1254 | } 1255 | } else { 1256 | if ( $result[0] == 0 ) { 1257 | if ( $rech_donnees_absentes[0] == 0 ) { 1258 | # Toutes les données 1259 | if ($pas_complet == 1 ) { 1260 | # Pas complet (cas 5) 1261 | $text_to_place = 1262 | "La structure du fichier des écritures comptables ne peut être considérée comme conforme aux dispositions de l'article A.47 A-1 du livre des procédures fiscales car des champs obligatoires n'ont pas été détectés, cf. dernière colonne du tableau de synthèse en page 2."; 1263 | } else { 1264 | # Complet (cas 1) 1265 | # &ombre("Les champs obligatoires prévus par l'arrêté sont présents ",190,50); 1266 | $text_to_place = 1267 | "La structure du fichier des écritures comptables remis apparaît conforme aux dispositions de l’article A.47 A-1 du Livre des Procédures Fiscales."; 1268 | } 1269 | } else { 1270 | # Données Absentes 1271 | if ($pas_complet == 1 ) { 1272 | # Pas complet (cas 7) 1273 | $text_to_place = 1274 | "La structure du fichier des écritures comptables ne peut être considérée comme conforme aux dispositions de l’article A.47 A-1 du livre des procédures fiscales car des champs obligatoires n'ont pas été détectés, cf. dernière colonne du tableau de synthèse en page 2 et des données obligatoires sont manquantes, cf. rubrique « Données absentes » en page 3."; 1275 | } else { 1276 | # Complet (cas 3) 1277 | # &ombre("Les champs obligatoires prévus par l'arrêté sont présents ",190,50); 1278 | $text_to_place = 1279 | "La structure du fichier des écritures comptables ne peut être considérée comme conforme aux dispositions de l’article A.47 A-1 du livre des procédures fiscales car des données obligatoires sont manquantes, cf. rubrique « Données absentes » en page 3."; 1280 | } 1281 | } 1282 | &ajoute_paragraphe( $text_to_place, 180, 75 ); 1283 | } else { 1284 | # Anomalies 1285 | if ( $rech_donnees_absentes[0] == 0 ) { 1286 | # Toutes les données 1287 | if ($pas_complet == 1 ) { 1288 | # Pas complet (cas 6) 1289 | $text_to_place = 1290 | "La structure du fichier des écritures comptables ne peut être considérée comme conforme aux dispositions de l'article A.47 A-1 du livre des procédures fiscales car des champs obligatoires n'ont pas été détectés, cf. dernière colonne du tableau de synthèse en page 2. 1291 | 1292 | Par ailleurs, le fichier des écritures comptables n'est pas conforme en raison des anomalies listées ci-dessous : "; 1293 | } else { 1294 | # Complet (cas 2) 1295 | $text_to_place = 1296 | " La structure du fichier des écritures comptables remis ne peut être considérée comme conforme aux dispositions de l’article A.47 A-1 du Livre des Procédures Fiscales pour les raisons ci-dessous :"; 1297 | } 1298 | } else { 1299 | # Données Absentes 1300 | if ($pas_complet == 1 ) { 1301 | # Pas complet (cas 8) 1302 | $text_to_place = 1303 | "La structure du fichier des écritures comptables ne peut être considérée comme conforme aux dispositions de l’article A.47 A-1 du livre des procédures fiscales car des champs obligatoires n'ont pas été détectés, cf. dernière colonne du tableau de synthèse en page 2 et des données obligatoires sont manquantes, cf. rubrique « Données absentes » en page 3. 1304 | 1305 | Par ailleurs, le fichier des écritures comptables n'est pas conforme en raison des anomalies listées ci-dessous : "; 1306 | } else { 1307 | # Complet (cas 4) 1308 | $text_to_place = 1309 | " La structure du fichier des écritures comptables ne peut être considérée comme conforme aux dispositions de l’article A.47 A-1 du livre des procédures fiscales car des données obligatoires sont manquantes, cf. rubrique « Données absentes » en page 3. 1310 | 1311 | Par ailleurs, le fichier des écritures comptables n'est pas conforme en raison des anomalies listées ci-dessous : "; 1312 | } 1313 | 1314 | } 1315 | &ajoute_paragraphe( $text_to_place, 180, 75 ); 1316 | if ( $result[0] != 0 ) { 1317 | undef @result; 1318 | 1319 | #push @result,""; 1320 | $REQ = 1321 | "SELECT replace(replace (t.fixe_log,'#1',l.val1),'#2',l.val2) from log_alim l,log_type t where id_trait = '$log_seq' and type_log ='O' and t.id_type=l.texte_log"; 1322 | push @result, &sql_1col($REQ); 1323 | $REQ = 1324 | "select distinct(replace(replace (t.fixe_log,'#1','...'),'#2','...')) || '\n [' || count (*) || '] fois dans le fichier' from log_alim l, log_type t where id_trait = '$log_seq' and type_log='E' and t.id_type=l.texte_log group by l.texte_log having count (distinct l.id_ligne) >1"; 1325 | 1326 | push @result, &sql_1col($REQ); 1327 | $REQ = 1328 | "select distinct(replace(replace (t.fixe_log,'#1',l.val1),'#2',l.val2)) from log_alim l, log_type t where id_trait = '$log_seq' and type_log='E' and t.id_type=l.texte_log group by l.texte_log having count (distinct l.id_ligne)=1"; 1329 | push @result, &sql_1col($REQ); 1330 | 1331 | &ajoute_liste( \@result, 180, 0 ); 1332 | 1333 | &ajoute_paragraphe( 1334 | "Vérifiez que le nom des champs est correctement libellé, que le nombre de séparateurs de champs est correct sur l’ensemble du fichier.", 1335 | 180, 50 1336 | ); 1337 | } 1338 | } 1339 | } 1340 | 1341 | &ajoute_paragraphe("La conformité structurelle du FEC ne présage pas de la régularité de la comptabilité, \nni de sa valeur probante.", 1342 | 180, 50 ); 1343 | 1344 | if ( &aorte() eq "t" ) { 1345 | 1346 | &ajoute_paragraphe("Ce test a été effectué avec l'application Test Compta Démat version $vers_java. La synthèse des résultats ne constitue pas une attestation de conformité, elle ne saurait engager l'administration.",180,50); 1347 | } 1348 | 1349 | 1350 | 1351 | # tableau synthèse page (2+) 1352 | &new_page; 1353 | 1354 | $text_to_place = 1355 | " Tableau de synthèse des $nb_bilanctl premiers champs du FEC"; 1356 | &ajoute_paragraphe( $text_to_place, 190, 50 ); 1357 | 1358 | @result = [ 1359 | "Information demandée", 1360 | "Nom du champ défini à l’art. A47 A-1 du LPF", 1361 | "Nom du champ détecté dans le FEC" 1362 | ]; 1363 | foreach my $col_bilan ( 1364 | sort { $rr_bilanctl->{$a}{'lib'} <=> $rr_bilanctl->{$b}{'lib'} } 1365 | keys %r_bilanctl 1366 | ) 1367 | { 1368 | push @result, 1369 | [ 1370 | $r_bilanctl{$col_bilan}{'lib'}, $col_bilan, 1371 | $r_bilanctl{$col_bilan}{'nomFEC'} 1372 | ]; 1373 | } 1374 | 1375 | &ajoute_table( \@result, 180, 3 ); 1376 | 1377 | # page 3 : simple info 1378 | &new_page; 1379 | 1380 | &ombre( "Observations complémentaires :", 190, 50 ); 1381 | 1382 | # champs supplémentaires : 1383 | $REQ = 1384 | "SELECT count(*) from log_alim where id_trait = '$log_seq' and type_log='S' "; 1385 | 1386 | @result = &sql_1col($REQ); 1387 | 1388 | if ( $result[0] == 0 ) { 1389 | &ombre( "Aucun champs supplémentaires n'est présent ", 190, 50 ); 1390 | } 1391 | else { 1392 | undef @result; 1393 | &ajoute_paragraphe( 1394 | "Les champs supplémentaires suivants figurent dans le fichier :", 1395 | 190, 50 ); 1396 | 1397 | #$REQ = "SELECT texte_log from log_alim where id_trait = '$log_seq' and type_log='S' "; 1398 | $REQ = 1399 | "SELECT distinct replace(replace (t.fixe_log,'#1',l.val1),'#2',l.val2) from log_alim l,log_type t where id_trait = '$log_seq' and type_log ='S' and t.id_type=l.texte_log"; 1400 | 1401 | push @result, &sql_1col($REQ); 1402 | &ajoute_liste( \@result, 150, 0 ); 1403 | } 1404 | 1405 | # 11/02/2014 : Evolution ajout des Alertes en pages 3 1406 | $REQ = 1407 | "SELECT count(*) from log_alim where id_trait = '$log_seq' and type_log='A' "; 1408 | @result = &sql_1col($REQ); 1409 | 1410 | if ( $result[0] == 0 ) { 1411 | 1412 | # &ombre("Aucun champs supplémentaires n'est présent ",190,50); 1413 | } 1414 | else { 1415 | undef @result; 1416 | &ajoute_paragraphe( 1417 | "Les anomalies suivantes figurent dans le fichier ", 1418 | 190, 50 1419 | ); 1420 | $REQ = 1421 | "select distinct(replace(replace (t.fixe_log,'#1','...'),'#2','...')) || '\n [' || count (*) || '] fois dans le fichier' from log_alim l, log_type t where id_trait = '$log_seq' and type_log='A' and t.id_type=l.texte_log group by l.texte_log having count ( distinct l.id_ligne) >1"; 1422 | push @result, &sql_1col($REQ); 1423 | $REQ = 1424 | "select distinct(replace(replace (t.fixe_log,'#1',l.val1),'#2',l.val2)) from log_alim l, log_type t where id_trait = '$log_seq' and type_log='A' and t.id_type=l.texte_log group by l.texte_log having count (distinct l.id_ligne)=1"; 1425 | push @result, &sql_1col($REQ); 1426 | 1427 | &ajoute_liste( \@result, 180, 0 ); 1428 | } 1429 | if ( &aorte() ne "t" ) { 1430 | $text_to_place = 1431 | " le total des montants figurant au débit et au crédit est :"; 1432 | &ajoute_paragraphe( $text_to_place, 190, 50 ); 1433 | my $some_data = 1434 | [ [ "Cumul Debit", "Cumul Credit", ], [ $somme{'DCC'}, $somme{'CCC'} ] ]; 1435 | &ajoute_table( $some_data, 120, 2 ); 1436 | } 1437 | 1438 | # Ajout SPECs 22 11/01/2015 1439 | undef @result; 1440 | if ( $rech_donnees_absentes[0] != 0 ) { 1441 | &ombre( "Données absentes :", 190, 50 ); 1442 | $REQ = 1443 | "select distinct(replace(replace (t.fixe_log,'#1',''),'#2','')) from log_alim l, log_type t where id_trait = '$log_seq' and type_log='V' and t.id_type=l.texte_log group by l.texte_log having count ( distinct l.id_ligne) >0"; 1444 | push @result, &sql_1col($REQ); 1445 | &ajoute_liste( \@result, 180, 0 ); 1446 | } 1447 | # Fin ajout SPECs 22 11/01/2015 1448 | 1449 | my ( $sec, $min, $hour, $mday, $mon, $year ) = localtime(time); 1450 | my $nouv_pdf = "${ProgramData}" . '/rapports/rapport_' . basename($file) . "_$hour$min$sec" . '.pdf'; 1451 | 1452 | # Modif du 10/04/2015 pour supprimer les espaces dans le nom du rapport à créer 1453 | $nouv_pdf =~ s/ {1,}//g; 1454 | 1455 | 1456 | &sauve_pdf($nouv_pdf); 1457 | 1458 | # Save the PDF 1459 | 1460 | if ( ${OS} =~ m/linux/i ) { 1461 | # system("evince $nouv_pdf"); 1462 | system("xdg-open $nouv_pdf 2> /dev/null"); 1463 | } 1464 | else { 1465 | system("start $nouv_pdf"); 1466 | } 1467 | 1468 | # Ajour de cette fonction suite à la SPEC 23 le 16/02/2015 1469 | if ( $nb_errs > 0 ) { 1470 | # &finko("paschargé"); 1471 | if ( ! ( (uc($ctl) eq "CTL" ) && ( &aorte() ne "t" ) ) ) { 1472 | &finko("paschargé"); 1473 | } 1474 | } 1475 | 1476 | } 1477 | 1478 | 1479 | sub Tk::Error { 1480 | my ( $Widget, $Error, @Locations ) = @_; 1481 | &erreur( "E", "Erreur system : contacter l' AT : " . $Error ); 1482 | &finko; 1483 | } 1484 | 1485 | 1486 | 1487 | 1488 | # Ajour de cette fonction suite à la SPEC 23 le 16/02/2015 1489 | sub Fenetre_KO() { 1490 | 1491 | my $msgFecNonConforme = $fentop->MsgBox( 1492 | -title => 'FEC non conforme', 1493 | -type => 'OK', 1494 | -message => &utf8toutf8("\nLe FEC n'est pas conforme en l'état.\n Un nouveau fichier est nécessaire.\n") 1495 | ); 1496 | my $reponse = $msgFecNonConforme->Show; 1497 | 1498 | 1499 | # my $Ko_fenetre_principale = $fentop->Toplevel( -title => 'FEC non conforme' ); 1500 | # my $KO_frame1 = $Ko_fenetre_principale->Frame; 1501 | # my $KO_zoneT = $KO_frame1->Label(-text=>" \n "); 1502 | # $KO_zoneT->pack(); 1503 | # my $KO_zoneVersion = $KO_frame1->Label(-text=>&utf8toutf8("\nLe FEC n'est pas conforme en l'état.\n Un nouveau fichier est nécessaire.\n"), -font => '{Garamond} 15'); 1504 | # $KO_zoneVersion->pack(); 1505 | # $KO_frame1->pack(); 1506 | # my $KO_frame2 = $Ko_fenetre_principale->Frame; 1507 | # my $KO_Button1 = $KO_frame2->Button( 1508 | # -text => 'Ok', 1509 | # -font => '{Garamond} 10', 1510 | # -command => sub { $Ko_fenetre_principale->destroy; return } 1511 | # ); 1512 | # $KO_Button1->pack(-pady => '40', -padx => '200', -side => 'left' 1513 | # ); 1514 | # $KO_frame2->pack(); 1515 | # $Ko_fenetre_principale->focusForce; 1516 | } 1517 | 1518 | # dernière ligne !!!! 1519 | 1520 | MainLoop; 1521 | --------------------------------------------------------------------------------