~asertigs/openobject-addons/7.0

« back to all changes in this revision

Viewing changes to ags_gtin_sequence/product.py

  • Committer: Pablo
  • Date: 2014-08-05 07:32:08 UTC
  • Revision ID: pablo@pablo-pc-20140805073208-gu4o47ua816gt83m
[ADD/FIX] Añadido el indicador de extensión a los SSCCs, ahora ya son de la longitud correcta (18)
[FIX] Arreglado bug surgido al no estar preparada la actualización de secuencias padre en el write para secuencias repetidas pero de distinto tipo (faltaba en el search de hijos el criterio del tipo)
[FIX] Ahora las secuencias GTIN sólo deben ser únicas dentro del tipo de secuencia (pallet o producto) que sean
[MOD] Ahora cambiar la categoría de producto nunca borra el ean13, ni aunque la categoría no tenga numeración
[FIX] Problema cuando no estaba inicializada la configuración de dígitos de extensión de sscc
[FIX] Bugs varios en ags_gtin_sequence

Show diffs side-by-side

added added

removed removed

Lines of Context:
21
21
 
22
22
from math import ceil
23
23
from openerp.osv import osv, fields
24
 
from openerp.addons.product.product import ean_checksum, sanitize_ean13, check_ean
 
24
from openerp.addons.product.product import ean_checksum, sanitize_ean13
 
25
from collections import defaultdict
 
26
 
25
27
 
26
28
NUMBERING_TYPES = [('none','Without numbering'), 
27
29
                    ('internal','Internal numbering'), 
68
70
    def _calc_effective_numbering(self, cr, uid, ids, field_name, arg, context=None):
69
71
        res = {}
70
72
        for categ in self.browse(cr, uid, ids, context):
71
 
            print categ.name
72
73
            if categ.gtin_numbering:
73
74
                res[categ.id] = categ.gtin_numbering
74
75
            elif categ.parent_id.id:
88
89
        'effective_gtin_numbering': fields.function(_calc_effective_numbering, string="Effective GTIN numbering", 
89
90
                                                    type="selection", selection=NUMBERING_TYPES),
90
91
    }
91
 
    
92
 
#     _defaults = {              
93
 
#         'gtin_numbering': 'none',
94
 
#     }
95
 
 
96
 
 
97
92
 
98
93
class product_product(osv.Model):
99
94
    _inherit = "product.product"
102
97
        value = {}
103
98
        if categ_id:
104
99
            categ = self.pool.get('product.category').browse(cr, uid, categ_id, context)
105
 
            if categ.gtin_numbering == 'none' or not categ.gtin_numbering:
106
 
                value['ean13'] = ""
107
 
            else:
108
 
                internal = categ.gtin_numbering == 'internal'
109
 
                value['ean13'] = self._generate_ean13(cr, uid, [], internal, context)     
 
100
            if categ.gtin_numbering and categ.gtin_numbering != 'none' and not ean13:
 
101
                categ_is_internal = categ.gtin_numbering == 'internal'
 
102
                value['ean13'] = self._generate_ean13(cr, uid, [], categ_is_internal, context)     
110
103
        return { 'value': value }
111
104
                
112
105
 
154
147
        ean13 = context.get('ean13',False)
155
148
        packaging = context.get('pack', False)
156
149
        #intentamos obtener los datos del orm (la creación de un packaging desde sale.order.line no nos puede pasar los datos en context)
157
 
        if not packaging and 'default_product_id' in context:
 
150
        if not packaging and context.get('default_product_id', 0):
158
151
            product = self.pool.get('product.product').browse(cr, uid, context['default_product_id'], context)
159
152
            ean13 = product.ean13
160
153
            packaging_data = product_obj.read(cr, uid, [ p.id for p in product.packaging ], ['ean'], context=context)
161
154
        else:
162
155
            packaging_data = product_obj.resolve_2many_commands(cr, uid, 'packaging', packaging, context=context) 
 
156
        
 
157
        #Miramos qué ean se han usado
 
158
        used_ean = defaultdict(dict)
 
159
        for packaging in packaging_data:
 
160
            if packaging['ean']:
 
161
                code = int(packaging['ean'][0])
 
162
                used_ean[packaging['ean'][1:-1]][code] = True
 
163
                
 
164
        if used_ean:
 
165
            available_ean = filter(lambda x: len(x[1]) < 8,used_ean.items()) 
 
166
            if not available_ean:
 
167
                #Todos los ean usados fueron agotados, generamos uno nuevo
 
168
                new_ean = product_obj._generate_ean13(cr, uid, [], False, context), {}
 
169
            else:
 
170
                available_ean.sort(key=lambda x: len(x[1]), reverse=True)
 
171
                new_ean = available_ean[0][0] + str(ean_checksum(available_ean[0][0]+'0')), available_ean[0][1]
 
172
        else:
 
173
            #Cogemos el ean del producto o generamos uno nuevo
 
174
            new_ean = (ean13 or product_obj._generate_ean13(cr, uid, [], False, context)), {}
163
175
            
164
 
        if check_ean(ean13):
165
 
            code = 1
166
 
            if packaging:
167
 
#                codes_used = set([ int(p['ean'][0]) for p in packaging_data if p['ean'] and len(p['ean']) > 0])
168
 
                codes_used = []
169
 
                for p in packaging_data:
170
 
                    if p['ean'] and len(p['ean']) > 0:            
171
 
                        try:
172
 
                            codes_used.append(int(p['ean'][0])) 
173
 
                        except:
174
 
                            # Si el código es inválido lo ignoramos
175
 
                            pass
176
 
                # Buscamos el código más bajo del 1 al 8 que no haya sido usado por otro packaging
177
 
                for code in range(1,10):
178
 
                    if not code in codes_used:
179
 
                        break
180
 
            #El 9 está reservado y no debe usarse como prefijo del GTIN-14
181
 
            if code != 9:
182
 
                gtin14 = str(code) + sanitize_ean13(ean13)
183
 
                return gtin14[:-1] + str(gtin14_checksum(gtin14))
 
176
        if (new_ean[0]):
 
177
            for code in range(1,9):
 
178
                if not code in new_ean[1]:
 
179
                    gtin14 = str(code) + sanitize_ean13(new_ean[0])
 
180
                    return gtin14[:-1] + str(gtin14_checksum(gtin14))
184
181
                
185
182
        return ""
186
183