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.

251 lines
7.2 KiB

  1. # -*- coding: utf-8 -*-
  2. # © 2016 Julien Coux (Camptocamp)
  3. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
  4. from openerp import models, fields, api
  5. class TrialBalanceReport(models.TransientModel):
  6. """ Here, we just define class fields.
  7. For methods, go more bottom at this file.
  8. The class hierarchy is :
  9. * TrialBalanceReport
  10. ** TrialBalanceReportAccount
  11. *** TrialBalanceReportPartner
  12. If "show_partner_details" is selected
  13. """
  14. _name = 'report_trial_balance_qweb'
  15. # Filters fields, used for data computation
  16. date_from = fields.Date()
  17. date_to = fields.Date()
  18. fy_start_date = fields.Date()
  19. only_posted_moves = fields.Boolean()
  20. hide_account_balance_at_0 = fields.Boolean()
  21. company_id = fields.Many2one(comodel_name='res.company')
  22. filter_account_ids = fields.Many2many(comodel_name='account.account')
  23. filter_partner_ids = fields.Many2many(comodel_name='res.partner')
  24. show_partner_details = fields.Boolean()
  25. # General Ledger Report Data fields,
  26. # used as base for compute the data reports
  27. general_ledger_id = fields.Many2one(
  28. comodel_name='report_general_ledger_qweb'
  29. )
  30. # Data fields, used to browse report data
  31. account_ids = fields.One2many(
  32. comodel_name='report_trial_balance_qweb_account',
  33. inverse_name='report_id'
  34. )
  35. class TrialBalanceReportAccount(models.TransientModel):
  36. _name = 'report_trial_balance_qweb_account'
  37. _order = 'code ASC'
  38. report_id = fields.Many2one(
  39. comodel_name='report_trial_balance_qweb',
  40. ondelete='cascade',
  41. index=True
  42. )
  43. # Data fields, used to keep link with real object
  44. account_id = fields.Many2one(
  45. 'account.account',
  46. index=True
  47. )
  48. # Data fields, used for report display
  49. code = fields.Char()
  50. name = fields.Char()
  51. initial_balance = fields.Float(digits=(16, 2))
  52. debit = fields.Float(digits=(16, 2))
  53. credit = fields.Float(digits=(16, 2))
  54. final_balance = fields.Float(digits=(16, 2))
  55. # Data fields, used to browse report data
  56. partner_ids = fields.One2many(
  57. comodel_name='report_trial_balance_qweb_partner',
  58. inverse_name='report_account_id'
  59. )
  60. class TrialBalanceReportPartner(models.TransientModel):
  61. _name = 'report_trial_balance_qweb_partner'
  62. report_account_id = fields.Many2one(
  63. comodel_name='report_trial_balance_qweb_account',
  64. ondelete='cascade',
  65. index=True
  66. )
  67. # Data fields, used to keep link with real object
  68. partner_id = fields.Many2one(
  69. 'res.partner',
  70. index=True
  71. )
  72. # Data fields, used for report display
  73. name = fields.Char()
  74. initial_balance = fields.Float(digits=(16, 2))
  75. debit = fields.Float(digits=(16, 2))
  76. credit = fields.Float(digits=(16, 2))
  77. final_balance = fields.Float(digits=(16, 2))
  78. @api.model
  79. def _generate_order_by(self, order_spec, query):
  80. """Custom order to display "No partner allocated" at last position."""
  81. return """
  82. ORDER BY
  83. CASE
  84. WHEN "report_trial_balance_qweb_partner"."partner_id" IS NOT NULL
  85. THEN 0
  86. ELSE 1
  87. END,
  88. "report_trial_balance_qweb_partner"."name"
  89. """
  90. class TrialBalanceReportCompute(models.TransientModel):
  91. """ Here, we just define methods.
  92. For class fields, go more top at this file.
  93. """
  94. _inherit = 'report_trial_balance_qweb'
  95. @api.multi
  96. def print_report(self, xlsx_report=False):
  97. self.ensure_one()
  98. self.compute_data_for_report()
  99. if xlsx_report:
  100. report_name = 'account_financial_report_qweb.' \
  101. 'report_trial_balance_xlsx'
  102. else:
  103. report_name = 'account_financial_report_qweb.' \
  104. 'report_trial_balance_qweb'
  105. return self.env['report'].get_action(records=self,
  106. report_name=report_name)
  107. def _prepare_report_general_ledger(self):
  108. self.ensure_one()
  109. return {
  110. 'date_from': self.date_from,
  111. 'date_to': self.date_to,
  112. 'only_posted_moves': self.only_posted_moves,
  113. 'hide_account_balance_at_0': self.hide_account_balance_at_0,
  114. 'company_id': self.company_id.id,
  115. 'filter_account_ids': [(6, 0, self.filter_account_ids.ids)],
  116. 'filter_partner_ids': [(6, 0, self.filter_partner_ids.ids)],
  117. 'fy_start_date': self.fy_start_date,
  118. }
  119. @api.multi
  120. def compute_data_for_report(self):
  121. self.ensure_one()
  122. # Compute General Ledger Report Data.
  123. # The data of Trial Balance Report
  124. # are based on General Ledger Report data.
  125. model = self.env['report_general_ledger_qweb']
  126. self.general_ledger_id = model.create(
  127. self._prepare_report_general_ledger()
  128. )
  129. self.general_ledger_id.compute_data_for_report(
  130. with_line_details=False, with_partners=self.show_partner_details
  131. )
  132. # Compute report data
  133. self._inject_account_values()
  134. if self.show_partner_details:
  135. self._inject_partner_values()
  136. # Refresh cache because all data are computed with SQL requests
  137. self.refresh()
  138. def _inject_account_values(self):
  139. """Inject report values for report_trial_balance_qweb_account"""
  140. query_inject_account = """
  141. INSERT INTO
  142. report_trial_balance_qweb_account
  143. (
  144. report_id,
  145. create_uid,
  146. create_date,
  147. account_id,
  148. code,
  149. name,
  150. initial_balance,
  151. debit,
  152. credit,
  153. final_balance
  154. )
  155. SELECT
  156. %s AS report_id,
  157. %s AS create_uid,
  158. NOW() AS create_date,
  159. rag.account_id,
  160. rag.code,
  161. rag.name,
  162. rag.initial_balance AS initial_balance,
  163. rag.final_debit - rag.initial_debit AS debit,
  164. rag.final_credit - rag.initial_credit AS credit,
  165. rag.final_balance AS final_balance
  166. FROM
  167. report_general_ledger_qweb_account rag
  168. WHERE
  169. rag.report_id = %s
  170. """
  171. query_inject_account_params = (
  172. self.id,
  173. self.env.uid,
  174. self.general_ledger_id.id,
  175. )
  176. self.env.cr.execute(query_inject_account, query_inject_account_params)
  177. def _inject_partner_values(self):
  178. """Inject report values for report_trial_balance_qweb_partner"""
  179. query_inject_partner = """
  180. INSERT INTO
  181. report_trial_balance_qweb_partner
  182. (
  183. report_account_id,
  184. create_uid,
  185. create_date,
  186. partner_id,
  187. name,
  188. initial_balance,
  189. debit,
  190. credit,
  191. final_balance
  192. )
  193. SELECT
  194. ra.id AS report_account_id,
  195. %s AS create_uid,
  196. NOW() AS create_date,
  197. rpg.partner_id,
  198. rpg.name,
  199. rpg.initial_balance AS initial_balance,
  200. rpg.final_debit - rpg.initial_debit AS debit,
  201. rpg.final_credit - rpg.initial_credit AS credit,
  202. rpg.final_balance AS final_balance
  203. FROM
  204. report_general_ledger_qweb_partner rpg
  205. INNER JOIN
  206. report_general_ledger_qweb_account rag ON rpg.report_account_id = rag.id
  207. INNER JOIN
  208. report_trial_balance_qweb_account ra ON rag.code = ra.code
  209. WHERE
  210. rag.report_id = %s
  211. AND ra.report_id = %s
  212. """
  213. query_inject_partner_params = (
  214. self.env.uid,
  215. self.general_ledger_id.id,
  216. self.id,
  217. )
  218. self.env.cr.execute(query_inject_partner, query_inject_partner_params)