merge_purchase.py
5.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#coding=utf-8
from odoo import models,fields,api, _
import datetime
import logging
from odoo.exceptions import UserError, ValidationError
_logger = logging.getLogger(__name__)
class MergePurchaseWizard(models.TransientModel):
_name = "merge.purchase.wizard"
title = fields.Char(string=u'标题', required=True)
charge_person = fields.Many2one('res.users',string=u'负责人',default=lambda self: self.env.user.id,required=True)
purchase_type = fields.Selection([('trade', '贸易'), ('office', '办公用品'), ('manufacture', '生产'),('accessories', '辅料')],'采购类型',default='trade')
traffic_rule = fields.Char(string=u'运输条款',required=True)
payment_rule = fields.Char(string=u'支付条款',required=True)
delivery_address = fields.Many2one('delivery.address',string='交货地址')
purchase_company = fields.Many2one('acc.company',string='采购公司',required=True)
purchase_ids = fields.Many2many('purchase.order','purchase_merge_rel',domain=[('state', '=', 'draft')],string=u"采购单")
purchase_order_id = fields.Many2one('purchase.order',readonly=True,string='合并询价单')
def merge_purchase_order(self):
merge_tips = ""
purchase_order = self.purchase_ids
list_ids,po_name = self.compare_partners(purchase_order)
merge_info = self.get_merge_info(purchase_order)
cr = self.env.cr
cr.execute("""
SELECT
product_id AS pid,
sum(product_qty) AS qty,
name,
price_unit,
product_uom,
acc_code,
partner_code
FROM
purchase_order_line
WHERE
order_id IN %s
GROUP BY
product_id,
name,
price_unit,
acc_code,
partner_code,
product_uom
"""% (tuple(list_ids),)
)
result = cr.dictfetchall()
self.create_po(result,purchase_order,merge_info,po_name)
# merge_tips = "被合并单号为{},生成新单号为{}".format(po_name,po_obj.name)
# raise ValidationError(merge_tips)
# except Exception as e:
# logging.error(e)
# else:
# raise ValidationError(merge_tips)
@api.multi
def create_po(self,result,order,merge_info,po_name):
res_line = []
for line in result:
line_vals = {
'product_id':line['pid'],
'name':line['name'],
'product_qty':line['qty'],
'price_unit':line['price_unit'],
'acc_code':line['acc_code'],
'partner_code':line['partner_code'],
'date_planned':fields.Datetime.now(),
'product_uom':line['product_uom']
}
# res_line = [(0,0,line_vals)]
res_line.append((0,0,line_vals))
po_vals = {
'partner_id':order[0].partner_id.id,
'title':self.title,
'purchase_company':self.purchase_company.id,
'charge_person':self.charge_person.id,
'forcast_date':fields.Datetime.now(),
'date_planned':fields.Datetime.now(),
'traffic_rule':self.traffic_rule,
'payment_rule':self.payment_rule,
# 'demand_purchase':self.demand_purchase_id.id,
'merge_info':merge_info,
'order_line':res_line
}
po_obj = self.env['purchase.order'].create(po_vals)
# subject = '提醒信息'
# merge_tips = "被合并单号为{},生成新单号为{}".format(po_name,po_obj.name)
self.write({'purchase_order_id':po_obj.id})
# return self.message_post(body=merge_tips, subject=subject)
return True
def compare_partners(self,purchase_order):
partner_list = []
list_ids = []
po_name = []
for order in purchase_order:
partner_list.append(order.partner_id.id)
list_ids.append(order.id)
po_name.append(order.name)
if len(set(partner_list)) > 1:
raise ValidationError(u'所选询价单供应商不一致,不能合并!!!')
if len(list_ids) <= 1:
raise ValidationError(u'合并时至少选择两个询价单!!!')
else:
return list_ids,po_name
def get_merge_info(self,order):
merge_info = ""
so_name = []
de_name = []
po_name = []
for line in order:
so_name.append(line.origin_order.name)
de_name.append(line.demand_purchase.name)
po_name.append(line.name)
line.button_cancel()
merge_info = "被合并单号{}被合并询价单源请购单号{},被合并询价单源销售订单号{}".format(po_name,de_name,so_name)
return merge_info