From bd7d5bfa4416a68c169facfafa096bde1fd40b9a Mon Sep 17 00:00:00 2001 From: bobslee Date: Wed, 24 Jun 2026 16:32:07 +0200 Subject: [PATCH] [MIG] purchase_manual_delivery: Migration to 19.0 --- purchase_manual_delivery/README.rst | 131 ++++ purchase_manual_delivery/__init__.py | 3 + purchase_manual_delivery/__manifest__.py | 28 + purchase_manual_delivery/i18n/es.po | 399 +++++++++++++ purchase_manual_delivery/i18n/it.po | 399 +++++++++++++ purchase_manual_delivery/i18n/pt_BR.po | 365 ++++++++++++ purchase_manual_delivery/i18n/sl.po | 392 ++++++++++++ .../migrations/17.0.1.0.0/pre-migration.py | 16 + purchase_manual_delivery/models/__init__.py | 5 + .../models/product_product.py | 56 ++ .../models/purchase_order.py | 40 ++ .../models/purchase_order_line.py | 85 +++ .../models/res_company.py | 11 + purchase_manual_delivery/models/res_config.py | 11 + purchase_manual_delivery/pyproject.toml | 3 + purchase_manual_delivery/readme/CONFIGURE.md | 2 + .../readme/CONTRIBUTORS.md | 2 + .../readme/DESCRIPTION.md | 8 + purchase_manual_delivery/readme/USAGE.md | 28 + purchase_manual_delivery/report/__init__.py | 1 + .../report/stock_forecasted.py | 44 ++ .../security/ir.model.access.csv | 3 + .../create_incoming_shipment_button.png | Bin 0 -> 22180 bytes .../create_incoming_shipment_wizard.png | Bin 0 -> 44688 bytes .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 473 +++++++++++++++ .../forecasted_details.xml | 39 ++ purchase_manual_delivery/tests/__init__.py | 2 + .../tests/test_purchase_manual_delivery.py | 559 ++++++++++++++++++ .../tests/test_report_forecast.py | 71 +++ .../views/purchase_order_line_views.xml | 42 ++ .../views/purchase_order_views.xml | 39 ++ .../views/res_config_view.xml | 30 + purchase_manual_delivery/wizard/__init__.py | 1 + .../wizard/create_manual_stock_picking.py | 247 ++++++++ .../wizard/create_manual_stock_picking.xml | 61 ++ 36 files changed, 3596 insertions(+) create mode 100644 purchase_manual_delivery/README.rst create mode 100644 purchase_manual_delivery/__init__.py create mode 100644 purchase_manual_delivery/__manifest__.py create mode 100644 purchase_manual_delivery/i18n/es.po create mode 100644 purchase_manual_delivery/i18n/it.po create mode 100644 purchase_manual_delivery/i18n/pt_BR.po create mode 100644 purchase_manual_delivery/i18n/sl.po create mode 100644 purchase_manual_delivery/migrations/17.0.1.0.0/pre-migration.py create mode 100644 purchase_manual_delivery/models/__init__.py create mode 100644 purchase_manual_delivery/models/product_product.py create mode 100644 purchase_manual_delivery/models/purchase_order.py create mode 100644 purchase_manual_delivery/models/purchase_order_line.py create mode 100644 purchase_manual_delivery/models/res_company.py create mode 100644 purchase_manual_delivery/models/res_config.py create mode 100644 purchase_manual_delivery/pyproject.toml create mode 100644 purchase_manual_delivery/readme/CONFIGURE.md create mode 100644 purchase_manual_delivery/readme/CONTRIBUTORS.md create mode 100644 purchase_manual_delivery/readme/DESCRIPTION.md create mode 100644 purchase_manual_delivery/readme/USAGE.md create mode 100644 purchase_manual_delivery/report/__init__.py create mode 100644 purchase_manual_delivery/report/stock_forecasted.py create mode 100644 purchase_manual_delivery/security/ir.model.access.csv create mode 100644 purchase_manual_delivery/static/description/create_incoming_shipment_button.png create mode 100644 purchase_manual_delivery/static/description/create_incoming_shipment_wizard.png create mode 100644 purchase_manual_delivery/static/description/icon.png create mode 100644 purchase_manual_delivery/static/description/index.html create mode 100644 purchase_manual_delivery/static/src/purchase_manual_delivery_forecasted/forecasted_details.xml create mode 100644 purchase_manual_delivery/tests/__init__.py create mode 100644 purchase_manual_delivery/tests/test_purchase_manual_delivery.py create mode 100644 purchase_manual_delivery/tests/test_report_forecast.py create mode 100644 purchase_manual_delivery/views/purchase_order_line_views.xml create mode 100644 purchase_manual_delivery/views/purchase_order_views.xml create mode 100644 purchase_manual_delivery/views/res_config_view.xml create mode 100644 purchase_manual_delivery/wizard/__init__.py create mode 100644 purchase_manual_delivery/wizard/create_manual_stock_picking.py create mode 100644 purchase_manual_delivery/wizard/create_manual_stock_picking.xml diff --git a/purchase_manual_delivery/README.rst b/purchase_manual_delivery/README.rst new file mode 100644 index 00000000000..a8f45af32dd --- /dev/null +++ b/purchase_manual_delivery/README.rst @@ -0,0 +1,131 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + +======================== +Purchase Manual Delivery +======================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:102734f75c78fadc123822722ef0f6d5abcdcc78418a72f6ae1f2cdf26fbcdb8 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fpurchase--workflow-lightgray.png?logo=github + :target: https://github.com/OCA/purchase-workflow/tree/19.0/purchase_manual_delivery + :alt: OCA/purchase-workflow +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/purchase-workflow-19-0/purchase-workflow-19-0-purchase_manual_delivery + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/purchase-workflow&target_branch=19.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +The goal of this module is to allow the manual creation of incoming +shipments. When installed, a purchase order won't impact directly the +stock. It will not create the pickings upon order confirmation. It +allows the reception and the impact on stock to be done manually when +needed. The goal is to be used when a supplier does not confirm the full +order at once. As the supplier confirms the different purchase order +lines, the user can manually create the incoming shipments for those +specific lines. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +The ``Manual delivery`` checkbox can be edited on any RFQ, on the +``Other Information`` tab. To set the default value for new POs, go to +Settings -> Purchase -> Delivery. + +Usage +===== + +There are two main ways to use this module: + +- From Purchase Order + +When creating a purchase order and confirming it, no picking will be +automatically created. Lines with pending quantities to receive will +appear in blue color, to create the manual picking press the button +"Create Incoming Shipment": + +|image1| + +This will trigger the wizard that lets the user choose which lines +should be taken for the creation of the picking and also the quantities. +Clicking on the "Create and View Picking" will create the reception and +redirect the user to the picking form. + +|image2| + +- From Purchase Order Line + +The module adds a new list view for Purchase Order Lines (in Purchase +Menu). From there you can select multiple PO lines (in this base module +only PO lines from same PO can be selected) and create the manual +delivery. Follow the same steps as above to manually generate the +incoming shipment. + +If, as a developer, you need to override the behaviour you can call +``purchase.order``'s ``button_confirm`` with context key +``ignore_manual_delivery=True``. + +.. |image1| image:: https://raw.githubusercontent.com/OCA/purchase-workflow/19.0/purchase_manual_delivery/static/description/create_incoming_shipment_button.png +.. |image2| image:: https://raw.githubusercontent.com/OCA/purchase-workflow/19.0/purchase_manual_delivery/static/description/create_incoming_shipment_wizard.png + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* ForgeFlow S.L. + +Contributors +------------ + +- Adria Gil Sorribes +- Stefan Rijnhart + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/purchase-workflow `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/purchase_manual_delivery/__init__.py b/purchase_manual_delivery/__init__.py new file mode 100644 index 00000000000..7660e7bf616 --- /dev/null +++ b/purchase_manual_delivery/__init__.py @@ -0,0 +1,3 @@ +from . import models +from . import report +from . import wizard diff --git a/purchase_manual_delivery/__manifest__.py b/purchase_manual_delivery/__manifest__.py new file mode 100644 index 00000000000..59eb2253205 --- /dev/null +++ b/purchase_manual_delivery/__manifest__.py @@ -0,0 +1,28 @@ +# Copyright 2022 ForgeFlow S.L. +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Purchase Manual Delivery", + "summary": """ + Prevents pickings to be auto generated upon Purchase Order confirmation + and adds the ability to manually generate them as the supplier confirms + the different purchase order lines. + """, + "version": "19.0.1.0.0", + "license": "AGPL-3", + "author": "ForgeFlow S.L.,Odoo Community Association (OCA)", + "website": "https://github.com/OCA/purchase-workflow", + "depends": ["purchase_stock", "purchase_order_line_menu"], + "data": [ + "security/ir.model.access.csv", + "wizard/create_manual_stock_picking.xml", + "views/purchase_order_line_views.xml", + "views/purchase_order_views.xml", + "views/res_config_view.xml", + ], + "assets": { + "web.assets_backend": [ + "purchase_manual_delivery/static/src/**/*", + ] + }, +} diff --git a/purchase_manual_delivery/i18n/es.po b/purchase_manual_delivery/i18n/es.po new file mode 100644 index 00000000000..882c75ed63c --- /dev/null +++ b/purchase_manual_delivery/i18n/es.po @@ -0,0 +1,399 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_manual_delivery +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-04-18 08:37+0000\n" +"Last-Translator: Ivorra78 \n" +"Language-Team: none\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_create_stock_picking +msgid "Cancel" +msgstr "Cancelar" + +#. module: purchase_manual_delivery +#: model:ir.model,name:purchase_manual_delivery.model_res_company +msgid "Companies" +msgstr "Compañías" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.purchase_order_view_form_inherit +msgid "Confirm Order" +msgstr "Confirmar Pedido" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.purchase_order_view_form_inherit +msgid "Create Incoming Shipment" +msgstr "Crear Envío Entrante" + +#. module: purchase_manual_delivery +#: model:ir.actions.act_window,name:purchase_manual_delivery.action_create_manual_stock_picking +msgid "Create Manual Stock Picking" +msgstr "Crear Selección de Existencias Manual" + +#. module: purchase_manual_delivery +#: model:ir.model,name:purchase_manual_delivery.model_create_stock_picking_wizard +msgid "Create Manual Stock Picking Wizard" +msgstr "Crear Asistente Manual de Selección de Acciones" + +#. module: purchase_manual_delivery +#: model:ir.model,name:purchase_manual_delivery.model_create_stock_picking_wizard_line +msgid "Create Manual Stock Picking Wizard Line" +msgstr "Crear Línea Manual de Asistente de Selección de Acciones" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_create_stock_picking +msgid "Create Stock Picking" +msgstr "Crear Selección de Existencias" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_create_stock_picking +msgid "Create and View Picking" +msgstr "Crear y Visualizar la Selección" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__create_uid +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__create_date +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__create_date +msgid "Created on" +msgstr "Creado el" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__currency_id +msgid "Currency" +msgstr "Divisa" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.res_config_settings_view_form +msgid "Deliveries on purchase orders should be created manually." +msgstr "Las entregas en pedidos de compra deben crearse manualmente." + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.res_config_settings_view_form +msgid "Delivery" +msgstr "Entrega" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,help:purchase_manual_delivery.field_create_stock_picking_wizard_line__date_planned +msgid "" +"Delivery date expected from vendor. This date respectively defaults to " +"vendor pricelist lead time then today's date." +msgstr "" +"Fecha de entrega prevista por el proveedor. Esta fecha es, por defecto, el " +"plazo de entrega de la lista de precios del proveedor y, a continuación, la " +"fecha actual." + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__name +msgid "Description" +msgstr "Descripción" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__location_dest_id +msgid "Destination Location" +msgstr "Ubicación de Destino" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__display_name +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__display_name +msgid "Display Name" +msgstr "Mostrar Nombre" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_create_stock_picking +msgid "Existing Qty" +msgstr "Ctd. Existente" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__existing_qty +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_purchase_order_line__existing_qty +msgid "Existing Quantity" +msgstr "Cantidad Existente" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__date_planned +msgid "Expected Arrival" +msgstr "Llegada Prevista" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_purchase_order_unreceived_line_filter +msgid "Group By" +msgstr "Agrupado Por" + +#. module: purchase_manual_delivery +#: model_terms:ir.actions.act_window,help:purchase_manual_delivery.action_order_line_delivery_tree +msgid "Here is a list of each purchase order line to be received." +msgstr "Aquí tiene una lista de cada línea de pedido que debe recibir." + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__id +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__id +msgid "ID" +msgstr "ID" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.res_config_settings_view_form +msgid "If active, Receipt of purchase orders should be manual created." +msgstr "" +"Si está activo, la recepción de pedidos de compra debe crearse manualmente." + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard____last_update +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line____last_update +msgid "Last Modified on" +msgstr "Última Modificación el" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__write_uid +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__write_uid +msgid "Last Updated by" +msgstr "Última Actualización por" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__write_date +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__write_date +msgid "Last Updated on" +msgstr "Última Actualización el" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__line_ids +msgid "Lines" +msgstr "Líneas" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,help:purchase_manual_delivery.field_create_stock_picking_wizard__location_dest_id +msgid "Location where the system will stock the received products." +msgstr "Ubicación donde el sistema almacenará los productos recibidos." + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.res_config_settings_view_form +msgid "Manual Delivery" +msgstr "Entrega Manual" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_create_stock_picking +msgid "Ordered Qty" +msgstr "Ctd Pedida" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_purchase_order_line__pending_to_receive +msgid "Pending Qty to Receive" +msgstr "Cntd pendiente de Recibir" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_purchase_order__pending_to_receive +msgid "Pending To Receive" +msgstr "Pendiente de Recibir" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_purchase_order_unreceived_line_filter +msgid "Pending to receive" +msgstr "Pendiente de recibir" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_create_stock_picking +msgid "Picking Scheduled Date" +msgstr "Fecha Programada de Recogida" + +#. module: purchase_manual_delivery +#. odoo-python +#: code:addons/purchase_manual_delivery/wizard/create_manual_stock_picking.py:0 +#, python-format +msgid "Please select one partner at a time" +msgstr "Por favor seleccione un socio a la vez" + +#. module: purchase_manual_delivery +#. odoo-python +#: code:addons/purchase_manual_delivery/wizard/create_manual_stock_picking.py:0 +#, python-format +msgid "Please select one purchase order at a time" +msgstr "Por favor, seleccione una orden de compra cada vez" + +#. module: purchase_manual_delivery +#: model:ir.model,name:purchase_manual_delivery.model_res_config_settings +msgid "Procurement purchase grouping settings" +msgstr "Configuración de la agrupación de compra abastecida" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__product_id +msgid "Product" +msgstr "Producto" + +#. module: purchase_manual_delivery +#: model:ir.actions.act_window,name:purchase_manual_delivery.action_order_line_delivery_tree +#: model:ir.ui.menu,name:purchase_manual_delivery.menu_delivery_purchase_order_lines +msgid "Purchase Manual Receipt" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model,name:purchase_manual_delivery.model_purchase_order +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__purchase_id +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_purchase_order_unreceived_line_filter +msgid "Purchase Order" +msgstr "Orden de Compra" + +#. module: purchase_manual_delivery +#: model:ir.model,name:purchase_manual_delivery.model_purchase_order_line +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__purchase_order_line_id +msgid "Purchase Order Line" +msgstr "Línea de Orden de Compra" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_purchase_order_unreceived_line_filter +msgid "" +"Purchase Order Lines that are confirmed or done and an incoming shipment is " +"created to satisfy them" +msgstr "" +"Líneas de Orden de Compra que se confirman o realizan y se crea un envío " +"entrante para satisfacerlas" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_purchase_order_unreceived_line_filter +msgid "" +"Purchase Order Lines that are confirmed or done and no incoming shipment is " +"created to satisfy them" +msgstr "" +"Líneas de Orden de Compra que están confirmadas o hechas y no se crea ningún " +"envío entrante para satisfacerlas" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_purchase_order__manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_res_company__purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_res_config_settings__purchase_manual_delivery +msgid "Purchase manual delivery?" +msgstr "¿Comprar entrega manual?" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__product_qty +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_create_stock_picking +msgid "Quantity" +msgstr "Cantidad" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,help:purchase_manual_delivery.field_create_stock_picking_wizard_line__existing_qty +#: model:ir.model.fields,help:purchase_manual_delivery.field_purchase_order_line__existing_qty +msgid "Quantity already planned or shipped (stock movements already created)" +msgstr "Cantidad ya prevista o enviada (movimientos de existencias ya creados)" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__qty +msgid "Quantity to Receive" +msgstr "Cantidad a Recibir" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_purchase_order_unreceived_line_filter +msgid "Reception confirmed" +msgstr "Recepción confirmada" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_create_stock_picking +msgid "Remaining Qty" +msgstr "Ctd Restante" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__remaining_qty +msgid "Remaining Quantity" +msgstr "Cantidad Restante" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__scheduled_date +msgid "Scheduled Date" +msgstr "Fecha Prevista" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,help:purchase_manual_delivery.field_create_stock_picking_wizard__scheduled_date +msgid "" +"Scheduled time for the first part of the shipment to be processed. Setting " +"manually a value here would set it as expected date for all the stock moves." +msgstr "" +"Hora programada para que se procese la primera parte del envío. Establecer " +"manualmente un valor aquí lo establecería como fecha prevista para todos los " +"movimientos de stock." + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_purchase_order_unreceived_line_filter +msgid "Search Undelivered Lines" +msgstr "Buscar Líneas no Entregadas" + +#. module: purchase_manual_delivery +#. odoo-python +#: code:addons/purchase_manual_delivery/wizard/create_manual_stock_picking.py:0 +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__picking_id +#, python-format +msgid "Stock Picking" +msgstr "Albarán de Existencias" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__taxes_id +msgid "Taxes" +msgstr "Impuestos" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,help:purchase_manual_delivery.field_purchase_order_line__pending_to_receive +msgid "There is pending quantity to receive not yet planned" +msgstr "Hay cantidad pendiente de recibir aún no prevista" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,help:purchase_manual_delivery.field_create_stock_picking_wizard_line__qty +msgid "This is the quantity taken into account to create the picking" +msgstr "Es la cantidad que se tiene en cuenta para crear el albarán" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__price_unit +msgid "Unit Price" +msgstr "Precio Unitario" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__product_uom +msgid "Unit of Measure" +msgstr "Unidad de Medida" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__partner_id +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__partner_id +msgid "Vendor" +msgstr "Vendedor" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__wizard_id +msgid "Wizard" +msgstr "Asistente" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,help:purchase_manual_delivery.field_create_stock_picking_wizard_line__partner_id +msgid "You can find a vendor by its Name, TIN, Email or Internal Reference." +msgstr "" +"Puede encontrar un vendedor por su Nombre, NIF, Correo Electrónico o " +"Referencia Interna." + +#. module: purchase_manual_delivery +#. odoo-python +#: code:addons/purchase_manual_delivery/wizard/create_manual_stock_picking.py:0 +#, python-format +msgid "" +"You can not receive more than the remaining quantity. If you need to do so, " +"please edit the purchase order first." +msgstr "" +"No puede recibir más de la cantidad restante. Si necesita hacerlo, edite " +"primero la orden de compra." + +#~ msgid "Purchase Order Lines" +#~ msgstr "Líneas de Orden de Compra" + +#~ msgid "Config Settings" +#~ msgstr "Ajustes de Config" diff --git a/purchase_manual_delivery/i18n/it.po b/purchase_manual_delivery/i18n/it.po new file mode 100644 index 00000000000..d052ac5c536 --- /dev/null +++ b/purchase_manual_delivery/i18n/it.po @@ -0,0 +1,399 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_manual_delivery +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2025-08-20 17:27+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.10.4\n" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_create_stock_picking +msgid "Cancel" +msgstr "Annulla" + +#. module: purchase_manual_delivery +#: model:ir.model,name:purchase_manual_delivery.model_res_company +msgid "Companies" +msgstr "Aziende" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.purchase_order_view_form_inherit +msgid "Confirm Order" +msgstr "Conferma ordine" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.purchase_order_view_form_inherit +msgid "Create Incoming Shipment" +msgstr "Crea spedizione in ingresso" + +#. module: purchase_manual_delivery +#: model:ir.actions.act_window,name:purchase_manual_delivery.action_create_manual_stock_picking +msgid "Create Manual Stock Picking" +msgstr "Crea prelievo di magazzino manuale" + +#. module: purchase_manual_delivery +#: model:ir.model,name:purchase_manual_delivery.model_create_stock_picking_wizard +msgid "Create Manual Stock Picking Wizard" +msgstr "Procedura guidata crea prelievo di magazzino manuale" + +#. module: purchase_manual_delivery +#: model:ir.model,name:purchase_manual_delivery.model_create_stock_picking_wizard_line +msgid "Create Manual Stock Picking Wizard Line" +msgstr "Riga procedura guidata crea prelievo di magazzino manuale" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_create_stock_picking +msgid "Create Stock Picking" +msgstr "Crea prelievo di magazzino" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_create_stock_picking +msgid "Create and View Picking" +msgstr "Crea e visualizza prelievo" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__create_uid +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__create_uid +msgid "Created by" +msgstr "Creato da" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__create_date +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__create_date +msgid "Created on" +msgstr "Creato il" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__currency_id +msgid "Currency" +msgstr "Valuta" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.res_config_settings_view_form +msgid "Deliveries on purchase orders should be created manually." +msgstr "Le consegne negli ordini di acquisto devono essere create manualmente." + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.res_config_settings_view_form +msgid "Delivery" +msgstr "Consegna" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,help:purchase_manual_delivery.field_create_stock_picking_wizard_line__date_planned +msgid "" +"Delivery date expected from vendor. This date respectively defaults to " +"vendor pricelist lead time then today's date." +msgstr "" +"Data consegna attesa dal fornitore. Questa data corrisponde al tempo di " +"attesa predefinito del fornitore dalla data odierna." + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__name +msgid "Description" +msgstr "Descrizione" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__location_dest_id +msgid "Destination Location" +msgstr "Ubicazione di destinazione" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__display_name +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_create_stock_picking +msgid "Existing Qty" +msgstr "Q.tà esistente" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__existing_qty +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_purchase_order_line__existing_qty +msgid "Existing Quantity" +msgstr "Quantità esistente" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__date_planned +msgid "Expected Arrival" +msgstr "Arrivo atteso" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_purchase_order_unreceived_line_filter +msgid "Group By" +msgstr "Raggruppa per" + +#. module: purchase_manual_delivery +#: model_terms:ir.actions.act_window,help:purchase_manual_delivery.action_order_line_delivery_tree +msgid "Here is a list of each purchase order line to be received." +msgstr "Ecco un elenco di ogni linea di ordine di acquisto da ricevere." + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__id +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__id +msgid "ID" +msgstr "ID" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.res_config_settings_view_form +msgid "If active, Receipt of purchase orders should be manual created." +msgstr "" +"Se selezionata, la ricevuta degli ordini di acquisto deve essere creata " +"manualmente." + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard____last_update +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line____last_update +msgid "Last Modified on" +msgstr "Ultima modifica il" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__write_uid +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__write_uid +msgid "Last Updated by" +msgstr "Ultimo aggiornamento di" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__write_date +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__write_date +msgid "Last Updated on" +msgstr "Ultimo aggiornamento il" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__line_ids +msgid "Lines" +msgstr "Righe" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,help:purchase_manual_delivery.field_create_stock_picking_wizard__location_dest_id +msgid "Location where the system will stock the received products." +msgstr "Ubicazione dove il sistema posizionerà i prodotti ricevuti." + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.res_config_settings_view_form +msgid "Manual Delivery" +msgstr "Consegna manuale" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_create_stock_picking +msgid "Ordered Qty" +msgstr "Q.tà ordinata" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_purchase_order_line__pending_to_receive +msgid "Pending Qty to Receive" +msgstr "Q.tà da ricevere in attesa" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_purchase_order__pending_to_receive +msgid "Pending To Receive" +msgstr "Da ricevere in attesa" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_purchase_order_unreceived_line_filter +msgid "Pending to receive" +msgstr "Da ricevere in attesa" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_create_stock_picking +msgid "Picking Scheduled Date" +msgstr "Data prelievo pianificato" + +#. module: purchase_manual_delivery +#. odoo-python +#: code:addons/purchase_manual_delivery/wizard/create_manual_stock_picking.py:0 +#, python-format +msgid "Please select one partner at a time" +msgstr "Si prega di selezionare un partner alla volta" + +#. module: purchase_manual_delivery +#. odoo-python +#: code:addons/purchase_manual_delivery/wizard/create_manual_stock_picking.py:0 +#, python-format +msgid "Please select one purchase order at a time" +msgstr "Si prega di selezionare un ordine di acquisto alla volta" + +#. module: purchase_manual_delivery +#: model:ir.model,name:purchase_manual_delivery.model_res_config_settings +msgid "Procurement purchase grouping settings" +msgstr "Impostazioni raggruppamento approvvigionamento acquisti" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__product_id +msgid "Product" +msgstr "Prodotto" + +#. module: purchase_manual_delivery +#: model:ir.actions.act_window,name:purchase_manual_delivery.action_order_line_delivery_tree +#: model:ir.ui.menu,name:purchase_manual_delivery.menu_delivery_purchase_order_lines +msgid "Purchase Manual Receipt" +msgstr "Ricevuta manuale acquisto" + +#. module: purchase_manual_delivery +#: model:ir.model,name:purchase_manual_delivery.model_purchase_order +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__purchase_id +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_purchase_order_unreceived_line_filter +msgid "Purchase Order" +msgstr "Ordine di acquisto" + +#. module: purchase_manual_delivery +#: model:ir.model,name:purchase_manual_delivery.model_purchase_order_line +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__purchase_order_line_id +msgid "Purchase Order Line" +msgstr "Riga ordine di acquisto" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_purchase_order_unreceived_line_filter +msgid "" +"Purchase Order Lines that are confirmed or done and an incoming shipment is " +"created to satisfy them" +msgstr "" +"Righe ordine acquisto che sono confermate o evase e viene creata una " +"spedizione in ingresso per soddisfarle" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_purchase_order_unreceived_line_filter +msgid "" +"Purchase Order Lines that are confirmed or done and no incoming shipment is " +"created to satisfy them" +msgstr "" +"Righe ordine acquisto che sono confermate o evase e non viene creata una " +"spedizione in ingresso per soddisfarle" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_purchase_order__manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_res_company__purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_res_config_settings__purchase_manual_delivery +msgid "Purchase manual delivery?" +msgstr "Consegna manuale acquisto?" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__product_qty +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_create_stock_picking +msgid "Quantity" +msgstr "Quantità" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,help:purchase_manual_delivery.field_create_stock_picking_wizard_line__existing_qty +#: model:ir.model.fields,help:purchase_manual_delivery.field_purchase_order_line__existing_qty +msgid "Quantity already planned or shipped (stock movements already created)" +msgstr "Quantità già programmata o spedita (movimenti di magazzino già creati)" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__qty +msgid "Quantity to Receive" +msgstr "Quantità da ricevere" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_purchase_order_unreceived_line_filter +msgid "Reception confirmed" +msgstr "Ricezione confermata" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_create_stock_picking +msgid "Remaining Qty" +msgstr "Q.tà rimanente" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__remaining_qty +msgid "Remaining Quantity" +msgstr "Quantità residua" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__scheduled_date +msgid "Scheduled Date" +msgstr "Data schedulata" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,help:purchase_manual_delivery.field_create_stock_picking_wizard__scheduled_date +msgid "" +"Scheduled time for the first part of the shipment to be processed. Setting " +"manually a value here would set it as expected date for all the stock moves." +msgstr "" +"Data pianificata per la lavorazione della prima parte della spedizione. " +"Impostare qui manualmente un valore lo imposterà come data prevista per " +"tutti i movimenti di magazzino." + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_purchase_order_unreceived_line_filter +msgid "Search Undelivered Lines" +msgstr "Ricerca righe non consegnate" + +#. module: purchase_manual_delivery +#. odoo-python +#: code:addons/purchase_manual_delivery/wizard/create_manual_stock_picking.py:0 +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__picking_id +#, python-format +msgid "Stock Picking" +msgstr "Prelievo di magazzino" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__taxes_id +msgid "Taxes" +msgstr "Imposte" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,help:purchase_manual_delivery.field_purchase_order_line__pending_to_receive +msgid "There is pending quantity to receive not yet planned" +msgstr "Ci sono quantità in attesa da ricevere non ancora pianficate" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,help:purchase_manual_delivery.field_create_stock_picking_wizard_line__qty +msgid "This is the quantity taken into account to create the picking" +msgstr "Questa è la quantità presa in considerazione per creare il prelievo" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__price_unit +msgid "Unit Price" +msgstr "Prezzo unitario" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__product_uom +msgid "Unit of Measure" +msgstr "Unità di misura" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__partner_id +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__partner_id +msgid "Vendor" +msgstr "Fornitore" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__wizard_id +msgid "Wizard" +msgstr "Procedura guidata" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,help:purchase_manual_delivery.field_create_stock_picking_wizard_line__partner_id +msgid "You can find a vendor by its Name, TIN, Email or Internal Reference." +msgstr "" +"Un fornitore può essere trovato per nome, codice fiscale, e-mail o " +"riferimento interno." + +#. module: purchase_manual_delivery +#. odoo-python +#: code:addons/purchase_manual_delivery/wizard/create_manual_stock_picking.py:0 +#, python-format +msgid "" +"You can not receive more than the remaining quantity. If you need to do so, " +"please edit the purchase order first." +msgstr "" +"Non è possibile ricever più della quantità rimanente. Se è necessario, " +"modificare prima l'ordine di acquisto." + +#~ msgid "Purchase Order Lines" +#~ msgstr "Righe ordine di acquisto" + +#~ msgid "Config Settings" +#~ msgstr "Impostazioni configurazione" diff --git a/purchase_manual_delivery/i18n/pt_BR.po b/purchase_manual_delivery/i18n/pt_BR.po new file mode 100644 index 00000000000..7253ac1bde7 --- /dev/null +++ b/purchase_manual_delivery/i18n/pt_BR.po @@ -0,0 +1,365 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_manual_delivery +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_create_stock_picking +msgid "Cancel" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model,name:purchase_manual_delivery.model_res_company +msgid "Companies" +msgstr "" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.purchase_order_view_form_inherit +msgid "Create Incoming Shipment" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.actions.act_window,name:purchase_manual_delivery.action_create_manual_stock_picking +msgid "Create Manual Stock Picking" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model,name:purchase_manual_delivery.model_create_stock_picking_wizard +msgid "Create Manual Stock Picking Wizard" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model,name:purchase_manual_delivery.model_create_stock_picking_wizard_line +msgid "Create Manual Stock Picking Wizard Line" +msgstr "" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_create_stock_picking +msgid "Create Stock Picking" +msgstr "" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_create_stock_picking +msgid "Create and View Picking" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__create_uid +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__create_uid +msgid "Created by" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__create_date +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__create_date +msgid "Created on" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__currency_id +msgid "Currency" +msgstr "" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.res_config_settings_view_form +msgid "Deliveries on purchase orders should be created manually by default." +msgstr "" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.res_config_settings_view_form +msgid "Delivery" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,help:purchase_manual_delivery.field_create_stock_picking_wizard_line__date_planned +msgid "" +"Delivery date expected from vendor. This date respectively defaults to " +"vendor pricelist lead time then today's date." +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__name +msgid "Description" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__location_dest_id +msgid "Destination Location" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__display_name +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__display_name +msgid "Display Name" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__date_planned +msgid "Expected Arrival" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__id +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__id +msgid "ID" +msgstr "" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.res_config_settings_view_form +msgid "If active, Receipt of purchase orders should be manual created." +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__write_uid +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__write_date +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__write_date +msgid "Last Updated on" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__line_ids +msgid "Lines" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,help:purchase_manual_delivery.field_create_stock_picking_wizard__location_dest_id +msgid "Location where the system will stock the received products." +msgstr "" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.res_config_settings_view_form +msgid "Manual Delivery" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_purchase_order__manual_delivery +msgid "Manual delivery" +msgstr "" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_create_stock_picking +msgid "Ordered Qty" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_purchase_order_line__pending_to_receive +msgid "Pending Qty to Receive" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_purchase_order__pending_to_receive +msgid "Pending To Receive" +msgstr "" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.purchase_order_line_search +msgid "Pending to receive" +msgstr "" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_create_stock_picking +msgid "Picking Scheduled Date" +msgstr "" + +#. module: purchase_manual_delivery +#. odoo-python +#: code:addons/purchase_manual_delivery/wizard/create_manual_stock_picking.py:0 +msgid "Please select one partner at a time" +msgstr "" + +#. module: purchase_manual_delivery +#. odoo-python +#: code:addons/purchase_manual_delivery/wizard/create_manual_stock_picking.py:0 +msgid "Please select one purchase order at a time" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model,name:purchase_manual_delivery.model_res_config_settings +msgid "Procurement purchase grouping settings" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__product_id +msgid "Product" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model,name:purchase_manual_delivery.model_product_product +msgid "Product Variant" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model,name:purchase_manual_delivery.model_purchase_order +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__purchase_id +msgid "Purchase Order" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model,name:purchase_manual_delivery.model_purchase_order_line +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__purchase_order_line_id +msgid "Purchase Order Line" +msgstr "" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.purchase_order_line_search +msgid "" +"Purchase Order Lines that are confirmed or done and an incoming shipment is " +"created to satisfy them" +msgstr "" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.purchase_order_line_search +msgid "" +"Purchase Order Lines that are confirmed or done and no incoming shipment is " +"created to satisfy them" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_res_company__purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_res_config_settings__purchase_manual_delivery +msgid "Purchase manual delivery?" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__qty_in_receipt +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_purchase_order_line__qty_in_receipt +msgid "Qty In Receipt" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__product_qty +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_create_stock_picking +msgid "Quantity" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,help:purchase_manual_delivery.field_create_stock_picking_wizard_line__qty_in_receipt +#: model:ir.model.fields,help:purchase_manual_delivery.field_purchase_order_line__qty_in_receipt +msgid "Quantity for which there are pending stock moves" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__qty +msgid "Quantity to Receive" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__qty_received +msgid "Received Qty" +msgstr "" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.purchase_order_line_search +msgid "Reception confirmed" +msgstr "" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_create_stock_picking +msgid "Remaining Qty" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__remaining_qty +msgid "Remaining Quantity" +msgstr "" + +#. module: purchase_manual_delivery +#. odoo-javascript +#: code:addons/purchase_manual_delivery/static/src/purchase_manual_delivery_forecasted/forecasted_details.xml:0 +msgid "Requests without delivery" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__scheduled_date +msgid "Scheduled Date" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,help:purchase_manual_delivery.field_create_stock_picking_wizard__scheduled_date +msgid "" +"Scheduled time for the first part of the shipment to be processed. Setting " +"manually a value here would set it as expected date for all the stock moves." +msgstr "" + +#. module: purchase_manual_delivery +#. odoo-python +#: code:addons/purchase_manual_delivery/wizard/create_manual_stock_picking.py:0 +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__picking_id +msgid "Stock Picking" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model,name:purchase_manual_delivery.model_stock_forecasted_product_product +msgid "Stock Replenishment Report" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,help:purchase_manual_delivery.field_purchase_order__manual_delivery +msgid "" +"Stock transfers need to be created manually to receive this PO's products" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__taxes_id +msgid "Taxes" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,help:purchase_manual_delivery.field_purchase_order_line__pending_to_receive +msgid "There is pending quantity to receive not yet planned" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,help:purchase_manual_delivery.field_create_stock_picking_wizard_line__qty +msgid "This is the quantity taken into account to create the picking" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__price_unit +msgid "Unit Price" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__product_uom +msgid "Unit of Measure" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__partner_id +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__partner_id +msgid "Vendor" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__wizard_id +msgid "Wizard" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,help:purchase_manual_delivery.field_create_stock_picking_wizard_line__partner_id +msgid "You can find a vendor by its Name, TIN, Email or Internal Reference." +msgstr "" + +#. module: purchase_manual_delivery +#. odoo-python +#: code:addons/purchase_manual_delivery/wizard/create_manual_stock_picking.py:0 +msgid "" +"You can not receive more than the remaining quantity. If you need to do so, " +"please edit the purchase order first." +msgstr "" diff --git a/purchase_manual_delivery/i18n/sl.po b/purchase_manual_delivery/i18n/sl.po new file mode 100644 index 00000000000..4ebe276d9e9 --- /dev/null +++ b/purchase_manual_delivery/i18n/sl.po @@ -0,0 +1,392 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_manual_delivery +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-04-11 13:23+0000\n" +"Last-Translator: Matjaz Mozetic \n" +"Language-Team: none\n" +"Language: sl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " +"n%100==4 ? 2 : 3;\n" +"X-Generator: Weblate 4.14.1\n" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_create_stock_picking +msgid "Cancel" +msgstr "Preklic" + +#. module: purchase_manual_delivery +#: model:ir.model,name:purchase_manual_delivery.model_res_company +msgid "Companies" +msgstr "" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.purchase_order_view_form_inherit +msgid "Confirm Order" +msgstr "Potrdi nalog" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.purchase_order_view_form_inherit +msgid "Create Incoming Shipment" +msgstr "Ustvari prejemnico" + +#. module: purchase_manual_delivery +#: model:ir.actions.act_window,name:purchase_manual_delivery.action_create_manual_stock_picking +msgid "Create Manual Stock Picking" +msgstr "Ročno ustvari prejemnico" + +#. module: purchase_manual_delivery +#: model:ir.model,name:purchase_manual_delivery.model_create_stock_picking_wizard +msgid "Create Manual Stock Picking Wizard" +msgstr "Čarovnik za ročno ustvarjanje prejemnic" + +#. module: purchase_manual_delivery +#: model:ir.model,name:purchase_manual_delivery.model_create_stock_picking_wizard_line +msgid "Create Manual Stock Picking Wizard Line" +msgstr "Postavka čarovnika za ročno ustvarjanje prejemnic" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_create_stock_picking +msgid "Create Stock Picking" +msgstr "Ustvari prejemnico" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_create_stock_picking +msgid "Create and View Picking" +msgstr "Ustvari in prikaži prejemnico" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__create_uid +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__create_uid +msgid "Created by" +msgstr "Ustvaril" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__create_date +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__create_date +msgid "Created on" +msgstr "Ustvarjeno" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__currency_id +msgid "Currency" +msgstr "Valuta" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.res_config_settings_view_form +msgid "Deliveries on purchase orders should be created manually." +msgstr "" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.res_config_settings_view_form +msgid "Delivery" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,help:purchase_manual_delivery.field_create_stock_picking_wizard_line__date_planned +msgid "" +"Delivery date expected from vendor. This date respectively defaults to " +"vendor pricelist lead time then today's date." +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__name +msgid "Description" +msgstr "Opis" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__location_dest_id +msgid "Destination Location" +msgstr "Ciljna lokacija" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__display_name +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__display_name +msgid "Display Name" +msgstr "Prikazani naziv" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_create_stock_picking +msgid "Existing Qty" +msgstr "Obstoječa kol" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__existing_qty +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_purchase_order_line__existing_qty +msgid "Existing Quantity" +msgstr "Obstoječa količina" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__date_planned +msgid "Expected Arrival" +msgstr "" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_purchase_order_unreceived_line_filter +msgid "Group By" +msgstr "Združi po" + +#. module: purchase_manual_delivery +#: model_terms:ir.actions.act_window,help:purchase_manual_delivery.action_order_line_delivery_tree +msgid "Here is a list of each purchase order line to be received." +msgstr "Tu je seznam postavk nabavnega naloga za prejem." + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__id +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__id +msgid "ID" +msgstr "ID" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.res_config_settings_view_form +msgid "If active, Receipt of purchase orders should be manual created." +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard____last_update +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line____last_update +msgid "Last Modified on" +msgstr "Zadnjič spremenjeno" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__write_uid +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__write_uid +msgid "Last Updated by" +msgstr "Zadnji posodobil" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__write_date +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__write_date +msgid "Last Updated on" +msgstr "Zadnjič posodobljeno" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__line_ids +msgid "Lines" +msgstr "Postavke" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,help:purchase_manual_delivery.field_create_stock_picking_wizard__location_dest_id +msgid "Location where the system will stock the received products." +msgstr "Lokacija zaloge za prejem proizvodov." + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.res_config_settings_view_form +msgid "Manual Delivery" +msgstr "" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_create_stock_picking +msgid "Ordered Qty" +msgstr "Naročena kol" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_purchase_order_line__pending_to_receive +msgid "Pending Qty to Receive" +msgstr "Za prejeti je še" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_purchase_order__pending_to_receive +msgid "Pending To Receive" +msgstr "Za prejem" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_purchase_order_unreceived_line_filter +msgid "Pending to receive" +msgstr "Za prejem" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_create_stock_picking +msgid "Picking Scheduled Date" +msgstr "Načrtovani datum dobave" + +#. module: purchase_manual_delivery +#. odoo-python +#: code:addons/purchase_manual_delivery/wizard/create_manual_stock_picking.py:0 +#, python-format +msgid "Please select one partner at a time" +msgstr "Prosimo, da izberete le po enega partnerja hkrati" + +#. module: purchase_manual_delivery +#. odoo-python +#: code:addons/purchase_manual_delivery/wizard/create_manual_stock_picking.py:0 +#, python-format +msgid "Please select one purchase order at a time" +msgstr "Prosimo, da izberete po en nabavni nalog hkrati" + +#. module: purchase_manual_delivery +#: model:ir.model,name:purchase_manual_delivery.model_res_config_settings +msgid "Procurement purchase grouping settings" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__product_id +msgid "Product" +msgstr "Proizvod" + +#. module: purchase_manual_delivery +#: model:ir.actions.act_window,name:purchase_manual_delivery.action_order_line_delivery_tree +#: model:ir.ui.menu,name:purchase_manual_delivery.menu_delivery_purchase_order_lines +msgid "Purchase Manual Receipt" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model,name:purchase_manual_delivery.model_purchase_order +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__purchase_id +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_purchase_order_unreceived_line_filter +msgid "Purchase Order" +msgstr "Nabavni nalog" + +#. module: purchase_manual_delivery +#: model:ir.model,name:purchase_manual_delivery.model_purchase_order_line +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__purchase_order_line_id +msgid "Purchase Order Line" +msgstr "Postavka nabavnega naloga" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_purchase_order_unreceived_line_filter +msgid "" +"Purchase Order Lines that are confirmed or done and an incoming shipment is " +"created to satisfy them" +msgstr "" +"Postavke nabavnega naloga, ki so potrjene ali opravljene in je za njih bila " +"ustvarjena prejemnica" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_purchase_order_unreceived_line_filter +msgid "" +"Purchase Order Lines that are confirmed or done and no incoming shipment is " +"created to satisfy them" +msgstr "" +"Postavke nabavnega naloga, ki so potrjene ali opravljene in še nimajo " +"ustvarjene prejemnice" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_purchase_order__manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_res_company__purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_res_config_settings__purchase_manual_delivery +msgid "Purchase manual delivery?" +msgstr "" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__product_qty +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_create_stock_picking +msgid "Quantity" +msgstr "Količina" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,help:purchase_manual_delivery.field_create_stock_picking_wizard_line__existing_qty +#: model:ir.model.fields,help:purchase_manual_delivery.field_purchase_order_line__existing_qty +msgid "Quantity already planned or shipped (stock movements already created)" +msgstr "Že planirana ali dobavljena količina (že ustvarjeni premiki zaloge)" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__qty +msgid "Quantity to Receive" +msgstr "Količina za prejem" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_purchase_order_unreceived_line_filter +msgid "Reception confirmed" +msgstr "Prejemnica potrjena" + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_create_stock_picking +msgid "Remaining Qty" +msgstr "Preostala kol" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__remaining_qty +msgid "Remaining Quantity" +msgstr "Preostala količina" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__scheduled_date +msgid "Scheduled Date" +msgstr "Načrtovani datum" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,help:purchase_manual_delivery.field_create_stock_picking_wizard__scheduled_date +msgid "" +"Scheduled time for the first part of the shipment to be processed. Setting " +"manually a value here would set it as expected date for all the stock moves." +msgstr "" +"Načrtovani čas za prvi del dobave za obdelavo. Ročna nastavitev vrednosti na " +"tem mestu ga nastavi kot pričakovani datum za vse premike zaloge." + +#. module: purchase_manual_delivery +#: model_terms:ir.ui.view,arch_db:purchase_manual_delivery.view_purchase_order_unreceived_line_filter +msgid "Search Undelivered Lines" +msgstr "Iskanje ne dobavljenih postavk" + +#. module: purchase_manual_delivery +#. odoo-python +#: code:addons/purchase_manual_delivery/wizard/create_manual_stock_picking.py:0 +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__picking_id +#, python-format +msgid "Stock Picking" +msgstr "Prejemnica" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__taxes_id +msgid "Taxes" +msgstr "Davki" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,help:purchase_manual_delivery.field_purchase_order_line__pending_to_receive +msgid "There is pending quantity to receive not yet planned" +msgstr "Ni količine za prejem, ki še ni planirana" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,help:purchase_manual_delivery.field_create_stock_picking_wizard_line__qty +msgid "This is the quantity taken into account to create the picking" +msgstr "To je količina, ki bo upoštevana ob nastanku prejemnice" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__price_unit +msgid "Unit Price" +msgstr "Cena enote" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__product_uom +msgid "Unit of Measure" +msgstr "Enota mere" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard__partner_id +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__partner_id +msgid "Vendor" +msgstr "Dobavitelj" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,field_description:purchase_manual_delivery.field_create_stock_picking_wizard_line__wizard_id +msgid "Wizard" +msgstr "Čarovnik" + +#. module: purchase_manual_delivery +#: model:ir.model.fields,help:purchase_manual_delivery.field_create_stock_picking_wizard_line__partner_id +msgid "You can find a vendor by its Name, TIN, Email or Internal Reference." +msgstr "" +"Dobavitelja lahko najdete po imenu, davčni številki, email naslovu ali " +"internem sklicu." + +#. module: purchase_manual_delivery +#. odoo-python +#: code:addons/purchase_manual_delivery/wizard/create_manual_stock_picking.py:0 +#, python-format +msgid "" +"You can not receive more than the remaining quantity. If you need to do so, " +"please edit the purchase order first." +msgstr "" +"Ne morete prejeti več, kot je preostala količina. Če je to potrebno uredite " +"popravite nabavni nalog." + +#~ msgid "Purchase Order Lines" +#~ msgstr "Postavke nabavnih nalogov" diff --git a/purchase_manual_delivery/migrations/17.0.1.0.0/pre-migration.py b/purchase_manual_delivery/migrations/17.0.1.0.0/pre-migration.py new file mode 100644 index 00000000000..07e48dd9030 --- /dev/null +++ b/purchase_manual_delivery/migrations/17.0.1.0.0/pre-migration.py @@ -0,0 +1,16 @@ +from odoo.tools.sql import column_exists + + +def migrate(cr, version): + """Initialize qty_in_receipt as existing_qty - qty_received""" + if not column_exists(cr, "purchase_order_line", "qty_in_receipt") and column_exists( + cr, "purchase_order_line", "existing_qty" + ): + cr.execute( + """ + alter table purchase_order_line + add column qty_in_receipt numeric; + update purchase_order_line + set qty_in_receipt = coalesce(existing_qty, 0) - coalesce(qty_received, 0); + """ + ) diff --git a/purchase_manual_delivery/models/__init__.py b/purchase_manual_delivery/models/__init__.py new file mode 100644 index 00000000000..e60e2983989 --- /dev/null +++ b/purchase_manual_delivery/models/__init__.py @@ -0,0 +1,5 @@ +from . import product_product +from . import res_company +from . import res_config +from . import purchase_order +from . import purchase_order_line diff --git a/purchase_manual_delivery/models/product_product.py b/purchase_manual_delivery/models/product_product.py new file mode 100644 index 00000000000..a806f2c338c --- /dev/null +++ b/purchase_manual_delivery/models/product_product.py @@ -0,0 +1,56 @@ +from odoo import models +from odoo.fields import Domain + + +class ProductProduct(models.Model): + _inherit = "product.product" + + def _get_pending_lines_domain(self, location_ids=False, warehouse_ids=False): + """Reuse the base purchase lines domain but target confirmed lines that + are still pending to receive instead of the draft RFQ lines.""" + domain = self._get_lines_domain(location_ids, warehouse_ids) + + def _replace_state(condition): + if condition.field_expr == "state": + return Domain("state", "in", ("purchase", "done")) & Domain( + "pending_to_receive", "=", True + ) + return condition + + return domain.map_conditions(_replace_state) + + def _get_quantity_in_progress(self, location_ids=False, warehouse_ids=False): + qty_by_product_location, qty_by_product_wh = super()._get_quantity_in_progress( + location_ids, warehouse_ids + ) + domain = self._get_pending_lines_domain(location_ids, warehouse_ids) + groups = self.env["purchase.order.line"]._read_group( + domain, + [ + "product_id", + "order_id", + "product_uom_id", + "orderpoint_id", + ], + ["product_qty:sum", "qty_in_receipt:sum", "qty_received:sum"], + ) + for ( + product, + order, + uom, + orderpoint, + product_qty, + qty_in_receipt, + qty_received, + ) in groups: + if orderpoint: + location = orderpoint.location_id + else: + location = order.picking_type_id.default_location_dest_id + product_qty = uom._compute_quantity( + product_qty, product.uom_id, round=False + ) + remaining_qty = product_qty - (qty_in_receipt + qty_received) + qty_by_product_location[(product.id, location.id)] += remaining_qty + qty_by_product_wh[(product.id, location.warehouse_id.id)] += remaining_qty + return qty_by_product_location, qty_by_product_wh diff --git a/purchase_manual_delivery/models/purchase_order.py b/purchase_manual_delivery/models/purchase_order.py new file mode 100644 index 00000000000..0e344e4660b --- /dev/null +++ b/purchase_manual_delivery/models/purchase_order.py @@ -0,0 +1,40 @@ +# Copyright 2019 ForgeFlow S.L. +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class PurchaseOrder(models.Model): + _inherit = "purchase.order" + + pending_to_receive = fields.Boolean(compute="_compute_pending_to_receive") + manual_delivery = fields.Boolean( + string="Manual delivery", + compute="_compute_manual_delivery", + help=( + "Stock transfers need to be created manually to receive this PO's products" + ), + readonly=False, + store=True, + ) + + @api.depends("company_id") + def _compute_manual_delivery(self): + """The manual delivery option is derived from the company of the order""" + for po in self: + po.manual_delivery = po.company_id.purchase_manual_delivery + + def _compute_pending_to_receive(self): + """An order is 'pending to receive' if any of its lines is""" + for order in self: + order.pending_to_receive = any( + order.order_line.mapped("pending_to_receive") + ) + + def _create_picking(self): + # Avoid creating deliveries on manual delivery orders + if self.env.context.get("ignore_manual_delivery"): + orders = self + else: + orders = self.filtered(lambda po: not po.manual_delivery) + return super(PurchaseOrder, orders)._create_picking() diff --git a/purchase_manual_delivery/models/purchase_order_line.py b/purchase_manual_delivery/models/purchase_order_line.py new file mode 100644 index 00000000000..909330d399b --- /dev/null +++ b/purchase_manual_delivery/models/purchase_order_line.py @@ -0,0 +1,85 @@ +# Copyright 2019 ForgeFlow S.L. +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models +from odoo.tools import float_compare + + +class PurchaseOrderLine(models.Model): + _inherit = "purchase.order.line" + + qty_in_receipt = fields.Float( + compute="_compute_qty_in_receipt", + store=True, + digits="Product Unit of Measure", + help="Quantity for which there are pending stock moves", + ) + pending_to_receive = fields.Boolean( + compute="_compute_qty_in_receipt", + store=True, + string="Pending Qty to Receive", + help="There is pending quantity to receive not yet planned", + ) + + @api.depends( + "move_ids", + "move_ids.state", + "move_ids.location_id", + "move_ids.location_dest_id", + "product_uom_qty", + "qty_received", + "state", + ) + def _compute_qty_in_receipt(self): + for line in self: + precision_digits = self.env["decimal.precision"].precision_get( + "Product Unit of Measure" + ) + total = 0.0 + for move in line.move_ids: + if move.state not in ["cancel", "done"]: + if ( + move.location_id + == self.order_id.picking_type_id.default_location_dest_id + ): + # This is a return to vendor + if move.to_refund: + total -= move.product_uom._compute_quantity( + move.quantity, line.product_uom_id + ) + elif ( + move.origin_returned_move_id + and move.origin_returned_move_id._is_dropshipped() + and not move._is_dropshipped_returned() + ): + # Edge case: the dropship is returned to the stock, + # no to the supplier. + # In this case, the received quantity on the PO is + # set although we didn't receive the product + # physically in our stock. To avoid counting the + # quantity twice, we do nothing. + pass + else: + total += move.product_uom._compute_quantity( + move.quantity, line.product_uom_id + ) + line.qty_in_receipt = total + if ( + float_compare( + line.product_qty, + line.qty_in_receipt + line.qty_received, + precision_digits=precision_digits, + ) + == 1 + ): + line.pending_to_receive = True + else: + line.pending_to_receive = False + + def _create_or_update_picking(self): + # Avoid creating deliveries on manual delivery orders + if self.env.context.get("ignore_manual_delivery"): + lines = self + else: + lines = self.filtered(lambda pol: not pol.order_id.manual_delivery) + return super(PurchaseOrderLine, lines)._create_or_update_picking() diff --git a/purchase_manual_delivery/models/res_company.py b/purchase_manual_delivery/models/res_company.py new file mode 100644 index 00000000000..9ef6629e7e2 --- /dev/null +++ b/purchase_manual_delivery/models/res_company.py @@ -0,0 +1,11 @@ +# Copyright 2022 ForgeFlow S.L. +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import fields, models + + +class ResCompany(models.Model): + _inherit = "res.company" + + purchase_manual_delivery = fields.Boolean( + string="Purchase manual delivery?", required=False + ) diff --git a/purchase_manual_delivery/models/res_config.py b/purchase_manual_delivery/models/res_config.py new file mode 100644 index 00000000000..f652094e3bf --- /dev/null +++ b/purchase_manual_delivery/models/res_config.py @@ -0,0 +1,11 @@ +# Copyright 2022 ForgeFlow S.L. +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + _inherit = "res.config.settings" + + purchase_manual_delivery = fields.Boolean( + related="company_id.purchase_manual_delivery", readonly=False + ) diff --git a/purchase_manual_delivery/pyproject.toml b/purchase_manual_delivery/pyproject.toml new file mode 100644 index 00000000000..4231d0cccb3 --- /dev/null +++ b/purchase_manual_delivery/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/purchase_manual_delivery/readme/CONFIGURE.md b/purchase_manual_delivery/readme/CONFIGURE.md new file mode 100644 index 00000000000..5d161c214ca --- /dev/null +++ b/purchase_manual_delivery/readme/CONFIGURE.md @@ -0,0 +1,2 @@ +The `Manual delivery` checkbox can be edited on any RFQ, on the `Other Information` +tab. To set the default value for new POs, go to Settings -> Purchase -> Delivery. diff --git a/purchase_manual_delivery/readme/CONTRIBUTORS.md b/purchase_manual_delivery/readme/CONTRIBUTORS.md new file mode 100644 index 00000000000..8c17d017e6c --- /dev/null +++ b/purchase_manual_delivery/readme/CONTRIBUTORS.md @@ -0,0 +1,2 @@ +- Adria Gil Sorribes \<\> +- Stefan Rijnhart \<\> diff --git a/purchase_manual_delivery/readme/DESCRIPTION.md b/purchase_manual_delivery/readme/DESCRIPTION.md new file mode 100644 index 00000000000..5dfb0edb24c --- /dev/null +++ b/purchase_manual_delivery/readme/DESCRIPTION.md @@ -0,0 +1,8 @@ +The goal of this module is to allow the manual creation of incoming +shipments. When installed, a purchase order won't impact directly the +stock. It will not create the pickings upon order confirmation. It +allows the reception and the impact on stock to be done manually when +needed. The goal is to be used when a supplier does not confirm the full +order at once. As the supplier confirms the different purchase order +lines, the user can manually create the incoming shipments for those +specific lines. diff --git a/purchase_manual_delivery/readme/USAGE.md b/purchase_manual_delivery/readme/USAGE.md new file mode 100644 index 00000000000..d622fadaa0b --- /dev/null +++ b/purchase_manual_delivery/readme/USAGE.md @@ -0,0 +1,28 @@ +There are two main ways to use this module: + +- From Purchase Order + +When creating a purchase order and confirming it, no picking will be +automatically created. Lines with pending quantities to receive will +appear in blue color, to create the manual picking press the button +"Create Incoming Shipment": + +![](../static/description/create_incoming_shipment_button.png) + +This will trigger the wizard that lets the user choose which lines +should be taken for the creation of the picking and also the quantities. +Clicking on the "Create and View Picking" will create the reception and +redirect the user to the picking form. + +![](../static/description/create_incoming_shipment_wizard.png) + +- From Purchase Order Line + +The module adds a new list view for Purchase Order Lines (in Purchase +Menu). From there you can select multiple PO lines (in this base module +only PO lines from same PO can be selected) and create the manual +delivery. Follow the same steps as above to manually generate the +incoming shipment. + +If, as a developer, you need to override the behaviour you can call +`purchase.order`'s `button_confirm` with context key `ignore_manual_delivery=True`. diff --git a/purchase_manual_delivery/report/__init__.py b/purchase_manual_delivery/report/__init__.py new file mode 100644 index 00000000000..9f149be61d9 --- /dev/null +++ b/purchase_manual_delivery/report/__init__.py @@ -0,0 +1 @@ +from . import stock_forecasted diff --git a/purchase_manual_delivery/report/stock_forecasted.py b/purchase_manual_delivery/report/stock_forecasted.py new file mode 100644 index 00000000000..85ffc9e90c0 --- /dev/null +++ b/purchase_manual_delivery/report/stock_forecasted.py @@ -0,0 +1,44 @@ +from odoo import models + + +class StockForecastedProductProduct(models.AbstractModel): + _inherit = "stock.forecasted_product_product" + + def _get_report_header(self, product_template_ids, product_ids, wh_location_ids): + """Insert entries for POs for which additional receipts can be created""" + res = super()._get_report_header( + product_template_ids, product_ids, wh_location_ids + ) + domain = [ + ("state", "in", ["purchase", "done"]), + ("pending_to_receive", "=", True), + ] + domain += self._product_purchase_domain(product_template_ids, product_ids) + warehouse_id = self.env.context.get("warehouse_id", False) + if warehouse_id: + domain += [("order_id.picking_type_id.warehouse_id", "=", warehouse_id)] + po_lines = ( + self.env["purchase.order.line"].sudo().search(domain).grouped("product_id") + ) + in_qty = { + product.id: sum( + lines.mapped( + lambda pol: pol.product_qty + - (pol.qty_in_receipt + pol.qty_received) + ) + ) + for product, lines in po_lines.items() + } + self._add_product_quantities( + res, product_template_ids, product_ids, "no_delivery_purchase_qty", in_qty + ) + for product in self._get_products(product_template_ids, product_ids): + if product not in po_lines: + continue + res["product"][product.id]["no_delivery_purchase_orders"] = ( + po_lines[product] + .mapped("order_id") + .sorted("name") + .read(fields=["id", "name"]) + ) + return res diff --git a/purchase_manual_delivery/security/ir.model.access.csv b/purchase_manual_delivery/security/ir.model.access.csv new file mode 100644 index 00000000000..19627690c0d --- /dev/null +++ b/purchase_manual_delivery/security/ir.model.access.csv @@ -0,0 +1,3 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +create_stock_picking_wizard_all,create_stock_picking_wizard_all,model_create_stock_picking_wizard,stock.group_stock_user,1,1,1,1 +create_stock_picking_wizard_line_all,create_stock_picking_wizard_line_all,model_create_stock_picking_wizard_line,stock.group_stock_user,1,1,1,1 diff --git a/purchase_manual_delivery/static/description/create_incoming_shipment_button.png b/purchase_manual_delivery/static/description/create_incoming_shipment_button.png new file mode 100644 index 0000000000000000000000000000000000000000..e5c923de0c0b46a33e44cf2319f7fa5ab1f5b20c GIT binary patch literal 22180 zcmb5WbyOTd_cqwL2Mr$FHMj-0Ai>?;-5r7ix8M%J-F2`8cXtoY;O;DW-|u(!+w<-I zv3=^yOyBN0b-TK%?ycv!cfu9qBvBCY5di=|k@_m81OSk-008k39`aq1WzWd@{srYM zBBcTk55KY{zxjTO<|3})qHJ&G;%?|<3MgB+y11A+83#@x000RfB_^!mv3$Jdse`$& z%zZ9dCxQ)+hE19q03U`9E!-VwAxy8a%CxNZLc5@MVOzeSY3D!=b zOCnQu$j8n@v_Q8=6gNSKs)L3%`F{NT3LpGQ2N2IW3zZiTWliI8Hgn4UvOg;OgM*6; zN(7$tnr^y>P6(bfSoi~JFxnrIP&5&E!#L4*!RNtufe7x-yMPqg>HkeInM-=hBYE*~ zzl~QX7a#w%u-3NXIk4Yh41xLPmg8%m3;uTL2n~IU7yVX~P|0NdHLAu%k(6L!fz;p= z+nbu6t$3wup`=l5w1m?qC@QVGugn(4D`wb~#4TRm>_?Aw$1A=sA^d7E&QM}d_ha=n zNvWe{i?xmF+_;FNVAbe3Su28m;=^+<$t*fLP856{ruEXHP7V_288vIji0z6^upGco zOnFOkV4*E;kdtF=a`QFrMqb1(Tk7Zo_*>V#q3(jl*~m^g)OqmSmb1)srX zf9m_e&`UB5iFG)lV!vj4J> zQmQY-Y3-lhK(LjWu{r;r9Z#s%x?h_qqKE$2UpanI#pI9KehZISPJg;1GTq^-%lc7Y z8q`ty$y_aIKT$P)jK3cbj5_G2aQTx7r;a)#`lN`6j3O}9UN9_mw3eO|~p6gSyNXu5{*Q`Jm&IJZzb{7f(rAZ0Ae@qFCS0GdYElk11J zF+%fNV&ee-{-dvgc0!>(61t8YhYHdUW60=SaSu**89VVpBy1kZ0iLX7adR zR39X`Y=4}okOFes-EWSd3STN>Q{+s5fY^+=p|c4JN;7$log%@wYR=u~G&Pu8duHt; zYh*wmTaDU1>j4}aMSCldI!1bJ#DA4a_}eKkx{wHd*gC0Nr?5l?@S^x3{KioEmx@{W ztCNqll7)6K6u>$#v7Z%=tm^r@(PpXKCybwo$pT+s`PH&c>}S%OnD?)uwu3xeVAFB9 zZO(!y0v&WxQ z7uL}(o@T3e|7`cN{MqZ;K|xipO34^0Xfkear>#)291yCm6fFwZcc82-$dzT7id*DV z(^GC;Z!*!{qu$)rk@8c~DJQ{Ck3w}aHKn4oSe<8foK#2h-*9IP*=pkalUInKxS+S5 zkT~q5-PJ4HH9^UxLZLrAyhe+!>PGhvvY~OXe8VTkPu%h zGj~RZB_T`SR|F0d-WX!Gv5lX?2fS?LjoYa@69n|q>;5-ItpjA`%Oi)oA4NE(;&u-> zsCH25^~f|#6>A4=qPCUI*u}~OfB+=~pfJr}-5M8@suj;Y`UmH${bF$+mZ>Sn{XKzN ziaO`_q4TYi$BD{{P|?TjX*vf27Kducpgs~SBJ~A2;gycEs`7HU&$(>1%@}#48AG&) zuRa=iQ}u+Fzfds0g=mJxo_nCMrvP?eC%=vqT?QLVU4%p=PdbA8^9}+fO(FxDTOjgD z&vdk$mN4&bZ|Y1M&+if}7l<$i3)cEUghVUDbwhjLGlAs?1=SJ%K$n(%BbOzOfQW)bV;pH{WTY;V z<~R~KNhsPgt>rWq%VsvgB`vMNOHXPg(@d#sBpffVG#O9zX`|EYpWzWmMDVG%qcgX$31 z1F&!_<)?iE1^gA53yH5EajwiOUoE;2%oe*z*x6Zmq8mtPWh(dtMJUVn)p1m4!wHKO zKqicB>z3%DG@mOZZ9el>xq zGH-pSZx2Cq(Yj$14EA(DH#9*q6|E{o85~J4AjxG(%*N(wxB^4rYVTT9X>O8^uOXNe>V zEEr&gLSz}B4m#Xb^!y4_j9ivAO#3ReZwy9s>n0U5GCjTVOWoGT8O!W035E{X*=Vv| z7?*7oCZCh#5e=Y##U+t%vnPS=h=l`#r(6npK5r~jEZvtwv0qJ<*S0}YETwY>+`nzH z5N79Gl>lF=tksuis_3B`Sz>Kqn#viDv7Qd^=7SmiuSE z4?utgr{xeNv+=tj!>3zIlJ;{$?^=6vk%_zzCWrFT20fKMcs3gF4E294v`}hf-!PV7 zQBtNyveIRwOrpftY-dq&_k!sei}$X)yv6h_JaZj_Rq^HbNX&Lk*c$v~`iDf3AG>{b z>clDAXI$?7V;{yQG`F*ht|~iy*G1H5!EmP4rUnE6jMy|-%5R`PT1xUuu`GLCFql_< z$SNZ{WJN863^M^*m2RG`Sy-HB8`s5tl#=dn(wYKmuso(xQsMn}O}51QbE|^&7c*?1 za>!8qjn|Q>5d-jrpmG;RzLyO_4WUB8g8rm+Tmv3Q64>lGQ+eYo;p%!|jB z@>C#I24adI2-4WX(<8j{@EcA#A)?o3oKjVIg+j!Njs=hhdyN3HBw^oiBNt76ad|Zr z7q+e@B@zt8LXmJ-AYhJ|K&DX1)tVgbs~3QOKsFIv^ za!^~P){rb3@*D7ANG<`|%1s=DG+@N2vJkz*d@%xk8EdN0eMAd4`TIT`=1Ldp`yTUg z#F$)+0f4);ZRx<@{l4G-ZPSm?C^{NhM3f|9hQrFF3F(eM{c$t?S4#q3)K_~+t(7~? zm@fJ5u$T>x8+Znp05Zq`eDxQ)6-NT@kArW0FBR({< z4KPGIoH{AJCQLj~yfkNZLSO5|x?p}lx;LHkDU8-#_!wR;QwCJXa#H{|Gt`0nopih6 z)LGj@B{rCRF-scidIH-fJ)62?=|T%Ns*?2VC8Wg>}a z*Cbq(gT(vha=BLflcAxFlSxYo$XEiH=4>z`(}gw`9Z2+5)sV`*b9?lg* z-~7hFh#thDCl)Y?hUl~`U&H90Y=4tS@O*_ZPaL9s2oyzqz_Jr zcB~`LiK_lUt@Mf^G$zFFl80~FeCmJ%4c=sPGI?VbNsNx)m%N9X+cU<1)sBJu#>-Q> zs6MON?W(YOynx?eSsta~dj<>)9Y0?cN`AGMN1M?(Qq_eCgM8PZW-_BxVqM?@w9r|8 z%><}63rfLJn8Wy*=GK`gUu}CJZS8BDJ3qNYqI|I-({6sEAaP09?djxo*vz6D*NPE8j^Z)Z3LR)&ST+yMFGsP z^O1$)(k3v$fzmgP&X(rmA5|;>h6;(=TryB@OXHB8m%?DVt+f`OO2G1R#JqZ+XKaM) zKKQ21#B{2|IP~XsU123@e1B~LB%lb=^m-rJNr=E>dOZ%I3?J_~8{)l_Zd7GU8Z9jE z%EgczUc>cvj5%#&^(wc&eAy=fBfOd5H1`k3oh}TjvJFm|oY~9n{MVXMw*>Ub;Sd^o z47yx-+-HW4#vs2wH@3U8ez!0o@jf5K0mpl1;sWefwlC2c5g0K!BURR1z=BG$+vRM| zoLA3A>fX@%9&0HUuX4kMnX$aewZ4AlEF%22O0MC%Pm%$cT|{5?azTI2R(zx@OBv4W zmi%+H=mCs(-HMkg+6mQiw1xj8aeTjFc>P-yE$srgM=HTji)4wv?G>zgF+vq82qPoY z%ke#G5b;#y!-M5?G&XUZ zQbcC!AP3Q3_PI6%n(bR=vSimyCV}ytU%J>c?poRv=TtTn(w*Owq?7)PlDb6T1px{} z^1dV$=wGc(vEbB=RhgaLD7>#fceE^xuh>DO1PnG5EUbZ))3Y{6)Q4aS3m4wJ@AUXX z_^f~BP@)T|`G5)%El&3hr?=O}z9M^j8<~E1ThIDC+P)ki?HD9Ni76vaR#>Jv;Zu>n zPXjBCntSJUkdOO`Yd+?hyZ%?4K0P%WmWc3aB?!S^B?1T-PT#bZ0CQh`wT2YTFEL3? zi>21?iftT}d84D7V!OLww?xU&&9RJhe4tHXvsicLXYe{ionN0HnRSf-i8E`W4$T^3 zRq`@lopsrn?j)mb4d?KDjh<-Yug_9u?U9*y;S{$p^&DOYp*^2$#HST`mKFO(bcRv$e( zaZ8lcXvcK6g{25YK*&&WH?~Yh+M3Qp_6{MFg@0m6I}U2HxyG?}Hf*@e)Boy9I^&w5 zVjVt%+qdC1OCD_pfOo+>^{{p>YwxVv+7cCR6=I1pWqpmV_2V3V;=25K#xW`B_=DhD z5w!z5f4l#Yw*{G4ZKC?GY0BlLH4I(4b&Wev8K_>-bdAfBIqhhM>XpPacvG8PjNo*1 znSsMLd&&lB;{|FyOn~75AfwsFBdrmqf0Rjv+(izDDCKH`zNK{-+!n;2@EP9lFy&iJ z|NNro=C+FLhq*-9x=gZs1>=pJ-FD;=!YZa6kJ z#%$22d%AnEtfa;-Er+?(zI*ibcRo64@FO02`DPzk+DbbQQaJ=^Ff8<|1>OJP3zG_0 zf&Kr18%Fr=<9LXZ2g{Ewxy2k zo41))Ne|FNQ3yCKU~KK|ei)`Vo3)H(Z?C=L{v6t65QR;HyzW+$hlUzL-bI|l~k`H2i@ERwP64Zv`6D+!QgStl_<^ zCSjD(_d}8g94snY#p-&^WA?}s%0voySQWtUq!1HAW5%Be<*;j zd3#&s#+b7`0?|Ycl0yCi*!-t={`b!KFM@+oNn&nb*h_)@9T7tX@tj5&zQcnqK3D0L z6-Pmj7OlfdIL4^UXQPf7)%{uf%xsy~OS8q-%|IfKv>QHl46f)w5s>hx&;xJHo}sHH z;&d3#wbNo|>FQ*@?7uoo`fOc&!U(*I&&yC2yFV0x=a&?9GOCTtG6v^Fg4`{3itc}n zM<>vEuVB4>JLH#$D~Qgc|Eu5YZl`+NM1ljFT;u7`f6;b1?l|XnR{?+&!ED@i&;ezs z?_XzTVZXbbkksd)OP$)C9E7PAonx~Y!)68Q!D9qt@GvyD!cCZvr9 z)zd|1Bx;Pix9Ed^t$nf6+dk1`iq@;Q z8g0h)5Kj-*m0$_}9_$-Y);S7vb(MMWt5xtj1{l~0&a}+v(yp_gct#ESrbU*17*^9~ zEXj6EzV6P>vDtn#7DW>2#}|euFP5dy;q0Q*5l-6D7?N2$#F-;xlNFXB!_#9yw+;OA9Wpc01>( zewQmh5c^G|1QM;_?9HI483d}o8}&bx`zjpzV-9_jA9?f6;G^*Scmj zN||f^ZMrjWv&YH&Jp;%uf6-=ml;xz$oST{7!9q8;mUC>x z)X#zU;&^`s;o=SSoa(U`ORISpt{*+J+HSP33#i_9#@@l35w;}7C%K<&?nG>_GA`w{CE5EOxO- zA6*$!PWw5c=X!cMr){3n&8&^O1`}!u*L1Jk@9*$<)D|v}f$>QD2STO)Eqx1{$m;B~ zbrraBW~y-6Jo1Bo`$fdzurpU(U4BaUlB<4!hkw0)I28Rgs2tSeS{g}bzYj++Q=z8! zbz(S1)6&;@ThM*qGNETwn`7oq=j$u^E8oQNH_%`2!_PCevuyTLSMKUc?d$qGuMR-x(@eP)|>&G*Y*pH>!6y! zGz0*XTrd@*o=3oYOk*DvH3y2`Izoq{Bpwf6S?o^?KNL*Yz?$=efqV%RN&t3)nPt@7 zVep^Akx%ECk!VL5U(DaW><0lrZt@7q@rGWPaT<9T>vB4kLQ=DJP5Z_N_aY#mu{l)S4eky_`XsXBut18 z*q-{ww5rsnDy;90dE&fkA9ncJqJ=^ld}`S05j#6!Nh=qC%XKIk&9Z|4WKreK2TMv} z4Q|^McXwmeeXoDl+lu%{4Tm7PZbSv9(e_Jtq}o=U{_X6fYLA zZp~F1Z!&-ca5L~B0U_5Aq1Vk#*}I_1DRdfPNFHu=bHa`GFR$5gLwF}PYSeI`7#WO2 z)sY!47?Axme@|VN+IJ{)!4CMm&IE{1age{qLJTATE6c`NUpZ3RXnDjgn6Ok8@0b46 zF_FQhO>p!`?l~9}GlV&7bA7iC59FeSBg;|yo~!06kdV|bRZ^NP^RYp+Avgu5!xklJ zf{Th@#l zJ_koq@>BuOmje(he2nXhvvGJ0q@M1nx9SmMrXkU?Q4a8V)X`3|^l;i>(qzB&sPKe| zm#t}OR9mR3@s+#NwuBUQSg*RY2&3=t-MB!2|KY%!l8C^;W4%j%(T_iuR-Q7M@hM5_ z^{HmSToCBv%V(-$d2X==Pw*$)J^GmiYyAzG#82E&IF zoBQXdWezvYsv>2sAdRSLy=bqs0 zk=$BgXe?1|7yz0Jl}HX_XqFYoRVpE&p~o6DRIx}ssq9e<_n{4-IXf@&JUeL#q1Gb{ zhGmw;5LQrQKtowBbow>YMX40DC)aGyTyu_!YFM28S~)o{Xrpqw#UJj&Gbpp|E|KMx zYXbTGa{^)++wRAp{a0?Dm;PmXeeuU{KxZCTcjzahUo(c2e0b6J-&)xgNvd@d}&KP~aCp3&A zr^F+YyUE#yLgYV)^qBtN4CVOdNo8=^*k-ppWL^3%Q9zw#>viUPy{_Fg8PBiT%t5In zcR8mnRx1^EW%=+JeWEk7>8+$CA6~BGo(lFG)6~ytY{DAPmyrNqVIJczXXKp#D$S4?m1# zz~t!8FZwrNX=lgDe(YfRDg3JnO_Jy@xsTG6;bHEg!UwJ_!T(&Wg}vrj5-y%e)k;Ma zr%dbrxOM?UOeZ-elPJL`e^cJRD$ykUfn^D@3y>rbsSeMZ=I!`^US)m7S1|!#Kdn^m zfLl>eqJz{FsFeMkHdB|J+xhr6NRlHcqotFMOsh;W;s$(9Tv{p#UNc%!4$GSmIzbFP_Hrd8C1z$@|K|AJD-oeLcf3 zkN~b~PEdHoyvw9Af3r6!_%DP2%&gU@;ffq~JdScXipui%}t%C5&&SbAQv1 zMtk`dE=`3R;I&Vrq+2}nhF>i5UK>jqbY!?rpsTy+TG<`wR_6H~UWZX4 zS5qh2*;UuaHDw-%i~R))*Afo3J8*Ka8(t+1HDfQl&3pD`1_+>lfCd`7x9px2`;ThF zv_)=2%6oq2zd_qeS=bq!v>u;qWR_SjXorwSvv8St$msSGRhnov+ zE@U^@caes(%L!H=!HWr33G!!xuiDdVtlu;LIHG7Zn4Pf7?*YCZ(9~ql$|823(pQ-2 z2Um%n^_GT@U-A;oy`FYssZZ|k11G{4d`5M>y6jc58ZDxz^QaGP|yv8&TNsyf;0`1s1x=Y9|mRns;?p#VglcEd? zF!gBmijcY+rZyj;FD~PTBg(yM0GMl{FBP&VLTb8xdO7;S{}T&vWu#_RiV@J8Hkfs4 zZ2FrbKtj{=Z2h4nbhb31Xc^<0=e7K>`L2IX>(R|uy?MnDy=hptD>r+~z(kCyq)ZxP zd>890Fesr%dg{j{;ll6gt0?^E;rXwGL92skphOfqSqVOv_<1N&zB&n=@sFD04N@-y zA9)*u@FfXz>uB%9O7CC*N$cHR8j=s`h?Q09)R@lqIR3qS_iscWF>H=4RO;GZ*E^gM zeDYw!l5a`tGh59lRCOukyEjGTX45X4NW?ko*nfV^WFFnM283t^V~T%5U0aI1lb~^$ zooBGlCuw47pU;+0uJDXh!AFVN-^&N2J*CMB@X>^aK~DQx-;pc&eXgsf@-gaALM5o_ z@42p=zDYdtd_ENG3$nJ{XYB^)ufZQ*FRj0Fy?alSN!Z%AfIOB{^cMN-?#aagX_OX5(di;U0tpN zb+w5^cOs9m`jS~~dL*z&cjvBeOK7t%a)emFGBLHeK1mOuL(VL{^`PWfd&9NS<}r0W z8*h7qor_Ndn#{;B$qB#grxH2_H zKmKe*D8C5pto#6C@4N&^S)8|HEP-Ocdh%pPC;wl z1`3UHH!y!*x1Lsnh=~!)y;ZT-m0s^`dZM&H-j16zj$yBe;YoGblW=Y3OWEBe+9Q#9 zrF|`Dya;_ujLtmjrIb;YUmr@4W}DFal2BS8@S9ZF$zh|$bUj6T&$pH5`USu^Q!%@=BGXw6%zMpul{fqH$vRQ4sE`o0G=IW_`Dp)fPGmlnTbg zxGume;XU&zUAav~8Zsv@WdRFx9Ny}VhG?_I&+5AkBtc?*((m9{c*(dwuBbSkITO;E z-HL)(fzhO0AXr;JRdCq5j)v>KC=%HfoyYaD+HZPYVi;c@@$3Q!ok}O@)mR52j<5QC; zhZpP}$-g72{CTv(OS4<7O=iF0X|^&2 z=)P~phYcG+ItE8ae%~}RYE{TX-&>a%2Wyc}kFs^;ywqb?*cOfXJNG1gJOl4jL=ked93NoptsBA_6bM%}32mCSPF+}*4aSxAXAnFjneUZHMT zj8fv#kqxet8G7n6&y5uo8QcGeh13g4nztenQD6VzEwc|3GD&|VZ$`2O%tRC0#tYIfWF>AntbE5A3pb9=QEb#-T{%T|wb##7|H{bqm_45(;2ItC8K zTSHaS3e}_P-+Z9v5GZ{o!T;hCo(@3+O~orE{Z8NE@53+L`#bBY2Gd1MV)W}+SDQdL zU$@mkAih{vcOvlL<7TpS_I;46u&nAgSB_Low^Jb#Ee$qt$nR}4Gew5PVvlvSSV(Ui zXHV+-ZRz=S*#c`F=SpP6fHWpEj<~%64feb=l%n&yWKNzYJYR4#kHDK)Y)%!E0!^z?O zSRP@7j*6zJA*+ze46t?vqbO}ucC*THm6axD09VQHX=6*0Kaj;eX{n>+6S4H%II@~5 zWD=v<;8yE8TG2E^pdF)}0v z0xA?sApw56EMbGirwVu5$jT&HRv>)4Pj}NwWMS|KMu`kP_#|H{_UtHc0E4}3o(*2b z3V?*T{`v?jU0bkAUR74f2+PmMTvsN%%!^fo&dH9>IQU2cr7&z#8U0;i28;rMRhKNG zgR*Q$MU}*qAgy9M0-Z3fPZee&?kFMWDDfeHXl;1fJN@a|;pVsK!#99LxnVX3BQba3 zAu?2jYQ9RG+*&EXZv+P-L^gxLauzt6M^V31vkyF#UOyvO?jXcK1Qa3&yjNQ3e5vjj zb3({VN#YTMg`iQ;vR~ukMu<`tMgZXGA$HaVF2~Urx0DO^xt=10ZJ@o;Wkg#BLP#YM zUE5)+r=Y5ypsfYtcit z+;Ab_3cD5DL=MX}Ho~ zhdkDbWC;p4hm1L%{II%RGhh|woW}3NscX&7ra*3dVhVM!R#eVN9fgQv4wAWorWeU1 zfQHAw8%FTh)}tnWW5$X*pll!7JMpU%u@qNu!nj@U^`ayY5f2D`QVd4;az>h`W(mN) z-j@HmS6$~@l*ACcD+GYgCod_C2m%dspc>B@(ixYj@p(*iRWiTU)luvn%{9s(?4rvr z--QTDRXFC>sQG1^DmjX;;1;}`0@lW_Skh$X8^N^4D*#;20KiEd&ZZj5P=q>a@!`YjhJqrLPUji?Fs7Qkr%C3RfiTIW7HJQ-9p zqw>6Vg$LF&X)v@skFC!AQf}H}fgFSm&bBQ_bL((Zf_af+{L7kYCcwdYLGZb;Kbedj5Q(#=)sfZQPFZID^97 zdn^QD;EyEC95Dtx?>%TcF0v;VhN!1*G$_`MCjN{emNz}^uqso?}uNUpIWnOo8 zO{*m57NDX`hq zg{`|BX5^w&=?dXq3^)s=Oy`?=yUy!rimJ~gLjAWHR()jPsZUu@Iwe_Vak~P;Ga4c7 z;JsZFBTKtpM@Qr|D{+R(O~KzoV2a3iW&Y?Av9dJ^bEejxDb>f|Ps7EfT)MV*GanNs zT))PZm;_2sQK$j9srRspH8%lYp@BvvQ6oII!yW1sc8u^ovzjI3rd9;5!6X@+-7jdU z9@aa8Tv537esiZS*JOU0nsQ#FMY-7)W~BNo+mIt)!y!V2j? zKD>GWFx`&XWx_M+GXntx;Nc#P3F3TI$3)v(SbJcyV(C&MvACo53S`c#lfYBJ{ecW5 z(d_sB9!Ywq>EW!1Cj$kZCwIqh2j%69anul@3zr;M-a2UGI~Z6KOR+h=e*evC3OP7} zahEmtv)uHO$jds_Pq@>Rg>M392m;#wx#dM6JM#gH@1m7P?1WykzzA0EZa*i6HMo0x7D)GTTmVL;K}$LIvsQx*F=O65|DXb}xf z&np}~>AX7S`$Us<0hzl@PQJwjK;`G-YVgW}GzXpGtL+E()AV;faXv+0csFA)wFat9eo-6LQYkpRfl?E4`7> zG74zlw$J5a=P= zhNtC%&g!%#AMb`E2r4zHyhuv?L&r^UK$@Qop6IRUL%m9X}0^-Wlbtuy3+nP4ALUTYat94*{^nA~Q9&!UrC$sqA~b$)E?Qh64?cLKND zq5fnRc)FQeZ`QZVD$b(WQjglv=p4={8(!hDPV%{$L&;`V%v)A}QdosyHh<8632NPF zqgO;CuU<+p^JFdY@^axbKa0orlVW`JV#nv*`BnF8^dRVsGB~)^&^A{c5xqQ@c<^2w zL-tP*Y!wP=3B|9Ug7$s;f0@UAZ(~tg51@R8S>LPe94R|iSbZSUh zO{8id)#ZxHg7p&?8OnOTAH8aAz-w$csC9V7XS~grNeC(!B~1Co(@FQ;@|Ab4{xK zuMPnvAI-frEkC(B-AjpnQX=^B6-}gCjw+Nt=^Z!z!TRMNl>T4%*rJ5gZ0`#YaPhyv z$0#!v>>_!Si@nfbNPehBX-X_ah=4vL2taO|U2gkYhT|I+V#snanip)_Hk_awck~SR z3x?cw2mO@uJL*2K7ZMnI9~OImk0H?HqV5*`{XGCgH;0Rr^$4FjBO?P8ox{%`JM*vB zd*T1Omc;MN@Bhc#Wy1X_y0e&an_S@Uf6505Ds^q`74r`Z0@Ps3wv=boVn_V{l*dBc z1aRW_!^?W=v{U}_9!a0x{}i8iW2daknzpvKs+p7hsc-I|%B|n@p5?y(uhy77WUH({ zEV%ws4nC&M0rMxkqyF<2?C*I3|MYz?+_|x~#!emkwrx7!_&zMmTzPa-{^z0D<+@yq zola(2?3`N!B$vG=c3hSSZqfgjuG_gWL$3IOU{3X!@fp{)l+~(Y@R7rRb;U1+GjDT_ z1J5ch2?SUc*ViMRa}xi13(!Woy1EN2_1Tx4Ck@Sa8Wr5{fi28kc7F0zci*`xSl`b? zsS=E9H99f{msVFRMz$Izt{xgStp8Oup;|b3p$4tb{G$%=A=5HX@49)j{CFXu%3 z%98kZj}q0wzN-`WKXlyUz|?7(rL`&r(c-E}&e%ypLSlDUq=MsL8?^6T+3z~MlD_hr z?mf?k-Gr4VPhs)qHKDD&(%LRm^~Zm!>xTY)4}yEY-oVC#9XWT?J}kG;-$u+G;mZew^67<@%4E_^0A4Z>yZA_JZX}hvGZak(U=g%mpFSj%At%o-qhp!Jf4_}1ZAjQ%@OI5S`(N@=M^sv-n{3sJcUD6VCp&xZJEifi zG)F=Y1IjxcRGvK4NSqKvR24n5>-poykGVOF|2`E%0vNN%>z^JPRK)}dU@yHwx3;Dx zY#=HsiX9&%X6RqPNekP3uHzb-o4`KZE!BP{2hWU3!ZAO8{fK4xZZ*%zDr#bf3 z-ubgH3Ha;f=FyNc0^WnEDr;_1oyCj=~p@7lifQ< zYMvG*6xlR$<<^Kg`CUzV^X$!WB*)hLW|$1{&wt)uPmT#PG;LGoeDT<`@(aPza1$`3 zCo|`iL!h1lxRmN|xsR~55lUx4XViif4ddJ`ZwEI%2)+gOlknmzMs3C>+9Q_{5xh*jh(DQKIaUiKqzRsSe-fV6<0IV95pF>(r+XM|3ToDtzueL7sJhMMADGceC4QP&>Y7vVbUe$B z>@$fyAEYGJp^+1Cx@?1|;EFkk8liq*)_)t4B<(3@HHx9Yf+~rW^J!$`O!>mZU^I_A z$bGZhgp~AYSRvszJycERm$z?`$>#9bzn!Tvf_~k9s4irZR%YvF8I@4(0%WXP>{wX1PK>QtIF?m>{_#0YE4_}v9~Xzw5?8iK1jOg zVi>eQjmBQE+pbZq26Ty4Ttl!XtNYgSpaE6)_9A833&+ z*bx0buO0;lUEACX?X>cz4*K^S_EoJ0cC4)Ma~xIK`Q(|su^|T8o%vz|hEB0f0P)b- zZ%bSHfwirzO*iVZNQFW*W_a&p)nQA3)O)DNSb^-ACIC=i-~m{<5GBK5{63dQx}AyL zM)6qh9#}4%M8#+dp_KHudmavm0GmV5bL33|I9LSeJ6qY1f&>(3fLT>ltD4CWcB(8` zpz-~;!C`hqB}N$p@*$%+XmWJSayg795pr_0aTnrhi@_HCBY#EVHs`zD#_yG_dQ0cnw|SyfLkSZAAku0)F+M-?6Nsb7rd+NJ70f0eJp2}5zz4?scNdT( z5`?r=sq#>px6pVKmu7A){4Q?laYW}QcH$s}e#?h->cJT7_nW>W4FR%62drNL%9iO! z0i@ijqC&oe(PKYGyiZNuXfu9bs6Kb_ zCtwu@nUOoBe_3KB<$O6_+9JJ0S(xbGPk`cjId^=rQ;{3|8Mjl3fG7Ckt;xEOhT{6r z{)`W^WOo~(@IlBg^kc@8ERi#-;Qnzo+x1XGmp@2l4kOT81BuAz-9k)W>zzMlnMwX| z90RkBzj^8Y<>xC2rQaW9LgK3Yu%+}cbb)}U1P<`GjkrEKoaTPq=|k_F|G9HE@9P#k z;8;&yULHX#&2309&wO6^F=ylHq*?Nerqy}ABFz%Qq&RFWCphXyls+m^hnndraqE_T zc2=^Cd+h4Pm?Wv*{0^(06@ILI%`Nhi#lQmkny#P$dY#wHajnUEwRa4Kl<$TWO0s+n z_Pcq3GE9{&oQ`g8d|TsQOU*phqkeZ`WU1 zhU(2iTWY*Kx&rdv?h(2YdrmK@-l}RzMd7l<+J~%^iKL#~vzz8yO-Wt(Wx5(0{ z0%?79wRf59*7H%0*!MkU@7ck!KM>x77y>hyYTiRP2=MW(iml)0{BE(E7oyWANTO)a zJ@}jRF(1ca#K4fG`=_rh%qLs6CNciK!yifIbjh+P?s}7%^RM{2V*7QMO&O1dcXV_7 zGnD2$r{;yNn<}qOQT`Z(l!63T9{BX9T(2a?UX7f4xv7ZC-`k#rUum|-K@9o!?HdDj zq;#Ph-?u!4BQV&MH7zgCP&aFFdHK0?fqYCpYNE{Y)HU18bZ(6yuLtXF%Qjx*g2Zja z{K@`{+U+xEV+lL?gIaV)&fWR#VLXlN#1G=Lu(t8)ina_&*R)ehxk>)M*aw>t|B=}> zhBof@ zaJImp<-ktEzQ!%P?*Eun6@C2;RB(ZFro_@pY@NH)`*DYSKQLTki*%xOg(dC>D?iQq zF!EbWS3RfoOcL}#(zl()B%-=F#lE}YA)dgW`+V01G%r*<$nVWAg=2JI$`zqaWh+XC z6J>lj!`Mzn2B~cnMYiu{^$ko=pTMRi0zY=wF$ie$rdbl#8Febl#Fr^4U&6Z89O7H{GOGMavXr5Ky#WrAOPk*v$4okS>VTW--T9nA+wq#%YM5CjeD_08w1%)A z@cf&zSB2d&IJ{NvjFl<^9uizdgZuEl*pjKL>CE91k20=EpbhQq^)rf^MGU`_Q%PUw ztWgTtov)fSj7C{(b&Xv$M-WJ%8Z-j4inV2!G<l%1_)zS z-#3(2y(xKU5zmp~A#GuXhHMv2kpO^A^Y4EFenSE!bhOi1-4^?tc?0Fp@NU^m4Z(D@ zKtOtqIx=ZdZVBcQFVo?*n|?K#la`trbXfh@GmEGD&F`K^%Z;(g5oA zz2hO=o2k_yW(!VVKHo^)Bm$EkmBLSD#aY8w1$qx& z)2Q|4)ZKe}eu^2j0OBvAe3- zeQ4hrKSl5&LAdPvt~sKq{aFHMV@E}FXu++pcqMSaMAA4aY8lCErBJd0L)!R@G3uw` zCN>hu(7olzZ+21u7^8jOPO9f0&0`>c4CSwFRkHX??Q_RCa0^Bo-G2|zr|meXr$;bh zO)#|^xOorgdF(-@hg$B>j{4?Gt{G8QH>}6{e|2+SQB8JT9uFWONC!obDj>Z#Ll;4c zgkA#ym0qOxt`vRgy+i0NAW}lF0s>NALI@q{9fH!E7Yc#mrpJb9c_U+3Q*R z?B9Ryea`8vBwoBc6?+s-2C$;#}WV(SP!sPLh!h;#Y1BL!Kl15W zz84agm@EmWQoHWvaEJw2Sw8Xr(DDv#JaoL4Aew4L^5FoC&AyOYEfC&$CDli2ZxgK3 zB>Y(S|0}|hGX@FS4w5```cgPQ%TuG&wD`1t3aJ-R`Nx&43?A^cva%C0VPr5ZqW`MV zt_4UpJXa^~tqQB0bLP`EFhRDy5^YNha3CFd$3eAt$(O%fA+=5nWU9UkwJ*>m9hzj@ za-z848Ztd2j=*}3vk%1{;cc~B!)vW=mWeH*A58_uZGf}ca2ei_TUhxiLqhxh)HP3X zZgX`LQ>~AE2dqv?o(<;pP+Z2`-ceEfyS)OfCPt=9o4tj5 z*8u3$lcW?52AN}@5+z-~>uto8X?X%9FbHHCRgMKP){GSpTFmu!DRFXYdFXU`l{AY|aofHl6gubkO}Hh^P#&{y zo2|9^`a0@U+8snE@gD;KZ;#H%yAEzUzu!Af5DfY36ipvh2*q@uje?sX5n@e)hh4s|B_05gIp(`W;_|jadG2}2h^>z~yc7ImNZexJ;5niWp9dbg@uygjz zQYxy{n{o_0Pk=o&j8zetIaqxK!7FRi92*=|^~ufg24Bl05ApE@%4B5be3{*{WjEIv z8XOdKxU_Z+q92a2l>d%AA6*XBk%f90AN%arY}G6c@xl^uQ44cJqQ071@+;NLoKV>S z;aDSG4t>1gk+?l-DGamhjmSkepJ7HSMZl^5E4eOpE_{(#>w}S88mim0vIse*a;!Nb zgm*OsyYY_C0e7W5#V|#37~t-#Y4*@vY*4~xJ3{}~cU;N6|I{D;t^Qu}|34lUOdGkm z2^-=n+Ns*O|3kz3qW}D+a_j#XMiRq~xq870_i;l1ovfe!CsBbpfh|KJ;vSn-)+)#I zc|205@}jn5W~aOuljv&IpAtTsRq$GaW+27K9_XcZf~+~Jj?Y! z1>J-juTKs6n-u|OF2$d{DpPE7N7eFyU-DVH=M%B5U+JA!g-P=C83P zqBiFfTX^Jms-$%Y(0Nst*kvh1xBg8!y-p8J)K8B)JQfVjfU)8A*{cN{ikcN~$keJ0 zMyWAHHp3|Cr5vc@^L{X=2m|$<jzc)j*rv*qcPJL@Yp?1O#81IGyH$MGPF6>z*&9 zo6}q$q+_}|+TtB{HID(exr)IN&)Ur>@KT%ob)GD}Gj*<2iYH=Zvs`1)kjBq>YMJS+ zWaMh3k_WJ$fnxtpu->vwk4; zQRCusNsvaHv38=xGoSd}TmR+RkB~BHs*qaWv*F>=*e>tNpI(eNmiUofK#ddm8XakAdgabKhVR>6ZH4~W(f<~kD}N%i#lk*7aqfUvJGCn+byO!(#BftcUu zieW&g^I_^B)TZNR!jiiD8zq%FaBOis@lzouVJOm;NL@89e!+d*(kDurxRfOIa4jtF ziAIKn;faR%j_w0;=$|ugQ0XYd4q-b|XXQXa(@%C0FTIFk=bo1O5WHDqoHu-~x$T2? zv;1F@`&IQnfIm!s1H+1fto=`!IRdWjs<(;BtIKlFQTE;D1sITEPrgXUcNOAf48t! z1jNr@zM!nyn`4~L_RPJRcp}OZ0DkAGq%@N8SESowSsVlxz;&U5)P2rDid4W=SXe+3y{A|l>+E4d!cVdOQXdR8!2GstCje{ZUC?E8S;1nzRWCP0SL|Rac;S$Ub=urTvc0G zT>b5{n9gb4nQ@C3RI~kwreK-fYw-jsSBLgpdLk)&1SS{K{t)xos>6kw3E=$mcOE9| zW^@DTQY9S}pfm1$&O-cITh?<6x2t6(y(r1q7XB&accLuh!}wrfp&chRRb)ynk<&Ih zIr>oyT}}tW1g^*ZQPg_paYDD7f`aj{-EW>8t^HGDgs39l$lIC>{eIYEmME%xTq$Yk zfB<*1cer8GTc@ks{47n47l1SwGn90;Vvn8C(tJqTSeuN_6@H|>T8H@I$qfcI6z%xaD1M{ME=P(C zBrI|cg!9P~nm8pVyvr%E1c)JH!Oz;x4JEN1v-bLu_P}a5P-vN%uZOGeTT{)%oSpo| zRAbiPF1AYbFGy>H*P^DYrlt+wF9_D@*K_D8OZ(cX4s@NkvrSxvFR99!Ipj zJ`-mEvcwLCIFtBDiz{;_uddgJw2q^wQ#3J`)Q6*o%$%0YpqAg6*OnHN6e*fa0RaPv zT2cg(#e=H(Fj&#+xXgSy?#3CpROfpLw&35l*|E$F%*(ex86kluuv^+xMzNo18>JLGntYJ4Gd=iZ=RooqsNx%&K*X+Ln3%S(f`toYYz z$rH()rh>2H^C-OfHl&6b4|Y3ePtPLLI*lF@?Vv9j-vV{<3g@P(%B*;K4RLoczbEODw}by*Svwzx*+ ztQP0*j-BTk!d`S?T}fLn|35FHgS5ts>OI{~f$$CJ63@ihZKd`3YRE-cyx`6Bl6={v zPH)=5lP!bhi$Y0B)8IZy(^j6N>G`fdhQi;QSHMBRYPGC>`M?`aM~M#et(J+R$wyAc zwg{#1L~NNbWgVbkDP%`U!|1JbDEN^-j!jOe+AVSu<2Gzk`R0d2rcD;fPKBMve4}$k z+w(8D+i#cv!#q%X7t{33Ol=GWx>FZv$Lag+R#%6b1LIrf!! zv88xw+in&(fTkB-Py9NnloPMBk|WwNtn{O2Z2^Mq15yss-mbk2sHkw*6Ue?MejW5p zhJz)f4HuyUhn24QIs$%7s(_9|L@gc@G)(b9bQx78OCX+N_@ybgog>|g!aOC;&O3$N z9WAbZ+KJO^N*?+)Ls@fY%$u)5?{)uqQPO8FS$0i^UI1Sws@xlpe{0e(SZL4_@&?s@ zz~7qracP4_<)PEhH#(#?NUOu1ACiuY7N2E_#pPw2PNwU{5TV;&otv0sxX-x6zabw) zAD6j$c2g-1T9_o^MedL$(@8OSH<9FTd|srrYURW8K{UGQ!PydQ1V&IW@Gj4kLGDg= z3F;>ck#Y^+$hy)wbM>ihXk3^nuS511_WK@uxC|0LODU3?`d?=C_mU=&Bb%J4Bv@l$ zEXt#(=B9-qm)bVdX4h*8M*cyR)SwMk`Lm+VS+GV*fX({{wdIG~NHOVqKPdbMHxQGZXZLj0V~X z8&eO@SY~wL!LJw9Bsj|K&`M$l=1p!c(u_6X6e7*+lI-V0ZdZIgbNjA=>jJ?V)>tI( zg6MdbZtsxHCBW;i9^u)*SKT--dpy8{6Kd~43qGmU4mg`xqQ+ABZy=V+N9n1uP=fna zURVzX{E|KwZ+MYg@7@~?CNQZnYcKq1xb=hoH69=ao+2=`cV1N<_}%;oj|`=HFc^Kb zAcIF}VHxt$AHio=>10vfKv2($(s5H#a&X?6Xm7Z05>(-uy!WeYn$#alJV(S4Z37_i z&|u+D=@9LKCQ;T+-NxUJ6qE5y*EDOozy08Uaz?Ca`FUxK6UcoH=j9rjFfxLfaVCoQ zTdtoCIJ{bWD!uz3tlD? z0Gy1E6lhCbwJ=E22a}+-srSI;QZ!J36D>IJ)=N&+_UbPkdtg4_`w zg~RG4rC{DX%C4n+jCfSf$?o5OU=GRnqSQ1qcbV@`^Eb|E2ar5+Wf6$dY zIbzmfVQIWFAdfGGNfEJHX-DqM0iRjz00-Y?htsTK&CSnro)nqwXlgBJX<5nT-`H@h z9{qq*pZ|vD-O9X?{rd*yKu6QjttQdJ+5AZ3F1LP1!#zis1e(^QayF@=b>2<6c!Pgv zgD&vYWzz5Pohm{KnalttpWb(qV6F~WLmi>A&*20Z_X_M5NOK-sXF=B(!xzCVwS`wN z1M~*MG#tfB6{Ns=$2#>ME*qt%uwh42E2%ekwkiuuCO_C{`Cx9*;V&+C_ucNIVDiBR z)Un@Fv~h&&UjD_7s;lEO8UUZ|S1zm>>_7#1N0~0JdW>HVRpPQX_BVP==QWBQd!oHh zdCiT|vU~ngdGDp7EKr~C6qJ}oYV)SOUD$iTQp}LJjF&irN@HuV~ zhyzA^WwMwr0V)xMm^#sirG0NDAipSk9c)x?tzp{W-Ev7O)?s8X%U)?qQ*#rWUx=4R zp-8aCnJ#F-wEZo4o;G{ozkrPJe+#m8LWBWlIEDHh(e7ejQQjTo{u!z^a{zbmAXmVC kN562>|8}v(;*X%r*M9%u#xOX)^LO1e`*x}>|iK{_Nv1Vlo*y9A^g1XKj1k!}Pe4&5DZq5r*a zjQ5Xs97DJJ>{x5&H@`XIy|R)tCK?GE1VNaxG7_o~gs=`laMdXA;0&rLbqM$e!Bt#V z9R&qtcIoAB@LwD^No_YZCrdX^6Bi3e&D!0~&BDbjXc!fOs32JhF?Fw*?Rn4F>KeBq zw`a_*MP~}Mak6R0QYhp$@Tb+yLGS9ywn7a~OP9N|noB9QJPmHL^~P=*KiN&=73%^)Qpi}JYjqd>}n)$ZKk)rvUAM@07Q-)&jgwr*Ne zOmYpuy{WNglWAPF5%&wI>6qSC%ADb-P3%SUp46HjbgDGSf9_!WVBTZLtc>0X#iQH%fQf~J(14&RxT>^g;vPa87}U%9Dq*4u-lX@6NG83MvalR1^q?OI|P?4LRoK&;xir^rJdG5~a z5r6p@%TN!)ml~PYaA&h8)`}qaF%6R-guUcD3I_PvJ84SPT*GH&kwAZr>$;JK9w#Rktyqv!g6YC|N z5Dzsh%BD)$KRxDlmzd@Z(9KBrwMA+b=*Eoyo|aFld;(T2ry-ZyTF&ZyY(7}tuhE0} zoFM8#T$IBlQqw}E)U9M!*jTZK5@ zh0KCHs-6(|$5G~7x&}%qGoN84j>0?dH~VqE+(^rUl(;%)FvE zG!A@1{u`tBAGy5qqk_GR>_qT?{EQkd?$#nMQ05R~#gID9BYX@6%FyIQ(W)~xNj<@S z*X9uMblf8?RzNnK2PgEZy=6cN39BVy^{Hn06Fe-b(D)Z=8CK(0mwGEj-tREJ>AJ}! zQgda8(@vB5+Wwqp4Hu{R?sJ`4808^tXc8}<%J5FtDceS%SEW0k<=at^l%0l;Ky-W( zn_e9kD+&aeW*0SN$fLZNjpCe(B6aW?Av9G)Dis>zOms3;g24}NxYVFn4baDAj9E;D zyPn8R_?idx>g(s5=n0lyKB{FesO73*ThO13UX+YTojLO#$5VjEscm9w`OeZXbyDK* zsgC%O^sq*qAX8pCpI0u@0TW3$B&5wiL>k#Xz zX@<8riXu`mzk}%rFv2{^g?`7b<L({_~kDx$R^QgWW zl2sZ)*M>8$<7)Vi%@}t6Axcl^MDe~OAYew`ev;X&9zo|EV z8fP6Nv2%>FmaCDLvHeNUhHDM}QhoiUqm3u+Rcgzd-b!oyd|o8m7ltO`8q#s_gl^4g zx;HABl~K?7@!&tp<(blR5W{S@Vd2*D@|beOc0*cPK78>7E?UQ+$PoDdHp=gn+h<$%{di$gj1b|rCr@q2GPMc0 zRx&fvvRqvd6&3NWy|aKBHRRCGpA+0%ac1^2Yiv_Cg~eB3w5C)GMz8ADl$&{+UYr=L zrks+1r%2OEKH^WKu4(tG+^_@MIzzUQDy%4Ow!#n$Gv02p?3!&UQfanQ>T0<%Mb!AL z!5HSHPFDCwVGZ@cRuMTar-RF*>Kew?*1CiE+%e~`D^a5*{nU1avPws&4If5RVk28F zaZ~6-O15q`zkF9OHI#~@`tihIK-j?CRx&Y``cE9)sQWm(o*~IN*de5z_(%!+I8IceVoQNIhTXj)h`IjD}nfdciF5JcVnz_GCYN1`_>Ib0&IT>v?+6 z6R1EV6Rvu65I^_IMz<*x+c%coFV!F^k)Tv$cyf9g=8`(lL^jkttsV3-ws*{o;G1Nt zO2X3w*!IUu&N@xE!H=aHzi$0}1!ja4JZzd%PSmxy)ithy zYmcwF9zpbxaQ6i&1+?P zskRyM%&eU<@D7TsLnf~k%Vrzu$PS06EqFfI+Z*H~)kQ_LAcaJQE?trc*b17#7xzAU z$w@mmZp5RxLmEar%IKm&13@|Cql3*8(cVGDp);-;41%EwVz(!V?qnoy4eJ)5-r^XTdux$%Jitg-&HId_7^rwx=L;k?B#sC z>&2VVKDpPHmb*`u*RN$)XODfR7B!*F36?%HGxM|Z6-9A(-{m`PkxWr~FrOjVW;-+b zjeI)V*7a2m?ZPjey0SX(+Dw#KCmT3rTXf83?s-IY^6cX(I*?47# z-F=?zI+U4b)Cd!g!!KQ&SFKxorfvVAP^M!y zk^Jh5cxq=Mu}MMR#OcQtd!C*{h(_!Y1c?u;8LjYJMi=Axyp>`_phAtMh9n;2q0>dW z_}Q+~yz9e1ZGPJp_SNTgM&>uXPh%?3ZRInMe$C2EXYFBz6zu z<%eUgCLy6uQeQ5AWXvyFlZl$Kmo5v}-LfI$oN|qKS!)KX|9H4Hy`@F<;FkCQD!;9 z9paQEL#%j6)`v;D;ciJgGQExM3h7tYsqqSHIoU_TiGJVm?393h;mQPNs^B>`{ON|nrm+JwIYPX=qVmREz4jxXnBwRUwhR}N51P0Kdz(>J&~FlJUYPu6 zftgOY{ab&hWaL0EHYV*=F4VxqXlg`Ah!qQSHODxe3W6R&^kOGTb*DhX#FhmmBM!iC+N;r;PyiKooN2ku8|jFx*y1~a3!%x-*Ty3;z^3aTymu%!q)lvT8W6yOcc{{y@7~b768Sw{L)vr|>xR1&!qXmt>iA zZJ{@=l0p1Zr8DCch0FvRUfEfk1yMww)!dqcos6_1@ZaosPCPXyL-z>`o*aeAqJ7+U z?L4d|dLUL3YPTv}rNSd+si-EIF<6Q6``Fjj-lH#Yh~XnrM#_7S`ghAhfp*!?6!(Zm zL|c|29PI93ZK2%(>4ZWjbSC34p(LTpR>YwyX{WZ8 z9D0aNb^Tk6FgiSrCUFk zq@0$RhQuf+eZ^Jg6mM1$!!0+=g2)-Hh~8LOa1FdV$SZsM@i(7t7Y-HK&K_}D5p54T zBsz?NX)nY-rCZ4~%yD_Vo66HJTI$B{P206)0}FS7@`Eht6U=O@R;-!DVl^H?R4z<( zWDXSkF{XbwT=E}L%tt?|&=(r{7)}j+M0}jo7yRd!AQgKLZTA;H*(iL5i&u*;RX7qN zKF~^i(mVYTgy~D&OB5bW=799>$FEmXbb=*tf$BCctO?R`AG)X1sb|F9?EcC!u)R8|zQ=~)uQdx8w$UBHS zXS4H)Zd@}4lU`CX8RBNxLX+BtNo6L@a-i8^Hz?;O%h1qgs3HX`NIepI9A~2xF(A&d zfuYT*hMyr@ph3Pew>kpFUmAI&yyk5t@Pd5 z2}T3_JK?gg>GpGz8xi56w&8<)9}%ED}p68iSj zf`;Y+^pO)S7QHiW&gNN8vaz?S_c2!3NA_xVCu5FfblemI<`oRA`US=oKNo_@#=HOp z_cVoS_)dD1urNrJgG-U7y+;Kzze^?k`?1IF6zPhDviYilBI(j+6K~ZHHs}?|l*J## zVnxmISoXzfI3~I|o1PFW$sn4kyrDvkF`Et( z*>;mcY;AH2n*IbqI}X#ZJ&$9_u%)*N;#A?^Yu}I_DT|8z)@CPJ`s#M=AVHlNR{h=P zB_@YBgO-Fk-V+?WCtdtOxiXB8FizY~RtfQOq>Ntp=EW{CM4^P5+6N&t#geRTxqsut z>FJwDi$jwf-dg@DbVxEygUq2TCaR4{Wv&^T;)Xfd!{jnoS@y-}N2W)fV#U7T88>3I zzQOofxXW9`tu1r@#6)&!J!dH;u|v1XmEjd?3g-uEpNo;|Q1vlmR6K~y>Jtg=nsz&` z1kC8{9s)a*6!UbHu2|9%m|@0ZUq&tLsb1S)c)ne__)EJkueG_psA*tyeKq95=dGD= zYxx=ic}tu9waZJ-&`<=q%uEOMhhM9OupyOzjyJo_xOd}C`aP6CR}&&#gXGLcNAvY< zh9)pMnfM;LNaEKEWrV})n)MH`e|o969-lbn}MN?g@<)40pF~?k1grY26ID!eQ%e$rNwe@`_Qy z6J%jocgr_oFK}yhladOSgmPjQ(x2?-iVmY;D&lsZ!Z0L~Ysc(y6=Q4JXKfR@^>;a4 z5K&BCzR;71iP>d~6Q}tSSUt)`+M-QLpdmq1zA%&4Le95M_8~^o@?w5)E)`T} zuHG+OA|QklW*c!~gCQH++>cl4v+aZ}bLxK17gzS>r}acH9%I4NKEupB6welexv9-W zY{Az2r-Ge7aq?BSeyaDiEvYDe%RMkp~u{{>^ z`4{Fo2f^C=3zhLLIUaKA>rY5_ZF-;7Ymv$Ts$!t-eX;q&L_69!@p{k z%EuVSZ57c9$ox0Z*RjqmF27);4DoN1; z^*XX2m=p#4K~T3~VrEB~Z)Il5RAFaKPcqsWI<`3#M;lktk~~EAPBCeb1k5j3Z>NcxUi{zlWx$3xP;F!|Wy!Rt$0iW1zF4CJeg+_CpHBeE>8 z9hmLrI+bf zpX|cyDz=_}P<>`q7?X>0=8MgJsY3-(JzR=>>OGC|17V@-Mdl|IHhokvPX+u3b0$BB zl9{&3Y)OUdeK+;YJDZwn!X+jsvAPk7?6%O-Cv^NpIcGA2;stt5xPBlil z5qH7p=XE$9libRkQJ;yugTHpQk{c-AkbMlqA=!yv_bTH2m|CJ%x@udOzWzW3&n6r( z2uJeQ7M67Pt&d&I4*&42`(B<*F|(9jxNctVD$PFA&?ugy_}mT*6^#pr_!Z+5rHr0P zTDPdrk6zRka61kN2-t^$p!N7$tPX?QWPR4IrxY&UkdDA?yD9^I)tma@?5O>(U1lnK zCZUp~>_mUqRiTM3Y!G}DPQwCB-($DDHs+Q{ZC!R=vXhxrS+TLsMt7~T{PR#;Xk>C~ z6#tz`=))Snj=IAqT&Zp)-y|ebL!UFzR}a4NvP}FoGcoT!EK69Vl$pTt<2#FpolvWL zav0JwgDyF$G^OL3K3qVi=ISZ(yO?(3pKPSWXooI^tKLrdgO+9myyX|Kql4Ld5_ zf^o+^r>2YQ9~s>_sH^G;JQC8>8mIS4NJTsbHARDa$Vi|j@qQ-!~m!!-gAn$#Pe z+juBj$1J{@!0(}Z4Xc^`OLI7mk0SFJ)xU9tb~?Ju$g+?EdzJC*>^ z5f>vY%v^0%AsAkvBfY^Ss*9%H9&V1nz zx!Ae&L?%xWnW8;9A#-*~C)*}7k`B&XF74g^ab}Fj4_wUCkk&{^OUyi8DN~a-MUnMn zkx%Qo2_3B+dxtz}ZYW6HP{rON|Ec8Sk3x&I(lXfZfBoKPEp6NNhm7A&ZqX#AEPE+4 zaa>Vw&_g)$2&oG7SbZiIdi?zK$B@Lg6-Un!`LdbsJr7QmnFeEORdZC-)H!A*cCFx` z#qt$8qBqz+B(rSQd6Z15#Y4|5)VU2Z9uMcI4XD@72TT+i ze@{*@i9S*14b@Jeoh^*GLRu!8ekdTg|K<0QBxtpXL1H*>qcQw>8?)P+CKeT9xen%Q zr-CYm0^IuIR4AaR=lLlSCnuT3btP`Fe1-WrPpZfWHF(yzXRB!Lv8$4qW5ok)w_&O# zD-T}l`%5fQGz7%<6k>RER&un3j$s82>F9N@uMsJblu16@XClP((!**on29L9V2o5z zJbi~KBd{gde9Pw60!We z6ALR|VGJ?Fqz1{_SYG}(9rHeCT5wZ!DrWkXbzZ4gnOD}f$JJ2qLh5G(6W-|(+SYCjWcp z@qZ5#cK%)S_HV>c0nSg7&i(G+B2x&k zq#qdaDA?W|aI3w%Tv}K#{4DlwHG{QHu6-k;qc78=o|yl=8b?4F6c4a?r}c>ZQ;DFf z$&l6nztgY}pIUagds2boayHJ^!NH)$QqjP`fRAiq>jalhNx#-w#nyHcRyMJ_ zySuiw=6$s0cNA^E@WuP$aCKy;qV2Mz(-bc7_VzaG?s|RXM}d5j;p>CW#no?1ZUTg? zh8WP+WJMAE<`0M0S33>ZWPCUnNE(b9CMHWKlSW3mx&nM1w>MX-E*HZLMVnRK6tk_q zXUm-*z;icMEU&hV?k*3yDdk0Q5g*6(^jjW{YZ>`<;%lY5JwxK=-yp6h=)ZPk~=n#Jq1z)*0SQ&L*W+Pp!{aGsgb9ofBd zaZ(XLj`mKSQA0{9WOiqv#nVYqaiH3wFF*PA`e?`ry+c9aKeGTcwXg->J#u+lk*BtG zGxj`3LVHISmzS47u#!#s{!8x&<*s~~yUKN2EXBS zme8dCC9LScYtFWA!F|$zMiyRFN~&w#b8&uRg7yTNmy7FqQ>&ekg=Mg(XS&(Fv}5VK zgYp(9Qp(78r>>-=M203dCg#-u_hf&Th>`B^5KPkBo4tS*eU|Xt>gsC8wu`mi-d?cQ zwzCCaXdf7B!1Y0Qsb<*-%nfWpr_NSGS~^s&AeGBz#Gzr{k|QOA+1$j$#Lv%9Q85w} zx%3kg6C4<7%F0xoXDSouP{X`O8ZeguC;uA9`R2sL#Q6C54?rC=b`=i-2L}gRcAMpC zzFmFGMbWczz{Sm- zkd)N7dU&2@>)x=n)s}91nf{A|8Oak(!<@I9Yak;Iy$TP>K^mz zo;bS6v9ZQ^M?RBajP6%^ZCATRS^k>`UKmIn$FNbS))P&brOn5_)ywe;|J4I8mZm?k zU|)6{C@BjI3s2<}r*=;5Dq1}TQn^`@o;`cERhZ_OD&$>#JY8ou*>-n(_072Q^XKg# zbQZ78;-c{I@JydghA$ITzzeJ++yv&ocpriNxYA&+udS`GXC*$(S}Rh~u)X+wZxheA zk5zy);6!zFQt+mq;^X6s+#W=uqoX4iaq;jtPFFwW-FJT`<*Zu)=)Y>C%C$*>eY0$#d`@L06I=iTxeuu#BwN8ar793 zwtIU3p>w*%YW>fj*S8nz*uuv+eOPy7%pGjNJKl(9mz9;()p6sY;S&;aVsP?x$ZV0P zFQr&zGCX_Mvi}|3*Vor5;KrRnIC|G9;A*xjk~BeX73}cX=VmZN5LtRE+8ij|r*&b+ zL*#h)1@GePqqvvPy?=jw6C3*o=2%f(ty($`FADrJUp5XhUhPc)YBv%T5I{pmuhVtV z&=|itTU?xTGYQr-y-+)ydY@XS=F9>e;C@rQh*Tz^z)b`t!?;ygX?S zC`>AEw!sM*f=vgm2%XKj-fNVLB!kC+L{f$F_5Qb4F#=>*BH&_*Xsf|=e$TmA-Ib*q zTU)*$2Y`6;9T+FDY^zLfshJ09JPx{5rtgN<(*)dYsbkJT%nzR=yib1_EI>4Omy_)w zA+sl2lOJ;VPM>Dgw|PXT-ia8otv9m zUS3{UDCLvzQc|*W7)5Zz2l=XukXg6Z_#3=UJI~(_0X}|YTThMUfZWTM?I4|SlPLQ6 z-5_8K4Udm=UrI+vt=uOvpg-5{C~{!oAo!G&Y)0}fcx~i_%E`-vsM_Usb;`}dWB95Q z|7dOC$ftGW3_Dur@F&o$S7yLr51r@k9K%362pkgBuYj#B2Hf31m6ijkr>CdN^jwYQ z;C>A)El!N1pHHGOTH6H%cjsI7z8on+Z!Q(!@ z;iQoTQBp>vp|%zhb#mGRVUd^bg{LR)(2=*dcP{uul?@!@?>j$AkA~up#d}G z>f7Q77qg#pPwdkdgpxQvT0o@lB6a#SzFDkRwBRx8aChDFMQbLp`LR@?7x_Re-@t?G1v zwQ*SV#!njh?&M=TKEJy@0`57f?>ewOUDF*&%Ii4S2vW`>uqXrsgy&g%jb(9iF3Y9- z1q>rM2t$+?)bA{G!gE6i0%>{<4-aQ%X0!~wR~tVHj{y(f1B?Fkfw|0Xqvm^+_I9J# z&VvUJT3cK7>g}6=lS+HT4Zb>I3a1`A>UQXZU3MVk?dtM!+r#(Ot5TwOV3W5Lc41FwM80UXTWb;`sGDj;HHHeqX) zML+No>g?WEvH5+g zGcBGKTq-_1#=tG0k7;S>kf7&oe0Z&CXZU@Z-q7+tGk zB(B1+;tUwXmy-!SVTvJRf&h?E2$*#dAyyCo89E&k4{ zLk;a1A0O8&J+TtGnx>Z|=XFd!K9pvd#NzJtkzVw8`|bDH6{XKc&hqlIL5l|i9vVyy zpmmlcx<~K1?Ir-K`fS*Gna1S&D_2s`V;khgt4>yb6P~muF)~~v36JW>P?(|9l; zEHXZ-c_a;Wb(Emr2VSOCQ-6Bm0R9lOd97q;x7DA*d7t&)iL=Y`BO`lb-~RQ8pxjT$ zl&^=EocS^a0rmz3D=4vGT5<)4-;gQ$dwX@;{cnKW*9J4}s8V#s#mH$Po+>mK-cCEvaxmj_iZd6{OR_^z?L);f&e%>?S^gI|YP= z$ssbVZcy%ZMN^8fu?*(rUwk+Q4{@{%s%n}g+D6+jh;O6qgjQ`_q(|YDsMZ00q zD6lY~tI~=#T^}?L`V<8ZfS(WokLkMGF1}YZE{B7JHEzwt!_Cc4h6Sttqqk^wkAYGA zc*E{7TR!K>>1o^Xh`hGW2C^~0GJrS$*Oi-rlK7eC=VV}q0DS}|{PnuM`PirO`HrJ2 z!%%urT}v??$vUc{$7#Giz9zvXoSlOMK-D$+ELq%knj9(dQcFY0>jmNICgYoa zpIvvFr;O3V*H-%*#Zmm6iswJ&!bv2^T4^FUf4fY?Ddkd1w;vsaAY#~Ni156k0sCi$ z`v*S`Ze#7fO(-y)>JA!o{DmF$-o!112kFs&cpU*jRbP&-YSGg1?g%q2>pwL6|9M9S zezBhy^~9t9*@~iV5(6<(qf9WV06T>&il~X=--SPR)6Dl6wu!(%^c8;dZ7vhT{iKRY z&Gdi1Joe*1)!42bjHx&vKOEb&*x})RLi?rF|78%5l}%OQ-}T{uB?ty`FxycJ4=+62 zut9%?ST?eC6s`uFf+q0(y?s&7R?AXw&4QA2PEA!_O*K>r)=4Pxj}$w;d0d6|?@8as zqW&F_;9imr^8P+Bv-r;<6K|vH3rqZ{sRyd$B!_ z;cI~K8^eolQB8yjL&ts>74tVj>%L|NZcF2FidDM?M)qYeG+KItwZ@c{YIAM(|1mYX zsfEo}7CS?^enGzX{iqsFf*bFSQ?wLi^QtZ9d=c30=6 zQe=DoR59!sJMDYAcV_YO8L#RK+E|yT8DUl3{TnuRM3o8|D%Pff6RQKC6kN%lM~sL5 z+XZow^X@d|&kSA1+^7_VGf93n3PC#>qNNrQql@KrBdaTg&!YcCGg#a9BC;x|&yom= z+R-ZN>p!kvS<@)NJDi(tFwpFm@fMjH-svEb_`8!0g)NG(t|w`llkm{K?840w$$Gq< z<+}25+bN<}KOCeuii7I&Bz-_%JKw0KqGX)s$xGJe(;MFotQ>edoPUPHS!Q~AK~Rbh zQB7;qHFXF$dA!erhXjh)ERq%p-(b`U^SUl3?S1KBIftbeCmH;3xH-(w5>X1A`;*L7 zIvma&_HTzNv|5bZBw!%6Pno7b-G+!5f`r{~G1Urm6jsV_VU15}wyLf4Q-oJGLO~T> zh4hbtz1(HkuEhQ)@h*OJ!th*JkNdSSu_V%oZ3bV6+Uv5=U0+=f+0x}M-Emvxik^e=g-|*{O zotyQnae0wA8WXk>I>p`;;UewS<&$8Mt7BukEm7(iu2e2uTJtR4yue%;2yj`X6MGJh zn^r_Vr|HYE^;K*Z=gC3MsFl8M3&U5dh^e%2*==p>E74epZ>v5t9Yqr=Ol)aDY-~7l zmHtivS&PQ%Mi+UgSfLM~?@Q-bq^ETaE!L@@iL(3-p03Emesv|im#4_5F@LEfLjXb( z6W7kJJogrEM&wzicTQ1pY13~K4v$A)IxV&tl#VN<^RW|r7zbH+Vgf+i*7dA_=M?O* zpSR<;%Cpd*T>8_K%SF8!`BF7aP0JSjZ|&{Z-iB=_U1^pZ$Gr;_i)#bO0s{KH^Fnb{ zVb~&{2)qt%jf|FFg=)1`%{%g1TBe-sZG9>ezW(s^$O7Z!w4|b>%|6xDzp9&Dx5e@- zl6UCmPd10!jjti@zD}(UJVWSCWhJRX(+4%P>tvs|3~x@g0FL4B7*6Avu&xa^5_Yy= z>MHkgmzN8-JdD?$`x_O$kKHO7_`nJ{tp*VT0XjA^npUj?DQ^Sde)_T7D0a5I;c9rSb?)-t*moHzgqXc(lWMyLr z0JVAqWOa3O3mYw3eAP{k(ZR*V^#vfkjEoFCNx5fz_)mu7OsI*0j&N0{rlb7-K~+P=EN|^J#7JM0Aga|fa?`XcL8!}Y+~a1;m;?m zt;Zwa)_ZegGHSa9Dl01~=^Y&OUw%)=<2ZK?o&{>Si`67-gTeQ9u$>)YN76doohF~T z;ry`+ObF@i%#zFw>{LV3(rHFpP1{<}YhE3u<E?K6%Zz#3*PIByz}aMdM!RDw$K!? zgTvK6McProanH@q-vFQ&Wig#&G1cHi3F-TtjH{X>2Lj#_RHMrDV{>y%ihz3FdO)bp z2G#@W)ApMkCmLCRiYozEfG5BaZyjHUG2cb`6^LwjU(7+>oHJt7tkQ3ddJ@?HYhJ2UT z7Z(@uNh}Wnt+{l8D0Ovx0BnO7m6d%DOiofI)!|^d6Sx8sJ-rv8^;=q67{YbiUVAeU zJVCiPa3Ig(?iDz|cf9>(Y+x{dez2nTS=)q*1kM-`T97l~lysR0LQL*^NU5o*3~GfK ziI0ge-~&5NiFMhE(?oDkWbRu3#L7Fi-*`YkM}*LC;4aB*Cf|Ws-&aF6AtsZi4YQ$+ zEBs}7^C#`mWe89dE=o``8@tu@`DbPN!J}NwQa(q^3?=XL%235aJV`l(IXF?;yf`Lo zsE1~V?fAC@WUP}(&hg55?GGxhP9icShG*5!lrCIEPZZW#SF%}JvUX&N_q!?bJ`E}C zERKO~lxaTeVB<-109@?b*2%YsVnmllHi+m@gNjD^ z-ExnOGL#6hLPHZr*N@-=2P_ewx8Jf=$%(l*wsrHzo}W*IiX5q=@&oV zqdmZlq@AdkKl*y7-^u0{E-AQvz3ebc!v3#Os&>WDxLw_s|7zz&3{8p*O@3B^(t#K# z8ZX6qw?MmXBw*2JtIV29U@A_SPfC1bdb$a0@I5Zw^PA&QroILLs~sBILm}3rK2X?| zjKTnIpjoC{XFFa}THY+T`O2u?K1C|;;Nmr+7#VN59|))SJTb_gAVSd%e6bqJe2a_? zTo{Bl&@#a7gL$-!j*NU?a%Lik+f@iL_%QZC$@>n##vON2av@Z`+yuh{)V}fm01Tk=#m(MTqzZp-}+NjCOqIR%#3^KV}(#6TPFM_($2l~yYgcA&! z4re*a8>h2QpkpI6RFt1jpU{iW(rCQ5&CgQx0V}lUCUAG!&@Owk6$|pi%XGe1 zi*0^@YM0j0(cvN~D=mG3vb-*Gck%u~GN5Zf&AZ?Gtb$3u(YY^?`K=K-MoZ#d@Ct0C zudDrf*$NQp-V6Qkky5`Vx9&FbW+D{SE*ceLY2^Aip5HV&eydY^-S%@qcn7^A0}aB* z*O_hLCcw*Qcey+o+U(Y{L=e^S?mBhIs;lR#aaDbO(a0h^Z_QzI?2{0YQ}1Lacsu_AtD&l_) zqUt@(WMZY)>{hH>24b`)M@qVY`zC9^MPCfThBF`Fla4{;d}|`C+MEW1eG~zP_nRZJ?J|9ev5s3d)97cZhpPS+a7~7jzKMZ-}f>E_I1zf zdF~meD1emLxK-X#UR{0oLj%x8^FW&*gP#Iom&5neKD6UubT^#wRGrMtv5388&03PD z{{BVLNvWo0=gQ|_pEB7VTdjQ-hdtQT($~3Iy1KeMJZ@(Q7YcBc^?!p8(JJ(#zB9c$ zzanJnOGvQl&(K1H2tGJ2)u}zdt`r~&voKFBZ!sZ(l<~Zem}?dmE1k9yky;H;;?gWX zsk=ap7l|o%x0RR0B7RhHzd#P?PuB?hPt^W@i~l?%+|4S=8c1!H|Pi6QYygWQLoE4xM zFp?r}Liyh+lW^PaU&Zvl=O9GvxisM}3DT8{W_JL?rj399ZUHUOu#At#D;*C9XuC)P z^eW=h(n{4Ct9b4m%B?)C(^Obk7;8Qe(066y@kE{>x zy2qlFbc86nf8G~OIj&rdS$QvBhsy8h_Kh8JI*bwPZ+-nL%8~M8g*fa%E-E(qBLn59{`T`l{wY2~Z+}P;ql0cxPg$x)IFF+$&a7;5W|Lw4W_Q77` zN>m?9i~SU_AxP@(TNC8dY^gjc3isS}f|emF1b9YIPtUWNI=j%D>`|Eh7q0`rS>HF{ zurr=t7X1wuI0CJkn?6`)G>XKMz=nbf+A;SH%Xhch=XdF-e5C-j^^7iB0*B*56%7(hG#2tl(AUQz`RjK(^r z{SLMk78bg?sf&AyfGU({Z8dM0rBg^&20%R}<${^ug!%dZOr$iJ)!10b4vsFVZgPx- zV#pRg_)r$OTedKdtCg>=R6phOcISmiH~qN1)ybO$H3K7GUqNUt;O+)c=g>X?j^NiD zH0qZFW`1I94Ep-g|1b{lQEnsoviCu}-M_VO^}YwT+q|{bpMn4Zxr2UOUi9-rFQMt_ z>4rsrUvKY=-`@d;3R;tUE=?4E$G-q~OWCjq7VQS^fhs+AX7HbBj*X2eB(vo-H#fJm z=%tzffZ^13Vfpf9^fzPeM(3sBOkWi|(5&sbA17H$b81@(Aw?27Sxqv!UBV7%1n;-C zwG|K$05I&Hb2~nEgQh@dRdDYMF50_tz^@7Wp8i-l0N{`qo9}O_e9W9YAb`%iYx7>( zRQ$)dYi0Ccnmwl)6Ye{&X2P0zBtVCKvRvcRsivA zS*HuyiGP4Be7CEV>1mi#RvJMcy1KpnF4K3HpS>D8Wbgmt-0pd$>-*Uj>KN@>>lmdX zUjUR&_ZCIYXF)e{1%$ilmqKs}uR!d)N2FQ??&CQxLctIQDs*yk0w!6&)XsgQ zAGA+Fvv^9E@C0Y9H#*g{72k>Yo)HgA9P&V~#UF`> z4vQ({;Kvk>;4y`1S80U@VOFM-pX^FVO5%}z$_@&9AjY?iFZoa+rX)zU%*v-o9=t6>{e#a11zXs8&khfpJ$7_eRaM2s;onPCS5@gWxfHau zwdLlT+StH?QE~J0^UDoe<#LpPZ9D~|2v$}N*1vMm30W{GpI?K-q0TryIvOXHM@&Kj z7}JMuf8T+s8ki0MB~fJjsvBB+(>0-9W#D;scF)dj^!3T2yFm?}QdM>EGv*088d_~_ z?S5DW7;2)SrM0!OX=-UfH#nTCGLw!VG64e;0Qnvsx&#k*gknDw2lC_P;i<2x0(AFt zb#Cx0Kp<$p^ANoxzu=EexLk?qr#dM%yE`7hER2th)jKUNjEux)Wd(qSGU&jQ5))5P zO`#}h>ga$@JS!btD9(3QMn*;)aSWsvz=Ngo9tU5Z?XmL78yIASg~|B%_{htD`1HxT zy8<*KHC0p|;^S+msnyiiC&t7)yv7sB0n;209|H-24~o|T-L&36%!QAuSA4$H)VTsvEVDB+6JQJlZaXsdo zoSeZpw{J3shljy5*Y6%sNx!~4hKbx=$Mvlarf?!ZHn+3uTXkvu@3urM+ZfWh1g2+6+tzv0+VrKF|1hlicVKB<5z zJm~FwOQ19i5fSnKu=eKRRPS%waC?^$GNhYfWgp$b+=1blq&xRj|=;*8bY*w`pV>c=b@rI09T zKkEe`+SbOaQyfu0jNeDfC9JQnOrG_mthi9(<8u-A1jKOMzg*)E4&JqrL`9_|d-U~( zp>5!->a_%njVJ2Dg=#*3*2X_B>r1(w{icgIRY5@k`Uuv7Sa%h(dU|^L>7uUY!_TX#^d{vAF)Khg2!jU7C8 z-rhT(Nf5unSqA)&xw-o5*f(5<9(q1q5kjpo|EnuGB}GiP(pNQI8%{zhCb4}VH;-sb zG2gx~)9KH{!|TI^0;JhI+}-0}y;4AhiM&HiNBqPsQ`S;CDo+8s`D*Ay-7u{}K;!jttjyf0`9$lY{il+2^@>le( z4Z3l7X~M(9Sq~6@zo_oz?R}Jst6%=da83L9Hj2d&X{7DTwJ){$*MnN@i0^q2O@n_* z{M(i-nKpm^yXE%8pTDfO9~lb%#vJK&rN&+M&zq)FGrk*{tHeD?(K;9CAHB_$S?lQR z$@INUdw)lNg%fdeaM6|zwy#(?*-uC&o)8kU4NMVJ>E zw)&`}1oQBu)+%}AuRmYoxMS7jT}|~-qf>=GiB&B7S}8Yw{$atjD%-ZUT5|OMM8iKn zvt@bi;4(kcZg}E=H1(fjGWC;*+v%e1aP1mn6xM6l^MbCi_V(>wEPp<|=Q{Y6FrF3x z&O`%)*N#?tG&Fqw`KOoE)wQ*>WS#l`j`?$uUxvG-{5jVxpW6TH<~;eY6WF3I`sXA6 zKW^9iBRwXKlVme- z7z>0Qd>u>8eB|hNc~Z)4JI;u?kR2mz|MU6(C*ORgW&QZlRNvM;Vq3Oc52y!ChBD#h zfioXO`)8J5i=#gH+NkTzo%Q<~M%&%4a8L}bI67HcW`&0{IA3B51pk9_6PP6a<;$r% z`1dPuGHV}GJ>h+U5iUcw z>d@iCGz5ffBwOaw7K5k`MZ-zX8{)&AmS??T6?*(w#A<}vgRtb9BhJn~07ZR6&vW_j zqeqVtJyv{tKW3H?M{w|nY?8O@C&r&&Q&Y2pyKZ&W@l^OF2-KG@B`QYq@$vbq#_4`2 zS*8hl`RdgV==^saG?BHT_9At_rm&D-s88=KYxWjNsMuwLse~h_diU<#@cZK5+Vw0w z-e#MT-qdNGYX_dUqP$$pc{MLH^QkCKlasVla!MR3lzazH>Mnt5<#Qb%E%RvA8+ncb)Day&Q zWzM4z+wFbZ&~Rs|6lwOmcZhQi$}d zFlja?T@_<8MHp|er?#K_c}Gu==y}u{E`1CS4J9UITv{Y=?juJ4$~o{76?MQ30=MDwz@>s+ za5^y}LR0@La?JJ8e8k^_q}at1C8mXODzNB##+a*2y;ojnWd*ZQZL8XtduJ}$1O!NGV(gy0=A ziKRk#7LX-1u3v|b!uyVd^Q!QXBSfbVvX2z$X;IO!krAVgoL#K5t4lNRBRVfmNx`BF zuWx0g9?n;cDgE{9Pi<{WFgGZ3t(FTcc3?He#m3^C7!MwlmX?N-6FHcIf?{xJNT-^ySXo)IQIM!{bz56o&y()-OKivk&`nX#s;sRw!ZsmgWoC|k z|6Z)qo9&2%#5y1t%nqo4RThO1VWuMjk$N$hmu&h^!qJ ze&I$;!Zyo8cMqWihR@hW0}l@mLqkJa4tZghbw?YUQv?H;c>!x>FbSk1CxB7(6ff_t z=)E&`@3FKb?WSJB>v=waiIS2MCq0>Rq(mM#X=!FSN%<#COehk}7`tKb3cTTdgimW4EH##VY{L z8+iB#+-?oJDuvFtIVz}W#H4`qqoZ|fZ07OxVe%X_Q}A(YBO&qj@mX0~3Y3j^b^RMA zNbK^$ygbKX_RJgp*^uDI$Bls8@Y9vW#lhj>boDG5RaGHg-c)!Y7h0o4ZPVVqeIm^U z6A&oE%h#{BcXTkYS^-A`0o&QxQPaYmxqaI<`6w~0*h2WDFJ8O{-yiHrq%rR9?pQ;J zg-9T9!kmJcrI31B*Ub$p2n08~JK$lFZk2yilTv4jHP0`NT$6J$GT8s3M~^1u-ybX=p? zJ%Q@#YSefrT)237yK+r+z@H#ZJ$_7V1Nc~0MngD#`ZR3M*bf<5Sq@9T5BpU7T-HDZ zv%0p1Rf#x>h=amm4S5jN!V}p;B9Xra2c`D_nub(VRIt^s z>U9NS2K};!mR8haP!`o(R6zyvb&?rfC#-2f{Z(IP`#jfHGwdO zG#xo{&n^uO2H0LWT7*niVc~uH3WR|+^-hVOFt#K9!_W<5GZ#O9Pl<~Q%4eU7-!n5S zQ+;JnMyhWMW=Lo?VEr~V-4YA~vY4Kp77!3X=?z;lViB$tfZ@dTfRT|Al!ff7eGri2z=^GVcOb=iC9vPiNmXA7@RM*wv8%~})S#eafyK0*BH8Rku!p)nk0aaOP)XLSu!v%VB5w7_r+E5a0ICv6wacdu&a*}N1nfT z_b&33C-vt~pU#l(+AlcR6a6@P_tbdX@!j5oKYwzuvYPjO^uX#vH$uQZfm>6(rLLAF zJ9en5s6gX0gD#MtpN}w+aQO&!$vIM}A^yyg#RK#em6iC5GYU*FYe-&aNcZm96Crm0 zDIrE4T#}?@NnT!FA<2$Hv}HlejEjrI0r{+$PmkK`uQ)q8uEGL`pce_pAQKa|ixnaj zF08LF1ycY$HT7jJEphx1*%QgXs=VB4RVKzWI9e!*U;F(TQj~uF!UbSUu)#9bc;2sm zIS}j5d#o{P_UE^niVBa?8`$?O?jki~+j_7W;9R!TIKaR#^ZWPg?5uO;Gc8#ihl_LJ zDfA?FeC<^jb_YMX(%5`luwnVSj>`4xKgY-AS5F(apP&gWQDjI#fjcolL%>onL=RfV zt%}}KH*_)quOW_tGQE2BDh+|0j^`Mf*)lUfI+<$O&5nS9w=_3zY;9!*Rzq+;dE&(2 z;2=B{aC5>JyyN~KWCNIoG$C;87*ur{TH50$Px=J}n3|Z_n44#0W(uMM2%K-w)2H_H zE$(~(%!Bmx37-$ZQMhCC;-h#S0G1jrt0ta)28wQ|3K;tR~t|9zG0;FVV)*JYSQ}2Pc^bmSJ*|pPSoBSFe7>ZSA)Yj)?H3{^(cv_GTGm$lPCa2gd%-QP!uL#*?C2PxYX+Yt?74R0Fm>UpSYe^0l&6NT6KAg#%Y&_JZdL}|!(Tpp zxbfk^U#{Z!7tdK+pCrg$y-F*T1VjOh3yD#lgO)WuHrACIt!p&)R)f=auAwKr3u1Af zD{_lmHz)xL&CRE=O|eo`uU+%oC*Ud*hu#AB%Ru3{bJMq_PqA}xJ?@}EoYq|1cJC;G zbV0kf{nPM_d1~c^f3Jnt=blI)Ty#t+ptTL99?%;W3UVH&Ld5qHmlCXWp_V*r8PZ0B z6P@(jC!!)NQhgXB9%%TYDJAkb6mYTE}Ddc6ED*CO@Pn$iKmogF|8os=k`2P%&Jo^n1m~-5g5vPwZXj z-_eYZ>vtfj;v+LLq~|@>JU_GL85Y*Y|0Mgk<#CHJO>^rRfflED zYJyjl{fzLb1Y!Qf!7(cqfEVkQMA?I0>J$fC-$(qr;iT! z7$BzuIio`cDnhwhhySkqS1yuJEiF3j_LkPn#+KY8PviV}g&Ryh{9g~Fg|IAd7#lmG zCcxH`h~~G_8S5&{ZJ^%i$7vEOTDfbXwZAC5ez^79H*1?MD^P@ho{*Ac4=DvOiBBEl z?594*^OhXz4?rH50f_YB!-qu7kZTed7eUT*yK~;?duKi_Ql@CKwzvjQjn*? zB_Pn))btx=;t0~h)vH0h2gvCBJUq_H%hw{;HncMQ#nucG{JA_wn7qHAALA*beddNV z(WBmvAM3p)q}7tC;7KrDpt zsP|7!GVj}$hfs(F7*pZr>1vhn4W|UShVBzox=11LtL=S3<|603N?Y;u!v_{rUtlyo ze(VR>LWTn)ZshD-3~ZQ_bE>;hU{K9ujU+A@L!R><9|MV&0*$6^4v5N~NJh4j9)1#xOA7BUp8^XoS zUH0)K%=$i-BwI)UmUr&l$t>Y`8JQ)wiU`F}6o9ZP4Lu2nS765!fpZBAYy=kL1N!IY zWRp>RJ#_K0ZEZ@6^P`&C63W_$>~UjEs(A`uX$c<&~8o)YN0lpJP*e#FOQ`4 z^vxSC0kw^u4+HHaJ?1tx=rqZo@)zHCR(qKA=zNBHds(=+J`Y(8 z4GrP`PQ4-Wg#c4pk`j9v5Rq{mu%odaq9mNStX?oPMA(Ra0Ur`Ac7HbtF1(q)W5GPR z3DvTWPQdwhE*0}79hH`V+=xop2qhcqg^2K>HDLG%q?aOu0|_x!Atlx=f7>>mpy9RD zpM*fMpMk-ptAojz^kEjA!bNU^EKX!_!}J{~fj70s*aPfVw)sFMlem2+G9C6G5IpDr zQdUMrMpf0;%F0S~`GEkT(cb`~$;ryn%}_%kMFCa*HWhcS|NOSjB8S|BggdC97nk-f zZudZDcMRG2fCW8yj)62i?_EVnTGO<+InIo{>ifqFz(Getb45w%mZ@pa9D4-bxntJ> z)PplqePT&)OdauCPL3?J282XKfa5PC z9ojcpc4U4GVe;BQyzn|81fe)aII1GKuBP_Aqr(N29vho0AqJ!k@ycmxI(8LU%gMD>L|;-XtuMrw-Ao7`D^l9GJWylF{_b= zbS37gJR2$O3oLbX8ewCXC*1{v!e%7l=LbI)1CkHgT3=ruRyIgGv~i(Z-fjCXq$7K9 zeVjS(z=MObMWkSmaLkL3zg^WeT(vz>_cJ#t3`EeNpqV=>&Zyr&&0SYk9-Nq{8<<9v zEEu`8=*q6T;LF+VhECqYe0)*ZJMHan($fKV8L;F4an;vb)X6);zCa_N959Y)G?*}X zyPp39ZsPUPd-X*Q6Z_A`_I$ta>an!BYJ!dr?+w{`K1cf%OZv6-HHTZNU zBeUL7x->M<1}<&tP93QFn5@2QnznpnJtV9K6l@tY=g1kH|(Uk#wOKrOjoG`#B0VEYH z`dhbdAx8yqTypI_BUVBq5$!Vb;}Tae%xKLvCDaRFS+fftH7TuejNOq^|JGA~PqleO z|MttTwMPKamOIatk?wD(DWXBpt|1D=Rbm2msdi9x86WjdFV-5!v@){=Q2OD6bfwr&&NeR zDYssJbAoPf>(qKr2OG^5dcK~#=x1|LZSB<&DVYmx`>D@N@uQ_PQ!R!6Im-FpCHpfr z#vc)d!!BmevW$1{lrIxs4NXl5+uu|*h1Hcc-(}}_1vDs8=Xz-AOt0TLXMV+F$bkIP z^u~hu#cO(w1e*(MCCj5&;c`MkLIMIAh;s|$ZI&?cPH?=JuSb&0XvG=U)@rvwC$Vnc$0R#H58wBOsI)6Z^3w7tOko{CCHZ!U<@yn+IyB;fn+ zDA`R-O=FJR%#R{Iii?Q>TzyTej25*;hW4(${kggtLI1RfNRz=kzydVzYoX9bX^t8I z15A22-#R-xqniI4MCe5v0gC8>i00Q^E%vV@DM z^XekpoiqeggeE2?0OfWMySuw_{ew~B7JLV;0>sJ9$)RL8MWK4`Rs|b7JAy4f@XxA+W?q`+Yxoh5g_Xl9iRU6(-H*=8+=!6uy0XOjvjkcnH!RE>QS! zeM&U*>*Zt3VTFLv_1IpbYe?odl}_f${_ZC9rb`M6CdS5$$8J1;_78$?+m8OWUAb#u zuyF-Jx<3mF0uqrTjTCo)4MZQ=Lzut9v&1EPCyxsGC7JP!0Pm$9oz7*Uql#o`dpVLQ zymsYO+|Zabc*iVAOQq>;lCU=~XYs!14pz|a;Tt#vmy4~~vj_nA=>sF)>Y z=jVU*z(^+U0EXIg7lRD~CaMgY8BCo3xv|?tMOC!~jpLJbgBGx8puhpm4XSQ*Y^2Sz^ZVm<3tCL z(jl@ND^%r^mX?-+lxFNf3WsP7w>#z`sG*+y`|rOC3>3GiR<^d%YB4`FkM%Zoemu;ipOGlRj1my2|7d$FzKD>?|HN+HvTen;low4N13(ES;C>cct zM@I5c!$1i^oxgij^~{+E_@v}yZtY~4Q9%Vybmm{3dg)JXk5&BoO5E(+T=27J2q)f@ zpRlE{7%lQO!3tA)W&)g^jW%H)(?KQBuV*?H9vKuw z3$tKwum}BIV*#rg8yE&4WGmp~nVIDD^z)=BuT62$A5mAhMt1 z2=Z>3gyaX-n6Y(mh4#9d7JV-24X{G5E``f*1R-fGIu?T?jVjL0p2I?hEoO3DNvW!7 z&w)N2!BE#;tJ20sxO2fg!uDL`y!N7g_^cUARF_$YX=ffTV&K!KzagL@HzDR=+aBWN zM8fUv=^@HtI%%tGoat(J>B{DA(-8W(UT{UcFBE{0lSc4TadcR5e-GnQO8-YLHbZ{C zWlqJXzm_6(*JekrVw>R(lu}q=I3R9FO-+q%RvY_y|2+}ia4||rv0_-kMjKpV5XEmj zI1jh2fD>54M~}9f?@~Q`HV&foyLZnBF`#dV;s)v}P}`_-bl#d^;u2s9PE*qMR|Hmn zAp3djJ+Db|tC1&>k&N0O;bq1)0Z@o|`4Ut1t8QiF7 z`0N>&WjG*YNTF;B96o#p#W2dZDt%$n7-S}Jr4ix|HnL4cBj#95M(!ef3a8v`wH zZ2$xm6%|qKgWXCSoA758ZAsG##}1*Uerwd02?_UkSlE3Bhg{LCcR58xJF2RN@r5XV zG5Tfeb_$?NAwfanKGy%{2mdK5ICv~DCoiIEfToBXrv+bY51`60WgHv4n-g7yxG8RS zo-%Q3*sq9$q^uIr(NR&|$Ze}v;3Gk8OGALMf_VA%i%Ee*l8Iv!x3@xnnLLLj8mnCM zo%MYx9QZOiP&#L}8M!xrZo&1w=$o-=03x;7hJFk{K%4Nd=6vp#v3iiJF(PAI4~(rm z5~?(sf8l&Vl>^wtOnCQd0w=M4(NpJ9(bi_7IowGyg);c6NUeat#&tl`jj>QMk95f?2iG0%iGJX~jDWsgZ)uaAkSdwpZQEBoW? z*Biq}E^d6*bwuPJC$Sp$E{}`w_)>El%-&(-M$!2m@_BaueFA?k{O|Es>)V;3>)9}bMM|Ty0A!a2=NsY-wt=_e zlH)p}CJqV#8|gvsOT-1oW-J=y%C80|AoQh~5*Ux`)xxg=PUZ6DCqY49;hZ&Znpp$w zhH457CyP52ahI_c-crT=6qUe+ot>TSel@05psE0$)YXX%vvD}dV>h;V5W>Xn3x?J> zP4}OpKkm;Y{z5LH$>7A+t!}_9r2!H}CcV4OVZsUxg_+yd+S+M-_5P-A1+kuJ3A;4m zGw}7?uECilNC{Y#xV@w?aEl-Wb-M9EgBM=bd{S8G0Pzbu07HzX3AjYtOj!(b)k?+b zOFrmc5lMUg@L_48?c`LFAut_I_WJef5(TFnB{mSbQKU@B2*9*IH`!B?_3G?MxT_@% zv_WKka7-k*)9EGa2hd<|E6l#OM{AD?eTCoB%8IAEJ27W+agnjk!m9!1O62ru>m2Hs zgf{hKE&|jMih<9c+pR5Iqe>*DEYA`(6;<65P{sbp&QWv^`bGLPci&d7J4YH*xopq( z^f0@!PRC+>u8;M;(%<}y!e(cr2VKto#QlMqfi5=p4J&JF5NV926?cy9vl7u#QNg&O zVl6~>1XkDTS)2#Tv=Bb67f+rXyH!rw?}R;2dREx84DmAl@)6`jNX){iVL%FC^R|7x zETxsg5L6ApiK82Te5tKHq`Oz%Lvf=N9 zl@FAHa(G~`iGcww>d7ySc(d(9`yFFrUbR4XHZu6Vxg;ewpjj@~LvZy!o7{0&UiyAE zd23>;A4nhAE}PFlMMf}MEs9q2DLw{tFG)9zdSHfUE+Nl`N&{1k{}^mAkcy(90nG+3K)J>mBQ0Vo>&Quiw> z;PyN5QDIZ`DZwTHXt=HL8`w*5(vOon>tl8EsS^N2gzx_zL>5wv6ghe9m>DdSj4LYc z+k=i=ilJGrcnU)m2kDpdT6t#pI6c5QM$;BgFiRT)9sWVb1cNyqQ)8S$p3$ittUJpq zLZeA6($i(HUBfinY#FWJu;;IcrcqqqaAndbdaTBMZQ zcIzAyc$dIyls|*AvRMAtPAicj5EZDwSik%wak!p(yb>;_gy7)4-qH}uG|k(!jWM6=O6r>rsx$t*MNl76ke^mSpl7pUxrVTtee*O5dTww*M<^DZpAXzXVmZ;}L zl=uG1E7l!ZdZX9SEc%!JO~EkWM_j40&~{`@m>;Jsb;~O%N`_4uzJFf?RDxhd%^pV} z5HJD}hrxwmaKppr6ThOyRFvmuVWIjp;yIlAt$5WoZ%g)A%1TgWhxCNaEgwM0{;&X? zIdf*ycA9+StCS`exJ)ceL|9Z#x(-by)r)~D&{RPx&^k&YPibhZ^k{Bb`XUlS9#pNF zrRP_&2|)NRUARz<(}b|pD|#kR(*&p(Q62kuTe>MJ@8**G%}J`zieKRi(K3bb?V;VX z!oOoj|IQA7Fa1xKrM(Wm=xBPhaj$Q8*AX_IrK;zcV!Z!vu;M_z=`OJHVIH3?yuzp$ zk(D7Oppg4LJxxPTj~S>jN=X=W3V{&H3bDrF=LctygQF`daw@#o!7k$~3|NS`edA*@ zWYhzGHtm!7&HijzXI>`BRpE|x0*atM4V+<@JB6$lARaF1YzmW+BN zE-u<(gCXcGOTr5b7Y61Zf*b%N0%4Kg&RSMW3xxa%?C0pn1T8X|_W{QBE|in73e^uI zVx*zPW~|sIrtb}6QBu-UO2JK#NHF|fy;`Q1b(TOt4iSy=b>dxIVub(!f~+EP2;Z3} zXw_AVdxj2H9o#p0jv3ex^Z3Px)>dnBEuQX3fO&14oQ@7Nc$;&Hc98p^H3Q-E^6@d@ zlA!TUj4p>903ShTev^*>+T3hqV^g{HYY*ISlL}y8;eh)Df3LCeE^_j(jg42XUEA9p zMf&BMmR1oCMLkO|?D_NFACv*N&yoUYz-($Y!_Mqh`eE*pLH?)DpAjn_d3cx$N5Iji zlW$Rh>s?+xhm6mF&~Dk}Kipx|KRd-uS(ezcV(|Ff<$k6>McvseIu1T*ZEo!I-5 zsU=5ZO71Wz#7e?^R9qKgpPruHBT@O1vpR*nv@G|9Mf=IR?_FH}tnN_wmkh+3cKCJ+ z4OP;$i9p7&Bo4RN+q)X;(0uX*;sRz4qb^3|tQ@icRRQ$WB7g$e=sU(;Zrh>5=KksS zZ~PD|%ck!m3FKnQ^~J4J3Th~}@eX_}W=@|1JhZWN>Mwv_*AxUWNY}-OJ=i$-`sHU2 zP`$!`If0vl`VWEwY{`ow#}Atgb9)d1Lqmm5p0u{G_*kTahyY{*UJYYebyDCXzh=n``3E+ZGe!q0YZsKD_1@SxW28Gbo_Wr?x2LR?!>tN}i z&D|ioqpM2`m0B;$yO7HK5P(;Gq^M`%6F*;H5VNdy#^;Fx3=~aKhQoZuX`-6de832M@kC>mvZS#T-6q(C`w+#3bRkPsaz% zt?cG^e$b-3U}vTRt@w?sSxNLU~>cDMF-;Q(r`2kDJXAT6|)S_gJ4Gs z3Qj;@Fbsv({O{jS7u^M%T_XkdkinO{J(mKd9hN5wWXx|>E3}yaK?R=&_-OD_py#~u zVR*u?%=*iBI_d}$41P8zf$)$fy6s&0)z_%dz0QF4MrndOFj8u1T$vE~9${1WEBLjmxrI74hj3& z*I8LvuV0S9ykfb+2|g6f)2(_-5cT^@w+WUp1l%2n!ezBzO_!KpOX=Q9^;@#aVN zN?t_&Sn{0-|HzH<-kw9s+1sD5e$W1+EcTYjZzF8JZOeb!2mjN&_K(=O<$rHpW4X7Z zB>wSZGSa`dZT9<3mcZfFC8o|8mL=!-6zBS+4VVi%xkzOJchx65E(Uto0fB-qOv zAGX{wg!AOf=g%Sz^E{CXXpJT#CAFLR;fJ|8h$9dU&<}&bOC%*)X!in@gT9=yK4=HJ zhzaHA;q^g<4%EJC@+~$gX%w}M{pzB*wRJY8Z-G>Wo#)6N5I^0iF>A`!mWqswEeIXg z@Dw1g9Tc(hQb=TX2S9;R@FFnqA<^qi%9K1&u&!Cxk+xw3qriNIA0Vg?TeIIGqW!{AoI|oqm z>K)q$enu_(F063739pHeG!0x57Yh)0{iM1 zp0`X?QGsI6>Rw_oBnP05Jl{cC`tWm0SI$35nMo%GYv6^!!HJ3(^M|DBAOMLsQGY*s0G7@=VjZy}lwZfj%#4(hvOC{WAJ*V#mvwKdtx)=*uQouq zoSP%MxV&iCp^1TIl&ytNV-0?S{(6KyVq18tCLgBoI(&M8IMNVPuk{724Rp78^(^$>Ld9IS zy)Fb>b4Uod(YTnJ z%~-%iU^|pV1N;+B>w4(JLn8;;Y(k!oK{G>9hV=|GIVCxnoQjI`jXm%xJX{`p^GHNE zedI;V-LZp=2OZSQvK==M`+#;+%>uWL^#sjhd}0F24e;*Uw0vHdraKq_O*|E?XbRWzDFhN&A?kd)wSWam= zq&Gc3kA_1)4rm*G-rl%W-o5vAueWbF6IQ_N;>|dLyepVTYgxFL`p;Uyn=U|2M#YGO zL&G{mO^VV{`wmv&%WVaHIUtQXK78nf1c4_|U=^`T12YdCj!j_L6c363 z;1woivBKcsZ@41fTQRG`)x(3tIWja9TsK^y3JFT*K?}yjOpi3OV_H^9Eo2@nZ%Mt{ z=k;B9o=G0mO^kMi;1MNk?m9A0xpOD#W=YE*6rN>JQ^K)X5a7`KhqOI)0+JYpFMu>fp((t;<>hpGXi?Qc?e$+?1V3mTc;0rCpND@d(;AKmnjnTt}i8|d> zU!R_q_H0BNVq3>FGj?Isl4o2Td!Qc4_U$kZ_Qwxny8)Ymome)=Ap5DthBSc)Rkg%N z7=h?o0!tpA4g)P^`m|Hwo8Yi8Z+>qx;fNv6M`#Rw(`Pe)O*C!NjGb z`3yb;=!!Uhda-EOJj|@D;u{T+Pf#~3w$rCMLoXzaK@3}7SwT0yqS+OoQ;gt@ba$6V zQHHVlP>UPqz|VefYGSj>AbwU>*41m*z{2_a`7t2C0sn04&+^?b}*H=6nE3IUG~~1`tkD2FrCpJxNP50ihpW2OlF{ z1RMll3j;^SN5P4|duOGhLKm1#`xTB}0|NtUdK*wn5O+!H>2}l7dOI$EMfrr~00W?y zpr8fR1(0;m9m|E7PFvhY&oZ_&N(->RSm1~FNN(%vqb>V3VEXWvNIYT%$LxUnRd^XL zXfl6K_^8`a6yrA1>n!(Ikn5oJMY05d*m^w84*v*jHTtHs;RKxQ7I(jlIBa3@8$Wb) zbDO?T6DCjWQSp-zg?pCi`&3OKN>j{qgwO+}jmWh3tfHA0!Y*DI-p0kjLClG1W2w2h z3mDTVaXm#V^wWdCwgSlb`uU-%QRitv6oc#x&AO|z6O(onBeqgs^HEcPM+9Uv6j-pF z_re^bCTo7@&v$17D-$r+99VTpnLx`S&50&^}2nc}X&!GR~TEZdvduqyV z?&q~CZN5Lo1Z`3HS{SgKcr|kJ^7G-e!0Z$$vx06LQcC3+Vd2+7Myb)_=^Y1b6lO;$MPEUWw7y;@sPb07hT_q$$*ms zzxYaZgM0T*U@`@X*sMHMcTAKfzJz6^zOc7F+nSAZp^!g20_B0n|I3 zT8AKMgNZGm5BHGWLBR)39Bj4g#WXOLJbSbplib|4Mk=UYzKo^xsP_hIEt*C*RS>aP z%;}Z5ir4|f7Ic)u%*;J#1c<)dWnoF|F@yp^LqNVLF&}u;n}}@yQ44`;0+E!ST;TX| z&@9+$O9mOv@1#j#&%h-GzQULQ1XoCw`7Rs9H@-nzsdD+fvGA4@HkUS44#oH8kx z=d-Yg6SOtTkR^c6Y~J~E=jO)SXsN1( zXO>WQ(!YNg-*pQE<}-#N>8$!U>^*+$nBB@eFH;E!i3M;8{=xYJny`Z6Rb8Fb^->r( z6D!@e#mcHBirSK<@Gep_b{{Mkz`cl|cp8E^S9jXpWlD*n6QUxBkO+)GAD&h8=sZP4 z-A#Wy1Dz0fqRN@`=Mldph{M+wr*0Bs@ixN6tg*_a)(^uoxOSL;djjqlNUj_~#AhDa zd|lOd`&wbL2@=I~BRfiSyH9+k+W9&^qQGDKDeFLh8qgTyqtqJ8Hqpi$&&{gV8o1twyP>AqzxSD05}1Tu$fK(-Q}7w z@m+s@;X=3gXHp7u@;bX1q*X1bmdM)xXzGv?X2k=wq`ePe~)dxL~Wj!ksCTS34Bp^eg2^2fY zj0z97dV`Lk#Bo8WA~1NM?H$|^#dfILOwyKZ<{2BU-H|&^T^ZhB-iSZlK3l9|PcQed zDaau|W)BVhxhrR=rwOg+zFd1YmwSYatnhF0alVgaIvym_XZZNZd^#JHOpZPyTpT@T z7(Oc-{?71e4|AMA$5xxY21o0wbS7@=J*{`(2x@iw5#$XSZf-_nIj%2{{KAUy7wO++Bb?)+6ei_pic6zN1kuVNQGe$j;@jvNed)DRG-92ZqI7)XeRZJqVuGE za0m?!VuBajko6d~BNbHunEvbMHPIj3Os)pc_S&z)Ne=nvHzu-btE=x%WVeR!>k!Qv zucDL>H1N1L+|AxqBGhHJVPk8Hb|HHJRcbuMNWc@uhTrj#Nrxo23)J>W52SIFOLSJ&O+FiKC1H|Xmpew{L zWCOcgPtB=Y_DeejTn<+gAD@DK2P#LQU@Kg8P>+yoUt_GIrY4@Z76~o3BL{||MD(?Z zh&GMQ!O~G^Hyt~XngD}Q%A^;{Xt;*}E1~AR^5<;13qwXl!4if5;+{D=IR(psV04z1 z^;)ba&#rsjnAssgG7N#A2!nM71HHUpyrR#+(GDB|P4b_$)(=g{ZBoF-49%7EJ0%XRSvJ5yu4mc5LNR~(G#bZ$0rlg& z_roo$lr-K|NW`H?L?Axl4m547axpz|Z65rLp$jSlXfr{@*PnU+&4xgWht3hZ-+^Z1$z&PH{7mX(xI35qPvMS%0f+Vlok_jW z#uy<2?a>t(&Ub~3L@RFU-^(zjA|-`2P8w_n{Jsrw=cziRqEg?auVIAzyR}@LGmv$v zP`&T|<3zCmUTCycVhRbe4*>Vs0t49YbU=8ZUb)zIf``Wlg#avR$+?ekSyHu&3c5$+ z^ED-K;>1z)cx0$YKtMgl=o>ReT*k1a4p!=?h`k-Ahv7J}2R1{YzYFE(Bc6ym@tmoTdr#gQ^P~%e!G^Jmfpma2Cy?Lco+jW z7uWluA}Dky*AKfBTY;}C{u~|_(ygQjs%{1(xmot8E9V@Z^!BdJ$Qe`NaW?>hF$bP8 zU-K6_(Yw;EFl(uWfBQQ*m{QW{!x4D^8qlUxWId*mpae6t-DvZupS8+X}cb*m5vA5m9;HYmnOOE`(qkH3s(J6=it26sFMXSMM} zS_>7lLkXhTFBp$ru+-dcSmCiqvWqq@hy#ui`8-S{1xMKkiEK2vBiGn}BEN_bV+Quo zp8}v1B0g^RE;6zgU_epIL-9mepkMdG+GoJq`Y3vSFeG0eelN^pCFc0(_1Q$Y@L0<+ zPx&{TYbAJ2kz9fW#z!^XNz-dqZo@MhLD9iyqQ_c}(XII?FCfF9>=9dE9B7I%Eei65 zx+KpL^jR2}(vX(HuM+K$vO65zO5cK?7!5sfpzDR7O5WUlfm`mlM;I-SzyQh_REv~( z$^qleHT=+6l`D9=8|$G%(#wHlV`{|745wE6hZqk9*UuK z9bp(8_^OcBx!idS;{M)!etKBp@K5J@kTrERHDlN_s32D{rZ(Ojk88UH;Hh5V&AH`6 z3#JE8t_5`$noq#6h_->^fSf9P%Tzh7B2w#&LaG@i>mpJTZ8#W!00%FRB^hgKNhvp#m)Gv~4O451NVXMt}Z% zvN_4_L|oybar1a5;U_tMu|vhqEPRC}+jHAuW)kt8Isr6-L=_=vbNt=rpDde$@BaN~ z{N|j(%|HMB1^@nR)d7FQpxl5cB`0qbuH%A@*`_F%UwH-Ac`1mHBzB8Vv zfY{ye*pZu0rL@B67>xh@;O6^(=U6)(9zP1Y>*FG9wW@R>`@#^TsNH2wAy;vHM?;fR zA%|$zYo$eNdD8i58;(q3Gg4htJC##b!po0`Y=4{3w;pFLUy}KmJ~QVRv_mOP z`N(Sf)uVX(%Qhv4Gnyst3XQPE&QcGZK7IIZ$)_!<`ERe@_dNIL{JtMH5I z_lDi&)TiWq2g4dl-QIrTD;XF^(!Bbcagz2MEJI=F6Ebm6a} zsDrIzi7wBgChT`z^W1ZJ^KkN~xaIJ!KdbCRdR(4E@|Q2Xn>X2j5Y%>*>!I{x?hc&o}(f3;JJ6dCUL* zg8txkCWbft{e*mQ!CfvA9Nr0yy9;KP`4jTXZ{+^`fc}3xx&M7f{Wk|-HhEOxSC7-B ztJk=%I&8Q8_3d!^C521)#s_pE?Uvsf%g%3qbB|2XG1~rAeTmEK$Fca;7GCb`v5V;8A5Au*>$27g73b_^4Ex|; z*h@pQ&6V|z8rR(T{^8AFVvw&H!6@FTc|bwmee*<`0yksfzrOI_A?eTG|16Ds{X6;RQWpzeIM3+=vcR(BK-yO9_-My;Uex!YKx()`>!QX{p~7b~rVRli&y%qEB!5 zTC+5yx}A6NMr)Ttoq#~8)3S{7`~IGmqcJhv^+gRXjXK3Gqjyti3$1oRjwtIZ3mxbu zw4_K(aYxS<-B-N60V$&D{#`?Jr;TDZ*zqa=t4ZoKvQ{l=N%G zX|%4ej1eR z&ZiZ{?q+YT%WB81j1!ulRc^ejYPgvpA;HHL%qCj6 zSi{RXyWHNYFK)5=J^1yPhkSgLOH1wixe>2ZQ?DlNDRDXxqg(ah&6^jsH6FV<(B~TY zg!=BK3GMDLe?4SkXknh%v)5pPJiveF0pTN`u@0W3cV&+$8+x1keirYxgD+AtG+C)y zzhv!ut4`zv(ZIu@HQmbtaT|*r+Nn98=a0g+$IUfMAiWYJ>3D3wwnWj&>~i+KVa`;Y zn70=X9H3>Ohcu2p_2TyX%fqS3ZyodqIz=%yGq0X$7j;~8n)rXpy7Fi!_decz@402E zsOu8)PLooyQwT|8i4-?PvUSIn31b_|Hg$&-NoA}xBs&=)GZ{_FlI;$%?`vjkV@Z}Q zGw*lqyPVE>|C=-0nP;Bu_gTN0X)~9z)z+!LYd%2*1*)DSfnS*n0i?l5xK!|(2UgwA z!jino?is^2KgEZ(YeQim6YwB@Z77Jh!)IsBGv&sLfkSRrkkMAAfF*5B!Fdt`B`+J*0eM= zK?di*`YW-~1|Hn8V__j@g)shRrey=KB@wgOAJq6~Z{SnY4|gCMEf!l9Z9P`ZZ_= zhpw2j8_Y6uAqsY3O+x5*#6K)_|A}t(QMWc0V>EFm(bC#}T_xobTqO{di z1=3U6Y!s6mT8?}6w3r8XdQu{&D^ECza)o5EKCiw3Ia;7#&y9fK?bca@@@q@@bad5% zL+O;HhDQBeLiijtvDwx66X(-)W$$4kTAf>OYZ`EIF;U4PNuEQ=%R~F1-H`?X0d3ge z^Px26XlYeAi^XD&zIZnw385yQx&)AjO40UC_mzOobIz zWo4$L(}2u}n!vuC#8MKgjH{j3Wi2b>2O*Gx0tvV|AmS(UZ{lzOb;{?^N=mS;7d;nQ zl8+>I8$rt4-xV$7$M;<(5h8@y(gQB`m@IAlxc|1iXpAtJQ;CUI-rrk& z4OB`#HdeNpZjU>8pU(Kbmp|nqpUO<*KfUK?6681zN~MBGIDlZJ7}CIv8GDZKGD5gy z2?-Y&i`>omg_gS7og+)JbM@Jdd;-sb#iC-orq$8$4 zIfBxS2w^}Y5^#a$agS(dR0P`)03mH~p#w1u*ba(1K_26co`d1TUswOWk2x9Ic=+IO zc^aQ-qOz8>iqitf9L50|#-Vur{J1{2NG{ftybt%z&ekG)yoxzlG5Bpa(K|l%1qOe1$UYBBK4oN3$*8*q6D{$;olng5%@jBIb5=;Y~`28n>jPG5cx*47}6(dKdM9dm-_STS<{l;;}Nwh-*bw`68(MCFW}vw4c!3R(^^x4456JoR6cN zy|-ki=o%8dSerM`r84ze%J(B{Ei*&ZSG1s9%h73;Nmi82C%*K`ESt2K`#gJ7`ta6% zT0}Of0dp(bZ*FRm9-?T>4ZeNa#%hY;)|~K{BuRT$1+4%(EZ^F4!pxWt=U3X=Ea&x> z6D>fBObDwvpuH1p^&VmUX81&!ULZXSKc)ZEX!)A zrMav~G$3pfsqdhzcXe&0Dgko2lIm{1`Jl59xbMOB;dAHGT3Yr#dBQP|TL@ddXm z1=~|1R`IOU^5UXq!UeLm-1)fagk%wgc>Z0x63pCRUxkqpmc@?jtoyd^s?C#u!^4WM zu2=RXl{yp==n&S!v7)Fe(`_XT1=LJR$7#aO^KhT8q!om$J@CX(;ywD{#xOH%rISXE4x~o6I+i6KN9{4aj)5>v{^jT36JYX@6)EHAJmeU@ih*>U19W<_3YX` zmu1ydE-?gUKvj6JhNj;(B@|sNVI*9sbd;K7>d8EEOIDW^N$WOa!=e4&>XCE=$9U_F zcnt>gP%OMbP;lAf#GsH#v@Tw;=XxGOqu5?{V}774?(Anq7o+6WtC^VAxP-*12w@vl ztfpoj*;Pys3HRYECk!(Q{n**IkESOQ#)GO5FMscKSV!WyYt!VjE2%wQDOLTqFGzkuVpI$X!8ox93BGd9%u}KE^5q1p<=z+)r-?AH&UkF4V*3}J%bP!1IsQWOU zJyu-JDBA+GaGjM-OW=($n4|RIl~iDlpy>nhI>26nJa!_!5hNX5*i%renR+n?Oa@iU zE!yv>u%ftmIAocjfz|E+PZDq79@m4u5k_R*m;2Xk9*t#4NhcuNg> z;W;KySdJSx1rvuTo?)<#ap$N?=K`nCNVg$~_KHOi!?u z52p0~hh6$FRK@epVz*yh@eA~J+3fEdazA$Wf3W41-5NzzeA0{LqWYxm)SIz@@@rxE zQ(xYPeB7~P^e&D%k5s$iL##uePDymI^?1=#1Uia-5_t?(LK>k^$8IVUKfMwRlx?*g zGO4)>Qx4I6NuWS<+VUOvR5VMLM{8S%>p%6UhzNj*WCnhkPrVA6M+^Lj_=PZ-;zBYr zBnzI`i@C)9H2$q7WG(wa+=wO**QKh&ur4bC-DzN`|Wj4Ch7z*|QhUyJ0<=~$17F1Ov`4O+@+ zdRG=z%<7-ak~))aH+i5Jd1BC%=#oQf$P3uxJ2;Un~5y6sb1JAjuRj2e4eA9_FC zE2OR*ow@j6wlBMgpuD*$a)6k&_tB$|X?w*Djq26+WjGT5rehTMe&j!s8O9bdLIU>Q zi{kr(#Y7y5y*I{Gfp63Ef1T{bE%W!W8sJCH5mCtjU0v`Nd0KMdMyT0s5^i4soX9%{ zVU1c&K@QqqvHn8@b-X&1nELWtW_{rnTh6~&Omb*QS_DOY{cCkrMWDLFn>c}htYG-m zhcl0FtJpXv_FYsKeXbo$8?0A+W4Dm3C+6&H?dF}*UKvK6-=~Pur0@&+BuZZJ6MVBf zk++HSPqY?Bl?QbFEAUptkh&E)fsC&Yr&Nx=9G)}FI1`V`=Zz%sQNjuAT?Nk%Z??BH z^*llh#rGL`vgJ`bytqT*;Qw)xKM+L!rgBC(*~*>WLxDNhGCc;@`9%b|+G_6it_#)w zY)iB5{;(_11}n7(3mBS%X($dZk7fGT;mfj$(-G;)>xS~EhP;3D)+~)CkP}WV-W}?) zJ6~hRU{+R1__3T6=mu{K`A))D5p1=@85v`5#y@&DknrUK8e+$EdBowJ#E0*BEa{JQ f(vO_zNjCRqU&+iQnH+pFZ+lD(%?!w>>wo?W8b6FY literal 0 HcmV?d00001 diff --git a/purchase_manual_delivery/static/description/icon.png b/purchase_manual_delivery/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z z?n?eq1XP>p-IM$Z^C;2L3itnbJZAip*Zo0aw2bs8@(s^~*8T9go!%dHcAz2lM;`yp zD=7&xjFV$S&5uDaiScyD?B-i1ze`+CoRtz`Wn+Zl&#s4&}MO{@N!ufrzjG$B79)Y2d3tBk&)TxUTw@QS0TEL_?njX|@vq?Uz(nBFK5Pq7*xj#u*R&i|?7+6# z+|r_n#SW&LXhtheZdah{ZVoqwyT{D>MC3nkFF#N)xLi{p7J1jXlmVeb;cP5?e(=f# zuT7fvjSbjS781v?7{)-X3*?>tq?)Yd)~|1{BDS(pqC zC}~H#WXlkUW*H5CDOo<)#x7%RY)A;ShGhI5s*#cRDA8YgqG(HeKDx+#(ZQ?386dv! zlXCO)w91~Vw4AmOcATuV653fa9R$fyK8ul%rG z-wfS zihugoZyr38Im?Zuh6@RcF~t1anQu7>#lPpb#}4cOA!EM11`%f*07RqOVkmX{p~KJ9 z^zP;K#|)$`^Rb{rnHGH{~>1(fawV0*Z#)}M`m8-?ZJV<+e}s9wE# z)l&az?w^5{)`S(%MRzxdNqrs1n*-=jS^_jqE*5XDrA0+VE`5^*p3CuM<&dZEeCjoz zR;uu_H9ZPZV|fQq`Cyw4nscrVwi!fE6ciMmX$!_hN7uF;jjKG)d2@aC4ropY)8etW=xJvni)8eHi`H$%#zn^WJ5NLc-rqk|u&&4Z6fD_m&JfSI1Bvb?b<*n&sfl0^t z=HnmRl`XrFvMKB%9}>PaA`m-fK6a0(8=qPkWS5bb4=v?XcWi&hRY?O5HdulRi4?fN zlsJ*N-0Qw+Yic@s0(2uy%F@ib;GjXt01Fmx5XbRo6+n|pP(&nodMoap^z{~q ziEeaUT@Mxe3vJSfI6?uLND(CNr=#^W<1b}jzW58bIfyWTDle$mmS(|x-0|2UlX+9k zQ^EX7Nw}?EzVoBfT(-LT|=9N@^hcn-_p&sqG z&*oVs2JSU+N4ZD`FhCAWaS;>|wH2G*Id|?pa#@>tyxX`+4HyIArWDvVrX)2WAOQff z0qyHu&-S@i^MS-+j--!pr4fPBj~_8({~e1bfcl0wI1kaoN>mJL6KUPQm5N7lB(ui1 zE-o%kq)&djzWJ}ob<-GfDlkB;F31j-VHKvQUGQ3sp`CwyGJk_i!y^sD0fqC@$9|jO zOqN!r!8-p==F@ZVP=U$qSpY(gQ0)59P1&t@y?5rvg<}E+GB}26NYPp4f2YFQrQtot5mn3wu_qprZ=>Ig-$ zbW26Ws~IgY>}^5w`vTB(G`PTZaDiGBo5o(tp)qli|NeV( z@H_=R8V39rt5J5YB2Ky?4eJJ#b`_iBe2ot~6%7mLt5t8Vwi^Jy7|jWXqa3amOIoRb zOr}WVFP--DsS`1WpN%~)t3R!arKF^Q$e12KEqU36AWwnCBICpH4XCsfnyrHr>$I$4 z!DpKX$OKLWarN7nv@!uIA+~RNO)l$$w}p(;b>mx8pwYvu;dD_unryX_NhT8*Tj>BTrTTL&!?O+%Rv;b?B??gSzdp?6Uug9{ zd@V08Z$BdI?fpoCS$)t4mg4rT8Q_I}h`0d-vYZ^|dOB*Q^S|xqTV*vIg?@fVFSmMpaw0qtTRbx} z({Pg?#{2`sc9)M5N$*N|4;^t$+QP?#mov zGVC@I*lBVrOU-%2y!7%)fAKjpEFsgQc4{amtiHb95KQEwvf<(3T<9-Zm$xIew#P22 zc2Ix|App^>v6(3L_MCU0d3W##AB0M~3D00EWoKZqsJYT(#@w$Y_H7G22M~ApVFTRHMI_3be)Lkn#0F*V8Pq zc}`Cjy$bE;FJ6H7p=0y#R>`}-m4(0F>%@P|?7fx{=R^uFdISRnZ2W_xQhD{YuR3t< z{6yxu=4~JkeA;|(J6_nv#>Nvs&FuLA&PW^he@t(UwFFE8)|a!R{`E`K`i^ZnyE4$k z;(749Ix|oi$c3QbEJ3b~D_kQsPz~fIUKym($a_7dJ?o+40*OLl^{=&oq$<#Q(yyrp z{J-FAniyAw9tPbe&IhQ|a`DqFTVQGQ&Gq3!C2==4x{6EJwiPZ8zub-iXoUtkJiG{} zPaR&}_fn8_z~(=;5lD-aPWD3z8PZS@AaUiomF!G8I}Mf>e~0g#BelA-5#`cj;O5>N Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/purchase_manual_delivery/static/description/index.html b/purchase_manual_delivery/static/description/index.html new file mode 100644 index 00000000000..7f6fbcdaadf --- /dev/null +++ b/purchase_manual_delivery/static/description/index.html @@ -0,0 +1,473 @@ + + + + + +README.rst + + + + + + diff --git a/purchase_manual_delivery/static/src/purchase_manual_delivery_forecasted/forecasted_details.xml b/purchase_manual_delivery/static/src/purchase_manual_delivery_forecasted/forecasted_details.xml new file mode 100644 index 00000000000..72c2a994e89 --- /dev/null +++ b/purchase_manual_delivery/static/src/purchase_manual_delivery_forecasted/forecasted_details.xml @@ -0,0 +1,39 @@ + + + + + + + Requests without delivery : + + | + + + + + + + + + + + diff --git a/purchase_manual_delivery/tests/__init__.py b/purchase_manual_delivery/tests/__init__.py new file mode 100644 index 00000000000..c51231a75f1 --- /dev/null +++ b/purchase_manual_delivery/tests/__init__.py @@ -0,0 +1,2 @@ +from . import test_purchase_manual_delivery +from . import test_report_forecast diff --git a/purchase_manual_delivery/tests/test_purchase_manual_delivery.py b/purchase_manual_delivery/tests/test_purchase_manual_delivery.py new file mode 100644 index 00000000000..125c2f3abc6 --- /dev/null +++ b/purchase_manual_delivery/tests/test_purchase_manual_delivery.py @@ -0,0 +1,559 @@ +# Copyright 2019 ForgeFlow S.L. +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields +from odoo.exceptions import UserError +from odoo.tests import Form, TransactionCase + +from odoo.addons.mail.tests.common import mail_new_test_user + + +class TestPurchaseManualDelivery(TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.purchase_order_obj = cls.env["purchase.order"] + cls.purchase_order_line_obj = cls.env["purchase.order.line"] + cls.stock_picking_obj = cls.env["stock.picking"] + cls.env.company.purchase_manual_delivery = True + # Vendor + cls.partner = cls.env["res.partner"].create({"name": "Test Vendor"}) + # Products (storable goods so that stock moves/pickings are generated) + cls.product1 = cls.env["product.product"].create( + { + "name": "Test Product 1", + "type": "consu", + "is_storable": True, + "standard_price": 100.0, + } + ) + cls.product2 = cls.env["product.product"].create( + { + "name": "Test Product 2", + "type": "consu", + "is_storable": True, + "standard_price": 50.0, + } + ) + + # Sublocation of the main warehouse stock location + warehouse = cls.env["stock.warehouse"].search( + [("company_id", "=", cls.env.company.id)], limit=1 + ) + cls.shelf2 = cls.env["stock.location"].create( + { + "name": "Test Shelf 2", + "usage": "internal", + "location_id": warehouse.lot_stock_id.id, + } + ) + + # Purchase Orders + cls.po1 = cls.purchase_order_obj.create( + { + "partner_id": cls.partner.id, + } + ) + cls.po1_line1 = cls.purchase_order_line_obj.create( + { + "order_id": cls.po1.id, + "product_id": cls.product1.id, + "product_uom_id": cls.product1.uom_id.id, + "name": cls.product1.name, + "price_unit": cls.product1.standard_price, + "date_planned": fields.Datetime.now(), + "product_qty": 42.0, + } + ) + cls.po1_line2 = cls.purchase_order_line_obj.create( + { + "order_id": cls.po1.id, + "product_id": cls.product2.id, + "product_uom_id": cls.product2.uom_id.id, + "name": cls.product2.name, + "price_unit": cls.product2.standard_price, + "date_planned": fields.Datetime.now(), + "product_qty": 12.0, + } + ) + + cls.po2 = cls.purchase_order_obj.create( + { + "partner_id": cls.partner.id, + } + ) + cls.po2_line1 = cls.purchase_order_line_obj.create( + { + "order_id": cls.po2.id, + "product_id": cls.product1.id, + "product_uom_id": cls.product1.uom_id.id, + "name": cls.product1.name, + "price_unit": cls.product1.standard_price, + "date_planned": fields.Datetime.now(), + "product_qty": 10.0, + } + ) + cls.po2_line2 = cls.purchase_order_line_obj.create( + { + "order_id": cls.po2.id, + "product_id": cls.product2.id, + "product_uom_id": cls.product2.uom_id.id, + "name": cls.product2.name, + "price_unit": cls.product2.standard_price, + "date_planned": fields.Datetime.now(), + "product_qty": 22.0, + } + ) + + def test_01_purchase_order_manual_delivery(self): + """ + Confirm Purchase Order 1, check no incoming shipments have been + pre-created, create them manually (create one with one PO line, + add second PO line to same picking afterwards) + """ + # confirm RFQ + self.po1.button_confirm() + self.assertTrue(self.po1_line1.pending_to_receive) + self.assertTrue(self.po1_line2.pending_to_receive) + self.assertEqual(self.po1_line1.qty_in_receipt, 0) + self.assertEqual(self.po1_line2.qty_in_receipt, 0) + self.assertFalse( + self.po1.picking_ids, + "Purchase Manual Delivery: no picking should had been created", + ) + # create a manual delivery for one line (product1) + wizard = ( + self.env["create.stock.picking.wizard"] + .with_context( + **{ + "active_model": "purchase.order", + "active_id": self.po1.id, + "active_ids": self.po1.ids, + } + ) + .create({}) + ) + wizard.fill_lines(self.po1.order_line) + wizard.line_ids = wizard.line_ids - wizard.line_ids.filtered( + lambda li: li.product_id == self.product2 + ) + wizard.create_stock_picking() + # check picking is created + self.assertTrue( + self.po1.picking_ids, + 'Purchase Manual Delivery: picking \ + should be created after "manual delivery" wizard call', + ) + picking_id = self.po1.picking_ids[0] + # create a manual delivery, other product (product2) + wizard = ( + self.env["create.stock.picking.wizard"] + .with_context( + **{ + "active_model": "purchase.order", + "active_id": self.po1.id, + "active_ids": self.po1.ids, + } + ) + .create({}) + ) + wizard.fill_lines(self.po1.order_line) + self.assertEqual(len(wizard.line_ids), 1) + self.assertEqual(wizard.line_ids[0].product_id, self.product2) + + # The quantity is checked against the remaining quantity of the line + with self.assertRaisesRegex( + UserError, + "more than the remaining quantity", + ): + with self.env.cr.savepoint(): + wizard.line_ids.qty += 1 + wizard.create_stock_picking() + + wizard.picking_id = picking_id + wizard.create_stock_picking() + self.assertEqual( + len(self.po1.picking_ids), + 1, + "No extra picking should have been created", + ) + # create a manual delivery, no lines should be proposed + wizard = ( + self.env["create.stock.picking.wizard"] + .with_context( + **{ + "active_model": "purchase.order", + "active_id": self.po1.id, + "active_ids": self.po1.ids, + } + ) + .create({}) + ) + wizard.fill_lines(self.po1.order_line) + self.assertFalse( + wizard.line_ids, + "Purchase Manual Delivery: After picking \ + creation for all products, no lines should be left in the wizard", + ) + self.assertFalse(self.po1_line1.pending_to_receive) + self.assertFalse(self.po1_line2.pending_to_receive) + self.assertEqual(self.po1_line1.qty_in_receipt, self.po1_line1.product_qty) + self.assertEqual(self.po1_line2.qty_in_receipt, self.po1_line2.product_qty) + self.assertFalse(self.po1.pending_to_receive) + + # Process the picking + picking = self.po1.picking_ids + for move in picking.move_ids: + move.quantity = move.product_qty + picking.button_validate() + + # Process some returns + stock_return_picking_form = Form( + self.env["stock.return.picking"].with_context( + active_ids=picking.ids, + active_id=picking.id, + active_model=picking._name, + ) + ) + return_wiz = stock_return_picking_form.save() + return_wiz.product_return_moves.filtered( + lambda prm: prm.move_id.purchase_line_id == self.po1_line1 + ).write( + { + "quantity": 2, + "to_refund": True, + } + ) + return_wiz.product_return_moves.filtered( + lambda prm: prm.move_id.purchase_line_id == self.po1_line2 + ).write( + { + "quantity": 2, + "to_refund": False, + } + ) + return_wiz.action_create_returns() + + # The refund line is open to re-receive the returned item + self.assertTrue(self.po1_line1.pending_to_receive) + self.assertEqual(self.po1_line1.qty_in_receipt, -2) + # But the non-refund line is not + self.assertFalse(self.po1_line2.qty_in_receipt) + self.assertFalse(self.po1_line2.pending_to_receive) + + self.assertTrue(self.po1.pending_to_receive) + + def test_02_purchase_order_line_manual_delivery(self): + """ + Confirm Purchase Order 1 and 2, try to create incoming shipment + from two PO lines from different PO (error), create one reception + for two PO lines from same PO twice. + """ + # confirm RFQ + self.po1.button_confirm() + self.po2.button_confirm() + self.assertTrue(self.po1_line1.pending_to_receive) + self.assertTrue(self.po1_line2.pending_to_receive) + self.assertTrue(self.po2_line1.pending_to_receive) + self.assertTrue(self.po2_line2.pending_to_receive) + self.assertEqual(self.po1_line1.qty_in_receipt, 0) + self.assertEqual(self.po1_line2.qty_in_receipt, 0) + self.assertEqual(self.po2_line1.qty_in_receipt, 0) + self.assertEqual(self.po2_line2.qty_in_receipt, 0) + with self.assertRaises(UserError): + # create a manual delivery for two lines different PO + self.env["create.stock.picking.wizard"].with_context( + **{ + "active_model": "purchase.order.line", + "active_ids": [self.po1_line1.id, self.po2_line1.id], + } + ).create({}) + + # create a manual delivery for lines in PO2 + wizard = ( + self.env["create.stock.picking.wizard"] + .with_context( + **{ + "active_model": "purchase.order.line", + "active_ids": self.po2.order_line.ids, + } + ) + .create({}) + ) + wizard.fill_lines(self.po2.order_line) + wizard.create_stock_picking() + self.assertTrue( + self.po2.picking_ids, + 'Purchase Manual Delivery: picking \ + should be created after "manual delivery" wizard call', + ) + self.assertTrue(self.po1_line1.pending_to_receive) + self.assertTrue(self.po1_line2.pending_to_receive) + self.assertFalse(self.po2_line1.pending_to_receive) + self.assertFalse(self.po2_line2.pending_to_receive) + self.assertEqual(self.po1_line1.qty_in_receipt, 0) + self.assertEqual(self.po1_line2.qty_in_receipt, 0) + self.assertEqual(self.po2_line1.qty_in_receipt, self.po2_line1.product_qty) + self.assertEqual(self.po2_line2.qty_in_receipt, self.po2_line2.product_qty) + + def test_03_purchase_order_line_location(self): + """ + Confirm Purchase Order 1, create one reception changing the + location, check location has been correctly set in Picking. + """ + grp_multi_loc = self.env.ref("stock.group_stock_multi_locations") + self.env.user.write({"group_ids": [(4, grp_multi_loc.id, 0)]}) + # confirm RFQ + self.po1.button_confirm() + self.assertTrue(self.po1_line1.pending_to_receive) + self.assertTrue(self.po1_line2.pending_to_receive) + self.assertEqual(self.po1_line1.qty_in_receipt, 0) + self.assertEqual(self.po1_line2.qty_in_receipt, 0) + # create a manual delivery for one line (product1) + wizard = ( + self.env["create.stock.picking.wizard"] + .with_context( + **{ + "active_model": "purchase.order", + "active_id": self.po1.id, + "active_ids": self.po1.ids, + } + ) + .create({}) + ) + wizard.fill_lines(self.po1.order_line) + wizard.line_ids = wizard.line_ids - wizard.line_ids.filtered( + lambda li: li.product_id == self.product2 + ) + wizard.location_dest_id = self.shelf2 + wizard.create_stock_picking() + # check picking is created + picking_id = self.po1.picking_ids[0] + self.assertEqual(picking_id.location_dest_id, self.shelf2) + self.assertFalse(self.po1_line1.pending_to_receive) + self.assertTrue(self.po1_line2.pending_to_receive) + self.assertEqual(self.po1_line1.qty_in_receipt, self.po1_line1.product_qty) + self.assertEqual(self.po1_line2.qty_in_receipt, 0) + + def test_04_pending_to_receive(self): + """ + Checks if a purchase order line with existing quantity higher than + total quantity is not pending to receive + """ + # Create PO and PO Line + po_existing_bigger = self.purchase_order_obj.create( + { + "partner_id": self.partner.id, + } + ) + pol_existing_bigger = self.purchase_order_line_obj.create( + { + "order_id": po_existing_bigger.id, + "product_id": self.product1.id, + "product_uom_id": self.product1.uom_id.id, + "name": self.product1.name, + "price_unit": self.product1.standard_price, + "date_planned": fields.Datetime.now(), + "product_qty": 5.0, + } + ) + po_existing_bigger.button_confirm() + # create a manual delivery for line in po_existing_bigger + wizard = ( + self.env["create.stock.picking.wizard"] + .with_context( + **{ + "active_model": "purchase.order.line", + "active_ids": po_existing_bigger.order_line.ids, + } + ) + .create({}) + ) + wizard.fill_lines(po_existing_bigger.order_line) + wizard.line_ids.filtered( + lambda li: li.purchase_order_line_id.id == pol_existing_bigger.id + ).qty = 1 + wizard.create_stock_picking() + + # Change the done quantity to be bigger than the total needed + picking_id = po_existing_bigger.picking_ids[0] + picking_id.move_ids[0].quantity = 6 + picking_id.button_validate() + + # The PO Line should not be pending to receive + self.assertFalse(po_existing_bigger.pending_to_receive) + + def test_05_purchase_order_in_progress(self): + """ + Create a new Product and Purchase Order. + Confirm Purchase Order and create a Picking with only a partial amount of + the selected amount of the Purchase Order Line. Confirm the Picking. + The quantity in progress is the pending to receive quantity of the Purchase + Order Line. + """ + product_in_progress = self.env["product.product"].create( + { + "name": "Test product pending", + "type": "consu", + "is_storable": True, + "list_price": 1, + "standard_price": 1, + } + ) + po_in_progress = self.purchase_order_obj.create( + { + "partner_id": self.partner.id, + } + ) + self.purchase_order_line_obj.create( + { + "order_id": po_in_progress.id, + "product_id": product_in_progress.id, + "product_uom_id": product_in_progress.uom_id.id, + "name": product_in_progress.name, + "price_unit": product_in_progress.standard_price, + "date_planned": fields.Datetime.now(), + "product_qty": 5.0, + } + ) + po_in_progress.button_confirm() + location = self.env["stock.location"].browse( + po_in_progress.picking_type_id.default_location_dest_id.id + ) + wizard = ( + self.env["create.stock.picking.wizard"] + .with_context( + **{ + "active_model": "purchase.order", + "active_id": po_in_progress.id, + "active_ids": po_in_progress.ids, + } + ) + .create({}) + ) + wizard.fill_lines(po_in_progress.order_line) + wizard.line_ids[0].qty = 2 + wizard.create_stock_picking() + po_in_progress.picking_ids[0].button_validate() + + self.assertEqual(po_in_progress.order_line.qty_received, 2) + self.assertEqual(po_in_progress.order_line.qty_in_receipt, 0) + self.assertTrue(po_in_progress.order_line.pending_to_receive) + + qty, _ = product_in_progress._get_quantity_in_progress( + location_ids=location.ids + ) + self.assertEqual(qty.get((product_in_progress.id, location.id)), 3) + + wizard.line_ids[0].qty = 3 + wizard.create_stock_picking() + self.assertEqual(po_in_progress.order_line.qty_received, 2) + self.assertEqual(po_in_progress.order_line.qty_in_receipt, 3) + self.assertFalse(po_in_progress.order_line.pending_to_receive) + + def test_06_purchase_order_manual_delivery_double_validation(self): + """ + Confirm Purchase Order 1, check no incoming shipments have been + pre-created. Approve Purchase Order 1, check no incoming shipments + have been pre-created. + """ + self.user_purchase_user = mail_new_test_user( + self.env, + name="Pauline Poivraisselle", + login="pauline", + email="pur@example.com", + notification_type="inbox", + groups="purchase.group_purchase_user", + ) + + # make double validation two step + self.env.company.write( + {"po_double_validation": "two_step", "po_double_validation_amount": 2000.00} + ) + + # Create draft RFQ + po_vals = { + "partner_id": self.partner.id, + "order_line": [ + ( + 0, + 0, + { + "name": self.product1.name, + "product_id": self.product1.id, + "product_qty": 5.0, + "product_uom_id": self.product1.uom_id.id, + "price_unit": 5000000.0, + }, + ) + ], + } + self.po = ( + self.env["purchase.order"] + .with_user(self.user_purchase_user) + .create(po_vals) + ) + + # confirm RFQ + self.po.button_confirm() + self.assertTrue(self.po.order_line.pending_to_receive) + self.assertEqual(self.po.order_line.qty_in_receipt, 0) + self.assertFalse( + self.po.picking_ids, + "Purchase Manual Delivery: no picking should had been created", + ) + self.assertEqual(self.po.state, "to approve") + + # PO approved by manager + self.po.env.user.group_ids += self.env.ref("purchase.group_purchase_manager") + self.po.button_approve() + self.assertTrue(self.po.order_line.pending_to_receive) + self.assertEqual(self.po.order_line.qty_in_receipt, 0) + self.assertFalse( + self.po.picking_ids, + "Purchase Manual Delivery: no picking should had been created", + ) + self.assertEqual(self.po.state, "purchase") + + def test_07_purchase_order_ignore_manual_delivery(self): + """Manual delivery can be overridden with a context key during confirmation""" + self.po1.with_context(ignore_manual_delivery=True).button_confirm() + self.assertTrue( + self.po1.picking_ids, + "Context key failed to trigger picking creation", + ) + self.assertTrue( + self.po1.picking_ids.move_ids, + "Context key failed to trigger stock move creation", + ) + for line in self.po1.order_line: + self.assertFalse( + line.pending_to_receive, + "Context key did not create stock moves for all quantities", + ) + + def test_08_purchase_order_line_increase_quantity(self): + """Increasing the quantity on a confirmed line does not trigger delivery""" + self.po1.button_confirm() + self.assertFalse(self.po1.picking_ids) + self.po1.order_line[0].product_qty += 1 + self.assertFalse( + self.po1.picking_ids, + "Increasing the quantity on a confirmed line should not create deliveries", + ) + # Same on line creation + self.po1.order_line[0].copy() + self.assertFalse(self.po1.picking_ids) + self.assertFalse( + self.po1.picking_ids, + "Adding a line to a confirmed order should not create a delivery", + ) + # Context key forces the delivery + self.po1.order_line[0].with_context( + ignore_manual_delivery=True + ).product_qty += 1 + self.assertTrue( + self.po1.picking_ids, + "Passing context key when increasing the quantity on a confirmed line did " + "not create a delivery", + ) diff --git a/purchase_manual_delivery/tests/test_report_forecast.py b/purchase_manual_delivery/tests/test_report_forecast.py new file mode 100644 index 00000000000..6a4b8572020 --- /dev/null +++ b/purchase_manual_delivery/tests/test_report_forecast.py @@ -0,0 +1,71 @@ +from odoo import fields + +from odoo.addons.stock.tests.test_report import TestReportsCommon + + +class TestReportForecast(TestReportsCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env.company.purchase_manual_delivery = True + cls.partner = cls.env["res.partner"].create({"name": "Test Vendor"}) + # Purchase Orders + cls.po1 = cls.env["purchase.order"].create( + { + "partner_id": cls.partner.id, + } + ) + cls.po1_line1 = cls.env["purchase.order.line"].create( + { + "order_id": cls.po1.id, + "product_id": cls.product.id, + "product_uom_id": cls.product.uom_id.id, + "name": cls.product.name, + "price_unit": cls.product.standard_price, + "date_planned": fields.Datetime.now(), + "product_qty": 42.0, + } + ) + + def test_report_forecast(self): + """PO quantities without deliveries are mentioned on the forecast report""" + self.po1.button_confirm() + # Create delivery for a part of the ordered quantity + wizard = ( + self.env["create.stock.picking.wizard"] + .with_context( + **{ + "active_model": "purchase.order", + "active_id": self.po1.id, + "active_ids": self.po1.ids, + } + ) + .create({}) + ) + wizard.fill_lines(self.po1.order_line) + # Transfer a quantity of 12 + wizard.line_ids.qty = 12 + wizard.create_stock_picking() + picking = self.po1.picking_ids + picking.move_line_ids.quantity = 12 + picking.button_validate() + + # Create an unvalidated picking with a quantity of 23 + wizard.line_ids.qty = 23 + wizard.create_stock_picking() + + # Checks the report. + report_values, docs, lines = self.get_report_forecast( + product_template_ids=self.product_template.ids + ) + product_data = docs["product"][self.product.id] + self.assertEqual( + self.sum_dicts(docs["product"], "no_delivery_purchase_qty")["in"], 7 + ) + self.assertEqual(self.sum_dicts(docs["product"], "qty")["in"], 7) + self.assertEqual(product_data["quantity_on_hand"], 12) + self.assertEqual(product_data["virtual_available"], 35) + self.assertEqual( + product_data["no_delivery_purchase_orders"], + [{"id": self.po1.id, "name": self.po1.name}], + ) diff --git a/purchase_manual_delivery/views/purchase_order_line_views.xml b/purchase_manual_delivery/views/purchase_order_line_views.xml new file mode 100644 index 00000000000..a2d668e2ce6 --- /dev/null +++ b/purchase_manual_delivery/views/purchase_order_line_views.xml @@ -0,0 +1,42 @@ + + + + purchase.order.line + + + + state == 'purchase' and pending_to_receive + + + + + + + + + + + + purchase.order.line + + + + + + + + + + diff --git a/purchase_manual_delivery/views/purchase_order_views.xml b/purchase_manual_delivery/views/purchase_order_views.xml new file mode 100644 index 00000000000..75f84513e76 --- /dev/null +++ b/purchase_manual_delivery/views/purchase_order_views.xml @@ -0,0 +1,39 @@ + + + + purchase.order.form + purchase.order + + + + +
+ + + +Odoo Community Association + +
+

Purchase Manual Delivery

+ +

Beta License: AGPL-3 OCA/purchase-workflow Translate me on Weblate Try me on Runboat

+

The goal of this module is to allow the manual creation of incoming +shipments. When installed, a purchase order won’t impact directly the +stock. It will not create the pickings upon order confirmation. It +allows the reception and the impact on stock to be done manually when +needed. The goal is to be used when a supplier does not confirm the full +order at once. As the supplier confirms the different purchase order +lines, the user can manually create the incoming shipments for those +specific lines.

+

Table of contents

+ +
+

Configuration

+

The Manual delivery checkbox can be edited on any RFQ, on the +Other Information tab. To set the default value for new POs, go to +Settings -> Purchase -> Delivery.

+
+
+

Usage

+

There are two main ways to use this module:

+
    +
  • From Purchase Order
  • +
+

When creating a purchase order and confirming it, no picking will be +automatically created. Lines with pending quantities to receive will +appear in blue color, to create the manual picking press the button +“Create Incoming Shipment”:

+

image1

+

This will trigger the wizard that lets the user choose which lines +should be taken for the creation of the picking and also the quantities. +Clicking on the “Create and View Picking” will create the reception and +redirect the user to the picking form.

+

image2

+
    +
  • From Purchase Order Line
  • +
+

The module adds a new list view for Purchase Order Lines (in Purchase +Menu). From there you can select multiple PO lines (in this base module +only PO lines from same PO can be selected) and create the manual +delivery. Follow the same steps as above to manually generate the +incoming shipment.

+

If, as a developer, you need to override the behaviour you can call +purchase.order’s button_confirm with context key +ignore_manual_delivery=True.

+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • ForgeFlow S.L.
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/purchase-workflow project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+