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.

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