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.

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