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) { global $g_user; 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 */ 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(); 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 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); 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 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); 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, $notused = 0) { global $g_parameter, $g_user; if ($p_array != null) extract($p_array); $pview_only = false; $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 = ($g_user->check_action(FICADD) == 1) ? $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($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) { echo "Aucune période ouverte"; exit(); } } $label = HtmlInput::infobulle(3); $f_period = "Période comptable $label" . $l_form_per; } // Ledger (p_jrn) //-- $add_js = 'onchange="update_pj();update_bank();get_last_date();ajax_saldo(\'first_sold\');update_name();"'; if ($g_parameter->MY_DATE_SUGGEST == 'Y') $add_js = 'onchange="update_pj();update_bank();get_last_date();ajax_saldo(\'first_sold\')";'; $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() . ''; 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 = 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_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->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(); // 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->readOnly = true; $array[$i]['cname'] = $wcard_name->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->amount_id = "e_other" . $i . "_amount"; $wConcerned->paid = '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, $p_nothing = 0) { global $g_parameter; $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','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; } /* !\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); $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); // 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 . "')"; $solde = $acc_account->get_solde($filter_year); $new_solde = $solde; } try { $this->db->start(); $amount = 0.0; $idx_operation = 0; $ret = '