CREATE FUNCTION plpgsql_call_handler() RETURNS language_handler AS '$libdir/plpgsql', 'plpgsql_call_handler' LANGUAGE c; CREATE FUNCTION plpgsql_validator(oid) RETURNS void AS '$libdir/plpgsql', 'plpgsql_validator' LANGUAGE c; CREATE FUNCTION account_add(p_id poste_comptable, p_name character varying) RETURNS void AS $$ declare nParent tmp_pcmn.pcm_val_parent%type; nCount integer; begin select count(*) into nCount from tmp_pcmn where pcm_val=p_id; if nCount = 0 then nParent=account_parent(p_id); insert into tmp_pcmn (pcm_val,pcm_lib,pcm_val_parent) values (p_id, p_name,nParent); end if; return; end ; $$ LANGUAGE plpgsql; CREATE FUNCTION account_auto(p_fd_id integer) RETURNS boolean AS $$ declare l_auto bool; begin select fd_create_account into l_auto from fiche_def where fd_id=p_fd_id; if l_auto is null then l_auto:=false; end if; return l_auto; end; $$ LANGUAGE plpgsql; CREATE FUNCTION account_compute(p_f_id integer) RETURNS poste_comptable AS $$ declare class_base poste_comptable; maxcode int8; begin select fd_class_base into class_base from fiche_def join fiche using (fd_id) where f_id=p_f_id; raise notice 'class base %',class_base; select max(pcm_val) into maxcode from tmp_pcmn where pcm_val = class_base; if maxcode = class_base then maxcode=class_base*1000+1; end if; raise notice 'Max code %',maxcode; return maxcode+1; end; $$ LANGUAGE plpgsql; CREATE FUNCTION account_insert(p_f_id integer, p_account poste_comptable) RETURNS integer AS $$ declare nParent tmp_pcmn.pcm_val_parent%type; sName varchar; nNew tmp_pcmn.pcm_val%type; bAuto bool; nFd_id integer; nCount integer; begin if length(trim(p_account)) != 0 then select * 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); attribut_insert(p_f_id,5,to_char(nNew,'999999999999')); end if; else select fd_id into nFd_id from fiche where f_id=p_f_id; bAuto:= account_auto(nFd_id); if bAuto = true then nNew:=account_compute(p_f_id); raise debug 'nNew %', nNew; 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(nNew); perform account_add (nNew,sName); perform attribut_insert(p_f_id,5,to_char(nNew,'999999999999')); else perform attribut_insert(p_f_id,5,null); end if; end if; return 0; end; $$ LANGUAGE plpgsql; CREATE FUNCTION account_parent(p_account poste_comptable) RETURNS poste_comptable AS $$ declare nParent tmp_pcmn.pcm_val_parent%type; sParent varchar; nCount integer; begin sParent:=to_char(p_account,'9999999999999999'); sParent:=trim(sParent); nParent:=0; while nParent = 0 loop select count(*) into nCount from tmp_pcmn where pcm_val = to_number(sParent,'9999999999999999'); if nCount != 0 then nParent:=to_number(sParent,'9999999999999999'); end if; sParent:= substr(sParent,1,length(sParent)-1); if length(sParent) <= 0 then raise exception 'Impossible de trouver le compte parent pour %',p_account; end if; end loop; return nParent; end; $$ LANGUAGE plpgsql; CREATE 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:=fiche_account_parent(p_f_id); 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 FUNCTION attribut_insert(p_f_id integer, p_ad_id integer, p_value character varying) RETURNS void AS $$ declare n_jft_id integer; begin select nextval('s_jnt_fic_att_value') into n_jft_id; insert into jnt_fic_att_value (jft_id,f_id,ad_id) values (n_jft_id,p_f_id,p_ad_id); insert into attr_value (jft_id,av_text) values (n_jft_id,p_value); return; end; $$ LANGUAGE plpgsql; CREATE FUNCTION card_class_base(p_f_id integer) RETURNS poste_comptable AS $$ declare n_poste fiche_def.fd_class_base%type; begin select fd_class_base into n_poste from fiche_def join fiche using (fd_id) where f_id=p_f_id; if not FOUND then raise exception 'Invalid fiche card_class_base(%)',p_f_id; end if; return; end; $$ LANGUAGE plpgsql; CREATE FUNCTION check_balance(p_grpt integer) RETURNS numeric AS $$ declare amount_jrnx_debit numeric; amount_jrnx_credit numeric; amount_jrn numeric; begin select sum (j_montant) into amount_jrnx_credit from jrnx where j_grpt=p_grpt and j_debit=false; select sum (j_montant) into amount_jrnx_debit from jrnx where j_grpt=p_grpt and j_debit=true; select jr_montant into amount_jrn from jrn where jr_grpt_id=p_grpt; if ( amount_jrnx_debit != amount_jrnx_credit ) then return abs(amount_jrnx_debit-amount_jrnx_credit); end if; if ( amount_jrn != amount_jrnx_credit) then return -1*abs(amount_jrn - amount_jrnx_credit); end if; return 0; end; $$ LANGUAGE plpgsql; CREATE FUNCTION fiche_account_parent(p_f_id integer) RETURNS poste_comptable AS $$ declare ret poste_comptable; begin select fd_class_base into ret from fiche_def join fiche using (fd_id) where f_id=p_f_id; if not FOUND then raise exception '% N''existe pas',p_f_id; end if; return ret; end; $$ LANGUAGE plpgsql; CREATE FUNCTION insert_jrnx(p_date character varying, p_montant numeric, p_poste integer, p_grpt integer, p_jrn_def integer, p_debit boolean, p_tech_user text, p_tech_per integer, p_qcode text) RETURNS void AS $$ declare sCode varchar; nCount_qcode integer; begin sCode=trim(p_qcode); if length(sCode) = 0 or p_qcode is null then select count(*) into nCount_qcode from vw_poste_qcode where j_poste=p_poste; if nCount_qcode = 1 then select j_qcode into sCode from vw_poste_qcode where j_poste=p_poste; else sCode=NULL; end if; end if; if p_montant = 0.0 then return; end if; insert into jrnx ( j_date, j_montant, j_poste, j_grpt, j_jrn_def, j_debit, j_tech_user, j_tech_per, j_qcode ) values ( to_date(p_date,'DD.MM.YYYY'), p_montant, p_poste, p_grpt, p_jrn_def, p_debit, p_tech_user, p_tech_per, sCode ); return; end; $$ LANGUAGE plpgsql; CREATE FUNCTION insert_quant_sold(p_internal text, p_fiche character varying, p_quant integer, 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=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=p_fiche; insert into quant_sold (qs_internal,qs_fiche,qs_quantite,qs_price,qs_vat,qs_vat_code,qs_client) values (p_internal,fid_good,p_quant,p_price,p_vat,p_vat_code,fid_client); return; end; $$ LANGUAGE plpgsql; CREATE FUNCTION insert_quick_code(nf_id integer, tav_text text) RETURNS integer AS $$ declare ns integer; nExist integer; tText text; begin tText := upper(trim(tav_text)); tText := replace(tText,' ',''); loop select nextval('s_jnt_fic_att_value') into ns; if length (tText) = 0 or tText is null then tText := 'FID'||ns; end if; select count(*) into nExist from jnt_fic_att_value join attr_value using (jft_id) where ad_id=23 and av_text=upper(tText); if nExist = 0 then exit; end if; tText:='FID'||ns; end loop; insert into jnt_fic_att_value values (ns,nf_id,23); insert into attr_value values (ns,upper(tText)); return ns; end; $$ LANGUAGE plpgsql; CREATE FUNCTION proc_check_balance() RETURNS "trigger" AS $$ declare diff numeric; tt integer; begin if TG_OP = 'INSERT' then tt=NEW.jr_grpt_id; diff:=check_balance(tt); if diff != 0 then raise exception 'balance error %',diff ; end if; return NEW; end if; end; $$ LANGUAGE plpgsql; CREATE FUNCTION t_document_type_insert() RETURNS "trigger" AS $$ BEGIN execute 'create sequence seq_doc_type_'||NEW.dt_id; raise notice 'Creating sequence seq_doc_type_%',NEW.dt_id; RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE FUNCTION t_jrn_def_sequence() RETURNS "trigger" AS $$ BEGIN execute 'create sequence s_jrn_'||NEW.jrn_def_id; raise notice 'Creating sequence s_jrn_%',NEW.jrn_def_id; RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE FUNCTION trim_cvs_quote() RETURNS "trigger" AS $$ declare modified import_tmp%ROWTYPE; begin modified.code=new.code; modified.montant=new.montant; modified.date_exec=new.date_exec; modified.date_valeur=new.date_valeur; modified.devise=replace(new.devise,'"',''); modified.poste_comptable=replace(new.poste_comptable,'"',''); modified.compte_ordre=replace(NEW.COMPTE_ORDRE,'"',''); modified.detail=replace(NEW.DETAIL,'"',''); modified.num_compte=replace(NEW.NUM_COMPTE,'"',''); modified.bq_account=NEW.bq_account; modified.jrn=NEW.jrn; modified.ok=new.ok; return modified; end; $$ LANGUAGE plpgsql; CREATE FUNCTION trim_space_format_csv_banque() RETURNS "trigger" AS $$ declare modified format_csv_banque%ROWTYPE; begin modified.name=trim(NEW.NAME); modified.include_file=trim(new.include_file); if ( length(modified.name) = 0 ) then modified.name=null; end if; if ( length(modified.include_file) = 0 ) then modified.include_file=null; end if; return modified; end; $$ LANGUAGE plpgsql; CREATE FUNCTION tva_delete(integer) RETURNS void AS $_$ declare p_tva_id alias for $1; nCount integer; begin nCount=0; select count(*) into nCount from quant_sold where qs_vat_code=p_tva_id; if nCount = 0 then delete from tva_rate where tva_id=p_tva_id; end if; return; end; $_$ LANGUAGE plpgsql; CREATE FUNCTION tva_insert(integer, text, numeric, text, text) RETURNS integer AS $_$ declare p_tva_id alias for $1; p_tva_label alias for $2; p_tva_rate alias for $3; p_tva_comment alias for $4; p_tva_poste alias for $5; debit text; credit text; nCount integer; begin if length(trim(p_tva_label)) = 0 then return 3; end if; select count(*) into nCount from tva_rate where tva_id=p_tva_id; if nCount != 0 then return 5; end if; if length(trim(p_tva_poste)) != 0 then if position (',' in p_tva_poste) = 0 then return 4; end if; debit = split_part(p_tva_poste,',',1); credit = split_part(p_tva_poste,',',2); select count(*) into nCount from tmp_pcmn where pcm_val=debit; if nCount = 0 then return 4; end if; select count(*) into nCount from tmp_pcmn where pcm_val=credit; if nCount = 0 then return 4; end if; end if; insert into tva_rate(tva_id,tva_label,tva_rate,tva_comment,tva_poste) values (p_tva_id,p_tva_label,p_tva_rate,p_tva_comment,p_tva_poste); return 0; end; $_$ LANGUAGE plpgsql; CREATE FUNCTION tva_modify(integer, text, numeric, text, text) RETURNS integer AS $_$declare p_tva_id alias for $1; p_tva_label alias for $2; p_tva_rate alias for $3; p_tva_comment alias for $4; p_tva_poste alias for $5; debit text; credit text; nCount integer; begin if length(trim(p_tva_label)) = 0 then return 3; end if; if length(trim(p_tva_poste)) != 0 then if position (',' in p_tva_poste) = 0 then return 4; end if; debit = split_part(p_tva_poste,',',1); credit = split_part(p_tva_poste,',',2); select count(*) into nCount from tmp_pcmn where pcm_val=debit; if nCount = 0 then return 4; end if; select count(*) into nCount from tmp_pcmn where pcm_val=credit; if nCount = 0 then return 4; end if; end if; update tva_rate set tva_label=p_tva_label,tva_rate=p_tva_rate,tva_comment=p_tva_comment,tva_poste=p_tva_poste where tva_id=p_tva_id; return 0; end; $_$ LANGUAGE plpgsql; CREATE FUNCTION update_quick_code(njft_id integer, tav_text text) RETURNS integer AS $$ declare ns integer; nExist integer; tText text; old_qcode varchar; begin select av_text into old_qcode from attr_value where jft_id=njft_id; if tav_text = upper( trim(old_qcode)) then return 0; end if; tText := trim(upper(tav_text)); tText := replace(tText,' ',''); if length ( tText) = 0 or tText is null then return 0; end if; ns := njft_id; loop select count(*) into nExist from jnt_fic_att_value join attr_value using (jft_id) where ad_id=23 and av_text=upper(tText); if nExist = 0 then exit; end if; if tText = 'FID'||ns then select nextval('s_jnt_fic_att_value') into ns; end if; tText :='FID'||ns; end loop; update attr_value set av_text = tText where jft_id=njft_id; update jrnx set j_qcode=tText where j_qcode = old_qcode; return ns; end; $$ LANGUAGE plpgsql;