gestion des demandes d'évolution pour le centre kalachakra non géré dans les module booking et opendons
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.
 
 
 
 

414 lines
16 KiB

from odoo import models, fields, api
from odoo.exceptions import UserError, ValidationError,Warning
from psycopg2 import sql, DatabaseError
from werkzeug import utils
class EventType(models.Model):
_inherit = "event.type"
_description = 'Event Template'
booking_event = fields.Boolean(string="Booking event", tracking=True)
booking_option_ids=fields.One2many('booking.option','event_type_id','booking options')
booking_questionnaire_id=fields.Many2one(
'booking.questionnaire',
String='Questionnaire',
index=True,
track_visibility='onchange',
ondelete='cascade'
)
class EventBookingOptions(models.Model):
_name='booking.option'
_description='booking options for events'
booking_option_id=fields.Many2one('product.product',string='booking options',domain="['|',('booking_option_product','=','True'),('booking_option_product_backoffice','=','True')]")
name=fields.Char(related='booking_option_id.name')
booking_option_price=fields.Monetary('Price',currency_field='currency_id')
booking_option_member_price=fields.Monetary('Member price',currency_field='currency_id')
booking_option_super_member_price=fields.Monetary('Super member price',currency_field='currency_id')
event_type_id = fields.Many2one(
'event.type',
String='Event type',
index=True,
readonly=True,
track_visibility='onchange',
ondelete='cascade'
)
event_id = fields.Many2one(
'event.event',
String='Event',
index=True,
readonly=True,
track_visibility='onchange',
ondelete='cascade'
)
@api.model
def _default_currency(self):
company = self.env['res.company']._company_default_get(
'event.event')
return company.currency_id
currency_id = fields.Many2one(
'res.currency',
string='Currency',
required=True,
track_visibility='onchange',
ondelete='restrict',
default=_default_currency
)
@api.onchange('booking_option_id')
def onchange_booking_option(self):
#for option in self:
if self.booking_option_id:
bo= self.env['product.product'].search([('id',"=",int(self.booking_option_id))])
self.booking_option_price= bo.lst_price
class BookingEvent(models.Model):
_inherit = "event.event"
_description = 'Event'
individual_booking_event=fields.Boolean(string="individual booking event", tracking=True)
questionnaire_id=fields.Many2one('booking.questionnaire','questionnaire')
question_ids=fields.One2many(
'event.question',
'event_id',
string='Questions'
)
@api.onchange('questionnaire_id')
def onchange_questionnaire(self):
#on supprime les question existantes:
self.question_ids=False
questions=self.env['booking.question'].search([('questionnaire_id','=',int(self.questionnaire_id))])
#on rappatrie les questions
for question in questions:
vals={}
vals['event_id']=self.id
vals['sequence']=question.sequence
vals['question']=question.question
self.question_ids = [(0, 0, vals)]
def csv_booking_registrants(self):
act={ 'type': 'ir.actions.act_url',
'url': '/event/csv_booking_registrants?id=%s' % (self.id),
'target': 'self','res_id': self.id}
return act
def generate_csv_booking_registrants(self,id):
booking=self.env['event.event'].search([('id','=',int(id))])
header_ligne='Nom & Prénom;Genre;Rôle;Options;Montant retraite;Adhésion;Autre options;Montant à payer;Statut commande;Type de paiement;Règlement\n'
csv_lines=''
for reg in booking.registration_ids:
name=str(reg.name)
if reg.firstname:name=name+' '+str(reg.firstname)
gender=str(reg.gender)
role=self._compute_member_status(reg)
options=self._compute_invoice_options(reg)
booking_amount=self._compute_booking_amount(reg)
membership_amount=self._compute_membership_amount(reg)
invoice_options_amount= self._compute_invoice_options_amount(reg)
amount_to_be_paid=self._compute_amount_to_be_paid(reg)
payment_status=str(reg.payment_status)
payment_mode=self._compute_payment_mode(reg)
amount_paid=self._compute_amount_paid(reg)
csv_lines=csv_lines+name+';'+gender+';'+role+';'+options+';'+booking_amount+';'+membership_amount+';'+invoice_options_amount+';'+amount_to_be_paid+';'+payment_status+';'+payment_mode+';'+amount_paid+'\n'
return str.encode(header_ligne+csv_lines,'utf-8')
def _compute_payment_mode(self,rec):
payment_mode=''
if rec.invoice_id:
payment_mode=rec.invoice_id.payment_mode_id.name
if rec.down_payment_invoice_id:
payment_mode=rec.down_payment_invoice_id.payment_mode_id.name
return payment_mode
def _compute_amount_paid(self,rec):
amount_paid=0
if rec.invoice_id:
amount_paid=rec.invoice_id.amount_total-rec.invoice_id.amount_residual
if rec.down_payment_invoice_id:
amount_paid=amount_paid+rec.down_payment_invoice_id.amount_total-rec.down_payment_invoice_id.amount_residual
if rec.balance_invoice_id:
amount_paid=amount_paid+rec.balance_invoice_id.amount_total-rec.balance_invoice_id.amount_residual
if rec.end_of_stay_invoice_id:
amount_paid=amount_paid+rec.end_of_stay_invoice_id.amount_total-rec.end_of_stay_invoice_id.amount_residual
return str(amount_paid)
def _compute_amount_to_be_paid(self,rec):
amount_to_be_paid=0
if rec.invoice_id:
amount_to_be_paid=rec.invoice_id.amount_residual
if rec.down_payment_invoice_id:
amount_to_be_paid=amount_to_be_paid+rec.down_payment_invoice_id.amount_residual
if rec.balance_invoice_id:
amount_to_be_paid=amount_to_be_paid+rec.balance_invoice_id.amount_residual
if rec.end_of_stay_invoice_id:
amount_to_be_paid=amount_to_be_paid+rec.end_of_stay_invoice_id.amount_residual
return str(amount_to_be_paid)
def _compute_invoice_options_amount(self,rec):
membership_product=self.env['product.product'].sudo().search([('membership_product','=',True)],limit=1)
invoice_options_amount=0
#si facture sans acompte:
i=1
if rec.invoice_id:
for line in rec.invoice_id.invoice_line_ids:
if i>1:
if line.name!=membership_product.name:
invoice_options_amount=invoice_options_amount+line.price_subtotal
i=i+1
#si facture avec acompte:
i=1
if rec.balance_invoice_id:
for line in rec.balance_invoice_id.invoice_line_ids:
if i>1:
if line.name!=membership_product.name:
invoice_options_amount=invoice_options_amount+line.price_subtotal
i=i+1
i=1
if rec.end_of_stay_invoice_id:
for line in rec.end_of_stay_invoice_id.invoice_line_ids:
if i>1:
if line.name!=membership_product.name:
invoice_options_amount=invoice_options_amount+line.price_subtotal
i=i+1
return str(invoice_options_amount)
def _compute_booking_amount(self,rec):
membership_product=self.env['product.product'].sudo().search([('membership_product','=',True)],limit=1)
#si facture sans acompte:
booking_amount=0
i=1
if rec.invoice_id:
for line in rec.invoice_id.invoice_line_ids:
booking_amount=line.price_subtotal
break
#si facture avec acompte:
if rec.down_payment_invoice_id:
for line in rec.down_payment_invoice_id.invoice_line_ids:
if line.name!=membership_product.name:
booking_amount=line.price_subtotal
break
for line in rec.balance_invoice_id.invoice_line_ids:
if line.name!=membership_product.name:
booking_amount=booking_amount+line.price_subtotal
break
return str(booking_amount)
def _compute_member_status(self,reg):
if reg.partner_id.email==reg.email:
status=reg.partner_id.member_status
#le participant n'est pas la personne qui s'est connecté
else:
participant=self.env['res.partner'].sudo().search([('email','=',reg.email)],limit=1)
if participant:
status=participant.member_status
else:
status='not member'
return str(status)
def _compute_membership_amount(self,rec):
membership_product=self.env['product.product'].sudo().search([('membership_product','=',True)],limit=1)
#si facture sans acompte:
membership_amount=0
if rec.invoice_id:
for line in rec.invoice_id.invoice_line_ids:
if line.name==membership_product.name:
membership_amount=line.price_subtotal
#si facture avec acompte:
if rec.balance_invoice_id:
for line in rec.balance_invoice_id.invoice_line_ids:
if line.name==membership_product.name:
membership_amount=line.price_subtotal
return str(membership_amount)
def _compute_invoice_options(self,rec):
membership_product=self.env['product.product'].sudo().search([('membership_product','=',True)],limit=1)
invoice_options=''
#si facture sans acompte:
i=1
if rec.invoice_id:
for line in rec.invoice_id.invoice_line_ids:
if i>1:
if line.name!=membership_product.name:
invoice_options=invoice_options+str(line.name)+'('+str(line.price_subtotal)+' €)- '
i=i+1
#si facture avec acompte:
i=1
if rec.balance_invoice_id:
for line in rec.balance_invoice_id.invoice_line_ids:
if i>1:
if line.name!=membership_product.name:
invoice_options=invoice_options+str(line.name)+'('+str(line.price_subtotal)+' €)- '
i=i+1
i=1
if rec.end_of_stay_invoice_id:
for line in rec.end_of_stay_invoice_id.invoice_line_ids:
if i>1:
if line.name!=membership_product.name:
invoice_options=invoice_options+str(line.name)+'('+str(line.price_subtotal)+' €)- '
i=i+1
return str(invoice_options)
# booking_option_ids=fields.One2many('booking.option','event_id','booking options')
# @api.model
# def _default_currency(self):
# company = self.env['res.company']._company_default_get(
# 'event.event')
# return company.currency_id
# currency_id = fields.Many2one(
# 'res.currency',
# string='Currency',
# required=True,
# states={'done': [('readonly', True)]},
# track_visibility='onchange',
# ondelete='restrict',
# default=_default_currency
#)
# booking_price=fields.Monetary('Price',currency_field='currency_id')
# booking_member_price=fields.Monetary('Member price',currency_field='currency_id')
# booking_super_member_price=fields.Monetary('Super member price',currency_field='currency_id')
# booking_down_payment=fields.Monetary('Down payment',currency_field='currency_id')
# booking_product_id=fields.Many2one('product.product',string='booking product',domain="[('booking_product','=','True')]")
# @api.depends('event_type_id')
# def _compute_booking_event(self):
# self.booking_event=self.event_type_id.booking_event
# @api.onchange('event_type_id')
# def onchange_state(self):
# self.booking_event=self.event_type_id.booking_event
# booking_option=self.env['booking.option'].search([('event_type_id','=',int(self.event_type_id))])
# if booking_option:
# on supprime les options existantes:
# self.booking_option_ids=False
# on rappatrie les options du modèle
# for option in booking_option:
# vals={}
# vals['event_id']=self.id
# vals['booking_option_id']=option.booking_option_id
# vals['booking_option_price']=option.booking_option_price
# vals['currency_id']=option.currency_id
# self.booking_option_ids = [(0, 0, vals)]
# if self.event_type_id.booking_questionnaire_id:
# on supprime les question existantes:
# self.question_ids=False
# questions=self.env['booking.question'].search([('questionnaire_id','=',int(self.event_type_id.booking_questionnaire_id))])
# on rappatrie les question
# for question in questions:
# vals={}
# vals['event_id']=self.id
# vals['sequence']=question.sequence
# vals['question']=question.question
# self.question_ids = [(0, 0, vals)]
#super(event, self).write(vals)
#self.booking_option_ids=self.event_type_id.booking_option_ids
class event_question(models.Model):
_name = 'event.question'
_description = 'event question'
question=fields.Text(string='question')
sequence = fields.Integer(string="sequence", default=10)
event_id = fields.Many2one(
'event.event',
String='Questionnaire',
index=True,
readonly=True,
track_visibility='onchange',
ondelete='cascade'
)
class event_partner_category(models.Model):
_name = 'event.partner_category'
_description = 'map partner categories vs member or super-member for pricing'
partner_category_id=fields.Many2one(
'res.partner.category',
String='Category',
index=True,
track_visibility='onchange',
ondelete='cascade'
)
status=fields.Selection(selection=[('member','Member'),('supermember','Super Member')])
class event_membership_product(models.Model):
_name = 'event.membership_product'
_description = 'membership product'
membership_product_id=fields.Many2one('product.product',string='Membership product',domain="[('booking_option_product','=','True')]")
class event_email_manager(models.Model):
_name = 'event.email.manager'
_description = 'e-mails of individuals retreats managers to inform'
name=fields.Char('name')
firstname=fields.Char('firstname')
email=fields.Char(string='e-mail')
event_id = fields.Many2one(
'event.event',
String='event',
index=True,
readonly=True,
track_visibility='onchange',
ondelete='restrict'
)