GoodERP
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

136 lines
5.8KB

  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 odoo import fields, models, api, tools
  6. class BankStatementsReport(models.Model):
  7. _name = "bank.statements.report"
  8. _description = u"现金银行报表"
  9. _auto = False
  10. _order = 'date'
  11. @api.depends('get', 'pay', 'bank_id')
  12. def _compute_balance(self):
  13. # 相邻的两条记录,bank_id不同,重新计算账户余额
  14. for bsr in self:
  15. pre_record = bsr.search(
  16. [('id', '<=', bsr.id), ('bank_id', '=', bsr.bank_id.id)])
  17. for pre in pre_record:
  18. bsr.balance += pre.get - pre.pay
  19. bank_id = fields.Many2one('bank.account', string=u'账户名称', readonly=True)
  20. date = fields.Date(string=u'日期', readonly=True)
  21. name = fields.Char(string=u'单据编号', readonly=True)
  22. get = fields.Float(string=u'收入', readonly=True,
  23. digits='Amount')
  24. pay = fields.Float(string=u'支出', readonly=True,
  25. digits='Amount')
  26. balance = fields.Float(string=u'账户余额',
  27. compute='_compute_balance', readonly=True,
  28. digits='Amount')
  29. partner_id = fields.Many2one('partner', string=u'往来单位', readonly=True)
  30. note = fields.Char(string=u'备注', readonly=True)
  31. def init(self):
  32. # union money_order, other_money_order, money_transfer_order
  33. cr = self._cr
  34. tools.drop_view_if_exists(cr, 'bank_statements_report')
  35. cr.execute("""
  36. CREATE or REPLACE VIEW bank_statements_report AS (
  37. SELECT ROW_NUMBER() OVER(ORDER BY bank_id,date) AS id,
  38. bank_id,
  39. date,
  40. name,
  41. get,
  42. pay,
  43. balance,
  44. partner_id,
  45. note
  46. FROM
  47. (
  48. SELECT mol.bank_id,
  49. mo.date,
  50. mo.name,
  51. (CASE WHEN mo.type = 'get' THEN mol.amount ELSE 0 END) AS get,
  52. (CASE WHEN mo.type = 'pay' THEN mol.amount ELSE 0 END) AS pay,
  53. 0 AS balance,
  54. mo.partner_id,
  55. mo.note
  56. FROM money_order_line AS mol
  57. LEFT JOIN money_order AS mo ON mol.money_id = mo.id
  58. WHERE mo.state = 'done'
  59. UNION ALL
  60. SELECT omo.bank_id,
  61. omo.date,
  62. omo.name,
  63. (CASE WHEN omo.type = 'other_get' THEN
  64. (CASE WHEN ba.currency_id IS NULL THEN omo.total_amount ELSE omo.currency_amount END)
  65. ELSE 0 END) AS get,
  66. (CASE WHEN omo.type = 'other_pay' THEN
  67. (CASE WHEN ba.currency_id IS NULL THEN omo.total_amount ELSE omo.currency_amount END)
  68. ELSE 0 END) AS pay,
  69. 0 AS balance,
  70. omo.partner_id,
  71. omo.note AS note
  72. FROM other_money_order AS omo
  73. LEFT JOIN bank_account AS ba ON ba.id = omo.bank_id
  74. LEFT JOIN res_currency AS rc ON rc.id = ba.currency_id
  75. WHERE omo.state = 'done'
  76. UNION ALL
  77. SELECT mtol.out_bank_id AS bank_id,
  78. mto.date,
  79. mto.name,
  80. 0 AS get,
  81. (CASE WHEN ba.currency_id IS NULL THEN mtol.amount ELSE mtol.currency_amount END) AS pay,
  82. 0 AS balance,
  83. NULL AS partner_id,
  84. mto.note
  85. FROM money_transfer_order_line AS mtol
  86. LEFT JOIN money_transfer_order AS mto ON mtol.transfer_id = mto.id
  87. LEFT JOIN bank_account AS ba ON ba.id = mtol.out_bank_id
  88. LEFT JOIN res_currency AS rc ON rc.id = ba.currency_id
  89. WHERE mto.state = 'done'
  90. UNION ALL
  91. SELECT mtol.in_bank_id AS bank_id,
  92. mto.date,
  93. mto.name,
  94. mtol.amount AS get,
  95. 0 AS pay,
  96. 0 AS balance,
  97. NULL AS partner_id,
  98. mto.note
  99. FROM money_transfer_order_line AS mtol
  100. LEFT JOIN money_transfer_order AS mto ON mtol.transfer_id = mto.id
  101. WHERE mto.state = 'done'
  102. ) AS bs)
  103. """)
  104. def find_source_order(self):
  105. # 查看原始单据,三种情况:收付款单、其他收支单、资金转换单
  106. self.ensure_one()
  107. model_view = {
  108. 'money.order': {'name': _(u'收付款单'),
  109. 'view': 'money.money_order_form'},
  110. 'other.money.order': {'name': _(u'其他收支单'),
  111. 'view': 'money.other_money_order_form'},
  112. 'money.transfer.order': {
  113. 'name': _('资金转换单'),
  114. 'view': 'money.money_transfer_order_form'}}
  115. for model, view_dict in model_view.items():
  116. res = self.env[model].search([('name', '=', self.name)])
  117. name = view_dict['name']
  118. view = self.env.ref(view_dict['view'])
  119. if res:
  120. return {
  121. 'name': name,
  122. 'view_mode': 'form',
  123. 'view_id': False,
  124. 'views': [(view.id, 'form')],
  125. 'res_model': model,
  126. 'type': 'ir.actions.act_window',
  127. 'res_id': res.id
  128. }
上海开阖软件有限公司 沪ICP备12045867号-1