You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

401 lines
20 KiB

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;