diff --git a/__manifest__.py b/__manifest__.py index 47bed23..7cc89aa 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -29,15 +29,17 @@ 'views/templates.xml', 'views/calendar.xml', 'views/contactus.xml', - # 'views/partner.xml', + 'views/partner.xml', # 'views/partnerimport.xml', 'report/report_donationtax.xml', 'report/report.xml', 'views/website_participation.xml', + 'views/product.xml', #'report/report_donationtax.xml', #'report/report.xml' 'views/event.xml', - 'views/event_templates_list.xml' + 'views/event_templates_list.xml', + 'views/membership.xml' ], # only loaded in demonstration mode diff --git a/controllers/kalachakra.py b/controllers/kalachakra.py index 3c97355..546117c 100644 --- a/controllers/kalachakra.py +++ b/controllers/kalachakra.py @@ -4,6 +4,7 @@ from odoo.http import request import werkzeug from datetime import datetime from odoo.tools import format_datetime, format_date, is_html_empty +from dateutil.relativedelta import relativedelta from odoo.exceptions import UserError from odoo.addons.website_event.controllers.main import WebsiteEventController from odoo.addons.payment.controllers.portal import PaymentProcessing @@ -89,13 +90,24 @@ class kalachakra_event(WebsiteEventController,PaymentProcessing): @http.route(['/kalachakra/participation'], type='http', auth='public', website=True, sitemap=False,csrf=False) def participation(self,type=None,**post): data={} + request.session['kalachakra_transaction']='' if type=='donation': - request.session['donation_transaction']=True + request.session['kalachakra_transaction']='donation' + data['kalachakra_transaction']='donation' data['title']='make donation' data['amount']=10 #donation product data['products']=request.env['product.product'].search([('donation','=',True)]) + if type=='membership': + request.session['kalachakra_transaction']='membership' + data['kalachakra_transaction']='membership' + data['title']='Become a member' + p=request.env['product.template'].search([('membership_product','=',True)]) + if not p: raise UserError(_('No membership product, please add one')) + data['amount']=p.list_price + #membership product + data['products']=p userid=request.env.context.get('uid') @@ -137,14 +149,21 @@ class kalachakra_event(WebsiteEventController,PaymentProcessing): data['partner']=partner - - - - return http.request.render('kalachakra.participation_form',data) @http.route(['/kalachakra/payment_choice'], type='http', auth='public', website=True, sitemap=False,csrf=False) def payment_choice(self,**post): + + #gestion du retour page précédente depuis page de paiement + if not post.get('product_id'): + if request.session['kalachakra_transaction']=='donation': + request.env['donation.donation'].search(['id','=',int(request.session['donation_id'])]).unlink() + if request.session['kalachakra_transaction']=='membership': + request.env['kalachakra.membership'].search(['id','=',int(request.session['membership_id'])]).unlink() + + return request.redirect('/kalachakra/participation?type='+request.session['kalachakra_transaction']) + + userid=request.env.context.get('uid') if userid: user=request.env['res.users'].search([('id','=',int(userid))]) @@ -170,11 +189,15 @@ class kalachakra_event(WebsiteEventController,PaymentProcessing): data={} - data['submit_txt']='Donate now' + if request.session['kalachakra_transaction']=='donation': + data['submit_txt']='Donate now' + if request.session['kalachakra_transaction'] in ['membership'] : + data['submit_txt']='Pay now' + data['success_url']='/kalachakra/payment/success' data['error_url']='/kalachakra/payment/error' - if request.session.get('donation_transaction')==True: + if request.session['kalachakra_transaction'] in ['donation','membership']: data['acquirers'] = list(request.env['payment.acquirer'].search([ ('state', 'in', ['enabled', 'test']), ('company_id', '=', request.env.company.id), @@ -195,57 +218,48 @@ class kalachakra_event(WebsiteEventController,PaymentProcessing): data['payment_tokens']=payment_tokens #create donation - vals={} - vals['partner_id']=partner.id - vals['donation_date']=datetime.now() - vals['tax_receipt_option']='annual' - #mode de paiement CB - electronic_method=request.env['account.payment.method'].search([('code','=','electronic')],limit=1) - if electronic_method: - cb_mode=request.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['state']='draft' - vals['payment_ref']='internet' - donation_draft=request.env['donation.donation'].sudo().create(vals) - vals={} - #create line donation - vals['donation_id']=donation_draft.id - product=request.env['product.product'].search([('id','=',int(post.get('product_id')))]) - vals['product_id']=int(post.get('product_id')) - vals['display_name']=product.name - vals['quantity']=1 - vals['unit_price']=post.get('amount') - vals['tax_receipt_ok']=product.tax_receipt_ok - - - donation_line=request.env['donation.line'].sudo().create(vals) - - - #create sale order - # vals={} - - - # vals['partner_id']=partner.id - # order_draft=request.env['sale.order'].sudo().create(vals) - # data['order_id']=order_draft.id - # #création des lignes de devis - # vals={} - # vals['order_id']=order_draft.id - # #ajout du produit - # vals['product_id']=int(post.get('product_id')) - # vals['product_uom_qty']=1 - # vals['price_unit']=post.get('amount') - - # product=request.env['product.product'].search([('id','=',int(post.get('product_id')))]) - # vals['name']=product.name - - # order_line=request.env['sale.order.line'].sudo().create(vals) + if request.session['kalachakra_transaction'] in ['donation']: + vals={} + vals['partner_id']=partner.id + vals['donation_date']=datetime.now() + vals['tax_receipt_option']='annual' + #mode de paiement CB + electronic_method=request.env['account.payment.method'].search([('code','=','electronic')],limit=1) + if electronic_method: + cb_mode=request.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['state']='draft' + vals['payment_ref']='internet' + donation_draft=request.env['donation.donation'].sudo().create(vals) + vals={} + #create line donation + vals['donation_id']=donation_draft.id + product=request.env['product.product'].search([('id','=',int(post.get('product_id')))]) + vals['product_id']=int(post.get('product_id')) + vals['display_name']=product.name + vals['quantity']=1 + vals['unit_price']=post.get('amount') + vals['tax_receipt_ok']=product.tax_receipt_ok + + + donation_line=request.env['donation.line'].sudo().create(vals) + + data['order_id']=donation_draft.id + request.session['donation_id'] = donation_draft.id - data['order_id']=donation_draft.id - request.session['donation_id'] = donation_draft.id + #create membership + if request.session['kalachakra_transaction'] in ['membership']: + vals={} + vals['partner_id']=partner.id + vals['product_id']=int(post.get('product_id')) + vals['start_date']=datetime.now() + vals['end_date']=datetime.now()+relativedelta(years=1) + membership=request.env['kalachakra.membership'].sudo().create(vals) + data['order_id']=membership.id + request.session['membership_id'] = membership.id return http.request.render('kalachakra.payment_choice_form',data) @@ -263,7 +277,10 @@ class kalachakra_event(WebsiteEventController,PaymentProcessing): user is redirected to the checkout page """ # Ensure a payment acquirer is selected - donation_id=order_id + + + + if not acquirer_id: return False @@ -272,37 +289,71 @@ class kalachakra_event(WebsiteEventController,PaymentProcessing): except: return False + if request.session['kalachakra_transaction'] in ['donation']: + # Retrieve the donation + donation_id=order_id + donation=request.env['donation.donation'].search([('id','=',int(donation_id))], limit=1) - # Retrieve the donation - donation=request.env['donation.donation'].search([('id','=',int(donation_id))], limit=1) - - # Ensure there is something to proceed - if not donation or (donation and not donation.line_ids): - return False + # Ensure there is something to proceed + if not donation or (donation and not donation.line_ids): + return False + + assert donation.partner_id.id != request.website.partner_id.id + + # Create transaction + vals = {'acquirer_id': acquirer_id, + 'return_url': '/kalachakra/payment/validate'} + + if save_token: + vals['type'] = 'form_save' + if token: + vals['payment_token_id'] = int(token) + + transaction = donation._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 + return transaction.render_donation_button(donation) + + if request.session['kalachakra_transaction'] in ['membership']: + # Retrieve the donation + membership_id=order_id + membership=request.env['kalachakra.membership'].search([('id','=',int(membership_id))], limit=1) - assert donation.partner_id.id != request.website.partner_id.id - # Create transaction - vals = {'acquirer_id': acquirer_id, - 'return_url': '/kalachakra/payment/validate'} - - if save_token: - vals['type'] = 'form_save' - if token: - vals['payment_token_id'] = int(token) - - transaction = donation._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 - return transaction.render_donation_button(donation) + # Ensure there is something to proceed + if not membership : + return False + + assert membership.partner_id.id != request.website.partner_id.id + + # Create transaction + vals = {'acquirer_id': acquirer_id, + 'return_url': '/kalachakra/payment/validate'} + + if save_token: + vals['type'] = 'form_save' + if token: + vals['payment_token_id'] = int(token) + + transaction = membership._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 + return transaction.render_membership_button(membership) http.route('/kalachakra/payment/token', type='http', auth='public', website=True, sitemap=False) def kalachakra_payment_token(self, pm_id=None, **kwargs): @@ -323,7 +374,12 @@ class kalachakra_event(WebsiteEventController,PaymentProcessing): # Create transaction vals = {'payment_token_id': pm_id, 'return_url': '/kalachakra/payment/validate'} - tx = donation._create_payment_transaction(vals) + if request.session['kalachakra_transaction'] in ['donation']: + tx = donation._create_payment_transaction(vals) + + if request.session['kalachakra_transaction'] in ['membership']: + tx = membership._create_payment_transaction(vals) + request.session['transaction_id']=tx.id PaymentProcessing.add_payment_transaction(tx) return request.redirect('kalachakra/payment/process') @@ -347,11 +403,20 @@ class kalachakra_event(WebsiteEventController,PaymentProcessing): - UDPATE ME """ - donation_id=int(request.session['donation_id']) - #validation du don car la tranasction est ok - donation=request.env['donation.donation'].search([('id','=',donation_id)]) - donation.state='done' - request.session['donation_id']=None + if request.session['kalachakra_transaction'] in ['donation']: + + donation_id=int(request.session['donation_id']) + #validation du don car la tranasction est ok + donation=request.env['donation.donation'].search([('id','=',donation_id)]) + donation.state='done' + request.session['donation_id']=None + + if request.session['kalachakra_transaction'] in ['membership']: + membership_id=int(request.session['membership_id']) + #validation du don car la tranasction est ok + membership=request.env['kalachakra.membership'].search([('id','=',membership_id)]) + membership.state='done' + request.session['membership_id']=None transaction_id=int(request.session['__website_sale_last_tx_id'] ) tx = request.env['payment.transaction'].sudo().browse(transaction_id) @@ -362,43 +427,10 @@ class kalachakra_event(WebsiteEventController,PaymentProcessing): PaymentProcessing.remove_payment_transaction(tx) return request.redirect('/kalachakra/payment/confirmation') - # if sale_order_id is None: - # order = request.website.sale_get_order() - # else: - # order = request.env['sale.order'].sudo().browse(sale_order_id) - # assert order.id == request.session.get('sale_last_order_id') - - # if transaction_id: - # tx = request.env['payment.transaction'].sudo().browse(transaction_id) - # assert tx in order.transaction_ids() - # elif order: - # tx = order.get_portal_last_transaction() - # else: - # tx = None - - # if not order or (order.amount_total and not tx): - # return request.redirect('/kalachakra/ma') - - # if order and not order.amount_total and not tx: - # order.with_context(send_email=True).action_confirm() - # return request.redirect(order.get_portal_url()) - - # # clean context and session, then redirect to the confirmation page - # request.website.sale_reset() - # if tx and tx.state == 'draft': - # return request.redirect('/kalachakra/') - - # PaymentProcessing.remove_payment_transaction(tx) - # return request.redirect('/kalachakra/payment/confirmation') @http.route(['/kalachakra/payment/confirmation'], type='http', auth="public", website=True, sitemap=False) def kalachakra_payment_confirmation(self, **post): return request.render("kalachakra.thankyou") - # sale_order_id = request.session.get('sale_last_order_id') - # if sale_order_id: - # order = request.env['sale.order'].sudo().browse(sale_order_id) - # return request.render("website_sale.confirmation", {'order': order}) - # else: - # return request.redirect('/shop') \ No newline at end of file + \ No newline at end of file diff --git a/i18n/fr.po b/i18n/fr.po index e78f3b7..4c3a966 100644 --- a/i18n/fr.po +++ b/i18n/fr.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 14.0-20210413\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-30 12:54+0000\n" -"PO-Revision-Date: 2022-05-30 12:54+0000\n" +"POT-Creation-Date: 2022-05-31 13:07+0000\n" +"PO-Revision-Date: 2022-05-31 13:07+0000\n" "Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -18,7 +18,7 @@ msgstr "" #. module: kalachakra #: model_terms:ir.ui.view,arch_db:kalachakra.kalachakra_template_donation_tax_receipt msgid "5 Passage Delessert – 75010 PARIS" -msgstr "5 Passage Delessert – 75010 PARIS"" +msgstr "" #. module: kalachakra #: model_terms:ir.ui.view,arch_db:kalachakra.kalachakra_template_donation_tax_receipt @@ -30,6 +30,13 @@ msgstr "" msgid "Paris, le {{DATE}}" msgstr "" +#. module: kalachakra +#: model_terms:ir.ui.view,arch_db:kalachakra.event_category_tag +msgid "" +"\n" +" tags" +msgstr "" + #. module: kalachakra #: model_terms:ir.ui.view,arch_db:kalachakra.kalachakra_template_donation_tax_receipt msgid "" @@ -39,18 +46,21 @@ msgstr "" #. module: kalachakra #: code:addons/kalachakra/models/donation.py:0 +#: code:addons/kalachakra/models/membership.py:0 #, python-format msgid "A journal must be specified for the acquirer %s." msgstr "" #. module: kalachakra #: code:addons/kalachakra/models/donation.py:0 +#: code:addons/kalachakra/models/membership.py:0 #, python-format msgid "A payment acquirer is required to create a transaction." msgstr "" #. module: kalachakra #: code:addons/kalachakra/models/donation.py:0 +#: code:addons/kalachakra/models/membership.py:0 #, python-format msgid "" "A transaction can't be linked to sales orders having different partners." @@ -66,6 +76,11 @@ msgstr "Ajouter l'événement au calendrier google" msgid "Affectation *" msgstr "" +#. module: kalachakra +#: model:ir.model.fields,field_description:kalachakra.field_kalachakra_membership__amount +msgid "Amount" +msgstr "Montant" + #. module: kalachakra #: model_terms:ir.ui.view,arch_db:kalachakra.participation_form msgid "Amount (€)" @@ -89,7 +104,7 @@ msgstr "" #. module: kalachakra #: model_terms:ir.ui.view,arch_db:kalachakra.kalachakra_template_donation_tax_receipt msgid "Associationnn Cultuelle Kalachakra – Roue de la Vie" -msgstr "Association Cultuelle Kalachakra – Roue de la Vie" +msgstr "" #. module: kalachakra #: model:ir.model.fields,field_description:kalachakra.field_kalachakra_partnerdraftfile__file @@ -104,9 +119,10 @@ msgstr "" #. module: kalachakra #: model_terms:ir.ui.view,arch_db:kalachakra.participation_form msgid "Country *" -msgstr "Pays *" +msgstr "" #. module: kalachakra +#: model:ir.model.fields,field_description:kalachakra.field_kalachakra_membership__create_uid #: model:ir.model.fields,field_description:kalachakra.field_kalachakra_partnerdraft__create_uid #: model:ir.model.fields,field_description:kalachakra.field_kalachakra_partnerdraftfile__create_uid #: model:ir.model.fields,field_description:kalachakra.field_kalachakra_partnerdraftfile_mapping__create_uid @@ -114,11 +130,17 @@ msgid "Created by" msgstr "" #. module: kalachakra +#: model:ir.model.fields,field_description:kalachakra.field_kalachakra_membership__create_date #: model:ir.model.fields,field_description:kalachakra.field_kalachakra_partnerdraft__create_date #: model:ir.model.fields,field_description:kalachakra.field_kalachakra_partnerdraftfile__create_date #: model:ir.model.fields,field_description:kalachakra.field_kalachakra_partnerdraftfile_mapping__create_date msgid "Created on" -msgstr "" +msgstr "Créé le" + +#. module: kalachakra +#: model:ir.model.fields,field_description:kalachakra.field_kalachakra_membership__currency_id +msgid "Currency" +msgstr "devise" #. module: kalachakra #: model_terms:ir.ui.view,arch_db:kalachakra.kalachakra_template_donation_tax_receipt @@ -129,10 +151,12 @@ msgstr "" #: model:ir.model.fields,field_description:kalachakra.field_donation_donation__display_name #: model:ir.model.fields,field_description:kalachakra.field_event_event__display_name #: model:ir.model.fields,field_description:kalachakra.field_event_tag_category__display_name +#: model:ir.model.fields,field_description:kalachakra.field_kalachakra_membership__display_name #: model:ir.model.fields,field_description:kalachakra.field_kalachakra_partnerdraft__display_name #: model:ir.model.fields,field_description:kalachakra.field_kalachakra_partnerdraftfile__display_name #: model:ir.model.fields,field_description:kalachakra.field_kalachakra_partnerdraftfile_mapping__display_name #: model:ir.model.fields,field_description:kalachakra.field_payment_transaction__display_name +#: model:ir.model.fields,field_description:kalachakra.field_product_template__display_name msgid "Display Name" msgstr "Nom affiché" @@ -169,28 +193,30 @@ msgid "" "Firstname\n" " *" msgstr "" -"Prénom\n" -" *" #. module: kalachakra #: model:ir.model.fields,field_description:kalachakra.field_donation_donation__id #: model:ir.model.fields,field_description:kalachakra.field_event_event__id #: model:ir.model.fields,field_description:kalachakra.field_event_tag_category__id +#: model:ir.model.fields,field_description:kalachakra.field_kalachakra_membership__id #: model:ir.model.fields,field_description:kalachakra.field_kalachakra_partnerdraft__id #: model:ir.model.fields,field_description:kalachakra.field_kalachakra_partnerdraftfile__id #: model:ir.model.fields,field_description:kalachakra.field_kalachakra_partnerdraftfile_mapping__id #: model:ir.model.fields,field_description:kalachakra.field_payment_transaction__id +#: model:ir.model.fields,field_description:kalachakra.field_product_template__id msgid "ID" msgstr "" #. module: kalachakra #: code:addons/kalachakra/models/donation.py:0 +#: code:addons/kalachakra/models/membership.py:0 #, python-format msgid "Invalid token found! Token acquirer %s != %s" msgstr "" #. module: kalachakra #: code:addons/kalachakra/models/donation.py:0 +#: code:addons/kalachakra/models/membership.py:0 #, python-format msgid "Invalid token found! Token partner %s != %s" msgstr "" @@ -199,14 +225,17 @@ msgstr "" #: model:ir.model.fields,field_description:kalachakra.field_donation_donation____last_update #: model:ir.model.fields,field_description:kalachakra.field_event_event____last_update #: model:ir.model.fields,field_description:kalachakra.field_event_tag_category____last_update +#: model:ir.model.fields,field_description:kalachakra.field_kalachakra_membership____last_update #: model:ir.model.fields,field_description:kalachakra.field_kalachakra_partnerdraft____last_update #: model:ir.model.fields,field_description:kalachakra.field_kalachakra_partnerdraftfile____last_update #: model:ir.model.fields,field_description:kalachakra.field_kalachakra_partnerdraftfile_mapping____last_update #: model:ir.model.fields,field_description:kalachakra.field_payment_transaction____last_update +#: model:ir.model.fields,field_description:kalachakra.field_product_template____last_update msgid "Last Modified on" msgstr "Last Updated on" #. module: kalachakra +#: model:ir.model.fields,field_description:kalachakra.field_kalachakra_membership__write_uid #: model:ir.model.fields,field_description:kalachakra.field_kalachakra_partnerdraft__write_uid #: model:ir.model.fields,field_description:kalachakra.field_kalachakra_partnerdraftfile__write_uid #: model:ir.model.fields,field_description:kalachakra.field_kalachakra_partnerdraftfile_mapping__write_uid @@ -214,6 +243,7 @@ msgid "Last Updated by" msgstr "" #. module: kalachakra +#: model:ir.model.fields,field_description:kalachakra.field_kalachakra_membership__write_date #: model:ir.model.fields,field_description:kalachakra.field_kalachakra_partnerdraft__write_date #: model:ir.model.fields,field_description:kalachakra.field_kalachakra_partnerdraftfile__write_date #: model:ir.model.fields,field_description:kalachakra.field_kalachakra_partnerdraftfile_mapping__write_date @@ -237,6 +267,19 @@ msgstr "" msgid "Madame, Monsieur," msgstr "" +#. module: kalachakra +#: model:ir.model.fields,field_description:kalachakra.field_payment_transaction__membership_ids +msgid "Membership" +msgstr "Adhésion" + +#. module: kalachakra +#: model:ir.actions.act_window,name:kalachakra.membership_action +#: model:ir.ui.menu,name:kalachakra.membership_menu +#: model:ir.ui.menu,name:kalachakra.membership_title_menu +#: model:ir.ui.menu,name:kalachakra.membership_top_menu +msgid "Memberships" +msgstr "Adhésions" + #. module: kalachakra #: model_terms:ir.ui.view,arch_db:kalachakra.kalachakra_template_donation_tax_receipt msgid "Mode de versement : Chèque, prélèvement ou espèces" @@ -249,6 +292,12 @@ msgid "" " *" msgstr "" +#. module: kalachakra +#: code:addons/kalachakra/controllers/kalachakra.py:0 +#, python-format +msgid "No membership product, please add one" +msgstr "" + #. module: kalachakra #: model:ir.model.fields,field_description:kalachakra.field_kalachakra_partnerdraftfile__file_name msgid "Nom du fichier" @@ -289,6 +338,8 @@ msgstr "" #. module: kalachakra #: code:addons/kalachakra/models/donation.py:0 +#: code:addons/kalachakra/models/payment_transaction.py:0 +#: code:addons/kalachakra/models/payment_transaction.py:0 #, python-format msgid "Pay Now" msgstr "" @@ -305,24 +356,34 @@ msgstr "Transaction" #. module: kalachakra #: model_terms:ir.ui.view,arch_db:kalachakra.participation_form -msgid "Choix du paiement" +msgid "Payment choice" msgstr "" #. module: kalachakra #: model_terms:ir.ui.view,arch_db:kalachakra.participation_form msgid "Phone" -msgstr "Téléphone" +msgstr "" + +#. module: kalachakra +#: model:ir.model,name:kalachakra.model_product_template +msgid "Product Template" +msgstr "Modèle d'article" #. module: kalachakra #: model_terms:ir.ui.view,arch_db:kalachakra.event_view_form msgid "Remove event from google agenda" -msgstr "Suppriemr l'événement du calendrier google" +msgstr "Supprimer l'événement du calendrier google" #. module: kalachakra #: model_terms:ir.ui.view,arch_db:kalachakra.kalachakra_template_donation_tax_receipt msgid "Reçu de dons aux Œuvres" msgstr "" +#. module: kalachakra +#: model_terms:ir.ui.view,arch_db:kalachakra.view_membership_search +msgid "Search" +msgstr "" + #. module: kalachakra #: model_terms:ir.ui.view,arch_db:kalachakra.kalachakra_template_donation_tax_receipt msgid "Signature
" @@ -339,28 +400,26 @@ msgid "" "Street 1\n" " *" msgstr "" -"Rue 1\n" -" *" #. module: kalachakra #: model_terms:ir.ui.view,arch_db:kalachakra.participation_form msgid "Street 2" -msgstr "Rue 2" +msgstr "" #. module: kalachakra #: model_terms:ir.ui.view,arch_db:kalachakra.thankyou msgid "Thank you for your generosity !" -msgstr "Merci pour votre générosité!" +msgstr "" #. module: kalachakra #: model_terms:ir.ui.view,arch_db:kalachakra.participation_form msgid "Title *" -msgstr "Titre *" +msgstr "" #. module: kalachakra #: model_terms:ir.ui.view,arch_db:kalachakra.event_calendartui msgid "Today" -msgstr "Ajourd'hui" +msgstr "" #. module: kalachakra #: model_terms:ir.ui.view,arch_db:kalachakra.kalachakra_template_donation_tax_receipt @@ -370,7 +429,7 @@ msgstr "" #. module: kalachakra #: model_terms:ir.ui.view,arch_db:kalachakra.participation_form msgid "Zip" -msgstr "Code postal" +msgstr "" #. module: kalachakra #: model:ir.model.fields,field_description:kalachakra.field_kalachakra_partnerdraftfile__active @@ -380,7 +439,7 @@ msgstr "" #. module: kalachakra #: model_terms:ir.ui.view,arch_db:kalachakra.thankyou msgid "back Home" -msgstr "Page d'accueil" +msgstr "" #. module: kalachakra #: model:ir.model.fields,field_description:kalachakra.field_event_event__calendar_id @@ -392,11 +451,26 @@ msgstr "" msgid "coucou" msgstr "" +#. module: kalachakra +#: model:ir.model.fields.selection,name:kalachakra.selection__kalachakra_membership__state__done +msgid "done" +msgstr "payé" + +#. module: kalachakra +#: model:ir.model.fields.selection,name:kalachakra.selection__kalachakra_membership__state__draft +msgid "draft" +msgstr "brouillon" + #. module: kalachakra #: model:ir.model,name:kalachakra.model_kalachakra_partnerdraftfile msgid "draft partner file" msgstr "" +#. module: kalachakra +#: model:ir.model.fields,field_description:kalachakra.field_kalachakra_membership__end_date +msgid "end date" +msgstr "date de fin" + #. module: kalachakra #: model:ir.model.fields,field_description:kalachakra.field_event_event__event_id msgid "event id" @@ -422,20 +496,58 @@ msgstr "" msgid "import draft partner" msgstr "" +#. module: kalachakra +#: model:ir.model,name:kalachakra.model_kalachakra_membership +msgid "manage membership" +msgstr "gérer les adhésions" + +#. module: kalachakra +#: model:ir.model.fields,field_description:kalachakra.field_kalachakra_membership__product_id +#: model:ir.model.fields,field_description:kalachakra.field_product_product__membership_product +#: model:ir.model.fields,field_description:kalachakra.field_product_template__membership_product +msgid "membership product" +msgstr "produit d'adhésion" + +#. module: kalachakra +#: model_terms:ir.ui.view,arch_db:kalachakra.view_membership_search +msgid "memberships of the current year" +msgstr "adhésions de l'année civile en cours" + #. module: kalachakra #: model_terms:ir.ui.view,arch_db:kalachakra.event_calendartui msgid "next" -msgstr "suite" +msgstr "" #. module: kalachakra #: model:ir.model.fields,field_description:kalachakra.field_kalachakra_partnerdraftfile_mapping__odoo_field msgid "odoo field" msgstr "" +#. module: kalachakra +#: model:ir.model.fields,field_description:kalachakra.field_kalachakra_membership__partner_id +msgid "partner" +msgstr "Contact" + #. module: kalachakra #: model_terms:ir.ui.view,arch_db:kalachakra.event_calendartui msgid "prev" -msgstr "précédent" +msgstr "" + +#. module: kalachakra +#: model:ir.model.fields,field_description:kalachakra.field_kalachakra_membership__start_date +msgid "start date" +msgstr "Date début" + +#. module: kalachakra +#: model:ir.model.fields,field_description:kalachakra.field_kalachakra_membership__state +msgid "state" +msgstr "état" + +#. module: kalachakra +#: model:ir.model.fields,field_description:kalachakra.field_product_product__super_membership_product +#: model:ir.model.fields,field_description:kalachakra.field_product_template__super_membership_product +msgid "super membership product" +msgstr "produit membre de soutien" #. module: kalachakra #: model_terms:ir.ui.view,arch_db:kalachakra.kalachakra_template_donation_tax_receipt @@ -454,3 +566,8 @@ 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.view_membership_search +msgid "valid memberships" +msgstr "adhésions valides" \ No newline at end of file diff --git a/models/__init__.py b/models/__init__.py index f9a8345..a85bca6 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -4,4 +4,7 @@ from . import models from . import partnerimport from . import donation from . import event -#from . import partner \ No newline at end of file +from . import product +from . import membership +from . import payment_transaction +from . import partner \ No newline at end of file diff --git a/models/donation.py b/models/donation.py index c14102b..313452a 100644 --- a/models/donation.py +++ b/models/donation.py @@ -31,30 +31,7 @@ class PaymentTransaction(models.Model): class DonationDonation(models.Model): _inherit = 'donation.donation' - # payment_transaction_id = fields.Many2one('payment.transaction', string='Payment Transaction', readonly=True) - # payment_token_id = fields.Many2one( - # 'payment.token', string="Saved payment token", - # domain="""[ - # (payment_method_code == 'electronic', '=', 1), - # ('company_id', '=', company_id), - # ('acquirer_id.capture_manually', '=', False), - # ('acquirer_id.journal_id', '=', journal_id), - # ('partner_id', 'in', related_partner_ids), - # ]""", - # help="Note that tokens from acquirers set to only authorize transactions (instead of capturing the amount) are not available.") - # def _prepare_payment_transaction_vals(self): - # self.ensure_one() - # return { - # 'amount': self.amount, - # 'reference': self.ref, - # 'currency_id': self.currency_id.id, - # 'partner_id': self.partner_id.id, - # 'partner_country_id': self.partner_id.country_id.id, - # 'payment_token_id': self.payment_token_id.id, - # 'acquirer_id': self.payment_token_id.acquirer_id.id, - # 'payment_id': self.id, - # 'type': 'server2server', - # } + def _get_payment_type(self, tokenize=False): self.ensure_one() diff --git a/models/event.py b/models/event.py index 65b74d6..8baee90 100644 --- a/models/event.py +++ b/models/event.py @@ -12,7 +12,7 @@ import os.path from google.oauth2 import service_account from googleapiclient.discovery import build from datetime import datetime, timedelta - +import json # IF YOU MODIFY THE SCOPE DELETE THE TOKEN.TXT FILE SCOPES = ['https://www.googleapis.com/auth/calendar'] @@ -31,9 +31,11 @@ class EventEvent(models.Model): _description = 'Event' calendar_id=fields.Char('calendar id') - event_id=fields.Char('event id') + calendar_event_id=fields.Char('event id') def add_event_to_google_agenda(self): + + credentials = service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES) delegated_credentials = credentials.with_subject(SUBJECT) service = build('calendar', 'v3', credentials=delegated_credentials) @@ -47,7 +49,7 @@ class EventEvent(models.Model): end=self.date_end.isoformat() diff_date=self.date_end-self.date_begin if diff_date.days>0: - date_param=self.date_begin.strftime('%Y-%m-%d')+'-'+self.date_end.strftime('%Y-%m-%d') + date_param=self.date_begin.strftime('%Y-%m-%d')+'-'+self.date_end.strftime('%Y-%m-%d')+'-'+str(self.id) else: date_param=self.date_begin.strftime('%Y-%m-%d')+'-'+str(self.id) @@ -58,8 +60,8 @@ class EventEvent(models.Model): body={"summary": self.name, "description": description, - "start": {"dateTime": start, "timeZone": 'Asia/Karachi'}, - "end": {"dateTime": end, "timeZone": 'Asia/Karachi'}, + "start": {"dateTime": start, "timeZone": 'Europe/Paris'}, + "end": {"dateTime": end, "timeZone": 'Europe/Paris'}, } #recherche de l'id calendar lié à l'étiquette de l'événément @@ -67,7 +69,8 @@ class EventEvent(models.Model): if calendar_id: event = service.events().insert(calendarId=calendar_id, body=body).execute() - self.event_id=event['id'] + self.calendar_event_id=event['id'] + self.calendar_id=calendar_id else: raise Warning('no calendar id, please check configuration tags') @@ -76,13 +79,14 @@ class EventEvent(models.Model): delegated_credentials = credentials.with_subject(SUBJECT) service = build('calendar', 'v3', credentials=delegated_credentials) - - #recherche de l'id calendar lié à l'étiquette de l'événément - calendar_id=self.tag_ids.category_id.calendar_id - if calendar_id: - service.events().delete(calendarId=calendar_id, eventId=self.event_id).execute() - - self.event_id=False - else: - raise Warning('no calendar id, please check configuration tags') + + event = service.events().get(calendarId=self.calendar_id, eventId=self.calendar_event_id).execute() + #raise Warning(json.dumps(event, indent = 4) ) + if event['status'] != "cancelled" : + service.events().delete(calendarId=self.calendar_id, eventId=self.calendar_event_id).execute() + + self.calendar_event_id=False + self.calendar_id=False + + \ No newline at end of file diff --git a/models/membership.py b/models/membership.py new file mode 100644 index 0000000..6b549a4 --- /dev/null +++ b/models/membership.py @@ -0,0 +1,140 @@ +from odoo import models, fields, api +from dateutil.relativedelta import relativedelta +from datetime import datetime + +class kalachakra_membership(models.Model): + _name = 'kalachakra.membership' + _description = 'manage membership' + + + partner_id = fields.Many2one( + 'res.partner', + string='partner', + required=True, + index=True, + track_visibility='onchange', + ondelete='restrict' + ) + product_id=fields.Many2one('product.product',required=True,string='membership product',domain="[('membership_product','=',True)]") + start_date=fields.Date('start date',required=True,default=lambda self: fields.Date.today()) + + def _default_end_date(self): + + return datetime.now()+relativedelta(years=1) + + end_date=fields.Date('end date',required=True,default=_default_end_date) + state=fields.Selection(string='state',selection=[('draft', 'draft'), ('done', 'done')],default='draft') + currency_id = fields.Many2one( + "res.currency", + string="Currency", + required=True, + tracking=True, + ondelete="restrict", + default=lambda self: self.env.company.currency_id, + ) + + + amount = fields.Monetary( + string="Amount", + currency_field="currency_id", + readonly=True, + tracking=True, + + ) + + @api.onchange('product_id') + def onchange_product_id(self): + if self.product_id: + self.amount = self.product_id.list_price + + def _get_payment_type(self, tokenize=False): + self.ensure_one() + return 'form_save' if tokenize else 'form' + + def _create_payment_transaction(self, vals): + '''Similar to self.env['payment.transaction'].create(vals) but the values are filled with the + current membership fields (e.g. the partner or the currency). + :param vals: The values to create a new payment.transaction. + :return: The newly created payment.transaction record. + ''' + # Ensure the currencies are the same. + currency = self[0].currency_id + # if any(so.pricelist_id.currency_id != currency for so in self): + # raise ValidationError(_('A transaction can\'t be linked to sales orders having different currencies.')) + + # Ensure the partner are the same. + partner = self[0].partner_id + if any(so.partner_id != partner for so in self): + raise ValidationError(_('A transaction can\'t be linked to sales orders having different partners.')) + + # Try to retrieve the acquirer. However, fallback to the token's acquirer. + acquirer_id = vals.get('acquirer_id') + acquirer = False + payment_token_id = vals.get('payment_token_id') + + if payment_token_id: + payment_token = self.env['payment.token'].sudo().browse(payment_token_id) + + # Check payment_token/acquirer matching or take the acquirer from token + if acquirer_id: + acquirer = self.env['payment.acquirer'].browse(acquirer_id) + if payment_token and payment_token.acquirer_id != acquirer: + raise ValidationError(_('Invalid token found! Token acquirer %s != %s') % ( + payment_token.acquirer_id.name, acquirer.name)) + if payment_token and payment_token.partner_id != partner: + raise ValidationError(_('Invalid token found! Token partner %s != %s') % ( + payment_token.partner.name, partner.name)) + else: + acquirer = payment_token.acquirer_id + + # Check an acquirer is there. + if not acquirer_id and not acquirer: + raise ValidationError(_('A payment acquirer is required to create a transaction.')) + + if not acquirer: + acquirer = self.env['payment.acquirer'].browse(acquirer_id) + + # Check a journal is set on acquirer. + if not acquirer.journal_id: + raise ValidationError(_('A journal must be specified for the acquirer %s.', acquirer.name)) + + if not acquirer_id and acquirer: + vals['acquirer_id'] = acquirer.id + + vals.update({ + 'amount': sum(self.mapped('amount')), + 'currency_id': currency.id, + 'partner_id': partner.id, + 'membership_ids': [(6, 0, self.ids)], + 'type': self[0]._get_payment_type(vals.get('type')=='form_save'), + }) + + transaction = self.env['payment.transaction'].create(vals) + + # Process directly if payment_token + if transaction.payment_token_id: + transaction.s2s_do_transaction() + + return transaction + + # @api.model + # def create(self,vals): + + # res=super(kalachakra_membership, self).create(vals) + + # #on ajoute l'étiquette membre au contact + # #si l'étiquette membre n'existe pas on l'a créé ! + # label_member=self.env['res.partner.category'].search([('name','=','member')]) + # id_label_member=label_member.id + # if not label_member: + # vals={} + # vals['name']='member' + # res=self.env['res.partner.category'].create(vals) + # id_label_member=res.id + # partner=self.env['res.partner'].search([('id','=',int(self.partner_id))]) + # if partner: + # if id_label_member not in partner.category_id: + # partner.write({category_id:(4, id_label_member)}) + + + diff --git a/models/partner.py b/models/partner.py index f07b1b4..3d1ebd6 100644 --- a/models/partner.py +++ b/models/partner.py @@ -1,7 +1,7 @@ from odoo import models, fields, api from odoo.exceptions import UserError, ValidationError, Warning from psycopg2 import sql, DatabaseError - +from datetime import datetime from werkzeug import utils @@ -58,5 +58,25 @@ class partner(models.Model): ('refuge','Refuge'), ('zoom','zoom'), ],'Origine', index=True) + + date_adhesion=fields.Char(string='Date adhesion', readonly=True) + + def _compute_member_status(self): + for rec in self: + member=rec.env['kalachakra.membership'].search([('partner_id','=',rec.id),('end_date','<=',datetime.now())]) + if member : rec.member_status='member' + else :rec.member_status='not member' + if rec.super_member: rec.member_status='super member' + + member_status=fields.Selection(string='member status',selection=[('not member','Not member'),('member','Member'),('super member','Super member')] + ,compute="_compute_member_status", sotre=True) + + super_member=fields.Boolean("Super member") + + @api.onchange('super_member') + def onchange_super_member(self): + + self._compute_member_status() + - date_adhesion=fields.Char(string='Date adhesion', readonly=True) \ No newline at end of file + \ No newline at end of file diff --git a/models/payment_transaction.py b/models/payment_transaction.py new file mode 100644 index 0000000..71a0423 --- /dev/null +++ b/models/payment_transaction.py @@ -0,0 +1,48 @@ +from odoo import models, fields, api,_ +from odoo.exceptions import UserError, ValidationError,Warning +from psycopg2 import sql, DatabaseError +from datetime import datetime + +from werkzeug import utils +import base64 + +class PaymentTransaction(models.Model): + _inherit = 'payment.transaction' + + donation_ids = fields.Many2many('donation.donation', 'donation_transaction_rel', 'transaction_id', 'donation_id', + string='Donations', copy=False, readonly=True) + + membership_ids = fields.Many2many('kalachakra.membership', 'membership_transaction_rel', 'transaction_id', 'membership_id', + string='Membership', copy=False, readonly=True) + + + def render_donation_button(self, donation, submit_txt=None, render_values=None): + values = { + 'partner_id': donation.partner_id.id, + 'type': self.type, + } + if render_values: + values.update(render_values) + # Not very elegant to do that here but no choice regarding the design. + self._log_payment_transaction_sent() + return self.acquirer_id.with_context(submit_class='btn btn-primary', submit_txt=submit_txt or _('Pay Now')).sudo().render( + self.reference, + donation.amount_total, + donation.currency_id.id, + values=values, + ) + def render_membership_button(self, membership, submit_txt=None, render_values=None): + values = { + 'partner_id': membership.partner_id.id, + 'type': self.type, + } + if render_values: + values.update(render_values) + # Not very elegant to do that here but no choice regarding the design. + self._log_payment_transaction_sent() + return self.acquirer_id.with_context(submit_class='btn btn-primary', submit_txt=submit_txt or _('Pay Now')).sudo().render( + self.reference, + membership.amount, + membership.currency_id.id, + values=values, + ) \ No newline at end of file diff --git a/models/product.py b/models/product.py new file mode 100644 index 0000000..e537831 --- /dev/null +++ b/models/product.py @@ -0,0 +1,13 @@ +from odoo import models, fields, api +from odoo.exceptions import UserError, ValidationError +from psycopg2 import sql, DatabaseError + +from werkzeug import utils + + +class ProductTemplate(models.Model): + _inherit = "product.template" + + membership_product = fields.Boolean(string="membership product", tracking=True) + super_membership_product = fields.Boolean(string="super membership product", tracking=True) + \ No newline at end of file diff --git a/security/ir.model.access.csv b/security/ir.model.access.csv index 97dd8b9..277b982 100644 --- a/security/ir.model.access.csv +++ b/security/ir.model.access.csv @@ -1 +1,4 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink + +access_kalachakra_membership,kalachakra.membership,model_kalachakra_membership,base.group_user,1,1,1,1 + diff --git a/static/description/membership.png b/static/description/membership.png new file mode 100644 index 0000000..973df20 Binary files /dev/null and b/static/description/membership.png differ diff --git a/views/event.xml b/views/event.xml index 500854f..4f8d370 100644 --- a/views/event.xml +++ b/views/event.xml @@ -21,8 +21,9 @@ -