131 lines
5.6 KiB
Python
131 lines
5.6 KiB
Python
from odoo.exceptions import ValidationError
|
|
from odoo.tests.common import TransactionCase
|
|
|
|
|
|
class TestBarcodeGS1Nomenclature(TransactionCase):
|
|
def test_gs1_date_to_date(self):
|
|
barcode_nomenclature = self.env['barcode.nomenclature']
|
|
# 20/10/2015 -> 151020
|
|
date_gs1 = "151020"
|
|
date = barcode_nomenclature.gs1_date_to_date(date_gs1)
|
|
self.assertEqual(date.day, 20)
|
|
self.assertEqual(date.month, 10)
|
|
self.assertEqual(date.year, 2015)
|
|
|
|
# XX/03/2052 -> 520300 -> (if day no set take last day of the month -> 31)
|
|
date_gs1 = "520300"
|
|
date = barcode_nomenclature.gs1_date_to_date(date_gs1)
|
|
self.assertEqual(date.day, 31)
|
|
self.assertEqual(date.month, 3)
|
|
self.assertEqual(date.year, 2052)
|
|
|
|
# XX/02/2020 -> 520200 -> (if day no set take last day of the month -> 29)
|
|
date_gs1 = "200200"
|
|
date = barcode_nomenclature.gs1_date_to_date(date_gs1)
|
|
self.assertEqual(date.day, 29)
|
|
self.assertEqual(date.month, 2)
|
|
self.assertEqual(date.year, 2020)
|
|
|
|
def test_gs1_extanded_barcode_1(self):
|
|
barcode_nomenclature = self.env['barcode.nomenclature'].browse(self.ref('barcodes_gs1_nomenclature.default_gs1_nomenclature'))
|
|
# (01)94019097685457(10)33650100138(3102)002004(15)131018
|
|
code128 = "01940190976854571033650100138\x1D310200200415131018"
|
|
res = barcode_nomenclature.gs1_decompose_extanded(code128)
|
|
self.assertEqual(len(res), 4)
|
|
self.assertEqual(res[0]["ai"], "01")
|
|
|
|
self.assertEqual(res[1]["ai"], "10")
|
|
|
|
self.assertEqual(res[2]["ai"], "3102")
|
|
self.assertEqual(res[2]["value"], 20.04)
|
|
|
|
self.assertEqual(res[3]["ai"], "15")
|
|
self.assertEqual(res[3]["value"].year, 2013)
|
|
self.assertEqual(res[3]["value"].day, 18)
|
|
self.assertEqual(res[3]["value"].month, 10)
|
|
|
|
# (01)94019097685457(13)170119(30)17
|
|
code128 = "0194019097685457131701193017"
|
|
res = barcode_nomenclature.gs1_decompose_extanded(code128)
|
|
self.assertEqual(len(res), 3)
|
|
self.assertEqual(res[0]["ai"], "01")
|
|
|
|
self.assertEqual(res[1]["ai"], "13")
|
|
self.assertEqual(res[1]["value"].year, 2017)
|
|
self.assertEqual(res[1]["value"].day, 19)
|
|
self.assertEqual(res[1]["value"].month, 1)
|
|
|
|
self.assertEqual(res[2]["ai"], "30")
|
|
self.assertEqual(res[2]["value"], 17)
|
|
|
|
def test_gs1_extanded_barcode_2_decimal(self):
|
|
""" Parses multiples barcode with (or without) a decimal value and
|
|
checks for each of them the value is correctly parsed.
|
|
"""
|
|
# Configures a barcode GS1 nomenclature...
|
|
barcode_nomenclature = self.env['barcode.nomenclature'].create({
|
|
'name': "GS1 Nomenclature - Test",
|
|
'is_gs1_nomenclature': True,
|
|
})
|
|
default_barcode_rule_vals = {
|
|
'default_encoding': 'gs1-128',
|
|
'default_barcode_nomenclature_id': barcode_nomenclature.id,
|
|
'default_type': 'quantity',
|
|
'default_gs1_content_type': 'measure',
|
|
}
|
|
# Creates a rule who don't take any decimal.
|
|
barcode_rule = self.env['barcode.rule'].with_context(default_barcode_rule_vals).create({
|
|
'name': "GS1 Rule Test - No Decimal",
|
|
'pattern': r'(300)(\d{5,8})',
|
|
'gs1_decimal_usage': False,
|
|
})
|
|
# Creates a rule to take the four last digit as decimals.
|
|
barcode_rule_decimal = self.env['barcode.rule'].with_context(default_barcode_rule_vals).create({
|
|
'name': "GS1 Rule Test - Four Decimals",
|
|
'pattern': r'(304)(\d{5,8})',
|
|
'gs1_decimal_usage': True,
|
|
})
|
|
|
|
# Checks barcodes without decimals.
|
|
res = barcode_nomenclature.gs1_decompose_extanded('30000000')
|
|
self.assertEqual(len(res), 1)
|
|
self.assertEqual(res[0]['string_value'], '00000')
|
|
self.assertEqual(res[0]['value'], 0)
|
|
|
|
res = barcode_nomenclature.gs1_decompose_extanded('30018789')
|
|
self.assertEqual(len(res), 1)
|
|
self.assertEqual(res[0]['string_value'], '18789')
|
|
self.assertEqual(res[0]['value'], 18789)
|
|
|
|
res = barcode_nomenclature.gs1_decompose_extanded('3001515000')
|
|
self.assertEqual(len(res), 1)
|
|
self.assertEqual(res[0]['string_value'], '1515000')
|
|
self.assertEqual(res[0]['value'], 1515000)
|
|
|
|
# Checks barcodes with decimals.
|
|
res = barcode_nomenclature.gs1_decompose_extanded('30400000')
|
|
self.assertEqual(len(res), 1)
|
|
self.assertEqual(res[0]['string_value'], '00000')
|
|
self.assertEqual(res[0]['value'], 0.0)
|
|
|
|
res = barcode_nomenclature.gs1_decompose_extanded('30418789')
|
|
self.assertEqual(len(res), 1)
|
|
self.assertEqual(res[0]['string_value'], '18789')
|
|
self.assertEqual(res[0]['value'], 1.8789)
|
|
|
|
res = barcode_nomenclature.gs1_decompose_extanded('3041515000')
|
|
self.assertEqual(len(res), 1)
|
|
self.assertEqual(res[0]['string_value'], '1515000')
|
|
self.assertEqual(res[0]['value'], 151.5)
|
|
|
|
# Checks wrong configs will raise an exception.
|
|
barcode_rule_decimal.pattern = r'()(\d{0,4})'
|
|
# Barcode rule uses decimals but AI doesn't precise what is the decimal position.
|
|
with self.assertRaises(ValidationError):
|
|
res = barcode_nomenclature.gs1_decompose_extanded('1234')
|
|
|
|
# The pattern is too permissive and can catch something which can't be casted as measurement
|
|
barcode_rule.pattern = r'(300)(.*)'
|
|
with self.assertRaises(ValidationError):
|
|
res = barcode_nomenclature.gs1_decompose_extanded('300bilou4000')
|