- Add mypy.ini configuration to exclude migration scripts - Rename migration files to proper snake_case (post-migration.py → post_migration.py) - Add __init__.py to migration directories for proper Python package structure - Add new portal access tests for website_sale_aplicoop - Code formatting improvements (black, isort) - Update copilot instructions and project configuration Related to previous code quality refactoring work.
208 lines
7.1 KiB
Python
208 lines
7.1 KiB
Python
# Copyright 2025 Criptomart
|
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
|
|
|
|
from datetime import datetime
|
|
from datetime import timedelta
|
|
|
|
from odoo.exceptions import ValidationError
|
|
from odoo.tests.common import TransactionCase
|
|
|
|
|
|
class TestMultiCompanyGroupOrder(TransactionCase):
|
|
"""Test suite para el soporte multicompañía en group.order."""
|
|
|
|
def setUp(self):
|
|
super().setUp()
|
|
|
|
# Crear dos compañías
|
|
self.company1 = self.env["res.company"].create(
|
|
{
|
|
"name": "Company 1",
|
|
}
|
|
)
|
|
self.company2 = self.env["res.company"].create(
|
|
{
|
|
"name": "Company 2",
|
|
}
|
|
)
|
|
|
|
# Crear grupos en diferentes compañías
|
|
self.group1 = self.env["res.partner"].create(
|
|
{
|
|
"name": "Grupo Company 1",
|
|
"is_company": True,
|
|
"email": "grupo1@test.com",
|
|
"company_id": self.company1.id,
|
|
}
|
|
)
|
|
|
|
self.group2 = self.env["res.partner"].create(
|
|
{
|
|
"name": "Grupo Company 2",
|
|
"is_company": True,
|
|
"email": "grupo2@test.com",
|
|
"company_id": self.company2.id,
|
|
}
|
|
)
|
|
|
|
# Crear productos en cada compañía
|
|
self.product1 = self.env["product.product"].create(
|
|
{
|
|
"name": "Producto Company 1",
|
|
"type": "consu",
|
|
"list_price": 10.0,
|
|
"company_id": self.company1.id,
|
|
}
|
|
)
|
|
|
|
self.product2 = self.env["product.product"].create(
|
|
{
|
|
"name": "Producto Company 2",
|
|
"type": "consu",
|
|
"list_price": 20.0,
|
|
"company_id": self.company2.id,
|
|
}
|
|
)
|
|
|
|
def test_group_order_has_company_id(self):
|
|
"""Test que group.order tenga el campo company_id."""
|
|
order = self.env["group.order"].create(
|
|
{
|
|
"name": "Pedido Company 1",
|
|
"group_ids": [(6, 0, [self.group1.id])],
|
|
"company_id": self.company1.id,
|
|
"type": "regular",
|
|
"start_date": datetime.now().date(),
|
|
"end_date": (datetime.now() + timedelta(days=7)).date(),
|
|
"period": "weekly",
|
|
"pickup_day": "5",
|
|
"cutoff_day": "0",
|
|
}
|
|
)
|
|
|
|
self.assertTrue(order.exists())
|
|
self.assertEqual(order.company_id, self.company1)
|
|
|
|
def test_group_order_default_company(self):
|
|
"""Test que company_id por defecto sea la compañía del usuario."""
|
|
# Crear usuario con compañía específica
|
|
user = self.env["res.users"].create(
|
|
{
|
|
"name": "Test User",
|
|
"login": "testuser",
|
|
"password": "test123",
|
|
"company_id": self.company1.id,
|
|
"company_ids": [(6, 0, [self.company1.id])],
|
|
}
|
|
)
|
|
|
|
order = (
|
|
self.env["group.order"]
|
|
.with_user(user)
|
|
.create(
|
|
{
|
|
"name": "Pedido Default Company",
|
|
"group_ids": [(6, 0, [self.group1.id])],
|
|
"type": "regular",
|
|
"start_date": datetime.now().date(),
|
|
"end_date": (datetime.now() + timedelta(days=7)).date(),
|
|
"period": "weekly",
|
|
"pickup_day": "5",
|
|
"cutoff_day": "0",
|
|
}
|
|
)
|
|
)
|
|
|
|
# Verificar que se asignó la compañía del usuario
|
|
self.assertEqual(order.company_id, self.company1)
|
|
|
|
def test_group_order_company_constraint(self):
|
|
"""Test que solo grupos de la misma compañía se puedan asignar."""
|
|
# Intentar asignar un grupo de otra compañía
|
|
with self.assertRaises(ValidationError):
|
|
self.env["group.order"].create(
|
|
{
|
|
"name": "Pedido Mixed Companies",
|
|
"group_ids": [(6, 0, [self.group1.id, self.group2.id])],
|
|
"company_id": self.company1.id,
|
|
"type": "regular",
|
|
"start_date": datetime.now().date(),
|
|
"end_date": (datetime.now() + timedelta(days=7)).date(),
|
|
"period": "weekly",
|
|
"pickup_day": "5",
|
|
"cutoff_day": "0",
|
|
}
|
|
)
|
|
|
|
def test_group_order_multi_company_filter(self):
|
|
"""Test que get_active_orders_for_week() respete company_id."""
|
|
# Crear órdenes en diferentes compañías
|
|
order1 = self.env["group.order"].create(
|
|
{
|
|
"name": "Pedido Company 1",
|
|
"group_ids": [(6, 0, [self.group1.id])],
|
|
"company_id": self.company1.id,
|
|
"type": "regular",
|
|
"state": "open",
|
|
"start_date": datetime.now().date(),
|
|
"end_date": (datetime.now() + timedelta(days=7)).date(),
|
|
"period": "weekly",
|
|
"pickup_day": "5",
|
|
"cutoff_day": "0",
|
|
}
|
|
)
|
|
|
|
self.env["group.order"].create(
|
|
{
|
|
"name": "Pedido Company 2",
|
|
"group_ids": [(6, 0, [self.group2.id])],
|
|
"company_id": self.company2.id,
|
|
"type": "regular",
|
|
"state": "open",
|
|
"start_date": datetime.now().date(),
|
|
"end_date": (datetime.now() + timedelta(days=7)).date(),
|
|
"period": "weekly",
|
|
"pickup_day": "5",
|
|
"cutoff_day": "0",
|
|
}
|
|
)
|
|
|
|
# Obtener órdenes activas de company1
|
|
active_orders = (
|
|
self.env["group.order"]
|
|
.with_context(allowed_company_ids=[self.company1.id])
|
|
.get_active_orders_for_week()
|
|
)
|
|
|
|
# Debería contener solo order1
|
|
self.assertIn(order1, active_orders)
|
|
# order2 podría no estar en el resultado si se implementa
|
|
# el filtro de compañía correctamente
|
|
|
|
def test_product_company_isolation(self):
|
|
"""Test que los productos de diferentes compañías estén aislados."""
|
|
# Crear categoría para products
|
|
category = self.env["product.category"].create(
|
|
{
|
|
"name": "Test Category",
|
|
}
|
|
)
|
|
|
|
order = self.env["group.order"].create(
|
|
{
|
|
"name": "Pedido con Categoría",
|
|
"group_ids": [(6, 0, [self.group1.id])],
|
|
"category_ids": [(6, 0, [category.id])],
|
|
"company_id": self.company1.id,
|
|
"type": "regular",
|
|
"start_date": datetime.now().date(),
|
|
"end_date": (datetime.now() + timedelta(days=7)).date(),
|
|
"period": "weekly",
|
|
"pickup_day": "5",
|
|
"cutoff_day": "0",
|
|
}
|
|
)
|
|
|
|
self.assertTrue(order.exists())
|
|
self.assertEqual(order.company_id, self.company1)
|
|
self.assertIn(category, order.category_ids)
|