GoodERP
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

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