begin;

-- protect against wrong card in fiche_detail

CREATE OR REPLACE FUNCTION comptaproc.fiche_detail_check_qcode()
    RETURNS trigger
    LANGUAGE plpgsql
AS $function$
declare
    i record;
begin
    if NEW.ad_id=23 and NEW.ad_value != OLD.ad_value then
        update jrnx set j_qcode=NEW.ad_value where j_qcode = OLD.ad_value;
        update op_predef_detail set opd_poste=NEW.ad_value where opd_poste=OLD.ad_value;
        for i in select ad_id from attr_def where ad_type = 'card' or ad_id=25 loop
                update fiche_detail set ad_value=NEW.ad_value where ad_value=OLD.ad_value and ad_id=i.ad_id;
                if i.ad_id=19 then
                    update stock_goods set sg_code=NEW.ad_value where sg_code=OLD.ad_value;
                end if;

            end loop;
    end if;
    return NEW;
end;
$function$;

drop trigger if exists fiche_detail_check_qcode_trg on public.fiche_detail ;
drop function   if exists  comptaproc.fiche_detail_qcode_upd() cascade;

create trigger fiche_detail_check_qcode_trg before insert
    or update on
    public.fiche_detail for each row execute function comptaproc.fiche_detail_check_qcode();



update fiche_detail set ad_value=ad_value where ad_id in (select ad_id from attr_def where ad_type='card');

insert into parameter values ('MY_REPORT','N') ON CONFLICT DO NOTHING;

update menu_ref set me_file='payment_method.inc.php' where me_code='CFGPAY';

update menu_ref set me_menu='Principal' where me_code='COMPANY';
update menu_ref set me_menu='Financier' where me_code='MENUFIN';

CREATE OR REPLACE FUNCTION comptaproc.set_tech_user()
    RETURNS trigger
AS $function$
declare
    /* variable */
    noalyss_user text;
begin
    new.tech_user := current_setting('noalyss.user_login');
    new.tech_date := now();
    return NEW;

exception when others then
    new.tech_date := now();
    new.tech_user := current_user;
    return NEW;
end ;
$function$
    LANGUAGE plpgsql;

drop table if exists operation_exercice_detail;
drop table if exists operation_exercice;

create table operation_exercice
(
    oe_id   bigint generated by default as identity  primary key,
    oe_date date null,
    oe_type text not null check  (oe_type = 'opening' or oe_type = 'closing'),
    oe_text text ,
    oe_dossier_id int not null,
    oe_exercice int not null,
    jr_internal text,
    oe_transfer_date timestamp,
    tech_user text,
    tech_date timestamp default  now()
);

create table operation_exercice_detail
(
    oed_id  bigint generated by default as identity  primary key,
    oe_id bigint references operation_exercice (oe_id) on update cascade on delete cascade not null,
    oed_poste account_type ,
    oed_qcode text ,
    oed_label text,
    oed_amount numeric (20,4),
    oed_debit bool
);

create trigger trg_set_tech_user  before insert or update on operation_exercice  for each row execute function comptaproc.set_tech_user();

update menu_ref set me_code='OPCL' , me_menu='Ouvert./Fermeture',me_file='operation_exercice.inc.php',me_description='Opération de cloture ou d''ouverture d''exercice'
                  ,me_description_etendue ='Ecriture d''ouverture ou de fermeture , , reporte les soldes des comptes de l''année passé du poste comptable 0xxx à 5xxxx sur l''année courante ou ferme les comptes de 6 à 7 de l''année '
where me_code='OPEN';

insert into version (val,v_description) values (191,'cloture-ouverture exercice-version 9112');
commit;