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.

239 lines
9.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. 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. "amount_type": tax.amount_type,
  21. "tags_ids": tax.invoice_repartition_line_ids.tag_ids.ids,
  22. }
  23. }
  24. )
  25. return tax_data
  26. @api.model
  27. def _get_tax_report_domain(self, company_id, date_from, date_to, only_posted_moves):
  28. domain = [
  29. ("company_id", "=", company_id),
  30. ("date", ">=", date_from),
  31. ("date", "<=", date_to),
  32. ("tax_line_id", "!=", False),
  33. ("tax_exigible", "=", True),
  34. ]
  35. if only_posted_moves:
  36. domain += [("move_id.state", "=", "posted")]
  37. else:
  38. domain += [("move_id.state", "in", ["posted", "draft"])]
  39. return domain
  40. @api.model
  41. def _get_net_report_domain(self, company_id, date_from, date_to, only_posted_moves):
  42. domain = [
  43. ("company_id", "=", company_id),
  44. ("date", ">=", date_from),
  45. ("date", "<=", date_to),
  46. ("tax_exigible", "=", True),
  47. ]
  48. if only_posted_moves:
  49. domain += [("move_id.state", "=", "posted")]
  50. else:
  51. domain += [("move_id.state", "in", ["posted", "draft"])]
  52. return domain
  53. def _get_vat_report_data(self, company_id, date_from, date_to, only_posted_moves):
  54. tax_domain = self._get_tax_report_domain(
  55. company_id, date_from, date_to, only_posted_moves
  56. )
  57. ml_fields = [
  58. "id",
  59. "tax_base_amount",
  60. "balance",
  61. "tax_line_id",
  62. "tax_ids",
  63. "analytic_tag_ids",
  64. "tag_ids",
  65. ]
  66. tax_move_lines = self.env["account.move.line"].search_read(
  67. domain=tax_domain, fields=ml_fields,
  68. )
  69. net_domain = self._get_net_report_domain(
  70. company_id, date_from, date_to, only_posted_moves
  71. )
  72. taxed_move_lines = self.env["account.move.line"].search_read(
  73. domain=net_domain, fields=ml_fields,
  74. )
  75. taxed_move_lines = list(filter(lambda d: d["tax_ids"], taxed_move_lines))
  76. vat_data = []
  77. for tax_move_line in tax_move_lines:
  78. vat_data.append(
  79. {
  80. "net": 0.0,
  81. "tax": tax_move_line["balance"],
  82. "tax_line_id": tax_move_line["tax_line_id"][0],
  83. }
  84. )
  85. for taxed_move_line in taxed_move_lines:
  86. for tax_id in taxed_move_line["tax_ids"]:
  87. vat_data.append(
  88. {
  89. "net": taxed_move_line["balance"],
  90. "tax": 0.0,
  91. "tax_line_id": tax_id,
  92. }
  93. )
  94. tax_ids = list(map(operator.itemgetter("tax_line_id"), vat_data))
  95. tax_ids = list(set(tax_ids))
  96. tax_data = self._get_tax_data(tax_ids)
  97. return vat_data, tax_data
  98. def _get_tax_group_data(self, tax_group_ids):
  99. tax_groups = self.env["account.tax.group"].browse(tax_group_ids)
  100. tax_group_data = {}
  101. for tax_group in tax_groups:
  102. tax_group_data.update(
  103. {
  104. tax_group.id: {
  105. "id": tax_group.id,
  106. "name": tax_group.name,
  107. "code": str(tax_group.sequence),
  108. }
  109. }
  110. )
  111. return tax_group_data
  112. def _get_vat_report_group_data(self, vat_report_data, tax_data, tax_detail):
  113. vat_report = {}
  114. for tax_move_line in vat_report_data:
  115. tax_id = tax_move_line["tax_line_id"]
  116. if tax_data[tax_id]["amount_type"] == "group":
  117. pass
  118. else:
  119. tax_group_id = tax_data[tax_id]["tax_group_id"]
  120. if tax_group_id not in vat_report.keys():
  121. vat_report[tax_group_id] = {}
  122. vat_report[tax_group_id]["net"] = 0.0
  123. vat_report[tax_group_id]["tax"] = 0.0
  124. vat_report[tax_group_id][tax_id] = dict(tax_data[tax_id])
  125. vat_report[tax_group_id][tax_id].update({"net": 0.0, "tax": 0.0})
  126. else:
  127. if tax_id not in vat_report[tax_group_id].keys():
  128. vat_report[tax_group_id][tax_id] = dict(tax_data[tax_id])
  129. vat_report[tax_group_id][tax_id].update(
  130. {"net": 0.0, "tax": 0.0}
  131. )
  132. vat_report[tax_group_id]["net"] += tax_move_line["net"]
  133. vat_report[tax_group_id]["tax"] += tax_move_line["tax"]
  134. vat_report[tax_group_id][tax_id]["net"] += tax_move_line["net"]
  135. vat_report[tax_group_id][tax_id]["tax"] += tax_move_line["tax"]
  136. tax_group_data = self._get_tax_group_data(vat_report.keys())
  137. vat_report_list = []
  138. for tax_group_id in vat_report.keys():
  139. vat_report[tax_group_id]["name"] = tax_group_data[tax_group_id]["name"]
  140. vat_report[tax_group_id]["code"] = tax_group_data[tax_group_id]["code"]
  141. if tax_detail:
  142. vat_report[tax_group_id]["taxes"] = []
  143. for tax_id in vat_report[tax_group_id]:
  144. if isinstance(tax_id, int):
  145. vat_report[tax_group_id]["taxes"].append(
  146. vat_report[tax_group_id][tax_id]
  147. )
  148. vat_report_list.append(vat_report[tax_group_id])
  149. return vat_report_list
  150. def _get_tags_data(self, tags_ids):
  151. tags = self.env["account.account.tag"].browse(tags_ids)
  152. tags_data = {}
  153. for tag in tags:
  154. tags_data.update({tag.id: {"code": "", "name": tag.name}})
  155. return tags_data
  156. def _get_vat_report_tag_data(self, vat_report_data, tax_data, tax_detail):
  157. vat_report = {}
  158. for tax_move_line in vat_report_data:
  159. tax_id = tax_move_line["tax_line_id"]
  160. tags_ids = tax_data[tax_id]["tags_ids"]
  161. if tax_data[tax_id]["amount_type"] == "group":
  162. continue
  163. else:
  164. if tags_ids:
  165. for tag_id in tags_ids:
  166. if tag_id not in vat_report.keys():
  167. vat_report[tag_id] = {}
  168. vat_report[tag_id]["net"] = 0.0
  169. vat_report[tag_id]["tax"] = 0.0
  170. vat_report[tag_id][tax_id] = dict(tax_data[tax_id])
  171. vat_report[tag_id][tax_id].update({"net": 0.0, "tax": 0.0})
  172. else:
  173. if tax_id not in vat_report[tag_id].keys():
  174. vat_report[tag_id][tax_id] = dict(tax_data[tax_id])
  175. vat_report[tag_id][tax_id].update(
  176. {"net": 0.0, "tax": 0.0}
  177. )
  178. vat_report[tag_id][tax_id]["net"] += tax_move_line["net"]
  179. vat_report[tag_id][tax_id]["tax"] += tax_move_line["tax"]
  180. vat_report[tag_id]["net"] += tax_move_line["net"]
  181. vat_report[tag_id]["tax"] += tax_move_line["tax"]
  182. tags_data = self._get_tags_data(vat_report.keys())
  183. vat_report_list = []
  184. for tag_id in vat_report.keys():
  185. vat_report[tag_id]["name"] = tags_data[tag_id]["name"]
  186. vat_report[tag_id]["code"] = tags_data[tag_id]["code"]
  187. if tax_detail:
  188. vat_report[tag_id]["taxes"] = []
  189. for tax_id in vat_report[tag_id]:
  190. if isinstance(tax_id, int):
  191. vat_report[tag_id]["taxes"].append(vat_report[tag_id][tax_id])
  192. vat_report_list.append(vat_report[tag_id])
  193. return vat_report_list
  194. def _get_report_values(self, docids, data):
  195. wizard_id = data["wizard_id"]
  196. company = self.env["res.company"].browse(data["company_id"])
  197. company_id = data["company_id"]
  198. date_from = data["date_from"]
  199. date_to = data["date_to"]
  200. based_on = data["based_on"]
  201. tax_detail = data["tax_detail"]
  202. only_posted_moves = data["only_posted_moves"]
  203. vat_report_data, tax_data = self._get_vat_report_data(
  204. company_id, date_from, date_to, only_posted_moves
  205. )
  206. if based_on == "taxgroups":
  207. vat_report = self._get_vat_report_group_data(
  208. vat_report_data, tax_data, tax_detail
  209. )
  210. else:
  211. vat_report = self._get_vat_report_tag_data(
  212. vat_report_data, tax_data, tax_detail
  213. )
  214. return {
  215. "doc_ids": [wizard_id],
  216. "doc_model": "open.items.report.wizard",
  217. "docs": self.env["open.items.report.wizard"].browse(wizard_id),
  218. "company_name": company.display_name,
  219. "company_currency": company.currency_id,
  220. "currency_name": company.currency_id.name,
  221. "date_to": data["date_to"],
  222. "date_from": data["date_from"],
  223. "based_on": data["based_on"],
  224. "tax_detail": data["tax_detail"],
  225. "vat_report": vat_report,
  226. }