Qual: Rewrite code for supplier invoice cloning.
This commit is contained in:
parent
7e69de78d9
commit
d7cb11064c
@ -48,11 +48,41 @@ if ($user->societe_id > 0)
|
|||||||
$socid = $user->societe_id;
|
$socid = $user->societe_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
$html = new Form($db);
|
$html = new Form($db);
|
||||||
$mesg='';
|
$mesg='';
|
||||||
$action=isset($_GET['action'])?$_GET['action']:$_POST['action'];
|
$action=isset($_GET['action'])?$_GET['action']:$_POST['action'];
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Actions
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Action clone object
|
||||||
|
if ($_POST["action"] == 'confirm_clone' && $_POST['confirm'] == 'yes')
|
||||||
|
{
|
||||||
|
if (1==0 && empty($_REQUEST["clone_content"]) && empty($_REQUEST["clone_receivers"]))
|
||||||
|
{
|
||||||
|
$mesg='<div class="error">'.$langs->trans("NoCloneOptionsSpecified").'</div>';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$object=new FactureFournisseur($db);
|
||||||
|
$result=$object->createFromClone($_REQUEST['facid']);
|
||||||
|
if ($result > 0)
|
||||||
|
{
|
||||||
|
header("Location: ".$_SERVER['PHP_SELF'].'?facid='.$result);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$langs->load("errors");
|
||||||
|
$mesg='<div class="error">'.$langs->trans($object->error).'</div>';
|
||||||
|
$_GET['action']='';
|
||||||
|
$_GET['id']=$_REQUEST['id'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ($_REQUEST['action'] == 'confirm_valid' && $_REQUEST['confirm'] == 'yes' && $user->rights->fournisseur->facture->valider)
|
if ($_REQUEST['action'] == 'confirm_valid' && $_REQUEST['confirm'] == 'yes' && $user->rights->fournisseur->facture->valider)
|
||||||
{
|
{
|
||||||
$facturefourn=new FactureFournisseur($db);
|
$facturefourn=new FactureFournisseur($db);
|
||||||
@ -322,23 +352,16 @@ if ($_POST['action'] == 'classin')
|
|||||||
* View
|
* View
|
||||||
*/
|
*/
|
||||||
|
|
||||||
$addons='';
|
llxHeader('','','');
|
||||||
llxHeader('','', $addons);
|
|
||||||
|
|
||||||
|
|
||||||
// Mode creation
|
// Mode creation
|
||||||
if ($_GET['action'] == 'create' or $_GET['action'] == 'copy')
|
if ($_GET['action'] == 'create')
|
||||||
{
|
{
|
||||||
print_titre($langs->trans('NewBill'));
|
print_titre($langs->trans('NewBill'));
|
||||||
|
|
||||||
if ($mesg) { print $mesg.'<br>'; }
|
if ($mesg) { print $mesg.'<br>'; }
|
||||||
|
|
||||||
if ($_GET['action'] == 'copy')
|
|
||||||
{
|
|
||||||
$fac_ori = new FactureFournisseur($db);
|
|
||||||
$fac_ori->fetch($_GET['facid']);
|
|
||||||
}
|
|
||||||
|
|
||||||
$societe='';
|
$societe='';
|
||||||
if ($_GET['socid'])
|
if ($_GET['socid'])
|
||||||
{
|
{
|
||||||
@ -400,19 +423,9 @@ if ($_GET['action'] == 'create' or $_GET['action'] == 'copy')
|
|||||||
print '</tr>';
|
print '</tr>';
|
||||||
|
|
||||||
for ($i = 1 ; $i < 9 ; $i++)
|
for ($i = 1 ; $i < 9 ; $i++)
|
||||||
{
|
|
||||||
if ($_GET['action'] == 'copy')
|
|
||||||
{
|
|
||||||
$value_label = $fac_ori->lignes[$i-1]->description;
|
|
||||||
$value_pu = $fac_ori->lignes[$i-1]->pu_ht;
|
|
||||||
$value_tauxtva = $fac_ori->lignes[$i-1]->tva_taux;
|
|
||||||
$value_qty = $fac_ori->lignes[$i-1]->qty;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
$value_qty = '1';
|
$value_qty = '1';
|
||||||
$value_tauxtva = '';
|
$value_tauxtva = '';
|
||||||
}
|
|
||||||
print '<tr><td>'.$i.'</td>';
|
print '<tr><td>'.$i.'</td>';
|
||||||
print '<td><input size="50" name="label'.$i.'" value="'.$value_label.'" type="text"></td>';
|
print '<td><input size="50" name="label'.$i.'" value="'.$value_label.'" type="text"></td>';
|
||||||
print '<td align="right"><input type="text" size="8" name="amount'.$i.'" value="'.$value_pu.'"></td>';
|
print '<td align="right"><input type="text" size="8" name="amount'.$i.'" value="'.$value_pu.'"></td>';
|
||||||
@ -550,18 +563,27 @@ else
|
|||||||
|
|
||||||
if ($mesg) { print $mesg.'<br>'; }
|
if ($mesg) { print $mesg.'<br>'; }
|
||||||
|
|
||||||
/*
|
// Confirmation de la suppression d'une ligne produit
|
||||||
* Confirmation de la suppression d'une ligne produit
|
|
||||||
*/
|
|
||||||
if ($_GET['action'] == 'confirm_delete_line')
|
if ($_GET['action'] == 'confirm_delete_line')
|
||||||
{
|
{
|
||||||
$html->form_confirm($_SERVER["PHP_SELF"].'?facid='.$fac->id.'&ligne_id='.$_GET["ligne_id"], $langs->trans('DeleteProductLine'), $langs->trans('ConfirmDeleteProductLine'), 'confirm_deleteproductline');
|
$html->form_confirm($_SERVER["PHP_SELF"].'?facid='.$fac->id.'&ligne_id='.$_GET["ligne_id"], $langs->trans('DeleteProductLine'), $langs->trans('ConfirmDeleteProductLine'), 'confirm_deleteproductline');
|
||||||
print '<br>';
|
print '<br>';
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
* Confirmation de la validation
|
// Clone confirmation
|
||||||
*
|
if ($_GET["action"] == 'clone')
|
||||||
*/
|
{
|
||||||
|
// Create an array for form
|
||||||
|
$formquestion=array(
|
||||||
|
//'text' => $langs->trans("ConfirmClone"),
|
||||||
|
//array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneMainAttributes"), 'value' => 1)
|
||||||
|
);
|
||||||
|
// Paiement incomplet. On demande si motif = escompte ou autre
|
||||||
|
$html->form_confirm($_SERVER["PHP_SELF"].'?facid='.$fac->id,$langs->trans('CloneInvoice'),$langs->trans('ConfirmCloneInvoice',$fac->ref),'confirm_clone',$formquestion,'yes');
|
||||||
|
print '<br>';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Confirmation de la validation
|
||||||
if ($_GET['action'] == 'valid')
|
if ($_GET['action'] == 'valid')
|
||||||
{
|
{
|
||||||
$html->form_confirm('fiche.php?facid='.$fac->id, $langs->trans('ValidateBill'), $langs->trans('ConfirmValidateBill', $fac->ref), 'confirm_valid');
|
$html->form_confirm('fiche.php?facid='.$fac->id, $langs->trans('ValidateBill'), $langs->trans('ConfirmValidateBill', $fac->ref), 'confirm_valid');
|
||||||
@ -939,10 +961,10 @@ else
|
|||||||
print '>'.$langs->trans('Validate').'</a>';
|
print '>'.$langs->trans('Validate').'</a>';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
if ($user->rights->fournisseur->facture->creer)
|
if ($user->rights->fournisseur->facture->creer)
|
||||||
{
|
{
|
||||||
print '<a class="butAction" href="fiche.php?facid='.$fac->id.'&action=copy&socid='.$fac->socid.'">'.$langs->trans('ToClone').'</a>';
|
print '<a class="butAction" href="fiche.php?facid='.$fac->id.'&action=clone&socid='.$fac->socid.'">'.$langs->trans('ToClone').'</a>';
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($_GET['action'] != 'edit' && $fac->statut == 0 && $user->rights->fournisseur->facture->supprimer)
|
if ($_GET['action'] != 'edit' && $fac->statut == 0 && $user->rights->fournisseur->facture->supprimer)
|
||||||
|
|||||||
@ -39,12 +39,15 @@ class FactureFournisseur extends Facture
|
|||||||
{
|
{
|
||||||
var $id;
|
var $id;
|
||||||
var $db;
|
var $db;
|
||||||
var $socid;
|
|
||||||
var $element='facture_fourn';
|
var $element='facture_fourn';
|
||||||
var $table_element='facture_fourn';
|
var $table_element='facture_fourn';
|
||||||
var $table_element_line='facture_fourn_det';
|
var $table_element_line='facture_fourn_det';
|
||||||
var $fk_element='fk_facture_fourn';
|
var $fk_element='fk_facture_fourn';
|
||||||
|
|
||||||
|
var $ref;
|
||||||
|
var $ref_supplier;
|
||||||
|
var $socid;
|
||||||
//! 0=draft,
|
//! 0=draft,
|
||||||
//! 1=validated,
|
//! 1=validated,
|
||||||
//! TODO Ce statut doit etre 2 et non 1 classee payee partiellement (close_code='discount_vat','badcustomer') ou completement (close_code=null),
|
//! TODO Ce statut doit etre 2 et non 1 classee payee partiellement (close_code='discount_vat','badcustomer') ou completement (close_code=null),
|
||||||
@ -57,7 +60,6 @@ class FactureFournisseur extends Facture
|
|||||||
var $libelle;
|
var $libelle;
|
||||||
var $date;
|
var $date;
|
||||||
var $date_echeance;
|
var $date_echeance;
|
||||||
var $ref;
|
|
||||||
var $amount;
|
var $amount;
|
||||||
var $remise;
|
var $remise;
|
||||||
var $tva;
|
var $tva;
|
||||||
@ -105,8 +107,11 @@ class FactureFournisseur extends Facture
|
|||||||
{
|
{
|
||||||
global $langs;
|
global $langs;
|
||||||
|
|
||||||
|
// Clear parameters
|
||||||
|
if (empty($this->date)) $this->date=gmmktime();
|
||||||
|
|
||||||
$socid = $this->socid;
|
$socid = $this->socid;
|
||||||
$number = $this->ref;
|
$number = $this->ref_supplier?$this->ref_supplier:$this->ref;
|
||||||
$amount = $this->amount;
|
$amount = $this->amount;
|
||||||
$remise = $this->remise;
|
$remise = $this->remise;
|
||||||
|
|
||||||
@ -118,6 +123,8 @@ class FactureFournisseur extends Facture
|
|||||||
$sql = 'INSERT INTO '.MAIN_DB_PREFIX.'facture_fourn (facnumber, libelle, fk_soc, datec, datef, note, fk_user_author, date_lim_reglement) ';
|
$sql = 'INSERT INTO '.MAIN_DB_PREFIX.'facture_fourn (facnumber, libelle, fk_soc, datec, datef, note, fk_user_author, date_lim_reglement) ';
|
||||||
$sql .= " VALUES ('".addslashes($number)."','".addslashes($this->libelle)."',";
|
$sql .= " VALUES ('".addslashes($number)."','".addslashes($this->libelle)."',";
|
||||||
$sql .= $this->socid.", ".$this->db->idate(mktime()).",'".$this->db->idate($this->date)."','".addslashes($this->note)."', ".$user->id.",'".$this->db->idate($this->date_echeance)."');";
|
$sql .= $this->socid.", ".$this->db->idate(mktime()).",'".$this->db->idate($this->date)."','".addslashes($this->note)."', ".$user->id.",'".$this->db->idate($this->date_echeance)."');";
|
||||||
|
|
||||||
|
dolibarr_syslog("FactureFournisseur::create sql=".$sql, LOG_DEBUG);
|
||||||
$resql=$this->db->query($sql);
|
$resql=$this->db->query($sql);
|
||||||
if ($resql)
|
if ($resql)
|
||||||
{
|
{
|
||||||
@ -126,15 +133,22 @@ class FactureFournisseur extends Facture
|
|||||||
{
|
{
|
||||||
$sql = 'INSERT INTO '.MAIN_DB_PREFIX.'facture_fourn_det (fk_facture_fourn)';
|
$sql = 'INSERT INTO '.MAIN_DB_PREFIX.'facture_fourn_det (fk_facture_fourn)';
|
||||||
$sql .= ' VALUES ('.$this->id.');';
|
$sql .= ' VALUES ('.$this->id.');';
|
||||||
|
|
||||||
|
dolibarr_syslog("FactureFournisseur::create sql=".$sql, LOG_DEBUG);
|
||||||
$resql_insert=$this->db->query($sql);
|
$resql_insert=$this->db->query($sql);
|
||||||
if ($resql_insert)
|
if ($resql_insert)
|
||||||
{
|
{
|
||||||
$idligne = $this->db->last_insert_id(MAIN_DB_PREFIX.'facture_fourn_det');
|
$idligne = $this->db->last_insert_id(MAIN_DB_PREFIX.'facture_fourn_det');
|
||||||
|
|
||||||
$this->updateline($idligne,
|
$this->updateline($idligne,
|
||||||
$this->lignes[$i]->description,
|
$this->lignes[$i]->description,
|
||||||
$this->lignes[$i]->pu_ht,
|
$this->lignes[$i]->pu_ht,
|
||||||
$this->lignes[$i]->tva_taux,
|
$this->lignes[$i]->tva_taux,
|
||||||
$this->lignes[$i]->qty);
|
$this->lignes[$i]->qty,
|
||||||
|
$this->lignes[$i]->fk_product,
|
||||||
|
'HT',
|
||||||
|
$this->lignes[$i]->info_bits
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Update total price
|
// Update total price
|
||||||
@ -168,9 +182,9 @@ class FactureFournisseur extends Facture
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Recup<EFBFBD>re l'objet facture et ses lignes de factures
|
* \brief Load object from database
|
||||||
* \param rowid id de la facture a r<EFBFBD>cup<EFBFBD>rer
|
* \param rowid id of object to get
|
||||||
* \return int >0 si ok, <0 si ko
|
* \return int >0 if ok, <0 if ko
|
||||||
*/
|
*/
|
||||||
function fetch($rowid)
|
function fetch($rowid)
|
||||||
{
|
{
|
||||||
@ -182,7 +196,7 @@ class FactureFournisseur extends Facture
|
|||||||
$sql.= ' FROM '.MAIN_DB_PREFIX.'facture_fourn as f,'.MAIN_DB_PREFIX.'societe as s';
|
$sql.= ' FROM '.MAIN_DB_PREFIX.'facture_fourn as f,'.MAIN_DB_PREFIX.'societe as s';
|
||||||
$sql.= ' WHERE f.rowid='.$rowid.' AND f.fk_soc = s.rowid';
|
$sql.= ' WHERE f.rowid='.$rowid.' AND f.fk_soc = s.rowid';
|
||||||
|
|
||||||
dolibarr_syslog("FactureFourn::Fetch sql=".$sql, LOG_DEBUG);
|
dolibarr_syslog("FactureFournisseur::Fetch sql=".$sql, LOG_DEBUG);
|
||||||
$resql = $this->db->query($sql);
|
$resql = $this->db->query($sql);
|
||||||
if ($resql)
|
if ($resql)
|
||||||
{
|
{
|
||||||
@ -196,6 +210,7 @@ class FactureFournisseur extends Facture
|
|||||||
$this->ref_supplier = $obj->facnumber;
|
$this->ref_supplier = $obj->facnumber;
|
||||||
|
|
||||||
$this->datep = $obj->df;
|
$this->datep = $obj->df;
|
||||||
|
$this->date = $obj->df;
|
||||||
$this->date_echeance = $obj->de;
|
$this->date_echeance = $obj->de;
|
||||||
$this->libelle = $obj->libelle;
|
$this->libelle = $obj->libelle;
|
||||||
|
|
||||||
@ -226,7 +241,7 @@ class FactureFournisseur extends Facture
|
|||||||
if ($result < 0)
|
if ($result < 0)
|
||||||
{
|
{
|
||||||
$this->error=$this->db->error();
|
$this->error=$this->db->error();
|
||||||
dolibarr_syslog('Facture::Fetch Error '.$this->error);
|
dolibarr_syslog('FactureFournisseur::Fetch Error '.$this->error, LOG_ERROR);
|
||||||
return -3;
|
return -3;
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
@ -250,8 +265,8 @@ class FactureFournisseur extends Facture
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
\brief Recup<EFBFBD>re les lignes de factures dans this->lignes
|
* \brief Load this->lignes
|
||||||
\return int 1 si ok, < 0 si erreur
|
* \return int 1 si ok, < 0 si erreur
|
||||||
*/
|
*/
|
||||||
function fetch_lines()
|
function fetch_lines()
|
||||||
{
|
{
|
||||||
@ -264,7 +279,7 @@ class FactureFournisseur extends Facture
|
|||||||
//$sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'product_fournisseur as pf ON f.fk_product = pf.fk_product';
|
//$sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'product_fournisseur as pf ON f.fk_product = pf.fk_product';
|
||||||
$sql.= ' WHERE fk_facture_fourn='.$this->id;
|
$sql.= ' WHERE fk_facture_fourn='.$this->id;
|
||||||
|
|
||||||
dolibarr_syslog("FactureFourn::fetch_lines sql=".$sql, LOG_DEBUG);
|
dolibarr_syslog("FactureFournisseur::fetch_lines sql=".$sql, LOG_DEBUG);
|
||||||
$resql_rows = $this->db->query($sql);
|
$resql_rows = $this->db->query($sql);
|
||||||
if ($resql_rows)
|
if ($resql_rows)
|
||||||
{
|
{
|
||||||
@ -506,12 +521,12 @@ class FactureFournisseur extends Facture
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Mets <EFBFBD> jour une ligne de facture
|
* \brief Update line
|
||||||
* \param id Id de la ligne de facture
|
* \param id Id de la ligne de facture
|
||||||
* \param label Description de la ligne
|
* \param label Description de la ligne
|
||||||
* \param pu Prix unitaire (HT ou TTC selon price_base_type)
|
* \param pu Prix unitaire (HT ou TTC selon price_base_type)
|
||||||
* \param tauxtva Taux tva
|
* \param tauxtva Taux tva
|
||||||
* \param qty Quantit<EFBFBD>
|
* \param qty Quantity
|
||||||
* \param idproduct Id produit
|
* \param idproduct Id produit
|
||||||
* \param price_base_type HT ou TTC
|
* \param price_base_type HT ou TTC
|
||||||
* \param info_bits Miscellanous informations of line
|
* \param info_bits Miscellanous informations of line
|
||||||
@ -771,5 +786,69 @@ class FactureFournisseur extends Facture
|
|||||||
$this->total_tva = $xnbp*19.6;
|
$this->total_tva = $xnbp*19.6;
|
||||||
$this->total_ttc = $xnbp*119.6;
|
$this->total_ttc = $xnbp*119.6;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Load an object from its id and create a new one in database
|
||||||
|
* \param fromid Id of object to clone
|
||||||
|
* \param invertdetail Reverse sign of amounts for lines
|
||||||
|
* \return int New id of clone
|
||||||
|
*/
|
||||||
|
function createFromClone($fromid,$invertdetail=0)
|
||||||
|
{
|
||||||
|
global $user,$langs;
|
||||||
|
|
||||||
|
$error=0;
|
||||||
|
|
||||||
|
$object=new FactureFournisseur($this->db);
|
||||||
|
|
||||||
|
$this->db->begin();
|
||||||
|
|
||||||
|
// Load source object
|
||||||
|
$object->fetch($fromid);
|
||||||
|
$object->id=0;
|
||||||
|
$object->statut=0;
|
||||||
|
|
||||||
|
// Clear fields
|
||||||
|
$object->ref_supplier=$langs->trans("CopyOf").' '.$object->ref_supplier;
|
||||||
|
$object->author = $user->id;
|
||||||
|
$object->user_valid = '';
|
||||||
|
$object->fk_facture_source = 0;
|
||||||
|
$object->date_creation = '';
|
||||||
|
$object->date_validation = '';
|
||||||
|
$object->date = '';
|
||||||
|
$object->ref_client = '';
|
||||||
|
$object->close_code = '';
|
||||||
|
$object->close_note = '';
|
||||||
|
|
||||||
|
// Create clone
|
||||||
|
$result=$object->create($user);
|
||||||
|
|
||||||
|
// Other options
|
||||||
|
if ($result < 0)
|
||||||
|
{
|
||||||
|
$this->error=$object->error;
|
||||||
|
$error++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! $error)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// End
|
||||||
|
if (! $error)
|
||||||
|
{
|
||||||
|
$this->db->commit();
|
||||||
|
return $object->id;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$this->db->rollback();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
|
|||||||
@ -42,3 +42,4 @@ ErrorExportDuplicateProfil=This profil name already exists for this export set.
|
|||||||
ErrorLDAPSetupNotComplete=Dolibarr-LDAP matching is not complete.
|
ErrorLDAPSetupNotComplete=Dolibarr-LDAP matching is not complete.
|
||||||
ErrorLDAPMakeManualTest=A .ldif file has been generated in directory %s. Try to load it manually from command line to have more informations on errors.
|
ErrorLDAPMakeManualTest=A .ldif file has been generated in directory %s. Try to load it manually from command line to have more informations on errors.
|
||||||
ErrorCantSaveADoneUserWithZeroPercentage=Can't save an action with "statut not started" if field "done by" is also filled.
|
ErrorCantSaveADoneUserWithZeroPercentage=Can't save an action with "statut not started" if field "done by" is also filled.
|
||||||
|
ErrorBillRefAlreadyExists=Ref used for creation already exists.
|
||||||
@ -42,3 +42,4 @@ ErrorExportDuplicateProfil=Ce nom de profil existe d
|
|||||||
ErrorLDAPSetupNotComplete=Le matching Dolibarr-LDAP est incomplet.
|
ErrorLDAPSetupNotComplete=Le matching Dolibarr-LDAP est incomplet.
|
||||||
ErrorLDAPMakeManualTest=Un fichier .ldif a été généré dans le répertoire %s. Essayer de charger ce fichier en manuel depuis la ligne de commande pour plus de détail sur l'erreur.
|
ErrorLDAPMakeManualTest=Un fichier .ldif a été généré dans le répertoire %s. Essayer de charger ce fichier en manuel depuis la ligne de commande pour plus de détail sur l'erreur.
|
||||||
ErrorCantSaveADoneUserWithZeroPercentage=Impossible sauver une action à l'état non commencé avec un utilisateur défini comme ayant fait l'action.
|
ErrorCantSaveADoneUserWithZeroPercentage=Impossible sauver une action à l'état non commencé avec un utilisateur défini comme ayant fait l'action.
|
||||||
|
ErrorBillRefAlreadyExists=La référence utilisée pour la création existe déjà
|
||||||
Loading…
Reference in New Issue
Block a user