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.

249 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. # Compute report data
  131. self._inject_account_values()
  132. if self.show_partner_details:
  133. self._inject_partner_values()
  134. # Refresh cache because all data are computed with SQL requests
  135. self.refresh()
  136. def _inject_account_values(self):
  137. """Inject report values for report_trial_balance_qweb_account"""
  138. query_inject_account = """
  139. INSERT INTO
  140. report_trial_balance_qweb_account
  141. (
  142. report_id,
  143. create_uid,
  144. create_date,
  145. account_id,
  146. code,
  147. name,
  148. initial_balance,
  149. debit,
  150. credit,
  151. final_balance
  152. )
  153. SELECT
  154. %s AS report_id,
  155. %s AS create_uid,
  156. NOW() AS create_date,
  157. rag.account_id,
  158. rag.code,
  159. rag.name,
  160. rag.initial_balance AS initial_balance,
  161. rag.final_debit - rag.initial_debit AS debit,
  162. rag.final_credit - rag.initial_credit AS credit,
  163. rag.final_balance AS final_balance
  164. FROM
  165. report_general_ledger_qweb_account rag
  166. WHERE
  167. rag.report_id = %s
  168. """
  169. query_inject_account_params = (
  170. self.id,
  171. self.env.uid,
  172. self.general_ledger_id.id,
  173. )
  174. self.env.cr.execute(query_inject_account, query_inject_account_params)
  175. def _inject_partner_values(self):
  176. """Inject report values for report_trial_balance_qweb_partner"""
  177. query_inject_partner = """
  178. INSERT INTO
  179. report_trial_balance_qweb_partner
  180. (
  181. report_account_id,
  182. create_uid,
  183. create_date,
  184. partner_id,
  185. name,
  186. initial_balance,
  187. debit,
  188. credit,
  189. final_balance
  190. )
  191. SELECT
  192. ra.id AS report_account_id,
  193. %s AS create_uid,
  194. NOW() AS create_date,
  195. rpg.partner_id,
  196. rpg.name,
  197. rpg.initial_balance AS initial_balance,
  198. rpg.final_debit - rpg.initial_debit AS debit,
  199. rpg.final_credit - rpg.initial_credit AS credit,
  200. rpg.final_balance AS final_balance
  201. FROM
  202. report_general_ledger_qweb_partner rpg
  203. INNER JOIN
  204. report_general_ledger_qweb_account rag ON rpg.report_account_id = rag.id
  205. INNER JOIN
  206. report_trial_balance_qweb_account ra ON rag.code = ra.code
  207. WHERE
  208. rag.report_id = %s
  209. AND ra.report_id = %s
  210. """
  211. query_inject_partner_params = (
  212. self.env.uid,
  213. self.general_ledger_id.id,
  214. self.id,
  215. )
  216. self.env.cr.execute(query_inject_partner, query_inject_partner_params)