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.

920 lines
28 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 odoo import models, fields, api, _
  5. class OpenItemsReport(models.TransientModel):
  6. """ Here, we just define class fields.
  7. For methods, go more bottom at this file.
  8. The class hierarchy is :
  9. * OpenItemsReport
  10. ** OpenItemsReportAccount
  11. *** OpenItemsReportPartner
  12. **** OpenItemsReportMoveLine
  13. """
  14. _name = 'report_open_items_qweb'
  15. _inherit = 'report_qweb_abstract'
  16. # Filters fields, used for data computation
  17. date_at = fields.Date()
  18. only_posted_moves = fields.Boolean()
  19. hide_account_balance_at_0 = fields.Boolean()
  20. foreign_currency = 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. # Data fields, used to browse report data
  25. account_ids = fields.One2many(
  26. comodel_name='report_open_items_qweb_account',
  27. inverse_name='report_id'
  28. )
  29. class OpenItemsReportAccount(models.TransientModel):
  30. _name = 'report_open_items_qweb_account'
  31. _inherit = 'report_qweb_abstract'
  32. _order = 'code ASC'
  33. report_id = fields.Many2one(
  34. comodel_name='report_open_items_qweb',
  35. ondelete='cascade',
  36. index=True
  37. )
  38. # Data fields, used to keep link with real object
  39. account_id = fields.Many2one(
  40. 'account.account',
  41. index=True
  42. )
  43. # Data fields, used for report display
  44. code = fields.Char()
  45. name = fields.Char()
  46. currency_id = fields.Many2one(comodel_name='res.currency')
  47. final_amount_residual = fields.Float(digits=(16, 2))
  48. final_amount_total_due = fields.Float(digits=(16, 2))
  49. final_amount_residual_currency = fields.Float(digits=(16, 2))
  50. final_amount_total_due_currency = fields.Float(digits=(16, 2))
  51. # Data fields, used to browse report data
  52. partner_ids = fields.One2many(
  53. comodel_name='report_open_items_qweb_partner',
  54. inverse_name='report_account_id'
  55. )
  56. class OpenItemsReportPartner(models.TransientModel):
  57. _name = 'report_open_items_qweb_partner'
  58. _inherit = 'report_qweb_abstract'
  59. report_account_id = fields.Many2one(
  60. comodel_name='report_open_items_qweb_account',
  61. ondelete='cascade',
  62. index=True
  63. )
  64. # Data fields, used to keep link with real object
  65. partner_id = fields.Many2one(
  66. 'res.partner',
  67. index=True
  68. )
  69. # Data fields, used for report display
  70. name = fields.Char()
  71. currency_id = fields.Many2one(comodel_name='res.currency')
  72. final_amount_residual = fields.Float(digits=(16, 2))
  73. final_amount_total_due = fields.Float(digits=(16, 2))
  74. final_amount_residual_currency = fields.Float(digits=(16, 2))
  75. final_amount_total_due_currency = fields.Float(digits=(16, 2))
  76. # Data fields, used to browse report data
  77. move_line_ids = fields.One2many(
  78. comodel_name='report_open_items_qweb_move_line',
  79. inverse_name='report_partner_id'
  80. )
  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_open_items_qweb_partner"."partner_id" IS NOT NULL
  88. THEN 0
  89. ELSE 1
  90. END,
  91. "report_open_items_qweb_partner"."name"
  92. """
  93. class OpenItemsReportMoveLine(models.TransientModel):
  94. _name = 'report_open_items_qweb_move_line'
  95. _inherit = 'report_qweb_abstract'
  96. report_partner_id = fields.Many2one(
  97. comodel_name='report_open_items_qweb_partner',
  98. ondelete='cascade',
  99. index=True
  100. )
  101. # Data fields, used to keep link with real object
  102. move_line_id = fields.Many2one('account.move.line')
  103. # Data fields, used for report display
  104. date = fields.Date()
  105. date_due = fields.Date()
  106. entry = fields.Char()
  107. journal = fields.Char()
  108. account = fields.Char()
  109. partner = fields.Char()
  110. label = fields.Char()
  111. amount_total_due = fields.Float(digits=(16, 2))
  112. amount_residual = fields.Float(digits=(16, 2))
  113. currency_id = fields.Many2one(comodel_name='res.currency')
  114. amount_total_due_currency = fields.Float(digits=(16, 2))
  115. amount_residual_currency = fields.Float(digits=(16, 2))
  116. class OpenItemsReportCompute(models.TransientModel):
  117. """ Here, we just define methods.
  118. For class fields, go more top at this file.
  119. """
  120. _inherit = 'report_open_items_qweb'
  121. @api.multi
  122. def print_report(self, report_type):
  123. self.ensure_one()
  124. if report_type == 'xlsx':
  125. report_name = 'account_financial_report_qweb.' \
  126. 'report_open_items_xlsx'
  127. else:
  128. report_name = 'account_financial_report_qweb.' \
  129. 'report_open_items_qweb'
  130. return self.env['report'].get_action(docids=self.ids,
  131. report_name=report_name)
  132. def _get_html(self):
  133. result = {}
  134. rcontext = {}
  135. context = dict(self.env.context)
  136. report = self.browse(context.get('active_id'))
  137. if report:
  138. rcontext['o'] = report
  139. result['html'] = self.env.ref(
  140. 'account_financial_report_qweb.'
  141. 'report_open_items_html').render(rcontext)
  142. return result
  143. @api.model
  144. def get_html(self, given_context=None):
  145. return self._get_html()
  146. @api.multi
  147. def compute_data_for_report(self):
  148. self.ensure_one()
  149. # Compute report data
  150. self._inject_account_values()
  151. self._inject_partner_values()
  152. self._inject_line_values()
  153. self._inject_line_values(only_empty_partner_line=True)
  154. self._clean_partners_and_accounts()
  155. self._compute_partners_and_accounts_cumul()
  156. if self.hide_account_balance_at_0:
  157. self._clean_partners_and_accounts(
  158. only_delete_account_balance_at_0=True
  159. )
  160. # Refresh cache because all data are computed with SQL requests
  161. self.invalidate_cache()
  162. def _inject_account_values(self):
  163. """Inject report values for report_open_items_qweb_account."""
  164. query_inject_account = """
  165. WITH
  166. accounts AS
  167. (
  168. SELECT
  169. a.id,
  170. a.code,
  171. a.name,
  172. a.user_type_id,
  173. c.id as currency_id
  174. FROM
  175. account_account a
  176. INNER JOIN
  177. account_move_line ml ON a.id = ml.account_id AND ml.date <= %s
  178. LEFT JOIN
  179. res_currency c ON a.currency_id = c.id
  180. """
  181. if self.filter_partner_ids:
  182. query_inject_account += """
  183. INNER JOIN
  184. res_partner p ON ml.partner_id = p.id
  185. """
  186. if self.only_posted_moves:
  187. query_inject_account += """
  188. INNER JOIN
  189. account_move m ON ml.move_id = m.id AND m.state = 'posted'
  190. """
  191. query_inject_account += """
  192. WHERE
  193. a.company_id = %s
  194. AND a.reconcile IS true
  195. """
  196. if self.filter_account_ids:
  197. query_inject_account += """
  198. AND
  199. a.id IN %s
  200. """
  201. if self.filter_partner_ids:
  202. query_inject_account += """
  203. AND
  204. p.id IN %s
  205. """
  206. query_inject_account += """
  207. GROUP BY
  208. a.id, c.id
  209. )
  210. INSERT INTO
  211. report_open_items_qweb_account
  212. (
  213. report_id,
  214. create_uid,
  215. create_date,
  216. account_id,
  217. currency_id,
  218. code,
  219. name
  220. )
  221. SELECT
  222. %s AS report_id,
  223. %s AS create_uid,
  224. NOW() AS create_date,
  225. a.id AS account_id,
  226. a.currency_id,
  227. a.code,
  228. a.name
  229. FROM
  230. accounts a
  231. """
  232. query_inject_account_params = (
  233. self.date_at,
  234. self.company_id.id,
  235. )
  236. if self.filter_account_ids:
  237. query_inject_account_params += (
  238. tuple(self.filter_account_ids.ids),
  239. )
  240. if self.filter_partner_ids:
  241. query_inject_account_params += (
  242. tuple(self.filter_partner_ids.ids),
  243. )
  244. query_inject_account_params += (
  245. self.id,
  246. self.env.uid,
  247. )
  248. self.env.cr.execute(query_inject_account, query_inject_account_params)
  249. def _inject_partner_values(self):
  250. """ Inject report values for report_open_items_qweb_partner. """
  251. # pylint: disable=sql-injection
  252. query_inject_partner = """
  253. WITH
  254. accounts_partners AS
  255. (
  256. SELECT
  257. ra.id AS report_account_id,
  258. a.id AS account_id,
  259. at.include_initial_balance AS include_initial_balance,
  260. p.id AS partner_id,
  261. COALESCE(
  262. CASE
  263. WHEN
  264. NULLIF(p.name, '') IS NOT NULL
  265. AND NULLIF(p.ref, '') IS NOT NULL
  266. THEN p.name || ' (' || p.ref || ')'
  267. ELSE p.name
  268. END,
  269. '""" + _('No partner allocated') + """'
  270. ) AS partner_name
  271. FROM
  272. report_open_items_qweb_account ra
  273. INNER JOIN
  274. account_account a ON ra.account_id = a.id
  275. INNER JOIN
  276. account_account_type at ON a.user_type_id = at.id
  277. INNER JOIN
  278. account_move_line ml ON a.id = ml.account_id AND ml.date <= %s
  279. """
  280. if self.only_posted_moves:
  281. query_inject_partner += """
  282. INNER JOIN
  283. account_move m ON ml.move_id = m.id AND m.state = 'posted'
  284. """
  285. query_inject_partner += """
  286. LEFT JOIN
  287. res_partner p ON ml.partner_id = p.id
  288. WHERE
  289. ra.report_id = %s
  290. """
  291. if self.filter_partner_ids:
  292. query_inject_partner += """
  293. AND
  294. p.id IN %s
  295. """
  296. query_inject_partner += """
  297. GROUP BY
  298. ra.id,
  299. a.id,
  300. p.id,
  301. at.include_initial_balance
  302. )
  303. INSERT INTO
  304. report_open_items_qweb_partner
  305. (
  306. report_account_id,
  307. create_uid,
  308. create_date,
  309. partner_id,
  310. name
  311. )
  312. SELECT
  313. ap.report_account_id,
  314. %s AS create_uid,
  315. NOW() AS create_date,
  316. ap.partner_id,
  317. ap.partner_name
  318. FROM
  319. accounts_partners ap
  320. """
  321. query_inject_partner_params = (
  322. self.date_at,
  323. self.id,
  324. )
  325. if self.filter_partner_ids:
  326. query_inject_partner_params += (
  327. tuple(self.filter_partner_ids.ids),
  328. )
  329. query_inject_partner_params += (
  330. self.env.uid,
  331. )
  332. self.env.cr.execute(query_inject_partner, query_inject_partner_params)
  333. def _get_line_sub_query_move_lines(self,
  334. only_empty_partner_line=False,
  335. positive_balance=True):
  336. """ Return subquery used to compute sum amounts on lines """
  337. sub_query = """
  338. SELECT
  339. ml.id,
  340. ml.balance,
  341. SUM(
  342. CASE
  343. WHEN ml_past.id IS NOT NULL
  344. THEN pr.amount
  345. ELSE NULL
  346. END
  347. ) AS partial_amount,
  348. ml.amount_currency,
  349. SUM(
  350. CASE
  351. WHEN ml_past.id IS NOT NULL
  352. THEN pr.amount_currency
  353. ELSE NULL
  354. END
  355. ) AS partial_amount_currency,
  356. ml.currency_id
  357. FROM
  358. report_open_items_qweb_partner rp
  359. INNER JOIN
  360. report_open_items_qweb_account ra
  361. ON rp.report_account_id = ra.id
  362. INNER JOIN
  363. account_move_line ml
  364. ON ra.account_id = ml.account_id
  365. """
  366. if not only_empty_partner_line:
  367. sub_query += """
  368. AND rp.partner_id = ml.partner_id
  369. """
  370. elif only_empty_partner_line:
  371. sub_query += """
  372. AND ml.partner_id IS NULL
  373. """
  374. if not positive_balance:
  375. sub_query += """
  376. LEFT JOIN
  377. account_partial_reconcile pr
  378. ON ml.balance < 0 AND pr.credit_move_id = ml.id
  379. LEFT JOIN
  380. account_move_line ml_future
  381. ON ml.balance < 0 AND pr.debit_move_id = ml_future.id
  382. AND ml_future.date > %s
  383. LEFT JOIN
  384. account_move_line ml_past
  385. ON ml.balance < 0 AND pr.debit_move_id = ml_past.id
  386. AND ml_past.date <= %s
  387. """
  388. else:
  389. sub_query += """
  390. LEFT JOIN
  391. account_partial_reconcile pr
  392. ON ml.balance > 0 AND pr.debit_move_id = ml.id
  393. LEFT JOIN
  394. account_move_line ml_future
  395. ON ml.balance > 0 AND pr.credit_move_id = ml_future.id
  396. AND ml_future.date > %s
  397. LEFT JOIN
  398. account_move_line ml_past
  399. ON ml.balance > 0 AND pr.credit_move_id = ml_past.id
  400. AND ml_past.date <= %s
  401. """
  402. sub_query += """
  403. WHERE
  404. ra.report_id = %s
  405. GROUP BY
  406. ml.id,
  407. ml.balance,
  408. ml.amount_currency
  409. HAVING
  410. (
  411. ml.full_reconcile_id IS NULL
  412. OR MAX(ml_future.id) IS NOT NULL
  413. )
  414. """
  415. return sub_query
  416. def _inject_line_values(self, only_empty_partner_line=False):
  417. """ Inject report values for report_open_items_qweb_move_line.
  418. The "only_empty_partner_line" value is used
  419. to compute data without partner.
  420. """
  421. query_inject_move_line = """
  422. WITH
  423. move_lines_amount AS
  424. (
  425. """
  426. query_inject_move_line += self._get_line_sub_query_move_lines(
  427. only_empty_partner_line=only_empty_partner_line,
  428. positive_balance=True
  429. )
  430. query_inject_move_line += """
  431. UNION
  432. """
  433. query_inject_move_line += self._get_line_sub_query_move_lines(
  434. only_empty_partner_line=only_empty_partner_line,
  435. positive_balance=False
  436. )
  437. query_inject_move_line += """
  438. ),
  439. move_lines AS
  440. (
  441. SELECT
  442. id,
  443. CASE
  444. WHEN SUM(partial_amount) > 0
  445. THEN
  446. CASE
  447. WHEN balance > 0
  448. THEN balance - SUM(partial_amount)
  449. ELSE balance + SUM(partial_amount)
  450. END
  451. ELSE balance
  452. END AS amount_residual,
  453. CASE
  454. WHEN SUM(partial_amount_currency) > 0
  455. THEN
  456. CASE
  457. WHEN amount_currency > 0
  458. THEN amount_currency - SUM(partial_amount_currency)
  459. ELSE amount_currency + SUM(partial_amount_currency)
  460. END
  461. ELSE amount_currency
  462. END AS amount_residual_currency,
  463. currency_id
  464. FROM
  465. move_lines_amount
  466. GROUP BY
  467. id,
  468. balance,
  469. amount_currency,
  470. currency_id
  471. )
  472. INSERT INTO
  473. report_open_items_qweb_move_line
  474. (
  475. report_partner_id,
  476. create_uid,
  477. create_date,
  478. move_line_id,
  479. date,
  480. date_due,
  481. entry,
  482. journal,
  483. account,
  484. partner,
  485. label,
  486. amount_total_due,
  487. amount_residual,
  488. currency_id,
  489. amount_total_due_currency,
  490. amount_residual_currency
  491. )
  492. SELECT
  493. rp.id AS report_partner_id,
  494. %s AS create_uid,
  495. NOW() AS create_date,
  496. ml.id AS move_line_id,
  497. ml.date,
  498. ml.date_maturity,
  499. m.name AS entry,
  500. j.code AS journal,
  501. a.code AS account,
  502. """
  503. if not only_empty_partner_line:
  504. query_inject_move_line += """
  505. CASE
  506. WHEN
  507. NULLIF(p.name, '') IS NOT NULL
  508. AND NULLIF(p.ref, '') IS NOT NULL
  509. THEN p.name || ' (' || p.ref || ')'
  510. ELSE p.name
  511. END AS partner,
  512. """
  513. elif only_empty_partner_line:
  514. query_inject_move_line += """
  515. '""" + _('No partner allocated') + """' AS partner,
  516. """
  517. query_inject_move_line += """
  518. CONCAT_WS(' - ', NULLIF(ml.ref, ''), NULLIF(ml.name, '')) AS label,
  519. ml.balance,
  520. ml2.amount_residual,
  521. c.id AS currency_id,
  522. ml.amount_currency,
  523. ml2.amount_residual_currency
  524. FROM
  525. report_open_items_qweb_partner rp
  526. INNER JOIN
  527. report_open_items_qweb_account ra ON rp.report_account_id = ra.id
  528. INNER JOIN
  529. account_move_line ml ON ra.account_id = ml.account_id
  530. INNER JOIN
  531. move_lines ml2
  532. ON ml.id = ml2.id
  533. AND ml2.amount_residual IS NOT NULL
  534. AND ml2.amount_residual != 0
  535. INNER JOIN
  536. account_move m ON ml.move_id = m.id
  537. INNER JOIN
  538. account_journal j ON ml.journal_id = j.id
  539. INNER JOIN
  540. account_account a ON ml.account_id = a.id
  541. """
  542. if not only_empty_partner_line:
  543. query_inject_move_line += """
  544. INNER JOIN
  545. res_partner p
  546. ON ml.partner_id = p.id AND rp.partner_id = p.id
  547. """
  548. query_inject_move_line += """
  549. LEFT JOIN
  550. account_full_reconcile fr ON ml.full_reconcile_id = fr.id
  551. LEFT JOIN
  552. res_currency c ON ml2.currency_id = c.id
  553. WHERE
  554. ra.report_id = %s
  555. AND
  556. ml.date <= %s
  557. """
  558. if self.only_posted_moves:
  559. query_inject_move_line += """
  560. AND
  561. m.state = 'posted'
  562. """
  563. if only_empty_partner_line:
  564. query_inject_move_line += """
  565. AND
  566. ml.partner_id IS NULL
  567. AND
  568. rp.partner_id IS NULL
  569. """
  570. if not only_empty_partner_line:
  571. query_inject_move_line += """
  572. ORDER BY
  573. a.code, p.name, ml.date, ml.id
  574. """
  575. elif only_empty_partner_line:
  576. query_inject_move_line += """
  577. ORDER BY
  578. a.code, ml.date, ml.id
  579. """
  580. self.env.cr.execute(
  581. query_inject_move_line,
  582. (self.date_at,
  583. self.date_at,
  584. self.id,
  585. self.date_at,
  586. self.date_at,
  587. self.id,
  588. self.env.uid,
  589. self.id,
  590. self.date_at,)
  591. )
  592. def _compute_partners_and_accounts_cumul(self):
  593. """ Compute cumulative amount for
  594. report_open_items_qweb_partner and report_open_items_qweb_account.
  595. """
  596. self._compute_partner_cumul()
  597. self._compute_account_cumul()
  598. def _compute_partner_cumul(self):
  599. where_condition_partner_by_account = """
  600. WHERE
  601. id IN
  602. (
  603. SELECT
  604. rp.id
  605. FROM
  606. report_open_items_qweb_account ra
  607. INNER JOIN
  608. report_open_items_qweb_partner rp
  609. ON ra.id = rp.report_account_id
  610. WHERE
  611. ra.report_id = %s
  612. )"""
  613. query_computer_partner_residual_cumul = """
  614. UPDATE
  615. report_open_items_qweb_partner
  616. SET
  617. final_amount_residual =
  618. (
  619. SELECT
  620. SUM(rml.amount_residual) AS final_amount_residual
  621. FROM
  622. report_open_items_qweb_move_line rml
  623. WHERE
  624. rml.report_partner_id = report_open_items_qweb_partner.id
  625. )
  626. """ + where_condition_partner_by_account
  627. params_compute_partners_residual_cumul = (self.id,)
  628. self.env.cr.execute(query_computer_partner_residual_cumul,
  629. params_compute_partners_residual_cumul)
  630. query_compute_partners_due_cumul = """
  631. UPDATE
  632. report_open_items_qweb_partner
  633. SET
  634. final_amount_total_due =
  635. (
  636. SELECT
  637. SUM(rml.amount_total_due) AS final_amount_total_due
  638. FROM
  639. report_open_items_qweb_move_line rml
  640. WHERE
  641. rml.report_partner_id = report_open_items_qweb_partner.id
  642. )
  643. """ + where_condition_partner_by_account
  644. params_compute_partner_due_cumul = (self.id,)
  645. self.env.cr.execute(query_compute_partners_due_cumul,
  646. params_compute_partner_due_cumul)
  647. # Manage currency in partner
  648. where_condition_partner_by_account_cur = """
  649. WHERE
  650. id IN
  651. (
  652. SELECT
  653. rp.id
  654. FROM
  655. report_open_items_qweb_account ra
  656. INNER JOIN
  657. report_open_items_qweb_partner rp
  658. ON ra.id = rp.report_account_id
  659. WHERE
  660. ra.report_id = %s AND ra.currency_id IS NOT NULL
  661. )
  662. """
  663. query_compute_partners_cur_id_cumul = """
  664. UPDATE
  665. report_open_items_qweb_partner
  666. SET
  667. currency_id =
  668. (
  669. SELECT
  670. MAX(currency_id) as currency_id
  671. FROM
  672. report_open_items_qweb_move_line rml
  673. WHERE
  674. rml.report_partner_id = report_open_items_qweb_partner.id
  675. )
  676. """ + where_condition_partner_by_account_cur
  677. params_compute_partners_cur_id_cumul = (self.id,)
  678. self.env.cr.execute(query_compute_partners_cur_id_cumul,
  679. params_compute_partners_cur_id_cumul)
  680. query_compute_partners_cur_residual_cumul = """
  681. UPDATE
  682. report_open_items_qweb_partner
  683. SET
  684. final_amount_residual_currency =
  685. (
  686. SELECT
  687. SUM(rml.amount_residual_currency)
  688. AS final_amount_residual_currency
  689. FROM
  690. report_open_items_qweb_move_line rml
  691. WHERE
  692. rml.report_partner_id = report_open_items_qweb_partner.id
  693. )
  694. """ + where_condition_partner_by_account_cur
  695. params_compute_partners_cur_residual_cumul = (self.id,)
  696. self.env.cr.execute(query_compute_partners_cur_residual_cumul,
  697. params_compute_partners_cur_residual_cumul)
  698. query_compute_partners_cur_due_cumul = """
  699. UPDATE
  700. report_open_items_qweb_partner
  701. SET
  702. final_amount_total_due_currency =
  703. (
  704. SELECT
  705. SUM(rml.amount_total_due_currency)
  706. AS final_amount_total_due_currency
  707. FROM
  708. report_open_items_qweb_move_line rml
  709. WHERE
  710. rml.report_partner_id = report_open_items_qweb_partner.id
  711. )
  712. """ + where_condition_partner_by_account_cur
  713. params_compute_partners_cur_due_cumul = (self.id,)
  714. self.env.cr.execute(query_compute_partners_cur_due_cumul,
  715. params_compute_partners_cur_due_cumul)
  716. def _compute_account_cumul(self):
  717. query_compute_accounts_residual_cumul = """
  718. UPDATE
  719. report_open_items_qweb_account
  720. SET
  721. final_amount_residual =
  722. (
  723. SELECT
  724. SUM(rp.final_amount_residual) AS final_amount_residual
  725. FROM
  726. report_open_items_qweb_partner rp
  727. WHERE
  728. rp.report_account_id = report_open_items_qweb_account.id
  729. )
  730. WHERE
  731. report_id = %s
  732. """
  733. params_compute_accounts_residual_cumul = (self.id,)
  734. self.env.cr.execute(query_compute_accounts_residual_cumul,
  735. params_compute_accounts_residual_cumul)
  736. query_compute_accounts_cur_residual_cumul = """
  737. UPDATE
  738. report_open_items_qweb_account
  739. SET
  740. final_amount_residual_currency =
  741. (
  742. SELECT
  743. SUM(rp.final_amount_residual_currency)
  744. AS final_amount_residual_currency
  745. FROM
  746. report_open_items_qweb_partner rp
  747. WHERE
  748. rp.report_account_id = report_open_items_qweb_account.id
  749. )
  750. WHERE
  751. report_id = %s
  752. """
  753. params_compute_accounts_cur_residual_cumul = (self.id,)
  754. self.env.cr.execute(query_compute_accounts_cur_residual_cumul,
  755. params_compute_accounts_cur_residual_cumul)
  756. query_compute_accounts_due_cumul = """
  757. UPDATE
  758. report_open_items_qweb_account
  759. SET
  760. final_amount_total_due =
  761. (
  762. SELECT
  763. SUM(rp.final_amount_total_due) AS final_amount_total_due
  764. FROM
  765. report_open_items_qweb_partner rp
  766. WHERE
  767. rp.report_account_id = report_open_items_qweb_account.id
  768. )
  769. WHERE
  770. report_id = %s
  771. """
  772. params_compute_accounts_due_cumul = (self.id,)
  773. self.env.cr.execute(query_compute_accounts_due_cumul,
  774. params_compute_accounts_due_cumul)
  775. query_compute_accounts_cur_due_cumul = """
  776. UPDATE
  777. report_open_items_qweb_account
  778. SET
  779. final_amount_total_due_currency =
  780. (
  781. SELECT
  782. SUM(rp.final_amount_total_due_currency)
  783. AS final_amount_total_due_currency
  784. FROM
  785. report_open_items_qweb_partner rp
  786. WHERE
  787. rp.report_account_id = report_open_items_qweb_account.id
  788. )
  789. WHERE
  790. report_id = %s
  791. """
  792. params_compute_accounts_cur_due_cumul = (self.id,)
  793. self.env.cr.execute(query_compute_accounts_cur_due_cumul,
  794. params_compute_accounts_cur_due_cumul)
  795. def _clean_partners_and_accounts(self,
  796. only_delete_account_balance_at_0=False):
  797. """ Delete empty data for
  798. report_open_items_qweb_partner and report_open_items_qweb_account.
  799. The "only_delete_account_balance_at_0" value is used
  800. to delete also the data with cumulative amounts at 0.
  801. """
  802. query_clean_partners = """
  803. DELETE FROM
  804. report_open_items_qweb_partner
  805. WHERE
  806. id IN
  807. (
  808. SELECT
  809. DISTINCT rp.id
  810. FROM
  811. report_open_items_qweb_account ra
  812. INNER JOIN
  813. report_open_items_qweb_partner rp
  814. ON ra.id = rp.report_account_id
  815. LEFT JOIN
  816. report_open_items_qweb_move_line rml
  817. ON rp.id = rml.report_partner_id
  818. WHERE
  819. ra.report_id = %s
  820. """
  821. if not only_delete_account_balance_at_0:
  822. query_clean_partners += """
  823. AND rml.id IS NULL
  824. """
  825. elif only_delete_account_balance_at_0:
  826. query_clean_partners += """
  827. AND (
  828. rp.final_amount_residual IS NULL
  829. OR rp.final_amount_residual = 0
  830. )
  831. """
  832. query_clean_partners += """
  833. )
  834. """
  835. params_clean_partners = (self.id,)
  836. self.env.cr.execute(query_clean_partners, params_clean_partners)
  837. query_clean_accounts = """
  838. DELETE FROM
  839. report_open_items_qweb_account
  840. WHERE
  841. id IN
  842. (
  843. SELECT
  844. DISTINCT ra.id
  845. FROM
  846. report_open_items_qweb_account ra
  847. LEFT JOIN
  848. report_open_items_qweb_partner rp
  849. ON ra.id = rp.report_account_id
  850. WHERE
  851. ra.report_id = %s
  852. """
  853. if not only_delete_account_balance_at_0:
  854. query_clean_accounts += """
  855. AND rp.id IS NULL
  856. """
  857. elif only_delete_account_balance_at_0:
  858. query_clean_accounts += """
  859. AND (
  860. ra.final_amount_residual IS NULL
  861. OR ra.final_amount_residual = 0
  862. )
  863. """
  864. query_clean_accounts += """
  865. )
  866. """
  867. params_clean_accounts = (self.id,)
  868. self.env.cr.execute(query_clean_accounts, params_clean_accounts)