This commit is contained in:
snt 2026-02-12 18:33:57 +01:00
parent f5a689bcc8
commit c308d538a3
3 changed files with 217 additions and 419 deletions

View file

@ -83,7 +83,7 @@ Este repositorio contiene addons personalizados y modificados de Odoo 18.0. El p
Pedir al usuario generar a través de UI, no sabemos el método correcto para exportar SÓLO las cadenas del addon sin incluir todo el sistema. Pedir al usuario generar a través de UI, no sabemos el método correcto para exportar SÓLO las cadenas del addon sin incluir todo el sistema.
``` ```
Usar sólo polib para trataer los archivos .po, msmerge corrompe los archivos. Usar sólo polib y apend cadenas en los archivos .po, msmerge corrompe los archivos.
``` ```

View file

@ -8,6 +8,7 @@
"summary": "Add default price category to suppliers and bulk update products", "summary": "Add default price category to suppliers and bulk update products",
"author": "Odoo Community Association (OCA), Criptomart", "author": "Odoo Community Association (OCA), Criptomart",
"license": "AGPL-3", "license": "AGPL-3",
"website": "https://git.criptomart.net/criptomart/addons-cm",
"depends": ["product_price_category", "sales_team", "product_main_seller"], "depends": ["product_price_category", "sales_team", "product_main_seller"],
"data": [ "data": [
"security/ir.model.access.csv", "security/ir.model.access.csv",

View file

@ -5,29 +5,19 @@
<!-- Template: Group Orders Page (Eskaera) --> <!-- Template: Group Orders Page (Eskaera) -->
<template id="eskaera_page" name="Eskaera Page"> <template id="eskaera_page" name="Eskaera Page">
<t t-call="website.layout"> <t t-call="website.layout">
<div <div id="wrap" class="eskaera-page oe_structure oe_empty" data-name="Eskaera Orders">
id="wrap"
class="eskaera-page oe_structure oe_empty"
data-name="Eskaera Orders"
>
<div class="container"> <div class="container">
<div class="row"> <div class="row">
<div class="col-lg-12"> <div class="col-lg-12">
<h1>Available Orders</h1> <h1>Available Orders</h1>
<p <p class="text-muted" role="status">Browse and select an order to view its products.</p>
class="text-muted"
role="status"
>Browse and select an order to view its products.</p>
</div> </div>
</div> </div>
<div class="row mt-4"> <div class="row mt-4">
<div class="col-lg-12"> <div class="col-lg-12">
<!-- Editable area: Above orders list --> <!-- Editable area: Above orders list -->
<div <div class="oe_structure oe_empty" data-name="Before Orders" />
class="oe_structure oe_empty"
data-name="Before Orders"
/>
<t t-if="active_orders"> <t t-if="active_orders">
<div <div
@ -317,13 +307,8 @@
</t> </t>
<t t-else=""> <t t-else="">
<div class="eskaera-empty-state"> <div class="eskaera-empty-state">
<div <div class="alert alert-info" role="status" aria-live="polite">
class="alert alert-info" <p>No group orders available this week.</p>
role="status"
aria-live="polite"
>
<p
>No group orders available this week.</p>
</div> </div>
</div> </div>
</t> </t>
@ -386,10 +371,7 @@
<t t-esc="_('Thank you! Your order has been confirmed.')" /> <t t-esc="_('Thank you! Your order has been confirmed.')" />
</template> </template>
<template <template id="confirm_pickup_label_snippet" name="Confirm Pickup Label Snippet">
id="confirm_pickup_label_snippet"
name="Confirm Pickup Label Snippet"
>
<t t-esc="_('Pickup Day')" /> <t t-esc="_('Pickup Day')" />
</template> </template>
@ -397,25 +379,14 @@
<template id="order_header" name="Order Header"> <template id="order_header" name="Order Header">
<div t-att-class="header_class or 'eskaera-order-header'"> <div t-att-class="header_class or 'eskaera-order-header'">
<div class="d-flex gap-5 align-items-center mb-4"> <div class="d-flex gap-5 align-items-center mb-4">
<t <t t-set="image_to_show" t-value="group_order.image or (group_order.group_ids[0].image_1920 if group_order.group_ids else False)" />
t-set="image_to_show"
t-value="group_order.image or (group_order.group_ids[0].image_1920 if group_order.group_ids else False)"
/>
<t t-if="image_to_show"> <t t-if="image_to_show">
<img <img t-att-src="image_data_uri(image_to_show)" alt="Order image" class="order-thumbnail-md" />
t-att-src="image_data_uri(image_to_show)"
alt="Order image"
class="order-thumbnail-md"
/>
</t> </t>
<div class="flex-grow-1"> <div class="flex-grow-1">
<h1 class="mb-2"><t <h1 class="mb-2"><t t-esc="header_title or group_order.name" /></h1>
t-esc="header_title or group_order.name"
/></h1>
<t t-if="group_order.description"> <t t-if="group_order.description">
<p class="text-muted mb-0 order-desc-full"><t <p class="text-muted mb-0 order-desc-full"><t t-esc="group_order.description" /></p>
t-esc="group_order.description"
/></p>
</t> </t>
</div> </div>
</div> </div>
@ -425,41 +396,24 @@
<!-- Template: Group Order Shop (Eskaera) --> <!-- Template: Group Order Shop (Eskaera) -->
<template id="eskaera_shop" name="Eskaera Shop"> <template id="eskaera_shop" name="Eskaera Shop">
<t t-call="website.layout"> <t t-call="website.layout">
<div <div id="wrap" class="eskaera-shop-page oe_structure oe_empty" data-name="Eskaera Shop">
id="wrap"
class="eskaera-shop-page oe_structure oe_empty"
data-name="Eskaera Shop"
>
<div class="container"> <div class="container">
<!-- Order Header Info Panel --> <!-- Order Header Info Panel -->
<div class="row mb-4"> <div class="row mb-4">
<div class="col-lg-12"> <div class="col-lg-12">
<t t-call="website_sale_aplicoop.order_header"> <t t-call="website_sale_aplicoop.order_header">
<t <t t-set="header_class" t-value="'eskaera-order-header'" />
t-set="header_class"
t-value="'eskaera-order-header'"
/>
</t> </t>
<div class="eskaera-order-header"> <div class="eskaera-order-header">
<div class="order-info-grid"> <div class="order-info-grid">
<div class="info-item"> <div class="info-item">
<span <span t-att-class="'info-label'">Consumer Groups</span>
t-att-class="'info-label'" <span class="info-value"><t t-esc="', '.join(group_order.group_ids.mapped('name'))" /></span>
>Consumer Groups</span>
<span class="info-value"><t
t-esc="', '.join(group_order.group_ids.mapped('name'))"
/></span>
</div> </div>
<t t-if="group_order.cutoff_day"> <t t-if="group_order.cutoff_day">
<div class="info-item"> <div class="info-item">
<span <span t-att-class="'info-label'">Cutoff Day</span>
t-att-class="'info-label'" <span class="info-value"><t t-esc="day_names[int(group_order.cutoff_day) % 7]" /> (<t t-esc="group_order.cutoff_date.strftime('%d/%m/%Y')" />)</span>
>Cutoff Day</span>
<span class="info-value"><t
t-esc="day_names[int(group_order.cutoff_day) % 7]"
/> (<t
t-esc="group_order.cutoff_date.strftime('%d/%m/%Y')"
/>)</span>
</div> </div>
</t> </t>
<t t-if="group_order.pickup_day"> <t t-if="group_order.pickup_day">
@ -519,31 +473,14 @@
<div class="col-md-7"> <div class="col-md-7">
<!-- CRITICAL: This input is NOT inside a form to prevent Odoo from transforming it --> <!-- CRITICAL: This input is NOT inside a form to prevent Odoo from transforming it -->
<!-- It must remain a pure HTML input element for realtime_search.js to detect value changes --> <!-- It must remain a pure HTML input element for realtime_search.js to detect value changes -->
<input <input type="text" id="realtime-search-input" class="form-control realtime-search-box search-input-styled" placeholder="Search products..." autocomplete="off" />
type="text"
id="realtime-search-input"
class="form-control realtime-search-box search-input-styled"
placeholder="Search products..."
autocomplete="off"
/>
</div> </div>
<div class="col-md-5"> <div class="col-md-5">
<select <select name="category" id="realtime-category-select" class="form-select">
name="category" <option value="">Browse Product Categories</option>
id="realtime-category-select"
class="form-select"
>
<option
value=""
>Browse Product Categories</option>
<!-- Macro para renderizar categorías recursivamente --> <!-- Macro para renderizar categorías recursivamente -->
<t <t t-call="website_sale_aplicoop.category_hierarchy_options">
t-call="website_sale_aplicoop.category_hierarchy_options" <t t-set="categories" t-value="category_hierarchy" />
>
<t
t-set="categories"
t-value="category_hierarchy"
/>
<t t-set="depth" t-value="0" /> <t t-set="depth" t-value="0" />
</t> </t>
</select> </select>
@ -607,10 +544,7 @@
<!-- Products Column --> <!-- Products Column -->
<div class="col-lg-9"> <div class="col-lg-9">
<!-- Editable area: Above search/filter --> <!-- Editable area: Above search/filter -->
<div <div class="oe_structure oe_empty" data-name="Before Products Filter" />
class="oe_structure oe_empty"
data-name="Before Products Filter"
/>
<t t-if="products"> <t t-if="products">
<div class="products-grid"> <div class="products-grid">
@ -827,11 +761,7 @@
</div> </div>
</t> </t>
<t t-else=""> <t t-else="">
<div <div class="alert alert-warning" role="status" aria-live="polite">
class="alert alert-warning"
role="status"
aria-live="polite"
>
<p>No products available in this order.</p> <p>No products available in this order.</p>
</div> </div>
</t> </t>
@ -851,25 +781,10 @@
<div <div
class="card-header d-flex justify-content-between align-items-center gap-1" class="card-header d-flex justify-content-between align-items-center gap-1"
> >
<h6 <h6 class="mb-0 cart-title-sm" id="cart-title">My Cart</h6>
class="mb-0 cart-title-sm" <div class="btn-group cart-btn-group gap-0" role="group">
id="cart-title" <button type="button" class="btn btn-primary cart-btn-compact" id="save-cart-btn" t-attf-data-order-id="{{ group_order.id }}" data-bs-title="Save Cart" data-bs-toggle="tooltip">
>My Cart</h6> <i class="fa fa-save cart-icon-size" />
<div
class="btn-group cart-btn-group gap-0"
role="group"
>
<button
type="button"
class="btn btn-primary cart-btn-compact"
id="save-cart-btn"
t-attf-data-order-id="{{ group_order.id }}"
data-bs-title="Save Cart"
data-bs-toggle="tooltip"
>
<i
class="fa fa-save cart-icon-size"
/>
</button> </button>
<button <button
type="button" type="button"
@ -897,25 +812,11 @@
</a> </a>
</div> </div>
</div> </div>
<div <div class="card-body cart-body-lg" id="cart-items-container" t-attf-data-order-id="{{ group_order.id }}" aria-labelledby="cart-title" aria-live="polite" aria-relevant="additions removals">
class="card-body cart-body-lg" <p class="text-muted">This order's cart is empty</p>
id="cart-items-container"
t-attf-data-order-id="{{ group_order.id }}"
aria-labelledby="cart-title"
aria-live="polite"
aria-relevant="additions removals"
>
<p class="text-muted">
This order's cart is empty
</p>
</div> </div>
<div class="card-footer bg-white text-center"> <div class="card-footer bg-white text-center">
<a <a t-attf-href="/eskaera/{{ group_order.id }}/checkout" class="btn btn-success checkout-btn-lg" data-bs-title="Proceed to Checkout" data-bs-toggle="tooltip">
t-attf-href="/eskaera/{{ group_order.id }}/checkout"
class="btn btn-success checkout-btn-lg"
data-bs-title="Proceed to Checkout"
data-bs-toggle="tooltip"
>
Proceed to Checkout Proceed to Checkout
</a> </a>
</div> </div>
@ -927,33 +828,15 @@
<!-- Scripts (in dependency order) --> <!-- Scripts (in dependency order) -->
<!-- Load i18n_manager first - fetches translations from server --> <!-- Load i18n_manager first - fetches translations from server -->
<script <script type="text/javascript" src="/website_sale_aplicoop/static/src/js/i18n_manager.js" />
type="text/javascript"
src="/website_sale_aplicoop/static/src/js/i18n_manager.js"
/>
<!-- Keep legacy helpers for backwards compatibility --> <!-- Keep legacy helpers for backwards compatibility -->
<script <script type="text/javascript" src="/website_sale_aplicoop/static/src/js/i18n_helpers.js" />
type="text/javascript"
src="/website_sale_aplicoop/static/src/js/i18n_helpers.js"
/>
<!-- Main shop functionality (depends on i18nManager) --> <!-- Main shop functionality (depends on i18nManager) -->
<script <script type="text/javascript" src="/website_sale_aplicoop/static/src/js/website_sale.js" />
type="text/javascript"
src="/website_sale_aplicoop/static/src/js/website_sale.js"
/>
<!-- UI enhancements --> <!-- UI enhancements -->
<script <script type="text/javascript" src="/website_sale_aplicoop/static/src/js/checkout_labels.js" />
type="text/javascript" <script type="text/javascript" src="/website_sale_aplicoop/static/src/js/home_delivery.js" />
src="/website_sale_aplicoop/static/src/js/checkout_labels.js" <script type="text/javascript" src="/website_sale_aplicoop/static/src/js/realtime_search.js" />
/>
<script
type="text/javascript"
src="/website_sale_aplicoop/static/src/js/home_delivery.js"
/>
<script
type="text/javascript"
src="/website_sale_aplicoop/static/src/js/realtime_search.js"
/>
<!-- Initialize tooltips using native title attribute --> <!-- Initialize tooltips using native title attribute -->
<script type="text/javascript"> <script type="text/javascript">
@ -996,10 +879,7 @@
<!-- Sub-template: Checkout Order Summary Table with Translations --> <!-- Sub-template: Checkout Order Summary Table with Translations -->
<template id="eskaera_checkout_summary" name="Checkout Order Summary"> <template id="eskaera_checkout_summary" name="Checkout Order Summary">
<div class="checkout-summary-container"> <div class="checkout-summary-container">
<table <table class="table table-hover checkout-summary-table" id="checkout-summary-table">
class="table table-hover checkout-summary-table"
id="checkout-summary-table"
>
<thead class="table-dark"> <thead class="table-dark">
<tr> <tr>
<th class="col-name">Product</th> <th class="col-name">Product</th>
@ -1020,10 +900,7 @@
<div class="checkout-total-section"> <div class="checkout-total-section">
<div class="total-row"> <div class="total-row">
<span class="total-label">Total</span>: <span class="total-label">Total</span>:
<span <span class="total-amount" id="checkout-total-amount">0.00</span>
class="total-amount"
id="checkout-total-amount"
>0.00</span>
<span class="currency"></span> <span class="currency"></span>
</div> </div>
</div> </div>
@ -1033,35 +910,15 @@
<!-- Template: Group Order Checkout (Eskaera) --> <!-- Template: Group Order Checkout (Eskaera) -->
<template id="eskaera_checkout" name="Eskaera Checkout"> <template id="eskaera_checkout" name="Eskaera Checkout">
<t t-call="website.layout"> <t t-call="website.layout">
<div <div id="wrap" class="eskaera-checkout-page oe_structure oe_empty" data-name="Eskaera Checkout" t-attf-data-delivery-product-id="{{ delivery_product_id }}" t-attf-data-delivery-product-name="{{ delivery_product_name }}" t-attf-data-delivery-product-price="{{ delivery_product_price }}" t-attf-data-home-delivery-enabled="{{ 'true' if group_order.home_delivery else 'false' }}" t-attf-data-pickup-day="{{ group_order.pickup_day }}" t-attf-data-pickup-date="{{ group_order.pickup_date.strftime('%d/%m/%Y') if group_order.pickup_date else '' }}" t-attf-data-delivery-notice="{{ (group_order.delivery_notice or '').replace(chr(10), ' ').replace(chr(13), ' ') }}">
id="wrap"
class="eskaera-checkout-page oe_structure oe_empty"
data-name="Eskaera Checkout"
t-attf-data-delivery-product-id="{{ delivery_product_id }}"
t-attf-data-delivery-product-name="{{ delivery_product_name }}"
t-attf-data-delivery-product-price="{{ delivery_product_price }}"
t-attf-data-home-delivery-enabled="{{ 'true' if group_order.home_delivery else 'false' }}"
t-attf-data-pickup-day="{{ group_order.pickup_day }}"
t-attf-data-pickup-date="{{ group_order.pickup_date.strftime('%d/%m/%Y') if group_order.pickup_date else '' }}"
t-attf-data-delivery-notice="{{ (group_order.delivery_notice or '').replace(chr(10), ' ').replace(chr(13), ' ') }}"
>
<div class="container mt-5"> <div class="container mt-5">
<div class="row"> <div class="row">
<div class="col-lg-10 offset-lg-1"> <div class="col-lg-10 offset-lg-1">
<!-- Header Section --> <!-- Header Section -->
<div class="mb-4"> <div class="mb-4">
<t <t t-call="website_sale_aplicoop.order_header">
t-call="website_sale_aplicoop.order_header" <t t-set="header_class" t-value="'checkout-header'" />
> <t t-set="header_title">Confirm Order: <t t-esc="group_order.name" /></t>
<t
t-set="header_class"
t-value="'checkout-header'"
/>
<t
t-set="header_title"
>Confirm Order: <t
t-esc="group_order.name"
/></t>
</t> </t>
</div> </div>
@ -1208,16 +1065,8 @@
<div class="card border-0 shadow-sm mb-4"> <div class="card border-0 shadow-sm mb-4">
<div class="card-body"> <div class="card-body">
<div class="form-check"> <div class="form-check">
<input <input type="checkbox" class="form-check-input" id="home-delivery-checkbox" name="home_delivery" />
type="checkbox" <label class="form-check-label fw-bold" for="home-delivery-checkbox">Home Delivery</label>
class="form-check-input"
id="home-delivery-checkbox"
name="home_delivery"
/>
<label
class="form-check-label fw-bold"
for="home-delivery-checkbox"
>Home Delivery</label>
</div> </div>
<div <div
id="delivery-info-alert" id="delivery-info-alert"
@ -1295,39 +1144,13 @@
</div> </div>
<!-- Action Buttons --> <!-- Action Buttons -->
<div <div class="checkout-actions d-grid gap-3" id="checkout-form-labels">
class="checkout-actions d-grid gap-3" <button class="btn btn-success btn-lg" id="confirm-order-btn" t-attf-data-order-id="{{ group_order.id }}" data-confirmed-label="Order confirmed" data-pickup-label="Pickup Day" aria-label="Confirm and send order" data-bs-title="Confirm Order" data-bs-toggle="tooltip">
id="checkout-form-labels" <i class="fa fa-check-circle" aria-hidden="true" t-translation="off" />
>
<button
class="btn btn-success btn-lg"
id="confirm-order-btn"
t-attf-data-order-id="{{ group_order.id }}"
data-confirmed-label="Order confirmed"
data-pickup-label="Pickup Day"
aria-label="Confirm and send order"
data-bs-title="Confirm Order"
data-bs-toggle="tooltip"
>
<i
class="fa fa-check-circle"
aria-hidden="true"
t-translation="off"
/>
<span>Confirm Order</span> <span>Confirm Order</span>
</button> </button>
<a <a t-attf-href="/eskaera/{{ group_order.id }}" class="btn btn-outline-secondary btn-lg" aria-label="Back to cart page" data-bs-title="Back to Cart" data-bs-toggle="tooltip">
t-attf-href="/eskaera/{{ group_order.id }}" <i class="fa fa-arrow-left" aria-hidden="true" t-translation="off" />
class="btn btn-outline-secondary btn-lg"
aria-label="Back to cart page"
data-bs-title="Back to Cart"
data-bs-toggle="tooltip"
>
<i
class="fa fa-arrow-left"
aria-hidden="true"
t-translation="off"
/>
<span>Back to Cart</span> <span>Back to Cart</span>
</a> </a>
</div> </div>
@ -1350,33 +1173,15 @@
</script> </script>
<!-- Scripts (in dependency order) --> <!-- Scripts (in dependency order) -->
<!-- Load i18n_manager first - fetches translations from server --> <!-- Load i18n_manager first - fetches translations from server -->
<script <script type="text/javascript" src="/website_sale_aplicoop/static/src/js/i18n_manager.js" />
type="text/javascript"
src="/website_sale_aplicoop/static/src/js/i18n_manager.js"
/>
<!-- Keep legacy helpers for backwards compatibility --> <!-- Keep legacy helpers for backwards compatibility -->
<script <script type="text/javascript" src="/website_sale_aplicoop/static/src/js/i18n_helpers.js" />
type="text/javascript"
src="/website_sale_aplicoop/static/src/js/i18n_helpers.js"
/>
<!-- Main shop functionality (depends on i18nManager) --> <!-- Main shop functionality (depends on i18nManager) -->
<script <script type="text/javascript" src="/website_sale_aplicoop/static/src/js/website_sale.js" />
type="text/javascript"
src="/website_sale_aplicoop/static/src/js/website_sale.js"
/>
<!-- UI enhancements --> <!-- UI enhancements -->
<script <script type="text/javascript" src="/website_sale_aplicoop/static/src/js/checkout_labels.js" />
type="text/javascript" <script type="text/javascript" src="/website_sale_aplicoop/static/src/js/home_delivery.js" />
src="/website_sale_aplicoop/static/src/js/checkout_labels.js" <script type="text/javascript" src="/website_sale_aplicoop/static/src/js/checkout_summary.js" />
/>
<script
type="text/javascript"
src="/website_sale_aplicoop/static/src/js/home_delivery.js"
/>
<script
type="text/javascript"
src="/website_sale_aplicoop/static/src/js/checkout_summary.js"
/>
<script type="text/javascript"> <script type="text/javascript">
// Auto-load cart from localStorage when accessing checkout directly // Auto-load cart from localStorage when accessing checkout directly
(function() { (function() {
@ -1413,10 +1218,7 @@
</template> </template>
<!-- Recursive macro to render category hierarchy for select dropdown --> <!-- Recursive macro to render category hierarchy for select dropdown -->
<template <template id="category_hierarchy_options" name="Category Hierarchy Options">
id="category_hierarchy_options"
name="Category Hierarchy Options"
>
<!-- <!--
Macro para renderizar recursivamente la jerarquía de categorías. Macro para renderizar recursivamente la jerarquía de categorías.
Todas las categorías son seleccionables, indentadas por profundidad. Todas las categorías son seleccionables, indentadas por profundidad.
@ -1434,18 +1236,13 @@
</t> </t>
<!-- Renderizar como opción indentada y seleccionable --> <!-- Renderizar como opción indentada y seleccionable -->
<option <option t-att-value="str(cat['id'])" t-attf-style="padding-left: {{ padding_px }}px;">
t-att-value="str(cat['id'])"
t-attf-style="padding-left: {{ padding_px }}px;"
>
<t t-esc="prefix" /><t t-esc="cat['name']" /> <t t-esc="prefix" /><t t-esc="cat['name']" />
</option> </option>
<!-- Renderizar hijos recursivamente si existen --> <!-- Renderizar hijos recursivamente si existen -->
<t t-if="cat['children']"> <t t-if="cat['children']">
<t <t t-call="website_sale_aplicoop.category_hierarchy_options">
t-call="website_sale_aplicoop.category_hierarchy_options"
>
<t t-set="categories" t-value="cat['children']" /> <t t-set="categories" t-value="cat['children']" />
<t t-set="depth" t-value="depth + 1" /> <t t-set="depth" t-value="depth + 1" />
</t> </t>