@@ -11,19 +11,23 @@ class ProductCategory(models.Model):
1111 barcode_prefix = fields .Char (
1212 help = "Prefix used to generate EAN barcodes for products "
1313 "created with this category. Should be 1-12 digits." ,
14+ compute = "_compute_barcode_fields" ,
15+ inverse = "_inverse_barcode_prefix" ,
1416 size = 12 ,
17+ store = True ,
1518 )
1619 barcode_sequence_id = fields .Many2one (
1720 comodel_name = "ir.sequence" ,
1821 help = "Sequence used to generate unique barcode numbers for products "
1922 "in this category." ,
23+ compute = "_compute_barcode_fields" ,
24+ inverse = "_inverse_barcode_sequence_prefix" ,
25+ store = True ,
2026 copy = False ,
21- readonly = True ,
2227 )
2328 auto_generate_barcode = fields .Boolean (
2429 help = "Automatically generate EAN barcode when creating products "
2530 "in this category." ,
26- default = False ,
2731 )
2832
2933 @api .constrains ("barcode_prefix" )
@@ -37,51 +41,45 @@ def _check_barcode_prefix(self):
3741 if len (category .barcode_prefix ) == 0 :
3842 raise UserError (_ ("Barcode prefix cannot be empty" ))
3943
44+ @api .depends ("barcode_sequence_id.prefix" )
45+ def _compute_barcode_fields (self ):
46+ """Compute barcode_prefix from barcode_sequence_id and vice versa."""
47+ for category in self :
48+ category .barcode_prefix = category .barcode_sequence_id .prefix
49+
50+ @api .depends ("barcode_prefix" )
51+ def _inverse_barcode_prefix (self ):
52+ """When barcode_prefix is set, find or create corresponding sequence."""
53+ for category in self :
54+ if category .barcode_prefix :
55+ category .barcode_sequence_id = (
56+ category ._create_or_update_barcode_sequence ()
57+ )
58+
59+ def _create_or_update_barcode_sequence (self ):
60+ if not self .prefix :
61+ return False
62+ existing_sequence = self .env ["ir.sequence" ].search (
63+ [
64+ ("prefix" , "=" , self .prefix ),
65+ ("code" , "like" , "product.barcode" ),
66+ ("company_id" , "=" , False ),
67+ ],
68+ limit = 1 ,
69+ )
70+ if existing_sequence :
71+ return existing_sequence
72+ else :
73+ seq_vals = self ._prepare_barcode_sequence (self .prefix )
74+ return self .env ["ir.sequence" ].create (seq_vals )
75+
4076 @api .model
4177 def _prepare_barcode_sequence (self , prefix ):
42- """Prepare the vals for creating the barcode sequence
43- :param prefix: a string with the prefix of the barcode.
44- :return: a dict with the values.
45- """
4678 vals = {
4779 "name" : "Barcode " + prefix ,
4880 "code" : "product.barcode - " + prefix ,
4981 "padding" : 12 - len (prefix ), # Total 13 digits for EAN-13
5082 "prefix" : prefix ,
5183 "company_id" : False ,
52- "implementation" : "no_gap" ,
5384 }
5485 return vals
55-
56- def _create_or_update_barcode_sequence (self , prefix ):
57- """Create or update barcode sequence for given prefix"""
58- seq_vals = self ._prepare_barcode_sequence (prefix )
59- if self .barcode_sequence_id :
60- self .sudo ().barcode_sequence_id .write (
61- {
62- "prefix" : prefix ,
63- "padding" : 12 - len (prefix ),
64- }
65- )
66- else :
67- self .barcode_sequence_id = self .env ["ir.sequence" ].create (seq_vals )
68-
69- def write (self , vals ):
70- prefix = vals .get ("barcode_prefix" , False )
71- if prefix :
72- for rec in self :
73- rec ._create_or_update_barcode_sequence (prefix )
74- return super ().write (vals )
75-
76- @api .model_create_multi
77- def create (self , vals_list ):
78- vals_list_updated = []
79- for vals in vals_list :
80- prefix = vals .get ("barcode_prefix" , False )
81- if prefix :
82- seq_vals = self ._prepare_barcode_sequence (prefix )
83- sequence = self .env ["ir.sequence" ].create (seq_vals )
84- vals_list_updated .append (dict (vals , barcode_sequence_id = sequence .id ))
85- else :
86- vals_list_updated .append (vals )
87- return super ().create (vals_list_updated )
0 commit comments