from odoo import fields, http, _ from odoo.http import request import werkzeug from odoo.tools import format_datetime, format_date, is_html_empty from odoo.exceptions import UserError,AccessError, MissingError,Warning from odoo.addons.website_event.controllers.main import WebsiteEventController from odoo.addons.auth_signup.controllers.main import AuthSignupHome from odoo.addons.sale.controllers.portal import CustomerPortal from odoo.addons.portal.controllers.portal import pager as portal_pager, get_records_pager import json import binascii from odoo.addons.payment.controllers.portal import PaymentProcessing from odoo.addons.portal.controllers.mail import _message_post_helper from odoo.osv import expression class booking(WebsiteEventController,AuthSignupHome): @http.route(['/booking/registration/options'], type='http', auth='user', website=True, sitemap=False,csrf=False) def bookingregistration_options(self,event_id,*args,**kw): data={} #contact lié à l'utilisateur userid=request.env.context.get('uid') user=request.env['res.users'].search([('id','=',int(userid))]) partner=request.env['res.partner'].sudo().search([('id','=',int(user.partner_id))]) request.session['partner_id']=int(partner.id) #si le pays n'est pas renseigné, on le renseigne avec France #c'est indispensable pour pouvoir régléer le devis if not partner.country_id: country=request.env['res.country'].search([('name','=','France')]) partner.country_id=country.id data['partner']=partner #évenement request.session['event_id']=int(event_id) event=request.env['event.event'].sudo().search([('id','=',int(event_id))]) data['event']=event #status # category_ids=partner.category_id # data['status']='standard' # if category_ids: # for c in category_ids: # category=request.env['event.partner_category'].sudo().search([('partner_category_id','=',c.id)]) # #category=request.env['res.partner.category'].search([('id','=',c.id)]) # if category:data['status']=category.status data['status']=partner.member_status if data['status']=='not member':data['status']='standard' #prix data['price']='' if data['status']=='standard':data['price']=event.booking_price if data['status']=='member':data['price']=event.booking_member_price if data['status']=='super member':data['price']=event.booking_super_member_price #membership product membership_product=request.env['event.membership_product'].sudo().search([]) if not membership_product: raise Warning('no membership product find') data['membership_product']=membership_product #options data['options']=[] for opt in event.booking_option_ids: if opt.booking_option_id==membership_product.membership_product_id: if data['status']!='member' and data['status']!='super member':data['options'].append(opt) else:data['options'].append(opt) #data['options']=event.booking_option_ids #questions data['questions']=event.question_ids return http.request.render('booking.registration_options_form',data) @http.route(['/booking/registration/questionnaire'], type='http', auth='user', website=True, sitemap=False,csrf=False) def bookingregistration_questionnaire(self,**post): vals={} data={} vals['event_id']=post.get('event_id') vals['name']=post.get('name') vals['phone']=post.get('phone') vals['email']=post.get('email') vals['firstname']=post.get('firstname') vals['age']=post.get('age') vals['gender']=post.get('gender') vals['mobile']=post.get('mobile') request.session['registrant'] = vals request.session['down_payment'] =False if post.get('down_payment')=="false":request.session['down_payment'] = False if post.get('down_payment')=="true":request.session['down_payment'] = True #options if post.get('nb_o')!="0": vals3={} i=1 k=1 while i <= int(post.get('nb_o')): if post.get('o['+str(i)+']'): vals3[k]=post.get('o['+str(i)+']') k=k+1 i=i+1 request.session['options']=vals3 request.session['nb_o']=k-1 else: request.session['options']=None request.session['nb_o']=0 #questions event=request.env['event.event'].sudo().search([('id','=',int(post.get('event_id')))]) data['event']=event data['questions']=False if event.question_ids: data['questions']=event.question_ids #return vals3 return http.request.render('booking.registration_questionnaire_form',data) @http.route(['/booking/payment_choice'], type='http',auth='user', website=True, sitemap=False,csrf=False) def bookinginvoice(self,**post): vals={} vals['event_id']=request.session['event_id'] vals['partner_id']=request.session['partner_id'] vals['name']=request.session['registrant']['name'] vals['phone']=request.session['registrant']['phone'] vals['email']=request.session['registrant']['email'] vals['firstname']=request.session['registrant']['firstname'] vals['age']=request.session['registrant']['age'] vals['gender']=request.session['registrant']['gender'] vals['mobile']=request.session['registrant']['mobile'] vals['medical_concern']=post.get('medical_concern') vals['medical_information']=post.get('medical_information') vals['medical_contact_name']=post.get('medical_contact_name') vals['medical_contact_phone']=post.get('medical_contact_phone') vals['down_payment']=request.session['down_payment'] vals['state']='draft' res=request.env['event.registration'].sudo().create(vals) vals2={} #questionnaire' i=1 vals2['event_registration_id']=res.id #suppression du questionnaire de la personne inscrite request.env['event.registration_questionnaire'].sudo().search([('event_registration_id','=',int(res.id))]).unlink() if post.get('nb_q')!="0": while i < int(post.get('nb_q')): vals2['sequence']=i vals2['question']=post.get('q['+str(i)+']') vals2['answer']=post.get('a['+str(i)+']') #ajout du questionnaire avec les réponses res2=request.env['event.registration_questionnaire'].sudo().create(vals2) res.write({'questionnaire_ids':[(4,res2.id)]}) i=i+1 #options if request.session['nb_o']!=0 : vals3={} i=1 #suppression des options de la personne inscrite request.env['event.registration_option'].sudo().search([('event_registration_id','=',int(res.id))]).unlink() while i <= int(request.session['nb_o']): vals3['booking_option_id']=request.session['options'][i] vals3['event_registration_id']=res.id #ajout des options res3=request.env['event.registration_option'].sudo().create(vals3) res.write({'option_ids':[(4,res3.id)]}) i=i+1 #création du devis order_id=request.env['event.registration'].sudo().action_event_registration_generate_order(res.id) order=request.env['sale.order'].sudo().search([("id","=",int(order_id))]) data={} data['submit_txt']='Pay now' data['success_url']='/booking/payment/success' data['error_url']='/booking/payment/error' data['acquirers'] = list(request.env['payment.acquirer'].search([ ('state', 'in', ['enabled', 'test']), ('company_id', '=', request.env.company.id) ])) userid=request.env.context.get('uid') user=request.env['res.users'].search([('id','=',int(userid))]) partner=request.env['res.partner'].sudo().search([('id','=',int(user.partner_id))]) request.session['partner_id']=int(partner.id) payment_tokens = partner.payment_token_ids payment_tokens |= partner.commercial_partner_id.sudo().payment_token_ids data['payment_tokens']=payment_tokens data['order_id']=order_id return http.request.render('booking.payment_choice_form',data) #return http.request.redirect(order.access_url) @http.route(['/booking/payment/transaction/', '/booking/payment/transaction/', '/booking/payment/transaction//'], type='json', auth="public", website=True) def booking_payment_transaction(self, acquirer_id,order_id, save_token=False, so_id=None, access_token=None, token=None, **kwargs): """ Json method that creates a payment.transaction, used to create a transaction when the user clicks on 'pay now' button. After having created the transaction, the event continues and the user is redirected to the acquirer website. :param int acquirer_id: id of a payment.acquirer record. If not set the user is redirected to the checkout page """ # Ensure a payment acquirer is selected if not acquirer_id: return False try: acquirer_id = int(acquirer_id) except: return False order_id=order_id order=request.env['sale.order'].search([('id','=',int(order_id))], limit=1) # Ensure there is something to proceed if not order or (order and not order.order_line): return False assert order.partner_id.id != request.website.partner_id.id # Create transaction vals = {'acquirer_id': acquirer_id, 'return_url': '/booking/payment/validate'} if save_token: vals['type'] = 'form_save' if token: vals['payment_token_id'] = int(token) transaction = order._create_payment_transaction(vals) # store the new transaction into the transaction list and if there's an old one, we remove it # until the day the ecommerce supports multiple orders at the same time last_tx_id = request.session.get('__website_sale_last_tx_id') last_tx = request.env['payment.transaction'].browse(last_tx_id).sudo().exists() if last_tx: PaymentProcessing.remove_payment_transaction(last_tx) PaymentProcessing.add_payment_transaction(transaction) request.session['__website_sale_last_tx_id'] = transaction.id request.session['order_id']=order.id return transaction.render_sale_button(order) http.route('/booking/payment/token', type='http', auth='public', website=True, sitemap=False) def booking_payment_token(self, pm_id=None, **kwargs): """ Method that handles payment using saved tokens :param int pm_id: id of the payment.token that we want to use to pay. """ try: pm_id = int(pm_id) except ValueError: return request.redirect('/shop/?error=invalid_token_id') # We retrieve the token the user want to use to pay if not request.env['payment.token'].sudo().search_count([('id', '=', pm_id)]): return request.redirect('/shop/?error=token_not_found') # Create transaction vals = {'payment_token_id': pm_id, 'return_url': '/booking/payment/validate'} tx = order._create_payment_transaction(vals) request.session['transaction_id']=tx.id PaymentProcessing.add_payment_transaction(tx) return request.redirect('booking/payment/process') @http.route(['/booking/payment/process'], type="http", auth="public", website=True, sitemap=False) def booking_payment_status_page(self, **kwargs): # When the customer is redirect to this website page, # we retrieve the payment transaction list from his session tx_ids_list = self.get_payment_transaction_ids() payment_transaction_ids = request.env['payment.transaction'].sudo().browse(tx_ids_list).exists() render_ctx = { 'payment_tx_ids': payment_transaction_ids.ids, } return request.render("payment.payment_process_page", render_ctx) @http.route('/booking/payment/validate', type='http', auth="public", website=True, sitemap=False) def booking_payment_validate(self, transaction_id=None, sale_order_id=None, **post): """ Method that should be called by the server when receiving an update for a transaction. State at this point : - UDPATE ME """ order_id=int(request.session['order_id']) order=request.env['sale.order'].search([('id','=',order_id)]) order.state='sale' request.session['order_id']=None transaction_id=int(request.session['__website_sale_last_tx_id'] ) tx = request.env['payment.transaction'].sudo().browse(transaction_id) PaymentProcessing.remove_payment_transaction(tx) return request.redirect('/booking/payment/confirmation') @http.route(['/booking/payment/confirmation'], type='http', auth="public", website=True, sitemap=False) def booking_payment_confirmation(self, **post): return request.render("booking.thankyou") # class CustomerPortal(CustomerPortal): # #affichage de la page de paiement # @http.route(['/my/quotes', '/my/quotes/page/'], type='http', auth="user", website=True) # def portal_my_quotes(self, page=1, date_begin=None, date_end=None, sortby=None, **kw): # values = self._prepare_portal_layout_values() # partner = request.env.user.partner_id # SaleOrder = request.env['sale.order'] # #return str(len(SaleOrder)) # domain = [('partner_id','=',int(partner.id)),('state','in',('draft','sent'))] # searchbar_sortings = { # 'date': {'label': _('Order Date'), 'order': 'date_order desc'}, # 'name': {'label': _('Reference'), 'order': 'name'}, # 'stage': {'label': _('Stage'), 'order': 'state'}, # } # # default sortby order # if not sortby: # sortby = 'date' # sort_order = searchbar_sortings[sortby]['order'] # if date_begin and date_end: # domain += [('create_date', '>', date_begin), ('create_date', '<=', date_end)] # # count for pager # quotation_count = SaleOrder.search_count(domain) # # make pager # pager = portal_pager( # url="/my/quotes", # url_args={'date_begin': date_begin, 'date_end': date_end, 'sortby': sortby}, # total=quotation_count, # page=page, # step=self._items_per_page # ) # # search the count to display, according to the pager data # quotations = SaleOrder.search(domain, order=sort_order, limit=self._items_per_page, offset=pager['offset']) # request.session['my_quotations_history'] = quotations.ids[:100] # values.update({ # 'date': date_begin, # 'quotations': quotations.sudo(), # 'page_name': 'quote', # 'pager': pager, # 'default_url': '/my/quotes', # 'searchbar_sortings': searchbar_sortings, # 'sortby': sortby, # }) # return request.render("sale.portal_my_quotations", values)