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.
 
 
 

554 lines
20 KiB

return: text
lang: plpgsql
parameters:
p0:
type: bigint
name: i_oid
src: |
DECLARE
result TEXT;
BEGIN
-- Table de travail
IF NOT EXISTS (SELECT * FROM pg_class WHERE relnamespace = pg_my_temp_schema() AND relname = 'w_cti_gen_budget') THEN
DROP TABLE IF EXISTS w_cti_gen_budget;
CREATE TEMP TABLE w_cti_gen_budget(
oid bigint,
import_ligne text,
import_compte_budgetaire text,
import_compte_texte text,
import_include_comptes text,
import_exclude_comptes text,
import_montant_exercice text,
import_type_ventilation text,
import_taux01 text,
import_taux02 text,
import_taux03 text,
import_taux04 text,
import_taux05 text,
import_taux06 text,
import_taux07 text,
import_taux08 text,
import_taux09 text,
import_taux10 text,
import_taux11 text,
import_taux12 text,
montant_exercice numeric,
taux01 numeric,
taux02 numeric,
taux03 numeric,
taux04 numeric,
taux05 numeric,
taux06 numeric,
taux07 numeric,
taux08 numeric,
taux09 numeric,
taux10 numeric,
taux11 numeric,
taux12 numeric,
import_section_analytique text
);
END IF;
-- lignes de budget issues du copier coller excel
TRUNCATE w_cti_gen_budget;
INSERT INTO w_cti_gen_budget(oid, import_ligne)
SELECT
oid,
trim(import_ligne) AS import_ligne
FROM
(
SELECT oid, unnest(data_array) AS import_ligne
FROM
(
SELECT
t_budget.oid, string_to_array(replace(import_data,E'\t','||'),E'\r') AS data_array
FROM compta.t_budget
WHERE is_actif = '1' AND
(
t_budget.oid = i_oid OR
i_oid = 0
)
) subview
) subview
WHERE trim(import_ligne) <> '';
-- Découpage champs
UPDATE w_cti_gen_budget SET
import_compte_budgetaire = trim(split_part(import_ligne,'||',1)),
import_compte_texte = trim(split_part(import_ligne,'||',2)),
import_include_comptes = trim(split_part(import_ligne,'||',3)),
import_exclude_comptes = trim(split_part(import_ligne,'||',4)),
import_montant_exercice = trim(split_part(import_ligne,'||',5)),
import_type_ventilation = trim(split_part(import_ligne,'||',6)),
import_taux01 = trim(split_part(import_ligne,'||',7)),
import_taux02 = trim(split_part(import_ligne,'||',8)),
import_taux03 = trim(split_part(import_ligne,'||',9)),
import_taux04 = trim(split_part(import_ligne,'||',10)),
import_taux05 = trim(split_part(import_ligne,'||',11)),
import_taux06 = trim(split_part(import_ligne,'||',12)),
import_taux07 = trim(split_part(import_ligne,'||',13)),
import_taux08 = trim(split_part(import_ligne,'||',14)),
import_taux09 = trim(split_part(import_ligne,'||',15)),
import_taux10 = trim(split_part(import_ligne,'||',16)),
import_taux11 = trim(split_part(import_ligne,'||',17)),
import_taux12 = trim(split_part(import_ligne,'||',18)),
import_section_analytique = trim(split_part(import_ligne,'||',19))
;
-- Champs numériques
UPDATE w_cti_gen_budget SET
montant_exercice = CASE WHEN import_montant_exercice <> '' THEN base.cti_to_number(translate(import_montant_exercice ,',€? ','.')) ELSE 0 END,
taux01 = CASE WHEN import_taux01 <> '' THEN base.cti_to_number(translate(import_taux01 ,',€? ','.')) ELSE 0 END,
taux02 = CASE WHEN import_taux02 <> '' THEN base.cti_to_number(translate(import_taux02 ,',€? ','.')) ELSE 0 END,
taux03 = CASE WHEN import_taux03 <> '' THEN base.cti_to_number(translate(import_taux03 ,',€? ','.')) ELSE 0 END,
taux04 = CASE WHEN import_taux04 <> '' THEN base.cti_to_number(translate(import_taux04 ,',€? ','.')) ELSE 0 END,
taux05 = CASE WHEN import_taux05 <> '' THEN base.cti_to_number(translate(import_taux05 ,',€? ','.')) ELSE 0 END,
taux06 = CASE WHEN import_taux06 <> '' THEN base.cti_to_number(translate(import_taux06 ,',€? ','.')) ELSE 0 END,
taux07 = CASE WHEN import_taux07 <> '' THEN base.cti_to_number(translate(import_taux07 ,',€? ','.')) ELSE 0 END,
taux08 = CASE WHEN import_taux08 <> '' THEN base.cti_to_number(translate(import_taux08 ,',€? ','.')) ELSE 0 END,
taux09 = CASE WHEN import_taux09 <> '' THEN base.cti_to_number(translate(import_taux09 ,',€? ','.')) ELSE 0 END,
taux10 = CASE WHEN import_taux10 <> '' THEN base.cti_to_number(translate(import_taux10 ,',€? ','.')) ELSE 0 END,
taux11 = CASE WHEN import_taux11 <> '' THEN base.cti_to_number(translate(import_taux11 ,',€? ','.')) ELSE 0 END,
taux12 = CASE WHEN import_taux12 <> '' THEN base.cti_to_number(translate(import_taux12 ,',€? ','.')) ELSE 0 END
;
-- Génération des tables budget
DELETE FROM compta.t_budget_compte
WHERE budget_id IN (SELECT oid FROM w_cti_gen_budget)
;
-- Budget structuré
INSERT INTO compta.t_budget_compte(
budget_id,
numero,
texte,
clinique_honoraire,
section_analytique_code,
include_numero,
exclude_numero,
montant_budget_exercice,
mode_ventilation,
taux_budget_mensuel)
SELECT
oid,
import_compte_budgetaire,
import_compte_texte,
'C'::text AS clinique_honoraire,
import_section_analytique,
import_include_comptes,
import_exclude_comptes,
montant_exercice,
import_type_ventilation,
Array[
taux01,
taux02,
taux03,
taux04,
taux05,
taux06,
taux07,
taux08,
taux09,
taux10,
taux11,
taux12
]
FROM w_cti_gen_budget
WHERE import_compte_budgetaire <> '' AND
import_compte_budgetaire BETWEEN '1' AND '99999999' AND
import_include_comptes <> ''
;
-- Ajout compte à zéro pour jointure budget
INSERT INTO compta.t_types_compta(
oid, code_original, code, texte, specialite)
SELECT 0, '', 'NR', 'Non renseigné', ''
WHERE 0 NOT IN (SELECT oid FROM compta.t_types_compta)
;
INSERT INTO compta.t_classes_comptes
(oid, code, texte, clinique, honoraire)
SELECT 0, '0', 'Non renseigné', '0', '0'
WHERE 0 NOT IN (SELECT oid FROM compta.t_classes_comptes)
;
INSERT INTO compta.t_comptes
(oid, type_compta_id, numero, texte, clinique_honoraire, compte_general_id)
SELECT 0, 0, '00000000', 'Non renseigné', 'C', 0
WHERE 0 NOT IN (SELECT oid FROM compta.t_comptes)
;
INSERT INTO compta.t_comptes(
type_compta_id, numero, texte, clinique_honoraire)
SELECT subview.type_compta_id,
t_budget_compte.numero,
t_budget_compte.texte,
t_budget_compte.clinique_honoraire
FROM compta.t_budget_compte
JOIN
(
SELECT
substr(numero,1,1) AS classe, MAX(type_compta_id) AS type_compta_id
FROM compta.t_comptes
WHERE oid = compte_general_id
GROUP BY 1
ORDER BY count(*) DESC
) subview ON substr(numero,1,1)= subview.classe
LEFT JOIN compta.t_comptes ON
t_budget_compte.numero = t_comptes.numero AND
subview.type_compta_id = t_comptes.type_compta_id
WHERE t_budget_compte.numero BETWEEN '1' AND '99999999' AND
t_comptes.oid IS NULL
;
UPDATE compta.t_comptes
SET compte_general_id = oid
WHERE (compte_general_id IS NULL OR compte_general_id = 0) AND
numero IN (SELECT numero FROM compta.t_budget_compte)
;
PERFORM compta.cti_reorganize_comptes_c();
PERFORM base.cti_update_classes('compta', 't_comptes_c', 'CPT','');
UPDATE compta.t_budget_compte
SET compte_budget_id = t_comptes.oid
FROM compta.t_comptes
WHERE t_budget_compte.numero = t_comptes.numero AND
t_budget_compte.numero BETWEEN '1' AND '99999999' AND
compte_budget_id IS DISTINCT FROM t_comptes.oid
;
-- Table d'association lignes budget - comptes
DROP TABLE IF EXISTS w_budget_compte_compte;
CREATE TEMP TABLE w_budget_compte_compte AS
SELECT t_budget_compte.oid AS in_budget_compte_id, t_comptes.oid AS in_compte_id
FROM compta.t_budget_compte
JOIN compta.t_comptes ON
t_comptes.numero ILIKE ANY (string_to_array(replace(include_numero,'*','%'),' ')) AND
NOT (t_comptes.numero ILIKE ANY (string_to_array(replace(exclude_numero,'*','%'),' ')))
;
INSERT INTO compta.t_budget_compte_compte
(budget_compte_id, compte_id)
SELECT in_budget_compte_id, in_compte_id
FROM w_budget_compte_compte
LEFT JOIN compta.t_budget_compte_compte ON
in_budget_compte_id = budget_compte_id AND
in_compte_id = compte_id
WHERE budget_compte_id IS NULL
;
DELETE FROM compta.t_budget_compte_compte
USING
(
SELECT budget_compte_id, compte_id
FROM compta.t_budget_compte_compte
LEFT JOIN w_budget_compte_compte ON
in_budget_compte_id = budget_compte_id AND
in_compte_id = compte_id
WHERE in_budget_compte_id IS NULL
) subview
WHERE t_budget_compte_compte.budget_compte_id = subview.budget_compte_id AND
t_budget_compte_compte.compte_id = subview.compte_id
;
UPDATE compta.p_historique_ecritures_total p_historique_ecritures
SET compte_budget_id = t_budget_compte.compte_budget_id
FROM compta.t_budget_compte_compte,
compta.t_budget_compte,
compta.t_budget
WHERE t_budget_compte_compte.compte_id = p_historique_ecritures.compte_id AND
t_budget_compte_compte.budget_compte_id = t_budget_compte.oid AND
t_budget_compte.budget_id = t_budget.oid AND
t_budget.exercice_comptable = p_historique_ecritures.exercice_comptable AND
t_budget.site_id = p_historique_ecritures.site_id AND
p_historique_ecritures.compte_budget_id IS DISTINCT FROM t_budget_compte.compte_budget_id
;
UPDATE compta.p_historique_ecritures
SET compte_budget_id = t_budget_compte.compte_budget_id
FROM compta.t_budget_compte_compte,
compta.t_budget_compte,
compta.t_budget
WHERE t_budget_compte_compte.compte_id = p_historique_ecritures.compte_id AND
t_budget_compte_compte.budget_compte_id = t_budget_compte.oid AND
t_budget_compte.budget_id = t_budget.oid AND
t_budget.exercice_comptable = p_historique_ecritures.exercice_comptable AND
t_budget.site_id = p_historique_ecritures.site_id AND
p_historique_ecritures.compte_budget_id IS DISTINCT FROM t_budget_compte.compte_budget_id
;
UPDATE compta.p_historique_ecritures_total
SET compte_budget_id = compte_nonsigne_id
FROM compta.t_comptes
WHERE compte_id = t_comptes.oid AND
(compte_budget_id = 0 OR compte_budget_id IS NULL)
;
UPDATE compta.p_historique_ecritures
SET compte_budget_id = compte_nonsigne_id
FROM compta.t_comptes
WHERE compte_id = t_comptes.oid AND
(compte_budget_id = 0 OR compte_budget_id IS NULL)
;
UPDATE compta.p_historique_ecritures_total
SET compte_budget_id = 0
WHERE compte_budget_id IS NULL
;
UPDATE compta.p_historique_ecritures
SET compte_budget_id = 0
WHERE compte_budget_id IS NULL
;
-- Ventilation mensuelle
-- Mois
UPDATE compta.t_budget
SET mois = subview.mois
FROM
(
SELECT oid, base.cti_array_accum(mois) AS mois
FROM
(
SELECT t_budget.oid, p_calendrier_mois.mois
FROM base.p_calendrier_mois
JOIN compta.t_budget ON t_budget.exercice_comptable = p_calendrier_mois.exercice_comptable
ORDER BY t_budget.oid, p_calendrier_mois.mois
) subview
GROUP BY 1
) subview
WHERE t_budget.oid = subview.oid AND
t_budget.mois IS DISTINCT FROM subview.mois
;
-- Taux de ventilation
-- Prorata temporis
UPDATE compta.t_budget_compte
SET taux_budget_mensuel =
ARRAY[
1.00/12,
1.00/12,
1.00/12,
1.00/12,
1.00/12,
1.00/12,
1.00/12,
1.00/12,
1.00/12,
1.00/12,
1.00/12,
1.00/12
]
WHERE mode_ventilation = '1'
;
--Saisonnalisé
UPDATE compta.t_budget_compte
SET taux_budget_mensuel = subview.taux_budget_mensuel
FROM
(
SELECT
t_budget_compte.oid,
t_budget_compte.numero,
Array[
base.cti_division(SUM(CASE WHEN mois_comptable+100 = t_budget.mois[1] THEN montant_debit-montant_credit ELSE 0 END),SUM(montant_debit-montant_credit)),
base.cti_division(SUM(CASE WHEN mois_comptable+100 = t_budget.mois[2] THEN montant_debit-montant_credit ELSE 0 END),SUM(montant_debit-montant_credit)),
base.cti_division(SUM(CASE WHEN mois_comptable+100 = t_budget.mois[3] THEN montant_debit-montant_credit ELSE 0 END),SUM(montant_debit-montant_credit)),
base.cti_division(SUM(CASE WHEN mois_comptable+100 = t_budget.mois[4] THEN montant_debit-montant_credit ELSE 0 END),SUM(montant_debit-montant_credit)),
base.cti_division(SUM(CASE WHEN mois_comptable+100 = t_budget.mois[5] THEN montant_debit-montant_credit ELSE 0 END),SUM(montant_debit-montant_credit)),
base.cti_division(SUM(CASE WHEN mois_comptable+100 = t_budget.mois[6] THEN montant_debit-montant_credit ELSE 0 END),SUM(montant_debit-montant_credit)),
base.cti_division(SUM(CASE WHEN mois_comptable+100 = t_budget.mois[7] THEN montant_debit-montant_credit ELSE 0 END),SUM(montant_debit-montant_credit)),
base.cti_division(SUM(CASE WHEN mois_comptable+100 = t_budget.mois[8] THEN montant_debit-montant_credit ELSE 0 END),SUM(montant_debit-montant_credit)),
base.cti_division(SUM(CASE WHEN mois_comptable+100 = t_budget.mois[9] THEN montant_debit-montant_credit ELSE 0 END),SUM(montant_debit-montant_credit)),
base.cti_division(SUM(CASE WHEN mois_comptable+100 = t_budget.mois[10] THEN montant_debit-montant_credit ELSE 0 END),SUM(montant_debit-montant_credit)),
base.cti_division(SUM(CASE WHEN mois_comptable+100 = t_budget.mois[11] THEN montant_debit-montant_credit ELSE 0 END),SUM(montant_debit-montant_credit)),
base.cti_division(SUM(CASE WHEN mois_comptable+100 = t_budget.mois[12] THEN montant_debit-montant_credit ELSE 0 END),SUM(montant_debit-montant_credit))
] AS taux_budget_mensuel,
SUM(montant_debit-montant_credit)
FROM compta.p_historique_ecritures
JOIN compta.t_budget ON p_historique_ecritures.exercice_comptable = t_budget.exercice_comptable -1
JOIN compta.t_budget_compte ON budget_id = t_budget.oid AND mode_ventilation = '2'
JOIN compta.t_budget_compte_compte ON t_budget_compte.oid = budget_compte_id
WHERE p_historique_ecritures.compte_id = t_budget_compte_compte.compte_id AND
is_budget IS DISTINCT FROM '1'
GROUP BY 1,2
) subview
WHERE t_budget_compte.oid = subview.oid
;
-- Montant saisis
UPDATE compta.t_budget_compte
SET taux_budget_mensuel =
ARRAY[
base.cti_division(taux_budget_mensuel[1],montant_budget_exercice),
base.cti_division(taux_budget_mensuel[2],montant_budget_exercice),
base.cti_division(taux_budget_mensuel[3],montant_budget_exercice),
base.cti_division(taux_budget_mensuel[4],montant_budget_exercice),
base.cti_division(taux_budget_mensuel[5],montant_budget_exercice),
base.cti_division(taux_budget_mensuel[6],montant_budget_exercice),
base.cti_division(taux_budget_mensuel[7],montant_budget_exercice),
base.cti_division(taux_budget_mensuel[8],montant_budget_exercice),
base.cti_division(taux_budget_mensuel[9],montant_budget_exercice),
base.cti_division(taux_budget_mensuel[10],montant_budget_exercice),
base.cti_division(taux_budget_mensuel[11],montant_budget_exercice),
base.cti_division(taux_budget_mensuel[12],montant_budget_exercice)
]
WHERE mode_ventilation = '8'
;
-- Ajustement dernier mois (arrondis)
UPDATE compta.t_budget_compte SET
montant_budget_mensuel =
ARRAY[
round(montant_budget_exercice * taux_budget_mensuel[1],2),
round(montant_budget_exercice * taux_budget_mensuel[2],2),
round(montant_budget_exercice * taux_budget_mensuel[3],2),
round(montant_budget_exercice * taux_budget_mensuel[4],2),
round(montant_budget_exercice * taux_budget_mensuel[5],2),
round(montant_budget_exercice * taux_budget_mensuel[6],2),
round(montant_budget_exercice * taux_budget_mensuel[7],2),
round(montant_budget_exercice * taux_budget_mensuel[8],2),
round(montant_budget_exercice * taux_budget_mensuel[9],2),
round(montant_budget_exercice * taux_budget_mensuel[10],2),
round(montant_budget_exercice * taux_budget_mensuel[11],2),
0.00
]
;
UPDATE compta.t_budget_compte SET
montant_budget_mensuel[12] =
montant_budget_exercice -
montant_budget_mensuel[1] -
montant_budget_mensuel[2] -
montant_budget_mensuel[3] -
montant_budget_mensuel[4] -
montant_budget_mensuel[5] -
montant_budget_mensuel[6] -
montant_budget_mensuel[7] -
montant_budget_mensuel[8] -
montant_budget_mensuel[9] -
montant_budget_mensuel[10] -
montant_budget_mensuel[11]
;
-- Génération en comptabilité
DELETE FROM compta.p_historique_ecritures
WHERE is_budget = '1'
;
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,
texte,
date_facture_fournisseur,
date_echeance,
numero_cheque,
site_id,
is_budget,
compte_budget_id)
SELECT
t_budget_compte.compte_budget_id,
(t_budget.mois[i]||'01')::date AS date_ecriture,
t_budget.mois[i] AS mois_comptable,
CASE WHEN t_budget_compte.numero LIKE '7%' OR t_budget_compte.numero BETWEEN '1' AND '59999999' OR t_budget_compte.numero BETWEEN '8' AND '99999999' AND montant_budget_mensuel[i] > 0 THEN montant_budget_mensuel[i] ELSE 0 END AS montant_credit,
CASE WHEN t_budget_compte.numero LIKE '6%' OR t_budget_compte.numero BETWEEN '1' AND '59999999' OR t_budget_compte.numero BETWEEN '8' AND '99999999' AND montant_budget_mensuel[i] < 0 THEN 0-montant_budget_mensuel[i] ELSE 0 END AS montant_debit,
0::bigint AS journal_id,
COALESCE(t_sections_analytiques.oid,0::bigint) AS section_analytique_id,
t_budget_compte.clinique_honoraire,
t_budget.exercice_comptable,
t_comptes.type_compta_id,
t_budget_compte.compte_budget_id AS compte_extra_id,
'0'::text AS comptabilisee,
'0'::text AS fin_exercice,
'0'::text AS ajustement,
t_budget.oid AS cle_originale,
'Budget ' || t_budget.exercice_comptable || ' ' || t_budget.texte,
'20991231'::date AS date_facture_fournisseur,
'20991231'::date AS date_echeance,
''::text AS numero_cheque,
t_budget.site_id,
'1'::text AS is_budget,
t_budget_compte.compte_budget_id
FROM compta.t_budget
JOIN compta.t_budget_compte ON budget_id = t_budget.oid
JOIN compta.t_comptes ON t_budget_compte.compte_budget_id = t_comptes.oid
LEFT JOIN compta.t_sections_analytiques ON t_budget_compte.section_analytique_code = t_sections_analytiques.code AND t_budget_compte.section_analytique_code <> ''
JOIN (
SELECT generate_series(1,12) AS i
) subview ON 1=1
WHERE is_actif = '1'
;
-- Regénération écritures 'total'
DELETE FROM compta.p_historique_ecritures_total WHERE is_budget = '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,
is_budget,
compte_budget_id,
nombre_ecritures)
SELECT
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,
is_budget,
compte_budget_id,
1
FROM compta.p_historique_ecritures
WHERE is_budget = '1'
;
-- Ajout des oid des comptes budgetaires
INSERT INTO compta.p_oids (code_table, oid)
SELECT 'comptes_budget_c', compte_budget_id
FROM compta.p_historique_ecritures_total
WHERE clinique_honoraire = 'C'
AND compte_budget_id NOT IN (SELECT oid FROM compta.p_oids WHERE code_table = 'comptes_budget_c')
GROUP BY 1,2;
RETURN 'OK';
END;