Maxi debug of stock management.

This commit is contained in:
Laurent Destailleur 2008-10-24 20:16:36 +00:00
parent f2746207c4
commit fc0ebfa9b5
11 changed files with 217 additions and 135 deletions

View File

@ -29,42 +29,44 @@ require_once(DOL_DOCUMENT_ROOT."/lib/admin.lib.php");
$langs->load("admin"); $langs->load("admin");
$langs->load("stocks"); $langs->load("stocks");
// Securit check
if (!$user->admin) if (!$user->admin)
accessforbidden(); accessforbidden();
/* /*
* Actions * Actions
*/ */
if ($_POST["action"] == 'stock_userstock') if ($_POST["action"] == 'STOCK_USERSTOCK')
{ {
dolibarr_set_const($db, "STOCK_USERSTOCK", $_POST["stock_userstock"]); dolibarr_set_const($db, "STOCK_USERSTOCK", $_POST["STOCK_USERSTOCK"]);
//On d<EFBFBD>sactive l'autocr<63>ation si l'option "stock personnel" est d<>sactiv<69>e //On desactive l'autocreation si l'option "stock personnel" est desactivee
if ($_POST["stock_userstock"] == 0) if ($_POST["STOCK_USERSTOCK"] == 0)
{ {
dolibarr_set_const($db, "STOCK_USERSTOCK_AUTOCREATE", 0); dolibarr_set_const($db, "STOCK_USERSTOCK_AUTOCREATE", 0);
} }
Header("Location: stock.php"); Header("Location: stock.php");
exit; exit;
} }
elseif ($_POST["action"] == 'stock_userstock_autocreate') elseif ($_POST["action"] == 'STOCK_USERSTOCK_AUTOCREATE')
{ {
dolibarr_set_const($db, "STOCK_USERSTOCK_AUTOCREATE", $_POST["stock_userstock_autocreate"]); dolibarr_set_const($db, "STOCK_USERSTOCK_AUTOCREATE", $_POST["STOCK_USERSTOCK_AUTOCREATE"]);
Header("Location: stock.php"); Header("Location: stock.php");
exit; exit;
} }
// Mode of stock changement // Mode of stock decrease
elseif ( $_POST["action"] == 'stock_bill' if ($_POST["action"] == 'STOCK_CALCULATE_ON_BILL'
|| $_POST["action"] == 'stock_validateorder' || $_POST["action"] == 'STOCK_CALCULATE_ON_VALIDATE_ORDER'
|| $_POST["action"] == 'stock_shipment') || $_POST["action"] == 'STOCK_CALCULATE_ON_SHIPMENT')
{ {
$count=0; $count=0;
$db->begin(); $db->begin();
$count+=dolibarr_set_const($db, "STOCK_CALCULATE_ON_BILL", ''); $count+=dolibarr_set_const($db, "STOCK_CALCULATE_ON_BILL", '');
$count+=dolibarr_set_const($db, "STOCK_CALCULATE_ON_VALIDATE_ORDER", ''); $count+=dolibarr_set_const($db, "STOCK_CALCULATE_ON_VALIDATE_ORDER", '');
$count+=dolibarr_set_const($db, "STOCK_CALCULATE_ON_SHIPMENT", ''); $count+=dolibarr_set_const($db, "STOCK_CALCULATE_ON_SHIPMENT", '');
if ($_POST["action"] == 'stock_bill') $count+=dolibarr_set_const($db, "STOCK_CALCULATE_ON_BILL", $_POST["stock_bill"]); if ($_POST["action"] == 'STOCK_CALCULATE_ON_BILL') $count+=dolibarr_set_const($db, "STOCK_CALCULATE_ON_BILL", $_POST["STOCK_CALCULATE_ON_BILL"]);
if ($_POST["action"] == 'stock_validateorder') $count+=dolibarr_set_const($db, "STOCK_CALCULATE_ON_VALIDATE_ORDER", $_POST["stock_validateorder"]); if ($_POST["action"] == 'STOCK_CALCULATE_ON_VALIDATE_ORDER') $count+=dolibarr_set_const($db, "STOCK_CALCULATE_ON_VALIDATE_ORDER", $_POST["STOCK_CALCULATE_ON_VALIDATE_ORDER"]);
if ($_POST["action"] == 'stock_shipment') $count+=dolibarr_set_const($db, "STOCK_CALCULATE_ON_SHIPMENT", $_POST["stock_shipment"]); if ($_POST["action"] == 'STOCK_CALCULATE_ON_SHIPMENT') $count+=dolibarr_set_const($db, "STOCK_CALCULATE_ON_SHIPMENT", $_POST["STOCK_CALCULATE_ON_SHIPMENT"]);
if ($count == 4) if ($count == 4)
{ {
$db->commit(); $db->commit();
@ -77,6 +79,28 @@ elseif ( $_POST["action"] == 'stock_bill'
dolibarr_print_error("Error in some requests", LOG_ERR); dolibarr_print_error("Error in some requests", LOG_ERR);
} }
} }
// Mode of stock decrease
if ($_POST["action"] == 'STOCK_CALCULATE_ON_SUPPLIER_BILL'
|| $_POST["action"] == 'STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER')
{
$count=0;
$db->begin();
$count+=dolibarr_set_const($db, "STOCK_CALCULATE_ON_SUPPLIER_BILL", '');
$count+=dolibarr_set_const($db, "STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER", '');
if ($_POST["action"] == 'STOCK_CALCULATE_ON_SUPPLIER_BILL') $count+=dolibarr_set_const($db, "STOCK_CALCULATE_ON_SUPPLIER_BILL", $_POST["STOCK_CALCULATE_ON_SUPPLIER_BILL"]);
if ($_POST["action"] == 'STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER') $count+=dolibarr_set_const($db, "STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER", $_POST["STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER"]);
if ($count == 3)
{
$db->commit();
Header("Location: stock.php");
exit;
}
else
{
$db->rollback();
dolibarr_print_error("Error in some requests", LOG_ERR);
}
}
@ -109,8 +133,8 @@ print "<tr ".$bc[$var].">";
print '<td width="60%">'.$langs->trans("UserWarehouse").'</td>'; print '<td width="60%">'.$langs->trans("UserWarehouse").'</td>';
print '<td width="160" align="right">'; print '<td width="160" align="right">';
print "<form method=\"post\" action=\"stock.php\">"; print "<form method=\"post\" action=\"stock.php\">";
print "<input type=\"hidden\" name=\"action\" value=\"stock_userstock\">"; print "<input type=\"hidden\" name=\"action\" value=\"STOCK_USERSTOCK\">";
print $html->selectyesno("stock_userstock",$conf->global->STOCK_USERSTOCK,1); print $html->selectyesno("STOCK_USERSTOCK",$conf->global->STOCK_USERSTOCK,1);
print '<input type="submit" class="button" value="'.$langs->trans("Modify").'">'; print '<input type="submit" class="button" value="'.$langs->trans("Modify").'">';
print "</form>\n</td>\n</tr>\n"; print "</form>\n</td>\n</tr>\n";
@ -123,8 +147,8 @@ if ($conf->global->STOCK_USERSTOCK == 1)
print '<td width="160" align="right">'; print '<td width="160" align="right">';
print "<form method=\"post\" action=\"stock.php\">"; print "<form method=\"post\" action=\"stock.php\">";
print "<input type=\"hidden\" name=\"action\" value=\"stock_userstock_autocreate\">"; print "<input type=\"hidden\" name=\"action\" value=\"STOCK_USERSTOCK_AUTOCREATE\">";
print $html->selectyesno("stock_userstock_autocreate",$conf->global->STOCK_USERSTOCK_AUTOCREATE,1); print $html->selectyesno("STOCK_USERSTOCK_AUTOCREATE",$conf->global->STOCK_USERSTOCK_AUTOCREATE,1);
print '<input type="submit" class="button" value="'.$langs->trans("Modify").'">'; print '<input type="submit" class="button" value="'.$langs->trans("Modify").'">';
print '</form>'; print '</form>';
@ -144,11 +168,11 @@ if ($conf->facture->enabled)
{ {
$var=!$var; $var=!$var;
print "<tr ".$bc[$var].">"; print "<tr ".$bc[$var].">";
print '<td width="60%">'.$langs->trans("DeStockReStockOnBill").'</td>'; print '<td width="60%">'.$langs->trans("DeStockOnBill").'</td>';
print '<td width="160" align="right">'; print '<td width="160" align="right">';
print "<form method=\"post\" action=\"stock.php\">"; print "<form method=\"post\" action=\"stock.php\">";
print "<input type=\"hidden\" name=\"action\" value=\"stock_bill\">"; print "<input type=\"hidden\" name=\"action\" value=\"STOCK_CALCULATE_ON_BILL\">";
print $html->selectyesno("stock_bill",$conf->global->STOCK_CALCULATE_ON_BILL,1); print $html->selectyesno("STOCK_CALCULATE_ON_BILL",$conf->global->STOCK_CALCULATE_ON_BILL,1);
print '<input type="submit" class="button" value="'.$langs->trans("Modify").'">'; print '<input type="submit" class="button" value="'.$langs->trans("Modify").'">';
print "</form>\n</td>\n</tr>\n"; print "</form>\n</td>\n</tr>\n";
} }
@ -157,11 +181,11 @@ if ($conf->commande->enabled)
{ {
$var=!$var; $var=!$var;
print "<tr ".$bc[$var].">"; print "<tr ".$bc[$var].">";
print '<td width="60%">'.$langs->trans("DeStockReStockOnValidateOrder").'</td>'; print '<td width="60%">'.$langs->trans("DeStockOnValidateOrder").'</td>';
print '<td width="160" align="right">'; print '<td width="160" align="right">';
print "<form method=\"post\" action=\"stock.php\">"; print "<form method=\"post\" action=\"stock.php\">";
print "<input type=\"hidden\" name=\"action\" value=\"stock_validateorder\">"; print "<input type=\"hidden\" name=\"action\" value=\"STOCK_CALCULATE_ON_VALIDATE_ORDER\">";
print $html->selectyesno("stock_validateorder",$conf->global->STOCK_CALCULATE_ON_VALIDATE_ORDER,1); print $html->selectyesno("STOCK_CALCULATE_ON_VALIDATE_ORDER",$conf->global->STOCK_CALCULATE_ON_VALIDATE_ORDER,1);
print '<input type="submit" class="button" value="'.$langs->trans("Modify").'">'; print '<input type="submit" class="button" value="'.$langs->trans("Modify").'">';
print "</form>\n</td>\n</tr>\n"; print "</form>\n</td>\n</tr>\n";
} }
@ -170,11 +194,11 @@ if ($conf->expedition->enabled)
{ {
$var=!$var; $var=!$var;
print "<tr ".$bc[$var].">"; print "<tr ".$bc[$var].">";
print '<td width="60%">'.$langs->trans("DeStockReStockOnShipment").'</td>'; print '<td width="60%">'.$langs->trans("DeStockOnShipment").'</td>';
print '<td width="160" align="right">'; print '<td width="160" align="right">';
print "<form method=\"post\" action=\"stock.php\">"; print "<form method=\"post\" action=\"stock.php\">";
print "<input type=\"hidden\" name=\"action\" value=\"stock_shipment\">"; print "<input type=\"hidden\" name=\"action\" value=\"STOCK_CALCULATE_ON_SHIPMENT\">";
print $html->selectyesno("stock_shipment",$conf->global->STOCK_CALCULATE_ON_SHIPMENT,1); print $html->selectyesno("STOCK_CALCULATE_ON_SHIPMENT",$conf->global->STOCK_CALCULATE_ON_SHIPMENT,1);
print '<input type="submit" class="button" value="'.$langs->trans("Modify").'">'; print '<input type="submit" class="button" value="'.$langs->trans("Modify").'">';
print "</form>\n</td>\n</tr>\n"; print "</form>\n</td>\n</tr>\n";
} }
@ -187,11 +211,31 @@ print " <td align=\"right\" width=\"160\">".$langs->trans("Value")."</td>\n";
print '</tr>'."\n"; print '</tr>'."\n";
$var=true; $var=true;
if ($conf->fournisseur->enabled)
{
$var=!$var;
print "<tr ".$bc[$var].">";
print '<td width="60%">'.$langs->trans("ReStockOnBill").'</td>';
print '<td width="160" align="right">';
print "<form method=\"post\" action=\"stock.php\">";
print "<input type=\"hidden\" name=\"action\" value=\"STOCK_CALCULATE_ON_SUPPLIER_BILL\">";
print $html->selectyesno("STOCK_CALCULATE_ON_SUPPLIER_BILL",$conf->global->STOCK_CALCULATE_ON_SUPPLIER_BILL,1);
print '<input type="submit" class="button" value="'.$langs->trans("Modify").'">';
print "</form>\n</td>\n</tr>\n";
}
$var=!$var; if ($conf->commande->enabled)
print "<tr ".$bc[$var].">"; {
print '<td colspan="2">'.$langs->trans("FeatureNotYetAvailable").'</td>'; $var=!$var;
print '</tr>'."\n"; print "<tr ".$bc[$var].">";
print '<td width="60%">'.$langs->trans("ReStockOnValidateOrder").'</td>';
print '<td width="160" align="right">';
print "<form method=\"post\" action=\"stock.php\">";
print "<input type=\"hidden\" name=\"action\" value=\"STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER\">";
print $html->selectyesno("STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER",$conf->global->STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER,1);
print '<input type="submit" class="button" value="'.$langs->trans("Modify").'">';
print "</form>\n</td>\n</tr>\n";
}
print '</table>'; print '</table>';

View File

@ -1083,7 +1083,7 @@ class Facture extends CommonObject
$this->update_price(); $this->update_price();
// Validation de la facture // Validation de la facture
$sql = 'UPDATE '.MAIN_DB_PREFIX.'facture '; $sql = 'UPDATE '.MAIN_DB_PREFIX.'facture';
$sql.= " SET facnumber='".$numfa."', fk_statut = 1, fk_user_valid = ".$user->id; $sql.= " SET facnumber='".$numfa."', fk_statut = 1, fk_user_valid = ".$user->id;
if ($conf->global->FAC_FORCE_DATE_VALIDATION) if ($conf->global->FAC_FORCE_DATE_VALIDATION)
{ {
@ -1094,15 +1094,16 @@ class Facture extends CommonObject
$sql.= ', date_lim_reglement='.$this->db->idate($datelim); $sql.= ', date_lim_reglement='.$this->db->idate($datelim);
} }
$sql.= ' WHERE rowid = '.$this->id; $sql.= ' WHERE rowid = '.$this->id;
dolibarr_syslog("Facture::set_valid() sql=".$sql, LOG_DEBUG);
$resql=$this->db->query($sql); $resql=$this->db->query($sql);
if ($resql) if ($resql)
{ {
$this->facnumber=$numfa; $this->facnumber=$numfa;
dolibarr_syslog("Facture::set_valid() sql=$sql");
} }
else else
{ {
dolibarr_syslog("Facture::set_valid() Echec update - 10 - sql=$sql"); dolibarr_syslog("Facture::set_valid() Echec update - 10 - sql=".$sql, LOG_DEBUG);
dolibarr_print_error($this->db); dolibarr_print_error($this->db);
$error++; $error++;
} }
@ -1138,11 +1139,11 @@ class Facture extends CommonObject
if (! $error) if (! $error)
{ {
// Classe la société rattachée comme client // Define third party as a customer
$result=$this->client->set_as_client(); $result=$this->client->set_as_client();
// Si activé on décrémente le produit principal et ses composants à la validation de facture // Si activé on décrémente le produit principal et ses composants à la validation de facture
if ($conf->stock->enabled && $conf->global->STOCK_CALCULATE_ON_BILL) if ($result >= 0 && $conf->stock->enabled && $conf->global->STOCK_CALCULATE_ON_BILL)
{ {
require_once(DOL_DOCUMENT_ROOT."/product/stock/mouvementstock.class.php"); require_once(DOL_DOCUMENT_ROOT."/product/stock/mouvementstock.class.php");
@ -1150,27 +1151,8 @@ class Facture extends CommonObject
{ {
if ($this->lignes[$i]->fk_product && $this->lignes[$i]->product_type == 0) if ($this->lignes[$i]->fk_product && $this->lignes[$i]->product_type == 0)
{ {
dolibarr_syslog("Facture::set_valid() correct stock for ".$this->lignes[$i]->rowid);
// It's a product
if ($conf->global->PRODUIT_SOUSPRODUITS)
{
$prod = new Product($this->db, $this->lignes[$i]->fk_product);
$prod -> get_sousproduits_arbo();
$prods_arbo = $prod->get_each_prod();
if(sizeof($prods_arbo) > 0)
{
foreach($prods_arbo as $key => $value)
{
// on décompte le stock de tous les sousproduits
$mouvS = new MouvementStock($this->db);
$entrepot_id = "1"; //Todo: ajouter possibilité de choisir l'entrepot
$result=$mouvS->livraison($user, $value[1], $entrepot_id, $value[0]*$this->lignes[$i]->qty);
}
}
}
$mouvP = new MouvementStock($this->db); $mouvP = new MouvementStock($this->db);
// on décompte le stock du produit principal // We decrease stock for product
$entrepot_id = "1"; // TODO ajouter possibilité de choisir l'entrepot $entrepot_id = "1"; // TODO ajouter possibilité de choisir l'entrepot
$result=$mouvP->livraison($user, $this->lignes[$i]->fk_product, $entrepot_id, $this->lignes[$i]->qty); $result=$mouvP->livraison($user, $this->lignes[$i]->fk_product, $entrepot_id, $this->lignes[$i]->qty);
} }
@ -1181,15 +1163,24 @@ class Facture extends CommonObject
$this->use_webcal=($conf->global->PHPWEBCALENDAR_BILLSTATUS=='always'?1:0); $this->use_webcal=($conf->global->PHPWEBCALENDAR_BILLSTATUS=='always'?1:0);
// Appel des triggers if ($result > 0)
include_once(DOL_DOCUMENT_ROOT . "/interfaces.class.php"); {
$interface=new Interfaces($this->db); // Appel des triggers
$result=$interface->run_triggers('BILL_VALIDATE',$this,$user,$langs,$conf); include_once(DOL_DOCUMENT_ROOT . "/interfaces.class.php");
if ($result < 0) { $error++; $this->errors=$interface->errors; } $interface=new Interfaces($this->db);
// Fin appel triggers $result=$interface->run_triggers('BILL_VALIDATE',$this,$user,$langs,$conf);
if ($result < 0) { $error++; $this->errors=$interface->errors; }
// Fin appel triggers
$this->db->commit();
return 1;
}
else
{
$this->db->rollback();
return -1;
}
$this->db->commit();
return 1;
} }
else else
{ {

View File

@ -45,12 +45,12 @@ class FactureFournisseur extends Facture
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';
//! 0=brouillon, //! 0=draft,
//! 1=validée, //! 1=validated,
//! TODO Ce statut doit etre 2 et non 1 classée payée partiellement (close_code='discount_vat','badcustomer') ou complètement (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),
//! TODO Ce statut doit etre 2 et non 1 classée abandonnée et aucun paiement n'a eu lieu (close_code='badcustomer','abandon' ou 'replaced') //! TODO Ce statut doit etre 2 et non 1 classee abandonnee et aucun paiement n'a eu lieu (close_code='badcustomer','abandon' ou 'replaced')
var $statut; var $statut;
//! 1 si facture payée COMPLETEMENT, 0 sinon (ce champ ne devrait plus servir car insuffisant) //! 1 si facture payee COMPLETEMENT, 0 sinon (ce champ ne devrait plus servir car insuffisant)
var $paye; var $paye;
var $author; var $author;
@ -71,7 +71,7 @@ class FactureFournisseur extends Facture
/** /**
* \brief Constructeur de la classe * \brief Constructeur de la classe
* \param DB Handler accès base de données * \param DB Database access handler
* \param socid Id societe ('' par defaut) * \param socid Id societe ('' par defaut)
* \param facid Id facture ('' par defaut) * \param facid Id facture ('' par defaut)
*/ */
@ -97,8 +97,8 @@ class FactureFournisseur extends Facture
} }
/** /**
* \brief Création de la facture en base * \brief Creation de la facture en base
* \param user object utilisateur qui crée * \param user object utilisateur qui cree
* \return int id facture si ok, < 0 si erreur * \return int id facture si ok, < 0 si erreur
*/ */
function create($user) function create($user)
@ -137,7 +137,7 @@ class FactureFournisseur extends Facture
$this->lignes[$i]->qty); $this->lignes[$i]->qty);
} }
} }
// Mise à jour prix // Update total price
if ($this->update_price() > 0) if ($this->update_price() > 0)
{ {
$this->db->commit(); $this->db->commit();
@ -168,8 +168,8 @@ class FactureFournisseur extends Facture
} }
/** /**
* \brief Recupére l'objet facture et ses lignes de factures * \brief Recup<EFBFBD>re l'objet facture et ses lignes de factures
* \param rowid id de la facture a récupérer * \param rowid id de la facture a r<EFBFBD>cup<EFBFBD>rer
* \return int >0 si ok, <0 si ko * \return int >0 si ok, <0 si ko
*/ */
function fetch($rowid) function fetch($rowid)
@ -250,7 +250,7 @@ class FactureFournisseur extends Facture
/** /**
\brief Recupére les lignes de factures dans this->lignes \brief Recup<EFBFBD>re les lignes de factures dans this->lignes
\return int 1 si ok, < 0 si erreur \return int 1 si ok, < 0 si erreur
*/ */
function fetch_lines() function fetch_lines()
@ -307,7 +307,7 @@ class FactureFournisseur extends Facture
/** /**
* \brief Recupére l'objet fournisseur lié à la facture * \brief Recup<EFBFBD>re l'objet fournisseur li<EFBFBD> <EFBFBD> la facture
* *
*/ */
function fetch_fournisseur() function fetch_fournisseur()
@ -319,7 +319,7 @@ class FactureFournisseur extends Facture
/** /**
* \brief Supprime la facture * \brief Supprime la facture
* \param rowid id de la facture à supprimer * \param rowid id de la facture <EFBFBD> supprimer
*/ */
function delete($rowid) function delete($rowid)
{ {
@ -355,8 +355,8 @@ class FactureFournisseur extends Facture
/** /**
* \brief Tag la facture comme payée complètement * \brief Tag la facture comme pay<EFBFBD>e compl<EFBFBD>tement
* \param user Objet utilisateur qui modifie l'état * \param user Objet utilisateur qui modifie l'<EFBFBD>tat
* \return int <0 si ko, >0 si ok * \return int <0 si ko, >0 si ok
*/ */
function set_payed($user) function set_payed($user)
@ -376,7 +376,7 @@ class FactureFournisseur extends Facture
/** /**
* \brief Tag la facture comme validée * \brief Set invoice status as validate
* \param user Objet utilisateur qui valide la facture * \param user Objet utilisateur qui valide la facture
* \return int <0 si ko, >0 si ok * \return int <0 si ko, >0 si ok
*/ */
@ -390,19 +390,46 @@ class FactureFournisseur extends Facture
$sql.= " SET fk_statut = 1, fk_user_valid = ".$user->id; $sql.= " SET fk_statut = 1, fk_user_valid = ".$user->id;
$sql.= " WHERE rowid = ".$this->id; $sql.= " WHERE rowid = ".$this->id;
dolibarr_syslog("FactureFournisseur::set_valid sql=".$sql,LOG_DEBUG); dolibarr_syslog("FactureFournisseur::set_valid sql=".$sql, LOG_DEBUG);
$resql = $this->db->query($sql); $resql = $this->db->query($sql);
if ($resql) if ($resql)
{ {
// Appel des triggers $result=0;
include_once(DOL_DOCUMENT_ROOT . "/interfaces.class.php");
$interface=new Interfaces($this->db);
$result=$interface->run_triggers('BILL_SUPPLIER_VALIDATE',$this,$user,$langs,$conf);
if ($result < 0) { $error++; $this->errors=$interface->errors; }
// Fin appel triggers
$this->db->commit(); // Si activé on décrémente le produit principal et ses composants à la validation de facture
return 1; if ($result >= 0 && $conf->stock->enabled && $conf->global->STOCK_CALCULATE_ON_SUPPLIER_BILL)
{
require_once(DOL_DOCUMENT_ROOT."/product/stock/mouvementstock.class.php");
for ($i = 0 ; $i < sizeof($this->lignes) ; $i++)
{
if ($this->lignes[$i]->fk_product && $this->lignes[$i]->product_type == 0)
{
$mouvP = new MouvementStock($this->db);
// We increase stock for product
$entrepot_id = "1"; // TODO ajouter possibilité de choisir l'entrepot
$result=$mouvP->reception($user, $this->lignes[$i]->fk_product, $entrepot_id, $this->lignes[$i]->qty);
}
}
}
if ($result > 0)
{
// Appel des triggers
include_once(DOL_DOCUMENT_ROOT . "/interfaces.class.php");
$interface=new Interfaces($this->db);
$result=$interface->run_triggers('BILL_SUPPLIER_VALIDATE',$this,$user,$langs,$conf);
if ($result < 0) { $error++; $this->errors=$interface->errors; }
// Fin appel triggers
$this->db->commit();
return 1;
}
else
{
$this->db->rollback();
return -1;
}
} }
else else
{ {
@ -414,20 +441,20 @@ class FactureFournisseur extends Facture
/** /**
* \brief Ajoute une ligne de facture (associé à aucun produit/service prédéfini) * \brief Ajoute une ligne de facture (associ<EFBFBD> <EFBFBD> aucun produit/service pr<EFBFBD>d<EFBFBD>fini)
* \param desc Description de la ligne * \param desc 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 txtva Taux de tva forcé, sinon -1 * \param txtva Taux de tva forc<EFBFBD>, sinon -1
* \param qty Quantité * \param qty Quantit<EFBFBD>
* \param fk_product Id du produit/service predéfini * \param fk_product Id du produit/service pred<EFBFBD>fini
* \param remise_percent Pourcentage de remise de la ligne * \param remise_percent Pourcentage de remise de la ligne
* \param date_start Date de debut de validité du service * \param date_start Date de debut de validit<EFBFBD> du service
* \param date_end Date de fin de validité du service * \param date_end Date de fin de validit<EFBFBD> du service
* \param ventil Code de ventilation comptable * \param ventil Code de ventilation comptable
* \param info_bits Bits de type de lignes * \param info_bits Bits de type de lignes
* \param price_base_type HT ou TTC * \param price_base_type HT ou TTC
* \remarks Les parametres sont deja censé etre juste et avec valeurs finales a l'appel * \remarks Les parametres sont deja cens<EFBFBD> etre juste et avec valeurs finales a l'appel
* de cette methode. Aussi, pour le taux tva, il doit deja avoir ete défini * de cette methode. Aussi, pour le taux tva, il doit deja avoir ete d<EFBFBD>fini
* par l'appelant par la methode get_default_tva(societe_vendeuse,societe_acheteuse,taux_produit) * par l'appelant par la methode get_default_tva(societe_vendeuse,societe_acheteuse,taux_produit)
* et le desc doit deja avoir la bonne valeur (a l'appelant de gerer le multilangue) * et le desc doit deja avoir la bonne valeur (a l'appelant de gerer le multilangue)
*/ */
@ -438,7 +465,7 @@ class FactureFournisseur extends Facture
$this->db->begin(); $this->db->begin();
// Nettoyage paramètres // Nettoyage param<EFBFBD>tres
if ($txtva == '') $txtva=0; if ($txtva == '') $txtva=0;
$txtva=price2num($txtva); $txtva=price2num($txtva);
@ -475,12 +502,12 @@ class FactureFournisseur extends Facture
} }
/** /**
* \brief Mets à jour une ligne de facture * \brief Mets <EFBFBD> jour une ligne de facture
* \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é * \param qty Quantit<EFBFBD>
* \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
@ -596,7 +623,7 @@ class FactureFournisseur extends Facture
$this->user_validation = $vuser; $this->user_validation = $vuser;
} }
$this->date_creation = $obj->datec; $this->date_creation = $obj->datec;
//$this->date_validation = $obj->datev; \todo La date de validation n'est pas encore gérée //$this->date_validation = $obj->datev; \todo La date de validation n'est pas encore g<EFBFBD>r<EFBFBD>e
} }
$this->db->free($result); $this->db->free($result);
} }
@ -666,14 +693,14 @@ class FactureFournisseur extends Facture
/** /**
* \brief Initialise la facture avec valeurs fictives aléatoire * \brief Initialise la facture avec valeurs fictives al<EFBFBD>atoire
* Sert à générer une facture pour l'aperu des modèles ou demo * Sert <EFBFBD> g<EFBFBD>n<EFBFBD>rer une facture pour l'aperu des mod<EFBFBD>les ou demo
*/ */
function initAsSpecimen() function initAsSpecimen()
{ {
global $user,$langs; global $user,$langs;
// Charge tableau des id de société socids // Charge tableau des id de soci<EFBFBD>t<EFBFBD> socids
$socids = array(); $socids = array();
$sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."societe WHERE fournisseur=1 LIMIT 10"; $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."societe WHERE fournisseur=1 LIMIT 10";
$resql = $this->db->query($sql); $resql = $this->db->query($sql);
@ -706,7 +733,7 @@ class FactureFournisseur extends Facture
} }
} }
// Initialise paramètres // Initialise param<EFBFBD>tres
$this->id=0; $this->id=0;
$this->ref = 'SPECIMEN'; $this->ref = 'SPECIMEN';
$this->specimen=1; $this->specimen=1;

View File

@ -1974,7 +1974,8 @@ class Form
print '<option value="'.$obj->code.'">'; print '<option value="'.$obj->code.'">';
} }
// Si traduction existe, on l'utilise, sinon on prend le libellé par défaut // Si traduction existe, on l'utilise, sinon on prend le libellé par défaut
print $obj->code . ' - ' .($langs->trans("JuridicalStatus".$obj->code)!="JuridicalStatus".$obj->code?$langs->trans("JuridicalStatus".$obj->code):($obj->nom!='-'?$obj->nom:'')); print $obj->code . ' - ';
print ($langs->trans("JuridicalStatus".$obj->code)!="JuridicalStatus".$obj->code?$langs->trans("JuridicalStatus".$obj->code):($obj->nom!='-'?$langs->convToOuptutCharset($obj->nom):''));
print '</option>'; print '</option>';
} }
$i++; $i++;

View File

@ -40,9 +40,11 @@ QtyDispatched=Quantity dispatched
OrderDispatch=Order dispatching OrderDispatch=Order dispatching
RuleForStockManagementDecrease=Rule for stock management decrease RuleForStockManagementDecrease=Rule for stock management decrease
RuleForStockManagementIncrease=Rule for stock management increase RuleForStockManagementIncrease=Rule for stock management increase
DeStockReStockOnBill=Decrease/increase real stocks on invoices/credit notes (warning, in this version, it's only in warehouse number 1 that stock is modified) DeStockOnBill=Decrease real stocks on invoices/credit notes (warning, in this version, it's only in warehouse number 1 that stock is modified)
DeStockReStockOnValidateOrder=Decrease/increase real stocks on orders notes (warning, in this version, it's only in warehouse number 1 that stock is modified) DeStockOnValidateOrder=Decrease real stocks on orders notes (warning, in this version, it's only in warehouse number 1 that stock is modified)
DeStockReStockOnShipment=Decrease/increase real stocks on shipment (recommanded) DeStockOnShipment=Decrease real stocks on shipment (recommanded)
ReStockOnBill=Increase real stocks on invoices/credit notes (warning, in this version, it's only in warehouse number 1 that stock is modified)
ReStockOnValidateOrder=Increase real stocks on orders notes (warning, in this version, it's only in warehouse number 1 that stock is modified)
StockDiffPhysicTeoric=Reason for difference stock physical and theorical StockDiffPhysicTeoric=Reason for difference stock physical and theorical
StockLimitShort=Limit StockLimitShort=Limit
StockLimit=Stock limit for alerts StockLimit=Stock limit for alerts

View File

@ -38,9 +38,11 @@ EnhancedValueOfWarehouses=Valor de stocks
UserWarehouseAutoCreate=Crear existencias automáticamente en la creación de un usuario UserWarehouseAutoCreate=Crear existencias automáticamente en la creación de un usuario
QtyDispatched=Cantidad desglosada QtyDispatched=Cantidad desglosada
OrderDispatch=Desglose pedido OrderDispatch=Desglose pedido
DeStockReStockOnBill=Decrementar/incrementar las existencias con las facturas/abonos DeStockOnBill=Decrementar las existencias con las facturas/abonos
DeStockReStockOnValidateOrder=Decrementar/incrementar las existencias en los pedidos DeStockOnValidateOrder=Decrementar las existencias en los pedidos
DeStockReStockOnShipment=Decrementar/incrementar los stocks en los envíos DeStockOnShipment=Decrementar los stocks en los envíos
ReStockOnBill=Incrementar las existencias con las facturas/abonos
ReStockOnValidateOrder=Incrementar las existencias en los pedidos
StockLimitShort=Límite máximo StockLimitShort=Límite máximo
StockLimit=Límite máximo existencias StockLimit=Límite máximo existencias
PhysicalStock=Stock físico PhysicalStock=Stock físico

View File

@ -40,9 +40,11 @@ QtyDispatched=Quantit
OrderDispatch=Ventilation commande OrderDispatch=Ventilation commande
RuleForStockManagementDecrease=Règle de gestion des décrémentations de stock RuleForStockManagementDecrease=Règle de gestion des décrémentations de stock
RuleForStockManagementIncrease=Règle de gestion des incrémentations de stock RuleForStockManagementIncrease=Règle de gestion des incrémentations de stock
DeStockReStockOnBill=Décrémente/Incrémente les stocks physiques sur les factures/avoirs (attention, dans cette version, c'est toujours dans le premier entrepot numero 1 que se fait l'ajustement) DeStockOnBill=Décrémente les stocks physiques sur les factures/avoirs (attention, dans cette version, c'est toujours dans le premier entrepot numero 1 que se fait l'ajustement)
DeStockReStockOnValidateOrder=Décrémente/Incrémente les stocks physiques sur les commandes (attention, dans cette version, c'est toujours dans le premier entrepot numero 1 que se fait l'ajustement) DeStockOnValidateOrder=Décrémente les stocks physiques sur les commandes (attention, dans cette version, c'est toujours dans le premier entrepot numero 1 que se fait l'ajustement)
DeStockReStockOnShipment=Décrémente/Incrémente les stocks physiques sur les expéditions (recommandé) DeStockOnShipment=Décrémente les stocks physiques sur les expéditions (recommandé)
ReStockOnBill=Incrémente les stocks physiques sur les factures/avoirs (attention, dans cette version, c'est toujours dans le premier entrepot numero 1 que se fait l'ajustement)
ReStockOnValidateOrder=Incrémente les stocks physiques sur les commandes (attention, dans cette version, c'est toujours dans le premier entrepot numero 1 que se fait l'ajustement)
StockDiffPhysicTeoric=Raison écart stock physique-théorique StockDiffPhysicTeoric=Raison écart stock physique-théorique
StockLimitShort=Seuil StockLimitShort=Seuil
StockLimit=Seuil alerte stock StockLimit=Seuil alerte stock

View File

@ -39,9 +39,11 @@ UserWarehouseAutoCreate =Creare uno stock automaticamente durante la creaz
QtyDispatched =Quantità spedita QtyDispatched =Quantità spedita
OrderDispatch =Spedizione dell'ordine OrderDispatch =Spedizione dell'ordine
RuleForStockManagement =Regola per gestione delle scorte RuleForStockManagement =Regola per gestione delle scorte
DeStockReStockOnBill =Diminuzione / aumento reale delle scorte sulle fatture / note di credito (attenzione, in questa versione, è solo nel magazzino numero 1 che viene modificata) DeStockOnBill =Diminuzione reale delle scorte sulle fatture / note di credito (attenzione, in questa versione, è solo nel magazzino numero 1 che viene modificata)
DeStockReStockOnValidateOrder =Diminuzione / aumento reale delle scorte per ordini note (avviso, in questa versione, è solo nel magazzino numero 1 che viene modificata) DeStockOnValidateOrder =Diminuzione reale delle scorte per ordini note (avviso, in questa versione, è solo nel magazzino numero 1 che viene modificata)
DeStockReStockOnShipment =Diminuzione / aumento reale delle scorte sulla spedizione (Raccomandato) DeStockOnShipment =Diminuzione reale delle scorte sulla spedizione (Raccomandato)
ReStockOnBill =Aumente reale delle scorte sulle fatture / note di credito (attenzione, in questa versione, è solo nel magazzino numero 1 che viene modificata)
ReStockOnValidateOrder =Aumente reale delle scorte per ordini note (avviso, in questa versione, è solo nel magazzino numero 1 che viene modificata)
StockDiffPhysicTeoric =Motivo per la differenza di magazzino fisico e teorico StockDiffPhysicTeoric =Motivo per la differenza di magazzino fisico e teorico
StockLimitShort =Limite StockLimitShort =Limite
StockLimit =Magazzino limite per le segnalazioni StockLimit =Magazzino limite per le segnalazioni

View File

@ -97,8 +97,7 @@ $user->rights->produit->creer)
// action recherche des produits par mot-cle et/ou par categorie // action recherche des produits par mot-cle et/ou par categorie
if($action == 'search' ) if($action == 'search' )
{ {
#$sql = 'SELECT p.rowid, p.ref, p.label, p.price, p.fk_product_type'; $sql = 'SELECT DISTINCT p.rowid, p.ref, p.label, p.price';
$sql = 'SELECT p.rowid, p.ref, p.label, p.price';
$sql.= ' FROM '.MAIN_DB_PREFIX.'product as p'; $sql.= ' FROM '.MAIN_DB_PREFIX.'product as p';
$sql.= ' left join '.MAIN_DB_PREFIX.'categorie_product as cp on p.rowid=cp.fk_product'; $sql.= ' left join '.MAIN_DB_PREFIX.'categorie_product as cp on p.rowid=cp.fk_product';
$sql.= " WHERE 1=1"; $sql.= " WHERE 1=1";

View File

@ -48,6 +48,8 @@ class MouvementStock
*/ */
function _create($user, $fk_product, $entrepot_id, $qty, $type, $price=0) function _create($user, $fk_product, $entrepot_id, $qty, $type, $price=0)
{ {
global $conf;
$error = 0; $error = 0;
dolibarr_syslog("MouvementStock::_Create $user->id, $fk_product, $entrepot_id, $qty, $type, $price"); dolibarr_syslog("MouvementStock::_Create $user->id, $fk_product, $entrepot_id, $qty, $type, $price");
@ -132,7 +134,10 @@ class MouvementStock
} }
// Add movement for sub products // Add movement for sub products
$error = $this->_createSubProduct($user, $fk_product, $entrepot_id, $qty, $type, $price=0); if ($conf->global->PRODUIT_SOUSPRODUITS)
{
$error = $this->_createSubProduct($user, $fk_product, $entrepot_id, $qty, $type, $price=0);
}
if ($error == 0) if ($error == 0)
{ {
@ -150,13 +155,14 @@ class MouvementStock
/** /**
* \brief Crée un mouvement en base pour tous les sous-produits * \brief Cr<EFBFBD>e un mouvement en base pour tous les sous-produits
* \return int <0 si ko, 0 si ok * \return int <0 si ko, 0 si ok
*/ */
function _createSubProduct($user, $idProduct, $entrepot_id, $qty, $type, $price=0) function _createSubProduct($user, $idProduct, $entrepot_id, $qty, $type, $price=0)
{ {
$error = 0; $error = 0;
$pids = array(); $pids = array();
$pqtys = array();
$sql = "SELECT fk_product_pere, fk_product_fils, qty"; $sql = "SELECT fk_product_pere, fk_product_fils, qty";
$sql.= " FROM ".MAIN_DB_PREFIX."product_association"; $sql.= " FROM ".MAIN_DB_PREFIX."product_association";
@ -166,9 +172,12 @@ class MouvementStock
$resql=$this->db->query($sql); $resql=$this->db->query($sql);
if ($resql) if ($resql)
{ {
$i=0;
while ($obj=$this->db->fetch_object($resql)) while ($obj=$this->db->fetch_object($resql))
{ {
$pids[]=$obj->fk_product_fils; $pids[$i]=$obj->fk_product_fils;
$pqtys[$i]=$obj->qty;
$i++;
} }
$this->db->free($resql); $this->db->free($resql);
} }
@ -179,9 +188,9 @@ class MouvementStock
} }
// Create movement for each subproduct // Create movement for each subproduct
foreach($pids as $pid) foreach($pids as $key => $value)
{ {
$this->_create($user, $pid, $entrepot_id, $qty, $type, $price); $this->_create($user, $pids[$key], $entrepot_id, $pqtys[$key], $type, $price);
} }
return $error; return $error;
@ -293,7 +302,7 @@ class MouvementStock
* \brief ??? * \brief ???
* \param mvid int Id du mouvement * \param mvid int Id du mouvement
* \param fk_product int Id produit * \param fk_product int Id produit
* \param qty float Quantité * \param qty float Quantit<EFBFBD>
* \param price float Prix unitaire du produit * \param price float Prix unitaire du produit
* \param value_ope float Valeur du mouvement en retour * \param value_ope float Valeur du mouvement en retour
* \return int <0 si ko, 0 si ok * \return int <0 si ko, 0 si ok

View File

@ -914,19 +914,22 @@ class Societe extends CommonObject
} }
/** /**
* \brief D<EFBFBD>finit la soci<EFBFBD>t<EFBFBD> comme un client * \brief Define third party as a customer
* * \return int <0 if KO, >0 if OK
*/ */
function set_as_client() function set_as_client()
{ {
if ($this->id) if ($this->id)
{ {
$sql = "UPDATE ".MAIN_DB_PREFIX."societe "; $sql = "UPDATE ".MAIN_DB_PREFIX."societe";
$sql .= " SET client = 1"; $sql.= " SET client = 1";
$sql .= " WHERE rowid = " . $this->id .";"; $sql.= " WHERE rowid = " . $this->id;
return $this->db->query($sql); $resql=$this->db->query($sql);
if ($resql) return 1;
else return -1;
} }
return 0;
} }
/** /**