diff --git a/controllers/kalachakra.py b/controllers/kalachakra.py index 9b1a488..7e88d0d 100755 --- a/controllers/kalachakra.py +++ b/controllers/kalachakra.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- from odoo import http,_ from odoo.http import request +import requests from odoo.osv import expression import logging from odoo import models, fields, api @@ -18,6 +19,7 @@ from odoo.addons.website_event.controllers.main import WebsiteEventController from odoo.addons.website.controllers.main import QueryURL from odoo.addons.payment.controllers.portal import PaymentProcessing #from odoo.addons.sale.controllers.portal import CustomerPortal +import odoo.addons.portal.controllers.portal from odoo.addons.account.controllers.portal import CustomerPortal from odoo.tools.misc import formatLang, format_date as odoo_format_date, get_lang from odoo.addons.portal.controllers.portal import pager as portal_pager, get_records_pager @@ -29,6 +31,13 @@ from collections import OrderedDict _logger = logging.getLogger(__name__) def create_donation(self): return True + +class Kalachakra_CustomerPortal(odoo.addons.portal.controllers.portal.CustomerPortal): + MANDATORY_BILLING_FIELDS = ["name","firstname", "birthday_year", "email", "street", "city", "country_id"] + OPTIONAL_BILLING_FIELDS = ["phone","mobile","zipcode", "state_id", "vat", "company_name"] + + + class Kalachakra_PortalAccount(CustomerPortal): @http.route(['/invoice_event'], type='http', auth='user', website=True, sitemap=False,csrf=False) @@ -145,11 +154,14 @@ class Kalachakra_PortalAccount(CustomerPortal): values['invoice_count'] = invoice_count return values + + + class KalaAuthSignupHome(Home): @http.route('/web/signup', type='http', auth='public', website=True, sitemap=False) def kalachakra_web_auth_signup(self, *args, **kw): qcontext = self.get_auth_signup_qcontext() - + _logger.info(qcontext) if not qcontext.get('token') and not qcontext.get('signup_enabled'): raise werkzeug.exceptions.NotFound() @@ -184,9 +196,45 @@ class KalaAuthSignupHome(Home): return response class kalachakra_event(WebsiteEventController,PaymentProcessing): + + def sitemap_event(env, rule, qs): if not qs or qs.lower() in '/events': yield {'loc': '/events'} + + @http.route(['''/event//register'''], type='http', auth="user", website=True, sitemap=False) + def event_register(self, event, **post): + if not event.can_access_from_current_website(): + raise werkzeug.exceptions.NotFound() + + values = self._prepare_event_register_values(event, **post) + return request.render("website_event.event_description_full", values) + + + def _prepare_event_register_values(self, event, **post): + """Return the require values to render the template.""" + + #contact lié à l'utilisateur + userid=request.env.context.get('uid') + cancel_option=0 + if userid: + user=request.env['res.users'].search([('id','=',int(userid))]) + partner=request.env['res.partner'].sudo().search([('id','=',int(user.partner_id))]) + + #si le contact est déjà inscrit et qu'il n'a pas payé: il peut annuler son inscription + reg=request.env['event.registration'].sudo().search([('event_id','=',int(event.id)),('state','!=','cancel'),('partner_id','=',int(partner.id))]) + + if reg: cancel_option=1 + urls = event._get_event_resource_urls() + return { + 'cancel_option': cancel_option, + 'event': event, + 'main_object': event, + 'range': range, + 'google_url': urls.get('google_url'), + 'iCal_url': urls.get('iCal_url'), + } + #afficher la liste des prochains événement sur la home page (sans les retraites ! ) @http.route('/event/csv_booking_registrants', website=False, auth='user',methods=['GET']) def export_csv_booking_registrants(self,id,*args,**kw): @@ -296,6 +344,25 @@ class kalachakra_event(WebsiteEventController,PaymentProcessing): tags = request.env['event.tag'].search([('name', 'in',lst_tags)]) return tags + def update_partner_data(self,partner,post): + _logger.error(partner) + _logger.error('post:'+str(post)) + if len(post)>0: + partner.name=post.get('name') + partner.firstname=post.get('firstname') + partner.birthday_year=post.get('birthday_year') + partner.street=post.get('street') + partner.street2=post.get('street2') + partner.zip=post.get('zip') + partner.city=post.get('city') + partner.phone=post.get('phone') + partner.mobile=post.get('mobile') + partner.country_id=int(post.get('country_id')) + partner.contact_form_update_date=fields.Date.today() + + + + @http.route(['/kalachakra/mediatheque/event'], type='http', auth="public", website=True, sitemap=sitemap_event) def kalachakraMediathequeEvent(self,**id): id=id.get('id') @@ -601,6 +668,20 @@ class kalachakra_event(WebsiteEventController,PaymentProcessing): return http.request.redirect('https://www.dropbox.com/s/ijsd6n82oyp0gw8/programme_Paris.pdf?dl=0') + + @http.route(['/event/registration/cancel'], type='http', auth='user', website=True, sitemap=False,csrf=False) + def event_registration_cancel(self,event_id,*args,**kw): + + #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))]) + + reg=request.env['event.registration'].sudo().search([('event_id','=',int(event_id)),('state','!=','cancel'),('partner_id','=',int(partner.id))],limit=1) + reg.action_cancel() + + return http.request.render('kalachakra.registration_cancel') + @http.route(['/event/registration/step1'], type='http', auth='user', website=True, sitemap=False,csrf=False) def event_registration_step1(self,event_id,*args,**kw): data={} @@ -608,6 +689,10 @@ class kalachakra_event(WebsiteEventController,PaymentProcessing): 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))]) + + #mise à jour des infos du contact à partir du formulaire + self.update_partner_data(partner,request.session['partner_data']) + data['partner']=partner #évenement event=request.env['event.event'].sudo().search([('id','=',int(event_id))]) @@ -637,30 +722,62 @@ class kalachakra_event(WebsiteEventController,PaymentProcessing): @http.route(['/event/registration/contactform'], type='http', auth='user', website=True, sitemap=False,csrf=False) #def event_registration_contactform(self,event_id,*args,**kw): - def event_registration_contactform(self,*args,**kw): + def event_registration_contactform(self,event_id,*args,**kw): data={} #contact lié à l'utilisateur - + event=request.env['event.event'].sudo().search([('id','=',int(event_id))]) + request.session['event_id']=int(event_id) + data['event']=event + userid=request.env.context.get('uid') data['lang']=request.env.context.get('lang') user=request.env['res.users'].search([('id','=',int(userid))]) partner=request.env['res.partner'].sudo().search([('id','=',int(user.partner_id))]) data['partner']=partner - #évenement - # event=request.env['event.event'].sudo().search([('id','=',int(event_id))]) - # request.session['event_id']=int(event_id) - #data['event']=event + country=request.env['res.country'].sudo().search([]) + data['countries']=country + data['country_id']=int(partner.country_id) + last_update_date=partner.contact_form_update_date + #_logger.error('last update:'+str(last_update_date)) + #_logger.error(str(last_update_date +relativedelta(days=365))) + + + if not last_update_date or last_update_date +relativedelta(days=365)<=datetime.now().date() : + return http.request.render('kalachakra.registration_contactform',data) + else: + url='/event/registration/step0?event_id='+str(event.id) + return request.redirect(url) + + + @http.route(['/event/registration/step0'], type='http', auth='user', website=True, sitemap=False,csrf=False) + def event_registration_step0(self,event_id,**post): + + event=request.env['event.event'].sudo().search([('id','=',int(event_id))]) + + if event.online_event and not event.online_only:next_step="step1" + if event.online_only and not event.headphone_option:next_step="step2" + if not event.online_event and not event.online_only and not event.headphone_option:next_step="step2" + if event.online_only and event.headphone_option:next_step="step2" + if not event.online_event and not event.online_only and event.headphone_option:next_step="step1b" + url='/event/registration/'+next_step+'?event_id='+str(event.id) + + + request.session['partner_data']=post + + return request.redirect(url) - return http.request.render('kalachakra.registration_contactform',data) @http.route(['/event/registration/step1b'], type='http', auth='user', website=True, sitemap=False,csrf=False) - def event_registration_step1b(self,event_id,*args,**kw): + def event_registration_step1b(self,event_id,**post): 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))]) data['partner']=partner + #mise à jour des infos du contact à partir du formulaire + + self.update_partner_data(partner,request.session['partner_data']) #évenement event=request.env['event.event'].sudo().search([('id','=',int(event_id))]) request.session['event_id']=int(event_id) @@ -678,6 +795,10 @@ class kalachakra_event(WebsiteEventController,PaymentProcessing): 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))]) + + #mise à jour des infos du contact à partir du formulaire + self.update_partner_data(partner,request.session['partner_data']) + request.session['partner_id']=int(partner.id) request.session['status']=partner.member_status data['partner']=partner @@ -710,7 +831,7 @@ class kalachakra_event(WebsiteEventController,PaymentProcessing): data['membership_and_participation_amount']=str(int(data['membership_amount'])+int(event.participation_member_price)) +' ('+str(int(data['membership_amount']))+'+'+str(int(event.participation_member_price))+')' #enregistrement de l'inscription si pas déjà inscrit : - res=request.env['event.registration'].sudo().search([('event_id','=',int(request.session['event_id'])),('partner_id','=',int(request.session['partner_id']))],limit=1) + res=request.env['event.registration'].sudo().search([('event_id','=',int(request.session['event_id'])),('state','!=','cancel'),('partner_id','=',int(request.session['partner_id']))],limit=1) data['already_registered']=True data['payment_status']=res.payment_status diff --git a/i18n/fr.po b/i18n/fr.po index 647a7fc..72dd9d9 100755 --- a/i18n/fr.po +++ b/i18n/fr.po @@ -1924,3 +1924,95 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:kalachakra.kalachakra_template_donation_tax_receipt msgid "{{SIGNATORY}} / {{SIGNATORYJOB}}" msgstr "" + +#. module: kalachakra +#: model_terms:ir.ui.view,arch_db:kalachakra.portal_my_details +msgid "Zip / Postal Code" +msgstr "Code postal" + +#. module: kalachakra +#: model:ir.model.fields,field_description:kalachakra.field_res_partner__birthday_year +#: model:ir.model.fields,field_description:kalachakra.field_res_users__birthday_year +#: model_terms:ir.ui.view,arch_db:kalachakra.portal_my_details +msgid "Birthday year" +msgstr "Année de naissance" + +#. module: kalachakra +#: model_terms:ir.ui.view,arch_db:kalachakra.registration_contactform +msgid "" +"Birthday year\n" +" *" +msgstr "" +"Année de naissance\n" +" *" + + +#. module: kalachakra +#: model_terms:ir.ui.view,arch_db:kalachakra.registration_contactform +msgid "" +"To help us communicate better with you, please provide some personal information about yourself.\n" +" This data will remain confidential and will not be shared." +msgstr "" +"Afin de nous aider à mieux communiquer avec vous, nous vous remercions de " +"préciser quelques informations personnelles vous concernant. Ces données " +"resteront confidentielles et ne seront pas partagées." + +#. module: kalachakra +#: model_terms:ir.ui.view,arch_db:kalachakra.booking_registration_options_form2 +#: model_terms:ir.ui.view,arch_db:kalachakra.registration_contactform +msgid "" +"First name\n" +" *" +msgstr "" +"Prénom\n" +" *" + + +#. module: kalachakra +#: model_terms:ir.ui.view,arch_db:kalachakra.booking_registration_options_form2 +#: model_terms:ir.ui.view,arch_db:kalachakra.registration_contactform +msgid "" +"Name\n" +" *" +msgstr "" +"Nom\n" +" *" + +#. module: kalachakra +#: model_terms:ir.ui.view,arch_db:kalachakra.booking_registration_options_form2 +#: model_terms:ir.ui.view,arch_db:kalachakra.registration_contactform +msgid "" +"Phone\n" +" " +msgstr "" +"Téléphone\n" +" " + +#. module: kalachakra +#: model_terms:ir.ui.view,arch_db:kalachakra.registration_contactform +msgid "Street 2" +msgstr "Complément d'adresse" + +#. module: kalachakra +#: model_terms:ir.ui.view,arch_db:kalachakra.registration_contactform +msgid "Street" +msgstr "Rue" + +#. module: kalachakra +#: model_terms:ir.ui.view,arch_db:kalachakra.registration_contactform +msgid "" +"Zip\n" +" *" +msgstr "" +"Code postal\n" +" *" + +#. module: kalachakra +#: model_terms:ir.ui.view,arch_db:kalachakra.registration_cancel +msgid "Your registration has been cancelled" +msgstr "Votre inscription a été annulée" + +#. module: kalachakra +#: model_terms:ir.ui.view,arch_db:kalachakra.event_registration_template +msgid "Cancel register" +msgstr "Annuler mon inscription" \ No newline at end of file diff --git a/models/accounting_file.py b/models/accounting_file.py index f3945a2..18a43bb 100755 --- a/models/accounting_file.py +++ b/models/accounting_file.py @@ -10,5 +10,5 @@ class accounting_file(models.Model): document_fname=fields.Char(default='undefined') exported_date=fields.Date(string='Exported Date',tracking=True, readonly=True) start_date=fields.Date(string='Start Date',tracking=True, readonly=True) - + end_date=fields.Date(string='End Date',tracking=True, readonly=True) \ No newline at end of file diff --git a/models/event_registration.py b/models/event_registration.py index 78c6398..e898fe6 100755 --- a/models/event_registration.py +++ b/models/event_registration.py @@ -247,7 +247,10 @@ class EventRegistration(models.Model): 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 - + _logger.error('state invoice='+reg.invoice_id.state) + #mettre la facture payée si son montant est à zéro + if product_price==0:reg.invoice_id.state='posted' + return invoice.id \ No newline at end of file diff --git a/models/membership.py b/models/membership.py index b7c7d10..16b50bc 100755 --- a/models/membership.py +++ b/models/membership.py @@ -68,6 +68,7 @@ class kalachakra_membership(models.Model): return end_date end_date=fields.Date('end date',default=_default_end_date) + alert_mail_date=fields.Date('alert mail date') @@ -223,6 +224,18 @@ class kalachakra_membership(models.Model): for m in members: m.update_membership() + def bulk_mail_end_membership(self): + + date_30=date.today()+relativedelta(months=1) + members=self.env['kalachakra.membership'].search([('alert_mail_date','=',False),('end_date','<=',date_30),('end_date','>=',date.today())]) + + for m in members: + m.alert_mail_date=date.today() + mail_template = self.env['mail.template'].search([('name','=','end_membership')]) + mail_template.email_to = self.partner_id.email + #mail_template.send_mail(m.id,False) + _logger.error(m.partner_id.name+' '+str(m.end_date)) + def email_confirmation(self): diff --git a/models/partner.py b/models/partner.py index 549ce09..def18c8 100755 --- a/models/partner.py +++ b/models/partner.py @@ -65,8 +65,9 @@ class ResPartner(models.Model): date_adhesion=fields.Char(string='Date adhesion', readonly=True) birthday_date=fields.Date(string="Birthday date") - birthday_yeardate=fields.Date(string="Birthday date") - + birthday_year=fields.Integer(string="Birthday year") + contact_form_update_date=fields.Date(string="contact form update date") + name_for_list = fields.Char('name', compute='_compute_name_for_list',store=True) def _compute_end_date_membership(self): @@ -208,4 +209,15 @@ class ResPartner(models.Model): first_name_ = record.firstname if record.firstname else "" name = donor + name_ + first_name_ res.append((record.id,name)) - return res \ No newline at end of file + return res + + def _update_email_to_lower(self): + + users = self.env['res.users'].search([]) + for u in users: + _logger.info(u.login) + try: + u.login=u.login.lower() + _logger.info(u.login) + except : + _logger.info('erreur :'+u.login) \ No newline at end of file diff --git a/models/res_users.py b/models/res_users.py index 97a36a6..de642e9 100755 --- a/models/res_users.py +++ b/models/res_users.py @@ -98,7 +98,7 @@ class ResUsers(models.Model): # no token, sign up an external user _logger.error("errK6no token, sign up an external user") values['email'] = values.get('email') or values.get('login') - + values['email'] =values['email'].lower() self._signup_create_user(values) diff --git a/views/accounting_file.xml b/views/accounting_file.xml index d333092..fa5b8ba 100755 --- a/views/accounting_file.xml +++ b/views/accounting_file.xml @@ -31,6 +31,7 @@ + diff --git a/views/event_templates_page_registration.xml b/views/event_templates_page_registration.xml index 7dd9670..baf82cf 100755 --- a/views/event_templates_page_registration.xml +++ b/views/event_templates_page_registration.xml @@ -11,20 +11,11 @@ @@ -75,6 +66,7 @@ Teacher +

diff --git a/views/partner.xml b/views/partner.xml index 2333ddc..1fe9fab 100755 --- a/views/partner.xml +++ b/views/partner.xml @@ -27,7 +27,8 @@ - + + diff --git a/views/portal_templates.xml b/views/portal_templates.xml index 60e5825..d15a61f 100755 --- a/views/portal_templates.xml +++ b/views/portal_templates.xml @@ -15,16 +15,30 @@
-
- - +
+ +
+
+
+ + +
+
+ + +
-
+
+
- + +
+
+ +
diff --git a/views/website_event_registration.xml b/views/website_event_registration.xml index 18c776d..8782302 100755 --- a/views/website_event_registration.xml +++ b/views/website_event_registration.xml @@ -230,10 +230,11 @@



+



- +
If you want to become a member for one year and pay the participation,

@@ -248,6 +249,7 @@



+ If you want pay on the spot, click here : @@ -255,6 +257,7 @@

+


@@ -311,10 +314,11 @@
-
+
-
Please fill in or update your personnals informations :
+
To help us communicate better with you, please provide some personal information about yourself. + This data will remain confidential and will not be shared.
@@ -342,23 +346,14 @@
-
- -
-
- -
-
-
+
-
+
@@ -463,4 +458,22 @@
+ + + + + \ No newline at end of file diff --git a/wizard/accounting_file_wizard.py b/wizard/accounting_file_wizard.py index e43631b..ec2763a 100644 --- a/wizard/accounting_file_wizard.py +++ b/wizard/accounting_file_wizard.py @@ -19,6 +19,8 @@ class AccountingFileWizard(models.TransientModel): _description = 'accounting file wizard' start_date=fields.Datetime('start date',required=True,default=lambda self: self._compute_start_date()) + end_date=fields.Datetime('end date',required=True,default=lambda self: self._compute_end_date()) + debug_mode=fields.Boolean('debug mode',default=True) export_donation_lines=fields.Boolean('export donation lines',default=True) export_membership_lines=fields.Boolean('export_membership_lines',default=True) @@ -27,33 +29,42 @@ class AccountingFileWizard(models.TransientModel): export_out_refund_lines=fields.Boolean('export_out_refund_lines',default=True) export_end_of_stay_lines=fields.Boolean('export_end_of_stay_lines',default=True) + + def _compute_end_date(self): + + date_today=fields.Date.context_today(self) + return date_today + def _compute_start_date(self): - date_max=[] - #recherche de la date d'export d'écriture la plus récente - query="select max(date_compta) as date_compta from donation_donation" - self._cr.execute(query) - query_res = self._cr.dictfetchall() - for r in query_res: - d_date_compta=r['date_compta'] - if d_date_compta: date_max.append(d_date_compta) + + date_today=fields.Date.context_today(self) + return datetime(date_today.year,date_today.month,1) + # date_max=[] + # #recherche de la date d'export d'écriture la plus récente + # query="select max(date_compta) as date_compta from donation_donation" + # self._cr.execute(query) + # query_res = self._cr.dictfetchall() + # for r in query_res: + # d_date_compta=r['date_compta'] + # if d_date_compta: date_max.append(d_date_compta) - query="select max(date_compta) as date_compta from kalachakra_membership" - self._cr.execute(query) - query_res = self._cr.dictfetchall() - for r in query_res: - m_date_compta=r['date_compta'] - if m_date_compta: date_max.append(m_date_compta) + # query="select max(date_compta) as date_compta from kalachakra_membership" + # self._cr.execute(query) + # query_res = self._cr.dictfetchall() + # for r in query_res: + # m_date_compta=r['date_compta'] + # if m_date_compta: date_max.append(m_date_compta) - query="select max(date_compta) as date_compta from event_registration" - self._cr.execute(query) - query_res = self._cr.dictfetchall() - for r in query_res: - e_date_compta=r['date_compta'] - if e_date_compta: date_max.append(e_date_compta) + # query="select max(date_compta) as date_compta from event_registration" + # self._cr.execute(query) + # query_res = self._cr.dictfetchall() + # for r in query_res: + # e_date_compta=r['date_compta'] + # if e_date_compta: date_max.append(e_date_compta) - if date_max: return max(date_max) - else: return fields.Date.context_today(self) + # if date_max: return max(date_max) + # else: return fields.Date.context_today(self) @@ -121,6 +132,7 @@ class AccountingFileWizard(models.TransientModel): vals['document_fname']='export_comptable.csv' vals['exported_date']=fields.Date.context_today(self) vals['start_date']=self.start_date + vals['end_date']=self.end_date res=self.env['accounting.file'].create(vals) f.close os.unlink(filename) @@ -158,6 +170,7 @@ class AccountingFileWizard(models.TransientModel): #if datetime(d.donation_date.year, d.donation_date.month, d.donation_date.day)self.end_date.date():continue date_payment=self._date_format(date_payment) #on ne prend pas en compte les dons liés à une retraite #car traité avec les retraites @@ -222,6 +235,7 @@ class AccountingFileWizard(models.TransientModel): for m in membership: if datetime(m.start_date.year,m.start_date.month,m.start_date.day)self.end_date:continue if not self.debug_mode: m.date_compta=date_compta #on ne prend pas en compte les adhésions liés à une retraite #car traité avec les retraites @@ -298,6 +312,7 @@ class AccountingFileWizard(models.TransientModel): if reg.date_payment and reg.date_paymentself.end_date.date(): continue membership_credit_line=False membership_amount=0 if not self.debug_mode: reg.date_compta=date_compta @@ -375,7 +390,8 @@ class AccountingFileWizard(models.TransientModel): if reg.end_of_stay_invoice_id.date_compta_end_of_stay:continue if not reg.date_payment_end_of_stay:continue if reg.date_payment_end_of_stay and reg.date_payment_end_of_stayself.end_date.date(): continue + account_debit_number=self._file_format(str(reg.end_of_stay_invoice_id.payment_mode_id.fixed_journal_id.default_account_id.code),6) trans=self.env['payment.transaction'].search([('invoice_ids','in',reg.end_of_stay_invoice_id.id),('state','=','done')],limit=1) if trans and trans.acquirer_id.name=='Paypal': @@ -478,6 +494,7 @@ class AccountingFileWizard(models.TransientModel): if reg.invoice_id.amount_total>0 and reg.invoice_id.payment_state=='paid' and reg.date_compta==False : if reg.date_payment and reg.date_paymentself.end_date.date(): continue self.booking_invoice_lines(f,reg) #si facture d'acompte payée et pas encore exporté @@ -794,6 +811,7 @@ class AccountingFileWizard(models.TransientModel): out_refund_invoices=self.env['account.move'].search([('move_type','=','out_refund'),('state','=','posted'),('payment_state','=','not_paid'),('date_compta','=',False),('date_compta_out_refund','=',False)]) for invoice in out_refund_invoices: if invoice.invoice_dateself.end_date.date(): continue if not self.debug_mode: invoice.date_compta_out_refund=date_compta firstname=invoice.partner_id.firstname name=invoice.partner_id.name diff --git a/wizard/accounting_file_wizard.xml b/wizard/accounting_file_wizard.xml index 18413e3..5059a3c 100644 --- a/wizard/accounting_file_wizard.xml +++ b/wizard/accounting_file_wizard.xml @@ -6,6 +6,7 @@ +