0002317: Paiement : forcer la fiche pour les banques

This commit is contained in:
sparkyx 2023-12-23 16:55:42 +01:00
parent 6d053fe5e2
commit a77dfacbf8
6 changed files with 222 additions and 20 deletions

View file

@ -128,7 +128,7 @@ class Acc_Ledger extends jrn_def_sql
}
/**
* @brief Return the type of a ledger (ACH,VEN,ODS or FIN) or GL
*
* @return string FIN ODS ACH VEN or GL if id == 0
*/
function get_type()
{

View file

@ -1136,11 +1136,12 @@ class Acc_Ledger_Fin extends Acc_Ledger
}
/**
* return the fiche_id of the bank
* @brief find and FICHE.F_ID of the bank or -1 if not found
*/
function get_bank()
{
$bank_id=$this->db->get_value('select jrn_def_bank from jrn_def where jrn_def_id=$1', array($this->id));
if (empty($bank_id)) return -1;
return $bank_id;
}

View file

@ -950,20 +950,22 @@ class Acc_Ledger_Purchase extends Acc_Ledger
$mp=new Acc_Payment($this->db,$e_mp);
$mp->load();
/* fiche */
if ($mp->get_parameter('qcode') == '')
$fqcode=${'e_mp_qcode_'.$e_mp};
else
$fqcode=$mp->get_parameter('qcode');
$acfiche = new Fiche($this->db);
$acfiche->get_by_qcode($fqcode);
/* jrnx */
$acseq=$this->db->get_next_seq('s_grpt');
$acjrn=new Acc_Ledger($this->db,$mp->get_parameter('ledger_target'));
$acinternal=$acjrn->compute_internal_code($acseq);
/*
* for the use of the card of the bank
*/
if ( $acjrn->get_type()=='FIN') {
$acjrn=new Acc_Ledger_Fin($this->db, $mp->get_parameter('ledger_target'));
$acfiche=new Fiche($this->db,$acjrn->get_bank());
$fqcode=$acfiche->strAttribut(ATTR_DEF_QUICKCODE);
} else {
$fqcode = ${'e_mp_qcode_' . $e_mp};
$acfiche = new Fiche($this->db);
$acfiche->get_by_qcode($fqcode);
}
/* Insert paid by */
$acc_pay=new Acc_Operation($this->db);
$acc_pay->date=$e_date;
@ -2141,6 +2143,7 @@ EOF;
return $array;
}
}

View file

@ -242,9 +242,13 @@ class Acc_Ledger_Sale extends Acc_Ledger {
$this->check_currency_setting($p_currency_code);
}
/*!\brief insert into the database, it calls first the verify function,
* change the value of this->jr_id and this->jr_internal
* * It generates the document if gen_invoice is set and save the middle of payment if any ($e_mp)
/*!
* \brief insert into the database, it calls first the verify function,
* store the value of the inserted operation in $this->jr_id and this->jr_internal
*
* It generates the document if gen_invoice is set and save the middle of payment if any ($e_mp)
*
* It also create a second operation if there is a payment
*
* \param $p_array is usually $_POST or a predefined operation
* \return string : internal number
@ -653,16 +657,25 @@ class Acc_Ledger_Sale extends Acc_Ledger {
$mp = new Acc_Payment($this->db, $e_mp);
$mp->load();
/* fiche */
$fqcode = ${'e_mp_qcode_' . $e_mp};
$acfiche = new Fiche($this->db);
$acfiche->get_by_qcode($fqcode);
/* jrnx */
$acseq = $this->db->get_next_seq('s_grpt');
$acjrn = new Acc_Ledger($this->db, $mp->get_parameter('ledger_target'));
$acinternal = $acjrn->compute_internal_code($acseq);
/*
* for the use of the card of the bank
*/
if ( $acjrn->get_type()=='FIN') {
$acjrn=new Acc_Ledger_Fin($this->db, $mp->get_parameter('ledger_target'));
$acfiche=new Fiche($this->db,$acjrn->get_bank());
$fqcode=$acfiche->strAttribut(ATTR_DEF_QUICKCODE);
} else {
$fqcode = ${'e_mp_qcode_' . $e_mp};
$acfiche = new Fiche($this->db);
$acfiche->get_by_qcode($fqcode);
}
/* Insert paid by */
$acc_pay = new Acc_Operation($this->db);
$acc_pay->date = $pay_date;

View file

@ -222,6 +222,103 @@ class Acc_Ledger_PurchaseTest extends TestCase
$this->clean_operation();
}
/**
* @covers Acc_Ledger_Purchase::insert
*/
public function testInsertPayment()
{
global $g_connection;
$array=$this->array;
$array["mt"]="1572704002.1732";
$array["pa_id"]=array(2);
$array["op"]=array(0);
$array["amount_t0"]=658.25;
$array['hplan']=array(array(-1));
$array["val"]=array(array(658.25));
$sql="
from quant_purchase
join jrnx using(j_id)
join jrn on (jr_grpt_id=j_grpt)
where
jr_mt='1572704002.1732'
and j_qcode='LOYER'
";
$this->clean_operation();
$array=array_merge($array, array("e_march1"=>"DOCUME",
"e_march1_price"=>18.25,
"e_quant1"=>"",
"htva_march1"=>18.25,
"e_march1_tva_id"=>1,
"e_march1_tva_amount"=>22.08,
"tva_march1"=>3.83,
"tvac_march1"=>22.08
,"p_currency_rate"=>1
,"p_currency_code"=>0
));
// create a payment method with a valid card
$payment_methodSQL=$this->insert_payment_method();
$array['mp_date'] ="";
$array['acompte'] = 0;
$array['e_mp'] = $payment_methodSQL->getp("mp_id");
$array['e_mp_qcode_'.$array['e_mp']]='CDOLLAR';
$this->object->insert($array);
$this->assertEquals($array['htva_march0'],$g_connection->get_value("select qp_price ".$sql));
// check payment
$nQuant_FinId=$this->get_reconcilied_operation();
$quant_fin=new Quant_Fin_SQL($g_connection,$nQuant_FinId);
$nQuantFin_Amount=$quant_fin->getp("qf_amount") ;
$this->assertTrue($nQuantFin_Amount == -658.25,"error : purchase 658.25 and payment {$nQuantFin_Amount} not equal ");
// check card used in bank
$expected_bank=$g_connection->get_value("
select jrn_def_bank
from
jrn_def jd1
join payment_method pm1 on (jd1.jrn_def_id=pm1.mp_jrn_def_id)
where mp_id=$1",[$array['e_mp']]);
$found_bank =$quant_fin->getp("qf_bank");
$this->assertTrue($expected_bank==$found_bank,"error : payment done with a wrong card {$found_bank} instead of $expected_bank");
$payment_methodSQL->delete();
$this->clean_operation();
}
private function insert_payment_method()
{
global $g_connection;
$payment_methodSQl=new Payment_method_SQL($g_connection);
$payment_methodSQl->from_array([
"mp_lib"=>"caisse"
,"mp_jrn_def_id"=>1
,'mp_fd_id'=>3
,"jrn_def_id"=>3
]);
$payment_methodSQl->insert();
return $payment_methodSQl;
}
/**
* @brief return the reconcilied operation of this->object
* @return mixed|string
* @throws Exception
*/
private function get_reconcilied_operation()
{
global $g_connection;
$nValue=$g_connection->get_value("select jra_concerned
from jrn_rapt where jr_id=$1",[$this->object->jr_id]);
$nQuant_FinId=$g_connection->get_value("select qf_id from quant_fin where jr_id=$1",[$nValue]);
return $nQuant_FinId;
}
/**
* @brief set special attributes to test NOT DEDUCTIBLE : private, VAT and tax
* @global type $g_connection

View file

@ -83,8 +83,23 @@ class Acc_Ledger_SaleTest extends TestCase
private function clean_operation()
{
global $g_connection;
$g_connection->exec_sql("delete from jrn where jr_mt=$1", ["1572714478.3155"]);
$mt="1572714478.3155";
//delete reconcilied operations
$g_connection->exec_sql("
delete from jrn
where jr_id in (select jr2.jr_id
from jrn_rapt ra1 join jrn jr2 on (ra1.jr_id=jr2.jr_id)
where jr2.jr_mt=$1)",[$mt]);
$g_connection->exec_sql("
delete from jrn
where jr_id in (select jr2.jr_id
from jrn_rapt ra1 join jrn jr2 on (ra1.jra_concerned=jr2.jr_id)
where jr2.jr_mt=$1)",[$mt]);
$g_connection->exec_sql("delete from jrn where jr_mt=$1", [$mt]);
$g_connection->exec_sql("delete from jrnx where j_grpt not in (select jr_grpt_id from jrn)");
$g_connection->exec_sql("alter sequence s_jrn_pj2 restart with 40");
}
/**
@ -168,6 +183,78 @@ class Acc_Ledger_SaleTest extends TestCase
}
/**
* @covers Acc_Ledger_Sale::insert
*/
public function testInsertPayment()
{
global $g_connection;
$this->clean_operation();
$cnt=$g_connection->get_value("select count(*) from jrn where jr_mt=$1",["1572714478.3155"]);
$this->assertEquals(0,$cnt);
$sql="
from quant_sold
join jrnx using(j_id)
join jrn on (jr_grpt_id=j_grpt)
where
jr_mt='1572714478.3155'
and j_qcode='MARCHA'
";
$array=$this->array;
$array["pa_id"]=array(2);
$array["op"]=array(0, 1);
$array["amount_t0"]=24.2;
$array["hplan"]=array(array(-1), array(-1));
$array["val"]=array(array(24, 2), array(1212.5));
$array["mt"]="1572714478.3155";
// create a payment method with a valid card
$array['mp_date'] ="";
$array['acompte'] = 0;
$array['e_mp'] = 1;
$this->object->insert($array);
$this->assertEquals($array['htva_march1'],$g_connection->get_value("select qs_price ".$sql));
// check payment
$nQuant_FinId=$this->get_reconcilied_operation();
$quant_fin=new Quant_Fin_SQL($g_connection,$nQuant_FinId);
$nQuantFin_Amount=$quant_fin->getp("qf_amount") ;
$this->assertTrue($nQuantFin_Amount ==bcadd( $array['tvac_march1'],$array['tvac_march0']),"error : sale {$array['tvac_march1']} and payment {$nQuantFin_Amount} not equal ");
// check card used in bank
$expected_bank=$g_connection->get_value("
select jrn_def_bank
from
jrn_def jd1
join payment_method pm1 on (jd1.jrn_def_id=pm1.mp_jrn_def_id)
where mp_id=$1",[$array['e_mp']]);
$found_bank =$quant_fin->getp("qf_bank");
$this->assertTrue($expected_bank==$found_bank,"error : payment done with a wrong card {$found_bank} instead of $expected_bank");
$this->clean_operation();
}
/**
* @brief return the reconcilied operation of this->object
* @return mixed|string
* @throws Exception
*/
private function get_reconcilied_operation()
{
global $g_connection;
$nValue=$g_connection->get_value("select jra_concerned
from jrn_rapt where jr_id=$1",[$this->object->jr_id]);
$nQuant_FinId=$g_connection->get_value("select qf_id from quant_fin where jr_id=$1",[$nValue]);
return $nQuant_FinId;
}
/**
* @covers Acc_Ledger_Sale::confirm
*/
@ -240,4 +327,5 @@ class Acc_Ledger_SaleTest extends TestCase
$ret=$this->object->get_detail_sale(92,103,'unpaid');
$this->assertEquals(5,Database::num_row($ret),'only unpaid operations');
}
}