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.

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