GoodERP
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

123 行
5.1KB

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