Compare commits

..

No commits in common. "6f593c62408288fc13c2e0d28e17d9bfdca08e01" and "c2f9f347b7085385037e51b165cd33f611bc3ab7" have entirely different histories.

23 changed files with 291848 additions and 2071 deletions

View file

@ -116,7 +116,7 @@ repos:
- id: mypy - id: mypy
# do not run on test files or __init__ files (mypy does not support # do not run on test files or __init__ files (mypy does not support
# namespace packages) # namespace packages)
exclude: (/tests/|/__init__\.py$|^scripts/) exclude: (/tests/|/__init__\.py$)
# Exclude migrations explicitly to avoid duplicate-module errors # Exclude migrations explicitly to avoid duplicate-module errors
args: ["--exclude", "(?i).*/migrations/.*"] args: ["--exclude", "(?i).*/migrations/.*"]
additional_dependencies: additional_dependencies:
@ -135,12 +135,10 @@ repos:
- --rcfile=.pylintrc - --rcfile=.pylintrc
- --exit-zero - --exit-zero
verbose: true verbose: true
exclude: ^scripts/
additional_dependencies: &pylint_deps additional_dependencies: &pylint_deps
- pylint-odoo==10.0.0 - pylint-odoo==10.0.0
- id: pylint - id: pylint
name: pylint with mandatory checks name: pylint with mandatory checks
args: args:
- --rcfile=.pylintrc-mandatory - --rcfile=.pylintrc-mandatory
exclude: ^scripts/
additional_dependencies: *pylint_deps additional_dependencies: *pylint_deps

View file

@ -12,13 +12,13 @@ useTabs: false
# Keep tags more compact - don't break every attribute # Keep tags more compact - don't break every attribute
overrides: overrides:
# XML files with improved readability # Disable prettier for XML files - manual formatting preferred
- files: "*.xml" # - files: "*.xml"
options: # options:
printWidth: 100 # printWidth: 120
xmlWhitespaceSensitivity: "ignore" # xmlWhitespaceSensitivity: "strict"
singleAttributePerLine: true # singleAttributePerLine: false
bracketSameLine: false # bracketSameLine: true
- files: "*.py" - files: "*.py"
options: options:

View file

@ -90,7 +90,6 @@ class MyModel(models.Model):
### 1. Exportar Términos Traducibles ### 1. Exportar Términos Traducibles
NO HACER:
```bash ```bash
# Exportar términos del addon # Exportar términos del addon
docker-compose exec odoo odoo \ docker-compose exec odoo odoo \
@ -99,8 +98,6 @@ docker-compose exec odoo odoo \
--modules=addon_name \ --modules=addon_name \
--db=odoo \ --db=odoo \
--stop-after-init --stop-after-init
De alguna forma, exporta todas las cadenas de Odoo.
PEDIR AL USUARIO QUE GENERE EL POT DESDE LA UI DE ODOO
# Copiar el archivo generado # Copiar el archivo generado
docker-compose cp odoo:/tmp/addon_name.pot ./addon_name/i18n/ docker-compose cp odoo:/tmp/addon_name.pot ./addon_name/i18n/
@ -108,7 +105,19 @@ docker-compose cp odoo:/tmp/addon_name.pot ./addon_name/i18n/
### 2. Actualizar Archivos .po Existentes ### 2. Actualizar Archivos .po Existentes
no usar msmerge, corrompe el po. Usa polib. ```bash
cd addon_name/i18n
# Actualizar español
msgmerge --update es.po addon_name.pot
# Actualizar euskera
msgmerge --update eu.po addon_name.pot
# Actualizar otros idiomas (si existen)
msgmerge --update ca.po addon_name.pot
msgmerge --update gl.po addon_name.pot
```
### 3. Traducir Términos Nuevos ### 3. Traducir Términos Nuevos

View file

@ -2,8 +2,7 @@
# Exclude migration scripts (post-migrate.py etc.) from mypy checks to avoid # Exclude migration scripts (post-migrate.py etc.) from mypy checks to avoid
# duplicate module name errors when multiple addons include scripts with the # duplicate module name errors when multiple addons include scripts with the
# same filename. # same filename.
# Exclude scripts/ directory from mypy checks (utility scripts, not Odoo code) exclude = .*/migrations/.*
exclude = .*/migrations/.*|^scripts/.*
# Ignore missing imports from Odoo modules # Ignore missing imports from Odoo modules
ignore_missing_imports = True ignore_missing_imports = True

View file

@ -1,91 +0,0 @@
#!/usr/bin/env python
"""Filter .po files to keep only entries for a specific module."""
from __future__ import annotations
import argparse
from pathlib import Path
from typing import Iterable
import polib
def _extract_modules_from_comment(entry: polib.POEntry) -> set[str]:
"""Return module names declared in translator comments (#.)."""
tcomment = entry.tcomment or ""
modules: set[str] = set()
for line in tcomment.splitlines():
stripped = line.strip()
lowered = stripped.lower()
if lowered.startswith("module:") or lowered.startswith("modules:"):
_, _, tail = stripped.partition(":")
for module in tail.split(","):
module_name = module.strip()
if module_name:
modules.add(module_name)
return modules
def belongs_to_module(entry: polib.POEntry, module_name: str) -> bool:
"""Return True if the entry references ONLY the target module."""
declared_modules = _extract_modules_from_comment(entry)
if declared_modules:
return declared_modules == {module_name}
locations = [occ[0] for occ in entry.occurrences if occ and occ[0]]
if locations:
return all(module_name in location for location in locations)
return False
def filter_po_file(path: Path, module_name: str, dry_run: bool = False) -> None:
po = polib.pofile(str(path))
kept_entries: list[polib.POEntry] = []
removed = 0
for entry in po:
if entry.msgid == "":
kept_entries.append(entry)
continue
if belongs_to_module(entry, module_name):
kept_entries.append(entry)
else:
removed += 1
if dry_run:
print(
f"[DRY-RUN] {path}: would keep {len(kept_entries)} entries, remove {removed} entries"
)
return
new_po = polib.POFile()
new_po.metadata = po.metadata
for entry in kept_entries:
new_po.append(entry)
new_po.save(str(path))
print(
f"Filtered {path}: kept {len(kept_entries)} entries, removed {removed} entries"
)
def parse_args(args: Iterable[str] | None = None) -> argparse.Namespace:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("module", help="Module technical name to keep")
parser.add_argument("files", nargs="+", type=Path, help=".po files to filter")
parser.add_argument("--dry-run", action="store_true", help="Only report counts")
return parser.parse_args(args)
def main() -> None:
args = parse_args()
for file_path in args.files:
filter_po_file(file_path, args.module, dry_run=args.dry_run)
if __name__ == "__main__":
main()

View file

@ -3,7 +3,6 @@ max-line-length = 88
max-complexity = 16 max-complexity = 16
select = C,E,F,W,B,B9 select = C,E,F,W,B,B9
ignore = E203,E501,W503,B950 ignore = E203,E501,W503,B950
exclude = scripts/
[isort] [isort]
profile = black profile = black

View file

@ -332,5 +332,5 @@ For issues, feature requests, or contributions:
**Version:** 18.0.1.3.1 **Version:** 18.0.1.3.1
**Odoo:** 18.0+ **Odoo:** 18.0+
**License:** AGPL-3 **License:** AGPL-3
**Maintainer:** Criptomart **Maintainer:** Criptomart SL
**Repository:** https://git.criptomart.net/criptomart/addons-cm **Repository:** https://git.criptomart.net/KideKoop/kidekoop/odoo-addons

View file

@ -17,6 +17,7 @@
"stock", "stock",
"account", "account",
"product_get_price_helper", "product_get_price_helper",
"product_origin_char",
], ],
"data": [ "data": [
# Datos: Grupos propios # Datos: Grupos propios
@ -41,20 +42,6 @@
"views/portal_templates.xml", "views/portal_templates.xml",
"views/load_from_history_templates.xml", "views/load_from_history_templates.xml",
], ],
"demo": [
# Demo: Account Taxes (must be loaded first)
"demo/account_tax_demo.xml",
# Demo: Partners (Groups and Members)
"demo/res_partner_demo.xml",
# Demo: Suppliers
"demo/res_partner_suppliers_demo.xml",
# Demo: Products and Categories
"demo/product_demo.xml",
# Demo: Group Orders
"demo/group_order_demo.xml",
# Demo: Sale Orders
"demo/sale_order_demo.xml",
],
"i18n": [ "i18n": [
"i18n/es.po", "i18n/es.po",
"i18n/eu_ES.po", "i18n/eu_ES.po",

View file

@ -1463,18 +1463,6 @@ class AplicoopWebsiteSale(WebsiteSale):
session_key = f"eskaera_{order_id}" session_key = f"eskaera_{order_id}"
cart = request.session.get(session_key, {}) cart = request.session.get(session_key, {})
# Get delivery product from group_order (configured per group order)
delivery_product = group_order.delivery_product_id
delivery_product_id = delivery_product.id if delivery_product else None
# Get translated product name based on current language
if delivery_product:
delivery_product_translated = delivery_product.with_context(
lang=request.env.lang
)
delivery_product_name = delivery_product_translated.name
else:
delivery_product_name = "Home Delivery"
# Get translated labels for JavaScript (same as checkout) # Get translated labels for JavaScript (same as checkout)
labels = self.get_checkout_labels() labels = self.get_checkout_labels()
@ -1494,11 +1482,6 @@ class AplicoopWebsiteSale(WebsiteSale):
"product_supplier_info": product_supplier_info, "product_supplier_info": product_supplier_info,
"product_price_info": product_price_info, "product_price_info": product_price_info,
"product_display_info": product_display_info, "product_display_info": product_display_info,
"delivery_product_id": delivery_product_id,
"delivery_product_name": delivery_product_name,
"delivery_product_price": (
delivery_product.list_price if delivery_product else 5.74
),
"labels": labels, "labels": labels,
"labels_json": json.dumps(labels, ensure_ascii=False), "labels_json": json.dumps(labels, ensure_ascii=False),
"lazy_loading_enabled": lazy_loading_enabled, "lazy_loading_enabled": lazy_loading_enabled,

View file

@ -3,17 +3,17 @@
<!-- License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) --> <!-- License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) -->
<odoo> <odoo>
<data noupdate="0"> <data noupdate="0">
<!-- Ribbon: Out of Stock --> <!-- Ribbon: Out of Stock (Sin Stock) -->
<record id="out_of_stock_ribbon" model="product.ribbon"> <record id="out_of_stock_ribbon" model="product.ribbon">
<field name="name">Out of Stock</field> <field name="name">Sin Stock</field>
<field name="position">left</field> <field name="position">left</field>
<field name="text_color">#FFFFFF</field> <field name="text_color">#FFFFFF</field>
<field name="bg_color">#d9534f</field> <field name="bg_color">#d9534f</field>
</record> </record>
<!-- Ribbon: Low Stock --> <!-- Ribbon: Low Stock (Pocas Existencias) -->
<record id="low_stock_ribbon" model="product.ribbon"> <record id="low_stock_ribbon" model="product.ribbon">
<field name="name">Low Stock</field> <field name="name">Pocas Existencias</field>
<field name="position">left</field> <field name="position">left</field>
<field name="text_color">#FFFFFF</field> <field name="text_color">#FFFFFF</field>
<field name="bg_color">#ffc107</field> <field name="bg_color">#ffc107</field>

View file

@ -1,247 +0,0 @@
# Demo Data - Website Sale Aplicoop
Este directorio contiene datos de demostración completos para el addon `website_sale_aplicoop`, diseñados para mostrar todas las funcionalidades del sistema de pedidos colaborativos (eskaera) para cooperativas de consumo.
## Contenido de los Archivos Demo
### 1. `res_partner_demo.xml` - Grupos y Miembros
**Grupos de Consumo (3 grupos):**
- **Garaialde Kooperatiba** (Bilbao)
- Grupo activo con pedidos semanales
- 3 miembros activos
- **Lamiakada Kontsumoko Taldea** (Donostia)
- Grupo con pedidos quincenales
- 2 miembros activos
- **Eko Auzolan** (Gasteiz)
- Grupo con pedidos mensuales
- 2 miembros activos
**Total Miembros:** 7 personas distribuidas entre los 3 grupos
### 2. `res_partner_suppliers_demo.xml` - Proveedores
**6 Proveedores Locales:**
- **Baserritarra SL** - Productos frescos locales y de temporada
- **Bio Zikloa Kooperatiba** - Productos ecológicos certificados
- **Artizarra Esnea** - Lácteos artesanales del País Vasco
- **Hiruki Kontserbak** - Conservas y productos elaborados artesanales
- **Ekotalde Barazkiak** - Verduras eco de km 0
- **Auzoko Okindegia** - Pan artesano y repostería tradicional vasca
Todos los proveedores tienen `supplier_rank > 0` y pueden ser asignados a group orders.
### 3. `product_demo.xml` - Productos y Categorías
**Categorías de Producto:**
- Fruta Fresca
- Verdura Fresca
- Lácteos
- Pan y Repostería
- Conservas
**13 Productos Demo:**
| Código | Nombre | Categoría | Proveedor(es) | Precio/€ |
|-------------|-------------------------------|-----------------|------------------------|----------|
| MANZ-ECO | Manzana Ecológica | Fruta | Baserritarra | 2.50/kg |
| NARA-VAL | Naranja Valenciana | Fruta | Bio Zikloa | 2.80/kg |
| PLAT-CAN | Plátano de Canarias | Fruta | Bio Zikloa | 3.20/kg |
| TOMA-ECO | Tomate Ecológico | Verdura | Baserritarra | 3.50/kg |
| LECH-KM0 | Lechuga Km 0 | Verdura | Ekotalde | 1.50/ud |
| PIMI-VER | Pimiento Verde | Verdura | Ekotalde | 4.20/kg |
| LECH-ENT | Leche Entera Artesana | Lácteos | Artizarra | 1.80/L |
| YOGU-NAT | Yogur Natural (Pack 4) | Lácteos | Artizarra | 3.20/ud |
| QUES-IDI | Queso Idiazabal D.O. | Lácteos | Artizarra | 25.00/kg |
| PAN-INT | Pan Integral Artesano | Pan/Repostería | Auzoko Okindegia | 3.50/kg |
| POST-GOX | Goxua (6 unidades) | Pan/Repostería | Auzoko Okindegia | 8.50/ud |
| CONS-BON | Bonito del Norte en Aceite | Conservas | Hiruki | 12.50/ud |
| CONS-PIQ | Pimientos del Piquillo D.O. | Conservas | Hiruki | 5.80/ud |
**Plus:**
- `SRV-DELIV` - Servicio de Envío a Domicilio (5.00€/servicio)
Todos los productos incluyen:
- Configuración de impuestos (IVA 4%, 10% o 21% según corresponda)
- Información de proveedor (precio, cantidad mínima, plazo de entrega)
- Unidades de medida apropiadas (kg, L, unidad)
### 4. `group_order_demo.xml` - Pedidos de Grupo
**8 Group Orders con diferentes configuraciones:**
1. **Eskaera Astekaria Garaialde** (ACTIVO)
- Tipo: Regular (weekly)
- Grupo: Garaialde
- Pickup: Viernes / Cutoff: Jueves
- Home delivery: SÍ
- Proveedores: Baserritarra, Ekotalde, Artizarra, Okindegia
- Categorías: Frutas, Verduras, Lácteos, Pan
2. **Eskaera Hamabostaldia Lamiakada** (ACTIVO)
- Tipo: Regular (biweekly)
- Grupo: Lamiakada
- Pickup: Sábado / Cutoff: Viernes
- Home delivery: NO
- Proveedores: Bio Zikloa, Hiruki
- Categorías: Frutas, Conservas
3. **Eskaera Hilabetekoa Eko Auzolan** (ACTIVO)
- Tipo: Regular (monthly)
- Grupo: Eko Auzolan
- Pickup: Lunes / Cutoff: Domingo
- Home delivery: SÍ
- Productos específicos: Queso Idiazabal, Bonito, Pimientos Piquillo
4. **Eskaera Berezia - Denboraldia** (ACTIVO - Temporal)
- Tipo: Special (once)
- Grupos: Garaialde + Lamiakada
- Duración: 14 días
- Productos de temporada: Tomate, Pimiento, Lechuga
5. **Eskaera Promozionala - Gabonak** (FUTURO)
- Tipo: Promotional (once)
- Grupos: Los 3 grupos
- Inicio: +5 días / Fin: +21 días
- Productos: Goxua, Queso Idiazabal, Bonito
6. **Eskaera Astekaria (Itxita)** (CERRADO - Histórico)
- Ejemplo de pedido histórico finalizado
- Útil para testing de históricos
7. **Eskaera Kolektiboa - Ekintza Elkartua** (MULTI-GRUPO)
- Los 3 grupos participan
- Productos excluidos: Plátano de Canarias (demo de blacklist)
8. **Eskaera Urtekoa - Produktu Iraunkorra** (CON EXCLUSIONES)
- Demo de funcionalidad de blacklist
- Excluye: Pimientos del Piquillo
### 5. `sale_order_demo.xml` - Pedidos de Venta
**9 Sale Orders** asociados a diferentes group orders y miembros:
**Estado CONFIRMED (sale):**
- Ane García: 4 líneas (frutas, verduras, leche, pan) - Pickup en tienda
- Mikel Lopez: 3 líneas + delivery - Con envío a domicilio ✓
- Jon Fernández: 3 líneas (conservas, frutas)
- Unai Sánchez: 3 líneas + delivery - Pedido mensual
**Estado DRAFT:**
- Leire Martínez: 2 líneas (naranjas, queso)
- Amaia Méndez: 1 línea (naranjas)
- Ainhoa Rodríguez: 1 línea (conservas)
- Ane García (especial): 3 líneas - Pedido de temporada
**Características destacadas:**
- Mezcla de pedidos confirmados y en borrador
- Algunos con home_delivery=True (incluyen producto de delivery)
- Diferentes fechas de pickup según el group order
- Cantidades realistas y variadas
## Instalación y Uso
### Instalación Básica (Sin Demo)
```bash
docker-compose run odoo odoo -d odoo -i website_sale_aplicoop --stop-after-init
```
### Instalación con Datos Demo
```bash
docker-compose run odoo odoo -d odoo -i website_sale_aplicoop --load-language=es_ES --load-language=eu_ES --stop-after-init --demo=True
```
O desde la UI de Odoo:
1. Apps > Buscar "Website Sale - Aplicoop"
2. Asegurarse de que la base de datos tiene demo data habilitado
3. Instalar el módulo
### Acceso a los Datos Demo
**Backend (Odoo):**
- Ventas > Órdenes > Consumer Group Orders
- Contactos > Filtrar por "Is a Consumer Group"
- Productos > Ver productos demo con prefijos MANZ-, NARA-, etc.
**Frontend (Website):**
1. Ir a `/shop/eskaera`
2. Los group orders estarán visibles según permisos
3. Hacer login como uno de los miembros demo para probar el flujo completo
### Usuarios Demo Recomendados
Para testing, crear usuarios de Odoo asociados a estos partners:
- `ane.garcia@example.com` (Garaialde - Pedido semanal)
- `jon.fernandez@example.com` (Lamiakada - Pedido quincenal)
- `unai.sanchez@example.com` (Eko Auzolan - Pedido mensual)
## Casos de Uso Cubiertos
Los datos demo permiten probar:
✅ **Flujos básicos:**
- Crear/editar/confirmar pedidos individuales
- Añadir productos al carrito de eskaera
- Seleccionar home delivery
- Ver fechas de pickup y cutoff
✅ **Configuraciones variadas:**
- Pedidos semanales, quincenales, mensuales
- Pedidos especiales (one-time)
- Pedidos promocionales con fechas futuras
- Multi-grupo (varios grupos en un pedido)
✅ **Filtrado de productos:**
- Por proveedores
- Por categorías
- Por productos específicos
- Con exclusiones (blacklist)
✅ **Gestión de grupos:**
- Múltiples grupos de diferentes ciudades
- Miembros con diferentes patrones de compra
- Asociaciones grupo-miembro
✅ **Reportes y análisis:**
- Pedidos históricos (cerrados)
- Pedidos activos con diferentes estados
- Datos para testing de lazy loading
- Datos para testing de date calculations
## Mantenimiento
Para regenerar o actualizar los datos demo:
```bash
# Limpiar base de datos
docker-compose run odoo odoo -d odoo --init=website_sale_aplicoop --demo=True --stop-after-init
# O actualizar solo el módulo
docker-compose run odoo odoo -d odoo -u website_sale_aplicoop --stop-after-init
```
## Notas Importantes
- Los precios incluyen IVA según categoría de producto
- Las fechas de group orders usan `eval` con `DateTime.today()` para ser dinámicas
- Los supplierinfo están correctamente configurados con precios y MOQ
- Todos los partners tienen direcciones completas en España (Euskadi)
- Los códigos de producto siguen un patrón coherente para fácil identificación
## Contribuir
Para añadir más datos demo:
1. Seguir la estructura existente
2. Usar XML IDs descriptivos (ej: `product_nombre_descriptivo`)
3. Mantener coherencia en nombres (euskera + castellano)
4. Documentar en este README
---
**Versión:** 18.0.1.7.0
**Última actualización:** 2026-02-26
**Autor:** Criptomart

View file

@ -1,64 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<!-- ============================================ -->
<!-- Demo Taxes (Impuestos para Demo) -->
<!-- ============================================ -->
<!-- IVA 4% (Alimentos básicos) -->
<record id="demo_tax_iva_4_sale" model="account.tax">
<field name="name">IVA 4% (Demo)</field>
<field name="amount">4.0</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">sale</field>
<field name="active" eval="True" />
<field name="description">IVA4</field>
</record>
<record id="demo_tax_iva_4_purchase" model="account.tax">
<field name="name">IVA 4% Compras (Demo)</field>
<field name="amount">4.0</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">purchase</field>
<field name="active" eval="True" />
<field name="description">IVA4_P</field>
</record>
<!-- IVA 10% (Alimentos elaborados) -->
<record id="demo_tax_iva_10_sale" model="account.tax">
<field name="name">IVA 10% (Demo)</field>
<field name="amount">10.0</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">sale</field>
<field name="active" eval="True" />
<field name="description">IVA10</field>
</record>
<record id="demo_tax_iva_10_purchase" model="account.tax">
<field name="name">IVA 10% Compras (Demo)</field>
<field name="amount">10.0</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">purchase</field>
<field name="active" eval="True" />
<field name="description">IVA10_P</field>
</record>
<!-- IVA 21% (Servicios) -->
<record id="demo_tax_iva_21_sale" model="account.tax">
<field name="name">IVA 21% (Demo)</field>
<field name="amount">21.0</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">sale</field>
<field name="active" eval="True" />
<field name="description">IVA21</field>
</record>
<record id="demo_tax_iva_21_purchase" model="account.tax">
<field name="name">IVA 21% Compras (Demo)</field>
<field name="amount">21.0</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">purchase</field>
<field name="active" eval="True" />
<field name="description">IVA21_P</field>
</record>
</odoo>

View file

@ -1,165 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<!-- ============================================ -->
<!-- Group Orders (Pedidos de Grupo) -->
<!-- ============================================ -->
<!-- Pedido semanal activo de Garaialde -->
<record id="group_order_garaialde_weekly" model="group.order">
<field name="name">Eskaera Astekaria Garaialde</field>
<field name="sequence">10</field>
<field name="group_ids" eval="[(6, 0, [ref('group_garaialde')])]" />
<field name="type">regular</field>
<field name="start_date" eval="(DateTime.today() - timedelta(days=30)).strftime('%Y-%m-%d')" />
<field name="end_date" eval="False" />
<field name="period">weekly</field>
<field name="pickup_day">4</field>
<!-- Friday -->
<field name="cutoff_day">3</field>
<!-- Thursday -->
<field name="home_delivery" eval="True" />
<field name="delivery_product_id" ref="product_home_delivery_service" />
<field name="supplier_ids" eval="[(6, 0, [ref('supplier_baserritarra'), ref('supplier_ekotalde'), ref('supplier_artizarra'), ref('supplier_okindegia')])]" />
<field name="category_ids" eval="[(6, 0, [ref('categ_fruta_fresca'), ref('categ_verdura_fresca'), ref('categ_lacteos'), ref('categ_pan_reposteria')])]" />
<field name="company_id" ref="base.main_company" />
</record>
<!-- Pedido quincenal activo de Lamiakada -->
<record id="group_order_lamiakada_biweekly" model="group.order">
<field name="name">Eskaera Hamabostaldia Lamiakada</field>
<field name="sequence">20</field>
<field name="group_ids" eval="[(6, 0, [ref('group_lamiakada')])]" />
<field name="type">regular</field>
<field name="start_date" eval="(DateTime.today() - timedelta(days=15)).strftime('%Y-%m-%d')" />
<field name="end_date" eval="False" />
<field name="period">biweekly</field>
<field name="pickup_day">5</field>
<!-- Saturday -->
<field name="cutoff_day">4</field>
<!-- Friday -->
<field name="home_delivery" eval="False" />
<field name="supplier_ids" eval="[(6, 0, [ref('supplier_biozikloa'), ref('supplier_hiruki')])]" />
<field name="category_ids" eval="[(6, 0, [ref('categ_fruta_fresca'), ref('categ_conservas')])]" />
<field name="company_id" ref="base.main_company" />
</record>
<!-- Pedido mensual de Eko Auzolan -->
<record id="group_order_ekoauzolan_monthly" model="group.order">
<field name="name">Eskaera Hilabetekoa Eko Auzolan</field>
<field name="sequence">30</field>
<field name="group_ids" eval="[(6, 0, [ref('group_ekoauzolan')])]" />
<field name="type">regular</field>
<field name="start_date" eval="(DateTime.today() - timedelta(days=60)).strftime('%Y-%m-%d')" />
<field name="end_date" eval="False" />
<field name="period">monthly</field>
<field name="pickup_day">0</field>
<!-- Monday -->
<field name="cutoff_day">6</field>
<!-- Sunday -->
<field name="home_delivery" eval="True" />
<field name="delivery_product_id" ref="product_home_delivery_service" />
<field name="supplier_ids" eval="[(6, 0, [ref('supplier_baserritarra'), ref('supplier_biozikloa'), ref('supplier_artizarra')])]" />
<field name="product_ids" eval="[(6, 0, [ref('product_queso_idiazabal'), ref('product_bonito_conserva'), ref('product_pimientos_piquillo')])]" />
<field name="company_id" ref="base.main_company" />
</record>
<!-- Pedido especial (una vez) - Productos de temporada -->
<record id="group_order_special_seasonal" model="group.order">
<field name="name">Eskaera Berezia - Denboraldia</field>
<field name="sequence">40</field>
<field name="group_ids" eval="[(6, 0, [ref('group_garaialde'), ref('group_lamiakada')])]" />
<field name="type">special</field>
<field name="start_date" eval="DateTime.today().strftime('%Y-%m-%d')" />
<field name="end_date" eval="(DateTime.today() + timedelta(days=14)).strftime('%Y-%m-%d')" />
<field name="period">once</field>
<field name="pickup_day">5</field>
<!-- Saturday -->
<field name="cutoff_day">3</field>
<!-- Thursday -->
<field name="home_delivery" eval="False" />
<field name="supplier_ids" eval="[(6, 0, [ref('supplier_baserritarra')])]" />
<field name="product_ids" eval="[(6, 0, [ref('product_tomate_ecologico'), ref('product_pimiento_verde'), ref('product_lechuga_km0')])]" />
<field name="company_id" ref="base.main_company" />
</record>
<!-- Pedido promocional (una vez) - Navidad -->
<record id="group_order_promo_christmas" model="group.order">
<field name="name">Eskaera Promozionala - Gabonak</field>
<field name="sequence">50</field>
<field name="group_ids" eval="[(6, 0, [ref('group_garaialde'), ref('group_lamiakada'), ref('group_ekoauzolan')])]" />
<field name="type">promotional</field>
<field name="start_date" eval="(DateTime.today() + timedelta(days=5)).strftime('%Y-%m-%d')" />
<field name="end_date" eval="(DateTime.today() + timedelta(days=21)).strftime('%Y-%m-%d')" />
<field name="period">once</field>
<field name="pickup_day">4</field>
<!-- Friday -->
<field name="cutoff_day">2</field>
<!-- Wednesday -->
<field name="home_delivery" eval="True" />
<field name="delivery_product_id" ref="product_home_delivery_service" />
<field name="supplier_ids" eval="[(6, 0, [ref('supplier_okindegia'), ref('supplier_hiruki'), ref('supplier_artizarra')])]" />
<field name="product_ids" eval="[(6, 0, [ref('product_goxua'), ref('product_queso_idiazabal'), ref('product_bonito_conserva')])]" />
<field name="company_id" ref="base.main_company" />
</record>
<!-- Pedido pasado (cerrado) - Ejemplo histórico -->
<record id="group_order_past_closed" model="group.order">
<field name="name">Eskaera Astekaria (Itxita)</field>
<field name="sequence">100</field>
<field name="group_ids" eval="[(6, 0, [ref('group_garaialde')])]" />
<field name="type">regular</field>
<field name="start_date" eval="(DateTime.today() - timedelta(days=90)).strftime('%Y-%m-%d')" />
<field name="end_date" eval="(DateTime.today() - timedelta(days=30)).strftime('%Y-%m-%d')" />
<field name="period">weekly</field>
<field name="pickup_day">4</field>
<field name="cutoff_day">3</field>
<field name="home_delivery" eval="True" />
<field name="delivery_product_id" ref="product_home_delivery_service" />
<field name="supplier_ids" eval="[(6, 0, [ref('supplier_baserritarra'), ref('supplier_artizarra')])]" />
<field name="category_ids" eval="[(6, 0, [ref('categ_fruta_fresca'), ref('categ_lacteos')])]" />
<field name="company_id" ref="base.main_company" />
</record>
<!-- Pedido multi-grupo (varios grupos participan) -->
<record id="group_order_multi_group" model="group.order">
<field name="name">Eskaera Kolektiboa - Ekintza Elkartua</field>
<field name="sequence">15</field>
<field name="group_ids" eval="[(6, 0, [ref('group_garaialde'), ref('group_lamiakada'), ref('group_ekoauzolan')])]" />
<field name="type">regular</field>
<field name="start_date" eval="(DateTime.today() - timedelta(days=7)).strftime('%Y-%m-%d')" />
<field name="end_date" eval="False" />
<field name="period">monthly</field>
<field name="pickup_day">6</field>
<!-- Sunday -->
<field name="cutoff_day">5</field>
<!-- Saturday -->
<field name="home_delivery" eval="True" />
<field name="delivery_product_id" ref="product_home_delivery_service" />
<field name="supplier_ids" eval="[(6, 0, [ref('supplier_baserritarra'), ref('supplier_biozikloa'), ref('supplier_ekotalde')])]" />
<field name="category_ids" eval="[(6, 0, [ref('categ_verdura_fresca'), ref('categ_fruta_fresca')])]" />
<field name="excluded_product_ids" eval="[(6, 0, [ref('product_platano_canarias')])]" />
<field name="company_id" ref="base.main_company" />
</record>
<!-- Pedido con productos excluidos (ejemplo blacklist) -->
<record id="group_order_with_exclusions" model="group.order">
<field name="name">Eskaera Urtekoa - Produktu Iraunkorra</field>
<field name="sequence">25</field>
<field name="group_ids" eval="[(6, 0, [ref('group_lamiakada')])]" />
<field name="type">regular</field>
<field name="start_date" eval="DateTime.today().strftime('%Y-%m-%d')" />
<field name="end_date" eval="False" />
<field name="period">monthly</field>
<field name="pickup_day">1</field>
<!-- Tuesday -->
<field name="cutoff_day">0</field>
<!-- Monday -->
<field name="home_delivery" eval="False" />
<field name="supplier_ids" eval="[(6, 0, [ref('supplier_hiruki')])]" />
<field name="category_ids" eval="[(6, 0, [ref('categ_conservas')])]" />
<field name="excluded_product_ids" eval="[(6, 0, [ref('product_pimientos_piquillo')])]" />
<field name="excluded_supplier_ids" eval="[(6, 0, [])]" />
<field name="company_id" ref="base.main_company" />
</record>
</odoo>

View file

@ -1,365 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<!-- ============================================ -->
<!-- Product Categories (Categorías de Producto) -->
<!-- ============================================ -->
<record id="categ_fruta_fresca" model="product.category">
<field name="name">Fruta Fresca</field>
<field name="parent_id" ref="product.product_category_all" />
</record>
<record id="categ_verdura_fresca" model="product.category">
<field name="name">Verdura Fresca</field>
<field name="parent_id" ref="product.product_category_all" />
</record>
<record id="categ_lacteos" model="product.category">
<field name="name">Lácteos</field>
<field name="parent_id" ref="product.product_category_all" />
</record>
<record id="categ_pan_reposteria" model="product.category">
<field name="name">Pan y Repostería</field>
<field name="parent_id" ref="product.product_category_all" />
</record>
<record id="categ_conservas" model="product.category">
<field name="name">Conservas</field>
<field name="parent_id" ref="product.product_category_all" />
</record>
<!-- ============================================ -->
<!-- Products (Productos) -->
<!-- ============================================ -->
<!-- Frutas -->
<record id="product_manzana_ecologica" model="product.product">
<field name="name">Manzana Ecológica</field>
<field name="default_code">MANZ-ECO</field>
<field name="categ_id" ref="categ_fruta_fresca" />
<field name="type">consu</field>
<field name="list_price">2.50</field>
<field name="standard_price">1.20</field>
<field name="uom_id" ref="uom.product_uom_kgm" />
<field name="uom_po_id" ref="uom.product_uom_kgm" />
<field name="sale_ok" eval="True" />
<field name="purchase_ok" eval="True" />
<field name="taxes_id" eval="[(6, 0, [ref('demo_tax_iva_4_sale')])]" />
<field name="supplier_taxes_id" eval="[(6, 0, [ref('demo_tax_iva_4_purchase')])]" />
</record>
<record id="product_naranja_valenciana" model="product.product">
<field name="name">Naranja Valenciana</field>
<field name="default_code">NARA-VAL</field>
<field name="categ_id" ref="categ_fruta_fresca" />
<field name="type">consu</field>
<field name="list_price">2.80</field>
<field name="standard_price">1.50</field>
<field name="uom_id" ref="uom.product_uom_kgm" />
<field name="uom_po_id" ref="uom.product_uom_kgm" />
<field name="sale_ok" eval="True" />
<field name="purchase_ok" eval="True" />
<field name="taxes_id" eval="[(6, 0, [ref('demo_tax_iva_4_sale')])]" />
<field name="supplier_taxes_id" eval="[(6, 0, [ref('demo_tax_iva_4_purchase')])]" />
</record>
<record id="product_platano_canarias" model="product.product">
<field name="name">Plátano de Canarias</field>
<field name="default_code">PLAT-CAN</field>
<field name="categ_id" ref="categ_fruta_fresca" />
<field name="type">consu</field>
<field name="list_price">3.20</field>
<field name="standard_price">1.80</field>
<field name="uom_id" ref="uom.product_uom_kgm" />
<field name="uom_po_id" ref="uom.product_uom_kgm" />
<field name="sale_ok" eval="True" />
<field name="purchase_ok" eval="True" />
<field name="taxes_id" eval="[(6, 0, [ref('demo_tax_iva_4_sale')])]" />
<field name="supplier_taxes_id" eval="[(6, 0, [ref('demo_tax_iva_4_purchase')])]" />
</record>
<!-- Verduras -->
<record id="product_tomate_ecologico" model="product.product">
<field name="name">Tomate Ecológico</field>
<field name="default_code">TOMA-ECO</field>
<field name="categ_id" ref="categ_verdura_fresca" />
<field name="type">consu</field>
<field name="list_price">3.50</field>
<field name="standard_price">1.80</field>
<field name="uom_id" ref="uom.product_uom_kgm" />
<field name="uom_po_id" ref="uom.product_uom_kgm" />
<field name="sale_ok" eval="True" />
<field name="purchase_ok" eval="True" />
<field name="taxes_id" eval="[(6, 0, [ref('demo_tax_iva_4_sale')])]" />
<field name="supplier_taxes_id" eval="[(6, 0, [ref('demo_tax_iva_4_purchase')])]" />
</record>
<record id="product_lechuga_km0" model="product.product">
<field name="name">Lechuga Km 0</field>
<field name="default_code">LECH-KM0</field>
<field name="categ_id" ref="categ_verdura_fresca" />
<field name="type">consu</field>
<field name="list_price">1.50</field>
<field name="standard_price">0.80</field>
<field name="uom_id" ref="uom.product_uom_unit" />
<field name="uom_po_id" ref="uom.product_uom_unit" />
<field name="sale_ok" eval="True" />
<field name="purchase_ok" eval="True" />
<field name="taxes_id" eval="[(6, 0, [ref('demo_tax_iva_4_sale')])]" />
<field name="supplier_taxes_id" eval="[(6, 0, [ref('demo_tax_iva_4_purchase')])]" />
</record>
<record id="product_pimiento_verde" model="product.product">
<field name="name">Pimiento Verde</field>
<field name="default_code">PIMI-VER</field>
<field name="categ_id" ref="categ_verdura_fresca" />
<field name="type">consu</field>
<field name="list_price">4.20</field>
<field name="standard_price">2.10</field>
<field name="uom_id" ref="uom.product_uom_kgm" />
<field name="uom_po_id" ref="uom.product_uom_kgm" />
<field name="sale_ok" eval="True" />
<field name="purchase_ok" eval="True" />
<field name="taxes_id" eval="[(6, 0, [ref('demo_tax_iva_4_sale')])]" />
<field name="supplier_taxes_id" eval="[(6, 0, [ref('demo_tax_iva_4_purchase')])]" />
</record>
<!-- Lácteos -->
<record id="product_leche_entera" model="product.product">
<field name="name">Leche Entera Artesana</field>
<field name="default_code">LECH-ENT</field>
<field name="categ_id" ref="categ_lacteos" />
<field name="type">consu</field>
<field name="list_price">1.80</field>
<field name="standard_price">1.00</field>
<field name="uom_id" ref="uom.product_uom_litre" />
<field name="uom_po_id" ref="uom.product_uom_litre" />
<field name="sale_ok" eval="True" />
<field name="purchase_ok" eval="True" />
<field name="taxes_id" eval="[(6, 0, [ref('demo_tax_iva_4_sale')])]" />
<field name="supplier_taxes_id" eval="[(6, 0, [ref('demo_tax_iva_4_purchase')])]" />
</record>
<record id="product_yogur_natural" model="product.product">
<field name="name">Yogur Natural (Pack 4)</field>
<field name="default_code">YOGU-NAT</field>
<field name="categ_id" ref="categ_lacteos" />
<field name="type">consu</field>
<field name="list_price">3.20</field>
<field name="standard_price">1.80</field>
<field name="uom_id" ref="uom.product_uom_unit" />
<field name="uom_po_id" ref="uom.product_uom_unit" />
<field name="sale_ok" eval="True" />
<field name="purchase_ok" eval="True" />
<field name="taxes_id" eval="[(6, 0, [ref('demo_tax_iva_4_sale')])]" />
<field name="supplier_taxes_id" eval="[(6, 0, [ref('demo_tax_iva_4_purchase')])]" />
</record>
<record id="product_queso_idiazabal" model="product.product">
<field name="name">Queso Idiazabal D.O.</field>
<field name="default_code">QUES-IDI</field>
<field name="categ_id" ref="categ_lacteos" />
<field name="type">consu</field>
<field name="list_price">25.00</field>
<field name="standard_price">15.00</field>
<field name="uom_id" ref="uom.product_uom_kgm" />
<field name="uom_po_id" ref="uom.product_uom_kgm" />
<field name="sale_ok" eval="True" />
<field name="purchase_ok" eval="True" />
<field name="taxes_id" eval="[(6, 0, [ref('demo_tax_iva_10_sale')])]" />
<field name="supplier_taxes_id" eval="[(6, 0, [ref('demo_tax_iva_10_purchase')])]" />
</record>
<!-- Pan y Repostería -->
<record id="product_pan_integral" model="product.product">
<field name="name">Pan Integral Artesano</field>
<field name="default_code">PAN-INT</field>
<field name="categ_id" ref="categ_pan_reposteria" />
<field name="type">consu</field>
<field name="list_price">3.50</field>
<field name="standard_price">1.80</field>
<field name="uom_id" ref="uom.product_uom_kgm" />
<field name="uom_po_id" ref="uom.product_uom_kgm" />
<field name="sale_ok" eval="True" />
<field name="purchase_ok" eval="True" />
<field name="taxes_id" eval="[(6, 0, [ref('demo_tax_iva_4_sale')])]" />
<field name="supplier_taxes_id" eval="[(6, 0, [ref('demo_tax_iva_4_purchase')])]" />
</record>
<record id="product_goxua" model="product.product">
<field name="name">Goxua (6 unidades)</field>
<field name="default_code">POST-GOX</field>
<field name="categ_id" ref="categ_pan_reposteria" />
<field name="type">consu</field>
<field name="list_price">8.50</field>
<field name="standard_price">4.50</field>
<field name="uom_id" ref="uom.product_uom_unit" />
<field name="uom_po_id" ref="uom.product_uom_unit" />
<field name="sale_ok" eval="True" />
<field name="purchase_ok" eval="True" />
<field name="taxes_id" eval="[(6, 0, [ref('demo_tax_iva_10_sale')])]" />
<field name="supplier_taxes_id" eval="[(6, 0, [ref('demo_tax_iva_10_purchase')])]" />
</record>
<!-- Conservas -->
<record id="product_bonito_conserva" model="product.product">
<field name="name">Bonito del Norte en Aceite</field>
<field name="default_code">CONS-BON</field>
<field name="categ_id" ref="categ_conservas" />
<field name="type">consu</field>
<field name="list_price">12.50</field>
<field name="standard_price">7.00</field>
<field name="uom_id" ref="uom.product_uom_unit" />
<field name="uom_po_id" ref="uom.product_uom_unit" />
<field name="sale_ok" eval="True" />
<field name="purchase_ok" eval="True" />
<field name="taxes_id" eval="[(6, 0, [ref('demo_tax_iva_10_sale')])]" />
<field name="supplier_taxes_id" eval="[(6, 0, [ref('demo_tax_iva_10_purchase')])]" />
</record>
<record id="product_pimientos_piquillo" model="product.product">
<field name="name">Pimientos del Piquillo D.O.</field>
<field name="default_code">CONS-PIQ</field>
<field name="categ_id" ref="categ_conservas" />
<field name="type">consu</field>
<field name="list_price">5.80</field>
<field name="standard_price">3.20</field>
<field name="uom_id" ref="uom.product_uom_unit" />
<field name="uom_po_id" ref="uom.product_uom_unit" />
<field name="sale_ok" eval="True" />
<field name="purchase_ok" eval="True" />
<field name="taxes_id" eval="[(6, 0, [ref('demo_tax_iva_10_sale')])]" />
<field name="supplier_taxes_id" eval="[(6, 0, [ref('demo_tax_iva_10_purchase')])]" />
</record>
<!-- Producto de envío a domicilio (servicio) -->
<record id="product_home_delivery_service" model="product.product">
<field name="name">Servicio de Envío a Domicilio</field>
<field name="default_code">SRV-DELIV</field>
<field name="categ_id" ref="product.product_category_all" />
<field name="type">service</field>
<field name="list_price">5.00</field>
<field name="standard_price">0.00</field>
<field name="uom_id" ref="uom.product_uom_unit" />
<field name="uom_po_id" ref="uom.product_uom_unit" />
<field name="sale_ok" eval="True" />
<field name="purchase_ok" eval="False" />
<field name="taxes_id" eval="[(6, 0, [ref('demo_tax_iva_21_sale')])]" />
</record>
<!-- ============================================ -->
<!-- Supplier Info (Información de Proveedores) -->
<!-- ============================================ -->
<!-- Baserritarra provee frutas y verduras -->
<record id="supplierinfo_manzana_baserritarra" model="product.supplierinfo">
<field name="partner_id" ref="supplier_baserritarra" />
<field name="product_id" ref="product_manzana_ecologica" />
<field name="price">1.20</field>
<field name="min_qty">10.0</field>
<field name="delay">2</field>
</record>
<record id="supplierinfo_tomate_baserritarra" model="product.supplierinfo">
<field name="partner_id" ref="supplier_baserritarra" />
<field name="product_id" ref="product_tomate_ecologico" />
<field name="price">1.80</field>
<field name="min_qty">5.0</field>
<field name="delay">2</field>
</record>
<!-- Bio Zikloa provee productos ecológicos -->
<record id="supplierinfo_naranja_biozikloa" model="product.supplierinfo">
<field name="partner_id" ref="supplier_biozikloa" />
<field name="product_id" ref="product_naranja_valenciana" />
<field name="price">1.50</field>
<field name="min_qty">10.0</field>
<field name="delay">3</field>
</record>
<record id="supplierinfo_platano_biozikloa" model="product.supplierinfo">
<field name="partner_id" ref="supplier_biozikloa" />
<field name="product_id" ref="product_platano_canarias" />
<field name="price">1.80</field>
<field name="min_qty">10.0</field>
<field name="delay">3</field>
</record>
<!-- Artizarra provee lácteos -->
<record id="supplierinfo_leche_artizarra" model="product.supplierinfo">
<field name="partner_id" ref="supplier_artizarra" />
<field name="product_id" ref="product_leche_entera" />
<field name="price">1.00</field>
<field name="min_qty">20.0</field>
<field name="delay">1</field>
</record>
<record id="supplierinfo_yogur_artizarra" model="product.supplierinfo">
<field name="partner_id" ref="supplier_artizarra" />
<field name="product_id" ref="product_yogur_natural" />
<field name="price">1.80</field>
<field name="min_qty">10.0</field>
<field name="delay">1</field>
</record>
<record id="supplierinfo_queso_artizarra" model="product.supplierinfo">
<field name="partner_id" ref="supplier_artizarra" />
<field name="product_id" ref="product_queso_idiazabal" />
<field name="price">15.00</field>
<field name="min_qty">2.0</field>
<field name="delay">7</field>
</record>
<!-- Auzoko Okindegia provee pan -->
<record id="supplierinfo_pan_okindegia" model="product.supplierinfo">
<field name="partner_id" ref="supplier_okindegia" />
<field name="product_id" ref="product_pan_integral" />
<field name="price">1.80</field>
<field name="min_qty">5.0</field>
<field name="delay">1</field>
</record>
<record id="supplierinfo_goxua_okindegia" model="product.supplierinfo">
<field name="partner_id" ref="supplier_okindegia" />
<field name="product_id" ref="product_goxua" />
<field name="price">4.50</field>
<field name="min_qty">2.0</field>
<field name="delay">1</field>
</record>
<!-- Hiruki provee conservas -->
<record id="supplierinfo_bonito_hiruki" model="product.supplierinfo">
<field name="partner_id" ref="supplier_hiruki" />
<field name="product_id" ref="product_bonito_conserva" />
<field name="price">7.00</field>
<field name="min_qty">6.0</field>
<field name="delay">5</field>
</record>
<record id="supplierinfo_piquillo_hiruki" model="product.supplierinfo">
<field name="partner_id" ref="supplier_hiruki" />
<field name="product_id" ref="product_pimientos_piquillo" />
<field name="price">3.20</field>
<field name="min_qty">12.0</field>
<field name="delay">5</field>
</record>
<!-- Ekotalde provee verduras -->
<record id="supplierinfo_lechuga_ekotalde" model="product.supplierinfo">
<field name="partner_id" ref="supplier_ekotalde" />
<field name="product_id" ref="product_lechuga_km0" />
<field name="price">0.80</field>
<field name="min_qty">10.0</field>
<field name="delay">1</field>
</record>
<record id="supplierinfo_pimiento_ekotalde" model="product.supplierinfo">
<field name="partner_id" ref="supplier_ekotalde" />
<field name="product_id" ref="product_pimiento_verde" />
<field name="price">2.10</field>
<field name="min_qty">5.0</field>
<field name="delay">1</field>
</record>
</odoo>

View file

@ -1,134 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<!-- ============================================ -->
<!-- Consumer Groups (Grupos de Consumo) -->
<!-- ============================================ -->
<record id="group_garaialde" model="res.partner">
<field name="name">Garaialde Kooperatiba</field>
<field name="is_group" eval="True" />
<field name="is_company" eval="True" />
<field name="street">Garaialde Kalea 1</field>
<field name="city">Bilbao</field>
<field name="zip">48012</field>
<field name="country_id" ref="base.es" />
<field name="email">garaialde@kooperatiba.eus</field>
<field name="phone">+34 944 123 456</field>
</record>
<record id="group_lamiakada" model="res.partner">
<field name="name">Lamiakada Kontsumoko Taldea</field>
<field name="is_group" eval="True" />
<field name="is_company" eval="True" />
<field name="street">Lamia Plaza 5</field>
<field name="city">Donostia</field>
<field name="zip">20004</field>
<field name="country_id" ref="base.es" />
<field name="email">info@lamiakada.eus</field>
<field name="phone">+34 943 234 567</field>
</record>
<record id="group_ekoauzolan" model="res.partner">
<field name="name">Eko Auzolan</field>
<field name="is_group" eval="True" />
<field name="is_company" eval="True" />
<field name="street">Arrasate Bidea 22</field>
<field name="city">Gasteiz</field>
<field name="zip">01008</field>
<field name="country_id" ref="base.es" />
<field name="email">kontaktua@ekoauzolan.eus</field>
<field name="phone">+34 945 345 678</field>
</record>
<!-- ============================================ -->
<!-- Consumer Group Members (Miembros) -->
<!-- ============================================ -->
<!-- Miembros de Garaialde -->
<record id="member_ane_garcia" model="res.partner">
<field name="name">Ane García Etxebarria</field>
<field name="is_company" eval="False" />
<field name="street">Autonomia Kalea 15, 3A</field>
<field name="city">Bilbao</field>
<field name="zip">48012</field>
<field name="country_id" ref="base.es" />
<field name="email">ane.garcia@example.com</field>
<field name="phone">+34 666 111 222</field>
<field name="member_ids" eval="[(6, 0, [ref('group_garaialde')])]" />
</record>
<record id="member_mikel_lopez" model="res.partner">
<field name="name">Mikel Lopez Zubizarreta</field>
<field name="is_company" eval="False" />
<field name="street">Elcano Kalea 8, 2B</field>
<field name="city">Bilbao</field>
<field name="zip">48012</field>
<field name="country_id" ref="base.es" />
<field name="email">mikel.lopez@example.com</field>
<field name="phone">+34 666 222 333</field>
<field name="member_ids" eval="[(6, 0, [ref('group_garaialde')])]" />
</record>
<record id="member_leire_martinez" model="res.partner">
<field name="name">Leire Martínez Galdos</field>
<field name="is_company" eval="False" />
<field name="street">Uribitarte Kalea 5, 4D</field>
<field name="city">Bilbao</field>
<field name="zip">48001</field>
<field name="country_id" ref="base.es" />
<field name="email">leire.martinez@example.com</field>
<field name="phone">+34 666 333 444</field>
<field name="member_ids" eval="[(6, 0, [ref('group_garaialde')])]" />
</record>
<!-- Miembros de Lamiakada -->
<record id="member_jon_fernandez" model="res.partner">
<field name="name">Jon Fernández Iraola</field>
<field name="is_company" eval="False" />
<field name="street">Zurriola Hiribidea 12, 1A</field>
<field name="city">Donostia</field>
<field name="zip">20002</field>
<field name="country_id" ref="base.es" />
<field name="email">jon.fernandez@example.com</field>
<field name="phone">+34 677 111 222</field>
<field name="member_ids" eval="[(6, 0, [ref('group_lamiakada')])]" />
</record>
<record id="member_amaia_mendez" model="res.partner">
<field name="name">Amaia Méndez Etxeberria</field>
<field name="is_company" eval="False" />
<field name="street">Ategorrieta Kalea 33, 5C</field>
<field name="city">Donostia</field>
<field name="zip">20013</field>
<field name="country_id" ref="base.es" />
<field name="email">amaia.mendez@example.com</field>
<field name="phone">+34 677 222 333</field>
<field name="member_ids" eval="[(6, 0, [ref('group_lamiakada')])]" />
</record>
<!-- Miembros de Eko Auzolan -->
<record id="member_unai_sanchez" model="res.partner">
<field name="name">Unai Sánchez Alonso</field>
<field name="is_company" eval="False" />
<field name="street">Portal de Castilla 18, 2A</field>
<field name="city">Gasteiz</field>
<field name="zip">01007</field>
<field name="country_id" ref="base.es" />
<field name="email">unai.sanchez@example.com</field>
<field name="phone">+34 688 111 222</field>
<field name="member_ids" eval="[(6, 0, [ref('group_ekoauzolan')])]" />
</record>
<record id="member_ainhoa_rodriguez" model="res.partner">
<field name="name">Ainhoa Rodríguez Pérez</field>
<field name="is_company" eval="False" />
<field name="street">Florida Kalea 7, 1B</field>
<field name="city">Gasteiz</field>
<field name="zip">01005</field>
<field name="country_id" ref="base.es" />
<field name="email">ainhoa.rodriguez@example.com</field>
<field name="phone">+34 688 222 333</field>
<field name="member_ids" eval="[(6, 0, [ref('group_ekoauzolan')])]" />
</record>
</odoo>

View file

@ -1,85 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<!-- ============================================ -->
<!-- Suppliers (Proveedores) -->
<!-- ============================================ -->
<record id="supplier_baserritarra" model="res.partner">
<field name="name">Baserritarra SL</field>
<field name="is_company" eval="True" />
<field name="supplier_rank" eval="10" />
<field name="street">Basarte Baserria s/n</field>
<field name="city">Zestoa</field>
<field name="zip">20740</field>
<field name="country_id" ref="base.es" />
<field name="email">pedidos@baserritarra.eus</field>
<field name="phone">+34 943 147 258</field>
<field name="comment">Proveedor de productos frescos locales y de temporada</field>
</record>
<record id="supplier_biozikloa" model="res.partner">
<field name="name">Bio Zikloa Kooperatiba</field>
<field name="is_company" eval="True" />
<field name="supplier_rank" eval="10" />
<field name="street">Errekalde Industrialdea 15</field>
<field name="city">Irun</field>
<field name="zip">20304</field>
<field name="country_id" ref="base.es" />
<field name="email">info@biozikloa.eus</field>
<field name="phone">+34 943 625 789</field>
<field name="comment">Productos ecológicos certificados</field>
</record>
<record id="supplier_artizarra" model="res.partner">
<field name="name">Artizarra Esnea</field>
<field name="is_company" eval="True" />
<field name="supplier_rank" eval="10" />
<field name="street">Aralar Etorbidea 33</field>
<field name="city">Tolosa</field>
<field name="zip">20400</field>
<field name="country_id" ref="base.es" />
<field name="email">pedidos@artizarra.com</field>
<field name="phone">+34 943 654 321</field>
<field name="comment">Lácteos artesanales del País Vasco</field>
</record>
<record id="supplier_hiruki" model="res.partner">
<field name="name">Hiruki Kontserbak</field>
<field name="is_company" eval="True" />
<field name="supplier_rank" eval="10" />
<field name="street">Industrialdea 8</field>
<field name="city">Gernika</field>
<field name="zip">48300</field>
<field name="country_id" ref="base.es" />
<field name="email">ventas@hiruki.eus</field>
<field name="phone">+34 946 257 412</field>
<field name="comment">Conservas y productos elaborados artesanales</field>
</record>
<record id="supplier_ekotalde" model="res.partner">
<field name="name">Ekotalde Barazkiak</field>
<field name="is_company" eval="True" />
<field name="supplier_rank" eval="10" />
<field name="street">Merkataritza Plaza 2</field>
<field name="city">Durango</field>
<field name="zip">48200</field>
<field name="country_id" ref="base.es" />
<field name="email">info@ekotalde.eus</field>
<field name="phone">+34 946 234 789</field>
<field name="comment">Verduras eco de km 0</field>
</record>
<record id="supplier_okindegia" model="res.partner">
<field name="name">Auzoko Okindegia</field>
<field name="is_company" eval="True" />
<field name="supplier_rank" eval="10" />
<field name="street">Elcano Kalea 44</field>
<field name="city">Bilbao</field>
<field name="zip">48008</field>
<field name="country_id" ref="base.es" />
<field name="email">okindegia@auzokookindegia.eus</field>
<field name="phone">+34 944 789 123</field>
<field name="comment">Pan artesano y repostería tradicional vasca</field>
</record>
</odoo>

View file

@ -1,265 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<!-- ============================================ -->
<!-- Sale Orders (Pedidos de Venta) -->
<!-- Asociados a Group Orders -->
<!-- ============================================ -->
<!-- Pedido de Ane García (Garaialde - Semanal) -->
<record id="sale_order_ane_garcia_weekly_1" model="sale.order">
<field name="partner_id" ref="member_ane_garcia" />
<field name="group_order_id" ref="group_order_garaialde_weekly" />
<field name="pickup_day">4</field>
<!-- Friday -->
<field name="pickup_date" eval="(DateTime.today() + timedelta(days=2)).strftime('%Y-%m-%d')" />
<field name="home_delivery" eval="False" />
<field name="state">sale</field>
<field name="date_order" eval="(DateTime.today() - timedelta(days=1)).strftime('%Y-%m-%d %H:%M:%S')" />
<field name="company_id" ref="base.main_company" />
</record>
<record id="sale_order_line_ane_1_1" model="sale.order.line">
<field name="order_id" ref="sale_order_ane_garcia_weekly_1" />
<field name="product_id" ref="product_manzana_ecologica" />
<field name="product_uom_qty">2.5</field>
<field name="product_uom" ref="uom.product_uom_kgm" />
<field name="price_unit">2.50</field>
</record>
<record id="sale_order_line_ane_1_2" model="sale.order.line">
<field name="order_id" ref="sale_order_ane_garcia_weekly_1" />
<field name="product_id" ref="product_tomate_ecologico" />
<field name="product_uom_qty">1.5</field>
<field name="product_uom" ref="uom.product_uom_kgm" />
<field name="price_unit">3.50</field>
</record>
<record id="sale_order_line_ane_1_3" model="sale.order.line">
<field name="order_id" ref="sale_order_ane_garcia_weekly_1" />
<field name="product_id" ref="product_leche_entera" />
<field name="product_uom_qty">4.0</field>
<field name="product_uom" ref="uom.product_uom_litre" />
<field name="price_unit">1.80</field>
</record>
<record id="sale_order_line_ane_1_4" model="sale.order.line">
<field name="order_id" ref="sale_order_ane_garcia_weekly_1" />
<field name="product_id" ref="product_pan_integral" />
<field name="product_uom_qty">1.0</field>
<field name="product_uom" ref="uom.product_uom_kgm" />
<field name="price_unit">3.50</field>
</record>
<!-- Pedido de Mikel Lopez (Garaialde - Semanal) con envío a domicilio -->
<record id="sale_order_mikel_lopez_weekly_1" model="sale.order">
<field name="partner_id" ref="member_mikel_lopez" />
<field name="group_order_id" ref="group_order_garaialde_weekly" />
<field name="pickup_day">4</field>
<field name="pickup_date" eval="(DateTime.today() + timedelta(days=2)).strftime('%Y-%m-%d')" />
<field name="home_delivery" eval="True" />
<field name="state">sale</field>
<field name="date_order" eval="(DateTime.today() - timedelta(days=2)).strftime('%Y-%m-%d %H:%M:%S')" />
<field name="company_id" ref="base.main_company" />
</record>
<record id="sale_order_line_mikel_1_1" model="sale.order.line">
<field name="order_id" ref="sale_order_mikel_lopez_weekly_1" />
<field name="product_id" ref="product_lechuga_km0" />
<field name="product_uom_qty">2.0</field>
<field name="product_uom" ref="uom.product_uom_unit" />
<field name="price_unit">1.50</field>
</record>
<record id="sale_order_line_mikel_1_2" model="sale.order.line">
<field name="order_id" ref="sale_order_mikel_lopez_weekly_1" />
<field name="product_id" ref="product_yogur_natural" />
<field name="product_uom_qty">3.0</field>
<field name="product_uom" ref="uom.product_uom_unit" />
<field name="price_unit">3.20</field>
</record>
<record id="sale_order_line_mikel_1_3" model="sale.order.line">
<field name="order_id" ref="sale_order_mikel_lopez_weekly_1" />
<field name="product_id" ref="product_home_delivery_service" />
<field name="product_uom_qty">1.0</field>
<field name="product_uom" ref="uom.product_uom_unit" />
<field name="price_unit">5.00</field>
</record>
<!-- Pedido de Leire Martínez (Garaialde - Semanal) -->
<record id="sale_order_leire_martinez_weekly_1" model="sale.order">
<field name="partner_id" ref="member_leire_martinez" />
<field name="group_order_id" ref="group_order_garaialde_weekly" />
<field name="pickup_day">4</field>
<field name="pickup_date" eval="(DateTime.today() + timedelta(days=2)).strftime('%Y-%m-%d')" />
<field name="home_delivery" eval="False" />
<field name="state">draft</field>
<field name="date_order" eval="DateTime.today().strftime('%Y-%m-%d %H:%M:%S')" />
<field name="company_id" ref="base.main_company" />
</record>
<record id="sale_order_line_leire_1_1" model="sale.order.line">
<field name="order_id" ref="sale_order_leire_martinez_weekly_1" />
<field name="product_id" ref="product_naranja_valenciana" />
<field name="product_uom_qty">3.0</field>
<field name="product_uom" ref="uom.product_uom_kgm" />
<field name="price_unit">2.80</field>
</record>
<record id="sale_order_line_leire_1_2" model="sale.order.line">
<field name="order_id" ref="sale_order_leire_martinez_weekly_1" />
<field name="product_id" ref="product_queso_idiazabal" />
<field name="product_uom_qty">0.5</field>
<field name="product_uom" ref="uom.product_uom_kgm" />
<field name="price_unit">25.00</field>
</record>
<!-- Pedido de Jon Fernández (Lamiakada - Quincenal) -->
<record id="sale_order_jon_fernandez_biweekly_1" model="sale.order">
<field name="partner_id" ref="member_jon_fernandez" />
<field name="group_order_id" ref="group_order_lamiakada_biweekly" />
<field name="pickup_day">5</field>
<field name="pickup_date" eval="(DateTime.today() + timedelta(days=3)).strftime('%Y-%m-%d')" />
<field name="home_delivery" eval="False" />
<field name="state">sale</field>
<field name="date_order" eval="(DateTime.today() - timedelta(days=3)).strftime('%Y-%m-%d %H:%M:%S')" />
<field name="company_id" ref="base.main_company" />
</record>
<record id="sale_order_line_jon_1_1" model="sale.order.line">
<field name="order_id" ref="sale_order_jon_fernandez_biweekly_1" />
<field name="product_id" ref="product_bonito_conserva" />
<field name="product_uom_qty">3.0</field>
<field name="product_uom" ref="uom.product_uom_unit" />
<field name="price_unit">12.50</field>
</record>
<record id="sale_order_line_jon_1_2" model="sale.order.line">
<field name="order_id" ref="sale_order_jon_fernandez_biweekly_1" />
<field name="product_id" ref="product_pimientos_piquillo" />
<field name="product_uom_qty">2.0</field>
<field name="product_uom" ref="uom.product_uom_unit" />
<field name="price_unit">5.80</field>
</record>
<record id="sale_order_line_jon_1_3" model="sale.order.line">
<field name="order_id" ref="sale_order_jon_fernandez_biweekly_1" />
<field name="product_id" ref="product_platano_canarias" />
<field name="product_uom_qty">2.0</field>
<field name="product_uom" ref="uom.product_uom_kgm" />
<field name="price_unit">3.20</field>
</record>
<!-- Pedido de Amaia Méndez (Lamiakada - Quincenal) -->
<record id="sale_order_amaia_mendez_biweekly_1" model="sale.order">
<field name="partner_id" ref="member_amaia_mendez" />
<field name="group_order_id" ref="group_order_lamiakada_biweekly" />
<field name="pickup_day">5</field>
<field name="pickup_date" eval="(DateTime.today() + timedelta(days=3)).strftime('%Y-%m-%d')" />
<field name="home_delivery" eval="False" />
<field name="state">draft</field>
<field name="date_order" eval="DateTime.today().strftime('%Y-%m-%d %H:%M:%S')" />
<field name="company_id" ref="base.main_company" />
</record>
<record id="sale_order_line_amaia_1_1" model="sale.order.line">
<field name="order_id" ref="sale_order_amaia_mendez_biweekly_1" />
<field name="product_id" ref="product_naranja_valenciana" />
<field name="product_uom_qty">5.0</field>
<field name="product_uom" ref="uom.product_uom_kgm" />
<field name="price_unit">2.80</field>
</record>
<!-- Pedido de Unai Sánchez (Eko Auzolan - Mensual) con delivery -->
<record id="sale_order_unai_sanchez_monthly_1" model="sale.order">
<field name="partner_id" ref="member_unai_sanchez" />
<field name="group_order_id" ref="group_order_ekoauzolan_monthly" />
<field name="pickup_day">0</field>
<field name="pickup_date" eval="(DateTime.today() + timedelta(days=5)).strftime('%Y-%m-%d')" />
<field name="home_delivery" eval="True" />
<field name="state">sale</field>
<field name="date_order" eval="(DateTime.today() - timedelta(days=5)).strftime('%Y-%m-%d %H:%M:%S')" />
<field name="company_id" ref="base.main_company" />
</record>
<record id="sale_order_line_unai_1_1" model="sale.order.line">
<field name="order_id" ref="sale_order_unai_sanchez_monthly_1" />
<field name="product_id" ref="product_queso_idiazabal" />
<field name="product_uom_qty">1.0</field>
<field name="product_uom" ref="uom.product_uom_kgm" />
<field name="price_unit">25.00</field>
</record>
<record id="sale_order_line_unai_1_2" model="sale.order.line">
<field name="order_id" ref="sale_order_unai_sanchez_monthly_1" />
<field name="product_id" ref="product_bonito_conserva" />
<field name="product_uom_qty">6.0</field>
<field name="product_uom" ref="uom.product_uom_unit" />
<field name="price_unit">12.50</field>
</record>
<record id="sale_order_line_unai_1_3" model="sale.order.line">
<field name="order_id" ref="sale_order_unai_sanchez_monthly_1" />
<field name="product_id" ref="product_home_delivery_service" />
<field name="product_uom_qty">1.0</field>
<field name="product_uom" ref="uom.product_uom_unit" />
<field name="price_unit">5.00</field>
</record>
<!-- Pedido de Ainhoa Rodríguez (Eko Auzolan - Mensual) -->
<record id="sale_order_ainhoa_rodriguez_monthly_1" model="sale.order">
<field name="partner_id" ref="member_ainhoa_rodriguez" />
<field name="group_order_id" ref="group_order_ekoauzolan_monthly" />
<field name="pickup_day">0</field>
<field name="pickup_date" eval="(DateTime.today() + timedelta(days=5)).strftime('%Y-%m-%d')" />
<field name="home_delivery" eval="False" />
<field name="state">draft</field>
<field name="date_order" eval="DateTime.today().strftime('%Y-%m-%d %H:%M:%S')" />
<field name="company_id" ref="base.main_company" />
</record>
<record id="sale_order_line_ainhoa_1_1" model="sale.order.line">
<field name="order_id" ref="sale_order_ainhoa_rodriguez_monthly_1" />
<field name="product_id" ref="product_pimientos_piquillo" />
<field name="product_uom_qty">4.0</field>
<field name="product_uom" ref="uom.product_uom_unit" />
<field name="price_unit">5.80</field>
</record>
<!-- Pedido especial de temporada (Ane - Multi-grupo) -->
<record id="sale_order_ane_seasonal_special" model="sale.order">
<field name="partner_id" ref="member_ane_garcia" />
<field name="group_order_id" ref="group_order_special_seasonal" />
<field name="pickup_day">5</field>
<field name="pickup_date" eval="(DateTime.today() + timedelta(days=12)).strftime('%Y-%m-%d')" />
<field name="home_delivery" eval="False" />
<field name="state">draft</field>
<field name="date_order" eval="DateTime.today().strftime('%Y-%m-%d %H:%M:%S')" />
<field name="company_id" ref="base.main_company" />
</record>
<record id="sale_order_line_ane_seasonal_1" model="sale.order.line">
<field name="order_id" ref="sale_order_ane_seasonal_special" />
<field name="product_id" ref="product_tomate_ecologico" />
<field name="product_uom_qty">5.0</field>
<field name="product_uom" ref="uom.product_uom_kgm" />
<field name="price_unit">3.50</field>
</record>
<record id="sale_order_line_ane_seasonal_2" model="sale.order.line">
<field name="order_id" ref="sale_order_ane_seasonal_special" />
<field name="product_id" ref="product_pimiento_verde" />
<field name="product_uom_qty">2.0</field>
<field name="product_uom" ref="uom.product_uom_kgm" />
<field name="price_unit">4.20</field>
</record>
<record id="sale_order_line_ane_seasonal_3" model="sale.order.line">
<field name="order_id" ref="sale_order_ane_seasonal_special" />
<field name="product_id" ref="product_lechuga_km0" />
<field name="product_uom_qty">3.0</field>
<field name="product_uom" ref="uom.product_uom_unit" />
<field name="price_unit">1.50</field>
</record>
</odoo>

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,10 +1,12 @@
# Copyright 2025 - Today Criptomart # Copyright 2025 Criptomart
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
from odoo import api from odoo import api
from odoo import fields from odoo import fields
from odoo import models from odoo import models
# Note: translation function _ is not used in this module (removed to satisfy flake8)
class ProductProduct(models.Model): class ProductProduct(models.Model):
_inherit = "product.product" _inherit = "product.product"

View file

@ -14,40 +14,24 @@
homeDeliveryEnabled: false, homeDeliveryEnabled: false,
init: function () { init: function () {
// Get delivery product info from data attributes (from checkout or shop page) // Get delivery product info from data attributes
var checkoutPage = document.querySelector(".eskaera-checkout-page"); var checkoutPage = document.querySelector(".eskaera-checkout-page");
var shopPage = document.querySelector(".eskaera-shop-page"); if (checkoutPage) {
var page = checkoutPage || shopPage; this.deliveryProductId = checkoutPage.getAttribute("data-delivery-product-id");
if (page) {
var deliveryProductIdStr = page.getAttribute("data-delivery-product-id");
// Parse to integer, filter out None/empty/invalid values
if (
deliveryProductIdStr &&
deliveryProductIdStr !== "None" &&
deliveryProductIdStr !== ""
) {
this.deliveryProductId = parseInt(deliveryProductIdStr, 10);
if (isNaN(this.deliveryProductId)) {
this.deliveryProductId = null;
}
}
console.log( console.log(
"[HomeDelivery] deliveryProductId from attribute:", "[HomeDelivery] deliveryProductId from attribute:",
deliveryProductIdStr,
"-> parsed:",
this.deliveryProductId, this.deliveryProductId,
"type:", "type:",
typeof this.deliveryProductId typeof this.deliveryProductId
); );
var price = page.getAttribute("data-delivery-product-price"); var price = checkoutPage.getAttribute("data-delivery-product-price");
if (price) { if (price) {
this.deliveryProductPrice = parseFloat(price); this.deliveryProductPrice = parseFloat(price);
} }
// Get translated product name from data attribute (auto-translated by Odoo server) // Get translated product name from data attribute (auto-translated by Odoo server)
var productName = page.getAttribute("data-delivery-product-name"); var productName = checkoutPage.getAttribute("data-delivery-product-name");
if (productName) { if (productName) {
this.deliveryProductName = productName; this.deliveryProductName = productName;
console.log( console.log(
@ -57,37 +41,25 @@
} }
// Check if home delivery is enabled for this order // Check if home delivery is enabled for this order
var homeDeliveryAttr = page.getAttribute("data-home-delivery-enabled"); var homeDeliveryAttr = checkoutPage.getAttribute("data-home-delivery-enabled");
this.homeDeliveryEnabled = this.homeDeliveryEnabled =
homeDeliveryAttr === "true" || homeDeliveryAttr === "True"; homeDeliveryAttr === "true" || homeDeliveryAttr === "True";
console.log("[HomeDelivery] Home delivery enabled:", this.homeDeliveryEnabled); console.log("[HomeDelivery] Home delivery enabled:", this.homeDeliveryEnabled);
// Show/hide home delivery section based on configuration (only on checkout) // Show/hide home delivery section based on configuration
if (checkoutPage) {
this.toggleHomeDeliverySection(); this.toggleHomeDeliverySection();
} }
}
// Get order ID from multiple possible sources // Get order ID from confirm button
var confirmBtn = document.getElementById("confirm-order-btn"); var confirmBtn = document.getElementById("confirm-order-btn");
var cartContainer = document.getElementById("cart-items-container"); if (confirmBtn) {
var orderIdElement = confirmBtn || cartContainer; this.orderId = confirmBtn.getAttribute("data-order-id");
console.log("[HomeDelivery] orderId from button:", this.orderId);
if (orderIdElement) {
this.orderId = orderIdElement.getAttribute("data-order-id");
} }
// If still not found, try to extract from URL
if (!this.orderId) {
var urlMatch = window.location.pathname.match(/\/eskaera\/(\d+)/);
this.orderId = urlMatch ? urlMatch[1] : null;
}
console.log("[HomeDelivery] orderId resolved:", this.orderId);
// Handle checkbox (only exists on checkout page)
var checkbox = document.getElementById("home-delivery-checkbox"); var checkbox = document.getElementById("home-delivery-checkbox");
if (checkbox) { if (!checkbox) return;
var self = this; var self = this;
checkbox.addEventListener("change", function () { checkbox.addEventListener("change", function () {
if (this.checked) { if (this.checked) {
@ -101,59 +73,6 @@
// Check if delivery product is already in cart on page load // Check if delivery product is already in cart on page load
this.checkDeliveryInCart(); this.checkDeliveryInCart();
}
// Vincular botón Home Delivery en el shop SOLO si hay un producto de delivery válido
if (this.deliveryProductId && this.homeDeliveryEnabled) {
this.bindShopHomeDeliveryButton();
} else {
console.log(
"[HomeDelivery] Shop button NOT bound - no delivery product or disabled"
);
}
},
bindShopHomeDeliveryButton: function () {
var self = this;
var homeDeliveryBtn = document.getElementById("home-delivery-btn");
if (homeDeliveryBtn) {
console.log("[HomeDelivery] Binding shop home delivery button");
homeDeliveryBtn.addEventListener("click", function () {
var cart = self.getCart();
var isInCart = cart[self.deliveryProductId];
if (isInCart) {
// Remove delivery product
console.log("[HomeDelivery] Removing delivery product from shop cart");
self.removeDeliveryProduct();
homeDeliveryBtn.classList.remove("active", "btn-warning");
homeDeliveryBtn.classList.add("btn-outline-warning");
} else {
// Add delivery product
console.log("[HomeDelivery] Adding delivery product from shop cart");
self.addDeliveryProduct();
homeDeliveryBtn.classList.remove("btn-outline-warning");
homeDeliveryBtn.classList.add("active", "btn-warning");
}
// Trigger cart reload to update UI
if (typeof window.renderCheckoutSummary === "function") {
window.renderCheckoutSummary();
}
});
// Set initial button state
var cart = self.getCart();
if (cart[self.deliveryProductId]) {
homeDeliveryBtn.classList.add("active", "btn-warning");
homeDeliveryBtn.classList.remove("btn-outline-warning");
} else {
homeDeliveryBtn.classList.add("btn-outline-warning");
homeDeliveryBtn.classList.remove("active", "btn-warning");
}
}
}, },
toggleHomeDeliverySection: function () { toggleHomeDeliverySection: function () {
@ -214,6 +133,7 @@
localStorage.setItem(cartKey, JSON.stringify(cart)); localStorage.setItem(cartKey, JSON.stringify(cart));
// Re-render checkout summary without reloading // Re-render checkout summary without reloading
var self = this;
setTimeout(function () { setTimeout(function () {
// Use the global function from checkout_labels.js // Use the global function from checkout_labels.js
if (typeof window.renderCheckoutSummary === "function") { if (typeof window.renderCheckoutSummary === "function") {

View file

@ -80,13 +80,13 @@
<group string="Delivery"> <group string="Delivery">
<field name="delivery_notice" placeholder="Information about home delivery..." nolabel="1"/> <field name="delivery_notice" placeholder="Information about home delivery..." nolabel="1"/>
</group> </group>
<group string="Product Catalog"> <group string="Catálogo de Productos">
<group string="Included Products" col="2"> <group string="Productos Incluidos" col="2">
<field name="supplier_ids" widget="many2many_tags" help="All products from these suppliers will be included"/> <field name="supplier_ids" widget="many2many_tags" help="All products from these suppliers will be included"/>
<field name="category_ids" widget="many2many_tags" help="All products in these categories (including subcategories) will be included"/> <field name="category_ids" widget="many2many_tags" help="All products in these categories (including subcategories) will be included"/>
<field name="product_ids" widget="many2many_tags" help="Specific products to include directly"/> <field name="product_ids" widget="many2many_tags" help="Specific products to include directly"/>
</group> </group>
<group string="Excluded Products" col="2"> <group string="Productos Excluidos" col="2">
<field name="excluded_supplier_ids" widget="many2many_tags" help="Suppliers excluded from this order. Products with these suppliers as main seller will not be available (blacklist has absolute priority)"/> <field name="excluded_supplier_ids" widget="many2many_tags" help="Suppliers excluded from this order. Products with these suppliers as main seller will not be available (blacklist has absolute priority)"/>
<field name="excluded_category_ids" widget="many2many_tags" help="Categories excluded from this order. Products in these categories and all their subcategories will not be available (blacklist has absolute priority)"/> <field name="excluded_category_ids" widget="many2many_tags" help="Categories excluded from this order. Products in these categories and all their subcategories will not be available (blacklist has absolute priority)"/>
<field name="excluded_product_ids" widget="many2many_tags" help="Products explicitly excluded from this order (blacklist has absolute priority over inclusions)"/> <field name="excluded_product_ids" widget="many2many_tags" help="Products explicitly excluded from this order (blacklist has absolute priority over inclusions)"/>

File diff suppressed because it is too large Load diff