mirror of
https://github.com/bringout/oca-ocb-sale.git
synced 2026-04-27 03:52:02 +02:00
19.0 vanilla
This commit is contained in:
parent
79f83631d5
commit
73afc09215
6267 changed files with 1534193 additions and 1130106 deletions
|
|
@ -1,4 +1,5 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
from . import main
|
||||
from . import payment
|
||||
from . import sale
|
||||
|
|
|
|||
|
|
@ -2,23 +2,14 @@
|
|||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from collections import defaultdict
|
||||
from odoo import _
|
||||
from odoo.http import request, route
|
||||
|
||||
from odoo.addons.portal.controllers.portal import CustomerPortal
|
||||
from odoo.addons.website_event.controllers.main import WebsiteEventController
|
||||
|
||||
|
||||
class WebsiteEventSaleController(WebsiteEventController):
|
||||
|
||||
@route()
|
||||
def event_register(self, event, **post):
|
||||
event = event.with_context(pricelist=request.website.id)
|
||||
if not request.context.get('pricelist'):
|
||||
pricelist = request.website.pricelist_id
|
||||
if pricelist:
|
||||
event = event.with_context(pricelist=pricelist.id)
|
||||
return super().event_register(event, **post)
|
||||
|
||||
def _process_tickets_form(self, event, form_details):
|
||||
""" Add price information on ticket order """
|
||||
res = super()._process_tickets_form(event, form_details)
|
||||
|
|
@ -31,34 +22,42 @@ class WebsiteEventSaleController(WebsiteEventController):
|
|||
if not any(info.get('event_ticket_id') for info in registration_data):
|
||||
return super()._create_attendees_from_registration_post(event, registration_data)
|
||||
|
||||
order_sudo = request.website.sale_get_order(force_create=True)
|
||||
if order_sudo.state != 'draft':
|
||||
request.website.sale_reset()
|
||||
order_sudo = request.website.sale_get_order(force_create=True)
|
||||
event_ticket_ids = [registration['event_ticket_id'] for registration in registration_data if registration.get('event_ticket_id')]
|
||||
event_ticket_by_id = {
|
||||
event_ticket.id: event_ticket
|
||||
for event_ticket in request.env['event.event.ticket'].sudo().browse(event_ticket_ids)
|
||||
}
|
||||
|
||||
if all(event_ticket.price == 0 for event_ticket in event_ticket_by_id.values()) and not request.cart.id:
|
||||
# all chosen tickets are free AND no existing SO -> skip SO and payment process
|
||||
return super()._create_attendees_from_registration_post(event, registration_data)
|
||||
|
||||
order_sudo = request.cart or request.website._create_cart()
|
||||
tickets_data = defaultdict(int)
|
||||
for data in registration_data:
|
||||
event_ticket_id = data.get('event_ticket_id')
|
||||
event_slot_id = data.get('event_slot_id', False)
|
||||
event_ticket_id = data.get('event_ticket_id', False)
|
||||
if event_ticket_id:
|
||||
tickets_data[event_ticket_id] += 1
|
||||
tickets_data[event_slot_id, event_ticket_id] += 1
|
||||
|
||||
cart_data = {}
|
||||
for ticket_id, count in tickets_data.items():
|
||||
ticket_sudo = request.env['event.event.ticket'].sudo().browse(ticket_id)
|
||||
cart_values = order_sudo._cart_update(
|
||||
for (slot_id, ticket_id), count in tickets_data.items():
|
||||
ticket_sudo = event_ticket_by_id.get(ticket_id)
|
||||
cart_values = order_sudo._cart_add(
|
||||
product_id=ticket_sudo.product_id.id,
|
||||
add_qty=count,
|
||||
quantity=count,
|
||||
event_ticket_id=ticket_id,
|
||||
event_slot_id=slot_id,
|
||||
)
|
||||
cart_data[ticket_id] = cart_values['line_id']
|
||||
cart_data[slot_id, ticket_id] = cart_values['line_id']
|
||||
|
||||
for data in registration_data:
|
||||
event_ticket_id = data.get('event_ticket_id')
|
||||
if event_ticket_id:
|
||||
event_slot_id = data.get('event_slot_id', False)
|
||||
event_ticket_id = data.get('event_ticket_id', False)
|
||||
event_ticket = event_ticket_by_id.get(event_ticket_id)
|
||||
if event_ticket:
|
||||
data['sale_order_id'] = order_sudo.id
|
||||
data['sale_order_line_id'] = cart_data[event_ticket_id]
|
||||
|
||||
request.session['website_sale_cart_quantity'] = order_sudo.cart_quantity
|
||||
data['sale_order_line_id'] = cart_data[event_slot_id, event_ticket_id]
|
||||
|
||||
return super()._create_attendees_from_registration_post(event, registration_data)
|
||||
|
||||
|
|
@ -67,15 +66,30 @@ class WebsiteEventSaleController(WebsiteEventController):
|
|||
res = super().registration_confirm(event, **post)
|
||||
|
||||
registrations = self._process_attendees_form(event, post)
|
||||
order_sudo = request.cart
|
||||
if not any(line.event_ticket_id for line in order_sudo.order_line):
|
||||
# order does not contain any tickets, meaning we are confirming a free event
|
||||
return res
|
||||
|
||||
# we have at least one registration linked to a ticket -> sale mode activate
|
||||
if any(info['event_ticket_id'] for info in registrations):
|
||||
order_sudo = request.website.sale_get_order()
|
||||
if order_sudo.amount_total:
|
||||
return request.redirect("/shop/checkout")
|
||||
# free tickets -> order with amount = 0: auto-confirm, no checkout
|
||||
elif order_sudo:
|
||||
if order_sudo._is_anonymous_cart():
|
||||
booked_by_partner, feedback_dict = CustomerPortal()._create_or_update_address(
|
||||
request.env['res.partner'].sudo(),
|
||||
order_sudo=order_sudo,
|
||||
verify_address_values=False,
|
||||
**registrations[0]
|
||||
)
|
||||
if not feedback_dict.get('invalid_fields'):
|
||||
order_sudo._update_address(booked_by_partner.id, ['partner_id'])
|
||||
request.session['sale_last_order_id'] = order_sudo.id
|
||||
return request.redirect("/shop/checkout?try_skip_step=true")
|
||||
else:
|
||||
# Free order -> auto confirmation without checkout
|
||||
order_sudo.action_confirm() # tde notsure: email sending ?
|
||||
request.website.sale_reset()
|
||||
request.session['sale_last_order_id'] = order_sudo.id
|
||||
return request.redirect("/shop/confirmation")
|
||||
|
||||
return res
|
||||
|
|
|
|||
|
|
@ -0,0 +1,32 @@
|
|||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from odoo.http import request
|
||||
|
||||
from odoo.addons.website_sale.controllers.payment import PaymentPortal
|
||||
|
||||
|
||||
class PaymentPortalOnsite(PaymentPortal):
|
||||
|
||||
def _validate_transaction_for_order(self, transaction, sale_order):
|
||||
"""
|
||||
Throws a ValidationError if the user tries to pay for a ticket which isn't available
|
||||
"""
|
||||
super()._validate_transaction_for_order(transaction, sale_order)
|
||||
registration_domain = [
|
||||
('sale_order_id', '=', sale_order.id),
|
||||
('event_ticket_id', '!=', False),
|
||||
('state', '!=', 'cancel'),
|
||||
]
|
||||
registrations_per_event = request.env['event.registration'].sudo()._read_group(
|
||||
registration_domain,
|
||||
['event_id'], ['id:recordset']
|
||||
)
|
||||
for event, registrations in registrations_per_event:
|
||||
count_per_slot_ticket = request.env['event.registration'].sudo()._read_group(
|
||||
[('id', 'in', registrations.ids)],
|
||||
['event_slot_id', 'event_ticket_id'], ['__count']
|
||||
)
|
||||
event._verify_seats_availability([
|
||||
(slot, ticket, count)
|
||||
for slot, ticket, count in count_per_slot_ticket
|
||||
])
|
||||
|
|
@ -2,6 +2,7 @@
|
|||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from odoo.addons.website_sale.controllers.main import WebsiteSale
|
||||
from odoo.http import request
|
||||
|
||||
|
||||
class WebsiteEventSale(WebsiteSale):
|
||||
|
|
@ -10,4 +11,22 @@ class WebsiteEventSale(WebsiteSale):
|
|||
values = super(WebsiteEventSale,
|
||||
self)._prepare_shop_payment_confirmation_values(order)
|
||||
values['events'] = order.order_line.event_id
|
||||
attendee_per_event_read_group = request.env['event.registration'].sudo()._read_group(
|
||||
[('sale_order_id', '=', order.id), ('state', 'in', ['open', 'done'])],
|
||||
groupby=['event_id'],
|
||||
aggregates=['id:recordset'],
|
||||
)
|
||||
# Get attendees and urls per event, also per slot if the event is multi slots
|
||||
values['attendee_ids_per_event'] = {
|
||||
event: regs.grouped('event_slot_id') if event.is_multi_slots else regs
|
||||
for event, regs in attendee_per_event_read_group
|
||||
}
|
||||
values['urls_per_event'] = {
|
||||
event.id: {
|
||||
slot.id: event._get_event_resource_urls(slot=slot)
|
||||
for slot in value.grouped('event_slot_id')
|
||||
} if event.is_multi_slots else event._get_event_resource_urls()
|
||||
for event, value in attendee_per_event_read_group
|
||||
}
|
||||
|
||||
return values
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue