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.

299 lines
9.9 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 _
  6. from odoo.exceptions import AccessError, MissingError
  7. from odoo.fields import Date
  8. from odoo.http import request, route
  9. from odoo.addons.payment.controllers.portal import PaymentProcessing
  10. from odoo.addons.portal.controllers.portal import (
  11. CustomerPortal,
  12. pager as portal_pager,
  13. )
  14. class CooperatorPortalAccount(CustomerPortal):
  15. CustomerPortal.MANDATORY_BILLING_FIELDS.extend(
  16. ["iban", "birthdate_date", "gender", "lang"]
  17. )
  18. def _prepare_portal_layout_values(self):
  19. values = super(
  20. CooperatorPortalAccount, self
  21. )._prepare_portal_layout_values()
  22. # We assume that commercial_partner_id always point to the
  23. # partner itself or to the linked partner. So there is no
  24. # need to check if the partner is a "contact" or not.
  25. partner = request.env.user.partner_id
  26. coop = partner.commercial_partner_id
  27. partner_obj = request.env["res.partner"]
  28. coop_bank = (
  29. request.env["res.partner.bank"]
  30. .sudo()
  31. .search([("partner_id", "in", [coop.id])], limit=1)
  32. )
  33. invoice_mgr = request.env["account.invoice"]
  34. capital_request_count = invoice_mgr.search_count(
  35. [
  36. ("state", "in", ["open", "paid", "cancelled"]),
  37. # Get only the release capital request
  38. ("release_capital_request", "=", True),
  39. ]
  40. )
  41. invoice_count = invoice_mgr.search_count(
  42. [("release_capital_request", "=", False)]
  43. )
  44. iban = ""
  45. if partner.bank_ids:
  46. iban = partner.bank_ids[0].acc_number
  47. fields_desc = partner_obj.sudo().fields_get(["gender"])
  48. values.update(
  49. {
  50. "coop": coop,
  51. "coop_bank": coop_bank,
  52. "capital_request_count": capital_request_count,
  53. "invoice_count": invoice_count,
  54. "iban": iban,
  55. "genders": fields_desc["gender"]["selection"],
  56. "langs": request.env["res.lang"].search([])
  57. }
  58. )
  59. return values
  60. def details_form_validate(self, data):
  61. error, error_message = super(
  62. CooperatorPortalAccount, self
  63. ).details_form_validate(data)
  64. sub_req_obj = request.env["subscription.request"]
  65. iban = data.get("iban")
  66. valid = sub_req_obj.check_iban(iban)
  67. if not valid:
  68. error["iban"] = "error"
  69. error_message.append(_("You iban account number is not valid"))
  70. return error, error_message
  71. @route(["/my/account"], type="http", auth="user", website=True)
  72. def account(self, redirect=None, **post):
  73. partner = request.env.user.partner_id
  74. res = super(CooperatorPortalAccount, self).account(redirect, **post)
  75. if not res.qcontext.get("error"):
  76. partner_bank = request.env["res.partner.bank"]
  77. iban = post.get("iban")
  78. if iban:
  79. if partner.bank_ids:
  80. bank_account = partner.bank_ids[0]
  81. bank_account.acc_number = iban
  82. else:
  83. partner_bank.sudo().create(
  84. {"partner_id": partner.id, "acc_number": iban}
  85. )
  86. return res
  87. @route(
  88. ["/my/invoices", "/my/invoices/page/<int:page>"],
  89. type="http",
  90. auth="user",
  91. website=True,
  92. )
  93. def portal_my_invoices(
  94. self, page=1, date_begin=None, date_end=None, sortby=None, **kw
  95. ):
  96. res = super(CooperatorPortalAccount, self).portal_my_invoices(
  97. page, date_begin, date_end, sortby, **kw
  98. )
  99. invoice_obj = request.env["account.invoice"]
  100. qcontext = res.qcontext
  101. if qcontext:
  102. invoices = invoice_obj.search(
  103. [("release_capital_request", "=", False)]
  104. )
  105. invoice_count = len(invoices)
  106. qcontext["invoices"] = invoices
  107. qcontext["pager"]["invoice_count"] = invoice_count
  108. return res
  109. @route(
  110. [
  111. "/my/release_capital_request",
  112. "/my/release_capital_request/page/<int:page>",
  113. ],
  114. type="http",
  115. auth="user",
  116. website=True,
  117. )
  118. def portal_my_release_capital_request(
  119. self, page=1, date_begin=None, date_end=None, sortby=None, **kw
  120. ):
  121. """Render a page with the list of release capital request.
  122. A release capital request is an invoice with a flag that tell
  123. if it's a capital request or not.
  124. """
  125. values = self._prepare_portal_layout_values()
  126. partner = request.env.user.partner_id
  127. invoice_mgr = request.env["account.invoice"]
  128. domain = [
  129. ("partner_id", "in", [partner.commercial_partner_id.id]),
  130. ("state", "in", ["open", "paid", "cancelled"]),
  131. # Get only the release capital request
  132. ("release_capital_request", "=", True),
  133. ]
  134. archive_groups = self._get_archive_groups_sudo(
  135. "account.invoice", domain
  136. )
  137. if date_begin and date_end:
  138. domain += [
  139. ("create_date", ">=", date_begin),
  140. ("create_date", "<", date_end),
  141. ]
  142. # count for pager
  143. capital_request_count = invoice_mgr.sudo().search_count(domain)
  144. # pager
  145. pager = portal_pager(
  146. url="/my/release_capital_request",
  147. url_args={
  148. "date_begin": date_begin,
  149. "date_end": date_end,
  150. "sortby": sortby,
  151. },
  152. total=capital_request_count,
  153. page=page,
  154. step=self._items_per_page,
  155. )
  156. # content according to pager and archive selected
  157. invoices = invoice_mgr.sudo().search(
  158. domain, limit=self._items_per_page, offset=pager["offset"]
  159. )
  160. values.update(
  161. {
  162. "date": date_begin,
  163. "capital_requests": invoices,
  164. "page_name": "Release request",
  165. "pager": pager,
  166. "archive_groups": archive_groups,
  167. "default_url": "/my/release_capital_request",
  168. }
  169. )
  170. return request.render(
  171. "easy_my_coop_website_portal.portal_my_capital_releases", values
  172. )
  173. @route(
  174. ["/my/invoices/<int:invoice_id>"],
  175. type="http",
  176. auth="public",
  177. website=True,
  178. )
  179. # fmt: off
  180. def portal_my_invoice_detail(
  181. self,
  182. invoice_id,
  183. access_token=None,
  184. report_type=None,
  185. download=False,
  186. **kw
  187. ):
  188. # fmt: on
  189. # override in order to not retrieve release capital request as invoices
  190. try:
  191. invoice_sudo = self._document_check_access(
  192. "account.invoice", invoice_id, access_token
  193. )
  194. except (AccessError, MissingError):
  195. return request.redirect("/my")
  196. if invoice_sudo.release_capital_request:
  197. report_ref = "easy_my_coop.action_cooperator_invoices"
  198. else:
  199. report_ref = "account.account_invoices"
  200. if report_type in ("html", "pdf", "text"):
  201. return self._show_report(
  202. model=invoice_sudo,
  203. report_type=report_type,
  204. report_ref=report_ref,
  205. download=download,
  206. )
  207. values = self._invoice_get_page_view_values(
  208. invoice_sudo, access_token, **kw
  209. )
  210. PaymentProcessing.remove_payment_transaction(
  211. invoice_sudo.transaction_ids
  212. )
  213. return request.render("account.portal_invoice_page", values)
  214. @route(
  215. ["/my/cooperator_certificate/pdf"],
  216. type="http",
  217. auth="user",
  218. website=True,
  219. )
  220. def get_cooperator_certificat(self, **kw):
  221. """Render the cooperator certificate pdf of the current user"""
  222. partner = request.env.user.partner_id
  223. return self._show_report(
  224. model=partner,
  225. report_type="pdf",
  226. report_ref="easy_my_coop.action_cooperator_report_certificat",
  227. download=True,
  228. )
  229. def _render_pdf(self, pdf, filename):
  230. """Render a http response for a pdf"""
  231. pdfhttpheaders = [
  232. ("Content-Disposition", 'inline; filename="%s.pdf"' % filename),
  233. ("Content-Type", "application/pdf"),
  234. ("Content-Length", len(pdf)),
  235. ]
  236. return request.make_response(pdf, headers=pdfhttpheaders)
  237. def _get_archive_groups_sudo(
  238. self,
  239. model,
  240. domain=None,
  241. fields=None,
  242. groupby="create_date",
  243. order="create_date desc",
  244. ):
  245. """Same as the one from website_portal_v10 except that it runs
  246. in root.
  247. """
  248. if not model:
  249. return []
  250. if domain is None:
  251. domain = []
  252. if fields is None:
  253. fields = ["name", "create_date"]
  254. groups = []
  255. for group in (
  256. request.env[model]
  257. .sudo()
  258. .read_group(domain, fields=fields, groupby=groupby, orderby=order)
  259. ):
  260. label = group[groupby]
  261. date_begin = date_end = None
  262. for leaf in group["__domain"]:
  263. if leaf[0] == groupby:
  264. if leaf[1] == ">=":
  265. date_begin = leaf[2]
  266. elif leaf[1] == "<":
  267. date_end = leaf[2]
  268. groups.append(
  269. {
  270. "date_begin": Date.to_string(Date.from_string(date_begin)),
  271. "date_end": Date.to_string(Date.from_string(date_end)),
  272. "name": label,
  273. "item_count": group[groupby + "_count"],
  274. }
  275. )
  276. return groups