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.

139 lines
5.4KB

  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. class SupplierStatementsReport(models.Model):
  5. _name = "supplier.statements.report"
  6. _description = u"供应商对账单"
  7. _auto = False
  8. _order = 'id, date'
  9. @api.depends('amount', 'pay_amount', 'partner_id')
  10. def _compute_balance_amount(self):
  11. # 相邻的两条记录,partner不同,应付款余额要清零并重新计算
  12. for ssp in self:
  13. pre_record = ssp.search(
  14. [('id', '<=', ssp.id), ('partner_id', '=', ssp.partner_id.id)])
  15. for pre in pre_record:
  16. ssp.balance_amount += pre.amount - pre.pay_amount + pre.discount_money
  17. partner_id = fields.Many2one('partner', string=u'业务伙伴', readonly=True)
  18. name = fields.Char(string=u'单据编号', readonly=True)
  19. date = fields.Date(string=u'单据日期', readonly=True)
  20. done_date = fields.Datetime(string=u'完成日期', readonly=True)
  21. amount = fields.Float(string=u'应付金额', readonly=True,
  22. digits='Amount')
  23. pay_amount = fields.Float(string=u'实际付款金额', readonly=True,
  24. digits='Amount')
  25. discount_money = fields.Float(string=u'付款折扣', readonly=True,
  26. digits='Amount')
  27. balance_amount = fields.Float(
  28. string=u'应付款余额',
  29. compute='_compute_balance_amount',
  30. readonly=True,
  31. digits='Amount')
  32. note = fields.Char(string=u'备注', readonly=True)
  33. def init(self):
  34. # union money_order(type = 'pay'), money_invoice(type = 'expense')
  35. cr = self._cr
  36. tools.drop_view_if_exists(cr, 'supplier_statements_report')
  37. cr.execute("""
  38. CREATE or REPLACE VIEW supplier_statements_report AS (
  39. SELECT ROW_NUMBER() OVER(ORDER BY partner_id, date, amount desc) AS id,
  40. partner_id,
  41. name,
  42. date,
  43. done_date,
  44. amount,
  45. pay_amount,
  46. discount_money,
  47. balance_amount,
  48. note
  49. FROM
  50. (
  51. SELECT m.partner_id,
  52. m.name,
  53. m.date,
  54. m.write_date AS done_date,
  55. 0 AS amount,
  56. m.amount AS pay_amount,
  57. m.discount_amount AS discount_money,
  58. 0 AS balance_amount,
  59. m.note
  60. FROM money_order AS m
  61. WHERE m.type = 'pay' AND m.state = 'done'
  62. UNION ALL
  63. SELECT mi.partner_id,
  64. mi.name,
  65. mi.date,
  66. mi.create_date AS done_date,
  67. mi.amount,
  68. 0 AS pay_amount,
  69. 0 AS discount_money,
  70. 0 AS balance_amount,
  71. Null AS note
  72. FROM money_invoice AS mi
  73. LEFT JOIN core_category AS c ON mi.category_id = c.id
  74. WHERE c.type = 'expense' AND mi.state = 'done'
  75. ) AS ps)
  76. """)
  77. @api.model
  78. def get_report_data(self, data=None):
  79. '''生成报表源数据
  80. '''
  81. records = self.search([
  82. ('partner_id', '=', data.get('partner_id')),
  83. ('date', '>=', data.get('from_date')),
  84. ('date', '<=', data.get('to_date'))])
  85. if records:
  86. return create_source_docx_partner(self, records, 0, data)
  87. else:
  88. pre_records = self.search(
  89. [('partner_id', '=', data.get('partner_id')),
  90. ('date', '<', data.get('from_date'))], order='id desc')
  91. if pre_records:
  92. init_pay = pre_records[0].balance_amount
  93. return create_source_docx_partner(self, None, init_pay, data)
  94. else:
  95. return create_source_docx_partner(self, None, 0, data)
  96. # 与客户对账单共用的函数
  97. def create_source_docx_partner(obj, records, init_pay, data=None):
  98. partner = obj.env.get('partner').search(
  99. [('id', '=', data.get('partner_id'))])
  100. simple_dict = {'partner_name': partner.name,
  101. 'from_date': data.get('from_date'),
  102. 'to_date': data.get('to_date'),
  103. 'report_line': [],
  104. 'init_pay': {},
  105. 'final_pay': {}}
  106. if not records:
  107. if init_pay:
  108. simple_dict['init_pay'] = init_pay
  109. simple_dict['final_pay'] = init_pay
  110. return simple_dict
  111. data = records
  112. for p_value in data:
  113. simple_dict['report_line'].append({
  114. 'date': p_value.date,
  115. 'name': p_value.name,
  116. 'note': p_value.note,
  117. 'amount': p_value.amount,
  118. 'pay_amount': p_value.pay_amount,
  119. 'discount_money': p_value.discount_money,
  120. 'balance_amount': p_value.balance_amount
  121. })
  122. if data:
  123. simple_dict['init_pay'] = data[0].balance_amount - data[0].amount \
  124. + data[0].pay_amount - data[0].discount_money
  125. simple_dict['final_pay'] = data[-1].balance_amount
  126. return simple_dict
上海开阖软件有限公司 沪ICP备12045867号-1