Module Stock d’OpenERP : Quantité disponible et affichage des stocks

Bonjour à tous,

Aujourd’hui, la demande d’un client a été l’occasion pour nous d’explorer plus avant le fonctionnement de la gestion des stocks, notamment comment était calculé la quantité disponible et le stock virtuel d’un produit.

Pour ceux qui ne le savent pas, la quantité disponible représente la quantité de produit qui est actuellement physiquement présente dans un emplacement tandis que le stock virtuel représente la quantité qui sera disponible quand tous les fournisseurs auront livré les commandes et quand la société aura livré tous ses clients. Ce dernier est notamment très utile pour les commerciaux ce qui leur permet de déterminer la quantité de produits qu’ils peuvent promettre à leurs clients.

Ces champs sont mis à jour dynamiquement en fonction des mouvements de stocks, que ce soit des produits entrants, expéditions etc…

Le problème qui se posait, c’est que la structure des emplacements ayant été modifiée, les quantités disponibles et stocks virtuels de tous les produits restaient invariablement à 0. Cela nous a poussé à chercher comment étaient calculés ces champs, et notamment quels emplacements de stock étaient considérés par OpenERP comme faisant parti du stock de la société et donc comme produit disponible.

Nous avons d’abord pensé que tous les emplacements ayant le type “emplacement interne” étaient pris en compte, ce qui était faux. Nous avons également pensé qu’il fallait obligatoirement garder les emplacement “Emplacement physique” / “nom de la société” / “Stock” définis par défaut mais c’était faux également.

Ne trouvant pas l’information sur Internet, nous avons dû regarder directement dans le code. L’information se trouve dans le fichier product.py du module stock.

En vérité, ils sont basés non sur les emplacements mais sur les entrepots (stock.warehouse). Ceux-ci ont un emplacement stock et c’est celui-ci qui est utilisé pour le calcul des quantités disponibles du produit. Ainsi, les quantités disponibles d’un produit sont les quantités de ce produit dans tous les emplacement de stock de tous les entrepôt existants.
Si vous avez à modifier vos emplacement de stock, n’oubliez donc pas de renseigner l’emplacement de stock de vos entrepots.

Pour information supplémentaire, sachez que lorsque vous consulter la liste des produits en créant un devis, la liste des produits affiche uniquement les quantités disponibles dans l’entrepot du magasin de la commande, et donc uniquement l’emplacement de stock et ses emplacements fils de cet entrepot. Sur la fiche produit, en revanche tous les entrepots sont pris en compte.

Le client nous a également demandé que seul les produits ayant une quantité différente de zéro (dans le cas du client, seulement 40 produits au lieu de 2000…) soient affichés quand on consulte les produits d’un emplacement de stock. Pour les plus techniques d’entre vous, voici le code qu’on a implanté dans le module stock.

Il vous faut modifier le fichier stock/wizard/wizard_location_product.py et remplacer la fonction _action_open_windows par celle-ci :

def _action_open_window(self, cr, uid, data, context):

self.pool = pooler.get_pool(cr.dbname)
product_obj = self.pool.get(‘product.product’)

product_ids = product_obj.search(cr, uid, [(‘active’,’=’,True)])
prod_context = {‘location': data[‘ids’][0],’from_date':data[‘form’][‘from_date’],’to_date':data[‘form’][‘to_date’]}
products = product_obj.read(cr, uid, product_ids, [‘qty_available’,’virtual_available’], prod_context)

res = []

for product in products:
if (product[‘qty_available’] > 0) or (product[‘virtual_available’] > 0):
res = res + [product[‘id’]]

return {
‘name': False,
‘view_type': ‘form’,
“view_mode”: ‘tree,form’,
‘res_model': ‘product.product’,
‘type': ‘ir.actions.act_window’,
‘context':{‘location': data[‘ids’][0],’from_date':data[‘form’][‘from_date’],’to_date':data[‘form’][‘to_date’]},
‘domain':[(‘type’,'<>’,’service’),(‘id’,’in’,res)]
}

Il n’est pas certain que Tiny accepte ce code car il est très consommateur en ressource système (il doit passer les 2000 produits ayant la case “actif” cochée en revue et calculer leurs quantités disponibles avant de sélectionner ceux qui apparaitront), mais c’est il est vrai une amélioration ergonomique notable que de pouvoir afficher que les produits présents dans l’emplacement consulté.

3 thoughts on “Module Stock d’OpenERP : Quantité disponible et affichage des stocks”

  1. Je viens de tomber sur ça, juste une remarque à ce que vous dite concernant les performances, en ajoutant un attribut ‘store’ aux champs qty_available et virtual_available, vous pourriez directement effectuer votre tri dans la requête SQL, et gagner -énormément- en performance.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>