Initial commit: OCA Workflow Process packages (456 packages)

This commit is contained in:
Ernad Husremovic 2025-08-29 15:43:00 +02:00
commit d366e42934
18799 changed files with 1284507 additions and 0 deletions

View file

@ -0,0 +1,47 @@
# Purchase Invoice Plan
Odoo addon: purchase_invoice_plan
## Installation
```bash
pip install odoo-bringout-oca-purchase-workflow-purchase_invoice_plan
```
## Dependencies
This addon depends on:
- purchase_open_qty
- purchase_stock
## Manifest Information
- **Name**: Purchase Invoice Plan
- **Version**: 16.0.1.0.0
- **Category**: Purchase
- **License**: AGPL-3
- **Installable**: True
## Source
Based on [OCA/purchase-workflow](https://github.com/OCA/purchase-workflow) branch 16.0, addon `purchase_invoice_plan`.
## License
This package maintains the original AGPL-3 license from the upstream Odoo project.
## Documentation
- Overview: doc/OVERVIEW.md
- Architecture: doc/ARCHITECTURE.md
- Models: doc/MODELS.md
- Controllers: doc/CONTROLLERS.md
- Wizards: doc/WIZARDS.md
- Reports: doc/REPORTS.md
- Security: doc/SECURITY.md
- Install: doc/INSTALL.md
- Usage: doc/USAGE.md
- Configuration: doc/CONFIGURATION.md
- Dependencies: doc/DEPENDENCIES.md
- Troubleshooting: doc/TROUBLESHOOTING.md
- FAQ: doc/FAQ.md

View file

@ -0,0 +1,32 @@
# Architecture
```mermaid
flowchart TD
U[Users] -->|HTTP| V[Views and QWeb Templates]
V --> C[Controllers]
V --> W[Wizards Transient Models]
C --> M[Models and ORM]
W --> M
M --> R[Reports]
DX[Data XML] --> M
S[Security ACLs and Groups] -. enforces .-> M
subgraph Purchase_invoice_plan Module - purchase_invoice_plan
direction LR
M:::layer
W:::layer
C:::layer
V:::layer
R:::layer
S:::layer
DX:::layer
end
classDef layer fill:#eef8ff,stroke:#6ea8fe,stroke-width:1px
```
Notes
- Views include tree/form/kanban templates and report templates.
- Controllers provide website/portal routes when present.
- Wizards are UI flows implemented with `models.TransientModel`.
- Data XML loads data/demo records; Security defines groups and access.

View file

@ -0,0 +1,3 @@
# Configuration
Refer to Odoo settings for purchase_invoice_plan. Configure related models, access rights, and options as needed.

View file

@ -0,0 +1,3 @@
# Controllers
This module does not define custom HTTP controllers.

View file

@ -0,0 +1,6 @@
# Dependencies
This addon depends on:
- [purchase_open_qty](../../odoo-bringout-oca-purchase-workflow-purchase_open_qty)
- [purchase_stock](../../odoo-bringout-oca-ocb-purchase_stock)

View file

@ -0,0 +1,4 @@
# FAQ
- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged).
- Q: How to enable? A: Start server with --addon purchase_invoice_plan or install in UI.

View file

@ -0,0 +1,7 @@
# Install
```bash
pip install odoo-bringout-oca-purchase-workflow-purchase_invoice_plan"
# or
uv pip install odoo-bringout-oca-purchase-workflow-purchase_invoice_plan"
```

View file

@ -0,0 +1,13 @@
# Models
Detected core models and extensions in purchase_invoice_plan.
```mermaid
classDiagram
class purchase_invoice_plan
class purchase_order
```
Notes
- Classes show model technical names; fields omitted for brevity.
- Items listed under _inherit are extensions of existing models.

View file

@ -0,0 +1,6 @@
# Overview
Packaged Odoo addon: purchase_invoice_plan. Provides features documented in upstream Odoo 16 under this addon.
- Source: OCA/OCB 16.0, addon purchase_invoice_plan
- License: LGPL-3

View file

@ -0,0 +1,3 @@
# Reports
This module does not define custom reports.

View file

@ -0,0 +1,34 @@
# Security
Access control and security definitions in purchase_invoice_plan.
## Access Control Lists (ACLs)
Model access permissions defined in:
- **[ir.model.access.csv](../purchase_invoice_plan/security/ir.model.access.csv)**
- 3 model access rules
## Record Rules
Row-level security rules defined in:
```mermaid
graph TB
subgraph "Security Layers"
A[Users] --> B[Groups]
B --> C[Access Control Lists]
C --> D[Models]
B --> E[Record Rules]
E --> F[Individual Records]
end
```
Security files overview:
- **[ir.model.access.csv](../purchase_invoice_plan/security/ir.model.access.csv)**
- Model access permissions (CRUD rights)
Notes
- Access Control Lists define which groups can access which models
- Record Rules provide row-level security (filter records by user/group)
- Security groups organize users and define permission sets
- All security is enforced at the ORM level by Odoo

View file

@ -0,0 +1,5 @@
# Troubleshooting
- Ensure Python and Odoo environment matches repo guidance.
- Check database connectivity and logs if startup fails.
- Validate that dependent addons listed in DEPENDENCIES.md are installed.

View file

@ -0,0 +1,7 @@
# Usage
Start Odoo including this addon (from repo root):
```bash
python3 scripts/nix_odoo_web_server.py --db-name mydb --addon purchase_invoice_plan
```

View file

@ -0,0 +1,9 @@
# Wizards
Transient models exposed as UI wizards in purchase_invoice_plan.
```mermaid
classDiagram
class PurchaseAdvancePaymentInv
class PurchaseCreateInvoicePlan
```

View file

@ -0,0 +1,104 @@
=====================
Purchase Invoice Plan
=====================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:2157b817e3dc1283e0815686c8ba7dbab0fc4b46a24d65cd6ff4fc2fe5b2d20d
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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%2Fpurchase--workflow-lightgray.png?logo=github
:target: https://github.com/OCA/purchase-workflow/tree/16.0/purchase_invoice_plan
:alt: OCA/purchase-workflow
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/purchase-workflow-16-0/purchase-workflow-16-0-purchase_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/purchase-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 and
in step create invoice the standard call invoice.
This module add ability to create invoices based on the predefined invoice plan,
either all at once, or one by one.
.. 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 <https://odoo-community.org/page/development-status>`_
**Table of contents**
.. contents::
:local:
Usage
=====
- Create new purchase 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, start date and interval
- Double check that each installment has correct plan percentage
- After confirm purchases order, we have new option to "Create Bill by Plan"
- User can create only next bill or create all bills at the same time
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/purchase-workflow/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 <https://github.com/OCA/purchase-workflow/issues/new?body=module:%20purchase_invoice_plan%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* Ecosoft
Contributors
~~~~~~~~~~~~
* Kitti Upariphutthiphong <kittiu@ecosoft.co.th>
* Rattapong Chokmasermkul <rattapongc@ecosoft.co.th>
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 <https://odoo-community.org/page/maintainer-role>`__:
|maintainer-kittiu|
This module is part of the `OCA/purchase-workflow <https://github.com/OCA/purchase-workflow/tree/16.0/purchase_invoice_plan>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View file

@ -0,0 +1,5 @@
# 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

View file

@ -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": "Purchase Invoice Plan",
"summary": "Add to purchases 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/purchase-workflow",
"category": "Purchase",
"depends": ["purchase_open_qty", "purchase_stock"],
"data": [
"security/ir.model.access.csv",
"data/purchase_data.xml",
"wizard/purchase_create_invoice_plan_view.xml",
"wizard/purchase_make_planned_invoice_view.xml",
"views/purchase_view.xml",
],
"installable": True,
"maintainers": ["kittiu"],
"development_status": "Alpha",
}

View file

@ -0,0 +1,6 @@
<odoo noupdate="1">
<record id="decimal_price" model="decimal.precision" forcecreate="True">
<field name="name">Purchase Invoice Plan Percent</field>
<field name="digits">6</field>
</record>
</odoo>

View file

@ -0,0 +1,429 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * purchase_invoice_plan
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.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: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__amount
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_tree
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_tree_readonly
msgid "Amount"
msgstr "Iznos"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__amount_invoiced
msgid "Amount Invoiced"
msgstr "Iznos Fakturad"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.purchase_order_form
msgid "Are you sure to remove this invoice plan?"
msgstr "Da li ste sigurni da želite ukloniti ovaj plan fakturisanja?"
#. module: purchase_invoice_plan
#: model:ir.model.fields,help:purchase_invoice_plan.field_purchase_order__ip_invoice_plan
msgid "At least one invoice plan line pending to create invoice"
msgstr "At least one invoice plan line pending to create invoice"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_make_planned_invoice
msgid "Bill Purchase Order"
msgstr "Račun Nabavni Nalog"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Bills Received"
msgstr "Primljeni ul.računi"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_make_planned_invoice
msgid ""
"Bills will be created in draft for this installment\n"
" so that you can review them before validation."
msgstr ""
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_create_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_make_planned_invoice
msgid "Cancel"
msgstr "Otkaži"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_make_planned_invoice
msgid "Create All Remaining Bills"
msgstr "Create All Remaining Računs"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.purchase_order_form
msgid "Create Bill by Plan"
msgstr "Create Račun by Plan"
#. module: purchase_invoice_plan
#: model:ir.actions.act_window,name:purchase_invoice_plan.action_purchase_create_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_create_invoice_plan
msgid "Create Invoice Plan"
msgstr "Create Faktura Plan"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_make_planned_invoice
msgid "Create Next Bill"
msgstr "Create Next Račun"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__create_uid
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__create_uid
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_make_planned_invoice__create_uid
msgid "Created by"
msgstr "Kreirao"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__create_date
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__create_date
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_make_planned_invoice__create_date
msgid "Created on"
msgstr "Kreirano"
#. module: purchase_invoice_plan
#: model:ir.model.fields.selection,name:purchase_invoice_plan.selection__purchase_create_invoice_plan__interval_type__day
msgid "Day"
msgstr "Dan"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__display_name
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__display_name
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_make_planned_invoice__display_name
msgid "Display Name"
msgstr "Prikazani naziv"
#. module: purchase_invoice_plan
#: model:ir.model,name:purchase_invoice_plan.model_purchase_create_invoice_plan
msgid "Fillig invoice planning criteria"
msgstr "Fillig invoice planning criteria"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Group By"
msgstr "Grupiši po"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__id
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__id
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_make_planned_invoice__id
msgid "ID"
msgstr "ID"
#. module: purchase_invoice_plan
#: model:ir.model.fields,help:purchase_invoice_plan.field_purchase_invoice_plan__invoiced
msgid "If this line already invoiced"
msgstr "If this line already invoiced"
#. module: purchase_invoice_plan
#: model:ir.model.fields,help:purchase_invoice_plan.field_purchase_invoice_plan__to_invoice
msgid "If this line is ready to create new invoice"
msgstr "If this line is ready to create new invoice"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__installment
#: model:ir.model.fields.selection,name:purchase_invoice_plan.selection__purchase_invoice_plan__invoice_type__installment
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Installment"
msgstr "Rata"
#. module: purchase_invoice_plan
#. odoo-python
#: code:addons/purchase_invoice_plan/models/purchase.py:0
#, python-format
msgid ""
"Installment %s: already used and not allowed to delete.\n"
"Please discard changes."
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__installment_date
msgid "Installment Date"
msgstr "Rata Datum"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__interval
msgid "Interval"
msgstr "Razdoblje"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__interval_type
msgid "Interval Type"
msgstr "Interval Type"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__invoiced
msgid "Invoice Created"
msgstr "Faktura kreirana"
#. module: purchase_invoice_plan
#: model:ir.actions.act_window,name:purchase_invoice_plan.action_view_purchase_make_planned_invoice
msgid "Invoice Order"
msgstr "Fakturiši nalog"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_order__invoice_plan_ids
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.purchase_order_form
msgid "Invoice Plan"
msgstr "Faktura Plan"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_order__ip_invoice_plan
msgid "Invoice Plan In Process"
msgstr "Faktura Plan In Process"
#. module: purchase_invoice_plan
#: model:ir.model,name:purchase_invoice_plan.model_purchase_invoice_plan
msgid "Invoice Planning Detail"
msgstr "Faktura Planning Detail"
#. module: purchase_invoice_plan
#. odoo-python
#: code:addons/purchase_invoice_plan/models/purchase.py:0
#, python-format
msgid "Invoice plan total percentage must not exceed 100%"
msgstr "Faktura plan total percentage must not exceed 100%"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__invoice_ids
msgid "Invoices"
msgstr "Fakture"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__last
msgid "Last Installment"
msgstr "Last Rata"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan____last_update
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan____last_update
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_make_planned_invoice____last_update
msgid "Last Modified on"
msgstr "Zadnje mijenjano"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__write_uid
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__write_uid
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_make_planned_invoice__write_uid
msgid "Last Updated by"
msgstr "Zadnji ažurirao"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__write_date
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__write_date
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_make_planned_invoice__write_date
msgid "Last Updated on"
msgstr "Zadnje ažurirano"
#. module: purchase_invoice_plan
#: model:ir.model.fields,help:purchase_invoice_plan.field_purchase_invoice_plan__last
msgid "Last installment will create invoice use remaining amount"
msgstr "Poslednji installment will create invoice use remaining amount"
#. module: purchase_invoice_plan
#: model:ir.model.fields.selection,name:purchase_invoice_plan.selection__purchase_create_invoice_plan__interval_type__month
msgid "Month"
msgstr "Mjesec"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__to_invoice
msgid "Next Invoice"
msgstr "Next Faktura"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__no_edit
msgid "No Edit"
msgstr "No Edit"
#. module: purchase_invoice_plan
#. odoo-python
#: code:addons/purchase_invoice_plan/wizard/purchase_create_invoice_plan.py:0
#, python-format
msgid "Number Installment must greater than 1"
msgstr "Number Rata must greater than 1"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__num_installment
msgid "Number of Installment"
msgstr "Number of Rata"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__percent
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_order__ip_total_percent
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_tree_readonly
msgid "Percent"
msgstr "Procenat"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__plan_date
msgid "Plan Date"
msgstr "Plan Datum"
#. module: purchase_invoice_plan
#. odoo-python
#: code:addons/purchase_invoice_plan/models/purchase.py:0
#, python-format
msgid ""
"Plan quantity: %(plan)s, exceed invoiceable quantity: %(qty)s\n"
"Product should be delivered before invoice"
msgstr ""
#. module: purchase_invoice_plan
#. odoo-python
#: code:addons/purchase_invoice_plan/models/purchase.py:0
#, python-format
msgid "Please fill percentage for all invoice plan lines"
msgstr "Please fill percentage for all invoice plan lines"
#. module: purchase_invoice_plan
#: model:ir.actions.act_window,name:purchase_invoice_plan.action_purchase_invoice_plan
#: model:ir.ui.menu,name:purchase_invoice_plan.menu_purchase_invoice_plan
msgid "Purchase Invoice Plan"
msgstr "Nabavni Faktura Plan"
#. module: purchase_invoice_plan
#: model:ir.model,name:purchase_invoice_plan.model_purchase_order
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Purchase Order"
msgstr "Nalog za nabavu"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Purchase Orders"
msgstr "Nalozi u nabavi"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Purchase orders that have been invoiced."
msgstr "Narudžbenice koje su fakturisane."
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Purchase orders that include lines not invoiced."
msgstr "Narudžbenice koje uključuju nefakturisane stavke"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__purchase_id
msgid "Purchases Order"
msgstr "Nabavnis Nalog"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Quotations"
msgstr "Predračuni"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_form
msgid "Related Bills"
msgstr "Related Računs"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Search Purchase Invoice Plan Lines"
msgstr "Search Nabavni Faktura Plan Linijas"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__state
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Status"
msgstr "Status"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__partner_id
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Supplier"
msgstr "Dobavljač"
#. module: purchase_invoice_plan
#: model:ir.model.fields,help:purchase_invoice_plan.field_purchase_invoice_plan__amount
msgid "This amount will be used to calculate the percent"
msgstr "This amount will be used to calculate the percent"
#. module: purchase_invoice_plan
#: model:ir.model.fields,help:purchase_invoice_plan.field_purchase_invoice_plan__percent
msgid "This percent will be used to calculate new quantity"
msgstr "This percent will be used to calculate new quantity"
#. module: purchase_invoice_plan
#: model_terms:ir.actions.act_window,help:purchase_invoice_plan.action_purchase_invoice_plan
msgid "This view show all available invoice plan line for reporting purposes"
msgstr "This view show all available invoice plan line for reporting purposes"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_create_invoice_plan
msgid "This wizard help you quickly create invoice plan."
msgstr "This wizard help you quickly create invoice plan."
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "To Approve"
msgstr "Za odobriti"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_order__ip_total_amount
msgid "Total Amount"
msgstr "Ukupan iznos"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__invoice_type
msgid "Type"
msgstr "Tip"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_order__use_invoice_plan
msgid "Use Invoice Plan"
msgstr "Use Faktura Plan"
#. module: purchase_invoice_plan
#. odoo-python
#: code:addons/purchase_invoice_plan/models/purchase.py:0
#, python-format
msgid "Use Invoice Plan selected, but no plan created"
msgstr "Use Faktura Plan selected, but no plan created"
#. module: purchase_invoice_plan
#: model_terms:ir.actions.act_window,help:purchase_invoice_plan.action_purchase_invoice_plan
msgid "View purchase invoice plan lines"
msgstr "View purchase invoice plan lines"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Waiting Bills"
msgstr "Čeka se ul.račun"
#. module: purchase_invoice_plan
#: model:ir.model,name:purchase_invoice_plan.model_purchase_make_planned_invoice
msgid "Wizard when create invoice by plan"
msgstr "Čarobnjak when create invoice by plan"
#. module: purchase_invoice_plan
#: model:ir.model.fields.selection,name:purchase_invoice_plan.selection__purchase_create_invoice_plan__interval_type__year
msgid "Year"
msgstr "Godina"
#. module: purchase_invoice_plan
#: model:ir.model.fields,help:purchase_invoice_plan.field_purchase_invoice_plan__partner_id
msgid "You can find a vendor by its Name, TIN, Email or Internal Reference."
msgstr "Dobavljača možete pronaći po imenu, TIN-u, e-pošti ili internoj referenci."
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.purchase_order_form
msgid "⇒ Create Invoice Plan"
msgstr "⇒ Create Faktura Plan"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.purchase_order_form
msgid "⇒ Remove Invoice Plan"
msgstr "⇒ Remove Faktura Plan"

View file

@ -0,0 +1,442 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * purchase_invoice_plan
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2023-10-12 16:36+0000\n"
"Last-Translator: Ivorra78 <informatica@totmaterial.es>\n"
"Language-Team: none\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.17\n"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__amount
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_tree
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_tree_readonly
msgid "Amount"
msgstr "Importe"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__amount_invoiced
msgid "Amount Invoiced"
msgstr "Importe Facturado"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.purchase_order_form
msgid "Are you sure to remove this invoice plan?"
msgstr "¿Estás seguro de eliminar este plan de facturas?"
#. module: purchase_invoice_plan
#: model:ir.model.fields,help:purchase_invoice_plan.field_purchase_order__ip_invoice_plan
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: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_make_planned_invoice
msgid "Bill Purchase Order"
msgstr "Factura Orden de compra"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Bills Received"
msgstr "Facturas Recibidas"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_make_planned_invoice
msgid ""
"Bills 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 este plazo\n"
" para que pueda revisarlas antes de la validación."
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_create_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_make_planned_invoice
msgid "Cancel"
msgstr "Cancelar"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_make_planned_invoice
msgid "Create All Remaining Bills"
msgstr "Crear todas las facturas restantes"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.purchase_order_form
msgid "Create Bill by Plan"
msgstr "Crear factura por plan"
#. module: purchase_invoice_plan
#: model:ir.actions.act_window,name:purchase_invoice_plan.action_purchase_create_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_create_invoice_plan
msgid "Create Invoice Plan"
msgstr "Crear plan de facturas"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_make_planned_invoice
msgid "Create Next Bill"
msgstr "Crear factura siguiente"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__create_uid
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__create_uid
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_make_planned_invoice__create_uid
msgid "Created by"
msgstr "Creado por"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__create_date
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__create_date
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_make_planned_invoice__create_date
msgid "Created on"
msgstr "Creado el"
#. module: purchase_invoice_plan
#: model:ir.model.fields.selection,name:purchase_invoice_plan.selection__purchase_create_invoice_plan__interval_type__day
msgid "Day"
msgstr "Día"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__display_name
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__display_name
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_make_planned_invoice__display_name
msgid "Display Name"
msgstr "Mostrar Nombre"
#. module: purchase_invoice_plan
#: model:ir.model,name:purchase_invoice_plan.model_purchase_create_invoice_plan
msgid "Fillig invoice planning criteria"
msgstr "Cumplimiento de criterios de planificación de facturas"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Group By"
msgstr "Agrupar Por"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__id
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__id
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_make_planned_invoice__id
msgid "ID"
msgstr "ID (identificación)"
#. module: purchase_invoice_plan
#: model:ir.model.fields,help:purchase_invoice_plan.field_purchase_invoice_plan__invoiced
msgid "If this line already invoiced"
msgstr "Si esta línea ya se facturó"
#. module: purchase_invoice_plan
#: model:ir.model.fields,help:purchase_invoice_plan.field_purchase_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: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__installment
#: model:ir.model.fields.selection,name:purchase_invoice_plan.selection__purchase_invoice_plan__invoice_type__installment
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Installment"
msgstr "Cuota"
#. module: purchase_invoice_plan
#. odoo-python
#: code:addons/purchase_invoice_plan/models/purchase.py:0
#, python-format
msgid ""
"Installment %s: already used and not allowed to delete.\n"
"Please discard changes."
msgstr ""
"Plazo %s: ya utilizado y no se permite borrar.\n"
"Por favor, descarte los cambios."
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__installment_date
msgid "Installment Date"
msgstr "Fecha de la cuota"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__interval
msgid "Interval"
msgstr "Intervalo"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__interval_type
msgid "Interval Type"
msgstr "Tipo de Intervalo"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__invoiced
msgid "Invoice Created"
msgstr "Factura Creada"
#. module: purchase_invoice_plan
#: model:ir.actions.act_window,name:purchase_invoice_plan.action_view_purchase_make_planned_invoice
msgid "Invoice Order"
msgstr "Orden de factura"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_order__invoice_plan_ids
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.purchase_order_form
msgid "Invoice Plan"
msgstr "Plan de factura"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_order__ip_invoice_plan
msgid "Invoice Plan In Process"
msgstr "Plan de Factura en Proceso"
#. module: purchase_invoice_plan
#: model:ir.model,name:purchase_invoice_plan.model_purchase_invoice_plan
msgid "Invoice Planning Detail"
msgstr "Detalle de Planificación de Facturas"
#. module: purchase_invoice_plan
#. odoo-python
#: code:addons/purchase_invoice_plan/models/purchase.py:0
#, python-format
msgid "Invoice plan total percentage must not exceed 100%"
msgstr "El porcentaje total del plan de facturación no debe superar el 100%"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__invoice_ids
msgid "Invoices"
msgstr "Facturas"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__last
msgid "Last Installment"
msgstr "Última cuota"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan____last_update
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan____last_update
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_make_planned_invoice____last_update
msgid "Last Modified on"
msgstr "Última Modificación el"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__write_uid
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__write_uid
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_make_planned_invoice__write_uid
msgid "Last Updated by"
msgstr "Última actualización por"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__write_date
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__write_date
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_make_planned_invoice__write_date
msgid "Last Updated on"
msgstr "Última Actualización el"
#. module: purchase_invoice_plan
#: model:ir.model.fields,help:purchase_invoice_plan.field_purchase_invoice_plan__last
msgid "Last installment will create invoice use remaining amount"
msgstr "La última cuota creará el importe restante del uso de la factura"
#. module: purchase_invoice_plan
#: model:ir.model.fields.selection,name:purchase_invoice_plan.selection__purchase_create_invoice_plan__interval_type__month
msgid "Month"
msgstr "Mes"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__to_invoice
msgid "Next Invoice"
msgstr "Próxima Factura"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__no_edit
msgid "No Edit"
msgstr "No Editar"
#. module: purchase_invoice_plan
#. odoo-python
#: code:addons/purchase_invoice_plan/wizard/purchase_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: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__num_installment
msgid "Number of Installment"
msgstr "Número de cuotas"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__percent
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_order__ip_total_percent
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_tree_readonly
msgid "Percent"
msgstr "Porcentaje"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__plan_date
msgid "Plan Date"
msgstr "Fecha del Plan"
#. module: purchase_invoice_plan
#. odoo-python
#: code:addons/purchase_invoice_plan/models/purchase.py:0
#, python-format
msgid ""
"Plan quantity: %(plan)s, exceed invoiceable quantity: %(qty)s\n"
"Product should be delivered before invoice"
msgstr ""
"Cantidad planificada: %(plan)s, supera la cantidad facturable: %(qty)s\n"
"El producto debe entregarse antes de la factura"
#. module: purchase_invoice_plan
#. odoo-python
#: code:addons/purchase_invoice_plan/models/purchase.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: purchase_invoice_plan
#: model:ir.actions.act_window,name:purchase_invoice_plan.action_purchase_invoice_plan
#: model:ir.ui.menu,name:purchase_invoice_plan.menu_purchase_invoice_plan
msgid "Purchase Invoice Plan"
msgstr "Plan de Facturación de Compra"
#. module: purchase_invoice_plan
#: model:ir.model,name:purchase_invoice_plan.model_purchase_order
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Purchase Order"
msgstr "Orden de Compra"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Purchase Orders"
msgstr "Órdenes de Compra"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Purchase orders that have been invoiced."
msgstr "Órdenes de compra que han sido facturadas."
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Purchase orders that include lines not invoiced."
msgstr "Pedidos que incluyen líneas no facturadas."
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__purchase_id
msgid "Purchases Order"
msgstr "Órdenes de compra"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Quotations"
msgstr "Presupuestos"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_form
msgid "Related Bills"
msgstr "Facturas relacionadas"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Search Purchase Invoice Plan Lines"
msgstr "Buscar líneas del plan de facturas de compra"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__state
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Status"
msgstr "Estados"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__partner_id
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Supplier"
msgstr "Proveedor"
#. module: purchase_invoice_plan
#: model:ir.model.fields,help:purchase_invoice_plan.field_purchase_invoice_plan__amount
msgid "This amount will be used to calculate the percent"
msgstr "Este importe se utilizará para calcular el porcentaje"
#. module: purchase_invoice_plan
#: model:ir.model.fields,help:purchase_invoice_plan.field_purchase_invoice_plan__percent
msgid "This percent will be used to calculate new quantity"
msgstr "Este porcentaje se utilizará para calcular la nueva cantidad"
#. module: purchase_invoice_plan
#: model_terms:ir.actions.act_window,help:purchase_invoice_plan.action_purchase_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: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_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: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "To Approve"
msgstr "A Aprobar"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_order__ip_total_amount
msgid "Total Amount"
msgstr "Importe Total"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__invoice_type
msgid "Type"
msgstr "Tipo"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_order__use_invoice_plan
msgid "Use Invoice Plan"
msgstr "Usar Plan de Facturas"
#. module: purchase_invoice_plan
#. odoo-python
#: code:addons/purchase_invoice_plan/models/purchase.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: purchase_invoice_plan
#: model_terms:ir.actions.act_window,help:purchase_invoice_plan.action_purchase_invoice_plan
msgid "View purchase invoice plan lines"
msgstr "Ver líneas del plan de facturas de compra"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Waiting Bills"
msgstr "Facturas en espera"
#. module: purchase_invoice_plan
#: model:ir.model,name:purchase_invoice_plan.model_purchase_make_planned_invoice
msgid "Wizard when create invoice by plan"
msgstr "Asistente al crear factura por plan"
#. module: purchase_invoice_plan
#: model:ir.model.fields.selection,name:purchase_invoice_plan.selection__purchase_create_invoice_plan__interval_type__year
msgid "Year"
msgstr "Año"
#. module: purchase_invoice_plan
#: model:ir.model.fields,help:purchase_invoice_plan.field_purchase_invoice_plan__partner_id
msgid "You can find a vendor by its Name, TIN, Email or Internal Reference."
msgstr ""
"Puede encontrar un vendedor por su nombre, NIF, correo electrónico o "
"referencia interna."
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.purchase_order_form
msgid "⇒ Create Invoice Plan"
msgstr "⇒ Crear plan de facturas"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.purchase_order_form
msgid "⇒ Remove Invoice Plan"
msgstr "⇒ Eliminar plan de factura"

View file

@ -0,0 +1,445 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * purchase_invoice_plan
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-03-05 12:06+0000\n"
"Last-Translator: mymage <stefano.consolaro@mymage.it>\n"
"Language-Team: none\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.10.2\n"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__amount
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_tree
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_tree_readonly
msgid "Amount"
msgstr "Importo"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__amount_invoiced
msgid "Amount Invoiced"
msgstr "Importo fatturato"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.purchase_order_form
msgid "Are you sure to remove this invoice plan?"
msgstr "Si è sicuri di rimuovere questo piano di fatturazione?"
#. module: purchase_invoice_plan
#: model:ir.model.fields,help:purchase_invoice_plan.field_purchase_order__ip_invoice_plan
msgid "At least one invoice plan line pending to create invoice"
msgstr "Almeno una riga di fattura in attesa di creare la fattura"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_make_planned_invoice
msgid "Bill Purchase Order"
msgstr "Conto ordine acquisto"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Bills Received"
msgstr "Fatture ricevute"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_make_planned_invoice
msgid ""
"Bills will be created in draft for this installment\n"
" so that you can review them before validation."
msgstr ""
"I conti saranno creati in bozza per questa rata\n"
" in modo che si possano rivedere prima della "
"validazione."
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_create_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_make_planned_invoice
msgid "Cancel"
msgstr "Annulla"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_make_planned_invoice
msgid "Create All Remaining Bills"
msgstr "Creare tutti i conti rimanenti"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.purchase_order_form
msgid "Create Bill by Plan"
msgstr "Crea il conto per piano"
#. module: purchase_invoice_plan
#: model:ir.actions.act_window,name:purchase_invoice_plan.action_purchase_create_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_create_invoice_plan
msgid "Create Invoice Plan"
msgstr "Crea un piano di fatturazione"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_make_planned_invoice
msgid "Create Next Bill"
msgstr "Crea conto successivo"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__create_uid
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__create_uid
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_make_planned_invoice__create_uid
msgid "Created by"
msgstr "Creato da"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__create_date
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__create_date
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_make_planned_invoice__create_date
msgid "Created on"
msgstr "Creato il"
#. module: purchase_invoice_plan
#: model:ir.model.fields.selection,name:purchase_invoice_plan.selection__purchase_create_invoice_plan__interval_type__day
msgid "Day"
msgstr "Giorno"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__display_name
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__display_name
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_make_planned_invoice__display_name
msgid "Display Name"
msgstr "Nome visualizzato"
#. module: purchase_invoice_plan
#: model:ir.model,name:purchase_invoice_plan.model_purchase_create_invoice_plan
msgid "Fillig invoice planning criteria"
msgstr "Riempire i criteri del piano di fatturazione"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Group By"
msgstr "Raggruppa per"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__id
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__id
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_make_planned_invoice__id
msgid "ID"
msgstr "ID"
#. module: purchase_invoice_plan
#: model:ir.model.fields,help:purchase_invoice_plan.field_purchase_invoice_plan__invoiced
msgid "If this line already invoiced"
msgstr "Se questa riga è già fatturata"
#. module: purchase_invoice_plan
#: model:ir.model.fields,help:purchase_invoice_plan.field_purchase_invoice_plan__to_invoice
msgid "If this line is ready to create new invoice"
msgstr "Se questa riga è pronta per creare una nuova fattura"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__installment
#: model:ir.model.fields.selection,name:purchase_invoice_plan.selection__purchase_invoice_plan__invoice_type__installment
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Installment"
msgstr "Rata"
#. module: purchase_invoice_plan
#. odoo-python
#: code:addons/purchase_invoice_plan/models/purchase.py:0
#, python-format
msgid ""
"Installment %s: already used and not allowed to delete.\n"
"Please discard changes."
msgstr ""
"Rata %s: già utilizzata e non cancellabile.\n"
"Annullare le modifiche."
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__installment_date
msgid "Installment Date"
msgstr "Giorno della rata"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__interval
msgid "Interval"
msgstr "Intervallo"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__interval_type
msgid "Interval Type"
msgstr "Tipo intervallo"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__invoiced
msgid "Invoice Created"
msgstr "Fattura creata"
#. module: purchase_invoice_plan
#: model:ir.actions.act_window,name:purchase_invoice_plan.action_view_purchase_make_planned_invoice
msgid "Invoice Order"
msgstr "Ordine fattura"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_order__invoice_plan_ids
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.purchase_order_form
msgid "Invoice Plan"
msgstr "Piano di fatturazione"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_order__ip_invoice_plan
msgid "Invoice Plan In Process"
msgstr "Piano di fatturazione in corso"
#. module: purchase_invoice_plan
#: model:ir.model,name:purchase_invoice_plan.model_purchase_invoice_plan
msgid "Invoice Planning Detail"
msgstr "Dettaglio piano di fatturazione"
#. module: purchase_invoice_plan
#. odoo-python
#: code:addons/purchase_invoice_plan/models/purchase.py:0
#, python-format
msgid "Invoice plan total percentage must not exceed 100%"
msgstr "Il totale percentuale del piano fatturazione non può superare il 100%"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__invoice_ids
msgid "Invoices"
msgstr "Fatture"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__last
msgid "Last Installment"
msgstr "Ultima rata"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan____last_update
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan____last_update
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_make_planned_invoice____last_update
msgid "Last Modified on"
msgstr "Ultima modifica il"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__write_uid
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__write_uid
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_make_planned_invoice__write_uid
msgid "Last Updated by"
msgstr "Ultimo aggiornamento di"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__write_date
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__write_date
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_make_planned_invoice__write_date
msgid "Last Updated on"
msgstr "Ultimo aggiornamento il"
#. module: purchase_invoice_plan
#: model:ir.model.fields,help:purchase_invoice_plan.field_purchase_invoice_plan__last
msgid "Last installment will create invoice use remaining amount"
msgstr "L'ultima rata creerà la fattura usando l'ammontare residuo"
#. module: purchase_invoice_plan
#: model:ir.model.fields.selection,name:purchase_invoice_plan.selection__purchase_create_invoice_plan__interval_type__month
msgid "Month"
msgstr "Mese"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__to_invoice
msgid "Next Invoice"
msgstr "Fattura successiva"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__no_edit
msgid "No Edit"
msgstr "Non modifcare"
#. module: purchase_invoice_plan
#. odoo-python
#: code:addons/purchase_invoice_plan/wizard/purchase_create_invoice_plan.py:0
#, python-format
msgid "Number Installment must greater than 1"
msgstr "Il numero di rate deve essere maggiore di 1"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__num_installment
msgid "Number of Installment"
msgstr "Numero di rate"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__percent
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_order__ip_total_percent
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_tree_readonly
msgid "Percent"
msgstr "Percentuale"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__plan_date
msgid "Plan Date"
msgstr "Pianifica data"
#. module: purchase_invoice_plan
#. odoo-python
#: code:addons/purchase_invoice_plan/models/purchase.py:0
#, python-format
msgid ""
"Plan quantity: %(plan)s, exceed invoiceable quantity: %(qty)s\n"
"Product should be delivered before invoice"
msgstr ""
"Pianifica quantità: %(plan)s, quantità in esubero fatturabile: %(qty)s\n"
"Il prodotto deve essere consegnato prima di essere fatturato"
#. module: purchase_invoice_plan
#. odoo-python
#: code:addons/purchase_invoice_plan/models/purchase.py:0
#, python-format
msgid "Please fill percentage for all invoice plan lines"
msgstr "Inserire la percentuale per tutte le righe del piano di fatturazione"
#. module: purchase_invoice_plan
#: model:ir.actions.act_window,name:purchase_invoice_plan.action_purchase_invoice_plan
#: model:ir.ui.menu,name:purchase_invoice_plan.menu_purchase_invoice_plan
msgid "Purchase Invoice Plan"
msgstr "Totale fattura di acquisto"
#. module: purchase_invoice_plan
#: model:ir.model,name:purchase_invoice_plan.model_purchase_order
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Purchase Order"
msgstr "Ordine di acquisto"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Purchase Orders"
msgstr "Ordini di acquisto"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Purchase orders that have been invoiced."
msgstr "Ordini di acquisto che sono stati fatturati."
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Purchase orders that include lines not invoiced."
msgstr "Ordini di acquisto che hanno righe non fatturate."
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__purchase_id
msgid "Purchases Order"
msgstr "Ordine di acquisto"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Quotations"
msgstr "Preventivi"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_form
msgid "Related Bills"
msgstr "Conti correlati"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Search Purchase Invoice Plan Lines"
msgstr "Ricerca righe piano di fatturazione acquisti"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__state
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Status"
msgstr "Stato"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__partner_id
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Supplier"
msgstr "Fornitore"
#. module: purchase_invoice_plan
#: model:ir.model.fields,help:purchase_invoice_plan.field_purchase_invoice_plan__amount
msgid "This amount will be used to calculate the percent"
msgstr "Questo valore verrà usato per calcolare la percentuale"
#. module: purchase_invoice_plan
#: model:ir.model.fields,help:purchase_invoice_plan.field_purchase_invoice_plan__percent
msgid "This percent will be used to calculate new quantity"
msgstr "Questa percentuale sarà usata per calcolare una nuova quantità"
#. module: purchase_invoice_plan
#: model_terms:ir.actions.act_window,help:purchase_invoice_plan.action_purchase_invoice_plan
msgid "This view show all available invoice plan line for reporting purposes"
msgstr ""
"Questa vista mostra tutte le righe disponibile per il piano di fatturazione "
"a sconto di reportistica"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_create_invoice_plan
msgid "This wizard help you quickly create invoice plan."
msgstr ""
"Questa procedura guidata aiuterà a creare velocemente un piano di "
"fatturazione."
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "To Approve"
msgstr "Da approvare"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_order__ip_total_amount
msgid "Total Amount"
msgstr "Importo totale"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__invoice_type
msgid "Type"
msgstr "Tipo"
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_order__use_invoice_plan
msgid "Use Invoice Plan"
msgstr "Utilizzare il piano di fatturazione"
#. module: purchase_invoice_plan
#. odoo-python
#: code:addons/purchase_invoice_plan/models/purchase.py:0
#, python-format
msgid "Use Invoice Plan selected, but no plan created"
msgstr "Piano di fatturazione selezionato, ma nessun piano creato"
#. module: purchase_invoice_plan
#: model_terms:ir.actions.act_window,help:purchase_invoice_plan.action_purchase_invoice_plan
msgid "View purchase invoice plan lines"
msgstr "Visualizza le righe di piano di fatturazione acquisti"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Waiting Bills"
msgstr "Fatture in attesa"
#. module: purchase_invoice_plan
#: model:ir.model,name:purchase_invoice_plan.model_purchase_make_planned_invoice
msgid "Wizard when create invoice by plan"
msgstr "Procedura guidata per creare fatturazione in base al piano"
#. module: purchase_invoice_plan
#: model:ir.model.fields.selection,name:purchase_invoice_plan.selection__purchase_create_invoice_plan__interval_type__year
msgid "Year"
msgstr "Anno"
#. module: purchase_invoice_plan
#: model:ir.model.fields,help:purchase_invoice_plan.field_purchase_invoice_plan__partner_id
msgid "You can find a vendor by its Name, TIN, Email or Internal Reference."
msgstr ""
"Un fornitore può essere trovato per nome, codice fiscale, e-mail o "
"riferimento interno."
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.purchase_order_form
msgid "⇒ Create Invoice Plan"
msgstr "⇒ Crea un piano di fatturazione"
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.purchase_order_form
msgid "⇒ Remove Invoice Plan"
msgstr "⇒ Rimuovi il piano di fatturazione"

View file

@ -0,0 +1,429 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * purchase_invoice_plan
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.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: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__amount
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_tree
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_tree_readonly
msgid "Amount"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__amount_invoiced
msgid "Amount Invoiced"
msgstr ""
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.purchase_order_form
msgid "Are you sure to remove this invoice plan?"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model.fields,help:purchase_invoice_plan.field_purchase_order__ip_invoice_plan
msgid "At least one invoice plan line pending to create invoice"
msgstr ""
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_make_planned_invoice
msgid "Bill Purchase Order"
msgstr ""
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Bills Received"
msgstr ""
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_make_planned_invoice
msgid ""
"Bills will be created in draft for this installment\n"
" so that you can review them before validation."
msgstr ""
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_create_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_make_planned_invoice
msgid "Cancel"
msgstr ""
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_make_planned_invoice
msgid "Create All Remaining Bills"
msgstr ""
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.purchase_order_form
msgid "Create Bill by Plan"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.actions.act_window,name:purchase_invoice_plan.action_purchase_create_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_create_invoice_plan
msgid "Create Invoice Plan"
msgstr ""
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_make_planned_invoice
msgid "Create Next Bill"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__create_uid
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__create_uid
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_make_planned_invoice__create_uid
msgid "Created by"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__create_date
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__create_date
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_make_planned_invoice__create_date
msgid "Created on"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model.fields.selection,name:purchase_invoice_plan.selection__purchase_create_invoice_plan__interval_type__day
msgid "Day"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__display_name
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__display_name
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_make_planned_invoice__display_name
msgid "Display Name"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model,name:purchase_invoice_plan.model_purchase_create_invoice_plan
msgid "Fillig invoice planning criteria"
msgstr ""
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Group By"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__id
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__id
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_make_planned_invoice__id
msgid "ID"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model.fields,help:purchase_invoice_plan.field_purchase_invoice_plan__invoiced
msgid "If this line already invoiced"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model.fields,help:purchase_invoice_plan.field_purchase_invoice_plan__to_invoice
msgid "If this line is ready to create new invoice"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__installment
#: model:ir.model.fields.selection,name:purchase_invoice_plan.selection__purchase_invoice_plan__invoice_type__installment
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Installment"
msgstr ""
#. module: purchase_invoice_plan
#. odoo-python
#: code:addons/purchase_invoice_plan/models/purchase.py:0
#, python-format
msgid ""
"Installment %s: already used and not allowed to delete.\n"
"Please discard changes."
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__installment_date
msgid "Installment Date"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__interval
msgid "Interval"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__interval_type
msgid "Interval Type"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__invoiced
msgid "Invoice Created"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.actions.act_window,name:purchase_invoice_plan.action_view_purchase_make_planned_invoice
msgid "Invoice Order"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_order__invoice_plan_ids
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.purchase_order_form
msgid "Invoice Plan"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_order__ip_invoice_plan
msgid "Invoice Plan In Process"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model,name:purchase_invoice_plan.model_purchase_invoice_plan
msgid "Invoice Planning Detail"
msgstr ""
#. module: purchase_invoice_plan
#. odoo-python
#: code:addons/purchase_invoice_plan/models/purchase.py:0
#, python-format
msgid "Invoice plan total percentage must not exceed 100%"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__invoice_ids
msgid "Invoices"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__last
msgid "Last Installment"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan____last_update
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan____last_update
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_make_planned_invoice____last_update
msgid "Last Modified on"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__write_uid
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__write_uid
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_make_planned_invoice__write_uid
msgid "Last Updated by"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__write_date
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__write_date
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_make_planned_invoice__write_date
msgid "Last Updated on"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model.fields,help:purchase_invoice_plan.field_purchase_invoice_plan__last
msgid "Last installment will create invoice use remaining amount"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model.fields.selection,name:purchase_invoice_plan.selection__purchase_create_invoice_plan__interval_type__month
msgid "Month"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__to_invoice
msgid "Next Invoice"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__no_edit
msgid "No Edit"
msgstr ""
#. module: purchase_invoice_plan
#. odoo-python
#: code:addons/purchase_invoice_plan/wizard/purchase_create_invoice_plan.py:0
#, python-format
msgid "Number Installment must greater than 1"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_create_invoice_plan__num_installment
msgid "Number of Installment"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__percent
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_order__ip_total_percent
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_tree_readonly
msgid "Percent"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__plan_date
msgid "Plan Date"
msgstr ""
#. module: purchase_invoice_plan
#. odoo-python
#: code:addons/purchase_invoice_plan/models/purchase.py:0
#, python-format
msgid ""
"Plan quantity: %(plan)s, exceed invoiceable quantity: %(qty)s\n"
"Product should be delivered before invoice"
msgstr ""
#. module: purchase_invoice_plan
#. odoo-python
#: code:addons/purchase_invoice_plan/models/purchase.py:0
#, python-format
msgid "Please fill percentage for all invoice plan lines"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.actions.act_window,name:purchase_invoice_plan.action_purchase_invoice_plan
#: model:ir.ui.menu,name:purchase_invoice_plan.menu_purchase_invoice_plan
msgid "Purchase Invoice Plan"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model,name:purchase_invoice_plan.model_purchase_order
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Purchase Order"
msgstr ""
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Purchase Orders"
msgstr ""
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Purchase orders that have been invoiced."
msgstr ""
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Purchase orders that include lines not invoiced."
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__purchase_id
msgid "Purchases Order"
msgstr ""
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Quotations"
msgstr ""
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_form
msgid "Related Bills"
msgstr ""
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Search Purchase Invoice Plan Lines"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__state
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Status"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__partner_id
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Supplier"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model.fields,help:purchase_invoice_plan.field_purchase_invoice_plan__amount
msgid "This amount will be used to calculate the percent"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model.fields,help:purchase_invoice_plan.field_purchase_invoice_plan__percent
msgid "This percent will be used to calculate new quantity"
msgstr ""
#. module: purchase_invoice_plan
#: model_terms:ir.actions.act_window,help:purchase_invoice_plan.action_purchase_invoice_plan
msgid "This view show all available invoice plan line for reporting purposes"
msgstr ""
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_create_invoice_plan
msgid "This wizard help you quickly create invoice plan."
msgstr ""
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "To Approve"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_order__ip_total_amount
msgid "Total Amount"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_invoice_plan__invoice_type
msgid "Type"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model.fields,field_description:purchase_invoice_plan.field_purchase_order__use_invoice_plan
msgid "Use Invoice Plan"
msgstr ""
#. module: purchase_invoice_plan
#. odoo-python
#: code:addons/purchase_invoice_plan/models/purchase.py:0
#, python-format
msgid "Use Invoice Plan selected, but no plan created"
msgstr ""
#. module: purchase_invoice_plan
#: model_terms:ir.actions.act_window,help:purchase_invoice_plan.action_purchase_invoice_plan
msgid "View purchase invoice plan lines"
msgstr ""
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.view_purchase_invoice_plan_filter
msgid "Waiting Bills"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model,name:purchase_invoice_plan.model_purchase_make_planned_invoice
msgid "Wizard when create invoice by plan"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model.fields.selection,name:purchase_invoice_plan.selection__purchase_create_invoice_plan__interval_type__year
msgid "Year"
msgstr ""
#. module: purchase_invoice_plan
#: model:ir.model.fields,help:purchase_invoice_plan.field_purchase_invoice_plan__partner_id
msgid "You can find a vendor by its Name, TIN, Email or Internal Reference."
msgstr ""
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.purchase_order_form
msgid "⇒ Create Invoice Plan"
msgstr ""
#. module: purchase_invoice_plan
#: model_terms:ir.ui.view,arch_db:purchase_invoice_plan.purchase_order_form
msgid "⇒ Remove Invoice Plan"
msgstr ""

View file

@ -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 purchase

View file

@ -0,0 +1,327 @@
# 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_compare, float_round
class PurchaseOrder(models.Model):
_inherit = "purchase.order"
invoice_plan_ids = fields.One2many(
comodel_name="purchase.invoice.plan",
inverse_name="purchase_id",
string="Invoice Plan",
copy=False,
)
use_invoice_plan = fields.Boolean(
default=False,
copy=False,
)
ip_invoice_plan = fields.Boolean(
string="Invoice Plan In Process",
compute="_compute_ip_invoice_plan",
help="At least one invoice plan line pending to create invoice",
)
ip_total_percent = fields.Float(
compute="_compute_ip_total",
string="Percent",
)
ip_total_amount = fields.Monetary(
compute="_compute_ip_total",
string="Total Amount",
)
@api.depends("invoice_plan_ids")
def _compute_ip_total(self):
for rec in self:
installments = rec.invoice_plan_ids.filtered("installment")
rec.ip_total_percent = sum(installments.mapped("percent"))
rec.ip_total_amount = sum(installments.mapped("amount"))
def _compute_ip_invoice_plan(self):
for rec in self:
rec.ip_invoice_plan = (
rec.use_invoice_plan
and rec.invoice_plan_ids
and len(rec.invoice_plan_ids.filtered(lambda l: not l.invoiced))
)
@api.constrains("invoice_plan_ids")
def _check_ip_total_percent(self):
for rec in self:
installments = rec.invoice_plan_ids.filtered("installment")
ip_total_percent = sum(installments.mapped("percent"))
if float_round(ip_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 button_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().button_confirm()
def create_invoice_plan(
self, num_installment, installment_date, interval, interval_type
):
self.ensure_one()
self.invoice_plan_ids.unlink()
invoice_plans = []
Decimal = self.env["decimal.precision"]
prec = Decimal.precision_get("Purchase Invoice Plan Percent")
percent = float_round(1.0 / num_installment * 100, prec)
percent_last = 100 - (percent * (num_installment - 1))
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 action_view_invoice(self, invoices=False):
invoice_plan_id = self._context.get("invoice_plan_id")
if invoice_plan_id and invoices:
plan = self.env["purchase.invoice.plan"].browse(invoice_plan_id)
for invoice in invoices:
plan._compute_new_invoice_quantity(invoice)
invoice.write(
{
"date": plan.plan_date,
"invoice_date": plan.plan_date,
}
)
plan.invoice_ids += invoice
return super().action_view_invoice(invoices=invoices)
class PurchaseInvoicePlan(models.Model):
_name = "purchase.invoice.plan"
_description = "Invoice Planning Detail"
_order = "installment"
purchase_id = fields.Many2one(
comodel_name="purchase.order",
string="Purchases Order",
index=True,
readonly=True,
ondelete="cascade",
)
partner_id = fields.Many2one(
comodel_name="res.partner",
string="Supplier",
related="purchase_id.partner_id",
store=True,
index=True,
)
state = fields.Selection(
string="Status",
related="purchase_id.state",
store=True,
index=True,
)
installment = fields.Integer()
plan_date = fields.Date(
required=True,
)
invoice_type = fields.Selection(
selection=[("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="Purchase 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_ids = fields.Many2many(
comodel_name="account.move",
relation="purchase_invoice_plan_invoice_rel",
column1="plan_id",
column2="move_id",
string="Invoices",
readonly=True,
)
amount_invoiced = fields.Float(
compute="_compute_invoiced",
store=True,
readonly=False,
)
to_invoice = fields.Boolean(
string="Next Invoice",
compute="_compute_to_invoice",
help="If this line is ready to create new invoice",
store=True,
)
invoiced = fields.Boolean(
string="Invoice Created",
compute="_compute_invoiced",
help="If this line already invoiced",
store=True,
)
no_edit = fields.Boolean(
compute="_compute_no_edit",
)
@api.depends("percent")
def _compute_amount(self):
for rec in self:
amount_untaxed = rec.purchase_id._origin.amount_untaxed
# With invoice already created, no recompute
if rec.invoiced:
rec.amount = rec.amount_invoiced
rec.percent = rec.amount / amount_untaxed * 100
continue
# For last line, amount is the left over
if rec.last:
installments = rec.purchase_id.invoice_plan_ids.filtered(
lambda l: l.invoice_type == "installment"
)
prev_amount = sum((installments - rec).mapped("amount"))
rec.amount = amount_untaxed - prev_amount
continue
rec.amount = rec.percent * amount_untaxed / 100
@api.onchange("amount", "percent")
def _inverse_amount(self):
for rec in self:
if rec.purchase_id.amount_untaxed != 0:
if rec.last:
installments = rec.purchase_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.purchase_id.amount_untaxed * 100
continue
rec.percent = 0
@api.depends("purchase_id.state", "purchase_id.invoice_plan_ids.invoiced")
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.purchase_id.state != "purchase":
continue
if not rec.invoiced:
rec.to_invoice = True
break
def _get_amount_invoice(self, invoices):
"""Hook function"""
return sum(invoices.mapped("amount_untaxed"))
@api.depends("invoice_ids.state")
def _compute_invoiced(self):
for rec in self:
invoiced = rec.invoice_ids.filtered(
lambda l: l.state in ("draft", "posted")
)
rec.invoiced = invoiced and True or False
rec.amount_invoiced = rec._get_amount_invoice(invoiced[:1])
def _compute_last(self):
for rec in self:
last = max(rec.purchase_id.invoice_plan_ids.mapped("installment"))
rec.last = rec.installment == last
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()
def _compute_new_invoice_quantity(self, invoice_move):
self.ensure_one()
if self.last: # For last install, let the system do the calc.
return
percent = self.percent
move = invoice_move.with_context(**{"check_move_validity": False})
for line in move.invoice_line_ids:
self._update_new_quantity(line, percent)
def _update_new_quantity(self, line, percent):
"""Hook function"""
plan_qty = self._get_plan_qty(line.purchase_line_id, percent)
prec = line.purchase_line_id.product_uom.rounding
if float_compare(abs(plan_qty), abs(line.quantity), prec) == 1:
raise ValidationError(
_(
"Plan quantity: %(plan)s, exceed invoiceable quantity: %(qty)s"
"\nProduct should be delivered before invoice"
)
% {"plan": plan_qty, "qty": line.quantity}
)
line.write({"quantity": plan_qty})
@api.model
def _get_plan_qty(self, order_line, percent):
plan_qty = order_line.product_qty * (percent / 100)
return plan_qty
@api.ondelete(at_uninstall=False)
def _unlink_except_no_edit(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)
)

View file

@ -0,0 +1,2 @@
* Kitti Upariphutthiphong <kittiu@ecosoft.co.th>
* Rattapong Chokmasermkul <rattapongc@ecosoft.co.th>

View file

@ -0,0 +1,4 @@
By standard feature, user can gradually create partial invoices, one by one and
in step create invoice the standard call invoice.
This module add ability to create invoices based on the predefined invoice plan,
either all at once, or one by one.

View file

@ -0,0 +1,7 @@
- Create new purchase 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, start date and interval
- Double check that each installment has correct plan percentage
- After confirm purchases order, we have new option to "Create Bill by Plan"
- User can create only next bill or create all bills at the same time

View file

@ -0,0 +1,4 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_purchase_invoice_plan,access_purchase_invoice_plan,model_purchase_invoice_plan,,1,1,1,1
access_purchase_create_invoice_plan,access_purchase_create_invoice_plan,model_purchase_create_invoice_plan,,1,1,1,1
access_purchase_make_planned_invoice,access_purchase_make_planned_invoice,model_purchase_make_planned_invoice,,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_purchase_invoice_plan access_purchase_invoice_plan model_purchase_invoice_plan 1 1 1 1
3 access_purchase_create_invoice_plan access_purchase_create_invoice_plan model_purchase_create_invoice_plan 1 1 1 1
4 access_purchase_make_planned_invoice access_purchase_make_planned_invoice model_purchase_make_planned_invoice 1 1 1 1

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View file

@ -0,0 +1,446 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
<title>Purchase Invoice Plan</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: grey; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="purchase-invoice-plan">
<h1 class="title">Purchase Invoice Plan</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:2157b817e3dc1283e0815686c8ba7dbab0fc4b46a24d65cd6ff4fc2fe5b2d20d
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Alpha" src="https://img.shields.io/badge/maturity-Alpha-red.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/purchase-workflow/tree/16.0/purchase_invoice_plan"><img alt="OCA/purchase-workflow" src="https://img.shields.io/badge/github-OCA%2Fpurchase--workflow-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/purchase-workflow-16-0/purchase-workflow-16-0-purchase_invoice_plan"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/purchase-workflow&amp;target_branch=16.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>By standard feature, user can gradually create partial invoices, one by one and
in step create invoice the standard call invoice.
This module add ability to create invoices based on the predefined invoice plan,
either all at once, or one by one.</p>
<div class="admonition important">
<p class="first admonition-title">Important</p>
<p class="last">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.
<a class="reference external" href="https://odoo-community.org/page/development-status">More details on development status</a></p>
</div>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#usage" id="toc-entry-1">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-2">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-3">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-4">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-5">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-6">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#toc-entry-1">Usage</a></h1>
<ul class="simple">
<li>Create new purchase quotation as per normal process</li>
<li>Select option “Use Invoice Plan”, a new Invoice Plan tab will appear</li>
<li>Click on “=&gt; Create Invoice Plan” link to open invoice planning wizard</li>
<li>Do plan for number of installment, start date and interval</li>
<li>Double check that each installment has correct plan percentage</li>
<li>After confirm purchases order, we have new option to “Create Bill by Plan”</li>
<li>User can create only next bill or create all bills at the same time</li>
</ul>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#toc-entry-2">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/purchase-workflow/issues">GitHub Issues</a>.
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
<a class="reference external" href="https://github.com/OCA/purchase-workflow/issues/new?body=module:%20purchase_invoice_plan%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#toc-entry-3">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#toc-entry-4">Authors</a></h2>
<ul class="simple">
<li>Ecosoft</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#toc-entry-5">Contributors</a></h2>
<ul class="simple">
<li>Kitti Upariphutthiphong &lt;<a class="reference external" href="mailto:kittiu&#64;ecosoft.co.th">kittiu&#64;ecosoft.co.th</a>&gt;</li>
<li>Rattapong Chokmasermkul &lt;<a class="reference external" href="mailto:rattapongc&#64;ecosoft.co.th">rattapongc&#64;ecosoft.co.th</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#toc-entry-6">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>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.</p>
<p>Current <a class="reference external" href="https://odoo-community.org/page/maintainer-role">maintainer</a>:</p>
<p><a class="reference external image-reference" href="https://github.com/kittiu"><img alt="kittiu" src="https://github.com/kittiu.png?size=40px" /></a></p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/purchase-workflow/tree/16.0/purchase_invoice_plan">OCA/purchase-workflow</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,4 @@
# Copyright 2019 Ecosoft Co., Ltd (http://ecosoft.co.th/)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
from . import test_purchase_invoice_plan

View file

@ -0,0 +1,226 @@
# Copyright 2019 Ecosoft (http://ecosoft.co.th)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
from freezegun import freeze_time
from odoo import fields
from odoo.exceptions import UserError, ValidationError
from odoo.tests.common import Form, TransactionCase
class TestPurchaseInvoicePlan(TransactionCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
# Create a PO
cls.PurchaseOrder = cls.env["purchase.order"]
cls.PurchaseInvoicePlan = cls.env["purchase.create.invoice.plan"]
cls.StockBackorderConfirm = cls.env["stock.backorder.confirmation"]
cls.StockPicking = cls.env["stock.picking"]
cls.test_partner = cls.env.ref("base.res_partner_12")
cls.test_service = cls.env.ref("product.product_product_2")
cls.test_product = cls.env.ref("product.product_product_7")
cls.test_po_service = cls.env["purchase.order"].create(
{
"partner_id": cls.test_partner.id,
"use_invoice_plan": True,
"order_line": [
(
0,
0,
{
"name": "PO-Service",
"product_id": cls.test_service.id,
"date_planned": fields.Datetime.now(),
"product_qty": 1,
"product_uom": cls.test_service.uom_id.id,
"price_unit": 500,
},
)
],
}
)
cls.test_po_product = cls.env["purchase.order"].create(
{
"partner_id": cls.test_partner.id,
"use_invoice_plan": True,
"order_line": [
(
0,
0,
{
"name": "PO-Product",
"product_id": cls.test_product.id,
"date_planned": fields.Datetime.now(),
"product_qty": 10,
"product_uom": cls.test_product.uom_id.id,
"price_unit": 1000,
},
)
],
}
)
def test_invoice_plan(self):
ctx = {
"active_id": self.test_po_product.id,
"active_ids": [self.test_po_product.id],
"all_remain_invoices": True,
}
# Create purchase plan
with Form(self.PurchaseInvoicePlan) as p:
p.num_installment = 5
purchase_plan = p.save()
purchase_plan.with_context(**ctx).purchase_create_invoice_plan()
# Change plan, so that the 1st installment is 1000 and 5th is 3000
self.assertEqual(len(self.test_po_product.invoice_plan_ids), 5)
self.test_po_product.invoice_plan_ids[0].amount = 1000
self.test_po_product.invoice_plan_ids[4].amount = 3000
self.test_po_product.button_confirm()
self.assertEqual(self.test_po_product.state, "purchase")
# Receive all products
receive = self.test_po_product.picking_ids.filtered(lambda l: l.state != "done")
receive.move_ids_without_package.quantity_done = 10.0
receive._action_done()
purchase_create = self.env["purchase.make.planned.invoice"].create({})
purchase_create.with_context(**ctx).create_invoices_by_plan()
self.assertEqual(
self.test_po_product.amount_total,
sum(self.test_po_product.invoice_ids.mapped("amount_total")),
)
def test_unlink_invoice_plan(self):
ctx = {
"active_id": self.test_po_product.id,
"active_ids": [self.test_po_product.id],
}
with Form(self.PurchaseInvoicePlan) as p:
p.num_installment = 5
plan = p.save()
plan.with_context(**ctx).purchase_create_invoice_plan()
# Remove it
self.test_po_product.remove_invoice_plan()
self.assertFalse(self.test_po_product.invoice_plan_ids)
def test_error(self):
ctx = {
"active_id": self.test_po_product.id,
"active_ids": [self.test_po_product.id],
"all_remain_invoices": True,
}
# UserError Use Invoice Plan selected, but no plan created
with self.assertRaises(UserError):
self.test_po_product.button_confirm()
# ValidationError Number of Installment <= 1
with self.assertRaises(ValidationError) as e:
with Form(self.PurchaseInvoicePlan) as p:
p.num_installment = 0
p.save()
error_message = "Number Installment must greater than 1"
self.assertEqual(e.exception.args[0], error_message)
# Create purchase plan
with Form(self.PurchaseInvoicePlan) as p:
p.num_installment = 5
purchase_plan = p.save()
purchase_plan.with_context(**ctx).purchase_create_invoice_plan()
# Test exceed percent
with self.assertRaises(UserError):
self.test_po_product.invoice_plan_ids[0].percent = 99
self.test_po_product._check_ip_total_percent()
self.test_po_product.button_confirm()
self.assertEqual(self.test_po_product.state, "purchase")
# UserError Please fill percentage for all invoice plan lines
with self.assertRaises(UserError):
for per in self.test_po_product.invoice_plan_ids:
per.percent = 0
self.test_po_product._check_invoice_plan()
# Receive product 1 unit
receive = self.test_po_product.picking_ids.filtered(lambda l: l.state != "done")
receive.move_ids_without_package.quantity_done = 1.0
receive._action_done()
# ValidationError Create all invoice plan - Receive < Invoice require
purchase_create = self.env["purchase.make.planned.invoice"].create({})
with self.assertRaises(ValidationError) as e:
purchase_create.with_context(**ctx).create_invoices_by_plan()
error_message = (
"Plan quantity: 2.0, exceed invoiceable quantity: 1.0"
"\nProduct should be delivered before invoice"
)
self.assertEqual(e.exception.args[0], error_message)
def test_invoice_plan_po_edit(self):
"""Case when some installment already invoiced,
but then, the PO line added. Test to ensure that
the invoiced amount of the done installment is fixed"""
ctx = {
"active_id": self.test_po_product.id,
"active_ids": [self.test_po_product.id],
"all_remain_invoices": False,
}
# Create purchase plan
with Form(self.PurchaseInvoicePlan) as p:
p.num_installment = 5
purchase_plan = p.save()
purchase_plan.with_context(**ctx).purchase_create_invoice_plan()
# Change plan, so that the 1st installment is 1000 and 5th is 3000
self.assertEqual(len(self.test_po_product.invoice_plan_ids), 5)
first_install = self.test_po_product.invoice_plan_ids[0]
first_install.amount = 1000
self.test_po_product.invoice_plan_ids[4].amount = 3000
self.test_po_product.button_confirm()
self.assertEqual(self.test_po_product.state, "purchase")
# Receive all products
receive = self.test_po_product.picking_ids.filtered(lambda l: l.state != "done")
receive.move_ids_without_package.quantity_done = 10.0
receive._action_done()
purchase_create = self.env["purchase.make.planned.invoice"].create({})
# Create only the 1st invoice, amount should be 1000, and percent is 10
purchase_create.with_context(**ctx).create_invoices_by_plan()
self.assertEqual(first_install.amount, 1000)
self.assertEqual(first_install.percent, 10)
# Add new PO line with amount = 1000, check that only percent is changed
self.test_po_product.write(
{
"order_line": [
(
0,
0,
{
"name": "PO-Product-NEW",
"product_id": self.test_product.id,
"date_planned": fields.Datetime.now(),
"product_qty": 1,
"product_uom": self.test_product.uom_id.id,
"price_unit": 1000,
},
)
],
}
)
# Overall amount changed to 11000, install amount not changed, only percent changed.
self.assertEqual(self.test_po_product.amount_total, 11000)
self.test_po_product.invoice_plan_ids._compute_amount()
self.assertEqual(first_install.amount, 1000)
self.assertEqual(first_install.percent, 9.090909)
with self.assertRaises(UserError):
self.test_po_product.remove_invoice_plan()
@freeze_time("2022-01-01")
def test_next_date(self):
ctx = {
"active_id": self.test_po_product.id,
"active_ids": [self.test_po_product.id],
"all_remain_invoices": False,
}
# Create purchase plan
for item in ["day", "month", "year"]:
with Form(self.PurchaseInvoicePlan) as p:
p.num_installment = 5
p.interval = 5
p.interval_type = item
purchase_plan = p.save()
purchase_plan.with_context(**ctx).purchase_create_invoice_plan()
self.assertEqual(len(self.test_po_product.invoice_plan_ids), 5)
self.test_po_product.remove_invoice_plan()

View file

@ -0,0 +1,227 @@
<odoo>
<record id="view_purchase_invoice_plan_tree" model="ir.ui.view">
<field name="name">view.purchase.invoice.plan.tree</field>
<field name="model">purchase.invoice.plan</field>
<field name="arch" type="xml">
<tree editable="bottom">
<field name="no_edit" invisible="1" />
<field
name="installment"
attrs="{'readonly': [('no_edit', '=', True)]}"
/>
<field
name="plan_date"
attrs="{'readonly': [('no_edit', '=', True)]}"
/>
<field
name="invoice_type"
attrs="{'readonly': [('no_edit', '=', True)]}"
/>
<field
name="percent"
optional="show"
attrs="{'readonly': [('no_edit', '=', True)]}"
/>
<field
name="amount"
optional="show"
attrs="{'readonly': [('no_edit', '=', True)]}"
/>
<field name="amount_invoiced" optional="hide" sum="Amount" />
<field name="to_invoice" />
<field name="invoiced" />
<field name="invoice_ids" optional="hide" widget="many2many_tags" />
</tree>
</field>
</record>
<record id="view_purchase_invoice_plan_form" model="ir.ui.view">
<field name="name">view.purchase.invoice.plan.form</field>
<field name="model">purchase.invoice.plan</field>
<field name="arch" type="xml">
<form>
<group>
<group>
<field name="installment" />
<field name="plan_date" />
<field name="to_invoice" />
</group>
<group>
<field name="invoice_type" />
<field name="percent" />
<field name="amount" />
<field name="invoiced" />
</group>
</group>
<separator
string="Related Bills"
attrs="{'invisible': [('invoice_ids', '=', [])]}"
/>
<field name="invoice_ids" widget="many2many_tags" />
</form>
</field>
</record>
<record id="purchase_order_form" model="ir.ui.view">
<field name="name">purchase_order_form</field>
<field name="model">purchase.order</field>
<field name="inherit_id" ref="purchase.purchase_order_form" />
<field name="arch" type="xml">
<xpath expr='/form/sheet/notebook' position="before">
<div attrs="{'readonly': [('invoice_count', '>', 0)]}">
<field name="use_invoice_plan" />
<label for="use_invoice_plan" />
</div>
</xpath>
<xpath expr="//button[@name='action_create_invoice']" position="before">
<field name="ip_invoice_plan" invisible="1" />
<button
name="%(action_view_purchase_make_planned_invoice)d"
string="Create Bill by Plan"
type="action"
class="btn-primary"
attrs="{'invisible': ['|', ('ip_invoice_plan', '=', False), ('invoice_status', '!=', 'to invoice')]}"
/>
</xpath>
<xpath expr="/form/sheet/notebook/page" position="after">
<page
string="Invoice Plan"
attrs="{'invisible': [('use_invoice_plan', '=', False)]}"
>
<button
name="%(action_purchase_create_invoice_plan)d"
string="⇒ Create Invoice Plan"
type="action"
class="oe_link"
attrs="{'invisible': ['|', ('invoice_plan_ids', '!=', []), ('invoice_count', '>', 0)]}"
/>
<button
name="remove_invoice_plan"
string="⇒ Remove Invoice Plan"
type="object"
class="oe_link"
attrs="{'invisible': ['|', ('invoice_plan_ids', '=', []), ('invoice_count', '>', 0)]}"
confirm="Are you sure to remove this invoice plan?"
/>
<field
name="invoice_plan_ids"
context="{'tree_view_ref': 'purchase_invoice_plan.view_purchase_invoice_plan_tree'}"
attrs="{'invisible': [('invoice_plan_ids', '=', [])]}"
/>
<group class="oe_subtotal_footer oe_right">
<field name="ip_total_percent" />
<field name="ip_total_amount" />
</group>
</page>
</xpath>
</field>
</record>
<!-- Invoice Plan Lines -->
<record id="view_purchase_invoice_plan_filter" model="ir.ui.view">
<field name="name">view.purchase.invoice.plan.filter</field>
<field name="model">purchase.invoice.plan</field>
<field name="arch" type="xml">
<search string="Search Purchase Invoice Plan Lines">
<field name="partner_id" />
<field name="purchase_id" />
<field name="installment" />
<separator />
<filter
name="draft"
string="Quotations"
domain="[('state','in',('draft','sent','to approve'))]"
/>
<filter
name="approved"
string="Purchase Orders"
domain="[('state','in',('purchase','done'))]"
/>
<filter
name="to_approve"
string="To Approve"
domain="[('state', '=', 'to approve')]"
/>
<separator />
<filter
name="not_invoiced"
string="Waiting Bills"
domain="[('to_invoice','=', True)]"
help="Purchase orders that include lines not invoiced."
/>
<filter
name="invoiced"
string="Bills Received"
domain="[('invoiced','=', True)]"
help="Purchase orders that have been invoiced."
/>
<group expand="0" string="Group By">
<filter
string="Supplier"
name="supplier"
domain="[]"
context="{'group_by':'partner_id'}"
/>
<filter
string="Purchase Order"
name="purchase"
domain="[]"
context="{'group_by':'purchase_id'}"
/>
<filter
string="Installment"
name="install"
domain="[]"
context="{'group_by':'installment'}"
/>
<filter
string="Status"
name="state"
domain="[]"
context="{'group_by':'state'}"
/>
</group>
</search>
</field>
</record>
<record id="view_purchase_invoice_plan_tree_readonly" model="ir.ui.view">
<field name="name">view.purchase.invoice.plan.tree</field>
<field name="model">purchase.invoice.plan</field>
<field name="arch" type="xml">
<tree edit="0" create="0" delete="0">
<field name="purchase_id" />
<field name="installment" />
<field name="plan_date" />
<field name="invoice_type" />
<field name="percent" optional="show" sum="Percent" />
<field name="amount" optional="show" sum="Amount" />
<field name="amount_invoiced" optional="show" sum="Amount" />
<field name="to_invoice" />
<field name="invoiced" />
<field name="invoice_ids" widget="many2many_tags" />
</tree>
</field>
</record>
<record id="action_purchase_invoice_plan" model="ir.actions.act_window">
<field name="name">Purchase Invoice Plan</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">purchase.invoice.plan</field>
<field name="view_mode">tree</field>
<field name="view_id" ref="view_purchase_invoice_plan_tree_readonly" />
<field name="search_view_id" ref="view_purchase_invoice_plan_filter" />
<field
name="context"
>{'search_default_draft': 1, 'search_default_purchase': 1}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
View purchase invoice plan lines
</p>
<p>
This view show all available invoice plan line for reporting purposes
</p>
</field>
</record>
<menuitem
action="action_purchase_invoice_plan"
id="menu_purchase_invoice_plan"
parent="purchase.menu_procurement_management"
sequence="7"
/>
</odoo>

View file

@ -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 purchase_create_invoice_plan
from . import purchase_make_planned_invoice

View file

@ -0,0 +1,45 @@
# Copyright 2019 Ecosoft Co., Ltd (http://ecosoft.co.th/)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html)
from odoo import _, api, fields, models
from odoo.exceptions import ValidationError
class PurchaseCreateInvoicePlan(models.TransientModel):
_name = "purchase.create.invoice.plan"
_description = "Fillig invoice planning criteria"
num_installment = fields.Integer(
string="Number of Installment",
default=0,
required=True,
)
installment_date = fields.Date(
default=fields.Date.context_today,
required=True,
)
interval = fields.Integer(
default=1,
required=True,
)
interval_type = fields.Selection(
[("day", "Day"), ("month", "Month"), ("year", "Year")],
default="month",
required=True,
)
@api.constrains("num_installment")
def _check_num_installment(self):
if self.num_installment <= 1:
raise ValidationError(_("Number Installment must greater than 1"))
def purchase_create_invoice_plan(self):
purchase = self.env["purchase.order"].browse(self._context.get("active_id"))
self.ensure_one()
purchase.create_invoice_plan(
self.num_installment,
self.installment_date,
self.interval,
self.interval_type,
)
return {"type": "ir.actions.act_window_close"}

View file

@ -0,0 +1,42 @@
<odoo>
<record id="view_purchase_create_invoice_plan" model="ir.ui.view">
<field name="name">Create Invoice Plan</field>
<field name="model">purchase.create.invoice.plan</field>
<field name="arch" type="xml">
<form string="Create Invoice Plan">
<p class="oe_grey">
This wizard help you quickly create invoice plan.
</p>
<group>
<group>
<field name="num_installment" />
<field name="installment_date" />
</group>
<group>
<label for="interval" />
<div>
<field name="interval" class="oe_inline" />
<field name="interval_type" class="oe_inline" />
</div>
</group>
</group>
<footer>
<button
name="purchase_create_invoice_plan"
string="Create Invoice Plan"
type="object"
class="btn-primary"
/>
<button string="Cancel" class="btn-default" special="cancel" />
</footer>
</form>
</field>
</record>
<record id="action_purchase_create_invoice_plan" model="ir.actions.act_window">
<field name="name">Create Invoice Plan</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">purchase.create.invoice.plan</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
</odoo>

View file

@ -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)
from odoo import models
class PurchaseAdvancePaymentInv(models.TransientModel):
_name = "purchase.make.planned.invoice"
_description = "Wizard when create invoice by plan"
def create_invoices_by_plan(self):
purchase = self.env["purchase.order"].browse(self._context.get("active_id"))
purchase.ensure_one()
invoice_plans = (
self._context.get("all_remain_invoices")
and purchase.invoice_plan_ids.filtered(lambda l: not l.invoiced)
or purchase.invoice_plan_ids.filtered("to_invoice")
)
for plan in invoice_plans.sorted("installment"):
purchase.sudo().with_context(
invoice_plan_id=plan.id
).action_create_invoice()
return {"type": "ir.actions.act_window_close"}

View file

@ -0,0 +1,40 @@
<odoo>
<record id="view_purchase_make_planned_invoice" model="ir.ui.view">
<field name="name">view.purchase.make.planned.invoice</field>
<field name="model">purchase.make.planned.invoice</field>
<field name="arch" type="xml">
<form string="Bill Purchase Order">
<p class="oe_grey">
Bills will be created in draft for this installment
so that you can review them before validation.
</p>
<footer>
<button
name="create_invoices_by_plan"
string="Create Next Bill"
type="object"
class="btn-primary"
/>
<button
name="create_invoices_by_plan"
string="Create All Remaining Bills"
type="object"
context="{'all_remain_invoices': True}"
class="btn-primary"
/>
<button string="Cancel" class="btn-default" special="cancel" />
</footer>
</form>
</field>
</record>
<record
id="action_view_purchase_make_planned_invoice"
model="ir.actions.act_window"
>
<field name="name">Invoice Order</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">purchase.make.planned.invoice</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
</odoo>

View file

@ -0,0 +1,43 @@
[project]
name = "odoo-bringout-oca-purchase-workflow-purchase_invoice_plan"
version = "16.0.0"
description = "Purchase Invoice Plan - Add to purchases order, ability to manage future invoice plan"
authors = [
{ name = "Ernad Husremovic", email = "hernad@bring.out.ba" }
]
dependencies = [
"odoo-bringout-oca-purchase-workflow-purchase_open_qty>=16.0.0",
"odoo-bringout-oca-purchase-workflow-purchase_stock>=16.0.0",
"requests>=2.25.1"
]
readme = "README.md"
requires-python = ">= 3.11"
classifiers = [
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
"License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Topic :: Office/Business",
]
[project.urls]
homepage = "https://github.com/bringout/0"
repository = "https://github.com/bringout/0"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.metadata]
allow-direct-references = true
[tool.hatch.build.targets.wheel]
packages = ["purchase_invoice_plan"]
[tool.rye]
managed = true
dev-dependencies = [
"pytest>=8.4.1",
]