From 092e22f0e6fa9ad58afc59c2799a9ebd8da0a400 Mon Sep 17 00:00:00 2001 From: Dany De Bontridder Date: Sat, 22 Oct 2011 20:17:50 +0000 Subject: [PATCH] #120 : Support for alphanumeric account --- html/parametre.php | 9 +++ include/class_acc_account_ledger.php | 82 +++++++++++------------- include/class_fiche.php | 41 ++++++------ include/class_own.php | 9 +-- include/impress_poste.inc.php | 13 ++-- sql/account-update.sql | 55 ++++++++++++++++ sql/account_alphanum.sql | 21 +++++++ sql/account_compute.sql | 48 ++++++++++++++ sql/account_insert.sql | 94 ++++++++++++++++++++++++++++ sql/format_account.sql | 32 ++++++++++ sql/tmp_pcmn_alphanum_ins_upd.sql | 16 +++++ sql/trigger.tmp_pcmn.sql | 9 +++ sql/upgrade.sql | 14 +++++ 13 files changed, 365 insertions(+), 78 deletions(-) create mode 100644 sql/account-update.sql create mode 100644 sql/account_alphanum.sql create mode 100644 sql/account_compute.sql create mode 100644 sql/account_insert.sql create mode 100644 sql/format_account.sql create mode 100644 sql/tmp_pcmn_alphanum_ins_upd.sql create mode 100644 sql/trigger.tmp_pcmn.sql diff --git a/html/parametre.php b/html/parametre.php index 0503d6f2b..d15c57a39 100644 --- a/html/parametre.php +++ b/html/parametre.php @@ -258,6 +258,7 @@ if ( $p_action=='company') if ( $User->check_action(PARSTR)!=0) $m->MY_STRICT=$p_strict; if ( $User->check_action(PARTVA)!=0)$m->MY_TVA_USE=$p_tva_use; $m->MY_PJ_SUGGEST=$p_pj; + $m->MY_ALPHANUM=$p_alphanum; $m->Update(); } @@ -272,6 +273,8 @@ if ( $p_action=='company') array('value'=>'N','label'=>_('Non')), array('value'=>'Y','label'=>_('Oui')) ); + $alpha_num_array[0]=array('value'=>'N','label'=>_('Non')); + $alpha_num_array[1]=array('value'=>'Y','label'=>_('Oui')); $compta=new ISelect(); $compta->table=1; @@ -297,6 +300,11 @@ if ( $p_action=='company') $check_periode->table=1; $check_periode->selected=$my->MY_CHECK_PERIODE; + $alpha_num=new ISelect(); + $alpha_num->table=1; + $alpha_num->value=$alpha_num_array; + $alpha_num->selected=$my->MY_ALPHANUM; + // other parameters $all=new IText(); $all->table=1; @@ -329,6 +337,7 @@ if ( $p_action=='company') echo "".td(_("Suggérer le numéro de pièce justificative"),'style="text-align:right"').$pj_suggest->input("p_pj",$strict_array).""; echo "".td(_("Suggérer la date"),'style="text-align:right"').$date_suggest->input("p_date_suggest",$strict_array).""; echo ''.td(_('Afficher la période comptable pour éviter les erreurs de date'),'style="text-align:right"').$check_periode->input('p_check_periode',$strict_array).''; + echo ''.td(_('Utilisez des postes comptables alphanumérique'),'style="text-align:right"').$alpha_num->input('p_alphanum').''; echo ""; echo HtmlInput::submit("record_company",_("Sauve")); echo ""; diff --git a/include/class_acc_account_ledger.php b/include/class_acc_account_ledger.php index 744e07fc5..3db9adbfb 100644 --- a/include/class_acc_account_ledger.php +++ b/include/class_acc_account_ledger.php @@ -129,36 +129,36 @@ class Acc_Account_Ledger $filter=str_replace('jrn_def_id','jr_def_id',$filter_sql); $bal_sql="select sum(amount_deb) as s_deb,sum(amount_cred) as s_cred, j_poste from (select case when j_debit='t' then j_montant else 0 end as amount_deb, case when j_debit='f' then j_montant else 0 end as amount_cred, - j_poste + j_poste from jrnx join jrn on (j_grpt = jr_grpt_id) - where + where j_poste=$1 and $filter and - ( to_date($2,'DD.MM.YYYY') <= j_date and + ( to_date($2,'DD.MM.YYYY') <= j_date and to_date($3,'DD.MM.YYYY') >= j_date )) as signed_amount group by j_poste "; $r=$this->db->get_array($bal_sql,array($this->id,$p_from,$p_to)); if ( $this->db->count() == 0 ) return array(); - if ($r[0]['s_deb']==$r[0]['s_cred']) return array(); + if ($r[0]['s_deb']==$r[0]['s_cred']) return array(); } - $Res=$this->db->exec_sql("select jr_id,to_char(j_date,'DD.MM.YYYY') as j_date_fmt,j_date,". - "case when j_debit='t' then j_montant else 0 end as deb_montant,". - "case when j_debit='f' then j_montant else 0 end as cred_montant,". - " jr_comment as description,jrn_def_name as jrn_name,". - "j_debit, jr_internal,jr_pj_number, - coalesce(comptaproc.get_letter_jnt(j_id),-1) as letter ". - ",pcm_lib ". - ",jr_tech_per,p_exercice ". - " from jrnx left join jrn_def on (jrn_def_id=j_jrn_def )". - " left join jrn on (jr_grpt_id=j_grpt)". - " left join tmp_pcmn on (j_poste=pcm_val)". - " left join parm_periode on (p_id=jr_tech_per) ". - " where j_poste=$1 and ". - " ( to_date($2,'DD.MM.YYYY') <= j_date and ". - " to_date($3,'DD.MM.YYYY') >= j_date )". - " and $filter_sql $sql_let ". - " order by j_date,substring(jr_pj_number,'\\\\d+$') asc",array($this->id,$p_from,$p_to)); + $Res=$this->db->exec_sql("select jr_id,to_char(j_date,'DDMMYYYY') as j_date_fmt,j_date, + case when j_debit='t' then j_montant else 0 end as deb_montant, + case when j_debit='f' then j_montant else 0 end as cred_montant, + jr_comment as description,jrn_def_name as jrn_name, + j_debit, jr_internal,jr_pj_number, + coalesce(get_letter_jnt(j_id),-1) as letter + ,pcm_lib + ,jr_tech_per,p_exercice + from jrnx left join jrn_def on (jrn_def_id=j_jrn_def ) + left join jrn on (jr_grpt_id=j_grpt) + left join tmp_pcmn on (j_poste=pcm_val) + left join parm_periode on (p_id=jr_tech_per) + where j_poste=$1 and + ( to_date($2,'DD.MM.YYYY') <= j_date and + to_date($3,'DD.MM.YYYY') >= j_date ) + and $filter_sql $sql_let + order by j_date,substring(jr_pj_number,'\\\\d+$') asc",array($this->id,$p_from,$p_to)); return $this->get_row_sql($Res); } @@ -240,7 +240,7 @@ class Acc_Account_Ledger if ($Max==0) return 0; $r=Database::fetch_array($Res,0); - return abs($r['sum_deb']-$r['sum_cred']); + return abs(bcsub($r['sum_deb'],$r['sum_cred'])); } /*! * \brief give the balance of an account @@ -311,7 +311,7 @@ class Acc_Account_Ledger } /*! * \brief HtmlTable, display a HTML of a poste for the asked period - * \param $p_array array for filter + * \param $p_array array for filter * \param $let lettering of operation 0 * \return -1 if nothing is found otherwise 0 */ @@ -381,7 +381,7 @@ class Acc_Account_Ledger $progress=bcadd($progress,$tmp_diff); $sum_cred=bcadd($sum_cred,$op['cred_montant']); $sum_deb=bcadd($sum_deb,$op['deb_montant']); - + echo "". "".format_date($op['j_date'])."". td(h($op['jr_pj_number'])). @@ -390,7 +390,7 @@ class Acc_Account_Ledger "".nbm($op['deb_montant'])."". "".nbm($op['cred_montant'])."". td(nbm(abs($progress)),'style="text-align:right"'). - + td($let,' style="color:red;text-align:right"'). ""; $old_exercice=$op['p_exercice']; @@ -439,9 +439,9 @@ class Acc_Account_Ledger default: throw new Exception(" Fonction HtmlTableHeader argument actiontarget invalid"); exit; - } + } $hid=new IHidden(); - + echo ""; echo ''; $str_ople=(isset($_REQUEST['ople']))?HtmlInput::hidden('ople',$_REQUEST['ople']):''; @@ -464,18 +464,12 @@ class Acc_Account_Ledger $hid->input("to_periode",$_REQUEST['to_periode']) ; + echo HtmlInput::request_to_hidden(array('from_poste','to_poste', + 'poste_id')); + if ( isset($_REQUEST['letter'] )) echo HtmlInput::hidden('letter','2'); if ( isset($_REQUEST['solded'] )) echo HtmlInput::hidden('solded','1'); - if (isset($_REQUEST['from_poste'])) - echo HtmlInput::hidden('from_poste',$_REQUEST['from_poste']); - - if (isset($_REQUEST['to_poste'])) - echo HtmlInput::hidden('to_poste',$_REQUEST['to_poste']); - - if (isset($_REQUEST['poste_id'])) - echo HtmlInput::hidden("poste_id",$_REQUEST['poste_id']); - if (isset($_REQUEST['poste_fille'])) echo $hid->input('poste_fille','on'); if (isset($_REQUEST['oper_detail'])) @@ -492,14 +486,8 @@ class Acc_Account_Ledger $hid->input("from_periode",$_REQUEST['from_periode']). $hid->input("to_periode",$_REQUEST['to_periode']); - if (isset($_REQUEST['from_poste'])) - echo HtmlInput::hidden('from_poste',$_REQUEST['from_poste']); - - if (isset($_REQUEST['to_poste'])) - echo HtmlInput::hidden('to_poste',$_REQUEST['to_poste']); - - if (isset($_REQUEST['poste_id'])) - echo HtmlInput::hidden("poste_id",$_REQUEST['poste_id']); + echo HtmlInput::request_to_hidden(array('from_poste','to_poste', + 'poste_id')); if ( isset($_REQUEST['letter'] )) echo HtmlInput::hidden('letter','2'); if ( isset($_REQUEST['solded'] )) echo HtmlInput::hidden('solded','1'); @@ -513,7 +501,7 @@ class Acc_Account_Ledger echo ""; echo ''; echo "
"; - + } /*! @@ -523,7 +511,9 @@ class Acc_Account_Ledger */ function belong_ledger($p_jrn) { - $filter=$this->db->get_value("select jrn_def_class_cred from jrn_def where jrn_def_id=$p_jrn"); + $filter=$this->db->get_value("select jrn_def_class_cred from jrn_def where jrn_def_id=$1", + array($p_jrn)); + if ( trim ($filter) == '') return 0; diff --git a/include/class_fiche.php b/include/class_fiche.php index a484e29f1..4a112add3 100644 --- a/include/class_fiche.php +++ b/include/class_fiche.php @@ -71,7 +71,7 @@ class Fiche */ function get_bk_account() { - + $user=new User($this->cn); $sql_ledger=$user->get_ledger_sql('FIN',3); $avail=$this->cn->get_array("select jrn_def_id,jrn_def_bank from jrn_def where jrn_def_type='FIN' and $sql_ledger @@ -105,7 +105,7 @@ class Fiche if ( $p_qcode == null ) $p_qcode=$this->quick_code; $p_qcode=trim($p_qcode); - $sql="select f_id from fiche_detail + $sql="select f_id from fiche_detail where ad_id=23 and ad_value=upper($1)"; $this->id=$this->cn->get_value($sql,array($p_qcode)); if ( $this->cn->count()==0) @@ -149,8 +149,8 @@ class Fiche return; } $sql="select * - from - fiche + from + fiche natural join fiche_detail join jnt_fic_attr on (jnt_fic_attr.fd_id=fiche.fd_id and fiche_detail.ad_id=jnt_fic_attr.ad_id) join attr_def on (attr_def.ad_id=fiche_detail.ad_id) where f_id=".$this->id. @@ -214,7 +214,7 @@ class Fiche */ function seek($p_attribut,$p_value) { - $sql="select jft_id,f_id,fd_id,ad_id,ad_value from fiche join fiche_detail using (f_id) + $sql="select jft_id,f_id,fd_id,ad_id,ad_value from fiche join fiche_detail using (f_id) where ad_id=$1 and upper(ad_value)=upper($2)"; $res=$this->cn->get_array($sql,array($p_attribut,$p_value)); return $res; @@ -662,7 +662,7 @@ class Fiche $msg=$w->search(); $msg.=$label->input(); break; - + default: var_dump($r); throw new Exception("Type invalide"); @@ -732,7 +732,7 @@ class Fiche list ($id) = sscanf ($name,"av_text%d"); if ( $id == null ) continue; - + // Special traitement // quickcode if ( $id == ATTR_DEF_QUICKCODE) @@ -833,7 +833,7 @@ class Fiche foreach ($p_array as $name=>$value ) { if ( preg_match('/^av_text[0-9]+$/',$name) == 0) continue; - + list ($id) = sscanf ($name,"av_text%d"); if ( $id == null ) continue; @@ -905,8 +905,13 @@ class Fiche if ( $id == ATTR_DEF_ACCOUNT ) { $v=FormatString($value); - if ( isNumber($v) == 1 || strpos($v,',') != 0 ) + if ( trim($v) != '' ) { + if ( strpos($v,',') != 0) + { + $v=$this->cn->get_value('select format_account($1)', + array($v)); + } $sql=sprintf("select account_update(%d,'%s')", $this->id,$v); try @@ -928,14 +933,6 @@ class Fiche try { $Ret=$this->cn->exec_sql($sql); - /* update also the jrnx */ - - /* The jrnx CANNOT BE UPDATED - $sql='update jrnx set j_poste=$1 where j_qcode in (select quick_code from vw_fiche_attr where f_id=$2)'; - $this->cn->exec_sql( - $sql, - array($v,$this->id)); - */ } catch (Exception $e) { @@ -1248,7 +1245,7 @@ class Fiche * \brief HtmlTable, display a HTML of a card for the asked period * \param $p_array default = null keys = from_periode, to_periode *\param $op_let 0 all operation, 1 only lettered one, 2 only unlettered one - *\return -1 if nothing is found otherwise 0 + *\return -1 if nothing is found otherwise 0 *\see get_row_date */ function HtmlTable($p_array=null,$op_let=0,$from_div=1) @@ -1461,7 +1458,7 @@ class Fiche ( select j_poste, case when j_debit='t' then j_montant else 0 end as deb, case when j_debit='f' then j_montant else 0 end as cred - from jrnx + from jrnx join jrn on (jr_grpt_id=j_grpt) where j_qcode = ('$qcode'::text) @@ -1476,7 +1473,7 @@ class Fiche return array('debit'=>$r['sum_deb'], 'credit'=>$r['sum_cred'], 'solde'=>abs($r['sum_deb']-$r['sum_cred'])); - + } /*!\brief check if an attribute is empty *\param $p_attr the id of the attribut to check (ad_id) @@ -1589,7 +1586,7 @@ class Fiche $r.=' '.(($amount['debit']==0)?0:nbm($amount['debit'])).'€'; $r.=' '.(($amount['credit']==0)?0:nbm($amount['credit'])).'€'; $r.=' '.nbm($amount['solde'])."€"; - + $r.=""; @@ -1747,7 +1744,7 @@ class Fiche { // Remove from attr_value $Res=$this->cn->exec_sql("delete from fiche_detail - where + where f_id=".$this->id); // Remove from fiche diff --git a/include/class_own.php b/include/class_own.php index 641be483f..a54efdd7e 100644 --- a/include/class_own.php +++ b/include/class_own.php @@ -54,10 +54,10 @@ class Own /*! ************************************************** * \brief save the parameter into the database by inserting or updating - * - * + * + * * \param $p_attr give the attribut name - * + * */ function save($p_attr) { @@ -82,7 +82,7 @@ class Own /*! ************************************************** * \brief save data - * + * * */ function update() @@ -103,6 +103,7 @@ class Own $this->save('MY_PJ_SUGGEST'); $this->save('MY_CHECK_PERIODE'); $this->save('MY_DATE_SUGGEST'); + $this->save('MY_ALPHANUM'); } diff --git a/include/impress_poste.inc.php b/include/impress_poste.inc.php index e8fcb73ef..f4a20c7b9 100644 --- a/include/impress_poste.inc.php +++ b/include/impress_poste.inc.php @@ -28,7 +28,7 @@ require_once('class_acc_operation.php'); * file included from user_impress * * some variable are already defined $cn, $User ... - * + * */ //----------------------------------------------------- // Show the jrn and date @@ -138,18 +138,19 @@ if ( isset( $_REQUEST['bt_html'] ) ) require_once("class_acc_account_ledger.php"); $go=0; // we ask a poste_id - if ( isset($_GET['poste_id']) && strlen(trim($_GET['poste_id'])) != 0 && isNumber($_GET['poste_id']) ) + if ( isset($_GET['poste_id']) && strlen(trim($_GET['poste_id'])) != 0 ) { + $poste=$cn->get_value('select format_account($1)',array($_GET['poste_id'])); + if ( isset ($_GET['poste_fille']) ) { - $parent=$_GET['poste_id']; - $a_poste=$cn->get_array("select pcm_val from tmp_pcmn where pcm_val::text like '$parent%' order by pcm_val::text"); + $a_poste=$cn->get_array("select pcm_val from tmp_pcmn where pcm_val::text like $1||'%' order by pcm_val::text",array($poste)); $go=3; } // Check if the post is numeric and exists - elseif ( $cn->count_sql('select * from tmp_pcmn where pcm_val=$1',array($_GET['poste_id'])) != 0 ) + elseif ( $cn->count_sql('select * from tmp_pcmn where pcm_val=$1',array($poste)) != 0 ) { - $Poste=new Acc_Account_Ledger($cn,$_GET['poste_id']); + $Poste=new Acc_Account_Ledger($cn,$poste); $go=1; } } diff --git a/sql/account-update.sql b/sql/account-update.sql new file mode 100644 index 000000000..98d9374b5 --- /dev/null +++ b/sql/account-update.sql @@ -0,0 +1,55 @@ +-- Function: comptaproc.account_update(integer, account_type) + +-- DROP FUNCTION comptaproc.account_update(integer, account_type); + +CREATE OR REPLACE FUNCTION comptaproc.account_update(p_f_id integer, p_account account_type) + RETURNS integer AS +$BODY$ +declare + nMax fiche.f_id%type; + nCount integer; + nParent tmp_pcmn.pcm_val_parent%type; + sName varchar; + first text; + second text; +begin + + if length(trim(p_account)) != 0 then + -- 2 accounts in card separated by comma + if position (',' in p_account) = 0 then + select count(*) into nCount from tmp_pcmn where pcm_val=p_account; + if nCount = 0 then + select ad_value into sName from + fiche_detail + 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; + else + raise info 'presence of a comma'; + -- there is 2 accounts separated by a comma + first := split_part(p_account,',',1); + second := split_part(p_account,',',2); + -- check there is no other coma + raise info 'first value % second value %', first, second; + + if position (',' in first) != 0 or position (',' in second) != 0 then + raise exception 'Too many comas, invalid account'; + end if; + -- check that both account are in PCMN + + end if; + else + -- account is null + update fiche_detail set ad_value=null where f_id=p_f_id and ad_id=5 ; + end if; + + update fiche_detail set ad_value=p_account where f_id=p_f_id and ad_id=5 ; + +return 0; +end; +$BODY$ + LANGUAGE plpgsql VOLATILE + COST 100; +ALTER FUNCTION comptaproc.account_update(integer, account_type) OWNER TO dany; diff --git a/sql/account_alphanum.sql b/sql/account_alphanum.sql new file mode 100644 index 000000000..d87f0d17f --- /dev/null +++ b/sql/account_alphanum.sql @@ -0,0 +1,21 @@ +-- Function: comptaproc.account_auto(integer) + +-- DROP FUNCTION comptaproc.account_auto(integer); + +CREATE OR REPLACE FUNCTION comptaproc.account_alphanum() + RETURNS boolean AS +$BODY$ +declare + l_auto bool; +begin + l_auto := true; + select pr_value into l_auto from parameter where pr_id='MY_ALPHANUM'; + if l_auto = 'N' or l_auto is null then + l_auto:=false; + end if; + return l_auto; +end; +$BODY$ + LANGUAGE plpgsql VOLATILE + COST 100; +ALTER FUNCTION comptaproc.account_auto(integer) OWNER TO dany; diff --git a/sql/account_compute.sql b/sql/account_compute.sql new file mode 100644 index 000000000..cb193b529 --- /dev/null +++ b/sql/account_compute.sql @@ -0,0 +1,48 @@ +-- Function: comptaproc.account_compute(integer) + +-- DROP FUNCTION comptaproc.account_compute(integer); + +CREATE OR REPLACE FUNCTION comptaproc.account_compute(p_f_id integer) + RETURNS account_type AS +$BODY$ +declare + class_base fiche_def.fd_class_base%type; + maxcode numeric; + sResult account_type; + bAlphanum bool; +begin + select fd_class_base into class_base + from + fiche_def join fiche using (fd_id) + where + f_id=p_f_id; + raise notice 'account_compute class base %',class_base; + 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; + raise notice 'account_compute Max code %',maxcode; + 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 := class_base||sName; + end if; + return sResult; +end; +$BODY$ + LANGUAGE plpgsql VOLATILE + COST 100; +ALTER FUNCTION comptaproc.account_compute(integer) OWNER TO dany; diff --git a/sql/account_insert.sql b/sql/account_insert.sql new file mode 100644 index 000000000..641bc6f6f --- /dev/null +++ b/sql/account_insert.sql @@ -0,0 +1,94 @@ +-- Function: comptaproc.account_insert(integer, text) + +-- DROP FUNCTION comptaproc.account_insert(integer, text); + +CREATE OR REPLACE FUNCTION comptaproc.account_insert(p_f_id integer, p_account text) + RETURNS integer AS +$BODY$ +declare + nParent tmp_pcmn.pcm_val_parent%type; + sName varchar; + nNew tmp_pcmn.pcm_val%type; + bAuto bool; + nFd_id integer; + sClass_Base fiche_def.fd_class_base%TYPE; + nCount integer; + first text; + second text; +begin + + if p_account is not null and length(trim(p_account)) != 0 then + -- if there is coma in p_account, treat normally + if position (',' in p_account) = 0 then + raise info 'p_account is not empty'; + select count(*) into nCount from tmp_pcmn where pcm_val=p_account::account_type; + raise notice 'found in tmp_pcm %',nCount; + if nCount !=0 then + raise info 'this account exists in tmp_pcmn '; + perform attribut_insert(p_f_id,5,p_account); + else + -- account doesn't exist, create it + select ad_value into sName from + fiche_detail + where + ad_id=1 and f_id=p_f_id; + + nParent:=account_parent(p_account::account_type); + insert into tmp_pcmn(pcm_val,pcm_lib,pcm_val_parent) values (p_account::account_type,sName,nParent); + perform attribut_insert(p_f_id,5,p_account); + + end if; + else + raise info 'presence of a comma'; + -- there is 2 accounts separated by a comma + first := split_part(p_account,',',1); + second := split_part(p_account,',',2); + -- check there is no other coma + raise info 'first value % second value %', first, second; + + if position (',' in first) != 0 or position (',' in second) != 0 then + raise exception 'Too many comas, invalid account'; + end if; + perform attribut_insert(p_f_id,5,p_account); + end if; + else + raise info 'p_account is empty'; + select fd_id into nFd_id from fiche where f_id=p_f_id; + + bAuto:= account_auto(nFd_id); + + + select fd_class_base into sClass_base from fiche_def where fd_id=nFd_id; + raise info 'sClass_Base : %',sClass_base; + if bAuto = true + then + raise info 'account generated automatically'; + nNew:=account_compute(p_f_id); + raise info 'nNew %', nNew; + select ad_value into sName from + fiche_detail + 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,nNew); + + else + + -- if there is an account_base then it is the default + select fd_class_base::account_type into nNew from fiche_def join fiche using (fd_id) where f_id=p_f_id; + if nNew is null or length(trim(nNew)) = 0 then + raise notice 'count is null'; + perform attribut_insert(p_f_id,5,null); + else + perform attribut_insert(p_f_id,5,nNew); + end if; + end if; + end if; + +return 0; +end; +$BODY$ + LANGUAGE plpgsql VOLATILE + COST 100; +ALTER FUNCTION comptaproc.account_insert(integer, text) OWNER TO dany; diff --git a/sql/format_account.sql b/sql/format_account.sql new file mode 100644 index 000000000..85189e400 --- /dev/null +++ b/sql/format_account.sql @@ -0,0 +1,32 @@ +-- Function: comptaproc.format_account(account_type) + +-- DROP FUNCTION comptaproc.format_account(account_type); + +CREATE OR REPLACE FUNCTION comptaproc.format_account(p_account account_type) + RETURNS account_type AS +$BODY$ + +declare + +sResult account_type; + +begin +sResult := lower(p_account); + +sResult := translate(sResult,'éèêëàâäïîüûùöô','eeeeaaaiiuuuoo'); +sResult := translate(sResult,' $€µ£%.+-/\!(){}(),;_&|"#''^',''); + +if not sResult similar to '^[[:alnum:]_]+$' then + raise exception 'Invalid character in %',p_account; +end if; + +return upper(sResult); + +end;$BODY$ + LANGUAGE plpgsql VOLATILE + COST 100; +ALTER FUNCTION comptaproc.format_account(account_type) OWNER TO dany; +COMMENT ON FUNCTION comptaproc.format_account(account_type) IS 'format the accounting : +- upper case +- remove space and special char. +'; diff --git a/sql/tmp_pcmn_alphanum_ins_upd.sql b/sql/tmp_pcmn_alphanum_ins_upd.sql new file mode 100644 index 000000000..ce9a5b221 --- /dev/null +++ b/sql/tmp_pcmn_alphanum_ins_upd.sql @@ -0,0 +1,16 @@ + +CREATE OR REPLACE FUNCTION comptaproc.tmp_pcmn_alphanum_ins_upd() + RETURNS trigger AS +$BODY$ +declare + r_record tmp_pcmn%ROWTYPE; +begin +r_record := NEW; +r_record.pcm_val:=format_account(NEW.pcm_val); + +return r_record; +end; +$BODY$ + LANGUAGE plpgsql VOLATILE + COST 100; +ALTER FUNCTION comptaproc.tmp_pcmn_ins() OWNER TO dany; diff --git a/sql/trigger.tmp_pcmn.sql b/sql/trigger.tmp_pcmn.sql new file mode 100644 index 000000000..6c8d21e07 --- /dev/null +++ b/sql/trigger.tmp_pcmn.sql @@ -0,0 +1,9 @@ +-- Trigger: t_tmp_pcm_alphanum_ins_upd on tmp_pcmn + +-- DROP TRIGGER t_tmp_pcm_alphanum_ins_upd ON tmp_pcmn; + +CREATE TRIGGER t_tmp_pcm_alphanum_ins_upd + BEFORE INSERT OR UPDATE + ON tmp_pcmn + FOR EACH ROW + EXECUTE PROCEDURE comptaproc.tmp_pcmn_alphanum_ins_upd(); diff --git a/sql/upgrade.sql b/sql/upgrade.sql index d7d069981..e825b94c8 100644 --- a/sql/upgrade.sql +++ b/sql/upgrade.sql @@ -1,3 +1,17 @@ drop table public.import_tmp; drop table public.format_csv_banque; +insert into parametre values ('MY_ALPHANUM','N'); + +/* +script SQL to run +account_alphanum.sql +account_compute.sql +account_insert.sql +account-update.sql +change-pcmn-to-alphanum.sql +format_account.sql +tmp_pcmn_alphanum_ins_upd.sql +tmp_pcmn_ins.sql +trigger.tmp_pcmn.sql +*/ create unique index test_qcode_idx on fiche_detail (ad_value) where ad_id=23;