Compare commits
14 Commits
master-xml
...
master-doc
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
7076e18115 |
[IMP] documents: update and improve the docuemnts doc page
ID: 2899532 |
||
|
|
7424e4176c |
[IMP] website: register domain name menu path
closes odoo/documentation#2766
X-original-commit:
|
||
|
|
8287c88bd4 |
[IMP] MRP: updated Variants BOM Management rst content
closes odoo/documentation#2764
X-original-commit:
|
||
|
|
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:
|
||
|
|
2c7d61f938 |
[FIX] accounting: grammar fix in ponto
closes odoo/documentation#2759
X-original-commit:
|
||
|
|
cdb71bb807 |
[IMP] accounting: update + merge of multiple multi-currency pages
task id: 2942040
closes odoo/documentation#2744
X-original-commit:
|
||
|
|
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:
|
||
|
|
fa5dcc6940 |
[ADD] Sales: adding doc about variants in orders
closes odoo/documentation#2735
Task: 2574874
X-original-commit:
|
||
|
|
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:
|
||
|
|
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> |
||
|
|
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> |
||
|
|
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> |
||
|
|
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:
|
||
|
|
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:
|
2
conf.py
|
|
@@ -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(
|
||||
|
|
|
|||
|
|
@@ -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
|
||||
|
||||
|
|
|
|||
BIN
content/administration/maintain/domain_names/register-menu.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 38 KiB |
|
|
@@ -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
|
||||
---------------------------------------
|
||||
|
|
|
|||
|
|
@@ -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
|
||||
---------------------
|
||||
|
|
|
|||
|
|
@@ -7,7 +7,7 @@ Others
|
|||
.. toctree::
|
||||
:titlesonly:
|
||||
|
||||
others/multi_currency
|
||||
others/analytic
|
||||
others/adviser
|
||||
others/multicurrencies
|
||||
others/inventory
|
||||
|
|
@@ -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.
|
||||
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 3.9 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 3.1 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 6.6 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 7.2 KiB |
|
|
@@ -1,12 +0,0 @@
|
|||
:nosearch:
|
||||
|
||||
=============
|
||||
Multicurrency
|
||||
=============
|
||||
|
||||
.. toctree::
|
||||
:titlesonly:
|
||||
|
||||
multicurrencies/how_it_works
|
||||
multicurrencies/invoices_payments
|
||||
multicurrencies/exchange
|
||||
|
|
@@ -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`
|
||||
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 5.5 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 6.9 KiB |
|
Before Width: | Height: | Size: 7.1 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 7.3 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 7.4 KiB |
|
|
@@ -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.
|
||||
|
|
@@ -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`
|
||||
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 7.2 KiB |
|
Before Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 7.2 KiB |
|
Before Width: | Height: | Size: 7.4 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
|
@@ -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`
|
||||
|
Before Width: | Height: | Size: 7.2 KiB |
|
Before Width: | Height: | Size: 7.4 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
|
@@ -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>`_
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 6.4 KiB |
|
Before Width: | Height: | Size: 6.8 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 6.9 KiB |
BIN
content/applications/finance/documents/files-centralization.png
Normal file
|
After Width: | Height: | Size: 6.3 KiB |
BIN
content/applications/finance/documents/right-panel-options-2.png
Normal file
|
After Width: | Height: | Size: 7.4 KiB |
BIN
content/applications/finance/documents/right-panel-options.png
Normal file
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 7.1 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
|
@@ -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
|
||||
|
|
|
|||
|
|
@@ -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`
|
||||
|
|
|
|||
|
|
@@ -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`
|
||||
|
|
@@ -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.
|
||||
|
|
|
|||
|
After Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 48 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 58 KiB |
|
Before Width: | Height: | Size: 62 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
|
@@ -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.
|
||||
|
|
|
|||
|
|
@@ -14,3 +14,4 @@ Send Quotations
|
|||
send_quotations/deadline
|
||||
send_quotations/different_addresses
|
||||
send_quotations/terms_and_conditions
|
||||
send_quotations/orders_and_variants
|
||||
|
|
|
|||
|
|
@@ -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.
|
||||
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 7.6 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 55 KiB |
|
|
@@ -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
|
||||
==========
|
||||
|
||||
|
|
|
|||
|
|
@@ -11,6 +11,7 @@ Tutorials
|
|||
howtos/themes
|
||||
howtos/website
|
||||
howtos/backend
|
||||
howtos/web_services
|
||||
howtos/profilecode
|
||||
howtos/company
|
||||
howtos/accounting_localization
|
||||
|
|
|
|||
|
|
@@ -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
|
||||
|
|
|
|||
|
|
@@ -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::
|
||||
|
||||
|
|
|
|||
148
content/developer/howtos/web_services.rst
Normal 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
|
||||
|
|
@@ -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:
|
||||
|
|
|
|||
|
|
@@ -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
|
||||
========================
|
||||
|
||||
|
|
|
|||
|
|
@@ -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.
|
||||
|
|
|
|||
|
|
@@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@@ -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
|
||||
|
|
|
|||
|
|
@@ -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
|
||||
|
|
|
|||