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}
Esempio n. 2
0
    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
Esempio n. 3
0
    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
Esempio n. 4
0
    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)
Esempio n. 5
0
 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)