GoodERP
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

218 lines
8.8KB

  1. # Copyright 2016 上海开阖软件有限公司 (http://www.osbzr.com)
  2. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
  3. from odoo import api, fields, models
  4. from odoo.exceptions import UserError
  5. class Pricing(models.Model):
  6. _name = 'pricing'
  7. _description = '定价策略'
  8. # 此逻辑放在这里是为了让采购和销售都有机会使用价格策略,现在只在销售环节读取了这些策略
  9. def get_condition(self, args):
  10. """
  11. 返回定价策略的各种条件及报错信息
  12. :param args: 传入的参数字典
  13. :return: 取数的条件和按此条件取到多条策略时的报错信息,返回一个有序列表,
  14. 如前面的条件取不到策略则进入下一个条件。
  15. """
  16. res = []
  17. partner = args.get('partner')
  18. warehouse = args.get('warehouse')
  19. goods = args.get('goods')
  20. date = args.get('date')
  21. # 客户类别、仓库、商品满足条件
  22. message = '适用于%s,%s,%s,%s 的价格策略不唯一' % (
  23. partner.c_category_id.name,
  24. warehouse.name,
  25. goods.name,
  26. date)
  27. res.append({'domain': [
  28. ('c_category_id', '=', partner.c_category_id.id),
  29. ('warehouse_id', '=', warehouse.id),
  30. ('goods_id', '=', goods.id),
  31. ('goods_category_id', '=', False),
  32. ('active_date', '<=', date),
  33. ('deactive_date', '>=', date)],
  34. 'message': message})
  35. # 客户类别、仓库、商品类别满足条件
  36. message = '适用于 %s,%s,%s,%s 的价格策略不唯一' % (
  37. partner.c_category_id.name,
  38. warehouse.name,
  39. goods.category_id.name,
  40. date)
  41. res.append({'domain': [
  42. ('c_category_id', '=', partner.c_category_id.id),
  43. ('warehouse_id', '=', warehouse.id),
  44. ('goods_id', '=', False),
  45. ('goods_category_id', '=', goods.category_id.id),
  46. ('active_date', '<=', date),
  47. ('deactive_date', '>=', date)],
  48. 'message': message})
  49. # 客户类别、仓库满足条件
  50. message = '适用于 %s,%s,%s 的价格策略不唯一' % (
  51. partner.c_category_id.name,
  52. warehouse.name,
  53. date)
  54. res.append({'domain': [
  55. ('c_category_id', '=', partner.c_category_id.id),
  56. ('warehouse_id', '=', warehouse.id),
  57. ('goods_id', '=', False),
  58. ('goods_category_id', '=', False),
  59. ('active_date', '<=', date),
  60. ('deactive_date', '>=', date)],
  61. 'message': message})
  62. # 仓库、商品满足
  63. message = '适用于 %s,%s,%s 的价格策略不唯一' % (
  64. warehouse.name, goods.name, date)
  65. res.append({'domain': [
  66. ('c_category_id', '=', False),
  67. ('warehouse_id', '=', warehouse.id),
  68. ('goods_id', '=', goods.id),
  69. ('goods_category_id', '=', False),
  70. ('active_date', '<=', date),
  71. ('deactive_date', '>=', date)],
  72. 'message': message})
  73. # 仓库,商品分类满足条件
  74. message = '适用于 %s,%s,%s 的价格策略不唯一' % (
  75. warehouse.name,
  76. goods.category_id.name,
  77. date)
  78. res.append({'domain': [
  79. ('c_category_id', '=', False),
  80. ('warehouse_id', '=', warehouse.id),
  81. ('goods_id', '=', False),
  82. ('goods_category_id', '=', goods.category_id.id),
  83. ('active_date', '<=', date),
  84. ('deactive_date', '>=', date)],
  85. 'message': message})
  86. # 仓库满足条件
  87. message = '适用于 %s,%s 的价格策略不唯一' % (
  88. warehouse.name, date)
  89. res.append({'domain': [
  90. ('c_category_id', '=', False),
  91. ('warehouse_id', '=', warehouse.id),
  92. ('goods_id', '=', False),
  93. ('goods_category_id', '=', False),
  94. ('active_date', '<=', date),
  95. ('deactive_date', '>=', date)],
  96. 'message': message})
  97. # 客户类别,商品满足条件
  98. message = '适用于 %s,%s,%s 的价格策略不唯一' % (
  99. partner.c_category_id.name,
  100. goods.name,
  101. date)
  102. res.append({'domain': [
  103. ('c_category_id', '=', partner.c_category_id.id),
  104. ('warehouse_id', '=', False),
  105. ('goods_id', '=', goods.id),
  106. ('goods_category_id', '=', False),
  107. ('active_date', '<=', date),
  108. ('deactive_date', '>=', date)],
  109. 'message': message})
  110. # 客户类别,商品分类满足条件
  111. message = '适用于 %s,%s,%s 的价格策略不唯一' % (
  112. partner.c_category_id.name,
  113. goods.category_id.name,
  114. date)
  115. res.append({'domain': [
  116. ('c_category_id', '=', partner.c_category_id.id),
  117. ('warehouse_id', '=', False),
  118. ('goods_id', '=', False),
  119. ('goods_category_id', '=', goods.category_id.id),
  120. ('active_date', '<=', date),
  121. ('deactive_date', '>=', date)],
  122. 'message': message})
  123. # 客户类别满足条件
  124. message = '适用于 %s,%s 的价格策略不唯一' % (
  125. partner.c_category_id.name, date)
  126. res.append({'domain': [
  127. ('c_category_id', '=', partner.c_category_id.id),
  128. ('warehouse_id', '=', False),
  129. ('goods_id', '=', False),
  130. ('goods_category_id', '=', False),
  131. ('active_date', '<=', date),
  132. ('deactive_date', '>=', date)],
  133. 'message': message})
  134. # 所有商品打折
  135. message = '适用于 %s 的价格策略不唯一' % (date)
  136. res.append({'domain': [
  137. ('c_category_id', '=', False),
  138. ('warehouse_id', '=', False),
  139. ('goods_id', '=', False),
  140. ('goods_category_id', '=', False),
  141. ('active_date', '<=', date),
  142. ('deactive_date', '>=', date)],
  143. 'message': message})
  144. return res
  145. @api.model
  146. def get_pricing_id(self, partner, warehouse, goods, date):
  147. '''传入客户,仓库,商品,日期,返回合适的价格策略,如果找到两条以上符合的规则,则报错
  148. 1. 客户类别、仓库、商品
  149. 2. 客户类别、仓库、商品类别
  150. 3. 客户类别、仓库
  151. 4. 仓库、商品
  152. 5. 仓库,商品分类
  153. 6. 仓库
  154. 7. 客户类别、商品
  155. 8. 客户类别、商品分类
  156. 9. 客户类别
  157. 10. 所有商品
  158. 11. 可能还是找不到有效期内的,返回 False
  159. '''
  160. if not partner:
  161. raise UserError('请先输入客户')
  162. if not warehouse:
  163. raise UserError('请先输入仓库')
  164. if not goods:
  165. raise UserError('请先输入商品')
  166. args = {'partner': partner,
  167. 'warehouse': warehouse,
  168. 'goods': goods,
  169. 'date': date}
  170. res = self.get_condition(args)
  171. sum = 0
  172. for value in res:
  173. # 依次取价格
  174. Pricing = self.search(value['domain'])
  175. sum += len(Pricing)
  176. if len(Pricing) == 1:
  177. return Pricing
  178. if len(Pricing) > 1:
  179. raise UserError(value['message'])
  180. # 如果日期范围内没有适用的价格策略,则返回空
  181. if sum == 0:
  182. return False
  183. name = fields.Char('描述', help='描述!')
  184. warehouse_id = fields.Many2one('warehouse',
  185. '仓库',
  186. ondelete='restrict',
  187. )
  188. c_category_id = fields.Many2one('core.category', '客户类别',
  189. ondelete='restrict',
  190. domain=[('type', '=', 'customer')],
  191. context={'type': 'customer'})
  192. goods_category_id = fields.Many2one('core.category', '商品类别',
  193. ondelete='restrict',
  194. domain=[('type', '=', 'goods')],
  195. context={'type': 'goods'})
  196. goods_id = fields.Many2one('goods',
  197. '商品',
  198. ondelete='restrict',
  199. )
  200. active_date = fields.Date('开始日期', required=True)
  201. deactive_date = fields.Date('终止日期', required=True)
  202. discount_rate = fields.Float('折扣率%', help='商品的价格 × 折扣率 = 商品的实际价格')
  203. active = fields.Boolean('启用', default=True)
  204. company_id = fields.Many2one(
  205. 'res.company',
  206. string='公司',
  207. change_default=True,
  208. default=lambda self: self.env.company)
上海开阖软件有限公司 沪ICP备12045867号-1