diff --git a/website_sale_aplicoop/controllers/website_sale.py b/website_sale_aplicoop/controllers/website_sale.py
index 3d7a051..f3675c4 100644
--- a/website_sale_aplicoop/controllers/website_sale.py
+++ b/website_sale_aplicoop/controllers/website_sale.py
@@ -929,6 +929,26 @@ class AplicoopWebsiteSale(WebsiteSale):
Returns the sale.order record.
"""
+ # consumer_group_id comes directly from group_order (first/only group)
+ # No calculations - data propagates directly from the order context
+ consumer_group_id = (
+ group_order.group_ids[0].id if group_order.group_ids else False
+ )
+
+ _logger.info(
+ "[CONSUMER_GROUP DEBUG] _create_or_update_sale_order: "
+ "group_order=%s, group_order.group_ids=%s, consumer_group_id=%s",
+ group_order.id,
+ group_order.group_ids.ids,
+ consumer_group_id,
+ )
+
+ # commitment_date: use provided or calculate from group_order
+ if not commitment_date:
+ commitment_date = (
+ group_order.delivery_date if is_delivery else group_order.pickup_date
+ )
+
if existing_order:
# Update existing order with new lines and propagate fields
# Use sudo() to avoid permission issues with portal users
@@ -939,13 +959,15 @@ class AplicoopWebsiteSale(WebsiteSale):
existing_order_sudo.pickup_day = group_order.pickup_day
existing_order_sudo.pickup_date = group_order.pickup_date
existing_order_sudo.home_delivery = is_delivery
+ existing_order_sudo.consumer_group_id = consumer_group_id
if commitment_date:
existing_order_sudo.commitment_date = commitment_date
_logger.info(
- "Updated existing sale.order %d: commitment_date=%s, home_delivery=%s",
+ "Updated existing sale.order %d: commitment_date=%s, home_delivery=%s, consumer_group_id=%s",
existing_order.id,
commitment_date,
is_delivery,
+ consumer_group_id,
)
return existing_order
@@ -957,6 +979,7 @@ class AplicoopWebsiteSale(WebsiteSale):
"pickup_day": group_order.pickup_day,
"pickup_date": group_order.pickup_date,
"home_delivery": is_delivery,
+ "consumer_group_id": consumer_group_id,
}
if commitment_date:
order_vals["commitment_date"] = commitment_date
@@ -974,11 +997,12 @@ class AplicoopWebsiteSale(WebsiteSale):
# Create order with sudo to avoid permission issues with portal users
sale_order = request.env["sale.order"].sudo().create(order_vals)
_logger.info(
- "sale.order created successfully: %d with group_order_id=%d, pickup_day=%s, home_delivery=%s",
+ "sale.order created successfully: %d with group_order_id=%d, pickup_day=%s, home_delivery=%s, consumer_group_id=%s",
sale_order.id,
group_order.id,
group_order.pickup_day,
group_order.home_delivery,
+ consumer_group_id,
)
return sale_order
@@ -989,27 +1013,39 @@ class AplicoopWebsiteSale(WebsiteSale):
Returns created sale.order record.
"""
+ # consumer_group_id comes directly from group_order (first/only group)
+ # No calculations - data propagates directly from the order context
+ consumer_group_id = (
+ group_order.group_ids[0].id if group_order.group_ids else False
+ )
+
+ _logger.info(
+ "[CONSUMER_GROUP DEBUG] _create_draft_sale_order: "
+ "group_order=%s, group_order.group_ids=%s, consumer_group_id=%s",
+ group_order.id,
+ group_order.group_ids.ids,
+ consumer_group_id,
+ )
+
+ # commitment_date comes from group_order (delivery_date or pickup_date)
+ commitment_date = (
+ group_order.delivery_date
+ if group_order.home_delivery
+ else group_order.pickup_date
+ )
+
order_vals = {
"partner_id": current_user.partner_id.id,
"order_line": sale_order_lines,
"state": "draft",
"group_order_id": order_id,
+ "pickup_day": group_order.pickup_day,
+ "pickup_date": group_order.pickup_date,
+ "home_delivery": group_order.home_delivery,
+ "consumer_group_id": consumer_group_id,
+ "commitment_date": commitment_date,
}
- # Propagate fields from group order
- if group_order.pickup_day:
- order_vals["pickup_day"] = group_order.pickup_day
- if group_order.pickup_date:
- order_vals["pickup_date"] = group_order.pickup_date
- if group_order.home_delivery:
- order_vals["home_delivery"] = group_order.home_delivery
-
- # Add commitment/commitment_date if provided
- if pickup_date:
- order_vals["commitment_date"] = pickup_date
- elif group_order.pickup_date:
- order_vals["commitment_date"] = group_order.pickup_date
-
# Get salesperson for order creation (portal users need this)
salesperson = self._get_salesperson_for_order(current_user.partner_id)
if salesperson:
@@ -1233,7 +1269,30 @@ class AplicoopWebsiteSale(WebsiteSale):
existing_drafts,
order_id,
):
- """Replace existing draft (if any) with new lines, else create it."""
+ """Replace existing draft (if any) with new lines, else create it.
+
+ All fields (commitment_date, consumer_group_id, etc.) come from group_order.
+ """
+ # consumer_group_id comes directly from group_order (first/only group)
+ # No calculations - data propagates directly from the order context
+ consumer_group_id = (
+ group_order.group_ids[0].id if group_order.group_ids else False
+ )
+
+ _logger.info(
+ "[CONSUMER_GROUP DEBUG] _merge_or_replace_draft: "
+ "group_order=%s, group_order.group_ids=%s, consumer_group_id=%s",
+ group_order.id,
+ group_order.group_ids.ids,
+ consumer_group_id,
+ )
+
+ # commitment_date comes directly from group_order
+ commitment_date = (
+ group_order.delivery_date
+ if group_order.home_delivery
+ else group_order.pickup_date
+ )
if existing_drafts:
draft = existing_drafts[0].sudo()
@@ -1249,6 +1308,8 @@ class AplicoopWebsiteSale(WebsiteSale):
"pickup_day": group_order.pickup_day,
"pickup_date": group_order.pickup_date,
"home_delivery": group_order.home_delivery,
+ "consumer_group_id": consumer_group_id,
+ "commitment_date": commitment_date,
}
)
return draft
@@ -1261,6 +1322,8 @@ class AplicoopWebsiteSale(WebsiteSale):
"pickup_day": group_order.pickup_day,
"pickup_date": group_order.pickup_date,
"home_delivery": group_order.home_delivery,
+ "consumer_group_id": consumer_group_id,
+ "commitment_date": commitment_date,
}
# Get salesperson for order creation (portal users need this)
salesperson = self._get_salesperson_for_order(current_user.partner_id)
diff --git a/website_sale_aplicoop/models/res_partner_extension.py b/website_sale_aplicoop/models/res_partner_extension.py
index ab5b825..132bed6 100644
--- a/website_sale_aplicoop/models/res_partner_extension.py
+++ b/website_sale_aplicoop/models/res_partner_extension.py
@@ -18,14 +18,26 @@ class ResPartner(models.Model):
)
# Relación para los miembros de un grupo (si is_group es True)
+ # Este campo se usa en el GRUPO para listar sus MIEMBROS
member_ids = fields.Many2many(
"res.partner",
"res_partner_group_members_rel",
"group_id",
"member_id",
+ string="Members",
+ help="Members that belong to this consumer group",
+ )
+
+ # Relación inversa: grupos a los que pertenece un MIEMBRO
+ # Este campo se usa en el MIEMBRO para listar sus GRUPOS
+ group_ids = fields.Many2many(
+ "res.partner",
+ "res_partner_group_members_rel",
+ "member_id",
+ "group_id",
domain=[("is_group", "=", True)],
string="Consumer Groups",
- help="Consumer Groups this partner belongs to",
+ help="Consumer groups this partner belongs to",
)
# Inverse relation: group orders this group participates in
diff --git a/website_sale_aplicoop/models/sale_order_extension.py b/website_sale_aplicoop/models/sale_order_extension.py
index 873b9a9..93dcbf2 100644
--- a/website_sale_aplicoop/models/sale_order_extension.py
+++ b/website_sale_aplicoop/models/sale_order_extension.py
@@ -22,7 +22,7 @@ class SaleOrder(models.Model):
pickup_day = fields.Selection(
selection=_get_pickup_day_selection,
- help="Day of week when this order will be picked up (inherited from group order)",
+ help="Day of week when this order will be picked up",
)
group_order_id = fields.Many2one(
@@ -30,13 +30,19 @@ class SaleOrder(models.Model):
help="Reference to the consumer group order that originated this sale order",
)
+ consumer_group_id = fields.Many2one(
+ "res.partner",
+ domain="[('is_group', '=', True)]",
+ help="Consumer group for this order",
+ )
+
pickup_date = fields.Date(
- help="Calculated pickup/delivery date (inherited from consumer group order)",
+ help="Pickup/delivery date",
)
home_delivery = fields.Boolean(
default=False,
- help="Whether this order includes home delivery (inherited from consumer group order)",
+ help="Whether this order includes home delivery",
)
def _get_name_portal_content_view(self):
diff --git a/website_sale_aplicoop/models/stock_picking_extension.py b/website_sale_aplicoop/models/stock_picking_extension.py
index 83b11f5..94e7295 100644
--- a/website_sale_aplicoop/models/stock_picking_extension.py
+++ b/website_sale_aplicoop/models/stock_picking_extension.py
@@ -35,10 +35,10 @@ class StockPicking(models.Model):
consumer_group_id = fields.Many2one(
"res.partner",
- related="sale_id.partner_id",
+ related="sale_id.consumer_group_id",
string="Consumer Group",
store=True,
readonly=True,
domain=[("is_group", "=", True)],
- help="Consumer group (partner) from sale order for warehouse grouping",
+ help="Consumer group (res.partner with is_group=True) from sale order",
)
diff --git a/website_sale_aplicoop/tests/test_res_partner.py b/website_sale_aplicoop/tests/test_res_partner.py
index 5d0bf03..a98919b 100644
--- a/website_sale_aplicoop/tests/test_res_partner.py
+++ b/website_sale_aplicoop/tests/test_res_partner.py
@@ -9,11 +9,12 @@ class TestResPartnerExtension(TransactionCase):
def setUp(self):
super().setUp()
- # Crear grupos (res.partner with is_company=True)
+ # Crear grupos (res.partner with is_group=True)
self.group1 = self.env["res.partner"].create(
{
"name": "Grupo 1",
"is_company": True,
+ "is_group": True,
"email": "grupo1@test.com",
}
)
@@ -22,6 +23,7 @@ class TestResPartnerExtension(TransactionCase):
{
"name": "Grupo 2",
"is_company": True,
+ "is_group": True,
"email": "grupo2@test.com",
}
)
@@ -39,16 +41,16 @@ class TestResPartnerExtension(TransactionCase):
"""Test que un partner (usuario) puede pertenecer a múltiples grupos."""
partner = self.user.partner_id
- # Agregar partner a grupos (usar campo member_ids)
- partner.member_ids = [(6, 0, [self.group1.id, self.group2.id])]
+ # Agregar partner a grupos usando group_ids (desde el lado del miembro)
+ partner.group_ids = [(6, 0, [self.group1.id, self.group2.id])]
# Verificar que pertenece a ambos grupos
- self.assertIn(self.group1, partner.member_ids)
- self.assertIn(self.group2, partner.member_ids)
- self.assertEqual(len(partner.member_ids), 2)
+ self.assertIn(self.group1, partner.group_ids)
+ self.assertIn(self.group2, partner.group_ids)
+ self.assertEqual(len(partner.group_ids), 2)
- def test_group_can_have_multiple_users(self):
- """Test que un grupo puede tener múltiples usuarios."""
+ def test_group_can_have_multiple_members(self):
+ """Test que un grupo puede tener múltiples miembros."""
user2 = self.env["res.users"].create(
{
"name": "Test User 2",
@@ -57,24 +59,28 @@ class TestResPartnerExtension(TransactionCase):
}
)
- # Agregar usuarios al grupo
- self.group1.user_ids = [(6, 0, [self.user.id, user2.id])]
+ # Agregar miembros al grupo usando member_ids (desde el lado del grupo)
+ self.group1.member_ids = [
+ (6, 0, [self.user.partner_id.id, user2.partner_id.id])
+ ]
- # Verificar que el grupo tiene ambos usuarios
- self.assertIn(self.user, self.group1.user_ids)
- self.assertIn(user2, self.group1.user_ids)
- self.assertEqual(len(self.group1.user_ids), 2)
+ # Verificar que el grupo tiene ambos miembros
+ self.assertIn(self.user.partner_id, self.group1.member_ids)
+ self.assertIn(user2.partner_id, self.group1.member_ids)
+ self.assertEqual(len(self.group1.member_ids), 2)
def test_user_group_relationship_is_bidirectional(self):
"""Test que se puede modificar la relación desde el lado del partner o el grupo."""
partner = self.user.partner_id
- # Opción 1: Agregar grupo al usuario (desde el lado del usuario/partner)
- partner.member_ids = [(6, 0, [self.group1.id])]
- self.assertIn(self.group1, partner.member_ids)
+ # Opción 1: Agregar grupo al usuario (desde el lado del miembro/partner)
+ partner.group_ids = [(6, 0, [self.group1.id])]
+ self.assertIn(self.group1, partner.group_ids)
- # Opción 2: Agregar usuario al grupo (desde el lado del grupo)
- # Nota: Esto es una relación Many2many independiente
+ # Verificar que la relación inversa también funciona
+ self.assertIn(partner, self.group1.member_ids)
+
+ # Opción 2: Agregar partner al grupo (desde el lado del grupo)
user2 = self.env["res.users"].create(
{
"name": "Test User 2",
@@ -82,12 +88,14 @@ class TestResPartnerExtension(TransactionCase):
"email": "testuser2@test.com",
}
)
- self.group2.user_ids = [(6, 0, [user2.id])]
- self.assertIn(user2, self.group2.user_ids)
+ self.group2.member_ids = [(4, user2.partner_id.id)]
+ self.assertIn(user2.partner_id, self.group2.member_ids)
+ # Verificar relación inversa
+ self.assertIn(self.group2, user2.partner_id.group_ids)
def test_empty_group_ids(self):
"""Test que un partner sin grupos tiene group_ids vacío."""
partner = self.user.partner_id
# Sin agregar a ningún grupo
- self.assertEqual(len(partner.member_ids), 0)
+ self.assertEqual(len(partner.group_ids), 0)
diff --git a/website_sale_aplicoop/views/res_partner_views.xml b/website_sale_aplicoop/views/res_partner_views.xml
index bfab3de..7403063 100644
--- a/website_sale_aplicoop/views/res_partner_views.xml
+++ b/website_sale_aplicoop/views/res_partner_views.xml
@@ -9,29 +9,36 @@
-
+
-
+
res.partner.form.inheritres.partner
-
+
-
+
-
+
+
-
-
+
+
diff --git a/website_sale_aplicoop/views/sale_order_views.xml b/website_sale_aplicoop/views/sale_order_views.xml
index 860136a..5090249 100644
--- a/website_sale_aplicoop/views/sale_order_views.xml
+++ b/website_sale_aplicoop/views/sale_order_views.xml
@@ -12,7 +12,10 @@
+
+
+
diff --git a/website_sale_aplicoop/views/website_templates.xml b/website_sale_aplicoop/views/website_templates.xml
index c5cdb78..65eea7f 100644
--- a/website_sale_aplicoop/views/website_templates.xml
+++ b/website_sale_aplicoop/views/website_templates.xml
@@ -471,10 +471,18 @@