Bug : ven-3 duplicate does not work with currency : incorrect amount

This commit is contained in:
sparkyx 2024-07-12 17:37:02 +02:00
parent 891fa1a2a9
commit 5157ee35b8
2 changed files with 213 additions and 42 deletions

View file

@ -266,7 +266,8 @@ EOF;
return $sum;
}
/*!\brief set the pj of a operation in jrn. the jr_id must be set
/*!
*\brief set the pj of a operation in jrn. the jr_id must be set
*\note if the jr_id it fails
*/
function set_pj()
@ -394,7 +395,8 @@ EOF;
$this->jr_internal= $l_line['jr_internal'];
return $this->jr_internal;
}
/*!\brief search an operation thankx it internal code
/*!
* \brief search an operation thankx it internal code
* \param internal code
* \return 0 ok -1 nok
*/
@ -406,10 +408,11 @@ EOF;
$this->jr_id=Database::fetch_result($res,0,0);
return 0;
}
/*!\brief retrieve data from jrnx
*\note the data are filtered by the access of the current user
* \return an array or FALSE if nothing found
*/
/*!
* \brief retrieve data from jrnx
*\note the data are filtered by the access of the current user
* \return an array or FALSE if nothing found
*/
function get_jrnx_detail()
{
global $g_user;
@ -848,8 +851,6 @@ EOF;
}
static function test_me()
{
$_SESSION[SESSION_KEY.'g_user']=NOALYSS_ADMINISTRATOR;
$_SESSION[SESSION_KEY.'g_pass']='dany';
global $g_user;
$cn=Dossier::connect();
$g_user=new Noalyss_user($cn);
@ -881,7 +882,12 @@ EOF;
return $type_operation;
}
/**
* @brief create a form to recreate the operation and returns it, just like a correct
* @brief create a form to recreate the operation and returns it,
* it works the same as when you want to correct an operation instead of confirming
*
* @see compta_ach.inc.php
* @see compta_ven.inc.php
*
* @param $p_id string DOMID of the form
*/
function form_clone_operation($p_id) {
@ -903,12 +909,22 @@ EOF;
"ac"=>$a_code[0]['code'],"gDossier"=>Dossier::id()
]));
$r.=Dossier::hidden();
$default_currency=new Acc_Currency($this->db,0);
// select the menu where the operation will be duplicated
$r.="<p>";
$r.="<ul style=\"margin-left:2rem;padding-left:0;list-style:none;\">";
$r.=sprintf("<li>%s</li>",$operation->det->jr_pj_number);
$r.=sprintf("<li>%s</li>",$operation->det->jr_comment);
$r.=sprintf("<li>%s</li>",$operation->det->jr_montant);
$r.=sprintf("<li>%s %s</li>",_("Date"),$operation->det->jr_pj_number);
$r.=sprintf("<li>%s %s</li>",_("Libellé"),$operation->det->jr_comment);
$r.=sprintf("<li>%s %s %s</li>",_("Montant "),nbm($operation->det->jr_montant),$default_currency->get_code());
// Add info if the operation using a currency
if ( $operation->det->currency_id != 0 ) {
$currency=$this->db->get_value("select cr_code_iso from currency where id=$1",[$operation->det->currency_id]);
$r.=sprintf("<li>%s %s</li>",_('Devise'),$currency);
$r.=sprintf("<li>%s %s</li>",_("Taux"),$operation->det->currency_rate);
$array['p_currency_code']=$operation->det->currency_id;
$array['p_currency_rate']=$operation->det->currency_rate;
}
$r.="</ul>";
$r.="</p>";
if (count($a_code) == 1 ) {
@ -930,31 +946,52 @@ EOF;
$r.="</p>";
// For Misc Operation , if a card is given then there is no accounting
// modify amount with currency if not in default currency
if ( $operation->signature==="ODS") {
$nb_array = count($array);
for ($i = 0; $i < $nb_array; $i++) {
if (isset ($array["qc_" . $i]) && $array["qc_" . $i] != "") {
$array["poste" . $i] = "";
}
if ($operation->det->currency_id != 0) {
$array['amount'. $idx] = $item['oc_amount'];
$idx++;
}
}
}
if ( $operation->signature==="ACH" || $operation->signature=="VEN") {
}elseif ( $operation->signature==="ACH" || $operation->signature=="VEN") {
$idx=0;
foreach ($operation->det->array as $item) {
// currency replace amount
if ($operation->det->currency_id != 0 ) {
$array['e_march'.$idx.'_tva_amount']=$item['oc_vat_amount'];
$array['e_march'.$idx.'_tva_amount']=$item['oc_amount'];
$array['e_march'.$idx.'_price']=$item['oc_price_unit'];
}
if ( isset ($item['qs_vat_sided']) && $item['qs_vat_sided'] != 0 ) {
$array['e_march'.$idx.'_tva_amount']=0;
}elseif (isset ($item['qp_vat_sided']) && $item['qp_vat_sided'] != 0 ){
$array['e_march'.$idx.'_tva_amount']=0;
}
$idx++;
}
if ( DEBUGNOALYSS>1) {
echo \Noalyss\Dbg::hidden_info("operation->det_array", $operation->det->array);
echo \Noalyss\Dbg::hidden_info("array", $array);
}elseif ($operation->signature=='FIN') {
$idx=0;
foreach ($operation->det->array as $item) {
if ($operation->det->currency_id != 0) {
$array['e_other' . $idx . '_amount'] = $item['oc_amount'];
$idx++;
}
}
}
if ( DEBUGNOALYSS>1) {
echo \Noalyss\Dbg::hidden_info("operation->det_array", $operation->det->array);
echo \Noalyss\Dbg::hidden_info("operation->det", $operation->det);
echo \Noalyss\Dbg::hidden_info("array", $array);
}
// transform the operation into hidden element
$r.=HtmlInput::simple_array_to_hidden($array);
$r.=HtmlInput::hidden("e_comm",$operation->det->jr_comment);
@ -1018,7 +1055,7 @@ class Acc_Detail extends Acc_Operation
$array['e_ech']="";
$array['p_jrn']=$this->det->jr_def_id;
return $array;
}
}
/////////////////////////////////////////////////////////////////////////////
@ -1041,10 +1078,30 @@ class Acc_Misc extends Acc_Detail
function get()
{
parent::get();
$sql="SELECT j_id, j_date, j_montant, j_poste, j_grpt, j_rapt, j_jrn_def,
j_debit, j_text, j_centralized, j_internal, j_tech_user, j_tech_date,
j_tech_per, j_qcode,f_id
FROM jrnx where j_grpt = $1 order by j_debit desc,j_poste";
$sql="
SELECT jx1.j_id
,jx1.j_date
,jx1.j_montant
,jx1.j_poste
,jx1.j_grpt
,jx1.j_rapt
,jx1.j_jrn_def
,jx1.j_debit
,jx1.j_text
,jx1.j_centralized
,jx1.j_internal
,jx1.j_tech_user
,jx1.j_tech_date
,jx1.j_tech_per
,jx1.j_qcode
,jx1.f_id
,oc1.oc_amount
FROM jrnx jx1
left join operation_currency oc1 using(j_id)
where
jx1.j_grpt = $1
order by jx1.j_debit desc,jx1.j_poste
";
$this->det->array=$this->db->get_array($sql,array($this->det->jr_grpt_id));
}
/***
@ -1090,13 +1147,33 @@ class Acc_Sold extends Acc_Detail
function get()
{
parent::get();
$sql="SELECT qs_id, qs_internal, qs_fiche, qs_quantite, qs_price, qs_vat,
qs_vat_code, qs_client, qs_valid, j_id,j_text,qs_vat_sided , qs_unit , j_debit
FROM quant_sold join jrnx using(j_id) where j_grpt=$1 order by j_id";
$sql="
select qs_id, qs_internal
, jx1.j_id
, qs1.qs_fiche
, qs1.qs_quantite
, qs1.qs_price
, qs1.qs_vat
, qs1.qs_vat_code
, qs1.qs_client
, qs1.qs_valid
, jx1.j_text
, qs_vat_sided
, qs_unit
, jx1.j_debit
,oc1.oc_amount
,oc1.oc_vat_amount
,oc1.oc_price_unit
from quant_sold qs1
join jrnx jx1 using(j_id)
left join operation_currency oc1 using(j_id)
where jx1.j_grpt = $1
order by jx1.j_id;
";
$this->det->array=$this->db->get_array($sql,array($this->det->jr_grpt_id));
}
/***
* Compute an array for using with Acc_Ledger::insert
* @brief Compute an array for using with Acc_Ledger::insert
*
*/
function compute_array()
@ -1145,14 +1222,39 @@ class Acc_Purchase extends Acc_Detail
function get()
{
parent::get();
$sql="SELECT qp_id, qp_internal, j_id, qp_fiche, qp_quantite, qp_price, qp_vat,
qp_vat_code, qp_nd_amount, qp_nd_tva, qp_nd_tva_recup, qp_supplier,
qp_valid, qp_dep_priv,j_text,qp_vat_sided,qp_unit , j_debit
FROM quant_purchase join jrnx using(j_id) where j_grpt=$1 order by j_id";
$sql="
select qp_id, qp_internal
, jx1.j_id
, qp1.qp_fiche
, qp1.qp_quantite
, qp1.qp_price
, qp1.qp_vat
, qp1.qp_vat_code
, qp1.qp_nd_amount
, qp1.qp_nd_tva
, qp1.qp_nd_tva_recup
, qp1.qp_supplier
, qp1.qp_valid
, qp1.qp_dep_priv
, jx1.j_text
, qp1.qp_vat_sided
, qp1.qp_unit
, jx1.j_debit
,oc1.oc_amount
,oc1.oc_vat_amount
,oc1.oc_price_unit
from quant_purchase qp1
join jrnx jx1 using(j_id)
left join operation_currency oc1 using(j_id)
where jx1.j_grpt = $1
order by jx1.j_id
";
$this->det->array=$this->db->get_array($sql,array($this->det->jr_grpt_id));
}
/***
* Compute an array for using with Acc_Ledger::insert
* @brief Compute an array for using with Acc_Ledger::insert
*
*/
function compute_array()
@ -1175,9 +1277,11 @@ class Acc_Purchase extends Acc_Detail
$array["e_march".$i."_tva_id"]=$this->det->array[$i]['qp_vat_code'];
$array["e_march".$i."_tva_amount"]=$this->det->array[$i]['qp_vat'];
$array["e_quant".$i]=$this->det->array[$i]['qp_quantite'];
}
$array['correct']=1;
return $array;
return $array;
}
@ -1201,8 +1305,18 @@ class Acc_Fin extends Acc_Detail
function get()
{
parent::get();
$sql="SELECT qf_id, qf_bank, jr_id, qf_other, qf_amount,j_id
FROM quant_fin where jr_id = $1";
$sql="SELECT qf_id
,qf_bank
,jr_id
,qf_other
,qf_amount,j_id
,oc1.oc_amount
,oc1.oc_vat_amount
,oc1.oc_price_unit
FROM quant_fin
left join operation_currency oc1 using(j_id)
where
jr_id = $1";
$this->det->array=$this->db->get_array($sql,array($this->jr_id));
}
/***

View file

@ -134,7 +134,9 @@ class Acc_OperationTest extends TestCase
function testForm_clone_operation_sale()
{
global $g_connection;
//-----------------------------------
// use jr_id=160 : 5 rows
//-----------------------------------
$duplicate = new Acc_Operation($g_connection);
$duplicate->jr_id=160;
ob_start();
@ -142,8 +144,10 @@ class Acc_OperationTest extends TestCase
$result=$duplicate->form_clone_operation("test");
ob_end_clean();
$this->assertTrue(stripos($result,'<input type="hidden" id="nb_item" name="nb_item" value="5">')>0, "sale : HTML doesn't contain nb_item = 5");
$this->assertTrue(stripos($result,'<input type="hidden" id="nb_item" name="nb_item" value="5">')>0, "jr_id = ".$duplicate->jr_id." sale : HTML doesnt contain nb_item = 5");
//-----------------------------------
// use jr_id=910 : 1 rows
//-----------------------------------
$duplicate = new Acc_Operation($g_connection);
$duplicate->jr_id=910;
ob_start();
@ -152,9 +156,11 @@ class Acc_OperationTest extends TestCase
$this->assertStringContainsString(strtoupper('<input type="hidden" id="nb_item" name="nb_item" value="1">'), strtoupper($result));
$this->assertStringContainsString(
strtoupper('<input type="hidden" id="e_march0" name="e_march0" value="DEPLAC">')
,strtoupper($result));
,strtoupper($result),"jr_id = ".$duplicate->jr_id."");
//-----------------------------------
// use jr_id=659 VAT_SIDED
//-----------------------------------
$duplicate = new Acc_Operation($g_connection);
$duplicate->jr_id=659;
ob_start();
@ -162,14 +168,31 @@ class Acc_OperationTest extends TestCase
ob_end_clean();
$this->assertStringContainsString(
strtoupper('<input type="hidden" id="e_march0_tva_id" name="e_march0_tva_id" value="5">')
, strtoupper($result));
, strtoupper($result),"jr_id = ".$duplicate->jr_id."");
$this->assertStringContainsString(
strtoupper('<input type="hidden" id="e_march0_tva_amount" name="e_march0_tva_amount" value="0">')
, strtoupper($result));
, strtoupper($result),"jr_id = ".$duplicate->jr_id."");
$this->assertStringContainsString(
strtoupper( '<input type="hidden" id="e_march1_tva_amount" name="e_march1_tva_amount" value="17.3500">')
, strtoupper($result));
strtoupper( '<input type="hidden" id="e_march1_tva_amount" name="e_march1_tva_amount" value="88.392500">')
, strtoupper($result),"jr_id = ".$duplicate->jr_id."");
//-----------------------------------
// use jr_id=in another currency
//-----------------------------------
$duplicate = new Acc_Operation($g_connection);
$duplicate->jr_id=657;
ob_start();
$result=$duplicate->form_clone_operation("test");
ob_end_clean();
$this->assertStringContainsString(
strtoupper('<input type="hidden" id="p_currency_code" name="p_currency_code" value="1">')
, strtoupper($result),"jr_id = ".$duplicate->jr_id."");
$this->assertStringContainsString(
strtoupper('<input type="hidden" id="p_currency_rate" name="p_currency_rate" value="1.090000">')
, strtoupper($result),"jr_id = ".$duplicate->jr_id."");
$this->assertStringContainsString(
strtoupper( '<input type="hidden" id="e_march0_price" name="e_march0_price" value="20.000000">')
, strtoupper($result),"jr_id = ".$duplicate->jr_id."");
}
/**
@ -178,7 +201,9 @@ class Acc_OperationTest extends TestCase
*/
function testForm_clone_operation_purchase()
{ global $g_connection;
//-----------------------------------
// use jr_id 158 4 rows
//-----------------------------------
$duplicate = new Acc_Operation($g_connection);
$duplicate->jr_id=158;
ob_start();
@ -196,8 +221,9 @@ class Acc_OperationTest extends TestCase
$this->assertStringContainsString(
strtoupper('<input type="hidden" id="e_march3" name="e_march3" value="DOCUME">')
,strtoupper($result));
//-----------------------------------
// use jr_id 680 VAT_SIDED
//-----------------------------------
$duplicate = new Acc_Operation($g_connection);
$duplicate->jr_id=680;
ob_start();
@ -213,6 +239,23 @@ class Acc_OperationTest extends TestCase
$this->assertStringContainsString(
strtoupper('<input type="hidden" id="e_march1_tva_id" name="e_march1_tva_id" value="4">'),$result);
//-----------------------------------
// use jr_id=in another currency
//-----------------------------------
$duplicate = new Acc_Operation($g_connection);
$duplicate->jr_id=683;
ob_start();
$result=$duplicate->form_clone_operation("test");
ob_end_clean();
$this->assertStringContainsString(
strtoupper('<input type="hidden" id="p_currency_code" name="p_currency_code" value="1">')
, strtoupper($result));
$this->assertStringContainsString(
strtoupper('<input type="hidden" id="p_currency_rate" name="p_currency_rate" value="1.090000">')
, strtoupper($result));
$this->assertStringContainsString(
strtoupper( '<INPUT TYPE="HIDDEN" ID="E_MARCH0_PRICE" NAME="E_MARCH0_PRICE" VALUE="18.250000">')
, strtoupper($result));
}
/**
* @testDox Test form_clone_operation MISC OP
@ -253,6 +296,20 @@ class Acc_OperationTest extends TestCase
$this->assertStringContainsString(
strtoupper('<input type="hidden" id="e_other0_amount" name="e_other0_amount" value="3500.7800">') ,
$result);
//-----------------------------------
// use jr_id=in another currency
//----------------------------------
$duplicate->jr_id=658;
ob_start();
$result=strtoupper($duplicate->form_clone_operation("test"));
ob_end_clean();
$this->assertStringContainsString(
strtoupper('<input type="hidden" id="e_other0_amount" name="e_other0_amount" value="146.950000">') ,
$result);
$this->assertStringContainsString(
strtoupper('<INPUT TYPE="HIDDEN" ID="P_CURRENCY_RATE" NAME="P_CURRENCY_RATE" VALUE="1.090000">') ,
$result);
}
}