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.

201 lines
7.7 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. _description = "Open Items XLSX Report"
  8. _inherit = "report.account_financial_report.abstract_report_xlsx"
  9. def _get_report_name(self, report, data=False):
  10. company_id = data.get("company_id", False)
  11. report_name = _("Open Items")
  12. if company_id:
  13. company = self.env["res.company"].browse(company_id)
  14. suffix = " - {} - {}".format(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_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_name", "width": 25},
  24. 5: {"header": _("Ref - Label"), "field": "ref_label", "width": 40},
  25. 6: {"header": _("Due date"), "field": "date_maturity", "width": 11},
  26. 7: {
  27. "header": _("Original"),
  28. "field": "original",
  29. "type": "amount",
  30. "width": 14,
  31. },
  32. 8: {
  33. "header": _("Residual"),
  34. "field": "amount_residual",
  35. "field_final_balance": "residual",
  36. "type": "amount",
  37. "width": 14,
  38. },
  39. }
  40. if report.foreign_currency:
  41. foreign_currency = {
  42. 9: {
  43. "header": _("Cur."),
  44. "field": "currency_name",
  45. "field_currency_balance": "currency_name",
  46. "type": "currency_name",
  47. "width": 7,
  48. },
  49. 10: {
  50. "header": _("Cur. Original"),
  51. "field": "amount_currency",
  52. "field_final_balance": "amount_currency",
  53. "type": "amount_currency",
  54. "width": 14,
  55. },
  56. 11: {
  57. "header": _("Cur. Residual"),
  58. "field": "amount_residual_currency",
  59. "field_final_balance": "amount_currency",
  60. "type": "amount_currency",
  61. "width": 14,
  62. },
  63. }
  64. res = {**res, **foreign_currency}
  65. return res
  66. def _get_report_filters(self, report):
  67. return [
  68. [_("Date at filter"), report.date_at.strftime("%d/%m/%Y")],
  69. [
  70. _("Target moves filter"),
  71. _("All posted entries")
  72. if report.target_move == "posted"
  73. else _("All entries"),
  74. ],
  75. [
  76. _("Account balance at 0 filter"),
  77. _("Hide") if report.hide_account_at_0 else _("Show"),
  78. ],
  79. [
  80. _("Show foreign currency"),
  81. _("Yes") if report.foreign_currency else _("No"),
  82. ],
  83. ]
  84. def _get_col_count_filter_name(self):
  85. return 2
  86. def _get_col_count_filter_value(self):
  87. return 2
  88. def _get_col_count_final_balance_name(self):
  89. return 5
  90. def _get_col_pos_final_balance_label(self):
  91. return 5
  92. def _generate_report_content(self, workbook, report, data):
  93. res_data = self.env[
  94. "report.account_financial_report.open_items"
  95. ]._get_report_values(report, data)
  96. # For each account
  97. Open_items = res_data["Open_Items"]
  98. accounts_data = res_data["accounts_data"]
  99. partners_data = res_data["partners_data"]
  100. journals_data = res_data["journals_data"]
  101. total_amount = res_data["total_amount"]
  102. show_partner_details = res_data["show_partner_details"]
  103. for account_id in Open_items.keys():
  104. # Write account title
  105. self.write_array_title(
  106. accounts_data[account_id]["code"]
  107. + " - "
  108. + accounts_data[account_id]["name"]
  109. )
  110. # For each partner
  111. if Open_items[account_id]:
  112. if show_partner_details:
  113. for partner_id in Open_items[account_id]:
  114. type_object = "partner"
  115. # Write partner title
  116. self.write_array_title(partners_data[partner_id]["name"])
  117. # Display array header for move lines
  118. self.write_array_header()
  119. # Display account move lines
  120. for line in Open_items[account_id][partner_id]:
  121. line.update(
  122. {
  123. "account": accounts_data[account_id]["code"],
  124. "journal": journals_data[line["journal_id"]][
  125. "code"
  126. ],
  127. }
  128. )
  129. self.write_line_from_dict(line)
  130. # Display ending balance line for partner
  131. partners_data[partner_id].update(
  132. {
  133. "currency_id": accounts_data[account_id]["currency_id"],
  134. "currency_name": accounts_data[account_id][
  135. "currency_name"
  136. ],
  137. }
  138. )
  139. self.write_ending_balance_from_dict(
  140. partners_data[partner_id],
  141. type_object,
  142. total_amount,
  143. account_id,
  144. partner_id,
  145. )
  146. # Line break
  147. self.row_pos += 1
  148. else:
  149. # Display array header for move lines
  150. self.write_array_header()
  151. # Display account move lines
  152. for line in Open_items[account_id]:
  153. line.update(
  154. {
  155. "account": accounts_data[account_id]["code"],
  156. "journal": journals_data[line["journal_id"]]["code"],
  157. }
  158. )
  159. self.write_line_from_dict(line)
  160. # Display ending balance line for account
  161. type_object = "account"
  162. self.write_ending_balance_from_dict(
  163. accounts_data[account_id], type_object, total_amount, account_id
  164. )
  165. # 2 lines break
  166. self.row_pos += 2
  167. def write_ending_balance_from_dict(
  168. self, my_object, type_object, total_amount, account_id=False, partner_id=False
  169. ):
  170. """Specific function to write ending balance for Open Items"""
  171. if type_object == "partner":
  172. name = my_object["name"]
  173. my_object["residual"] = total_amount[account_id][partner_id]["residual"]
  174. label = _("Partner ending balance")
  175. elif type_object == "account":
  176. name = my_object["code"] + " - " + my_object["name"]
  177. my_object["residual"] = total_amount[account_id]["residual"]
  178. label = _("Ending balance")
  179. super(OpenItemsXslx, self).write_ending_balance_from_dict(
  180. my_object, name, label
  181. )