def get_variant_extra_values(self,template_id,variant,channel_id): vals = {} state = 'done' if variant.image: vals.update({'image_1920': variant.image}) else: image_url = variant.image_url if image_url and (image_url not in ['false','False',False]): image_res = channel_id.read_website_image_url(image_url) if image_res: vals['image_1920'] = image_res if variant.description_sale: vals['description_sale'] = variant.description_sale dimensions_unit = variant.dimensions_unit if dimensions_unit: vals['dimensions_uom_id'] = channel_id.get_uom_id( name=dimensions_unit).id if not variant.wk_product_id_type: vals['wk_product_id_type'] = 'wk_upc' else: vals['wk_product_id_type'] = variant.wk_product_id_type if variant.description_sale: vals['description_sale'] = variant.description_sale if variant.description_purchase: vals['description_purchase'] = variant.description_purchase if variant.list_price and template_id: vals['wk_extra_price'] = parse_float(variant.list_price) - parse_float(template_id.list_price) if variant.default_code: vals['default_code'] = variant.default_code if variant.barcode: vals['barcode'] = variant.barcode return {'vals': vals,'state': state}
def update_product_variants(self, variant_ids, template_id, store_id, location_id, channel_id): attribute_line_obj = self.env['product.attribute.line'] prod_env = self.env['product.product'] message = '' context = dict(self._context or {}) context.update({'channel_id': channel_id.id}) context.update({'channel': channel_id.channel}) variant_objs = self.env['product.variant.feed'].browse(variant_ids) for variant in variant_objs: attr_string_res = self.create_attribute_string(variant.name_value) attr_string = attr_string_res.get('attstring') message += attr_string_res.get('message') if variant.store_id: variant_store_id = variant.store_id else: variant_store_id = attr_string exists = channel_id.match_product_mappings( store_id, variant_store_id, default_code=variant.default_code, barcode=variant.barcode) if not exists: self.with_context(context)._create_product_line( variant, template_id, store_id, location_id, channel_id) else: attribute_value_ids = prod_env.with_context( context).check_for_new_attrs(template_id, variant) if variant.list_price: exists.product_name.wk_extra_price = parse_float( variant.list_price) - parse_float( template_id.list_price) price = parse_float( variant.list_price) #- template_id.list_price self.wk_change_product_price( product_id=exists.product_name, price=price, channel_id=channel_id) if context.get('wk_qty_update', True) and variant.qty_available and eval( variant.qty_available) > 0: res = self.wk_change_product_qty(exists.product_name, variant.qty_available, location_id) return message
def _create_product_line(self, variant, template_id, store_id, location_id,channel_id): prod_env = self.env['product.product'] context = dict(self._context or {}) context.update({'channel_id': channel_id.id}) context.update({'channel': channel_id.channel}) message = '' variant_id = variant.store_id or 'No Variants' exists = channel_id.match_product_mappings( store_id, variant_id, default_code=variant.default_code, barcode=variant.barcode) if not exists: vals = { 'name': template_id.name, 'description': template_id.description, 'description_sale': template_id.description_sale, 'type': template_id.type, 'categ_id': template_id.categ_id.id, 'uom_id': template_id.uom_id.id, 'uom_po_id': template_id.uom_po_id.id, 'product_tmpl_id': template_id.id, 'default_code':variant.default_code, 'barcode':variant.barcode, } attribute_value_ids = prod_env.with_context(context).check_for_new_attrs( template_id, variant) vals.update({'attribute_value_ids': attribute_value_ids}) res = self.get_variant_extra_values(template_id, variant,channel_id) state = res['state'] vals.update(res['vals']) product_exists_odoo = channel_id.match_odoo_product(vals) if not product_exists_odoo: product_id = prod_env.with_context(context).create(vals) vals.pop('message_follower_ids','') status = True if variant.list_price and eval(variant.list_price): price =parse_float(variant.list_price) #- template_id.list_price self.wk_change_product_price( product_id = product_id, price = price, channel_id = channel_id ) if variant.qty_available and eval(variant.qty_available) > 0: self.wk_change_product_qty( product_id, variant.qty_available, location_id) #FIX EXTRA FIELDS mapping_id = self.channel_id.create_product_mapping( template_id, product_id, store_id, variant_id, vals = dict(default_code = vals.get('default_code'),barcode=vals.get('barcode')) ) else: product_exists_odoo.write(vals) product_id = product_exists_odoo mapping_id = channel_id.create_product_mapping( product_id.product_tmpl_id, product_id, store_id, variant_id, vals = dict(default_code=variant.default_code, barcode=variant.barcode) ) else: mapping_id = exists return message
def import_product(self, channel_id): self.ensure_one() message = "" create_id = None update_id = None context = dict(self._context) context.update({ 'pricelist': channel_id.pricelist_name.id, 'lang': channel_id.language_id.code, }) vals = EL(self.read(self.get_product_fields())) store_id = vals.pop('store_id') state = 'done' if not vals.get('name'): message += "<br/>Product without name can't evaluated" state = 'error' if not store_id: message += "<br/>Product without store ID can't evaluated" state = 'error' categ_id = channel_id.default_category_id.id if categ_id: vals['categ_id'] = categ_id weight_unit = vals.pop('weight_unit') if weight_unit: uom_id = channel_id.get_uom_id(name=weight_unit).id if uom_id: vals['uom_id'] = uom_id vals['uom_po_id'] = uom_id dimensions_unit = vals.pop('dimensions_unit') if dimensions_unit: vals['dimensions_uom_id'] = channel_id.get_uom_id( name=dimensions_unit).id if not vals.pop('wk_product_id_type'): vals['wk_product_id_type'] = 'wk_upc' variant_lines = vals.pop('feed_variants') feed_variants = self.feed_variants if variant_lines: check_attr = self.check_attribute_value(feed_variants) state = check_attr.get('state') message += check_attr.get('message') qty_available = vals.pop('qty_available') list_price = vals.get('list_price', '') if not self.channel_id.override_price: list_price = vals.pop('list_price') list_price = list_price and parse_float(list_price) or 0 image_url = vals.pop('image_url') if not vals.get('barcode'): vals['barcode'] = False location_id = channel_id.location_id if not vals.get('image') and image_url and (image_url not in [ 'false', 'False', False ]): image_res = channel_id.read_website_image_url(image_url) if image_res: vals['image'] = image_res match = channel_id.match_template_mappings(store_id, **vals) template_exists_odoo = channel_id.match_odoo_template( vals, variant_lines=feed_variants) vals.pop('website_message_ids', '') vals.pop('message_follower_ids', '') if state == 'done': if match: extra_categ_ids = vals.pop('extra_categ_ids') if not template_exists_odoo: template_id = match.template_name template_id.with_context(context).write(vals) else: template_exists_odoo.with_context(context).write(vals) template_id = template_exists_odoo match.write({ 'default_code': vals.get('default_code'), 'barcode': vals.get('barcode') }) extra_categ = self.env['extra.categories'].search([ ('instance_id', '=', channel_id.id), ('product_id', '=', template_id.id) ]) if extra_categ_ids: res = self.get_extra_categ_ids(extra_categ_ids, channel_id) message += res.get('message', '') categ_ids = res.get('categ_ids') if categ_ids: # code for instance wise category ids data = { 'extra_category_ids': [(6, 0, categ_ids)], 'instance_id': channel_id.id, 'category_id': categ_id, } if extra_categ: extra_categ.with_context(context).write(data) else: extra_categ = self.env[ 'extra.categories'].with_context( context).create(data) template_id.channel_category_ids = [(6, 0, [extra_categ.id])] else: state = 'error' if len(variant_lines): context['wk_qty_update'] = False res = self.with_context(context).update_product_variants( variant_lines, template_id, store_id, location_id, channel_id) if res: message += res state = 'error' else: for variant_id in template_id.product_variant_ids: variant_vals = variant_id.read( ['default_code', 'barcode'])[0] self.wk_change_product_price(product_id=variant_id, price=list_price, channel_id=channel_id) # if qty_available and eval(qty_available) > 0: # self.wk_change_product_qty( # variant_id, qty_available, location_id) match_product = channel_id.match_product_mappings( store_id, 'No Variants', default_code=variant_vals.get('default_code'), barcode=variant_vals.get('barcode')) if not match_product: channel_id.create_product_mapping( template_id, variant_id, store_id, 'No Variants', { 'default_code': variant_vals.get('default_code'), 'barcode': variant_vals.get('barcode') }) update_id = match else: template_id = None try: vals['taxes_id'] = None vals['supplier_taxes_id'] = None if not template_exists_odoo: if variant_lines: context['create_product_product'] = 1 extra_categ_ids = vals.pop('extra_categ_ids') if extra_categ_ids: res = self.get_extra_categ_ids( extra_categ_ids, channel_id) message += res.get('message', '') categ_ids = res.get('categ_ids') if categ_ids: # code for instance wise category ids data = { 'extra_category_ids': [(6, 0, categ_ids)], 'instance_id': channel_id.id, 'category_id': categ_id, } extra_categ = self.env[ 'extra.categories'].with_context( context).create(data) vals['channel_category_ids'] = [ (6, 0, [extra_categ.id]) ] template_id = self.env[ 'product.template'].with_context( context).create(vals) else: state = 'error' else: template_id = self.env[ 'product.template'].with_context( context).create(vals) else: # template_exists_odoo.with_context(context).write(vals) template_id = template_exists_odoo extra_categ_ids = vals.pop('extra_categ_ids') if extra_categ_ids: res = self.get_extra_categ_ids( extra_categ_ids, channel_id) message += res.get('message', '') categ_ids = res.get('categ_ids') if categ_ids: # code for instance wise category ids data = { 'extra_category_ids': [(6, 0, categ_ids)], 'instance_id': channel_id.id, 'category_id': categ_id, } template_id.channel_category_ids = [(0, 0, data)] else: state = 'error' template_id = None if len(variant_lines) and template_id: res = self._create_product_lines( variant_lines, template_id, store_id, location_id, channel_id) if res: res += message state = 'error' elif template_id: for variant_id in template_id.product_variant_ids: variant_vals = variant_id.read( ['default_code', 'barcode'])[0] self.wk_change_product_price(product_id=variant_id, price=list_price, channel_id=channel_id) if qty_available and eval(qty_available) > 0: self.wk_change_product_qty( variant_id, qty_available, location_id) match = channel_id.match_product_mappings( store_id, 'No Variants', default_code=variant_vals.get('default_code'), barcode=variant_vals.get('barcode')) if not match: channel_id.create_product_mapping( template_id, variant_id, store_id, 'No Variants', { 'default_code': variant_vals.get('default_code'), 'barcode': variant_vals.get('barcode') }) except Exception as e: _logger.error('----------Exception------------%r', e) message += '<br/>Error in variants %s' % (e) state = 'error' if state == 'done': template_id = template_id and template_id or template_exists_odoo if template_id: create_id = channel_id.create_template_mapping( template_id, store_id, { 'default_code': vals.get('default_code'), 'barcode': vals.get('barcode') }) if state == 'done': message += '<br/> Product %s Successfully Evaluate' % ( vals.get('name', '')) self.set_feed_state(state=state) self.message = "%s <br/> %s" % (self.message, message) return dict(update_id=update_id, create_id=create_id, message=message)
def _get_order_line_vals(self, vals, carrier_id, channel_id): message = '' status = True lines = [] line_ids = vals.pop('line_ids') line_name = vals.pop('line_name') line_price_unit = vals.pop('line_price_unit') if line_price_unit: line_price_unit = parse_float(line_price_unit) line_product_id = vals.pop('line_product_id') line_variant_ids = vals.pop('line_variant_ids') line_product_uom_qty = vals.pop('line_product_uom_qty') line_product_default_code = vals.pop('line_product_default_code') line_source = vals.pop('line_source') line_product_barcode = vals.pop('line_product_barcode') line_taxes = vals.pop('line_taxes') if line_ids: for line_id in self.env['order.line.feed'].browse(line_ids): line_price_unit = line_id.line_price_unit if line_price_unit: line_price_unit = parse_float(line_price_unit) if line_id.line_source == 'delivery': product_id = carrier_id.product_id elif line_id.line_source == 'discount': if not channel_id.discount_product_id: product_id = channel_id.create_product('discount') channel_id.discount_product_id = product_id.id product_id = channel_id.discount_product_id line_price_unit = -line_price_unit elif line_id.line_source == 'product': product_res = self.get_product_id( line_id.line_product_id, line_id.line_variant_ids or 'No Variants', channel_id, line_id.line_product_default_code, line_id.line_product_barcode, ) product_id = product_res.get('product_id') if product_res.get('message'): _logger.error("OrderLineError1 %r" % product_res) message += product_res.get('message') if product_id: product_uom_id = product_id.uom_id.id line = dict( name=line_id.line_name, price_unit=line_price_unit, product_id=product_id.id, customer_lead=product_id.sale_delay, product_uom_qty=line_id.line_product_uom_qty, is_delivery=line_id.line_source == 'delivery', product_uom=product_uom_id, ) line['tax_id'] = self.get_taxes_ids( line_id.line_taxes, channel_id) ####ADD TAX lines += [(0, 0, line)] else: status = False else: product_res = self.get_product_id( line_product_id, line_variant_ids or 'No Variants', channel_id, line_product_default_code, line_product_barcode, ) product_id = product_res.get('product_id') if product_res.get('message'): _logger.error("OrderLineError2 %r" % product_res) message += product_res.get('message') if product_id: if line_product_uom_qty: line_product_uom_qty = parse_float( line_product_uom_qty) or 1 line = dict( name=line_name or '', price_unit=(line_price_unit), product_id=product_id.id, customer_lead=product_id.sale_delay, is_delivery=line_source == 'delivery', product_uom_qty=(line_product_uom_qty), product_uom=product_id.uom_id.id, ) line['tax_id'] = self.get_taxes_ids(line_taxes, channel_id) ####ADD TAX lines += [(0, 0, line)] else: status = False return dict(message=message, order_line=lines, status=status)
def _get_order_line_vals(self, vals, carrier_id, channel_id): message = '' status = True lines = [] line_ids = vals.pop('line_ids') line_name = vals.pop('line_name') line_price_unit = vals.pop('line_price_unit') line_discount = vals.pop('line_discount') line_discount_points = vals.pop('line_discount_points') line_discount_type = vals.pop('line_discount_type') dis_type = [] for type in line_discount_type: dis_type.append(type.id) if line_price_unit: line_price_unit = parse_float(line_price_unit) if line_discount: line_discount = parse_float(line_discount) if line_discount_points: line_discount_points = parse_float(line_discount_points) line_product_id = vals.pop('line_product_id') line_variant_ids = vals.pop('line_variant_ids') line_product_uom_qty = vals.pop('line_product_uom_qty') line_product_default_code = vals.pop('line_product_default_code') line_source = vals.pop('line_source') line_product_barcode = vals.pop('line_product_barcode') line_taxes = vals.pop('line_taxes') if line_ids: for line_id in self.env['order.line.feed'].browse(line_ids): if line_id.line_name == "Cash On Delivery": product_uom_ids = channel_id.cod_id.uom_id.id line = dict( name=line_id.line_name, price_unit=line_id.line_price_unit, # discount_value=line_discount, # discount_type=[(6, None, dis_type)], product_id=channel_id.cod_id.id, # customer_lead=product_id.sale_delay, product_uom_qty=line_id.line_product_uom_qty, # is_delivery = line_id.line_source =='delivery', product_uom=product_uom_ids, ) # line['tax_id'] = self.get_taxes_ids(line_id.line_taxes,channel_id) if not product_id.id == channel_id.delivery_product_id.id: line['tax_id'] = [(6, None, [channel_id.vat_id.id])] ####ADD TAX lines += [(0, 0, line)] else: line_price_unit = line_id.line_price_unit if line_price_unit: line_price_unit = parse_float(line_price_unit) line_discount = line_id.line_discount if line_discount: line_discount = parse_float(line_discount) line_discount_points = line_id.line_discount_points if line_discount_points: line_discount_points = parse_float( line_discount_points) dis_type = [] line_discount_type = line_id.line_discount_type for type in line_discount_type: dis_type.append(type.id) if line_id.line_source == 'delivery': product_id = carrier_id.product_id elif line_id.line_source == 'discount': if not channel_id.discount_product_id: product_id = channel_id.create_product('discount') channel_id.discount_product_id = product_id.id product_id = channel_id.discount_product_id line_price_unit = -line_price_unit elif line_id.line_source == 'product': product_res = self.get_product_id( line_id.line_product_id, line_id.line_variant_ids or 'No Variants', channel_id, line_id.line_product_default_code, line_id.line_product_barcode, ) product_id = product_res.get('product_id') if product_res.get('message'): _logger.error("OrderLineError1 %r" % product_res) message += product_res.get('message') if product_id: product_uom_id = product_id.uom_id.id line = dict( name=line_id.line_name, price_unit=line_price_unit, discount_value=line_discount, point_discount_value=line_discount_points, discount_type=[(6, None, dis_type)], product_id=product_id.id, customer_lead=product_id.sale_delay, product_uom_qty=line_id.line_product_uom_qty, is_delivery=line_id.line_source == 'delivery', product_uom=product_uom_id, ) # line['tax_id'] = self.get_taxes_ids(line_id.line_taxes,channel_id) if not product_id.id == channel_id.delivery_product_id.id: line['tax_id'] = [(6, None, [channel_id.vat_id.id]) ] ####ADD TAX lines += [(0, 0, line)] else: status = False else: product_res = self.get_product_id( line_product_id, line_variant_ids or 'No Variants', channel_id, line_product_default_code, line_product_barcode, ) product_id = product_res.get('product_id') if product_id: if line_product_uom_qty: line_product_uom_qty = parse_float( line_product_uom_qty) or 1 line = dict( name=line_name or '', price_unit=(line_price_unit), discount_value=line_discount, discount_type=[(6, None, dis_type)], product_id=product_id.id, customer_lead=product_id.sale_delay, is_delivery=line_source == 'delivery', product_uom_qty=(line_product_uom_qty), product_uom=product_id.uom_id.id, ) # line['tax_id'] = self.get_taxes_ids(line_taxes,channel_id) if not product_id.id == channel_id.delivery_product_id.id: line['tax_id'] = [(6, None, [channel_id.vat_id.id])] ####ADD TAX lines += [(0, 0, line)] else: _logger.error("OrderLineError2 %r" % product_res) message += product_res.get('message') status = False discount_type = dis_type return dict(message=message, order_line=lines, status=status)