GoodERP
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

102 lines
4.2KB

  1. # Copyright 2016 上海开阖软件有限公司 (http://www.osbzr.com)
  2. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
  3. from odoo import fields, models, api, tools
  4. from .supplier_statements import create_source_docx_partner
  5. class CustomerStatementsReport(models.Model):
  6. _name = "customer.statements.report"
  7. _description = u"客户对账单"
  8. _auto = False
  9. _order = 'id, date'
  10. @api.depends('amount', 'pay_amount', 'partner_id')
  11. def _compute_balance_amount(self):
  12. # 相邻的两条记录,partner不同,应收款余额重新计算
  13. for cba in self:
  14. pre_record = cba.search(
  15. [('id', '<=', cba.id), ('partner_id', '=', cba.partner_id.id)])
  16. for pre in pre_record:
  17. cba.balance_amount += pre.amount - pre.pay_amount - pre.discount_money
  18. partner_id = fields.Many2one('partner', string=u'业务伙伴', readonly=True)
  19. name = fields.Char(string=u'单据编号', readonly=True)
  20. date = fields.Date(string=u'单据日期', readonly=True)
  21. done_date = fields.Datetime(string=u'完成日期', readonly=True)
  22. amount = fields.Float(string=u'应收金额', readonly=True,
  23. digits='Amount')
  24. pay_amount = fields.Float(string=u'实际收款金额', readonly=True,
  25. digits='Amount')
  26. balance_amount = fields.Float(string=u'应收款余额',
  27. compute='_compute_balance_amount',
  28. digits='Amount')
  29. discount_money = fields.Float(string=u'收款折扣', readonly=True,
  30. digits='Amount')
  31. note = fields.Char(string=u'备注', readonly=True)
  32. def init(self):
  33. # union money_order(type = 'get'), money_invoice(type = 'income')
  34. cr = self._cr
  35. tools.drop_view_if_exists(cr, 'customer_statements_report')
  36. cr.execute("""
  37. CREATE or REPLACE VIEW customer_statements_report AS (
  38. SELECT ROW_NUMBER() OVER(ORDER BY partner_id, date, amount desc) AS id,
  39. partner_id,
  40. name,
  41. date,
  42. done_date,
  43. amount,
  44. pay_amount,
  45. discount_money,
  46. balance_amount,
  47. note
  48. FROM
  49. (
  50. SELECT m.partner_id,
  51. m.name,
  52. m.date,
  53. m.write_date AS done_date,
  54. 0 AS amount,
  55. m.amount AS pay_amount,
  56. m.discount_amount as discount_money,
  57. 0 AS balance_amount,
  58. m.note
  59. FROM money_order AS m
  60. WHERE m.type = 'get' AND m.state = 'done'
  61. UNION ALL
  62. SELECT mi.partner_id,
  63. mi.name,
  64. mi.date,
  65. mi.create_date AS done_date,
  66. mi.amount,
  67. 0 AS pay_amount,
  68. 0 as discount_money,
  69. 0 AS balance_amount,
  70. mi.note AS note
  71. FROM money_invoice AS mi
  72. LEFT JOIN core_category AS c ON mi.category_id = c.id
  73. WHERE c.type = 'income' AND mi.state = 'done'
  74. ) AS ps)
  75. """)
  76. @api.model
  77. def get_report_data(self, data=None):
  78. '''生成报表源数据
  79. '''
  80. records = self.search([
  81. ('partner_id', '=', data.get('partner_id')),
  82. ('date', '>=', data.get('from_date')),
  83. ('date', '<=', data.get('to_date'))])
  84. if records:
  85. return create_source_docx_partner(self, records, 0, data)
  86. else:
  87. pre_records = self.search(
  88. [('partner_id', '=', data.get('partner_id')),
  89. ('date', '<', data.get('from_date'))], order='id desc')
  90. if pre_records:
  91. init_pay = pre_records[0].balance_amount
  92. return create_source_docx_partner(self, None, init_pay, data)
  93. else:
  94. return create_source_docx_partner(self, None, 0, data)
上海开阖软件有限公司 沪ICP备12045867号-1