return: text lang: plpgsql parameters: p0: type: bigint name: i_oid src: | DECLARE result TEXT; BEGIN -- Paramètres -- i_oid = oid ajustement ou 0 pour tout -- Suppression écritures déjà générées DELETE FROM compta.p_historique_ecritures WHERE ajustement = '1' AND (cle_originale = i_oid::text OR i_oid = 0); -- Insertion des écritures 'simples' INSERT INTO compta.p_historique_ecritures( compte_id, date_ecriture, mois_comptable, montant_credit, montant_debit, journal_id, section_analytique_id, clinique_honoraire, exercice_comptable, type_compta_id, compte_extra_id, comptabilisee, fin_exercice, ajustement, cle_originale, compte_contrepartie_id, texte, date_facture_fournisseur, piece, dossier, date_echeance, journal_paiement_id, mode_paiement_id, numero_cheque) SELECT COALESCE(t_comptes.oid, t_comptes_extra.compte_general_id, 0), t_ecritures_ajustement.date_ecriture, t_ecritures_ajustement.mois_comptable, t_ecritures_ajustement.montant_credit, t_ecritures_ajustement.montant_debit, t_journaux.oid, COALESCE(t_sections_analytiques.oid,0), t_ecritures_ajustement.clinique_honoraire, p_calendrier_mois.exercice_comptable, CASE WHEN t_comptes.oid IS NOT NULL THEN t_comptes.type_compta_id ELSE t_comptes_gen.type_compta_id END, CASE WHEN t_comptes.oid IS NOT NULL THEN t_comptes.oid ELSE COALESCE(t_comptes_extra.oid,0) END, '0', '0', '1', CASE WHEN t_ecritures_ajustement.ecriture_maitre_id = 0 THEN t_ecritures_ajustement.oid ELSE t_ecritures_ajustement.ecriture_maitre_id END::text, 0, t_ecritures_ajustement.texte, null, '', '', null, 0, 0, '' FROM compta.t_ecritures_ajustement JOIN base.p_calendrier_mois ON (t_ecritures_ajustement.mois_comptable = p_calendrier_mois.mois) JOIN compta.t_journaux ON (t_ecritures_ajustement.journal_code = t_journaux.code) LEFT JOIN compta.t_sections_analytiques ON (t_ecritures_ajustement.section_analytique_code = t_sections_analytiques.code) LEFT JOIN compta.t_comptes ON (t_ecritures_ajustement.compte_numero = t_comptes.numero AND t_comptes.oid = t_comptes.compte_general_id) LEFT JOIN compta.t_comptes t_comptes_extra ON (t_ecritures_ajustement.compte_numero = t_comptes_extra.numero AND t_comptes_extra.oid <> t_comptes_extra.compte_general_id) LEFT JOIN compta.t_comptes t_comptes_gen ON (t_comptes_extra.compte_general_id = t_comptes_gen.oid) WHERE t_ecritures_ajustement.est_import_data IS DISTINCT FROM '1' AND ( t_ecritures_ajustement.oid = i_oid OR t_ecritures_ajustement.ecriture_maitre_id = i_oid OR i_oid = 0 ); -- Insertion des écritures 'simples' en report mois suivant INSERT INTO compta.p_historique_ecritures( compte_id, date_ecriture, mois_comptable, montant_credit, montant_debit, journal_id, section_analytique_id, clinique_honoraire, exercice_comptable, type_compta_id, compte_extra_id, comptabilisee, fin_exercice, ajustement, cle_originale, compte_contrepartie_id, texte, date_facture_fournisseur, piece, dossier, date_echeance, journal_paiement_id, mode_paiement_id, numero_cheque) SELECT COALESCE(t_comptes.oid, t_comptes_extra.compte_general_id, 0), t_ecritures_ajustement.date_ecriture, CASE WHEN substr(t_ecritures_ajustement.mois_comptable, 5, 2) <> '12' THEN t_ecritures_ajustement.mois_comptable + 1 ELSE t_ecritures_ajustement.mois_comptable + 89 END, t_ecritures_ajustement.montant_debit, t_ecritures_ajustement.montant_credit, t_journaux.oid, COALESCE(t_sections_analytiques.oid,0), t_ecritures_ajustement.clinique_honoraire, p_calendrier_mois.exercice_comptable, CASE WHEN t_comptes.oid IS NOT NULL THEN t_comptes.type_compta_id ELSE t_comptes_gen.type_compta_id END, CASE WHEN t_comptes.oid IS NOT NULL THEN t_comptes.oid ELSE COALESCE(t_comptes_extra.oid,0) END, '0', '0', '1', CASE WHEN t_ecritures_ajustement.ecriture_maitre_id = 0 THEN t_ecritures_ajustement.oid ELSE t_ecritures_ajustement.ecriture_maitre_id END::text, 0, 'REPORT ' || t_ecritures_ajustement.texte, null, '', '', null, 0, 0, '' FROM compta.t_ecritures_ajustement JOIN base.p_calendrier_mois ON (t_ecritures_ajustement.mois_comptable = p_calendrier_mois.mois) JOIN compta.t_journaux ON (t_ecritures_ajustement.journal_code = t_journaux.code) LEFT JOIN compta.t_sections_analytiques ON (t_ecritures_ajustement.section_analytique_code = t_sections_analytiques.code) LEFT JOIN compta.t_comptes ON (t_ecritures_ajustement.compte_numero = t_comptes.numero AND t_comptes.oid = t_comptes.compte_general_id) LEFT JOIN compta.t_comptes t_comptes_extra ON (t_ecritures_ajustement.compte_numero = t_comptes_extra.numero AND t_comptes_extra.oid <> t_comptes_extra.compte_general_id) LEFT JOIN compta.t_comptes t_comptes_gen ON (t_comptes_extra.compte_general_id = t_comptes_gen.oid) WHERE t_ecritures_ajustement.est_import_data IS DISTINCT FROM '1' AND t_ecritures_ajustement.report_automatique_mois_suivant = '1' AND ( t_ecritures_ajustement.oid = i_oid OR t_ecritures_ajustement.ecriture_maitre_id = i_oid OR i_oid = 0 ); -- Insertion des écritures en format Excel IF NOT EXISTS (SELECT * FROM pg_class WHERE relnamespace = pg_my_temp_schema() AND relname = 'w_cti_gen_ajustements') THEN CREATE TEMP TABLE w_cti_gen_ajustements( oid bigint, clinique_honoraire text, report_automatique_mois_suivant text, est_balance text, texte_source text, import_ligne text, import_date text, import_journal text, import_compte text, import_section text, import_texte text, import_debit text, import_credit text, date_ecriture date DEFAULT '20991231', mois_comptable numeric DEFAULT 0, exercice_comptable numeric DEFAULT 0, montant_debit numeric default 0, montant_credit numeric default 0); END IF; TRUNCATE w_cti_gen_ajustements; INSERT INTO w_cti_gen_ajustements(oid, clinique_honoraire, report_automatique_mois_suivant, est_balance, texte_source, import_ligne) SELECT oid, clinique_honoraire, report_automatique_mois_suivant, est_balance, texte, trim(import_ligne) AS import_ligne FROM ( SELECT oid, clinique_honoraire, report_automatique_mois_suivant, est_balance, texte, unnest(data_array) AS import_ligne FROM ( SELECT t_ecritures_ajustement.oid, clinique_honoraire, report_automatique_mois_suivant, est_balance, texte, string_to_array(replace(import_data,E'\t','||'),E'\r') AS data_array FROM compta.t_ecritures_ajustement WHERE est_import_data = '1' AND ( t_ecritures_ajustement.oid = i_oid OR i_oid = 0 ) ) subview ) subview WHERE trim(import_ligne) <> ''; UPDATE w_cti_gen_ajustements SET import_date = trim(split_part(import_ligne,'||',1)), import_journal = upper(trim(split_part(import_ligne,'||',2))), import_compte = trim(split_part(import_ligne,'||',3)), import_section = trim(split_part(import_ligne,'||',4)), import_texte = trim(split_part(import_ligne,'||',5)), import_debit = trim(split_part(import_ligne,'||',6)), import_credit = trim(split_part(import_ligne,'||',7)) ; UPDATE w_cti_gen_ajustements SET date_ecriture = base.cti_to_date(import_date), montant_debit = base.cti_to_number(translate(import_debit,',€? ','.')), montant_credit = base.cti_to_number(translate(import_credit ,',€? ','.')); UPDATE w_cti_gen_ajustements SET mois_comptable = date_part('year',date_ecriture)*100+date_part('month',date_ecriture) ; UPDATE w_cti_gen_ajustements SET exercice_comptable = p_calendrier_mois.exercice_comptable FROM base.p_calendrier_mois WHERE p_calendrier_mois.mois = w_cti_gen_ajustements.mois_comptable ; -- Si balance, traitement comptes en double UPDATE w_cti_gen_ajustements SET import_compte = CASE WHEN w_cti_gen_ajustements.CTID = keepCTID THEN w_cti_gen_ajustements.import_compte ELSE '' END, montant_debit = subview.montant_debit, montant_credit = subview.montant_credit FROM ( SELECT mois_comptable, clinique_honoraire, import_compte, SUM(montant_debit) AS montant_debit, SUM(montant_credit) AS montant_credit, MIN(CTID) AS keepCTID FROM w_cti_gen_ajustements WHERE est_balance IN ('M','X') AND NOT (import_compte = '' OR import_compte < '1' OR import_compte >= '8') GROUP BY 1,2,3 HAVING count(*) > 1 ) subview WHERE w_cti_gen_ajustements.mois_comptable = subview.mois_comptable AND w_cti_gen_ajustements.import_compte = subview.import_compte AND w_cti_gen_ajustements.clinique_honoraire = subview.clinique_honoraire ; DELETE FROM w_cti_gen_ajustements WHERE import_compte = '' OR import_compte < '1' OR import_compte >= '8' ; -- Si import balances, génération des écarts DROP TABLE IF EXISTS w_cti_gen_ajustements_synthese; CREATE TEMP TABLE w_cti_gen_ajustements_synthese AS SELECT oid, mois_comptable, mois_comptable AS mois_comptable_1, 0::numeric AS exercice_comptable, clinique_honoraire, substr(import_compte,1,1) AS classe, MAX(import_journal) AS import_journal, MAX(import_texte) AS import_texte, MAX(date_ecriture) AS date_ecriture, MAX(texte_source) AS texte_source, MAX(report_automatique_mois_suivant) AS report_automatique_mois_suivant, MAX(est_balance) AS est_balance FROM w_cti_gen_ajustements WHERE import_compte <> '' AND est_balance IN ('M','X') AND mois_comptable IS NOT NULL AND substr(import_compte,1,1) IN ('1','2','3','4','5','6','7') GROUP BY 1,2,3,4,5,6; UPDATE w_cti_gen_ajustements_synthese SET mois_comptable_1 = CASE WHEN est_balance = 'X' THEN p_calendrier_mois.exercice_mois_comptable_1 ELSE mois_comptable_1 END, exercice_comptable = p_calendrier_mois.exercice_comptable FROM base.p_calendrier_mois WHERE mois = mois_comptable; DROP TABLE IF EXISTS w_cti_gen_ajustements_deja; CREATE TEMP TABLE w_cti_gen_ajustements_deja AS SELECT w_cti_gen_ajustements_synthese.oid, w_cti_gen_ajustements_synthese.mois_comptable, w_cti_gen_ajustements_synthese.exercice_comptable, w_cti_gen_ajustements_synthese.clinique_honoraire, compte_nonsigne_numero AS numero, SUM(montant_debit) AS montant_debit, SUM(montant_credit) AS montant_credit, SUM(montant_debit) - SUM(montant_credit) AS montant, MAX(import_journal) AS import_journal, MAX(import_texte) AS import_texte, MAX(w_cti_gen_ajustements_synthese.date_ecriture) AS date_ecriture, MAX(texte_source) AS texte_source, MAX(report_automatique_mois_suivant) AS report_automatique_mois_suivant, MAX(est_balance) AS est_balance FROM compta.p_historique_ecritures JOIN compta.t_comptes ON compte_id = t_comptes.oid JOIN w_cti_gen_ajustements_synthese ON substr(t_comptes.numero,1,1) = w_cti_gen_ajustements_synthese.classe AND p_historique_ecritures.mois_comptable BETWEEN w_cti_gen_ajustements_synthese.mois_comptable_1 AND w_cti_gen_ajustements_synthese.mois_comptable AND p_historique_ecritures.clinique_honoraire = w_cti_gen_ajustements_synthese.clinique_honoraire AND p_historique_ecritures.is_budget = '0' GROUP BY 1,2,3,4,5 ORDER BY 1,2,3,5,6 ; INSERT INTO w_cti_gen_ajustements(oid, clinique_honoraire, report_automatique_mois_suivant, est_balance, texte_source, import_journal, import_compte, import_texte, date_ecriture, exercice_comptable, mois_comptable, montant_debit, montant_credit) SELECT w_cti_gen_ajustements_deja.oid, w_cti_gen_ajustements_deja.clinique_honoraire, w_cti_gen_ajustements_deja.report_automatique_mois_suivant, w_cti_gen_ajustements_deja.est_balance, w_cti_gen_ajustements_deja.texte_source, w_cti_gen_ajustements_deja.import_journal, w_cti_gen_ajustements_deja.numero, w_cti_gen_ajustements_deja.import_texte, w_cti_gen_ajustements_deja.date_ecriture, w_cti_gen_ajustements_deja.exercice_comptable, w_cti_gen_ajustements_deja.mois_comptable, 0, 0 FROM w_cti_gen_ajustements_deja LEFT JOIN w_cti_gen_ajustements ON w_cti_gen_ajustements_deja.mois_comptable = w_cti_gen_ajustements.mois_comptable AND w_cti_gen_ajustements_deja.clinique_honoraire = w_cti_gen_ajustements.clinique_honoraire AND w_cti_gen_ajustements_deja.numero = w_cti_gen_ajustements.import_compte WHERE w_cti_gen_ajustements.import_compte IS NULL ; UPDATE w_cti_gen_ajustements SET montant_debit = CASE WHEN montant_ajustement <= 0 THEN 0-montant_ajustement ELSE 0 END, montant_credit = CASE WHEN montant_ajustement >= 0 THEN montant_ajustement ELSE 0 END FROM ( SELECT w_cti_gen_ajustements_deja.mois_comptable, w_cti_gen_ajustements_deja.clinique_honoraire, numero, w_cti_gen_ajustements_deja.montant - (w_cti_gen_ajustements.montant_debit - w_cti_gen_ajustements.montant_credit) AS montant_ajustement FROM w_cti_gen_ajustements_deja JOIN w_cti_gen_ajustements ON w_cti_gen_ajustements_deja.mois_comptable = w_cti_gen_ajustements.mois_comptable AND w_cti_gen_ajustements_deja.clinique_honoraire = w_cti_gen_ajustements.clinique_honoraire AND w_cti_gen_ajustements_deja.numero = w_cti_gen_ajustements.import_compte ORDER BY 1,2,3 ) subview WHERE subview.mois_comptable = w_cti_gen_ajustements.mois_comptable AND subview.clinique_honoraire = w_cti_gen_ajustements.clinique_honoraire AND subview.numero = w_cti_gen_ajustements.import_compte; -- Génération des écritures INSERT INTO compta.p_historique_ecritures( compte_id, date_ecriture, mois_comptable, montant_credit, montant_debit, journal_id, section_analytique_id, clinique_honoraire, exercice_comptable, type_compta_id, compte_extra_id, comptabilisee, fin_exercice, ajustement, cle_originale, compte_contrepartie_id, texte, date_facture_fournisseur, piece, dossier, date_echeance, journal_paiement_id, mode_paiement_id, numero_cheque) SELECT COALESCE(t_comptes.oid, t_comptes_extra.compte_general_id, 0), w_cti_gen_ajustements.date_ecriture, w_cti_gen_ajustements.mois_comptable, w_cti_gen_ajustements.montant_credit, w_cti_gen_ajustements.montant_debit, t_journaux.oid, COALESCE(t_sections_analytiques.oid,0), w_cti_gen_ajustements.clinique_honoraire, w_cti_gen_ajustements.exercice_comptable, CASE WHEN t_comptes.oid IS NOT NULL THEN t_comptes.type_compta_id ELSE t_comptes_gen.type_compta_id END, CASE WHEN t_comptes.oid IS NOT NULL THEN t_comptes.oid ELSE COALESCE(t_comptes_extra.oid,0) END, '0', '0', '1', w_cti_gen_ajustements.oid::text, 0, w_cti_gen_ajustements.texte_source || CASE WHEN w_cti_gen_ajustements.import_texte <> '' THEN '- ' || w_cti_gen_ajustements.import_texte ELSE '' END, null, '', '', null, 0, 0, '' FROM w_cti_gen_ajustements JOIN compta.t_journaux ON (w_cti_gen_ajustements.import_journal = t_journaux.code) LEFT JOIN compta.t_sections_analytiques ON (w_cti_gen_ajustements.import_section = t_sections_analytiques.code) LEFT JOIN compta.t_comptes ON (w_cti_gen_ajustements.import_compte = t_comptes.numero AND t_comptes.oid = t_comptes.compte_general_id) LEFT JOIN compta.t_comptes t_comptes_extra ON (w_cti_gen_ajustements.import_compte = t_comptes_extra.numero AND t_comptes_extra.oid <> t_comptes_extra.compte_general_id) LEFT JOIN compta.t_comptes t_comptes_gen ON (t_comptes_extra.compte_general_id = t_comptes_gen.oid) WHERE import_compte <> '' AND (w_cti_gen_ajustements.montant_debit <> 0 OR w_cti_gen_ajustements.montant_credit <> 0) ; -- Report mois suivant INSERT INTO compta.p_historique_ecritures( compte_id, date_ecriture, mois_comptable, montant_credit, montant_debit, journal_id, section_analytique_id, clinique_honoraire, exercice_comptable, type_compta_id, compte_extra_id, comptabilisee, fin_exercice, ajustement, cle_originale, compte_contrepartie_id, texte, date_facture_fournisseur, piece, dossier, date_echeance, journal_paiement_id, mode_paiement_id, numero_cheque) SELECT COALESCE(t_comptes.oid, t_comptes_extra.compte_general_id, 0), w_cti_gen_ajustements.date_ecriture, CASE WHEN substr(w_cti_gen_ajustements.mois_comptable, 5, 2) <> '12' THEN w_cti_gen_ajustements.mois_comptable + 1 ELSE w_cti_gen_ajustements.mois_comptable + 89 END, w_cti_gen_ajustements.montant_debit, w_cti_gen_ajustements.montant_credit, t_journaux.oid, COALESCE(t_sections_analytiques.oid,0), w_cti_gen_ajustements.clinique_honoraire, w_cti_gen_ajustements.exercice_comptable, CASE WHEN t_comptes.oid IS NOT NULL THEN t_comptes.type_compta_id ELSE t_comptes_gen.type_compta_id END, CASE WHEN t_comptes.oid IS NOT NULL THEN t_comptes.oid ELSE COALESCE(t_comptes_extra.oid,0) END, '0', '0', '1', w_cti_gen_ajustements.oid::text, 0, 'REPORT ' || w_cti_gen_ajustements.texte_source || CASE WHEN w_cti_gen_ajustements.import_texte <> '' THEN '- ' || w_cti_gen_ajustements.import_texte ELSE '' END, null, '', '', null, 0, 0, '' FROM w_cti_gen_ajustements JOIN compta.t_journaux ON (w_cti_gen_ajustements.import_journal = t_journaux.code) LEFT JOIN compta.t_sections_analytiques ON (w_cti_gen_ajustements.import_section = t_sections_analytiques.code) LEFT JOIN compta.t_comptes ON (w_cti_gen_ajustements.import_compte = t_comptes.numero AND t_comptes.oid = t_comptes.compte_general_id) LEFT JOIN compta.t_comptes t_comptes_extra ON (w_cti_gen_ajustements.import_compte = t_comptes_extra.numero AND t_comptes_extra.oid <> t_comptes_extra.compte_general_id) LEFT JOIN compta.t_comptes t_comptes_gen ON (t_comptes_extra.compte_general_id = t_comptes_gen.oid) WHERE import_compte <> '' AND w_cti_gen_ajustements.report_automatique_mois_suivant = '1' AND (w_cti_gen_ajustements.montant_debit <> 0 OR w_cti_gen_ajustements.montant_credit <> 0) ; UPDATE compta.p_historique_ecritures SET site_id = coalesce((SELECT MIN(oid) FROM compta.t_sites WHERE oid <> 0), 0) WHERE site_id IS NULL OR site_id = 0; -- Regénération écritures 'total' DELETE FROM compta.p_historique_ecritures_total WHERE ajustement = '1' ; INSERT INTO compta.p_historique_ecritures_total( compte_id, mois_comptable, montant_credit, montant_debit, journal_id, section_analytique_id, clinique_honoraire, exercice_comptable, type_compta_id, site_id, compte_extra_id, partenaire_id, comptabilisee, fin_exercice, ajustement, inter_site, ecriture_consolidee, nombre_ecritures) SELECT compte_id, mois_comptable, sum(montant_credit), sum(montant_debit), journal_id, section_analytique_id, clinique_honoraire, exercice_comptable, type_compta_id, site_id, compte_extra_id, partenaire_id, comptabilisee, fin_exercice, ajustement, inter_site, ecriture_consolidee, count(*) FROM compta.p_historique_ecritures WHERE ajustement = '1' GROUP BY compte_id, mois_comptable, journal_id, section_analytique_id, clinique_honoraire, exercice_comptable, type_compta_id, site_id, compte_extra_id, partenaire_id, comptabilisee, fin_exercice, ajustement, inter_site, ecriture_consolidee; -- Report des cumuls sur données importées excel UPDATE compta.t_ecritures_ajustement SET journal_code = subview.journal_code, mois_comptable = subview.mois_comptable, montant_debit = subview.montant_debit, montant_credit = subview.montant_credit FROM ( SELECT cle_originale, base.cti_group_concat(DISTINCT t_journaux.code) AS journal_code, SUM(montant_debit) AS montant_debit, SUM(montant_credit) AS montant_credit, MAX(CASE WHEN p_historique_ecritures.texte NOT LIKE 'REPORT %' THEN mois_comptable ELSE 0 END) AS mois_comptable FROM compta.p_historique_ecritures JOIN compta.t_journaux ON journal_id = t_journaux.oid WHERE ajustement = '1' GROUP BY 1 ) subview WHERE t_ecritures_ajustement.oid = subview.cle_originale AND t_ecritures_ajustement.est_import_data = '1'; RETURN 'OK'; END;