diff --git a/website_sale_aplicoop/i18n/es.po b/website_sale_aplicoop/i18n/es.po index d4c7361..b9901a8 100644 --- a/website_sale_aplicoop/i18n/es.po +++ b/website_sale_aplicoop/i18n/es.po @@ -907,6 +907,10 @@ msgid "" "orders" msgstr "" +#. module: website_sale_aplicoop +#. odoo-python +#: code:addons/website_sale_aplicoop/controllers/website_sale.py:0 +#: code:addons/website_sale_aplicoop/models/js_translations.py:0 msgid "No draft orders found for the current order period" msgstr "No se encontraron borradores para el período actual del pedido" @@ -1441,46 +1445,16 @@ msgstr "con el borrador guardado." msgid "{{ product.name }}" msgstr "{{ product.name }}" -#. module: website_sale_aplicoop -#: model_terms:ir.ui.view,arch_db:website_sale_aplicoop.sale_order_portal_content_aplicoop -msgid "Consumer Group" -msgstr "Grupo de Consumidores" - -#. module: website_sale_aplicoop -#: model_terms:ir.ui.view,arch_db:website_sale_aplicoop.sale_order_portal_content_aplicoop -msgid "Delivery Information" -msgstr "Información de Envío" - #. module: website_sale_aplicoop #: model_terms:ir.ui.view,arch_db:website_sale_aplicoop.sale_order_portal_content_aplicoop msgid "Delivery Date" msgstr "Fecha de Entrega" -#. module: website_sale_aplicoop -#: model_terms:ir.ui.view,arch_db:website_sale_aplicoop.sale_order_portal_content_aplicoop -msgid "Pickup Date" -msgstr "Fecha de Recogida" - -#. module: website_sale_aplicoop -#: model_terms:ir.ui.view,arch_db:website_sale_aplicoop.sale_order_portal_content_aplicoop -msgid "Delivery Notice" -msgstr "Aviso de Envío" - -#. module: website_sale_aplicoop -#: model_terms:ir.ui.view,arch_db:website_sale_aplicoop.sale_order_portal_content_aplicoop -msgid "No special delivery instructions" -msgstr "Sin instrucciones especiales de entrega" - #. module: website_sale_aplicoop #: model_terms:ir.ui.view,arch_db:website_sale_aplicoop.sale_order_portal_content_aplicoop msgid "Pickup Location" msgstr "Lugar de Recogida" -#. module: website_sale_aplicoop -#: model_terms:ir.ui.view,arch_db:website_sale_aplicoop.portal_order_page_sidebar_button -msgid "Load in Cart" -msgstr "Recargar Carrito" - #. module: website_sale_aplicoop #: model:product.ribbon,name:website_sale_aplicoop.out_of_stock_ribbon msgid "Out of Stock" diff --git a/website_sale_aplicoop/i18n/eu.po b/website_sale_aplicoop/i18n/eu.po index eb56ceb..e6886d9 100644 --- a/website_sale_aplicoop/i18n/eu.po +++ b/website_sale_aplicoop/i18n/eu.po @@ -906,6 +906,10 @@ msgid "" "orders" msgstr "" +#. module: website_sale_aplicoop +#. odoo-python +#: code:addons/website_sale_aplicoop/controllers/website_sale.py:0 +#: code:addons/website_sale_aplicoop/models/js_translations.py:0 msgid "No draft orders found for the current order period" msgstr "Ez da zirriborrorik aurkitu uneko eskaera-aldirako" @@ -1441,46 +1445,16 @@ msgstr "gordetako zirriborroarekin." msgid "{{ product.name }}" msgstr "{{ product.name }}" -#. module: website_sale_aplicoop -#: model_terms:ir.ui.view,arch_db:website_sale_aplicoop.sale_order_portal_content_aplicoop -msgid "Consumer Group" -msgstr "Kontsumo Taldea" - -#. module: website_sale_aplicoop -#: model_terms:ir.ui.view,arch_db:website_sale_aplicoop.sale_order_portal_content_aplicoop -msgid "Delivery Information" -msgstr "Delibatua Informazioa" - #. module: website_sale_aplicoop #: model_terms:ir.ui.view,arch_db:website_sale_aplicoop.sale_order_portal_content_aplicoop msgid "Delivery Date" msgstr "Entrega Data" -#. module: website_sale_aplicoop -#: model_terms:ir.ui.view,arch_db:website_sale_aplicoop.sale_order_portal_content_aplicoop -msgid "Pickup Date" -msgstr "Biltzea Data" - -#. module: website_sale_aplicoop -#: model_terms:ir.ui.view,arch_db:website_sale_aplicoop.sale_order_portal_content_aplicoop -msgid "Delivery Notice" -msgstr "Delibatua Oharra" - -#. module: website_sale_aplicoop -#: model_terms:ir.ui.view,arch_db:website_sale_aplicoop.sale_order_portal_content_aplicoop -msgid "No special delivery instructions" -msgstr "Ez dago entregaren instrukzio bereziak" - #. module: website_sale_aplicoop #: model_terms:ir.ui.view,arch_db:website_sale_aplicoop.sale_order_portal_content_aplicoop msgid "Pickup Location" msgstr "Biltzeko Lekua" -#. module: website_sale_aplicoop -#: model_terms:ir.ui.view,arch_db:website_sale_aplicoop.portal_order_page_sidebar_button -msgid "Load in Cart" -msgstr "Saskia Berrkargatu" - #. module: website_sale_aplicoop #: model:product.ribbon,name:website_sale_aplicoop.out_of_stock_ribbon msgid "Out of Stock" diff --git a/website_sale_aplicoop/models/group_order.py b/website_sale_aplicoop/models/group_order.py index 487b882..8165b8e 100644 --- a/website_sale_aplicoop/models/group_order.py +++ b/website_sale_aplicoop/models/group_order.py @@ -645,16 +645,65 @@ class GroupOrder(models.Model): Only updates orders in 'draft' or 'open' states. """ orders = self.search([("state", "in", ["draft", "open"])]) - _logger.info("Cron: Updating dates for %d active group orders", len(orders)) + cron_started_at = fields.Datetime.now() + _logger.info( + "Cron: Starting group.order date update at %s for %d active orders (ids=%s)", + cron_started_at, + len(orders), + orders.ids, + ) + processed_orders = 0 + failed_orders = [] for order in orders: - # Confirm BEFORE recomputing dates: cutoff_date still points to the - # current cycle's cutoff (today or past), so the check works correctly. - # After confirmation, recompute dates so they advance to the next cycle. - order._confirm_linked_sale_orders() - order._compute_cutoff_date() - order._compute_pickup_date() - order._compute_delivery_date() - _logger.info("Cron: Date update completed") + before_values = { + "state": order.state, + "period": order.period, + "start_date": order.start_date, + "end_date": order.end_date, + "cutoff_day": order.cutoff_day, + "pickup_day": order.pickup_day, + "cutoff_date": order.cutoff_date, + "pickup_date": order.pickup_date, + "delivery_date": order.delivery_date, + "home_delivery": order.home_delivery, + } + _logger.info( + "Cron: Processing group order %s (%s) with values before recompute: %s", + order.id, + order.name, + before_values, + ) + try: + # Confirm BEFORE recomputing dates: cutoff_date still points to the + # current cycle's cutoff (today or past), so the check works correctly. + # After confirmation, recompute dates so they advance to the next cycle. + order._confirm_linked_sale_orders() + order._compute_cutoff_date() + order._compute_pickup_date() + order._compute_delivery_date() + processed_orders += 1 + _logger.info( + "Cron: Finished group order %s (%s). Dates after recompute: cutoff=%s, pickup=%s, delivery=%s", + order.id, + order.name, + order.cutoff_date, + order.pickup_date, + order.delivery_date, + ) + except Exception: + failed_orders.append(order.id) + _logger.exception( + "Cron: Error while processing group order %s (%s). Initial values were: %s", + order.id, + order.name, + before_values, + ) + _logger.info( + "Cron: Date update completed. processed=%d failed=%d failed_ids=%s", + processed_orders, + len(failed_orders), + failed_orders, + ) def _confirm_linked_sale_orders(self): """Confirm draft/sent sale orders linked to this group order. @@ -669,13 +718,26 @@ class GroupOrder(models.Model): today = fields.Date.today() + if not self.cutoff_date: + _logger.warning( + "Cron: Group order %s (%s) has no cutoff_date (state=%s, period=%s, cutoff_day=%s, start_date=%s). Skipping sale order confirmation for this cycle.", + self.id, + self.name, + self.state, + self.period, + self.cutoff_day, + self.start_date, + ) + return + # Skip if cutoff hasn't passed yet (the cycle is still open for orders) if self.cutoff_date >= today: _logger.info( - "Cron: Skipping group order %s (%s) - cutoff date %s not yet passed", + "Cron: Skipping group order %s (%s) - cutoff date %s not yet passed (today=%s)", self.id, self.name, self.cutoff_date, + today, ) return diff --git a/website_sale_aplicoop/tests/test_date_calculations.py b/website_sale_aplicoop/tests/test_date_calculations.py index 50d2cee..e6d66a1 100644 --- a/website_sale_aplicoop/tests/test_date_calculations.py +++ b/website_sale_aplicoop/tests/test_date_calculations.py @@ -566,3 +566,49 @@ class TestDateCalculations(TransactionCase): order.pickup_date, f"Pickup date should be set for active order {order.name}", ) + + def test_cron_update_dates_skips_orders_without_cutoff_date(self): + """Cron should not crash if an active order lacks cutoff_date. + + A malformed or partially configured active group order should be logged + and skipped for sale-order confirmation, but must not block recomputing + the rest of active orders. + """ + today = fields.Date.today() + + valid_order = self.env["group.order"].create( + { + "name": "Valid Cron Order", + "group_ids": [(6, 0, [self.group.id])], + "start_date": today, + "pickup_day": "2", # Wednesday + "cutoff_day": "0", # Monday + "period": "weekly", + "state": "open", + } + ) + invalid_order = self.env["group.order"].create( + { + "name": "Invalid Cron Order Without Cutoff", + "group_ids": [(6, 0, [self.group.id])], + "start_date": today, + "pickup_day": "2", # Wednesday + "cutoff_day": False, + "period": "weekly", + "state": "open", + } + ) + + self.assertFalse( + invalid_order.cutoff_date, + "Precondition failed: invalid order should not have cutoff_date", + ) + + self.env["group.order"]._cron_update_dates() + + valid_order.invalidate_recordset() + invalid_order.invalidate_recordset() + + self.assertTrue(valid_order.cutoff_date) + self.assertTrue(valid_order.pickup_date) + self.assertFalse(invalid_order.cutoff_date)