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.

185 lines
5.9 KiB

  1. # Copyright 2017 ACSONE SA/NV
  2. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
  3. from odoo import _, api, fields, models
  4. class JournalLedgerReportWizard(models.TransientModel):
  5. """Journal Ledger report wizard."""
  6. _name = "journal.ledger.report.wizard"
  7. _description = "Journal Ledger Report Wizard"
  8. company_id = fields.Many2one(
  9. comodel_name="res.company",
  10. default=lambda self: self.env.user.company_id,
  11. string="Company",
  12. required=False,
  13. ondelete="cascade",
  14. )
  15. date_range_id = fields.Many2one(comodel_name="date.range", string="Date range",)
  16. date_from = fields.Date(string="Start date", required=True)
  17. date_to = fields.Date(string="End date", required=True)
  18. journal_ids = fields.Many2many(
  19. comodel_name="account.journal", string="Journals", required=False,
  20. )
  21. move_target = fields.Selection(
  22. selection="_get_move_targets", default="all", required=True,
  23. )
  24. foreign_currency = fields.Boolean()
  25. sort_option = fields.Selection(
  26. selection="_get_sort_options",
  27. string="Sort entries by",
  28. default="move_name",
  29. required=True,
  30. )
  31. group_option = fields.Selection(
  32. selection="_get_group_options",
  33. string="Group entries by",
  34. default="journal",
  35. required=True,
  36. )
  37. with_account_name = fields.Boolean(default=False,)
  38. @api.model
  39. def _get_move_targets(self):
  40. return [("all", _("All")), ("posted", _("Posted")), ("draft", _("Not Posted"))]
  41. @api.model
  42. def _get_sort_options(self):
  43. return [
  44. ("move_name", _("Entry number")),
  45. ("date", _("Date")),
  46. ]
  47. @api.model
  48. def _get_group_options(self):
  49. return [
  50. ("journal", _("Journal")),
  51. ("none", _("No group")),
  52. ]
  53. @api.onchange("date_range_id")
  54. def onchange_date_range_id(self):
  55. self.date_from = self.date_range_id.date_start
  56. self.date_to = self.date_range_id.date_end
  57. @api.onchange("company_id")
  58. def onchange_company_id(self):
  59. """Handle company change."""
  60. if (
  61. self.company_id
  62. and self.date_range_id.company_id
  63. and self.date_range_id.company_id != self.company_id
  64. ):
  65. self.date_range_id = False
  66. if self.company_id and self.journal_ids:
  67. self.journal_ids = self.journal_ids.filtered(
  68. lambda p: p.company_id == self.company_id or not p.company_id
  69. )
  70. res = {"domain": {"journal_ids": []}}
  71. if not self.company_id:
  72. return res
  73. else:
  74. res["domain"]["journal_ids"] += [("company_id", "=", self.company_id.id)]
  75. return res
  76. @api.multi
  77. def _print_report(self, report_type):
  78. self.ensure_one()
  79. data = self._prepare_report_journal_ledger()
  80. if report_type == "xlsx":
  81. report_name = "a_f_r.report_journal_ledger_xlsx"
  82. else:
  83. report_name = "account_financial_report.journal_ledger"
  84. return (
  85. self.env["ir.actions.report"]
  86. .search(
  87. [("report_name", "=", report_name), ("report_type", "=", report_type)],
  88. limit=1,
  89. )
  90. .report_action(self, data=data)
  91. )
  92. @api.multi
  93. def button_export_html(self):
  94. self.ensure_one()
  95. report_type = "qweb-html"
  96. return self._export(report_type)
  97. @api.multi
  98. def button_export_pdf(self):
  99. report_type = "qweb-pdf"
  100. return self._export(report_type)
  101. @api.multi
  102. def button_export_xlsx(self):
  103. self.ensure_one()
  104. report_type = "xlsx"
  105. return self._export(report_type)
  106. @api.multi
  107. def _prepare_report_journal_ledger(self):
  108. self.ensure_one()
  109. journals = self.journal_ids
  110. if not journals:
  111. # Not selecting a journal means that we'll display all journals
  112. journals = self.env["account.journal"].search(
  113. [("company_id", "=", self.company_id.id)]
  114. )
  115. return {
  116. "wizard_id": self.id,
  117. "date_from": self.date_from,
  118. "date_to": self.date_to,
  119. "move_target": self.move_target,
  120. "foreign_currency": self.foreign_currency,
  121. "company_id": self.company_id.id,
  122. "journal_ids": journals.ids,
  123. "sort_option": self.sort_option,
  124. "group_option": self.group_option,
  125. "with_account_name": self.with_account_name,
  126. }
  127. def _export(self, report_type):
  128. """Default export is PDF."""
  129. self.ensure_one()
  130. return self._print_report(report_type)
  131. @api.model
  132. def _get_ml_tax_description(
  133. self, move_line_data, tax_line_data, move_line_taxes_data
  134. ):
  135. taxes_description = ""
  136. if move_line_data["tax_line_id"]:
  137. taxes_description = tax_line_data["description"] or tax_line_data["name"]
  138. elif move_line_taxes_data:
  139. tax_names = []
  140. for tax_key in move_line_taxes_data:
  141. tax = move_line_taxes_data[tax_key]
  142. tax_names.append(tax["description"] or tax["name"])
  143. taxes_description = ",".join(tax_names)
  144. return taxes_description
  145. @api.model
  146. def _get_partner_name(self, partner_id, partner_data):
  147. if str(partner_id) in partner_data.keys():
  148. return partner_data[str(partner_id)]["name"]
  149. else:
  150. return ""
  151. @api.model
  152. def _get_atr_from_dict(self, obj_id, data, key):
  153. try:
  154. return data[obj_id][key]
  155. except KeyError:
  156. return data[str(obj_id)][key]
  157. @api.model
  158. def _get_data_from_dict(self, obj_id, data):
  159. if data:
  160. if isinstance(list(data.keys())[0], int):
  161. return data.get(obj_id, False)
  162. else:
  163. return data.get(obj_id(obj_id), False)
  164. else:
  165. return False