from odoo import fields, http, _ from odoo.http import request import werkzeug from odoo.tools import format_datetime, format_date, is_html_empty from datetime import datetime,timedelta from dateutil.relativedelta import relativedelta 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 data['status']=partner.member_status if data['status']=='not member':data['status']='non adhérent' if data['status']=='member':data['status']='adhérent' if data['status']=='super member':data['status']='adhérent de soutien' #prix data['price']='' if partner.member_status=='not member':data['price']=event.booking_price if partner.member_status=='member':data['price']=event.booking_member_price if partner.member_status=='super member':data['price']=event.booking_super_member_price #membership product #membership_product=request.env['event.membership_product'].sudo().search([]) membership_product=request.env['product.product'].sudo().search([('membership_product','=',True)],limit=1) 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: if partner.member_status!='member' and partner.member_status!='super member':data['options'].append(opt) else: data['options'].append(opt) #questions data['questions']=event.question_ids request.session['invoice_id']=False return http.request.render('kalachakra.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={} #gestion du retour page précédente depuis page de paiement : on supprime les éléments générés ( don , adhésion) if not post.get('nb_o'): if request.session['invoice_id']: invoice=request.env['account.move'].sudo().search([("id","=",int(request.session['invoice_id']))]) invoice.state='draft' invoice.unlink() return request.redirect('/booking/registration/options?event_id='+str(request.session['event_id'])) vals['event_id']=post.get('event_id') vals['name']=post.get('name') vals['phone']=post.get('phone') vals['city']=post.get('city') 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('kalachakra.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['city']=request.session['registrant']['city'] 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['image_permission']=post.get('image_permission') vals['down_payment']=request.session['down_payment'] vals['state']='draft' res=request.env['event.registration'].sudo().create(vals) request.session['res_id']=res.id 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 #suppression des options de la personne inscrite request.env['event.registration_option'].sudo().search([('event_registration_id','=',int(res.id))]).unlink() if request.session['nb_o']!=0 : vals3={} i=1 while i <= int(request.session['nb_o']): vals3['booking_option_id']=int(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 invoice=request.env['event.registration'].sudo().action_event_registration_generate_invoice(request.session['res_id'],False,False) request.session['invoice_id']=invoice.id #ajout de l'adhésion membership_product=request.env['product.product'].sudo().search([('membership_product','=',True)],limit=1) if not membership_product: raise UserError(_('No membership product, please add one')) vals={} vals['invoice_id']=int(invoice.id) vals['partner_id']=int(res.partner_id) vals['product_id']=int(membership_product.id) vals['start_date']=datetime.now() vals['end_date']=datetime.now()+relativedelta(years=1) vals['amount']=membership_product.list_price membership=request.env['kalachakra.membership'].sudo().create(vals) #redirection sur la page de paiement de la facture : url="/my/invoices/"+str(invoice.id)#+"?access_token="+str(invoice.access_token) return request.redirect(url) # #création du devis pour la transaction # 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('kalachakra.booking_payment_choice_form',data) @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.sudo()._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): #suppression du devis et création de la facture au statut payé order_id=int(request.session['order_id']) #request.env['sale.order'].search([('id','=',order_id)]).unlink() invoice=request.env['event.registration'].sudo().action_event_registration_generate_invoice(request.session['res_id'],'electronic') invoice.action_post() 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("kalachakra.booking_thankyou")