Commit 10892577 by François C.

Allow supplier reference product search in purchase order context

parent 9b200321
......@@ -4,4 +4,4 @@
# @author: La Cagette
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from . import models
......@@ -16,10 +16,16 @@
# method B, you need to add the module name of the method B in the 'depends'
# list before the module name of method A
{
'name': 'Cagette - Product',
'name': 'La Cagette - Product',
'version': '9.0.1.1.6',
'category': 'Custom',
'summary': 'Implements La Cagette product specific views and action',
'description': """
Actions implémentées :\n
- Impression d'étiquettes
- Lors de la recherche par nom d'un produit, rechercher également par code fournisseur
- Lors de la sauvegarde d'une fiche article, vérification de la validité du code barre (EAN8, EAN13 ou chaîne vide).
""",
'author': 'La Cagette',
'website': 'https://lacagette-coop.fr',
'depends': [
......
# -*- coding: utf-8 -*-
from . import product_product, product_template
# -*- encoding: utf-8 -*-
##############################################################################
#
# Product - Average Consumption Module for Odoo
# Copyright (C) 2021-Today GRAP (http://www.grap.coop)
# @author Damien Moulard
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from openerp import models, fields, api
class ProductProduct(models.Model):
_inherit = "product.product"
@api.model
def name_search(self, name='', args=None, operator='ilike', limit=100):
res = super(ProductProduct, self).name_search(
name=name, args=args, operator=operator, context=self._context, limit=limit)
# Supplier id in self._context doesn't seem to be used in regular name_search,
# so don't use it here neither for consistency
# print(self._context)
try:
# Context: asking for purchasable products: search with supplier code
if args[0][0] == 'purchase_ok':
sql = """
SELECT pt.name, pp.id, psi.product_code
FROM product_template pt
INNER JOIN product_product pp ON pt.id = pp.product_tmpl_id
INNER JOIN product_supplierinfo psi ON pt.id = psi.product_tmpl_id
WHERE pt.purchase_ok IS TRUE
AND psi.product_code ILIKE '{}%'
LIMIT {}
""".format(name, limit)
self.env.cr.execute(sql)
psi = self.env.cr.dictfetchall()
# Complete res to <limit> results,
# and/or replace in result to have at least 3 results from this search
nb_to_add = limit-len(res)
nb_to_replace = 0
if len(res) == limit:
nb_to_replace = 3
nb_to_add = 0
elif len(res) == limit-1 :
nb_to_replace = 2
nb_to_add = 1
elif len(res) == limit-2 :
nb_to_replace = 1
nb_to_add = 2
# Replace last elements, if there are elements to replace
psi_i = 0
i = 0
while i < nb_to_replace and psi_i < len(psi):
psi_item = [
psi[psi_i]['id'],
'[ref four. ' + psi[psi_i]['product_code'] + '] '
+ psi[psi_i]['name']
]
res[limit-nb_to_replace+i] = psi_item
i += 1
psi_i += 1
# Add elements to complete to <limit> results
i = 0
while i < nb_to_add and psi_i < len(psi):
psi_item = [
psi[psi_i]['id'],
'[ref four. ' + psi[psi_i]['product_code'] + '] '
+ psi[psi_i]['name']
]
res.append(psi_item)
i += 1
psi_i += 1
except Exception as e:
# Error is likely that there is no context: search normally
print(e)
return res
# -*- encoding: utf-8 -*-
##############################################################################
#
# Product - Average Consumption Module for Odoo
# Copyright (C) 2021-Today GRAP (http://www.grap.coop)
# @author Damien Moulard
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from openerp import models, fields, api
from openerp.exceptions import ValidationError
import math
class ProductTemplate(models.Model):
_inherit = "product.template"
@api.constrains('barcode')
def _check_barcode(self):
""" Vérification du code barre avant de sauvegarder une fiche article"""
for record in self:
barcode_str = '' if not record.barcode else str(record.barcode)
if len(barcode_str) == 0 :
return None
elif not barcode_str.isdigit():
raise ValidationError("Le code-barre n'est pas au bon format : "
+ "il doit être composé de chiffres uniquement.")
elif ( len(barcode_str) > 0
and len(barcode_str) != 8
and len(barcode_str) != 13 ):
raise ValidationError("Le code-barre n'est pas au bon format : "
+ "il faut 8 ou 13 chiffres. "
+ "Vous pouvez aussi laisser le champ vide.")
else:
# Vérification de la validité codebarre: calcul du dernier digit
# Sur un code-barre composé des chiffres (sans le dernier digit):
# N1 N2 ... Nn-1 Nn
# On calcule la somme :
# Nn * 3 + Nn-1 * 1 + Nn-2 * 3 + Nn-3 * 1 ...
# On soustrait le résultat à l'arrondi à la dizaine supérieur
# Le résultat devrait être le dernier digit
checksum = 0
for i in range(len(barcode_str)-2, -1, -1):
d = 3 if (len(barcode_str)-1 - i+1) % 2 == 0 else 1
checksum += int(barcode_str[i]) * d
roundup = int(math.ceil(checksum / 10.0) * 10)
check_digit = roundup - checksum
if str(check_digit) != barcode_str[len(barcode_str)-1]:
raise ValidationError("Le code-barre n'est pas valide. "
+ "(la validation par la clé de vérification a échoué)")
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment