diff --git a/html/admin/sql/patch/upgrade31.sql b/html/admin/sql/patch/upgrade31.sql
new file mode 100644
index 000000000..854442427
--- /dev/null
+++ b/html/admin/sql/patch/upgrade31.sql
@@ -0,0 +1,668 @@
+begin ;
+
+CREATE or replace FUNCTION insert_quant_sold(
+ p_internal text,
+ p_jid numeric,
+ p_fiche character varying,
+ p_quant numeric,
+ p_price numeric,
+ p_vat numeric,
+ p_vat_code integer,
+ p_client character varying)
+ RETURNS void
+ AS $$
+declare
+ fid_client integer;
+ fid_good integer;
+begin
+
+ select f_id into fid_client from
+ attr_value join jnt_fic_att_value using (jft_id) where ad_id=23 and av_text=upper(p_client);
+ select f_id into fid_good from
+ attr_value join jnt_fic_att_value using (jft_id) where ad_id=23 and av_text=upper(p_fiche);
+ insert into quant_sold
+ (qs_internal,j_id,qs_fiche,qs_quantite,qs_price,qs_vat,qs_vat_code,qs_client,qs_valid)
+ values
+ (p_internal,p_jid,fid_good,p_quant,p_price,p_vat,p_vat_code,fid_client,'Y');
+ return;
+end;
+ $$
+ LANGUAGE plpgsql;
+
+
+
+CREATE or REPLACE FUNCTION account_update(p_f_id integer, p_account poste_comptable) RETURNS integer
+ AS $$
+declare
+nMax fiche.f_id%type;
+nCount integer;
+nParent tmp_pcmn.pcm_val_parent%type;
+sName varchar;
+nJft_id attr_value.jft_id%type;
+begin
+
+ if length(trim(p_account)) != 0 then
+ select count(*) into nCount from tmp_pcmn where pcm_val=p_account;
+ if nCount = 0 then
+ select av_text into sName from
+ attr_value join jnt_fic_att_value using (jft_id)
+ where
+ ad_id=1 and f_id=p_f_id;
+ nParent:=account_parent(p_account);
+ insert into tmp_pcmn(pcm_val,pcm_lib,pcm_val_parent) values (p_account,sName,nParent);
+ end if;
+ end if;
+ select jft_id into njft_id from jnt_fic_att_value where f_id=p_f_id and ad_id=5;
+ update attr_value set av_text=p_account where jft_id=njft_id;
+
+return njft_id;
+end;
+$$
+ LANGUAGE plpgsql;
+
+
+
+CREATE TABLE quant_purchase (
+ qp_id integer DEFAULT nextval(('s_quantity'::text)::regclass) NOT NULL,
+ qp_internal text NOT NULL,
+ j_id integer not null,
+ qp_fiche integer NOT NULL,
+ qp_quantite numeric(20,4) NOT NULL,
+ qp_price numeric(20,4),
+ qp_vat numeric(20,4) default 0.0,
+ qp_vat_code integer,
+ qp_nd_amount numeric(20,4) default 0.0,
+ qp_nd_tva numeric(20,4) default 0.0,
+ qp_nd_tva_recup numeric(20,4) default 0.0,
+ qp_supplier integer NOT NULL,
+ qp_valid char(1) default 'Y' not null
+);
+ALTER TABLE ONLY quant_purchase
+ ADD CONSTRAINT qp_id_pk PRIMARY KEY (qp_id);
+
+ALTER TABLE ONLY quant_purchase
+ ADD CONSTRAINT quant_purchase_j_id_fkey FOREIGN KEY (j_id) REFERENCES jrnx(j_id) ON UPDATE CASCADE ON DELETE CASCADE;
+
+---
+truncate quant_sold;
+alter table quant_sold ADD qs_valid char(1) ;
+alter table quant_sold add j_id integer;
+alter table quant_sold alter j_id set not null;
+
+ALTER TABLE ONLY quant_sold
+ ADD CONSTRAINT quant_sold_j_id_fkey FOREIGN KEY (j_id) REFERENCES jrnx(j_id) ON UPDATE CASCADE ON DELETE CASCADE;
+
+update quant_sold set qs_valid='Y';
+alter table quant_sold alter qs_valid set default 'Y';
+alter table quant_sold alter qs_valid set not null;
+
+
+
+CREATE or replace FUNCTION insert_quant_purchase
+ (p_internal text,
+ p_j_id numeric,
+ p_fiche character varying,
+ p_quant numeric,
+ p_price numeric,
+ p_vat numeric,
+ p_vat_code integer,
+ p_nd_amount numeric,
+ p_nd_tva numeric,
+ p_nd_tva_recup numeric,
+ p_client character varying) RETURNS void
+ AS $$
+declare
+ fid_client integer;
+ fid_good integer;
+begin
+ select f_id into fid_client from
+ attr_value join jnt_fic_att_value using (jft_id) where ad_id=23 and av_text=upper(p_client);
+ select f_id into fid_good from
+ attr_value join jnt_fic_att_value using (jft_id) where ad_id=23 and av_text=upper(p_fiche);
+ insert into quant_purchase
+ (qp_internal,
+ j_id,
+ qp_fiche,
+ qp_quantite,
+ qp_price,
+ qp_vat,
+ qp_vat_code,
+ qp_nd_amount,
+ qp_nd_tva,
+ qp_nd_tva_recup,
+ qp_supplier)
+ values
+ (p_internal,
+ p_j_id,
+ fid_good,
+ p_quant,
+ p_price,
+ p_vat,
+ p_vat_code,
+ p_nd_amount,
+ p_nd_tva,
+ p_nd_tva_recup,
+ fid_client);
+ return;
+end;
+ $$
+ LANGUAGE plpgsql;
+insert into tmp_pcmn(pcm_val,pcm_lib,pcm_val_parent) values(8,'Comptes hors Compta',0);
+insert into tmp_pcmn(pcm_val,pcm_lib,pcm_val_parent) values(9,'Comptes hors Compta',0);
+
+COMMENT ON TABLE parameter IS 'parameter of the company';
+
+--
+-- Name: plan_analytique; Type: TABLE; Schema: public; Owner: phpcompta; Tablespace:
+--
+
+CREATE TABLE plan_analytique (
+ pa_id integer NOT NULL,
+ pa_name text DEFAULT 'Sans Nom'::text NOT NULL,
+ pa_description text
+);
+
+--
+-- Name: TABLE plan_analytique; Type: COMMENT; Schema: public; Owner: phpcompta
+--
+
+COMMENT ON TABLE plan_analytique IS 'Plan Analytique (max 5)';
+
+
+--
+-- Name: plan_analytique_pa_id_seq; Type: SEQUENCE; Schema: public; Owner: phpcompta
+--
+
+CREATE SEQUENCE plan_analytique_pa_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MAXVALUE
+ NO MINVALUE
+ CACHE 1;
+
+
+ALTER TABLE public.plan_analytique_pa_id_seq OWNER TO phpcompta;
+
+--
+-- Name: plan_analytique_pa_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: phpcompta
+--
+
+ALTER SEQUENCE plan_analytique_pa_id_seq OWNED BY plan_analytique.pa_id;
+
+
+--
+-- Name: pa_id; Type: DEFAULT; Schema: public; Owner: phpcompta
+--
+
+ALTER TABLE plan_analytique ALTER COLUMN pa_id SET DEFAULT nextval('plan_analytique_pa_id_seq'::regclass);
+
+
+--
+-- Name: plan_analytique_pa_name_key; Type: CONSTRAINT; Schema: public; Owner: phpcompta; Tablespace:
+--
+
+ALTER TABLE ONLY plan_analytique
+ ADD CONSTRAINT plan_analytique_pa_name_key UNIQUE (pa_name);
+
+
+--
+-- Name: plan_analytique_pkey; Type: CONSTRAINT; Schema: public; Owner: phpcompta; Tablespace:
+--
+
+ALTER TABLE ONLY plan_analytique
+ ADD CONSTRAINT plan_analytique_pkey PRIMARY KEY (pa_id);
+
+
+-- Ajout table operation_analytique
+
+-- Ajout table poste_analytique
+--
+-- Name: poste_analytique; Type: TABLE; Schema: public; Owner: phpcompta; Tablespace:
+--
+
+CREATE TABLE poste_analytique (
+ po_id integer NOT NULL,
+ po_name text NOT NULL,
+ pa_id integer NOT NULL,
+ po_amount numeric(20,4) DEFAULT 0.0 NOT NULL,
+ po_description text
+);
+
+
+ALTER TABLE public.poste_analytique OWNER TO phpcompta;
+
+--
+-- Name: TABLE poste_analytique; Type: COMMENT; Schema: public; Owner: phpcompta
+--
+
+COMMENT ON TABLE poste_analytique IS 'Poste Analytique';
+
+
+--
+-- Name: poste_analytique_po_id_seq; Type: SEQUENCE; Schema: public; Owner: phpcompta
+--
+
+CREATE SEQUENCE poste_analytique_po_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MAXVALUE
+ NO MINVALUE
+ CACHE 1;
+
+
+ALTER TABLE public.poste_analytique_po_id_seq OWNER TO phpcompta;
+
+--
+-- Name: poste_analytique_po_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: phpcompta
+--
+
+ALTER SEQUENCE poste_analytique_po_id_seq OWNED BY poste_analytique.po_id;
+
+
+--
+-- Name: po_id; Type: DEFAULT; Schema: public; Owner: phpcompta
+--
+
+ALTER TABLE poste_analytique ALTER COLUMN po_id SET DEFAULT nextval('poste_analytique_po_id_seq'::regclass);
+
+
+--
+-- Name: poste_analytique_pkey; Type: CONSTRAINT; Schema: public; Owner: phpcompta; Tablespace:
+--
+
+ALTER TABLE ONLY poste_analytique
+ ADD CONSTRAINT poste_analytique_pkey PRIMARY KEY (po_id);
+
+
+--
+-- Name: poste_analytique_pa_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: phpcompta
+--
+
+ALTER TABLE ONLY poste_analytique
+ ADD CONSTRAINT poste_analytique_pa_id_fkey FOREIGN KEY (pa_id) REFERENCES plan_analytique(pa_id) ON UPDATE CASCADE ON DELETE CASCADE;
+
+
+--
+-- Name: operation_analytique; Type: TABLE; Schema: public; Owner: phpcompta; Tablespace:
+--
+create sequence s_oa_group;
+
+CREATE TABLE operation_analytique (
+ oa_id integer NOT NULL,
+ po_id integer NOT NULL,
+ pa_id integer not null,
+ oa_amount numeric(20,4) NOT NULL,
+ oa_description text,
+ oa_debit boolean DEFAULT true NOT NULL,
+ j_id integer,
+ oa_group integer DEFAULT nextval('s_oa_group'::regclass) NOT NULL,
+ oa_date date NOT NULL
+);
+
+
+ALTER TABLE public.operation_analytique OWNER TO phpcompta;
+
+--
+-- Name: TABLE operation_analytique; Type: COMMENT; Schema: public; Owner: phpcompta
+--
+
+COMMENT ON TABLE operation_analytique IS 'History of the analytic account';
+
+
+--
+-- Name: historique_analytique_ha_id_seq; Type: SEQUENCE; Schema: public; Owner: phpcompta
+--
+
+CREATE SEQUENCE historique_analytique_ha_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MAXVALUE
+ NO MINVALUE
+ CACHE 1;
+
+
+ALTER TABLE public.historique_analytique_ha_id_seq OWNER TO phpcompta;
+
+--
+-- Name: historique_analytique_ha_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: phpcompta
+--
+
+ALTER SEQUENCE historique_analytique_ha_id_seq OWNED BY operation_analytique.oa_id;
+
+
+--
+-- Name: oa_id; Type: DEFAULT; Schema: public; Owner: phpcompta
+--
+
+ALTER TABLE operation_analytique ALTER COLUMN oa_id SET DEFAULT nextval('historique_analytique_ha_id_seq'::regclass);
+
+
+--
+-- Name: historique_analytique_pkey; Type: CONSTRAINT; Schema: public; Owner: phpcompta; Tablespace:
+--
+
+ALTER TABLE ONLY operation_analytique
+ ADD CONSTRAINT historique_analytique_pkey PRIMARY KEY (oa_id);
+
+
+--
+-- Name: operation_analytique_j_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: phpcompta
+--
+
+ALTER TABLE ONLY operation_analytique
+ ADD CONSTRAINT operation_analytique_j_id_fkey FOREIGN KEY (j_id) REFERENCES jrnx(j_id) ON UPDATE CASCADE ON DELETE CASCADE;
+
+
+--
+-- Name: operation_analytique_po_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: phpcompta
+--
+
+ALTER TABLE ONLY operation_analytique
+ ADD CONSTRAINT operation_analytique_po_id_fkey FOREIGN KEY (po_id) REFERENCES poste_analytique(po_id) ON UPDATE CASCADE ON DELETE CASCADE;
+
+INSERT INTO parameter VALUES ('MY_ANALYTIC', 'nu');
+
+alter table jrn add constraint ux_internal unique (jr_internal);
+
+/*alter table quant_sold add constraint fk_internal foreign key (qs_internal) references jrn (jr_internal) on delete cascade on update cascade;
+
+alter table quant_purchase add constraint fk_internal foreign key (qp_internal) references jrn (jr_internal) on delete cascade on update cascade;
+*/
+alter table user_sec_jrn add constraint uj_priv_id_fkey foreign key(uj_jrn_id) references jrn_def(jrn_def_id) on update cascade on delete cascade;
+alter table user_sec_jrn drop constraint "$1";
+alter table operation_analytique add oa_row int4;
+
+create or replace function upper_po_name() returns trigger as $$
+declare
+ name text;
+begin
+ name:=upper(NEW.po_name);
+ name:=trim(name);
+ name:=replace(name,' ','');
+ NEW.po_name:=name;
+
+return NEW;
+end;
+$$ LANGUAGE plpgsql;
+
+create or replace function upper_pa_name() returns trigger as $$
+declare
+ name text;
+begin
+ name:=upper(NEW.pa_name);
+ name:=trim(name);
+ name:=replace(name,' ','');
+ NEW.pa_name:=name;
+return NEW;
+end;
+$$ LANGUAGE plpgsql;
+
+
+CREATE TRIGGER t_upper_po_name BEFORE INSERT OR UPDATE ON poste_analytique
+ FOR EACH ROW EXECUTE PROCEDURE upper_po_name();
+
+CREATE TRIGGER t_upper_pa_name before INSERT OR UPDATE on plan_analytique
+ FOR EACH ROW EXECUTE PROCEDURE upper_pa_name();
+
+create unique index ux_po_name on poste_analytique (po_name);
+
+insert into parameter (pr_id,pr_value) select distinct 'MY_COUNTRY',pcm_country from tmp_pcmn limit 1;
+
+alter table tmp_pcmn drop pcm_country;
+
+
+CREATE TABLE bilan (
+ b_id integer NOT NULL,
+ b_name text NOT NULL,
+ b_file_template text NOT NULL,
+ b_file_form text,
+ b_type text NOT NULL
+);
+
+
+ALTER TABLE public.bilan OWNER TO phpcompta;
+
+--
+-- Name: TABLE bilan; Type: COMMENT; Schema: public; Owner: phpcompta
+--
+
+COMMENT ON TABLE bilan IS 'contains the template and the data for generating different documents ';
+
+
+--
+-- Name: COLUMN bilan.b_id; Type: COMMENT; Schema: public; Owner: phpcompta
+--
+
+COMMENT ON COLUMN bilan.b_id IS 'primary key';
+
+
+--
+-- Name: COLUMN bilan.b_name; Type: COMMENT; Schema: public; Owner: phpcompta
+--
+
+COMMENT ON COLUMN bilan.b_name IS 'Name of the document';
+
+
+--
+-- Name: COLUMN bilan.b_file_template; Type: COMMENT; Schema: public; Owner: phpcompta
+--
+
+COMMENT ON COLUMN bilan.b_file_template IS 'path of the template (document/...)';
+
+
+--
+-- Name: COLUMN bilan.b_file_form; Type: COMMENT; Schema: public; Owner: phpcompta
+--
+
+COMMENT ON COLUMN bilan.b_file_form IS 'path of the file with forms';
+
+
+--
+-- Name: COLUMN bilan.b_type; Type: COMMENT; Schema: public; Owner: phpcompta
+--
+
+COMMENT ON COLUMN bilan.b_type IS 'type = ODS, RTF...';
+
+
+--
+-- Name: bilan_b_id_seq; Type: SEQUENCE; Schema: public; Owner: phpcompta
+--
+
+CREATE SEQUENCE bilan_b_id_seq
+ INCREMENT BY 1
+ NO MAXVALUE
+ NO MINVALUE
+ CACHE 1;
+
+
+ALTER TABLE public.bilan_b_id_seq OWNER TO phpcompta;
+
+--
+-- Name: bilan_b_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: phpcompta
+--
+
+ALTER SEQUENCE bilan_b_id_seq OWNED BY bilan.b_id;
+
+
+--
+-- Name: bilan_b_id_seq; Type: SEQUENCE SET; Schema: public; Owner: phpcompta
+--
+
+SELECT pg_catalog.setval('bilan_b_id_seq', 4, true);
+
+
+--
+-- Name: b_id; Type: DEFAULT; Schema: public; Owner: phpcompta
+--
+
+ALTER TABLE bilan ALTER COLUMN b_id SET DEFAULT nextval('bilan_b_id_seq'::regclass);
+
+
+--
+-- Data for Name: bilan; Type: TABLE DATA; Schema: public; Owner: phpcompta
+--
+
+INSERT INTO bilan VALUES (1, 'Bilan Belge complet', 'document/fr_be/bnb.rtf', 'document/fr_be/bnb.form', 'RTF');
+
+
+--
+-- Name: bilan_b_name_key; Type: CONSTRAINT; Schema: public; Owner: phpcompta; Tablespace:
+--
+
+ALTER TABLE ONLY bilan
+ ADD CONSTRAINT bilan_b_name_key UNIQUE (b_name);
+
+
+--
+-- Name: bilan_pkey; Type: CONSTRAINT; Schema: public; Owner: phpcompta; Tablespace:
+--
+
+ALTER TABLE ONLY bilan
+ ADD CONSTRAINT bilan_pkey PRIMARY KEY (b_id);
+
+
+--
+-- PostgreSQL database dump complete
+--
+CREATE TABLE op_predef (
+ od_id integer NOT NULL,
+ jrn_def_id integer NOT NULL,
+ od_name text NOT NULL,
+ od_item integer NOT NULL,
+ od_jrn_type text NOT NULL
+);
+
+
+ALTER TABLE public.op_predef OWNER TO phpcompta;
+
+--
+-- Name: TABLE op_predef; Type: COMMENT; Schema: public; Owner: phpcompta
+--
+
+COMMENT ON TABLE op_predef IS 'predefined operation';
+
+
+--
+-- Name: COLUMN op_predef.jrn_def_id; Type: COMMENT; Schema: public; Owner: phpcompta
+--
+
+COMMENT ON COLUMN op_predef.jrn_def_id IS 'jrn_id';
+
+
+--
+-- Name: COLUMN op_predef.od_name; Type: COMMENT; Schema: public; Owner: phpcompta
+--
+
+COMMENT ON COLUMN op_predef.od_name IS 'name of the operation';
+
+
+--
+-- Name: op_def_op_seq; Type: SEQUENCE; Schema: public; Owner: phpcompta
+--
+
+CREATE SEQUENCE op_def_op_seq
+ INCREMENT BY 1
+ NO MAXVALUE
+ NO MINVALUE
+ CACHE 1;
+
+
+ALTER TABLE public.op_def_op_seq OWNER TO phpcompta;
+
+--
+-- Name: op_def_op_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: phpcompta
+--
+
+ALTER SEQUENCE op_def_op_seq OWNED BY op_predef.od_id;
+
+
+--
+-- Name: od_id; Type: DEFAULT; Schema: public; Owner: phpcompta
+--
+
+ALTER TABLE op_predef ALTER COLUMN od_id SET DEFAULT nextval('op_def_op_seq'::regclass);
+
+
+--
+-- Name: op_def_op_name_key; Type: CONSTRAINT; Schema: public; Owner: phpcompta; Tablespace:
+--
+
+ALTER TABLE ONLY op_predef
+ ADD CONSTRAINT op_def_op_name_key UNIQUE (od_name,jrn_def_id);
+
+
+--
+-- Name: op_def_pkey; Type: CONSTRAINT; Schema: public; Owner: phpcompta; Tablespace:
+--
+
+ALTER TABLE ONLY op_predef
+ ADD CONSTRAINT op_def_pkey PRIMARY KEY (od_id);
+
+
+--
+-- Name: jrn_def_id_fk; Type: FK CONSTRAINT; Schema: public; Owner: phpcompta
+--
+
+ALTER TABLE ONLY op_predef
+ ADD CONSTRAINT jrn_def_id_fk FOREIGN KEY (jrn_def_id) REFERENCES jrn_def(jrn_def_id) ON UPDATE CASCADE ON DELETE CASCADE;
+
+CREATE TABLE op_predef_detail (
+ opd_id integer NOT NULL,
+ od_id integer NOT NULL,
+ opd_poste text NOT NULL,
+ opd_amount numeric(20,4),
+ opd_tva_id integer,
+ opd_quantity numeric(20,4),
+ opd_debit boolean NOT NULL,
+ opd_tva_amount numeric(20,4),
+ opd_comment text
+);
+
+
+ALTER TABLE public.op_predef_detail OWNER TO phpcompta;
+
+--
+-- Name: TABLE op_predef_detail; Type: COMMENT; Schema: public; Owner: phpcompta
+--
+
+COMMENT ON TABLE op_predef_detail IS 'contains the detail of predefined operations';
+
+
+--
+-- Name: op_predef_detail_opd_id_seq; Type: SEQUENCE; Schema: public; Owner: phpcompta
+--
+
+CREATE SEQUENCE op_predef_detail_opd_id_seq
+ INCREMENT BY 1
+ NO MAXVALUE
+ NO MINVALUE
+ CACHE 1;
+
+
+ALTER TABLE public.op_predef_detail_opd_id_seq OWNER TO phpcompta;
+
+--
+-- Name: op_predef_detail_opd_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: phpcompta
+--
+
+ALTER SEQUENCE op_predef_detail_opd_id_seq OWNED BY op_predef_detail.opd_id;
+
+
+--
+-- Name: opd_id; Type: DEFAULT; Schema: public; Owner: phpcompta
+--
+
+ALTER TABLE op_predef_detail ALTER COLUMN opd_id SET DEFAULT nextval('op_predef_detail_opd_id_seq'::regclass);
+
+
+--
+-- Name: op_predef_detail_pkey; Type: CONSTRAINT; Schema: public; Owner: phpcompta; Tablespace:
+--
+
+ALTER TABLE ONLY op_predef_detail
+ ADD CONSTRAINT op_predef_detail_pkey PRIMARY KEY (opd_id);
+
+
+update version set val=32;
+
+commit;