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.

252 lines
9.8 KiB

  1. # -*- coding: utf-8 -*-
  2. # Author: Damien Crier
  3. # Copyright 2016 Camptocamp SA
  4. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
  5. from openerp.addons.report_xlsx.report.report_xlsx import ReportXlsx
  6. from openerp.report import report_sxw
  7. class GeneralLedgerXslx(ReportXlsx):
  8. def __init__(self, name, table, rml=False, parser=False, header=True,
  9. store=False):
  10. super(GeneralLedgerXslx, self).__init__(
  11. name, table, rml, parser, header, store)
  12. # Initialisé à None car on ne peut pas les setter pour le moment
  13. self.row_pos = None
  14. self.format_right = None
  15. self.format_blod = None
  16. self.format_header_left = None
  17. self.format_header_center = None
  18. self.format_header_right = None
  19. self.format_header_amount = None
  20. self.format_amount = None
  21. self.sheet = None
  22. self.columns = {
  23. 0: {'header': 'Date', 'field': 'date', 'width': 11},
  24. 1: {'header': 'Entry', 'field': 'entry', 'width': 18},
  25. 2: {'header': 'Journal', 'field': 'journal', 'width': 8},
  26. 3: {'header': 'Account', 'field': 'account', 'width': 9},
  27. 4: {'header': 'Partner', 'field': 'partner', 'width': 25},
  28. 5: {'header': 'Ref - Label', 'field': 'label', 'width': 40},
  29. 6: {'header': 'Cost center', 'field': 'cost_center', 'width': 15},
  30. 7: {'header': 'Rec.', 'field': 'matching_number', 'width': 5},
  31. 8: {'header': 'Debit',
  32. 'field': 'debit',
  33. 'field_initial_balance': 'initial_debit',
  34. 'field_final_balance': 'final_debit',
  35. 'type': 'amount',
  36. 'width': 14},
  37. 9: {'header': 'Credit',
  38. 'field': 'credit',
  39. 'field_initial_balance': 'initial_credit',
  40. 'field_final_balance': 'final_credit',
  41. 'type': 'amount',
  42. 'width': 14},
  43. 10: {'header': 'Cumul. Bal.',
  44. 'field': 'cumul_balance',
  45. 'field_initial_balance': 'initial_balance',
  46. 'field_final_balance': 'final_balance',
  47. 'type': 'amount',
  48. 'width': 14},
  49. 11: {'header': 'Cur.', 'field': 'currency_name', 'width': 7},
  50. 12: {'header': 'Amount cur.',
  51. 'field': 'amount_currency',
  52. 'type': 'amount',
  53. 'width': 14},
  54. }
  55. self.col_pos_initial_balance_label = 5
  56. self.col_count_final_balance_name = 5
  57. self.col_pos_final_balance_label = 5
  58. self.col_count_filter_name = 2
  59. self.col_count_filter_value = 2
  60. self.column_count = len(self.columns)
  61. def generate_xlsx_report(self, workbook, data, objects):
  62. report = objects
  63. report_name = 'General Ledger'
  64. filters = [
  65. ['Date range filter',
  66. 'From: '+report.date_from+' To: '+report.date_to],
  67. ['Target moves filter',
  68. 'All posted entries' if report.only_posted_moves
  69. else 'All entries'],
  70. ['Account balance at 0 filter',
  71. 'Hide' if report.hide_account_balance_at_0 else 'Show'],
  72. ['Centralize filter',
  73. 'Yes' if report.centralize else 'No'],
  74. ]
  75. self.row_pos = 0
  76. self.format_blod = workbook.add_format({'bold': True})
  77. self.format_right = workbook.add_format({'align': 'right'})
  78. self.format_header_left = workbook.add_format(
  79. {'bold': True,
  80. 'border': True,
  81. 'bg_color': '#FFFFCC'})
  82. self.format_header_center = workbook.add_format(
  83. {'bold': True,
  84. 'align': 'center',
  85. 'border': True,
  86. 'bg_color': '#FFFFCC'})
  87. self.format_header_right = workbook.add_format(
  88. {'bold': True,
  89. 'align': 'right',
  90. 'border': True,
  91. 'bg_color': '#FFFFCC'})
  92. self.format_header_amount = workbook.add_format(
  93. {'bold': True,
  94. 'border': True,
  95. 'bg_color': '#FFFFCC'})
  96. self.format_header_amount.set_num_format('#,##0.00')
  97. self.format_amount = workbook.add_format()
  98. self.format_amount.set_num_format('#,##0.00')
  99. std_cell_format = workbook.add_format({'bold': False,
  100. 'align': 'left',
  101. 'border': False,
  102. 'bg_color': '#FFFFFF'})
  103. self.sheet = workbook.add_worksheet(report_name[:31])
  104. self.set_column_width()
  105. self.write_report_title(report_name)
  106. self.write_filters(filters)
  107. for account in report.account_ids:
  108. self.write_array_title(account.code + ' - ' + account.name)
  109. if account.move_line_ids:
  110. self.write_header()
  111. self.write_initial_balance(account)
  112. for line in account.move_line_ids:
  113. self.write_line(line)
  114. elif account.is_partner_account:
  115. for partner in account.partner_ids:
  116. self.write_array_title(partner.name)
  117. self.write_header()
  118. self.write_initial_balance(partner)
  119. for line in partner.move_line_ids:
  120. self.write_line(line)
  121. self.write_ending_balance(partner, 'partner')
  122. self.row_pos += 1
  123. self.write_ending_balance(account, 'account')
  124. self.row_pos += 2
  125. def set_column_width(self):
  126. for position, column in self.columns.iteritems():
  127. self.sheet.set_column(position, position, column['width'])
  128. def write_report_title(self, title):
  129. self.sheet.merge_range(
  130. self.row_pos, 0, self.row_pos, self.column_count - 1,
  131. title, self.format_blod
  132. )
  133. self.row_pos += 3
  134. def write_filters(self, filters):
  135. col_name = 1
  136. col_value = col_name + self.col_count_filter_name + 1
  137. for title, value in filters:
  138. self.sheet.merge_range(
  139. self.row_pos, col_name,
  140. self.row_pos, col_name + self.col_count_filter_name - 1,
  141. title, self.format_header_left)
  142. self.sheet.merge_range(
  143. self.row_pos, col_value,
  144. self.row_pos, col_value + self.col_count_filter_value - 1,
  145. value)
  146. self.row_pos += 1
  147. self.row_pos += 2
  148. def write_array_title(self, title):
  149. self.sheet.merge_range(
  150. self.row_pos, 0, self.row_pos, self.column_count - 1,
  151. title, self.format_blod
  152. )
  153. self.row_pos += 1
  154. def write_line(self, line_object):
  155. for col_pos, column in self.columns.iteritems():
  156. value = getattr(line_object, column['field'])
  157. cell_type = column.get('type', 'string')
  158. if cell_type == 'string':
  159. self.sheet.write_string(self.row_pos, col_pos, value or '')
  160. elif cell_type == 'amount':
  161. self.sheet.write_number(
  162. self.row_pos, col_pos, float(value), self.format_amount
  163. )
  164. self.row_pos += 1
  165. def write_header(self):
  166. for col_pos, column in self.columns.iteritems():
  167. self.sheet.write(self.row_pos, col_pos, column['header'],
  168. self.format_header_center)
  169. self.row_pos += 1
  170. def write_initial_balance(self, my_object):
  171. col_pos_label = self.col_pos_initial_balance_label
  172. self.sheet.write(self.row_pos, col_pos_label, 'Initial balance',
  173. self.format_right)
  174. for col_pos, column in self.columns.iteritems():
  175. if column.get('field_initial_balance'):
  176. value = getattr(my_object, column['field_initial_balance'])
  177. cell_type = column.get('type', 'string')
  178. if cell_type == 'string':
  179. self.sheet.write_string(self.row_pos, col_pos, value or '')
  180. elif cell_type == 'amount':
  181. self.sheet.write_number(
  182. self.row_pos, col_pos, float(value), self.format_amount
  183. )
  184. self.row_pos += 1
  185. def write_ending_balance(self, my_object, type_object):
  186. if type_object == 'partner':
  187. name = my_object.name
  188. label = 'Partner ending balance'
  189. elif type_object == 'account':
  190. name = my_object.code + ' - ' + my_object.name
  191. label = 'Ending balance'
  192. for i in range(0, self.column_count):
  193. self.sheet.write(self.row_pos, i, '', self.format_header_right)
  194. row_count_name = self.col_count_final_balance_name
  195. row_pos = self.row_pos
  196. col_pos_label = self.col_pos_final_balance_label
  197. self.sheet.merge_range(
  198. row_pos, 0, row_pos, row_count_name - 1, name,
  199. self.format_header_left
  200. )
  201. self.sheet.write(row_pos, col_pos_label, label,
  202. self.format_header_right)
  203. for col_pos, column in self.columns.iteritems():
  204. if column.get('field_final_balance'):
  205. value = getattr(my_object, column['field_final_balance'])
  206. cell_type = column.get('type', 'string')
  207. if cell_type == 'string':
  208. self.sheet.write_string(self.row_pos, col_pos, value or '',
  209. self.format_header_right)
  210. elif cell_type == 'amount':
  211. self.sheet.write_number(
  212. self.row_pos, col_pos, float(value),
  213. self.format_header_amount
  214. )
  215. self.row_pos += 1
  216. GeneralLedgerXslx('report.ledger.report.wizard.xlsx',
  217. 'report_general_ledger_qweb', parser=report_sxw.rml_parse)