GoodERP
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

121 line
5.1KB

  1. # Copyright 2016 上海开阖软件有限公司 (http://www.osbzr.com)
  2. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
  3. from datetime import date
  4. from odoo import models, fields, api
  5. from odoo.exceptions import UserError
  6. class BuyPaymentWizard(models.TransientModel):
  7. _name = 'buy.payment.wizard'
  8. _description = '采购付款一览表向导'
  9. @api.model
  10. def _default_date_start(self):
  11. return self.env.user.company_id.start_date
  12. @api.model
  13. def _default_date_end(self):
  14. return date.today()
  15. date_start = fields.Date('开始日期', default=_default_date_start,
  16. help='报表汇总的开始日期,默认为公司启用日期')
  17. date_end = fields.Date('结束日期', default=_default_date_end,
  18. help='报表汇总的结束日期,默认为当前日期')
  19. s_category_id = fields.Many2one('core.category', '供应商类别',
  20. help='只统计选定的供应商类别')
  21. partner_id = fields.Many2one('partner', '供应商',
  22. help='只统计选定的供应商')
  23. order_id = fields.Many2one('buy.receipt', '采购单号',
  24. help='只统计选定的采购单号')
  25. warehouse_dest_id = fields.Many2one('warehouse', '仓库',
  26. help='只统计选定的仓库')
  27. company_id = fields.Many2one(
  28. 'res.company',
  29. string='公司',
  30. change_default=True,
  31. default=lambda self: self.env.company)
  32. def _get_domain(self):
  33. '''返回wizard界面上条件'''
  34. cond = [('date', '>=', self.date_start),
  35. ('date', '<=', self.date_end),
  36. ('state', '=', 'done')]
  37. if self.s_category_id:
  38. cond.append(
  39. ('partner_id.s_category_id', '=', self.s_category_id.id)
  40. )
  41. if self.partner_id:
  42. cond.append(('partner_id', '=', self.partner_id.id))
  43. if self.order_id:
  44. cond.append(('id', '=', self.order_id.id))
  45. if self.warehouse_dest_id:
  46. cond += ['|', ('buy_move_id.warehouse_dest_id', '=', self.warehouse_dest_id.id),
  47. ('buy_move_id.warehouse_id', '=', self.warehouse_dest_id.id)]
  48. return cond
  49. def _compute_payment(self, receipt):
  50. '''计算该入库单的已付款和应付款余额'''
  51. # 查找入库单产生的结算单
  52. domain = [('name', '=', receipt.name), ('state', '=', 'done')]
  53. if receipt.order_id: # 查找采购订单产生的结算单
  54. domain = ['|', '&', ('name', '=', receipt.name), ('state', '=', 'done'),
  55. '&', ('name', '=', receipt.order_id.name), ('state', '=', 'done')]
  56. invoices = self.env['money.invoice'].search(domain)
  57. payment = sum([invoice.reconciled for invoice in invoices])
  58. return payment
  59. def _compute_payment_rate(self, payment, amount):
  60. '''计算付款率'''
  61. payment_rate = amount != 0 and (payment / amount) * 100 or 0.0
  62. return payment_rate
  63. def _prepare_buy_payment(self, receipt):
  64. '''对于传入的入库单,为创建采购付款一览表准备数据'''
  65. self.ensure_one()
  66. factor = not receipt.is_return and 1 or -1 # 如果是退货则金额均取反
  67. purchase_amount = factor * (receipt.discount_amount + receipt.amount)
  68. discount_amount = factor * receipt.discount_amount
  69. amount = factor * receipt.amount
  70. order_type = receipt.is_return and '采购退回' or '普通采购'
  71. warehouse = receipt.is_return and receipt.warehouse_id or receipt.warehouse_dest_id
  72. # 计算该入库单的已付款
  73. payment = self._compute_payment(receipt)
  74. return {
  75. 's_category_id': receipt.partner_id.s_category_id.id,
  76. 'partner_id': receipt.partner_id.id,
  77. 'type': order_type,
  78. 'date': receipt.date,
  79. 'warehouse_dest_id': warehouse.id,
  80. 'order_name': receipt.name,
  81. 'purchase_amount': purchase_amount,
  82. 'discount_amount': discount_amount,
  83. 'amount': amount,
  84. 'payment': payment,
  85. 'balance': amount - payment,
  86. 'payment_rate': self._compute_payment_rate(payment, amount),
  87. 'note': receipt.note,
  88. }
  89. def button_ok(self):
  90. res = []
  91. if self.date_end < self.date_start:
  92. raise UserError('开始日期不能大于结束日期!')
  93. receipt_obj = self.env['buy.receipt']
  94. for receipt in receipt_obj.search(self._get_domain(), order='partner_id,date'):
  95. # 用查找到的入库单信息来创建一览表
  96. line = self.env['buy.payment'].create(
  97. self._prepare_buy_payment(receipt))
  98. res.append(line.id)
  99. return {
  100. 'name': '采购付款一览表',
  101. 'view_mode': 'list',
  102. 'res_model': 'buy.payment',
  103. 'type': 'ir.actions.act_window',
  104. 'target': 'main',
  105. 'domain': [('id', 'in', res)],
  106. 'limit': 65535,
  107. }
上海开阖软件有限公司 沪ICP备12045867号-1