from odoo import models, fields, api from odoo.exceptions import UserError, ValidationError, Warning from psycopg2 import sql, DatabaseError from dateutil.relativedelta import relativedelta from datetime import datetime from werkzeug import utils import json class EventRegistration(models.Model): _inherit = 'event.registration' online=fields.Boolean(string='Online participation') onthespot_payment=fields.Boolean(string='On the spot payment') free_participation=fields.Boolean(related='event_id.free_participation') with_membership=fields.Boolean('with membership') def create(self,vals): reg = super(EventRegistration, self).create(vals) if reg.event_id.booking_event: if reg._check_auto_confirmation(): reg.sudo().action_confirm() #ajout du questionnaire pour la personne inscrite questions=self.env['event.question'].search([('event_id','=',int(reg.event_id))]) if questions: for question in questions: vals={} vals['sequence']=question.sequence vals['question']=question.question vals['event_registration_id']=reg.id res=self.env['event.registration_questionnaire'].create(vals) #ajout des options pour la personne inscrite options=self.env['booking.option'].search([('event_id','=',int(reg.event_id))]) if options: for option in options: vals={} vals['booking_option_id']=int(option.booking_option_id) vals['booking_option_price']=option.booking_option_price vals['event_registration_id']=int(reg.id) res=self.env['event.registration_option'].create(vals) else: #inscription à la newsletter attachée à l'événement #si pas une retraite et présence d'une newletter rattaché à l'événement if reg.event_id.recurring_event_newsletter_id: mailing_contact=self.env['mailing.contact'].sudo().search([('email','=',reg.partner_id.email)],limit=1) #si le contact n'existe pas comme mailing contact, création if not mailing_contact: vals={} vals['email']=reg.partner_id.email vals['name']=reg.partner_id.name vals['title_id']=int(reg.partner_id.title) vals['country_id']=int(reg.partner_id.country_id) vals['list_ids']=[(4,int(reg.event_id.recurring_event_newsletter_id))] mailing_contact=self.env['mailing.contact'].sudo().create(vals) else: #si le contact existe, si la liste de diffusion n'est pas lié au contact, on l'ajoute if not reg.event_id.recurring_event_newsletter_id in mailing_contact.list_ids: mailing_contact.sudo().write({'list_ids':[(4,int(reg.event_id.recurring_event_newsletter_id))]}) #inscription à la newsletter générale mailing_list=self.env['mailing.list'].sudo().search([('name','=','Newsletter '+self.env.company.name)]) if mailing_list: if not mailing_list in mailing_contact.list_ids: mailing_contact.sudo().write({'list_ids':[(4,int(mailing_list.id))]}) return reg def action_generate_participation_invoice(self,id_registration=None,payment_mode=None,membership=False): if not id_registration:id_registration=int(self.id) reg=self.env['event.registration'].search([('id','=',id_registration)]) event=self.env['event.event'].search([('id','=',int(reg.event_id))]) if membership: membership_product=self.env['product.product'].search([('membership_product','=',True)],limit=1) if not membership_product: raise UserError(_('No membership product, please add one')) #Prix à appliquer au produit en fonction du statut de l'inscrit status=reg.partner_id.member_status if status=='not member':product_price=event.participation_standard_price if status=='member':product_price=event.participation_member_price if status=='super member':product_price=event.participation_super_member_price product_id=event.participation_product_id #création de la facture vals={} vals['partner_id']=int(reg.partner_id) vals['invoice_date']=datetime.now() #mode de paiement CB if payment_mode=='CB': electronic_method=self.env['account.payment.method'].search([('code','=','electronic')],limit=1) if electronic_method: cb_mode=self.env['account.payment.mode'].search([('payment_method_id','=',int(electronic_method.id))],limit=1) if cb_mode: vals['payment_mode_id']=cb_mode.id else: raise Warning('please configure credit card mode') vals['move_type']='out_invoice' vals['state']='draft' invoice=self.env['account.move'].create(vals) #invoice.state='posted' invoice.name='REC'+str(invoice.id) invoice.payment_reference=invoice.name #creation des écritures comptable name=event.participation_product_id.name if membership and status=='not member': product_price=event.participation_member_price+membership_product.list_price name=event.participation_product_id.name+"+"+membership_product.name vals={} account_credit=self.env['account.account'].search([('code','=','707100')]) account_debit=self.env['account.account'].search([('code','=','411100')]) vals['move_id']=invoice.id vals['product_id']=int(event.participation_product_id) vals['quantity']=1 vals['price_unit']=product_price vals['name']=name vals['account_id']=int(account_credit.id) invoice_line=self.env['account.move.line'].with_context(check_move_validity=False).create(vals) # #debit_line vals_d={} vals_d['move_id']=invoice.id vals_d['debit']=product_price vals_d['credit']=0 vals_d['date']=datetime.now() vals_d['partner_id']=int(reg.partner_id) vals_d['product_id']=int(event.participation_product_id) vals_d['name']=name vals_d['account_id']=int(account_debit.id) vals_d['quantity']=1 vals_d['price_unit']=product_price vals_d['exclude_from_invoice_tab']=True invoice_line=self.env['account.move.line'].with_context(check_move_validity=False).create(vals_d) l=self.env['account.move.line'].search([('move_id','=',invoice.id),('balance','<',0)]) l.partner_id=int(reg.partner_id) reg.invoice_id=invoice.id return invoice.id