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.

201 lines
7.2 KiB

  1. # -*- coding: utf-8 -*-
  2. # Copyright 2017 RGB Consulting S.L. (http://www.rgbconsulting.com)
  3. # Copyright 2017 Eficent Business and IT Consulting Services S.L.
  4. # (http://www.eficent.com)
  5. # Miquel Raich <miquel.raich@eficent.com>
  6. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
  7. try:
  8. from openerp.addons.report_xlsx.report.report_xlsx import ReportXlsx
  9. except ImportError:
  10. ReportXlsx = object
  11. from openerp.report import report_sxw
  12. from openerp import _
  13. class JournalLedgerXlsx(ReportXlsx):
  14. def __init__(self, name, table, rml=False, parser=False, header=True,
  15. store=False):
  16. super(ReportXlsx, self).__init__(
  17. name, table, rml, parser, header, store)
  18. self.sheet = None
  19. self.row_pos = None
  20. self.format_title = None
  21. self.format_border_top = None
  22. def _define_formats(self, workbook):
  23. """ Add cell formats to current workbook.
  24. Available formats:
  25. * format_title
  26. * format_header
  27. * format_header_right
  28. * format_header_italic
  29. * format_border_top
  30. """
  31. self.format_title = workbook.add_format({
  32. 'bold': True,
  33. 'align': 'center',
  34. 'bg_color': '#46C646',
  35. 'border': True
  36. })
  37. self.format_header = workbook.add_format({
  38. 'bold': True,
  39. 'bg_color': '#FFFFCC',
  40. 'border': True
  41. })
  42. self.format_header_right = workbook.add_format({
  43. 'bold': True,
  44. 'bg_color': '#FFFFCC',
  45. 'border': True,
  46. 'align': 'right'
  47. })
  48. self.format_header_italic = workbook.add_format({
  49. 'bold': True,
  50. 'bg_color': '#FFFFCC',
  51. 'border': True,
  52. 'italic': True
  53. })
  54. self.format_border_top = workbook.add_format({
  55. 'top': 1,
  56. 'bg_color': '#eeeeee'
  57. })
  58. def _write_report_title(self, title):
  59. self.sheet.merge_range(
  60. self.row_pos, 0, self.row_pos, 6, title, self.format_title
  61. )
  62. self.row_pos += 1
  63. def _write_report_range(self, date1, date2):
  64. self.sheet.merge_range(
  65. self.row_pos, 0, self.row_pos, 1,
  66. _('From ')+date1+_(' to ')+date2+_(':'))
  67. self.row_pos += 1
  68. def _set_headers(self):
  69. # Journal
  70. self.sheet.write_string(self.row_pos, 2, _('Journal'),
  71. self.format_header)
  72. # Partner
  73. self.sheet.write_string(self.row_pos, 3, _('Partner'),
  74. self.format_header)
  75. # Reference
  76. self.sheet.write_string(self.row_pos, 4, _('Reference'),
  77. self.format_header)
  78. self.row_pos += 1
  79. # Entry
  80. self.sheet.write_string(self.row_pos, 0, _('Entry'),
  81. self.format_header)
  82. # Date
  83. self.sheet.write_string(self.row_pos, 1, _('Date'), self.format_header)
  84. # Account
  85. self.sheet.write_string(self.row_pos, 2, _('Account'),
  86. self.format_header_italic)
  87. # Account name
  88. self.sheet.write_string(self.row_pos, 3, _('Account name'),
  89. self.format_header_italic)
  90. # Description
  91. self.sheet.write_string(self.row_pos, 4, _('Description'),
  92. self.format_header_italic)
  93. # Debit
  94. self.sheet.write_string(self.row_pos, 5, _('Debit'),
  95. self.format_header_right)
  96. # Credit
  97. self.sheet.write_string(self.row_pos, 6, _('Credit'),
  98. self.format_header_right)
  99. self.sheet.freeze_panes(4, 0)
  100. self.row_pos += 1
  101. def _generate_report_content(self, report_data):
  102. for move in report_data:
  103. # Entry
  104. self.sheet.write_string(self.row_pos, 0, move.name or '',
  105. self.format_border_top)
  106. self.sheet.set_column(0, 0, 18)
  107. # Date
  108. self.sheet.write_string(self.row_pos, 1, move.date or '',
  109. self.format_border_top)
  110. self.sheet.set_column(1, 1, 12)
  111. # Journal
  112. self.sheet.write_string(self.row_pos, 2,
  113. move.journal_id.name or '',
  114. self.format_border_top)
  115. self.sheet.set_column(2, 2, 30)
  116. # Partner
  117. self.sheet.write_string(self.row_pos, 3,
  118. move.partner_id.name or '',
  119. self.format_border_top)
  120. self.sheet.set_column(3, 3, 40)
  121. # Reference
  122. self.sheet.write_string(self.row_pos, 4, move.ref or '',
  123. self.format_border_top)
  124. self.sheet.set_column(4, 4, 40)
  125. # Debit
  126. self.sheet.write_number(self.row_pos, 5, move.amount or 0,
  127. self.format_border_top)
  128. self.sheet.set_column(5, 5, 12)
  129. # Credit
  130. self.sheet.write_number(self.row_pos, 6, move.amount or 0,
  131. self.format_border_top)
  132. self.sheet.set_column(6, 6, 12)
  133. self.row_pos += 1
  134. for line in move.line_ids:
  135. # Account code
  136. self.sheet.write_string(self.row_pos, 2,
  137. line.account_id.code or '')
  138. # Account name
  139. self.sheet.write_string(self.row_pos, 3,
  140. line.account_id.name or '')
  141. # Line description
  142. self.sheet.write_string(self.row_pos, 4, line.name or '')
  143. # Debit
  144. self.sheet.write_number(self.row_pos, 5, line.debit or 0)
  145. # Credit
  146. self.sheet.write_number(self.row_pos, 6, line.credit or 0)
  147. self.row_pos += 1
  148. def generate_xlsx_report(self, workbook, data, objects):
  149. date_start = data.get('date_start')
  150. date_end = data.get('date_end')
  151. journal_ids = data.get('journal_ids', [])
  152. report_data = self.env['account.move'].search(
  153. [('date', '<=', date_end),
  154. ('date', '>=', date_start),
  155. ('journal_id', 'in', journal_ids),
  156. ('state', '!=', 'draft')],
  157. order=data.get('sort_selection', 'date') + ', id')
  158. # Initial row
  159. self.row_pos = 0
  160. # Load formats to workbook
  161. self._define_formats(workbook)
  162. # Set report name
  163. report_name = _('Journal Ledger') + ' - ' + \
  164. self.env.user.company_id.name
  165. self.sheet = workbook.add_worksheet(report_name[:31])
  166. if data.get('landscape'):
  167. self.sheet.set_landscape()
  168. self.sheet.fit_to_pages(1, 0)
  169. self.sheet.set_zoom(80)
  170. self._write_report_title(report_name)
  171. self._write_report_range(date_start, date_end)
  172. # Set headers
  173. self._set_headers()
  174. # Generate data
  175. self._generate_report_content(report_data)
  176. if ReportXlsx != object:
  177. JournalLedgerXlsx(
  178. 'report.account_journal_report.journal_ledger_xlsx',
  179. 'account.journal', parser=report_sxw.rml_parse
  180. )