From ee11484e75a00fac5ea7be1337676a29adbb1094 Mon Sep 17 00:00:00 2001 From: sparkyx Date: Mon, 26 Apr 2021 13:37:44 +0200 Subject: [PATCH] Cosmetic : Card History --- include/class/acc_ledger_fin.class.php | 2168 ++++++++++++------------ include/class/fiche.class.php | 2 + 2 files changed, 1087 insertions(+), 1083 deletions(-) diff --git a/include/class/acc_ledger_fin.class.php b/include/class/acc_ledger_fin.class.php index e6495ef1d..ab8fb04f9 100644 --- a/include/class/acc_ledger_fin.class.php +++ b/include/class/acc_ledger_fin.class.php @@ -20,7 +20,7 @@ // Copyright Author Dany De Bontridder danydb@aevalys.eu -/**\file +/* * \file * \brief the class Acc_Ledger_Fin inherits from Acc_Ledger, this * object permit to manage the financial ledger */ @@ -38,1131 +38,1133 @@ require_once NOALYSS_INCLUDE.'/class/acc_reconciliation.class.php'; class Acc_Ledger_Fin extends Acc_Ledger { - - function __construct($p_cn, $p_init) - { - parent::__construct($p_cn, $p_init); - $this->ledger_type = 'FIN'; - } - /** - * Verify that the data are correct before inserting or confirming - * @brief verify the data - * @param an array (usually $_POST) - * @return String - * @throw Exception on error occurs - */ + function __construct($p_cn, $p_init) + { + parent::__construct($p_cn, $p_init); + $this->ledger_type='FIN'; + } - public function verify_operation($p_array) - { - global $g_user; - if (is_array($p_array ) == false || empty($p_array)) - throw new Exception ("Array empty"); - /* - * Check needed value - */ - check_parameter($p_array,'p_jrn'); + /** + * Verify that the data are correct before inserting or confirming + * @brief verify the data + * @param an array (usually $_POST) + * @return String + * @throw Exception on error occurs + */ + public function verify_operation($p_array) + { + global $g_user; + if (is_array($p_array)==false||empty($p_array)) + throw new Exception("Array empty"); + /* + * Check needed value + */ + check_parameter($p_array, 'p_jrn'); - - extract($p_array, EXTR_SKIP); - /* 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); + extract($p_array, EXTR_SKIP); + /* 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 */ - if ($g_user->check_jrn($p_jrn) != 'W') - throw new Exception(_('Accès interdit'), 20); + /* check if we can write into this ledger */ + if ($g_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(); + /* 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'); + 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'); - if ($chdate != 1 && $chdate != 2) throw new Exception ('Le choix de date est invalide'); - if ( $chdate == 1 ) - { - /* 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 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'); + if ($chdate!=1&&$chdate!=2) + throw new Exception('Le choix de date est invalide'); + if ($chdate==1) + { + /* 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 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); - } - } + /* 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); + $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); + $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); + /* 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); - if ($chdate == 2) - { - {/* check if the date is valid */ - if (isDate(${'dateop' . $i}) == null) - { - throw new Exception('Date invalide', 2); - } - $oPeriode = new Periode($this->db); - if ($this->check_periode() == false) - { - $periode = $oPeriode->find_periode(${'dateop' . $i}); - } - else - { - $oPeriode->p_id = $periode; - list ($min, $max) = $oPeriode->get_date_limit(); - if (cmpDate(${'dateop' . $i}, $min) < 0 || - cmpDate(${'dateop' . $i}, $max) > 0) - throw new Exception(_('Date et periode ne correspondent pas'), 6); - } + $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); + if ($chdate==2) + { + {/* check if the date is valid */ + if (isDate(${'dateop'.$i})==null) + { + throw new Exception('Date invalide', 2); + } + $oPeriode=new Periode($this->db); + if ($this->check_periode()==false) + { + $periode=$oPeriode->find_periode(${'dateop'.$i}); + } + else + { + $oPeriode->p_id=$periode; + list ($min, $max)=$oPeriode->get_date_limit(); + if (cmpDate(${'dateop'.$i}, $min)<0|| + cmpDate(${'dateop'.$i}, $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 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(${'dateop' . $i}, $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); - } - } - } - $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); - $calc=bcadd($first_sold,$tot_amount,4); - if ($first_sold != 0 || $last_sold != 0) - { - if ($diff != 0) { - throw new Exception(sprintf( _('Le montant de l\'extrait [%s] est incorrect,'. - " solde calculé [%s] , différence de [%s]") , - $last_sold,$calc,$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, $notused = 0) - { - global $g_parameter, $g_user; - if ($p_array != null) - extract($p_array, EXTR_SKIP); - - $pview_only = false; - - $min_article=$this->get_min_row(); - - $str_add_button_tiers = ""; - $add_card=FALSE; - if ($g_user->check_action(FICADD) == 1) { - $add_card=TRUE; + /* 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(${'dateop'.$i}, $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); + } } + } + $nb++; + } + if ($nb==0) + throw new Exception('Il n\'y a aucune opération', 12); - // The first day of the periode - $pPeriode = new Periode($this->db); - list ($l_date_start, $l_date_end) = $pPeriode->get_date_limit($g_user->get_periode()); - if ($g_parameter->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 : $g_user->get_periode(); - $period = new IPeriod(); - $period->cn = $this->db; - $period->type = OPEN; - $period->value = $l_user_per; - $period->user = $g_user; - $period->name = 'periode'; - try - { - $l_form_per = $period->input(); - } - catch (Exception $e) - { - if ($e->getCode() == 1) - { - throw new Exception(_("Aucune période ouverte")); - - } - } - $label = Icon_Action::infobulle(3); - $f_period = "Période comptable $label" . $l_form_per; - } - - // Ledger (p_jrn) - //-- - $onchange="update_bank();ajax_saldo('first_sold');update_name();update_row('fin_item');show_ledger_fin_currency();"; - - if ($g_parameter->MY_DATE_SUGGEST == 'Y') - $onchange .= 'get_last_date();'; - if ($g_parameter->MY_PJ_SUGGEST=='Y') - $onchange .= 'update_pj();'; - - $add_js = 'onchange="'.$onchange.'"'; - $wLedger = $this->select_ledger('FIN', 2,FALSE); - if ($wLedger == null) - throw new Exception(_('Pas de journal disponible')); - - $wLedger->javascript = $add_js; - - $label_ledger = _("Journal") ." ". Icon_Action::infobulle(2); - - - // retrieve bank name, code and account from the jrn_def.jrn_def_bank - - $f_bank = '' . $this->get_bank_name() . ''; - if ($this->bank_id == "") - { - echo h2("Journal de banque non configuré " . $this->get_name(), ' class="error"'); - echo ' vous devez donner à ce journal un compte en banque (fiche), modifiez dans CFGLED'; - alert("Journal de banque non configuré " . $this->get_name()); - } - - $f_legend_detail = 'Opérations financières'; - //-------------------------------------------------- - // Saldo begin end - //------------------------------------------------- - // Extrait - $default_pj = ''; - if ($g_parameter->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 = Icon_Action::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 : $min_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_amount = (isset(${"e_other$i" . "_amount"})) ? round(${"e_other$i" . "_amount"}, 2) : 0; - - $tiers_comment = (isset(${"e_other$i" . "_comment"})) ? ${"e_other$i" . "_comment"} : ""; - - $operation_date=new IDate("dateop".$i); - $operation_date->value=(isset(${'dateop'.$i}))?${'dateop'.$i}:""; - $array[$i]['dateop']=$operation_date->input(); - ${"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->id = "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_name' . $i); - // 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(); - $array[$i]['card_add']=($add_card==TRUE)?$this->add_card("deb", $W1->id):""; - // Card name - // - $card_name = ""; - if ($tiers != "") - { - $fiche = new Fiche($this->db); - $fiche->get_by_qcode($tiers); - $card_name = $this->db->get_value("Select ad_value from fiche_detail where ad_id=$1 and f_id=$2", array(ATTR_DEF_NAME, $fiche->id)); - } - - $wcard_name = new IText("e_other_name" . $i, $card_name); - $wcard_name->id=$wcard_name->name; - $wcard_name->readOnly = true; - $array[$i]['cname'] = $wcard_name->input(); - - // Comment - $wComment = new IText("e_other$i" . "_comment", $tiers_comment); - $wComment->style='class="input_text label_item"'; - - $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->tiers="e_other" . $i; - $wConcerned->setReadOnly($pview_only); - $wConcerned->amount_id = "e_other" . $i . "_amount"; - - $wConcerned->paid = 'paid'; - $array[$i]['concerned'] = $wConcerned->input(); - } - - ob_start(); - require_once NOALYSS_TEMPLATE.'/form_ledger_fin.php'; - $r.=ob_get_contents(); - ob_end_clean(); - $r.= create_script("$('".$Date->id."').focus()"); - - 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, $p_nothing = 0) - { - global $g_parameter,$g_user; - $r = ""; - bcscale(2); - extract($p_array, EXTR_SKIP); - $pPeriode = new Periode($this->db); - if ($this->check_periode() == true) - { - $pPeriode->p_id = $periode; - } - else - { - if (isDate($e_date) != null) { - $pPeriode->find_periode($e_date); - } else { - $pPeriode->p_id=$g_user->get_periode(); - } - } - - list ($l_date_start, $l_date_end) = $pPeriode->get_date_limit(); - $exercice = $pPeriode->get_exercice(); - $r.=''; - $r.='
'._("Banque, caisse").' '; - $r.= '
'; - $r.='

' . $this->get_name() . '

'; - $r.= '
'; - $r.=''; - // Date - //-- - $r.=""; - if ( $chdate == 1 ) $r.='"; - $r.=""; - // Ledger (p_jrn) - //-- - $r.=''; - $r.=''; - $this->id = $p_jrn; - $r.=''; - $r.=''; - - //retrieve bank name - $bk_id = $this->get_bank(); - - $fBank = new Fiche($this->db, $bk_id); - $e_bank_account_label = $this->get_bank_name(); - - $filter_year = " j_tech_per in (select p_id from parm_periode where p_exercice='" . $exercice . "')"; - - $acc_account = new Acc_Account_Ledger($this->db, $fBank->strAttribut(ATTR_DEF_ACCOUNT)); - $asolde= $acc_account->get_solde_detail($filter_year); - $deb=$asolde['debit']; - $cred=$asolde['credit']; - $solde= bcsub($deb, $cred); - $new_solde=$solde; - - $r.="
Date : ' . $e_date; - // Periode - //-- - $r.=""; - $r.="Période comptable "; - $r.=$l_date_start . ' - ' . $l_date_end; - $r.="
Journal '; - $r.=h($this->get_name()); - $r.='
Banque "; - $r.=$e_bank_account_label; - - $r.="
"; - - $r.='
'; - - $r.='

'._("Extrait de compte").'

'; - //-------------------------------------------------- - // Saldo begin end - //------------------------------------------------- - $r.=''; - $r.=''; - // Extrait - //-- - $r.=tr('' . td(h($e_pj))); - $r.=''; - $r.=''; - $r.=''; - $r.=''; - $r.='
'._("Numéro d'extrait").'
'._("Solde début extrait").' ' . nbm($first_sold) . '
'._("Solde fin extrait").' ' . nbm($last_sold) . '
'; - - $r.='

Opérations financières

'; - //-------------------------------------------------- - // financial operation - //------------------------------------------------- - $r.=''; - $r.=""; - if ($chdate==2) $r.=''; - $r.=""; - $r.=""; - $r.=""; - $r.=''; - - /* if we use the AC */ - if ($g_parameter->MY_ANALYTIC != 'nu') - { - $anc = new Anc_Plan($this->db); - $a_anc = $anc->get_list(); - $x = count($a_anc); - /* set the width of the col */ - $r.=''; - - /* add hidden variables pa[] to hold the value of pa_id */ - $r.=Anc_Plan::hidden($a_anc); - } - $r.=""; - // Parse each " tiers" - $tot_amount = 0; - //-------------------------------------------------- - // For each items - //-------------------------------------------------- - for ($i = 0; $i < $nb_item; $i++) - { - - $tiers = (isset(${"e_other" . $i})) ? ${"e_other" . $i} : "" - ; - - if (strlen(trim($tiers)) == 0) - continue; - $tiers_label = ""; - $tiers_amount = round(${"e_other$i" . "_amount"}, 2); - $tot_amount = bcadd($tot_amount, $tiers_amount); - $tiers_comment = h(${"e_other$i" . "_comment"}); - // If $tiers has a value - $fTiers = new Fiche($this->db); - $fTiers->get_by_qcode($tiers); - - $tiers_label = $fTiers->strAttribut(ATTR_DEF_NAME); - - $r.=""; - if ($chdate==2) $r.=td(${"dateop".$i}); - $r.=""; - // label - $r.=''; - // Comment - $r.=''; - // amount - $r.=''; - // concerned - $r.=''; - // encode the pa - if ($g_parameter->MY_ANALYTIC != 'nu' && $g_parameter->match_analytic($fTiers->strAttribut(ATTR_DEF_ACCOUNT)) == 1) // use of AA - { - // show form - $anc_op = new Anc_Operation($this->db); - $null = ($g_parameter->MY_ANALYTIC == 'op') ? 1 : 0; - $r.=''; - } - - $r.=''; - } - $r.="
'._("Date").'"._("Nom").""._("Commentaire").""._("Montant")."'._("Op. Concernée(s)").'' . _('Compt. Analytique') . '
" . ${'e_other' . $i} . "'; - $r.=$fTiers->strAttribut(ATTR_DEF_NAME); - $r.='' . $tiers_comment . '' . nbm($tiers_amount) . ''; - if (${"e_concerned" . $i} != '') - { - $jr_internal = $this->db->get_array("select jr_internal from jrn where jr_id in (" . ${"e_concerned" . $i} . ")"); - $comma=""; - for ($x = 0; $x < count($jr_internal); $x++) - { - $r.=$comma.HtmlInput::detail_op(${"e_concerned" . $i}, $jr_internal[$x]['jr_internal']); - $comma=" , "; - } - } - $r.=''; - $p_mode = 1; - $p_array['pa_id'] = $a_anc; - /* op is the operation it contains either a sequence or a jrnx.j_id */ - $r.=HtmlInput::hidden('op[]=', $i); - $r.=$anc_op->display_form_plan($p_array, $null, $p_mode, $i, $tiers_amount); - $r.='
"; - $acc_currency=$this->get_currency(); - - // If currency is not the default one - if ( $acc_currency->get_id() != 0) + /* 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); + $calc=bcadd($first_sold, $tot_amount, 4); + if ($first_sold!=0||$last_sold!=0) + { + if ($diff!=0) { - - $solde=$fBank->get_bk_balance_currency(); - $cur=$acc_currency->get_code(); - $cur_rate=$acc_currency->get_rate_date($e_date); - $default_currency=new Acc_Currency($this->db , 0); - // saldo - $r .= ""; - $r .= tr( - td(_("Ancien solde")) . - td(nbm($solde).$cur, 'class="num"') - ); - $new_solde=bcadd($solde,$tot_amount); - $r .= tr( - td(_("Nouveau solde")) . - td(nbm($new_solde).$cur, ' class="num"') - ); - $r .= tr( - td(_("Difference")) . - td(nbm($tot_amount).$cur, ' class="num"') - ); - $r.=tr( - td(_("Taux")). - td($cur_rate) - ); - $r.=tr( - td(_("Nouveau solde")). - td(bcdiv($new_solde,$cur_rate).$default_currency->get_code(), ' class="num"') - ); - $r.='
'; - - - - - } else { - - $cur=$acc_currency->get_code(); - // saldo - $r .= ""; - $r .= tr( - td(_("Ancien solde")) . - td(nbm($solde).$cur, 'class="num"') - ); - $new_solde=bcadd($solde,$tot_amount); - $r .= tr( - td(_("Nouveau solde")) . - td(nbm($new_solde).$cur, ' class="num"') - ); - $r .= tr( - td(_("Difference")) . - td(nbm($tot_amount).$cur, ' class="num"') - ); - - $r.='
'; - - + throw new Exception(sprintf(_('Le montant de l\'extrait [%s] est incorrect,'. + " solde calculé [%s] , différence de [%s]"), $last_sold, $calc, + $diff), 13); } - // check for upload piece - $file = new IFile(); + } + } + } + + /* * \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, $notused=0) + { + global $g_parameter, $g_user; + if ($p_array!=null) + extract($p_array, EXTR_SKIP); + + $pview_only=false; + + $min_article=$this->get_min_row(); + + $str_add_button_tiers=""; + $add_card=FALSE; + if ($g_user->check_action(FICADD)==1) + { + $add_card=TRUE; + } + + // The first day of the periode + $pPeriode=new Periode($this->db); + list ($l_date_start, $l_date_end)=$pPeriode->get_date_limit($g_user->get_periode()); + if ($g_parameter->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:$g_user->get_periode(); + $period=new IPeriod(); + $period->cn=$this->db; + $period->type=OPEN; + $period->value=$l_user_per; + $period->user=$g_user; + $period->name='periode'; + try + { + $l_form_per=$period->input(); + } + catch (Exception $e) + { + if ($e->getCode()==1) + { + throw new Exception(_("Aucune période ouverte")); + } + } + $label=Icon_Action::infobulle(3); + $f_period="Période comptable $label".$l_form_per; + } + + // Ledger (p_jrn) + //-- + $onchange="update_bank();ajax_saldo('first_sold');update_name();update_row('fin_item');show_ledger_fin_currency();"; + + if ($g_parameter->MY_DATE_SUGGEST=='Y') + $onchange.='get_last_date();'; + if ($g_parameter->MY_PJ_SUGGEST=='Y') + $onchange.='update_pj();'; + + $add_js='onchange="'.$onchange.'"'; + $wLedger=$this->select_ledger('FIN', 2, FALSE); + if ($wLedger==null) + throw new Exception(_('Pas de journal disponible')); + + $wLedger->javascript=$add_js; + + $label_ledger=_("Journal")." ".Icon_Action::infobulle(2); + + // retrieve bank name, code and account from the jrn_def.jrn_def_bank + + $f_bank=''.$this->get_bank_name().''; + if ($this->bank_id=="") + { + echo h2("Journal de banque non configuré ".$this->get_name(), ' class="error"'); + echo ' vous devez donner à ce journal un compte en banque (fiche), modifiez dans CFGLED'; + alert("Journal de banque non configuré ".$this->get_name()); + } + + $f_legend_detail='Opérations financières'; + //-------------------------------------------------- + // Saldo begin end + //------------------------------------------------- + // Extrait + $default_pj=''; + if ($g_parameter->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=Icon_Action::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:$min_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_amount=(isset(${"e_other$i"."_amount"}))?round(${"e_other$i"."_amount"}, 2):0; + + $tiers_comment=(isset(${"e_other$i"."_comment"}))?${"e_other$i"."_comment"}:""; + + $operation_date=new IDate("dateop".$i); + $operation_date->value=(isset(${'dateop'.$i}))?${'dateop'.$i}:""; + $array[$i]['dateop']=$operation_date->input(); + ${"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->id="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_name'.$i); + // 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(); + $array[$i]['card_add']=($add_card==TRUE)?$this->add_card("deb", $W1->id):""; + // Card name + // + $card_name=""; + if ($tiers!="") + { + $fiche=new Fiche($this->db); + $fiche->get_by_qcode($tiers); + $card_name=$this->db->get_value("Select ad_value from fiche_detail where ad_id=$1 and f_id=$2", + array(ATTR_DEF_NAME, $fiche->id)); + } + + $wcard_name=new IText("e_other_name".$i, $card_name); + $wcard_name->id=$wcard_name->name; + $wcard_name->readOnly=true; + $array[$i]['cname']=$wcard_name->input(); + + // Comment + $wComment=new IText("e_other$i"."_comment", $tiers_comment); + $wComment->style='class="input_text label_item"'; + + $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->tiers="e_other".$i; + $wConcerned->setReadOnly($pview_only); + $wConcerned->amount_id="e_other".$i."_amount"; + + $wConcerned->paid='paid'; + $array[$i]['concerned']=$wConcerned->input(); + } + + ob_start(); + require_once NOALYSS_TEMPLATE.'/form_ledger_fin.php'; + $r.=ob_get_contents(); + ob_end_clean(); + $r.=create_script("$('".$Date->id."').focus()"); + + 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, $p_nothing=0) + { + global $g_parameter, $g_user; + $r=""; + bcscale(2); + extract($p_array, EXTR_SKIP); + $pPeriode=new Periode($this->db); + if ($this->check_periode()==true) + { + $pPeriode->p_id=$periode; + } + else + { + if (isDate($e_date)!=null) + { + $pPeriode->find_periode($e_date); + } + else + { + $pPeriode->p_id=$g_user->get_periode(); + } + } + + list ($l_date_start, $l_date_end)=$pPeriode->get_date_limit(); + $exercice=$pPeriode->get_exercice(); + $r.=''; + $r.='
'._("Banque, caisse").' '; + $r.='
'; + $r.='

'.$this->get_name().'

'; + $r.='
'; + $r.=''; + // Date + //-- + $r.=""; + if ($chdate==1) + $r.='"; + $r.=""; + // Ledger (p_jrn) + //-- + $r.=''; + $r.=''; + $this->id=$p_jrn; + $r.=''; + $r.=''; + + //retrieve bank name + $bk_id=$this->get_bank(); + + $fBank=new Fiche($this->db, $bk_id); + $e_bank_account_label=$this->get_bank_name(); + + $filter_year=" j_tech_per in (select p_id from parm_periode where p_exercice='".$exercice."')"; + + $acc_account=new Acc_Account_Ledger($this->db, $fBank->strAttribut(ATTR_DEF_ACCOUNT)); + $asolde=$acc_account->get_solde_detail($filter_year); + $deb=$asolde['debit']; + $cred=$asolde['credit']; + $solde=bcsub($deb, $cred); + $new_solde=$solde; + + $r.="
Date : '.$e_date; + // Periode + //-- + $r.=""; + $r.="Période comptable "; + $r.=$l_date_start.' - '.$l_date_end; + $r.="
Journal '; + $r.=h($this->get_name()); + $r.='
Banque "; + $r.=$e_bank_account_label; + + $r.="
"; + + $r.='
'; + + $r.='

'._("Extrait de compte").'

'; + //-------------------------------------------------- + // Saldo begin end + //------------------------------------------------- + $r.=''; + $r.=''; + // Extrait + //-- + $r.=tr(''.td(h($e_pj))); + $r.=''; + $r.=''; + $r.=''; + $r.=''; + $r.='
'._("Numéro d'extrait").'
'._("Solde début extrait").' '.nbm($first_sold).'
'._("Solde fin extrait").' '.nbm($last_sold).'
'; + + $r.='

Opérations financières

'; + //-------------------------------------------------- + // financial operation + //------------------------------------------------- + $r.=''; + $r.=""; + if ($chdate==2) + $r.=''; + $r.=""; + $r.=""; + $r.=""; + $r.=''; + + /* if we use the AC */ + if ($g_parameter->MY_ANALYTIC!='nu') + { + $anc=new Anc_Plan($this->db); + $a_anc=$anc->get_list(); + $x=count($a_anc); + /* set the width of the col */ + $r.=''; + + /* add hidden variables pa[] to hold the value of pa_id */ + $r.=Anc_Plan::hidden($a_anc); + } + $r.=""; + // Parse each " tiers" + $tot_amount=0; + //-------------------------------------------------- + // For each items + //-------------------------------------------------- + for ($i=0; $i<$nb_item; $i++) + { + + $tiers=(isset(${"e_other".$i}))?${"e_other".$i}:"" + ; + + if (strlen(trim($tiers))==0) + continue; + $tiers_label=""; + $tiers_amount=round(${"e_other$i"."_amount"}, 2); + $tot_amount=bcadd($tot_amount, $tiers_amount); + $tiers_comment=h(${"e_other$i"."_comment"}); + // If $tiers has a value + $fTiers=new Fiche($this->db); + $fTiers->get_by_qcode($tiers); + + $tiers_label=$fTiers->strAttribut(ATTR_DEF_NAME); + + $r.=""; + if ($chdate==2) + $r.=td(${"dateop".$i}); + $r.=""; + // label + $r.=''; + // Comment + $r.=''; + // amount + $r.=''; + // concerned + $r.=''; + } + + $r.=''; + } + $r.="
'._("Date").'"._("Nom").""._("Commentaire").""._("Montant")."'._("Op. Concernée(s)").''._('Compt. Analytique').'
".${'e_other'.$i}."'; + $r.=$fTiers->strAttribut(ATTR_DEF_NAME); + $r.=''.$tiers_comment.''.nbm($tiers_amount).''; + if (${"e_concerned".$i}!='') + { + $jr_internal=$this->db->get_array("select jr_internal from jrn where jr_id in (".${"e_concerned".$i}.")"); + $comma=""; + for ($x=0; $xMY_ANALYTIC!='nu'&&$g_parameter->match_analytic($fTiers->strAttribut(ATTR_DEF_ACCOUNT))==1) // use of AA + { + // show form + $anc_op=new Anc_Operation($this->db); + $null=($g_parameter->MY_ANALYTIC=='op')?1:0; + $r.=''; + $p_mode=1; + $p_array['pa_id']=$a_anc; + /* op is the operation it contains either a sequence or a jrnx.j_id */ + $r.=HtmlInput::hidden('op[]=', $i); + $r.=$anc_op->display_form_plan($p_array, $null, $p_mode, $i, $tiers_amount); + $r.='
"; + $acc_currency=$this->get_currency(); + + // If currency is not the default one + if ($acc_currency->get_id()!=0) + { + + $solde=$fBank->get_bk_balance_currency(); + $cur=$acc_currency->get_code(); + $cur_rate=$acc_currency->get_rate_date($e_date); + $default_currency=new Acc_Currency($this->db, 0); + // saldo + $r.=""; + $r.=tr( + td(_("Ancien solde")). + td(nbm($solde).$cur, 'class="num"') + ); + $new_solde=bcadd($solde, $tot_amount); + $r.=tr( + td(_("Nouveau solde")). + td(nbm($new_solde).$cur, ' class="num"') + ); + $r.=tr( + td(_("Difference")). + td(nbm($tot_amount).$cur, ' class="num"') + ); + $r.=tr( + td(_("Taux")). + td($cur_rate) + ); + $r.=tr( + td(_("Nouveau solde")). + td(bcdiv($new_solde, $cur_rate).$default_currency->get_code(), ' class="num"') + ); + $r.='
'; + } + else + { + + $cur=$acc_currency->get_code(); + // saldo + $r.=""; + $r.=tr( + td(_("Ancien solde")). + td(nbm($solde).$cur, 'class="num"') + ); + $new_solde=bcadd($solde, $tot_amount); + $r.=tr( + td(_("Nouveau solde")). + td(nbm($new_solde).$cur, ' class="num"') + ); + $r.=tr( + td(_("Difference")). + td(nbm($tot_amount).$cur, ' class="num"') + ); + + $r.='
'; + } + // check for upload piece + $file=new IFile(); $file->setAlertOnSize(true); - $r.="
"._("Ajoutez une pièce justificative")." "; - $r.=$file->input("pj", ""); + $r.="
"._("Ajoutez une pièce justificative")." "; + $r.=$file->input("pj", ""); - $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); + $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','chdate'); - 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, $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}); - $r.=HtmlInput::hidden('dateop' . $i, ${'dateop' . $i}); - $r.=HtmlInput::hidden('chdate' , $chdate); - } + if (isset($periode)) + $r.=HtmlInput::hidden('periode', $periode); + $r.=dossier::hidden(); + $r.=HtmlInput::hidden('sa', 'n', 'chdate'); + 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, $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}); + $r.=HtmlInput::hidden('dateop'.$i, ${'dateop'.$i}); + $r.=HtmlInput::hidden('chdate', $chdate); + } - return $r; - } + 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 - */ + /* * \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 = null) - { - global $g_parameter; - bcscale(2); - $internal_code = ""; - $oid = 0; - extract($p_array, EXTR_SKIP); - $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); - $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; - } + public function insert($p_array=null) + { + global $g_parameter; + bcscale(2); + $internal_code=""; + $oid=0; + extract($p_array, EXTR_SKIP); + $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); + $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); + $acc_account=new Acc_Account_Ledger($this->db, $poste_val); - // If date = deposit date - if ($chdate == 1 ) - { - 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 . "')"; - $asolde= $acc_account->get_solde_detail($filter_year); - $deb=$asolde['debit']; - $cred=$asolde['credit']; - $solde= bcsub($deb, $cred); - $new_solde=$solde; - } + // If date = deposit date + if ($chdate==1) + { + 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."')"; + $asolde=$acc_account->get_solde_detail($filter_year); + $deb=$asolde['debit']; + $cred=$asolde['credit']; + $solde=bcsub($deb, $cred); + $new_solde=$solde; + } - try - { - $this->db->start(); - $amount = 0.0; - $idx_operation = 0; - $ret = ''; - $ret.=tr(th(_('Date')).th(_('n° interne')) . th(_('Quick Code')) - . th(_('Nom')) . th(_('Libellé')) . th(_('Montant'), ' style="text-align:right"')); - // Credit = goods - $get_solde=true; - - $acc_currency=new Acc_Currency($this->db,$this->currency_id); - - // get the currency_rate when we have one date for all the operations - if ( $chdate != 2 ) { - $currency_rate=$acc_currency->get_rate_date($e_date); - } - if (DEBUGNOALYSS > 1) { - printf("

rate %s

",$currency_rate); - } - // for each item - for ($i = 0; $i < $nb_item; $i++) - { - // insert it into the database - // and quit the loop ? - if (strlen(trim(${"e_other$i"})) == 0) - continue; + try + { + $this->db->start(); + $amount=0.0; + $idx_operation=0; + $ret='
'; + $ret.=tr(th(_('Date')).th(_('n° interne')).th(_('Quick Code')) + .th(_('Nom')).th(_('Libellé')).th(_('Montant'), ' style="text-align:right"')); + // Credit = goods + $get_solde=true; - // get the currency_rate when each operation has its own date - if ( $chdate == 2 ) { - $e_date=${'dateop'.$i}; - $currency_rate=$acc_currency->get_rate_date($e_date); - } - // if date is date of operation - if ($chdate == 2 && $get_solde ) - { - $get_solde=false; - if ($this->check_periode() == true && isset($p_array['periode'])) - { - $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='" . - sql_string($exercice ). "')"; - $solde = $acc_account->get_solde($filter_year); - $new_solde = $solde; - } - $fPoste = new Fiche($this->db); - $fPoste->get_by_qcode(${"e_other$i"}); - - // convert to EUR if needed and round it - $amount_input=${"e_other$i" . "_amount"} = round(${"e_other$i" . "_amount"}, 2); - $amount_eur=bcdiv($amount_input,$currency_rate); + $acc_currency=new Acc_Currency($this->db, $this->currency_id); + // get the currency_rate when we have one date for all the operations + if ($chdate!=2) + { + $currency_rate=$acc_currency->get_rate_date($e_date); + } + if (DEBUGNOALYSS>1) + { + printf("

rate %s

", $currency_rate); + } + // for each item + for ($i=0; $i<$nb_item; $i++) + { + // insert it into the database + // and quit the loop ? + if (strlen(trim(${"e_other$i"}))==0) + continue; - - $amount=bcadd($amount,$amount_input); - - // Record a line for the bank - // Compute the j_grpt - $seq = $this->db->get_next_seq('s_grpt'); - - $acc_operation = new Acc_Operation($this->db); - $acc_operation->date = $e_date; - $sposte = $fPoste->strAttribut(ATTR_DEF_ACCOUNT); - // if 2 accounts - if (strpos($sposte, ',') != 0) - { - $array = explode(',', $sposte); - if (${"e_other$i" . "_amount"} < 0) - $poste_val = $array[1]; - else - $poste_val = $array[0]; - } - else - { - $poste_val = $sposte; - } - - - $acc_operation->poste = $poste_val; - $acc_operation->amount = bcmul($amount_eur,-1); - $acc_operation->grpt = $seq; - $acc_operation->jrn = $p_jrn; - $acc_operation->type = 'd'; - - if (isset($periode)) - $tperiode = $periode; - else - { - $per = new Periode($this->db); - $tperiode = $per->find_periode($e_date); - } - $acc_operation->periode = $tperiode; - $acc_operation->qcode = ${"e_other" . $i}; - $j_id_currency = $acc_operation->insert_jrnx(); - - // -- Insert into Operation Currency - $operation_currency = new Operation_currency_SQL($this->db); - $operation_currency->oc_amount=$amount_input; - $operation_currency->oc_vat_amount=0; - $operation_currency->oc_price_unit=0; - $operation_currency->j_id=$j_id_currency; - $operation_currency->insert(); - - $acc_operation = new Acc_Operation($this->db); - $acc_operation->date = $e_date; - $sposte = $fBank->strAttribut(ATTR_DEF_ACCOUNT); - - // if 2 accounts, use the first one if DEB otherwise the second one - if (strpos($sposte, ',') != 0) - { - $array = explode(',', $sposte); - if (${"e_other$i" . "_amount"} < 0) - $poste_val = $array[1]; - else - $poste_val = $array[0]; - } - else - { - $poste_val = $sposte; - } - - $acc_operation->poste = $poste_val; - $acc_operation->amount = $amount_eur; - $acc_operation->grpt = $seq; - $acc_operation->jrn = $p_jrn; - $acc_operation->type = 'd'; - $acc_operation->periode = $tperiode; - $acc_operation->qcode = $e_bank_account; - $j_id=$acc_operation->insert_jrnx(); - - // -- Insert into Operation Currency - $operation_currency = new Operation_currency_SQL($this->db); - $operation_currency->oc_amount=$amount_input; - $operation_currency->oc_vat_amount=0; - $operation_currency->oc_price_unit=0; - $operation_currency->j_id=$j_id; - $operation_currency->insert(); - - - if (sql_string(${"e_other$i" . "_comment"}) == null) - { - // if comment is blank set a default one - $comment = sprintf(_(" compte : %s a %s "), - $fBank->strAttribut(ATTR_DEF_NAME), - $fPoste->strAttribut(ATTR_DEF_NAME) - ); - } - else - { - $comment =strip_tags(${'e_other' . $i . '_comment'}); - } - - - $acc_operation = new Acc_Operation($this->db); - $acc_operation->jrn = $p_jrn; - $acc_operation->amount = abs($amount_eur); - $acc_operation->date = $e_date; - $acc_operation->desc = $comment; - $acc_operation->grpt = $seq; - $acc_operation->periode = $tperiode; - $acc_operation->mt = $mt; - $idx_operation++; - $acc_operation->pj = ''; - $acc_operation->currency_id=$this->currency_id; - $acc_operation->currency_rate=$currency_rate; - $acc_operation->currency_rate_ref=$currency_rate; - - - if (trim($e_pj) != '' && $this->numb_operation() == true) - $acc_operation->pj = $e_pj . str_pad($idx_operation, 3, 0, STR_PAD_LEFT); - - if (trim($e_pj) != '' && $this->numb_operation() == false) - $acc_operation->pj = $e_pj; - - $jr_id = $acc_operation->insert_jrn(); - // $acc_operation->set_pj(); - $this->db->exec_sql('update jrn set jr_pj_number=$1 where jr_id=$2', array($acc_operation->pj, $jr_id)); - $internal = $this->compute_internal_code($seq); - - - if (trim(${"e_concerned" . $i}) != "") - { - if (strpos(${"e_concerned" . $i}, ',') != 0) - { - $aRapt = explode(',', ${"e_concerned" . $i}); - foreach ($aRapt as $rRapt) - { - // Add a "concerned operation to bound these op.together - // - $rec = new Acc_Reconciliation($this->db); - $rec->set_jr_id($jr_id); - - if (isNumber($rRapt) == 1) - { - $rec->insert($rRapt); - try { - $oppaid=new Acc_Operation($this->db); - $oppaid->set_id($rRapt); - $oppaid->set_paid(); - } catch (Exception $ex) { - record_log($ex->getTraceAsString()); - echo _('Attention , erreur Acc_Ledger_Fin::insert , coche paiement'); - } - } - } - } - else - if (isNumber(${"e_concerned" . $i}) == 1) - { - $rec = new Acc_Reconciliation($this->db); - $rec->set_jr_id($jr_id); - $rec->insert(${"e_concerned$i"}); - try { - $oppaid=new Acc_Operation($this->db); - $oppaid->set_id(${"e_concerned" . $i}); - $conc_amount=$oppaid->get_amount(); - if ($conc_amount == $acc_operation->amount) - { - $oppaid->set_paid(); - } - } catch (Exception $ex) { - record_log($ex->getTraceAsString()); - echo _('Attention , erreur Acc_Ledger_Fin::insert , coche paiement'); - } - } - } - - // Set Internal code - $this->grpt_id = $seq; - /** - * save also into quant_fin - */ - $this->insert_quant_fin($fBank->id, $jr_id, $fPoste->id, $amount_eur,$j_id_currency); - - if ($g_parameter->MY_ANALYTIC != "nu") - { - // for each item, insert into operation_analytique */ - $op = new Anc_Operation($this->db); - $op->set_currency_rate($currency_rate); - $op->oa_group = $this->db->get_next_seq("s_oa_group"); /* for analytic */ - $op->j_id = $j_id_currency; - $op->oa_date = $e_date; - $op->oa_debit = 'f'; - $op->oa_description = sql_string($comment); - $op->save_form_plan($_POST, $i, $j_id_currency); - } - - - $this->update_internal_code($internal); - - $js_detail = HtmlInput::detail_op($jr_id, $internal); - // Compute display - $row = td($e_date) - . td($js_detail) - . td(${"e_other$i"}) - . td($fPoste->strAttribut(ATTR_DEF_NAME)) - . td(${"e_other" . $i . "_comment"}) - . td(nbm(${"e_other$i" . "_amount"}), 'class="num"'); - $class=($i%2==0)?' class="even" ':' class="odd" '; - $ret.=tr($row,$class); - - - if ($i == 0) - { - // first record we upload the files and - // keep variable to update other row of jrn - if (isset($_FILES)) - $oid = $this->db->save_receipt($seq); - } - else - { - if ($oid != 0) - { - $this->db->exec_sql("update jrn set jr_pj=$1 , jr_pj_name=$2, - jr_pj_type=$3 where jr_grpt_id=$4", - array($oid,$_FILES['pj']['name'] ,$_FILES['pj']['type'],$seq)); - } - } - } // for nbitem - // increment pj - if (strlen(trim($e_pj)) != 0) - { - $this->inc_seq_pj(); - } - $ret.='
'; - } - catch (Exception $e) - { - $r = '' . - 'Erreur dans l\'enregistrement ' . - __FILE__ . ':' . __LINE__ . ' ' . - $e->getMessage(); - $this->db->rollback(); - record_log($e); - throw new Exception($r); - } - $this->db->commit(); - if ( $acc_currency->get_id() == 0) + // get the currency_rate when each operation has its own date + if ($chdate==2) { - $r = ""; - $r.=sprintf("
"._("Ancien solde %s %s"), nbm($solde),$acc_currency->get_code()); - $new_solde = bcadd($new_solde, $amount); - $r.=sprintf("
"._("Nouveau solde %s %s"), nbm($new_solde),$acc_currency->get_code()); - $ret.=$r; - } else { - $solde_cur=$fBank->get_bk_balance_currency(); - $r = ""; - $r.=sprintf("
"._("Ancien solde %s %s"), nbm($solde_cur),$acc_currency->get_code()); - $new_solde = bcadd($solde_cur, $amount); - $r.=sprintf("
"._("Nouveau solde %s %s"), nbm($new_solde),$acc_currency->get_code()); - $ret.=$r; + $e_date=${'dateop'.$i}; + $currency_rate=$acc_currency->get_rate_date($e_date); + } + // if date is date of operation + if ($chdate==2&&$get_solde) + { + $get_solde=false; + if ($this->check_periode()==true&&isset($p_array['periode'])) + { + $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='". + sql_string($exercice)."')"; + $solde=$acc_account->get_solde($filter_year); + $new_solde=$solde; + } + $fPoste=new Fiche($this->db); + $fPoste->get_by_qcode(${"e_other$i"}); + + // convert to EUR if needed and round it + $amount_input=${"e_other$i"."_amount"}=round(${"e_other$i"."_amount"}, 2); + $amount_eur=bcdiv($amount_input, $currency_rate); + + $amount=bcadd($amount, $amount_input); + + // Record a line for the bank + // Compute the j_grpt + $seq=$this->db->get_next_seq('s_grpt'); + + $acc_operation=new Acc_Operation($this->db); + $acc_operation->date=$e_date; + $sposte=$fPoste->strAttribut(ATTR_DEF_ACCOUNT); + // if 2 accounts + if (strpos($sposte, ',')!=0) + { + $array=explode(',', $sposte); + if (${"e_other$i"."_amount"}<0) + $poste_val=$array[1]; + else + $poste_val=$array[0]; + } + else + { + $poste_val=$sposte; } - return $ret; - } - /** - * return a string with the bank account, name and quick_code - */ - function get_bank_name() - { - $this->bank_id = $this->db->get_value('select jrn_def_bank from jrn_def where jrn_def_id=$1', array($this->id)); - $fBank = new Fiche($this->db, $this->bank_id); - $e_bank_account = " : " . $fBank->strAttribut(ATTR_DEF_BQ_NO); - $e_bank_name = " : " . $fBank->strAttribut(ATTR_DEF_NAME); - $e_bank_qcode = ": " . $fBank->strAttribut(ATTR_DEF_QUICKCODE); - return $e_bank_qcode . $e_bank_name . $e_bank_account; - } + $acc_operation->poste=$poste_val; + $acc_operation->amount=bcmul($amount_eur, -1); + $acc_operation->grpt=$seq; + $acc_operation->jrn=$p_jrn; + $acc_operation->type='d'; - /** - * return the fiche_id of the bank - */ - function get_bank() - { - $bank_id = $this->db->get_value('select jrn_def_bank from jrn_def where jrn_def_id=$1', array($this->id)); - return $bank_id; - } + if (isset($periode)) + $tperiode=$periode; + else + { + $per=new Periode($this->db); + $tperiode=$per->find_periode($e_date); + } + $acc_operation->periode=$tperiode; + $acc_operation->qcode=${"e_other".$i}; + $j_id_currency=$acc_operation->insert_jrnx(); - /** - * return true is we numbere each operation - */ - function numb_operation() - { - $a = $this->db->get_value('select jrn_def_num_op from jrn_def where jrn_def_id=$1', array($this->id)); - if ($a == 1) - return true; - return false; - } + // -- Insert into Operation Currency + $operation_currency=new Operation_currency_SQL($this->db); + $operation_currency->oc_amount=$amount_input; + $operation_currency->oc_vat_amount=0; + $operation_currency->oc_price_unit=0; + $operation_currency->j_id=$j_id_currency; + $operation_currency->insert(); - /** - * insert into the quant_fin table - * @param integer $bank_id is the f_id of the bank - * @param integer $jr_id is the jrn.jr_id of the operation - * @param integer $other is the f_id of the benefit - * @param integer $amount is the amount - * @param integer $p_j_id is the j_id of the operation - */ - function insert_quant_fin($p_bankid, $p_jrid, $p_otherid, $p_amount,$p_j_id_currency) - { - $sql = "INSERT INTO quant_fin(qf_bank, jr_id, qf_other, qf_amount,j_id) + $acc_operation=new Acc_Operation($this->db); + $acc_operation->date=$e_date; + $sposte=$fBank->strAttribut(ATTR_DEF_ACCOUNT); + + // if 2 accounts, use the first one if DEB otherwise the second one + if (strpos($sposte, ',')!=0) + { + $array=explode(',', $sposte); + if (${"e_other$i"."_amount"}<0) + $poste_val=$array[1]; + else + $poste_val=$array[0]; + } + else + { + $poste_val=$sposte; + } + + $acc_operation->poste=$poste_val; + $acc_operation->amount=$amount_eur; + $acc_operation->grpt=$seq; + $acc_operation->jrn=$p_jrn; + $acc_operation->type='d'; + $acc_operation->periode=$tperiode; + $acc_operation->qcode=$e_bank_account; + $j_id=$acc_operation->insert_jrnx(); + + // -- Insert into Operation Currency + $operation_currency=new Operation_currency_SQL($this->db); + $operation_currency->oc_amount=$amount_input; + $operation_currency->oc_vat_amount=0; + $operation_currency->oc_price_unit=0; + $operation_currency->j_id=$j_id; + $operation_currency->insert(); + + if (sql_string(${"e_other$i"."_comment"})==null) + { + // if comment is blank set a default one + $comment=sprintf(_(" compte : %s a %s "), $fBank->strAttribut(ATTR_DEF_NAME), + $fPoste->strAttribut(ATTR_DEF_NAME) + ); + } + else + { + $comment=strip_tags(${'e_other'.$i.'_comment'}); + } + + + $acc_operation=new Acc_Operation($this->db); + $acc_operation->jrn=$p_jrn; + $acc_operation->amount=abs($amount_eur); + $acc_operation->date=$e_date; + $acc_operation->desc=$comment; + $acc_operation->grpt=$seq; + $acc_operation->periode=$tperiode; + $acc_operation->mt=$mt; + $idx_operation++; + $acc_operation->pj=''; + $acc_operation->currency_id=$this->currency_id; + $acc_operation->currency_rate=$currency_rate; + $acc_operation->currency_rate_ref=$currency_rate; + + if (trim($e_pj)!=''&&$this->numb_operation()==true) + $acc_operation->pj=$e_pj.str_pad($idx_operation, 3, 0, STR_PAD_LEFT); + + if (trim($e_pj)!=''&&$this->numb_operation()==false) + $acc_operation->pj=$e_pj; + + $jr_id=$acc_operation->insert_jrn(); + // $acc_operation->set_pj(); + $this->db->exec_sql('update jrn set jr_pj_number=$1 where jr_id=$2', array($acc_operation->pj, $jr_id)); + $internal=$this->compute_internal_code($seq); + + if (trim(${"e_concerned".$i})!="") + { + if (strpos(${"e_concerned".$i}, ',')!=0) + { + $aRapt=explode(',', ${"e_concerned".$i}); + foreach ($aRapt as $rRapt) + { + // Add a "concerned operation to bound these op.together + // + $rec=new Acc_Reconciliation($this->db); + $rec->set_jr_id($jr_id); + + if (isNumber($rRapt)==1) + { + $rec->insert($rRapt); + try + { + $oppaid=new Acc_Operation($this->db); + $oppaid->set_id($rRapt); + $oppaid->set_paid(); + } + catch (Exception $ex) + { + record_log($ex->getTraceAsString()); + echo _('Attention , erreur Acc_Ledger_Fin::insert , coche paiement'); + } + } + } + } + else + if (isNumber(${"e_concerned".$i})==1) + { + $rec=new Acc_Reconciliation($this->db); + $rec->set_jr_id($jr_id); + $rec->insert(${"e_concerned$i"}); + try + { + $oppaid=new Acc_Operation($this->db); + $oppaid->set_id(${"e_concerned".$i}); + $conc_amount=$oppaid->get_amount(); + if ($conc_amount==$acc_operation->amount) + { + $oppaid->set_paid(); + } + } + catch (Exception $ex) + { + record_log($ex->getTraceAsString()); + echo _('Attention , erreur Acc_Ledger_Fin::insert , coche paiement'); + } + } + } + + // Set Internal code + $this->grpt_id=$seq; + /** + * save also into quant_fin + */ + $this->insert_quant_fin($fBank->id, $jr_id, $fPoste->id, $amount_eur, $j_id_currency); + + if ($g_parameter->MY_ANALYTIC!="nu") + { + // for each item, insert into operation_analytique */ + $op=new Anc_Operation($this->db); + $op->set_currency_rate($currency_rate); + $op->oa_group=$this->db->get_next_seq("s_oa_group"); /* for analytic */ + $op->j_id=$j_id_currency; + $op->oa_date=$e_date; + $op->oa_debit='f'; + $op->oa_description=sql_string($comment); + $op->save_form_plan($_POST, $i, $j_id_currency); + } + + + $this->update_internal_code($internal); + + $js_detail=HtmlInput::detail_op($jr_id, $internal); + // Compute display + $row=td($e_date) + .td($js_detail) + .td(${"e_other$i"}) + .td($fPoste->strAttribut(ATTR_DEF_NAME)) + .td(${"e_other".$i."_comment"}) + .td(nbm(${"e_other$i"."_amount"}), 'class="num"'); + $class=($i%2==0)?' class="even" ':' class="odd" '; + $ret.=tr($row, $class); + + if ($i==0) + { + // first record we upload the files and + // keep variable to update other row of jrn + if (isset($_FILES)) + $oid=$this->db->save_receipt($seq); + } + else + { + if ($oid!=0) + { + $this->db->exec_sql("update jrn set jr_pj=$1 , jr_pj_name=$2, + jr_pj_type=$3 where jr_grpt_id=$4", + array($oid, $_FILES['pj']['name'], $_FILES['pj']['type'], $seq)); + } + } + } // for nbitem + // increment pj + if (strlen(trim($e_pj))!=0) + { + $this->inc_seq_pj(); + } + $ret.=''; + } + catch (Exception $e) + { + $r=''. + 'Erreur dans l\'enregistrement '. + __FILE__.':'.__LINE__.' '. + $e->getMessage(); + $this->db->rollback(); + record_log($e); + throw new Exception($r); + } + $this->db->commit(); + if ($acc_currency->get_id()==0) + { + $r=""; + $r.=sprintf("
"._("Ancien solde %s %s"), nbm($solde), $acc_currency->get_code()); + $new_solde=bcadd($new_solde, $amount); + $r.=sprintf("
"._("Nouveau solde %s %s"), nbm($new_solde), $acc_currency->get_code()); + $ret.=$r; + } + else + { + $solde_cur=$fBank->get_bk_balance_currency(); + $r=""; + $r.=sprintf("
"._("Ancien solde %s %s"), nbm($solde_cur), $acc_currency->get_code()); + $new_solde=bcadd($solde_cur, $amount); + $r.=sprintf("
"._("Nouveau solde %s %s"), nbm($new_solde), $acc_currency->get_code()); + $ret.=$r; + } + return $ret; + } + + /** + * return a string with the bank account, name and quick_code + */ + function get_bank_name() + { + $this->bank_id=$this->db->get_value('select jrn_def_bank from jrn_def where jrn_def_id=$1', array($this->id)); + $fBank=new Fiche($this->db, $this->bank_id); + $e_bank_account=" : ".$fBank->strAttribut(ATTR_DEF_BQ_NO); + $e_bank_name=" : ".$fBank->strAttribut(ATTR_DEF_NAME); + $e_bank_qcode=": ".$fBank->strAttribut(ATTR_DEF_QUICKCODE); + return $e_bank_qcode.$e_bank_name.$e_bank_account; + } + + /** + * return the fiche_id of the bank + */ + function get_bank() + { + $bank_id=$this->db->get_value('select jrn_def_bank from jrn_def where jrn_def_id=$1', array($this->id)); + return $bank_id; + } + + /** + * return true is we numbere each operation + */ + function numb_operation() + { + $a=$this->db->get_value('select jrn_def_num_op from jrn_def where jrn_def_id=$1', array($this->id)); + if ($a==1) + return true; + return false; + } + + /** + * insert into the quant_fin table + * @param integer $bank_id is the f_id of the bank + * @param integer $jr_id is the jrn.jr_id of the operation + * @param integer $other is the f_id of the benefit + * @param integer $amount is the amount + * @param integer $p_j_id is the j_id of the operation + */ + function insert_quant_fin($p_bankid, $p_jrid, $p_otherid, $p_amount, $p_j_id_currency) + { + $sql="INSERT INTO quant_fin(qf_bank, jr_id, qf_other, qf_amount,j_id) VALUES ($1, $2, $3, $4,$5);"; - $this->db->exec_sql($sql, array($p_bankid, $p_jrid, $p_otherid, round($p_amount, 2),$p_j_id_currency)); - } + $this->db->exec_sql($sql, array($p_bankid, $p_jrid, $p_otherid, round($p_amount, 2), $p_j_id_currency)); + } } diff --git a/include/class/fiche.class.php b/include/class/fiche.class.php index 17d3254e4..ee1d95e54 100644 --- a/include/class/fiche.class.php +++ b/include/class/fiche.class.php @@ -1644,6 +1644,8 @@ class Fiche "".td(). "Totaux". td(). + td(). + td(). "".nbm($sum_deb)."". "".nbm($sum_cred)."". td(nbm(abs($progress)).$side,'style="text-align:right"').