# Website Sale - Aplicoop **Author:** Criptomart **License:** AGPL-3 **Maintainer:** Criptomart SL ## Summary Modern replacement for legacy Aplicoop - Cooperative group ordering system with separate carts and multi-language support. ## Description Website Sale Aplicoop provides a complete group ordering system designed for cooperative consumption groups. It replaces the legacy Aplicoop system with a modern, scalable solution where customers organize collaborative orders, manage group memberships, and handle separate shopping carts. Perfect for food cooperatives, buying groups, and collective purchasing organizations. ## Features - ✅ Group order management with full lifecycle (draft → confirmed → completed) - ✅ Separate shopping carts per order group - ✅ Group membership tracking with active/inactive states - ✅ Order collection and cutoff dates with validation - ✅ Pickup day configuration and fulfillment tracking - ✅ Multi-language support (ES, PT, GL, CA, EU, FR, IT) - ✅ Partner location management for group coordination - ✅ Product ecosystem integration (ribbons, pricing, margins) - ✅ Order state transitions with email notifications - ✅ Delivery tracking and group order fulfillment - ✅ Financial tracking per group member - ✅ Automatic translation of UI elements - ✅ **Lazy Loading**: Configurable product pagination for fast page loads ## Installation 1. Place addon in Odoo addons folder: `/addons/website_sale_aplicoop` 2. Activate developer mode 3. Go to **Apps** → **Update Apps List** 4. Search for "Website Sale - Aplicoop" 5. Click **Install** ### Requirements - Odoo 18.0+ - Website module - Sale module - Product module - Account module ### Dependencies ``` - base - web - website - sale - product - account ``` ## Usage ### Administrator Setup #### 1. Create a Group Order 1. Go to **Website Sale** → **Group Orders** (or **Coops** → **Órdenes de Grupo**) 2. Click **Create** 3. Fill in: - **Name**: e.g., "Weekly Cooperative Order #5" - **Group**: Select the cooperative group - **Collection Date**: When orders will be collected - **Cutoff Date**: Last moment to add items - **Pickup Date**: When group members collect their orders 4. Save #### 2. Configure Pickup Dates 1. Go to **Settings** → **Website** → **Shop Settings** 2. Configure **Pickup Days**: Define which days are available 3. Set **Group Settings**: Default locations, delivery partners #### 3. Add Group Members 1. Open a Group Order 2. In the **Members** tab, click **Add** 3. Select partner(s) 4. Set active/inactive status 5. Save ### Customer Experience #### For Group Members on Website 1. **Browse Products**: Members see products with eco-ribbons, pricing, margin info 2. **Add to Cart**: Select items (cart is separate per group order) 3. **Review Cart**: See order summary before cutoff date 4. **Submit Order**: Confirm before cutoff time 5. **Receive Notification**: Get email with pickup details 6. **Pickup**: Collect order on designated pickup date #### Order Workflow ``` Draft → Confirmed → Collected → Invoiced → Completed ↓ Cancelled (if member opts out) ``` ## Configuration ### Basic Configuration **Required:** 1. Create group orders with collection/cutoff/pickup dates 2. Assign group members to orders 3. Set available pickup dates **Optional:** 1. Configure custom email templates 2. Set up product-specific group restrictions 3. Customize group order report ### Multi-Language Setup The addon automatically translates: - Interface elements - Form labels - Report headers - Email notifications **Supported Languages:** ES, PT, GL, CA, EU, FR, IT **Translations are managed in:** - `i18n/[language].po` files - Auto-extracted from templates - See `docs/TRANSLATION_CONVENTIONS.md` for translation patterns ### Website Customization Edit templates in: `views/website_templates.xml` Key customizable sections: - `eskaera_page`: Main group order display - `eskaera_details`: Order details view - `member_cart`: Individual member cart interface ## Technical Details ### Core Models **`group.order`** (Main group order) - `name` (Char): Order identifier - `group_id` (Many2one): Link to group - `state` (Selection): draft/confirmed/collected/invoiced/completed/cancelled - `collection_date` (Date): When group collects - `cutoff_date` (Datetime): Last moment to order - `pickup_date` (Date): Member pickup day - `line_ids` (One2many): Order lines - `member_ids` (One2many): Group members - `active` (Boolean): Soft delete **`group.order.line`** (Order items per member) - `order_id` (Many2one): Parent group order - `member_id` (Many2one): Which group member - `product_id` (Many2one): Ordered product - `quantity` (Float): Amount ordered - `unit_price` (Float): Price per unit - `subtotal` (Float): Computed (qty × price) **`group.partner`** (Group member tracking) - `partner_id` (Many2one): Odoo partner - `group_id` (Many2one): Which group - `active` (Boolean): Active member status - `role` (Selection): admin/member ### Extended Models **`product.template`** - `group_order_allowed` (Boolean): Can be in group orders - `eco_ribbon_id` (Many2one): Environmental ribbon - `margin_type_id` (Many2one): Pricing margin **`sale.order`** - `group_order_id` (Many2one): Parent group order (if applicable) ### Views & Templates **Backend Views:** - `group.order` list/form views - `group.order.line` inline form - `group.partner` configuration view **Frontend Templates:** - `eskaera_page`: Main group order display - `eskaera_details`: Order details/summary - `member_cart`: Individual cart interface - `group_members`: Member list view ## Integration Points This addon integrates with: - **Product Modules** - `product_eco_ribbon` - Eco-friendly product indicators - `product_margin_type` - Dynamic product pricing - `product_pricing_margins` - Cost management - **Website/E-commerce** - `elika_bilbo_website_theme` - Custom website theme - `website_sale` - Core shop functionality - `website_legal_es` - Legal compliance (Spanish) - **Sales/Accounting** - `sale` - Sales order generation - `account` - Invoicing ## Testing Run tests with: ```bash cd /home/snt/Documentos/lab/odoo/kidekoop/odoo-addons python -m pytest website_sale_aplicoop/tests/ -v ``` **Test Coverage:** - ✅ Group order creation/deletion - ✅ Member management - ✅ Order line addition/removal - ✅ State transitions - ✅ Cutoff date validation - ✅ Pickup date assignment - ✅ Translation extraction (7 languages) - ✅ Website template rendering ## Known Limitations - Group orders are company-specific - Cannot change pickup date after order is confirmed - Members cannot modify orders after cutoff - Automatic invoicing must be triggered manually ## Changelog ### 18.0.1.3.1 (2026-02-18) - **Date Calculation Fixes (Critical)**: - Fixed `_compute_cutoff_date` logic: Changed `days_ahead <= 0` to `days_ahead < 0` to allow cutoff_date to be the same day as today - Enabled `store=True` for `delivery_date` field to persist calculated values and enable database filtering - Added constraint `_check_cutoff_before_pickup` to validate that pickup_day >= cutoff_day in weekly orders - Added `@api.onchange` methods for immediate UI feedback when changing cutoff_day or pickup_day - **Automatic Date Updates**: - Created daily cron job `_cron_update_dates` to automatically recalculate dates for active orders - Ensures computed dates stay current as time passes - **UI Improvements**: - Added "Calculated Dates" section in form view showing readonly cutoff_date, pickup_date, and delivery_date - Improved visibility of automatically calculated dates for administrators - **Testing**: - Added 6 regression tests with `@tagged('post_install', 'date_calculations')`: - `test_cutoff_same_day_as_today_bug_fix`: Validates cutoff can be today - `test_delivery_date_stored_correctly`: Ensures delivery_date persistence - `test_constraint_cutoff_before_pickup_invalid`: Tests invalid configurations are rejected - `test_constraint_cutoff_before_pickup_valid`: Tests valid configurations work - `test_all_weekday_combinations_consistency`: Tests all 49 date combinations - `test_cron_update_dates_executes`: Validates cron job execution - **Documentation**: - Documented that this is a more robust fix than v18.0.1.2.0, addressing edge cases in date calculations ### 18.0.1.3.0 (2026-02-16) - **Performance**: Lazy loading of products for faster page loads - Configurable product pagination (default: 20 per page) - New Settings: Enable Lazy Loading, Products Per Page - Page 1: 500-800ms load time (vs 10-20s before) - Subsequent pages: 200-400ms via AJAX - New endpoint: `GET /eskaera//load-page?page=N` - **Templates**: Split product rendering into reusable template - New: `eskaera_shop_products` template - Backend: `_get_products_paginated()` in group_order model - **JavaScript**: Load More button with event handling - `_attachLoadMoreListener()` for AJAX pagination - Spinner during load (button disabled + "Loading..." text) - Re-attach event listeners for new products - Auto-hide button when no more products - Documentation: Added `docs/LAZY_LOADING.md` with full technical details ### 18.0.1.2.0 (2026-02-02) - UI Improvements: - Increased cart text size (2x) for better readability - Increased cart icon sizes (1.2rem) with proper button proportions - Enlarged "Save as Draft" button in checkout (2x text and icon) - Date Calculation Fixes: - Fixed pickup_date calculation (was adding extra week incorrectly) - Simplified pickup_date computation logic - Display Enhancements: - Added delivery_date display to all order pages - Improved date field visibility on order cards and product pages ### 18.0.1.0.0 (2024-12-20) - Initial release - Core group order functionality - Multi-language translation support - Complete member management - Order state machine implementation ### 18.0.1.1.0 (2025-01-10) - Fixed translation extraction for "Pickup day" and "Cutoff day" - Improved QWeb template for better performance - Added comprehensive documentation ## Support For issues, feature requests, or contributions: - **Repository**: https://git.criptomart.net/KideKoop/kidekoop/odoo-addons - **Main Documentation**: `/docs/` folder (transversal docs) - **Addon Documentation**: This README + `/docs/ODOO18_TRANSLATIONS_LEARNINGS.md` - **Maintainer**: Criptomart SL ## Documentation References - **Translation Patterns**: See `docs/TRANSLATION_CONVENTIONS.md` - **Translation Examples**: See `docs/TRANSLATION_EXAMPLES.md` - **Odoo 18 Translation Guide**: See `docs/ODOO18_TRANSLATIONS_LEARNINGS.md` - **Project Architecture**: See `docs/ARCHITECTURE.md` ## Related Modules - `product_eco_ribbon` - Product environmental classification - `product_margin_type` - Dynamic product pricing - `product_pricing_margins` - Complete pricing system - `elika_bilbo_website_theme` - Custom website theme - `website_legal_es` - Legal compliance --- **Version:** 18.0.1.3.1 **Odoo:** 18.0+ **License:** AGPL-3 **Maintainer:** Criptomart SL **Repository:** https://git.criptomart.net/KideKoop/kidekoop/odoo-addons