addons-cm/website_sale_aplicoop
GitHub Copilot f2194c5367 [ADD] website_sale_disable_cart: extract cart restriction from website_sale_aplicoop
The "shop as a read-only catalog" behaviour lived inside website_sale_aplicoop,
so every site that wanted the eskaera flow also lost the standard cart. It now
ships as its own installable addon, with the redirect target configurable
instead of hardcoded to /eskaera.

- website_sale_disable_cart: hides the cart UI (12 header styles + the product
  card quick-add) and overrides the standard cart endpoints. Redirect URL is
  configurable in Website settings (default /shop); only site-internal paths are
  accepted, so a misconfigured value cannot turn the shop into an open redirect
  nor loop back into a disabled route.
- Fixes carried over from the original code: /shop/cart/quantity is the Odoo 18
  path (it was /shop/cart_quantity, which never matched), the boxed, sidebar and
  sales two/three/four headers were not covered (the cart link stayed visible on
  them), and the routes now override the standard methods instead of registering
  duplicate ones.
- website_sale_aplicoop 18.0.1.12.0: drops the view file and the four redirect
  routes; installing it no longer touches the standard shop.

Upgrade order matters: update website_sale_aplicoop first, then install
website_sale_disable_cart in a second Odoo run — both use the same XPaths and
obsolete records are only cleaned up at the end of a run.

Tests: 8/8 in website_sale_disable_cart, aplicoop unaffected (its 2 failures
predate this change). Verified live on a DB clone: /shop/cart returns 303 to the
configured URL and no cart markup remains on /shop.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-06 11:34:59 +02:00
..
controllers [ADD] website_sale_disable_cart: extract cart restriction from website_sale_aplicoop 2026-08-06 11:34:59 +02:00
data [IMP] website_sale_aplicoop: render user-defined website_sale ribbon alongside stock ribbon 2026-05-29 18:11:47 +02:00
demo demo files 2026-02-27 13:43:56 +01:00
i18n [IMP] website_sale_aplicoop: automate non-weekly group order cycles 2026-07-15 16:26:14 +02:00
migrations lint: fix linter warnings (log exceptions, disable attribute-string-redundant, suppress C901 where necessary) 2026-05-20 16:05:14 +02:00
models [IMP] website_sale_aplicoop: automate non-weekly group order cycles 2026-07-15 16:26:14 +02:00
readme [DOC] Actualizar documentación a estándares OCA y preparar logo CriptoMart 2026-02-21 19:55:57 +01:00
security [IMP] website_sale_aplicoop: mostrar franjas de recogida en formulario group.order 2026-05-20 17:06:38 +02:00
static [IMP] website_sale_aplicoop: filter and cap stock using forecasted net qty 2026-06-12 18:18:40 +02:00
tests [IMP] website_sale_aplicoop: automate non-weekly group order cycles 2026-07-15 16:26:14 +02:00
views [ADD] website_sale_disable_cart: extract cart restriction from website_sale_aplicoop 2026-08-06 11:34:59 +02:00
.codeclimate.yml [FIX] website_sale_aplicoop: Remove redundant string= attributes and fix OCA linting warnings 2026-02-18 17:54:43 +01:00
.editorconfig Aplicoop desde el repo de kidekoop 2026-02-11 15:32:11 +01:00
.gitignore Aplicoop desde el repo de kidekoop 2026-02-11 15:32:11 +01:00
.pre-commit-config.yaml [FIX] website_sale_aplicoop: Remove redundant string= attributes and fix OCA linting warnings 2026-02-18 17:54:43 +01:00
__init__.py Aplicoop desde el repo de kidekoop 2026-02-11 15:32:11 +01:00
__manifest__.py [ADD] website_sale_disable_cart: extract cart restriction from website_sale_aplicoop 2026-08-06 11:34:59 +02:00
CHANGELOG.md [ADD] website_sale_disable_cart: extract cart restriction from website_sale_aplicoop 2026-08-06 11:34:59 +02:00
LICENSE.txt Aplicoop desde el repo de kidekoop 2026-02-11 15:32:11 +01:00
README.rst [ADD] website_sale_disable_cart: extract cart restriction from website_sale_aplicoop 2026-08-06 11:34:59 +02:00
README_DEV.md [ADD] website_sale_disable_cart: extract cart restriction from website_sale_aplicoop 2026-08-06 11:34:59 +02:00
setup.py [FIX] website_sale_aplicoop: Remove redundant string= attributes and fix OCA linting warnings 2026-02-18 17:54:43 +01:00

========================
Website Sale - Aplicoop
========================

.. image:: https://img.shields.io/badge/license-AGPL--3-blue.svg
   :target: https://www.gnu.org/licenses/agpl-3.0-standalone.html
   :alt: License: AGPL-3
.. image:: https://img.shields.io/badge/Python-3.9%2B-blue
   :alt: Python: 3.9+
.. image:: https://img.shields.io/badge/Odoo-18.0-blue
   :alt: Odoo: 18.0

**Website Sale - Aplicoop** is a modern Odoo 18 module that replaces the legacy Aplicoop application with a complete solution for managing collaborative consumption group orders (*eskaera* in Basque).

Description
===========

This module replaces the legacy Aplicoop application with a modern, scalable solution for managing collaborative consumption group orders (*eskaera* in Basque) within Odoo's standard website sales framework.

Features
~~~~~~~~

- **Group Order Management**: Create and manage group orders (eskaera) with customizable state transitions (draft → open → closed/cancelled)
- **Weekly Activity Filtering**: Automatically filter active orders for the current week based on start/end dates and time windows
- **Flexible Scheduling**: Support for optional start/end times to define order availability windows within a day
- **Cutoff Day Support**: Define weekly cutoff days for group orders to control when purchases can be made
- **Product Association**: Link products to specific group orders through Many2many relationships
- **Partner Group Association**: Link partners (users) to groups via Many2many relationships for group-based shopping
- **i18n Support**: Full internationalization with translations for 7 languages (Spanish, French, Catalan, Basque, Galician, Italian, Portuguese)
- **OCA Compliant**: AGPL-3.0 licensed, follows OCA standards for documentation, testing, and code structure

Context / Use Cases
===================

Group orders (*eskaera*) are a business model for collaborative consumption where groups of users collectively purchase products within defined time windows. This module was created to replace the legacy Aplicoop application, providing:

**Business Value:**

- Streamlined group purchasing workflows within Odoo's standard sales framework
- Flexible scheduling to accommodate different group shopping patterns (daily, weekly, biweekly, monthly)
- Clear separation between temporary shopping carts and permanent sales orders
- Support for multiple groups with different suppliers, products, and categories

**Use Cases:**

- Cooperative grocery purchasing groups
- Bulk order consolidation for community members
- Time-limited promotional campaigns with group participation
- Multi-location organizations with shared procurement

Usage
=====

Creating a Group Order
~~~~~~~~~~~~~~~~~~~~~~

1. Go to **Website Sale > Group Orders > Create**
2. Fill in the order details:

   - **Order Name**: Descriptive name (e.g., "Weekly Vegetable Order")
   - **Start Date**: When the order opens for shopping (mandatory)
   - **End Date**: When the order closes (optional; leave empty for permanent orders)
   - **Cutoff Day**: Day of week when purchases stop (0=Monday, 6=Sunday) - mandatory
   - **Start Time**: Optional time when order becomes active (0-24 hours)
   - **End Time**: Optional time when order closes (0-24 hours)
   - **Recurrence Period**: How often the order repeats (daily, weekly, biweekly, monthly)
   - **Suppliers**: Link to product suppliers
   - **Categories**: Product categories available in this order
   - **Groups**: Which user groups can participate

3. Click **Save** and transition the order to **Open** state to allow shopping

Shopping for a Group Order
~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Navigate to the website storefront at ``/eskaera`` (group orders page)
2. View active group orders for your participating groups
3. Select an order to view available products
4. Add products to your cart (separate cart per order)
5. At checkout, confirm your order to convert items to a sales order draft
6. Proceed through standard Odoo checkout workflow

Configuration
~~~~~~~~~~~~~~

**Managing Groups**

1. Go to **Contacts > Groups** (res.partner with is_group=True)
2. Create groups for user communities
3. Add partners/users to groups via the **Members** tab

**Managing Products**

1. Products are linked to group orders via the **Group Orders** field in product settings
2. Set pricing and availability per group order
3. Assign products to categories used in group orders

**Date & Time Validation**

- ``start_date`` must be ≤ ``end_date`` (when both filled)
- ``start_time`` must be < ``end_time`` (when both filled)
- Times must be between 0-24 hours
- Empty end_date = permanent order
- Empty times = no time-based restrictions

Credits
=======

This module was developed by Criptomart in 2025 as a modernization of the Aplicoop application, integrating collaborative consumption group order management directly into Odoo's website sales framework.

The implementation follows OCA standards for:

- Code quality and testing (26 passing tests)
- Documentation structure and multilingual support
- Security and access control
- API design for extensibility

Authors
=======

* Criptomart

Funding
=======

* Elika Bilbo

Contributors
============

* `Criptomart <https://criptomart.net>`_:

  * Project lead and main development
  * Architecture and implementation

**Historical References:**

This module was inspired by the original **Aplicoop** project:

* https://sourceforge.net/projects/aplicoop/
* Original creators: Ekaitz Mendiluze, Joseba Legarreta, and other contributors

The original Aplicoop project served as a pioneering solution for collaborative consumption group orders, and this module brings its functionality to the modern Odoo platform.

Notes - Standard shop and cart
==============================

This module adds the "eskaera" group order flow (``/eskaera``); it no longer
touches the standard ``website_sale`` storefront. The default ``/shop`` and its
shopping cart keep working as usual after installing it.

Sites that want the standard cart disabled — so that the group order flow is
the single shopping experience — should additionally install
``website_sale_disable_cart``, which hides the cart UI and redirects the
standard cart endpoints to a configurable URL. That behaviour used to live in
this module (up to 18.0.1.11.0) and was extracted in 18.0.1.12.0.

::

      docker-compose run --rm odoo odoo -d odoo -i website_sale_disable_cart --stop-after-init

Then set *Website > Configuration > Settings > Disabled Cart > Cart Redirect
URL* to ``/eskaera``.