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.

190 lines
7.9 KiB

  1. # Copyright 2018 Forest and Biomass Romania
  2. # Copyright 2020 ForgeFlow S.L. (https://www.forgeflow.com)
  3. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
  4. from odoo import api, models
  5. class VATReport(models.AbstractModel):
  6. _name = "report.account_financial_report.vat_report"
  7. def _get_tax_data(self, tax_ids):
  8. taxes = self.env["account.tax"].browse(tax_ids)
  9. tax_data = {}
  10. for tax in taxes:
  11. tax_data.update(
  12. {
  13. tax.id: {
  14. "id": tax.id,
  15. "name": tax.name,
  16. "tax_group_id": tax.tax_group_id.id,
  17. "tags_ids": tax.tag_ids.ids,
  18. }
  19. }
  20. )
  21. return tax_data
  22. @api.model
  23. def _get_vat_report_domain(self, company_id, date_from, date_to):
  24. domain = [
  25. ("company_id", "=", company_id),
  26. ("date", ">=", date_from),
  27. ("date", "<", date_to),
  28. ("tax_line_id", "!=", False),
  29. ("tax_exigible", "=", True),
  30. ]
  31. return domain
  32. def _get_vat_report_data(self, company_id, date_from, date_to):
  33. domain = self._get_vat_report_domain(company_id, date_from, date_to)
  34. ml_fields = [
  35. "id",
  36. "tax_base_amount",
  37. "balance",
  38. "tax_line_id",
  39. "analytic_tag_ids",
  40. ]
  41. tax_move_lines = self.env["account.move.line"].search_read(
  42. domain=domain, fields=ml_fields,
  43. )
  44. vat_data = {}
  45. tax_ids = set()
  46. for tax_move_line in tax_move_lines:
  47. tax_ml_id = tax_move_line["id"]
  48. vat_data[tax_ml_id] = {}
  49. vat_data[tax_ml_id].update(
  50. {
  51. "id": tax_ml_id,
  52. "net": tax_move_line["tax_base_amount"],
  53. "tax": tax_move_line["balance"]
  54. if tax_move_line["balance"] > 0
  55. else (-1) * tax_move_line["balance"],
  56. "tax_line_id": tax_move_line["tax_line_id"],
  57. }
  58. )
  59. tax_ids.add(tax_move_line["tax_line_id"][0])
  60. tax_data = self._get_tax_data(tax_ids)
  61. return vat_data, tax_data
  62. def _get_tax_group_data(self, tax_group_ids):
  63. tax_groups = self.env["account.tax.group"].browse(tax_group_ids)
  64. tax_group_data = {}
  65. for tax_group in tax_groups:
  66. tax_group_data.update(
  67. {
  68. tax_group.id: {
  69. "id": tax_group.id,
  70. "name": tax_group.name,
  71. "code": str(tax_group.sequence),
  72. }
  73. }
  74. )
  75. return tax_group_data
  76. def _get_vat_report_group_data(self, vat_report_data, tax_data, tax_detail):
  77. vat_report = {}
  78. for tax_move_line in vat_report_data.values():
  79. tax_id = tax_move_line["tax_line_id"][0]
  80. tax_group_id = tax_data[tax_id]["tax_group_id"]
  81. if tax_group_id not in vat_report.keys():
  82. vat_report[tax_group_id] = {}
  83. vat_report[tax_group_id]["net"] = 0.0
  84. vat_report[tax_group_id]["tax"] = 0.0
  85. vat_report[tax_group_id][tax_id] = tax_data[tax_id]
  86. vat_report[tax_group_id][tax_id].update({"net": 0.0, "tax": 0.0})
  87. else:
  88. if tax_id not in vat_report[tax_group_id].keys():
  89. vat_report[tax_group_id][tax_id] = tax_data[tax_id]
  90. vat_report[tax_group_id][tax_id].update({"net": 0.0, "tax": 0.0})
  91. vat_report[tax_group_id]["net"] += tax_move_line["net"]
  92. vat_report[tax_group_id]["tax"] += tax_move_line["tax"]
  93. vat_report[tax_group_id][tax_id]["net"] += tax_move_line["net"]
  94. vat_report[tax_group_id][tax_id]["tax"] += tax_move_line["tax"]
  95. tax_group_data = self._get_tax_group_data(vat_report.keys())
  96. vat_report_list = []
  97. for tax_group_id in vat_report.keys():
  98. vat_report[tax_group_id]["name"] = tax_group_data[tax_group_id]["name"]
  99. vat_report[tax_group_id]["code"] = tax_group_data[tax_group_id]["code"]
  100. if tax_detail:
  101. vat_report[tax_group_id]["taxes"] = []
  102. for tax_id in vat_report[tax_group_id]:
  103. if isinstance(tax_id, int):
  104. vat_report[tax_group_id]["taxes"].append(
  105. vat_report[tax_group_id][tax_id]
  106. )
  107. vat_report_list.append(vat_report[tax_group_id])
  108. return vat_report_list
  109. def _get_tags_data(self, tags_ids):
  110. tags = self.env["account.account.tag"].browse(tags_ids)
  111. tags_data = {}
  112. for tag in tags:
  113. tags_data.update({tag.id: {"code": "", "name": tag.name}})
  114. return tags_data
  115. def _get_vat_report_tag_data(self, vat_report_data, tax_data, tax_detail):
  116. vat_report = {}
  117. for tax_move_line in vat_report_data.values():
  118. tax_id = tax_move_line["tax_line_id"][0]
  119. tags_ids = tax_data[tax_id]["tags_ids"]
  120. if tags_ids:
  121. for tag_id in tags_ids:
  122. if tag_id not in vat_report.keys():
  123. vat_report[tag_id] = {}
  124. vat_report[tag_id]["net"] = 0.0
  125. vat_report[tag_id]["tax"] = 0.0
  126. vat_report[tag_id][tax_id] = tax_data[tax_id]
  127. vat_report[tag_id][tax_id].update({"net": 0.0, "tax": 0.0})
  128. else:
  129. if tax_id not in vat_report[tag_id].keys():
  130. vat_report[tag_id][tax_id] = tax_data[tax_id]
  131. vat_report[tag_id][tax_id].update({"net": 0.0, "tax": 0.0})
  132. vat_report[tag_id][tax_id]["net"] += tax_move_line["net"]
  133. vat_report[tag_id][tax_id]["tax"] += tax_move_line["tax"]
  134. vat_report[tag_id]["net"] += tax_move_line["net"]
  135. vat_report[tag_id]["tax"] += tax_move_line["tax"]
  136. tags_data = self._get_tags_data(vat_report.keys())
  137. vat_report_list = []
  138. for tag_id in vat_report.keys():
  139. vat_report[tag_id]["name"] = tags_data[tag_id]["name"]
  140. vat_report[tag_id]["code"] = tags_data[tag_id]["code"]
  141. if tax_detail:
  142. vat_report[tag_id]["taxes"] = []
  143. for tax_id in vat_report[tag_id]:
  144. if isinstance(tax_id, int):
  145. vat_report[tag_id]["taxes"].append(vat_report[tag_id][tax_id])
  146. vat_report_list.append(vat_report[tag_id])
  147. return vat_report_list
  148. @api.multi
  149. def _get_report_values(self, docids, data):
  150. wizard_id = data["wizard_id"]
  151. company = self.env["res.company"].browse(data["company_id"])
  152. company_id = data["company_id"]
  153. date_from = data["date_from"]
  154. date_to = data["date_to"]
  155. based_on = data["based_on"]
  156. tax_detail = data["tax_detail"]
  157. vat_report_data, tax_data = self._get_vat_report_data(
  158. company_id, date_from, date_to
  159. )
  160. if based_on == "taxgroups":
  161. vat_report = self._get_vat_report_group_data(
  162. vat_report_data, tax_data, tax_detail
  163. )
  164. else:
  165. vat_report = self._get_vat_report_tag_data(
  166. vat_report_data, tax_data, tax_detail
  167. )
  168. return {
  169. "doc_ids": [wizard_id],
  170. "doc_model": "open.items.report.wizard",
  171. "docs": self.env["open.items.report.wizard"].browse(wizard_id),
  172. "company_name": company.display_name,
  173. "currency_name": company.currency_id.name,
  174. "date_to": data["date_to"],
  175. "date_from": data["date_from"],
  176. "based_on": data["based_on"],
  177. "tax_detail": data["tax_detail"],
  178. "vat_report": vat_report,
  179. }