mirror of
https://github.com/bringout/oca-ocb-sale.git
synced 2026-04-27 02:12:05 +02:00
19.0 vanilla
This commit is contained in:
parent
79f83631d5
commit
73afc09215
6267 changed files with 1534193 additions and 1130106 deletions
|
|
@ -1,7 +1,7 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from . import common
|
||||
from . import test_frontend_buy_tickets
|
||||
from . import test_website_event_sale_cart
|
||||
from . import test_website_event_sale_pricelist
|
||||
from . import test_website_event_sale
|
||||
|
|
|
|||
|
|
@ -1,17 +1,17 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from datetime import timedelta
|
||||
|
||||
from odoo.fields import Datetime
|
||||
from odoo.tests.common import TransactionCase
|
||||
from odoo.fields import Command, Datetime
|
||||
|
||||
from odoo.addons.website_sale.tests.common import WebsiteSaleCommon
|
||||
|
||||
|
||||
class TestWebsiteEventSaleCommon(TransactionCase):
|
||||
class TestWebsiteEventSaleCommon(WebsiteSaleCommon):
|
||||
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
super(TestWebsiteEventSaleCommon, cls).setUpClass()
|
||||
super().setUpClass()
|
||||
|
||||
cls.env.company.country_id = cls.env.ref('base.us')
|
||||
cls.currency_test = cls.env['res.currency'].create({
|
||||
|
|
@ -19,7 +19,6 @@ class TestWebsiteEventSaleCommon(TransactionCase):
|
|||
'rounding': 0.01,
|
||||
'symbol': 'EX',
|
||||
})
|
||||
cls.partner = cls.env['res.partner'].create({'name': 'test'})
|
||||
cls.env['res.currency.rate'].search([]).unlink()
|
||||
cls.rate = cls.env['res.currency.rate'].create({
|
||||
'company_id': cls.env.company.id,
|
||||
|
|
@ -30,51 +29,63 @@ class TestWebsiteEventSaleCommon(TransactionCase):
|
|||
cls.zero_tax = cls.env['account.tax'].sudo().create({
|
||||
'name': 'Tax 0',
|
||||
'amount': 0,
|
||||
'tax_group_id': cls.env['account.tax.group'].create({
|
||||
'name': 'Text Tax Group',
|
||||
'company_id': cls.env.company.id,
|
||||
}).id
|
||||
})
|
||||
cls.product_event = cls.env['product.product'].create({
|
||||
'detailed_type': 'event',
|
||||
'type': 'service',
|
||||
'service_tracking': 'event',
|
||||
'list_price': 100,
|
||||
'name': 'Event Registration No Company Assigned',
|
||||
'taxes_id': [(6, 0, cls.zero_tax.ids)],
|
||||
'taxes_id': [Command.set(cls.zero_tax.ids)],
|
||||
})
|
||||
|
||||
cls.event = cls.env['event.event'].create({
|
||||
'date_begin': (Datetime.today() + timedelta(days=5)).strftime('%Y-%m-%d 07:00:00'),
|
||||
'date_end': (Datetime.today() + timedelta(days=5)).strftime('%Y-%m-%d 16:30:00'),
|
||||
'name': 'Pycon',
|
||||
'user_id': cls.env.ref('base.user_admin').id,
|
||||
'website_published': True,
|
||||
})
|
||||
cls.ticket = cls.env['event.event.ticket'].create([{
|
||||
'event_id': cls.event.id,
|
||||
'name': 'Standard',
|
||||
'product_id': cls.product_event.id,
|
||||
'price': 100,
|
||||
}])
|
||||
cls.event, cls.event_2 = cls.env['event.event'].create([
|
||||
{
|
||||
'date_begin': (Datetime.today() + timedelta(days=5)).strftime('%Y-%m-%d 07:00:00'),
|
||||
'date_end': (Datetime.today() + timedelta(days=5)).strftime('%Y-%m-%d 16:30:00'),
|
||||
'name': 'Pycon',
|
||||
'user_id': cls.env.ref('base.user_admin').id,
|
||||
'website_published': True,
|
||||
},
|
||||
{
|
||||
'date_begin': (Datetime.today() + timedelta(days=5)).strftime('%Y-%m-%d 07:00:00'),
|
||||
'date_end': (Datetime.today() + timedelta(days=5)).strftime('%Y-%m-%d 16:30:00'),
|
||||
'name': 'Conference for Architects TEST',
|
||||
'user_id': cls.env.ref('base.user_admin').id,
|
||||
'website_published': True,
|
||||
}
|
||||
])
|
||||
cls.ticket, cls.ticket_2 = cls.env['event.event.ticket'].create([
|
||||
{
|
||||
'event_id': cls.event.id,
|
||||
'name': 'Standard',
|
||||
'product_id': cls.product_event.id,
|
||||
'price': 100,
|
||||
},
|
||||
{
|
||||
'event_id': cls.event_2.id,
|
||||
'name': 'Standard',
|
||||
'product_id': cls.product_event.id,
|
||||
'price': 1000,
|
||||
}
|
||||
])
|
||||
|
||||
cls.current_website = cls.env['website'].get_current_website()
|
||||
cls.pricelist = cls.current_website.get_current_pricelist()
|
||||
|
||||
cls.so = cls.env['sale.order'].create({
|
||||
'company_id': cls.env.company.id,
|
||||
'partner_id': cls.partner.id,
|
||||
'pricelist_id': cls.pricelist.id,
|
||||
})
|
||||
|
||||
def create_pricelist(currency, name, policy):
|
||||
def create_pricelist(currency, name):
|
||||
return cls.env['product.pricelist'].create({
|
||||
'currency_id': currency.id,
|
||||
'discount_policy': policy,
|
||||
'item_ids': [(5, 0, 0), (0, 0, {
|
||||
'applied_on': '3_global',
|
||||
'compute_price': 'percentage',
|
||||
'percent_price': 10,
|
||||
})],
|
||||
'item_ids': [
|
||||
Command.create({
|
||||
'applied_on': '3_global',
|
||||
'compute_price': 'percentage',
|
||||
'percent_price': 10,
|
||||
}),
|
||||
],
|
||||
'name': name,
|
||||
'selectable': True,
|
||||
})
|
||||
|
||||
cls.pricelist_with_discount = create_pricelist(currency=cls.env.company.currency_id, name='EUR With Discount Included', policy='with_discount')
|
||||
cls.pricelist_without_discount = create_pricelist(currency=cls.env.company.currency_id, name='EUR Without Discount Included', policy='without_discount')
|
||||
cls.ex_pricelist_with_discount = create_pricelist(currency=cls.currency_test, name='EX With Discount Included', policy='with_discount')
|
||||
cls.ex_pricelist_without_discount = create_pricelist(currency=cls.currency_test, name='EX Without Discount Included', policy='without_discount')
|
||||
cls.pricelist_without_discount = create_pricelist(currency=cls.env.company.currency_id, name='EUR Without Discount Included')
|
||||
cls.ex_pricelist_without_discount = create_pricelist(currency=cls.currency_test, name='EX Without Discount Included')
|
||||
|
|
|
|||
|
|
@ -1,94 +1,86 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
import odoo.tests
|
||||
|
||||
from datetime import timedelta
|
||||
|
||||
from odoo.addons.base.tests.common import HttpCaseWithUserDemo
|
||||
from odoo.addons.website_event_sale.tests.common import TestWebsiteEventSaleCommon
|
||||
from odoo import Command
|
||||
from odoo.exceptions import ValidationError
|
||||
from odoo.fields import Datetime
|
||||
from odoo.tests import JsonRpcException, tagged
|
||||
from odoo.tools import mute_logger
|
||||
|
||||
from odoo.addons.base.tests.common import HttpCaseWithUserDemo
|
||||
from odoo.addons.payment.tests.http_common import PaymentHttpCommon
|
||||
from .common import TestWebsiteEventSaleCommon
|
||||
|
||||
|
||||
@odoo.tests.common.tagged('post_install', '-at_install')
|
||||
@tagged('post_install', '-at_install')
|
||||
class TestUi(HttpCaseWithUserDemo, TestWebsiteEventSaleCommon):
|
||||
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
|
||||
if self.env['ir.module.module']._get('payment_custom').state != 'installed':
|
||||
self.skipTest("Transfer provider is not installed")
|
||||
|
||||
self.env.ref('payment.payment_provider_transfer').write({
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
super().setUpClass()
|
||||
|
||||
cls.env.ref('payment.payment_provider_transfer').write({
|
||||
'state': 'enabled',
|
||||
'is_published': True,
|
||||
})
|
||||
|
||||
self.event_2 = self.env['event.event'].create({
|
||||
'name': 'Conference for Architects TEST',
|
||||
'user_id': self.env.ref('base.user_admin').id,
|
||||
'date_begin': (Datetime.today() + timedelta(days=5)).strftime('%Y-%m-%d 07:00:00'),
|
||||
'date_end': (Datetime.today() + timedelta(days=5)).strftime('%Y-%m-%d 16:30:00'),
|
||||
'website_published': True,
|
||||
})
|
||||
|
||||
self.env['event.event.ticket'].create([{
|
||||
'name': 'Standard',
|
||||
'event_id': self.event_2.id,
|
||||
'product_id': self.env.ref('event_sale.product_product_event').id,
|
||||
'start_sale_datetime': (Datetime.today() - timedelta(days=5)).strftime('%Y-%m-%d 07:00:00'),
|
||||
'end_sale_datetime': (Datetime.today() + timedelta(90)).strftime('%Y-%m-%d'),
|
||||
'price': 1000.0,
|
||||
}, {
|
||||
cls.env['event.event.ticket'].create({
|
||||
'name': 'VIP',
|
||||
'event_id': self.event_2.id,
|
||||
'product_id': self.env.ref('event_sale.product_product_event').id,
|
||||
'event_id': cls.event_2.id,
|
||||
'product_id': cls.env.ref('event_product.product_product_event').id,
|
||||
'end_sale_datetime': (Datetime.today() + timedelta(90)).strftime('%Y-%m-%d'),
|
||||
'price': 1500.0,
|
||||
}])
|
||||
'seats_max': 12,
|
||||
'limit_max_per_order': 11,
|
||||
})
|
||||
|
||||
self.event_3 = self.env['event.event'].create({
|
||||
cls.event_3 = cls.env['event.event'].create({
|
||||
'name': 'Last ticket test',
|
||||
'user_id': self.env.ref('base.user_admin').id,
|
||||
'user_id': cls.env.ref('base.user_admin').id,
|
||||
'date_begin': (Datetime.today() + timedelta(days=5)).strftime('%Y-%m-%d 07:00:00'),
|
||||
'date_end': (Datetime.today() + timedelta(days=5)).strftime('%Y-%m-%d 16:30:00'),
|
||||
'website_published': True,
|
||||
})
|
||||
|
||||
self.env['event.event.ticket'].create([{
|
||||
cls.env['event.event.ticket'].create([{
|
||||
'name': 'VIP',
|
||||
'event_id': self.event_3.id,
|
||||
'product_id': self.env.ref('event_sale.product_product_event').id,
|
||||
'event_id': cls.event_3.id,
|
||||
'product_id': cls.env.ref('event_product.product_product_event').id,
|
||||
'end_sale_datetime': (Datetime.today() + timedelta(90)).strftime('%Y-%m-%d'),
|
||||
'price': 1500.0,
|
||||
'seats_max': 2,
|
||||
}])
|
||||
|
||||
# flush event to ensure having tickets available in the tests
|
||||
self.env.flush_all()
|
||||
cls.env.flush_all()
|
||||
|
||||
(self.env.ref('base.partner_admin') + self.partner_demo).write({
|
||||
(cls.env.ref('base.partner_admin') + cls.partner_demo).write({
|
||||
'street': '215 Vine St',
|
||||
'city': 'Scranton',
|
||||
'zip': '18503',
|
||||
'country_id': self.env.ref('base.us').id,
|
||||
'state_id': self.env.ref('base.state_us_39').id,
|
||||
'country_id': cls.env.ref('base.us').id,
|
||||
'state_id': cls.env.ref('base.state_us_39').id,
|
||||
'phone': '+1 555-555-5555',
|
||||
'email': 'admin@yourcompany.example.com',
|
||||
})
|
||||
|
||||
self.env['account.journal'].create({'name': 'Cash - Test', 'type': 'cash', 'code': 'CASH - Test'})
|
||||
cls.env['account.journal'].create({'name': 'Cash - Test', 'type': 'cash', 'code': 'CASH - Test'})
|
||||
|
||||
def test_admin(self):
|
||||
if self.env['ir.module.module']._get('payment_custom').state != 'installed':
|
||||
self.skipTest("Transfer provider is not installed")
|
||||
|
||||
self.env['product.pricelist'].with_context(active_test=False).search([]).unlink()
|
||||
# Seen that:
|
||||
# - this test relies on demo data that are entirely in USD (pricelists)
|
||||
# - that main demo company is gelocated in US
|
||||
# - that this test awaits for hardcoded USDs amount
|
||||
# we have to force company currency as USDs only for this test
|
||||
self.cr.execute("UPDATE res_company SET currency_id = %s WHERE id = %s", [self.env.ref('base.USD').id, self.env.ref('base.main_company').id])
|
||||
self.env['product.pricelist'].create({'name': "Public Pricelist"})
|
||||
|
||||
transfer_provider = self.env.ref('payment.payment_provider_transfer')
|
||||
transfer_provider.write({
|
||||
|
|
@ -100,9 +92,7 @@ class TestUi(HttpCaseWithUserDemo, TestWebsiteEventSaleCommon):
|
|||
self.start_tour("/", 'event_buy_tickets', login="admin")
|
||||
|
||||
def test_demo(self):
|
||||
if self.env['ir.module.module']._get('payment_custom').state != 'installed':
|
||||
self.skipTest("Transfer provider is not installed")
|
||||
|
||||
self.env['product.pricelist'].with_context(active_test=False).search([]).unlink()
|
||||
transfer_provider = self.env.ref('payment.payment_provider_transfer')
|
||||
transfer_provider.write({
|
||||
'state': 'enabled',
|
||||
|
|
@ -110,12 +100,12 @@ class TestUi(HttpCaseWithUserDemo, TestWebsiteEventSaleCommon):
|
|||
})
|
||||
transfer_provider._transfer_ensure_pending_msg_is_set()
|
||||
|
||||
# Ensure the use of USD (company currency)
|
||||
self.env['product.pricelist'].create({'name': "Public Pricelist"})
|
||||
|
||||
self.start_tour("/", 'event_buy_tickets', login="demo")
|
||||
|
||||
def test_buy_last_ticket(self):
|
||||
if self.env['ir.module.module']._get('payment_custom').state != 'installed':
|
||||
self.skipTest("Transfer provider is not installed")
|
||||
|
||||
transfer_provider = self.env.ref('payment.payment_provider_transfer')
|
||||
transfer_provider.write({
|
||||
'state': 'enabled',
|
||||
|
|
@ -126,5 +116,125 @@ class TestUi(HttpCaseWithUserDemo, TestWebsiteEventSaleCommon):
|
|||
self.start_tour("/", 'event_buy_last_ticket')
|
||||
|
||||
def test_pricelists_different_currencies(self):
|
||||
self.env.user.group_ids += self.env.ref('product.group_product_pricelist')
|
||||
self.start_tour("/", 'event_sale_pricelists_different_currencies', login='admin')
|
||||
# TO DO - add public test with new address when convert to web.tour format.
|
||||
|
||||
|
||||
@tagged('post_install', '-at_install')
|
||||
class TestRoutes(HttpCaseWithUserDemo, TestWebsiteEventSaleCommon, PaymentHttpCommon):
|
||||
|
||||
@mute_logger('odoo.http')
|
||||
def test_check_seats_avail_before_purchase(self):
|
||||
"""Check that payments fails when there aren't enough seats available.
|
||||
- First check payment fails due to exceeding the ticket's limit
|
||||
- Then change to 2 unlimited tickets, which fails due to exceeding event limit
|
||||
- Finally do a successful purchase of a single ticket without limit
|
||||
"""
|
||||
self.authenticate(None, None)
|
||||
|
||||
sale_order = self.empty_cart
|
||||
|
||||
self.ticket_2.write({
|
||||
'name': "VIP",
|
||||
'event_id': self.event.id,
|
||||
'seats_max': 1,
|
||||
'seats_limited': True,
|
||||
})
|
||||
self.event.write({
|
||||
'seats_max': 3,
|
||||
'seats_limited': True,
|
||||
})
|
||||
self.assertFalse(self.ticket.seats_limited)
|
||||
self.assertEqual(self.ticket_2.seats_available, 1)
|
||||
self.assertEqual(self.event.seats_available, 3)
|
||||
|
||||
# Add VIP ticket to cart & create draft registration
|
||||
sale_order.order_line = [Command.create({
|
||||
'product_id': self.ticket.product_id.id,
|
||||
'event_id': self.event.id,
|
||||
'event_ticket_id': self.ticket_2.id,
|
||||
})]
|
||||
registration = self.env['event.registration'].create({
|
||||
'state': 'draft',
|
||||
'partner_id': sale_order.partner_id.id,
|
||||
'event_id': self.event.id,
|
||||
'event_ticket_id': self.ticket_2.id,
|
||||
'sale_order_id': sale_order.id,
|
||||
})
|
||||
self.assertEqual(self.event.seats_taken, 0)
|
||||
self.assertEqual(self.event.event_ticket_ids.mapped('seats_taken'), [0, 0])
|
||||
|
||||
# Sneaky Mitchell beats us to the punch
|
||||
self.event.registration_ids = [Command.create({
|
||||
'partner_id': self.partner_admin.id,
|
||||
'event_ticket_id': self.ticket_2.id,
|
||||
'state': 'done',
|
||||
})]
|
||||
self.assertEqual(self.event.seats_taken, 1)
|
||||
self.assertEqual(self.event.seats_available, 2)
|
||||
|
||||
# Set up transaction values
|
||||
url = self._build_url(f'/shop/payment/transaction/{sale_order.id}')
|
||||
route_kwargs = {
|
||||
'provider_id': self.provider.id,
|
||||
'payment_method_id': self.payment_method.id,
|
||||
'token_id': None,
|
||||
'flow': 'direct',
|
||||
'tokenization_requested': False,
|
||||
'landing_route': '/shop/payment/validate',
|
||||
'access_token': sale_order._portal_ensure_token(),
|
||||
}
|
||||
|
||||
# Payment should fail due to exceeding the VIP ticket limit
|
||||
with self.assertRaisesRegex(JsonRpcException, r'odoo\.exceptions\.ValidationError'):
|
||||
self.make_jsonrpc_request(url, route_kwargs)
|
||||
# Double check that we hit the correct limit for ticket
|
||||
with self.assertRaises(ValidationError):
|
||||
self.event._verify_seats_availability([
|
||||
(slot, ticket, 1)
|
||||
for slot, ticket in self.env['event.registration']._read_group(
|
||||
[('id', 'in', self.event.registration_ids.ids)],
|
||||
['event_slot_id', 'event_ticket_id']
|
||||
)
|
||||
])
|
||||
|
||||
# Replace VIP ticket with 2 regular tickets
|
||||
sale_order.order_line.write({
|
||||
'product_id': self.ticket.product_id.id,
|
||||
'product_uom_qty': 2,
|
||||
'event_id': self.event.id,
|
||||
'event_ticket_id': self.ticket.id,
|
||||
})
|
||||
registration.event_ticket_id = self.ticket.id
|
||||
registration += registration.copy({'state': 'draft', 'sale_order_id': sale_order.id})
|
||||
|
||||
# Sneaky Mitchell beats us to the punch again
|
||||
self.event.registration_ids = [Command.create({
|
||||
'partner_id': self.partner_admin.id,
|
||||
'event_ticket_id': self.ticket.id,
|
||||
'state': 'done',
|
||||
})]
|
||||
self.assertEqual(self.event.seats_taken, 2)
|
||||
self.assertEqual(self.event.seats_available, 1)
|
||||
|
||||
# Payment should fail due to exceeding the event seat limit
|
||||
with self.assertRaisesRegex(JsonRpcException, r'odoo\.exceptions\.ValidationError'):
|
||||
self.make_jsonrpc_request(url, route_kwargs)
|
||||
# Double check that we hit the correct limit for event
|
||||
with self.assertRaises(ValidationError):
|
||||
self.event._verify_seats_availability([
|
||||
(slot, ticket, 2)
|
||||
for slot, ticket in self.env['event.registration']._read_group(
|
||||
[('id', 'in', self.event.registration_ids.ids)],
|
||||
['event_slot_id', 'event_ticket_id']
|
||||
)
|
||||
])
|
||||
|
||||
# Payment should succeed when buying only one ticket
|
||||
sale_order.order_line.product_uom_qty = 1
|
||||
registration[1].unlink()
|
||||
self.make_jsonrpc_request(url, route_kwargs)
|
||||
registration.exists().write({'state': 'open'})
|
||||
self.assertEqual(self.ticket.seats_taken, 2)
|
||||
self.assertEqual(self.event.seats_taken, 3)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,63 @@
|
|||
from odoo import http
|
||||
from odoo.addons.base.tests.common import HttpCaseWithUserPortal
|
||||
from odoo.addons.website_event_sale.tests.common import TestWebsiteEventSaleCommon
|
||||
|
||||
|
||||
class TestWebsiteEventSale(HttpCaseWithUserPortal, TestWebsiteEventSaleCommon):
|
||||
|
||||
def test_website_event_sale_free_tickets(self):
|
||||
""" Test saleorder is not created for tickets free tickets """
|
||||
self.authenticate(None, None)
|
||||
free_ticket = self.env['event.event.ticket'].create({
|
||||
'event_id': self.event.id,
|
||||
'name': 'Free',
|
||||
'product_id': self.product_event.id,
|
||||
'price': 0,
|
||||
})
|
||||
event_questions = self.event.question_ids
|
||||
event_registration_count = len(self.event.registration_ids)
|
||||
name_question = event_questions.filtered(lambda q: q.question_type == 'name')
|
||||
email_question = event_questions.filtered(lambda q: q.question_type == 'email')
|
||||
phone_question = event_questions.filtered(lambda q: q.question_type == 'phone')
|
||||
existing_so = self.env['sale.order'].search([])
|
||||
self.url_open(f'/event/{self.event.id}/registration/confirm', data={
|
||||
f'1-name-{name_question.id}': 'Bob',
|
||||
f'1-email-{email_question.id}': 'bob@test.lan',
|
||||
f'1-phone-{phone_question.id}': '8989898989',
|
||||
'1-event_ticket_id': free_ticket.id,
|
||||
'csrf_token': http.Request.csrf_token(self),
|
||||
})
|
||||
self.assertEqual(self.env['sale.order'].search([]), existing_so, "Sale order should not be created for the free tickets")
|
||||
self.assertEqual(len(self.event.registration_ids), event_registration_count + 1)
|
||||
|
||||
def test_website_event_sale_free_paid_mix(self):
|
||||
""" Test saleorder is created if paid ticket selected """
|
||||
self.authenticate(None, None)
|
||||
free_ticket = self.env['event.event.ticket'].create({
|
||||
'event_id': self.event.id,
|
||||
'name': 'Free',
|
||||
'product_id': self.product_event.id,
|
||||
'price': 0,
|
||||
})
|
||||
event_questions = self.event.question_ids
|
||||
event_registration_count = len(self.event.registration_ids)
|
||||
name_question = event_questions.filtered(lambda q: q.question_type == 'name')
|
||||
email_question = event_questions.filtered(lambda q: q.question_type == 'email')
|
||||
phone_question = event_questions.filtered(lambda q: q.question_type == 'phone')
|
||||
self.url_open(f'/event/{self.event.id}/registration/confirm', data={
|
||||
f'1-name-{name_question.id}': 'Bob',
|
||||
f'1-email-{email_question.id}': 'bob@test.lan',
|
||||
f'1-phone-{phone_question.id}': '8989898989',
|
||||
'1-event_ticket_id': self.ticket.id,
|
||||
f'2-name-{name_question.id}': 'joe',
|
||||
f'2-email-{email_question.id}': 'joe@test.lan',
|
||||
f'2-phone-{phone_question.id}': '8989898988',
|
||||
'2-event_ticket_id': free_ticket.id,
|
||||
'csrf_token': http.Request.csrf_token(self),
|
||||
})
|
||||
|
||||
self.assertEqual(len(self.event.registration_ids), event_registration_count + 2)
|
||||
self.assertTrue(self.env['sale.order'].search([
|
||||
('order_line.event_ticket_id', '=', self.ticket.id),
|
||||
('order_line.event_ticket_id', '=', free_ticket.id)
|
||||
]), "Sale order should be created for the free/paid tickets mix")
|
||||
|
|
@ -1,5 +1,7 @@
|
|||
from datetime import datetime, timedelta
|
||||
|
||||
from odoo import Command
|
||||
from odoo.tests import tagged
|
||||
from odoo.tests import tagged, Form
|
||||
|
||||
from odoo.addons.website_event_sale.tests.common import TestWebsiteEventSaleCommon
|
||||
from odoo.addons.website_sale.tests.test_website_sale_cart_abandoned import (
|
||||
|
|
@ -9,13 +11,29 @@ from odoo.addons.website_sale.tests.test_website_sale_cart_abandoned import (
|
|||
|
||||
@tagged('post_install', '-at_install')
|
||||
class TestWebsiteEventSaleCart(TestWebsiteEventSaleCommon, TestWebsiteSaleCartAbandonedCommon):
|
||||
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
super().setUpClass()
|
||||
|
||||
cls.website.write({
|
||||
'send_abandoned_cart_email': True,
|
||||
'cart_abandoned_delay': 1.0, # 1 hour
|
||||
})
|
||||
cls.website.send_abandoned_cart_email_activation_time -= timedelta(weeks=1)
|
||||
|
||||
cls.partner_admin = cls.env.ref('base.partner_admin')
|
||||
if not cls.partner_admin.email:
|
||||
cls.partner_admin.email = 'base@partner.admin'
|
||||
|
||||
def test_sold_out_event_cart_reminder(self):
|
||||
"""Check that abandoned cart emails aren't sent for sold out tickets."""
|
||||
cart1, cart2 = carts = self.so1before + self.so2before
|
||||
carts.order_line.unlink()
|
||||
carts.website_id.send_abandoned_cart_email = True
|
||||
cart1, cart2 = self.env['sale.order'].create([{
|
||||
'partner_id': partner.id,
|
||||
'website_id': self.website.id,
|
||||
'date_order': datetime.now() - timedelta(hours=2),
|
||||
} for partner in (self.partner_admin, self.partner_portal)])
|
||||
|
||||
self.event.auto_confirm = True
|
||||
self.ticket.write({
|
||||
'seats_limited': True,
|
||||
'seats_max': 1,
|
||||
|
|
@ -34,9 +52,11 @@ class TestWebsiteEventSaleCart(TestWebsiteEventSaleCommon, TestWebsiteSaleCartAb
|
|||
)
|
||||
|
||||
# Create registrations & confirm first order
|
||||
editor = self.env['registration.editor'].new()
|
||||
editor.with_context(default_sale_order_id=cart1.id).action_make_registration()
|
||||
editor = Form(self.env['registration.editor'].with_context(default_sale_order_id=cart1.id))
|
||||
editor.save().action_make_registration()
|
||||
cart1.action_confirm()
|
||||
# command-created records won't trigger a recompute until flush
|
||||
self.env.flush_all()
|
||||
self.assertEqual(self.ticket.seats_available, 0)
|
||||
self.assertFalse(
|
||||
self.send_mail_patched(cart2.id),
|
||||
|
|
|
|||
|
|
@ -1,69 +1,51 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from odoo.addons.website_sale.controllers.main import WebsiteSale
|
||||
from odoo.addons.website.tools import MockRequest
|
||||
from odoo.addons.website_event_sale.tests.common import TestWebsiteEventSaleCommon
|
||||
from odoo.fields import Command
|
||||
from odoo.tests import tagged
|
||||
|
||||
from odoo.addons.website_event_sale.tests.common import TestWebsiteEventSaleCommon
|
||||
from odoo.addons.website_sale.controllers.main import WebsiteSale
|
||||
from odoo.addons.website_sale.tests.common import MockRequest
|
||||
|
||||
|
||||
@tagged('post_install', '-at_install')
|
||||
class TestWebsiteEventPriceList(TestWebsiteEventSaleCommon):
|
||||
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
super(TestWebsiteEventPriceList, cls).setUpClass()
|
||||
super().setUpClass()
|
||||
|
||||
cls.WebsiteSaleController = WebsiteSale()
|
||||
|
||||
def test_pricelist_different_currency(self):
|
||||
|
||||
self.env['product.pricelist'].search([('id', '!=', self.pricelist.id)]).action_archive()
|
||||
self.pricelist.write({
|
||||
'currency_id': self.env.company.currency_id.id,
|
||||
'item_ids': [Command.clear()],
|
||||
'name': 'No discount',
|
||||
})
|
||||
so_line = self.env['sale.order.line'].create({
|
||||
'event_id': self.event.id,
|
||||
'event_ticket_id': self.ticket.id,
|
||||
'name': self.event.name,
|
||||
'order_id': self.so.id,
|
||||
'order_id': self.empty_cart.id,
|
||||
'product_id': self.ticket.product_id.id,
|
||||
'product_uom_qty': 1,
|
||||
})
|
||||
# set pricelist to 0 - currency: company
|
||||
self.pricelist.write({
|
||||
'currency_id': self.env.company.currency_id.id,
|
||||
'discount_policy': 'with_discount',
|
||||
'item_ids': [(5, 0, 0), (0, 0, {
|
||||
'applied_on': '3_global',
|
||||
'compute_price': 'percentage',
|
||||
'percent_price': 0,
|
||||
})],
|
||||
'name': 'With Discount Included',
|
||||
})
|
||||
with MockRequest(self.env, sale_order_id=self.so.id, website=self.current_website):
|
||||
self.WebsiteSaleController.pricelist(promo=None)
|
||||
self.so._cart_update(line_id=so_line.id, product_id=self.ticket.product_id.id, set_qty=1)
|
||||
self.assertEqual(so_line.price_reduce, 100)
|
||||
self.assertEqual(so_line.price_reduce_taxexcl, 100)
|
||||
|
||||
# set pricelist to 10% - without discount
|
||||
self.pricelist.write({
|
||||
pl2 = self.pricelist.copy({
|
||||
'currency_id': self.currency_test.id,
|
||||
'discount_policy': 'without_discount',
|
||||
'item_ids': [(5, 0, 0), (0, 0, {
|
||||
'applied_on': '3_global',
|
||||
'compute_price': 'percentage',
|
||||
'percent_price': 10,
|
||||
})],
|
||||
'name': 'Without Discount Included',
|
||||
'name': 'Percentage Discount',
|
||||
'selectable': True,
|
||||
})
|
||||
with MockRequest(self.env, sale_order_id=self.so.id, website=self.current_website):
|
||||
self.WebsiteSaleController.pricelist(promo=None)
|
||||
self.so._cart_update(line_id=so_line.id, product_id=self.ticket.product_id.id, set_qty=1)
|
||||
self.assertEqual(so_line.price_reduce, 900, 'Incorrect amount based on the pricelist and its currency.')
|
||||
|
||||
# set pricelist to 10% - with discount
|
||||
self.pricelist.write({
|
||||
'discount_policy': 'with_discount',
|
||||
'name': 'With Discount Included',
|
||||
})
|
||||
with MockRequest(self.env, sale_order_id=self.so.id, website=self.current_website):
|
||||
self.WebsiteSaleController.pricelist(promo=None)
|
||||
self.so._cart_update(line_id=so_line.id, product_id=self.ticket.product_id.id, set_qty=1)
|
||||
self.assertEqual(so_line.price_reduce, 900, 'Incorrect amount based on the pricelist and its currency.')
|
||||
with MockRequest(self.env, website=self.website, sale_order_id=self.empty_cart.id) as req:
|
||||
self.assertEqual(req.pricelist, self.pricelist)
|
||||
self.WebsiteSaleController.pricelist_change(pl2)
|
||||
self.assertEqual(so_line.price_reduce_taxexcl, 900, 'Incorrect amount based on the pricelist and its currency.')
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue