You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

148 lines
6.0 KiB

  1. # Author: Julien Coux
  2. # Copyright 2016 Camptocamp SA
  3. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
  4. from odoo import _, models
  5. class OpenItemsXslx(models.AbstractModel):
  6. _name = 'report.a_f_r.report_open_items_xlsx'
  7. _inherit = 'report.account_financial_report.abstract_report_xlsx'
  8. def _get_report_name(self, report, data=False):
  9. company_id = data.get('company_id', False)
  10. report_name = _('Open Items')
  11. if company_id:
  12. company = self.env['res.company'].browse(company_id)
  13. suffix = ' - %s - %s' % (
  14. company.name, company.currency_id.name)
  15. report_name = report_name + suffix
  16. return report_name
  17. def _get_report_columns(self, report):
  18. res = {
  19. 0: {'header': _('Date'), 'field': 'date', 'width': 11},
  20. 1: {'header': _('Entry'), 'field': 'move_id_name', 'width': 18},
  21. 2: {'header': _('Journal'), 'field': 'journal', 'width': 8},
  22. 3: {'header': _('Account'), 'field': 'account', 'width': 9},
  23. 4: {'header': _('Partner'), 'field': 'partner', 'width': 25},
  24. 5: {'header': _('Ref - Label'), 'field': 'ref', 'width': 40},
  25. 6: {'header': _('Due date'), 'field': 'date_maturity', 'width': 11},
  26. 7: {'header': _('Original'),
  27. 'field': 'original',
  28. 'type': 'amount',
  29. 'width': 14},
  30. 8: {'header': _('Residual'),
  31. 'field': 'amount_residual',
  32. 'field_final_balance': 'residual',
  33. 'type': 'amount',
  34. 'width': 14},
  35. }
  36. if report.foreign_currency:
  37. foreign_currency = {
  38. 9: {'header': _('Cur.'), 'field': 'currency_name',
  39. 'field_currency_balance': 'currency_name',
  40. 'type': 'currency_name',
  41. 'width': 7},
  42. 10: {'header': _('Cur. Original'),
  43. 'field': 'amount_currency',
  44. 'field_final_balance':
  45. 'amount_currency',
  46. 'type': 'amount_currency',
  47. 'width': 14},
  48. 11: {'header': _('Cur. Residual'),
  49. 'field': 'amount_residual_currency',
  50. 'field_final_balance':
  51. 'amount_currency',
  52. 'type': 'amount_currency',
  53. 'width': 14},
  54. }
  55. res = {**res, **foreign_currency}
  56. return res
  57. def _get_report_filters(self, report):
  58. return [
  59. [_('Date at filter'), report.date_at.strftime("%d/%m/%Y")],
  60. [_('Target moves filter'),
  61. _('All posted entries') if report.target_move == 'posted' else _(
  62. 'All entries')],
  63. [_('Account balance at 0 filter'),
  64. _('Hide') if report.hide_account_at_0 else _('Show')],
  65. [_('Show foreign currency'),
  66. _('Yes') if report.foreign_currency else _('No')],
  67. ]
  68. def _get_col_count_filter_name(self):
  69. return 2
  70. def _get_col_count_filter_value(self):
  71. return 2
  72. def _get_col_count_final_balance_name(self):
  73. return 5
  74. def _get_col_pos_final_balance_label(self):
  75. return 5
  76. def _generate_report_content(self, workbook, report, data):
  77. res_data = self.env[
  78. 'report.account_financial_report.open_items']._get_report_values(
  79. report, data)
  80. # For each account
  81. Open_items = res_data['Open_Items']
  82. accounts_data = res_data['accounts_data']
  83. partners_data = res_data['partners_data']
  84. total_amount = res_data['total_amount']
  85. for account_id in Open_items.keys():
  86. # Write account title
  87. self.write_array_title(accounts_data[account_id]['code'] + ' - ' +
  88. accounts_data[account_id]['name'])
  89. # For each partner
  90. if Open_items[account_id]:
  91. for partner_id in Open_items[account_id]:
  92. type_object = 'partner'
  93. # Write partner title
  94. self.write_array_title(partners_data[partner_id]['name'])
  95. # Display array header for move lines
  96. self.write_array_header()
  97. # Display account move lines
  98. for line in Open_items[account_id][partner_id]:
  99. self.write_line_from_dict(line)
  100. # Display ending balance line for partner
  101. self.write_ending_balance_from_dict(
  102. partners_data[partner_id], type_object, total_amount,
  103. account_id, partner_id)
  104. # Line break
  105. self.row_pos += 1
  106. # Display ending balance line for account
  107. type_object = 'account'
  108. self.write_ending_balance_from_dict(accounts_data[account_id],
  109. type_object,
  110. total_amount,
  111. account_id)
  112. # 2 lines break
  113. self.row_pos += 2
  114. def write_ending_balance_from_dict(self, my_object, type_object,
  115. total_amount, account_id=False,
  116. partner_id=False):
  117. """Specific function to write ending balance for Open Items"""
  118. if type_object == 'partner':
  119. name = my_object['name']
  120. my_object['residual'] = total_amount[account_id][partner_id][
  121. 'residual']
  122. label = _('Partner ending balance')
  123. elif type_object == 'account':
  124. name = my_object['code'] + ' - ' + my_object['name']
  125. my_object['residual'] = total_amount[account_id][
  126. 'residual']
  127. label = _('Ending balance')
  128. super(OpenItemsXslx, self).write_ending_balance_from_dict(
  129. my_object, name, label)