Fix: Can't remove a product if linked to a category

This commit is contained in:
Laurent Destailleur 2008-02-29 00:00:54 +00:00
parent a265ccb79f
commit 3ffee73b31

View File

@ -23,7 +23,7 @@
/**
\file htdocs/product.class.php
\ingroup produit
\brief Fichier de la classe des produits prédéfinis
\brief Fichier de la classe des produits pr<EFBFBD>d<EFBFBD>finis
\version $Id$
*/
@ -32,7 +32,7 @@ require_once(DOL_DOCUMENT_ROOT ."/commonobject.class.php");
/**
\class Product
\brief Classe permettant la gestion des produits prédéfinis
\brief Classe permettant la gestion des produits pr<EFBFBD>d<EFBFBD>finis
*/
class Product extends CommonObject
{
@ -43,7 +43,7 @@ class Product extends CommonObject
//! Identifiant unique
var $id ;
//! Référence
//! R<EFBFBD>f<EFBFBD>rence
var $ref;
var $libelle;
var $description;
@ -70,7 +70,7 @@ class Product extends CommonObject
// Statut indique si le produit est en vente '1' ou non '0'
var $status;
//! Unités de mesure
//! Unit<EFBFBD>s de mesure
var $new_weight;
var $weight;
var $weight_units;
@ -108,7 +108,7 @@ class Product extends CommonObject
/**
* \brief Constructeur de la classe
* \param DB Handler accès base de données
* \param DB Handler acc<EFBFBD>s base de donn<EFBFBD>es
* \param id Id produit (0 par defaut)
*/
function Product($DB, $id=0)
@ -125,7 +125,7 @@ class Product extends CommonObject
if ($id>0) $this->fetch($id);
}
/**
* \brief Vérifie que la référence et libellé du produit est non null
* \brief V<EFBFBD>rifie que la r<EFBFBD>f<EFBFBD>rence et libell<EFBFBD> du produit est non null
* \return int 1 si ok, 0 sinon
*/
function check()
@ -151,7 +151,7 @@ class Product extends CommonObject
}
/**
\brief Insère le produit en base
\brief Ins<EFBFBD>re le produit en base
\param user Utilisateur qui effectue l'insertion
\return int id du produit ou numero d'erreur < 0
*/
@ -317,7 +317,7 @@ class Product extends CommonObject
/**
\brief Mise à jour du produit en base
\brief Mise <EFBFBD> jour du produit en base
\param id id du produit
\param user utilisateur qui effectue l'insertion
\return int 1 si ok, -1 si ref deja existante, -2 autre erreur
@ -384,7 +384,7 @@ class Product extends CommonObject
}
/**
* \brief Vérification de l'utilisation du produit en base
* \brief V<EFBFBD>rification de l'utilisation du produit en base
* \param id id du produit
*/
function verif_prod_use($id)
@ -460,46 +460,48 @@ class Product extends CommonObject
}
/**
* \brief Suppression du produit en base si pas utilisé
* \param id id du produit
*/
function delete($id)
{
global $conf,$user;
if ($user->rights->produit->supprimer)
{
$prod_use = $this->verif_prod_use($id);
if ($prod_use == 0)
{
$sqla = "DELETE from ".MAIN_DB_PREFIX."product ";
$sqla.= " WHERE rowid = ".$id;
$resulta = $this->db->query($sqla);
$sqlb = "DELETE from ".MAIN_DB_PREFIX."product_price ";
$sqlb.= " WHERE fk_product = ".$id;
$resultb = $this->db->query($sqlb);
if ($conf->global->MAIN_MULTILANGS)
{
$sqlc = "DELETE from ".MAIN_DB_PREFIX."product_det ";
$sqlc.= " WHERE fk_product = ".$id;
$resultc = $this->db->query($sqlc);
}
return 0;
}
else
{
$this->error .= "Impossible de supprimer le produit.\n";
return -1;
}
}
}
/**
* \brief Delete a product from database (if not used)
* \param id Product id
* \return int < 0 if KO, >= 0 if OK
*/
function delete($id)
{
global $conf,$user;
if ($user->rights->produit->supprimer)
{
$prod_use = $this->verif_prod_use($id);
if ($prod_use == 0)
{
$sqla = "DELETE from ".MAIN_DB_PREFIX."product";
$sqla.= " WHERE rowid = ".$id;
$resulta = $this->db->query($sqla);
$sqlb = "DELETE from ".MAIN_DB_PREFIX."product_price";
$sqlb.= " WHERE fk_product = ".$id;
$resultb = $this->db->query($sqlb);
$sqlc = "DELETE from ".MAIN_DB_PREFIX."product_det";
$sqlc.= " WHERE fk_product = ".$id;
$resultc = $this->db->query($sqlc);
$sqld = "DELETE from ".MAIN_DB_PREFIX."categorie_product";
$sqld.= " WHERE fk_product = ".$id;
$resultd = $this->db->query($sqld);
return 0;
}
else
{
$this->error .= "Impossible de supprimer le produit.\n";
return -1;
}
}
}
/**
* \brief update ou crée les traductions des infos produits
* \brief update ou cr<EFBFBD>e les traductions des infos produits
*/
function setMultiLangs()
{
@ -612,7 +614,7 @@ class Product extends CommonObject
*/
function _log_price($user)
{
// MultiPrix : si activé, on gère tout ici, même le prix standard
// MultiPrix : si activ<EFBFBD>, on g<>re tout ici, m<>me le prix standard
global $conf;
if ($conf->global->PRODUIT_MULTIPRICES)
@ -684,11 +686,11 @@ class Product extends CommonObject
/**
* \brief Lit le prix pratiqué par un fournisseur
* \brief Lit le prix pratiqu<EFBFBD> par un fournisseur
* On renseigne le couple prodfournprice/qty ou le triplet qty/product_id/fourn_ref)
* \param prodfournprice Id du tarif = rowid table product_fournisseur_price
* \param qty Quantité du produit
* \return int <0 si ko, 0 si ok mais rien trouvé, id_product si ok et trouvé
* \param qty Quantit<EFBFBD> du produit
* \return int <0 si ko, 0 si ok mais rien trouv<EFBFBD>, id_product si ok et trouv<EFBFBD>
*/
function get_buyprice($prodfournprice,$qty,$product_id=0,$fourn_ref=0)
{
@ -741,7 +743,7 @@ class Product extends CommonObject
}
else
{
return -1; // Ce produit existe chez ce fournisseur mais qté insuffisante
return -1; // Ce produit existe chez ce fournisseur mais qt<EFBFBD> insuffisante
}
}
else
@ -762,7 +764,7 @@ class Product extends CommonObject
/**
\brief Modifie le prix d'un produit/service
\param id Id du produit/service à modifier
\param id Id du produit/service <EFBFBD> modifier
\param newprice Nouveau prix
\param newpricebase HT ou TTC
\param user Objet utilisateur qui modifie le prix
@ -788,7 +790,7 @@ class Product extends CommonObject
$price_ttc = price2num($price_ttc,'MU');
}
// Ne pas mettre de quote sur le numériques decimaux.
// Ne pas mettre de quote sur le num<EFBFBD>riques decimaux.
// Ceci provoque des sotckage avec arrondis en base au lieu des valeurs exactes.
$sql = "UPDATE ".MAIN_DB_PREFIX."product ";
$sql .= " SET price=".$price."";
@ -827,9 +829,9 @@ class Product extends CommonObject
/**
* \brief Charge le produit/service en mémoire
* \param id Id du produit/service à charger
* \param ref Ref du produit/service à charger
* \brief Charge le produit/service en m<EFBFBD>moire
* \param id Id du produit/service <EFBFBD> charger
* \param ref Ref du produit/service <EFBFBD> charger
* \return int <0 si ko, >0 si ok
*/
function fetch($id='',$ref='')
@ -1035,7 +1037,7 @@ class Product extends CommonObject
/**
* \brief Charge tableau des stats commande client pour le produit/service
* \param socid Id societe pour filtrer sur une société
* \param socid Id societe pour filtrer sur une soci<EFBFBD>t<EFBFBD>
* \param filtrestatut Id statut pour filtrer sur un statut
* \return array Tableau des stats
*/
@ -1079,7 +1081,7 @@ class Product extends CommonObject
/**
* \brief Charge tableau des stats commande fournisseur pour le produit/service
* \param socid Id societe pour filtrer sur une société
* \param socid Id societe pour filtrer sur une soci<EFBFBD>t<EFBFBD>
* \param filtrestatut Id des statuts pour filtrer sur des statuts
* \return array Tableau des stats
*/
@ -1241,8 +1243,8 @@ class Product extends CommonObject
}
/**
* \brief Renvoie tableau des stats pour une requete donnée
* \param sql Requete a exécuter
* \brief Renvoie tableau des stats pour une requete donn<EFBFBD>e
* \param sql Requete a ex<EFBFBD>cuter
* \return array Tableau de stats, -1 si ko
*/
function _get_stats($sql)
@ -1393,8 +1395,8 @@ class Product extends CommonObject
/**
* \brief Lie un produit associe au produit/service
* \param id_pere Id du produit auquel sera lié le produit à lier
* \param id_fils Id du produit à lier
* \param id_pere Id du produit auquel sera li<EFBFBD> le produit <EFBFBD> lier
* \param id_fils Id du produit <EFBFBD> lier
* \return int < 0 si erreur, > 0 si ok
*/
function add_sousproduit($id_pere, $id_fils,$qty)
@ -1448,8 +1450,8 @@ class Product extends CommonObject
/**
* \brief retire le lien entre un sousproduit et un produit/service
* \param id_pere Id du produit auquel ne sera plus lié le produit li
* \param id_fils Id du produit à ne plus li
* \param id_pere Id du produit auquel ne sera plus li<EFBFBD> le produit li
* \param id_fils Id du produit <EFBFBD> ne plus li
* \return int < 0 si erreur, > 0 si ok
*/
function del_sousproduit($id_pere, $id_fils)
@ -1467,8 +1469,8 @@ class Product extends CommonObject
/**
* \brief retire le lien entre un sousproduit et un produit/service
* \param id_pere Id du produit auquel ne sera plus lié le produit li
* \param id_fils Id du produit à ne plus li
* \param id_pere Id du produit auquel ne sera plus li<EFBFBD> le produit li
* \param id_fils Id du produit <EFBFBD> ne plus li
* \return int < 0 si erreur, > 0 si ok
*/
function is_sousproduit($id_pere, $id_fils)
@ -1530,7 +1532,7 @@ class Product extends CommonObject
/**
* \brief Lie un sous produit au produit/service
* \param id_sub Id du produit à lier
* \param id_sub Id du produit <EFBFBD> lier
* \return int < 0 si erreur, > 0 si ok
*/
function add_subproduct($id_sub)
@ -1664,7 +1666,7 @@ class Product extends CommonObject
/**
* \brief Supprime un tarif fournisseur
* \param user utilisateur qui défait le lien
* \param user utilisateur qui d<EFBFBD>fait le lien
* \param id_fourn id du fournisseur
* \param qty quantit
* \return int < 0 si erreur, > 0 si ok
@ -1747,7 +1749,7 @@ class Product extends CommonObject
return 1;
}
/**
* \brief fonction récursive uniquement utilisée par get_arbo_each_prod, recompose l'arborescence des sousproduits
* \brief fonction r<EFBFBD>cursive uniquement utilis<EFBFBD>e par get_arbo_each_prod, recompose l'arborescence des sousproduits
* \return void
*/
function fetch_prod_arbo($prod,$compl_path="")
@ -1756,7 +1758,7 @@ class Product extends CommonObject
$this->pere_encours;
foreach($prod as $nom_pere => $desc_pere)
{
// on est dans une sous-catégorie
// on est dans une sous-cat<EFBFBD>gorie
if(is_array($desc_pere))
$this->res[]= array($compl_path.stripslashes($nom_pere)." (".$desc_pere[1].")",$desc_pere[0]);
else if($nom_pere != "0" && $nom_pere != "1")
@ -1768,7 +1770,7 @@ class Product extends CommonObject
}
}
/**
* \brief fonction récursive uniquement utilisée par get_each_prod, ajoute chaque sousproduits dans le tableau res
* \brief fonction r<EFBFBD>cursive uniquement utilis<EFBFBD>e par get_each_prod, ajoute chaque sousproduits dans le tableau res
* \return void
*/
function fetch_prods($prod)
@ -1776,7 +1778,7 @@ class Product extends CommonObject
$this->res;
foreach($prod as $nom_pere => $desc_pere)
{
// on est dans une sous-catégorie
// on est dans une sous-cat<EFBFBD>gorie
if(is_array($desc_pere))
$this->res[]= array($desc_pere[1],$desc_pere[0]);
if(sizeof($desc_pere) >1)
@ -1786,7 +1788,7 @@ class Product extends CommonObject
}
}
/**
* \brief reconstruit l'arborescence des catégorie sous la forme d'un tableau
* \brief reconstruit l'arborescence des cat<EFBFBD>gorie sous la forme d'un tableau
* \return array $this->res
*/
function get_arbo_each_prod()
@ -1825,7 +1827,7 @@ class Product extends CommonObject
}
/**
* \brief Retourne les catégories res
* \brief Retourne les cat<EFBFBD>gories p<EFBFBD>res
* \return array prod
*/
function get_pere()
@ -1853,7 +1855,7 @@ class Product extends CommonObject
}
/**
* \brief Retourne les fils de la catégorie structurés pour l'arbo
* \brief Retourne les fils de la cat<EFBFBD>gorie structur<EFBFBD>s pour l'arbo
* \return array prod
*/
function get_fils_arbo ($id_pere)
@ -1881,7 +1883,7 @@ class Product extends CommonObject
}
}
/**
* \brief compose l'arborescence des sousproduits, id, nom et quantité sous la forme d'un tableau associatif
* \brief compose l'arborescence des sousproduits, id, nom et quantit<EFBFBD> sous la forme d'un tableau associatif
* \return void
*/
function get_sousproduits_arbo ()
@ -1893,7 +1895,7 @@ class Product extends CommonObject
foreach($this -> get_fils_arbo($v[0]) as $kf=>$vf)
$peres[$k][$kf] = $vf;
}
// on concatène tout ça
// on concat<EFBFBD>ne tout <20>a
foreach($peres as $k=>$v)
{
$this -> sousprods[$k]=$v;
@ -1924,8 +1926,8 @@ class Product extends CommonObject
}
/**
* \brief Retourne le libellé du statut d'une facture (brouillon, validée, abandonnée, payée)
* \param mode 0=libellé long, 1=libellé court, 2=Picto + Libellé court, 3=Picto, 4=Picto + Libellé long, 5=Libellé court + Picto
* \brief Retourne le libell<EFBFBD> du statut d'une facture (brouillon, valid<EFBFBD>e, abandonn<EFBFBD>e, pay<EFBFBD>e)
* \param mode 0=libell<EFBFBD> long, 1=libell<EFBFBD> court, 2=Picto + Libell<EFBFBD> court, 3=Picto, 4=Picto + Libell<EFBFBD> long, 5=Libell<EFBFBD> court + Picto
* \return string Libelle
*/
function getLibStatut($mode=0)
@ -1934,10 +1936,10 @@ class Product extends CommonObject
}
/**
* \brief Renvoi le libellé d'un statut donne
* \brief Renvoi le libell<EFBFBD> d'un statut donne
* \param status Statut
* \param mode 0=libellé long, 1=libellé court, 2=Picto + Libellé court, 3=Picto, 4=Picto + Libellé long, 5=Libellé court + Picto
* \return string Libellé du statut
* \param mode 0=libell<EFBFBD> long, 1=libell<EFBFBD> court, 2=Picto + Libell<EFBFBD> court, 3=Picto, 4=Picto + Libell<EFBFBD> long, 5=Libell<EFBFBD> court + Picto
* \return string Libell<EFBFBD> du statut
*/
function LibStatut($status,$mode=0)
{
@ -1977,7 +1979,7 @@ class Product extends CommonObject
}
/**
* \brief Entre un nombre de piece du produit en stock dans un entrepôt
* \brief Entre un nombre de piece du produit en stock dans un entrep<EFBFBD>t
* \param id_entrepot id de l'entrepot
* \param nbpiece nombre de pieces
*/
@ -2000,7 +2002,7 @@ class Product extends CommonObject
/**
* \brief Ajuste le stock d'un entrepôt pour le produit à une valeure donnée
* \brief Ajuste le stock d'un entrep<EFBFBD>t pour le produit <EFBFBD> une valeure donn<EFBFBD>e
* \param user utilisateur qui demande l'ajustement
* \param id_entrepot id de l'entrepot
* \param nbpiece nombre de pieces
@ -2035,7 +2037,7 @@ class Product extends CommonObject
}
/**
* \brief Augmente ou réduit la valeur de stock pour le produit
* \brief Augmente ou r<EFBFBD>duit la valeur de stock pour le produit
* \param user utilisateur qui demande l'ajustement
* \param id_entrepot id de l'entrepot
* \param nbpiece nombre de pieces
@ -2079,7 +2081,7 @@ class Product extends CommonObject
}
/**
* \brief Augmente ou réduit le nombre de piece en commande a expedier
* \brief Augmente ou r<EFBFBD>duit le nombre de piece en commande a expedier
* \param nbpiece nombre de pieces
* \param mouvement 0 = ajout, 1 = suppression
* \return int < 0 si erreur, > 0 si ok
@ -2170,11 +2172,11 @@ class Product extends CommonObject
/**
* \brief Déplace fichier uploadé sous le nom $files dans le pertoire sdir
* \param sdir Répertoire destination finale
* \param $file Nom du fichier uploadé
* \param maxWidth Largeur maximum que dois faire la miniature (160 par défaut)
* \param maxHeight Hauteur maximum que dois faire la miniature (120 par défaut)
* \brief D<EFBFBD>place fichier upload<EFBFBD> sous le nom $files dans le r<EFBFBD>pertoire sdir
* \param sdir R<EFBFBD>pertoire destination finale
* \param $file Nom du fichier upload<EFBFBD>
* \param maxWidth Largeur maximum que dois faire la miniature (160 par d<EFBFBD>faut)
* \param maxHeight Hauteur maximum que dois faire la miniature (120 par d<EFBFBD>faut)
*/
function add_photo($sdir, $file, $maxWidth = 160, $maxHeight = 120)
{
@ -2191,23 +2193,23 @@ class Product extends CommonObject
{
$originImage = $dir . $file['name'];
// Crée fichier en taille origine
// Cr<EFBFBD>e fichier en taille origine
doliMoveFileUpload($file['tmp_name'], $originImage);
if (file_exists($originImage))
{
// Crée fichier en taille vignette
// Cr<EFBFBD>e fichier en taille vignette
$this->add_thumb($originImage,$maxWidth,$maxHeight);
}
}
}
/**
* \brief Génère la vignette
* \param sdir Répertoire destination finale
* \brief G<EFBFBD>n<EFBFBD>re la vignette
* \param sdir R<EFBFBD>pertoire destination finale
* \param file Chemin du fichier d'origine
* \param maxWidth Largeur maximum que dois faire la miniature (160 par défaut)
* \param maxHeight Hauteur maximum que dois faire la miniature (120 par défaut)
* \param maxWidth Largeur maximum que dois faire la miniature (160 par d<EFBFBD>faut)
* \param maxHeight Hauteur maximum que dois faire la miniature (120 par d<EFBFBD>faut)
*/
function add_thumb($file, $maxWidth = 160, $maxHeight = 120)
{
@ -2218,8 +2220,8 @@ class Product extends CommonObject
}
/**
* \brief Déplace fichier récupéré sur internet (utilisé pour interface avec OSC)
* \param sdir Répertoire destination finale
* \brief D<EFBFBD>place fichier r<EFBFBD>cup<EFBFBD>r<EFBFBD> sur internet (utilis<EFBFBD> pour interface avec OSC)
* \param sdir R<EFBFBD>pertoire destination finale
* \param $files url de l'image
* Jean Heimburger juin 2007
*/
@ -2236,10 +2238,10 @@ class Product extends CommonObject
if (file_exists($dir))
{
// Crée fichier en taille vignette
// Cr<EFBFBD>e fichier en taille vignette
// \todo A faire
// Crée fichier en taille origine
// Cr<EFBFBD>e fichier en taille origine
$content = file_get_contents($files);
$nom = basename($files);
@ -2251,8 +2253,8 @@ class Product extends CommonObject
}
/**
* \brief Affiche la première photo du produit
* \param sdir Répertoire à scanner
* \brief Affiche la premi<EFBFBD>re photo du produit
* \param sdir R<EFBFBD>pertoire <EFBFBD> scanner
* \return boolean true si photo dispo, false sinon
*/
function is_photo_available($sdir)
@ -2276,11 +2278,11 @@ class Product extends CommonObject
/**
* \brief Affiche toutes les photos du produit (nbmax maximum)
* \param sdir Répertoire à scanner
* \param sdir R<EFBFBD>pertoire <EFBFBD> scanner
* \param size 0=taille origine, 1 taille vignette
* \param nbmax Nombre maximum de photos (0=pas de max)
* \param nbbyrow Nombre vignettes par ligne (si mode vignette)
* \return int Nombre de photos affichées
* \return int Nombre de photos affich<EFBFBD>es
*/
function show_photos($sdir,$size=0,$nbmax=0,$nbbyrow=5)
{
@ -2360,7 +2362,7 @@ class Product extends CommonObject
/**
* \brief Retourne tableau de toutes les photos du produit
* \param dir Répertoire à scanner
* \param dir R<EFBFBD>pertoire <EFBFBD> scanner
* \param nbmax Nombre maximum de photos (0=pas de max)
* \return array Tableau de photos
*/
@ -2433,12 +2435,12 @@ class Product extends CommonObject
}
/**
* \brief Récupère la taille de l'image
* \brief R<EFBFBD>cup<EFBFBD>re la taille de l'image
* \param file Chemin de l'image
*/
function get_image_size($file)
{
$infoImg = getimagesize($file); // Récupération des infos de l'image
$infoImg = getimagesize($file); // R<EFBFBD>cup<EFBFBD>ration des infos de l'image
$this->imgWidth = $infoImg[0]; // Largeur de l'image
$this->imgHeight = $infoImg[1]; // Hauteur de l'image
}
@ -2483,7 +2485,7 @@ class Product extends CommonObject
}
/**
* \brief Mise à jour du code barre
* \brief Mise <EFBFBD> jour du code barre
* \param user Utilisateur qui fait la modification
*/
function update_barcode($user)
@ -2506,7 +2508,7 @@ class Product extends CommonObject
}
/**
* \brief Mise à jour du type de code barre
* \brief Mise <EFBFBD> jour du type de code barre
* \param user Utilisateur qui fait la modification
*/
function update_barcode_type($user)