diff --git a/sale_invoice_plan/README.rst b/sale_invoice_plan/README.rst new file mode 100644 index 00000000000..cc1419dd364 --- /dev/null +++ b/sale_invoice_plan/README.rst @@ -0,0 +1,131 @@ +================== +Sales Invoice Plan +================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:e65d2ca5ee4ad4e5e68e2d61d67b087fa84c66d97eb1c690d2c08ce8b36f4b23 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png + :target: https://odoo-community.org/page/development-status + :alt: Alpha +.. |badge2| image:: https://img.shields.io/badge/licence-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%2Fsale--workflow-lightgray.png?logo=github + :target: https://github.com/OCA/sale-workflow/tree/16.0/sale_invoice_plan + :alt: OCA/sale-workflow +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/sale-workflow-16-0/sale-workflow-16-0-sale_invoice_plan + :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/sale-workflow&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +By standard feature, user can gradually create partial invoices, one by one. +This module add ability to create invoices based on the predefined invoice plan, +either all at once, or one by one. +The plan support both advance invoice and installment invoices. + +.. IMPORTANT:: + This is an alpha version, the data model and design can change at any time without warning. + Only for development or testing purpose, do not use in production. + `More details on development status `_ + +**Table of contents** + +.. contents:: + :local: + +Installation +============ + +Just install this module, and the sales order will have new option "Use Invoice Plan" + +Usage +===== + +- Create new sales quotation as per normal process +- Select option "Use Invoice Plan", a new Invoice Plan tab will appear +- Click on "=> Create Invoice Plan" link to open invoice planning wizard +- Do plan for number of installment and/or advance, start date and interval +- Double check that each advance/installment has correct plan percentage +- After confirm sales order, now we have new option to "Create Invoice by Plan" +- User can create only next invoice, or create all the rest invoices at the same time + +Changelog +========= + +15.0.1.1.0 (2022-05-10) +~~~~~~~~~~~~~~~~~~~~~~~ + +* remove dependency on stock + + + +12.0.1.0.0 (2019-03-08) +~~~~~~~~~~~~~~~~~~~~~~~ + +* Start of the history + +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 +~~~~~~~ + +* Ecosoft + +Contributors +~~~~~~~~~~~~ + +* Kitti Upariphutthiphong. (http://ecosoft.co.th) +* `Trobz `_: + + * Son Ho + +Other credits +~~~~~~~~~~~~~ + +The migration of this module from 13.0 to 14.0 was financially supported by Camptocamp + +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-kittiu| image:: https://github.com/kittiu.png?size=40px + :target: https://github.com/kittiu + :alt: kittiu + +Current `maintainer `__: + +|maintainer-kittiu| + +This module is part of the `OCA/sale-workflow `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/sale_invoice_plan/__init__.py b/sale_invoice_plan/__init__.py new file mode 100644 index 00000000000..1db99396178 --- /dev/null +++ b/sale_invoice_plan/__init__.py @@ -0,0 +1,4 @@ +# Copyright 2019 Ecosoft Co., Ltd (http://ecosoft.co.th/) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html) +from . import models +from . import wizard diff --git a/sale_invoice_plan/__manifest__.py b/sale_invoice_plan/__manifest__.py new file mode 100644 index 00000000000..38947e2ec10 --- /dev/null +++ b/sale_invoice_plan/__manifest__.py @@ -0,0 +1,23 @@ +# Copyright 2019 Ecosoft Co., Ltd (http://ecosoft.co.th/) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html) + +{ + "name": "Sales Invoice Plan", + "summary": "Add to sales order, ability to manage future invoice plan", + "version": "16.0.1.0.0", + "author": "Ecosoft,Odoo Community Association (OCA)", + "license": "AGPL-3", + "website": "https://github.com/OCA/sale-workflow", + "category": "Sales", + "depends": ["account", "sale_management"], + "data": [ + "security/ir.model.access.csv", + "data/sale_data.xml", + "wizard/sale_create_invoice_plan_view.xml", + "wizard/sale_make_planned_invoice_view.xml", + "views/sale_view.xml", + ], + "installable": True, + "development_status": "Alpha", + "maintainers": ["kittiu"], +} diff --git a/sale_invoice_plan/data/sale_data.xml b/sale_invoice_plan/data/sale_data.xml new file mode 100644 index 00000000000..7fc258ccfcc --- /dev/null +++ b/sale_invoice_plan/data/sale_data.xml @@ -0,0 +1,6 @@ + + + Sales Invoice Plan Percent + 6 + + diff --git a/sale_invoice_plan/i18n/es.po b/sale_invoice_plan/i18n/es.po new file mode 100644 index 00000000000..6765fc6368d --- /dev/null +++ b/sale_invoice_plan/i18n/es.po @@ -0,0 +1,445 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_invoice_plan +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-06-21 07:27+0000\n" +"PO-Revision-Date: 2020-10-26 12:08+0000\n" +"Last-Translator: Daniel Martinez Vila \n" +"Language-Team: none\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 3.10\n" + +#. module: sale_invoice_plan +#: model:ir.model.fields.selection,name:sale_invoice_plan.selection__sale_invoice_plan__invoice_type__advance +msgid "Advance" +msgstr "Avanzar" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__advance +msgid "Advance on 1st Invoice" +msgstr "Anticipo de la 1ª factura" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__amount +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_tree +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_tree_readonly +msgid "Amount" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__amount_invoiced +#, fuzzy +msgid "Amount Invoiced" +msgstr "Próxima factura" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__analytic_account_id +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +msgid "Analytic Account" +msgstr "" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_order_form_invoice_plan +msgid "Are you sure to remove this invoice plan?" +msgstr "¿Estás seguro de eliminar este plan de facturas?" + +#. module: sale_invoice_plan +#: model:ir.model.fields,help:sale_invoice_plan.field_sale_order__invoice_plan_process +msgid "At least one invoice plan line pending to create invoice" +msgstr "Al menos una línea del plan de factura pendiente para crear la factura" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_create_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_make_planned_invoice +msgid "Cancel" +msgstr "Cancelar" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_make_planned_invoice +msgid "Create All Remaining Invoices" +msgstr "Crear todas las facturas restantes" + +#. module: sale_invoice_plan +#: model:ir.actions.act_window,name:sale_invoice_plan.action_sale_create_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_create_invoice_plan +msgid "Create Invoice Plan" +msgstr "Crear plan de facturas" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_order_form_invoice_plan +msgid "Create Invoice by Plan" +msgstr "Crear factura por plan" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_make_planned_invoice +msgid "Create Next Inovice" +msgstr "Crear siguiente factura" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__create_uid +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__create_uid +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_make_planned_invoice__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__create_date +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__create_date +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_make_planned_invoice__create_date +msgid "Created on" +msgstr "Creado el" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__partner_id +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +msgid "Customer" +msgstr "Cliente" + +#. module: sale_invoice_plan +#: model:ir.model.fields.selection,name:sale_invoice_plan.selection__sale_create_invoice_plan__interval_type__day +msgid "Day" +msgstr "Día" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__display_name +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__display_name +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_make_planned_invoice__display_name +msgid "Display Name" +msgstr "Nombre mostrado" + +#. module: sale_invoice_plan +#: model:ir.model,name:sale_invoice_plan.model_sale_create_invoice_plan +msgid "Fillig invoice planning criteria" +msgstr "Cumplimiento de criterios de planificación de facturas" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +msgid "Group By" +msgstr "Agrupar por" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__id +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__id +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_make_planned_invoice__id +msgid "ID" +msgstr "ID" + +#. module: sale_invoice_plan +#: model:ir.model.fields,help:sale_invoice_plan.field_sale_invoice_plan__invoiced +msgid "If this line already invoiced" +msgstr "Si esta línea ya se facturó" + +#. module: sale_invoice_plan +#: model:ir.model.fields,help:sale_invoice_plan.field_sale_invoice_plan__to_invoice +msgid "If this line is ready to create new invoice" +msgstr "Si esta línea está lista para crear una nueva factura" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_order__invoice_plan_ids +msgid "Inovice Plan" +msgstr "Plan de factura" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__installment +#: model:ir.model.fields.selection,name:sale_invoice_plan.selection__sale_invoice_plan__invoice_type__installment +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +msgid "Installment" +msgstr "Entrega" + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/models/sale_invoice_plan.py:0 +#, python-format +msgid "" +"Installment %s: already used and not allowed to delete.\n" +"Please discard changes." +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__installment_date +msgid "Installment Date" +msgstr "Fecha de pago" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__interval +msgid "Interval" +msgstr "Intervalo" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__interval_type +msgid "Interval Type" +msgstr "Tipo de intervalo" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__invoiced +msgid "Invoice Created" +msgstr "Factura creada" + +#. module: sale_invoice_plan +#: model:ir.actions.act_window,name:sale_invoice_plan.action_view_sale_make_planned_invoice +msgid "Invoice Order" +msgstr "Orden de factura" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_order_form_invoice_plan +msgid "Invoice Plan" +msgstr "Plan de factura" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_order__invoice_plan_process +msgid "Invoice Plan In Process" +msgstr "Plan de factura en proceso" + +#. module: sale_invoice_plan +#: model:ir.model,name:sale_invoice_plan.model_sale_invoice_plan +msgid "Invoice Planning Detail" +msgstr "Detalle de planificación de facturas" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_make_planned_invoice +msgid "Invoice Sales Order" +msgstr "Orden de venta de factura" + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/models/sale.py:0 +#, python-format +msgid "Invoice plan total percentage must not exceed 100%" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__invoice_move_ids +msgid "Invoices" +msgstr "Facturas" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_make_planned_invoice +msgid "" +"Invoices will be created in draft for this installment\n" +" so that you can review them before validation." +msgstr "" +"Las facturas se crearán en borrador para esta entrega.\n" +" para que pueda revisarlos antes de la validación." + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__last +msgid "Last Installment" +msgstr "Último pago" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan____last_update +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan____last_update +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_make_planned_invoice____last_update +msgid "Last Modified on" +msgstr "Última modificación en" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__write_uid +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__write_uid +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_make_planned_invoice__write_uid +msgid "Last Updated by" +msgstr "Última actualización por" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__write_date +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__write_date +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_make_planned_invoice__write_date +msgid "Last Updated on" +msgstr "Última actualización el" + +#. module: sale_invoice_plan +#: model:ir.model.fields,help:sale_invoice_plan.field_sale_invoice_plan__last +msgid "Last installment will create invoice use remaining amount" +msgstr "La última cuota creará el monto restante del uso de la factura" + +#. module: sale_invoice_plan +#: model:ir.model.fields.selection,name:sale_invoice_plan.selection__sale_create_invoice_plan__interval_type__month +msgid "Month" +msgstr "Mes" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__to_invoice +msgid "Next Invoice" +msgstr "Próxima factura" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__no_edit +msgid "No Edit" +msgstr "" + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/tests/test_sale_invoice_plan.py:0 +#, python-format +msgid "No installment raises following error : %s" +msgstr "" + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/models/sale_invoice_plan.py:0 +#, python-format +msgid "No matched order line for invoice line" +msgstr "" + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/wizard/sale_create_invoice_plan.py:0 +#, python-format +msgid "Number Installment must greater than 1" +msgstr "El número de cuotas debe ser mayor que 1" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__num_installment +msgid "Number of Installment" +msgstr "Número de cuotas" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__percent +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_order__invoice_plan_total_percent +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_tree_readonly +msgid "Percent" +msgstr "Porcentage" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__plan_date +msgid "Plan Date" +msgstr "Fecha del plan" + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/models/sale_invoice_plan.py:0 +#, fuzzy, python-format +msgid "" +"Plan quantity: %(plan_qty)s, exceed invoiceable quantity: " +"%(invoiceable_qty)s\n" +"Product should be delivered before invoice" +msgstr "" +"Cantidad planificada: %(plan_qty)s, excede la cantidad facturable: " +"%(invoiceable_qty)s\n" +"El producto debe entregarse antes de la factura." + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/models/sale.py:0 +#, python-format +msgid "Please fill percentage for all invoice plan lines" +msgstr "Complete el porcentaje para todas las líneas del plan de factura" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +msgid "Quotations" +msgstr "Presupuestos" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_form +msgid "Related Invoices" +msgstr "Facturas relacionadas" + +#. module: sale_invoice_plan +#: model:ir.model,name:sale_invoice_plan.model_sale_advance_payment_inv +msgid "Sales Advance Payment Invoice" +msgstr "Factura de anticipo de ventas" + +#. module: sale_invoice_plan +#: model:ir.actions.act_window,name:sale_invoice_plan.action_sale_invoice_plan +#: model:ir.ui.menu,name:sale_invoice_plan.menu_sale_invoice_plan +msgid "Sales Invoice Plan" +msgstr "Plan de factura de venta" + +#. module: sale_invoice_plan +#: model:ir.model,name:sale_invoice_plan.model_sale_order +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__sale_id +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +msgid "Sales Order" +msgstr "Pedido de venta" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +msgid "Sales Orders" +msgstr "Pedido de ventas" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +msgid "Search Sales Invoice Plan Lines" +msgstr "Buscar líneas de plan de factura de ventas" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__state +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +msgid "Status" +msgstr "Estado" + +#. module: sale_invoice_plan +#: model:ir.model.fields,help:sale_invoice_plan.field_sale_invoice_plan__analytic_account_id +msgid "The analytic account related to a sales order." +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,help:sale_invoice_plan.field_sale_invoice_plan__amount +#, fuzzy +msgid "This amount will be used to calculate the percent" +msgstr "Este porcentaje se utilizará para calcular la nueva cantidad" + +#. module: sale_invoice_plan +#: model:ir.model.fields,help:sale_invoice_plan.field_sale_invoice_plan__percent +msgid "This percent will be used to calculate new quantity" +msgstr "Este porcentaje se utilizará para calcular la nueva cantidad" + +#. module: sale_invoice_plan +#: model_terms:ir.actions.act_window,help:sale_invoice_plan.action_sale_invoice_plan +msgid "This view show all available invoice plan line for reporting purposes" +msgstr "" +"Esta vista muestra todas las líneas del plan de facturas disponibles para " +"fines de informes" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_create_invoice_plan +msgid "This wizard help you quickly create invoice plan." +msgstr "Este asistente le ayuda a crear rápidamente un plan de facturación." + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_order__invoice_plan_total_amount +msgid "Total Amount" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__invoice_type +msgid "Type" +msgstr "Tipo" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_order__use_invoice_plan +msgid "Use Invoice Plan" +msgstr "Usar plan de facturas" + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/models/sale.py:0 +#, python-format +msgid "Use Invoice Plan selected, but no plan created" +msgstr "Usar plan de factura seleccionado, pero no creado ningún plan" + +#. module: sale_invoice_plan +#: model_terms:ir.actions.act_window,help:sale_invoice_plan.action_sale_invoice_plan +msgid "View sales invoice plan lines" +msgstr "Ver líneas del plan de facturas de ventas" + +#. module: sale_invoice_plan +#: model:ir.model,name:sale_invoice_plan.model_sale_make_planned_invoice +msgid "Wizard when create invoice by plan" +msgstr "Asistente al crear factura por plan" + +#. module: sale_invoice_plan +#: model:ir.model.fields.selection,name:sale_invoice_plan.selection__sale_create_invoice_plan__interval_type__year +msgid "Year" +msgstr "Año" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_order_form_invoice_plan +msgid "⇒ Create Invoice Plan" +msgstr "⇒ Crear plan de facturas" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_order_form_invoice_plan +msgid "⇒ Remove Invoice Plan" +msgstr "⇒ Eliminar plan de factura" diff --git a/sale_invoice_plan/i18n/fr.po b/sale_invoice_plan/i18n/fr.po new file mode 100644 index 00000000000..b0ab18494f9 --- /dev/null +++ b/sale_invoice_plan/i18n/fr.po @@ -0,0 +1,458 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_invoice_plan +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-06-21 07:27+0000\n" +"PO-Revision-Date: 2020-02-26 12:13+0000\n" +"Last-Translator: Martronic SA \n" +"Language-Team: none\n" +"Language: fr\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 3.10\n" + +#. module: sale_invoice_plan +#: model:ir.model.fields.selection,name:sale_invoice_plan.selection__sale_invoice_plan__invoice_type__advance +msgid "Advance" +msgstr "Avance" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__advance +msgid "Advance on 1st Invoice" +msgstr "Avance sur la 1ère Facture" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__amount +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_tree +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_tree_readonly +msgid "Amount" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__amount_invoiced +#, fuzzy +msgid "Amount Invoiced" +msgstr "Facture suivante" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__analytic_account_id +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +msgid "Analytic Account" +msgstr "" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_order_form_invoice_plan +msgid "Are you sure to remove this invoice plan?" +msgstr "Êtes-vous certain de vouloir supprimer ce plan de facturation?" + +#. module: sale_invoice_plan +#: model:ir.model.fields,help:sale_invoice_plan.field_sale_order__invoice_plan_process +msgid "At least one invoice plan line pending to create invoice" +msgstr "" +"Au moins une ligne du plan de facturation en attente pour créer la facture" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_create_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_make_planned_invoice +msgid "Cancel" +msgstr "Annuler" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_make_planned_invoice +msgid "Create All Remaining Invoices" +msgstr "Créer toutes les factures restantes" + +#. module: sale_invoice_plan +#: model:ir.actions.act_window,name:sale_invoice_plan.action_sale_create_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_create_invoice_plan +msgid "Create Invoice Plan" +msgstr "Créer le Plan de facturation" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_order_form_invoice_plan +msgid "Create Invoice by Plan" +msgstr "Créer la facture par Plan" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_make_planned_invoice +msgid "Create Next Inovice" +msgstr "Créer la prochaine facture" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__create_uid +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__create_uid +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_make_planned_invoice__create_uid +msgid "Created by" +msgstr "Créé par" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__create_date +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__create_date +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_make_planned_invoice__create_date +msgid "Created on" +msgstr "Créé le" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__partner_id +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +msgid "Customer" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields.selection,name:sale_invoice_plan.selection__sale_create_invoice_plan__interval_type__day +msgid "Day" +msgstr "Jour" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__display_name +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__display_name +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_make_planned_invoice__display_name +msgid "Display Name" +msgstr "Nom affiché" + +#. module: sale_invoice_plan +#: model:ir.model,name:sale_invoice_plan.model_sale_create_invoice_plan +msgid "Fillig invoice planning criteria" +msgstr "Compléter les critères de planification de la facturation" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +msgid "Group By" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__id +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__id +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_make_planned_invoice__id +msgid "ID" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,help:sale_invoice_plan.field_sale_invoice_plan__invoiced +msgid "If this line already invoiced" +msgstr "Si cette ligne a déjà été facturée" + +#. module: sale_invoice_plan +#: model:ir.model.fields,help:sale_invoice_plan.field_sale_invoice_plan__to_invoice +msgid "If this line is ready to create new invoice" +msgstr "Si cette ligne est prête pour créer une nouvelle facture" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_order__invoice_plan_ids +msgid "Inovice Plan" +msgstr "Plan de facturation" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__installment +#: model:ir.model.fields.selection,name:sale_invoice_plan.selection__sale_invoice_plan__invoice_type__installment +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +msgid "Installment" +msgstr "Tranche" + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/models/sale_invoice_plan.py:0 +#, python-format +msgid "" +"Installment %s: already used and not allowed to delete.\n" +"Please discard changes." +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__installment_date +msgid "Installment Date" +msgstr "Date de début" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__interval +msgid "Interval" +msgstr "Intervalle" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__interval_type +msgid "Interval Type" +msgstr "Type d'intervalle" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__invoiced +msgid "Invoice Created" +msgstr "Facture créée" + +#. module: sale_invoice_plan +#: model:ir.actions.act_window,name:sale_invoice_plan.action_view_sale_make_planned_invoice +msgid "Invoice Order" +msgstr "Facturer la commande" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_order_form_invoice_plan +msgid "Invoice Plan" +msgstr "Plan de facturation" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_order__invoice_plan_process +msgid "Invoice Plan In Process" +msgstr "Plan de facturation en cours" + +#. module: sale_invoice_plan +#: model:ir.model,name:sale_invoice_plan.model_sale_invoice_plan +msgid "Invoice Planning Detail" +msgstr "Détail du plan de facturation" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_make_planned_invoice +msgid "Invoice Sales Order" +msgstr "Facturer les commandes" + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/models/sale.py:0 +#, python-format +msgid "Invoice plan total percentage must not exceed 100%" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__invoice_move_ids +msgid "Invoices" +msgstr "Factures" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_make_planned_invoice +msgid "" +"Invoices will be created in draft for this installment\n" +" so that you can review them before validation." +msgstr "" +"Les factures seront crées en brouillon pour cette tranche\n" +" pour que vous puissiez les contrôler avant la " +"validation." + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__last +msgid "Last Installment" +msgstr "Dernière tranche" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan____last_update +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan____last_update +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_make_planned_invoice____last_update +msgid "Last Modified on" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__write_uid +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__write_uid +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_make_planned_invoice__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__write_date +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__write_date +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_make_planned_invoice__write_date +msgid "Last Updated on" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,help:sale_invoice_plan.field_sale_invoice_plan__last +msgid "Last installment will create invoice use remaining amount" +msgstr "" +"La dernière tranche créera une facture en utilisant les montants résiduels" + +#. module: sale_invoice_plan +#: model:ir.model.fields.selection,name:sale_invoice_plan.selection__sale_create_invoice_plan__interval_type__month +msgid "Month" +msgstr "Mois" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__to_invoice +msgid "Next Invoice" +msgstr "Facture suivante" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__no_edit +msgid "No Edit" +msgstr "" + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/tests/test_sale_invoice_plan.py:0 +#, python-format +msgid "No installment raises following error : %s" +msgstr "" + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/models/sale_invoice_plan.py:0 +#, python-format +msgid "No matched order line for invoice line" +msgstr "" + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/wizard/sale_create_invoice_plan.py:0 +#, python-format +msgid "Number Installment must greater than 1" +msgstr "Le nombre de tranches doit être supérieur à 1" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__num_installment +msgid "Number of Installment" +msgstr "Nombre de tranches" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__percent +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_order__invoice_plan_total_percent +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_tree_readonly +msgid "Percent" +msgstr "Pourcent" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__plan_date +msgid "Plan Date" +msgstr "Date planifiée" + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/models/sale_invoice_plan.py:0 +#, fuzzy, python-format +msgid "" +"Plan quantity: %(plan_qty)s, exceed invoiceable quantity: " +"%(invoiceable_qty)s\n" +"Product should be delivered before invoice" +msgstr "" +"La quantité planifiée: %(plan_qty)s, excède la quantité facturable: " +"%(invoiceable_qty)s\n" +"L'article devrait être livré avant d'être facturé" + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/models/sale.py:0 +#, python-format +msgid "Please fill percentage for all invoice plan lines" +msgstr "" +"Veuillez renseigner le pourcentage pour toutes les lignes du plan de " +"facturation" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +msgid "Quotations" +msgstr "" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_form +msgid "Related Invoices" +msgstr "Factures liées" + +#. module: sale_invoice_plan +#: model:ir.model,name:sale_invoice_plan.model_sale_advance_payment_inv +msgid "Sales Advance Payment Invoice" +msgstr "Facture de paiement d'avance" + +#. module: sale_invoice_plan +#: model:ir.actions.act_window,name:sale_invoice_plan.action_sale_invoice_plan +#: model:ir.ui.menu,name:sale_invoice_plan.menu_sale_invoice_plan +#, fuzzy +msgid "Sales Invoice Plan" +msgstr "Utiliser un plan de facturation" + +#. module: sale_invoice_plan +#: model:ir.model,name:sale_invoice_plan.model_sale_order +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__sale_id +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +msgid "Sales Order" +msgstr "Commandes de vente" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +#, fuzzy +msgid "Sales Orders" +msgstr "Commandes de vente" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +#, fuzzy +msgid "Search Sales Invoice Plan Lines" +msgstr "Créer le Plan de facturation" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__state +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +msgid "Status" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,help:sale_invoice_plan.field_sale_invoice_plan__analytic_account_id +msgid "The analytic account related to a sales order." +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,help:sale_invoice_plan.field_sale_invoice_plan__amount +#, fuzzy +msgid "This amount will be used to calculate the percent" +msgstr "Ce pourcentage sera utilisé pour calculer la nouvelle quantité" + +#. module: sale_invoice_plan +#: model:ir.model.fields,help:sale_invoice_plan.field_sale_invoice_plan__percent +msgid "This percent will be used to calculate new quantity" +msgstr "Ce pourcentage sera utilisé pour calculer la nouvelle quantité" + +#. module: sale_invoice_plan +#: model_terms:ir.actions.act_window,help:sale_invoice_plan.action_sale_invoice_plan +msgid "This view show all available invoice plan line for reporting purposes" +msgstr "" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_create_invoice_plan +msgid "This wizard help you quickly create invoice plan." +msgstr "Cet assistant vous aide à créer rapidement le plan de facturation." + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_order__invoice_plan_total_amount +msgid "Total Amount" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__invoice_type +msgid "Type" +msgstr "Type" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_order__use_invoice_plan +msgid "Use Invoice Plan" +msgstr "Utiliser un plan de facturation" + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/models/sale.py:0 +#, python-format +msgid "Use Invoice Plan selected, but no plan created" +msgstr "" +"Utiliser un plan de facturation est sélectionné, mais aucun plan n'est créé" + +#. module: sale_invoice_plan +#: model_terms:ir.actions.act_window,help:sale_invoice_plan.action_sale_invoice_plan +#, fuzzy +msgid "View sales invoice plan lines" +msgstr "" +"Veuillez renseigner le pourcentage pour toutes les lignes du plan de " +"facturation" + +#. module: sale_invoice_plan +#: model:ir.model,name:sale_invoice_plan.model_sale_make_planned_invoice +msgid "Wizard when create invoice by plan" +msgstr "Assistant lors de la création d'une facture par plan" + +#. module: sale_invoice_plan +#: model:ir.model.fields.selection,name:sale_invoice_plan.selection__sale_create_invoice_plan__interval_type__year +msgid "Year" +msgstr "Année" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_order_form_invoice_plan +msgid "⇒ Create Invoice Plan" +msgstr "⇒ Créer le plan de facturation" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_order_form_invoice_plan +msgid "⇒ Remove Invoice Plan" +msgstr "⇒ Supprimer le plan de facturation" + +#~ msgid "Sale Order" +#~ msgstr "Commande de vente" diff --git a/sale_invoice_plan/i18n/nl_NL.po b/sale_invoice_plan/i18n/nl_NL.po new file mode 100644 index 00000000000..f664235a5a0 --- /dev/null +++ b/sale_invoice_plan/i18n/nl_NL.po @@ -0,0 +1,453 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_invoice_plan +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-06-21 07:27+0000\n" +"PO-Revision-Date: 2019-10-07 08:25+0000\n" +"Last-Translator: Cas Vissers \n" +"Language-Team: none\n" +"Language: nl_NL\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 3.8\n" + +#. module: sale_invoice_plan +#: model:ir.model.fields.selection,name:sale_invoice_plan.selection__sale_invoice_plan__invoice_type__advance +msgid "Advance" +msgstr "Vooruit" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__advance +msgid "Advance on 1st Invoice" +msgstr "Vooruitbetaling eerste factuur" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__amount +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_tree +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_tree_readonly +msgid "Amount" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__amount_invoiced +#, fuzzy +msgid "Amount Invoiced" +msgstr "Volgende factuur" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__analytic_account_id +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +msgid "Analytic Account" +msgstr "" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_order_form_invoice_plan +msgid "Are you sure to remove this invoice plan?" +msgstr "Weet je zeker dat je deze facturatie planning wil verwijderen?" + +#. module: sale_invoice_plan +#: model:ir.model.fields,help:sale_invoice_plan.field_sale_order__invoice_plan_process +msgid "At least one invoice plan line pending to create invoice" +msgstr "" +"Ten minste één facturatie plannings regel in behandeling om factuur te maken" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_create_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_make_planned_invoice +msgid "Cancel" +msgstr "Annuleer" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_make_planned_invoice +msgid "Create All Remaining Invoices" +msgstr "Maak alle resterende facturen" + +#. module: sale_invoice_plan +#: model:ir.actions.act_window,name:sale_invoice_plan.action_sale_create_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_create_invoice_plan +msgid "Create Invoice Plan" +msgstr "Maak facturatie planning" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_order_form_invoice_plan +msgid "Create Invoice by Plan" +msgstr "Maak factuur per plan" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_make_planned_invoice +msgid "Create Next Inovice" +msgstr "Maak volgende factuur" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__create_uid +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__create_uid +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_make_planned_invoice__create_uid +msgid "Created by" +msgstr "Aangemaakt door" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__create_date +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__create_date +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_make_planned_invoice__create_date +msgid "Created on" +msgstr "Aangemaakt op" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__partner_id +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +msgid "Customer" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields.selection,name:sale_invoice_plan.selection__sale_create_invoice_plan__interval_type__day +msgid "Day" +msgstr "Dag" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__display_name +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__display_name +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_make_planned_invoice__display_name +msgid "Display Name" +msgstr "Weergavenaam" + +#. module: sale_invoice_plan +#: model:ir.model,name:sale_invoice_plan.model_sale_create_invoice_plan +msgid "Fillig invoice planning criteria" +msgstr "Indienen van facturatie planning criteria" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +msgid "Group By" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__id +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__id +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_make_planned_invoice__id +msgid "ID" +msgstr "ID" + +#. module: sale_invoice_plan +#: model:ir.model.fields,help:sale_invoice_plan.field_sale_invoice_plan__invoiced +msgid "If this line already invoiced" +msgstr "Of deze regel reeds gefactureerd is" + +#. module: sale_invoice_plan +#: model:ir.model.fields,help:sale_invoice_plan.field_sale_invoice_plan__to_invoice +msgid "If this line is ready to create new invoice" +msgstr "Of deze regels klaar is om een factuur te maken" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_order__invoice_plan_ids +msgid "Inovice Plan" +msgstr "Facturatie planning" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__installment +#: model:ir.model.fields.selection,name:sale_invoice_plan.selection__sale_invoice_plan__invoice_type__installment +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +msgid "Installment" +msgstr "Termijn" + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/models/sale_invoice_plan.py:0 +#, python-format +msgid "" +"Installment %s: already used and not allowed to delete.\n" +"Please discard changes." +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__installment_date +msgid "Installment Date" +msgstr "Termijn datum" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__interval +msgid "Interval" +msgstr "Interval" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__interval_type +msgid "Interval Type" +msgstr "Interval type" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__invoiced +msgid "Invoice Created" +msgstr "Factuur gemaakt" + +#. module: sale_invoice_plan +#: model:ir.actions.act_window,name:sale_invoice_plan.action_view_sale_make_planned_invoice +msgid "Invoice Order" +msgstr "Factureer order" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_order_form_invoice_plan +msgid "Invoice Plan" +msgstr "Facturatie planning" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_order__invoice_plan_process +msgid "Invoice Plan In Process" +msgstr "Facturatie planning in behandeling" + +#. module: sale_invoice_plan +#: model:ir.model,name:sale_invoice_plan.model_sale_invoice_plan +msgid "Invoice Planning Detail" +msgstr "Facturatie planning detail" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_make_planned_invoice +msgid "Invoice Sales Order" +msgstr "Factureer verkooporder" + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/models/sale.py:0 +#, python-format +msgid "Invoice plan total percentage must not exceed 100%" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__invoice_move_ids +msgid "Invoices" +msgstr "Facturen" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_make_planned_invoice +msgid "" +"Invoices will be created in draft for this installment\n" +" so that you can review them before validation." +msgstr "" +"Facturen worden in concept aangemaakt voor dit termijn\n" +" zodat deze kunnen worden gecontroleerd voor " +"validatie." + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__last +msgid "Last Installment" +msgstr "Laatste termijn" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan____last_update +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan____last_update +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_make_planned_invoice____last_update +msgid "Last Modified on" +msgstr "Laatst bijgewerkt op" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__write_uid +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__write_uid +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_make_planned_invoice__write_uid +msgid "Last Updated by" +msgstr "Laatst bijgewerkt door" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__write_date +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__write_date +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_make_planned_invoice__write_date +msgid "Last Updated on" +msgstr "Laatste bijgewerkt op" + +#. module: sale_invoice_plan +#: model:ir.model.fields,help:sale_invoice_plan.field_sale_invoice_plan__last +msgid "Last installment will create invoice use remaining amount" +msgstr "Laatste termijn maakt factuur voor resterende hoeveelheid" + +#. module: sale_invoice_plan +#: model:ir.model.fields.selection,name:sale_invoice_plan.selection__sale_create_invoice_plan__interval_type__month +msgid "Month" +msgstr "Maand" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__to_invoice +msgid "Next Invoice" +msgstr "Volgende factuur" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__no_edit +msgid "No Edit" +msgstr "" + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/tests/test_sale_invoice_plan.py:0 +#, python-format +msgid "No installment raises following error : %s" +msgstr "" + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/models/sale_invoice_plan.py:0 +#, python-format +msgid "No matched order line for invoice line" +msgstr "" + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/wizard/sale_create_invoice_plan.py:0 +#, python-format +msgid "Number Installment must greater than 1" +msgstr "Aantal termijnen moet groter zijn dan 1" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__num_installment +msgid "Number of Installment" +msgstr "Aantal termijnen" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__percent +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_order__invoice_plan_total_percent +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_tree_readonly +msgid "Percent" +msgstr "Procent" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__plan_date +msgid "Plan Date" +msgstr "Plan datum" + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/models/sale_invoice_plan.py:0 +#, fuzzy, python-format +msgid "" +"Plan quantity: %(plan_qty)s, exceed invoiceable quantity: " +"%(invoiceable_qty)s\n" +"Product should be delivered before invoice" +msgstr "" +"Plan hoeveel: %(plan_qty)s, is meer dan te factureren hoeveelheid: " +"%(invoiceable_qty)s\n" +"Product moet geleverd worden voor factuur" + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/models/sale.py:0 +#, python-format +msgid "Please fill percentage for all invoice plan lines" +msgstr "Vul een percentage in voor alle facturatie planning regels" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +msgid "Quotations" +msgstr "" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_form +msgid "Related Invoices" +msgstr "Gerelateerde facturen" + +#. module: sale_invoice_plan +#: model:ir.model,name:sale_invoice_plan.model_sale_advance_payment_inv +msgid "Sales Advance Payment Invoice" +msgstr "Verkoop aanbetalingsfactuur" + +#. module: sale_invoice_plan +#: model:ir.actions.act_window,name:sale_invoice_plan.action_sale_invoice_plan +#: model:ir.ui.menu,name:sale_invoice_plan.menu_sale_invoice_plan +#, fuzzy +msgid "Sales Invoice Plan" +msgstr "Gebruik facturatie planning" + +#. module: sale_invoice_plan +#: model:ir.model,name:sale_invoice_plan.model_sale_order +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__sale_id +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +msgid "Sales Order" +msgstr "Verkooporder" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +#, fuzzy +msgid "Sales Orders" +msgstr "Verkooporder" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +#, fuzzy +msgid "Search Sales Invoice Plan Lines" +msgstr "Maak facturatie planning" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__state +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +msgid "Status" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,help:sale_invoice_plan.field_sale_invoice_plan__analytic_account_id +msgid "The analytic account related to a sales order." +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,help:sale_invoice_plan.field_sale_invoice_plan__amount +#, fuzzy +msgid "This amount will be used to calculate the percent" +msgstr "Procent berekend de nieuwe hoeveelheid" + +#. module: sale_invoice_plan +#: model:ir.model.fields,help:sale_invoice_plan.field_sale_invoice_plan__percent +msgid "This percent will be used to calculate new quantity" +msgstr "Procent berekend de nieuwe hoeveelheid" + +#. module: sale_invoice_plan +#: model_terms:ir.actions.act_window,help:sale_invoice_plan.action_sale_invoice_plan +msgid "This view show all available invoice plan line for reporting purposes" +msgstr "" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_create_invoice_plan +msgid "This wizard help you quickly create invoice plan." +msgstr "Deze wizard helpt je om eenvoudig een facturatie planning te maken." + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_order__invoice_plan_total_amount +msgid "Total Amount" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__invoice_type +msgid "Type" +msgstr "Type" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_order__use_invoice_plan +msgid "Use Invoice Plan" +msgstr "Gebruik facturatie planning" + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/models/sale.py:0 +#, python-format +msgid "Use Invoice Plan selected, but no plan created" +msgstr "" +"Gebruik facturatie planning geselecteerd maar geen planning beschikbaar" + +#. module: sale_invoice_plan +#: model_terms:ir.actions.act_window,help:sale_invoice_plan.action_sale_invoice_plan +#, fuzzy +msgid "View sales invoice plan lines" +msgstr "Vul een percentage in voor alle facturatie planning regels" + +#. module: sale_invoice_plan +#: model:ir.model,name:sale_invoice_plan.model_sale_make_planned_invoice +msgid "Wizard when create invoice by plan" +msgstr "Wizard om factureren aan te maken per plan" + +#. module: sale_invoice_plan +#: model:ir.model.fields.selection,name:sale_invoice_plan.selection__sale_create_invoice_plan__interval_type__year +msgid "Year" +msgstr "Jaar" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_order_form_invoice_plan +msgid "⇒ Create Invoice Plan" +msgstr "⇒ Maak facturatie planning" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_order_form_invoice_plan +msgid "⇒ Remove Invoice Plan" +msgstr "⇒ Verwijder facturatie planning" + +#~ msgid "Sale Order" +#~ msgstr "Verkooporder" diff --git a/sale_invoice_plan/i18n/sale_invoice_plan.pot b/sale_invoice_plan/i18n/sale_invoice_plan.pot new file mode 100644 index 00000000000..e1a1d4a1fbf --- /dev/null +++ b/sale_invoice_plan/i18n/sale_invoice_plan.pot @@ -0,0 +1,431 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_invoice_plan +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.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: sale_invoice_plan +#: model:ir.model.fields.selection,name:sale_invoice_plan.selection__sale_invoice_plan__invoice_type__advance +msgid "Advance" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__advance +msgid "Advance on 1st Invoice" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__amount +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_tree +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_tree_readonly +msgid "Amount" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__amount_invoiced +msgid "Amount Invoiced" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__analytic_account_id +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +msgid "Analytic Account" +msgstr "" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_order_form_invoice_plan +msgid "Are you sure to remove this invoice plan?" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,help:sale_invoice_plan.field_sale_order__invoice_plan_process +msgid "At least one invoice plan line pending to create invoice" +msgstr "" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_create_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_make_planned_invoice +msgid "Cancel" +msgstr "" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_make_planned_invoice +msgid "Create All Remaining Invoices" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.actions.act_window,name:sale_invoice_plan.action_sale_create_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_create_invoice_plan +msgid "Create Invoice Plan" +msgstr "" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_order_form_invoice_plan +msgid "Create Invoice by Plan" +msgstr "" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_make_planned_invoice +msgid "Create Next Inovice" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__create_uid +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__create_uid +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_make_planned_invoice__create_uid +msgid "Created by" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__create_date +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__create_date +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_make_planned_invoice__create_date +msgid "Created on" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__partner_id +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +msgid "Customer" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields.selection,name:sale_invoice_plan.selection__sale_create_invoice_plan__interval_type__day +msgid "Day" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__display_name +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__display_name +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_make_planned_invoice__display_name +msgid "Display Name" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model,name:sale_invoice_plan.model_sale_create_invoice_plan +msgid "Fillig invoice planning criteria" +msgstr "" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +msgid "Group By" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__id +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__id +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_make_planned_invoice__id +msgid "ID" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,help:sale_invoice_plan.field_sale_invoice_plan__invoiced +msgid "If this line already invoiced" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,help:sale_invoice_plan.field_sale_invoice_plan__to_invoice +msgid "If this line is ready to create new invoice" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_order__invoice_plan_ids +msgid "Inovice Plan" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__installment +#: model:ir.model.fields.selection,name:sale_invoice_plan.selection__sale_invoice_plan__invoice_type__installment +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +msgid "Installment" +msgstr "" + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/models/sale_invoice_plan.py:0 +#, python-format +msgid "" +"Installment %s: already used and not allowed to delete.\n" +"Please discard changes." +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__installment_date +msgid "Installment Date" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__interval +msgid "Interval" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__interval_type +msgid "Interval Type" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__invoiced +msgid "Invoice Created" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.actions.act_window,name:sale_invoice_plan.action_view_sale_make_planned_invoice +msgid "Invoice Order" +msgstr "" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_order_form_invoice_plan +msgid "Invoice Plan" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_order__invoice_plan_process +msgid "Invoice Plan In Process" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model,name:sale_invoice_plan.model_sale_invoice_plan +msgid "Invoice Planning Detail" +msgstr "" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_make_planned_invoice +msgid "Invoice Sales Order" +msgstr "" + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/models/sale.py:0 +#, python-format +msgid "Invoice plan total percentage must not exceed 100%" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__invoice_move_ids +msgid "Invoices" +msgstr "" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_make_planned_invoice +msgid "" +"Invoices will be created in draft for this installment\n" +" so that you can review them before validation." +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__last +msgid "Last Installment" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan____last_update +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan____last_update +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_make_planned_invoice____last_update +msgid "Last Modified on" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__write_uid +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__write_uid +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_make_planned_invoice__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__write_date +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__write_date +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_make_planned_invoice__write_date +msgid "Last Updated on" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,help:sale_invoice_plan.field_sale_invoice_plan__last +msgid "Last installment will create invoice use remaining amount" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields.selection,name:sale_invoice_plan.selection__sale_create_invoice_plan__interval_type__month +msgid "Month" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__to_invoice +msgid "Next Invoice" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__no_edit +msgid "No Edit" +msgstr "" + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/tests/test_sale_invoice_plan.py:0 +#, python-format +msgid "No installment raises following error : %s" +msgstr "" + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/models/sale_invoice_plan.py:0 +#, python-format +msgid "No matched order line for invoice line" +msgstr "" + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/wizard/sale_create_invoice_plan.py:0 +#, python-format +msgid "Number Installment must greater than 1" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__num_installment +msgid "Number of Installment" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__percent +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_order__invoice_plan_total_percent +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_tree_readonly +msgid "Percent" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__plan_date +msgid "Plan Date" +msgstr "" + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/models/sale_invoice_plan.py:0 +#, python-format +msgid "" +"Plan quantity: %(plan_qty)s, exceed invoiceable quantity: %(invoiceable_qty)s\n" +"Product should be delivered before invoice" +msgstr "" + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/models/sale.py:0 +#, python-format +msgid "Please fill percentage for all invoice plan lines" +msgstr "" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +msgid "Quotations" +msgstr "" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_form +msgid "Related Invoices" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model,name:sale_invoice_plan.model_sale_advance_payment_inv +msgid "Sales Advance Payment Invoice" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.actions.act_window,name:sale_invoice_plan.action_sale_invoice_plan +#: model:ir.ui.menu,name:sale_invoice_plan.menu_sale_invoice_plan +msgid "Sales Invoice Plan" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model,name:sale_invoice_plan.model_sale_order +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__sale_id +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +msgid "Sales Order" +msgstr "" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +msgid "Sales Orders" +msgstr "" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +msgid "Search Sales Invoice Plan Lines" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__state +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +msgid "Status" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,help:sale_invoice_plan.field_sale_invoice_plan__analytic_account_id +msgid "The analytic account related to a sales order." +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,help:sale_invoice_plan.field_sale_invoice_plan__amount +msgid "This amount will be used to calculate the percent" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,help:sale_invoice_plan.field_sale_invoice_plan__percent +msgid "This percent will be used to calculate new quantity" +msgstr "" + +#. module: sale_invoice_plan +#: model_terms:ir.actions.act_window,help:sale_invoice_plan.action_sale_invoice_plan +msgid "This view show all available invoice plan line for reporting purposes" +msgstr "" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_create_invoice_plan +msgid "This wizard help you quickly create invoice plan." +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_order__invoice_plan_total_amount +msgid "Total Amount" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__invoice_type +msgid "Type" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_order__use_invoice_plan +msgid "Use Invoice Plan" +msgstr "" + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/models/sale.py:0 +#, python-format +msgid "Use Invoice Plan selected, but no plan created" +msgstr "" + +#. module: sale_invoice_plan +#: model_terms:ir.actions.act_window,help:sale_invoice_plan.action_sale_invoice_plan +msgid "View sales invoice plan lines" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model,name:sale_invoice_plan.model_sale_make_planned_invoice +msgid "Wizard when create invoice by plan" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields.selection,name:sale_invoice_plan.selection__sale_create_invoice_plan__interval_type__year +msgid "Year" +msgstr "" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_order_form_invoice_plan +msgid "⇒ Create Invoice Plan" +msgstr "" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_order_form_invoice_plan +msgid "⇒ Remove Invoice Plan" +msgstr "" diff --git a/sale_invoice_plan/i18n/zh_CN.po b/sale_invoice_plan/i18n/zh_CN.po new file mode 100644 index 00000000000..6fb0a18ef52 --- /dev/null +++ b/sale_invoice_plan/i18n/zh_CN.po @@ -0,0 +1,449 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_invoice_plan +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-06-21 07:27+0000\n" +"PO-Revision-Date: 2019-09-01 10:10+0000\n" +"Last-Translator: 黎伟杰 <674416404@qq.com>\n" +"Language-Team: none\n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 3.8\n" + +#. module: sale_invoice_plan +#: model:ir.model.fields.selection,name:sale_invoice_plan.selection__sale_invoice_plan__invoice_type__advance +msgid "Advance" +msgstr "预付款" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__advance +msgid "Advance on 1st Invoice" +msgstr "第一张发票预付款" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__amount +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_tree +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_tree_readonly +msgid "Amount" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__amount_invoiced +#, fuzzy +msgid "Amount Invoiced" +msgstr "下一张发票" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__analytic_account_id +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +msgid "Analytic Account" +msgstr "" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_order_form_invoice_plan +msgid "Are you sure to remove this invoice plan?" +msgstr "您确定要删除此发票计划吗?" + +#. module: sale_invoice_plan +#: model:ir.model.fields,help:sale_invoice_plan.field_sale_order__invoice_plan_process +msgid "At least one invoice plan line pending to create invoice" +msgstr "至少有一个待创建发票的发票计划行" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_create_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_make_planned_invoice +msgid "Cancel" +msgstr "取消" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_make_planned_invoice +msgid "Create All Remaining Invoices" +msgstr "创建所有剩余发票" + +#. module: sale_invoice_plan +#: model:ir.actions.act_window,name:sale_invoice_plan.action_sale_create_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_create_invoice_plan +msgid "Create Invoice Plan" +msgstr "创建发票计划" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_order_form_invoice_plan +msgid "Create Invoice by Plan" +msgstr "按计划创建发票" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_make_planned_invoice +msgid "Create Next Inovice" +msgstr "创建下一个发票" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__create_uid +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__create_uid +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_make_planned_invoice__create_uid +msgid "Created by" +msgstr "创建者" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__create_date +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__create_date +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_make_planned_invoice__create_date +msgid "Created on" +msgstr "创建时间" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__partner_id +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +msgid "Customer" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields.selection,name:sale_invoice_plan.selection__sale_create_invoice_plan__interval_type__day +msgid "Day" +msgstr "天" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__display_name +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__display_name +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_make_planned_invoice__display_name +msgid "Display Name" +msgstr "显示名称" + +#. module: sale_invoice_plan +#: model:ir.model,name:sale_invoice_plan.model_sale_create_invoice_plan +msgid "Fillig invoice planning criteria" +msgstr "填写发票计划标准" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +msgid "Group By" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__id +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__id +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_make_planned_invoice__id +msgid "ID" +msgstr "ID" + +#. module: sale_invoice_plan +#: model:ir.model.fields,help:sale_invoice_plan.field_sale_invoice_plan__invoiced +msgid "If this line already invoiced" +msgstr "如果此行已开具发票" + +#. module: sale_invoice_plan +#: model:ir.model.fields,help:sale_invoice_plan.field_sale_invoice_plan__to_invoice +msgid "If this line is ready to create new invoice" +msgstr "如果此行已准备好创建新发票" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_order__invoice_plan_ids +msgid "Inovice Plan" +msgstr "发票计划" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__installment +#: model:ir.model.fields.selection,name:sale_invoice_plan.selection__sale_invoice_plan__invoice_type__installment +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +msgid "Installment" +msgstr "分期付款" + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/models/sale_invoice_plan.py:0 +#, python-format +msgid "" +"Installment %s: already used and not allowed to delete.\n" +"Please discard changes." +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__installment_date +msgid "Installment Date" +msgstr "分期付款日期" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__interval +msgid "Interval" +msgstr "间隔" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__interval_type +msgid "Interval Type" +msgstr "间隔类型" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__invoiced +msgid "Invoice Created" +msgstr "发票已创建" + +#. module: sale_invoice_plan +#: model:ir.actions.act_window,name:sale_invoice_plan.action_view_sale_make_planned_invoice +msgid "Invoice Order" +msgstr "发票订单" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_order_form_invoice_plan +msgid "Invoice Plan" +msgstr "发票计划" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_order__invoice_plan_process +msgid "Invoice Plan In Process" +msgstr "发票计划正在处理中" + +#. module: sale_invoice_plan +#: model:ir.model,name:sale_invoice_plan.model_sale_invoice_plan +msgid "Invoice Planning Detail" +msgstr "发票计划明细" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_make_planned_invoice +msgid "Invoice Sales Order" +msgstr "发票销售订单" + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/models/sale.py:0 +#, python-format +msgid "Invoice plan total percentage must not exceed 100%" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__invoice_move_ids +msgid "Invoices" +msgstr "发票" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_make_planned_invoice +msgid "" +"Invoices will be created in draft for this installment\n" +" so that you can review them before validation." +msgstr "" +"将为此分期付款创建草稿发票\n" +" 这样您就可以在验证之前查看它们。" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__last +msgid "Last Installment" +msgstr "最后一期" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan____last_update +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan____last_update +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_make_planned_invoice____last_update +msgid "Last Modified on" +msgstr "最后修改时间" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__write_uid +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__write_uid +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_make_planned_invoice__write_uid +msgid "Last Updated by" +msgstr "最后更新者" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__write_date +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__write_date +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_make_planned_invoice__write_date +msgid "Last Updated on" +msgstr "最后更新时间" + +#. module: sale_invoice_plan +#: model:ir.model.fields,help:sale_invoice_plan.field_sale_invoice_plan__last +msgid "Last installment will create invoice use remaining amount" +msgstr "最后一期创建发票将使用剩余金额" + +#. module: sale_invoice_plan +#: model:ir.model.fields.selection,name:sale_invoice_plan.selection__sale_create_invoice_plan__interval_type__month +msgid "Month" +msgstr "月" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__to_invoice +msgid "Next Invoice" +msgstr "下一张发票" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__no_edit +msgid "No Edit" +msgstr "" + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/tests/test_sale_invoice_plan.py:0 +#, python-format +msgid "No installment raises following error : %s" +msgstr "" + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/models/sale_invoice_plan.py:0 +#, python-format +msgid "No matched order line for invoice line" +msgstr "" + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/wizard/sale_create_invoice_plan.py:0 +#, python-format +msgid "Number Installment must greater than 1" +msgstr "分期付款必须大于1" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_create_invoice_plan__num_installment +msgid "Number of Installment" +msgstr "分期付款" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__percent +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_order__invoice_plan_total_percent +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_tree_readonly +msgid "Percent" +msgstr "百分比" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__plan_date +msgid "Plan Date" +msgstr "计划日期" + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/models/sale_invoice_plan.py:0 +#, fuzzy, python-format +msgid "" +"Plan quantity: %(plan_qty)s, exceed invoiceable quantity: " +"%(invoiceable_qty)s\n" +"Product should be delivered before invoice" +msgstr "" +"计划数量:%(plan_qty)s,超过可发票数量:%(invoiceable_qty)s\n" +"产品应在发票前交付" + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/models/sale.py:0 +#, python-format +msgid "Please fill percentage for all invoice plan lines" +msgstr "请填写所有发票计划行的百分比" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +msgid "Quotations" +msgstr "" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_form +msgid "Related Invoices" +msgstr "相关发票" + +#. module: sale_invoice_plan +#: model:ir.model,name:sale_invoice_plan.model_sale_advance_payment_inv +msgid "Sales Advance Payment Invoice" +msgstr "销售预付款发票" + +#. module: sale_invoice_plan +#: model:ir.actions.act_window,name:sale_invoice_plan.action_sale_invoice_plan +#: model:ir.ui.menu,name:sale_invoice_plan.menu_sale_invoice_plan +#, fuzzy +msgid "Sales Invoice Plan" +msgstr "使用发票计划" + +#. module: sale_invoice_plan +#: model:ir.model,name:sale_invoice_plan.model_sale_order +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__sale_id +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +msgid "Sales Order" +msgstr "销售订单" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +#, fuzzy +msgid "Sales Orders" +msgstr "销售订单" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +#, fuzzy +msgid "Search Sales Invoice Plan Lines" +msgstr "创建发票计划" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__state +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_invoice_plan_filter +msgid "Status" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,help:sale_invoice_plan.field_sale_invoice_plan__analytic_account_id +msgid "The analytic account related to a sales order." +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,help:sale_invoice_plan.field_sale_invoice_plan__amount +#, fuzzy +msgid "This amount will be used to calculate the percent" +msgstr "该百分比将用于计算新数量" + +#. module: sale_invoice_plan +#: model:ir.model.fields,help:sale_invoice_plan.field_sale_invoice_plan__percent +msgid "This percent will be used to calculate new quantity" +msgstr "该百分比将用于计算新数量" + +#. module: sale_invoice_plan +#: model_terms:ir.actions.act_window,help:sale_invoice_plan.action_sale_invoice_plan +msgid "This view show all available invoice plan line for reporting purposes" +msgstr "" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_sale_create_invoice_plan +msgid "This wizard help you quickly create invoice plan." +msgstr "该向导可帮助您快速创建发票计划。" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_order__invoice_plan_total_amount +msgid "Total Amount" +msgstr "" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_invoice_plan__invoice_type +msgid "Type" +msgstr "类型" + +#. module: sale_invoice_plan +#: model:ir.model.fields,field_description:sale_invoice_plan.field_sale_order__use_invoice_plan +msgid "Use Invoice Plan" +msgstr "使用发票计划" + +#. module: sale_invoice_plan +#: code:addons/sale_invoice_plan/models/sale.py:0 +#, python-format +msgid "Use Invoice Plan selected, but no plan created" +msgstr "选中“使用发票计划”,但未创建任何计划" + +#. module: sale_invoice_plan +#: model_terms:ir.actions.act_window,help:sale_invoice_plan.action_sale_invoice_plan +#, fuzzy +msgid "View sales invoice plan lines" +msgstr "请填写所有发票计划行的百分比" + +#. module: sale_invoice_plan +#: model:ir.model,name:sale_invoice_plan.model_sale_make_planned_invoice +msgid "Wizard when create invoice by plan" +msgstr "按计划创建发票时的向导" + +#. module: sale_invoice_plan +#: model:ir.model.fields.selection,name:sale_invoice_plan.selection__sale_create_invoice_plan__interval_type__year +msgid "Year" +msgstr "年" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_order_form_invoice_plan +msgid "⇒ Create Invoice Plan" +msgstr "⇒ 创建发票计划" + +#. module: sale_invoice_plan +#: model_terms:ir.ui.view,arch_db:sale_invoice_plan.view_order_form_invoice_plan +msgid "⇒ Remove Invoice Plan" +msgstr "⇒ 删除发票计划" + +#~ msgid "Sale Order" +#~ msgstr "销售订单" diff --git a/sale_invoice_plan/models/__init__.py b/sale_invoice_plan/models/__init__.py new file mode 100644 index 00000000000..669fdb833cb --- /dev/null +++ b/sale_invoice_plan/models/__init__.py @@ -0,0 +1,4 @@ +# Copyright 2019 Ecosoft Co., Ltd (http://ecosoft.co.th/) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html) +from . import sale +from . import sale_invoice_plan diff --git a/sale_invoice_plan/models/sale.py b/sale_invoice_plan/models/sale.py new file mode 100644 index 00000000000..549de96851c --- /dev/null +++ b/sale_invoice_plan/models/sale.py @@ -0,0 +1,147 @@ +# Copyright 2019 Ecosoft Co., Ltd (http://ecosoft.co.th/) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html) +from dateutil.relativedelta import relativedelta + +from odoo import _, api, fields, models +from odoo.exceptions import UserError, ValidationError +from odoo.tools.float_utils import float_round + + +class SaleOrder(models.Model): + _inherit = "sale.order" + + invoice_plan_ids = fields.One2many( + comodel_name="sale.invoice.plan", + inverse_name="sale_id", + string="Inovice Plan", + copy=False, + ) + use_invoice_plan = fields.Boolean( + default=False, + copy=False, + ) + invoice_plan_process = fields.Boolean( + string="Invoice Plan In Process", + compute="_compute_invoice_plan_process", + help="At least one invoice plan line pending to create invoice", + ) + invoice_plan_total_percent = fields.Float( + compute="_compute_invoice_plan_total", + string="Percent", + ) + invoice_plan_total_amount = fields.Monetary( + compute="_compute_invoice_plan_total", + string="Total Amount", + ) + + @api.depends("invoice_plan_ids") + def _compute_invoice_plan_total(self): + for rec in self: + installments = rec.invoice_plan_ids.filtered("installment") + rec.invoice_plan_total_percent = sum(installments.mapped("percent")) + rec.invoice_plan_total_amount = sum(installments.mapped("amount")) + + def _compute_invoice_plan_process(self): + for rec in self: + has_invoice_plan = rec.use_invoice_plan and rec.invoice_plan_ids + to_invoice = rec.invoice_plan_ids.filtered(lambda l: not l.invoiced) + rec.invoice_plan_process = ( + rec.state == "sale" + and has_invoice_plan + and to_invoice + and rec.invoice_status in ["to invoice", "no"] + and "advance" in to_invoice.mapped("invoice_type") + ) + + @api.constrains("invoice_plan_ids") + def _check_invoice_plan_total_percent(self): + for rec in self: + installments = rec.invoice_plan_ids.filtered("installment") + invoice_plan_total_percent = sum(installments.mapped("percent")) + if float_round(invoice_plan_total_percent, 0) > 100: + raise UserError(_("Invoice plan total percentage must not exceed 100%")) + + @api.constrains("state") + def _check_invoice_plan(self): + for rec in self: + if rec.state != "draft": + if rec.invoice_plan_ids.filtered(lambda l: not l.percent): + raise ValidationError( + _("Please fill percentage for all invoice plan lines") + ) + + def action_confirm(self): + if self.filtered(lambda r: r.use_invoice_plan and not r.invoice_plan_ids): + raise UserError(_("Use Invoice Plan selected, but no plan created")) + return super().action_confirm() + + def create_invoice_plan( + self, num_installment, installment_date, interval, interval_type, advance + ): + self.ensure_one() + self.invoice_plan_ids.unlink() + invoice_plans = [] + Decimal = self.env["decimal.precision"] + prec = Decimal.precision_get("Sales Invoice Plan Percent") + percent = float_round(1.0 / num_installment * 100, prec) + percent_last = 100 - (percent * (num_installment - 1)) + # Advance + if advance: + vals = { + "installment": 0, + "plan_date": installment_date, + "invoice_type": "advance", + "percent": 0.0, + } + invoice_plans.append((0, 0, vals)) + installment_date = self._next_date( + installment_date, interval, interval_type + ) + # Normal + for i in range(num_installment): + this_installment = i + 1 + if num_installment == this_installment: + percent = percent_last + vals = { + "installment": this_installment, + "plan_date": installment_date, + "invoice_type": "installment", + "percent": percent, + } + invoice_plans.append((0, 0, vals)) + installment_date = self._next_date( + installment_date, interval, interval_type + ) + self.write({"invoice_plan_ids": invoice_plans}) + return True + + def remove_invoice_plan(self): + self.ensure_one() + self.invoice_plan_ids.unlink() + return True + + @api.model + def _next_date(self, installment_date, interval, interval_type): + installment_date = fields.Date.from_string(installment_date) + if interval_type == "month": + next_date = installment_date + relativedelta(months=+interval) + elif interval_type == "year": + next_date = installment_date + relativedelta(years=+interval) + else: + next_date = installment_date + relativedelta(days=+interval) + next_date = fields.Date.to_string(next_date) + return next_date + + def _create_invoices(self, grouped=False, final=False, date=None): + moves = super()._create_invoices(grouped=grouped, final=final, date=date) + for sale in self.filtered(lambda s: s.use_invoice_plan): + next_installment = sale.invoice_plan_ids.filtered( + lambda x: x.to_invoice and x.invoice_type == "installment" + )[:1] + if next_installment: + sale_moves = moves & sale.invoice_ids + for move in sale_moves: + next_installment._compute_new_invoice_quantity(move) + move.invoice_date = next_installment.plan_date + move._compute_date() + return moves diff --git a/sale_invoice_plan/models/sale_invoice_plan.py b/sale_invoice_plan/models/sale_invoice_plan.py new file mode 100644 index 00000000000..ad8ce54e68d --- /dev/null +++ b/sale_invoice_plan/models/sale_invoice_plan.py @@ -0,0 +1,207 @@ +from odoo import _, api, fields, models +from odoo.exceptions import UserError, ValidationError +from odoo.tools.float_utils import float_compare, float_round + + +class SaleInvoicePlan(models.Model): + _name = "sale.invoice.plan" + _description = "Invoice Planning Detail" + _order = "installment" + + sale_id = fields.Many2one( + comodel_name="sale.order", + string="Sales Order", + index=True, + readonly=True, + ondelete="cascade", + ) + analytic_account_id = fields.Many2one(related="sale_id.analytic_account_id") + partner_id = fields.Many2one( + comodel_name="res.partner", + string="Customer", + related="sale_id.partner_id", + store=True, + index=True, + ) + state = fields.Selection( + string="Status", + related="sale_id.state", + store=True, + index=True, + ) + installment = fields.Integer() + plan_date = fields.Date(required=True) + invoice_type = fields.Selection( + [("advance", "Advance"), ("installment", "Installment")], + string="Type", + required=True, + default="installment", + ) + last = fields.Boolean( + string="Last Installment", + compute="_compute_last", + help="Last installment will create invoice use remaining amount", + ) + percent = fields.Float( + digits="Sales Invoice Plan Percent", + help="This percent will be used to calculate new quantity", + ) + amount = fields.Float( + digits="Product Price", + compute="_compute_amount", + inverse="_inverse_amount", + help="This amount will be used to calculate the percent", + ) + invoice_move_ids = fields.Many2many( + "account.move", + relation="sale_invoice_plan_invoice_rel", + column1="plan_id", + column2="move_id", + string="Invoices", + readonly=True, + ) + amount_invoiced = fields.Float(compute="_compute_invoiced") + to_invoice = fields.Boolean( + string="Next Invoice", + compute="_compute_to_invoice", + help="If this line is ready to create new invoice", + ) + invoiced = fields.Boolean( + string="Invoice Created", + compute="_compute_invoiced", + help="If this line already invoiced", + ) + no_edit = fields.Boolean( + compute="_compute_no_edit", + ) + + _sql_constraint = [ + ( + "unique_instalment", + "UNIQUE (sale_id, installment)", + "Installment must be unique on invoice plan", + ) + ] + + def _no_edit(self): + self.ensure_one() + return self.invoiced + + def _compute_no_edit(self): + for rec in self: + rec.no_edit = rec._no_edit() + + @api.depends("percent") + def _compute_amount(self): + for rec in self: + # With invoice already created, no recompute + if rec.invoiced: + rec.amount = rec.amount_invoiced + if rec.sale_id.amount_untaxed: + rec.percent = rec.amount / rec.sale_id.amount_untaxed * 100 + else: + rec.percent = 0 + continue + # For last line, amount is the left over + if rec.last: + installments = rec.sale_id.invoice_plan_ids.filtered( + lambda l: l.invoice_type == "installment" + ) + prev_amount = sum((installments - rec).mapped("amount")) + rec.amount = rec.sale_id.amount_untaxed - prev_amount + continue + rec.amount = rec.percent * rec.sale_id.amount_untaxed / 100 + + @api.onchange("amount", "percent") + def _inverse_amount(self): + for rec in self: + if rec.sale_id.amount_untaxed != 0: + if rec.last: + installments = rec.sale_id.invoice_plan_ids.filtered( + lambda l: l.invoice_type == "installment" + ) + prev_percent = sum((installments - rec).mapped("percent")) + rec.percent = 100 - prev_percent + continue + rec.percent = rec.amount / rec.sale_id.amount_untaxed * 100 + continue + rec.percent = 0 + + def _compute_to_invoice(self): + """If any invoice is in draft/open/paid do not allow to create inv. + Only if previous to_invoice is False, it is eligible to_invoice. + """ + for rec in self: + rec.to_invoice = False + for rec in self.sorted("installment"): + if rec.state != "sale": # Not confirmed, no to_invoice + continue + if not rec.invoiced: + rec.to_invoice = True + break + + def _compute_invoiced(self): + for rec in self: + invoiced = rec.invoice_move_ids.filtered( + lambda l: l.state in ("draft", "posted") + ) + rec.invoiced = invoiced and True or False + rec.amount_invoiced = invoiced[:1].amount_untaxed + + def _compute_last(self): + for rec in self: + last = max(rec.sale_id.invoice_plan_ids.mapped("installment")) + rec.last = rec.installment == last + + def _compute_new_invoice_quantity(self, invoice_move): + for plan in self: + if plan.last: # For last install, let the system do the calc. + return + move = invoice_move.with_context(check_move_validity=False) + for line in move.invoice_line_ids: + plan._update_new_quantity(line, plan.percent) + move.line_ids.filtered( + lambda x: x.display_type + not in ("product", "line_section", "line_note", "payment_term", "tax") + ).unlink() + + def _update_new_quantity(self, line, percent): + """Hook function""" + if not len(line.sale_line_ids) >= 0: + raise UserError(_("No matched order line for invoice line")) + order_line = fields.first(line.sale_line_ids) + if order_line.is_downpayment: # based on 1 unit + line.write({"quantity": -percent / 100}) + else: + plan_qty = self._get_plan_qty(order_line, percent) + prec = order_line.product_uom.rounding + if plan_qty: + plan_qty = float_round(plan_qty, precision_rounding=prec) + if float_compare(abs(plan_qty), abs(line.quantity), prec) == 1: + raise ValidationError( + _( + "Plan quantity: %(plan_qty)s, exceed invoiceable quantity: " + "%(invoiceable_qty)s" + "\nProduct should be delivered before invoice" + ) + % {"plan_qty": plan_qty, "invoiceable_qty": line.quantity} + ) + line.write({"quantity": plan_qty}) + + @api.model + def _get_plan_qty(self, order_line, percent): + plan_qty = order_line.product_uom_qty * (percent / 100) + return plan_qty + + def unlink(self): + lines = self.filtered("no_edit") + if lines: + installments = [str(x) for x in lines.mapped("installment")] + raise UserError( + _( + "Installment %s: already used and not allowed to delete.\n" + "Please discard changes." + ) + % ", ".join(installments) + ) + return super().unlink() diff --git a/sale_invoice_plan/readme/CONTRIBUTORS.rst b/sale_invoice_plan/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000000..3f0daa99b0d --- /dev/null +++ b/sale_invoice_plan/readme/CONTRIBUTORS.rst @@ -0,0 +1,4 @@ +* Kitti Upariphutthiphong. (http://ecosoft.co.th) +* `Trobz `_: + + * Son Ho diff --git a/sale_invoice_plan/readme/CREDITS.rst b/sale_invoice_plan/readme/CREDITS.rst new file mode 100644 index 00000000000..f37ebe75704 --- /dev/null +++ b/sale_invoice_plan/readme/CREDITS.rst @@ -0,0 +1 @@ +The migration of this module from 13.0 to 14.0 was financially supported by Camptocamp diff --git a/sale_invoice_plan/readme/DESCRIPTION.rst b/sale_invoice_plan/readme/DESCRIPTION.rst new file mode 100644 index 00000000000..33f595911ca --- /dev/null +++ b/sale_invoice_plan/readme/DESCRIPTION.rst @@ -0,0 +1,4 @@ +By standard feature, user can gradually create partial invoices, one by one. +This module add ability to create invoices based on the predefined invoice plan, +either all at once, or one by one. +The plan support both advance invoice and installment invoices. diff --git a/sale_invoice_plan/readme/HISTORY.rst b/sale_invoice_plan/readme/HISTORY.rst new file mode 100644 index 00000000000..e2d4a7d827b --- /dev/null +++ b/sale_invoice_plan/readme/HISTORY.rst @@ -0,0 +1,11 @@ +15.0.1.1.0 (2022-05-10) +~~~~~~~~~~~~~~~~~~~~~~~ + +* remove dependency on stock + + + +12.0.1.0.0 (2019-03-08) +~~~~~~~~~~~~~~~~~~~~~~~ + +* Start of the history diff --git a/sale_invoice_plan/readme/INSTALL.rst b/sale_invoice_plan/readme/INSTALL.rst new file mode 100644 index 00000000000..383938252c5 --- /dev/null +++ b/sale_invoice_plan/readme/INSTALL.rst @@ -0,0 +1 @@ +Just install this module, and the sales order will have new option "Use Invoice Plan" diff --git a/sale_invoice_plan/readme/USAGE.rst b/sale_invoice_plan/readme/USAGE.rst new file mode 100644 index 00000000000..3b303db1ed7 --- /dev/null +++ b/sale_invoice_plan/readme/USAGE.rst @@ -0,0 +1,7 @@ +- Create new sales quotation as per normal process +- Select option "Use Invoice Plan", a new Invoice Plan tab will appear +- Click on "=> Create Invoice Plan" link to open invoice planning wizard +- Do plan for number of installment and/or advance, start date and interval +- Double check that each advance/installment has correct plan percentage +- After confirm sales order, now we have new option to "Create Invoice by Plan" +- User can create only next invoice, or create all the rest invoices at the same time diff --git a/sale_invoice_plan/security/ir.model.access.csv b/sale_invoice_plan/security/ir.model.access.csv new file mode 100644 index 00000000000..edfe43de0f1 --- /dev/null +++ b/sale_invoice_plan/security/ir.model.access.csv @@ -0,0 +1,4 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_sale_invoice_plan,access_sale_invoice_plan,model_sale_invoice_plan,,1,1,1,1 +access_sale_create_invoice_plan,access_sale_create_invoice_plan,model_sale_create_invoice_plan,,1,1,1,1 +access_sale_make_planned_invoice,access_sale_make_planned_invoice,model_sale_make_planned_invoice,,1,1,1,1 diff --git a/sale_invoice_plan/static/description/icon.png b/sale_invoice_plan/static/description/icon.png new file mode 100644 index 00000000000..3a0328b516c Binary files /dev/null and b/sale_invoice_plan/static/description/icon.png differ diff --git a/sale_invoice_plan/static/description/index.html b/sale_invoice_plan/static/description/index.html new file mode 100644 index 00000000000..31b88c87959 --- /dev/null +++ b/sale_invoice_plan/static/description/index.html @@ -0,0 +1,483 @@ + + + + + + +Sales Invoice Plan + + + +
+

Sales Invoice Plan

+ + +

Alpha License: AGPL-3 OCA/sale-workflow Translate me on Weblate Try me on Runboat

+

By standard feature, user can gradually create partial invoices, one by one. +This module add ability to create invoices based on the predefined invoice plan, +either all at once, or one by one. +The plan support both advance invoice and installment invoices.

+
+

Important

+

This is an alpha version, the data model and design can change at any time without warning. +Only for development or testing purpose, do not use in production. +More details on development status

+
+

Table of contents

+ +
+

Installation

+

Just install this module, and the sales order will have new option “Use Invoice Plan”

+
+
+

Usage

+
    +
  • Create new sales quotation as per normal process
  • +
  • Select option “Use Invoice Plan”, a new Invoice Plan tab will appear
  • +
  • Click on “=> Create Invoice Plan” link to open invoice planning wizard
  • +
  • Do plan for number of installment and/or advance, start date and interval
  • +
  • Double check that each advance/installment has correct plan percentage
  • +
  • After confirm sales order, now we have new option to “Create Invoice by Plan”
  • +
  • User can create only next invoice, or create all the rest invoices at the same time
  • +
+
+
+

Changelog

+
+

15.0.1.1.0 (2022-05-10)

+
    +
  • remove dependency on stock
  • +
+
+
+

12.0.1.0.0 (2019-03-08)

+
    +
  • Start of the history
  • +
+
+
+
+

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

+
    +
  • Ecosoft
  • +
+
+
+

Contributors

+ +
+
+

Other credits

+

The migration of this module from 13.0 to 14.0 was financially supported by Camptocamp

+
+
+

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 maintainer:

+

kittiu

+

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

+

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

+
+
+
+ + diff --git a/sale_invoice_plan/tests/__init__.py b/sale_invoice_plan/tests/__init__.py new file mode 100644 index 00000000000..46cc85b7c20 --- /dev/null +++ b/sale_invoice_plan/tests/__init__.py @@ -0,0 +1,3 @@ +# Copyright 2019 Ecosoft Co., Ltd (http://ecosoft.co.th/) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) +from . import test_sale_invoice_plan diff --git a/sale_invoice_plan/tests/test_sale_invoice_plan.py b/sale_invoice_plan/tests/test_sale_invoice_plan.py new file mode 100644 index 00000000000..fe2a7ae8b92 --- /dev/null +++ b/sale_invoice_plan/tests/test_sale_invoice_plan.py @@ -0,0 +1,315 @@ +# Copyright 2019 Ecosoft Co., Ltd (http://ecosoft.co.th/) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) +import logging + +from odoo import _, fields +from odoo.exceptions import UserError, ValidationError +from odoo.tests import Form, tagged + +from odoo.addons.sale.tests import common + +_logger = logging.getLogger(__name__) + + +@tagged("post_install", "-at_install") +class TestSaleInvoicePlan(common.TestSaleCommon): + @classmethod + def setUpClass(cls): + super(TestSaleInvoicePlan, cls).setUpClass() + context_no_mail = { + "no_reset_password": True, + "mail_create_nosubscribe": True, + "mail_create_nolog": True, + } + + # Create base account to simulate a chart of account + cls.account_payable = cls.env["account.account"].create( + { + "code": "NC1110", + "name": "Test Payable Account", + "account_type": "liability_payable", + "reconcile": True, + } + ) + cls.account_receivable = cls.env["account.account"].create( + { + "code": "NC1111", + "name": "Test Receivable Account", + "account_type": "asset_receivable", + "reconcile": True, + } + ) + + Partner = cls.env["res.partner"].with_context(**context_no_mail) + cls.partner_customer_usd = Partner.create( + { + "name": "Customer from the North", + "email": "customer.usd@north.com", + "property_account_payable_id": cls.account_payable.id, + "property_account_receivable_id": cls.account_receivable.id, + } + ) + + cls.sale_journal0 = cls.env["account.journal"].create( + { + "name": "Sale Journal", + "type": "sale", + "code": "SJT0", + } + ) + + cls.setUpClassicProducts() + + sale_obj = cls.env["sale.order"] + # Create an SO for Service + cls.so_service = sale_obj.with_user( + cls.company_data["default_user_salesman"] + ).create( + { + "partner_id": cls.partner_customer_usd.id, + "partner_invoice_id": cls.partner_customer_usd.id, + "partner_shipping_id": cls.partner_customer_usd.id, + "use_invoice_plan": True, + "order_line": [ + ( + 0, + 0, + { + "name": cls.product_order.name, + "product_id": cls.product_order.id, + "product_uom_qty": 1.0, + "product_uom": cls.product_order.uom_id.id, + "price_unit": cls.product_order.list_price, + }, + ) + ], + "pricelist_id": cls.env.ref("product.list0").id, + } + ) + + @classmethod + def setUpClassicProducts(cls): + # Create an expense journal + cls.account_income_product = cls.env["account.account"].create( + { + "code": "INCOMEPROD111", + "name": "Icome - Test Account", + "account_type": "income", + } + ) + # Create category + cls.product_category = cls.env["product.category"].create( + { + "name": "Product Category with Income account", + "property_account_income_categ_id": cls.account_income_product.id, + } + ) + # Products + uom_unit = cls.env.ref("uom.product_uom_unit") + cls.product_order = cls.env["product.product"].create( + { + "name": "Zed+ Antivirus", + "standard_price": 235.0, + "list_price": 280.0, + "type": "consu", + "uom_id": uom_unit.id, + "uom_po_id": uom_unit.id, + "invoice_policy": "order", + "expense_policy": "no", + "default_code": "PROD_ORDER", + "service_type": "manual", + "taxes_id": False, + "categ_id": cls.product_category.id, + } + ) + + def test_00_invoice_plan(self): + # To create next invoice from SO + ctx = { + "active_id": self.so_service.id, + "active_ids": [self.so_service.id], + "all_remain_invoices": False, + } + f = Form(self.env["sale.create.invoice.plan"]) + try: # UserError if no installment + plan = f.save() + except ValidationError as e: + _logger.info(_("No installment raises following error : %s"), e.args[0]) + # Create Invoice Plan 3 installment + num_installment = 5 + f.num_installment = num_installment + # Test 3 types of interval + for interval_type in ["month", "year", "day"]: + f.interval_type = interval_type + plan = f.save() + # SO confirmed without invoice plan being created + if not self.so_service.invoice_plan_ids: + with self.assertRaises(UserError): + self.so_service.action_confirm() + # Create Invocie Plan Installment + plan.with_context(**ctx).sale_create_invoice_plan() + self.assertEqual( + len(self.so_service.invoice_plan_ids), + num_installment, + "Wrong number of installment created", + ) + # Change plan, so that the 1st installment is 1000 and 5th is 3000 + self.assertEqual(len(self.so_service.invoice_plan_ids), 5) + self.so_service.invoice_plan_ids[0].amount = 280.0 + self.so_service.invoice_plan_ids[4].amount = 840.0 + # Confirm the SO + self.so_service.action_confirm() + # Create one invoice + make_wizard = self.env["sale.make.planned.invoice"].create({}) + make_wizard.with_context(**ctx).create_invoices_by_plan() + self.assertEqual( + self.so_service.amount_total, + sum(self.so_service.invoice_ids.mapped("amount_total")), + ) + invoices = self.so_service.invoice_ids + self.assertEqual(len(invoices), 1, "Only 1 invoice should be created") + + def test_01_invoice_plan(self): + # To create all remaining invoice from SO + ctx = { + "active_id": self.so_service.id, + "active_ids": [self.so_service.id], + "advance_payment_method": "delivered", + "all_remain_invoices": True, + } + f = Form(self.env["sale.create.invoice.plan"]) + # Create Invoice Plan 3 installment + num_installment = 3 + # Test 3 types of interval + for interval_type in ["month", "year", "day"]: + f.interval_type = interval_type + f.num_installment = num_installment + plan = f.save() + plan.with_context(**ctx).sale_create_invoice_plan() + # Confirm the SO + self.so_service.action_confirm() + # Create all invoices + make_wizard = self.env["sale.make.planned.invoice"].create({}) + make_wizard.with_context(**ctx).create_invoices_by_plan() + # Valid number of invoices + invoices = self.so_service.invoice_ids + self.assertEqual( + len(invoices), num_installment, "Wrong number of invoice created" + ) + # Valid total quantity of invoices + quantity = round(sum(invoices.mapped("invoice_line_ids").mapped("quantity"))) + self.assertEqual(quantity, 1, "Wrong number of total invoice quantity") + + def test_02_invoice_plan_with_advance(self): + # To create all remaining invoice from SO + ctx = { + "active_id": self.so_service.id, + "active_ids": [self.so_service.id], + "all_remain_invoices": True, + } + # Create Invoice Plan 3 installment with Advance + num_installment = 3 + f = Form(self.env["sale.create.invoice.plan"]) + f.num_installment = num_installment + f.advance = True # Advance + plan = f.save() + plan.with_context(**ctx).sale_create_invoice_plan() + self.assertEqual( + len(self.so_service.invoice_plan_ids), + num_installment + 1, + "Wrong number of installment created", + ) + # If advance percent is not filled, show error + with self.assertRaises(ValidationError): + self.so_service.action_confirm() + advance_line = self.so_service.invoice_plan_ids.filtered( + lambda l: l.invoice_type == "advance" + ) + self.assertEqual(len(advance_line), 1, "No one advance line") + # Add 10% to advance + advance_line.percent = 10 + # Can confirm the SO after advance is filled + self.so_service.action_confirm() + # Create all invoice plan + wizard = self.env["sale.make.planned.invoice"].create({}) + wizard.with_context(**ctx).create_invoices_by_plan() + # Valid number of invoices, including advance + invoices = self.so_service.invoice_ids + self.assertEqual( + len(invoices), num_installment + 1, "Wrong number of invoice created" + ) + # Valid total quantity of invoices (exclude Advance line) + quantity = round( + sum( + invoices.mapped("invoice_line_ids") + .filtered(lambda l: l.product_id == self.product_order) + .mapped("quantity") + ), + 2, + ) + self.assertEqual(quantity, 0.30, "Wrong number of total invoice quantity") + + def test_03_unlink_invoice_plan(self): + ctx = {"active_id": self.so_service.id, "active_ids": [self.so_service.id]} + f = Form(self.env["sale.create.invoice.plan"]) + # Create Invoice Plan 3 installment + num_installment = 3 + f.num_installment = num_installment + plan = f.save() + plan.with_context(**ctx).sale_create_invoice_plan() + # Remove it + self.so_service.remove_invoice_plan() + self.assertFalse(self.so_service.invoice_plan_ids) + + def test_invoice_plan_so_edit(self): + """Case when some installment already invoiced, + but then, the SO line added. Test to ensure that + the invoiced amount of the done installment is fixed""" + ctx = { + "active_id": self.so_service.id, + "active_ids": [self.so_service.id], + "all_remain_invoices": False, + } + first_order_line = fields.first(self.so_service.order_line) + first_order_line.product_uom_qty = 10 + f = Form(self.env["sale.create.invoice.plan"]) + # Create Invoice Plan 5 installment + num_installment = 5 + f.num_installment = num_installment + plan = f.save() + plan.with_context(**ctx).sale_create_invoice_plan() + # Change plan, so that the 1st installment is 280 and 5th is 840 + self.assertEqual(len(self.so_service.invoice_plan_ids), 5) + first_install = self.so_service.invoice_plan_ids[0] + first_install.amount = 280.0 + self.so_service.invoice_plan_ids[4].amount = 840.0 + self.so_service.action_confirm() + self.assertEqual(self.so_service.state, "sale") + sale_create = self.env["sale.make.planned.invoice"].create({}) + # Create only the 1st invoice, amount should be 280, and percent is 10 + sale_create.with_context(**ctx).create_invoices_by_plan() + self.assertEqual(first_install.amount, 280.0) + self.assertEqual(first_install.percent, 10) + # Add new SO line with amount = 280, check that only percent is changed + self.so_service.write( + { + "order_line": [ + ( + 0, + 0, + { + "name": "SO-Product-NEW", + "product_id": self.product_order.id, + "product_uom_qty": 1, + "product_uom": self.product_order.uom_id.id, + "price_unit": 280.0, + }, + ) + ], + } + ) + # Overall amount changed to 3080, install amount not changed, only percent changed. + self.assertEqual(self.so_service.amount_total, 3080.0) + self.so_service.invoice_plan_ids._compute_amount() + self.assertEqual(first_install.amount, 308.0) + self.assertEqual(first_install.percent, 10.0) diff --git a/sale_invoice_plan/views/sale_view.xml b/sale_invoice_plan/views/sale_view.xml new file mode 100644 index 00000000000..b7413115fec --- /dev/null +++ b/sale_invoice_plan/views/sale_view.xml @@ -0,0 +1,240 @@ + + + view.sale.invoice.plan.tree + sale.invoice.plan + + + + + + + + + + + + + + + + + + + view.sale.invoice.plan.form + sale.invoice.plan + +
+ + + + + + + + + + + + + + + + + + +
+ + view.order.form.invoice.plan + sale.order + + + +
+ +
+
+ + +