To reproduce the issue:
(Need stock_barcode)
1. Create a product:
- Barcode: 1234567890123
2. Print the label
3. Try to scan the barcode and check the value read.
Error: The value is 1234567890128, the last digit is incorrect (8
instead of 3)
When printing a barcode, we use the library 'report-lab' to generate a
barcode image from a value and a barcode type. In case of EAN-13, if the
value contains a non-digit character, it will raise an error. We then
catch the error and retry to generate the barcode according to the
barcode type Code128:
https://github.com/odoo/odoo/blob/87698d90f02bfe93c6e643f4876a5ccd74788eff/odoo/addons/base/models/ir_actions_report.py#L569-L575
However, if the value contains only digits, the method will use the 12
first digits:
https://github.com/mattjmorrison/ReportLab/blob/dade0f303cb6fcdbe535c4cc92e6102c2417b699/src/reportlab/graphics/barcode/eanbc.py#L187-L188
and will then add the last one, the check digit, which is computed by
the library. This explains why, in the above use case, the barcode value
returned by the scanner is not the same than the expected one.
Note: Similar behavior with type EAN-8
OPW-2902150
closes odoo/odoo#97052
X-original-commit: a2c7470f8fd46b2520f7b8f0750c63216273ce96
Related: odoo/enterprise#30160
Signed-off-by: Steve Van Essche <svs@odoo.com>
Signed-off-by: Adrien Widart <awt@odoo.com>
28 lines
1.6 KiB
Python
28 lines
1.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo.tests.common import TransactionCase
|
|
from odoo.tools import check_barcode_encoding, get_barcode_check_digit
|
|
|
|
|
|
class TestBarcode(TransactionCase):
|
|
def test_barcode_check_digit(self):
|
|
ean8 = "87111125"
|
|
self.assertEqual(get_barcode_check_digit("0" * 10 + ean8), int(ean8[-1]))
|
|
ean13 = "1234567891231"
|
|
self.assertEqual(get_barcode_check_digit("0" * 5 + ean13), int(ean13[-1]))
|
|
|
|
def test_barcode_encoding(self):
|
|
self.assertTrue(check_barcode_encoding('20220006', 'ean8'))
|
|
self.assertTrue(check_barcode_encoding('93855341', 'ean8'))
|
|
self.assertTrue(check_barcode_encoding('2022071416014', 'ean13'))
|
|
self.assertTrue(check_barcode_encoding('9745213796142', 'ean13'))
|
|
|
|
self.assertFalse(check_barcode_encoding('2022a006', 'ean8'), 'should contains digits only')
|
|
self.assertFalse(check_barcode_encoding('20220000', 'ean8'), 'incorrect check digit')
|
|
self.assertFalse(check_barcode_encoding('93855341', 'ean13'), 'ean13 is a 13-digits barcode')
|
|
self.assertFalse(check_barcode_encoding('9745213796142', 'ean8'), 'ean8 is a 8-digits barcode')
|
|
self.assertFalse(check_barcode_encoding('9745213796148', 'ean13'), 'incorrect check digit')
|
|
self.assertFalse(check_barcode_encoding('2022!71416014', 'ean13'), 'should contains digits only')
|
|
self.assertFalse(check_barcode_encoding('0022071416014', 'ean13'), 'when starting with one zero, it indicates that a 12-digit UPC-A code follows')
|