Initial commit: Odoo 18.0-20251222 extra-addons
Some checks failed
pre-commit / pre-commit (push) Has been cancelled
tests / Detect unreleased dependencies (push) Has been cancelled
tests / test with OCB (push) Has been cancelled
tests / test with Odoo (push) Has been cancelled

This commit is contained in:
tocmo0nlord
2026-03-13 20:43:25 +00:00
parent 36e847a7df
commit adbe430761
9472 changed files with 1265727 additions and 0 deletions

View File

@@ -0,0 +1,6 @@
# Copyright 2024 Akretion - Olivier Nibart
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from . import test_res_partner_primeship
from . import test_sale_order_primeship
from . import test_sale_primeship

View File

@@ -0,0 +1,48 @@
# Copyright 2024 Akretion - Olivier Nibart
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo.addons.base.tests.common import BaseCommon
class TestCommon(BaseCommon):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.SalePrimeship = cls.env["sale.primeship"]
cls.SaleOrderLine = cls.env["sale.order.line"]
cls.Partner = cls.env["res.partner"]
cls.product = cls.env["product.template"].create(
{
"name": "Primeship Product",
"primeship_activation": True,
"primeship_duration": 6,
}
)
cls.order = (
cls.env["sale.order"]
.with_context(disable_cancel_warning=True)
.create(
{
"partner_id": cls.partner.id,
}
)
)
def make_primeship(self, start_date, end_date, order_line_id=None):
return self.SalePrimeship.create(
{
"partner_id": self.partner.id,
"start_date": start_date,
"end_date": end_date,
"order_line_id": order_line_id.id if order_line_id else False,
}
)
def make_order_line(self):
return self.SaleOrderLine.create(
{
"order_id": self.order.id,
"product_id": self.product.product_variant_id.id,
"product_uom_qty": 1,
}
)

View File

@@ -0,0 +1,61 @@
# Copyright 2024 Akretion - Olivier Nibart
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from datetime import date, timedelta
from .common import TestCommon
class TestResPartnerPrimeship(TestCommon):
def test_compute_active_primeship(self):
active_primeship = self.make_primeship(
date.today() - timedelta(days=1), date.today() + timedelta(days=30)
)
self.assertTrue(active_primeship.current)
self.partner._compute_active_primeship()
self.assertTrue(self.partner.active_primeship)
expired_primeship = self.make_primeship(
date.today() - timedelta(days=60), date.today() - timedelta(days=30)
)
self.assertFalse(expired_primeship.current)
self.partner._compute_active_primeship()
# Still true due to active primeship
self.assertTrue(self.partner.active_primeship)
active_primeship.active = False
self.partner._compute_active_primeship()
self.assertFalse(self.partner.active_primeship)
def test_compute_primeship_count(self):
self.assertEqual(self.partner.primeship_count, 0)
self.make_primeship(date.today(), date.today() + timedelta(days=30))
self.partner._compute_primeship_count()
self.assertEqual(self.partner.primeship_count, 1)
self.make_primeship(
date.today() + timedelta(days=31), date.today() + timedelta(days=60)
)
self.partner._compute_primeship_count()
self.assertEqual(self.partner.primeship_count, 2)
def test_check_expired_primeships(self):
primeship = self.make_primeship(
date.today() - timedelta(days=1), date.today() + timedelta(days=30)
)
self.assertTrue(self.partner.active_primeship)
self.Partner._check_expired_primeships()
self.assertTrue(self.partner.active_primeship)
primeship.start_date = date.today() + timedelta(days=1)
self.assertFalse(self.partner.active_primeship)
self.partner.active_primeship = True
self.Partner._check_expired_primeships()
self.assertFalse(self.partner.active_primeship)
# work also on inactive partners
self.partner.active = False
self.partner.active_primeship = True
self.Partner._check_expired_primeships()
self.assertFalse(self.partner.active_primeship)

View File

@@ -0,0 +1,94 @@
# Copyright 2024 Akretion - Olivier Nibart
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from datetime import date
from dateutil.relativedelta import relativedelta
from .common import TestCommon
class TestSaleOrderPrimeship(TestCommon):
def test_action_confirm_creates_primeship(self):
order_line = self.make_order_line()
self.order.action_confirm()
self.assertTrue(order_line.primeship_id)
self.assertEqual(order_line.primeship_id.partner_id, self.partner)
self.assertEqual(order_line.primeship_id.order_line_id, order_line)
self.assertEqual(order_line.primeship_id.start_date, date.today())
self.assertEqual(
order_line.primeship_id.end_date,
order_line.primeship_id.start_date + relativedelta(months=6),
)
def test_action_confirm_extends_existing_primeship(self):
existing_primeship = self.make_primeship(
date.today() - relativedelta(months=3),
date.today() + relativedelta(months=3),
)
order_line = self.make_order_line()
self.order.action_confirm()
self.assertEqual(
order_line.primeship_id.start_date, existing_primeship.end_date
)
self.assertEqual(
order_line.primeship_id.end_date,
order_line.primeship_id.start_date + relativedelta(months=6),
)
def test_action_cancel_deactivates_primeship(self):
order_line = self.make_order_line()
self.order.action_confirm()
original_primeship = order_line.primeship_id
self.assertTrue(original_primeship.active)
self.order.action_cancel()
self.assertFalse(original_primeship.active)
def test_action_confirm_with_existing_primeship(self):
order_line = self.make_order_line()
self.order.action_confirm()
original_primeship = order_line.primeship_id
self.order.action_cancel()
# recomputing the primeship_id will detach
# the deactivated primeship from the order line
order_line._compute_primeship_id()
self.assertFalse(order_line.primeship_id)
self.order.action_draft()
self.assertFalse(original_primeship.active)
# we should now retrieve the deactivated primeship
# and reactivate it
self.order.action_confirm()
self.assertTrue(order_line.primeship_id.active)
self.assertEqual(order_line.primeship_id.id, original_primeship.id)
self.order.action_cancel()
# we do not recompute the primeship_id so even though it is
# deactivated, order_line.primeship_id is still pointing at it
self.assertEqual(order_line.primeship_id.id, original_primeship.id)
self.order.action_draft()
# we should now use the still attached deactivated primeship
# and reactivate it
self.order.action_confirm()
self.assertTrue(original_primeship.active)
self.assertEqual(order_line.primeship_id.id, original_primeship.id)
def test_prepare_invoice_line_with_primeship(self):
order_line = self.make_order_line()
self.order.action_confirm()
invoice_line_vals = order_line._prepare_invoice_line()
self.assertEqual(
invoice_line_vals["start_date"], order_line.primeship_id.start_date
)
self.assertEqual(
invoice_line_vals["end_date"], order_line.primeship_id.end_date
)

View File

@@ -0,0 +1,85 @@
# Copyright 2024 Akretion - Olivier Nibart
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from datetime import date, timedelta
import psycopg2
from odoo import fields
from odoo.exceptions import ValidationError
from odoo.tools.misc import mute_logger
from .common import TestCommon
class TestSalePrimeship(TestCommon):
def test_compute_name(self):
primeship = self.make_primeship("2024-01-01", "2024-12-31")
self.assertEqual(primeship.name, "2024-01-01 - 2024-12-31 Primeship")
def test_compute_current(self):
today = date.today()
primeship_current = self.make_primeship(
today - timedelta(days=1), today + timedelta(days=1)
)
primeship_past = self.make_primeship(
today - timedelta(days=10), today - timedelta(days=1)
)
primeship_future = self.make_primeship(
today + timedelta(days=1), today + timedelta(days=10)
)
self.assertTrue(primeship_current.current)
self.assertFalse(primeship_past.current)
self.assertFalse(primeship_future.current)
def test_check_end_date(self):
with self.assertRaises(ValidationError):
self.make_primeship("2023-12-31", "2023-01-01")
def test_overlapping_primeships(self):
self.make_primeship("2023-01-01", "2023-06-30")
with self.assertRaises(ValidationError):
self.make_primeship("2023-06-01", "2023-12-31")
def test_non_overlapping_primeships(self):
primeship1 = self.make_primeship("2023-01-01", "2023-06-30")
primeship2 = self.make_primeship("2023-07-01", "2023-12-31")
self.assertTrue(primeship1.id)
self.assertTrue(primeship2.id)
def test_overlaps_method(self):
primeship = self.make_primeship("2023-01-01", "2023-12-31")
self.assertTrue(
primeship.overlaps(
fields.Date.to_date("2023-06-01"), fields.Date.to_date("2023-07-01")
)
)
self.assertTrue(
primeship.overlaps(
fields.Date.to_date("2022-06-01"), fields.Date.to_date("2023-02-01")
)
)
self.assertTrue(
primeship.overlaps(
fields.Date.to_date("2023-12-01"), fields.Date.to_date("2024-01-01")
)
)
self.assertFalse(
primeship.overlaps(
fields.Date.to_date("2022-01-01"), fields.Date.to_date("2022-12-31")
)
)
self.assertFalse(
primeship.overlaps(
fields.Date.to_date("2024-01-01"), fields.Date.to_date("2024-12-31")
)
)
def test_sale_order_line_sale_primeship_o2o_relation_sql_constraint(self):
order_line = self.make_order_line()
self.make_primeship("2023-01-01", "2023-12-31", order_line_id=order_line)
with self.assertRaises(psycopg2.IntegrityError):
with mute_logger("odoo.sql_db"), self.cr.savepoint():
self.make_primeship(
"2024-01-01", "2024-12-31", order_line_id=order_line
)