altocompta/include/sql/patch/upgrade179.sql

76 lines
2.2 KiB
PL/PgSQL

begin;
CREATE OR REPLACE FUNCTION comptaproc.account_compute_alpha(p_class text, p_name text)
RETURNS account_type
AS $function$
declare
sResult account_type;
sAccount account_type;
sFormatedAccount account_type;
nCount int;
idx int :=0;
begin
sFormatedAccount := comptaproc.format_account(p_name);
sAccount := p_class||substring(sFormatedAccount for 5);
nCount := 0;
loop
select count(*) into nCount from tmp_pcmn where pcm_val = comptaproc.format_account(sAccount);
exit when nCount = 0;
idx := idx + 1;
sAccount := p_class || substring(sFormatedAccount for 5)||idx::text;
end loop;
sResult := comptaproc.format_account(sAccount);
return sResult;
end;
$function$
LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION comptaproc.account_compute(p_f_id integer)
RETURNS account_type
AS $function$
declare
class_base fiche_def.fd_class_base%type;
maxcode numeric;
sResult account_type;
bAlphanum bool;
sName text;
begin
select fd_class_base into class_base
from
fiche_def join fiche using (fd_id)
where
f_id=p_f_id;
bAlphanum := account_alphanum();
if bAlphanum = false then
select count (pcm_val) into maxcode from tmp_pcmn where pcm_val_parent = class_base;
if maxcode = 0 then
maxcode:=class_base::numeric;
else
select max (pcm_val) into maxcode from tmp_pcmn where pcm_val_parent = class_base;
maxcode:=maxcode::numeric;
end if;
if maxcode::text = class_base then
maxcode:=class_base::numeric*1000;
end if;
maxcode:=maxcode+1;
sResult:=maxcode::account_type;
else
-- if alphanum, use name
select ad_value into sName from fiche_detail where f_id=p_f_id and ad_id=1;
if sName is null then
raise exception 'Cannot compute an accounting without the name of the card for %',p_f_id;
end if;
sResult := account_compute_alpha(class_base,sName);
end if;
return sResult;
end;
$function$
LANGUAGE plpgsql ;
insert into version (val,v_description) values (180,'Shorten Aphanumeric account');
commit;