db=$p_cn; $this->id=$p_id; } /** *@brief get the row thanks the resource *@return double array (j_date,deb_montant,cred_montant,description,jrn_name,j_debit,jr_internal) * (tot_deb,tot_credit) */ private function get_row_sql($Res) { $array=array(); $tot_cred=0.0; $tot_deb=0.0; $Max=Database::num_row($Res); if ( $Max == 0 ) return null; for ($i=0;$i<$Max;$i++) { $array[]=Database::fetch_array($Res,$i); if ($array[$i]['j_debit']=='t') { $tot_deb+=$array[$i]['deb_montant'] ; } else { $tot_cred+=$array[$i]['cred_montant'] ; } } $this->row=$array; $this->tot_deb=$tot_deb; $this->tot_cred=$tot_cred; return array($array,$tot_deb,$tot_cred); } /*! * \brief Get data for accounting entry between 2 periode * * \param $p_from periode from * \param $p_to end periode * \return double array (j_date,deb_montant,cred_montant,description,jrn_name,j_debit,jr_internal) * (tot_deb,tot_credit * */ function get_row($p_from,$p_to) { $periode=sql_filter_per($this->db,$p_from,$p_to,'p_id','jr_tech_per'); $Res=$this->db->exec_sql("select distinct j_id,jr_id,to_char(j_date,'DD.MM.YYYY') as j_date_fmt,j_date,". "case when j_debit='t' then j_montant else 0 end as deb_montant,". "case when j_debit='f' then j_montant else 0 end as cred_montant,". " jr_comment as description,jrn_def_name as jrn_name,". "j_debit, jr_internal,jr_pj_number ". " from jrnx left join jrn_def on jrn_def_id=j_jrn_def ". " left join jrn on jr_grpt_id=j_grpt". " where j_poste=".$this->id." and ".$periode. " order by j_date"); return $this->get_row_sql($Res); } /*! * \brief Get data for accounting entry between 2 date * * \param $p_from date from * \param $p_to end date *\note the data are filtered by the access of the current user * \return double array (j_date,deb_montant,cred_montant,description,jrn_name,j_debit,jr_internal) * (tot_deb,tot_credit * */ function get_row_date($p_from,$p_to,$let=0) { $user=new User($this->db); $filter_sql=$user->get_ledger_sql('ALL',3); $sql_let=''; switch ($let) { case 0: break; case 1: $sql_let=' and j_id in (select j_id from letter_cred union select j_id from letter_deb)'; break; case '2': $sql_let=' and j_id not in (select j_id from letter_cred union select j_id from letter_deb) '; break; } $Res=$this->db->exec_sql("select jr_id,to_char(j_date,'DD.MM.YYYY') as j_date_fmt,j_date,". "case when j_debit='t' then j_montant else 0 end as deb_montant,". "case when j_debit='f' then j_montant else 0 end as cred_montant,". " jr_comment as description,jrn_def_name as jrn_name,". "j_debit, jr_internal,jr_pj_number,coalesce(comptaproc.get_letter_jnt(j_id),-1) as letter ". ",pcm_lib ". " from jrnx left join jrn_def on (jrn_def_id=j_jrn_def )". " left join jrn on (jr_grpt_id=j_grpt)". " left join tmp_pcmn on (j_poste=pcm_val)". " where j_poste=$1 and ". " ( to_date($2,'DD.MM.YYYY') <= j_date and ". " to_date($3,'DD.MM.YYYY') >= j_date )". " and $filter_sql $sql_let ". " order by j_date,substring(jr_pj_number,'\\\\d+$') asc",array($this->id,$p_from,$p_to)); return $this->get_row_sql($Res); } /*!\brief Return the name of a account * it doesn't change any data member * \return string with the pcm_lib */ function get_name() { $ret=$this->db->exec_sql( "select pcm_lib from tmp_pcmn where pcm_val=$1",array($this->id)); if ( Database::num_row($ret) != 0) { $r=Database::fetch_array($ret); $this->name=$r['pcm_lib']; } else { $this->name="Poste inconnu"; } return $this->name; } /*!\brief check if the poste exist in the tmp_pcmn *\return the number of line (normally 1 or 0) */ function do_exist() { $sql="select pcm_val from tmp_pcmn where pcm_val= $1"; $ret=$this->db->exec_sql($sql,array($this->id)); return Database::num_row($ret) ; } /*!\brief Get all the value for this object from the database * the data member are set * \return false if this account doesn't exist otherwise true */ function load() { $ret=$this->db->exec_sql("select pcm_lib,pcm_val_parent from tmp_pcmn where pcm_val=$1",array($this->id)); $r=Database::fetch_all($ret); if ( ! $r ) return false; $this->label=$r[0]['pcm_lib']; $this->parent=$r[0]['pcm_val_parent']; return true; } /*!\brief Get all the value for this object from the database * the data member are set * \return false if this account doesn't exist otherwise true */ function get() { echo "OBSOLETE Acc_Account_Ledger->get(), a remplacer par Acc_Account_Ledger->load()"; return $this->load(); } /*! * \brief give the balance of an account * * \return * balance of the account * */ function get_solde($p_cond=" true ") { $Res=$this->db->exec_sql("select sum(deb) as sum_deb, sum(cred) as sum_cred from ( select j_poste, case when j_debit='t' then j_montant else 0 end as deb, case when j_debit='f' then j_montant else 0 end as cred from jrnx join tmp_pcmn on j_poste=pcm_val where j_poste::text like ('$this->id'::text) and $p_cond ) as m "); $Max=Database::num_row($Res); if ($Max==0) return 0; $r=Database::fetch_array($Res,0); return abs($r['sum_deb']-$r['sum_cred']); } /*! * \brief give the balance of an account * \return * balance of the account * */ function get_solde_detail($p_cond="") { if ( $p_cond != "") $p_cond=" and ".$p_cond; $sql="select sum(deb) as sum_deb, sum(cred) as sum_cred from ( select j_poste, case when j_debit='t' then j_montant else 0 end as deb, case when j_debit='f' then j_montant else 0 end as cred from jrnx where j_poste::text like ('$this->id'::text) $p_cond ) as m "; $Res=$this->db->exec_sql($sql); $Max=Database::num_row($Res); if ($Max==0) { return array('debit'=>0, 'credit'=>0, 'solde'=>0) ; } $r=Database::fetch_array($Res,0); // if p_start is < p_end the query returns null to avoid any problem // we set it to 0 if ($r['sum_deb']=='') $r['sum_deb']=0.0; if ($r['sum_cred']=='') $r['sum_cred']=0.0; return array('debit'=>$r['sum_deb'], 'credit'=>$r['sum_cred'], 'solde'=>abs($r['sum_deb']-$r['sum_cred'])); } /*! * \brief isTva tell is a poste is used for VAT * \param none * * * \return 1 is Yes otherwise 0 */ function isTVA() { // Load TVA array $a_TVA=$this->db->get_array('select tva_poste from tva_rate'); foreach ( $a_TVA as $line_tva) { if ( $line_tva['tva_poste'] == '' ) continue; list($tva_deb,$tva_cred)=explode(',',$line_tva['tva_poste']); if ( $this->id == $tva_deb || $this->id == $tva_cred ) { return 1; } } return 0; } /*! * \brief HtmlTable, display a HTML of a poste for the asked period * \param $p_array array for filter * \param $let lettering of operation 0 * \return -1 if nothing is found otherwise 0 */ function HtmlTable($p_array=null,$let=0 ) { if ( $p_array==null)$p_array=$_REQUEST; $this->get_name(); list($array,$tot_deb,$tot_cred)=$this->get_row_date( $p_array['from_periode'], $p_array['to_periode'],$let ); if ( count($this->row ) == 0 ) return -1; $rep=""; echo '
| Date | ". "n° de pièce | ". "Code interne | ". "Description | ". "Débit | ". "Crédit | ". th('Prog.','style="text-align:right"'). th('Let.','style="text-align:right"'); "
|---|---|---|---|---|---|
| ".format_date($op['j_date'])." | ". td(h($op['jr_pj_number'])). "".$vw_operation." | ". "".h($op['description'])." | ". "".nbm($op['deb_montant'])." | ". "".nbm($op['cred_montant'])." | ". td(nbm(abs($progress)),'style="text-align:right"'). td($let,' style="color:red;text-align:right"'). "|
| Totaux | ". " | ". " | ". " | ".nbm($tot_deb)." | ". "".nbm($tot_cred)." | ". "
| $solde_type | ". " | ".nbm($diff)." | ". "