osbzr/gooderp_addons

View on GitHub
core/models/pricing.py

Summary

Maintainability
A
2 hrs
Test Coverage
# -*- coding: utf-8 -*-

from odoo import api, fields, models
from odoo.exceptions import UserError


class Pricing(models.Model):
    _name = 'pricing'
    _description = u'定价策略'

    # 此逻辑放在这里是为了让采购和销售都有机会使用价格策略,现在只在销售环节读取了这些策略

    def get_condition(self, args):
        """
        返回定价策略的各种条件及报错信息
        :param args: 传入的参数字典
        :return: 取数的条件和按此条件取到多条策略时的报错信息,返回一个有序列表,
        如前面的条件取不到策略则进入下一个条件。
        """
        res = []
        partner = args.get('partner')
        warehouse = args.get('warehouse')
        goods = args.get('goods')
        date = args.get('date')
        # 客户类别、仓库、商品满足条件
        message = u'适用于%s,%s,%s,%s 的价格策略不唯一' % (partner.c_category_id.name,
                                                warehouse.name,
                                                goods.name,
                                                date)
        res.append({'domain': [('c_category_id', '=', partner.c_category_id.id),
                               ('warehouse_id', '=', warehouse.id),
                               ('goods_id', '=', goods.id),
                               ('goods_category_id', '=', False),
                               ('active_date', '<=', date),
                               ('deactive_date', '>=', date)],
                    'message': message})
        # 客户类别、仓库、商品类别满足条件
        message = u'适用于 %s,%s,%s,%s 的价格策略不唯一' % (partner.c_category_id.name,
                                                 warehouse.name,
                                                 goods.category_id.name,
                                                 date)
        res.append({'domain': [('c_category_id', '=', partner.c_category_id.id),
                               ('warehouse_id', '=', warehouse.id),
                               ('goods_id', '=', False),
                               ('goods_category_id', '=', goods.category_id.id),
                               ('active_date', '<=', date),
                               ('deactive_date', '>=', date)],
                    'message': message})
        # 客户类别、仓库满足条件
        message = u'适用于 %s,%s,%s 的价格策略不唯一' % (partner.c_category_id.name,
                                              warehouse.name,
                                              date)
        res.append({'domain': [('c_category_id', '=', partner.c_category_id.id),
                               ('warehouse_id', '=', warehouse.id),
                               ('goods_id', '=', False),
                               ('goods_category_id', '=', False),
                               ('active_date', '<=', date),
                               ('deactive_date', '>=', date)],
                    'message': message})
        # 仓库、商品满足
        message = u'适用于 %s,%s,%s 的价格策略不唯一' % (warehouse.name, goods.name,
                                              date)
        res.append({'domain': [('c_category_id', '=', False),
                               ('warehouse_id', '=', warehouse.id),
                               ('goods_id', '=', goods.id),
                               ('goods_category_id', '=', False),
                               ('active_date', '<=', date),
                               ('deactive_date', '>=', date)],
                    'message': message})
        # 仓库,商品分类满足条件
        message = u'适用于 %s,%s,%s 的价格策略不唯一' % (warehouse.name,
                                              goods.category_id.name,
                                              date)
        res.append({'domain': [('c_category_id', '=', False),
                               ('warehouse_id', '=', warehouse.id),
                               ('goods_id', '=', False),
                               ('goods_category_id', '=',
                                goods.category_id.id),
                               ('active_date', '<=', date),
                               ('deactive_date', '>=', date)],
                    'message': message})
        # 仓库满足条件
        message = u'适用于 %s,%s 的价格策略不唯一' % (warehouse.name,
                                           date)
        res.append({'domain': [('c_category_id', '=', False),
                               ('warehouse_id', '=', warehouse.id),
                               ('goods_id', '=', False),
                               ('goods_category_id', '=', False),
                               ('active_date', '<=', date),
                               ('deactive_date', '>=', date)],
                    'message': message})
        # 客户类别,商品满足条件
        message = u'适用于 %s,%s,%s 的价格策略不唯一' % (partner.c_category_id.name,
                                              goods.name,
                                              date)
        res.append({'domain': [('c_category_id', '=', partner.c_category_id.id),
                               ('warehouse_id', '=', False),
                               ('goods_id', '=', goods.id),
                               ('goods_category_id', '=', False),
                               ('active_date', '<=', date),
                               ('deactive_date', '>=', date)],
                    'message': message})
        # 客户类别,商品分类满足条件
        message = u'适用于 %s,%s,%s 的价格策略不唯一' % (partner.c_category_id.name,
                                              goods.category_id.name,
                                              date)
        res.append({'domain': [('c_category_id', '=', partner.c_category_id.id),
                               ('warehouse_id', '=', False),
                               ('goods_id', '=', False),
                               ('goods_category_id', '=',
                                goods.category_id.id),
                               ('active_date', '<=', date),
                               ('deactive_date', '>=', date)],
                    'message': message})
        # 客户类别满足条件
        message = u'适用于 %s,%s 的价格策略不唯一' % (partner.c_category_id.name,
                                           date)
        res.append({'domain': [('c_category_id', '=', partner.c_category_id.id),
                               ('warehouse_id', '=', False),
                               ('goods_id', '=', False),
                               ('goods_category_id', '=', False),
                               ('active_date', '<=', date),
                               ('deactive_date', '>=', date)],
                    'message': message})
        # 所有商品打折
        message = u'适用于 %s 的价格策略不唯一' % (date)
        res.append({'domain': [('c_category_id', '=', False),
                               ('warehouse_id', '=', False),
                               ('goods_id', '=', False),
                               ('goods_category_id', '=', False),
                               ('active_date', '<=', date),
                               ('deactive_date', '>=', date)],
                    'message': message})
        return res

    @api.model
    def get_pricing_id(self, partner, warehouse, goods, date):
        '''传入客户,仓库,商品,日期,返回合适的价格策略,如果找到两条以上符合的规则,则报错
        1. 客户类别、仓库、商品
        2. 客户类别、仓库、商品类别
        3. 客户类别、仓库
        4. 仓库、商品
        5. 仓库,商品分类
        6. 仓库
        7. 客户类别、商品
        8. 客户类别、商品分类
        9. 客户类别
        10. 所有商品
        11. 可能还是找不到有效期内的,返回 False
        '''
        if not partner:
            raise UserError(u'请先输入客户')
        if not warehouse:
            raise UserError(u'请先输入仓库')
        if not goods:
            raise UserError(u'请先输入商品')
        args = {'partner': partner,
                'warehouse': warehouse,
                'goods': goods,
                'date': date}
        res = self.get_condition(args)

        sum = 0
        for value in res:
            Pricing = self.search(value['domain'])
            sum += len(Pricing)
            if len(Pricing) == 1:
                return Pricing
            if len(Pricing) > 1:
                raise UserError(value['message'])

        # 如果日期范围内没有适用的价格策略,则返回空
        if sum == 0:
            return False

    name = fields.Char(u'描述', help=u'描述!')
    warehouse_id = fields.Many2one('warehouse',
                                   u'仓库',
                                   ondelete='restrict',
                                   )
    c_category_id = fields.Many2one('core.category', u'客户类别',
                                    ondelete='restrict',
                                    domain=[('type', '=', 'customer')],
                                    context={'type': 'customer'})
    goods_category_id = fields.Many2one('core.category', u'商品类别',
                                        ondelete='restrict',
                                        domain=[('type', '=', 'goods')],
                                        context={'type': 'goods'})
    goods_id = fields.Many2one('goods',
                               u'商品',
                               ondelete='restrict',
                               )
    active_date = fields.Date(u'开始日期', required=True)
    deactive_date = fields.Date(u'终止日期', required=True)
    discount_rate = fields.Float(u'折扣率%', help=u'商品的价格 × 折扣率 = 商品的实际价格 !')
    active = fields.Boolean(u'启用', default=True)
    company_id = fields.Many2one(
        'res.company',
        string=u'公司',
        change_default=True,
        default=lambda self: self.env['res.company']._company_default_get())