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.

197 lines
8.2 KiB

  1. # Copyright 2016 Jairo Llopis <jairo.llopis@tecnativa.com>
  2. # Copyright 2017-2018 Rémy Taymans <remy@coopiteasy.be>
  3. # Copyright 2019 Houssine Bakkali <houssine@coopiteasy.be>
  4. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
  5. from odoo import http
  6. from odoo.exceptions import AccessError, MissingError
  7. from odoo.fields import Date
  8. from odoo.http import request
  9. from odoo.addons.portal.controllers.portal import CustomerPortal
  10. from odoo.addons.portal.controllers.portal import pager as portal_pager
  11. from odoo.addons.payment.controllers.portal import PaymentProcessing
  12. class CooperatorPortalAccount(CustomerPortal):
  13. def _prepare_portal_layout_values(self):
  14. values = super(CooperatorPortalAccount,
  15. self)._prepare_portal_layout_values()
  16. # We assume that commercial_partner_id always point to the
  17. # partner itself or to the linked partner. So there is no
  18. # need to check if the partner is a "contact" or not.
  19. partner = request.env.user.partner_id
  20. coop = partner.commercial_partner_id
  21. coop_bank = request.env['res.partner.bank'].sudo().search(
  22. [('partner_id', 'in', [coop.id])],
  23. limit=1
  24. )
  25. invoice_mgr = request.env['account.invoice']
  26. capital_request_count = invoice_mgr.search_count([
  27. # ('partner_id', 'in', [partner.commercial_partner_id.id]),
  28. ('state', 'in', ['open', 'paid', 'cancelled']),
  29. # Get only the release capital request
  30. ('release_capital_request', '=', True),
  31. ])
  32. invoice_count = invoice_mgr.search_count([
  33. # ('partner_id', 'in', [partner.commercial_partner_id.id]),
  34. ('release_capital_request', '=', False)
  35. ])
  36. values.update({
  37. 'coop': coop,
  38. 'coop_bank': coop_bank,
  39. 'capital_request_count': capital_request_count,
  40. 'invoice_count': invoice_count
  41. })
  42. return values
  43. @http.route(['/my/invoices', '/my/invoices/page/<int:page>'], type='http',
  44. auth="user", website=True)
  45. def portal_my_invoices(self, page=1, date_begin=None, date_end=None,
  46. sortby=None, **kw):
  47. res = super(CooperatorPortalAccount, self).portal_my_invoices(
  48. page, date_begin, date_end, sortby, **kw)
  49. invoice_obj = request.env['account.invoice']
  50. qcontext = res.qcontext
  51. if qcontext:
  52. invoices = invoice_obj.search([('release_capital_request', '=', False)])
  53. invoice_count = len(invoices)
  54. qcontext['invoices'] = invoices
  55. qcontext['pager']['invoice_count'] = invoice_count
  56. return res
  57. @http.route(
  58. ['/my/release_capital_request',
  59. '/my/release_capital_request/page/<int:page>'],
  60. type='http', auth="user", website=True)
  61. def portal_my_release_capital_request(self, page=1, date_begin=None,
  62. date_end=None, sortby=None, **kw):
  63. """Render a page with the list of release capital request.
  64. A release capital request is an invoice with a flag that tell
  65. if it's a capital request or not.
  66. """
  67. values = self._prepare_portal_layout_values()
  68. partner = request.env.user.partner_id
  69. invoice_mgr = request.env['account.invoice']
  70. domain = [
  71. ('partner_id', 'in',
  72. [partner.commercial_partner_id.id]),
  73. ('state', 'in', ['open', 'paid', 'cancelled']),
  74. # Get only the release capital request
  75. ('release_capital_request', '=', True),
  76. ]
  77. archive_groups = self._get_archive_groups_sudo('account.invoice',
  78. domain)
  79. if date_begin and date_end:
  80. domain += [('create_date', '>=', date_begin),
  81. ('create_date', '<', date_end)]
  82. # count for pager
  83. capital_request_count = invoice_mgr.sudo().search_count(domain)
  84. # pager
  85. pager = portal_pager(
  86. url="/my/release_capital_request",
  87. url_args={'date_begin': date_begin, 'date_end': date_end,
  88. 'sortby': sortby},
  89. total=capital_request_count,
  90. page=page,
  91. step=self._items_per_page
  92. )
  93. # content according to pager and archive selected
  94. invoices = invoice_mgr.sudo().search(
  95. domain, limit=self._items_per_page, offset=pager['offset'])
  96. values.update({
  97. 'date': date_begin,
  98. 'capital_requests': invoices,
  99. 'page_name': 'Release request',
  100. 'pager': pager,
  101. 'archive_groups': archive_groups,
  102. 'default_url': '/my/release_capital_request',
  103. })
  104. return request.render(
  105. "easy_my_coop_website_portal.portal_my_capital_releases",
  106. values
  107. )
  108. @http.route(['/my/invoices/<int:invoice_id>'],
  109. type='http', auth="public", website=True)
  110. def portal_my_invoice_detail(self, invoice_id, access_token=None,
  111. report_type=None, download=False, **kw):
  112. try:
  113. invoice_sudo = self._document_check_access('account.invoice',
  114. invoice_id,
  115. access_token)
  116. except (AccessError, MissingError):
  117. return request.redirect('/my')
  118. if invoice_sudo.release_capital_request:
  119. report_ref = 'easy_my_coop.action_cooperator_invoices'
  120. else:
  121. report_ref = 'account.account_invoices'
  122. if report_type in ('html', 'pdf', 'text'):
  123. return self._show_report(model=invoice_sudo,
  124. report_type=report_type,
  125. report_ref=report_ref,
  126. download=download)
  127. values = self._invoice_get_page_view_values(invoice_sudo, access_token,
  128. **kw)
  129. PaymentProcessing.remove_payment_transaction(invoice_sudo.transaction_ids)
  130. return request.render("account.portal_invoice_page", values)
  131. @http.route(['/my/cooperator_certificate/pdf'],
  132. type='http', auth="user", website=True)
  133. def get_cooperator_certificat(self, **kw):
  134. """Render the cooperator certificate pdf of the current user"""
  135. partner = request.env.user.partner_id
  136. report_mgr = request.env['report']
  137. pdf = report_mgr.sudo().get_pdf(
  138. partner,
  139. 'easy_my_coop.cooperator_certificat_G001'
  140. )
  141. filename = "Cooperator Certificate - %s" % partner.name
  142. return self._render_pdf(pdf, filename)
  143. def _render_pdf(self, pdf, filename):
  144. """Render a http response for a pdf"""
  145. pdfhttpheaders = [
  146. ('Content-Disposition', 'inline; filename="%s.pdf"' % filename),
  147. ('Content-Type', 'application/pdf'),
  148. ('Content-Length', len(pdf))
  149. ]
  150. return request.make_response(pdf, headers=pdfhttpheaders)
  151. def _get_archive_groups_sudo(self, model, domain=None, fields=None,
  152. groupby="create_date",
  153. order="create_date desc"):
  154. """Same as the one from website_portal_v10 except that it runs
  155. in root.
  156. """
  157. if not model:
  158. return []
  159. if domain is None:
  160. domain = []
  161. if fields is None:
  162. fields = ['name', 'create_date']
  163. groups = []
  164. for group in request.env[model].sudo().read_group(
  165. domain, fields=fields, groupby=groupby, orderby=order):
  166. label = group[groupby]
  167. date_begin = date_end = None
  168. for leaf in group["__domain"]:
  169. if leaf[0] == groupby:
  170. if leaf[1] == ">=":
  171. date_begin = leaf[2]
  172. elif leaf[1] == "<":
  173. date_end = leaf[2]
  174. groups.append({
  175. 'date_begin': Date.to_string(Date.from_string(date_begin)),
  176. 'date_end': Date.to_string(Date.from_string(date_end)),
  177. 'name': label,
  178. 'item_count': group[groupby + '_count']
  179. })
  180. return groups