Initial commit: OCA Technical packages (595 packages)

This commit is contained in:
Ernad Husremovic 2025-08-29 15:43:03 +02:00
commit 2cc02aac6e
24950 changed files with 2318079 additions and 0 deletions

View file

@ -0,0 +1,46 @@
# Account Cut-off Picking
Odoo addon: account_cutoff_picking
## Installation
```bash
pip install odoo-bringout-oca-account-closing-account_cutoff_picking
```
## Dependencies
This addon depends on:
- account_cutoff_base
- purchase_stock
- sale_stock
## Manifest Information
- **Name**: Account Cut-off Picking
- **Version**: 16.0.1.3.1
- **Category**: Accounting
- **License**: AGPL-3
- **Installable**: True
## Source
Based on [OCA/account-closing](https://github.com/OCA/account-closing) branch 16.0, addon `account_cutoff_picking`.
## 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
- 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,113 @@
=======================
Account Cut-off Picking
=======================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:f6091035b02278d297ac998f00f422f8401ea322060f472cf5b95083d4f2b4bf
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/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%2Faccount--closing-lightgray.png?logo=github
:target: https://github.com/OCA/account-closing/tree/16.0/account_cutoff_picking
:alt: OCA/account-closing
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/account-closing-16-0/account-closing-16-0-account_cutoff_picking
: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/account-closing&target_branch=16.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
This module generates expense/revenue accruals and prepaid expense/revenue based on the status of orders, pickings and invoices. The module is named *account_cutoff_accrual_picking* because it initially only supported accruals ; support for prepaid expense/revenue was added later (it should be renamed in later versions).
To understand the behavior of this module, let's take the example of an expense accrual. When you click on the button *Re-Generate Lines* of an *Expense Accrual*:
1. Odoo will look for all incoming picking in Done state with a *Transfer Date* <= *Cut-off Date*. For performance reasons, by default, the incoming picking dated before *Cut-off Date* minus 30 days will not be taken into account (this limit is configurable via the field *Picking Analysis*). It will go to the stock moves of those pickings and see if they are linked to a purchase order line.
2. Once this analysis is completed, Odoo has a list of purchase order lines to analyse for potential expense accrual.
3. For each of these purchase order lines, Odoo will:
- scan the related stock moves in *done* state and check their transfer date,
- scan the related invoices lines and check their invoice date.
4. If, for a particular purchase order line, the quantity of products received before the cutoff-date (or on the same day) minus the quantity of products invoiced before the cut-off date (or on the same day) is positive, Odoo will generate a cut-off line.
Now, let's take the example of a prepaid expense. When you click on the button *Re-Generate Lines* of a *Prepaid Expense*:
1. Odoo will look for all vendor bills dated before (or equal to) *Cut-off Date*. For performance reasons, by default, the vendor bills dated before *Cut-off Date* minus 30 days will not be taken into account (this limit is configurable via the field *Picking Analysis*). It will go to the invoice lines of those vendor bills and see if they are linked to a purchase order line.
2. Once this analysis is completed, Odoo has a list of purchase order lines to analyse for potential prepaid expense.
3. For each of these purchase order lines, Odoo will:
- scan the related stock moves in *done* state and check their transfer date,
- scan the related invoices lines and check their invoice date.
4. If, for a particular purchase order line, the quantity of products invoiced before the cutoff-date (or on the same day) minus the quantity of products received before the cut-off date (or on the same day) is positive, Odoo will generate a cut-off line.
This module should work well with multiple units of measure (including products purchased and invoiced in different units of measure) and in multi-currency.
**Table of contents**
.. contents::
:local:
Configuration
=============
For configuration instructions, refer to the README of the module *account_cutoff_base*.
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/account-closing/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/account-closing/issues/new?body=module:%20account_cutoff_picking%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
~~~~~~~
* Akretion
Contributors
~~~~~~~~~~~~
* Alexis de Lattre <alexis.delattre@akretion.com>
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-alexis-via| image:: https://github.com/alexis-via.png?size=40px
:target: https://github.com/alexis-via
:alt: alexis-via
Current `maintainer <https://odoo-community.org/page/maintainer-role>`__:
|maintainer-alexis-via|
This module is part of the `OCA/account-closing <https://github.com/OCA/account-closing/tree/16.0/account_cutoff_picking>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View file

@ -0,0 +1,2 @@
from . import models
from . import wizards

View file

@ -0,0 +1,23 @@
# Copyright 2013-2021 Akretion France (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
"name": "Account Cut-off Picking",
"version": "16.0.1.3.1",
"category": "Accounting",
"license": "AGPL-3",
"summary": "Accrued and prepaid expense/revenue from pickings",
"author": "Akretion,Odoo Community Association (OCA)",
"maintainers": ["alexis-via"],
"website": "https://github.com/OCA/account-closing",
"depends": ["account_cutoff_base", "purchase_stock", "sale_stock"],
"data": ["views/res_config_settings.xml", "views/account_cutoff.xml"],
"images": [
"images/accrued_expense_draft.jpg",
"images/accrued_expense_journal_entry.jpg",
"images/accrued_expense_done.jpg",
],
"installable": True,
"application": False,
}

View file

@ -0,0 +1,155 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_cutoff_picking
#
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: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
" • %(qty)s %(uom)s (picking %(picking)s transfered on %(date)s from "
"%(src_location)s to %(dest_location)s)"
msgstr ""
#. module: account_cutoff_picking
#: model:ir.model,name:account_cutoff_picking.model_account_cutoff
msgid "Account Cut-off"
msgstr ""
#. module: account_cutoff_picking
#: model:ir.model.fields,field_description:account_cutoff_picking.field_account_cutoff__picking_interval_days
#: model:ir.model.fields,field_description:account_cutoff_picking.field_res_company__default_cutoff_picking_interval_days
#: model:ir.model.fields,field_description:account_cutoff_picking.field_res_config_settings__dft_cutoff_picking_interval_days
msgid "Analysis Interval"
msgstr ""
#. module: account_cutoff_picking
#: model:ir.model,name:account_cutoff_picking.model_res_company
msgid "Companies"
msgstr ""
#. module: account_cutoff_picking
#: model:ir.model,name:account_cutoff_picking.model_res_config_settings
msgid "Config Settings"
msgstr ""
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
"Missing expense account on product '%(product)s' or on its related product "
"category '%(categ)s'."
msgstr ""
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
"Missing income account on product '%(product)s' or on its related product "
"category '%(categ)s'."
msgstr ""
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff delivered quantity details:"
msgstr ""
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff delivered quantity minus invoiced quantity:"
msgstr ""
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff delivered quantity:"
msgstr ""
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff invoiced quantity details:"
msgstr ""
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff invoiced quantity minus delivered quantity:"
msgstr ""
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff invoiced quantity:"
msgstr ""
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
"Purchase order %(order)s confirmed on %(confirm_date)s\n"
"Purchase Order Line: %(order_line)s (ordered qty: %(qty)s %(uom)s)"
msgstr ""
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
"Sale order %(order)s confirmed on %(confirm_date)s\n"
"Sale Order Line: %(order_line)s (ordered qty: %(qty)s %(uom)s)"
msgstr ""
#. module: account_cutoff_picking
#: model:ir.model.constraint,message:account_cutoff_picking.constraint_account_cutoff_picking_interval_days_positive
#: model:ir.model.constraint,message:account_cutoff_picking.constraint_res_company_cutoff_picking_interval_days_positive
msgid "The value of the field 'Analysis Interval' must be strictly positive."
msgstr ""
#. module: account_cutoff_picking
#: model:ir.model.fields,help:account_cutoff_picking.field_res_company__default_cutoff_picking_interval_days
#: model:ir.model.fields,help:account_cutoff_picking.field_res_config_settings__dft_cutoff_picking_interval_days
msgid ""
"To generate the accrual/prepaid revenue/expenses based on picking dates vs "
"invoice dates, Odoo will analyse all the pickings/invoices from N days "
"before the cutoff date up to the cutoff date. N is the Analysis Interval. If"
" you increase the analysis interval, Odoo will take more time to generate "
"the cutoff lines."
msgstr ""
#. module: account_cutoff_picking
#: model:ir.model.fields,help:account_cutoff_picking.field_account_cutoff__picking_interval_days
msgid ""
"To generate the cutoffs based on picking dates vs invoice dates, Odoo will "
"analyse all the pickings/invoices from N days before the cutoff date up to "
"the cutoff date. N is the Analysis Interval. If you increase the analysis "
"interval, Odoo will take more time to generate the cutoff lines."
msgstr ""
#. module: account_cutoff_picking
#: model_terms:ir.ui.view,arch_db:account_cutoff_picking.account_cutoff_form
#: model_terms:ir.ui.view,arch_db:account_cutoff_picking.res_config_settings_view_form
msgid "days"
msgstr ""

View file

@ -0,0 +1,155 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_cutoff_picking
#
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: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
" • %(qty)s %(uom)s (picking %(picking)s transfered on %(date)s from "
"%(src_location)s to %(dest_location)s)"
msgstr ""
#. module: account_cutoff_picking
#: model:ir.model,name:account_cutoff_picking.model_account_cutoff
msgid "Account Cut-off"
msgstr "Računovodstveno presjecanje"
#. module: account_cutoff_picking
#: model:ir.model.fields,field_description:account_cutoff_picking.field_account_cutoff__picking_interval_days
#: model:ir.model.fields,field_description:account_cutoff_picking.field_res_company__default_cutoff_picking_interval_days
#: model:ir.model.fields,field_description:account_cutoff_picking.field_res_config_settings__dft_cutoff_picking_interval_days
msgid "Analysis Interval"
msgstr "Interval analize"
#. module: account_cutoff_picking
#: model:ir.model,name:account_cutoff_picking.model_res_company
msgid "Companies"
msgstr "Kompanije"
#. module: account_cutoff_picking
#: model:ir.model,name:account_cutoff_picking.model_res_config_settings
msgid "Config Settings"
msgstr "Postavke"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
"Missing expense account on product '%(product)s' or on its related product "
"category '%(categ)s'."
msgstr ""
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
"Missing income account on product '%(product)s' or on its related product "
"category '%(categ)s'."
msgstr ""
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff delivered quantity details:"
msgstr "Detalji pred-presjecanje isporučene količine:"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff delivered quantity minus invoiced quantity:"
msgstr "Pred-presjecanje isporučene količine minus fakturisane količine:"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff delivered quantity:"
msgstr "Pred-presjecanje isporučene količine:"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff invoiced quantity details:"
msgstr "Detalji pred-presjecanje fakturisane količine:"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff invoiced quantity minus delivered quantity:"
msgstr "Pred-presjecanje fakturisane količine minus isporučene količine:"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff invoiced quantity:"
msgstr "Pred-presjecanje fakturisane količine:"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
"Purchase order %(order)s confirmed on %(confirm_date)s\n"
"Purchase Order Line: %(order_line)s (ordered qty: %(qty)s %(uom)s)"
msgstr ""
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
"Sale order %(order)s confirmed on %(confirm_date)s\n"
"Sale Order Line: %(order_line)s (ordered qty: %(qty)s %(uom)s)"
msgstr ""
#. module: account_cutoff_picking
#: model:ir.model.constraint,message:account_cutoff_picking.constraint_account_cutoff_picking_interval_days_positive
#: model:ir.model.constraint,message:account_cutoff_picking.constraint_res_company_cutoff_picking_interval_days_positive
msgid "The value of the field 'Analysis Interval' must be strictly positive."
msgstr "Vrijednost polja 'Interval analize' mora biti striktno pozitivna."
#. module: account_cutoff_picking
#: model:ir.model.fields,help:account_cutoff_picking.field_res_company__default_cutoff_picking_interval_days
#: model:ir.model.fields,help:account_cutoff_picking.field_res_config_settings__dft_cutoff_picking_interval_days
msgid ""
"To generate the accrual/prepaid revenue/expenses based on picking dates vs "
"invoice dates, Odoo will analyse all the pickings/invoices from N days "
"before the cutoff date up to the cutoff date. N is the Analysis Interval. If"
" you increase the analysis interval, Odoo will take more time to generate "
"the cutoff lines."
msgstr ""
#. module: account_cutoff_picking
#: model:ir.model.fields,help:account_cutoff_picking.field_account_cutoff__picking_interval_days
msgid ""
"To generate the cutoffs based on picking dates vs invoice dates, Odoo will "
"analyse all the pickings/invoices from N days before the cutoff date up to "
"the cutoff date. N is the Analysis Interval. If you increase the analysis "
"interval, Odoo will take more time to generate the cutoff lines."
msgstr ""
#. module: account_cutoff_picking
#: model_terms:ir.ui.view,arch_db:account_cutoff_picking.account_cutoff_form
#: model_terms:ir.ui.view,arch_db:account_cutoff_picking.res_config_settings_view_form
msgid "days"
msgstr "dana"

View file

@ -0,0 +1,182 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
# * account_cutoff_accrual_picking
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 7.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-02-23 14:37+0000\n"
"PO-Revision-Date: 2015-02-05 23:47+0100\n"
"Last-Translator: Rudolf Schnapka <rs@techno-flex.de>\n"
"Language-Team: \n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.5.4\n"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
" • %(qty)s %(uom)s (picking %(picking)s transfered on %(date)s from "
"%(src_location)s to %(dest_location)s)"
msgstr ""
#. module: account_cutoff_picking
#: model:ir.model,name:account_cutoff_picking.model_account_cutoff
msgid "Account Cut-off"
msgstr "Abgrenzungskonto"
#. module: account_cutoff_picking
#: model:ir.model.fields,field_description:account_cutoff_picking.field_account_cutoff__picking_interval_days
#: model:ir.model.fields,field_description:account_cutoff_picking.field_res_company__default_cutoff_picking_interval_days
#: model:ir.model.fields,field_description:account_cutoff_picking.field_res_config_settings__dft_cutoff_picking_interval_days
msgid "Analysis Interval"
msgstr ""
#. module: account_cutoff_picking
#: model:ir.model,name:account_cutoff_picking.model_res_company
msgid "Companies"
msgstr ""
#. module: account_cutoff_picking
#: model:ir.model,name:account_cutoff_picking.model_res_config_settings
msgid "Config Settings"
msgstr ""
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
"Missing expense account on product '%(product)s' or on its related product "
"category '%(categ)s'."
msgstr ""
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
"Missing income account on product '%(product)s' or on its related product "
"category '%(categ)s'."
msgstr ""
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff delivered quantity details:"
msgstr ""
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff delivered quantity minus invoiced quantity:"
msgstr ""
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff delivered quantity:"
msgstr ""
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff invoiced quantity details:"
msgstr ""
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff invoiced quantity minus delivered quantity:"
msgstr ""
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff invoiced quantity:"
msgstr ""
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
"Purchase order %(order)s confirmed on %(confirm_date)s\n"
"Purchase Order Line: %(order_line)s (ordered qty: %(qty)s %(uom)s)"
msgstr ""
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
"Sale order %(order)s confirmed on %(confirm_date)s\n"
"Sale Order Line: %(order_line)s (ordered qty: %(qty)s %(uom)s)"
msgstr ""
#. module: account_cutoff_picking
#: model:ir.model.constraint,message:account_cutoff_picking.constraint_account_cutoff_picking_interval_days_positive
#: model:ir.model.constraint,message:account_cutoff_picking.constraint_res_company_cutoff_picking_interval_days_positive
msgid "The value of the field 'Analysis Interval' must be strictly positive."
msgstr ""
#. module: account_cutoff_picking
#: model:ir.model.fields,help:account_cutoff_picking.field_res_company__default_cutoff_picking_interval_days
#: model:ir.model.fields,help:account_cutoff_picking.field_res_config_settings__dft_cutoff_picking_interval_days
msgid ""
"To generate the accrual/prepaid revenue/expenses based on picking dates vs "
"invoice dates, Odoo will analyse all the pickings/invoices from N days "
"before the cutoff date up to the cutoff date. N is the Analysis Interval. If "
"you increase the analysis interval, Odoo will take more time to generate the "
"cutoff lines."
msgstr ""
#. module: account_cutoff_picking
#: model:ir.model.fields,help:account_cutoff_picking.field_account_cutoff__picking_interval_days
msgid ""
"To generate the cutoffs based on picking dates vs invoice dates, Odoo will "
"analyse all the pickings/invoices from N days before the cutoff date up to "
"the cutoff date. N is the Analysis Interval. If you increase the analysis "
"interval, Odoo will take more time to generate the cutoff lines."
msgstr ""
#. module: account_cutoff_picking
#: model_terms:ir.ui.view,arch_db:account_cutoff_picking.account_cutoff_form
#: model_terms:ir.ui.view,arch_db:account_cutoff_picking.res_config_settings_view_form
msgid "days"
msgstr ""
#~ msgid "Missing '%s' on tax '%s'."
#~ msgstr "Fehlende '%s' bei Steuer '%s'."
#~ msgid "Account Cut-off Line"
#~ msgstr "Abgrenzungsposten"
#~ msgid "Product"
#~ msgstr "Produkt"
#~ msgid "Stock Move"
#~ msgstr "Lagerumbuchung"
#~ msgid "Re-Generate Lines from Picking"
#~ msgstr "Positionen aus Kommissionierung erneuern"
#~ msgid "Picking"
#~ msgstr "Entnahme"
#~ msgid "Date Done of the Picking"
#~ msgstr "Datum erledigter Kommissionierung"
#~ msgid "Error:"
#~ msgstr "Fehler:"

View file

@ -0,0 +1,179 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_cutoff_picking
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2023-06-28 19:09+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: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
" • %(qty)s %(uom)s (picking %(picking)s transfered on %(date)s from "
"%(src_location)s to %(dest_location)s)"
msgstr ""
" • %(qty)s %(uom)s (recogiendo %(picking)s transferido el %(date)s desde "
"%(src_location)s hasta %(dest_location)s)"
#. module: account_cutoff_picking
#: model:ir.model,name:account_cutoff_picking.model_account_cutoff
msgid "Account Cut-off"
msgstr "Cuenta de cierre"
#. module: account_cutoff_picking
#: model:ir.model.fields,field_description:account_cutoff_picking.field_account_cutoff__picking_interval_days
#: model:ir.model.fields,field_description:account_cutoff_picking.field_res_company__default_cutoff_picking_interval_days
#: model:ir.model.fields,field_description:account_cutoff_picking.field_res_config_settings__dft_cutoff_picking_interval_days
msgid "Analysis Interval"
msgstr "intervalo de análisis"
#. module: account_cutoff_picking
#: model:ir.model,name:account_cutoff_picking.model_res_company
msgid "Companies"
msgstr "Empresas"
#. module: account_cutoff_picking
#: model:ir.model,name:account_cutoff_picking.model_res_config_settings
msgid "Config Settings"
msgstr "ajustes de configuración"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
"Missing expense account on product '%(product)s' or on its related product "
"category '%(categ)s'."
msgstr ""
"Falta la cuenta de gastos en el producto' %(product)s' o en su categoría de "
"producto relacionada '%(categ)s'."
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
"Missing income account on product '%(product)s' or on its related product "
"category '%(categ)s'."
msgstr ""
"Falta la cuenta de ingresos en el producto' %(product)s' o en su categoría "
"de producto relacionada '%(categ)s'."
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff delivered quantity details:"
msgstr "Detalles de la cantidad entregada antes del cierre:"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff delivered quantity minus invoiced quantity:"
msgstr "Cantidad entregada antes del cierre menos cantidad facturada:"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff delivered quantity:"
msgstr "Cantidad entregada antes del cierre:"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff invoiced quantity details:"
msgstr "Detalles de la cantidad facturada antes del cierre:"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff invoiced quantity minus delivered quantity:"
msgstr "Cantidad facturada antes del cierre menos cantidad entregada:"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff invoiced quantity:"
msgstr "Cantidad facturada antes del cierre:"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
"Purchase order %(order)s confirmed on %(confirm_date)s\n"
"Purchase Order Line: %(order_line)s (ordered qty: %(qty)s %(uom)s)"
msgstr ""
"pedido%(order)s confirmado%(confirm_date)s\n"
"lí%(order_line)snea de pedido (cantidad pedida:%(qty)s%(uom)s"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
"Sale order %(order)s confirmed on %(confirm_date)s\n"
"Sale Order Line: %(order_line)s (ordered qty: %(qty)s %(uom)s)"
msgstr ""
"pedido de venta%(order)s confirmado el%(confirm_date)s\n"
"línea de pedido de venta: %(order_line)s (cantidad pedida%(qty)s%(uom)s)"
#. module: account_cutoff_picking
#: model:ir.model.constraint,message:account_cutoff_picking.constraint_account_cutoff_picking_interval_days_positive
#: model:ir.model.constraint,message:account_cutoff_picking.constraint_res_company_cutoff_picking_interval_days_positive
msgid "The value of the field 'Analysis Interval' must be strictly positive."
msgstr ""
"El valor del campo 'Intervalo de análisis' debe ser estrictamente positivo."
#. module: account_cutoff_picking
#: model:ir.model.fields,help:account_cutoff_picking.field_res_company__default_cutoff_picking_interval_days
#: model:ir.model.fields,help:account_cutoff_picking.field_res_config_settings__dft_cutoff_picking_interval_days
msgid ""
"To generate the accrual/prepaid revenue/expenses based on picking dates vs "
"invoice dates, Odoo will analyse all the pickings/invoices from N days "
"before the cutoff date up to the cutoff date. N is the Analysis Interval. If "
"you increase the analysis interval, Odoo will take more time to generate the "
"cutoff lines."
msgstr ""
"Para generar los ingresos/gastos devengados/prepagados basados en fechas de "
"recolección vs fechas de factura, Odoo analizará todas las recolecciones/"
"facturas desde N días antes de la fecha de cierre hasta la fecha de cierre. "
"N es el Intervalo de Análisis. Si incrementa el intervalo de análisis, Odoo "
"tomará mas tiempo para generar las líneas de cierre."
#. module: account_cutoff_picking
#: model:ir.model.fields,help:account_cutoff_picking.field_account_cutoff__picking_interval_days
msgid ""
"To generate the cutoffs based on picking dates vs invoice dates, Odoo will "
"analyse all the pickings/invoices from N days before the cutoff date up to "
"the cutoff date. N is the Analysis Interval. If you increase the analysis "
"interval, Odoo will take more time to generate the cutoff lines."
msgstr ""
"Para generar los cierres basados en fechas de recolección vs fechas de "
"factura, Odoo analizará todas las recolecciones/facturas desde N días antes "
"de la fecha de cierree hasta la fecha de cierre. N es el Intervalo de "
"Análisis. Si incrementa el intervalo de análisis, Odoo tomará más tiempo "
"para generar las líneas de cierre."
#. module: account_cutoff_picking
#: model_terms:ir.ui.view,arch_db:account_cutoff_picking.account_cutoff_form
#: model_terms:ir.ui.view,arch_db:account_cutoff_picking.res_config_settings_view_form
msgid "days"
msgstr "días"

View file

@ -0,0 +1,172 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_cutoff_picking
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-04-18 11:34+0000\n"
"Last-Translator: Mostafa Barmshory <mostafa.barmshory@gmail.com>\n"
"Language-Team: none\n"
"Language: fa\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: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
" • %(qty)s %(uom)s (picking %(picking)s transfered on %(date)s from "
"%(src_location)s to %(dest_location)s)"
msgstr ""
" %(qty)s%(uom)s انتخاب%(picking)sانتقال داده شده روی %(date)s "
"از%(src_location)s به %(dest_location)s"
#. module: account_cutoff_picking
#: model:ir.model,name:account_cutoff_picking.model_account_cutoff
msgid "Account Cut-off"
msgstr "بستن حساب"
#. module: account_cutoff_picking
#: model:ir.model.fields,field_description:account_cutoff_picking.field_account_cutoff__picking_interval_days
#: model:ir.model.fields,field_description:account_cutoff_picking.field_res_company__default_cutoff_picking_interval_days
#: model:ir.model.fields,field_description:account_cutoff_picking.field_res_config_settings__dft_cutoff_picking_interval_days
msgid "Analysis Interval"
msgstr "بازه تحلیلی"
#. module: account_cutoff_picking
#: model:ir.model,name:account_cutoff_picking.model_res_company
msgid "Companies"
msgstr "شرکت‌ها"
#. module: account_cutoff_picking
#: model:ir.model,name:account_cutoff_picking.model_res_config_settings
msgid "Config Settings"
msgstr "تنظیمات پیکربندی"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
"Missing expense account on product '%(product)s' or on its related product "
"category '%(categ)s'."
msgstr "عدم درج هزینه‌ روی محصول %(product)sیا دسته‌بندی محصول%(categ)s."
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
"Missing income account on product '%(product)s' or on its related product "
"category '%(categ)s'."
msgstr "عدم درج حساب درآمد روی محصول %(product)s یا دسته‌بندی محصول%(categ)s."
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff delivered quantity details:"
msgstr "جزئیات مقدار محصول تحویل داده شده پیش از بستن حساب:"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff delivered quantity minus invoiced quantity:"
msgstr "مقدار محصول تحویل داده شده پیش از بستن حساب منهای مقدار فاکتور شده:"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff delivered quantity:"
msgstr "مقدار محصول تحویل داده شده پیش از بستن حساب:"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff invoiced quantity details:"
msgstr "جزئیات مقدار محصول فاکتور شده پیش از بستن حساب:"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff invoiced quantity minus delivered quantity:"
msgstr "مقدار محصول فاکتور شده پیش از بستن حساب منهای مقدار تحویل داده شده:"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff invoiced quantity:"
msgstr "مقدار محصول فاکتور شده پیش از بستن حساب:"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
"Purchase order %(order)s confirmed on %(confirm_date)s\n"
"Purchase Order Line: %(order_line)s (ordered qty: %(qty)s %(uom)s)"
msgstr ""
"سفارش خرید %(order)s تأیید شده در%(confirm_date)s\n"
"خط سفارش خرید: %(order_line)s (مقدار سفارش داده شده): %(qty)s%(uom)s"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
"Sale order %(order)s confirmed on %(confirm_date)s\n"
"Sale Order Line: %(order_line)s (ordered qty: %(qty)s %(uom)s)"
msgstr ""
"سفارش فروش %(order)s تأیید شده در %(confirm_date)s\n"
"خط سفارش فروش: %(order_line)s (مقدار سفارش داده شده: %(qty)s%(uom)s"
#. module: account_cutoff_picking
#: model:ir.model.constraint,message:account_cutoff_picking.constraint_account_cutoff_picking_interval_days_positive
#: model:ir.model.constraint,message:account_cutoff_picking.constraint_res_company_cutoff_picking_interval_days_positive
msgid "The value of the field 'Analysis Interval' must be strictly positive."
msgstr "ارزش «بازه‌ی تحلیلی» باید حتما مثبت باشد."
#. module: account_cutoff_picking
#: model:ir.model.fields,help:account_cutoff_picking.field_res_company__default_cutoff_picking_interval_days
#: model:ir.model.fields,help:account_cutoff_picking.field_res_config_settings__dft_cutoff_picking_interval_days
msgid ""
"To generate the accrual/prepaid revenue/expenses based on picking dates vs "
"invoice dates, Odoo will analyse all the pickings/invoices from N days "
"before the cutoff date up to the cutoff date. N is the Analysis Interval. If"
" you increase the analysis interval, Odoo will take more time to generate "
"the cutoff lines."
msgstr ""
"برای ایجاد درآمد تحقق نیافته/از پیش پرداخت شده بر روی تاریخ‌های انتخابی و "
"تاریخ‌های صدور فاکتورکلیک کنید، اودوو تمام تاریخ‌ها را از N روز قبل از تاریخ "
"بستن حساب تا تاریخ بستن حساب تحلیل می‌کند.N بازه‌ی تحلیل است. اگر بازه‌ی "
"تحلیل را افزایش دهید، اودوو زمان بیشتری را صرف خطوط بستن حساب می‌کند."
#. module: account_cutoff_picking
#: model:ir.model.fields,help:account_cutoff_picking.field_account_cutoff__picking_interval_days
msgid ""
"To generate the cutoffs based on picking dates vs invoice dates, Odoo will "
"analyse all the pickings/invoices from N days before the cutoff date up to "
"the cutoff date. N is the Analysis Interval. If you increase the analysis "
"interval, Odoo will take more time to generate the cutoff lines."
msgstr ""
"برای بستن حساب در تاریخ‌های انتخابی و یا تاریخ‌های صدور فاکتور، اودوو تمام "
"تاریخ‌ها را N روز قبل از تاریخ بستن حساب تا تاریخ بستن حساب تحلیل می‌کند. N "
"بازه‌ی تحلیل است. اگر بازه‌ی تحلیل را افزایش دهید، اودوو زمان بیشتری را صرف "
"ایجاد خطوط بستن حساب می‌کند."
#. module: account_cutoff_picking
#: model_terms:ir.ui.view,arch_db:account_cutoff_picking.account_cutoff_form
#: model_terms:ir.ui.view,arch_db:account_cutoff_picking.res_config_settings_view_form
msgid "days"
msgstr "روزها"

View file

@ -0,0 +1,188 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_cutoff_picking
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2023-06-20 15:08+0000\n"
"Last-Translator: Alexis de Lattre <alexis@via.ecp.fr>\n"
"Language-Team: none\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.17\n"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
" • %(qty)s %(uom)s (picking %(picking)s transfered on %(date)s from "
"%(src_location)s to %(dest_location)s)"
msgstr ""
" • %(qty)s %(uom)s (bon de transfert %(picking)s validé le %(date)s de "
"%(src_location)s à %(dest_location)s)"
#. module: account_cutoff_picking
#: model:ir.model,name:account_cutoff_picking.model_account_cutoff
msgid "Account Cut-off"
msgstr "Provision comptable"
#. module: account_cutoff_picking
#: model:ir.model.fields,field_description:account_cutoff_picking.field_account_cutoff__picking_interval_days
#: model:ir.model.fields,field_description:account_cutoff_picking.field_res_company__default_cutoff_picking_interval_days
#: model:ir.model.fields,field_description:account_cutoff_picking.field_res_config_settings__dft_cutoff_picking_interval_days
msgid "Analysis Interval"
msgstr "Intervalle d'analyse"
#. module: account_cutoff_picking
#: model:ir.model,name:account_cutoff_picking.model_res_company
msgid "Companies"
msgstr "Sociétés"
#. module: account_cutoff_picking
#: model:ir.model,name:account_cutoff_picking.model_res_config_settings
msgid "Config Settings"
msgstr "Configuration"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
"Missing expense account on product '%(product)s' or on its related product "
"category '%(categ)s'."
msgstr ""
"Compte de charge manquant sur l'article '%(product)s' ou sur sa catégorie "
"d'article associée '%(categ)s'."
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
"Missing income account on product '%(product)s' or on its related product "
"category '%(categ)s'."
msgstr ""
"Compte de revenu manquant sur l'article '%(product)s' ou sur sa catégorie "
"d'article associée '%(categ)s'."
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff delivered quantity details:"
msgstr "Détails des quantités livrées jusqu'à la date de provision :"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff delivered quantity minus invoiced quantity:"
msgstr "Quantités livrées moins qtés facturées jusqu'à la date de provision :"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff delivered quantity:"
msgstr "Quantités livrées jusqu'à la date de provision :"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff invoiced quantity details:"
msgstr "Détails des quantités facturées jusqu'à la date de provision :"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff invoiced quantity minus delivered quantity:"
msgstr "Quantité facturée moins quantité livrée jusqu'à la date de provision :"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff invoiced quantity:"
msgstr "Quantité facturée jusqu'à la date de provision :"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
"Purchase order %(order)s confirmed on %(confirm_date)s\n"
"Purchase Order Line: %(order_line)s (ordered qty: %(qty)s %(uom)s)"
msgstr ""
"Commande fournisseur %(order)s confirmée le %(confirm_date)s\n"
"Ligne de commande fournisseur : %(order_line)s (quantité commandée : %(qty)s "
"%(uom)s)"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
"Sale order %(order)s confirmed on %(confirm_date)s\n"
"Sale Order Line: %(order_line)s (ordered qty: %(qty)s %(uom)s)"
msgstr ""
"Commande client %(order)s confirmée le %(confirm_date)s\n"
"Ligne de commande client : %(order_line)s (quantité commandée : %(qty)s "
"%(uom)s)"
#. module: account_cutoff_picking
#: model:ir.model.constraint,message:account_cutoff_picking.constraint_account_cutoff_picking_interval_days_positive
#: model:ir.model.constraint,message:account_cutoff_picking.constraint_res_company_cutoff_picking_interval_days_positive
msgid "The value of the field 'Analysis Interval' must be strictly positive."
msgstr ""
"La valeur du champ \"Intervalle d'analyse\" doit être strictement positive."
#. module: account_cutoff_picking
#: model:ir.model.fields,help:account_cutoff_picking.field_res_company__default_cutoff_picking_interval_days
#: model:ir.model.fields,help:account_cutoff_picking.field_res_config_settings__dft_cutoff_picking_interval_days
msgid ""
"To generate the accrual/prepaid revenue/expenses based on picking dates vs "
"invoice dates, Odoo will analyse all the pickings/invoices from N days "
"before the cutoff date up to the cutoff date. N is the Analysis Interval. If "
"you increase the analysis interval, Odoo will take more time to generate the "
"cutoff lines."
msgstr ""
"Pour générer les provisions de produits et charges à partir de la "
"comparaison entre les dates de livraison et les dates de facturation, Odoo "
"analysera tous les livraisons/factures depuis N jours avant la date de "
"provision jusqu'à la date de provision. N est l'intervalle d'analyse. Si "
"vous augmentez l'intervalle d'analyse, Odoo mettra plus de temps pour "
"générer les lignes de provision."
#. module: account_cutoff_picking
#: model:ir.model.fields,help:account_cutoff_picking.field_account_cutoff__picking_interval_days
msgid ""
"To generate the cutoffs based on picking dates vs invoice dates, Odoo will "
"analyse all the pickings/invoices from N days before the cutoff date up to "
"the cutoff date. N is the Analysis Interval. If you increase the analysis "
"interval, Odoo will take more time to generate the cutoff lines."
msgstr ""
"Pour générer les provisions à partir de la comparaison entre les dates de "
"livraison et les dates de facturation, Odoo analysera toutes les livraisons/"
"factures à partir de N jours avant la date de provision jusqu'à la date de "
"provision. N est l'intervalle d'analyse. Si vous augmentez l'intervalle "
"d'analyse, Odoo prendra plus de temps pour générer les lignes de provision."
#. module: account_cutoff_picking
#: model_terms:ir.ui.view,arch_db:account_cutoff_picking.account_cutoff_form
#: model_terms:ir.ui.view,arch_db:account_cutoff_picking.res_config_settings_view_form
msgid "days"
msgstr "jours"
#~ msgid "Display Name"
#~ msgstr "Nom affiché"
#~ msgid "Last Modified on"
#~ msgstr "Dernière modification le"

View file

@ -0,0 +1,157 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_cutoff_accrual_picking
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-02-23 14:37+0000\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: fr_BE\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
" • %(qty)s %(uom)s (picking %(picking)s transfered on %(date)s from "
"%(src_location)s to %(dest_location)s)"
msgstr ""
#. module: account_cutoff_picking
#: model:ir.model,name:account_cutoff_picking.model_account_cutoff
msgid "Account Cut-off"
msgstr ""
#. module: account_cutoff_picking
#: model:ir.model.fields,field_description:account_cutoff_picking.field_account_cutoff__picking_interval_days
#: model:ir.model.fields,field_description:account_cutoff_picking.field_res_company__default_cutoff_picking_interval_days
#: model:ir.model.fields,field_description:account_cutoff_picking.field_res_config_settings__dft_cutoff_picking_interval_days
msgid "Analysis Interval"
msgstr ""
#. module: account_cutoff_picking
#: model:ir.model,name:account_cutoff_picking.model_res_company
msgid "Companies"
msgstr ""
#. module: account_cutoff_picking
#: model:ir.model,name:account_cutoff_picking.model_res_config_settings
msgid "Config Settings"
msgstr ""
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
"Missing expense account on product '%(product)s' or on its related product "
"category '%(categ)s'."
msgstr ""
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
"Missing income account on product '%(product)s' or on its related product "
"category '%(categ)s'."
msgstr ""
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff delivered quantity details:"
msgstr ""
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff delivered quantity minus invoiced quantity:"
msgstr ""
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff delivered quantity:"
msgstr ""
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff invoiced quantity details:"
msgstr ""
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff invoiced quantity minus delivered quantity:"
msgstr ""
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff invoiced quantity:"
msgstr ""
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
"Purchase order %(order)s confirmed on %(confirm_date)s\n"
"Purchase Order Line: %(order_line)s (ordered qty: %(qty)s %(uom)s)"
msgstr ""
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
"Sale order %(order)s confirmed on %(confirm_date)s\n"
"Sale Order Line: %(order_line)s (ordered qty: %(qty)s %(uom)s)"
msgstr ""
#. module: account_cutoff_picking
#: model:ir.model.constraint,message:account_cutoff_picking.constraint_account_cutoff_picking_interval_days_positive
#: model:ir.model.constraint,message:account_cutoff_picking.constraint_res_company_cutoff_picking_interval_days_positive
msgid "The value of the field 'Analysis Interval' must be strictly positive."
msgstr ""
#. module: account_cutoff_picking
#: model:ir.model.fields,help:account_cutoff_picking.field_res_company__default_cutoff_picking_interval_days
#: model:ir.model.fields,help:account_cutoff_picking.field_res_config_settings__dft_cutoff_picking_interval_days
msgid ""
"To generate the accrual/prepaid revenue/expenses based on picking dates vs "
"invoice dates, Odoo will analyse all the pickings/invoices from N days "
"before the cutoff date up to the cutoff date. N is the Analysis Interval. If "
"you increase the analysis interval, Odoo will take more time to generate the "
"cutoff lines."
msgstr ""
#. module: account_cutoff_picking
#: model:ir.model.fields,help:account_cutoff_picking.field_account_cutoff__picking_interval_days
msgid ""
"To generate the cutoffs based on picking dates vs invoice dates, Odoo will "
"analyse all the pickings/invoices from N days before the cutoff date up to "
"the cutoff date. N is the Analysis Interval. If you increase the analysis "
"interval, Odoo will take more time to generate the cutoff lines."
msgstr ""
#. module: account_cutoff_picking
#: model_terms:ir.ui.view,arch_db:account_cutoff_picking.account_cutoff_form
#: model_terms:ir.ui.view,arch_db:account_cutoff_picking.res_config_settings_view_form
msgid "days"
msgstr ""

View file

@ -0,0 +1,201 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_cutoff_accrual_picking
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-02-23 14:37+0000\n"
"PO-Revision-Date: 2025-05-15 12:23+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.4\n"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
" • %(qty)s %(uom)s (picking %(picking)s transfered on %(date)s from "
"%(src_location)s to %(dest_location)s)"
msgstr ""
" • %(qty)s %(uom)s (prelievo %(picking)s trasferito il %(date)s dal "
"%(src_location)s a %(dest_location)s)"
#. module: account_cutoff_picking
#: model:ir.model,name:account_cutoff_picking.model_account_cutoff
msgid "Account Cut-off"
msgstr "Scritture di fine periodo"
#. module: account_cutoff_picking
#: model:ir.model.fields,field_description:account_cutoff_picking.field_account_cutoff__picking_interval_days
#: model:ir.model.fields,field_description:account_cutoff_picking.field_res_company__default_cutoff_picking_interval_days
#: model:ir.model.fields,field_description:account_cutoff_picking.field_res_config_settings__dft_cutoff_picking_interval_days
msgid "Analysis Interval"
msgstr "Intervallo analisi"
#. module: account_cutoff_picking
#: model:ir.model,name:account_cutoff_picking.model_res_company
msgid "Companies"
msgstr "Aziende"
#. module: account_cutoff_picking
#: model:ir.model,name:account_cutoff_picking.model_res_config_settings
msgid "Config Settings"
msgstr "Impostazioni di configurazione"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
"Missing expense account on product '%(product)s' or on its related product "
"category '%(categ)s'."
msgstr ""
"Conto di costo mancante per il prodotto '%(product)s' o per la categoria "
"prodotto correlata '%(categ)s'."
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
"Missing income account on product '%(product)s' or on its related product "
"category '%(categ)s'."
msgstr ""
"Conto di ricavo mancante per il prodotto '%(product)s' o per la categoria "
"prodotto correlata '%(categ)s'."
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff delivered quantity details:"
msgstr "Dettagli quantità consegnata pre-limite:"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff delivered quantity minus invoiced quantity:"
msgstr "Quantità consegnata pre-limite meno la quantità fatturata:"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff delivered quantity:"
msgstr "Quantità consegnata pre-limite:"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff invoiced quantity details:"
msgstr "Dettagli quantità fatturata pre-limite:"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff invoiced quantity minus delivered quantity:"
msgstr "Dettagli quantità fatturata pre-limite meno quantità consegnata:"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff invoiced quantity:"
msgstr "Quantità fatturata pre-limite:"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
"Purchase order %(order)s confirmed on %(confirm_date)s\n"
"Purchase Order Line: %(order_line)s (ordered qty: %(qty)s %(uom)s)"
msgstr ""
"Ordine acquisto %(order)s confermato il %(confirm_date)s\n"
"Riga ordine consegna: %(order_line)s (q.tà ordinata: %(qty)s %(uom)s)"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
"Sale order %(order)s confirmed on %(confirm_date)s\n"
"Sale Order Line: %(order_line)s (ordered qty: %(qty)s %(uom)s)"
msgstr ""
"Ordine di vendita %(order)s confermato il %(confirm_date)s\n"
"Riga ordine di vendita: %(order_line)s (q.tà ordinata: %(qty)s %(uom)s)"
#. module: account_cutoff_picking
#: model:ir.model.constraint,message:account_cutoff_picking.constraint_account_cutoff_picking_interval_days_positive
#: model:ir.model.constraint,message:account_cutoff_picking.constraint_res_company_cutoff_picking_interval_days_positive
msgid "The value of the field 'Analysis Interval' must be strictly positive."
msgstr ""
"Il valore del campo \"Intervallo analisi\" deve essere strettamente positivo."
#. module: account_cutoff_picking
#: model:ir.model.fields,help:account_cutoff_picking.field_res_company__default_cutoff_picking_interval_days
#: model:ir.model.fields,help:account_cutoff_picking.field_res_config_settings__dft_cutoff_picking_interval_days
msgid ""
"To generate the accrual/prepaid revenue/expenses based on picking dates vs "
"invoice dates, Odoo will analyse all the pickings/invoices from N days "
"before the cutoff date up to the cutoff date. N is the Analysis Interval. If "
"you increase the analysis interval, Odoo will take more time to generate the "
"cutoff lines."
msgstr ""
"Per generare i ricavi/spese accumulati/prepagati in base alle date dei "
"prelievi rispetto alle date fattura, Odoo analizzerà tutti prelievi/fatture "
"da N giorni prima la data limite fino alla data limite. N è l'intervallo di "
"analisi. Se si incrementa l'intervallo di analisi, Odoo impiegherà più tempo "
"per generare le righe limite."
#. module: account_cutoff_picking
#: model:ir.model.fields,help:account_cutoff_picking.field_account_cutoff__picking_interval_days
msgid ""
"To generate the cutoffs based on picking dates vs invoice dates, Odoo will "
"analyse all the pickings/invoices from N days before the cutoff date up to "
"the cutoff date. N is the Analysis Interval. If you increase the analysis "
"interval, Odoo will take more time to generate the cutoff lines."
msgstr ""
"Per generare le soglie in base alle date dei prelievi rispetto alle date "
"fattura, Odoo analizzerà tutti prelievi/fatture da N giorni prima la data "
"limite fino alla data limite. N è l'intervallo di analisi. Se si incrementa "
"l'intervallo di analisi, Odoo imiegherà più tempo per generare le righe "
"limite."
#. module: account_cutoff_picking
#: model_terms:ir.ui.view,arch_db:account_cutoff_picking.account_cutoff_form
#: model_terms:ir.ui.view,arch_db:account_cutoff_picking.res_config_settings_view_form
msgid "days"
msgstr "giorni"
#~ msgid "%s: %s"
#~ msgstr "%s: %s"
#~ msgid "Display Name"
#~ msgstr "Nome visualizzato"
#~ msgid "ID"
#~ msgstr "ID"
#~ msgid "Last Modified on"
#~ msgstr "Ultima modifica il"
#~ msgid ""
#~ "To generate the accruals based on pickings, Odoo will analyse all the "
#~ "pickings between the cutoff date and N days before. N is the Picking "
#~ "Analysis Interval."
#~ msgstr ""
#~ "Per generare le competenze in base ai prelievi, Odoo analizza tutti "
#~ "quelli tra la data di separazione e gli N giorni precedenti. N "
#~ "corrisponde all'intervallo di analisi dei prelievi."

View file

@ -0,0 +1,178 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_cutoff_picking
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-02-27 10:36+0000\n"
"Last-Translator: jakobkrabbe <jakob@syscare.se>\n"
"Language-Team: none\n"
"Language: sv\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: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
" • %(qty)s %(uom)s (picking %(picking)s transfered on %(date)s from "
"%(src_location)s to %(dest_location)s)"
msgstr ""
" - %(qty)s %(uom)s (plockning %(picking)s överförd den %(date)s från "
"%(src_location)s till %(dest_location)s)"
#. module: account_cutoff_picking
#: model:ir.model,name:account_cutoff_picking.model_account_cutoff
msgid "Account Cut-off"
msgstr "Avstängning av konto"
#. module: account_cutoff_picking
#: model:ir.model.fields,field_description:account_cutoff_picking.field_account_cutoff__picking_interval_days
#: model:ir.model.fields,field_description:account_cutoff_picking.field_res_company__default_cutoff_picking_interval_days
#: model:ir.model.fields,field_description:account_cutoff_picking.field_res_config_settings__dft_cutoff_picking_interval_days
msgid "Analysis Interval"
msgstr "Analysintervall"
#. module: account_cutoff_picking
#: model:ir.model,name:account_cutoff_picking.model_res_company
msgid "Companies"
msgstr "Företag"
#. module: account_cutoff_picking
#: model:ir.model,name:account_cutoff_picking.model_res_config_settings
msgid "Config Settings"
msgstr "Konfigurationsinställningar"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
"Missing expense account on product '%(product)s' or on its related product "
"category '%(categ)s'."
msgstr ""
"Saknar kostnadskonto på produkten '%(product)s' eller på dess relaterade "
"produktkategori '%(categ)s'."
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
"Missing income account on product '%(product)s' or on its related product "
"category '%(categ)s'."
msgstr ""
"Saknar inkomstkonto på produkten '%(product)s' eller på dess relaterade "
"produktkategori '%(categ)s'."
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff delivered quantity details:"
msgstr "Detaljer om levererad kvantitet före avskärning:"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff delivered quantity minus invoiced quantity:"
msgstr "Levererad kvantitet före avskärning minus fakturerad kvantitet:"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff delivered quantity:"
msgstr "Levererad kvantitet före avskärning:"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff invoiced quantity details:"
msgstr "Uppgifter om fakturerad kvantitet före avräkning:"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff invoiced quantity minus delivered quantity:"
msgstr "Fakturerad kvantitet före avskärning minus levererad kvantitet:"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid "Pre-cutoff invoiced quantity:"
msgstr "Fakturerad kvantitet före avräkning:"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
"Purchase order %(order)s confirmed on %(confirm_date)s\n"
"Purchase Order Line: %(order_line)s (ordered qty: %(qty)s %(uom)s)"
msgstr ""
"Inköpsorder %(order)s bekräftad den %(confirm_date)s\n"
"Inköpsorderrad: %(order_line)s (beställt antal: %(qty)s %(uom)s)"
#. module: account_cutoff_picking
#. odoo-python
#: code:addons/account_cutoff_picking/models/account_cutoff.py:0
#, python-format
msgid ""
"Sale order %(order)s confirmed on %(confirm_date)s\n"
"Sale Order Line: %(order_line)s (ordered qty: %(qty)s %(uom)s)"
msgstr ""
"Försäljningsorder %(order)s bekräftad den %(confirm_date)s\n"
"Orderrad: %(order_line)s (beställt antal: %(qty)s %(uom)s)"
#. module: account_cutoff_picking
#: model:ir.model.constraint,message:account_cutoff_picking.constraint_account_cutoff_picking_interval_days_positive
#: model:ir.model.constraint,message:account_cutoff_picking.constraint_res_company_cutoff_picking_interval_days_positive
msgid "The value of the field 'Analysis Interval' must be strictly positive."
msgstr "Värdet på fältet \"Analysis Interval\" måste vara strikt positivt."
#. module: account_cutoff_picking
#: model:ir.model.fields,help:account_cutoff_picking.field_res_company__default_cutoff_picking_interval_days
#: model:ir.model.fields,help:account_cutoff_picking.field_res_config_settings__dft_cutoff_picking_interval_days
msgid ""
"To generate the accrual/prepaid revenue/expenses based on picking dates vs "
"invoice dates, Odoo will analyse all the pickings/invoices from N days "
"before the cutoff date up to the cutoff date. N is the Analysis Interval. If"
" you increase the analysis interval, Odoo will take more time to generate "
"the cutoff lines."
msgstr ""
"För att generera periodiserade/förutbetalda intäkter/kostnader baserat på "
"plockdatum vs fakturadatum, kommer Odoo att analysera alla plockningar/"
"fakturor från N dagar före brytdatumet fram till brytdatumet. N är "
"analysintervallet. Om du ökar analysintervallet kommer Odoo att ta längre "
"tid på sig att generera avgränsningslinjerna."
#. module: account_cutoff_picking
#: model:ir.model.fields,help:account_cutoff_picking.field_account_cutoff__picking_interval_days
msgid ""
"To generate the cutoffs based on picking dates vs invoice dates, Odoo will "
"analyse all the pickings/invoices from N days before the cutoff date up to "
"the cutoff date. N is the Analysis Interval. If you increase the analysis "
"interval, Odoo will take more time to generate the cutoff lines."
msgstr ""
"För att generera gränsvärden baserat på plockdatum vs fakturadatum, kommer "
"Odoo att analysera alla plockningar / fakturor från N dagar före "
"gränsdatumet fram till gränsdatumet. N är analysintervallet. Om du ökar "
"analysintervallet kommer Odoo att ta längre tid på sig att generera "
"gränslinjerna."
#. module: account_cutoff_picking
#: model_terms:ir.ui.view,arch_db:account_cutoff_picking.account_cutoff_form
#: model_terms:ir.ui.view,arch_db:account_cutoff_picking.res_config_settings_view_form
msgid "days"
msgstr "dagar"

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

View file

@ -0,0 +1,23 @@
# Copyright 2023 Akretion France (http://www.akretion.com/)
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from openupgradelib import openupgrade
@openupgrade.migrate()
def migrate(env, version):
if not openupgrade.column_exists(
env.cr, "res_company", "default_cutoff_picking_interval_days"
):
openupgrade.rename_fields(
env,
[
(
"res.company",
"res_company",
"default_cutoff_accrual_picking_interval_days",
"default_cutoff_picking_interval_days",
),
],
)

View file

@ -0,0 +1,2 @@
from . import res_company
from . import account_cutoff

View file

@ -0,0 +1,495 @@
# Copyright 2013-2021 Akretion France (http://www.akretion.com/)
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from datetime import datetime
import pytz
from dateutil.relativedelta import relativedelta
from odoo import _, api, fields, models
from odoo.exceptions import UserError
from odoo.tools import float_compare, float_is_zero
from odoo.tools.misc import format_date, format_datetime, formatLang
class AccountCutoff(models.Model):
_inherit = "account.cutoff"
picking_interval_days = fields.Integer(
string="Analysis Interval",
default=lambda self: self._default_picking_interval_days(),
states={"done": [("readonly", True)]},
tracking=True,
help="To generate the cutoffs based on picking "
"dates vs invoice dates, Odoo will analyse all the pickings/invoices from "
"N days before the cutoff date up to the cutoff date. "
"N is the Analysis Interval. If you increase the analysis interval, "
"Odoo will take more time to generate the cutoff lines.",
)
_sql_constraints = [
(
"picking_interval_days_positive",
"CHECK(picking_interval_days > 0)",
"The value of the field 'Analysis Interval' must be strictly positive.",
)
]
@api.model
def _default_picking_interval_days(self):
return self.env.company.default_cutoff_picking_interval_days
def picking_prepare_cutoff_line(self, vdict, account_mapping):
dpo = self.env["decimal.precision"]
qty_prec = dpo.precision_get("Product Unit of Measure")
price_prec = dpo.precision_get("Product Price")
if self.cutoff_type in ("accrued_expense", "accrued_revenue"):
qty = vdict["precut_delivered_qty"] - vdict["precut_invoiced_qty"]
qty_label = _("Pre-cutoff delivered quantity minus invoiced quantity:")
elif self.cutoff_type in ("prepaid_expense", "prepaid_revenue"):
qty = vdict["precut_invoiced_qty"] - vdict["precut_delivered_qty"]
qty_label = _("Pre-cutoff invoiced quantity minus delivered quantity:")
if float_compare(qty, 0, precision_digits=qty_prec) <= 0 or float_is_zero(
vdict["price_unit"], precision_digits=price_prec
):
return False
company_currency = self.company_currency_id
currency = vdict["currency"]
sign = self.cutoff_type in ("accrued_expense", "prepaid_revenue") and -1 or 1
amount = qty * vdict["price_unit"] * sign
amount_company_currency = vdict["currency"]._convert(
amount, company_currency, self.company_id, self.cutoff_date
)
# Use account mapping
account_id = vdict["account_id"]
if account_id in account_mapping:
cutoff_account_id = account_mapping[account_id]
else:
cutoff_account_id = account_id
uom_name = vdict["product"].uom_id.name
notes = vdict["notes"]
precut_delivered_qty_fl = formatLang(
self.env, vdict.get("precut_delivered_qty", 0), dp="Product Unit of Measure"
)
notes += (
"\n"
+ _("Pre-cutoff delivered quantity:")
+ " %s %s"
% (
precut_delivered_qty_fl,
uom_name,
)
)
if vdict.get("precut_delivered_logs"):
notes += (
"\n"
+ _("Pre-cutoff delivered quantity details:")
+ "\n%s" % "\n".join(vdict["precut_delivered_logs"])
)
precut_invoiced_qty_fl = formatLang(
self.env, vdict.get("precut_invoiced_qty", 0), dp="Product Unit of Measure"
)
notes += (
"\n"
+ _("Pre-cutoff invoiced quantity:")
+ " %s %s" % (precut_invoiced_qty_fl, uom_name)
)
if vdict.get("precut_invoiced_logs"):
notes += (
"\n"
+ _("Pre-cutoff invoiced quantity details:")
+ "\n%s" % "\n".join(vdict["precut_invoiced_logs"])
)
qty_fl = formatLang(self.env, qty, dp="Product Unit of Measure")
notes += "\n%s %s %s" % (qty_label, qty_fl, uom_name)
vals = {
"parent_id": self.id,
"partner_id": vdict["partner"].id,
"name": vdict["name"],
"account_id": account_id,
"cutoff_account_id": cutoff_account_id,
"analytic_distribution": vdict["analytic_distribution"],
"currency_id": vdict["currency"].id,
"quantity": qty,
"price_unit": vdict["price_unit"],
"amount": amount,
"cutoff_amount": amount_company_currency,
"price_origin": vdict.get("price_origin"),
"notes": notes,
}
if (
self.cutoff_type in ("accrued_expense", "accrued_revenue")
and vdict["taxes"]
and self.company_id.accrual_taxes
):
# vdict["price_unit"] is a price without tax,
# so I set handle_price_include=False
tax_compute_all_res = vdict["taxes"].compute_all(
vdict["price_unit"],
currency=currency,
quantity=qty * sign,
product=vdict["product"],
partner=vdict["partner"],
handle_price_include=False,
)
vals["tax_line_ids"] = self._prepare_tax_lines(
tax_compute_all_res, self.company_currency_id
)
return vals
def order_line_update_oline_dict(
self, order_line, order_type, oline_dict, cutoff_datetime
):
assert order_line not in oline_dict
order = order_line.order_id # same on PO and SO
oline_dict[order_line] = {
"precut_delivered_qty": 0.0, # in product_uom
"precut_delivered_logs": [],
"precut_invoiced_qty": 0.0, # in product_uom
"precut_invoiced_logs": [],
"name": ": ".join([order.name, order_line.name]),
"product": order_line.product_id,
"partner": order.partner_id.commercial_partner_id,
"notes": "",
"price_unit": 0.0,
"price_origin": False,
"currency": False,
"analytic_distribution": False,
"account_id": False,
"taxes": False,
}
self.order_line_update_oline_dict_from_stock_moves(
order_line, order_type, oline_dict, cutoff_datetime
)
self.order_line_update_oline_dict_from_invoice_lines(
order_line, order_type, oline_dict, cutoff_datetime
)
if not oline_dict[order_line]["price_origin"]:
self.order_line_update_oline_dict_price_fallback(
order_line, order_type, oline_dict
)
def order_line_update_oline_dict_from_stock_moves(
self, order_line, order_type, oline_dict, cutoff_datetime
):
wdict = oline_dict[order_line]
# These fields/methods have the same name on PO and SO
order = order_line.order_id
product = order_line.product_id
product_uom = product.uom_id
outgoing_moves, incoming_moves = order_line._get_outgoing_incoming_moves()
if order_type == "purchase":
ordered_qty = order_line.product_uom._compute_quantity(
order_line.product_qty, product_uom
)
wdict["notes"] = _(
"Purchase order %(order)s confirmed on %(confirm_date)s\n"
"Purchase Order Line: %(order_line)s (ordered qty: %(qty)s %(uom)s)"
) % {
"order": order.name,
"confirm_date": format_datetime(self.env, order.date_approve),
"order_line": order_line.name,
"qty": formatLang(self.env, ordered_qty, dp="Product Unit of Measure"),
"uom": product_uom.name,
}
elif order_type == "sale":
ordered_qty = order_line.product_uom._compute_quantity(
order_line.product_uom_qty, product_uom
)
wdict["notes"] = _(
"Sale order %(order)s confirmed on %(confirm_date)s\n"
"Sale Order Line: %(order_line)s (ordered qty: %(qty)s %(uom)s)"
) % {
"order": order.name,
"confirm_date": format_datetime(self.env, order.date_order),
"order_line": order_line.name,
"qty": formatLang(self.env, ordered_qty, dp="Product Unit of Measure"),
"uom": product_uom.name,
}
move_logs = []
for out_move in outgoing_moves.filtered(
lambda m: m.state == "done" and m.date <= cutoff_datetime
):
sign = order_type == "purchase" and -1 or 1
move_qty = out_move.product_uom._compute_quantity(
out_move.quantity_done * sign, product_uom
)
move_logs.append((out_move, move_qty))
for in_move in incoming_moves.filtered(
lambda m: m.state == "done" and m.date <= cutoff_datetime
):
sign = order_type == "sale" and -1 or 1
move_qty = in_move.product_uom._compute_quantity(
in_move.quantity_done * sign, product_uom
)
move_logs.append((in_move, move_qty))
move_logs_sorted = sorted(move_logs, key=lambda to_sort: to_sort[0].date)
for (move, move_qty_signed) in move_logs_sorted:
wdict["precut_delivered_qty"] += move_qty_signed
move_qty_signed_formatted = formatLang(
self.env, move_qty_signed, dp="Product Unit of Measure"
)
wdict["precut_delivered_logs"].append(
_(
"%(qty)s %(uom)s (picking %(picking)s transfered on %(date)s "
"from %(src_location)s to %(dest_location)s)"
)
% {
"qty": move_qty_signed_formatted,
"uom": move.product_id.uom_id.name,
"picking": move.picking_id.name or "none",
"date": format_datetime(self.env, move.date),
"src_location": move.location_id.display_name,
"dest_location": move.location_dest_id.display_name,
}
)
def order_line_update_oline_dict_from_invoice_lines(
self, order_line, order_type, oline_dict, cutoff_datetime
):
wdict = oline_dict[order_line]
dpo = self.env["decimal.precision"]
qty_prec = dpo.precision_get("Product Unit of Measure")
move_type2label = dict(
self.env["account.move"].fields_get("move_type", "selection")["move_type"][
"selection"
]
)
# These fields have the same name on PO and SO
product = order_line.product_id
product_uom = product.uom_id
if self.source_move_state == "posted":
ilines = order_line.invoice_lines.filtered(
lambda x: x.parent_state == "posted"
)
else:
ilines = order_line.invoice_lines.filtered(
lambda x: x.parent_state in ("draft", "posted")
)
for iline in ilines:
invoice = iline.move_id
if not float_is_zero(iline.quantity, precision_digits=qty_prec):
sign = invoice.move_type in ("out_refund", "in_refund") and -1 or 1
iline_qty_puom = iline.product_uom_id._compute_quantity(
iline.quantity * sign, product_uom
)
if invoice.date <= self.cutoff_date:
wdict["precut_invoiced_qty"] += iline_qty_puom
iline_qty_puom_formatted = formatLang(
self.env, iline_qty_puom, dp="Product Unit of Measure"
)
wdict["precut_invoiced_logs"].append(
"%(qty)s %(uom)s (%(move_type)s %(move_name)s dated %(date)s)"
% {
"qty": iline_qty_puom_formatted,
"uom": iline.product_id.uom_id.name,
"move_type": move_type2label[invoice.move_type],
"move_name": invoice.name,
"date": format_date(self.env, invoice.date),
}
)
# Most recent invoice line used for price_unit, account,...
wdict["price_unit"] = iline.price_subtotal / iline_qty_puom
wdict["price_origin"] = invoice.name
wdict["currency"] = invoice.currency_id
wdict["account_id"] = iline.account_id.id
wdict["analytic_distribution"] = iline.analytic_distribution
wdict["taxes"] = iline.tax_ids
def order_line_update_oline_dict_price_fallback(
self, order_line, order_type, oline_dict
):
wdict = oline_dict[order_line]
order = order_line.order_id
product = order_line.product_id
if order_type == "purchase":
oline_qty_puom = order_line.product_uom._compute_quantity(
order_line.product_qty, product.uom_id
)
wdict["price_unit"] = order_line.price_subtotal / oline_qty_puom
wdict["price_origin"] = order.name
wdict["currency"] = order.currency_id
wdict["analytic_distribution"] = order_line.analytic_distribution
wdict["taxes"] = order_line.taxes_id
account = product._get_product_accounts()["expense"]
if not account:
raise UserError(
_(
"Missing expense account on product '%(product)s' or on its "
"related product category '%(categ)s'."
)
% {
"product": product.display_name,
"categ": product.categ_id.display_name,
}
)
wdict["account_id"] = order.fiscal_position_id.map_account(account).id
elif order_type == "sale":
oline_qty_puom = order_line.product_uom._compute_quantity(
order_line.product_uom_qty, product.uom_id
)
wdict["price_unit"] = order_line.price_subtotal / oline_qty_puom
wdict["price_origin"] = order.name
wdict["currency"] = order.currency_id
wdict["analytic_distribution"] = order_line.analytic_distribution
wdict["taxes"] = order_line.tax_id
account = product._get_product_accounts()["income"]
if not account:
raise UserError(
_(
"Missing income account on product '%(product)s' or on its "
"related product category '%(categ)s'."
)
% {
"product": product.display_name,
"categ": product.categ_id.display_name,
}
)
wdict["account_id"] = order.fiscal_position_id.map_account(account).id
def stock_move_update_oline_dict(self, move_line, oline_dict, cutoff_datetime):
dpo = self.env["decimal.precision"]
qty_prec = dpo.precision_get("Product Unit of Measure")
if self.cutoff_type == "accrued_expense":
if (
move_line.purchase_line_id
and move_line.purchase_line_id not in oline_dict
and not float_is_zero(
move_line.purchase_line_id.product_qty, precision_digits=qty_prec
)
):
self.order_line_update_oline_dict(
move_line.purchase_line_id, "purchase", oline_dict, cutoff_datetime
)
elif self.cutoff_type == "accrued_revenue":
if (
move_line.sale_line_id
and move_line.sale_line_id not in oline_dict
and not float_is_zero(
move_line.sale_line_id.product_uom_qty, precision_digits=qty_prec
)
):
self.order_line_update_oline_dict(
move_line.sale_line_id, "sale", oline_dict, cutoff_datetime
)
def invoice_line_update_oline_dict(self, inv_line, oline_dict, cutoff_datetime):
dpo = self.env["decimal.precision"]
qty_prec = dpo.precision_get("Product Unit of Measure")
if self.cutoff_type == "prepaid_expense":
if (
inv_line.purchase_line_id
and inv_line.purchase_line_id not in oline_dict
and not float_is_zero(
inv_line.purchase_line_id.product_qty, precision_digits=qty_prec
)
):
self.order_line_update_oline_dict(
inv_line.purchase_line_id, "purchase", oline_dict, cutoff_datetime
)
elif self.cutoff_type == "prepaid_revenue":
for so_line in inv_line.sale_line_ids:
if so_line not in oline_dict and not float_is_zero(
so_line.product_uom_qty, precision_digits=qty_prec
):
self.order_line_update_oline_dict(
so_line, "sale", oline_dict, cutoff_datetime
)
def get_lines(self):
res = super().get_lines()
aclo = self.env["account.cutoff.line"]
account_mapping = self._get_mapping_dict()
cutoff_type = self.cutoff_type
cutoff_datetime = self._get_cutoff_datetime()
oline_dict = {} # order line dict
# key = PO line or SO line recordset
# value = {
# 'precut_delivered_qty': 1.0,
# 'precut_invoiced_qty': 0.0,
# 'price_unit': 12.42,
# }
# ACCRUAL :
# starting point : picking
# then, go to order line. From order line, go to stock moves and invoices lines
# => gen cutoff line if precut_delivered_qty - precut_invoiced_qty > 0
# PREPAID :
# starting point : invoice
# then, go to order line. From order line, go to stock moves and invoices lines
# => gen cutoff line if precut_invoiced_qty - precut_delivered_qty > 0
# ACCURAL
if cutoff_type in ("accrued_revenue", "accrued_expense"):
pick_type_map = {
"accrued_revenue": "outgoing",
"accrued_expense": "incoming",
}
min_date_dt = cutoff_datetime - relativedelta(
days=self.picking_interval_days
)
pickings = self.env["stock.picking"].search(
[
("picking_type_code", "=", pick_type_map[cutoff_type]),
("state", "=", "done"),
("date_done", "<=", cutoff_datetime),
("date_done", ">=", min_date_dt),
("company_id", "=", self.company_id.id),
]
)
for p in pickings:
for move in p.move_ids.filtered(lambda m: m.state == "done"):
self.stock_move_update_oline_dict(move, oline_dict, cutoff_datetime)
elif cutoff_type in ("prepaid_revenue", "prepaid_expense"):
move_type_map = {
"prepaid_revenue": ("out_invoice", "out_refund"),
"prepaid_expense": ("in_invoice", "in_refund"),
}
min_date = self.cutoff_date - relativedelta(days=self.picking_interval_days)
inv_domain = [
("move_type", "in", move_type_map[cutoff_type]),
("date", "<=", self.cutoff_date),
("date", ">=", min_date),
("company_id", "=", self.company_id.id),
]
if self.source_move_state == "posted":
inv_domain.append(("state", "=", "posted"))
else:
inv_domain.append(("state", "in", ("draft", "posted")))
invoices = self.env["account.move"].search(inv_domain)
for invoice in invoices:
for iline in invoice.invoice_line_ids.filtered(
lambda x: x.display_type == "product"
and x.product_id.type in ("product", "consu")
):
self.invoice_line_update_oline_dict(
iline, oline_dict, cutoff_datetime
)
# from pprint import pprint
# pprint(oline_dict)
for vdict in oline_dict.values():
vals = self.picking_prepare_cutoff_line(vdict, account_mapping)
if vals:
aclo.create(vals)
return res
def _get_cutoff_datetime(self):
self.ensure_one()
cutoff_date = datetime.combine(self.cutoff_date, datetime.max.time())
tz = self.env.user.tz and pytz.timezone(self.env.user.tz) or pytz.utc
cutoff_datetime_aware = tz.localize(cutoff_date)
cutoff_datetime_utc = cutoff_datetime_aware.astimezone(pytz.utc)
cutoff_datetime_utc_naive = cutoff_datetime_utc.replace(tzinfo=None)
return cutoff_datetime_utc_naive

View file

@ -0,0 +1,27 @@
# Copyright 2020-2021 Akretion France (http://www.akretion.com/)
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
from odoo import fields, models
class ResCompany(models.Model):
_inherit = "res.company"
default_cutoff_picking_interval_days = fields.Integer(
string="Analysis Interval",
help="To generate the accrual/prepaid revenue/expenses based on picking "
"dates vs invoice dates, Odoo will analyse all the pickings/invoices from "
"N days before the cutoff date up to the cutoff date. "
"N is the Analysis Interval. If you increase the analysis interval, "
"Odoo will take more time to generate the cutoff lines.",
default=30,
)
_sql_constraints = [
(
"cutoff_picking_interval_days_positive",
"CHECK(default_cutoff_picking_interval_days > 0)",
"The value of the field 'Analysis Interval' must be strictly positive.",
)
]

View file

@ -0,0 +1 @@
For configuration instructions, refer to the README of the module *account_cutoff_base*.

View file

@ -0,0 +1 @@
* Alexis de Lattre <alexis.delattre@akretion.com>

View file

@ -0,0 +1,25 @@
This module generates expense/revenue accruals and prepaid expense/revenue based on the status of orders, pickings and invoices. The module is named *account_cutoff_accrual_picking* because it initially only supported accruals ; support for prepaid expense/revenue was added later (it should be renamed in later versions).
To understand the behavior of this module, let's take the example of an expense accrual. When you click on the button *Re-Generate Lines* of an *Expense Accrual*:
1. Odoo will look for all incoming picking in Done state with a *Transfer Date* <= *Cut-off Date*. For performance reasons, by default, the incoming picking dated before *Cut-off Date* minus 30 days will not be taken into account (this limit is configurable via the field *Picking Analysis*). It will go to the stock moves of those pickings and see if they are linked to a purchase order line.
2. Once this analysis is completed, Odoo has a list of purchase order lines to analyse for potential expense accrual.
3. For each of these purchase order lines, Odoo will:
- scan the related stock moves in *done* state and check their transfer date,
- scan the related invoices lines and check their invoice date.
4. If, for a particular purchase order line, the quantity of products received before the cutoff-date (or on the same day) minus the quantity of products invoiced before the cut-off date (or on the same day) is positive, Odoo will generate a cut-off line.
Now, let's take the example of a prepaid expense. When you click on the button *Re-Generate Lines* of a *Prepaid Expense*:
1. Odoo will look for all vendor bills dated before (or equal to) *Cut-off Date*. For performance reasons, by default, the vendor bills dated before *Cut-off Date* minus 30 days will not be taken into account (this limit is configurable via the field *Picking Analysis*). It will go to the invoice lines of those vendor bills and see if they are linked to a purchase order line.
2. Once this analysis is completed, Odoo has a list of purchase order lines to analyse for potential prepaid expense.
3. For each of these purchase order lines, Odoo will:
- scan the related stock moves in *done* state and check their transfer date,
- scan the related invoices lines and check their invoice date.
4. If, for a particular purchase order line, the quantity of products invoiced before the cutoff-date (or on the same day) minus the quantity of products received before the cut-off date (or on the same day) is positive, Odoo will generate a cut-off line.
This module should work well with multiple units of measure (including products purchased and invoiced in different units of measure) and in multi-currency.

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View file

@ -0,0 +1,450 @@
<!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>Account Cut-off Picking</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="account-cut-off-picking">
<h1 class="title">Account Cut-off Picking</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:f6091035b02278d297ac998f00f422f8401ea322060f472cf5b95083d4f2b4bf
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.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/account-closing/tree/16.0/account_cutoff_picking"><img alt="OCA/account-closing" src="https://img.shields.io/badge/github-OCA%2Faccount--closing-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/account-closing-16-0/account-closing-16-0-account_cutoff_picking"><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/account-closing&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>This module generates expense/revenue accruals and prepaid expense/revenue based on the status of orders, pickings and invoices. The module is named <em>account_cutoff_accrual_picking</em> because it initially only supported accruals ; support for prepaid expense/revenue was added later (it should be renamed in later versions).</p>
<p>To understand the behavior of this module, lets take the example of an expense accrual. When you click on the button <em>Re-Generate Lines</em> of an <em>Expense Accrual</em>:</p>
<ol class="arabic simple">
<li>Odoo will look for all incoming picking in Done state with a <em>Transfer Date</em> &lt;= <em>Cut-off Date</em>. For performance reasons, by default, the incoming picking dated before <em>Cut-off Date</em> minus 30 days will not be taken into account (this limit is configurable via the field <em>Picking Analysis</em>). It will go to the stock moves of those pickings and see if they are linked to a purchase order line.</li>
<li>Once this analysis is completed, Odoo has a list of purchase order lines to analyse for potential expense accrual.</li>
<li>For each of these purchase order lines, Odoo will:<ul>
<li>scan the related stock moves in <em>done</em> state and check their transfer date,</li>
<li>scan the related invoices lines and check their invoice date.</li>
</ul>
</li>
<li>If, for a particular purchase order line, the quantity of products received before the cutoff-date (or on the same day) minus the quantity of products invoiced before the cut-off date (or on the same day) is positive, Odoo will generate a cut-off line.</li>
</ol>
<p>Now, lets take the example of a prepaid expense. When you click on the button <em>Re-Generate Lines</em> of a <em>Prepaid Expense</em>:</p>
<ol class="arabic simple">
<li>Odoo will look for all vendor bills dated before (or equal to) <em>Cut-off Date</em>. For performance reasons, by default, the vendor bills dated before <em>Cut-off Date</em> minus 30 days will not be taken into account (this limit is configurable via the field <em>Picking Analysis</em>). It will go to the invoice lines of those vendor bills and see if they are linked to a purchase order line.</li>
<li>Once this analysis is completed, Odoo has a list of purchase order lines to analyse for potential prepaid expense.</li>
<li>For each of these purchase order lines, Odoo will:<ul>
<li>scan the related stock moves in <em>done</em> state and check their transfer date,</li>
<li>scan the related invoices lines and check their invoice date.</li>
</ul>
</li>
<li>If, for a particular purchase order line, the quantity of products invoiced before the cutoff-date (or on the same day) minus the quantity of products received before the cut-off date (or on the same day) is positive, Odoo will generate a cut-off line.</li>
</ol>
<p>This module should work well with multiple units of measure (including products purchased and invoiced in different units of measure) and in multi-currency.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#configuration" id="toc-entry-1">Configuration</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="configuration">
<h1><a class="toc-backref" href="#toc-entry-1">Configuration</a></h1>
<p>For configuration instructions, refer to the README of the module <em>account_cutoff_base</em>.</p>
</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/account-closing/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/account-closing/issues/new?body=module:%20account_cutoff_picking%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>Akretion</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#toc-entry-5">Contributors</a></h2>
<ul class="simple">
<li>Alexis de Lattre &lt;<a class="reference external" href="mailto:alexis.delattre&#64;akretion.com">alexis.delattre&#64;akretion.com</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/alexis-via"><img alt="alexis-via" src="https://github.com/alexis-via.png?size=40px" /></a></p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/account-closing/tree/16.0/account_cutoff_picking">OCA/account-closing</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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8" ?>
<!--
Copyright 2020-2021 Akretion France (http://www.akretion.com/)
@author Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
-->
<odoo>
<record id="account_cutoff_form" model="ir.ui.view">
<field name="name">accrual.picking.account_cutoff_form</field>
<field name="model">account.cutoff</field>
<field name="inherit_id" ref="account_cutoff_base.account_cutoff_form" />
<field name="arch" type="xml">
<field name="cutoff_date" position="after">
<label for="picking_interval_days" />
<div name="picking_interval_days">
<field name="picking_interval_days" class="oe_inline" /> days
</div>
</field>
</field>
</record>
</odoo>

View file

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8" ?>
<!--
Copyright 2013-2021 Akretion France (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="res_config_settings_view_form" model="ir.ui.view">
<field name="name">accrual.picking.account.config.form</field>
<field name="model">res.config.settings</field>
<field
name="inherit_id"
ref="account_cutoff_base.res_config_settings_view_form"
/>
<field name="arch" type="xml">
<div id="dft_prepaid_expense_account_id" position="after">
<div class="row" id="dft_cutoff_picking_interval_days">
<label for="dft_cutoff_picking_interval_days" class="col-md-5" />
<field
name="dft_cutoff_picking_interval_days"
class="col-md-1"
/> days
</div>
</div>
</field>
</record>
</odoo>

View file

@ -0,0 +1 @@
from . import res_config_settings

View file

@ -0,0 +1,16 @@
# Copyright 2020-2021 Akretion France (http://www.akretion.com/)
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
from odoo import fields, models
class ResConfigSettings(models.TransientModel):
_inherit = "res.config.settings"
# I can't name it default_cutoff_accrual_picking_interval_days
# because 'default_' is a special prefix
dft_cutoff_picking_interval_days = fields.Integer(
related="company_id.default_cutoff_picking_interval_days",
readonly=False,
)

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 Account_cutoff_picking Module - account_cutoff_picking
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 account_cutoff_picking. 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,7 @@
# Dependencies
This addon depends on:
- [account_cutoff_base](../../odoo-bringout-oca-account-closing-account_cutoff_base)
- [purchase_stock](../../odoo-bringout-oca-ocb-purchase_stock)
- [sale_stock](../../odoo-bringout-oca-ocb-sale_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 account_cutoff_picking or install in UI.

View file

@ -0,0 +1,7 @@
# Install
```bash
pip install odoo-bringout-oca-account-closing-account_cutoff_picking"
# or
uv pip install odoo-bringout-oca-account-closing-account_cutoff_picking"
```

View file

@ -0,0 +1,13 @@
# Models
Detected core models and extensions in account_cutoff_picking.
```mermaid
classDiagram
class account_cutoff
class res_company
```
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: account_cutoff_picking. Provides features documented in upstream Odoo 16 under this addon.
- Source: OCA/OCB 16.0, addon account_cutoff_picking
- License: LGPL-3

View file

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

View file

@ -0,0 +1,8 @@
# Security
This module does not define custom security rules or access controls beyond Odoo defaults.
Default Odoo security applies:
- Base user access through standard groups
- Model access inherited from dependencies
- No custom row-level security rules

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 account_cutoff_picking
```

View file

@ -0,0 +1,3 @@
# Wizards
This module does not include UI wizards.

View file

@ -0,0 +1,44 @@
[project]
name = "odoo-bringout-oca-account-closing-account_cutoff_picking"
version = "16.0.0"
description = "Account Cut-off Picking - Accrued and prepaid expense/revenue from pickings"
authors = [
{ name = "Ernad Husremovic", email = "hernad@bring.out.ba" }
]
dependencies = [
"odoo-bringout-oca-account-closing-account_cutoff_base>=16.0.0",
"odoo-bringout-oca-account-closing-purchase_stock>=16.0.0",
"odoo-bringout-oca-account-closing-sale_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 = ["account_cutoff_picking"]
[tool.rye]
managed = true
dev-dependencies = [
"pytest>=8.4.1",
]