Compare commits

..

14 Commits

Author SHA1 Message Date
Donatienne Pirlot
7076e18115 [IMP] documents: update and improve the docuemnts doc page
ID: 2899532
2022-10-07 12:42:44 +02:00
Jonathan Castillo (jcs)
7424e4176c [IMP] website: register domain name menu path
closes odoo/documentation#2766

X-original-commit: 81352e98b2
Signed-off-by: Castillo Jonathan (jcs) <jcs@odoo.com>
2022-09-28 00:20:45 +02:00
Wesley Kao (weka)
8287c88bd4 [IMP] MRP: updated Variants BOM Management rst content
closes odoo/documentation#2764

X-original-commit: b3d5e928aa
Signed-off-by: Antoine Vandevenne (anv) <anv@odoo.com>
2022-09-27 19:14:46 +02:00
Xavier-Do
53e7277b6a [FIX]: fix odoo_version detection
Right now if the version is not "final (and not alpha)"
documentation will say 16.0beta != 16.0

closes odoo/documentation#2748

X-original-commit: 406f3aac18
Signed-off-by: Xavier Dollé (xdo) <xdo@odoo.com>
2022-09-26 09:35:48 +02:00
Fabrice Henrion
2c7d61f938 [FIX] accounting: grammar fix in ponto
closes odoo/documentation#2759

X-original-commit: dad110c7cc
Signed-off-by: Castillo Jonathan (jcs) <jcs@odoo.com>
2022-09-23 11:22:40 +02:00
Tom Aarab (toaa)
cdb71bb807 [IMP] accounting: update + merge of multiple multi-currency pages
task id: 2942040

closes odoo/documentation#2744

X-original-commit: 149353cf72
Signed-off-by: Antoine Vandevenne (anv) <anv@odoo.com>
Signed-off-by: Castillo Jonathan (jcs) <jcs@odoo.com>
Co-authored-by: Jonathan Castillo (jcs) <jcs@odoo.com>
2022-09-21 02:25:58 +02:00
Jonathan Quique (jqu)
455f4a9359 [FIX] sales/crm: fix menu path and RST formatting
Cherry-pick of #2652:
>To view the Sales Team dashboard, go to `:menuselection:CRM --> Sales --> Teams.`

closes odoo/documentation#2739

X-original-commit: 1b7ec7ca20
Signed-off-by: Antoine Vandevenne (anv) <anv@odoo.com>
2022-09-20 22:50:55 +02:00
Tori (vpk)
fa5dcc6940 [ADD] Sales: adding doc about variants in orders
closes odoo/documentation#2735

Task: 2574874
X-original-commit: 05d10ab355
Signed-off-by: Antoine Vandevenne (anv) <anv@odoo.com>
2022-09-20 11:33:57 +02:00
Claire Bretton (clbr)
33196968df [IMP] developer/howtos/rdtraining: Add missing information about module category.
Adds explanations and directive for module category creation, so it can be used correctly at res.groups creation.

closes odoo/documentation#2729

X-original-commit: 338fe297b0
Signed-off-by: Antoine Vandevenne (anv) <anv@odoo.com>
2022-09-16 23:49:41 +02:00
Prakash Prajapati
8e4dedc9a1 [ADD] web_gantt: add pill_label attribute in gantt_view
task-2672783

closes odoo/documentation#2649

Related: odoo/enterprise#28372
Signed-off-by: Laurent Stukkens (ltu) <ltu@odoo.com>
2022-09-16 14:24:59 +02:00
Max
c260ecd39d [FW][IMP] developer/backend: correct filters attribute for calendar view fields
closes odoo/documentation#2724

Forward-port-of: odoo/documentation#2692
Signed-off-by: Victor Feyens (vfe) <vfe@odoo.com>
2022-09-15 19:21:33 +02:00
Demesmaeker
10eee0fe7c [IMP] razorpay: warning for void not working
Fix payment flow + add information about the void not supported

closes odoo/documentation#2663

Signed-off-by: Antoine Vandevenne (anv) <anv@odoo.com>
2022-09-14 21:21:27 +02:00
Julien Castiaux
b2b6ec698a [IMP] developer/api/external_api: XML-RPC in PHP8
Starting PHP8, the XML-RPC extension is not available by default
anymore and must be installed separately.

closes odoo/documentation#2719

Task: 2613818
X-original-commit: 79e58e3db1
Signed-off-by: Antoine Vandevenne (anv) <anv@odoo.com>
2022-09-14 16:18:27 +02:00
Julien Castiaux
0e6a41d6d5 [IMP] content/developer/webservices
It is hard to find and learn about RPC in Odoo, users hardly know about
JSON-RPC as the only place where we talk about it in deep down in the
*How to make a Module* tutorial.

In the commit, we isolated the tutorial about RPC in a dedicated file,
that file is better referenced thanks to cross-references in some others
places that are talking about RPC

Task: 2884559
X-original-commit: 83c2e6de0b
Part-of: odoo/documentation#2719
2022-09-14 16:18:26 +02:00
96 changed files with 666 additions and 780 deletions

View File

@@ -95,7 +95,7 @@ else:
import odoo.addons
odoo.addons.__path__.append(str(odoo_dir) + '/addons')
from odoo import release as odoo_release # Don't collide with Sphinx's 'release' config option
odoo_version = odoo_release.version.replace('~', '-') # Change saas~XX.Y to saas-XX.Y
odoo_version = '.'.join(str(s) for s in odoo_release.version_info[:2]).replace('~', '-') # Change saas~XX.Y to saas-XX.Y
odoo_version = 'master' if 'alpha' in odoo_release.version else odoo_version
if release != odoo_version:
_logger.warning(

View File

@@ -62,11 +62,11 @@ database manager.
- This offer doesn't include any mailbox. However, you can :ref:`configure your MX records
<domain-name/odoo-manage>` to use your own email server or solution such as Google Workspace.
To do so, go to :menuselection:`Website --> Go to website --> Promote --> Domain Name`.
Alternatively, open your `database manager <https://www.odoo.com/my/databases>`_, click on the
:guilabel:`settings` button next to your database, then on :guilabel:`Domain names`.
To do so, go to :menuselection:`Website --> Domain Name`. Alternatively, open your `database manager
<https://www.odoo.com/my/databases>`_, click on the :guilabel:`settings` button next to your
database, then on :guilabel:`Domain names`.
.. image:: domain_names/register-promote.png
.. image:: domain_names/register-menu.png
:align: center
:alt: Clicking on Domain Names from an Odoo website

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

View File

@@ -64,8 +64,8 @@ Link your Ponto account with your Odoo database
#. Finish the flow.
.. note::
You have to authorize all the accounts you want to access in Odoo but, Odoo will filter the
accounts based on the institution you selected at the second step.
You have to authorize all the accounts you want to access in Odoo, but Odoo will filter the
accounts based on the institution you selected in the second step.
Update your synchronization credentials
---------------------------------------

View File

@@ -232,9 +232,8 @@ directly to its services and get the currency rate either automatically or manua
:align: center
:alt: Bank of Peru is displayed in Multicurrency Service option
Please refer to the next section in our documentation for more information about :doc:`multicurrency
<../../others/multicurrencies/how_it_works>`.
Please refer to the next section in our documentation for more information about
:doc:`multicurrencies <../../others/multi_currency>`.
Configure Master data
---------------------

View File

@@ -7,7 +7,7 @@ Others
.. toctree::
:titlesonly:
others/multi_currency
others/analytic
others/adviser
others/multicurrencies
others/inventory

View File

@@ -0,0 +1,167 @@
=====================
Multi-currency system
=====================
Odoo allows you to issue invoices, receive bills, and record transactions in currencies other than
the main currency configured for your company. You can also set up bank accounts in other currencies
and run reports on your foreign currency activities.
.. seealso::
- :doc:`../bank/setup/foreign_currency`
.. _multi-currency/config:
Configuration
=============
.. _multi-currency/config-main-currency:
Main currency
-------------
The **main currency** is defined by default according to the company's country. You can change it by
going to :menuselection:`Accounting --> Configuration --> Settings --> Currencies` and changing the
currency in the :guilabel:`Main Currency` setting.
.. _multi-currency/config-enable:
Enable foreign currencies
-------------------------
Go to :menuselection:`Accounting --> Configuration --> Currencies`, and enable the currencies you
wish to use by toggling the :guilabel:`Active` button.
.. image:: multi_currency/enable-foreign-currencies.png
:align: center
:alt: Enable the currencies you wish to use.
.. _multi-currency/config-rates:
Currency rates
--------------
Manual update
~~~~~~~~~~~~~
To manually create and set a currency rate, go to :menuselection:`Accounting --> Configuration -->
Currencies`, click on the currency you wish to change the rate of, and under the :guilabel:`Rates`
tab, click :guilabel:`Add a line` to create a new rate.
.. image:: multi_currency/manual-rate-update.png
:align: center
:alt: Create or modify the currency rate.
Automatic update
~~~~~~~~~~~~~~~~
When you activate a second currency for the first time, :guilabel:`Automatic Currency Rates` appears
under :menuselection:`Accounting Dashboard --> Configuration --> Settings --> Currencies`. By
default, you have to click on the **Update now** button (:guilabel:`🗘`) to update the rates.
Odoo can update the rates at regular intervals. To do so, change the :guilabel:`Interval` from
:guilabel:`Manually` to :guilabel:`Daily`, :guilabel:`Weekly`, or :guilabel:`Monthly`. You can also
select the web service from which you want to retrieve the latest currency rates by clicking on the
:guilabel:`Service` field.
.. _multi-currency/config-exch-diff:
Exchange difference entries
---------------------------
Odoo automatically records exchange differences entries on dedicated accounts, in a dedicated
journal.
You can define which journal and accounts to use to **post exchange difference entries** by
going to :menuselection:`Accounting --> Configuration --> Settings --> Default Accounts` and editing
the :guilabel:`Journal`, :guilabel:`Gain Account`, and :guilabel:`Loss Account`.
.. example::
If you receive a payment for a customer invoice one month after it was issued, the exchange rate
has likely changed since. Therefore, this fluctuation implies some profit or loss due to the
exchange difference, which Odoo automatically records in the default **Exchange Difference**
journal.
.. _multi-currency/config-coa:
Chart of accounts
-----------------
Each account can have a set currency. By doing so, all moves relevant to the account are forced to
have that account's currency.
To do so, go to :menuselection:`Accounting --> Configuration --> Charts of Accounts` and select a
currency in the field :guilabel:`Account Currency`. If left empty, all active currencies are handled
instead of just one.
.. _multi-currency/config-journals:
Journals
--------
If a currency is set on a **journal**, that journal only handles transactions in that currency.
To do so, go to :menuselection:`Accounting --> Configuration --> Journals`, open the journal you
want to edit, and select a currency in the field :guilabel:`Currency`. If left empty, all active
currencies are handled instead of just one.
.. image:: multi_currency/journal-currency.png
:align: center
:alt: Select the currency for the journal to handle.
.. _multi-currency/mca:
Multi-currency accounting
=========================
.. _multi-currency/mca-documents:
Invoices, bills, and other documents
------------------------------------
For all documents, you can select the currency and journal to use for the transaction.
.. image:: multi_currency/currency-field.png
:align: center
:alt: Select the currency and journal to use.
.. _multi-currency/mca-payment:
Payment registration
--------------------
To register a payment in a currency other than your company's main currency, click on the
:guilabel:`Register Payment` payment button of your document and, in the pop-up window, select a
**currency** in the :guilabel:`Amount` field.
.. image:: multi_currency/register-payment.png
:align: center
:alt: Select the currency and journal to use before registering the payment.
.. _multi-currency/mca-statements:
Bank statements
---------------
When creating or importing bank statements, the amount is in the company's main currency. To see
additional fields related to foreign currencies, click on the **columns dropdown button**
(:guilabel:`⋮`) next to :guilabel:`Amount`, and check :guilabel:`Amount Currency` and
:guilabel:`Foreign Currency`.
.. image:: multi_currency/foreign-fields.png
:align: center
:alt: The extra fields related to foreign currencies.
When reconciling, Odoo displays both the foreign currency amount and the equivalent amount in your
company's main currency.
.. _multi-currency/mca-exch-entries:
Exchange rate journal entries
-----------------------------
To see **exchange difference journal entries**, go to :menuselection:`Accounting Dashboard -->
Accounting --> Journals: Miscellaneous`.
.. image:: multi_currency/exchange-journal-currency.png
:align: center
:alt: Exchange rate journal entry.

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

View File

@@ -1,12 +0,0 @@
:nosearch:
=============
Multicurrency
=============
.. toctree::
:titlesonly:
multicurrencies/how_it_works
multicurrencies/invoices_payments
multicurrencies/exchange

View File

@@ -1,112 +0,0 @@
=================================
Record exchange rates at payments
=================================
Overview
========
Any company doing international trade faces the case where the payments
are in a different currency.
After receiving their payments, you have the option to convert the
amount into your company currency. Multi currency payment implies rates
fluctuations. The rate differences are automatically recorded by Odoo.
Configuration
=============
Enable multi-currencies
-----------------------
In the accounting module, Go to :menuselection:`Configuration --> Settings`
and flag **Allow multi currencies**, then click on **apply**.
.. image:: exchange/exchange_rate03.png
:align: center
Configure the currency rates in :menuselection:`Configuration --> Currencies`.
Write down the rate and make sure the currency is active.
.. image:: exchange/exchange_rate02.png
:align: center
In this document, the base currency is **Euro** and we will record payments
in **Dollars**.
.. image:: exchange/exchange_rate08.png
:align: center
.. tip::
You can automatically fetch the currency rates from the **European
Central Bank** or from **Yahoo**. Please read the document :
:doc:`how_it_works`.
Configure your journal
----------------------
In order to register payments in other currencies, you have to **remove
the currency constraint** on the journal. Go to the accounting
application, Click on **More** on the journal and **Settings**.
.. image:: exchange/exchange_rate06.png
:align: center
Check if the **Currency** field is empty or in the foreign currency in which
you will register the payments. If a currency is filled in, it means
that you can register payments only in this currency.
.. image:: exchange/exchange_rate10.png
:align: center
Record a payment in a different currency
========================================
In the **Accounting** application, go to :menuselection:`Sales --> Payments`.
Register the payment and indicate that it was done in the foreign currency. Then
click on **confirm**.
.. image:: exchange/exchange_rate05.png
:align: center
The journal entry has been posted but not allocated.
Go back to your invoice (:menuselection:`Sales --> Customer Invoices`) and click on
**Add** to allocate the payment.
.. image:: exchange/exchange_rate04.png
:align: center
Record a bank statement in a different currency
===============================================
Create or import the bank statement of your payment. The **Amount** is in
the company currency. There are two complementary fields, the **Amount currency**,
which is the amount that was actually paid and the **Currency** in which it was paid.
.. image:: exchange/exchange_rate07.png
:align: center
When reconciling it, Odoo will directly match the payment with the right
**Invoice**. You will get the invoice price in the invoice currency and the
amount in your company currency.
.. image:: exchange/exchange_rate09.png
:align: center
Check the exchange rate differences
===================================
Go to :menuselection:`Adviser --> Journal Entries` and look for the **Exchange difference**
journal entries. All the exchange rates differences are recorded in it.
.. image:: exchange/exchange_rate01.png
:align: center
.. tip::
The Exchange difference journal can be changed in your accounting settings.
.. include:: exchange/full_reconcile_warning.rst
.. seealso::
* :doc:`../../bank/reconciliation/reconciliation_models`
* :doc:`../../bank/reconciliation/use_cases`

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

View File

@@ -1,7 +0,0 @@
.. warning::
In order for an exchange difference entry to be created automatically, the
corresponding invoices and payments need to be fully reconciled. This means
the invoices are fully paid and the payments are fully spent on invoices.
If you partially pay 3 invoices from 2 payments, and the last invoice still
has an amount due, there will be no exchange difference entry for any of
them until that final amount is paid.

View File

@@ -1,171 +0,0 @@
============================
Odoo's multi-currency system
============================
Overview
========
Choosing to use the multi-currency option in Odoo will allow you to send
sales invoices, quotes and purchase orders or receive bills and payments
in currencies other than your own. With multi-currency, you can also set
up bank accounts in other currencies and run reports on your foreign
currency activities.
Configuration
=============
Turn on multi-currency
----------------------
In the accounting module, Go to :menuselection:`Configuration --> Settings` and flag
**Allow multi currencies**, then click on **Apply**.
.. image:: how_it_works/works01.png
:align: center
Exchange Rate Journal
---------------------
The **Rate Difference Journal** records the differences between the payment
registration and the expected amount. For example, if a payment is paid
1 month after the invoice was issued, the exchange rate has probably
changed. The fluctuation implies some loss or profit that are recorded
by Odoo.
You can change it in the settings:
.. image:: how_it_works/works02.png
:align: center
View or edit rate being used
----------------------------
You can manually configure the currency rates in :menuselection:`Configuration -->
Currencies`. Open the currencies you want to use in Odoo and edit it.
Make sure the currency is active.
.. image:: how_it_works/works03.png
:align: center
Click on **View Rates** to edit it and to see the history :
.. image:: how_it_works/works04.png
:align: center
Click on **Create** to add the rate. Fill in the date and the rate.
Click on **Save** when you are done.
.. image:: how_it_works/works05.png
:align: center
Live Currency Rate
------------------
By default, the currencies need to be updated manually. But you can
synchronize it with `Yahoo <https://finance.yahoo.com/currency-converter/>`__ or
the `European Central Bank <http://www.ecb.europa.eu>`__. In
:menuselection:`Configuration --> Settings`, go to the **Live Currency Rate** section.
Choose the interval : Manually, Daily, Weekly or Monthly. You can always
force the update by clicking on **Update Now**. Select the provider, and you
are set !
.. image:: how_it_works/works06.png
:align: center
.. note::
Only the **active** currencies are updated
Configure your charts of account
--------------------------------
In the accounting application, go to :menuselection:`Adviser --> Charts of Accounts`.
On each account, you can set a currency. It will force all moves for
this account to have the account currency.
If you leave it empty, it means that it can handle all currencies that
are Active.
.. image:: how_it_works/works07.png
:align: center
Configure your journals
-----------------------
In order to register payments in other currencies, you have to remove
the currency constraint on the journal. Go to the accounting
application, Click on **More** on the journal and **Settings**.
.. image:: how_it_works/works08.png
:align: center
Check if the currency field is empty or in the foreign currency in which
you will register the payments. If a currency is filled in, it means
that you can register payments only in this currency.
.. image:: how_it_works/works09.png
:align: center
How is Odoo's multi-currency working?
=====================================
Now that you are working in a multi-currency environment, all
accountable items will be linked to a currency, domestic or foreign.
Sales Orders and Invoices
-------------------------
You are now able to set a different currency than the company one on
your sale orders and on your invoices. The currency is set for the whole
document.
.. image:: how_it_works/works10.png
:align: center
Purchases orders and Vendor Bills
---------------------------------
You are now able to set a different currency than the company one on
your purchase orders and on your vendor bills. The currency is set for
the whole document.
.. image:: how_it_works/works11.png
:align: center
Payment Registrations
---------------------
In the accounting application, go to :menuselection:`Sales --> Payments`. Register the payment and
set the currency.
.. image:: how_it_works/works12.png
:align: center
Bank Statements
---------------
When creating or importing bank statements, the amount is in the company
currency. But there are now two complementary fields, the amount that
was actually paid and the currency in which it was paid.
.. image:: how_it_works/works13.png
:align: center
When reconciling it, Odoo will directly match the payment with the right
Invoice. You will get the invoice price in the invoice currency and the
amount in your company currency.
Exchange Rate Journal
---------------------
Go to :menuselection:`Adviser --> Journal Entries` and look for the Exchange difference
journal entries. All the exchange rates differences are recorded in it.
.. image:: how_it_works/works14.png
:align: center
.. include:: exchange/full_reconcile_warning.rst
.. seealso::
* :doc:`invoices_payments`
* :doc:`exchange`

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -1,121 +0,0 @@
==================================================
Manage invoices and payment in multiple currencies
==================================================
Overview
========
Odoo provides multi-currency support with automatic currency gross or
loss entry adjustment. There are a few things Odoo has been to ease the
user's life.
All the account transactions will be done using the company currency.
However you can see two extra fields with the journal entry where
secondary currency and amount will visible. You can create
multi-currency journals of force a specific currency.
When creating an invoice, the currency can be changed very easily;
however Odoo takes the company currency as a default assignment. It will
convert all the amounts automatically using that currency.
Configuration
=============
Enable Multi-Currency
---------------------
For information about enabling Multi-Currency, please read the document:
:doc:`how_it_works`
Configure your journal
----------------------
In order to register payments in other currencies, you have to remove
the currency constraint on the journal. Go to the accounting
application, on the journal, click on :menuselection:`More --> Settings`.
.. image:: invoices_payments/invoice01.png
:align: center
Check if the currency field is empty or in the foreign currency in which
you will register the payments. If a currency is filled in, it means
that you can register payments only in this currency.
.. image:: invoices_payments/invoice02.png
:align: center
Multi-currency invoices & Vendor Bills
======================================
Now that you are working in a multi-currency environment, all
accountable items will be linked to a currency, domestic or foreign.
Invoices
--------
You are now able to set a different currency than the company one on
your sale orders and on your invoices. The currency is set for the whole
document.
.. image:: invoices_payments/invoice03.png
:align: center
Vendor Bills
------------
You are now able to set a different currency than the company one on
your purchase orders and on your vendor bills. The currency is set for
the whole document.
.. image:: invoices_payments/invoice04.png
:align: center
Multi-currency Payments
=======================
In the accounting application, go to :menuselection:`Sales --> Payments`. Register the
payment and indicate that it was done in the foreign currency. Then
click on **Confirm**.
.. image:: invoices_payments/invoice05.png
:align: center
The journal entry has been posted but not allocated.
Go back to your invoice (:menuselection:`Sales --> Customer Invoices`) and click on
**Add** to allocate the payment.
.. image:: invoices_payments/invoice06.png
:align: center
Multi- Currency Bank Statements
===============================
When creating or importing bank statements, the amount is in the company
currency. But there are now two complementary fields, the amount that
was actually paid and the currency in which it was paid.
.. image:: invoices_payments/invoice07.png
:align: center
When reconciling it, Odoo will directly match the payment with the right
invoice. You will get the invoice price in the invoice currency and the
amount in your company currency.
.. image:: invoices_payments/invoice08.png
:align: center
Exchange Rate Journal
=====================
Go to :menuselection:`Adviser --> Journal Entries` and look for the **Exchange
Difference** journal entries. All the exchange rates differences are recorded in it.
.. image:: invoices_payments/invoice09.png
:align: center
.. include:: exchange/full_reconcile_warning.rst
.. seealso::
* :doc:`how_it_works`
* :doc:`exchange`

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -8,116 +8,196 @@ You can upload any type of file (max 64MB per file on Odoo Online/SaaS), and org
various workspaces.
.. seealso::
- `Odoo Documents: product page <https://www.odoo.com/app/documents>`_
- `Odoo Documents: product page <https://www.odoo.com/app/documents>`_
- `Odoo Tutorials: Documents basics <https://www.odoo.com/slides/slide/documents-basics-674>`_
- `Odoo Tutorials: Using Documents with your Accounting App <https://www.odoo.com/slides/slide/using-documents-with-your-accounting-app-675?fullscreen=1#>`_
Configuration
=============
By going to :menuselection:`Configuration --> Settings`, you can enable the centralization of files
attached to a specific area of your activity. For example, by ticking :guilabel:`Human Resources`,
your HR documents are automatically available in the HR workspace, while documents related to
Payroll are automatically available in the sub workspace Payroll. This can be updated by changing
the value in the dropdown menu. The external link allows you to edit the selected workspace.
.. image:: documents/files-centralization.png
:align: center
:alt: Enable the centralization of files attached to a specific area of your activity.
.. note::
If you enable the centralization of your accounting files and documents, it is necessary to click
on :guilabel:`Journals` and define each journal independently to allow automatic synchronization.
Workspaces
==========
Workspaces are defined by hierarchical folders having their own set of tags and actions. By-default
workspaces exist, but you can create your own by going to
:menuselection:`Configuration --> Workspaces` and clicking on :guilabel:`CREATE`.
.. note::
:guilabel:`Sub-workspaces` can also be created, edited, or deleted by clicking on the
:guilabel:`gear icon` on the main page' left menu in the Documents app.
Tags
====
Tags are used within the workspaces to add a level of differentiation between documents. They are
organized per category and filters can be used to sort them. Tags can be created and modified by
going to :menuselection:`Configuration --> Tags`.
.. note::
- The tags of a parent workspace apply to the child workspaces automatically.
- Tags can also be created, edited or deleted, by clicking on the :guilabel:`gear icon`, on the
left menu.
Documents Management
====================
When clicking on a specific document, the right panel displays the options that are available for
your document. On the top, you can click on the small icons to :guilabel:`Download`,
:guilabel:`Share this selection`, :guilabel:`Replace`, :guilabel:`Lock` or :guilabel:`Split`. It is
also possible to :guilabel:`Open chatter` or :guilabel:`Archive` the document.
.. image:: documents/right-panel-options.png
:align: center
:alt: right panel options
.. note::
The :guilabel:`Open chatter` option allows to :guilabel:`Send Message` (to everyone following the
document), to :guilabel:`Log Note`, or to :guilabel:`Schedule activity`. You can also
:guilabel:`Attach files`, :guilabel:`Follow/Unfollow` the document or show followers.
The name of your file can be edited in the :guilabel:`Document` box. A :guilabel:`Contact` or an
:guilabel:`Owner` can also be assigned to your document. The related :guilabel:`Workspace` can be
modified and you have the possibility to add :guilabel:`Tags`.
.. image:: documents/right-panel-options-2.png
:align: center
:alt: right panel options
Finally, different :guilabel:`Actions` are available at the bottom of the right panel, depending on
the workspace where your document is stored.
.. image:: documents/right-panel-options.png
:align: center
:alt: right panel actions
Workflow actions
================
Workflow actions are automated actions you can create and customize at the level of each
workspace. They appear next to a file whenever it meets the criteria you set. That way you can,
for example, add tags to a file or move it to another workspace with a single click. Workflow
actions help you streamline the management of your documents and your overall business operations.
For each workspace, it is possible to configure specific workflow actions that are automated actions
that can be created and customized at the level of each workspace. Ie: create documents, process
bills, sign, organize files, etc.
They appear on the right panel when it meets the criteria you set. That way, you can, for example,
add tags to a file or move it to another workspace with a single click. Workflow actions help you
streamline the management of your documents and your overall business operations.
Create workflow actions
-----------------------
To create workflow actions, go to :menuselection:`Documents --> Configuration --> Workspaces` and
select the workspace where the action should apply. Click on the *Actions* smart button, and then
on *Create*.
select the workspace where the action should apply. Click on the :guilabel:`Actions` smart button,
and then on :guilabel:`Create`.
.. image:: documents/access-workflow-actions.png
:align: center
:alt: Workflow actions smart button in Odoo Documents
:align: center
:alt: Workflow actions smart button in Odoo Documents
.. note::
An action applies to all *Child Workspaces* under the *Parent Workspace* you selected.
An action applies to all :guilabel:`Child Workspaces` under the :guilabel:`Parent Workspace` you
selected.
.. tip::
If you use the :ref:`developer mode <developer-mode>`, you can directly access all your actions
by going to :menuselection:`Documents --> Configuration --> Actions`.
You can directly access all your actions by going to :menuselection:`Documents --> Configuration
--> Actions`.
Set the conditions
------------------
After naming your workflow action, you can set the conditions that trigger the appearance of the
action button on the right-side panel when selecting a file.
You can :guilabel:`Create` a new :guilabel:`Action` or edit an existing one. You can define the
:guilabel:`Action Name` and then set the conditions that trigger the appearance of the
:guilabel:`action button` on the right-side panel when selecting a file.
There are three basic types of conditions you can set:
#. **Tags**: you can both use the *Contains* and *Does not contain* conditions, meaning the files
*must have* or *mustn't have* the tags set here.
#. :guilabel:`Tags`: you can both use the :guilabel:`Contains` and :guilabel:`Does not contain`
conditions, meaning the files *must have* or *mustn't have* the tags set here.
#. **Contact**: the files must be associated with the contact set here.
#. :guilabel:`Contact`: the files must be associated with the contact set here.
#. **Owner**: the files must be associated with the owner set here.
#. :guilabel:`Owner`: the files must be associated with the owner set here.
.. image:: documents/basic-condition-example.png
:align: center
:alt: Example of a workflow action's basic condition in Odoo Documents
:align: center
:alt: Example of a workflow action's basic condition in Odoo Documents
.. tip::
If you don't set any conditions, the action button appears for all files located inside the
selected workspace.
If you don't set any conditions, the action button appears for all files located inside the
selected workspace.
Advanced condition type: domain
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. important::
It is recommended to have some knowledge of Odoo development to properly configure *Domain*
filters.
It is recommended to have some knowledge of Odoo development to properly configure
:guilabel:`Domain` filters.
To access the *Domain* condition, the :ref:`developer mode <developer-mode>` needs to be activated.
Once that's done, select the *Domain* condition type, and click on *Add Filter*.
To access the :guilabel:`Domain` condition, the :ref:`developer mode <developer-mode>` needs to be
activated. Once it is done, select the :guilabel:`Domain` condition type, and click on
:guilabel:`Add Filter`.
.. image:: documents/activate-domain-condition.png
:align: center
:alt: Activating the domain condition type in Odoo Documents
To create a rule, select a :guilabel:`field`, an :guilabel:`operator`, and a
:guilabel:`value`. For example, if you want to add a workflow action to all the PDF files inside a
workspace, set the :guilabel:`field` to *Mime Type*, the :guilabel:`operator` to *contains*, and the
:guilabel:`value` to *pdf*.
To create a rule, you typically select a field, an operator, and a value. For example, if you want
to add a workflow action to all the PDF files inside a workspace, set the field to *Mime Type*, the
operator to *contains*, and the value to *pdf*.
Click on :guilabel:`Add node` (plus-circle icon) and :guilabel:`Add branch` (ellipsis icon) to add
conditions and sub-conditions.
.. image:: documents/domain-condition-example.png
:align: center
:alt: Example of a workflow action's domain condition in Odoo Documents
:align: center
:alt: Example of a workflow action's domain condition in Odoo Documents
Click on *Add node* (plus-circle icon) and *Add branch* (ellipsis icon) to add conditions and
sub-conditions. You can then specify if your rule should match *ALL* or *ANY* conditions. You can
also edit the rule directly using the *Code editor*.
.. image:: documents/use-domain-condition.png
:align: center
:alt: Add a node or a branch to a workflow action's condition in Odoo Documents
You can also specify if your rule should match :guilabel:`ALL` or :guilabel:`ANY` conditions and you
can edit the rule using the :guilabel:`Code editor`.
Configure the actions
---------------------
Select the *Actions* tab to set up your action. You can simultaneously:
Select the :guilabel:`Actions` tab to set up your action. You can simultaneously:
- **Set Contact**: add a contact to the file, or replace an existing contact with a new one.
- **Set Owner**: add an owner to the file, or replace an existing owner with a new one.
- **Move to Workspace**: move the file to any workspace.
- **Create**: create one of the following items attached to the file in your database:
- **Product template**: create a product you can edit directly.
- **Task**: create a Project task you can edit directly.
- **Signature request**: create a new Sign template to send out.
- **Sign directly**: create a Sign template to sign directly.
- **Vendor bill**: create a vendor bill using OCR and AI to scrape information from the file
content.
- **Customer invoice**: create a customer invoice using OCR and AI to scrape information from
the file.
- **Vendor credit note**: create a vendor credit note using OCR and AI to scrape information
from the file.
- **Credit note**: create a customer credit note using OCR and AI to scrape information from
the file.
- **Applicant**: create a new HR application you can edit directly.
- :guilabel:`Link to record`
- :guilabel:`Product template`: create a product you can edit directly.
- :guilabel:`Task`: create a Project task you can edit directly.
- :guilabel:`Signature PDF Template`: : open PDF in Sign to create a template.
- :guilabel:`PDF to sign`: open PDF in Sign to create a template.
- :guilabel:`Applicant`: create a new HR application you can edit directly.
- :guilabel:`Vendor bill`: create a vendor bill using OCR and AI to scrape information from the file content.
- :guilabel:`Customer invoice`: create a customer invoice using OCR and AI to scrape information from the file.
- :guilabel:`Vendor credit note`: create a vendor credit note using OCR and AI to scrape information from the file.
- :guilabel:`Credit note`: create a customer credit note using OCR and AI to scrape information from the file.
- **Set Tags**: add, remove, and replace any number of tags.
- **Activities - Mark all as Done**: mark all activities linked to the file as done.
- **Activities - Schedule Activity**: create a new activity linked to the file as configured in
the action. You can choose to set the activity on the document owner.
- **Set Tags**: add, replace by or remove any number of tags.
.. image:: documents/workflow-action-example.png
:align: center
:alt: Example of a workflow action Odoo Documents
In the :guilabel:`Activities` section, you can decide to:
- :guilabel:`Mark all as Done`: mark all activities linked to the file as done.
- :guilabel:`Schedule Activity`: create a new activity linked to the file as configured in the action.
Digitize documents with OCR and Artificial Intelligence
=======================================================
Documents available in the Finance workspace can be digitized. Select the document you want to
digitize, click on :guilabel:`Create Bill`, :guilabel:`Create Customer Invoice` or
:guilabel:`Create credit note`, and then click on :guilabel:`Send for Digitization`.
.. seealso::
- `AI-powered document digitization <https://www.odoo.com/documentation/15.0/applications/finance/accounting/payables/supplier_bills/invoice_digitization.html>`_

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -123,7 +123,7 @@ Online payment providers
-
-
* - :doc:`Razorpay <payment_providers/razorpay>`
- Payment from Odoo
- Payment from the provider website
-
- Full only
- Full and partial

View File

@@ -36,12 +36,11 @@ Configuration on Odoo
#. Configure the rest of the options to your liking.
.. important::
- If you configure Odoo to capture amounts manually, make sure to set the
:guilabel:`Manual Capture` to :guilabel:`manual` on Razorpay. Otherwise, the transaction
would be blocked in the authorized state in Odoo. To do so, go to your Razorpay Dashboard and
then to :menuselection:`Settings --> Configuration`.
- After **five days**, if the transaction hasn't been captured yet, the customer has the right
to **revoke** it.
If you configure Odoo to capture amounts manually:
- Be aware that the **manual voiding** of a transaction is not supported by Razorpay.
- After **five days**, if the transaction hasn't been captured yet, it'll automatically be
**voided**.
.. seealso::
- :doc:`../payment_providers`

View File

@@ -131,4 +131,4 @@ at an invoice/bills level or at a sales/purchase orders level.
.. seealso::
- :doc:`Multi-company Guidelines </developer/howtos/company>`
- :doc:`../../finance/accounting/others/multicurrencies/how_it_works`
- :doc:`../../finance/accounting/others/multi_currency`

View File

@@ -1,35 +1,45 @@
=======================
Variants BOM Management
=======================
==================================
Managing BoMs for product variants
==================================
Odoo allows you to use one bill of materials for multiple variants of
the same product. To activate variants, simply go to :menuselection:`Configuration --> Settings
--> Variants`.
Odoo allows one bill of materials (BoM) to be used for multiple variants of the same product.
Having a consolidated BoM for a product with variants saves time by preventing the need to manage
multiple BoMs.
.. image:: product_variants/bom-variants1.png
:align: center
Activate product variants
=========================
You will then be able to specify which BOM component lines are to be used in
the manufacture of each product variant. You may specify multiple
variants for each line. If no variant is specified on a component line,
then this component will be used in the BOM of all variants.
To activate variants, simply navigate to :menuselection:`Inventory --> Configuration --> Settings
--> Products`, and then enable the :guilabel:`Variants` option. After that, click :guilabel:`Save`
to apply the setting. For more information on configuring product variants, refer to :doc:`this
page <../../../sales/sales/products_prices/products/variants>`.
When defining variant BoMs on a line-item-basis, the **Product
Variant** field in the main section of the BoM should be left blank as shown
below. This field is used when creating a BoM for one specific variant
of a product only.
.. image:: product_variants/inventory-variants-settings.png
:align: center
:alt: Selecting "Variants" from Inventory app settings.
Apply BoM components to product variants
========================================
.. image:: product_variants/kit-bom1.png
:align: center
Next, create a new BoM or edit an existing one by going to :menuselection:`Manufacturing -->
Products --> Bills of Materials`. Then, click :guilabel:`Edit`. The :guilabel:`Apply on Variants`
option to assign components to specific product variants on the BoM is available once the
:guilabel:`Variants` setting is activated from the :guilabel:`Inventory` application. If the
:guilabel:`Apply on Variants` field is not immediately visible, activate it from the additional
options menu.
Note that the same principle applies for the configuration
of operations.
.. image:: product_variants/variants-kebab-menu.png
:align: center
:alt: "Apply on Variants" option on the additional options menu.
.. image:: product_variants/kit-bom2.png
:align: center
Each component can be assigned to multiple variants. Components with no variants specified are used
in every variant of the product. The same principle applies when configuring operations and
by-products.
And for the production of by-products.
When defining variant BoMs by component assignment, the :guilabel:`Product Variant` field in the
main section of the BoM should be left blank, as shown below. This field is used only when creating
a BoM specifically for one product variant.
.. image:: product_variants/kit-bom3.png
:align: center
.. image:: product_variants/apply-on-variants-bom.png
:align: center
:alt: Applying components to multiple variants.

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View File

@@ -9,40 +9,42 @@ sales processes, using *Sales Teams*.
Create a new Sales Team
=======================
To create a new Sales Team, go to :menuselection:`CRM --> Configuration --> Sales Teams` then
click **Create**.
To create a new Sales Team, go to :menuselection:`CRM --> Sales --> Teams` then click
:guilabel:`Create`.
On the creation page, set an *Email Alias* to automatically generate a lead/opportunity for this
Sales Team every time a message is sent to that unique email address. You can also choose whether
to accept emails from *Everyone*, *Authenticated Partners*, or *Followers Only*.
On the creation page, set an :guilabel:`Email Alias` to automatically generate a lead/opportunity
for this Sales Team every time a message is sent to that unique email address. You can also choose
whether to accept emails from :guilabel:`Everyone`, :guilabel:`Authenticated Partners`, or
:guilabel:`Followers Only`.
Set a *Domain* to assign leads/opportunities to this Sales Team based on specific filters, such as
country, language, or campaign. Set an *Invoicing Target* if this team has specific monthly revenue
goals.
Set a :guilabel:`Domain` to assign leads/opportunities to this Sales Team based on specific
filters, such as country, language, or campaign. Set an :guilabel:`Invoicing Target` if this team
has specific monthly revenue goals.
.. image:: multi_sales_team/sales-team-creation.png
:align: center
:alt: Creating a Sales Team
:alt: Create a Sales Team in Odoo CRM.
Add members to a Sales Team
---------------------------
To add team members, click **Add** under the Assignment tab when editing the Sales Team's
To add team members, click :guilabel:`Add` under the Assignment tab when editing the Sales Team's
configuration page. Select a salesperson from the dropdown menu or create new salesperson. Set a
maximum number of leads that can be assigned to this salesperson in a 30-day period to ensure that
they do not overwork.
.. image:: multi_sales_team/add-a-salesperson.png
:align: center
:alt: Adding a Salesperson
:alt: Add a Salesperson inside Odoo CRM.
One person can be added as a team member or Team Leader to multiple Sales Teams, allowing them to access all of the pipelines that they need to.
One person can be added as a team member or Team Leader to multiple Sales Teams, allowing them to
access all of the pipelines that they need to.
Sales Team dashboard
====================
To view the Sales Team dashboard, go to :menuselection:`CRM --> Configuration --> Sales Teams`. Any
teams you are a part of will appear as dashboard tiles.
To view the Sales Team dashboard, go to :menuselection:`CRM --> Sales --> Teams`. Any teams you are
a part of will appear as dashboard tiles.
Each tile gives an overview of the Sales Team's open opportunities, quotations, sales orders, and
expected revenue, as well as a bar graph of new opportunities per week and an invoicing progress
@@ -50,7 +52,7 @@ bar.
.. image:: multi_sales_team/sales-team-overview.png
:align: center
:alt: Sales Team Overview
:alt: Sales Team Overview dashboard in Odoo CRM.
Click on the three dots in the corner of a tile to open a navigational menu that lets you quickly
view documents or reports, create new quotations or opportunities, pick a color for this team, or
@@ -58,8 +60,6 @@ access its configuration page.
.. image:: multi_sales_team/team-overview-three-dot-menu.png
:align: center
:alt: Three Dot Menu
Click on the **Pipeline** button to go directly to that team's CRM pipeline.
:alt: Click the Three Dot Menu in Odoo CRM dashboard to view documents and create opportunities.
Click on the :guilabel:`Pipeline` button to go directly to that team's CRM pipeline.

View File

@@ -14,3 +14,4 @@ Send Quotations
send_quotations/deadline
send_quotations/different_addresses
send_quotations/terms_and_conditions
send_quotations/orders_and_variants

View File

@@ -0,0 +1,79 @@
===================================================
Use product variants on quotations and sales orders
===================================================
Product variants can be added to quotations and sales orders using the Product Configurator,
Variant Grid Entry, or both.
Configuration
=============
To enable product variants on quotations and sales orders, go to :menuselection:`Sales -->
Configuration --> Settings --> Product Catalog` and activate one or both of the
:guilabel:`Product Configurator` and :guilabel:`Variant Grid Entry` settings. Finally, click
:guilabel:`Save` to apply the settings.
.. image:: orders_and_variants/activating-entry-type-settings.png
:align: center
:alt: Activating entry type settings.
After saving the settings, configure the product form. Head over to :menuselection:`Sales -->
Products --> Products` and select any product (or click :guilabel:`Create` to create a new one).
On the product form, click :guilabel:`Edit`, and then click on the :guilabel:`Variants` tab. Under
:guilabel:`Sales Variant Selection`, choose either :guilabel:`Product Configurator` or
:guilabel:`Order Grid Entry`. This selection determines which method is used to add the product to
quotations or sales orders. Finally, click :guilabel:`Save` to apply the setting.
.. image:: orders_and_variants/sales-variant-selection.png
:align: center
:alt: Sales variant selection.
.. note::
The product must have at least two variants (one attribute with two values) created in order for
the :guilabel:`Sales Variant Selection` option to appear. Click :guilabel:`Add a line` under
:guilabel:`Attribute` to add attributes and values to this product and create product variants.
Use the Product Configurator
============================
The :guilabel:`Product Configurator` appears on a quotation or sales order when products are added
that have both variants configured and the :guilabel:`Product Configurator` option selected.
The :guilabel:`Product Configurator` lets salespeople choose exactly which product variant to add
to the quotation or sales order using a format similar to online shopping. Color options display
any HTML color codes set up in the :guilabel:`Color` attribute. Features with an additional cost
will display the additional cost next to their name. Once the desired product variant attributes
are selected, click :guilabel:`Add` to add the product variant to the quotation or sales order.
.. image:: orders_and_variants/configurator-price-extras.png
:align: center
:alt: Product Configurator and Price Extras.
By default, the product variant attributes are displayed on the quotation or sales order in the
:guilabel:`Description` column, but the :guilabel:`Product Variant` column can be added through the
additional options menu (3 vertical dots icon).
Use Variant Grid Entries
========================
:guilabel:`Variant Grid Entries` appear on a quotation or sales order when products are added that
have both variants configured and the :guilabel:`Order Grid Entry` option selected. Grid entry can
streamline the process of creating large, varied quotations by letting salespeople enter exact
quantities of each product variant all at once.
:guilabel:`Variant Grid Entry` displays a grid of every variant available for the selected product.
Choose the exact quantities of each product variant for a quotation or sales order by typing in the
number or using the arrows. :guilabel:`Not Available` is displayed when a particular variant has
been deactivated in the database. Once all the product variants and their quantities have been set,
click :guilabel:`Confirm` to add them to the quotation or sales order.
.. image:: orders_and_variants/grid-entry-popup-amounts.png
:align: center
:alt: Variant Grid Entry pop-up.
Each product variant appears as an individual line item on the quotation or sales order, because
each of these items has its own stock.
.. image:: orders_and_variants/grid-variants-line-items.png
:align: center
:alt: Line items for grid variants.

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

View File

@@ -7,6 +7,14 @@ all of its data are also available from the outside for external analysis or
integration with various tools. Part of the :ref:`reference/orm/model` API is
easily available over XML-RPC_ and accessible from a variety of languages.
.. important::
Starting with PHP8, the XML-RPC extension may not be available by default.
Check out the `manual <https://www.php.net/manual/en/xmlrpc.installation.php>`_
for the installation steps.
.. seealso::
- :doc:`Tutorial on web services <../howtos/web_services>`
Connection
==========

View File

@@ -11,6 +11,7 @@ Tutorials
howtos/themes
howtos/website
howtos/backend
howtos/web_services
howtos/profilecode
howtos/company
howtos/accounting_localization

View File

@@ -1369,151 +1369,6 @@ Dashboards
and automatically displayed in the web client when the OpenAcademy main
menu is selected.
WebServices
===========
The web-service module offer a common interface for all web-services :
- XML-RPC
- JSON-RPC
Business objects can also be accessed via the distributed object
mechanism. They can all be modified via the client interface with contextual
views.
Odoo is accessible through XML-RPC/JSON-RPC interfaces, for which libraries
exist in many languages.
XML-RPC Library
---------------
The following example is a Python 3 program that interacts with an Odoo
server with the library ``xmlrpc.client``::
import xmlrpc.client
root = 'http://%s:%d/xmlrpc/' % (HOST, PORT)
uid = xmlrpc.client.ServerProxy(root + 'common').login(DB, USER, PASS)
print("Logged in as %s (uid: %d)" % (USER, uid))
# Create a new note
sock = xmlrpc.client.ServerProxy(root + 'object')
args = {
'color' : 8,
'memo' : 'This is a note',
'create_uid': uid,
}
note_id = sock.execute(DB, uid, PASS, 'note.note', 'create', args)
.. exercise:: Add a new service to the client
Write a Python program able to send XML-RPC requests to a PC running
Odoo (yours, or your instructor's). This program should display all
the sessions, and their corresponding number of seats. It should also
create a new session for one of the courses.
.. only:: solutions
.. code-block:: python
import functools
import xmlrpc.client
HOST = 'localhost'
PORT = 8069
DB = 'openacademy'
USER = 'admin'
PASS = 'admin'
ROOT = 'http://%s:%d/xmlrpc/' % (HOST,PORT)
# 1. Login
uid = xmlrpc.client.ServerProxy(ROOT + 'common').login(DB,USER,PASS)
print("Logged in as %s (uid:%d)" % (USER,uid))
call = functools.partial(
xmlrpc.client.ServerProxy(ROOT + 'object').execute,
DB, uid, PASS)
# 2. Read the sessions
sessions = call('openacademy.session','search_read', [], ['name','seats'])
for session in sessions:
print("Session %s (%s seats)" % (session['name'], session['seats']))
# 3.create a new session
session_id = call('openacademy.session', 'create', {
'name' : 'My session',
'course_id' : 2,
})
Instead of using a hard-coded course id, the code can look up a course
by name::
# 3.create a new session for the "Functional" course
course_id = call('openacademy.course', 'search', [('name','ilike','Functional')])[0]
session_id = call('openacademy.session', 'create', {
'name' : 'My session',
'course_id' : course_id,
})
JSON-RPC Library
----------------
The following example is a Python 3 program that interacts with an Odoo server
with the standard Python libraries ``urllib.request`` and ``json``. This
example assumes the **Productivity** app (``note``) is installed::
import json
import random
import urllib.request
HOST = 'localhost'
PORT = 8069
DB = 'openacademy'
USER = 'admin'
PASS = 'admin'
def json_rpc(url, method, params):
data = {
"jsonrpc": "2.0",
"method": method,
"params": params,
"id": random.randint(0, 1000000000),
}
req = urllib.request.Request(url=url, data=json.dumps(data).encode(), headers={
"Content-Type":"application/json",
})
reply = json.loads(urllib.request.urlopen(req).read().decode('UTF-8'))
if reply.get("error"):
raise Exception(reply["error"])
return reply["result"]
def call(url, service, method, *args):
return json_rpc(url, "call", {"service": service, "method": method, "args": args})
# log in the given database
url = "http://%s:%s/jsonrpc" % (HOST, PORT)
uid = call(url, "common", "login", DB, USER, PASS)
# create a new note
args = {
'color': 8,
'memo': 'This is another note',
'create_uid': uid,
}
note_id = call(url, "object", "execute", DB, uid, PASS, 'note.note', 'create', args)
Examples can be easily adapted from XML-RPC to JSON-RPC.
.. note::
There are a number of high-level APIs in various languages to access Odoo
systems without *explicitly* going through XML-RPC or JSON-RPC, such as:
* https://github.com/akretion/ooor
* https://github.com/OCA/odoorpc
* https://github.com/nicolas-van/openerp-client-lib
* http://pythonhosted.org/OdooRPC
* https://github.com/abhishek-jaiswal/php-openerp-lib
.. [#autofields] it is possible to :ref:`disable the automatic creation of some
fields <reference/fields/automatic/log_access>`
.. [#rawsql] writing raw SQL queries is possible, but requires care as it

View File

@@ -89,27 +89,27 @@ the ``res.groups`` model. They are normally part of a module's :ref:`master data
As simple example `can be found here <https://github.com/odoo/odoo/blob/532c083cbbe0ee6e7a940e2bdc9c677bd56b62fa/addons/hr/security/hr_security.xml#L9-L14>`_.
.. admonition:: what is the *category_id*?
``category_id`` a *module category*, it is automatically generated from the
:ref:`category defined in module manifest files <howto/rdtraining/03_newapp>`.
.. todo:: the demo module needs to have the category set, to
*Real Estate/Brokerage*, ideally the newapp part would already do
that
.. exercise::
Create the ``security.xml`` file in the appropriate folder and add it to the
``__manifest__.py`` file.
#. Create the ``security.xml`` file in the appropriate folder and add it to the ``__manifest__.py`` file.
Add a record creating a group with the id ``estate_group_user``, the name
"Agent" and the category ``base.module_category_real_estate_brokerage``.
#. If not already, add a ``'category'`` field to your ``__manifest__.py`` with value ``Real Estate/Brokerage``.
Below that, add a record creating a group with the id
``estate_group_manager``, the name "Manager" and the category
``base.module_category_real_estate_brokerage``. The ``estate_group_manager``
group needs to imply ``estate_group_user``.
#. Add a record creating a group with the id ``estate_group_user``, the name "Agent"
and the category ``base.module_category_real_estate_brokerage``.
#. Below that, add a record creating a group with the id ``estate_group_manager``,
the name "Manager" and the category ``base.module_category_real_estate_brokerage``.
The ``estate_group_manager`` group needs to imply ``estate_group_user``.
.. note::
Where does that **category** comes from ? It's a *module category*.
Here we used the category id ``base.module_category_real_estate_brokerage``
which was automatically generated by Odoo based on the `category` set in the ``__manifest__.py`` of the module.
You can also find here the list of
`default module categories <https://github.com/odoo/odoo/blob/71da80deb044852a2af6b111d695f94aad7803ac/odoo/addons/base/data/ir_module_category_data.xml>`_
provided by Odoo.
.. tip::

View File

@@ -0,0 +1,148 @@
============
Web Services
============
The web-service module offer a common interface for all web-services :
- XML-RPC
- JSON-RPC
Business objects can also be accessed via the distributed object
mechanism. They can all be modified via the client interface with contextual
views.
Odoo is accessible through XML-RPC/JSON-RPC interfaces, for which libraries
exist in many languages.
XML-RPC Library
---------------
The following example is a Python 3 program that interacts with an Odoo
server with the library ``xmlrpc.client``::
import xmlrpc.client
root = 'http://%s:%d/xmlrpc/' % (HOST, PORT)
uid = xmlrpc.client.ServerProxy(root + 'common').login(DB, USER, PASS)
print("Logged in as %s (uid: %d)" % (USER, uid))
# Create a new note
sock = xmlrpc.client.ServerProxy(root + 'object')
args = {
'color' : 8,
'memo' : 'This is a note',
'create_uid': uid,
}
note_id = sock.execute(DB, uid, PASS, 'note.note', 'create', args)
.. exercise:: Add a new service to the client
Write a Python program able to send XML-RPC requests to a PC running
Odoo (yours, or your instructor's). This program should display all
the sessions, and their corresponding number of seats. It should also
create a new session for one of the courses.
.. only:: solutions
.. code-block:: python
import functools
import xmlrpc.client
HOST = 'localhost'
PORT = 8069
DB = 'openacademy'
USER = 'admin'
PASS = 'admin'
ROOT = 'http://%s:%d/xmlrpc/' % (HOST,PORT)
# 1. Login
uid = xmlrpc.client.ServerProxy(ROOT + 'common').login(DB,USER,PASS)
print("Logged in as %s (uid:%d)" % (USER,uid))
call = functools.partial(
xmlrpc.client.ServerProxy(ROOT + 'object').execute,
DB, uid, PASS)
# 2. Read the sessions
sessions = call('openacademy.session','search_read', [], ['name','seats'])
for session in sessions:
print("Session %s (%s seats)" % (session['name'], session['seats']))
# 3.create a new session
session_id = call('openacademy.session', 'create', {
'name' : 'My session',
'course_id' : 2,
})
Instead of using a hard-coded course id, the code can look up a course
by name::
# 3.create a new session for the "Functional" course
course_id = call('openacademy.course', 'search', [('name','ilike','Functional')])[0]
session_id = call('openacademy.session', 'create', {
'name' : 'My session',
'course_id' : course_id,
})
.. seealso::
- :doc:`../api/external_api`: The in-depth tutorial on XML-RPC with examples spanning multiple programming languages.
JSON-RPC Library
----------------
The following example is a Python 3 program that interacts with an Odoo server
with the standard Python libraries ``urllib.request`` and ``json``. This
example assumes the **Productivity** app (``note``) is installed::
import json
import random
import urllib.request
HOST = 'localhost'
PORT = 8069
DB = 'openacademy'
USER = 'admin'
PASS = 'admin'
def json_rpc(url, method, params):
data = {
"jsonrpc": "2.0",
"method": method,
"params": params,
"id": random.randint(0, 1000000000),
}
req = urllib.request.Request(url=url, data=json.dumps(data).encode(), headers={
"Content-Type":"application/json",
})
reply = json.loads(urllib.request.urlopen(req).read().decode('UTF-8'))
if reply.get("error"):
raise Exception(reply["error"])
return reply["result"]
def call(url, service, method, *args):
return json_rpc(url, "call", {"service": service, "method": method, "args": args})
# log in the given database
url = "http://%s:%s/jsonrpc" % (HOST, PORT)
uid = call(url, "common", "login", DB, USER, PASS)
# create a new note
args = {
'color': 8,
'memo': 'This is another note',
'create_uid': uid,
}
note_id = call(url, "object", "execute", DB, uid, PASS, 'note.note', 'create', args)
Examples can be easily adapted from XML-RPC to JSON-RPC.
.. note::
There are a number of high-level APIs in various languages to access Odoo
systems without *explicitly* going through XML-RPC or JSON-RPC, such as:
* https://github.com/akretion/ooor
* https://github.com/OCA/odoorpc
* https://github.com/nicolas-van/openerp-client-lib
* http://pythonhosted.org/OdooRPC
* https://github.com/abhishek-jaiswal/php-openerp-lib

View File

@@ -35,13 +35,6 @@ dictionary, where each key specifies module metadatum.
'demo': [
'demo/demo_data.xml',
],
'assets': {
'module.bundle_name': [
'module/static/src/*.js'
'module/static/src/*.scss'
'module/static/src/*.xml'
]
}
}
Available manifest fields are:

View File

@@ -4,49 +4,6 @@
Changelog
=========
Odoo version 16.0
=================
- The change with static XML into bundle asset impacting all modules has just been merged.
https://github.com/odoo/odoo/commit/f05adbc8b59c67cbec4847687a1ee07e620c2a7a
Assets declared in "__manifest__.py" can now contain static xml files (for owl & qweb templates).
The "web.assets_qweb" bundle including almost all the static xml and the widget attributes `xmlDependencies` have been removed.
The file `@web/core/assets.js` now contains more general asset utility functions (loadJS, loadCSS, getBundle, loadBundle).
Legacy file `ajax.js` is deprecated and will be removed and should not be used anymore.
When a bundle is lazy loaded (from loadBundle), it is considered to be loaded when the JS, CSS and XML templates are loaded.
Example:
Version before:
.. code-block:: python
'web.assets_qweb': [
'module_name/static/src/folder/template.xml',
],
'web.assets_backend': [
'module_name/static/src/folder/component.js',
'module_name/static/src/folder/*.scss',
],
+ xmlDependencies: ['/module_name/static/folder/template2.xml'],
+ await ajax.loadXML('/module_name/static/folder/template3.xml', qweb);
Is now:
.. code-block:: python
'web.assets_backend': [
'module_name/static/src/folder/component.js',
'module_name/static/src/folder/*.scss',
'module_name/static/src/folder/*.xml',
],
or simplify into:
.. code-block:: python
'web.assets_backend': [
'module_name/static/src/folder/*',
],
Odoo Online version 15.4
========================

View File

@@ -478,7 +478,7 @@ calendar view are:
you can add a filter and save the result in the defined model, the
filter is added in the sidebar. The ``filter_field`` is optional and allows
you to specify the field that will hold the status of the filter.
``filter`` and ``color``
``filters`` and ``color``
use "True" to add this field in filter in the sidebar. You can specify
a ``color`` field used to colorize the checkbox.
@@ -1164,6 +1164,10 @@ take the following attributes:
if set to true, the gantt view will start at the first record,
instead of starting at the beginning of the year/month/day.
``pill_label``
If set to true, the time appears in the pill label when the scale is set on week or month. (e.g.
`7:00 AM - 11:00 AM (4h) - DST Task 1`)
``thumbnails``
This allows to display a thumbnail next to groups name if the group is a relationnal field.
This expects a python dict which keys are the name of the field on the active model.

View File

@@ -38,7 +38,7 @@ Template
Templates (static `xml` files) are handled in a different way: they are simply
read from the file system whenever they are needed, and concatenated.
Whenever the browser loads odoo, it calls the `/web/webclient/qweb?bundle=module.bundle_name` controller
Whenever the browser loads odoo, it calls the `/web/webclient/qweb/` controller
to fetch the :ref:`templates <reference/qweb>`.
It is useful to know that in most cases, a browser only performs a request the
@@ -67,7 +67,6 @@ like this:
'assets': {
'web.assets_backend': [
'web/static/src/core/**/*',
'web/static/src/xml/**/*',
],
'web.assets_common': [
@@ -94,6 +93,9 @@ know:
- `web.assets_frontend`: this bundle is about all that is specific to the public
website: ecommerce, portal, forum, blog, ...
- `web.assets_qweb`: all static XML templates used in the backend environment
and in the point of sale.
- `web.qunit_suite_tests`: all javascript qunit testing code (tests, helpers, mocks)
- `web.qunit_mobile_suite_tests`: mobile specific qunit testing code
@@ -365,3 +367,4 @@ manifest counterparts.
`sequence` (default= `16`)
Loading order of the asset records (ascending). A sequence lower than 16 means
that the asset will be processed *before* the ones declared in the manifest.

View File

@@ -311,8 +311,8 @@ Here is an example of a basic counter widget:
});
For this example, assume that the template *some.template* (and is properly
loaded: the template is in a file, which is properly defined in the bundle of
the module manifest, in the same bundle as the JavaScript file, see
loaded: the template is in a file, which is properly defined in the assets of
the module manifest ``'assets': {'web.assets_qweb': [...]}``, see
:ref:`assets <reference/assets>`.) is given by:
.. code-block:: xml
@@ -444,18 +444,18 @@ Widget API
initialized but before it has been started. The root element generated by
the template will be set as the DOM root of the widget.
.. attribute:: Widget.assetLibs
.. attribute:: Widget.xmlDependencies
List of paths to bundle assets that need to be loaded before the
List of paths to xml files that need to be loaded before the
widget can be rendered. This will not induce loading anything that has already
been loaded. This is useful when you want to load your module ans files lazily,
been loaded. This is useful when you want to load your templates lazily,
or if you want to share a widget between the website and the web client
interface.
.. code-block:: javascript
var EditorMenuBar = Widget.extend({
assetLibs: ['web_editor.assets_wysiwyg'],
xmlDependencies: ['/web_editor/static/src/xml/editor.xml'],
...
.. attribute:: Widget.events
@@ -637,18 +637,21 @@ override the *renderElement* method to do something else).
The Qweb JS template engine is based on XML, and is mostly compatible with the
python implementation.
The bundle contains the JavaScript code, the CSS files and the xml templates
from the manifest. It is also possible to lazy-load another bundle's from
`getBundle` and `loadBundle` defined in `@web/core/assets.js` file.
Now, let us explain how the templates are loaded. Whenever the web client
starts, a rpc is made to the */web/webclient/qweb* route. The server will then
return a list of all templates defined in data files for each installed modules.
The correct files are listed in the *web.assets_qweb* entry in each module
manifest. It is also possible to lazy-load another bundle's templates by calling
this same route and giving it the corresponding "bundle" query parameter.
The web client will wait for that list of template to be loaded, before starting
its first widget.
This mechanism works quite well for our needs, but sometimes, we want to lazy
load a template and JavaScript. For example, imagine that we have a widget
which is rarely used. In that case, maybe we prefer to not load its files in
the main file, in order to make the web client slightly lighter. In that case,
we can use the *assetLibs* key of the Widget:
load a template. For example, imagine that we have a widget which is rarely
used. In that case, maybe we prefer to not load its template in the main file,
in order to make the web client slightly lighter. In that case, we can use the
*xmlDependencies* key of the Widget:
.. code-block:: javascript
@@ -656,15 +659,14 @@ we can use the *assetLibs* key of the Widget:
var Counter = Widget.extend({
template: 'some.template',
assetLibs: ['module.bundle_name'],
xmlDependencies: ['/myaddon/path/to/my/file.xml'],
...
});
With this, the *Counter* widget will get the file list and load the files and
wait that the template is fully loaded in its *willStart* method, so the
template will be ready when the rendering is performed.
With this, the *Counter* widget will load the xmlDependencies files in its
*willStart* method, so the template will be ready when the rendering is performed.
Event system

View File

@@ -1,5 +1,8 @@
# applications/finance
applications/finance/accounting/others/multicurrencies/exchange.rst applications/finance/accounting/others/multi_currency.rst # /multicurrencies/* -> multi_currency
applications/finance/accounting/others/multicurrencies/how_it_works.rst applications/finance/accounting/others/multi_currency.rst # /multicurrencies/* -> multi_currency
applications/finance/accounting/others/multicurrencies/invoices_payments.rst applications/finance/accounting/others/multi_currency.rst # /multicurrencies/* -> multi_currency
applications/finance/accounting/payables/supplier_bills/ocr.rst applications/finance/accounting/payables/supplier_bills/invoice_digitization.rst # ocr --> invoice_digitization
# applications/general