db = $cn; $this->jr_id = 0; $this->a_jrn = null; } function set_jr_id($jr_id) { $this->jr_id = $jr_id; } /** * \brief return a widget of type js_concerned */ function widget() { $wConcerned = new IConcerned(); $wConcerned->extra = 0; // with 0 javascript search from e_amount... field (see javascript) return $wConcerned; } /** * \brief Insert into jrn_rapt the concerned operations * * \param $jr_id2 (jrn.jr_id) => jrn_rapt.jra_concerned or a string * like "jr_id2,jr_id3,jr_id4..." * * \return none * */ function insert($jr_id2) { if (trim($jr_id2) == "") return; if (strpos($jr_id2, ',') !== 0) { $aRapt = explode(',', $jr_id2); foreach ($aRapt as $rRapt) { if (isNumber($rRapt) == 1) { $this->insert_rapt($rRapt); } } } else if (isNumber($jr_id2) == 1) { $this->insert_rapt($jr_id2); } } /** * \brief Insert into jrn_rapt the concerned operations * should not be called directly, use insert instead * * \param $jr_id2 (jrn.jr_id) => jrn_rapt.jra_concerned * * \return none * */ function insert_rapt($jr_id2) { if (isNumber($this->jr_id) == 0 || isNumber($jr_id2) == 0) { return false; } if ($this->jr_id == $jr_id2) return true; if ($this->db->count_sql("select jr_id from jrn where jr_id=$1" ,[ $this->jr_id]) == 0) return false; if ($this->db->count_sql("select jr_id from jrn where jr_id=$1",[$jr_id2]) == 0) return false; // verify if exists if ($this->db->count_sql( "select jra_id from jrn_rapt where jra_concerned=$1 and jr_id=$2 union select jra_id from jrn_rapt where jr_id= $1 and jra_concerned=$2 " ,[$this->jr_id,$jr_id2]) == 0) { // Ok we can insert $Res = $this->db->exec_sql("insert into jrn_rapt(jr_id,jra_concerned) values ($1,$2)", array($this->jr_id, $jr_id2) ); // try to letter automatically same account from both operation $this->auto_letter($jr_id2); // update date of paiement ----------------------------------------------------------------------- $source_type = $this->db->get_value("select substr(jr_internal,1,1) from jrn where jr_id=$1", array($this->jr_id)); $dest_type = $this->db->get_value("select substr(jr_internal,1,1) from jrn where jr_id=$1", array($jr_id2)); if (($source_type == 'A' || $source_type == 'V') && ($dest_type != 'A' && $dest_type != 'V')) { // set the date on source $date = $this->db->get_value('select jr_date from jrn where jr_id=$1', array($jr_id2)); if (trim($date) == '') $date = null; $this->db->exec_sql('update jrn set jr_date_paid=$1 where jr_id=$2 and jr_date_paid is null ', array($date, $this->jr_id)); } if (($source_type != 'A' && $source_type != 'V') && ($dest_type == 'A' || $dest_type == 'V')) { // set the date on dest $date = $this->db->get_value('select jr_date from jrn where jr_id=$1', array($this->jr_id)); if (trim($date) == '') $date = null; $this->db->exec_sql('update jrn set jr_date_paid=$1 where jr_id=$2 and jr_date_paid is null ', array($date, $jr_id2)); } } return true; } /** * @brief try to letter same card between $p_jrid and $this->jr_id * @param jrn.jr_id $p_jrid the operation to reconcile */ function auto_letter($p_jrid) { // Try to find same card from both operation $sql = "select j1.f_id as fiche ,coalesce(j1.j_id,-1) as jrnx_id1,coalesce(j2.j_id,-1) as jrnx_id2, j1.j_poste as poste from jrnx as j1 join jrn as jr1 on (j1.j_grpt=jr1.jr_grpt_id) join jrnx as j2 on (coalesce(j1.f_id,-1)=coalesce(j2.f_id,-1) and j1.j_poste=j2.j_poste) join jrn as jr2 on (j2.j_grpt=jr2.jr_grpt_id) where jr1.jr_id=$1 and jr2.jr_id= $2"; $result = $this->db->get_array($sql, array($this->jr_id, $p_jrid)); if (count($result) == 0) { return; } for ($i = 0; $i < count($result); $i++) { if ($result[$i]['fiche'] != -1) { $letter = new Lettering_Card($this->db); $letter->insert_couple($result[$i]['jrnx_id1'], $result[$i]['jrnx_id2']); } else { $letter = new Lettering_Account($this->db); $letter->insert_couple($result[$i]['jrnx_id1'], $result[$i]['jrnx_id2']); } } } /** * \brief Insert into jrn_rapt the concerned operations * * \param $this->jr_id (jrn.jr_id) => jrn_rapt.jr_id * \param $jr_id2 (jrn.jr_id) => jrn_rapt.jra_concerned * * \return none */ function remove($jr_id2) { if (isNumber($this->jr_id) == 0 or isNumber($jr_id2) == 0) { return; } // verify if exists if ($this->db->count_sql("select jra_id from jrn_rapt where " . " jra_concerned=" . $this->jr_id . " and jr_id=$jr_id2 union select jra_id from jrn_rapt where jra_concerned=$jr_id2 " . " and jr_id=" . $this->jr_id) != 0) { /** * remove also lettering between both operation */ $sql = " delete from jnt_letter where jl_id in ( select jl_id from jnt_letter join letter_cred as lc using(jl_id) join letter_deb as ld using (jl_id) where lc.j_id in (select j_id from jrnx join jrn on (j_grpt=jr_grpt_id) where jr_id in ($1,$2)) or ld.j_id in (select j_id from jrnx join jrn on (j_grpt=jr_grpt_id) where jr_id in ($1,$2)) )"; $this->db->exec_sql($sql, array($jr_id2, $this->jr_id)); // Ok we can delete $Res = $this->db->exec_sql("delete from jrn_rapt where (jra_concerned=$1 and jr_id= $2) or (jra_concerned=$2 and jr_id=$1) ", [$jr_id2,$this->jr_id]); } } /** * \brief Return an array of the concerned operation * * * \param database connection * \return array if something is found or null */ function get() { $sql = " select jr_id as cn from jrn_rapt where jra_concerned=$1 union select jra_concerned as cn from jrn_rapt where jr_id=$2"; $Res = $this->db->exec_sql($sql, array($this->jr_id, $this->jr_id)); // If nothing is found return null $n = Database::num_row($Res); if ($n == 0) return []; // put everything in an array for ($i = 0; $i < $n; $i++) { $l = Database::fetch_array($Res, $i); $r[$i] = $l['cn']; } return $r; } /** * @deprecated since version 9307 * @brief retrieve row from JRN * @return type */ function fill_info() { $sql = "select jr_id,jr_date,jr_comment,jr_internal,jr_montant,jr_pj_number,jr_def_id,jrn_def_name,jrn_def_type from jrn join jrn_def on (jrn_def_id=jr_def_id) where jr_id=$1"; $a = $this->db->get_array($sql, array($this->jr_id)); return $a[0]; } /** * @brief return array of not-reconciled operation * Prepare and put in memory the SQL detail_quant */ function get_not_reconciled() { $this->build_temp_total_operation(); $filter_date = $this->filter_date(); /* create ledger filter */ $sql_jrn = $this->ledger_filter(); $array = $this->db->get_array(" with total_operation as ( select jn2.jr_id,coalesce(sum(qs_price+qs_vat-qs_vat_sided),0)+coalesce(sum(qp_price+qp_vat-qp_vat_sided+qp.qp_nd_tva + qp.qp_nd_tva_recup),0) sum_amount from jrnx jx1 join jrn jn2 on (jn2.jr_grpt_id =jx1.j_grpt ) left join quant_sold qs on (jx1.j_id=qs.j_id) left join quant_purchase qp on (qp.j_id =jx1.j_id) group by jn2.jr_id) ,tiers as ( select j_id,qf_other tiers_id from quant_fin union select j_id,qs_client from quant_sold qs union select j_id,qp_supplier from quant_purchase ) select distinct jr1.jr_id jr1_jr_id ,null ra1_jra_concerned ,jr1.jr_date jr1_jr_date ,to_char(jr1.jr_date,'DD.MM.YY') as str_jr1_jr_date ,jr1.jr_comment jr1_jr_comment ,jr1.jr_internal jr1_jr_internal ,jr1.jr_montant jr1_jr_montant ,case when to1.sum_amount=0 then jr1.jr_montant else to1.sum_amount end to1_sum_amount ,jr1.jr_pj_number jr1_jr_pj_number ,jr1.jr_def_id jr1_jr_def_id ,jrn1.jrn_def_name jrn1_jrn_def_name ,jrn1.jrn_def_type jrn1_jrn_def_type ,null jr2_jr_date ,null str_jr2_jr_date ,null jr2_jr_comment ,null jr2_jr_internal ,null jr2_jr_montant ,null to2_sum_amount ,null jr2_jr_pj_number ,null jr2_jr_def_id ,null jrn2_jrn_def_name ,null jrn2_jrn_def_type ,0 depend_count ,(select fd1.ad_value from fiche_detail fd1 where fd1.ad_id=1 and fd1.f_id=t3.tiers_id) as tiers_name ,(select fd1.ad_value from fiche_detail fd1 where fd1.ad_id=23 and fd1.f_id=t3.tiers_id) as tiers_qcode from jrn jr1 join total_operation to1 on (to1.jr_id=jr1.jr_id) join jrn_def jrn1 on (jrn1.jrn_def_id=jr1.jr_def_id) left join (select t2.tiers_id,j2.j_grpt from tiers t2 join jrnx j2 on (t2.j_id=j2.j_id) ) as t3 on (t3.j_grpt=jr1.jr_grpt_id ) where $filter_date and $sql_jrn and jr1.jr_id not in (select jr_id from jrn_rapt union select jra_concerned from jrn_rapt) order by jr_date "); return $array; } /** * @brief Create a sql condition to filter by security and by asked ledger * based on $this->a_jrn * @return a valid sql stmt to include * @see get_not_reconciled get_reconciled */ function ledger_filter() { global $g_user; /* get the available ledgers for current user */ $sql = $g_user->get_ledger_sql('ALL', 3); $sql = noalyss_str_replace('jrn_def_id', 'jr_def_id', $sql); $r = ''; /* filter by this->r_jrn */ if (!empty($this->a_jrn) && is_array($this->a_jrn)) { $sep = ''; $r = 'and jr_def_id in ('; foreach ($this->a_jrn as $key => $value) { $r .= $sep . $value; $sep = ','; } $r .= ')'; } return $sql . ' ' . $r; } /** * @brief build a temporary table with all operation + dependencies * @return type */ function build_temp_total_operation() { static $done=false; if ( $done ) { return; } global $g_user; $filter_date = str_replace("jr_date", "jr1.jr_date", $this->filter_date()); /* create ledger filters */ $sql_jrn = $this->ledger_filter(); $sql_jrn1 = str_replace("jr_def_id", "jr1.jr_def_id", $sql_jrn); /* security on the ledger */ $sql = $g_user->get_ledger_sql('ALL', 3); $sql_jrn2 = noalyss_str_replace('jrn_def_id', 'jr2.jr_def_id', $sql); $sql_string = Acc_Reconciliation::SQL_ALL_OPERATION_RECONCILIED; $sql_string = str_replace("FILTER_DATE", $filter_date, $sql_string); $sql_string = str_replace("LEDGER_FILTER1", $sql_jrn1, $sql_string); $sql_string = str_replace("LEDGER_FILTER2", $sql_jrn2, $sql_string); try { $this->db->exec_sql(" create temporary table temp_total_operation as $sql_string"); $done=true; } catch (Exception $exc) { echo $exc->getMessage(); return; } } /** * @brief return array of reconciled operation * Prepare and put in memory the SQL detail_quant * @return * @note * @see @code @endcode */ function get_reconciled() { $this->build_temp_total_operation(); $sql_amount = Acc_Reconciliation::SQL_QUERY; $a_row = $this->db->get_array("$sql_amount order by jr1_jr_date"); return $a_row; } /** * @brief * Prepare and put in memory the SQL detail_quant * @param * @return * @note * @see @code @endcode */ function get_reconciled_amount($p_equal = false) { // build temporary table temp_total_operation $this->build_temp_total_operation(); // SQL with different amount $sql_amount = Acc_Reconciliation::SQL_QUERY; if ($p_equal) { $sql_amount = $sql_amount . " where bs1.depend_sum_amount = to1_sum_amount "; } else { $sql_amount = $sql_amount . " where bs1.depend_sum_amount != to1_sum_amount"; } $a_row = $this->db->get_array("$sql_amount order by jr1_jr_date"); return $a_row; } /** * @brief create a string to filter thanks the date * @return a sql string like jr_date > ... and jr_date < .... * @note use the data member start_day and end_day * @see get_reconciled get_not_reconciled */ function filter_date() { global $g_user; $g_user->db=$this->db; list($start, $end) = $g_user->get_limit_current_exercice(); if (isDate($this->start_day) == null) { $this->start_day = $start; } if (isDate($this->end_day) == null) { $this->end_day = $end; } $sql = " (jr_date >= to_date('" . $this->start_day . "','DD.MM.YYYY') and jr_date <= to_date('" . $this->end_day . "','DD.MM.YYYY'))"; return $sql; } /** * @deprecated since version 9307 */ function show_detail($p_ret) { if (Database::num_row($p_ret) > 0) { echo '