diff --git a/l10n_it_delivery_note/README.rst b/l10n_it_delivery_note/README.rst new file mode 100644 index 000000000000..01cdaa53d3d7 --- /dev/null +++ b/l10n_it_delivery_note/README.rst @@ -0,0 +1,256 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + +============================ +ITA - Documento di trasporto +============================ + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:05daf68e0e845d5fae362d9834e53df7355843dd8e26c92c7543b68e02f0d519 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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%2Fl10n--italy-lightgray.png?logo=github + :target: https://github.com/OCA/l10n-italy/tree/19.0/l10n_it_delivery_note + :alt: OCA/l10n-italy +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/l10n-italy-19-0/l10n-italy-19-0-l10n_it_delivery_note + :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/l10n-italy&target_branch=19.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +**English** + +This module manage the Italian DDT (Delivery note). + +From a picking is possible to generate a Delivery Note and group more +picking in one delivery note. It's also possible to invoice from the +delivery note form. + +This module is alternative to ``l10n_it_ddt``, it follows the Odoo way +to process sale orders, pickings and invoices. + +You can't have both ``l10n_it_ddt`` and ``l10n_it_delivery_note`` +installed together. + +There are two available settings: + +- Base (default): one picking, one DN. +- Advanced: more picking in one DN. + +**Italiano** + +Questo modulo consente di gestire i DDT. + +Da un prelievo è possibile generare un DDT e raggruppare più prelievi in +un DDT. È anche possibile fatturare dalla scheda del DDT. + +Questo modulo è un alternativa al modulo ``l10n_it_ddt``, segue la +modalità Odoo di gestire ordini di vendita, prelievi e fatture. + +Non è possibile avere installati contemporaneamente ``l10n_it_ddt`` e +``l10n_it_delivery_note``. + +Ci sono due impostazioni possibili. + +- Base (predefinita): un prelievo, un DDT. +- Avanzata: più prelievi in un DDT. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +To configure this module, go to: + +1. *Inventory → Configuration → Settings - Delivery Notes* + + Checking 'Use Advanced DN Features' allows you to manage more picking + on one delivery note. + + Checking 'Display Ref. Order in Delivery Note Report' or 'Display + Ref. Customer in Delivery Note Report" enables in report fields + relating DN line to SO (if applicable). + + Checking 'Display Carrier in Delivery Note Report' enables in report + field 'Carrier'. + + Checking 'Display Delivery Method in Delivery Note Report' enables in + report field 'Delivery Method'. + +2. *Inventory → Configuration → Warehouse Management → Delivery Note + Types* + + In delivery note type you can specify if the product price have to be + printed in the delivery note report/slip. + + - *Inventory → Configuration → Delivery Notes → Conditions of + Transport* + - *Inventory → Configuration → Delivery Notes → Appearances of + Goods* + - *Inventory → Configuration → Delivery Notes → Reasons of + Transport* + - *Inventory → Configuration → Delivery Notes → Methods of + Transport* + +3. *Settings → User & Companies → Users* + + In the user profile settings, "Show product information in DN lines" + allows showing prices in the form. + +Usage +===== + +Funzionalità base +----------------- + +Quando un prelievo viene validato compare una scheda DDT. + +Nella scheda fare clic su "Crea nuovo", si apre un procedura guidata +dove scegliere il tipo di DDT, quindi confermare. Immettere i dati +richiesti e poi fare clic su "Valida" per numerare il DDT. + +Una volta validato, è possibile emettere fattura direttamente dal DDT se +il DDT stesso è di tipo consegna a cliente (In uscita) e si hanno i +permessi sull'utente. + +È possibile annullare il DDT, reimpostarlo a bozza e poi modificarlo. Se +il DDT è fatturato il numero e la data non sono modificabili. + +Per i trasferimenti tra magazzini creare un prelievo di tipo interno con +le relative ubicazioni. Validare il prelievo visualizza la scheda DDT. + +È possibile anche avere DDT in ingresso, ovvero dopo la validazione del +prelievo selezionare la scheda per indicare il numero del DDT fornitore +e la data. + +Funzionalità avanzata +--------------------- + +Vengono attivate varie funzionalità aggiuntive: + +- più prelievi per un DDT +- selezione multipla di prelievi e generazione dei DDT +- aggiunta righe nota e righe sezione descrittive. +- lista dei DDT. + +Il report DDT stampa in righe aggiuntive i lotti/seriali e le scadenze +del prodotto. + +Il prezzo può essere indicato anche nel report DDT se nel tipo DDT è +indicata la stampa prezzi. La visibilità dei prezzi si trova nei +permessi dell'utente. + +Le fatture generate dai DDT contengono i riferimenti al DDT stesso nelle +righe nota. + +Accesso da portale +------------------ + +Gli utenti portal hanno la possibilità di scaricare i report dei DDT di +cui loro o la loro azienda padre sono impostati come destinatari o +indirizzo di spedizione. + +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 +------- + +* Marco Calcagni +* Gianmarco Conte +* Link IT Europe Srl + +Contributors +------------ + +- Riccardo Bellanova + +- Matteo Bilotta + +- Giuseppe Borruso + +- Marco Calcagni + +- Marco Colombo + +- Gianmarco Conte + +- Letizia Freda + +- Andrea Piovesana + +- Alex Comba + +- `Ooops `__: + + - Giovanni Serra + - Foresti Francesco + +- Nextev Srl + +- `PyTech-SRL `__: + + - Alessandro Uffreduzzi + - Sebastiano Picchi + +- `Aion Tech `__: + + - Simone Rubino + +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. + +.. |maintainer-MarcoCalcagni| image:: https://github.com/MarcoCalcagni.png?size=40px + :target: https://github.com/MarcoCalcagni + :alt: MarcoCalcagni +.. |maintainer-aleuffre| image:: https://github.com/aleuffre.png?size=40px + :target: https://github.com/aleuffre + :alt: aleuffre +.. |maintainer-renda-dev| image:: https://github.com/renda-dev.png?size=40px + :target: https://github.com/renda-dev + :alt: renda-dev + +Current `maintainers `__: + +|maintainer-MarcoCalcagni| |maintainer-aleuffre| |maintainer-renda-dev| + +This module is part of the `OCA/l10n-italy `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/l10n_it_delivery_note/__init__.py b/l10n_it_delivery_note/__init__.py new file mode 100644 index 000000000000..fc14bda2a832 --- /dev/null +++ b/l10n_it_delivery_note/__init__.py @@ -0,0 +1,6 @@ +# Copyright 2023 Nextev Srl +from . import controllers +from . import mixins +from . import models +from . import wizard +from .hooks import post_init_hook diff --git a/l10n_it_delivery_note/__manifest__.py b/l10n_it_delivery_note/__manifest__.py new file mode 100644 index 000000000000..982af15b528d --- /dev/null +++ b/l10n_it_delivery_note/__manifest__.py @@ -0,0 +1,69 @@ +# Copyright 2014-2019 Dinamiche Aziendali srl +# (http://www.dinamicheaziendali.it/) +# @author: Marco Calcagni +# @author: Gianmarco Conte +# Copyright (c) 2019, Link IT Europe Srl +# @author: Matteo Bilotta +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +# noinspection PyStatementEffect +{ + "name": "ITA - Documento di trasporto", + "summary": "Crea, gestisce e fattura i DDT partendo dalle consegne", + "author": "Marco Calcagni, Gianmarco Conte, Link IT Europe Srl, " + "Odoo Community Association (OCA)", + "website": "https://github.com/OCA/l10n-italy", + "version": "19.0.1.0.0", + "category": "Localization/Italy", + "license": "AGPL-3", + "maintainers": ["MarcoCalcagni", "aleuffre", "renda-dev"], + "depends": [ + "delivery_carrier_partner", + "mail", + "sale", + "sale_stock", + # "stock_account", + "stock_delivery", + "portal", + "product", + ], + "data": [ + "security/ir.model.access.csv", + "security/ir_module_category.xml", + "security/ir_rule.xml", + "security/res_groups.xml", + "security/res_users.xml", + "data/delivery_note_data.xml", + "report/delivery_data.xml", + "report/report_delivery_note.xml", + "views/account_move.xml", + "views/res_config_settings.xml", + "views/res_partner.xml", + "views/sale_order.xml", + "views/stock_delivery_note_type.xml", + "views/stock_picking_goods_appearance.xml", + "views/stock_picking_transport_condition.xml", + "views/stock_picking_transport_method.xml", + "views/stock_picking_transport_reason.xml", + "views/stock_delivery_note.xml", + "views/stock_picking.xml", + "views/portal_templates.xml", + "views/portal_my_delivery_notes.xml", + "wizard/delivery_note_confirm.xml", + "wizard/delivery_note_create.xml", + "wizard/delivery_note_invoice.xml", + "wizard/delivery_note_select.xml", + "wizard/delivery_note_template.xml", + "wizard/sale_advance_payment_inv.xml", + ], + "demo": [ + "demo/res_partner_demo.xml", + "demo/delivery_carrier_demo.xml", + ], + "assets": { + "web.assets_backend": [ + "l10n_it_delivery_note/static/src/scss/stock_delivery_note.scss", + ], + }, + "post_init_hook": "post_init_hook", +} diff --git a/l10n_it_delivery_note/controllers/__init__.py b/l10n_it_delivery_note/controllers/__init__.py new file mode 100644 index 000000000000..f784c2f06377 --- /dev/null +++ b/l10n_it_delivery_note/controllers/__init__.py @@ -0,0 +1,4 @@ +# Copyright 2019 Simone Rubino - Agile Business Group +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import portal diff --git a/l10n_it_delivery_note/controllers/portal.py b/l10n_it_delivery_note/controllers/portal.py new file mode 100644 index 000000000000..396e6603828e --- /dev/null +++ b/l10n_it_delivery_note/controllers/portal.py @@ -0,0 +1,154 @@ +from odoo.exceptions import AccessError, MissingError +from odoo.fields import Domain +from odoo.http import request, route + +from odoo.addons.portal.controllers.portal import CustomerPortal +from odoo.addons.portal.controllers.portal import pager as portal_pager + + +class DNCustomerPortal(CustomerPortal): + def _get_delivery_note_domain(self): + return Domain("state", "in", ["confirm", "invoiced", "done"]) + + def _prepare_home_portal_values(self, counters): + values = super()._prepare_home_portal_values(counters) + if "dn_count" in counters: + dn_count = ( + request.env["stock.delivery.note"].search_count( + self._get_delivery_note_domain() + ) + if request.env["stock.delivery.note"].has_access("read") + else 0 + ) + values["dn_count"] = dn_count + return values + + def _get_delivery_notes_searchbar_sortings(self): + return { + "date": {"label": self.env._("Delivery Note Date"), "order": "date desc"}, + "name": {"label": self.env._("Delivery Note #"), "order": "name"}, + } + + def _get_delivery_notes_searchbar_inputs(self): + return { + "name": {"input": "name", "label": self.env._("Search in Description")}, + } + + def _prepare_my_delivery_notes_values( + self, + page=1, + date_begin=None, + date_end=None, + sortby=None, + search="", + search_in="name", + **kwargs, + ): + values = self._prepare_portal_layout_values() + DeliveryNote = request.env["stock.delivery.note"] + + url = "/my/delivery-notes" + _items_per_page = 100 + + # default sortby order + if not sortby: + sortby = "date" + + searchbar_sortings = self._get_delivery_notes_searchbar_sortings() + searchbar_inputs = self._get_delivery_notes_searchbar_inputs() + + sort_order = searchbar_sortings[sortby]["order"] + domain = self._get_delivery_note_domain() + + if date_begin and date_end: + domain &= Domain([("date", ">", date_begin), ("date", "<=", date_end)]) + + if search and search_in: + search_domain = [] + if search_in == "name": + search_domain = Domain.OR([search_domain, [("name", "ilike", search)]]) + domain &= Domain(search_domain) + + pager_values = portal_pager( + url=url, + total=DeliveryNote.search_count(domain), + page=page, + step=_items_per_page, + url_args={ + "date_begin": date_begin, + "date_end": date_end, + "sortby": sortby, + "search_in": search_in, + "search": search, + }, + ) + + delivery_note = DeliveryNote.search( + domain, + order=sort_order, + limit=_items_per_page, + offset=pager_values["offset"], + ) + + values.update( + { + "date": date_begin, + "delivery_notes": delivery_note, + "page_name": "delivery_notes", + "default_url": url, + "pager": pager_values, + "searchbar_sortings": searchbar_sortings, + "searchbar_inputs": searchbar_inputs, + "search_in": search_in, + "search": search, + "sortby": sortby, + } + ) + return values + + @route( + ["/my/delivery-notes", "/my/delivery-notes/page/"], + type="http", + auth="user", + website=True, + ) + def portal_my_delivery_notes(self, **kwargs): + values = self._prepare_my_delivery_notes_values(**kwargs) + request.session["my_delivery_notes_history"] = values["delivery_notes"].ids[ + :100 + ] + return request.render("l10n_it_delivery_note.portal_my_delivery_notes", values) + + def _dn_get_page_view_values(self, dn, access_token, **kwargs): + values = { + "page_name": "delivery_note", + "dn": dn, + } + return self._get_page_view_values( + dn, access_token, values, "my_dn_history", False, **kwargs + ) + + @route(["/my/delivery-notes/"], type="http", auth="user", website=True) + def portal_my_delivery_note_detail( + self, dn_id, access_token=None, report_type=None, download=False, **kwargs + ): + try: + delivery_note_sudo = self._document_check_access( + "stock.delivery.note", dn_id, access_token=access_token + ) + except (AccessError, MissingError): + return request.redirect("/my") + + if report_type in ("html", "pdf", "text"): + return self._show_report( + model=delivery_note_sudo, + report_type=report_type, + report_ref="l10n_it_delivery_note.delivery_note_report_action", + download=download, + ) + + values = self._dn_get_page_view_values( + delivery_note_sudo, access_token, **kwargs + ) + + return request.render("l10n_it_delivery_note.portal_delivery_note_page", values) diff --git a/l10n_it_delivery_note/data/delivery_note_data.xml b/l10n_it_delivery_note/data/delivery_note_data.xml new file mode 100644 index 000000000000..acebb121ab47 --- /dev/null +++ b/l10n_it_delivery_note/data/delivery_note_data.xml @@ -0,0 +1,53 @@ + + + + + + Carriage paid + + + Carriage forward + + + Charged in invoice + + + + + Box + + + Pallet + + + Bulk + + + Box / Pallet + + + + + Sale + + + Goods on approval + + + Returned + + + + + Sender + + + Recipient + + + Carrier + + diff --git a/l10n_it_delivery_note/demo/delivery_carrier_demo.xml b/l10n_it_delivery_note/demo/delivery_carrier_demo.xml new file mode 100644 index 000000000000..587a2cb52062 --- /dev/null +++ b/l10n_it_delivery_note/demo/delivery_carrier_demo.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/l10n_it_delivery_note/demo/res_partner_demo.xml b/l10n_it_delivery_note/demo/res_partner_demo.xml new file mode 100644 index 000000000000..d65375002234 --- /dev/null +++ b/l10n_it_delivery_note/demo/res_partner_demo.xml @@ -0,0 +1,10 @@ + + + + Carrier 1 + + + + Carrier 2 + + diff --git a/l10n_it_delivery_note/hooks.py b/l10n_it_delivery_note/hooks.py new file mode 100644 index 000000000000..fcd5cc47fd75 --- /dev/null +++ b/l10n_it_delivery_note/hooks.py @@ -0,0 +1,11 @@ +# Copyright 2023 Nextev Srl + + +def post_init_hook(env): + """ + Create DN types and their sequences after installing the module + if they're not already exist + """ + companies = env["res.company"].search([]) + for company in companies: + env["stock.delivery.note.type"].create_dn_types(company) diff --git a/l10n_it_delivery_note/i18n/it.po b/l10n_it_delivery_note/i18n/it.po new file mode 100644 index 000000000000..0c3cda844292 --- /dev/null +++ b/l10n_it_delivery_note/i18n/it.po @@ -0,0 +1,2470 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * l10n_it_delivery_note +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-01-08 14:45+0000\n" +"PO-Revision-Date: 2025-11-25 11:42+0000\n" +"Last-Translator: mymage \n" +"Language-Team: \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: l10n_it_delivery_note +#: model:ir.module.category,description:l10n_it_delivery_note.module_category_inventory_checkboxes +msgid "" +"\n" +" Define some other extra rights on inventory management.\n" +" " +msgstr "" +"\n" +" Definire altri diritti aggiuntivi sulla gestione " +"dell'inventario.\n" +" " + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note.py:0 +msgid "%s hasn't sale order!" +msgstr "%s non ha un ordine di vendita!" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note.py:0 +msgid "%s is already invoiced!" +msgstr "%s è già fatturato!" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note.py:0 +msgid "%s is in draft!" +msgstr "%s è in bozza!" + +#. module: l10n_it_delivery_note +#: model:ir.actions.report,print_report_name:l10n_it_delivery_note.delivery_note_report_action +msgid "'Delivery Note - %s' % object.display_name" +msgstr "'Documento di trasporto - %s' % object.display_name" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.portal_delivery_note_page +msgid " Download" +msgstr " Scarica" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_select_form_view +msgid "" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.sale_advance_payment_inv_form_view +msgid " Warning!" +msgstr " Attenzione!" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +msgid "" +"\n" +" \n" +" Warning!\n" +" \n" +" Inconsistent DN info in sale orders!" +msgstr "" +"\n" +" \n" +" Attenzione!\n" +" \n" +" Informazioni di consegna inconsistenti " +"nell'ordine di vendita!" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "" +" Delivery Note: \n" +" Under the terms of Italian Presidential Decree " +"472-96 of 14.08.1996" +msgstr "" +"Documento di trasporto:\n" +" Ai sensi del DPR 472-96 del 14.08.1996" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_data +msgid "Carriage Condition" +msgstr "Condizione di Trasporto" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "Carrier:" +msgstr "Vettore:" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "Delivery Method:" +msgstr "Metodo di consegna:" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_data +msgid "Method of Transport / Carrier" +msgstr "Metodo di trasporto / Vettore" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_data +msgid "Method of Transport:" +msgstr "Metodo di trasporto:" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.sale_advance_payment_inv_form_view +msgid "" +"N.B.: there will be no way, subsequently, to restore\n" +" this binding between the delivery note lines with " +"the related sales order." +msgstr "" +"N.B.: non ci sarà modo, a posteriori, di ripristinare\n" +" il legame tra righe del DdT con il rispettivo ordine " +"di vendita." + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_data +msgid "Reason of Transport" +msgstr "Causale di trasporto" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "Warehouse:" +msgstr "Magazzino:" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,help:l10n_it_delivery_note.field_stock_delivery_note_line__product_description +msgid "" +"A description of the Product that you want to communicate to your customers. " +"This description will be copied to every Sales Order, Delivery Order and " +"Customer Invoice/Credit Note" +msgstr "" +"Una descrizione del prodotto che si vuole comunicare al cliente. Questa " +"descrizione verrà copiata in ogni ordine di vendita, ordine di spedizione e " +"fattura/nota di credito del cliente" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__access_warning +msgid "Access warning" +msgstr "Avviso accesso" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__message_needaction +msgid "Action Needed" +msgstr "Azione richiesta" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__active +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_type__active +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_goods_appearance__active +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_condition__active +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_method__active +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_reason__active +msgid "Active" +msgstr "Attivo" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__activity_ids +msgid "Activities" +msgstr "Attività" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "Decorazione eccezione attività" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__activity_state +msgid "Activity State" +msgstr "Stato attività" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__activity_type_icon +msgid "Activity Type Icon" +msgstr "Icona tipo attività" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_type__next_sequence_number +msgid "Actual Next Number" +msgstr "Prossimo numero attuale" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +msgid "Add a note" +msgstr "Aggiungi un commento" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +msgid "Add a section" +msgstr "Aggiungi una sezione" + +#. module: l10n_it_delivery_note +#: model:res.groups,name:l10n_it_delivery_note.can_change_number +msgid "Allow to change delivery note number" +msgstr "Consentire modifica numero documento di trasporto" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_goods_appearance__name +msgid "Appearance name" +msgstr "Nome dell'aspetto" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_stock_picking_goods_appearance +msgid "Appearance of Goods" +msgstr "Aspetto dei beni" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_res_partner__default_goods_appearance_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_res_users__default_goods_appearance_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_sale_order__default_goods_appearance_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__goods_appearance_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_type__default_goods_appearance_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__goods_appearance_id +msgid "Appearance of goods" +msgstr "Aspetto dei beni" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_l10n_it_delivery_note_delivery_mixin__delivery_goods_appearance_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__delivery_goods_appearance_id +msgid "Appearance of goods of Delivery" +msgstr "Aspetto dei beni della consegna" + +#. module: l10n_it_delivery_note +#: model:ir.actions.act_window,name:l10n_it_delivery_note.stock_picking_goods_appearance_action +#: model:ir.ui.menu,name:l10n_it_delivery_note.stock_picking_good_appearance_menu +msgid "Appearances of goods" +msgstr "Aspetti dei beni" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_type_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_goods_appearance_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_transport_condition_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_transport_method_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_transport_reason_form_view +msgid "Archived" +msgstr "In archivio" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/mixins/picking_checker.py:0 +msgid "" +"At least one picking you've selected appears to be already related to " +"another delivery note." +msgstr "" +"Almeno un prelievo tra quelli selezionati è già legato ad un altro DdT." + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/mixins/picking_checker.py:0 +msgid "At least one picking you've selected doesn't appear to be completed." +msgstr "Almeno un prelievo tra quelli selezionati non è stato completato." + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__message_attachment_count +msgid "Attachment Count" +msgstr "Numero allegati" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.res_config_settings_form_view +msgid "" +"Block the validation of incoming DNs if the\n" +" \"Partner reference\" field is not set." +msgstr "" +"Blocca la validazione di DdT in entrata se il\n" +" campo \"Riferimento partner\" non è " +"valorizzato." + +#. module: l10n_it_delivery_note +#: model:stock.picking.goods.appearance,name:l10n_it_delivery_note.goods_appearance_CAR +msgid "Box" +msgstr "Scatola" + +#. module: l10n_it_delivery_note +#: model:stock.picking.goods.appearance,name:l10n_it_delivery_note.goods_appearance_CBA +msgid "Box / Pallet" +msgstr "Cartone / Bancale" + +#. module: l10n_it_delivery_note +#: model:stock.picking.goods.appearance,name:l10n_it_delivery_note.goods_appearance_SFU +msgid "Bulk" +msgstr "Sfusi" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__can_be_invoiced +msgid "Can Be Invoiced" +msgstr "Può essere fatturato" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__can_change_number +msgid "Can Change Number" +msgstr "Può cambiare numero" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_location.py:0 +msgid "" +"Can't find a default virtual locations root.\n" +"Ask your system administrator to set it from the Warehouse configurations " +"page before continue." +msgstr "" +"Impossibile trovare una rotta di ubicazioni virtuali predefinita.\n" +"Chiedi al tuo amministratore di sistema di impostarlo dalla pagina delle " +"configurazioni del magazzino prima di continuare." + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_confirm_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_create_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_select_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.view_stock_delivery_note_invoice_wizard +msgid "Cancel" +msgstr "Annulla" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_delivery_note__state__cancel +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_form_view +msgid "Cancelled" +msgstr "Annullato" + +#. module: l10n_it_delivery_note +#: model:stock.picking.transport.condition,name:l10n_it_delivery_note.transport_condition_PA +msgid "Carriage forward" +msgstr "Porto assegnato" + +#. module: l10n_it_delivery_note +#: model:stock.picking.transport.condition,name:l10n_it_delivery_note.transport_condition_PF +msgid "Carriage paid" +msgstr "Porto franco" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__carrier_id +#: model:stock.picking.transport.method,name:l10n_it_delivery_note.transport_method_COR +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_form_view +msgid "Carrier" +msgstr "Vettore" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_l10n_it_delivery_note_delivery_mixin__delivery_carrier_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__delivery_carrier_id +msgid "Carrier of Delivery" +msgstr "Vettore della consegna" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.parcels_data +msgid "Carrier's Signature" +msgstr "Firma del vettore" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +msgid "Carriers" +msgstr "Vettori" + +#. module: l10n_it_delivery_note +#: model:stock.picking.transport.condition,name:l10n_it_delivery_note.transport_condition_PAF +msgid "Charged in invoice" +msgstr "Con addebito in fattura" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_l10n_it_delivery_note_delivery_mixin +msgid "Common data for records to be delivered" +msgstr "Dati comuni per i record da consegnare" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.portal_delivery_note_page +msgid "Communication history" +msgstr "Cronologia comunicazioni" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_res_company +msgid "Companies" +msgstr "Aziende" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__company_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__company_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_type__company_id +msgid "Company" +msgstr "Azienda" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_condition__name +msgid "Condition name" +msgstr "Nome condizione" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_stock_picking_transport_condition +msgid "Condition of Transport" +msgstr "Condizione di trasporto" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_res_partner__default_transport_condition_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_res_users__default_transport_condition_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_sale_order__default_transport_condition_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__transport_condition_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_type__default_transport_condition_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__transport_condition_id +msgid "Condition of transport" +msgstr "Condizione di trasporto" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_l10n_it_delivery_note_delivery_mixin__delivery_transport_condition_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__delivery_transport_condition_id +msgid "Condition of transport of Delivery" +msgstr "Condizione di trasporto della consegna" + +#. module: l10n_it_delivery_note +#: model:ir.actions.act_window,name:l10n_it_delivery_note.stock_picking_transport_condition_action +#: model:ir.ui.menu,name:l10n_it_delivery_note.stock_picking_transport_condition_menu +msgid "Conditions of transport" +msgstr "Condizioni di trasporto" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_res_config_settings +msgid "Config Settings" +msgstr "Impostazioni di configurazione" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__sale_advance_payment_inv__step__confirm +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_confirm_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_create_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_select_form_view +msgid "Confirm" +msgstr "Conferma" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_res_partner +msgid "Contact" +msgstr "Contatto" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.view_stock_delivery_note_invoice_wizard +msgid "Create Invoice" +msgstr "Crea fattura" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_picking.py:0 +#: model:ir.actions.act_window,name:l10n_it_delivery_note.stock_delivery_note_create_action +msgid "Create a new delivery note" +msgstr "Crea un nuovo DdT" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_form_view +msgid "Create invoice" +msgstr "Crea fattura" + +#. module: l10n_it_delivery_note +#: model:ir.actions.act_window,name:l10n_it_delivery_note.action_stock_delivery_note_invoice_wizard +msgid "Create invoices" +msgstr "Crea fatture" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_form_view +msgid "Create new" +msgstr "Crea nuovo" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__create_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_confirm_wizard__create_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_create_wizard__create_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_invoice_wizard__create_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__create_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_select_wizard__create_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_type__create_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_goods_appearance__create_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_condition__create_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_method__create_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_reason__create_uid +msgid "Created by" +msgstr "Creato da" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__create_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_confirm_wizard__create_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_create_wizard__create_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_invoice_wizard__create_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__create_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_select_wizard__create_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_type__create_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_goods_appearance__create_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_condition__create_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_method__create_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_reason__create_date +msgid "Created on" +msgstr "Creato il" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__currency_id +msgid "Currency" +msgstr "Valuta" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_sale_advance_payment_inv__step +msgid "Current step" +msgstr "Passo corrente" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "Customer" +msgstr "Cliente" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,help:l10n_it_delivery_note.field_stock_delivery_note__access_url +msgid "Customer Portal URL" +msgstr "URL portale cliente" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__sale_order_client_ref +msgid "Customer Reference" +msgstr "Riferimento cliente" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__delivery_note_carrier_id +msgid "DN Carrier" +msgstr "DdT Vettore" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__delivery_note_date +msgid "DN Date" +msgstr "Data Trasporto" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__picking_type_code +msgid "DN Operation Type" +msgstr "Tipo di operazione DdT" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__packages +msgid "DN Packages" +msgstr "Imballaggi DdT" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__delivery_note_state +msgid "DN State" +msgstr "Stato DdT" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__delivery_note_volume +msgid "DN Volume" +msgstr "Volume DdT" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_base_wizard__date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_create_wizard__date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_select_wizard__date +msgid "Date" +msgstr "Data" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +msgid "Dates" +msgstr "Date" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_tree_view +msgid "Delivery Method" +msgstr "Metodo di consegna" + +#. module: l10n_it_delivery_note +#: model:ir.actions.report,name:l10n_it_delivery_note.delivery_note_report_action +#: model:ir.model,name:l10n_it_delivery_note.model_stock_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_account_move_line__delivery_note_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_sale_order__delivery_note_ids +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_confirm_wizard__delivery_note_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__delivery_note_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_select_wizard__delivery_note_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__delivery_note_id +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_form_view +msgid "Delivery Note" +msgstr "DdT" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/account_invoice.py:0 +msgid "Delivery Note \"%(ddt_name)s\" of %(ddt_date)s" +msgstr "DdT \"%(ddt_name)s\" del %(ddt_date)s" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/controllers/portal.py:0 +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.portal_my_delivery_notes +msgid "Delivery Note #" +msgstr "N° DdT" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_stock_delivery_note_base_wizard +msgid "Delivery Note Base" +msgstr "Base DdT" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_stock_delivery_note_confirm_wizard +msgid "Delivery Note Confirm" +msgstr "Conferma DdT" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_account_bank_statement_line__delivery_note_count +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_account_move__delivery_note_count +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_sale_order__delivery_note_count +msgid "Delivery Note Count" +msgstr "Conto DdT" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_stock_delivery_note_create_wizard +msgid "Delivery Note Creator" +msgstr "Autore DdT" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/controllers/portal.py:0 +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.portal_my_delivery_notes +msgid "Delivery Note Date" +msgstr "Data DdT" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__delivery_note_draft +msgid "Delivery Note Draft" +msgstr "DdT in bozza" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__delivery_note_exists +msgid "Delivery Note Exists" +msgstr "Esiste DdT" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_stock_delivery_note_invoice_wizard +msgid "Delivery Note Invoice" +msgstr "Fattura DdT" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_stock_delivery_note_line +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_sale_order_line__delivery_note_line_ids +msgid "Delivery Note Line" +msgstr "Riga DdT" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__delivery_note_readonly +msgid "Delivery Note Readonly" +msgstr "DdT in sola lettura" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_stock_delivery_note_select_wizard +msgid "Delivery Note Selector" +msgstr "Selettore DdT" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__delivery_note_sequence_id +msgid "Delivery Note Sequence" +msgstr "Sequenza DdT" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_stock_delivery_note_type +msgid "Delivery Note Type" +msgstr "Tipo DdT" + +#. module: l10n_it_delivery_note +#: model:ir.actions.act_window,name:l10n_it_delivery_note.stock_delivery_note_type_action +#: model:ir.ui.menu,name:l10n_it_delivery_note.stock_delivery_note_type_menu +msgid "Delivery Note Types" +msgstr "Tipi DdT" + +#. module: l10n_it_delivery_note +#: model:ir.actions.act_window,name:l10n_it_delivery_note.stock_delivery_note_action +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_account_bank_statement_line__delivery_note_ids +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_account_move__delivery_note_ids +#: model:ir.ui.menu,name:l10n_it_delivery_note.stock_delivery_note_config_menu +#: model:ir.ui.menu,name:l10n_it_delivery_note.stock_delivery_note_menu +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.account_view_move_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.portal_my_delivery_notes +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.portal_my_home_menu_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.res_config_settings_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_form_view +msgid "Delivery Notes" +msgstr "DdT" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_sale_order_line__delivery_picking_id +msgid "Delivery Picking" +msgstr "Prelievo DdT" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "Delivery address" +msgstr "Indirizzo di consegna" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__delivery_method_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__delivery_method_id +msgid "Delivery method" +msgstr "Metodo di consegna" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__name +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "Description" +msgstr "Descrizione" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +msgid "Details" +msgstr "Dettagli" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__discount +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "Discount" +msgstr "Sconto" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_res_company__display_carrier_dn_report +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_res_config_settings__display_carrier_dn_report +msgid "Display Carrier in Delivery Note Report" +msgstr "Mostra vettore nella stampa DdT" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_res_company__display_delivery_method_dn_report +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_res_config_settings__display_delivery_method_dn_report +msgid "Display Delivery Method in Delivery Note Report" +msgstr "Mostra metodo di consegna nella stampa DdT" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__display_name +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_confirm_wizard__display_name +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_create_wizard__display_name +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_invoice_wizard__display_name +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__display_name +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_select_wizard__display_name +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_type__display_name +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_goods_appearance__display_name +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_condition__display_name +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_method__display_name +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_reason__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_res_company__display_ref_customer_dn_report +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_res_config_settings__display_ref_customer_dn_report +msgid "Display Ref. Customer in Delivery Note Report" +msgstr "Mostra Rif. Cliente nella stampa DdT" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_res_company__display_ref_order_dn_report +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_res_config_settings__display_ref_order_dn_report +msgid "Display Ref. Order in Delivery Note Report" +msgstr "Mostra Rif. Ordine nella stampa DdT" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +msgid "Document" +msgstr "Documento" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "Document:" +msgstr "Documento:" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_delivery_note__state__done +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_form_view +msgid "Done" +msgstr "Completato" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.portal_delivery_note_page +msgid "Download" +msgstr "Scarica" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_delivery_note__state__draft +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_form_view +msgid "Draft" +msgstr "Bozza" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_search_view +msgid "Draft DN" +msgstr "Bozza DdT" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +msgid "Draft document" +msgstr "Documento in bozza" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "Draft document:" +msgstr "Documento in bozza:" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.parcels_data +msgid "Driver's Signature" +msgstr "Firma del corriere" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_base_wizard__error_message +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_create_wizard__error_message +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_select_wizard__error_message +msgid "Error Message" +msgstr "Messaggio di errore" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.portal_my_home_delivery_note +msgid "Follow or download your delivery notes" +msgstr "Seguire o scaricare il DdT" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__message_follower_ids +msgid "Followers" +msgstr "Seguito da" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__message_partner_ids +msgid "Followers (Partners)" +msgstr "Seguito da (partner)" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,help:l10n_it_delivery_note.field_stock_delivery_note__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "Icona Font Awesome es. fa-tasks" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_delivery_note__invoice_status__invoiced +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_delivery_note_line__invoice_status__invoiced +msgid "Fully invoiced" +msgstr "Interamente fatturato" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_tree_view +msgid "Go to delivery note" +msgstr "Vai al DdT" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +msgid "Go to invoice" +msgstr "Vai alla fattura" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_type_tree_view +msgid "Go to sequence" +msgstr "Vai alla sequenza" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.parcels_data +msgid "Goods Description" +msgstr "Descrizione dei beni" + +#. module: l10n_it_delivery_note +#: model:stock.picking.transport.reason,name:l10n_it_delivery_note.transport_reason_VIS +msgid "Goods on approval" +msgstr "Merce in approvazione" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.parcels_data +msgid "Gross Weight" +msgstr "Peso lordo" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_l10n_it_delivery_note_delivery_mixin__delivery_gross_weight +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__delivery_gross_weight +msgid "Gross Weight of Delivery" +msgstr "Peso lordo della consegna" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_l10n_it_delivery_note_delivery_mixin__delivery_gross_weight_uom_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__delivery_gross_weight_uom_id +msgid "Gross Weight of Delivery UoM" +msgstr "UdM del peso lordo della consegna" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__gross_weight +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__gross_weight +msgid "Gross weight" +msgstr "Peso lordo" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__gross_weight_uom_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__gross_weight_uom_id +msgid "Gross weight UoM" +msgstr "UdM del peso lordo" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__has_message +msgid "Has Message" +msgstr "Ha un messaggio" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_confirm_wizard__id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_create_wizard__id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_invoice_wizard__id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_select_wizard__id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_type__id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_goods_appearance__id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_condition__id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_method__id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_reason__id +msgid "ID" +msgstr "ID" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__activity_exception_icon +msgid "Icon" +msgstr "Icona" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,help:l10n_it_delivery_note.field_stock_delivery_note__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "Icona per indicare un'attività eccezione." + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,help:l10n_it_delivery_note.field_stock_delivery_note__message_needaction +msgid "If checked, new messages require your attention." +msgstr "Se selezionata, nuovi messaggi richiedono attenzione." + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,help:l10n_it_delivery_note.field_stock_delivery_note__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "Se selezionata, alcuni messaggi hanno un errore di consegna." + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_wizard_error_message_template +msgid "If these problems persist, don't hesitate to contact the helpdesk." +msgstr "Se questi problemi persistono, non esitate a contattare l'helpdesk." + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note.py:0 +msgid "In %(ddt_name)s there is %(product_name)s with invoicing policy 'order'" +msgstr "" +"In %(ddt_name)s c'è il prodotto %(product_name)s con politica di " +"fatturazione \"ordinato\"" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note_type.py:0 +#: code:addons/l10n_it_delivery_note/tests/test_stock_delivery_note_sequence.py:0 +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_delivery_note_type__code__incoming +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +msgid "Incoming" +msgstr "In arrivo" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note_type.py:0 +msgid "Incoming DdT sequence" +msgstr "Sequenza DdT in ingresso" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__sale_advance_payment_inv__step__initial +msgid "Initial" +msgstr "Iniziale" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_delivery_note_type__code__internal +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +msgid "Internal" +msgstr "Interno" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note_type.py:0 +msgid "Internal DdT sequence" +msgstr "Sequenza DdT interni" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_type__note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__delivery_note_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_goods_appearance__note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_condition__note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_method__note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_reason__note +msgid "Internal note" +msgstr "Nota interna" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_l10n_it_delivery_note_delivery_mixin__delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__delivery_note +msgid "Internal note of delivery" +msgstr "Note interne della consegna" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_type_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_goods_appearance_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_transport_condition_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_transport_method_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_transport_reason_form_view +msgid "Internal notes" +msgstr "Note interne" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note_type.py:0 +#: code:addons/l10n_it_delivery_note/tests/test_stock_delivery_note_sequence.py:0 +msgid "Internal transfer" +msgstr "Trasferimento interno" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_stock_location +msgid "Inventory Locations" +msgstr "Ubicazioni di inventario" + +#. module: l10n_it_delivery_note +#: model:ir.module.category,name:l10n_it_delivery_note.module_category_inventory_checkboxes +msgid "Inventory settings" +msgstr "Impostazioni del magazzino" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_invoice_wizard__invoice_method +msgid "Invoice Method" +msgstr "Metodo fatturazione" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/wizard/sale_advance_payment_inv.py:0 +msgid "Invoice Order" +msgstr "Ordine fattura" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__invoice_status +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__invoice_status +msgid "Invoice status" +msgstr "Stato fatturazione" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +msgid "Invoice statuses" +msgstr "Stati fatturazione" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_invoice_wizard__invoice_date +msgid "Invoice/Bill Date" +msgstr "Data fattura/conto" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_delivery_note__state__invoiced +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_form_view +msgid "Invoiced" +msgstr "Fatturate" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__invoice_ids +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +msgid "Invoices" +msgstr "Fatture" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__message_is_follower +msgid "Is Follower" +msgstr "Segue" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_account_move +msgid "Journal Entry" +msgstr "Registrazione contabile" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_account_move_line +msgid "Journal Item" +msgstr "Movimento contabile" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__write_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_confirm_wizard__write_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_create_wizard__write_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_invoice_wizard__write_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__write_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_select_wizard__write_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_type__write_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_goods_appearance__write_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_condition__write_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_method__write_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_reason__write_uid +msgid "Last Updated by" +msgstr "Ultimo aggiornamento di" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__write_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_confirm_wizard__write_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_create_wizard__write_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_invoice_wizard__write_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__write_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_select_wizard__write_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_type__write_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_goods_appearance__write_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_condition__write_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_method__write_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_reason__write_date +msgid "Last Updated on" +msgstr "Ultimo aggiornamento il" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__display_type +msgid "Line type" +msgstr "Tipo riga" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__line_ids +msgid "Lines" +msgstr "Righe" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__lines_have_customer_ref +msgid "Lines Have Customer Ref" +msgstr "Righe hanno Rif. Cliente" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__lines_have_so_number +msgid "Lines Have So Number" +msgstr "Righe hanno numero SO" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_res_config_settings__group_required_partner_ref +msgid "Make Partner Ref. in DN Mandatory" +msgstr "Campo \"Riferimento Partner\" in DdT obbligatorio" + +#. module: l10n_it_delivery_note +#: model:res.groups,name:l10n_it_delivery_note.group_required_partner_ref +msgid "Make Partner Ref. in DN Required" +msgstr "Campo Riferimento Partner in DdT obbligatorio" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__message_has_error +msgid "Message Delivery error" +msgstr "Errore di consegna messaggio" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__message_ids +msgid "Messages" +msgstr "Messaggi" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_method__name +msgid "Method name" +msgstr "Nome metodo" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_stock_picking_transport_method +msgid "Method of Transport" +msgstr "Metodo di trasporto" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_res_partner__default_transport_method_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_res_users__default_transport_method_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_sale_order__default_transport_method_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__transport_method_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_type__default_transport_method_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__transport_method_id +msgid "Method of transport" +msgstr "Metodo di trasporto" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_l10n_it_delivery_note_delivery_mixin__delivery_transport_method_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__delivery_transport_method_id +msgid "Method of transport of Delivery" +msgstr "Metodo di trasporto della consegna" + +#. module: l10n_it_delivery_note +#: model:ir.actions.act_window,name:l10n_it_delivery_note.stock_picking_transport_method_action +#: model:ir.ui.menu,name:l10n_it_delivery_note.stock_picking_transport_method_menu +msgid "Methods of transport" +msgstr "Metodi di trasporto" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "Scadenza mia attività" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__name +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_type__name +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_tree_view +msgid "Name" +msgstr "Nome" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.parcels_data +msgid "Net Weight" +msgstr "Peso netto" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_l10n_it_delivery_note_delivery_mixin__delivery_net_weight +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__delivery_net_weight +msgid "Net Weight of Delivery" +msgstr "Peso netto della consegna" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_l10n_it_delivery_note_delivery_mixin__delivery_net_weight_uom_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__delivery_net_weight_uom_id +msgid "Net Weight of Delivery UoM" +msgstr "UdM del peso netto della consegna" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__net_weight +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__net_weight +msgid "Net weight" +msgstr "Peso netto" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__net_weight_uom_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__net_weight_uom_id +msgid "Net weight UoM" +msgstr "UdM del peso netto" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "Scadenza prossima attività" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__activity_summary +msgid "Next Activity Summary" +msgstr "Riepilogo prossima attività" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__activity_type_id +msgid "Next Activity Type" +msgstr "Tipo prossima attività" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,help:l10n_it_delivery_note.field_stock_delivery_note_type__next_sequence_number +msgid "" +"Next number that will be used. This number can be incremented frequently so " +"the displayed value might already be obsolete" +msgstr "" +"Il numero che verrà usato come successivo. Il valore visualizzato potrebbe " +"essere già obsoleto dato che può essere incrementato in modo frequente" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_search_view +msgid "No DN" +msgstr "Nessun DdT" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_picking_transport_condition__price_to_show__none +msgid "None" +msgstr "Nessuno" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_delivery_note_line__display_type__line_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +msgid "Note" +msgstr "Nota" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_account_move_line__note_dn +msgid "Note DN" +msgstr "Nota DdT" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.parcels_data +msgid "Notes" +msgstr "Note" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_delivery_note__invoice_status__no +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_delivery_note_line__invoice_status__no +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +msgid "Nothing to invoice" +msgstr "Niente da fatturare" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__message_needaction_counter +msgid "Number of Actions" +msgstr "Numero di azioni" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__message_has_error_counter +msgid "Number of errors" +msgstr "Numero di errori" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,help:l10n_it_delivery_note.field_stock_delivery_note__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "Numero di messaggi che richiedono un'azione" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,help:l10n_it_delivery_note.field_stock_delivery_note__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "Numero di messaggi con errore di consegna" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_type__sequence_id +msgid "Numeration" +msgstr "Numerazione" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_delivery_note_invoice_wizard__invoice_method__dn +msgid "Only DN" +msgstr "Solo DdT" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +msgid "Open picking" +msgstr "Apri consegna" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note_type.py:0 +#: code:addons/l10n_it_delivery_note/tests/test_stock_delivery_note_sequence.py:0 +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_delivery_note_type__code__outgoing +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +msgid "Outgoing" +msgstr "In uscita" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note_type.py:0 +#: code:addons/l10n_it_delivery_note/tests/test_stock_delivery_note_sequence.py:0 +msgid "Outgoing (with prices)" +msgstr "In uscita (con prezzi)" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note_type.py:0 +msgid "Outgoing DdT sequence" +msgstr "Sequenza DdT in uscita" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__packages +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.parcels_data +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.portal_my_delivery_notes +msgid "Packages" +msgstr "Colli" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_l10n_it_delivery_note_delivery_mixin__delivery_packages +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__delivery_packages +msgid "Packages of Delivery" +msgstr "Colli della consegna" + +#. module: l10n_it_delivery_note +#: model:stock.picking.goods.appearance,name:l10n_it_delivery_note.goods_appearance_BAN +msgid "Pallet" +msgstr "Bancale" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__partner_ref +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__delivery_note_partner_ref +msgid "Partner reference" +msgstr "Referenza del contatto" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_select_wizard__picking_ids +msgid "Picking" +msgstr "Prelievo" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_stock_picking_checker_mixin +msgid "Picking Checker Mixin" +msgstr "Mescola Controllore del Prelievo" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__picking_type +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_create_wizard__picking_type +msgid "Picking type" +msgstr "Tipo prelievo" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +msgid "Picking types" +msgstr "Tipi di consegna" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__picking_ids +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_create_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_select_form_view +msgid "Pickings" +msgstr "Prelievi" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__pickings_picker +msgid "Pickings Picker" +msgstr "Raccoglitore prelievi" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_wizard_error_message_template +msgid "Please, check and solve these problems before trying again." +msgstr "Prego, controllare e risolvere questi problemi prima di riprovare." + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__access_url +msgid "Portal Access URL" +msgstr "URL accesso portale" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_condition__price_to_show +msgid "Price to show" +msgstr "Prezzo da visualizzare" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_form_view +msgid "Print" +msgstr "Stampa" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.res_config_settings_form_view +msgid "Prints Carrier's name on DN report (if there are any)" +msgstr "Stampa il nome del corriere nel resoconto DdT (se ce n'è uno)" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.res_config_settings_form_view +msgid "Prints Customer References on DN report (if there are any)" +msgstr "Stampa Rif. Cliente su DdT (se presente)" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.res_config_settings_form_view +msgid "Prints Delivery Method on DN report (if there are any)" +msgstr "Stampa il metodo di consegna le resoconto DdT (se ce n'è uno)" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.res_config_settings_form_view +msgid "Prints Sale Order numbers on DN report (if there are any)" +msgstr "Stampa Rif. Ordine su DdT (se presente)" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__product_id +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "Product" +msgstr "Prodotto" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__product_qty +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "Quantity" +msgstr "Quantità" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_reason__name +msgid "Reason name" +msgstr "Nome motivo" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_stock_picking_transport_reason +msgid "Reason of Transport" +msgstr "Causale di trasporto" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_res_partner__default_transport_reason_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_res_users__default_transport_reason_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_sale_order__default_transport_reason_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__transport_reason_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_type__default_transport_reason_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__transport_reason_id +msgid "Reason of transport" +msgstr "Causale di trasporto" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_l10n_it_delivery_note_delivery_mixin__delivery_transport_reason_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__delivery_transport_reason_id +msgid "Reason of transport of Delivery" +msgstr "Causale di trasporto della consegna" + +#. module: l10n_it_delivery_note +#: model:ir.actions.act_window,name:l10n_it_delivery_note.stock_picking_transport_reason_action +#: model:ir.ui.menu,name:l10n_it_delivery_note.stock_picking_transport_reason_menu +msgid "Reasons of transport" +msgstr "Motivi di trasporto" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__partner_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_base_wizard__partner_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_create_wizard__partner_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_select_wizard__partner_id +#: model:stock.picking.transport.method,name:l10n_it_delivery_note.transport_method_DES +msgid "Recipient" +msgstr "Destinatario" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.parcels_data +msgid "Recipient's Signature" +msgstr "Firma del destinatario" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +msgid "Recipients" +msgstr "Destinatari" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "Ref. Customer" +msgstr "Rif. Cliente" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "Ref. Order" +msgstr "Rif. Ordine" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_form_view +msgid "Reset to draft" +msgstr "Reimposta a bozza" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__activity_user_id +msgid "Responsible User" +msgstr "Utente responsabile" + +#. module: l10n_it_delivery_note +#: model:stock.picking.transport.reason,name:l10n_it_delivery_note.transport_reason_RES +msgid "Returned" +msgstr "Reso" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__sale_ids +#: model:stock.picking.transport.reason,name:l10n_it_delivery_note.transport_reason_VEN +msgid "Sale" +msgstr "Vendita" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__sale_count +msgid "Sale Count" +msgstr "Numero vendite" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__sale_line_id +msgid "Sale Line" +msgstr "Riga di vendita" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__sale_order_number +msgid "Sale Order Number" +msgstr "Numero ordine di vendita" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note.py:0 +msgid "" +"Sale orders related to %s have return! For invoicing, go to sale orders." +msgstr "" +"Gli ordini di vendita relazionati a %s hanno un reso! Per la fatturazione, " +"passa dagli ordini di vendita." + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_sale_advance_payment_inv +msgid "Sales Advance Payment Invoice" +msgstr "Fattura di vendita con pagamento anticipato" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__product_description +msgid "Sales Description" +msgstr "Descrizione vendite" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_sale_order +msgid "Sales Order" +msgstr "Ordine di vendita" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_sale_order_line +msgid "Sales Order Line" +msgstr "Riga ordine di vendita" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__sales_transport_check +msgid "Sales Transport Check" +msgstr "Controllo Ordine Trasporto" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +msgid "Sales orders" +msgstr "Ordini di vendita" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/controllers/portal.py:0 +msgid "Search in Description" +msgstr "Cerca nella descrizione" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_delivery_note_line__display_type__line_section +msgid "Section" +msgstr "Sezione" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +msgid "Section name (e.g. Products, Services)" +msgstr "Nome sezione (es. Prodotti, Servizi)" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__access_token +msgid "Security Token" +msgstr "Token di sicurezza" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_picking.py:0 +#: model:ir.actions.act_window,name:l10n_it_delivery_note.stock_delivery_note_select_action +msgid "Select an existing delivery note" +msgstr "Seleziona un DdT esistente" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_form_view +msgid "Select existing" +msgstr "Seleziona esistente" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.res_config_settings_form_view +msgid "" +"Select the root of all your virtual locations.
\n" +" Internal transfers between at least one " +"virtual\n" +" locations won't generate automatically any " +"DN\n" +" documents." +msgstr "" +"Selezionare la rotta di tutte le ubicazioni virtuali.
\n" +" Trasferimenti interni tra almeno una " +"ubicazione virtuale\n" +" non genereranno automaticamente alcun " +"documento\n" +" DdT." + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_base_wizard__selected_picking_ids +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_create_wizard__selected_picking_ids +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_select_wizard__selected_picking_ids +msgid "Selected Picking" +msgstr "Prelievi selezionati" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__partner_sender_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_base_wizard__partner_sender_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_create_wizard__partner_sender_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_select_wizard__partner_sender_id +#: model:stock.picking.transport.method,name:l10n_it_delivery_note.transport_method_MIT +msgid "Sender" +msgstr "Mittente" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +msgid "Senders" +msgstr "Mittenti" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__sequence_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__sequence +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_type__sequence +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_goods_appearance__sequence +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_condition__sequence +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_method__sequence +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_reason__sequence +msgid "Sequence" +msgstr "Sequenza" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_form_view +msgid "Set done" +msgstr "Segna come completato" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_shipping_information_updater_mixin +msgid "Shipping Information Updater Mixin" +msgstr "Mixin Revisore delle Informazioni di Spedizione" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__partner_shipping_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_base_wizard__partner_shipping_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_create_wizard__partner_shipping_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_select_wizard__partner_shipping_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__delivery_note_partner_shipping_id +msgid "Shipping address" +msgstr "Indirizzo di spedizione" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.res_partner_form_view +msgid "Shipping information" +msgstr "Informazioni spedizione" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__show_product_information +msgid "Show Product Information" +msgstr "Mostra le informazioni di prodotto" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__print_prices +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_type__print_prices +msgid "Show prices on printed DN" +msgstr "Mostra prezzi su stampa DdT" + +#. module: l10n_it_delivery_note +#: model:res.groups,name:l10n_it_delivery_note.show_product_related_fields +msgid "Show product information in delivery note lines" +msgstr "Mostrare informazioni prodotto nelle righe del documento di trasporto" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__state +msgid "State" +msgstr "Stato" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +msgid "States" +msgstr "Condizioni" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,help:l10n_it_delivery_note.field_stock_delivery_note__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" +"Stato in base alle attività\n" +"Scaduto: la data richiesta è trascorsa\n" +"Oggi: la data attività è oggi\n" +"Pianificato: attività future." + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_create_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_select_form_view +msgid "Summary" +msgstr "Riepilogo" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__dn_supplier_date +msgid "Supplier DN Date" +msgstr "Data DDT fornitore" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__dn_supplier_number +msgid "Supplier DN Number" +msgstr "Numero DdT fornitore" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +msgid "Tax" +msgstr "Imposta" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "Tax ID" +msgstr "Partita IVA" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +msgid "Tax excluded" +msgstr "Imponibile" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__tax_ids +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "Taxes" +msgstr "Imposte" + +#. module: l10n_it_delivery_note +#: model:ir.model.constraint,message:l10n_it_delivery_note.constraint_stock_delivery_note_name_uniq +msgid "The Delivery note must have unique numbers." +msgstr "Il DDT deve avere un numero univoco." + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note.py:0 +msgid "" +"The carrier set in Delivery Note is different from the carrier set in " +"picking(s). Are you sure you want to proceed?" +msgstr "" +"Il vettore impostato nel DdT è differente dal vettore impostato nei " +"trasferimenti. Confermi di voler procedere?" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note.py:0 +msgid "" +"The field 'Partner reference' is mandatory to validate the Delivery Note." +msgstr "" +"Il campo \"Riferimento partner\" è obbligatorio per poter validare il DdT." + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,help:l10n_it_delivery_note.field_stock_picking__carrier_partner_id +msgid "The partner that is doing the delivery service." +msgstr "Il partner che effettua il servizio di consegna." + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/mixins/picking_checker.py:0 +msgid "" +"The pickings you've selected don't seem to have any location of departure." +msgstr "" +"I prelievi che hai selezionato non sembrano avere nessun luogo di partenza." + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/mixins/picking_checker.py:0 +msgid "" +"The pickings you've selected don't seem to have any location of destination." +msgstr "" +"I prelievi che hai selezionato non sembrano avere nessun luogo di " +"destinazione." + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/mixins/picking_checker.py:0 +msgid "" +"The pickings you've selected don't seem to have any partner or the selected " +"warehouse doesn't have a valid address." +msgstr "" +"I prelievi che hai selezionato non sembrano avere nessun partner oppure il " +"magazzino selezionato non ha un indirizzo valido." + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/mixins/picking_checker.py:0 +msgid "The pickings you've selected don't seem to have any type." +msgstr "I prelievi che hai selezionato non sembrano avere nessun tipo." + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/wizard/delivery_note_select.py:0 +msgid "The selected pickings have different delivery methods: %(carriers)s" +msgstr "" +"I trasferimenti selezionati hanno metodi di consegna differenti: %(carriers)s" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note.py:0 +msgid "" +"The shipping method set in Delivery Note is different from the shipping " +"method set in picking(s). Are you sure you want to proceed?" +msgstr "" +"Il metodo di consegna impostato nel DdT è differente dal metodo di consegna " +"impostato nei trasferimenti. Confermi di voler procedere?" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.sale_advance_payment_inv_form_view +msgid "" +"There appears to be one or more delivery notes in \"Draft\" state.
\n" +" If you proceed with the creation of an invoice " +"(other than the downpayment one),\n" +" the affected delivery note lines will be detached " +"from the sales order and\n" +" will not appear linked to the generated invoice." +msgstr "" +"Sembra siano presenti uno o più DdT in stato \"Bozza\".
\n" +" Se si proseguirà con la creazione di una fattura " +"(diversa da quella di acconto),\n" +" le righe interessate di suddetti DdT verranno " +"scollegate dall'ordine di vendita e\n" +" non risulteranno associate alla fattura generata." + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.portal_my_delivery_notes +msgid "There are currently no delivery notes for your account." +msgstr "Al momento non ci sono DdT sul tuo conto." + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_wizard_error_message_template +msgid "There are one or more problems with the pickings you've selected:" +msgstr "Sono presenti uno o più problemi con i prelievi che hai selezionato:" + +#. module: l10n_it_delivery_note +#: model:ir.model.constraint,message:l10n_it_delivery_note.constraint_stock_picking_goods_appearance_name_uniq +msgid "This appearance of goods already exists!" +msgstr "Questo aspetto dei beni esiste già!" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.sale_advance_payment_inv_form_view +msgid "" +"This behaviour just described may not be wrong in some very specific cases." +"
\n" +" Proceed only if you are absolutely sure and aware of " +"what you're doing." +msgstr "" +"Questo comportamento appena descritto potrebbe non essere sbagliato in " +"alcuni casi molto specifici.
\n" +" Procedi solo se sei assolutamente sicuro e " +"consapevole di quello che stai facendo." + +#. module: l10n_it_delivery_note +#: model:ir.model.constraint,message:l10n_it_delivery_note.constraint_stock_picking_transport_condition_name_uniq +msgid "This condition of transport already exists!" +msgstr "Questa condizione di trasporto esiste già!" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note.py:0 +msgid "" +"This delivery note contains pickings related to different delivery methods " +"from the same transporter. Are you sure you want to proceed?\n" +"Delivery Methods: %(carriers)s" +msgstr "" +"Questo DdT contiene trasferimenti relazionati a diversi metodi di consegna " +"dello stesso vettore. Confermi di voler procedere?\n" +"Metodi di consegna: %(carriers)s" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note.py:0 +msgid "" +"This delivery note contains pickings related to different transporters. Are " +"you sure you want to proceed?\n" +"Carrier Partners: %(carrier_partners)s" +msgstr "" +"Questo DdT contiene trasferimenti relazionati a diversi vettori. Confermi di " +"voler procedere?\n" +"Vettori: %(carrier_partners)s" + +#. module: l10n_it_delivery_note +#: model:ir.model.constraint,message:l10n_it_delivery_note.constraint_stock_delivery_note_type_name_uniq +msgid "This delivery note type already exists!" +msgstr "Questo tipo di DdT esiste già!" + +#. module: l10n_it_delivery_note +#: model:ir.model.constraint,message:l10n_it_delivery_note.constraint_stock_picking_transport_method_name_uniq +msgid "This method of transport already exists!" +msgstr "Questo metodo di trasporto esiste già!" + +#. module: l10n_it_delivery_note +#: model:ir.model.constraint,message:l10n_it_delivery_note.constraint_stock_picking_transport_reason_name_uniq +msgid "This reason of transport already exists!" +msgstr "Questa causale di trasporto esiste già!" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_delivery_note__invoice_status__to_invoice +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_delivery_note_line__invoice_status__to_invoice +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +msgid "To invoice" +msgstr "Da fatturare" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +msgid "To pay" +msgstr "Da pagare" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +msgid "Total" +msgstr "Totale" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_picking_transport_condition__price_to_show__total +msgid "Total price" +msgstr "Prezzo totale" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_stock_picking +msgid "Transfer" +msgstr "Trasferimento" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_l10n_it_delivery_note_delivery_mixin__delivery_transport_datetime +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__delivery_transport_datetime +msgid "Transport Date of Delivery" +msgstr "Data di trasporto della consegna" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__transport_datetime +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__transport_datetime +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.parcels_data +msgid "Transport date" +msgstr "Data di trasporto" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__carrier_partner_id +msgid "Transporter" +msgstr "Vettore" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__type_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_base_wizard__type_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_create_wizard__type_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_select_wizard__type_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__delivery_note_type_id +msgid "Type" +msgstr "Tipo" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +msgid "Type codes" +msgstr "Codici tipo" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__type_code +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_type__code +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__delivery_note_type_code +msgid "Type of Operation" +msgstr "Tipo di operazione" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,help:l10n_it_delivery_note.field_stock_delivery_note__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "Tipo di attività eccezione sul record." + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +msgid "Types" +msgstr "Tipi" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.sale_advance_payment_inv_form_view +msgid "Understood, continue anyway" +msgstr "Ho capito, continua ugualmente" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "Unit Price" +msgstr "Prezzo unitario" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__price_unit +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_picking_transport_condition__price_to_show__unit +msgid "Unit price" +msgstr "Prezzo unitario" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__product_uom_id +msgid "UoM" +msgstr "UdM" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_form_view +msgid "Update to now" +msgstr "Aggiorna ad adesso" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__use_delivery_note +msgid "Use Delivery Note" +msgstr "Usa il DdT" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__valid_move_ids +msgid "Valid Move" +msgstr "Movimenti validi" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_form_view +msgid "Validate" +msgstr "Valida" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_delivery_note__state__confirm +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_form_view +msgid "Validated" +msgstr "Validato" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_search_view +msgid "Validated DN" +msgstr "DdT Validato" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_res_config_settings__virtual_locations_root +msgid "Virtual locations root" +msgstr "Rotte ubicazioni virtuali" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__volume +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_form_view +msgid "Volume" +msgstr "Volume" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__volume_uom_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__delivery_note_volume_uom_id +msgid "Volume UoM" +msgstr "UdM del volume" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_l10n_it_delivery_note_delivery_mixin__delivery_volume +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__delivery_volume +msgid "Volume of Delivery" +msgstr "Volume della consegna" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_l10n_it_delivery_note_delivery_mixin__delivery_volume_uom_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__delivery_volume_uom_id +msgid "Volume of Delivery UoM" +msgstr "UdM del volume della consegna" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "Warehouse" +msgstr "Magazzino" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__move_id +msgid "Warehouse movement" +msgstr "Movimento di magazzino" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note.py:0 +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_base_wizard__warning_message +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_create_wizard__warning_message +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_select_wizard__warning_message +msgid "Warning" +msgstr "Attenzione" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_confirm_wizard__warning_message +msgid "Warning Message" +msgstr "Messaggio di avviso" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note.py:0 +#: code:addons/l10n_it_delivery_note/models/stock_picking.py:0 +#: code:addons/l10n_it_delivery_note/wizard/delivery_note_base.py:0 +msgid "Warning!" +msgstr "Attenzione!" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__website_message_ids +msgid "Website Messages" +msgstr "Messaggi sito web" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,help:l10n_it_delivery_note.field_stock_delivery_note__website_message_ids +msgid "Website communication history" +msgstr "Cronologia comunicazioni sito web" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_delivery_note_invoice_wizard__invoice_method__service +msgid "With Service" +msgstr "Con servizio" + +#. module: l10n_it_delivery_note +#: model:ir.model.constraint,message:l10n_it_delivery_note.constraint_stock_delivery_note_line_move_uniq +msgid "" +"You cannot assign the same warehouse movement to different delivery notes!" +msgstr "" +"Non è possibile assegnare lo stesso movimento di magazzino a Documenti di " +"trasporto diverse!" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note.py:0 +msgid "" +"You cannot cancel this delivery note. There is at least one invoice related " +"to this delivery note." +msgstr "" +"Non puoi cancellare questo DdT. È presente, almeno, una fattura legata a " +"questo DdT." + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note_line.py:0 +msgid "" +"You cannot change the type of a delivery note line. Instead you should " +"delete the current line and create a new line of the proper type." +msgstr "" +"Non puoi cambiare il tipo della riga del DdT. Dovresti, invece, eliminare la " +"riga corrente e creare una riga nuova del tipo corretto." + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note.py:0 +#: code:addons/l10n_it_delivery_note/models/stock_picking.py:0 +msgid "" +"You cannot set this delivery note type due of a different numerator " +"configuration." +msgstr "" +"Non puoi cambiare il tipo del DdT a causa dell'uso di un numeratore " +"differente." + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note.py:0 +msgid "" +"You cannot set this delivery note type due of a different type with related " +"pickings." +msgstr "" +"Non puoi cambiare il tipo del DdT a causa dell'uso di un numeratore " +"differente." + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_picking.py:0 +msgid "" +"You have just called this method on an heterogeneous set of pickings.\n" +"All pickings should have the same 'location_dest_id' field value." +msgstr "" +"Hai appena chiamato questo metodo su un insieme eterogeneo di " +"trasferimenti.\n" +"Tutti i prelievi devono avere lo stesso valore del campo 'location_dest_id'." + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_picking.py:0 +msgid "" +"You have just called this method on an heterogeneous set of pickings.\n" +"All pickings should have the same 'location_id' field value." +msgstr "" +"Hai appena chiamato questo metodo su un insieme eterogeneo di " +"trasferimenti.\n" +"Tutti i prelievi devono avere lo stesso valore del campo 'location_id'." + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_picking.py:0 +msgid "" +"You have just called this method on an heterogeneous set of pickings.\n" +"All pickings should have the same 'partner_id' field value." +msgstr "" +"Hai appena chiamato questo metodo su un insieme eterogeneo di " +"trasferimenti.\n" +"Tutti i prelievi devono avere lo stesso valore del campo 'partner_id'." + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_picking.py:0 +msgid "" +"You have just called this method on an heterogeneous set of pickings.\n" +"All pickings should have the same 'picking_type_code' field value." +msgstr "" +"Hai appena chiamato questo metodo su un insieme eterogeneo di " +"trasferimenti.\n" +"Tutti i prelievi devono avere lo stesso valore del campo 'picking_type_code'." + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/mixins/picking_checker.py:0 +msgid "You need to select pickings with all the same location of departure." +msgstr "È necessario selezionare prelievi con lo stesso luogo di destinazione." + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/mixins/picking_checker.py:0 +msgid "You need to select pickings with all the same location of destination." +msgstr "È necessario selezionare prelievi con lo stesso luogo di destinazione." + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/mixins/picking_checker.py:0 +msgid "You need to select pickings with all the same recipient." +msgstr "È necessario selezionare prelievi con lo stesso destinatario." + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/mixins/picking_checker.py:0 +msgid "You need to select pickings with all the same type." +msgstr "È necessario selezionare prelievi con lo stesso tipo." + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/mixins/picking_checker.py:0 +msgid "" +"You shouldn't be able to launch this wizard without selecting any pickings." +msgstr "" +"Non dovresti essere in grado di lanciare questa procedura senza selezionare " +"alcun prelievo." + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.portal_my_home_delivery_note +msgid "Your Delivery Notes" +msgstr "Il tuo ddT" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "best before" +msgstr "data di scadenza" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "lot / sn :" +msgstr "lotto / numero di serie:" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "of:" +msgstr "di:" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "qty" +msgstr "q.tà" + +#~ msgid "Manufacturing Operation" +#~ msgstr "Operazione Prodotta" + +#~ msgid " Print" +#~ msgstr " Stampa" + +#~ msgid "(e.g. link multiple pickings to a single DN)" +#~ msgstr "(es. unisce molteplici trasferimenti in un singolo DdT)" + +#~ msgid "" +#~ " Delivery Note: \n" +#~ " Under the terms of Italian Presidential Decree 472-96 " +#~ "of 14.08.1996" +#~ msgstr "" +#~ " Documento di trasporto: \n" +#~ " Ai sensi del DPR 472-96 del 14.08.1996" + +#~ msgid "Carriage Condition:" +#~ msgstr "Condizione di Trasporto:" + +#~ msgid "Customer:" +#~ msgstr "Cliente:" + +#~ msgid "Delivery address:" +#~ msgstr "Indirizzo di consegna:" + +#~ msgid "Method of Transport / Carrier:" +#~ msgstr "Metodo di trasporto / Vettore:" + +#~ msgid "Reason of Transport:" +#~ msgstr "Causale di trasporto:" + +#~ msgid "" +#~ "Block the validation of incoming DNs if the\n" +#~ " \"Partner reference\" field is not " +#~ "set." +#~ msgstr "" +#~ "Blocca la validazione di DdT in entrata se il\n" +#~ " campo \"Riferimento partner\" non è " +#~ "valorizzato." + +#~ msgid "History" +#~ msgstr "Storico" + +#~ msgid "" +#~ "It extends the standard behaviour of DNs\n" +#~ " management by introducing additional " +#~ "functions." +#~ msgstr "" +#~ "Estende il comportamento standard della gestione dei\n" +#~ " DdT introducendo funzionalità " +#~ "aggiuntive." + +#~ msgid "Last Modified on" +#~ msgstr "Ultima modifica il" + +#~ msgid "Main Attachment" +#~ msgstr "Allegato principale" + +#~ msgid "Prints Carrier's name on DN report (if there is any)" +#~ msgstr "Stampa nome vettore su stampa DdT (se presente)" + +#~ msgid "Prints Delivery Method on DN report (if there is any)" +#~ msgstr "Stampa metodo di consegna su stampa DdT (se presente)" + +#, python-format +#~ msgid "Search Name" +#~ msgstr "Cerca nome" + +#~ msgid "" +#~ "Select the root of all your virtual locations.
\n" +#~ " Internal transfers between at least " +#~ "one virtual\n" +#~ " locations won't generate " +#~ "automatically any DN\n" +#~ " documents." +#~ msgstr "" +#~ "Seleziona la rotta di tutte le tue ubicazioni virtuali.
\n" +#~ " Trasferimenti interni tra almeno un " +#~ "virtuale\n" +#~ " le posizioni non genereranno " +#~ "automaticamente alcun trasporto\n" +#~ " documenti." + +#, python-format +#~ msgid "" +#~ "It seems that at least one delivery note has been already created. You " +#~ "can't migrate any data on an already used database." +#~ msgstr "" +#~ "Sembra che sia stato già creato almeno un DdT. Non puoi migrare nessun " +#~ "dato se il database è già in uso." + +#, python-format +#~ msgid "" +#~ "It seems that there are no documents to migrate. You don't need to run " +#~ "this command." +#~ msgstr "" +#~ "Sembra che non ci siano documenti da migrare. Non si necessita di " +#~ "eseguire questo comando." + +#, python-format +#~ msgid "" +#~ "Module `l10n_it_ddt` isn't installed on this database. You don't need to " +#~ "run this command." +#~ msgstr "" +#~ "Il modulo `l10n_it_ddt` non è installato in questo database. Non si " +#~ "necessita di eseguire questo comando." + +#, python-format +#~ msgid "Delivery Note \"%(name)s\" of %(date)s" +#~ msgstr "DDT \"%(name)s\" del %(date)s" + +#~ msgid "Is Carrier" +#~ msgstr "È trasportatore" + +#~ msgid "DN date" +#~ msgstr "Data Traporto" + +#~ msgid "Partner document" +#~ msgstr "Contatto del documento" + +#, python-format +#~ msgid "Delivery Note \"{}\" of {}" +#~ msgstr "DdT \"{}\" del {}" + +#~ msgid "SMS Delivery error" +#~ msgstr "Errore consegna SMS" + +#~ msgid "Number of messages which requires an action" +#~ msgstr "Numero di messaggi che richiedono un'azione" + +#~ msgid "Followers (Channels)" +#~ msgstr "Seguito da (canali)" + +#~ msgid "Number of unread messages" +#~ msgstr "Numero di messaggi non letti" + +#~ msgid "Unread Messages" +#~ msgstr "Messaggi non letti" + +#~ msgid "Unread Messages Counter" +#~ msgstr "Numero messaggi non letti" + +#~ msgid "Phone:" +#~ msgstr "Telefono:" + +#~ msgid "VAT:" +#~ msgstr "Partita IVA:" + +#~ msgid "Carriage Condition" +#~ msgstr "Condizione di trasporto" + +#~ msgid "" +#~ "It allows to prompt a confirmation to the user\n" +#~ " during the invoicing action if " +#~ "there's at\n" +#~ " least one unconfirmed delivery note." +#~ msgstr "" +#~ "Consente di mostrare una richiesta di conferma all'utente\n" +#~ " durante l'azione di fatturazione di " +#~ "un ordine se\n" +#~ " è presente almeno un DdT non " +#~ "confermato." + +#~ msgid "Notify if delivery note isn't validated" +#~ msgstr "Notifica se il DdT non è validato" diff --git a/l10n_it_delivery_note/i18n/l10n_it_delivery_note.pot b/l10n_it_delivery_note/i18n/l10n_it_delivery_note.pot new file mode 100644 index 000000000000..565f9cd41c1c --- /dev/null +++ b/l10n_it_delivery_note/i18n/l10n_it_delivery_note.pot @@ -0,0 +1,2195 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * l10n_it_delivery_note +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: l10n_it_delivery_note +#: model:ir.module.category,description:l10n_it_delivery_note.module_category_inventory_checkboxes +msgid "" +"\n" +" Define some other extra rights on inventory management.\n" +" " +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note.py:0 +msgid "%s hasn't sale order!" +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note.py:0 +msgid "%s is already invoiced!" +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note.py:0 +msgid "%s is in draft!" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.actions.report,print_report_name:l10n_it_delivery_note.delivery_note_report_action +msgid "'Delivery Note - %s' % object.display_name" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.portal_delivery_note_page +msgid " Download" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_select_form_view +msgid "" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.sale_advance_payment_inv_form_view +msgid " Warning!" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +msgid "" +"\n" +" \n" +" Warning!\n" +" \n" +" Inconsistent DN info in sale orders!" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "" +" Delivery Note: \n" +" Under the terms of Italian Presidential Decree 472-96 of 14.08.1996" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_data +msgid "Carriage Condition" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "Carrier:" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "Delivery Method:" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_data +msgid "Method of Transport / Carrier" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_data +msgid "Method of Transport:" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.sale_advance_payment_inv_form_view +msgid "" +"N.B.: there will be no way, subsequently, to restore\n" +" this binding between the delivery note lines with the related sales order." +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_data +msgid "Reason of Transport" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "Warehouse:" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,help:l10n_it_delivery_note.field_stock_delivery_note_line__product_description +msgid "" +"A description of the Product that you want to communicate to your customers." +" This description will be copied to every Sales Order, Delivery Order and " +"Customer Invoice/Credit Note" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__access_warning +msgid "Access warning" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__message_needaction +msgid "Action Needed" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__active +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_type__active +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_goods_appearance__active +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_condition__active +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_method__active +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_reason__active +msgid "Active" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__activity_ids +msgid "Activities" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__activity_state +msgid "Activity State" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__activity_type_icon +msgid "Activity Type Icon" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_type__next_sequence_number +msgid "Actual Next Number" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +msgid "Add a note" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +msgid "Add a section" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:res.groups,name:l10n_it_delivery_note.can_change_number +msgid "Allow to change delivery note number" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_goods_appearance__name +msgid "Appearance name" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_stock_picking_goods_appearance +msgid "Appearance of Goods" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_res_partner__default_goods_appearance_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_res_users__default_goods_appearance_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_sale_order__default_goods_appearance_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__goods_appearance_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_type__default_goods_appearance_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__goods_appearance_id +msgid "Appearance of goods" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_l10n_it_delivery_note_delivery_mixin__delivery_goods_appearance_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__delivery_goods_appearance_id +msgid "Appearance of goods of Delivery" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.actions.act_window,name:l10n_it_delivery_note.stock_picking_goods_appearance_action +#: model:ir.ui.menu,name:l10n_it_delivery_note.stock_picking_good_appearance_menu +msgid "Appearances of goods" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_type_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_goods_appearance_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_transport_condition_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_transport_method_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_transport_reason_form_view +msgid "Archived" +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/mixins/picking_checker.py:0 +msgid "" +"At least one picking you've selected appears to be already related to " +"another delivery note." +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/mixins/picking_checker.py:0 +msgid "At least one picking you've selected doesn't appear to be completed." +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__message_attachment_count +msgid "Attachment Count" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.res_config_settings_form_view +msgid "" +"Block the validation of incoming DNs if the\n" +" \"Partner reference\" field is not set." +msgstr "" + +#. module: l10n_it_delivery_note +#: model:stock.picking.goods.appearance,name:l10n_it_delivery_note.goods_appearance_CAR +msgid "Box" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:stock.picking.goods.appearance,name:l10n_it_delivery_note.goods_appearance_CBA +msgid "Box / Pallet" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:stock.picking.goods.appearance,name:l10n_it_delivery_note.goods_appearance_SFU +msgid "Bulk" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__can_be_invoiced +msgid "Can Be Invoiced" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__can_change_number +msgid "Can Change Number" +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_location.py:0 +msgid "" +"Can't find a default virtual locations root.\n" +"Ask your system administrator to set it from the Warehouse configurations page before continue." +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_confirm_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_create_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_select_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.view_stock_delivery_note_invoice_wizard +msgid "Cancel" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_delivery_note__state__cancel +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_form_view +msgid "Cancelled" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:stock.picking.transport.condition,name:l10n_it_delivery_note.transport_condition_PA +msgid "Carriage forward" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:stock.picking.transport.condition,name:l10n_it_delivery_note.transport_condition_PF +msgid "Carriage paid" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__carrier_id +#: model:stock.picking.transport.method,name:l10n_it_delivery_note.transport_method_COR +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_form_view +msgid "Carrier" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_l10n_it_delivery_note_delivery_mixin__delivery_carrier_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__delivery_carrier_id +msgid "Carrier of Delivery" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.parcels_data +msgid "Carrier's Signature" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +msgid "Carriers" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:stock.picking.transport.condition,name:l10n_it_delivery_note.transport_condition_PAF +msgid "Charged in invoice" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_l10n_it_delivery_note_delivery_mixin +msgid "Common data for records to be delivered" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.portal_delivery_note_page +msgid "Communication history" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_res_company +msgid "Companies" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__company_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__company_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_type__company_id +msgid "Company" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_condition__name +msgid "Condition name" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_stock_picking_transport_condition +msgid "Condition of Transport" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_res_partner__default_transport_condition_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_res_users__default_transport_condition_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_sale_order__default_transport_condition_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__transport_condition_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_type__default_transport_condition_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__transport_condition_id +msgid "Condition of transport" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_l10n_it_delivery_note_delivery_mixin__delivery_transport_condition_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__delivery_transport_condition_id +msgid "Condition of transport of Delivery" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.actions.act_window,name:l10n_it_delivery_note.stock_picking_transport_condition_action +#: model:ir.ui.menu,name:l10n_it_delivery_note.stock_picking_transport_condition_menu +msgid "Conditions of transport" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__sale_advance_payment_inv__step__confirm +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_confirm_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_create_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_select_form_view +msgid "Confirm" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_res_partner +msgid "Contact" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.view_stock_delivery_note_invoice_wizard +msgid "Create Invoice" +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_picking.py:0 +#: model:ir.actions.act_window,name:l10n_it_delivery_note.stock_delivery_note_create_action +msgid "Create a new delivery note" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_form_view +msgid "Create invoice" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.actions.act_window,name:l10n_it_delivery_note.action_stock_delivery_note_invoice_wizard +msgid "Create invoices" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_form_view +msgid "Create new" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__create_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_confirm_wizard__create_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_create_wizard__create_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_invoice_wizard__create_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__create_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_select_wizard__create_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_type__create_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_goods_appearance__create_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_condition__create_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_method__create_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_reason__create_uid +msgid "Created by" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__create_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_confirm_wizard__create_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_create_wizard__create_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_invoice_wizard__create_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__create_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_select_wizard__create_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_type__create_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_goods_appearance__create_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_condition__create_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_method__create_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_reason__create_date +msgid "Created on" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__currency_id +msgid "Currency" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_sale_advance_payment_inv__step +msgid "Current step" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "Customer" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,help:l10n_it_delivery_note.field_stock_delivery_note__access_url +msgid "Customer Portal URL" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__sale_order_client_ref +msgid "Customer Reference" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__delivery_note_carrier_id +msgid "DN Carrier" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__delivery_note_date +msgid "DN Date" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__picking_type_code +msgid "DN Operation Type" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__packages +msgid "DN Packages" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__delivery_note_state +msgid "DN State" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__delivery_note_volume +msgid "DN Volume" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_base_wizard__date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_create_wizard__date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_select_wizard__date +msgid "Date" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +msgid "Dates" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_tree_view +msgid "Delivery Method" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.actions.report,name:l10n_it_delivery_note.delivery_note_report_action +#: model:ir.model,name:l10n_it_delivery_note.model_stock_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_account_move_line__delivery_note_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_sale_order__delivery_note_ids +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_confirm_wizard__delivery_note_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__delivery_note_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_select_wizard__delivery_note_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__delivery_note_id +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_form_view +msgid "Delivery Note" +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/account_invoice.py:0 +msgid "Delivery Note \"%(ddt_name)s\" of %(ddt_date)s" +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/controllers/portal.py:0 +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.portal_my_delivery_notes +msgid "Delivery Note #" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_stock_delivery_note_base_wizard +msgid "Delivery Note Base" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_stock_delivery_note_confirm_wizard +msgid "Delivery Note Confirm" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_account_bank_statement_line__delivery_note_count +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_account_move__delivery_note_count +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_sale_order__delivery_note_count +msgid "Delivery Note Count" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_stock_delivery_note_create_wizard +msgid "Delivery Note Creator" +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/controllers/portal.py:0 +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.portal_my_delivery_notes +msgid "Delivery Note Date" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__delivery_note_draft +msgid "Delivery Note Draft" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__delivery_note_exists +msgid "Delivery Note Exists" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_stock_delivery_note_invoice_wizard +msgid "Delivery Note Invoice" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_stock_delivery_note_line +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_sale_order_line__delivery_note_line_ids +msgid "Delivery Note Line" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__delivery_note_readonly +msgid "Delivery Note Readonly" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_stock_delivery_note_select_wizard +msgid "Delivery Note Selector" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__delivery_note_sequence_id +msgid "Delivery Note Sequence" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_stock_delivery_note_type +msgid "Delivery Note Type" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.actions.act_window,name:l10n_it_delivery_note.stock_delivery_note_type_action +#: model:ir.ui.menu,name:l10n_it_delivery_note.stock_delivery_note_type_menu +msgid "Delivery Note Types" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.actions.act_window,name:l10n_it_delivery_note.stock_delivery_note_action +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_account_bank_statement_line__delivery_note_ids +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_account_move__delivery_note_ids +#: model:ir.ui.menu,name:l10n_it_delivery_note.stock_delivery_note_config_menu +#: model:ir.ui.menu,name:l10n_it_delivery_note.stock_delivery_note_menu +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.account_view_move_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.portal_my_delivery_notes +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.portal_my_home_menu_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.res_config_settings_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_form_view +msgid "Delivery Notes" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_sale_order_line__delivery_picking_id +msgid "Delivery Picking" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "Delivery address" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__delivery_method_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__delivery_method_id +msgid "Delivery method" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__name +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "Description" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +msgid "Details" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__discount +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "Discount" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_res_company__display_carrier_dn_report +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_res_config_settings__display_carrier_dn_report +msgid "Display Carrier in Delivery Note Report" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_res_company__display_delivery_method_dn_report +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_res_config_settings__display_delivery_method_dn_report +msgid "Display Delivery Method in Delivery Note Report" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__display_name +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_confirm_wizard__display_name +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_create_wizard__display_name +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_invoice_wizard__display_name +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__display_name +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_select_wizard__display_name +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_type__display_name +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_goods_appearance__display_name +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_condition__display_name +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_method__display_name +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_reason__display_name +msgid "Display Name" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_res_company__display_ref_customer_dn_report +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_res_config_settings__display_ref_customer_dn_report +msgid "Display Ref. Customer in Delivery Note Report" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_res_company__display_ref_order_dn_report +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_res_config_settings__display_ref_order_dn_report +msgid "Display Ref. Order in Delivery Note Report" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +msgid "Document" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "Document:" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_delivery_note__state__done +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_form_view +msgid "Done" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.portal_delivery_note_page +msgid "Download" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_delivery_note__state__draft +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_form_view +msgid "Draft" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_search_view +msgid "Draft DN" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +msgid "Draft document" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "Draft document:" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.parcels_data +msgid "Driver's Signature" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_base_wizard__error_message +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_create_wizard__error_message +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_select_wizard__error_message +msgid "Error Message" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.portal_my_home_delivery_note +msgid "Follow or download your delivery notes" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__message_follower_ids +msgid "Followers" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__message_partner_ids +msgid "Followers (Partners)" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,help:l10n_it_delivery_note.field_stock_delivery_note__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_delivery_note__invoice_status__invoiced +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_delivery_note_line__invoice_status__invoiced +msgid "Fully invoiced" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_tree_view +msgid "Go to delivery note" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +msgid "Go to invoice" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_type_tree_view +msgid "Go to sequence" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.parcels_data +msgid "Goods Description" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:stock.picking.transport.reason,name:l10n_it_delivery_note.transport_reason_VIS +msgid "Goods on approval" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.parcels_data +msgid "Gross Weight" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_l10n_it_delivery_note_delivery_mixin__delivery_gross_weight +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__delivery_gross_weight +msgid "Gross Weight of Delivery" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_l10n_it_delivery_note_delivery_mixin__delivery_gross_weight_uom_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__delivery_gross_weight_uom_id +msgid "Gross Weight of Delivery UoM" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__gross_weight +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__gross_weight +msgid "Gross weight" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__gross_weight_uom_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__gross_weight_uom_id +msgid "Gross weight UoM" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__has_message +msgid "Has Message" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_confirm_wizard__id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_create_wizard__id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_invoice_wizard__id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_select_wizard__id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_type__id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_goods_appearance__id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_condition__id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_method__id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_reason__id +msgid "ID" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__activity_exception_icon +msgid "Icon" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,help:l10n_it_delivery_note.field_stock_delivery_note__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,help:l10n_it_delivery_note.field_stock_delivery_note__message_needaction +msgid "If checked, new messages require your attention." +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,help:l10n_it_delivery_note.field_stock_delivery_note__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_wizard_error_message_template +msgid "If these problems persist, don't hesitate to contact the helpdesk." +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note.py:0 +msgid "" +"In %(ddt_name)s there is %(product_name)s with invoicing policy 'order'" +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note_type.py:0 +#: code:addons/l10n_it_delivery_note/tests/test_stock_delivery_note_sequence.py:0 +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_delivery_note_type__code__incoming +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +msgid "Incoming" +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note_type.py:0 +msgid "Incoming DdT sequence" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__sale_advance_payment_inv__step__initial +msgid "Initial" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_delivery_note_type__code__internal +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +msgid "Internal" +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note_type.py:0 +msgid "Internal DdT sequence" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_type__note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__delivery_note_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_goods_appearance__note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_condition__note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_method__note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_reason__note +msgid "Internal note" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_l10n_it_delivery_note_delivery_mixin__delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__delivery_note +msgid "Internal note of delivery" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_type_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_goods_appearance_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_transport_condition_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_transport_method_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_transport_reason_form_view +msgid "Internal notes" +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note_type.py:0 +#: code:addons/l10n_it_delivery_note/tests/test_stock_delivery_note_sequence.py:0 +msgid "Internal transfer" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_stock_location +msgid "Inventory Locations" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.module.category,name:l10n_it_delivery_note.module_category_inventory_checkboxes +msgid "Inventory settings" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_invoice_wizard__invoice_method +msgid "Invoice Method" +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/wizard/sale_advance_payment_inv.py:0 +msgid "Invoice Order" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__invoice_status +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__invoice_status +msgid "Invoice status" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +msgid "Invoice statuses" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_invoice_wizard__invoice_date +msgid "Invoice/Bill Date" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_delivery_note__state__invoiced +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_form_view +msgid "Invoiced" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__invoice_ids +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +msgid "Invoices" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__message_is_follower +msgid "Is Follower" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_account_move +msgid "Journal Entry" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_account_move_line +msgid "Journal Item" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__write_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_confirm_wizard__write_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_create_wizard__write_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_invoice_wizard__write_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__write_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_select_wizard__write_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_type__write_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_goods_appearance__write_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_condition__write_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_method__write_uid +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_reason__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__write_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_confirm_wizard__write_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_create_wizard__write_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_invoice_wizard__write_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__write_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_select_wizard__write_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_type__write_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_goods_appearance__write_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_condition__write_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_method__write_date +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_reason__write_date +msgid "Last Updated on" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__display_type +msgid "Line type" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__line_ids +msgid "Lines" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__lines_have_customer_ref +msgid "Lines Have Customer Ref" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__lines_have_so_number +msgid "Lines Have So Number" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_res_config_settings__group_required_partner_ref +msgid "Make Partner Ref. in DN Mandatory" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:res.groups,name:l10n_it_delivery_note.group_required_partner_ref +msgid "Make Partner Ref. in DN Required" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__message_has_error +msgid "Message Delivery error" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__message_ids +msgid "Messages" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_method__name +msgid "Method name" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_stock_picking_transport_method +msgid "Method of Transport" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_res_partner__default_transport_method_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_res_users__default_transport_method_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_sale_order__default_transport_method_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__transport_method_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_type__default_transport_method_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__transport_method_id +msgid "Method of transport" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_l10n_it_delivery_note_delivery_mixin__delivery_transport_method_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__delivery_transport_method_id +msgid "Method of transport of Delivery" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.actions.act_window,name:l10n_it_delivery_note.stock_picking_transport_method_action +#: model:ir.ui.menu,name:l10n_it_delivery_note.stock_picking_transport_method_menu +msgid "Methods of transport" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__name +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_type__name +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_tree_view +msgid "Name" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.parcels_data +msgid "Net Weight" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_l10n_it_delivery_note_delivery_mixin__delivery_net_weight +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__delivery_net_weight +msgid "Net Weight of Delivery" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_l10n_it_delivery_note_delivery_mixin__delivery_net_weight_uom_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__delivery_net_weight_uom_id +msgid "Net Weight of Delivery UoM" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__net_weight +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__net_weight +msgid "Net weight" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__net_weight_uom_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__net_weight_uom_id +msgid "Net weight UoM" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__activity_summary +msgid "Next Activity Summary" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__activity_type_id +msgid "Next Activity Type" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,help:l10n_it_delivery_note.field_stock_delivery_note_type__next_sequence_number +msgid "" +"Next number that will be used. This number can be incremented frequently so " +"the displayed value might already be obsolete" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_search_view +msgid "No DN" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_picking_transport_condition__price_to_show__none +msgid "None" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_delivery_note_line__display_type__line_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +msgid "Note" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_account_move_line__note_dn +msgid "Note DN" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.parcels_data +msgid "Notes" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_delivery_note__invoice_status__no +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_delivery_note_line__invoice_status__no +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +msgid "Nothing to invoice" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__message_needaction_counter +msgid "Number of Actions" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__message_has_error_counter +msgid "Number of errors" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,help:l10n_it_delivery_note.field_stock_delivery_note__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,help:l10n_it_delivery_note.field_stock_delivery_note__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_type__sequence_id +msgid "Numeration" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_delivery_note_invoice_wizard__invoice_method__dn +msgid "Only DN" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +msgid "Open picking" +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note_type.py:0 +#: code:addons/l10n_it_delivery_note/tests/test_stock_delivery_note_sequence.py:0 +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_delivery_note_type__code__outgoing +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +msgid "Outgoing" +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note_type.py:0 +#: code:addons/l10n_it_delivery_note/tests/test_stock_delivery_note_sequence.py:0 +msgid "Outgoing (with prices)" +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note_type.py:0 +msgid "Outgoing DdT sequence" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__packages +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.parcels_data +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.portal_my_delivery_notes +msgid "Packages" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_l10n_it_delivery_note_delivery_mixin__delivery_packages +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__delivery_packages +msgid "Packages of Delivery" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:stock.picking.goods.appearance,name:l10n_it_delivery_note.goods_appearance_BAN +msgid "Pallet" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__partner_ref +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__delivery_note_partner_ref +msgid "Partner reference" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_select_wizard__picking_ids +msgid "Picking" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_stock_picking_checker_mixin +msgid "Picking Checker Mixin" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__picking_type +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_create_wizard__picking_type +msgid "Picking type" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +msgid "Picking types" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__picking_ids +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_create_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_select_form_view +msgid "Pickings" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__pickings_picker +msgid "Pickings Picker" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_wizard_error_message_template +msgid "Please, check and solve these problems before trying again." +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__access_url +msgid "Portal Access URL" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_condition__price_to_show +msgid "Price to show" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_form_view +msgid "Print" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.res_config_settings_form_view +msgid "Prints Carrier's name on DN report (if there are any)" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.res_config_settings_form_view +msgid "Prints Customer References on DN report (if there are any)" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.res_config_settings_form_view +msgid "Prints Delivery Method on DN report (if there are any)" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.res_config_settings_form_view +msgid "Prints Sale Order numbers on DN report (if there are any)" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__product_id +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "Product" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__product_qty +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "Quantity" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_reason__name +msgid "Reason name" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_stock_picking_transport_reason +msgid "Reason of Transport" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_res_partner__default_transport_reason_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_res_users__default_transport_reason_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_sale_order__default_transport_reason_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__transport_reason_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_type__default_transport_reason_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__transport_reason_id +msgid "Reason of transport" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_l10n_it_delivery_note_delivery_mixin__delivery_transport_reason_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__delivery_transport_reason_id +msgid "Reason of transport of Delivery" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.actions.act_window,name:l10n_it_delivery_note.stock_picking_transport_reason_action +#: model:ir.ui.menu,name:l10n_it_delivery_note.stock_picking_transport_reason_menu +msgid "Reasons of transport" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__partner_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_base_wizard__partner_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_create_wizard__partner_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_select_wizard__partner_id +#: model:stock.picking.transport.method,name:l10n_it_delivery_note.transport_method_DES +msgid "Recipient" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.parcels_data +msgid "Recipient's Signature" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +msgid "Recipients" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "Ref. Customer" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "Ref. Order" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_form_view +msgid "Reset to draft" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__activity_user_id +msgid "Responsible User" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:stock.picking.transport.reason,name:l10n_it_delivery_note.transport_reason_RES +msgid "Returned" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__sale_ids +#: model:stock.picking.transport.reason,name:l10n_it_delivery_note.transport_reason_VEN +msgid "Sale" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__sale_count +msgid "Sale Count" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__sale_line_id +msgid "Sale Line" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__sale_order_number +msgid "Sale Order Number" +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note.py:0 +msgid "" +"Sale orders related to %s have return! For invoicing, go to sale orders." +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_sale_advance_payment_inv +msgid "Sales Advance Payment Invoice" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__product_description +msgid "Sales Description" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_sale_order +msgid "Sales Order" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_sale_order_line +msgid "Sales Order Line" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__sales_transport_check +msgid "Sales Transport Check" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +msgid "Sales orders" +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/controllers/portal.py:0 +msgid "Search in Description" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_delivery_note_line__display_type__line_section +msgid "Section" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +msgid "Section name (e.g. Products, Services)" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__access_token +msgid "Security Token" +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_picking.py:0 +#: model:ir.actions.act_window,name:l10n_it_delivery_note.stock_delivery_note_select_action +msgid "Select an existing delivery note" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_form_view +msgid "Select existing" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.res_config_settings_form_view +msgid "" +"Select the root of all your virtual locations.
\n" +" Internal transfers between at least one virtual\n" +" locations won't generate automatically any DN\n" +" documents." +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_base_wizard__selected_picking_ids +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_create_wizard__selected_picking_ids +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_select_wizard__selected_picking_ids +msgid "Selected Picking" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__partner_sender_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_base_wizard__partner_sender_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_create_wizard__partner_sender_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_select_wizard__partner_sender_id +#: model:stock.picking.transport.method,name:l10n_it_delivery_note.transport_method_MIT +msgid "Sender" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +msgid "Senders" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__sequence_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__sequence +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_type__sequence +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_goods_appearance__sequence +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_condition__sequence +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_method__sequence +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking_transport_reason__sequence +msgid "Sequence" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_form_view +msgid "Set done" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_shipping_information_updater_mixin +msgid "Shipping Information Updater Mixin" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__partner_shipping_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_base_wizard__partner_shipping_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_create_wizard__partner_shipping_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_select_wizard__partner_shipping_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__delivery_note_partner_shipping_id +msgid "Shipping address" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.res_partner_form_view +msgid "Shipping information" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__show_product_information +msgid "Show Product Information" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__print_prices +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_type__print_prices +msgid "Show prices on printed DN" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:res.groups,name:l10n_it_delivery_note.show_product_related_fields +msgid "Show product information in delivery note lines" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__state +msgid "State" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +msgid "States" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,help:l10n_it_delivery_note.field_stock_delivery_note__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_create_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_select_form_view +msgid "Summary" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__dn_supplier_date +msgid "Supplier DN Date" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__dn_supplier_number +msgid "Supplier DN Number" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +msgid "Tax" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "Tax ID" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +msgid "Tax excluded" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__tax_ids +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "Taxes" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.constraint,message:l10n_it_delivery_note.constraint_stock_delivery_note_name_uniq +msgid "The Delivery note must have unique numbers." +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note.py:0 +msgid "" +"The carrier set in Delivery Note is different from the carrier set in " +"picking(s). Are you sure you want to proceed?" +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note.py:0 +msgid "" +"The field 'Partner reference' is mandatory to validate the Delivery Note." +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,help:l10n_it_delivery_note.field_stock_picking__carrier_partner_id +msgid "The partner that is doing the delivery service." +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/mixins/picking_checker.py:0 +msgid "" +"The pickings you've selected don't seem to have any location of departure." +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/mixins/picking_checker.py:0 +msgid "" +"The pickings you've selected don't seem to have any location of destination." +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/mixins/picking_checker.py:0 +msgid "" +"The pickings you've selected don't seem to have any partner or the selected " +"warehouse doesn't have a valid address." +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/mixins/picking_checker.py:0 +msgid "The pickings you've selected don't seem to have any type." +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/wizard/delivery_note_select.py:0 +msgid "The selected pickings have different delivery methods: %(carriers)s" +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note.py:0 +msgid "" +"The shipping method set in Delivery Note is different from the shipping " +"method set in picking(s). Are you sure you want to proceed?" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.sale_advance_payment_inv_form_view +msgid "" +"There appears to be one or more delivery notes in \"Draft\" state.
\n" +" If you proceed with the creation of an invoice (other than the downpayment one),\n" +" the affected delivery note lines will be detached from the sales order and\n" +" will not appear linked to the generated invoice." +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.portal_my_delivery_notes +msgid "There are currently no delivery notes for your account." +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_wizard_error_message_template +msgid "There are one or more problems with the pickings you've selected:" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.constraint,message:l10n_it_delivery_note.constraint_stock_picking_goods_appearance_name_uniq +msgid "This appearance of goods already exists!" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.sale_advance_payment_inv_form_view +msgid "" +"This behaviour just described may not be wrong in some very specific cases.
\n" +" Proceed only if you are absolutely sure and aware of what you're doing." +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.constraint,message:l10n_it_delivery_note.constraint_stock_picking_transport_condition_name_uniq +msgid "This condition of transport already exists!" +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note.py:0 +msgid "" +"This delivery note contains pickings related to different delivery methods from the same transporter. Are you sure you want to proceed?\n" +"Delivery Methods: %(carriers)s" +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note.py:0 +msgid "" +"This delivery note contains pickings related to different transporters. Are you sure you want to proceed?\n" +"Carrier Partners: %(carrier_partners)s" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.constraint,message:l10n_it_delivery_note.constraint_stock_delivery_note_type_name_uniq +msgid "This delivery note type already exists!" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.constraint,message:l10n_it_delivery_note.constraint_stock_picking_transport_method_name_uniq +msgid "This method of transport already exists!" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.constraint,message:l10n_it_delivery_note.constraint_stock_picking_transport_reason_name_uniq +msgid "This reason of transport already exists!" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_delivery_note__invoice_status__to_invoice +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_delivery_note_line__invoice_status__to_invoice +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +msgid "To invoice" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +msgid "To pay" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +msgid "Total" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_picking_transport_condition__price_to_show__total +msgid "Total price" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model,name:l10n_it_delivery_note.model_stock_picking +msgid "Transfer" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_l10n_it_delivery_note_delivery_mixin__delivery_transport_datetime +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__delivery_transport_datetime +msgid "Transport Date of Delivery" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__transport_datetime +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__transport_datetime +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.parcels_data +msgid "Transport date" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__carrier_partner_id +msgid "Transporter" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__type_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_base_wizard__type_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_create_wizard__type_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_select_wizard__type_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__delivery_note_type_id +msgid "Type" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +msgid "Type codes" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__type_code +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_type__code +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__delivery_note_type_code +msgid "Type of Operation" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,help:l10n_it_delivery_note.field_stock_delivery_note__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +msgid "Types" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.sale_advance_payment_inv_form_view +msgid "Understood, continue anyway" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "Unit Price" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__price_unit +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_picking_transport_condition__price_to_show__unit +msgid "Unit price" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__product_uom_id +msgid "UoM" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_form_view +msgid "Update to now" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__use_delivery_note +msgid "Use Delivery Note" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__valid_move_ids +msgid "Valid Move" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_form_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_form_view +msgid "Validate" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_delivery_note__state__confirm +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_delivery_note_search_view +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_form_view +msgid "Validated" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_search_view +msgid "Validated DN" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_res_config_settings__virtual_locations_root +msgid "Virtual locations root" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__volume +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.stock_picking_form_view +msgid "Volume" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__volume_uom_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_picking__delivery_note_volume_uom_id +msgid "Volume UoM" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_l10n_it_delivery_note_delivery_mixin__delivery_volume +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__delivery_volume +msgid "Volume of Delivery" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_l10n_it_delivery_note_delivery_mixin__delivery_volume_uom_id +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__delivery_volume_uom_id +msgid "Volume of Delivery UoM" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "Warehouse" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_line__move_id +msgid "Warehouse movement" +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note.py:0 +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_base_wizard__warning_message +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_create_wizard__warning_message +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_select_wizard__warning_message +msgid "Warning" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note_confirm_wizard__warning_message +msgid "Warning Message" +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note.py:0 +#: code:addons/l10n_it_delivery_note/models/stock_picking.py:0 +#: code:addons/l10n_it_delivery_note/wizard/delivery_note_base.py:0 +msgid "Warning!" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,field_description:l10n_it_delivery_note.field_stock_delivery_note__website_message_ids +msgid "Website Messages" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields,help:l10n_it_delivery_note.field_stock_delivery_note__website_message_ids +msgid "Website communication history" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.fields.selection,name:l10n_it_delivery_note.selection__stock_delivery_note_invoice_wizard__invoice_method__service +msgid "With Service" +msgstr "" + +#. module: l10n_it_delivery_note +#: model:ir.model.constraint,message:l10n_it_delivery_note.constraint_stock_delivery_note_line_move_uniq +msgid "" +"You cannot assign the same warehouse movement to different delivery notes!" +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note.py:0 +msgid "" +"You cannot cancel this delivery note. There is at least one invoice related " +"to this delivery note." +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note_line.py:0 +msgid "" +"You cannot change the type of a delivery note line. Instead you should " +"delete the current line and create a new line of the proper type." +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note.py:0 +#: code:addons/l10n_it_delivery_note/models/stock_picking.py:0 +msgid "" +"You cannot set this delivery note type due of a different numerator " +"configuration." +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_delivery_note.py:0 +msgid "" +"You cannot set this delivery note type due of a different type with related " +"pickings." +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_picking.py:0 +msgid "" +"You have just called this method on an heterogeneous set of pickings.\n" +"All pickings should have the same 'location_dest_id' field value." +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_picking.py:0 +msgid "" +"You have just called this method on an heterogeneous set of pickings.\n" +"All pickings should have the same 'location_id' field value." +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_picking.py:0 +msgid "" +"You have just called this method on an heterogeneous set of pickings.\n" +"All pickings should have the same 'partner_id' field value." +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/models/stock_picking.py:0 +msgid "" +"You have just called this method on an heterogeneous set of pickings.\n" +"All pickings should have the same 'picking_type_code' field value." +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/mixins/picking_checker.py:0 +msgid "You need to select pickings with all the same location of departure." +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/mixins/picking_checker.py:0 +msgid "You need to select pickings with all the same location of destination." +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/mixins/picking_checker.py:0 +msgid "You need to select pickings with all the same recipient." +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/mixins/picking_checker.py:0 +msgid "You need to select pickings with all the same type." +msgstr "" + +#. module: l10n_it_delivery_note +#. odoo-python +#: code:addons/l10n_it_delivery_note/mixins/picking_checker.py:0 +msgid "" +"You shouldn't be able to launch this wizard without selecting any pickings." +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.portal_my_home_delivery_note +msgid "Your Delivery Notes" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "best before" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "lot / sn :" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "of:" +msgstr "" + +#. module: l10n_it_delivery_note +#: model_terms:ir.ui.view,arch_db:l10n_it_delivery_note.delivery_note_report_template +msgid "qty" +msgstr "" diff --git a/l10n_it_delivery_note/mixins/__init__.py b/l10n_it_delivery_note/mixins/__init__.py new file mode 100644 index 000000000000..28ad667b944c --- /dev/null +++ b/l10n_it_delivery_note/mixins/__init__.py @@ -0,0 +1,3 @@ +from . import delivery_mixin +from . import picking_checker +from . import shipping_updater diff --git a/l10n_it_delivery_note/mixins/delivery_mixin.py b/l10n_it_delivery_note/mixins/delivery_mixin.py new file mode 100644 index 000000000000..6e9657b17c02 --- /dev/null +++ b/l10n_it_delivery_note/mixins/delivery_mixin.py @@ -0,0 +1,72 @@ +# Copyright 2023 Simone Rubino - Aion Tech +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + + +from odoo import fields, models + + +def _default_volume_uom(model): + return model.env.ref("uom.product_uom_litre", raise_if_not_found=False) + + +def _default_weight_uom(model): + return model.env.ref("uom.product_uom_kgm", raise_if_not_found=False) + + +class DeliveryData(models.AbstractModel): + _name = "l10n_it_delivery_note.delivery_mixin" + _description = "Common data for records to be delivered" + + delivery_transport_reason_id = fields.Many2one( + comodel_name="stock.picking.transport.reason", + string="Reason of transport of Delivery", + ) + delivery_transport_condition_id = fields.Many2one( + comodel_name="stock.picking.transport.condition", + string="Condition of transport of Delivery", + ) + delivery_transport_method_id = fields.Many2one( + comodel_name="stock.picking.transport.method", + string="Method of transport of Delivery", + ) + delivery_carrier_id = fields.Many2one( + comodel_name="res.partner", + string="Carrier of Delivery", + ) + delivery_goods_appearance_id = fields.Many2one( + comodel_name="stock.picking.goods.appearance", + string="Appearance of goods of Delivery", + ) + delivery_volume_uom_id = fields.Many2one( + "uom.uom", + string="Volume of Delivery UoM", + default=lambda self: self._default_volume_uom(), + ) + delivery_volume = fields.Float( + string="Volume of Delivery", + ) + delivery_gross_weight_uom_id = fields.Many2one( + "uom.uom", + string="Gross Weight of Delivery UoM", + default=lambda self: self._default_weight_uom(), + ) + delivery_gross_weight = fields.Float( + string="Gross Weight of Delivery", + ) + delivery_net_weight_uom_id = fields.Many2one( + "uom.uom", + string="Net Weight of Delivery UoM", + default=lambda self: self._default_weight_uom(), + ) + delivery_net_weight = fields.Float( + string="Net Weight of Delivery", + ) + delivery_transport_datetime = fields.Datetime( + string="Transport Date of Delivery", + ) + delivery_packages = fields.Integer( + string="Packages of Delivery", + ) + delivery_note = fields.Html( + string="Internal note of delivery", + ) diff --git a/l10n_it_delivery_note/mixins/picking_checker.py b/l10n_it_delivery_note/mixins/picking_checker.py new file mode 100644 index 000000000000..85accbdf6e0e --- /dev/null +++ b/l10n_it_delivery_note/mixins/picking_checker.py @@ -0,0 +1,126 @@ +# Copyright (c) 2019, Link IT Europe Srl +# @author: Matteo Bilotta + +from odoo import api, models +from odoo.exceptions import ValidationError + +ALLOWED_PICKING_STATES = ["done"] + + +class StockPickingCheckerMixin(models.AbstractModel): + _name = "stock.picking.checker.mixin" + _description = "Picking Checker Mixin" + + @api.model + def _check_pickings(self, pickings): + if not pickings: + raise ValidationError( + self.env._( + "You shouldn't be able to launch this wizard " + "without selecting any pickings." + ) + ) + + @api.model + def _check_pickings_state(self, pickings): + if pickings.filtered(lambda p: p.state not in ALLOWED_PICKING_STATES): + raise ValidationError( + self.env._( + "At least one picking you've selected doesn't " + "appear to be completed." + ) + ) + + @api.model + def _check_pickings_types(self, pickings): + types = set(pickings.mapped("picking_type_code")) + + if not types: + raise ValidationError( + self.env._("The pickings you've selected don't seem to have any type.") + ) + + if len(types) > 1: + raise ValidationError( + self.env._("You need to select pickings with all the same type.") + ) + + @api.model + def _check_pickings_partners(self, pickings): + types = set(pickings.mapped("picking_type_code")) + if "internal" in types: + return + + partners = pickings.mapped("partner_id") + + if not partners: + raise ValidationError( + self.env._( + "The pickings you've selected don't seem to have any partner" + " or the selected warehouse doesn't have a valid address." + ) + ) + + if len(partners) > 1: + raise ValidationError( + self.env._("You need to select pickings with all the same recipient.") + ) + + @api.model + def _check_pickings_src_locations(self, pickings): + src_locations = pickings.mapped("location_id") + + if not src_locations: + raise ValidationError( + self.env._( + "The pickings you've selected don't seem to " + "have any location of departure." + ) + ) + + if len(src_locations) > 1: + raise ValidationError( + self.env._( + "You need to select pickings with all the same " + "location of departure." + ) + ) + + @api.model + def _check_pickings_dest_locations(self, pickings): + dest_locations = pickings.mapped("location_dest_id") + + if not dest_locations: + raise ValidationError( + self.env._( + "The pickings you've selected don't seem to have any " + "location of destination." + ) + ) + + if len(dest_locations) > 1: + raise ValidationError( + self.env._( + "You need to select pickings with all the same location " + "of destination." + ) + ) + + @api.model + def _check_delivery_notes(self, pickings): + if pickings.filtered(lambda p: p.delivery_note_id): + raise ValidationError( + self.env._( + "At least one picking you've selected appears to" + " be already related to another delivery note." + ) + ) + + @api.model + def check_compliance(self, pickings): + self._check_pickings(pickings) + self._check_pickings_state(pickings) + self._check_pickings_types(pickings) + self._check_pickings_partners(pickings) + self._check_pickings_src_locations(pickings) + self._check_pickings_dest_locations(pickings) diff --git a/l10n_it_delivery_note/mixins/shipping_updater.py b/l10n_it_delivery_note/mixins/shipping_updater.py new file mode 100644 index 000000000000..193fce034cf6 --- /dev/null +++ b/l10n_it_delivery_note/mixins/shipping_updater.py @@ -0,0 +1,66 @@ +# Copyright (c) 2020, Link IT Europe Srl +# @author: Matteo Bilotta + +from odoo import models + + +class ShippingInformationUpdaterMixin(models.AbstractModel): + _name = "shipping.information.updater.mixin" + _description = "Shipping Information Updater Mixin" + + def _update_generic_shipping_information(self, record): + changed = False + + if ( + record.default_transport_condition_id + and self.transport_condition_id != record.default_transport_condition_id + ): + if self.transport_condition_id: + changed = True + + self.transport_condition_id = record.default_transport_condition_id + + if ( + record.default_goods_appearance_id + and self.goods_appearance_id != record.default_goods_appearance_id + ): + if self.goods_appearance_id: + changed = True + + self.goods_appearance_id = record.default_goods_appearance_id + + if ( + record.default_transport_reason_id + and self.transport_reason_id != record.default_transport_reason_id + ): + if self.transport_reason_id: + changed = True + + self.transport_reason_id = record.default_transport_reason_id + + if ( + record.default_transport_method_id + and self.transport_method_id != record.default_transport_method_id + ): + if self.transport_method_id: + changed = True + + self.transport_method_id = record.default_transport_method_id + + return changed + + def _update_partner_shipping_information(self, partner): + changed = False + + if ( + partner.property_delivery_carrier_id + and self.delivery_method_id != partner.property_delivery_carrier_id + ): + if self.delivery_method_id: + changed = True + + self.delivery_method_id = partner.property_delivery_carrier_id + + changed |= self._update_generic_shipping_information(partner) + + return changed diff --git a/l10n_it_delivery_note/models/__init__.py b/l10n_it_delivery_note/models/__init__.py new file mode 100644 index 000000000000..f732bb1338e3 --- /dev/null +++ b/l10n_it_delivery_note/models/__init__.py @@ -0,0 +1,16 @@ +from . import account_invoice +from . import account_invoice_line +from . import res_company +from . import res_config_settings +from . import stock_delivery_note_type +from . import stock_picking_goods_appearance +from . import stock_picking_transport_condition +from . import stock_picking_transport_method +from . import stock_picking_transport_reason +from . import res_partner +from . import sale_order +from . import sale_order_line +from . import stock_delivery_note +from . import stock_delivery_note_line +from . import stock_location +from . import stock_picking diff --git a/l10n_it_delivery_note/models/account_invoice.py b/l10n_it_delivery_note/models/account_invoice.py new file mode 100644 index 000000000000..88caacb6e532 --- /dev/null +++ b/l10n_it_delivery_note/models/account_invoice.py @@ -0,0 +1,170 @@ +# Copyright 2014-2019 Dinamiche Aziendali srl +# (http://www.dinamicheaziendali.it/) +# @author: Marco Calcagni +# @author: Gianmarco Conte +# Copyright (c) 2019, Link IT Europe Srl +# @author: Matteo Bilotta +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import fields, models +from odoo.fields import Domain + +from .stock_delivery_note import DATE_FORMAT, DOMAIN_INVOICE_STATUSES + + +class AccountInvoice(models.Model): + _inherit = "account.move" + + delivery_note_ids = fields.Many2many( + "stock.delivery.note", + "stock_delivery_note_account_invoice_rel", + "invoice_id", + "delivery_note_id", + string="Delivery Notes", + copy=False, + ) + + delivery_note_count = fields.Integer(compute="_compute_delivery_note_count") + + def _compute_delivery_note_count(self): + for invoice in self: + invoice.delivery_note_count = len(invoice.delivery_note_ids) + + def goto_delivery_notes(self, **kwargs): + delivery_notes = self.mapped("delivery_note_ids") + action = self.env["ir.actions.act_window"]._for_xml_id( + "l10n_it_delivery_note.stock_delivery_note_action" + ) + action.update(kwargs) + + if len(delivery_notes) > 1: + action["domain"] = Domain("id", "in", delivery_notes.ids) + + elif len(delivery_notes) == 1: + action["views"] = [ + ( + self.env.ref( + "l10n_it_delivery_note.stock_delivery_note_form_view" + ).id, + "form", + ) + ] + action["res_id"] = delivery_notes.id + + else: + action = {"type": "ir.actions.act_window_close"} + + return action + + def goto_invoice(self, **kwargs): + self.ensure_one() + + if self.move_type.startswith("out"): + view_id = self.env.ref("account.view_move_form").id + + else: + view_id = False + + return { + "type": "ir.actions.act_window", + "res_model": "account.move", + "res_id": self.id, + "views": [(view_id, "form")], + "view_mode": "form", + "target": "current", + **kwargs, + } + + def _prepare_note_dn_value(self, sequence, delivery_note_id): + return { + "sequence": sequence, + "display_type": "line_note", + "name": self.env._( + """Delivery Note "%(ddt_name)s" of %(ddt_date)s""", + ddt_name=delivery_note_id.name, + ddt_date=delivery_note_id.date.strftime(DATE_FORMAT), + ), + "note_dn": True, + "delivery_note_id": delivery_note_id.id, + "quantity": 0, + } + + def update_delivery_note_lines(self): + context = {} + + for invoice in self.filtered(lambda i: i.delivery_note_ids): + new_lines = [] + old_lines = invoice.invoice_line_ids.filtered(lambda line: line.note_dn) + old_lines.unlink() + + # + # TODO: Come bisogna comportarsi nel caso in + # cui il DdT non sia un DdT "valido"? + # Al momento, potrebbe essere possibile avere + # sia sei DdT senza numero (non ancora confermati) + # così come è possibile avere dei DdT senza, necessariamente, + # data di trasporto (non è un campo obbligatorio). + # + + # + # THIS ALLOWS TO CHANGE TRANSLATION LANGUAGE FOR EVERY INVOICE! + # + # See: odoo/tools/translate.py -> 'def _get_lang(self, frame):' + # + context["lang"] = invoice.partner_id.lang + + if len(invoice.delivery_note_ids) == 1: + sequence = invoice.invoice_line_ids[0].sequence - 1 + new_lines.append( + ( + 0, + False, + self._prepare_note_dn_value( + sequence, invoice.delivery_note_ids[0] + ), + ) + ) + else: + for line in invoice.invoice_line_ids: + sequence = line.sequence - 1 + delivery_note_line = invoice.mapped( + "delivery_note_ids.line_ids" + ) & line.mapped("sale_line_ids.delivery_note_line_ids") + for delivery_note_id in delivery_note_line.filtered( + lambda l: l.invoice_status # noqa: E741 + == DOMAIN_INVOICE_STATUSES[2] + ).mapped("delivery_note_id"): + line.delivery_note_id = delivery_note_id.id + new_lines.append( + ( + 0, + False, + self._prepare_note_dn_value(sequence, delivery_note_id), + ) + ) + + invoice.write({"line_ids": new_lines}) + + def unlink(self): + # Ripristino il valore delle delivery note + # per poterle rifatturare + inv_lines = self.mapped("invoice_line_ids") + all_dnls = inv_lines.mapped("sale_line_ids").mapped("delivery_note_line_ids") + inv_dnls = self.mapped("delivery_note_ids").mapped("line_ids") + dnls_to_unlink = all_dnls & inv_dnls + res = super().unlink() + dnls_to_unlink.sync_invoice_status() + dnls_to_unlink.mapped("delivery_note_id")._compute_invoice_status() + for dn in dnls_to_unlink.mapped("delivery_note_id"): + dn.state = "confirm" + return res + + def button_cancel(self): # pylint: disable=missing-return + super().button_cancel() + dn_lines = ( + self.invoice_line_ids.sale_line_ids.delivery_note_line_ids + | self.delivery_note_ids.line_ids + ) + dn_lines.sync_invoice_status() + dn_lines.delivery_note_id._compute_invoice_status() + dn_lines.delivery_note_id.state = "confirm" diff --git a/l10n_it_delivery_note/models/account_invoice_line.py b/l10n_it_delivery_note/models/account_invoice_line.py new file mode 100644 index 000000000000..f13171454345 --- /dev/null +++ b/l10n_it_delivery_note/models/account_invoice_line.py @@ -0,0 +1,15 @@ +# Copyright 2022 Dinamiche Aziendali srl +# (http://www.dinamicheaziendali.it/) +# @author: Giuseppe Borruso +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import fields, models + + +class AccountInvoiceLine(models.Model): + _inherit = "account.move.line" + + delivery_note_id = fields.Many2one( + "stock.delivery.note", string="Delivery Note", readonly=True, copy=False + ) + note_dn = fields.Boolean(string="Note DN") diff --git a/l10n_it_delivery_note/models/res_company.py b/l10n_it_delivery_note/models/res_company.py new file mode 100644 index 000000000000..ec55b7355f89 --- /dev/null +++ b/l10n_it_delivery_note/models/res_company.py @@ -0,0 +1,36 @@ +# Copyright (c) 2023, Nextev Srl +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import api, fields, models + + +class ResCompany(models.Model): + _inherit = "res.company" + + display_ref_order_dn_report = fields.Boolean( + "Display Ref. Order in Delivery Note Report", + default=False, + ) + display_ref_customer_dn_report = fields.Boolean( + "Display Ref. Customer in Delivery Note Report", + default=False, + ) + display_carrier_dn_report = fields.Boolean( + "Display Carrier in Delivery Note Report", + default=False, + ) + display_delivery_method_dn_report = fields.Boolean( + "Display Delivery Method in Delivery Note Report", + default=False, + ) + + @api.model_create_multi + def create(self, vals): + """ + Create DN types and their sequences after companies creation + if they're not already existing + """ + res = super().create(vals) + for company in res: + self.env["stock.delivery.note.type"].sudo().create_dn_types(company) + return res diff --git a/l10n_it_delivery_note/models/res_config_settings.py b/l10n_it_delivery_note/models/res_config_settings.py new file mode 100644 index 000000000000..464779cd2768 --- /dev/null +++ b/l10n_it_delivery_note/models/res_config_settings.py @@ -0,0 +1,46 @@ +# Copyright (c) 2019, Link IT Europe Srl +# @author: Matteo Bilotta + +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + _inherit = "res.config.settings" + + def _default_virtual_locations_root(self): + return self.env.ref( + "stock.stock_location_locations_virtual", raise_if_not_found=False + ) + + group_required_partner_ref = fields.Boolean( + string="Make Partner Ref. in DN Mandatory", + implied_group="l10n_it_delivery_note.group_required_partner_ref", + ) + + virtual_locations_root = fields.Many2one( + "stock.location", + string="Virtual locations root", + default=lambda self: self._default_virtual_locations_root(), + config_parameter="stock.location.virtual_root", + ) + + display_ref_order_dn_report = fields.Boolean( + string="Display Ref. Order in Delivery Note Report", + related="company_id.display_ref_order_dn_report", + readonly=False, + ) + display_ref_customer_dn_report = fields.Boolean( + string="Display Ref. Customer in Delivery Note Report", + related="company_id.display_ref_customer_dn_report", + readonly=False, + ) + display_carrier_dn_report = fields.Boolean( + string="Display Carrier in Delivery Note Report", + related="company_id.display_carrier_dn_report", + readonly=False, + ) + display_delivery_method_dn_report = fields.Boolean( + string="Display Delivery Method in Delivery Note Report", + related="company_id.display_delivery_method_dn_report", + readonly=False, + ) diff --git a/l10n_it_delivery_note/models/res_partner.py b/l10n_it_delivery_note/models/res_partner.py new file mode 100644 index 000000000000..928760d2b8de --- /dev/null +++ b/l10n_it_delivery_note/models/res_partner.py @@ -0,0 +1,21 @@ +# Copyright (c) 2019, Link IT Europe Srl +# @author: Matteo Bilotta + +from odoo import fields, models + + +class ResPartner(models.Model): + _inherit = "res.partner" + + default_transport_condition_id = fields.Many2one( + "stock.picking.transport.condition", string="Condition of transport" + ) + default_goods_appearance_id = fields.Many2one( + "stock.picking.goods.appearance", string="Appearance of goods" + ) + default_transport_reason_id = fields.Many2one( + "stock.picking.transport.reason", string="Reason of transport" + ) + default_transport_method_id = fields.Many2one( + "stock.picking.transport.method", string="Method of transport" + ) diff --git a/l10n_it_delivery_note/models/sale_order.py b/l10n_it_delivery_note/models/sale_order.py new file mode 100644 index 000000000000..7381f079b5a8 --- /dev/null +++ b/l10n_it_delivery_note/models/sale_order.py @@ -0,0 +1,161 @@ +# Copyright (c) 2019, Link IT Europe Srl +# @author: Matteo Bilotta + +from odoo import api, fields, models +from odoo.fields import Command, Domain + +from .stock_delivery_note import DOMAIN_DELIVERY_NOTE_STATES, DOMAIN_INVOICE_STATUSES + + +class SaleOrder(models.Model): + _inherit = "sale.order" + + delivery_note_ids = fields.Many2many( + "stock.delivery.note", compute="_compute_delivery_notes" + ) + delivery_note_count = fields.Integer(compute="_compute_delivery_notes") + + default_transport_condition_id = fields.Many2one( + "stock.picking.transport.condition", + string="Condition of transport", + ) + default_goods_appearance_id = fields.Many2one( + "stock.picking.goods.appearance", + string="Appearance of goods", + ) + default_transport_reason_id = fields.Many2one( + "stock.picking.transport.reason", + string="Reason of transport", + ) + default_transport_method_id = fields.Many2one( + "stock.picking.transport.method", + string="Method of transport", + ) + + @api.onchange("partner_id") + def onchange_partner_id_shipping_info(self): + if self.partner_id: + values = { + "default_transport_condition_id": ( + self.partner_id.default_transport_condition_id + ), + "default_goods_appearance_id": ( + self.partner_id.default_goods_appearance_id + ), + "default_transport_reason_id": ( + self.partner_id.default_transport_reason_id + ), + "default_transport_method_id": ( + self.partner_id.default_transport_method_id + ), + } + + else: + values = { + "default_transport_condition_id": False, + "default_goods_appearance_id": False, + "default_transport_reason_id": False, + "default_transport_method_id": False, + } + + self.update(values) + + def _compute_delivery_notes(self): + for order in self: + delivery_notes = order.order_line.mapped( + "delivery_note_line_ids.delivery_note_id" + ) + + order.delivery_note_ids = delivery_notes + order.delivery_note_count = len(delivery_notes) + + def _assign_delivery_notes_invoices(self, invoice_ids): + order_lines = self.mapped("order_line").filtered( + lambda order_line: order_line.is_invoiced + and order_line.delivery_note_line_ids + ) + + delivery_note_lines = order_lines.mapped("delivery_note_line_ids").filtered( + lambda dn_line: dn_line.is_invoiceable + ) + delivery_notes = delivery_note_lines.mapped("delivery_note_id") + + ready_delivery_notes = delivery_notes.filtered( + lambda n: n.state != DOMAIN_DELIVERY_NOTE_STATES[0] + ) + + draft_delivery_notes = delivery_notes - ready_delivery_notes + draft_delivery_note_lines = ( + draft_delivery_notes.mapped("line_ids") & delivery_note_lines + ) + + ready_delivery_note_lines = delivery_note_lines - draft_delivery_note_lines + + # + # TODO: È necessario gestire il caso di fatturazione splittata + # di una stessa riga d'ordine associata ad una sola + # picking (e di conseguenza, ad un solo DdT)? + # Può essere, invece, un caso "borderline" + # da lasciar gestire all'operatore? + # Personalmente, non lo gestirei e delegherei + # all'operatore questa responsabilità... + # + + draft_delivery_note_lines.write( + {"invoice_status": DOMAIN_INVOICE_STATUSES[0], "sale_line_id": None} + ) + + ready_delivery_note_lines.write({"invoice_status": DOMAIN_INVOICE_STATUSES[2]}) + for ready_delivery_note in ready_delivery_notes: + ready_invoice_ids = [ + invoice_id + for invoice_id in ready_delivery_note.sale_ids.mapped("invoice_ids").ids + if invoice_id in invoice_ids + ] + ready_delivery_note.write( + { + "invoice_ids": [ + Command.link(invoice_id) for invoice_id in ready_invoice_ids + ] + } + ) + + ready_delivery_notes._compute_invoice_status() + + def _generate_delivery_note_lines(self, invoice_ids): + invoices = self.env["account.move"].browse(invoice_ids) + invoices.update_delivery_note_lines() + + def _create_invoices(self, grouped=False, final=False, date=None): + invoice_ids = super()._create_invoices(grouped=grouped, final=final, date=date) + + self._assign_delivery_notes_invoices(invoice_ids.ids) + self._generate_delivery_note_lines(invoice_ids.ids) + + return invoice_ids + + def goto_delivery_notes(self, **kwargs): + delivery_notes = self.mapped("delivery_note_ids") + action = self.env["ir.actions.act_window"]._for_xml_id( + "l10n_it_delivery_note.stock_delivery_note_action" + ) + action.update(kwargs) + + if len(delivery_notes) > 1: + action["domain"] = Domain("id", "in", delivery_notes.ids) + + elif len(delivery_notes) == 1: + action["views"] = [ + ( + self.env.ref( + "l10n_it_delivery_note.stock_delivery_note_form_view" + ).id, + "form", + ) + ] + action["res_id"] = delivery_notes.id + + else: + action = {"type": "ir.actions.act_window_close"} + + return action diff --git a/l10n_it_delivery_note/models/sale_order_line.py b/l10n_it_delivery_note/models/sale_order_line.py new file mode 100644 index 000000000000..1655d304f8e0 --- /dev/null +++ b/l10n_it_delivery_note/models/sale_order_line.py @@ -0,0 +1,66 @@ +# Copyright 2022 Dinamiche Aziendali srl +# (http://www.dinamicheaziendali.it/) +# @author: Giuseppe Borruso +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import fields, models + +from .stock_delivery_note import DOMAIN_INVOICE_STATUSES + + +class SaleOrderLine(models.Model): + _inherit = "sale.order.line" + + delivery_note_line_ids = fields.One2many( + "stock.delivery.note.line", "sale_line_id", readonly=True + ) + delivery_picking_id = fields.Many2one("stock.picking", readonly=True, copy=False) + + @property + def has_picking(self): + return self.move_ids or (self.is_delivery and self.delivery_picking_id) + + @property + def is_invoiceable(self): + return ( + self.invoice_status == DOMAIN_INVOICE_STATUSES[1] + and self.qty_to_invoice != 0 + ) + + @property + def is_invoiced(self): + return ( + self.invoice_status != DOMAIN_INVOICE_STATUSES[1] and self.qty_invoiced != 0 + ) + + @property + def need_to_be_invoiced(self): + return self.product_uom_qty != (self.qty_to_invoice + self.qty_invoiced) + + def fix_qty_to_invoice(self, new_qty_to_invoice=0): + self.ensure_one() + + cache = { + "invoice_status": self.invoice_status, + "qty_to_invoice": self.qty_to_invoice, + } + + self.write( + { + "invoice_status": "to invoice" if new_qty_to_invoice else "no", + "qty_to_invoice": new_qty_to_invoice, + } + ) + + return cache + + def is_pickings_related(self, picking_ids): + if self.is_delivery: + return self.delivery_picking_id in picking_ids + + return bool(self.move_ids & picking_ids.mapped("move_ids")) + + def retrieve_pickings_lines(self, picking_ids): + return self.filtered(lambda line: line.has_picking).filtered( + lambda line: line.is_pickings_related(picking_ids) + ) diff --git a/l10n_it_delivery_note/models/stock_delivery_note.py b/l10n_it_delivery_note/models/stock_delivery_note.py new file mode 100644 index 000000000000..0b996868c32c --- /dev/null +++ b/l10n_it_delivery_note/models/stock_delivery_note.py @@ -0,0 +1,931 @@ +# Copyright (c) 2019, Link IT Europe Srl +# @author: Matteo Bilotta +# Copyright 2023 Simone Rubino - Aion Tech +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +import datetime + +from odoo import api, fields, models +from odoo.exceptions import UserError +from odoo.fields import Command, Domain + +from ..mixins.delivery_mixin import ( + _default_volume_uom, + _default_weight_uom, +) +from ..mixins.picking_checker import ALLOWED_PICKING_STATES + +DATE_FORMAT = "%d/%m/%Y" +DATETIME_FORMAT = "%d/%m/%Y %H:%M:%S" + +DELIVERY_NOTE_STATES = [ + ("draft", "Draft"), + ("confirm", "Validated"), + ("invoiced", "Invoiced"), + ("done", "Done"), + ("cancel", "Cancelled"), +] +DOMAIN_DELIVERY_NOTE_STATES = [s[0] for s in DELIVERY_NOTE_STATES] + +LINE_DISPLAY_TYPES = [("line_section", "Section"), ("line_note", "Note")] +DOMAIN_LINE_DISPLAY_TYPES = [t[0] for t in LINE_DISPLAY_TYPES] + +INVOICE_STATUSES = [ + ("no", "Nothing to invoice"), + ("to invoice", "To invoice"), + ("invoiced", "Fully invoiced"), +] +DOMAIN_INVOICE_STATUSES = [s[0] for s in INVOICE_STATUSES] + + +class StockDeliveryNote(models.Model): + _name = "stock.delivery.note" + _inherit = [ + "portal.mixin", + "mail.thread", + "mail.activity.mixin", + "stock.picking.checker.mixin", + "shipping.information.updater.mixin", + "l10n_it_delivery_note.delivery_mixin", + ] + _description = "Delivery Note" + _order = "date DESC, id DESC" + _mail_post_access = "read" + _check_company_auto = True + + def _default_company(self): + return self.env.company + + def _default_type(self): + return self.env["stock.delivery.note.type"].search( + [ + ("code", "=", "outgoing"), + ("company_id", "=", self.env.company.id), + ], + limit=1, + ) + + def _default_volume_uom(self): + return _default_volume_uom(self) + + def _default_weight_uom(self): + return _default_weight_uom(self) + + active = fields.Boolean(default=True) + name = fields.Char( + readonly=True, + index=True, + copy=False, + tracking=True, + ) + partner_ref = fields.Char( + string="Partner reference", + index=True, + copy=False, + tracking=True, + ) + + state = fields.Selection( + DELIVERY_NOTE_STATES, + copy=False, + default=DOMAIN_DELIVERY_NOTE_STATES[0], + required=True, + tracking=True, + ) + + partner_sender_id = fields.Many2one( + "res.partner", + string="Sender", + default=lambda self: self._default_company(), + readonly=True, + required=True, + tracking=True, + domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]", + ) + + partner_id = fields.Many2one( + "res.partner", + string="Recipient", + readonly=True, + required=True, + index=True, + tracking=True, + domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]", + ) + partner_shipping_id = fields.Many2one( + "res.partner", + string="Shipping address", + required=True, + tracking=True, + domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]", + ) + + carrier_id = fields.Many2one( + "res.partner", + string="Carrier", + tracking=True, + ) + delivery_method_id = fields.Many2one( + "delivery.carrier", + string="Delivery method", + tracking=True, + ) + + date = fields.Date(copy=False) + type_id = fields.Many2one( + "stock.delivery.note.type", + string="Type", + default=lambda self: self._default_type(), + readonly=True, + required=True, + index=True, + check_company=True, + ) + + sequence_id = fields.Many2one("ir.sequence", readonly=True, copy=False) + type_code = fields.Selection( + string="Type of Operation", related="type_id.code", store=True + ) + packages = fields.Integer() + volume = fields.Float() + + volume_uom_id = fields.Many2one( + "uom.uom", + string="Volume UoM", + default=lambda self: self._default_volume_uom(), + ) + gross_weight = fields.Float( + string="Gross weight", + store=True, + readonly=False, + compute="_compute_weights", + ) + gross_weight_uom_id = fields.Many2one( + "uom.uom", + string="Gross weight UoM", + default=lambda self: self._default_weight_uom(), + ) + net_weight = fields.Float( + string="Net weight", + store=True, + readonly=False, + compute="_compute_weights", + ) + net_weight_uom_id = fields.Many2one( + "uom.uom", + string="Net weight UoM", + default=lambda self: self._default_weight_uom(), + ) + + transport_condition_id = fields.Many2one( + "stock.picking.transport.condition", + string="Condition of transport", + ) + goods_appearance_id = fields.Many2one( + "stock.picking.goods.appearance", + string="Appearance of goods", + ) + transport_reason_id = fields.Many2one( + "stock.picking.transport.reason", + string="Reason of transport", + ) + transport_method_id = fields.Many2one( + "stock.picking.transport.method", + string="Method of transport", + ) + + transport_datetime = fields.Datetime(string="Transport date") + + line_ids = fields.One2many( + "stock.delivery.note.line", "delivery_note_id", string="Lines" + ) + invoice_status = fields.Selection( + INVOICE_STATUSES, + string="Invoice status", + compute="_compute_invoice_status", + default=DOMAIN_INVOICE_STATUSES[0], + readonly=True, + store=True, + copy=False, + ) + lines_have_so_number = fields.Boolean( + compute="_compute_lines_have_so_number", + ) + lines_have_customer_ref = fields.Boolean( + compute="_compute_lines_have_customer_ref", + ) + + picking_ids = fields.One2many( + "stock.picking", + "delivery_note_id", + string="Pickings", + check_company=True, + ) + pickings_picker = fields.Many2many( + "stock.picking", + compute="_compute_get_pickings", + inverse="_inverse_set_pickings", + check_company=True, + ) + + picking_type = fields.Selection( + lambda self: self.env["stock.picking.type"]._fields["code"].selection, + string="Picking type", + compute="_compute_picking_type", + store=True, + ) + + sale_ids = fields.Many2many("sale.order", compute="_compute_sales") + sale_count = fields.Integer(compute="_compute_sales") + sales_transport_check = fields.Boolean(compute="_compute_sales", default=True) + + invoice_ids = fields.Many2many( + "account.move", + "stock_delivery_note_account_invoice_rel", + "delivery_note_id", + "invoice_id", + string="Invoices", + copy=False, + ) + + print_prices = fields.Boolean( + string="Show prices on printed DN", related="type_id.print_prices", store=True + ) + note = fields.Html(string="Internal note") + + can_change_number = fields.Boolean(compute="_compute_boolean_flags") + show_product_information = fields.Boolean(compute="_compute_boolean_flags") + company_id = fields.Many2one( + "res.company", required=True, default=lambda self: self._default_company() + ) + + # Sync with delivery mixin fields + delivery_transport_reason_id = fields.Many2one( + related="transport_reason_id", + readonly=True, + ) + delivery_transport_condition_id = fields.Many2one( + related="transport_condition_id", + readonly=True, + ) + delivery_transport_method_id = fields.Many2one( + related="transport_method_id", + readonly=True, + ) + delivery_carrier_id = fields.Many2one( + related="carrier_id", + readonly=True, + ) + delivery_goods_appearance_id = fields.Many2one( + related="goods_appearance_id", + readonly=True, + ) + delivery_volume_uom_id = fields.Many2one( + related="volume_uom_id", + readonly=True, + default=None, + domain=None, + ) + delivery_volume = fields.Float( + related="volume", + readonly=True, + ) + delivery_gross_weight_uom_id = fields.Many2one( + related="gross_weight_uom_id", + readonly=True, + default=None, + domain=None, + ) + delivery_gross_weight = fields.Float( + related="gross_weight", + readonly=True, + ) + delivery_net_weight_uom_id = fields.Many2one( + related="net_weight_uom_id", + readonly=True, + default=None, + domain=None, + ) + delivery_net_weight = fields.Float( + related="net_weight", + readonly=True, + ) + delivery_transport_datetime = fields.Datetime( + related="transport_datetime", + readonly=True, + ) + delivery_packages = fields.Integer( + related="packages", + readonly=True, + ) + delivery_note = fields.Html( + related="note", + readonly=True, + ) + + _name_uniq = models.Constraint( + "UNIQUE(name, company_id)", "The Delivery note must have unique numbers." + ) + + @api.depends("name", "partner_id", "partner_ref", "partner_id.display_name") + def _compute_display_name(self): + for note in self: + if not note.name: + name = f"{note.partner_id.display_name}" + if note.create_date: + create_date = note.create_date.strftime(DATETIME_FORMAT) + name += f" - {create_date}" + + else: + name = note.name + + if note.partner_ref and note.type_code == "incoming": + name += f" ({note.partner_ref})" + note.display_name = name + + @api.depends("state", "line_ids", "line_ids.invoice_status") + def _compute_invoice_status(self): + for note in self: + lines = note.line_ids.filtered(lambda line: line.sale_line_id) + invoice_status = DOMAIN_INVOICE_STATUSES[0] + if lines: + if all( + line.invoice_status == DOMAIN_INVOICE_STATUSES[2] for line in lines + ): + note.state = DOMAIN_DELIVERY_NOTE_STATES[2] + invoice_status = DOMAIN_INVOICE_STATUSES[2] + elif any( + line.invoice_status == DOMAIN_INVOICE_STATUSES[1] for line in lines + ): + invoice_status = DOMAIN_INVOICE_STATUSES[1] + note.invoice_status = invoice_status + + def _compute_get_pickings(self): + for note in self: + note.pickings_picker = note.picking_ids + + @api.depends("picking_ids") + def _compute_weights(self): + for note in self: + # fill gross & net weight from pickings + gross_weight = net_weight = 0.0 + if note.picking_ids: + # this is the unit used for shipping_weight + weight_uom = self.env[ + "product.template" + ]._get_weight_uom_id_from_ir_config_parameter() + for pick in note.picking_ids: + gross_weight += weight_uom._compute_quantity( + pick.shipping_weight, note.gross_weight_uom_id + ) + net_weight += weight_uom._compute_quantity( + pick.shipping_weight, note.net_weight_uom_id + ) + note.gross_weight = gross_weight + note.net_weight = net_weight + + @api.onchange("picking_ids") + def _onchange_picking_ids(self): + self._compute_weights() + + @api.onchange("delivery_method_id") + def _onchange_delivery_method_id(self): + self.carrier_id = self.delivery_method_id.partner_id + + def _inverse_set_pickings(self): + for note in self: + if note.pickings_picker: + self.check_compliance(note.pickings_picker) + + note.picking_ids = note.pickings_picker + + @api.depends("picking_ids") + def _compute_picking_type(self): + for note in self.filtered(lambda n: n.picking_ids): + picking_types = set(note.picking_ids.mapped("picking_type_code")) + picking_types = list(picking_types) + + if len(picking_types) != 1: + raise ValueError( + "You have just called this method on an " + "heterogeneous set of pickings.\n" + "All pickings should have the same " + "'picking_type_code' field value." + ) + + note.picking_type = picking_types[0] + + @api.depends("picking_ids") + def _compute_sales(self): + for note in self: + sales = note.mapped("picking_ids.sale_id") + + note.sale_ids = sales + note.sale_count = len(sales) + + tc = sales.mapped("default_transport_condition_id") + ga = sales.mapped("default_goods_appearance_id") + tr = sales.mapped("default_transport_reason_id") + tm = sales.mapped("default_transport_method_id") + note.sales_transport_check = all([len(x) < 2 for x in [tc, ga, tr, tm]]) + + def _compute_boolean_flags(self): + can_change_number = self.env.user.has_group( + "l10n_it_delivery_note.can_change_number" + ) + show_product_information = self.env.user.has_group( + "l10n_it_delivery_note.show_product_related_fields" + ) + + for note in self: + note.can_change_number = note.state == "draft" and can_change_number + note.show_product_information = show_product_information + + def _compute_access_url(self): + res = super()._compute_access_url() + for dn in self: + dn.access_url = f"/my/delivery-notes/{dn.id}" + return res + + def _compute_lines_have_so_number(self): + for sdn in self: + sdn.lines_have_so_number = ( + sdn.company_id.display_ref_order_dn_report + and any(line.sale_order_number for line in sdn.line_ids) + ) + + def _compute_lines_have_customer_ref(self): + for sdn in self: + sdn.lines_have_customer_ref = ( + sdn.company_id.display_ref_customer_dn_report + and any(line.sale_order_client_ref for line in sdn.line_ids) + ) + + @api.onchange("picking_type") + def _onchange_picking_type(self): + if self.picking_type: + type_domain = Domain("code", "=", self.picking_type) + + else: + type_domain = Domain(Domain.TRUE) + + return {"domain": {"type_id": type_domain}} + + @api.onchange("type_id") + def _onchange_type(self): + if self.type_id: + if self.name and self.type_id.sequence_id != self.sequence_id: + raise UserError( + self.env._( + "You cannot set this delivery note type due" + " of a different numerator configuration." + ) + ) + if self.picking_type and self.type_id.code != self.picking_type: + raise UserError( + self.env._( + "You cannot set this delivery note type due" + " of a different type with related pickings." + ) + ) + + if self._update_generic_shipping_information(self.type_id): + return { + "warning": { + "title": self.env._("Warning!"), + "message": "Some of the shipping configuration have " + "been overwritten with" + " the default ones of the selected delivery" + " note type.\n" + "Please, make sure to check this " + "information before continuing.", + } + } + + @api.onchange("partner_id") + def _onchange_partner(self): + self.partner_shipping_id = self.partner_id + + if self.partner_id: + pickings_picker_domain = Domain( + [ + ("delivery_note_id", "=", False), + ("state", "in", ALLOWED_PICKING_STATES), + ("picking_type_code", "=", self.picking_type), + ("partner_id", "=", self.partner_id.id), + ] + ) + + else: + pickings_picker_domain = Domain("id", "=", False) + + return {"domain": {"pickings_picker": pickings_picker_domain}} + + @api.onchange("partner_shipping_id") + def _onchange_partner_shipping(self): + if self.partner_shipping_id: + changed = self._update_partner_shipping_information( + self.partner_shipping_id + ) + + if changed: + return { + "warning": { + "title": self.env._("Warning!"), + "message": "Some of the shipping configuration have " + "been overwritten with" + " the default ones of the selected " + "shipping partner address.\n" + "Please, make sure to check this " + "information before continuing.", + } + } + + else: + self.delivery_method_id = False + + def check_compliance(self, pickings): + super().check_compliance(pickings) + + self._check_delivery_notes(self.pickings_picker - self.picking_ids) + return True + + def ensure_annulability(self): + if self.mapped("invoice_ids"): + raise UserError( + self.env._( + "You cannot cancel this delivery note. " + "There is at least one invoice" + " related to this delivery note." + ) + ) + + def action_draft(self): + self.write({"state": DOMAIN_DELIVERY_NOTE_STATES[0]}) + self.line_ids.sync_invoice_status() + + def _action_confirm(self): + for note in self: + sequence = note.type_id.sequence_id + + note.state = DOMAIN_DELIVERY_NOTE_STATES[1] + if not note.date: + note.date = datetime.date.today() + + if not note.name: + # Avoid duplicates + while True: + name = sequence.with_context( + ir_sequence_date=note.date + ).next_by_id() + if not self.search( + [("name", "=", name), ("company_id", "=", note.company_id.id)] + ): + break + + note.name = name + note.sequence_id = sequence + + def action_confirm(self): + for note in self: + if ( + note.type_code == "incoming" + and not note.partner_ref + and self.env.user.has_group( + "l10n_it_delivery_note.group_required_partner_ref" + ) + ): + raise UserError( + note.env._( + "The field 'Partner reference' is " + "mandatory to validate the Delivery Note." + ) + ) + + warning_message = False + carrier_ids = note.mapped("picking_ids.carrier_id") + carrier_partner_ids = carrier_ids.mapped("partner_id") + if len(carrier_partner_ids) > 1: + warning_message = note.env._( + "This delivery note contains pickings " + "related to different transporters. " + "Are you sure you want to proceed?\n" + "Carrier Partners: %(carrier_partners)s", + carrier_partners=", ".join(carrier_partner_ids.mapped("name")), + ) + elif len(carrier_ids) > 1: + warning_message = note.env._( + "This delivery note contains pickings related to different " + "delivery methods from the same transporter. " + "Are you sure you want to proceed?\n" + "Delivery Methods: %(carriers)s", + carriers=", ".join(carrier_ids.mapped("name")), + ) + elif ( + carrier_partner_ids + and note.carrier_id + and note.carrier_id != carrier_partner_ids + ): + warning_message = note.env._( + "The carrier set in Delivery Note is different " + "from the carrier set in picking(s). " + "Are you sure you want to proceed?" + ) + elif ( + carrier_ids + and note.delivery_method_id + and carrier_ids != note.delivery_method_id + ): + warning_message = note.env._( + "The shipping method set in Delivery Note is different " + "from the shipping method set in picking(s). " + "Are you sure you want to proceed?" + ) + if warning_message: + return { + "type": "ir.actions.act_window", + "name": note.env._("Warning"), + "res_model": "stock.delivery.note.confirm.wizard", + "view_type": "form", + "target": "new", + "view_mode": "form", + "context": { + "default_delivery_note_id": note.id, + "default_warning_message": warning_message, + **self.env.context, + }, + } + else: + note._action_confirm() + + def _check_delivery_notes_before_invoicing(self): + for delivery_note_id in self: + if not delivery_note_id.sale_ids: + raise UserError( + delivery_note_id.env._( + "%s hasn't sale order!", delivery_note_id.display_name + ) + ) + if ( + len( + delivery_note_id.mapped("sale_ids.picking_ids.picking_type_id.code") + ) + > 1 + ): + raise UserError( + delivery_note_id.env._( + "Sale orders related to %s have return! " + "For invoicing, go to sale orders.", + delivery_note_id.display_name, + ) + ) + if delivery_note_id.invoice_status == "invoiced": + raise UserError( + delivery_note_id.env._( + "%s is already invoiced!", delivery_note_id.display_name + ) + ) + if delivery_note_id.state == "draft": + raise UserError( + delivery_note_id.env._( + "%s is in draft!", delivery_note_id.display_name + ) + ) + for line in delivery_note_id.line_ids: + if line.product_id.invoice_policy == "order": + raise UserError( + delivery_note_id.env._( + "In %(ddt_name)s there is %(product_name)s" + " with invoicing policy 'order'", + ddt_name=delivery_note_id.display_name, + product_name=line.product_id.name, + ) + ) + + def _fix_quantities_to_invoice(self, lines, invoice_method): + cache = {} + + pickings_lines = lines.retrieve_pickings_lines(self.picking_ids) + other_lines = lines - pickings_lines + + if not invoice_method or invoice_method == "dn": + for line in other_lines: + cache[line] = line.fix_qty_to_invoice() + elif invoice_method == "service": + for line in other_lines: + if line.product_id.type != "service": + cache[line] = line.fix_qty_to_invoice() + + pickings_move_ids = self.mapped("picking_ids.move_ids") + for line in pickings_lines.filtered(lambda line: len(line.move_ids) > 1): + move_ids = line.move_ids & pickings_move_ids + qty_to_invoice = sum(move_ids.mapped("quantity")) + + if qty_to_invoice < line.qty_to_invoice: + cache[line] = line.fix_qty_to_invoice(qty_to_invoice) + + return cache + + def action_invoice(self, invoice_method=False): + self._check_delivery_notes_before_invoicing() + + payment_term_ids = [self.env["account.payment.term"]] + payment_term_ids += [ + payment_term_id + for payment_term_id in self.mapped("sale_ids.payment_term_id") + ] + for payment_term_id in payment_term_ids: + sale_ids = self.mapped("sale_ids").filtered( + lambda s, pay_term_id=payment_term_id: s.payment_term_id == pay_term_id + ) + if not sale_ids: + continue + orders_lines = sale_ids.mapped("order_line").filtered( + lambda l: l.product_id # noqa: E741 + ) + + downpayment_lines = orders_lines.filtered(lambda l: l.is_downpayment) # noqa: E741 + invoiceable_lines = orders_lines.filtered(lambda l: l.is_invoiceable) # noqa: E741 + + cache = self._fix_quantities_to_invoice( + invoiceable_lines - downpayment_lines, invoice_method + ) + + for downpayment in downpayment_lines: + order = downpayment.order_id + order_lines = order.order_line.filtered( + lambda l: l.product_id and not l.is_downpayment # noqa: E741 + ) + + if order_lines.filtered(lambda l: l.need_to_be_invoiced): # noqa: E741 + cache[downpayment] = downpayment.fix_qty_to_invoice() + + invoice_ids = sale_ids.filtered( + lambda o: o.invoice_status == DOMAIN_INVOICE_STATUSES[1] + )._create_invoices(final=True) + + for line, vals in cache.items(): + line.write(vals) + + orders_lines._compute_qty_to_invoice() + + for line in self.mapped("line_ids"): + line.write({"invoice_status": "invoiced"}) + for delivery_note in self: + ready_invoice_ids = [ + invoice_id + for invoice_id in delivery_note.sale_ids.mapped("invoice_ids").ids + if invoice_id in invoice_ids.ids + ] + delivery_note.write( + { + "invoice_ids": [ + Command.link(invoice_id) for invoice_id in ready_invoice_ids + ] + } + ) + self._compute_invoice_status() + invoices = self.env["account.move"].browse(invoice_ids.ids) + invoices.update_delivery_note_lines() + + def action_done(self): + self.write({"state": DOMAIN_DELIVERY_NOTE_STATES[3]}) + + def action_cancel(self): + self.ensure_annulability() + + self.write({"state": DOMAIN_DELIVERY_NOTE_STATES[4]}) + + def action_print(self): + return self.env.ref( + "l10n_it_delivery_note.delivery_note_report_action" + ).report_action(self) + + @api.model + def _get_sync_fields(self): + """ + Returns a list of fields that can be used to + synchronize the state of the Delivery Note + """ + return [ + "date", + "transport_datetime", + "transport_condition_id", + "goods_appearance_id", + "transport_reason_id", + "transport_method_id", + "gross_weight", + "net_weight", + "packages", + "volume", + ] + + def _get_report_base_filename(self): + self.ensure_one() + return f"Delivery Note - {self.name}" + + def update_transport_datetime(self): + self.transport_datetime = datetime.datetime.now() + + def goto(self, **kwargs): + self.ensure_one() + + return { + "type": "ir.actions.act_window", + "res_model": self._name, + "res_id": self.id, + "views": [(False, "form")], + "view_mode": "form", + "target": "current", + **kwargs, + } + + def goto_sales(self, **kwargs): + sales = self.mapped("sale_ids") + action = self.env["ir.actions.act_window"]._for_xml_id("sale.action_orders") + action.update(kwargs) + + if len(sales) > 1: + action["domain"] = Domain("id", "in", sales.ids) + + elif len(sales) == 1: + action["views"] = [(self.env.ref("sale.view_order_form").id, "form")] + action["res_id"] = sales.id + + else: + action = {"type": "ir.actions.act_window_close"} + + return action + + def _create_detail_lines(self, move_ids): + if not move_ids: + return + + moves = self.env["stock.move"].browse(move_ids) + lines_vals = self.env["stock.delivery.note.line"]._prepare_detail_lines(moves) + + self.write({"line_ids": [Command.create(vals) for vals in lines_vals]}) + + def _delete_detail_lines(self, move_ids): + if not move_ids: + return + + lines = self.env["stock.delivery.note.line"].search( + [("move_id", "in", move_ids)] + ) + + self.write({"line_ids": [Command.delete(line.id) for line in lines]}) + + def update_detail_lines(self): + for note in self: + lines_move_ids = note.mapped("line_ids.move_id").ids + pickings_move_ids = note.mapped("picking_ids.valid_move_ids").ids + + move_ids_to_create = [ + line for line in pickings_move_ids if line not in lines_move_ids + ] + move_ids_to_delete = [ + line for line in lines_move_ids if line not in pickings_move_ids + ] + + note._create_detail_lines(move_ids_to_create) + note._delete_detail_lines(move_ids_to_delete) + + @api.model_create_multi + def create(self, vals_list): + notes = super().create(vals_list) + for note in notes: + if note.picking_ids: + note.update_detail_lines() + return notes + + def write(self, vals): + res = super().write(vals) + + if "picking_ids" in vals: + self.update_detail_lines() + + return res + + def unlink(self): + self.ensure_annulability() + + return super().unlink() + + @api.model + def get_location_address(self, location_id): + location_address = "" + warehouse = self.env["stock.location"].browse(location_id).warehouse_id + + if warehouse and warehouse.partner_id: + partner = warehouse.partner_id + + location_address += f"{partner.name}, " + if partner.street: + location_address += f"{partner.street} - " + + location_address += f"{partner.zip} {partner.city}" + if partner.state_id: + location_address += f" ({partner.state_id.name})" + + return location_address diff --git a/l10n_it_delivery_note/models/stock_delivery_note_line.py b/l10n_it_delivery_note/models/stock_delivery_note_line.py new file mode 100644 index 000000000000..53a9b1f24e39 --- /dev/null +++ b/l10n_it_delivery_note/models/stock_delivery_note_line.py @@ -0,0 +1,201 @@ +# Copyright 2022 Dinamiche Aziendali srl +# (http://www.dinamicheaziendali.it/) +# @author: Giuseppe Borruso +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import api, fields, models +from odoo.exceptions import UserError +from odoo.fields import Command, Domain + +DATE_FORMAT = "%d/%m/%Y" +DATETIME_FORMAT = "%d/%m/%Y %H:%M:%S" + +LINE_DISPLAY_TYPES = [("line_section", "Section"), ("line_note", "Note")] +DOMAIN_LINE_DISPLAY_TYPES = [t[0] for t in LINE_DISPLAY_TYPES] + +INVOICE_STATUSES = [ + ("no", "Nothing to invoice"), + ("to invoice", "To invoice"), + ("invoiced", "Fully invoiced"), +] +DOMAIN_INVOICE_STATUSES = [s[0] for s in INVOICE_STATUSES] + + +class StockDeliveryNoteLine(models.Model): + _name = "stock.delivery.note.line" + _description = "Delivery Note Line" + _order = "sequence, id" + + def _default_currency(self): + return self.env.company.currency_id + + def _default_unit_uom(self): + return self.env.ref("uom.product_uom_unit", raise_if_not_found=False) + + delivery_note_id = fields.Many2one( + "stock.delivery.note", string="Delivery Note", required=True, ondelete="cascade" + ) + company_id = fields.Many2one( + "res.company", + related="delivery_note_id.company_id", + store=True, + readonly=True, + index=True, + ) + sequence = fields.Integer(required=True, default=10, index=True) + name = fields.Text(string="Description", required=True) + display_type = fields.Selection( + LINE_DISPLAY_TYPES, string="Line type", default=False + ) + product_id = fields.Many2one("product.product", string="Product") + product_description = fields.Text(related="product_id.description_sale") + product_qty = fields.Float( + string="Quantity", digits="Product Unit of Measure", default=1.0 + ) + product_uom_id = fields.Many2one( + "uom.uom", string="UoM", default=lambda self: self._default_unit_uom() + ) + price_unit = fields.Float(string="Unit price", digits="Product Price") + currency_id = fields.Many2one( + "res.currency", + string="Currency", + required=True, + default=lambda self: self._default_currency(), + ) + discount = fields.Float(digits="Discount") + tax_ids = fields.Many2many("account.tax", string="Taxes") + + move_id = fields.Many2one( + "stock.move", + string="Warehouse movement", + readonly=True, + copy=False, + check_company=True, + ) + sale_line_id = fields.Many2one( + "sale.order.line", related="move_id.sale_line_id", store=True, copy=False + ) + sale_order_number = fields.Char( + compute="_compute_sale_order_number", + store=True, + ) + sale_order_client_ref = fields.Char( + "Customer Reference", + compute="_compute_sale_order_client_ref", + store=True, + ) + invoice_status = fields.Selection( + INVOICE_STATUSES, + string="Invoice status", + required=True, + default=DOMAIN_INVOICE_STATUSES[0], + copy=False, + ) + + _move_uniq = models.Constraint( + "UNIQUE(move_id)", + "You cannot assign the same warehouse movement to different delivery notes!", + ) + + @property + def is_invoiceable(self): + return self.invoice_status == DOMAIN_INVOICE_STATUSES[1] + + @api.depends("sale_line_id.order_id.name") + def _compute_sale_order_number(self): + for sdnl in self: + sdnl.sale_order_number = sdnl.sale_line_id.order_id.name or "" + + @api.depends("sale_line_id.order_id.client_order_ref") + def _compute_sale_order_client_ref(self): + for sdnl in self: + sdnl.sale_order_client_ref = ( + sdnl.sale_line_id.order_id.client_order_ref or "" + ) + + @api.onchange("product_id") + def _onchange_product_id(self): + if self.product_id: + name = self.product_id.name + if self.product_id.description_sale: + name += "\n" + self.product_id.description_sale + + self.name = name + + product_uom_domain = Domain( + "category_id", "=", self.product_id.uom_id.category_id.id + ) + + else: + product_uom_domain = Domain(Domain.TRUE) + + return {"domain": {"product_uom_id": product_uom_domain}} + + @api.model + def _prepare_detail_lines(self, moves): + lines = [] + for move in moves: + name = move.product_id.name + if move.product_id.description_sale: + name += "\n" + move.product_id.description_sale + + line = { + "move_id": move.id, + "name": name, + "product_id": move.product_id.id, + "product_qty": move.quantity, + "product_uom_id": move.product_uom.id, + } + + if move.sale_line_id: + order_line = move.sale_line_id + order = order_line.order_id + + line["price_unit"] = order_line.price_unit + line["currency_id"] = order.currency_id.id + line["discount"] = order_line.discount + line["tax_ids"] = [Command.set(order_line.tax_ids.ids)] + line["invoice_status"] = DOMAIN_INVOICE_STATUSES[1] + + lines.append(line) + + return lines + + @api.model_create_multi + def create(self, vals_list): + for vals in vals_list: + if vals.get("display_type"): + vals.update( + { + "product_id": False, + "product_qty": 0.0, + "product_uom_id": False, + "price_unit": 0.0, + "discount": 0.0, + "tax_ids": [Command.clear()], + } + ) + return super().create(vals_list) + + def write(self, vals): + if "display_type" in vals and self.filtered( + lambda note_line: note_line.display_type != vals["display_type"] + ): + raise UserError( + self.env._( + "You cannot change the type of a delivery note line. " + "Instead you should delete the current line" + " and create a new line of the proper type." + ) + ) + + return super().write(vals) + + def sync_invoice_status(self): + for line in self.filtered(lambda note_line: note_line.sale_line_id): + invoice_status = line.sale_line_id.invoice_status + line.invoice_status = ( + DOMAIN_INVOICE_STATUSES[1] + if invoice_status == "upselling" + else invoice_status + ) diff --git a/l10n_it_delivery_note/models/stock_delivery_note_type.py b/l10n_it_delivery_note/models/stock_delivery_note_type.py new file mode 100644 index 000000000000..42d3eb85f968 --- /dev/null +++ b/l10n_it_delivery_note/models/stock_delivery_note_type.py @@ -0,0 +1,202 @@ +# Copyright 2014-2019 Dinamiche Aziendali srl +# (http://www.dinamicheaziendali.it/) +# @author: Marco Calcagni +# @author: Gianmarco Conte +# @author: Giuseppe Borruso +# Copyright (c) 2020, Link IT Europe Srl +# @author: Matteo Bilotta +# Copyright (c) 2023, Nextev Srl +# @author: Nextev Srl +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import fields, models +from odoo.fields import Domain + +DELIVERY_NOTE_TYPE_CODES = [ + ("incoming", "Incoming"), + ("outgoing", "Outgoing"), + ("internal", "Internal"), +] +DOMAIN_DELIVERY_NOTE_TYPE_CODES = [s[0] for s in DELIVERY_NOTE_TYPE_CODES] + + +class StockDeliveryNoteType(models.Model): + _name = "stock.delivery.note.type" + _description = "Delivery Note Type" + _order = "sequence, name, id" + + active = fields.Boolean(default=True) + sequence = fields.Integer(index=True, default=10) + name = fields.Char(index="trigram", required=True, translate=True) + print_prices = fields.Boolean(string="Show prices on printed DN", default=False) + code = fields.Selection( + DELIVERY_NOTE_TYPE_CODES, + string="Type of Operation", + required=True, + default=DOMAIN_DELIVERY_NOTE_TYPE_CODES[1], + ) + + default_transport_condition_id = fields.Many2one( + "stock.picking.transport.condition", string="Condition of transport" + ) + default_goods_appearance_id = fields.Many2one( + "stock.picking.goods.appearance", string="Appearance of goods" + ) + default_transport_reason_id = fields.Many2one( + "stock.picking.transport.reason", string="Reason of transport" + ) + default_transport_method_id = fields.Many2one( + "stock.picking.transport.method", string="Method of transport" + ) + + sequence_id = fields.Many2one("ir.sequence", string="Numeration", required=True) + next_sequence_number = fields.Integer(related="sequence_id.number_next_actual") + company_id = fields.Many2one( + "res.company", string="Company", default=lambda self: self.env.company + ) + note = fields.Html(string="Internal note") + + _name_uniq = models.Constraint( + "UNIQUE(name, company_id)", + "This delivery note type already exists!", + ) + + def goto_sequence(self, **kwargs): + self.ensure_one() + + return { + "type": "ir.actions.act_window", + "res_model": "ir.sequence", + "res_id": self.sequence_id.id, + "views": [(False, "form")], + "view_mode": "form", + "target": "current", + **kwargs, + } + + def _get_dn_types_sequences_values(self, code, company_id): + """ + This method prepares values to create sequences + """ + res = {} + if code == "stock.delivery.note.din": + res = { + "name": self.env._("Incoming DdT sequence"), + "code": f"stock.delivery.note.din.c{company_id.id}", + "prefix": f"DIN/C{company_id.id}/", + "implementation": "no_gap", + "padding": 5, + "company_id": company_id.id, + } + elif code == "stock.delivery.note.ddt": + res = { + "name": self.env._("Outgoing DdT sequence"), + "code": f"stock.delivery.note.ddt.c{company_id.id}", + "prefix": f"DDT/C{company_id.id}/", + "implementation": "no_gap", + "padding": 5, + "company_id": company_id.id, + } + elif code == "stock.delivery.note.int": + res = { + "name": self.env._("Internal DdT sequence"), + "code": f"stock.delivery.note.int.c{company_id.id}", + "prefix": f"INT/C{company_id.id}/", + "implementation": "no_gap", + "padding": 5, + "company_id": company_id.id, + } + return res + + def _check_existing_sequence_domain(self, code, company_id): + """ + This method sets domain to check if sequence already exists + """ + return Domain([("code", "=", code), ("company_id", "=", company_id.id)]) + + def _get_or_create_sequence(self, code, company_id): + """ + This method gets sequence id or creates a new one if it doesn't already exist + """ + sequence = self.env["ir.sequence"].search( + self._check_existing_sequence_domain(f"{code}.c{company_id.id}", company_id) + ) + if sequence: + return sequence.id + else: + return ( + self.env["ir.sequence"] + .create(self._get_dn_types_sequences_values(code, company_id)) + .id + ) + + def _check_existing_dn_type_domain(self, name, company_id): + """ + This method sets domain to check if dn type already exists + """ + return Domain([("name", "=", name), ("company_id", "=", company_id.id)]) + + def _set_or_create_dn_types( + self, name, sequence_code, print_prices, code, company_id + ): + """ + This method creates dn types and relative sequences if they don't + already exist + """ + dn_type = self.env["stock.delivery.note.type"].search( + self._check_existing_dn_type_domain(name, company_id) + ) + if not dn_type: + sequence_id = self._get_or_create_sequence(sequence_code, company_id) + self.env["stock.delivery.note.type"].create( + { + "name": name, + "sequence_id": sequence_id, + "print_prices": print_prices, + "code": code, + "company_id": company_id.id, + } + ) + + def _prepare_dn_types_vals(self, company_id): + """ + This method sets values needed to search and create dn types + """ + self._set_or_create_dn_types( + self.env._("Incoming"), + "stock.delivery.note.din", + False, + "incoming", + company_id, + ) + self._set_or_create_dn_types( + self.env._("Outgoing"), + "stock.delivery.note.ddt", + False, + "outgoing", + company_id, + ) + self._set_or_create_dn_types( + self.env._("Outgoing (with prices)"), + "stock.delivery.note.ddt", + True, + "outgoing", + company_id, + ) + self._set_or_create_dn_types( + self.env._("Internal transfer"), + "stock.delivery.note.int", + False, + "internal", + company_id, + ) + + def create_dn_types(self, company_id): + """ + This method creates DN types for the company in the input parameters. + It first checks if they already exist, if not it will create them and + then they'll be linked to their relative sequences (they'll be created + too if they not already exist). + """ + lang = company_id.partner_id.lang + self.with_context(lang=lang)._prepare_dn_types_vals(company_id) diff --git a/l10n_it_delivery_note/models/stock_location.py b/l10n_it_delivery_note/models/stock_location.py new file mode 100644 index 000000000000..4cd44525db93 --- /dev/null +++ b/l10n_it_delivery_note/models/stock_location.py @@ -0,0 +1,43 @@ +# Copyright (c) 2020, Link IT Europe Srl +# @author: Matteo Bilotta +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import api, models +from odoo.exceptions import UserError + + +class StockLocation(models.Model): + _inherit = "stock.location" + + @api.model + def get_virtual_locations_root(self): + IrConfigParameter = self.env["ir.config_parameter"].sudo() + location_id = IrConfigParameter.get_param("stock.location.virtual_root") + if location_id: + virtual_locations_root = self.browse(int(location_id)).exists() + + else: + ResConfigSettings = self.env["res.config.settings"].sudo() + virtual_locations_root = ResConfigSettings._default_virtual_locations_root() + + if virtual_locations_root: + IrConfigParameter.set_param( + "stock.location.virtual_root", virtual_locations_root.id + ) + + if not virtual_locations_root: + raise UserError( + self.env._( + "Can't find a default virtual locations root.\n" + "Ask your system administrator" + " to set it from the Warehouse" + " configurations page before continue." + ) + ) + + return virtual_locations_root + + def is_virtual(self): + virtual_locations_root = self.get_virtual_locations_root() + + return self.parent_path.startswith(virtual_locations_root.parent_path) diff --git a/l10n_it_delivery_note/models/stock_picking.py b/l10n_it_delivery_note/models/stock_picking.py new file mode 100644 index 000000000000..ab34d94d80cd --- /dev/null +++ b/l10n_it_delivery_note/models/stock_picking.py @@ -0,0 +1,381 @@ +# Copyright 2014-2019 Dinamiche Aziendali srl +# (http://www.dinamicheaziendali.it/) +# @author: Marco Calcagni +# @author: Gianmarco Conte +# Copyright (c) 2019, Link IT Europe Srl +# @author: Matteo Bilotta +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import api, fields, models +from odoo.exceptions import UserError, ValidationError + +from ..mixins.picking_checker import ALLOWED_PICKING_STATES +from .stock_delivery_note import DOMAIN_DELIVERY_NOTE_STATES + +CANCEL_MOVE_STATE = "cancel" + + +class StockPicking(models.Model): + _name = "stock.picking" + _inherit = ["stock.picking", "shipping.information.updater.mixin"] + + delivery_note_id = fields.Many2one( + "stock.delivery.note", string="Delivery Note", copy=False + ) + delivery_note_sequence_id = fields.Many2one( + "ir.sequence", + string="Delivery Note Sequence", + related="delivery_note_id.sequence_id", + ) + delivery_note_state = fields.Selection( + string="DN State", related="delivery_note_id.state", store=True + ) + delivery_note_partner_ref = fields.Char(related="delivery_note_id.partner_ref") + delivery_note_partner_shipping_id = fields.Many2one( + "res.partner", related="delivery_note_id.partner_shipping_id" + ) + + delivery_note_carrier_id = fields.Many2one( + "res.partner", string="DN Carrier", related="delivery_note_id.carrier_id" + ) + delivery_method_id = fields.Many2one( + "delivery.carrier", related="delivery_note_id.delivery_method_id" + ) + + delivery_note_type_id = fields.Many2one( + "stock.delivery.note.type", + related="delivery_note_id.type_id", + check_company=True, + ) + delivery_note_type_code = fields.Selection(related="delivery_note_type_id.code") + delivery_note_date = fields.Date( + string="DN Date", related="delivery_note_id.date", store=True + ) + delivery_note_note = fields.Html(related="delivery_note_id.note") + + transport_condition_id = fields.Many2one( + "stock.picking.transport.condition", + related="delivery_note_id.transport_condition_id", + ) + goods_appearance_id = fields.Many2one( + "stock.picking.goods.appearance", related="delivery_note_id.goods_appearance_id" + ) + transport_reason_id = fields.Many2one( + "stock.picking.transport.reason", related="delivery_note_id.transport_reason_id" + ) + transport_method_id = fields.Many2one( + "stock.picking.transport.method", related="delivery_note_id.transport_method_id" + ) + + transport_datetime = fields.Datetime(related="delivery_note_id.transport_datetime") + + packages = fields.Integer(string="DN Packages", related="delivery_note_id.packages") + delivery_note_volume = fields.Float( + string="DN Volume", related="delivery_note_id.volume" + ) + delivery_note_volume_uom_id = fields.Many2one( + "uom.uom", related="delivery_note_id.volume_uom_id" + ) + gross_weight = fields.Float(related="delivery_note_id.gross_weight") + gross_weight_uom_id = fields.Many2one( + "uom.uom", related="delivery_note_id.gross_weight_uom_id" + ) + net_weight = fields.Float(related="delivery_note_id.net_weight") + net_weight_uom_id = fields.Many2one( + "uom.uom", related="delivery_note_id.net_weight_uom_id" + ) + + valid_move_ids = fields.One2many( + "stock.move", "picking_id", domain=[("state", "!=", CANCEL_MOVE_STATE)] + ) + picking_type_code = fields.Selection( + string="DN Operation Type", related="picking_type_id.code" + ) + + carrier_partner_id = fields.Many2one("res.partner", related="carrier_id.partner_id") + + use_delivery_note = fields.Boolean(compute="_compute_boolean_flags") + delivery_note_exists = fields.Boolean(compute="_compute_boolean_flags") + delivery_note_draft = fields.Boolean(compute="_compute_boolean_flags") + delivery_note_readonly = fields.Boolean(compute="_compute_boolean_flags") + can_be_invoiced = fields.Boolean(compute="_compute_boolean_flags") + dn_supplier_number = fields.Char(string="Supplier DN Number", copy=False) + dn_supplier_date = fields.Date(string="Supplier DN Date", copy=False) + + @property + def _delivery_note_fields(self): + from collections import OrderedDict + + fields = OrderedDict( + { + key: field + for key, field in self._fields.items() + if field.related and field.related.split(".")[0] == "delivery_note_id" + } + ) + + return fields + + def _compute_boolean_flags(self): + from_delivery_note = self.env.context.get("from_delivery_note") + + for picking in self: + picking.use_delivery_note = ( + not from_delivery_note and picking.state in ALLOWED_PICKING_STATES + ) + + picking.delivery_note_draft = False + picking.delivery_note_readonly = True + picking.delivery_note_exists = False + picking.can_be_invoiced = False + + if picking.use_delivery_note and picking.delivery_note_id: + picking.delivery_note_exists = True + picking.delivery_note_draft = ( + picking.delivery_note_id.state == DOMAIN_DELIVERY_NOTE_STATES[0] + ) + picking.delivery_note_readonly = ( + picking.delivery_note_id.state == DOMAIN_DELIVERY_NOTE_STATES[3] + ) + picking.can_be_invoiced = bool(picking.delivery_note_id.sale_ids) + + @api.onchange("delivery_method_id") + def _onchange_delivery_method_id(self): + self.delivery_note_carrier_id = self.delivery_method_id.partner_id + + @api.onchange("delivery_note_type_id") + def _onchange_delivery_note_type(self): + if self.delivery_note_type_id: + if ( + self.delivery_note_id.name + and self.delivery_note_type_id.sequence_id + != self.delivery_note_sequence_id + ): + raise UserError( + self.env._( + "You cannot set this delivery note type due" + " of a different numerator configuration." + ) + ) + + if self._update_generic_shipping_information(self.delivery_note_type_id): + return { + "warning": { + "title": self.env._("Warning!"), + "message": "Some of the shipping configuration have " + "been overwritten with" + " the default ones of the selected " + "delivery note type.\n" + "Please, make sure to check this " + "information before continuing.", + } + } + + @api.onchange("delivery_note_partner_shipping_id") + def _onchange_delivery_note_partner_shipping(self): + if self.delivery_note_partner_shipping_id: + changed = self._update_partner_shipping_information( + self.delivery_note_partner_shipping_id + ) + + if changed: + return { + "warning": { + "title": self.env._("Warning!"), + "message": "Some of the shipping configuration have " + "been overwritten with" + " the default ones of the selected shipping" + " partner address.\n" + "Please, make sure to check this " + "information before continuing.", + } + } + + else: + self.delivery_method_id = False + + def _add_delivery_cost_to_so(self): + self.ensure_one() + + super( + StockPicking, self.with_context(default_delivery_picking_id=self.id) + )._add_delivery_cost_to_so() + return True + + def action_delivery_note_create(self): + self.ensure_one() + + return { + "name": self.env._("Create a new delivery note"), + "type": "ir.actions.act_window", + "res_model": "stock.delivery.note.create.wizard", + "view_mode": "form", + "target": "new", + "context": {"active_ids": self.ids}, + } + + def action_delivery_note_select(self): + self.ensure_one() + + return { + "name": self.env._("Select an existing delivery note"), + "type": "ir.actions.act_window", + "res_model": "stock.delivery.note.select.wizard", + "view_mode": "form", + "target": "new", + "context": {"active_ids": self.ids}, + } + + def action_delivery_note_draft(self): + self.ensure_one() + + return self.delivery_note_id.action_draft() + + def action_delivery_note_confirm(self): + self.ensure_one() + + return self.delivery_note_id.action_confirm() + + def action_delivery_note_invoice(self): + self.ensure_one() + + return self.delivery_note_id.action_invoice() + + def action_delivery_note_done(self): + self.ensure_one() + + return self.delivery_note_id.action_done() + + def action_delivery_note_cancel(self): + self.ensure_one() + + return self.delivery_note_id.action_cancel() + + def action_delivery_note_print(self): + self.ensure_one() + + return self.delivery_note_id.action_print() + + def _check_delivery_note_consistency(self): + if len(set(self.mapped("picking_type_code"))) != 1: + raise ValidationError( + self.env._( + "You have just called this method on an " + "heterogeneous set of pickings.\n" + "All pickings should have the same " + "'picking_type_code' field value." + ) + ) + + if ( + len(self.mapped("partner_id")) != 1 + and self.location_dest_id.usage == "customer" + ): + raise ValidationError( + self.env._( + "You have just called this method on an heterogeneous set " + "of pickings.\n" + "All pickings should have the same 'partner_id' field value." + ) + ) + + if len(self.mapped("location_id")) != 1: + raise ValidationError( + self.env._( + "You have just called this method on an heterogeneous set " + "of pickings.\n" + "All pickings should have the same 'location_id' field value." + ) + ) + + if len(self.mapped("location_dest_id")) != 1: + raise ValidationError( + self.env._( + "You have just called this method on an heterogeneous " + "set of pickings.\n" + "All pickings should have the same 'location_dest_id' " + "field value." + ) + ) + + def delivery_note_update_transport_datetime(self): + self.delivery_note_id.update_transport_datetime() + + def _get_partners(self): + partner_id = self.mapped("partner_id") + src_location_id = self.mapped("location_id") + dest_location_id = self.mapped("location_dest_id") + picking_type_code = self.mapped("picking_type_code") + + src_warehouse_id = src_location_id.warehouse_id + dest_warehouse_id = dest_location_id.warehouse_id + + src_partner_id = src_warehouse_id.partner_id + dest_partner_id = dest_warehouse_id.partner_id + + if not src_partner_id: + if picking_type_code == ["outgoing"]: + src_partner_id = self.company_id.partner_id + else: + src_partner_id = partner_id or self.company_id.partner_id + + if not dest_partner_id: + if picking_type_code == ["incoming"]: + dest_partner_id = self.company_id.partner_id + else: + dest_partner_id = partner_id or self.company_id.partner_id + + return (src_partner_id, dest_partner_id) + + def get_partners(self): + self._check_delivery_note_consistency() + + return self._get_partners() + + def goto(self, **kwargs): + self.ensure_one() + + return { + "type": "ir.actions.act_window", + "res_model": self._name, + "res_id": self.id, + "views": [(False, "form")], + "view_mode": "form", + "target": "current", + **kwargs, + } + + def goto_delivery_note(self, **kwargs): + return self.delivery_note_id.goto(**kwargs) + + def update_delivery_note_fields(self, vals): + note_fields = self._delivery_note_fields + + if any(key in note_fields for key in vals.keys()): + delivery_note_vals = { + note_fields[key].related.split(".")[1]: value + for key, value in vals.items() + if key in note_fields + } + + self.mapped("delivery_note_id").write(delivery_note_vals) + + def write(self, vals): + res = super().write(vals) + + if self.mapped("delivery_note_id"): + self.update_delivery_note_fields(vals) + + if "delivery_note_id" in vals: + self.mapped("delivery_note_id").update_detail_lines() + + return res + + def _create_backorder(self): + """When we make a backorder of a picking the delivery note lines needed + to be updated otherwise stock_delivery_note_line_move_uniq + constraint is raised""" + backorders = super()._create_backorder() + for backorder in backorders: + backorder.backorder_id.delivery_note_id.update_detail_lines() + return backorders diff --git a/l10n_it_delivery_note/models/stock_picking_goods_appearance.py b/l10n_it_delivery_note/models/stock_picking_goods_appearance.py new file mode 100644 index 000000000000..945b86fd1939 --- /dev/null +++ b/l10n_it_delivery_note/models/stock_picking_goods_appearance.py @@ -0,0 +1,29 @@ +# Copyright 2014-2019 Dinamiche Aziendali srl +# (http://www.dinamicheaziendali.it/) +# @author: Marco Calcagni +# @author: Gianmarco Conte +# @author: Giuseppe Borruso +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import fields, models + + +class StockPickingGoodsAppearance(models.Model): + _name = "stock.picking.goods.appearance" + _description = "Appearance of Goods" + _order = "sequence, name, id" + + active = fields.Boolean(default=True) + sequence = fields.Integer(index=True, default=10) + name = fields.Char( + string="Appearance name", + index="trigram", + required=True, + translate=True, + ) + note = fields.Html(string="Internal note") + + _name_uniq = models.Constraint( + "UNIQUE(name)", + "This appearance of goods already exists!", + ) diff --git a/l10n_it_delivery_note/models/stock_picking_transport_condition.py b/l10n_it_delivery_note/models/stock_picking_transport_condition.py new file mode 100644 index 000000000000..86ca5cce7f9e --- /dev/null +++ b/l10n_it_delivery_note/models/stock_picking_transport_condition.py @@ -0,0 +1,45 @@ +# Copyright 2014-2019 Dinamiche Aziendali srl +# (http://www.dinamicheaziendali.it/) +# @author: Marco Calcagni +# @author: Gianmarco Conte +# @author: Giuseppe Borruso +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import fields, models + +PRICES_TO_SHOW = [("unit", "Unit price"), ("total", "Total price"), ("none", "None")] +DOMAIN_PRICES_TO_SHOW = [p[0] for p in PRICES_TO_SHOW] + + +class StockPickingTransportCondition(models.Model): + _name = "stock.picking.transport.condition" + _description = "Condition of Transport" + _order = "sequence, name, id" + + active = fields.Boolean(default=True) + sequence = fields.Integer(index=True, default=10) + name = fields.Char( + string="Condition name", + index="trigram", + required=True, + translate=True, + ) + price_to_show = fields.Selection( + PRICES_TO_SHOW, + string="Price to show", + required=True, + default=DOMAIN_PRICES_TO_SHOW[0], + ) + + # + # TODO: Capire come dev'essere utilizzato questo campo. + # Deve influenzare il comportamento del campo "prezzo" + # solo ed esclusivamente nelle stampe del DdT? + # + + note = fields.Html(string="Internal note") + + _name_uniq = models.Constraint( + "UNIQUE(name)", + "This condition of transport already exists!", + ) diff --git a/l10n_it_delivery_note/models/stock_picking_transport_method.py b/l10n_it_delivery_note/models/stock_picking_transport_method.py new file mode 100644 index 000000000000..fc8886c4b49f --- /dev/null +++ b/l10n_it_delivery_note/models/stock_picking_transport_method.py @@ -0,0 +1,29 @@ +# Copyright 2014-2019 Dinamiche Aziendali srl +# (http://www.dinamicheaziendali.it/) +# @author: Marco Calcagni +# @author: Gianmarco Conte +# @author: Giuseppe Borruso +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import fields, models + + +class StockPickingTransportMethod(models.Model): + _name = "stock.picking.transport.method" + _description = "Method of Transport" + _order = "sequence, name, id" + + active = fields.Boolean(default=True) + sequence = fields.Integer(index=True, default=10) + name = fields.Char( + string="Method name", + index="trigram", + required=True, + translate=True, + ) + note = fields.Html(string="Internal note") + + _name_uniq = models.Constraint( + "UNIQUE(name)", + "This method of transport already exists!", + ) diff --git a/l10n_it_delivery_note/models/stock_picking_transport_reason.py b/l10n_it_delivery_note/models/stock_picking_transport_reason.py new file mode 100644 index 000000000000..32d31a8dd9f0 --- /dev/null +++ b/l10n_it_delivery_note/models/stock_picking_transport_reason.py @@ -0,0 +1,29 @@ +# Copyright 2014-2019 Dinamiche Aziendali srl +# (http://www.dinamicheaziendali.it/) +# @author: Marco Calcagni +# @author: Gianmarco Conte +# @author: Giuseppe Borruso +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import fields, models + + +class StockPickingTransportReason(models.Model): + _name = "stock.picking.transport.reason" + _description = "Reason of Transport" + _order = "sequence, name, id" + + active = fields.Boolean(default=True) + sequence = fields.Integer(index=True, default=10) + name = fields.Char( + string="Reason name", + index="trigram", + required=True, + translate=True, + ) + note = fields.Html(string="Internal note") + + _name_uniq = models.Constraint( + "UNIQUE(name)", + "This reason of transport already exists!", + ) diff --git a/l10n_it_delivery_note/pyproject.toml b/l10n_it_delivery_note/pyproject.toml new file mode 100644 index 000000000000..4231d0cccb3d --- /dev/null +++ b/l10n_it_delivery_note/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/l10n_it_delivery_note/readme/CONFIGURE.md b/l10n_it_delivery_note/readme/CONFIGURE.md new file mode 100644 index 000000000000..6f57149dd61e --- /dev/null +++ b/l10n_it_delivery_note/readme/CONFIGURE.md @@ -0,0 +1,32 @@ +To configure this module, go to: + +1. *Inventory → Configuration → Settings - Delivery Notes* + + Checking 'Use Advanced DN Features' allows you to manage more + picking on one delivery note. + + Checking 'Display Ref. Order in Delivery Note Report' or 'Display Ref. Customer in Delivery Note Report" enables in report fields relating DN line to SO (if applicable). + + Checking 'Display Carrier in Delivery Note Report' enables in report field 'Carrier'. + + Checking 'Display Delivery Method in Delivery Note Report' enables in report field 'Delivery Method'. + +2. *Inventory → Configuration → Warehouse Management → Delivery Note + Types* + + In delivery note type you can specify if the product price have to + be printed in the delivery note report/slip. + + - *Inventory → Configuration → Delivery Notes → Conditions of + Transport* + - *Inventory → Configuration → Delivery Notes → Appearances of + Goods* + - *Inventory → Configuration → Delivery Notes → Reasons of + Transport* + - *Inventory → Configuration → Delivery Notes → Methods of + Transport* + +3. *Settings → User & Companies → Users* + + In the user profile settings, "Show product information in DN lines" + allows showing prices in the form. diff --git a/l10n_it_delivery_note/readme/CONTRIBUTORS.md b/l10n_it_delivery_note/readme/CONTRIBUTORS.md new file mode 100644 index 000000000000..3fb9893ac0cb --- /dev/null +++ b/l10n_it_delivery_note/readme/CONTRIBUTORS.md @@ -0,0 +1,33 @@ +- Riccardo Bellanova \<\> + +- Matteo Bilotta \<\> + +- Giuseppe Borruso \<\> + +- Marco Calcagni \<\> + +- Marco Colombo \<\> + +- Gianmarco Conte \<\> + +- Letizia Freda \<\> + +- Andrea Piovesana \<\> + +- Alex Comba \<\> + +- [Ooops](https://www.ooops404.com): + + > - Giovanni Serra \<\> + > - Foresti Francesco \<\> + +- Nextev Srl \<\> + +- [PyTech-SRL](https://www.pytech.it): + + > - Alessandro Uffreduzzi \<\> + > - Sebastiano Picchi \<\> + +- [Aion Tech](https://aiontech.company/): + + - Simone Rubino <> diff --git a/l10n_it_delivery_note/readme/DESCRIPTION.md b/l10n_it_delivery_note/readme/DESCRIPTION.md new file mode 100644 index 000000000000..79f82628ffab --- /dev/null +++ b/l10n_it_delivery_note/readme/DESCRIPTION.md @@ -0,0 +1,36 @@ +**English** + +This module manage the Italian DDT (Delivery note). + +From a picking is possible to generate a Delivery Note and group more +picking in one delivery note. It's also possible to invoice from the +delivery note form. + +This module is alternative to `l10n_it_ddt`, it follows the Odoo way to +process sale orders, pickings and invoices. + +You can't have both `l10n_it_ddt` and `l10n_it_delivery_note` installed +together. + +There are two available settings: + +- Base (default): one picking, one DN. +- Advanced: more picking in one DN. + +**Italiano** + +Questo modulo consente di gestire i DDT. + +Da un prelievo è possibile generare un DDT e raggruppare più prelievi in +un DDT. È anche possibile fatturare dalla scheda del DDT. + +Questo modulo è un alternativa al modulo `l10n_it_ddt`, segue la +modalità Odoo di gestire ordini di vendita, prelievi e fatture. + +Non è possibile avere installati contemporaneamente `l10n_it_ddt` e +`l10n_it_delivery_note`. + +Ci sono due impostazioni possibili. + +- Base (predefinita): un prelievo, un DDT. +- Avanzata: più prelievi in un DDT. diff --git a/l10n_it_delivery_note/readme/USAGE.md b/l10n_it_delivery_note/readme/USAGE.md new file mode 100644 index 000000000000..34ca0b4bb553 --- /dev/null +++ b/l10n_it_delivery_note/readme/USAGE.md @@ -0,0 +1,44 @@ +## Funzionalità base + +Quando un prelievo viene validato compare una scheda DDT. + +Nella scheda fare clic su "Crea nuovo", si apre un procedura guidata +dove scegliere il tipo di DDT, quindi confermare. Immettere i dati +richiesti e poi fare clic su "Valida" per numerare il DDT. + +Una volta validato, è possibile emettere fattura direttamente dal DDT se +il DDT stesso è di tipo consegna a cliente (In uscita) e si hanno i +permessi sull'utente. + +È possibile annullare il DDT, reimpostarlo a bozza e poi modificarlo. Se +il DDT è fatturato il numero e la data non sono modificabili. + +Per i trasferimenti tra magazzini creare un prelievo di tipo interno con +le relative ubicazioni. Validare il prelievo visualizza la scheda DDT. + +È possibile anche avere DDT in ingresso, ovvero dopo la validazione del +prelievo selezionare la scheda per indicare il numero del DDT fornitore +e la data. + +## Funzionalità avanzata + +Vengono attivate varie funzionalità aggiuntive: + +- più prelievi per un DDT +- selezione multipla di prelievi e generazione dei DDT +- aggiunta righe nota e righe sezione descrittive. +- lista dei DDT. + +Il report DDT stampa in righe aggiuntive i lotti/seriali e le scadenze +del prodotto. + +Il prezzo può essere indicato anche nel report DDT se nel tipo DDT è +indicata la stampa prezzi. La visibilità dei prezzi si trova nei +permessi dell'utente. + +Le fatture generate dai DDT contengono i riferimenti al DDT stesso nelle +righe nota. + +## Accesso da portale + +Gli utenti portal hanno la possibilità di scaricare i report dei DDT di cui loro o la loro azienda padre sono impostati come destinatari o indirizzo di spedizione. diff --git a/l10n_it_delivery_note/report/delivery_data.xml b/l10n_it_delivery_note/report/delivery_data.xml new file mode 100644 index 000000000000..acf5ba95a594 --- /dev/null +++ b/l10n_it_delivery_note/report/delivery_data.xml @@ -0,0 +1,121 @@ + + + + + + + + diff --git a/l10n_it_delivery_note/report/report_delivery_note.xml b/l10n_it_delivery_note/report/report_delivery_note.xml new file mode 100644 index 000000000000..defb9cf88f69 --- /dev/null +++ b/l10n_it_delivery_note/report/report_delivery_note.xml @@ -0,0 +1,353 @@ + + + + + + + + + Delivery Note + stock.delivery.note + qweb-pdf + l10n_it_delivery_note.delivery_note_report_main_template + l10n_it_delivery_note.delivery_note_report_main_template + 'Delivery Note - %s' % object.display_name + + report + + diff --git a/l10n_it_delivery_note/security/ir.model.access.csv b/l10n_it_delivery_note/security/ir.model.access.csv new file mode 100644 index 000000000000..03931fafde4b --- /dev/null +++ b/l10n_it_delivery_note/security/ir.model.access.csv @@ -0,0 +1,32 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_stock_delivery_note_type,access_stock_delivery_note_type,l10n_it_delivery_note.model_stock_delivery_note_type,base.group_user,1,0,0,0 +access_stock_picking_goods_appearance,access_stock_picking_goods_appearance,l10n_it_delivery_note.model_stock_picking_goods_appearance,base.group_user,1,0,0,0 +access_stock_picking_transport_condition,access_stock_picking_transport_condition,l10n_it_delivery_note.model_stock_picking_transport_condition,base.group_user,1,0,0,0 +access_stock_picking_transport_method,access_stock_picking_transport_method,l10n_it_delivery_note.model_stock_picking_transport_method,base.group_user,1,0,0,0 +access_stock_picking_transport_reason,access_stock_picking_transport_reason,l10n_it_delivery_note.model_stock_picking_transport_reason,base.group_user,1,0,0,0 +access_stock_picking_goods_appearance_manager,stock.picking.goods.appearance manager,l10n_it_delivery_note.model_stock_picking_goods_appearance,stock.group_stock_manager,1,1,1,1 +access_stock_picking_goods_appearance_user,stock.picking.goods.appearance user,l10n_it_delivery_note.model_stock_picking_goods_appearance,base.group_user,1,0,0,0 +access_stock_picking_transport_condition_manager,stock.picking.transport.condition manager,l10n_it_delivery_note.model_stock_picking_transport_condition,stock.group_stock_manager,1,1,1,1 +access_stock_picking_transport_condition_user,stock.picking.transport.condition user,l10n_it_delivery_note.model_stock_picking_transport_condition,base.group_user,1,0,0,0 +access_stock_picking_transport_reason_manager,stock.picking.transport.reason manager,l10n_it_delivery_note.model_stock_picking_transport_reason,stock.group_stock_manager,1,1,1,1 +access_stock_picking_transport_reason_user,stock.picking.transport.reason user,l10n_it_delivery_note.model_stock_picking_transport_reason,base.group_user,1,0,0,0 +access_stock_picking_transport_method_manager,stock.picking.transport.method manager,l10n_it_delivery_note.model_stock_picking_transport_method,stock.group_stock_manager,1,1,1,1 +access_stock_picking_transport_method_user,stock.picking.transport.method user,l10n_it_delivery_note.model_stock_picking_transport_method,base.group_user,1,0,0,0 +access_stock_delivery_note_user,access_stock_delivery_note user,l10n_it_delivery_note.model_stock_delivery_note,stock.group_stock_user,1,1,1,1 +access_stock_delivery_note_manager,access_stock_delivery_note manager,l10n_it_delivery_note.model_stock_delivery_note,stock.group_stock_manager,1,1,1,1 +access_stock_delivery_note_user_account,access_stock_delivery_note user_account,l10n_it_delivery_note.model_stock_delivery_note,account.group_account_invoice,1,0,0,0 +access_stock_delivery_note_portal,stock.delivery.note.portal,l10n_it_delivery_note.model_stock_delivery_note,base.group_portal,1,0,0,0 +access_stock_delivery_note_line_user,access_stock_delivery_note_line user,l10n_it_delivery_note.model_stock_delivery_note_line,stock.group_stock_user,1,1,1,1 +access_stock_delivery_note_line_salesteam,access_stock_delivery_note_line_salesteam,l10n_it_delivery_note.model_stock_delivery_note_line,sales_team.group_sale_salesman,1,0,0,0 +access_stock_delivery_note_line_manager,access_stock_delivery_note_line manager,l10n_it_delivery_note.model_stock_delivery_note_line,stock.group_stock_manager,1,1,1,1 +access_stock_delivery_note_line_user_account,access_stock_delivery_note_line user_account,l10n_it_delivery_note.model_stock_delivery_note_line,account.group_account_invoice,1,0,0,0 +access_stock_delivery_note_line_portal,stock.delivery.note.line.portal,l10n_it_delivery_note.model_stock_delivery_note_line,base.group_portal,1,0,0,0 +access_stock_delivery_note_type_user,access_stock_delivery_note_type user,l10n_it_delivery_note.model_stock_delivery_note_type,stock.group_stock_user,1,0,0,0 +access_stock_delivery_note_type_manager,access_stock_delivery_note_type manager,l10n_it_delivery_note.model_stock_delivery_note_type,stock.group_stock_manager,1,1,1,1 +access_stock_delivery_note_type_user_account,access_stock_delivery_note_type user_account,l10n_it_delivery_note.model_stock_delivery_note_type,account.group_account_invoice,1,0,0,0 +access_stock_delivery_note_confirm_wizard_manager,access_stock_delivery_note_confirm_wizard manager,l10n_it_delivery_note.model_stock_delivery_note_confirm_wizard,base.group_user,1,1,1,1 +access_stock_delivery_note_create_wizard_manager,access_stock_delivery_note_create_wizard manager,l10n_it_delivery_note.model_stock_delivery_note_create_wizard,base.group_user,1,1,1,1 +access_stock_delivery_note_select_wizard_manager,access_stock_delivery_note_select_wizard manager,l10n_it_delivery_note.model_stock_delivery_note_select_wizard,base.group_user,1,1,1,1 +access_stock_delivery_note_base_wizard_manager,access_stock_delivery_note_base_wizard manager,l10n_it_delivery_note.model_stock_delivery_note_base_wizard,base.group_user,1,1,1,1 +access_stock_delivery_note_invoice_wizard_manager,access_stock_delivery_note_invoice_wizard manager,l10n_it_delivery_note.model_stock_delivery_note_invoice_wizard,base.group_user,1,1,1,1 +access_delivery_carrier_portal,delivery.carrier portal,delivery.model_delivery_carrier,base.group_portal,1,0,0,0 diff --git a/l10n_it_delivery_note/security/ir_module_category.xml b/l10n_it_delivery_note/security/ir_module_category.xml new file mode 100644 index 000000000000..b53d667966cc --- /dev/null +++ b/l10n_it_delivery_note/security/ir_module_category.xml @@ -0,0 +1,14 @@ + + + + + Inventory settings + + Define some other extra rights on inventory management. + + 10 + + diff --git a/l10n_it_delivery_note/security/ir_rule.xml b/l10n_it_delivery_note/security/ir_rule.xml new file mode 100644 index 000000000000..8c69f84ddbf4 --- /dev/null +++ b/l10n_it_delivery_note/security/ir_rule.xml @@ -0,0 +1,46 @@ + + + + + Delivery note type multi-company + + + ['|',('company_id','=',False),('company_id','in',company_ids)] + + + + + Delivery note multi-company + + + ['|',('company_id','=',False),('company_id','in',company_ids)] + + + + + Personal Delivery note + + + ['|','|',('partner_id','=',user.partner_id.id),('partner_id','=',user.partner_id.parent_id.id),'|',('partner_shipping_id','=',user.partner_id.id),('partner_shipping_id','=',user.partner_id.parent_id.id)] + + + + + + Personal Delivery note line + + + ['|','|',('delivery_note_id.partner_id','=',user.partner_id.id),('delivery_note_id.partner_id','=',user.partner_id.parent_id.id),'|',('delivery_note_id.partner_shipping_id','=',user.partner_id.id),('delivery_note_id.partner_shipping_id','=',user.partner_id.parent_id.id)] + + + + diff --git a/l10n_it_delivery_note/security/res_groups.xml b/l10n_it_delivery_note/security/res_groups.xml new file mode 100644 index 000000000000..a89ed960a31d --- /dev/null +++ b/l10n_it_delivery_note/security/res_groups.xml @@ -0,0 +1,51 @@ + + + + + Show product information in delivery note lines + + + + Show product information in delivery note lines + + + + + Make Partner Ref. in DN Required + + + + Make Partner Ref. in DN Required + + + + + Allow to change delivery note number + + + + Allow to change delivery note number + + + diff --git a/l10n_it_delivery_note/security/res_users.xml b/l10n_it_delivery_note/security/res_users.xml new file mode 100644 index 000000000000..fbd3ac7ec770 --- /dev/null +++ b/l10n_it_delivery_note/security/res_users.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + diff --git a/l10n_it_delivery_note/static/description/icon.jpg b/l10n_it_delivery_note/static/description/icon.jpg new file mode 100644 index 000000000000..76e120ceb5b8 Binary files /dev/null and b/l10n_it_delivery_note/static/description/icon.jpg differ diff --git a/l10n_it_delivery_note/static/description/icon.png b/l10n_it_delivery_note/static/description/icon.png new file mode 100644 index 000000000000..3a0328b516c4 Binary files /dev/null and b/l10n_it_delivery_note/static/description/icon.png differ diff --git a/l10n_it_delivery_note/static/description/index.html b/l10n_it_delivery_note/static/description/index.html new file mode 100644 index 000000000000..b54120b33af6 --- /dev/null +++ b/l10n_it_delivery_note/static/description/index.html @@ -0,0 +1,585 @@ + + + + + +README.rst + + + +
+ + + +Odoo Community Association + +
+

ITA - Documento di trasporto

+ +

Beta License: AGPL-3 OCA/l10n-italy Translate me on Weblate Try me on Runboat

+

English

+

This module manage the Italian DDT (Delivery note).

+

From a picking is possible to generate a Delivery Note and group more +picking in one delivery note. It’s also possible to invoice from the +delivery note form.

+

This module is alternative to l10n_it_ddt, it follows the Odoo way +to process sale orders, pickings and invoices.

+

You can’t have both l10n_it_ddt and l10n_it_delivery_note +installed together.

+

There are two available settings:

+
    +
  • Base (default): one picking, one DN.
  • +
  • Advanced: more picking in one DN.
  • +
+

Italiano

+

Questo modulo consente di gestire i DDT.

+

Da un prelievo è possibile generare un DDT e raggruppare più prelievi in +un DDT. È anche possibile fatturare dalla scheda del DDT.

+

Questo modulo è un alternativa al modulo l10n_it_ddt, segue la +modalità Odoo di gestire ordini di vendita, prelievi e fatture.

+

Non è possibile avere installati contemporaneamente l10n_it_ddt e +l10n_it_delivery_note.

+

Ci sono due impostazioni possibili.

+
    +
  • Base (predefinita): un prelievo, un DDT.
  • +
  • Avanzata: più prelievi in un DDT.
  • +
+

Table of contents

+ +
+

Configuration

+

To configure this module, go to:

+
    +
  1. Inventory → Configuration → Settings - Delivery Notes

    +

    Checking ‘Use Advanced DN Features’ allows you to manage more picking +on one delivery note.

    +

    Checking ‘Display Ref. Order in Delivery Note Report’ or ‘Display +Ref. Customer in Delivery Note Report” enables in report fields +relating DN line to SO (if applicable).

    +

    Checking ‘Display Carrier in Delivery Note Report’ enables in report +field ‘Carrier’.

    +

    Checking ‘Display Delivery Method in Delivery Note Report’ enables in +report field ‘Delivery Method’.

    +
  2. +
  3. Inventory → Configuration → Warehouse Management → Delivery Note +Types

    +

    In delivery note type you can specify if the product price have to be +printed in the delivery note report/slip.

    +
      +
    • Inventory → Configuration → Delivery Notes → Conditions of +Transport
    • +
    • Inventory → Configuration → Delivery Notes → Appearances of +Goods
    • +
    • Inventory → Configuration → Delivery Notes → Reasons of +Transport
    • +
    • Inventory → Configuration → Delivery Notes → Methods of +Transport
    • +
    +
  4. +
  5. Settings → User & Companies → Users

    +

    In the user profile settings, “Show product information in DN lines” +allows showing prices in the form.

    +
  6. +
+
+
+

Usage

+
+

Funzionalità base

+

Quando un prelievo viene validato compare una scheda DDT.

+

Nella scheda fare clic su “Crea nuovo”, si apre un procedura guidata +dove scegliere il tipo di DDT, quindi confermare. Immettere i dati +richiesti e poi fare clic su “Valida” per numerare il DDT.

+

Una volta validato, è possibile emettere fattura direttamente dal DDT se +il DDT stesso è di tipo consegna a cliente (In uscita) e si hanno i +permessi sull’utente.

+

È possibile annullare il DDT, reimpostarlo a bozza e poi modificarlo. Se +il DDT è fatturato il numero e la data non sono modificabili.

+

Per i trasferimenti tra magazzini creare un prelievo di tipo interno con +le relative ubicazioni. Validare il prelievo visualizza la scheda DDT.

+

È possibile anche avere DDT in ingresso, ovvero dopo la validazione del +prelievo selezionare la scheda per indicare il numero del DDT fornitore +e la data.

+
+
+

Funzionalità avanzata

+

Vengono attivate varie funzionalità aggiuntive:

+
    +
  • più prelievi per un DDT
  • +
  • selezione multipla di prelievi e generazione dei DDT
  • +
  • aggiunta righe nota e righe sezione descrittive.
  • +
  • lista dei DDT.
  • +
+

Il report DDT stampa in righe aggiuntive i lotti/seriali e le scadenze +del prodotto.

+

Il prezzo può essere indicato anche nel report DDT se nel tipo DDT è +indicata la stampa prezzi. La visibilità dei prezzi si trova nei +permessi dell’utente.

+

Le fatture generate dai DDT contengono i riferimenti al DDT stesso nelle +righe nota.

+
+
+

Accesso da portale

+

Gli utenti portal hanno la possibilità di scaricare i report dei DDT di +cui loro o la loro azienda padre sono impostati come destinatari o +indirizzo di spedizione.

+
+
+
+

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

+
    +
  • Marco Calcagni
  • +
  • Gianmarco Conte
  • +
  • Link IT Europe Srl
  • +
+
+
+

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.

+

Current maintainers:

+

MarcoCalcagni aleuffre renda-dev

+

This module is part of the OCA/l10n-italy project on GitHub.

+

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

+
+
+
+
+ + diff --git a/l10n_it_delivery_note/static/src/img/DN.svg b/l10n_it_delivery_note/static/src/img/DN.svg new file mode 100644 index 000000000000..340361e4908c --- /dev/null +++ b/l10n_it_delivery_note/static/src/img/DN.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/l10n_it_delivery_note/static/src/scss/stock_delivery_note.scss b/l10n_it_delivery_note/static/src/scss/stock_delivery_note.scss new file mode 100644 index 000000000000..6182e8d15e85 --- /dev/null +++ b/l10n_it_delivery_note/static/src/scss/stock_delivery_note.scss @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2019, Link IT Europe Srl + * @author: Matteo Bilotta + */ + +.o_form_view .o_notebook > .tab-content > .tab-pane { + & > .no-margin-page-content { + margin-bottom: -46px; + margin-left: -16px; + margin-right: -16px; + margin-top: -16px; + + min-height: 83px; + + & > .header { + border-bottom: 1px solid #ced4da; + border-top: 1px solid #ced4da; + display: flex; + margin-top: -17px; + min-height: 34px; + padding-left: 16px; + + & > div > .btn, + & > div > div > .btn { + margin: 4px 3px 4px 0px; + min-height: 25px; + padding-bottom: 2px; + padding-top: 2px; + } + + & > .statusbar_status { + align-content: space-around; + align-items: center; + align-self: stretch; + display: flex; + flex-flow: row-reverse wrap-reverse; + margin-bottom: 0px; + margin-left: auto; + overflow: hidden; + + & > .arrow_button { + background-color: #ffffff; + border-left: 1px solid #dee2e6; + border-radius: 0; + border-width: 0 0 0; + color: #adb5bd; + cursor: default; + font-size: 11px; + font-weight: bold; + margin: 0px; + min-height: 33px; + opacity: 1; + padding-left: 22px; + pointer-events: none; + position: relative; + transition: all 0.1s ease 0s; + + &:not(:first-child):before, + &:not(:first-child):after { + border-bottom: 17px solid transparent; + border-left: 11px solid white; + border-right: none; + border-top: 16px solid transparent; + bottom: auto; + content: " "; + display: block; + left: auto; + position: absolute; + right: -10px; + transition: border 0.2s ease 0s; + top: 0; + } + &:not(:first-child):before { + border-left-color: #dee2e6; + right: -11px; + } + + &.first_arrow { + padding-left: 15px; + border-left: 1px solid #ced4da; + } + + &.active { + background-color: #e9ecef; + color: #7c7bad; + + &:after { + border-left-color: #e9ecef; + } + } + } + } + } + & > .content { + box-shadow: inset 0px 5px 10px -4px rgba(0, 0, 0, 0.1); + padding: 16px; + + & > :first-child { + margin-top: 0; + + &.o_field_x2many.o_field_x2many_list tr > :first-child, + &.o_field_x2many.o_field_x2many_list tr > :first-child .o_input { + padding-left: 16px; + } + } + } + } +} + +.btn, +.o_icon_button { + &.fa { + font-family: FontAwesome, Roboto, sans-serif; + } + + & > .fa:not(:last-child):before { + margin-right: 0.5em; + } +} + +table.o_list_view tr.o_data_row > td.o_list_button { + padding-left: 16px !important; + width: 1px; + + & > button.o_icon_button > .fa:before { + margin: 0px; + } +} diff --git a/l10n_it_delivery_note/tests/__init__.py b/l10n_it_delivery_note/tests/__init__.py new file mode 100644 index 000000000000..4673b3b5ac73 --- /dev/null +++ b/l10n_it_delivery_note/tests/__init__.py @@ -0,0 +1,5 @@ +from . import delivery_note_common +from . import test_stock_delivery_note_invoicing +from . import test_stock_delivery_note +from . import test_stock_delivery_note_sequence +from . import test_stock_delivery_note_portal diff --git a/l10n_it_delivery_note/tests/delivery_note_common.py b/l10n_it_delivery_note/tests/delivery_note_common.py new file mode 100644 index 000000000000..57a41e31150a --- /dev/null +++ b/l10n_it_delivery_note/tests/delivery_note_common.py @@ -0,0 +1,197 @@ +from odoo.fields import Command +from odoo.tests.common import TransactionCase + +from odoo.addons.mail.tests.common import mail_new_test_user + +DOWNPAYMENT_METHODS = ["fixed", "percentage"] + + +class StockDeliveryNoteCommon(TransactionCase): + def create_commercial_partner(self, name, **kwargs): + return self.env["res.partner"].create( + {"name": name, "is_company": True, **kwargs} + ) + + def create_partner(self, name, company, **kwargs): + return self.env["res.partner"].create( + {"name": name, "parent_id": company.id, **kwargs} + ) + + def create_sales_order(self, lines, **kwargs): + vals = {"partner_id": self.recipient.id} + + if lines: + vals["order_line"] = lines + + vals.update(kwargs) + + return self.env["sale.order"].create(vals) + + def prepare_sales_order_line(self, product, quantity=1.0, price=None, **kwargs): + vals = {"product_id": product.id, "product_uom_qty": quantity} + + if price: + vals["price_unit"] = price + + vals.update(kwargs) + + return 0, False, vals + + def add_downpayment_line(self, sales_order, method, amount, **kwargs): + if method not in DOWNPAYMENT_METHODS: + raise ValueError("Downpayment method must be 'fixed' or 'percentage'.") + + return ( + self.env["sale.advance.payment.inv"] + .with_context(active_ids=sales_order.ids) + .create({"advance_payment_method": method, "amount": amount, **kwargs}) + .create_invoices() + ) + + def create_delivery_note(self, **kwargs): + vals = { + "partner_sender_id": self.sender.id, + "partner_id": self.recipient.id, + "partner_shipping_id": self.recipient.id, + } + + vals.update(kwargs) + + return self.env["stock.delivery.note"].create(vals) + + def create_picking(self, **kwargs): + picking_data = { + "partner_id": self.recipient.id, + "picking_type_id": self.env.ref("stock.picking_type_out").id, + "location_id": self.env.ref("stock.stock_location_stock").id, + "location_dest_id": self.env.ref("stock.stock_location_customers").id, + "move_ids": [ + Command.create( + { + "product_id": self.product_8.id, + "product_uom_qty": 1, + "product_uom": self.product_8.uom_id.id, + "location_id": self.env.ref("stock.stock_location_stock").id, + "location_dest_id": self.env.ref( + "stock.stock_location_customers" + ).id, + }, + ) + ], + } + + picking_data.update(kwargs) + + return self.env["stock.picking"].create(picking_data) + + def setUp(self): + super().setUp() + + self.account_manager = mail_new_test_user( + self.env, + name="Adviser", + login="fm", + email="accountmanager@yourcompany.com", + groups="account.group_account_manager,base.group_partner_manager," + "base.group_system,sales_team.group_sale_manager,stock.group_stock_manager", + company_ids=[Command.set(self.env["res.company"].search([]).ids)], + ) + + self.sender = self.env.ref("base.main_partner") + company = self.create_commercial_partner("Azienda Rossi") + self.recipient = self.create_partner("Mario Rossi", company) + + self.product_delivery = self.env["product.product"].create( + { + "name": "The Poste", + "type": "service", + "list_price": 20.0, + "is_storable": False, + "invoice_policy": "order", + } + ) + self.partner_carrier_1 = self.env["res.partner"].create( + { + "name": "Carrier 1", + } + ) + self.delivery_carrier = self.env["delivery.carrier"].create( + { + "name": "The Poste", + "fixed_price": 20.0, + "sequence": 2, + "delivery_type": "base_on_rule", + "product_id": self.product_delivery.id, + "partner_id": self.partner_carrier_1.id, + } + ) + self.free_delivery_carrier = self.env.ref("delivery.free_delivery_carrier") + self.free_delivery_carrier.partner_id = self.partner_carrier_1.id + + self.partner_carrier_2 = self.env["res.partner"].create( + { + "name": "Carrier 2", + } + ) + + self.product_3 = self.env["product.product"].create( + { + "name": "Desk Combination", + "type": "consu", + "list_price": 450.0, + "is_storable": True, + "invoice_policy": "delivery", + } + ) + self.product_4 = self.env["product.product"].create( + { + "name": "Customizable Desk", + "type": "consu", + "list_price": 750.0, + "is_storable": True, + "invoice_policy": "delivery", + } + ) + self.product_5 = self.env["product.product"].create( + { + "name": "Corner Desk Right Sit", + "type": "consu", + "list_price": 147.0, + "is_storable": True, + "invoice_policy": "delivery", + } + ) + self.product_6 = self.env["product.product"].create( + { + "name": "Large Cabinet", + "type": "consu", + "list_price": 320.0, + "is_storable": True, + "invoice_policy": "delivery", + } + ) + self.product_7 = self.env["product.product"].create( + { + "name": "Storage Box", + "type": "consu", + "list_price": 15.0, + "is_storable": True, + "invoice_policy": "delivery", + } + ) + self.product_8 = self.env["product.product"].create( + { + "name": "Large Desk", + "type": "consu", + "list_price": 1799.0, + "is_storable": True, + "invoice_policy": "delivery", + } + ) + + self.desk_combination_line = self.prepare_sales_order_line(self.product_3, 1) + self.customizable_desk_line = self.prepare_sales_order_line(self.product_4, 3) + self.right_corner_desk_line = self.prepare_sales_order_line(self.product_5, 2) + self.large_cabinet_line = self.prepare_sales_order_line(self.product_6, 11) + self.storage_box_line = self.prepare_sales_order_line(self.product_7, 5) + self.large_desk_line = self.prepare_sales_order_line(self.product_8, 1) diff --git a/l10n_it_delivery_note/tests/test_stock_delivery_note.py b/l10n_it_delivery_note/tests/test_stock_delivery_note.py new file mode 100644 index 000000000000..0367a9ea1804 --- /dev/null +++ b/l10n_it_delivery_note/tests/test_stock_delivery_note.py @@ -0,0 +1,198 @@ +# Copyright 2021 Alex Comba - Agile Business Group +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo.exceptions import UserError +from odoo.fields import Command +from odoo.tests import Form + +from .delivery_note_common import StockDeliveryNoteCommon + + +class StockDeliveryNote(StockDeliveryNoteCommon): + # ⇒ "Ordine singolo: consegna parziale" + def test_partial_delivering_single_so(self): + # + # SO ┐ ┌ DdT + # ├ Picking ┘ + # │ + # └ Picking ┐ + # └ DdT + # + StockPicking = self.env["stock.picking"] + + sales_order = self.create_sales_order( + [ + self.large_desk_line, # 1 + self.desk_combination_line, # 1 + ], + ) + self.assertEqual(len(sales_order.order_line), 2) + sales_order.action_confirm() + self.assertEqual(len(sales_order.picking_ids), 1) + picking = sales_order.picking_ids + self.assertEqual(len(picking.move_ids), 2) + + # deliver only the first product + picking.move_ids.quantity = False + picking.move_ids[0].quantity = 1 + + wizard = Form.from_action(self.env, picking.button_validate()).save() + self.assertEqual(wizard._name, "stock.backorder.confirmation") + wizard.process() + + dn = Form.from_action(self.env, picking.action_delivery_note_create()).save() + dn.confirm() + self.assertTrue(picking.delivery_note_id) + picking_backorder = StockPicking.search([("backorder_id", "=", picking.id)]) + self.assertEqual(len(picking_backorder.move_ids), 1) + picking_backorder.move_ids.quantity = False + picking_backorder.move_ids[0].quantity = 1 + picking_backorder.button_validate() + dn = Form.from_action( + self.env, picking_backorder.action_delivery_note_create() + ).save() + dn.confirm() + self.assertTrue(picking_backorder.delivery_note_id) + + # ⇒ "Consegna senza ordine" + def test_delivery_without_so(self): + # + # Picking ┐ + # └ DdT + # + picking = self.create_picking() + + self.assertEqual(len(picking.move_ids), 1) + + # deliver product + picking.move_ids.quantity = False + picking.move_ids.quantity = 1 + picking.button_validate() + + dn = Form.from_action(self.env, picking.action_delivery_note_create()).save() + dn.confirm() + self.assertTrue(picking.delivery_note_id) + picking.delivery_note_id.action_confirm() + self.assertEqual(picking.delivery_note_id.state, "confirm") + self.assertEqual(picking.delivery_note_id.invoice_status, "no") + + test_company = self.env["res.company"].create({"name": "Test Company"}) + with self.assertRaises(UserError) as exc: + picking.delivery_note_id.write({"company_id": test_company.id}) + exc_message = exc.exception.args[0] + self.assertIn("type_id", exc_message) + self.assertIn("picking_ids", exc_message) + self.assertIn("belongs to another company", exc_message) + + def test_delivery_action_confirm(self): + picking = self.create_picking(carrier_id=self.delivery_carrier.id) + + picking.move_ids.quantity = False + picking.move_ids.quantity = 1 + picking.button_validate() + + dn = Form.from_action(self.env, picking.action_delivery_note_create()).save() + dn.confirm() + + delivery_note_id = picking.delivery_note_id + product_product_delivery_normal = self.env["product.product"].create( + { + "name": "Normal Delivery Charges", + "default_code": "Delivery_008", + "type": "service", + "categ_id": self.env.ref("delivery.product_category_deliveries").id, + "sale_ok": False, + "purchase_ok": False, + "invoice_policy": "order", + "list_price": 10.0, + } + ) + normal_delivery_carrier = self.env["delivery.carrier"].create( + { + "name": "Normal Delivery Charges", + "fixed_price": 10.0, + "sequence": 3, + "delivery_type": "fixed", + "product_id": product_product_delivery_normal.id, + } + ) + new_picking = self.create_picking(carrier_id=normal_delivery_carrier.id) + picking.move_ids.quantity = False + picking.move_ids.quantity = 1 + new_picking.button_validate() + + delivery_note_id.write({"picking_ids": [Command.link(new_picking.id)]}) + + warning_context = delivery_note_id.action_confirm().get("context") + self.assertTrue(warning_context) + self.assertIn( + "contains pickings related to different delivery methods", + warning_context.get("default_warning_message"), + ) + + picking.carrier_id = self.env.ref("delivery.free_delivery_carrier").id + new_picking.carrier_id = self.env.ref("delivery.free_delivery_carrier").id + delivery_note_id.carrier_id = self.partner_carrier_2.id + + warning_context = delivery_note_id.action_confirm().get("context") + self.assertTrue(warning_context) + self.assertIn( + "The carrier set in Delivery Note is " + "different from the carrier set in picking(s)", + warning_context.get("default_warning_message"), + ) + + delivery_note_id.delivery_method_id = self.env.ref( + "delivery.free_delivery_carrier" + ).id + picking.carrier_id = self.delivery_carrier.id + new_picking.carrier_id = self.env.ref("delivery.free_delivery_carrier").id + warning_context = delivery_note_id.action_confirm().get("context") + self.assertTrue(warning_context) + self.assertIn( + "contains pickings related to different " + "delivery methods from the same transporter", + warning_context.get("default_warning_message"), + ) + + new_picking.carrier_id = self.delivery_carrier.id + delivery_note_id.delivery_method_id = self.env.ref( + "delivery.free_delivery_carrier" + ).id + delivery_note_id.carrier_id = self.partner_carrier_1.id + warning_context = delivery_note_id.action_confirm().get("context") + self.assertTrue(warning_context) + self.assertIn( + "The shipping method set in Delivery Note is " + "different from the shipping method set in picking(s)", + warning_context.get("default_warning_message"), + ) + + def test_delivery_action_confirm_without_ref(self): + group_required_partner_ref = self.env.ref( + "l10n_it_delivery_note.group_required_partner_ref" + ) + self.env.user.write( + {"group_ids": [Command.link(group_required_partner_ref.id)]} + ) + + picking = self.create_picking( + picking_type_id=self.env.ref("stock.picking_type_in").id, + carrier_id=self.delivery_carrier.id, + ) + picking.move_ids.quantity = False + picking.move_ids.quantity = 1 + picking.button_validate() + + dn = Form.from_action(self.env, picking.action_delivery_note_create()).save() + dn.confirm() + + delivery_note_id = picking.delivery_note_id + + with self.assertRaises(UserError) as exc: + delivery_note_id.action_confirm() + exc_message = exc.exception.args[0] + self.assertIn("The field 'Partner reference' is mandatory", exc_message) + + delivery_note_id.partner_ref = "Reference #1234" + delivery_note_id.action_confirm() diff --git a/l10n_it_delivery_note/tests/test_stock_delivery_note_invoicing.py b/l10n_it_delivery_note/tests/test_stock_delivery_note_invoicing.py new file mode 100644 index 000000000000..eddfde83a99f --- /dev/null +++ b/l10n_it_delivery_note/tests/test_stock_delivery_note_invoicing.py @@ -0,0 +1,1280 @@ +from datetime import datetime, timedelta + +from odoo.tests import Form + +from .delivery_note_common import StockDeliveryNoteCommon + + +class StockDeliveryNoteInvoicingTest(StockDeliveryNoteCommon): + # ⇒ "Ordine singolo: fatturazione completa" + def test_complete_invoicing_single_so(self): + # + # SO ┐ ┌ DdT + # └ Picking ┘ + # + + sales_order = self.create_sales_order( + [ + self.desk_combination_line, + self.right_corner_desk_line, + self.large_cabinet_line, + self.large_desk_line, + ] + ) + self.assertEqual(len(sales_order.order_line), 4) + + sales_order.action_confirm() + self.add_downpayment_line(sales_order, "percentage", 10) + self.assertEqual(len(sales_order.order_line), 6) + self.assertEqual(sales_order.invoice_status, "no") + + downpayment_order_line = sales_order.order_line[5] + self.assertEqual(downpayment_order_line.invoice_status, "invoiced") + self.assertEqual(downpayment_order_line.qty_to_invoice, -1) + self.assertEqual(downpayment_order_line.qty_invoiced, 1) + + downpayment_invoice = sales_order.invoice_ids + self.assertEqual(len(downpayment_invoice), 1) + + downpayment_invoice_line = downpayment_invoice.invoice_line_ids + self.assertEqual(len(downpayment_invoice_line), 1) + self.assertEqual(downpayment_invoice_line.quantity, 1) + + picking = sales_order.picking_ids + self.assertEqual(len(picking), 1) + self.assertEqual(len(picking.move_ids), 4) + + picking.move_ids.quantity = False + picking.move_ids[0].quantity = 1 + picking.move_ids[1].quantity = 2 + picking.move_ids[2].quantity = 11 + picking.move_ids[3].quantity = 1 + + result = picking.button_validate() + self.assertTrue(result) + + delivery_note = self.create_delivery_note() + delivery_note.transport_datetime = datetime.now() + timedelta(days=1, hours=3) + delivery_note.picking_ids = picking + delivery_note.action_confirm() + self.assertEqual(len(delivery_note.line_ids), 4) + self.assertEqual(delivery_note.state, "confirm") + self.assertEqual(delivery_note.invoice_status, "to invoice") + + delivery_note.action_invoice() + self.assertEqual(len(delivery_note.line_ids), 4) + self.assertEqual(delivery_note.state, "invoiced") + self.assertEqual(delivery_note.invoice_status, "invoiced") + + self.assertEqual(len(sales_order.order_line), 6) + self.assertEqual(sales_order.invoice_status, "invoiced") + + invoices = sales_order.invoice_ids + self.assertEqual(len(invoices), 2) + + final_invoice = invoices[0] + # in sale.advance.payment.inv the method create_invoices uses the field + # deduct_down_payments (default True) that includes selection lines: + # so 4 product lines, 1 ddt note, 1 down_payment and 1 selection line + self.assertEqual(len(final_invoice.invoice_line_ids), 7) + self.assertEqual(final_invoice.delivery_note_ids, delivery_note) + + self.assertEqual(delivery_note.invoice_ids, final_invoice) + + # + # Ordine - Linea 1 + # Fattura - Linea 1 + # + order_line = sales_order.order_line[0] + self.assertEqual(order_line.invoice_status, "invoiced") + self.assertEqual(order_line.qty_to_invoice, 0) + self.assertEqual(order_line.qty_invoiced, 1) + + move = order_line.move_ids + self.assertEqual(len(move), 1) + self.assertEqual(move.quantity, 1) + + delivery_note_line = delivery_note.line_ids[0] + self.assertEqual(delivery_note_line.invoice_status, "invoiced") + self.assertEqual(delivery_note_line.sale_line_id, order_line) + self.assertEqual(delivery_note_line.product_qty, 1) + + invoice_line = final_invoice.invoice_line_ids[0] + self.assertEqual(invoice_line.sale_line_ids, order_line) + self.assertEqual(invoice_line.quantity, 1) + + # + # Ordine - Linea 2 + # Fattura - Linea 2 + # + order_line = sales_order.order_line[1] + self.assertEqual(order_line.invoice_status, "invoiced") + self.assertEqual(order_line.qty_to_invoice, 0) + self.assertEqual(order_line.qty_invoiced, 2) + + move = order_line.move_ids + self.assertEqual(len(move), 1) + self.assertEqual(move.quantity, 2) + + delivery_note_line = delivery_note.line_ids[1] + self.assertEqual(delivery_note_line.invoice_status, "invoiced") + self.assertEqual(delivery_note_line.sale_line_id, order_line) + self.assertEqual(delivery_note_line.product_qty, 2) + + invoice_line = final_invoice.invoice_line_ids[1] + self.assertEqual(invoice_line.sale_line_ids, order_line) + self.assertEqual(invoice_line.quantity, 2) + + # + # Ordine - Linea 3 + # Fattura - Linea 3 + # + order_line = sales_order.order_line[2] + self.assertEqual(order_line.invoice_status, "invoiced") + self.assertEqual(order_line.qty_to_invoice, 0) + self.assertEqual(order_line.qty_invoiced, 11) + + move = order_line.move_ids + self.assertEqual(len(move), 1) + self.assertEqual(move.quantity, 11) + + delivery_note_line = delivery_note.line_ids[2] + self.assertEqual(delivery_note_line.invoice_status, "invoiced") + self.assertEqual(delivery_note_line.sale_line_id, order_line) + self.assertEqual(delivery_note_line.product_qty, 11) + + invoice_line = final_invoice.invoice_line_ids[2] + self.assertEqual(invoice_line.sale_line_ids, order_line) + self.assertEqual(invoice_line.quantity, 11) + + # + # Ordine - Linea 4 + # Fattura - Linea 4 + # + order_line = sales_order.order_line[3] + self.assertEqual(order_line.invoice_status, "invoiced") + self.assertEqual(order_line.qty_to_invoice, 0) + self.assertEqual(order_line.qty_invoiced, 1) + + move = order_line.move_ids + self.assertEqual(len(move), 1) + self.assertEqual(move.quantity, 1) + + delivery_note_line = delivery_note.line_ids[3] + self.assertEqual(delivery_note_line.invoice_status, "invoiced") + self.assertEqual(delivery_note_line.sale_line_id, order_line) + self.assertEqual(delivery_note_line.product_qty, 1) + + invoice_line = final_invoice.invoice_line_ids[3] + self.assertEqual(invoice_line.sale_line_ids, order_line) + self.assertEqual(invoice_line.quantity, 1) + + # + # Ordine - Linea 5 + # Fattura - Linea 5 section (Downpayment) + # Fattura - Linea 6 (Downpayment) + # + order_line = sales_order.order_line[5] + self.assertEqual(order_line.invoice_status, "invoiced") + self.assertEqual(order_line.qty_to_invoice, 0) + self.assertEqual(order_line.qty_invoiced, 0) + + move = order_line.move_ids + self.assertEqual(len(move), 0) + + delivery_note_line = delivery_note.line_ids.filtered( + lambda note_line: note_line.sale_line_id == order_line + ) + + self.assertEqual(len(delivery_note_line), 0) + + invoice_line = final_invoice.invoice_line_ids[4] + self.assertEqual(invoice_line.display_type, "line_section") + self.assertEqual(invoice_line.name, "Down Payments") + + invoice_line = final_invoice.invoice_line_ids[5] + self.assertEqual(invoice_line.sale_line_ids, order_line) + self.assertEqual(invoice_line.quantity, -1) + + # + # Fattura - Linea 7 (DdT in fattura) + # + invoice_line = final_invoice.invoice_line_ids[6] + self.assertEqual(invoice_line.display_type, "line_note") + self.assertEqual(invoice_line.quantity, 0) + self.assertEqual(invoice_line.delivery_note_id, delivery_note) + + # ⇒ "Ordine singolo: fatturazione parziale" + def test_partial_invoicing_single_so(self): + # + # SO ┐ ┌ DdT + # ├ Picking ┘ + # │ + # └ Picking ┐ + # └ DdT + # + + StockPicking = self.env["stock.picking"] + + sales_order = self.create_sales_order( + [ + self.customizable_desk_line, + self.right_corner_desk_line, + self.large_cabinet_line, + self.storage_box_line, + ] + ) + self.assertEqual(len(sales_order.order_line), 4) + + sales_order.action_confirm() + self.add_downpayment_line(sales_order, "percentage", 10) + self.assertEqual(len(sales_order.order_line), 6) + self.assertEqual(sales_order.invoice_status, "no") + + downpayment_order_line = sales_order.order_line[5] + self.assertEqual(downpayment_order_line.invoice_status, "invoiced") + self.assertEqual(downpayment_order_line.qty_to_invoice, -1) + self.assertEqual(downpayment_order_line.qty_invoiced, 1) + + downpayment_invoice = sales_order.invoice_ids + self.assertEqual(len(downpayment_invoice), 1) + + downpayment_invoice_line = downpayment_invoice.invoice_line_ids + self.assertEqual(len(downpayment_invoice_line), 1) + self.assertEqual(downpayment_invoice_line.quantity, 1) + + picking = sales_order.picking_ids + self.assertEqual(len(picking), 1) + self.assertEqual(len(picking.move_ids), 4) + + picking.move_ids.quantity = False + picking.move_ids[0].quantity = 2 # 3 + picking.move_ids[1].quantity = 2 + picking.move_ids[2].quantity = 6 # 11 + picking.move_ids[3].quantity = 3 # 5 + + result = picking.button_validate() + self.assertTrue(result) + + wizard = Form.from_action(self.env, result).save() + self.assertEqual(wizard._name, "stock.backorder.confirmation") + wizard.process() + + first_delivery_note = self.create_delivery_note() + first_delivery_note.transport_datetime = datetime.now() + timedelta( + days=1, hours=3 + ) + first_delivery_note.picking_ids = picking + first_delivery_note.action_confirm() + self.assertEqual(len(first_delivery_note.line_ids), 4) + self.assertEqual(first_delivery_note.state, "confirm") + self.assertEqual(first_delivery_note.invoice_status, "to invoice") + + sales_order._create_invoices() + + self.assertEqual(len(sales_order.order_line), 6) + self.assertEqual(sales_order.invoice_status, "no") + + invoices = sales_order.invoice_ids + self.assertEqual(len(invoices), 2) + + partial_invoice = invoices[0] + self.assertEqual(len(partial_invoice.invoice_line_ids), 5) + self.assertEqual(partial_invoice.delivery_note_ids, first_delivery_note) + + self.assertEqual(len(first_delivery_note.line_ids), 4) + self.assertEqual(first_delivery_note.state, "invoiced") + self.assertEqual(first_delivery_note.invoice_status, "invoiced") + self.assertEqual(first_delivery_note.invoice_ids, partial_invoice) + + # + # = = - = = - = = - = = + # + + backorder = StockPicking.search([("backorder_id", "=", picking.id)]) + self.assertEqual(len(backorder), 1) + self.assertEqual(len(backorder.move_ids), 3) + + backorder.move_ids.quantity = False + backorder.move_ids[0].quantity = 1 + backorder.move_ids[1].quantity = 5 + backorder.move_ids[2].quantity = 2 + + result = backorder.button_validate() + self.assertTrue(result) + + second_delivery_note = self.create_delivery_note() + second_delivery_note.transport_datetime = datetime.now() + timedelta( + days=1, hours=3 + ) + second_delivery_note.picking_ids = backorder + second_delivery_note.action_confirm() + self.assertEqual(len(second_delivery_note.line_ids), 3) + self.assertEqual(second_delivery_note.state, "confirm") + self.assertEqual(second_delivery_note.invoice_status, "to invoice") + + # + # Ordine - Linea 1 + # Fattura - Linea 1 + # + order_line = sales_order.order_line[0] + self.assertEqual(order_line.invoice_status, "to invoice") + self.assertEqual(order_line.qty_to_invoice, 1) + self.assertEqual(order_line.qty_invoiced, 2) + + moves = order_line.move_ids + self.assertEqual(len(moves), 2) + self.assertEqual(moves[0].quantity, 2) + + delivery_note_line = first_delivery_note.line_ids[0] + self.assertEqual(delivery_note_line.invoice_status, "invoiced") + self.assertEqual(delivery_note_line.sale_line_id, order_line) + self.assertEqual(delivery_note_line.product_qty, 2) + + invoice_line = partial_invoice.invoice_line_ids[0] + self.assertEqual(invoice_line.sale_line_ids, order_line) + self.assertEqual(invoice_line.quantity, 2) + + # + # Ordine - Linea 2 + # Fattura - Linea 2 + # + order_line = sales_order.order_line[1] + self.assertEqual(order_line.invoice_status, "invoiced") + self.assertEqual(order_line.qty_to_invoice, 0) + self.assertEqual(order_line.qty_invoiced, 2) + + move = order_line.move_ids + self.assertEqual(len(move), 1) + self.assertEqual(move.quantity, 2) + + delivery_note_line = first_delivery_note.line_ids[1] + self.assertEqual(delivery_note_line.invoice_status, "invoiced") + self.assertEqual(delivery_note_line.sale_line_id, order_line) + self.assertEqual(delivery_note_line.product_qty, 2) + + invoice_line = partial_invoice.invoice_line_ids[1] + self.assertEqual(invoice_line.sale_line_ids, order_line) + self.assertEqual(invoice_line.quantity, 2) + + # + # Ordine - Linea 3 + # Fattura - Linea 3 + # + order_line = sales_order.order_line[2] + self.assertEqual(order_line.invoice_status, "to invoice") + self.assertEqual(order_line.qty_to_invoice, 5) + self.assertEqual(order_line.qty_invoiced, 6) + + moves = order_line.move_ids + self.assertEqual(len(moves), 2) + self.assertEqual(moves[0].quantity, 6) + + delivery_note_line = first_delivery_note.line_ids[2] + self.assertEqual(delivery_note_line.invoice_status, "invoiced") + self.assertEqual(delivery_note_line.sale_line_id, order_line) + self.assertEqual(delivery_note_line.product_qty, 6) + + invoice_line = partial_invoice.invoice_line_ids[2] + self.assertEqual(invoice_line.sale_line_ids, order_line) + self.assertEqual(invoice_line.quantity, 6) + + # + # Ordine - Linea 4 + # Fattura - Linea 4 + # + order_line = sales_order.order_line[3] + self.assertEqual(order_line.invoice_status, "to invoice") + self.assertEqual(order_line.qty_to_invoice, 2) + self.assertEqual(order_line.qty_invoiced, 3) + + moves = order_line.move_ids + self.assertEqual(len(moves), 2) + self.assertEqual(moves[0].quantity, 3) + + delivery_note_line = first_delivery_note.line_ids[3] + self.assertEqual(delivery_note_line.invoice_status, "invoiced") + self.assertEqual(delivery_note_line.sale_line_id, order_line) + self.assertEqual(delivery_note_line.product_qty, 3) + + invoice_line = partial_invoice.invoice_line_ids[3] + self.assertEqual(invoice_line.sale_line_ids, order_line) + self.assertEqual(invoice_line.quantity, 3) + + # + # Fattura - Linea 5 (DdT in fattura) + # + invoice_line = partial_invoice.invoice_line_ids[4] + self.assertEqual(invoice_line.display_type, "line_note") + self.assertEqual(invoice_line.quantity, 0) + self.assertEqual(invoice_line.delivery_note_id, first_delivery_note) + + # + # = = - = = - = = - = = + # + + second_delivery_note.action_invoice() + self.assertEqual(len(second_delivery_note.line_ids), 3) + self.assertEqual(second_delivery_note.state, "invoiced") + self.assertEqual(second_delivery_note.invoice_status, "invoiced") + + self.assertEqual(len(sales_order.order_line), 6) + self.assertEqual(sales_order.invoice_status, "invoiced") + + invoices = sales_order.invoice_ids + self.assertEqual(len(invoices), 3) + + final_invoice = invoices[1] + self.assertEqual(len(final_invoice.invoice_line_ids), 6) + self.assertEqual(final_invoice.delivery_note_ids, second_delivery_note) + + self.assertEqual(second_delivery_note.invoice_ids, final_invoice) + + # + # Ordine - Linea 1 + # Fattura - Linea 1 + # + order_line = sales_order.order_line[0] + self.assertEqual(order_line.invoice_status, "invoiced") + self.assertEqual(order_line.qty_to_invoice, 0) + self.assertEqual(order_line.qty_invoiced, 3) + + moves = order_line.move_ids + self.assertEqual(len(moves), 2) + self.assertEqual(moves[1].quantity, 1) + + delivery_note_line = second_delivery_note.line_ids[0] + self.assertEqual(delivery_note_line.invoice_status, "invoiced") + self.assertEqual(delivery_note_line.sale_line_id, order_line) + self.assertEqual(delivery_note_line.product_qty, 1) + + invoice_line = final_invoice.invoice_line_ids[0] + self.assertEqual(invoice_line.sale_line_ids, order_line) + self.assertEqual(invoice_line.quantity, 1) + + # + # Ordine - Linea 3 + # Fattura - Linea 2 + # + order_line = sales_order.order_line[2] + self.assertEqual(order_line.invoice_status, "invoiced") + self.assertEqual(order_line.qty_to_invoice, 0) + self.assertEqual(order_line.qty_invoiced, 11) + + moves = order_line.move_ids + self.assertEqual(len(moves), 2) + self.assertEqual(moves[1].quantity, 5) + + delivery_note_line = second_delivery_note.line_ids[1] + self.assertEqual(delivery_note_line.invoice_status, "invoiced") + self.assertEqual(delivery_note_line.sale_line_id, order_line) + self.assertEqual(delivery_note_line.product_qty, 5) + + invoice_line = final_invoice.invoice_line_ids[1] + self.assertEqual(invoice_line.sale_line_ids, order_line) + self.assertEqual(invoice_line.quantity, 5) + + # + # Ordine - Linea 4 + # Fattura - Linea 3 + # + order_line = sales_order.order_line[3] + self.assertEqual(order_line.invoice_status, "invoiced") + self.assertEqual(order_line.qty_to_invoice, 0) + self.assertEqual(order_line.qty_invoiced, 5) + + moves = order_line.move_ids + self.assertEqual(len(moves), 2) + self.assertEqual(moves[1].quantity, 2) + + delivery_note_line = second_delivery_note.line_ids[2] + self.assertEqual(delivery_note_line.invoice_status, "invoiced") + self.assertEqual(delivery_note_line.sale_line_id, order_line) + self.assertEqual(delivery_note_line.product_qty, 2) + + invoice_line = final_invoice.invoice_line_ids[2] + self.assertEqual(invoice_line.sale_line_ids, order_line) + self.assertEqual(invoice_line.quantity, 2) + + # + # Ordine - Linea 5 (Downpayment) + # Fattura - Linea 4 section (Downpayment) + # Fattura - Linea 5 (Downpayment) + # + order_line = sales_order.order_line[5] + self.assertEqual(order_line.invoice_status, "invoiced") + self.assertEqual(order_line.qty_to_invoice, 0) + self.assertEqual(order_line.qty_invoiced, 0) + + move = order_line.move_ids + self.assertEqual(len(move), 0) + + delivery_notes = first_delivery_note | second_delivery_note + delivery_note_line = delivery_notes.mapped("line_ids").filtered( + lambda note_line: note_line.sale_line_id == order_line + ) + + self.assertEqual(len(delivery_note_line), 0) + + invoice_line = final_invoice.invoice_line_ids[3] + self.assertEqual(invoice_line.display_type, "line_section") + self.assertEqual(invoice_line.name, "Down Payments") + + invoice_line = final_invoice.invoice_line_ids[4] + self.assertEqual(invoice_line.sale_line_ids, order_line) + self.assertEqual(invoice_line.quantity, -1) + + # + # Fattura - Linea 6 (DdT in fattura) + # + invoice_line = final_invoice.invoice_line_ids[5] + self.assertEqual(invoice_line.display_type, "line_note") + self.assertEqual(invoice_line.quantity, 0) + self.assertEqual(invoice_line.delivery_note_id, second_delivery_note) + + # ⇒ "Ordini multipli: fatturazione completa" + def test_complete_invoicing_multiple_so(self): + # + # SO ┐ + # └ Picking ┐ + # ├ DdT + # ┌ Picking ┘ + # SO ┘ + # + + first_sales_order = self.create_sales_order( + [ + self.desk_combination_line, + self.customizable_desk_line, + self.right_corner_desk_line, + ] + ) + self.assertEqual(len(first_sales_order.order_line), 3) + + first_sales_order.action_confirm() + self.add_downpayment_line(first_sales_order, "percentage", 10) + self.assertEqual(len(first_sales_order.order_line), 5) + self.assertEqual(first_sales_order.invoice_status, "no") + + downpayment_order_line = first_sales_order.order_line[4] + self.assertEqual(downpayment_order_line.invoice_status, "invoiced") + self.assertEqual(downpayment_order_line.qty_to_invoice, -1) + self.assertEqual(downpayment_order_line.qty_invoiced, 1) + + downpayment_invoice = first_sales_order.invoice_ids + self.assertEqual(len(downpayment_invoice), 1) + + downpayment_invoice_line = downpayment_invoice.invoice_line_ids + self.assertEqual(len(downpayment_invoice_line), 1) + self.assertEqual(downpayment_invoice_line.quantity, 1) + + first_picking = first_sales_order.picking_ids + self.assertEqual(len(first_picking), 1) + self.assertEqual(len(first_picking.move_ids), 3) + + first_picking.move_ids.quantity = False + first_picking.move_ids[0].quantity = 1 + first_picking.move_ids[1].quantity = 3 + first_picking.move_ids[2].quantity = 2 + + result = first_picking.button_validate() + self.assertTrue(result) + + # + # = = - = = - = = - = = + # + + second_sales_order = self.create_sales_order( + [self.large_cabinet_line, self.storage_box_line, self.large_desk_line] + ) + self.assertEqual(len(second_sales_order.order_line), 3) + + second_sales_order.action_confirm() + self.assertEqual(second_sales_order.invoice_status, "no") + + second_picking = second_sales_order.picking_ids + self.assertEqual(len(second_picking), 1) + self.assertEqual(len(second_picking.move_ids), 3) + + second_picking.move_ids.quantity = False + second_picking.move_ids[0].quantity = 11 + second_picking.move_ids[1].quantity = 5 + second_picking.move_ids[2].quantity = 1 + + result = second_picking.button_validate() + self.assertTrue(result) + + # + # = = - = = - = = - = = + # + + pickings = first_picking | second_picking + delivery_note = self.create_delivery_note() + delivery_note.transport_datetime = datetime.now() + timedelta(days=1, hours=3) + delivery_note.picking_ids = pickings + delivery_note.action_confirm() + self.assertEqual(len(delivery_note.line_ids), 6) + self.assertEqual(delivery_note.state, "confirm") + self.assertEqual(delivery_note.invoice_status, "to invoice") + + delivery_note.action_invoice() + self.assertEqual(len(delivery_note.line_ids), 6) + self.assertEqual(delivery_note.state, "invoiced") + self.assertEqual(delivery_note.invoice_status, "invoiced") + + self.assertEqual(len(first_sales_order.order_line), 5) + self.assertEqual(first_sales_order.invoice_status, "invoiced") + + self.assertEqual(len(second_sales_order.order_line), 3) + self.assertEqual(second_sales_order.invoice_status, "invoiced") + + sales_orders = first_sales_order | second_sales_order + + invoices = sales_orders.mapped("invoice_ids") + self.assertEqual(len(invoices), 2) + + final_invoice = invoices[0] + self.assertEqual(len(final_invoice.invoice_line_ids), 9) + self.assertEqual(final_invoice.delivery_note_ids, delivery_note) + + self.assertEqual(delivery_note.invoice_ids, final_invoice) + + # + # Ordine 1 - Linea 1 + # Fattura - Linea 1 + # + order_line = first_sales_order.order_line[0] + self.assertEqual(order_line.invoice_status, "invoiced") + self.assertEqual(order_line.qty_to_invoice, 0) + self.assertEqual(order_line.qty_invoiced, 1) + + move = order_line.move_ids + self.assertEqual(len(move), 1) + self.assertEqual(move.quantity, 1) + + delivery_note_line = delivery_note.line_ids[0] + self.assertEqual(delivery_note_line.invoice_status, "invoiced") + self.assertEqual(delivery_note_line.sale_line_id, order_line) + self.assertEqual(delivery_note_line.product_qty, 1) + + invoice_line = final_invoice.invoice_line_ids[0] + self.assertEqual(invoice_line.sale_line_ids, order_line) + self.assertEqual(invoice_line.quantity, 1) + + # + # Ordine 1 - Linea 2 + # Fattura - Linea 2 + # + order_line = first_sales_order.order_line[1] + self.assertEqual(order_line.invoice_status, "invoiced") + self.assertEqual(order_line.qty_to_invoice, 0) + self.assertEqual(order_line.qty_invoiced, 3) + + move = order_line.move_ids + self.assertEqual(len(move), 1) + self.assertEqual(move.quantity, 3) + + delivery_note_line = delivery_note.line_ids[1] + self.assertEqual(delivery_note_line.invoice_status, "invoiced") + self.assertEqual(delivery_note_line.sale_line_id, order_line) + self.assertEqual(delivery_note_line.product_qty, 3) + + invoice_line = final_invoice.invoice_line_ids[1] + self.assertEqual(invoice_line.sale_line_ids, order_line) + self.assertEqual(invoice_line.quantity, 3) + + # + # Ordine 1 - Linea 3 + # Fattura - Linea 3 + # + order_line = first_sales_order.order_line[2] + self.assertEqual(order_line.invoice_status, "invoiced") + self.assertEqual(order_line.qty_to_invoice, 0) + self.assertEqual(order_line.qty_invoiced, 2) + + move = order_line.move_ids + self.assertEqual(len(move), 1) + self.assertEqual(move.quantity, 2) + + delivery_note_line = delivery_note.line_ids[2] + self.assertEqual(delivery_note_line.invoice_status, "invoiced") + self.assertEqual(delivery_note_line.sale_line_id, order_line) + self.assertEqual(delivery_note_line.product_qty, 2) + + invoice_line = final_invoice.invoice_line_ids[2] + self.assertEqual(invoice_line.sale_line_ids, order_line) + self.assertEqual(invoice_line.quantity, 2) + + # + # Ordine 1 - Linea 4 (Downpayment) + # Fattura - Linea 4 section (Downpayment) + # Fattura - Linea 5 (Downpayment) + # + order_line = first_sales_order.order_line[4] + self.assertEqual(order_line.invoice_status, "invoiced") + self.assertEqual(order_line.qty_to_invoice, 0) + self.assertEqual(order_line.qty_invoiced, 0) + + move = order_line.move_ids + self.assertEqual(len(move), 0) + + delivery_note_line = delivery_note.line_ids.filtered( + lambda note_line: note_line.sale_line_id == order_line + ) + + self.assertEqual(len(delivery_note_line), 0) + + invoice_line = final_invoice.invoice_line_ids[3] + self.assertEqual(invoice_line.display_type, "line_section") + self.assertEqual(invoice_line.name, "Down Payments") + + invoice_line = final_invoice.invoice_line_ids[4] + self.assertEqual(invoice_line.sale_line_ids, order_line) + self.assertEqual(invoice_line.quantity, -1) + + # + # Ordine 2 - Linea 1 + # Fattura - Linea 6 + # + order_line = second_sales_order.order_line[0] + self.assertEqual(order_line.invoice_status, "invoiced") + self.assertEqual(order_line.qty_to_invoice, 0) + self.assertEqual(order_line.qty_invoiced, 11) + + move = order_line.move_ids + self.assertEqual(len(move), 1) + self.assertEqual(move.quantity, 11) + + delivery_note_line = delivery_note.line_ids[3] + self.assertEqual(delivery_note_line.invoice_status, "invoiced") + self.assertEqual(delivery_note_line.sale_line_id, order_line) + self.assertEqual(delivery_note_line.product_qty, 11) + + invoice_line = final_invoice.invoice_line_ids[5] + self.assertEqual(invoice_line.sale_line_ids, order_line) + self.assertEqual(invoice_line.quantity, 11) + + # + # Ordine 2 - Linea 2 + # Fattura - Linea 7 + # + order_line = second_sales_order.order_line[1] + self.assertEqual(order_line.invoice_status, "invoiced") + self.assertEqual(order_line.qty_to_invoice, 0) + self.assertEqual(order_line.qty_invoiced, 5) + + move = order_line.move_ids + self.assertEqual(len(move), 1) + self.assertEqual(move.quantity, 5) + + delivery_note_line = delivery_note.line_ids[4] + self.assertEqual(delivery_note_line.invoice_status, "invoiced") + self.assertEqual(delivery_note_line.sale_line_id, order_line) + self.assertEqual(delivery_note_line.product_qty, 5) + + invoice_line = final_invoice.invoice_line_ids[6] + self.assertEqual(invoice_line.sale_line_ids, order_line) + self.assertEqual(invoice_line.quantity, 5) + + # + # Ordine 2 - Linea 3 + # Fattura - Linea 8 + # + order_line = second_sales_order.order_line[2] + self.assertEqual(order_line.invoice_status, "invoiced") + self.assertEqual(order_line.qty_to_invoice, 0) + self.assertEqual(order_line.qty_invoiced, 1) + + move = order_line.move_ids + self.assertEqual(len(move), 1) + self.assertEqual(move.quantity, 1) + + delivery_note_line = delivery_note.line_ids[5] + self.assertEqual(delivery_note_line.invoice_status, "invoiced") + self.assertEqual(delivery_note_line.sale_line_id, order_line) + self.assertEqual(delivery_note_line.product_qty, 1) + + invoice_line = final_invoice.invoice_line_ids[7] + self.assertEqual(invoice_line.sale_line_ids, order_line) + self.assertEqual(invoice_line.quantity, 1) + + # + # Fattura - Linea 9 (DdT in fattura) + # + invoice_line = final_invoice.invoice_line_ids[8] + self.assertEqual(invoice_line.display_type, "line_note") + self.assertEqual(invoice_line.quantity, 0) + self.assertEqual(invoice_line.delivery_note_id, delivery_note) + + # ⇒ "Ordini multipli: fatturazione parziale" + def test_partial_invoicing_multiple_so(self): + # + # ┌ Picking ──────┐ + # SO ┤ ├ DdT + # │ ┌ Picking ┘ + # │ SO ┤ + # │ └ Picking ┐ + # │ ├ DdT + # └ Picking ──────┘ + # + + StockPicking = self.env["stock.picking"] + + first_sales_order = self.create_sales_order( + [ + self.desk_combination_line, + self.right_corner_desk_line, + self.large_desk_line, + ] + ) + self.assertEqual(len(first_sales_order.order_line), 3) + + first_sales_order.action_confirm() + self.add_downpayment_line(first_sales_order, "percentage", 10) + self.assertEqual(len(first_sales_order.order_line), 5) + self.assertEqual(first_sales_order.invoice_status, "no") + + downpayment_order_line = first_sales_order.order_line[4] + self.assertEqual(downpayment_order_line.invoice_status, "invoiced") + self.assertEqual(downpayment_order_line.qty_to_invoice, -1) + self.assertEqual(downpayment_order_line.qty_invoiced, 1) + + downpayment_invoice = first_sales_order.invoice_ids + self.assertEqual(len(downpayment_invoice), 1) + + downpayment_invoice_line = downpayment_invoice.invoice_line_ids + self.assertEqual(len(downpayment_invoice_line), 1) + self.assertEqual(downpayment_invoice_line.quantity, 1) + + first_picking = first_sales_order.picking_ids + self.assertEqual(len(first_picking), 1) + self.assertEqual(len(first_picking.move_ids), 3) + + first_picking.move_ids.quantity = False + first_picking.move_ids[0].quantity = 1 + first_picking.move_ids[1].quantity = 1 # 2 + first_picking.move_ids[2].quantity = 1 + + result = first_picking.button_validate() + self.assertTrue(result) + + wizard = Form.from_action(self.env, result).save() + self.assertEqual(wizard._name, "stock.backorder.confirmation") + wizard.process() + + # + # = = - = = - = = - = = + # + + second_sales_order = self.create_sales_order( + [ + self.customizable_desk_line, + self.large_cabinet_line, + self.storage_box_line, + ] + ) + self.assertEqual(len(second_sales_order.order_line), 3) + + second_sales_order.action_confirm() + self.assertEqual(second_sales_order.invoice_status, "no") + + second_picking = second_sales_order.picking_ids + self.assertEqual(len(second_picking), 1) + self.assertEqual(len(second_picking.move_ids), 3) + + second_picking.move_ids.quantity = False + second_picking.move_ids[0].quantity = 3 + second_picking.move_ids[1].quantity = 3 # 11 + second_picking.move_ids[2].quantity = 3 # 5 + + result = second_picking.button_validate() + self.assertTrue(result) + + wizard = Form.from_action(self.env, result).save() + self.assertEqual(wizard._name, "stock.backorder.confirmation") + wizard.process() + + # + # = = - = = - = = - = = + # + + pickings = first_picking | second_picking + first_delivery_note = self.create_delivery_note() + first_delivery_note.transport_datetime = datetime.now() + timedelta( + days=1, hours=3 + ) + first_delivery_note.picking_ids = pickings + first_delivery_note.action_confirm() + self.assertEqual(len(first_delivery_note.line_ids), 6) + self.assertEqual(first_delivery_note.state, "confirm") + self.assertEqual(first_delivery_note.invoice_status, "to invoice") + + first_sales_order._create_invoices() + self.assertEqual(len(first_sales_order.order_line), 5) + self.assertEqual(first_sales_order.invoice_status, "no") + + second_sales_order._create_invoices() + self.assertEqual(len(second_sales_order.order_line), 3) + self.assertEqual(second_sales_order.invoice_status, "no") + + sales_orders = first_sales_order | second_sales_order + + invoices = sales_orders.mapped("invoice_ids") + self.assertEqual(len(invoices), 3) + + first_partial_invoice = invoices[0] + self.assertEqual(len(first_partial_invoice.invoice_line_ids), 4) + self.assertEqual(first_partial_invoice.delivery_note_ids, first_delivery_note) + + second_partial_invoice = invoices[2] + self.assertEqual(len(second_partial_invoice.invoice_line_ids), 4) + self.assertEqual(second_partial_invoice.delivery_note_ids, first_delivery_note) + + self.assertEqual(len(first_delivery_note.line_ids), 6) + self.assertEqual(first_delivery_note.state, "invoiced") + self.assertEqual(len(first_delivery_note.invoice_ids), 2) + self.assertEqual(first_delivery_note.invoice_ids[0], first_partial_invoice) + self.assertEqual(first_delivery_note.invoice_ids[1], second_partial_invoice) + + # + # = = - = = - = = - = = + # + + first_backorder = StockPicking.search([("backorder_id", "=", first_picking.id)]) + self.assertEqual(len(first_backorder), 1) + self.assertEqual(len(first_backorder.move_ids), 1) + + first_backorder.move_ids.quantity = False + first_backorder.move_ids[0].quantity = 1 + + result = first_backorder.button_validate() + self.assertTrue(result) + + # + # = = - = = - = = - = = + # + + second_backorder = StockPicking.search( + [("backorder_id", "=", second_picking.id)] + ) + self.assertEqual(len(second_backorder), 1) + self.assertEqual(len(second_backorder.move_ids), 2) + + second_backorder.move_ids.quantity = False + second_backorder.move_ids[0].quantity = 8 + second_backorder.move_ids[1].quantity = 2 + + result = second_backorder.button_validate() + self.assertTrue(result) + + backorders = first_backorder | second_backorder + second_delivery_note = self.create_delivery_note() + second_delivery_note.transport_datetime = datetime.now() + timedelta( + days=1, hours=3 + ) + second_delivery_note.picking_ids = backorders + second_delivery_note.action_confirm() + self.assertEqual(len(second_delivery_note.line_ids), 3) + self.assertEqual(second_delivery_note.state, "confirm") + self.assertEqual(second_delivery_note.invoice_status, "to invoice") + + # + # Ordine 1 - Linea 1 + # Fattura 1 - Linea 1 + # + order_line = first_sales_order.order_line[0] + self.assertEqual(order_line.invoice_status, "invoiced") + self.assertEqual(order_line.qty_to_invoice, 0) + self.assertEqual(order_line.qty_invoiced, 1) + + move = order_line.move_ids + self.assertEqual(len(move), 1) + self.assertEqual(move.quantity, 1) + + delivery_note_line = first_delivery_note.line_ids[0] + self.assertEqual(delivery_note_line.invoice_status, "invoiced") + self.assertEqual(delivery_note_line.sale_line_id, order_line) + self.assertEqual(delivery_note_line.product_qty, 1) + + invoice_line = first_partial_invoice.invoice_line_ids[0] + self.assertEqual(invoice_line.sale_line_ids, order_line) + self.assertEqual(invoice_line.quantity, 1) + + # + # Ordine 1 - Linea 2 + # Fattura 1 - Linea 2 + # + order_line = first_sales_order.order_line[1] + self.assertEqual(order_line.invoice_status, "to invoice") + self.assertEqual(order_line.qty_to_invoice, 1) + self.assertEqual(order_line.qty_invoiced, 1) + + moves = order_line.move_ids + self.assertEqual(len(moves), 2) + self.assertEqual(moves[0].quantity, 1) + + delivery_note_line = first_delivery_note.line_ids[1] + self.assertEqual(delivery_note_line.invoice_status, "invoiced") + self.assertEqual(delivery_note_line.sale_line_id, order_line) + self.assertEqual(delivery_note_line.product_qty, 1) + + invoice_line = first_partial_invoice.invoice_line_ids[1] + self.assertEqual(invoice_line.sale_line_ids, order_line) + self.assertEqual(invoice_line.quantity, 1) + + # + # Ordine 1 - Linea 3 + # Fattura 1 - Linea 3 + # + order_line = first_sales_order.order_line[2] + self.assertEqual(order_line.invoice_status, "invoiced") + self.assertEqual(order_line.qty_to_invoice, 0) + self.assertEqual(order_line.qty_invoiced, 1) + + move = order_line.move_ids + self.assertEqual(len(move), 1) + self.assertEqual(move.quantity, 1) + + delivery_note_line = first_delivery_note.line_ids[2] + self.assertEqual(delivery_note_line.invoice_status, "invoiced") + self.assertEqual(delivery_note_line.sale_line_id, order_line) + self.assertEqual(delivery_note_line.product_qty, 1) + + invoice_line = first_partial_invoice.invoice_line_ids[2] + self.assertEqual(invoice_line.sale_line_ids, order_line) + self.assertEqual(invoice_line.quantity, 1) + + # + # Fattura 1 - Linea 4 (DdT in fattura) + # + invoice_line = first_partial_invoice.invoice_line_ids[3] + self.assertEqual(invoice_line.display_type, "line_note") + self.assertEqual(invoice_line.quantity, 0) + self.assertEqual(invoice_line.delivery_note_id, first_delivery_note) + + # + # Ordine 2 - Linea 1 + # Fattura 2 - Linea 1 + # + order_line = second_sales_order.order_line[0] + self.assertEqual(order_line.invoice_status, "invoiced") + self.assertEqual(order_line.qty_to_invoice, 0) + self.assertEqual(order_line.qty_invoiced, 3) + + move = order_line.move_ids + self.assertEqual(len(move), 1) + self.assertEqual(move.quantity, 3) + + delivery_note_line = first_delivery_note.line_ids[3] + self.assertEqual(delivery_note_line.invoice_status, "invoiced") + self.assertEqual(delivery_note_line.sale_line_id, order_line) + self.assertEqual(delivery_note_line.product_qty, 3) + + invoice_line = second_partial_invoice.invoice_line_ids[0] + self.assertEqual(invoice_line.sale_line_ids, order_line) + self.assertEqual(invoice_line.quantity, 3) + + # + # Ordine 2 - Linea 2 + # Fattura 2 - Linea 2 + # + order_line = second_sales_order.order_line[1] + self.assertEqual(order_line.invoice_status, "to invoice") + self.assertEqual(order_line.qty_to_invoice, 8) + self.assertEqual(order_line.qty_invoiced, 3) + + moves = order_line.move_ids + self.assertEqual(len(moves), 2) + self.assertEqual(moves[0].quantity, 3) + + delivery_note_line = first_delivery_note.line_ids[4] + self.assertEqual(delivery_note_line.invoice_status, "invoiced") + self.assertEqual(delivery_note_line.sale_line_id, order_line) + self.assertEqual(delivery_note_line.product_qty, 3) + + invoice_line = second_partial_invoice.invoice_line_ids[1] + self.assertEqual(invoice_line.sale_line_ids, order_line) + self.assertEqual(invoice_line.quantity, 3) + + # + # Ordine 2 - Linea 3 + # Fattura 2 - Linea 3 + # + order_line = second_sales_order.order_line[2] + self.assertEqual(order_line.invoice_status, "to invoice") + self.assertEqual(order_line.qty_to_invoice, 2) + self.assertEqual(order_line.qty_invoiced, 3) + + moves = order_line.move_ids + self.assertEqual(len(moves), 2) + self.assertEqual(moves[0].quantity, 3) + + delivery_note_line = first_delivery_note.line_ids[5] + self.assertEqual(delivery_note_line.invoice_status, "invoiced") + self.assertEqual(delivery_note_line.sale_line_id, order_line) + self.assertEqual(delivery_note_line.product_qty, 3) + + invoice_line = second_partial_invoice.invoice_line_ids[2] + self.assertEqual(invoice_line.sale_line_ids, order_line) + self.assertEqual(invoice_line.quantity, 3) + + # + # Fattura 2 - Linea 4 (DdT in fattura) + # + invoice_line = second_partial_invoice.invoice_line_ids[3] + self.assertEqual(invoice_line.display_type, "line_note") + self.assertEqual(invoice_line.quantity, 0) + self.assertEqual(invoice_line.delivery_note_id, first_delivery_note) + + # + # = = - = = - = = - = = + # + + second_delivery_note.action_invoice() + self.assertEqual(len(second_delivery_note.line_ids), 3) + self.assertEqual(second_delivery_note.state, "invoiced") + self.assertEqual(second_delivery_note.invoice_status, "invoiced") + + self.assertEqual(len(first_sales_order.order_line), 5) + self.assertEqual(first_sales_order.invoice_status, "invoiced") + + self.assertEqual(len(second_sales_order.order_line), 3) + self.assertEqual(second_sales_order.invoice_status, "invoiced") + + invoices = sales_orders.mapped("invoice_ids") + self.assertEqual(len(invoices), 4) + + final_invoice = invoices[1] + self.assertEqual(len(final_invoice.invoice_line_ids), 6) + self.assertEqual(final_invoice.delivery_note_ids, second_delivery_note) + + self.assertEqual(second_delivery_note.invoice_ids, final_invoice) + + # + # Ordine 1 - Linea 2 + # Fattura 3 - Linea 1 + # + order_line = first_sales_order.order_line[1] + self.assertEqual(order_line.invoice_status, "invoiced") + self.assertEqual(order_line.qty_to_invoice, 0) + self.assertEqual(order_line.qty_invoiced, 2) + + moves = order_line.move_ids + self.assertEqual(len(moves), 2) + self.assertEqual(moves[1].quantity, 1) + + delivery_note_line = second_delivery_note.line_ids[0] + self.assertEqual(delivery_note_line.invoice_status, "invoiced") + self.assertEqual(delivery_note_line.sale_line_id, order_line) + self.assertEqual(delivery_note_line.product_qty, 1) + + invoice_line = final_invoice.invoice_line_ids[0] + self.assertEqual(invoice_line.sale_line_ids, order_line) + self.assertEqual(invoice_line.quantity, 1) + + # + # Ordine 1 - Linea 4 (Downpayment) + # Fattura 3 - Linea 2 section (Downpayment) + # Fattura 3 - Linea 3 (Downpayment) + # + order_line = first_sales_order.order_line[4] + self.assertEqual(order_line.invoice_status, "invoiced") + self.assertEqual(order_line.qty_to_invoice, 0) + self.assertEqual(order_line.qty_invoiced, 0) + + move = order_line.move_ids + self.assertEqual(len(move), 0) + + delivery_notes = first_delivery_note | second_delivery_note + delivery_note_line = delivery_notes.mapped("line_ids").filtered( + lambda note_line: note_line.sale_line_id == order_line + ) + + self.assertEqual(len(delivery_note_line), 0) + + invoice_line = final_invoice.invoice_line_ids[1] + self.assertEqual(invoice_line.display_type, "line_section") + self.assertEqual(invoice_line.name, "Down Payments") + + invoice_line = final_invoice.invoice_line_ids[2] + self.assertEqual(invoice_line.sale_line_ids, order_line) + self.assertEqual(invoice_line.quantity, -1) + + # + # Ordine 2 - Linea 2 + # Fattura 3 - Linea 4 + # + order_line = second_sales_order.order_line[1] + self.assertEqual(order_line.invoice_status, "invoiced") + self.assertEqual(order_line.qty_to_invoice, 0) + self.assertEqual(order_line.qty_invoiced, 11) + + moves = order_line.move_ids + self.assertEqual(len(moves), 2) + self.assertEqual(moves[1].quantity, 8) + + delivery_note_line = second_delivery_note.line_ids[1] + self.assertEqual(delivery_note_line.invoice_status, "invoiced") + self.assertEqual(delivery_note_line.sale_line_id, order_line) + self.assertEqual(delivery_note_line.product_qty, 8) + + invoice_line = final_invoice.invoice_line_ids[3] + self.assertEqual(invoice_line.sale_line_ids, order_line) + self.assertEqual(invoice_line.quantity, 8) + + # + # Ordine 2 - Linea 3 + # Fattura 3 - Linea 5 + # + order_line = second_sales_order.order_line[2] + self.assertEqual(order_line.invoice_status, "invoiced") + self.assertEqual(order_line.qty_to_invoice, 0) + self.assertEqual(order_line.qty_invoiced, 5) + + moves = order_line.move_ids + self.assertEqual(len(moves), 2) + self.assertEqual(moves[1].quantity, 2) + + delivery_note_line = second_delivery_note.line_ids[2] + self.assertEqual(delivery_note_line.invoice_status, "invoiced") + self.assertEqual(delivery_note_line.sale_line_id, order_line) + self.assertEqual(delivery_note_line.product_qty, 2) + + invoice_line = final_invoice.invoice_line_ids[4] + self.assertEqual(invoice_line.sale_line_ids, order_line) + self.assertEqual(invoice_line.quantity, 2) + + # + # Fattura 3 - Linea 6 (DdT in fattura) + # + invoice_line = final_invoice.invoice_line_ids[5] + self.assertEqual(invoice_line.display_type, "line_note") + self.assertEqual(invoice_line.quantity, 0) + self.assertEqual(invoice_line.delivery_note_id, second_delivery_note) + + def test_delivery_note_to_draft_from_create(self): + """ + Create delivery_note from picking with already invoiced sale order then validate + and reset the status to draft. + """ + sales_order = self.create_sales_order( + [ + self.desk_combination_line, + ] + ) + sales_order.action_confirm() + picking = sales_order.picking_ids + picking.move_ids.quantity = False + picking.move_ids[0].quantity = 1 + picking.button_validate() + sales_order._create_invoices() + wizard = Form.from_action( + self.env, picking.action_delivery_note_create() + ).save() + result = wizard.confirm() + delivery_note = self.env["stock.delivery.note"].browse(result["res_id"]) + delivery_note.action_confirm() + delivery_note.action_cancel() + delivery_note.action_draft() + self.assertEqual(delivery_note.invoice_status, "no") + self.assertEqual(delivery_note.state, "draft") diff --git a/l10n_it_delivery_note/tests/test_stock_delivery_note_portal.py b/l10n_it_delivery_note/tests/test_stock_delivery_note_portal.py new file mode 100644 index 000000000000..5f17b1395161 --- /dev/null +++ b/l10n_it_delivery_note/tests/test_stock_delivery_note_portal.py @@ -0,0 +1,222 @@ +# Copyright 2023 Nextev Srl +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo.exceptions import AccessError +from odoo.tests import Form, HttpCase, new_test_user + +from .delivery_note_common import StockDeliveryNoteCommon + + +class StockDeliveryNotePortal(StockDeliveryNoteCommon, HttpCase): + def setUp(self): + super().setUp() + + self.user_mr = new_test_user( + self.env, + login="mr", + password="portal", + groups="base.group_portal", + ) + self.user_mr.partner_id = self.recipient + + # Mario Rossi SO + self.sales_order_mr = self.create_sales_order( + [ + self.large_desk_line, # 1 + self.desk_combination_line, # 1 + ], + ) + self.assertEqual(len(self.sales_order_mr.order_line), 2) + self.sales_order_mr.action_confirm() + self.assertEqual(len(self.sales_order_mr.picking_ids), 1) + self.picking_mr = self.sales_order_mr.picking_ids + self.assertEqual(len(self.picking_mr.move_ids), 2) + + self.picking_mr.move_ids.quantity = False + self.picking_mr.move_ids[0].quantity = 1 + self.picking_mr.move_ids[1].quantity = 1 + + self.picking_mr.button_validate() + dn = Form.from_action( + self.env, self.picking_mr.action_delivery_note_create() + ).save() + dn.confirm() + self.delivery_note_mr = self.picking_mr.delivery_note_id + self.assertTrue(self.delivery_note_mr) + self.delivery_note_mr.action_confirm() + + # Anna Bianchi SO + company_ab = self.create_commercial_partner("Azienda Bianchi") + anna_bianchi = self.create_partner("Anna Bianchi", company_ab) + self.recipient = anna_bianchi + self.sales_order_ab = self.create_sales_order( + [ + self.desk_combination_line, # 1 + self.customizable_desk_line, # 3 + ], + ) + self.assertEqual(len(self.sales_order_ab.order_line), 2) + self.sales_order_ab.action_confirm() + self.assertEqual(len(self.sales_order_ab.picking_ids), 1) + self.picking_ab = self.sales_order_ab.picking_ids + self.assertEqual(len(self.picking_ab.move_ids), 2) + + self.picking_ab.move_ids.quantity = False + self.picking_ab.move_ids[0].quantity = 1 + self.picking_ab.move_ids[1].quantity = 3 + + self.picking_ab.button_validate() + dn = Form.from_action( + self.env, self.picking_ab.action_delivery_note_create() + ).save() + dn.confirm() + self.delivery_note_ab = self.picking_ab.delivery_note_id + self.assertTrue(self.delivery_note_ab) + self.delivery_note_ab.action_confirm() + + # Anna Bianchi fatturazione, Mario Rossi spedizione + self.sales_order_ab_mr = self.create_sales_order( + [ + self.large_desk_line, # 1 + ], + ) + self.assertEqual(len(self.sales_order_ab_mr.order_line), 1) + self.sales_order_ab_mr.action_confirm() + self.assertEqual(len(self.sales_order_ab_mr.picking_ids), 1) + self.picking_ab_mr = self.sales_order_ab_mr.picking_ids + self.assertEqual(len(self.picking_ab_mr.move_ids), 1) + self.picking_ab_mr.partner_id = self.user_mr.partner_id + + self.picking_ab_mr.move_ids.quantity = False + self.picking_ab_mr.move_ids[0].quantity = 1 + + self.picking_ab_mr.button_validate() + dn = Form.from_action( + self.env, self.picking_ab_mr.action_delivery_note_create() + ).save() + dn.confirm() + self.delivery_note_ab_mr = self.picking_ab_mr.delivery_note_id + self.assertTrue(self.delivery_note_ab_mr) + self.delivery_note_ab_mr.action_confirm() + + # Azienda Rossi SO + self.recipient = self.user_mr.partner_id.parent_id + self.sales_order_azr = self.create_sales_order( + [ + self.desk_combination_line, # 1 + ], + ) + self.assertEqual(len(self.sales_order_azr.order_line), 1) + self.sales_order_azr.action_confirm() + self.assertEqual(len(self.sales_order_azr.picking_ids), 1) + self.picking_azr = self.sales_order_azr.picking_ids + self.assertEqual(len(self.picking_azr.move_ids), 1) + + self.picking_azr.move_ids.quantity = False + self.picking_azr.move_ids[0].quantity = 1 + + self.picking_azr.button_validate() + dn = Form.from_action( + self.env, self.picking_azr.action_delivery_note_create() + ).save() + dn.confirm() + self.delivery_note_azr = self.picking_azr.delivery_note_id + self.assertTrue(self.delivery_note_azr) + self.delivery_note_azr.action_confirm() + + def test_access_portal_user(self): + """Test portal user's access rights""" + # Portal users can see the Delivery Notes for which they + # are assigned as recipient or delivery address + self.assertTrue( + self.delivery_note_mr.with_user(self.user_mr).has_access("read") + ) + + # Portal users can't edit the DN + with self.assertRaises(AccessError): + self.delivery_note_mr.with_user(self.user_mr).write({"packages": 1}) + # Portal users can't create the DN + with self.assertRaises(AccessError): + self.env["stock.delivery.note"].with_user(self.user_mr).create({}) + # Portal users can't delete the DN + with self.assertRaises(AccessError): + self.delivery_note_mr.with_user(self.user_mr).action_cancel() + with self.assertRaises(AccessError): + self.delivery_note_mr.with_user(self.user_mr).unlink() + + # Portal users can't see the Delivery Notes for which they + # aren't assigned as recipient or delivery address + self.assertFalse( + self.delivery_note_ab.with_user(self.user_mr).has_access("read") + ) + + # Portal users can't edit the DN + with self.assertRaises(AccessError): + self.delivery_note_ab.with_user(self.user_mr).write({"packages": 1}) + # Portal users can't delete the DN + with self.assertRaises(AccessError): + self.delivery_note_ab.with_user(self.user_mr).action_cancel() + with self.assertRaises(AccessError): + self.delivery_note_ab.with_user(self.user_mr).unlink() + + # Portal users can see the Delivery Notes for which they + # are assigned as delivery address + self.assertTrue( + self.delivery_note_ab_mr.with_user(self.user_mr).has_access("read") + ) + + # Portal users can't edit the DN + with self.assertRaises(AccessError): + self.delivery_note_ab_mr.with_user(self.user_mr).write({"packages": 1}) + # Portal users can't delete the DN + with self.assertRaises(AccessError): + self.delivery_note_ab_mr.with_user(self.user_mr).action_cancel() + with self.assertRaises(AccessError): + self.delivery_note_ab_mr.with_user(self.user_mr).unlink() + + # Portal users can see the Delivery Notes for which their company + # are assigned as recipient + self.assertTrue( + self.delivery_note_azr.with_user(self.user_mr).has_access("read") + ) + + # Portal users can't edit the DN + with self.assertRaises(AccessError): + self.delivery_note_azr.with_user(self.user_mr).write({"packages": 1}) + # Portal users can't delete the DN + with self.assertRaises(AccessError): + self.delivery_note_azr.with_user(self.user_mr).action_cancel() + with self.assertRaises(AccessError): + self.delivery_note_azr.with_user(self.user_mr).unlink() + + def test_access_myportal_user(self): + """Test portal user DN urls access in its portal""" + base_url = "/my/delivery-notes/" + url_delivery_note_mr = f"{base_url}{self.delivery_note_mr.id}" + url_delivery_note_ab = f"{base_url}{self.delivery_note_ab.id}" + url_delivery_note_ab_mr = f"{base_url}{self.delivery_note_ab_mr.id}" + url_delivery_note_azr = f"{base_url}{self.delivery_note_azr.id}" + + # Authenticate with Mario Rossi + self.authenticate("mr", "portal") + # User can access Delivery Notes for which it's assigned as recipient + self.assertEqual( + self.url_open(url=url_delivery_note_mr).request.path_url, + url_delivery_note_mr, + ) + # User can't access Delivery Notes for which it isn't assigned + # as recipient or delivery address and it will be redirected to "my" page + self.assertEqual( + self.url_open(url=url_delivery_note_ab).request.path_url, "/my" + ) + # User can access Delivery Notes for which it's assigned as delivery address + self.assertEqual( + self.url_open(url=url_delivery_note_ab_mr).request.path_url, + url_delivery_note_ab_mr, + ) + # User can access Delivery Notes for which its company is assigned + # as recipient + self.assertEqual( + self.url_open(url=url_delivery_note_azr).request.path_url, + url_delivery_note_azr, + ) diff --git a/l10n_it_delivery_note/tests/test_stock_delivery_note_sequence.py b/l10n_it_delivery_note/tests/test_stock_delivery_note_sequence.py new file mode 100644 index 000000000000..d71b9771c60d --- /dev/null +++ b/l10n_it_delivery_note/tests/test_stock_delivery_note_sequence.py @@ -0,0 +1,201 @@ +# Copyright 2022 Sergio Corato +# Copyright 2023 Nextev Srl +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from datetime import date, datetime, timedelta + +from odoo.fields import Command +from odoo.tests import Form +from odoo.tests.common import users +from odoo.tools.date_utils import relativedelta + +from .delivery_note_common import StockDeliveryNoteCommon + + +class StockDeliveryNoteSequence(StockDeliveryNoteCommon): + def test_new_company_dn_type_creation(self): + """ + This test is for checking dn_types and sequence creation after + creating a new company + """ + company = self.env["res.company"].create( + { + "name": "New company", + } + ) + dn_types = self.env["stock.delivery.note.type"].search( + [("company_id", "=", company.id)] + ) + self.assertTrue( + dn_types.filtered( + lambda d: d.name == self.env._("Incoming") + and d.sequence_id + == self.env["ir.sequence"].search( + [ + ("code", "=", f"stock.delivery.note.din.c{company.id}"), + ("company_id", "=", company.id), + ] + ) + ) + ) + self.assertTrue( + dn_types.filtered( + lambda d: d.name == self.env._("Outgoing") + and d.sequence_id + == self.env["ir.sequence"].search( + [ + ("code", "=", f"stock.delivery.note.ddt.c{company.id}"), + ("company_id", "=", company.id), + ] + ) + ) + ) + self.assertTrue( + dn_types.filtered( + lambda d: d.name == self.env._("Outgoing (with prices)") + and d.sequence_id + == self.env["ir.sequence"].search( + [ + ("code", "=", f"stock.delivery.note.ddt.c{company.id}"), + ("company_id", "=", company.id), + ] + ) + ) + ) + self.assertTrue( + dn_types.filtered( + lambda d: d.name == self.env._("Internal transfer") + and d.sequence_id + == self.env["ir.sequence"].search( + [ + ("code", "=", f"stock.delivery.note.int.c{company.id}"), + ("company_id", "=", company.id), + ] + ) + ) + ) + + def test_initial_dn_type_creation(self): + """ + This test is for checking dn_types and sequence creation by + l10n_it_delivery_note post_init_hook + """ + companies = self.env["res.company"].search([]) + for company in companies: + dn_types = self.env["stock.delivery.note.type"].search( + [("company_id", "=", company.id)] + ) + self.assertTrue( + dn_types.filtered( + lambda d, c=company: d.name == self.env._("Incoming") + and d.sequence_id + == self.env["ir.sequence"].search( + [ + ("code", "=", f"stock.delivery.note.din.c{c.id}"), + ("company_id", "=", c.id), + ] + ) + ) + ) + self.assertTrue( + dn_types.filtered( + lambda d, c=company: d.name == self.env._("Outgoing") + and d.sequence_id + == self.env["ir.sequence"].search( + [ + ("code", "=", f"stock.delivery.note.ddt.c{c.id}"), + ("company_id", "=", c.id), + ] + ) + ) + ) + self.assertTrue( + dn_types.filtered( + lambda d, c=company: d.name == self.env._("Outgoing (with prices)") + and d.sequence_id + == self.env["ir.sequence"].search( + [ + ("code", "=", f"stock.delivery.note.ddt.c{c.id}"), + ("company_id", "=", c.id), + ] + ) + ) + ) + self.assertTrue( + dn_types.filtered( + lambda d, c=company: d.name == self.env._("Internal transfer") + and d.sequence_id + == self.env["ir.sequence"].search( + [ + ("code", "=", f"stock.delivery.note.int.c{c.id}"), + ("company_id", "=", c.id), + ] + ) + ) + ) + + @users("fm") + def test_complete_invoicing_sequence(self): + company_id = self.env.company.id + sequence = self.env["ir.sequence"].search( + [ + ("code", "=", f"stock.delivery.note.ddt.c{company_id}"), + ("company_id", "=", company_id), + ] + ) + current_year = datetime.today().year + old_year = (datetime.today() - relativedelta(years=1)).year + for sequence_year in [current_year, old_year]: + sequence.write( + { + "use_date_range": True, + "date_range_ids": [ + Command.create( + { + "date_from": date.today().replace( + month=1, day=1, year=sequence_year + ), + "date_to": date.today().replace( + month=12, day=31, year=sequence_year + ), + }, + ) + ], + } + ) + date_range_sequence = sequence.date_range_ids.filtered( + lambda x: x.date_from == date.today().replace(month=1, day=1, year=old_year) + ) + date_range_sequence.write({"number_next_actual": 50}) + sale_order = self.create_sales_order( + [ + self.desk_combination_line, + ] + ) + self.assertEqual(len(sale_order.order_line), 1) + sale_order.action_confirm() + picking = sale_order.picking_ids + self.assertEqual(len(picking), 1) + self.assertEqual(len(picking.move_ids), 1) + + picking.move_ids.quantity = False + picking.move_ids[0].quantity = 1 + result = picking.button_validate() + self.assertTrue(result) + + dn_form = Form( + self.env["stock.delivery.note.create.wizard"].with_context( + active_ids=picking.ids, + ) + ) + wizard = dn_form.save() + wizard.confirm() + delivery_note = picking.delivery_note_id + delivery_note.transport_datetime = datetime.now() + timedelta(days=1, hours=3) + delivery_note.date = date.today().replace(year=old_year) + delivery_note.action_confirm() + + self.assertEqual(delivery_note.type_id.sequence_id, sequence) + self.assertEqual( + delivery_note.name, f"{sequence.prefix}{50:0{sequence.padding}d}" + ) diff --git a/l10n_it_delivery_note/views/account_move.xml b/l10n_it_delivery_note/views/account_move.xml new file mode 100644 index 000000000000..39e4b2582a51 --- /dev/null +++ b/l10n_it_delivery_note/views/account_move.xml @@ -0,0 +1,29 @@ + + + + + account.view.move.form + account.move + + + + + + + + diff --git a/l10n_it_delivery_note/views/portal_my_delivery_notes.xml b/l10n_it_delivery_note/views/portal_my_delivery_notes.xml new file mode 100644 index 000000000000..28716449e8ab --- /dev/null +++ b/l10n_it_delivery_note/views/portal_my_delivery_notes.xml @@ -0,0 +1,147 @@ + + + + + + +