type='FIN'; } /*!\brief verify that the data are correct before inserting or confirming *\param an array (usually $_POST) *\return String *\throw Exception on error occurs */ public function verify($p_array) { extract ($p_array); /* check for a double reload */ if ( isset($mt) && $this->db->count_sql('select jr_mt from jrn where jr_mt=$1',array($mt)) != 0 ) throw new Exception (_('Double Encodage'),5); /* check if we can write into this ledger */ $user=new User($this->db); if ( $user->check_jrn($p_jrn) != 'W' ) throw new Exception (_('Accès interdit'),20); /* check if there is a bank account linked to the ledger */ $bank_id=$this->get_bank(); if ($this->db->count()==0 ) throw new Exception("Ce journal n'a pas de compte en banque, allez dans paramètre->journal pour régler cela"); /* check if the accounting of the bank is correct */ $fBank=new Fiche($this->db,$bank_id); $bank_accounting=$fBank->strAttribut(ATTR_DEF_ACCOUNT); if ( trim($bank_accounting)=='' ) throw new Exception ('Le poste comptable du compte en banque de ce journal est invalide'); /* check if the account exists */ $poste=new Acc_Account_Ledger($this->db,$bank_accounting); if ( $poste->load() == false ) throw new Exception ('Le poste comptable du compte en banque de ce journal est invalide'); /* check if the date is valid */ if ( isDate($e_date) == null ) { throw new Exception('Date invalide', 2); } $oPeriode=new Periode($this->db); if ($this->check_periode()==false) { $periode=$oPeriode->find_periode($e_date); } else { $oPeriode->p_id=$periode; list ($min,$max)=$oPeriode->get_date_limit(); if ( cmpDate($e_date,$min) < 0 || cmpDate($e_date,$max) > 0) throw new Exception(_('Date et periode ne correspondent pas'),6); } /* check if the periode is closed */ if ( $this->is_closed($periode)==1 ) { throw new Exception(_('Periode fermee'),6); } /* check if we are using the strict mode */ if( $this->check_strict() == true) { /* if we use the strict mode, we get the date of the last operation */ $last_date=$this->get_last_date(); if ( $last_date != null && cmpDate($e_date,$last_date) < 0 ) throw new Exception(_('Vous utilisez le mode strict la dernière operation est à la date du ') .$last_date._(' vous ne pouvez pas encoder à une date antérieure'),15); } $acc_pay=new Acc_Operation($this->db); $nb=0; $tot_amount=0; //---------------------------------------- // foreach item //---------------------------------------- for ($i=0;$i< $nb_item;$i++) { if ( strlen(trim(${'e_other'.$i}))== 0) continue; /* check if amount are numeric and */ if ( isNumber(${'e_other'.$i.'_amount'}) == 0 ) throw new Exception('La fiche '.${'e_other'.$i}.'a un montant invalide ['.${'e_other'.$i.'_amount'}.']',6); /* compute the total */ $tot_amount+=round(${'e_other'.$i.'_amount'},2); /* check if all card has a ATTR_DEF_ACCOUNT*/ $fiche=new Fiche($this->db); $fiche->get_by_qcode(${'e_other'.$i}); if ( $fiche->empty_attribute(ATTR_DEF_ACCOUNT) == true) throw new Exception('La fiche '.${'e_other'.$i}.'n\'a pas de poste comptable',8); $sposte=$fiche->strAttribut(ATTR_DEF_ACCOUNT); // if 2 accounts, take only the debit one for customer if ( strpos($sposte,',') != 0 ) { $array=explode(',',$sposte); $poste_val=$array[1]; } else { $poste_val=$sposte; } /* The account exists */ $poste=new Acc_Account_Ledger($this->db,$poste_val); if ( $poste->load() == false ) { throw new Exception('Pour la fiche '.${'e_other'.$i}.' le poste comptable ['.$poste->id.'n\'existe pas',9); } /* Check if the card belong to the ledger */ $fiche=new Fiche ($this->db); $fiche->get_by_qcode(${'e_other'.$i}); if ( $fiche->belong_ledger($p_jrn,'deb') !=1 ) throw new Exception('La fiche '.${'e_other'.$i}.'n\'est pas accessible à ce journal',10); $nb++; } if ( $nb == 0 ) throw new Exception('Il n\'y a aucune opération',12); /* Check if the last_saldo and first_saldo are correct */ if ( strlen(trim($last_sold)) != 0 && isNumber($last_sold) && strlen(trim($first_sold)) != 0 && isNumber($first_sold)) { $diff=$last_sold-$first_sold; $diff=round($diff,2)-round($tot_amount,2); if ( $first_sold != 0 && $last_sold !=0) { if ( $diff != 0 ) throw new Exception('Le montant de l\'extrait est incorrect'. $tot_amount.' extrait '.$diff,13); } } } /*!\brief *\param $p_array contains the value usually it is $_POST *\return string with html code *\note the form tag are not set here */ function input($p_array=null) { if ( $p_array != null) extract ($p_array); $owner=new Own($this->db); $pview_only=false; $user = new User($this->db); $f_add_button=new IButton('add_card'); $f_add_button->label=_('Créer une nouvelle fiche'); $f_add_button->set_attribute('ipopup','ipop_newcard'); $f_add_button->set_attribute('jrn',$this->id); $f_add_button->javascript=" this.jrn=\$('p_jrn').value;select_card_type(this);"; $str_add_button=$f_add_button->input(); // The first day of the periode $pPeriode=new Periode($this->db); list ($l_date_start,$l_date_end)=$pPeriode->get_date_limit($user->get_periode()); if ( $owner->MY_DATE_SUGGEST=='Y' ) $op_date=( ! isset($e_date) ) ?$l_date_start:$e_date; else $op_date=( ! isset($e_date) ) ?'':$e_date; $r=""; $r.=dossier::hidden(); $f_legend='Banque, caisse'; // Date //-- $Date=new IDate("e_date",$op_date); $Date->setReadOnly($pview_only); $f_date=$Date->input(); $f_period=''; if ($this->check_periode() == true) { // Periode //-- $l_user_per=(isset($periode))?$periode:$user->get_periode(); $period=new IPeriod(); $period->cn=$this->db; $period->type=OPEN; $period->value=$l_user_per; $period->user=$user; $period->name='periode'; try { $l_form_per=$period->input(); } catch (Exception $e) { if ($e->getCode() == 1 ) { echo "Aucune période ouverte"; exit(); } } $label=HtmlInput::infobulle(3); $f_period="Période comptable $label".$l_form_per; } // Ledger (p_jrn) //-- $add_js=""; if ( $owner->MY_PJ_SUGGEST == 'Y') $add_js="onchange='update_pj();update_bank();get_last_date();'"; $wLedger=$this->select_ledger('FIN',2); if ($wLedger == null ) exit ('Pas de journal disponible'); $wLedger->javascript=$add_js; $label=" Journal ".HtmlInput::infobulle(2) ; $f_jrn=$label.$wLedger->input(); // retrieve bank name, code and account from the jrn_def.jrn_def_bank $f_bank=''.$this->get_bank_name().''; $f_legend_detail='Opérations financières'; //-------------------------------------------------- // Saldo begin end //------------------------------------------------- // Extrait $default_pj=''; if ( $owner->MY_PJ_SUGGEST=='Y') { $default_pj=$this->guess_pj(); } $wPJ=new IText('e_pj'); $wPJ->readonly=false; $wPJ->size=10; $wPJ->value=(isset($e_pj))?$e_pj:$default_pj; $f_extrait=$wPJ->input().HtmlInput::hidden('e_pj_suggest',$default_pj); $label=HtmlInput::infobulle(7); $first_sold=(isset($first_sold))?$first_sold:""; $wFirst=new INum('first_sold',$first_sold); $last_sold= isset($last_sold)?$last_sold:""; $wLast=new INum('last_sold',$last_sold); $max=(isset($nb_item))?$nb_item:MAX_ARTICLE; $r.= HtmlInput::hidden('nb_item',$max); //-------------------------------------------------- // financial operation //------------------------------------------------- $array=array(); // Parse each " tiers" for ($i=0; $i < $max; $i++) { $tiers=(isset(${"e_other".$i}))?${"e_other".$i}:"" ; $tiers_label=""; $tiers_amount=(isset(${"e_other$i"."_amount"}))?round(${"e_other$i"."_amount"},2):0; $tiers_comment=(isset (${"e_other$i"."_comment"}))?${"e_other$i"."_comment"}:"" ; // If $tiers has a value if ( $tiers != "" ) { $fTiers=new Fiche($this->db); $fTiers->get_by_qcode($tiers); $tiers_label=$fTiers->strAttribut(ATTR_DEF_NAME); } ${"e_other$i"."_amount"}=(isset (${"e_other$i"."_amount"}))?${"e_other$i"."_amount"}: 0; $W1=new ICard(); $W1->label=""; $W1->name="e_other".$i; $W1->value=$tiers; $W1->extra='deb'; // credits $W1->typecard='deb'; $W1->set_dblclick("fill_ipopcard(this);"); $W1->set_attribute('ipopup','ipopcard'); // name of the field to update with the name of the card $W1->set_attribute('label','e_other'.$i.'_label'); // name of the field to update with the name of the card $W1->set_attribute('typecard','filter'); // Add the callback function to filter the card on the jrn $W1->set_callback('filter_card'); $W1->set_function('fill_data'); $W1->javascript=sprintf(' onchange="fill_data_onchange(\'%s\');" ', $W1->name); $W1->readonly=$pview_only; $array[$i]['qcode']=$W1->input(); $array[$i]['search']=$W1->search(); // label $other=new ISpan("e_other$i"."_label", $tiers_label); $array[$i]['span']=$other->input(); // Comment $wComment=new IText("e_other$i"."_comment",$tiers_comment); $wComment->size=35; $wComment->setReadOnly($pview_only); $array[$i]['comment']=$wComment->input(); // amount $wAmount=new INum("e_other$i"."_amount",$tiers_amount); $wAmount->size=7; $wAmount->setReadOnly($pview_only); $array[$i]['amount']=$wAmount->input(); // concerned ${"e_concerned".$i}=(isset(${"e_concerned".$i}))?${"e_concerned".$i}:"" ; $wConcerned=new IConcerned("e_concerned".$i,${"e_concerned".$i}); $wConcerned->setReadOnly($pview_only); $wConcerned->extra=0; $wConcerned->extra2='paid'; $array[$i]['concerned']=$wConcerned->input(); } ob_start(); require_once('template/form_ledger_fin.php'); $r.=ob_get_contents(); ob_clean(); return $r; } /*!\brief show the summary before inserting into the database, it *calls the function for adding a attachment. The function verify *should be called before *\param $p_array an array usually is $_POST *\return string with code html */ public function confirm($p_array) { $r=""; bcscale(2); extract ($p_array); $pPeriode=new Periode($this->db); if ($this->check_periode() == true) { $pPeriode->p_id=$periode; } else { $pPeriode->find_periode($e_date); } list ($l_date_start,$l_date_end)=$pPeriode->get_date_limit(); $exercice=$pPeriode->get_exercice(); $r.=''; $r.='
'; $r.=''; //-------------------------------------------------- // Hidden variables //-------------------------------------------------- $r.=dossier::hidden(); $r.=HtmlInput::hidden('p_jrn',$this->id); $r.=HtmlInput::hidden('nb_item',$nb_item); $r.=HtmlInput::hidden('last_sold',$last_sold); $r.=HtmlInput::hidden('first_sold',$first_sold); $r.=HtmlInput::hidden('e_pj',$e_pj); $r.=HtmlInput::hidden('e_pj_suggest',$e_pj_suggest); $r.=HtmlInput::hidden('e_date',$e_date); $mt=microtime(true); $r.=HtmlInput::hidden('mt',$mt); if (isset($periode)) $r.=HtmlInput::hidden('periode',$periode); $r.=dossier::hidden(); $r.=HtmlInput::hidden('sa','n'); for ($i=0; $i < $nb_item; $i++) { $tiers=(isset(${"e_other".$i}))?${"e_other".$i}:"" ; $r.=HtmlInput::hidden('e_other'.$i,$tiers); $r.=HtmlInput::hidden('e_other'.$i.'_comment',${'e_other'.$i.'_comment'}); $r.=HtmlInput::hidden('e_other'.$i.'_amount',${'e_other'.$i.'_amount'}); $r.=HtmlInput::hidden('e_concerned'.$i,${'e_concerned'.$i}); } return $r; } /*!\brief save the data into the database, included the attachment, *and the reconciliations *\param $p_array usually $_POST *\return string with HTML code */ public function insert($p_array) { $internal_code=""; $oid=0; extract ($p_array); $ret=''; // Debit = banque $bank_id=$this->get_bank(); $fBank=new Fiche($this->db,$bank_id); $e_bank_account=$fBank->strAttribut(ATTR_DEF_QUICKCODE); // Get the saldo $pPeriode=new Periode($this->db); if ( $this->check_periode() == true ) { $pPeriode->p_id=$periode; } else { $pPeriode->find_periode($e_date); } $exercice=$pPeriode->get_exercice(); $filter_year=" j_tech_per in (select p_id from parm_periode where p_exercice='".$exercice."')"; $sposte=$fBank->strAttribut(ATTR_DEF_ACCOUNT); // if 2 accounts, take only the debit one for customer if ( strpos($sposte,',') != 0 ) { $array=explode(',',$sposte); $poste_val=$array[0]; } else { $poste_val=$sposte; } $acc_account=new Acc_Account_Ledger($this->db,$poste_val); $solde=$acc_account->get_solde($filter_year); $new_solde=$solde; try { $this->db->start(); $amount=0.0; $idx_operation=0; $ret='