GoodERP
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

123 líneas
4.9KB

  1. # -*- coding: utf-8 -*-
  2. # Copyright 2016 上海开阖软件有限公司 (http://www.osbzr.com)
  3. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
  4. from odoo import _
  5. from datetime import date
  6. from odoo import models, fields, api
  7. from odoo.exceptions import UserError
  8. class BuyOrderTrackWizard(models.TransientModel):
  9. _name = 'buy.order.track.wizard'
  10. _description = '采购订单跟踪表向导'
  11. @api.model
  12. def _default_date_start(self):
  13. return self.env.user.company_id.start_date
  14. @api.model
  15. def _default_date_end(self):
  16. return date.today()
  17. date_start = fields.Date('开始日期', default=_default_date_start,
  18. help='报表汇总的开始日期,默认为公司启用日期')
  19. date_end = fields.Date('结束日期', default=_default_date_end,
  20. help='报表汇总的结束日期,默认为当前日期')
  21. partner_id = fields.Many2one('partner', '供应商',
  22. help='只统计选定的供应商')
  23. goods_id = fields.Many2one('goods', '商品',
  24. help='只统计选定的商品')
  25. order_id = fields.Many2one('buy.order', '订单号',
  26. help='只统计选定的订单号')
  27. warehouse_dest_id = fields.Many2one('warehouse', '仓库',
  28. help='只统计选定的仓库')
  29. company_id = fields.Many2one(
  30. 'res.company',
  31. string='公司',
  32. change_default=True,
  33. default=lambda self: self.env.company)
  34. def _get_domain(self):
  35. """返回wizard界面上条件"""
  36. domain = [
  37. ('order_id.date', '>=', self.date_start),
  38. ('order_id.date', '<=', self.date_end)
  39. ]
  40. if self.goods_id:
  41. domain.append(('goods_id', '=', self.goods_id.id))
  42. if self.partner_id:
  43. domain.append(('order_id.partner_id', '=', self.partner_id.id))
  44. if self.order_id:
  45. domain.append(('order_id.id', '=', self.order_id.id))
  46. if self.warehouse_dest_id:
  47. domain.append(('order_id.warehouse_dest_id',
  48. '=', self.warehouse_dest_id.id))
  49. return domain
  50. def _get_wh_in_date(self, line):
  51. """对于一个buy order line,返回一个入库日期"""
  52. wh_in_date = None
  53. move_line = self.env['wh.move.line']
  54. wh_move_line = move_line.search([
  55. ('buy_line_id', '=', line.id),
  56. ('state', '=', 'done')
  57. ])
  58. if len(wh_move_line) > 1: # 如果是分批入库,则入库单明细行上的buy_line_id相同
  59. wh_in_date = wh_move_line[0].date
  60. else:
  61. wh_in_date = wh_move_line.date
  62. return wh_in_date
  63. def _prepare_track_line(self, line, qty, amount, qty_not_in):
  64. """返回跟踪表明细行(非小计行)"""
  65. return {
  66. 'goods_code': line.goods_id.code,
  67. 'goods_id': line.goods_id.id,
  68. 'attribute': line.attribute_id.name,
  69. 'uom': line.uom_id.name,
  70. 'date': line.order_id.date,
  71. 'order_name': line.order_id.name,
  72. 'partner_id': line.order_id.partner_id.id,
  73. 'warehouse_dest_id': line.order_id.warehouse_dest_id.id,
  74. 'goods_state': line.order_id.goods_state,
  75. 'qty': qty,
  76. 'amount': amount,
  77. 'qty_not_in': qty_not_in,
  78. 'planned_date': line.order_id.planned_date,
  79. 'wh_in_date': self._get_wh_in_date(line), # 入库日期
  80. 'note': line.note,
  81. 'type': line.order_id.type,
  82. }
  83. def button_ok(self):
  84. self.ensure_one()
  85. res = []
  86. if self.date_end < self.date_start:
  87. raise UserError(_('开始日期不能大于结束日期!'))
  88. buy_order_line = self.env['buy.order.line']
  89. for line in buy_order_line.search(self._get_domain(), order='goods_id'):
  90. is_buy = line.order_id.type == 'buy' and 1 or -1 # 是否采购订单
  91. # 以下分别为明细行上数量、采购额、未入库数量,退货时均取反
  92. qty = is_buy * line.quantity
  93. amount = is_buy * line.subtotal
  94. qty_not_in = is_buy * (line.quantity - line.quantity_in)
  95. # 创建跟踪表明细行(非小计行)
  96. track = self.env['buy.order.track'].sudo().create(
  97. self._prepare_track_line(line, qty, amount, qty_not_in))
  98. res.append(track.id)
  99. view = self.env.ref('buy.buy_order_track_list')
  100. return {
  101. 'name': _('采购订单跟踪表'),
  102. 'view_mode': 'list',
  103. 'view_id': False,
  104. 'views': [(view.id, 'list')],
  105. 'res_model': 'buy.order.track',
  106. 'type': 'ir.actions.act_window',
  107. 'target': 'main',
  108. 'domain': [('id', 'in', res)],
  109. 'limit': 65535,
  110. }
上海开阖软件有限公司 沪ICP备12045867号-1