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.

275 lines
8.2 KiB

  1. # -*- coding: utf-8 -*-
  2. # Author: Damien Crier
  3. # Author: Julien Coux
  4. # Copyright 2016 Camptocamp SA
  5. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
  6. from . import abstract_report_xlsx
  7. from odoo.report import report_sxw
  8. from odoo import _
  9. class JournalXslx(abstract_report_xlsx.AbstractReportXslx):
  10. def __init__(
  11. self, name, table, rml=False, parser=False, header=True,
  12. store=False):
  13. super(JournalXslx, self).__init__(
  14. name, table, rml, parser, header, store)
  15. def _get_report_name(self, report):
  16. report_name = _('Journal Ledger')
  17. return self._get_report_complete_name(report, report_name)
  18. def _get_report_columns(self, report):
  19. columns = [
  20. {
  21. 'header': _('Entry'),
  22. 'field': 'entry',
  23. 'width': 18
  24. },
  25. {
  26. 'header': _('Date'),
  27. 'field': 'date',
  28. 'width': 11
  29. },
  30. {
  31. 'header': _('Account'),
  32. 'field': 'account_code',
  33. 'width': 9
  34. },
  35. ]
  36. if report.with_account_name:
  37. columns.append({
  38. 'header': _('Account Name'),
  39. 'field': 'account',
  40. 'width': 15
  41. })
  42. columns += [
  43. {
  44. 'header': _('Partner'),
  45. 'field': 'partner',
  46. 'width': 25
  47. },
  48. {
  49. 'header': _('Ref - Label'),
  50. 'field': 'label',
  51. 'width': 40
  52. },
  53. {
  54. 'header': _('Taxes'),
  55. 'field': 'taxes_description',
  56. 'width': 11
  57. },
  58. {
  59. 'header': _('Debit'),
  60. 'field': 'debit',
  61. 'type': 'amount',
  62. 'width': 14,
  63. },
  64. {
  65. 'header': _('Credit'),
  66. 'field': 'credit',
  67. 'type': 'amount',
  68. 'width': 14
  69. }
  70. ]
  71. if report.foreign_currency:
  72. columns += [
  73. {
  74. 'header': _('Amount Currency'),
  75. 'field': 'amount_currency',
  76. 'type': 'amount',
  77. 'width': 14
  78. },
  79. {
  80. 'header': _('Currency'),
  81. 'field': 'currency_name',
  82. 'width': 14
  83. }
  84. ]
  85. columns_as_dict = {}
  86. for i, column in enumerate(columns):
  87. columns_as_dict[i] = column
  88. return columns_as_dict
  89. def _get_journal_tax_columns(self, report):
  90. return {
  91. 0: {
  92. 'header': _('Name'),
  93. 'field': 'tax_name',
  94. 'width': 35
  95. },
  96. 1: {
  97. 'header': _('Description'),
  98. 'field': 'tax_code',
  99. 'width': 18
  100. },
  101. 2: {
  102. 'header': _('Base Debit'),
  103. 'field': 'base_debit',
  104. 'type': 'amount',
  105. 'width': 14
  106. },
  107. 3: {
  108. 'header': _('Base Credit'),
  109. 'field': 'base_credit',
  110. 'type': 'amount',
  111. 'width': 14
  112. },
  113. 4: {
  114. 'header': _('Base Balance'),
  115. 'field': 'base_balance',
  116. 'type': 'amount',
  117. 'width': 14
  118. },
  119. 5: {
  120. 'header': _('Tax Debit'),
  121. 'field': 'tax_debit',
  122. 'type': 'amount',
  123. 'width': 14
  124. },
  125. 6: {
  126. 'header': _('Tax Credit'),
  127. 'field': 'tax_credit',
  128. 'type': 'amount',
  129. 'width': 14
  130. },
  131. 7: {
  132. 'header': _('Tax Balance'),
  133. 'field': 'tax_balance',
  134. 'type': 'amount',
  135. 'width': 14
  136. },
  137. }
  138. def _get_col_count_filter_name(self):
  139. return 2
  140. def _get_col_count_filter_value(self):
  141. return 3
  142. def _get_report_filters(self, report):
  143. target_label_by_value = {
  144. value: label
  145. for value, label in
  146. self.env['journal.report.wizard']._get_move_targets()
  147. }
  148. sort_option_label_by_value = {
  149. value: label
  150. for value, label in
  151. self.env['journal.report.wizard']._get_sort_options()
  152. }
  153. return [
  154. [
  155. _('Company'),
  156. report.company_id.name
  157. ],
  158. [
  159. _('Date range filter'),
  160. _('From: %s To: %s') % (report.date_from, report.date_to)
  161. ],
  162. [
  163. _('Target moves filter'),
  164. _("%s") % target_label_by_value[report.move_target],
  165. ],
  166. [
  167. _('Entries sorted by'),
  168. _("%s") % sort_option_label_by_value[report.sort_option],
  169. ],
  170. [
  171. _('Journals'),
  172. ', '.join([
  173. "%s - %s" % (report_journal.code, report_journal.name)
  174. for report_journal in report.report_journal_ids
  175. ])
  176. ]
  177. ]
  178. def _generate_report_content(self, workbook, report):
  179. group_option = report.group_option
  180. if group_option == 'journal':
  181. for report_journal in report.report_journal_ids:
  182. self._generate_journal_content(workbook, report_journal)
  183. elif group_option == 'none':
  184. self._generate_no_group_content(workbook, report)
  185. def _generate_no_group_content(self, workbook, report):
  186. self._generate_moves_content(
  187. workbook, report, "Report", report.report_move_ids)
  188. self._generate_no_group_taxes_summary(workbook, report)
  189. def _generate_journal_content(self, workbook, report_journal):
  190. sheet_name = "%s (%s) - %s" % (
  191. report_journal.code,
  192. report_journal.currency_id.name,
  193. report_journal.name,
  194. )
  195. self._generate_moves_content(
  196. workbook, report_journal.report_id, sheet_name,
  197. report_journal.report_move_ids)
  198. self._generate_journal_taxes_summary(workbook, report_journal)
  199. def _generate_no_group_taxes_summary(self, workbook, report):
  200. self._generate_taxes_summary(
  201. workbook, report, "Tax Report", report.report_tax_line_ids)
  202. def _generate_journal_taxes_summary(self, workbook, report_journal):
  203. sheet_name = "Tax - %s (%s) - %s" % (
  204. report_journal.code,
  205. report_journal.currency_id.name,
  206. report_journal.name,
  207. )
  208. report = report_journal.report_id
  209. self._generate_taxes_summary(
  210. workbook, report, sheet_name, report_journal.report_tax_line_ids)
  211. def _generate_moves_content(self, workbook, report, sheet_name, moves):
  212. report_sheet = self.add_sheet(workbook, sheet_name)
  213. self.set_sheet(report_sheet)
  214. self._set_column_width()
  215. self.row_pos = 1
  216. self.write_array_title(sheet_name)
  217. self.row_pos += 2
  218. self.write_array_header()
  219. for move in moves:
  220. for line in move.report_move_line_ids:
  221. self.write_line(line)
  222. self.row_pos += 1
  223. def _generate_taxes_summary(self, workbook, report, sheet_name, tax_lines):
  224. tax_journal_sheet = self.add_sheet(workbook, sheet_name)
  225. self.set_sheet(tax_journal_sheet)
  226. self.row_pos = 1
  227. self.write_array_title(sheet_name)
  228. self.row_pos += 2
  229. tax_columns = self._get_journal_tax_columns(report)
  230. self._set_columns_width(tax_columns)
  231. for col_pos, column in tax_columns.iteritems():
  232. self.sheet.write(
  233. self.row_pos, col_pos, column['header'],
  234. self.format_header_center
  235. )
  236. self.row_pos += 1
  237. for tax_line in tax_lines:
  238. self._write_line(tax_columns, tax_line)
  239. JournalXslx(
  240. 'report.account_financial_report_qweb.report_journal_xlsx',
  241. 'report_journal_qweb',
  242. parser=report_sxw.rml_parse
  243. )