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 00000000000..e5c923de0c0 Binary files /dev/null and b/purchase_manual_delivery/static/description/create_incoming_shipment_button.png differ diff --git a/purchase_manual_delivery/static/description/create_incoming_shipment_wizard.png b/purchase_manual_delivery/static/description/create_incoming_shipment_wizard.png new file mode 100644 index 00000000000..a06f453a1f2 Binary files /dev/null and b/purchase_manual_delivery/static/description/create_incoming_shipment_wizard.png differ diff --git a/purchase_manual_delivery/static/description/icon.png b/purchase_manual_delivery/static/description/icon.png new file mode 100644 index 00000000000..3a0328b516c Binary files /dev/null and b/purchase_manual_delivery/static/description/icon.png differ 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 + + + +
+ + + +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.

+
+
+
+
+ + 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 + + + + +