Compare commits
33 Commits
master-met
...
master-dve
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7d43958d7b | ||
|
|
b84e81d3a1 | ||
|
|
4f098945d7 | ||
|
|
86fac322d3 | ||
|
|
958fa599e1 | ||
|
|
0604fb56f9 | ||
|
|
3fe09dd653 | ||
|
|
06eaf3a0c7 | ||
|
|
14c0438764 | ||
|
|
db3db3c727 | ||
|
|
1be6f341dd | ||
|
|
39541bb745 | ||
|
|
157c1e18ea | ||
|
|
ab5c9feb40 | ||
|
|
6c3385cf90 | ||
|
|
b53427ddde | ||
|
|
e6dbd3d9e4 | ||
|
|
646bfe2e2c | ||
|
|
e620f27378 | ||
|
|
f10c8d4ad2 | ||
|
|
b4cab2a3db | ||
|
|
999c8db465 | ||
|
|
6ec9eb1fcc | ||
|
|
baab56946f | ||
|
|
73499c595e | ||
|
|
2c1277d0f7 | ||
|
|
fc98af5814 | ||
|
|
d0b7363de5 | ||
|
|
65f1e3ce0a | ||
|
|
a48ebe55bf | ||
|
|
3d28850a40 | ||
|
|
83a68e4b9b | ||
|
|
be60243eff |
16
conf.py
@@ -478,8 +478,24 @@ def _generate_alternate_urls(app, pagename, templatename, context, doctree):
|
||||
_version = _version or app.config.version
|
||||
_lang = _lang or app.config.language or 'en'
|
||||
_canonical_page = f'{pagename}.html'
|
||||
|
||||
# legal translations have different URLs schemes as they are not managed on transifex
|
||||
# e.g. FR translation of /terms/enterprise => /fr/terms/enterprise_fr
|
||||
if pagename.startswith('legal/terms/'):
|
||||
if _lang in legal_translations and not pagename.endswith(f"_{_lang}"):
|
||||
# remove language code for current translation, set target one
|
||||
_page = re.sub("_[a-z]{2}$", "", pagename)
|
||||
if 'terms/i18n' not in _page:
|
||||
_page = _page.replace("/terms/", "/terms/i18n/")
|
||||
_canonical_page = f'{_page}_{_lang}.html'
|
||||
elif _lang == 'en' and pagename.endswith(tuple(f"_{l}" for l in legal_translations)):
|
||||
# remove language code for current translation, link to original EN one
|
||||
_page = re.sub("_[a-z]{2}$", "", pagename)
|
||||
_canonical_page = f'{_page.replace("/i18n/", "/")}.html'
|
||||
|
||||
if app.config.is_remote_build:
|
||||
_canonical_page = _canonical_page.replace('index.html', '')
|
||||
|
||||
return f'{_root}' \
|
||||
f'{f"/{_version}" if app.config.versions else ""}' \
|
||||
f'{f"/{_lang}" if _lang != "en" else ""}' \
|
||||
|
||||
@@ -47,3 +47,4 @@ functionalities, including functional support, upgrades, and hosting. `Pricing
|
||||
install/deploy
|
||||
install/cdn
|
||||
install/email_gateway
|
||||
install/geo_ip
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
==========================================
|
||||
Geo IP Installation (On-Premises Database)
|
||||
==========================================
|
||||
======
|
||||
Geo IP
|
||||
======
|
||||
|
||||
.. note::
|
||||
This documentation only applies to On-premise databases.
|
||||
|
||||
Installation
|
||||
============
|
||||
@@ -32,8 +35,8 @@ Installation
|
||||
.. seealso::
|
||||
- :doc:`CLI documentation </developer/reference/cli>`.
|
||||
|
||||
Test GeoIP Geolocation In Odoo Website
|
||||
======================================
|
||||
Test GeoIP geolocation in your Odoo website
|
||||
===========================================
|
||||
|
||||
Edit a web page to include some geo-ip information such as the country name of the current
|
||||
request IP address. To do so:
|
||||
@@ -52,7 +52,7 @@ able to read (IMAP) and send (SMTP) emails in the Microsoft 365 setup. First, cl
|
||||
Add a Permission` button and select :guilabel:`Microsoft Graph` under :guilabel:`Commonly Used
|
||||
Microsoft APIs`. After, select the :guilabel:`Delegated Permissions` option.
|
||||
|
||||
In the search bar, search for the following :guilabel:`Deregulated permissions` and click
|
||||
In the search bar, search for the following :guilabel:`Delegated permissions` and click
|
||||
:guilabel:`Add permissions` for each one:
|
||||
|
||||
- :guilabel:`SMTP.Send`
|
||||
|
||||
@@ -29,3 +29,24 @@ We advise that:
|
||||
- Your scheduled actions should be
|
||||
`idempotent <https://stackoverflow.com/a/1077421/3332416>`_: they must not
|
||||
cause side-effects if they are started more often than expected.
|
||||
|
||||
How do I know if I need more workers ?
|
||||
--------------------------------------
|
||||
|
||||
Workers are abstract units of resources allocated to your database. The more workers you have the more it can be accessed concurrently.
|
||||
|
||||
As a general rule of thumb, you should allocate about **1 worker per 25 users and 1 worker for every 5000 daily visitors**. However, this can vary considerably based on database usage, website characteristics, and code customizations.
|
||||
|
||||
Speed is only impacted if you have too much concurrency.
|
||||
|
||||
If things are getting slow, here are a couple of indications to tell if it's due to a high concurrency.
|
||||
|
||||
- When things gets slow, **everything is slowed down**, not just specific operations.
|
||||
- **The slowness comes and goes**, typically it's better outside of business hours. (There can be other reasons for this as well.)
|
||||
- :ref:`Open your monitoring <odoosh-gettingstarted-branches-tabs-monitoring>`, there is a graph indicating the number of **"concurrent requests (max)"**. This graphs is often high or shows a flat upper bound during a prolonged period of time.
|
||||
- Some requests get a **"429 Too Many Requests"** response code.
|
||||
|
||||
If you have these symptoms it's advisable to try increasing your workers.
|
||||
|
||||
.. warning::
|
||||
Sometimes this high concurrency is temporary or illegitimate, it's possible your website is being crawled or that you have misconfigured third party applications excessively sollicitating your database. To identify this, have a look at the IP adresses in your odoo logs to see if some are flooding.
|
||||
|
||||
@@ -208,6 +208,8 @@ You can also open terminals, Python consoles and even Odoo Shell consoles.
|
||||
You can open multiple tabs and drag-and-drop them to arrange the layout as you wish,
|
||||
for instance side by side.
|
||||
|
||||
.. _odoosh-gettingstarted-branches-tabs-monitoring:
|
||||
|
||||
Monitoring
|
||||
----------
|
||||
|
||||
|
||||
@@ -124,8 +124,14 @@ If not done yet, :ref:`install <general/install>` the :guilabel:`Peppol` module
|
||||
Registration
|
||||
------------
|
||||
|
||||
Go to :menuselection:`Accounting --> Configuration --> Settings`, tick the :guilabel:`Use PEPPOL
|
||||
Invoicing` checkbox, and fill in the following information:
|
||||
Go to :menuselection:`Accounting --> Configuration --> Settings`. If you do not have the
|
||||
Peppol module installed, first tick the :guilabel:`Enable PEPPOL` checkbox and then **manually
|
||||
save**.
|
||||
|
||||
.. image:: electronic_invoicing/peppol-install.png
|
||||
:alt: Peppol module installation
|
||||
|
||||
Fill in the following information:
|
||||
|
||||
- :guilabel:`Peppol EAS`. This is the Peppol Electronic Address Scheme and usually depends on your
|
||||
company's country. Odoo often prefills this with the most commonly used EAS code in your country.
|
||||
@@ -145,14 +151,21 @@ previous provider.
|
||||
.. image:: electronic_invoicing/peppol-settings.png
|
||||
:alt: Configuration for peppol
|
||||
|
||||
Finally, click on :guilabel:`Validate registration`.
|
||||
Finally, click :guilabel:`Validate registration`. If you want to explore or demo Peppol, you can
|
||||
choose to register in :guilabel:`Demo` mode. Otherwise, select :guilabel:`Live`.
|
||||
|
||||
.. image:: electronic_invoicing/peppol-demo-mode.png
|
||||
:alt: Peppol demo mode selection
|
||||
|
||||
.. note::
|
||||
When testing Peppol, the system parameter `account_peppol.edi.mode` can be changed to `test`.
|
||||
Then, the registration occurs on the test server.
|
||||
Then, a radio button appears with the option to register on the test server.
|
||||
|
||||
.. image:: electronic_invoicing/peppol-system-parameter.png
|
||||
:alt: Peppol test mode
|
||||
:alt: Peppol test mode parameter
|
||||
|
||||
.. image:: electronic_invoicing/peppol-test-mode-settings.png
|
||||
:alt: Peppol test mode selection
|
||||
|
||||
Now, you can request a verification code to be sent to you by clicking :guilabel:`Verify phone
|
||||
number`.
|
||||
@@ -205,6 +218,10 @@ is set to Valid.
|
||||
While Odoo prefills both the EAS code and the Endpoint number based on the information available
|
||||
for a contact, it is better to confirm these details directly with the contact.
|
||||
|
||||
It is possible to verify the Peppol participant status of several customers at once.
|
||||
To do so, go to :menuselection:`Accounting --> Customers --> Customers` and switch to the list view.
|
||||
Select the customers you want to verify and then click :menuselection:`Actions --> Verify Peppol`.
|
||||
|
||||
Send invoices
|
||||
-------------
|
||||
|
||||
@@ -216,6 +233,13 @@ invoice form. To queue multiple invoices, select them in the list view and click
|
||||
.. image:: electronic_invoicing/peppol-send-print.png
|
||||
:alt: Send peppol invoice
|
||||
|
||||
Posted invoices that can be sent via Peppol are marked as :guilabel:`Peppol Ready`.
|
||||
To display them, use the :guilabel:`Peppol Ready` filter or access the Accounting dashboard and
|
||||
click :guilabel:`Peppol ready invoices` on the corresponding sales journal.
|
||||
|
||||
.. image:: electronic_invoicing/peppol-ready-invoices.png
|
||||
:alt: Filter Peppol ready invoices
|
||||
|
||||
Once the invoices are sent via Peppol, the status is changed to :guilabel:`Processing`. The
|
||||
status is changed to `Done` after they have been successfully delivered to the contact's Access
|
||||
Point.
|
||||
@@ -228,6 +252,13 @@ Point.
|
||||
it displayed by selecting it from the optional columns, accessible from the top right corner of
|
||||
the Invoices list view.
|
||||
|
||||
A cron runs regularly to check the status of these invoices. It is possible to check the status
|
||||
before the cron runs by clicking :guilabel:`Fetch Peppol invoice status` in the corresponding
|
||||
sales journal on the Accounting dashboard.
|
||||
|
||||
.. image:: electronic_invoicing/peppol-fetch-message-status.png
|
||||
:alt: Fetch invoice Peppol status
|
||||
|
||||
Receive vendor bills
|
||||
--------------------
|
||||
|
||||
@@ -237,3 +268,10 @@ drafts.
|
||||
|
||||
.. image:: electronic_invoicing/peppol-receive-bills.png
|
||||
:alt: peppol receive bills
|
||||
|
||||
If you want to retrieve incoming Peppol documents before the cron runs, you can do so from the
|
||||
Accounting dashboard on the main Peppol purchase journal that you set up in the settings. Just click
|
||||
:guilabel:`Fetch from Peppol`.
|
||||
|
||||
.. image:: electronic_invoicing/peppol-fetch-bills.png
|
||||
:alt: Fetch bills from Peppol
|
||||
|
||||
|
Before Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 5.8 KiB |
|
After Width: | Height: | Size: 6.1 KiB |
|
After Width: | Height: | Size: 6.6 KiB |
|
After Width: | Height: | Size: 5.1 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 6.9 KiB |
@@ -2,146 +2,72 @@
|
||||
Internal transfers
|
||||
==================
|
||||
|
||||
In Odoo, internal money transfers can be made in a few clicks. You need at least either two bank
|
||||
accounts, two cash journals, or one bank account and one cash journal.
|
||||
Internal money transfers can be handled in Odoo. At least two bank accounts are needed to make
|
||||
internal transfers.
|
||||
|
||||
.. seealso::
|
||||
:doc:`How to add an additional bank account <../bank>`
|
||||
|
||||
Configuration
|
||||
=============
|
||||
|
||||
An internal transfer account is automatically created on your database based on your company's
|
||||
localization and depending on your country’s legislation. If needed, the default :guilabel:`Internal
|
||||
transfer account` can be modified by going to :menuselection:`Accounting app --> Configuration -->
|
||||
Settings` and then under the :guilabel:`Default Accounts` section.
|
||||
|
||||
.. note::
|
||||
At least two bank accounts are needed to make internal transfers. Refer to
|
||||
:doc:`Bank and cash accounts section <../bank>` to see how to add an additional bank
|
||||
account to your database.
|
||||
localization and depending on your country’s legislation. To modify the default :guilabel:`Internal
|
||||
transfer account`, go to :menuselection:`Accounting --> Configuration --> Settings` and scroll down
|
||||
to the :guilabel:`Default Accounts` section.
|
||||
|
||||
Register an internal transfer from one bank to another
|
||||
======================================================
|
||||
|
||||
Let's say you have two bank accounts registered on your database and you want to transfer 1,000 USD
|
||||
from Bank A to Bank B.
|
||||
If you want to transfer money from one bank to another, access the Accounting Dashboard, click the
|
||||
drop-down selection button (:guilabel:`⋮`) on the bank from which you want to make the transfer,
|
||||
then click :guilabel:`Payments`. Select or create a payment, tick the :guilabel:`Internal Transfer`
|
||||
checkbox, and select a :guilabel:`Destination Journal` before you :guilabel:`Confirm` the internal
|
||||
transfer.
|
||||
|
||||
Log an internal transfer
|
||||
------------------------
|
||||
The money is now booked in the transfer account and another payment is automatically created in the
|
||||
destination journal.
|
||||
|
||||
From the Accounting Dashboard, click on the drop-down selection button (:guilabel:`⋮`) on one of
|
||||
your banks. In the :guilabel:`New` column click on :guilabel:`Internal Transfer` and enter the
|
||||
information related to the transfer.
|
||||
.. example::
|
||||
|
||||
.. image:: internal_transfers/internal_transfer.png
|
||||
:align: center
|
||||
:alt: Fill in the information related to your internal transfer
|
||||
- Bank journal (Bank A)
|
||||
|
||||
.. note::
|
||||
Fill in the :guilabel:`Memo` field for automatic reconciliation.
|
||||
.. list-table::
|
||||
:header-rows: 1
|
||||
:stub-columns: 1
|
||||
|
||||
:guilabel:`Save` and :guilabel:`Confirm` to register your internal transfer. The money is now booked
|
||||
in the transfer account and another payment is **automatically** created in the destination journal
|
||||
(Bank B).
|
||||
* - **Account**
|
||||
- **Debit**
|
||||
- **Credit**
|
||||
* - Outstanding Payments account
|
||||
-
|
||||
- $1,000
|
||||
* - **Internal transfer account**
|
||||
- **$1,000**
|
||||
-
|
||||
|
||||
Bank journal (Bank A)
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
- Bank journal (Bank B)
|
||||
|
||||
.. list-table::
|
||||
:header-rows: 1
|
||||
:stub-columns: 1
|
||||
|
||||
* - **Account**
|
||||
- **Debit**
|
||||
- **Credit**
|
||||
* - Outstanding Payments account
|
||||
-
|
||||
- $1,000
|
||||
* - **Internal transfer account**
|
||||
- **$1,000**
|
||||
-
|
||||
.. list-table::
|
||||
:header-rows: 1
|
||||
:stub-columns: 1
|
||||
|
||||
Automated booking - Bank journal (BANK B)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
* - **Account**
|
||||
- **Debit**
|
||||
- **Credit**
|
||||
* - Outstanding Receipts account
|
||||
- $1,000
|
||||
-
|
||||
* - **Internal transfer account**
|
||||
-
|
||||
- **$1,000**
|
||||
|
||||
.. list-table::
|
||||
:header-rows: 1
|
||||
:stub-columns: 1
|
||||
There is **one outstanding payment** and **one outstanding receipt** pending in your two bank
|
||||
account journals because the bank statement confirming the sending and receiving of the money
|
||||
has not been booked yet.
|
||||
|
||||
* - **Account**
|
||||
- **Debit**
|
||||
- **Credit**
|
||||
* - Outstanding Receipts account
|
||||
- $1,000
|
||||
-
|
||||
* - **Internal transfer account**
|
||||
-
|
||||
- **$1,000**
|
||||
|
||||
.. note::
|
||||
There are one outstanding payment and one outstanding receipt pending in your two bank account
|
||||
journals, because the bank statement confirming the sending and receiving of the money has not
|
||||
been booked yet.
|
||||
|
||||
.. image:: internal_transfers/outstanding-payments-receipts.png
|
||||
:align: center
|
||||
:alt: Outstanding Payments/Receipts pending bank statement booking
|
||||
|
||||
.. _interbank/import-and-reconcile:
|
||||
|
||||
Manage and reconcile bank statements
|
||||
------------------------------------
|
||||
|
||||
The next step is to book the bank statements to finalize the transaction by creating,
|
||||
:doc:`importing <../bank/transactions>`, or :doc:`synchronizing <../bank/bank_synchronization>` your
|
||||
:guilabel:`Transactions lines`. Fill in the :guilabel:`Ending balance` and click on the
|
||||
:guilabel:`Reconcile` button.
|
||||
|
||||
.. image:: internal_transfers/transactions-line.png
|
||||
:align: center
|
||||
:alt: Transaction lines to be filled in prior to reconciliation
|
||||
Once this is done, you can book and reconcile your bank statement lines as usual.
|
||||
|
||||
.. seealso::
|
||||
:doc:`../bank/reconciliation`
|
||||
|
||||
In the next window, choose counterparts for the payment - in this example, the outstanding payment
|
||||
account - then click :guilabel:`Validate`.
|
||||
|
||||
.. image:: internal_transfers/bank-reconciliation.png
|
||||
:align: center
|
||||
:alt: Reconcile your payment
|
||||
|
||||
Bank journal entry
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. list-table::
|
||||
:header-rows: 1
|
||||
:stub-columns: 1
|
||||
|
||||
* - **Account**
|
||||
- **Debit**
|
||||
- **Credit**
|
||||
* - Outstanding Payment
|
||||
- $1,000
|
||||
-
|
||||
* - Bank Account (BANK A)
|
||||
-
|
||||
- **$1,000**
|
||||
|
||||
The same steps must be repeated once you receive the bank statement related to Bank B. Book and
|
||||
reconcile your bank statement lines.
|
||||
|
||||
Bank journal entry
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. list-table::
|
||||
:header-rows: 1
|
||||
:stub-columns: 1
|
||||
|
||||
* - **Account**
|
||||
- **Debit**
|
||||
- **Credit**
|
||||
* - Outstanding Receipt
|
||||
-
|
||||
- $1,000
|
||||
* - Bank Account (BANK B)
|
||||
- **$1,000**
|
||||
-
|
||||
|
||||
|
Before Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 26 KiB |
@@ -20,11 +20,11 @@ method, making the payment process much easier.
|
||||
Configuration
|
||||
=============
|
||||
|
||||
Make sure your :ref:`Payment Providers are correctly configured <payment_providers/configuration>`.
|
||||
Make sure your :doc:`payment providers are correctly configured <../../payment_providers>`.
|
||||
|
||||
.. note::
|
||||
By default, ":doc:`Wire Transfer </applications/finance/payment_providers/wire_transfer>`" is the only
|
||||
Payment Provider activated, but you still have to fill out the payment details.
|
||||
By default, ":doc:`Wire Transfer </applications/finance/payment_providers/wire_transfer>`" is the
|
||||
only payment provider activated, but you still have to fill out the payment details.
|
||||
|
||||
To activate the Invoice Online Payment, go to :menuselection:`Accounting --> Configuration -->
|
||||
Settings --> Customer Payments`, enable **Invoice Online Payment**, and click on *Save*.
|
||||
|
||||
@@ -242,6 +242,206 @@ journal.
|
||||
|
||||
.. _belgium/einvoicing:
|
||||
|
||||
CodaBox
|
||||
-------
|
||||
|
||||
**CodaBox** is a service that allows Belgian accounting firms accessing their clients' bank
|
||||
information and statements. Odoo provides a way to import such statements automatically.
|
||||
|
||||
.. note::
|
||||
As an accounting firm, you must manage your clients on separate databases and configure them
|
||||
individually to avoid mixing up their data.
|
||||
|
||||
Configuration
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
The configuration must be done on each client database. In the following
|
||||
instructions, we will refer to your client's company as *Company* and to your
|
||||
accounting firm as *Accounting Firm*.
|
||||
|
||||
You must first :ref:`Install <general/install>` :guilabel:`CodaBox` to start.
|
||||
|
||||
.. important::
|
||||
Make sure the company settings are correctly configured, i.e., the country is set to
|
||||
:guilabel:`Belgium`, the :guilabel:`Tax ID` and :guilabel:`Accounting Firm` fields are filled,
|
||||
as well as the :guilabel:`Tax ID` of the accounting firm (unless it is the same as the
|
||||
company's :guilabel:`Tax ID`).
|
||||
|
||||
Configure the Journals
|
||||
**********************
|
||||
|
||||
.. tabs::
|
||||
|
||||
.. tab:: For CODA files
|
||||
|
||||
#. :doc:`Create a new bank journal <../accounting/bank>`.
|
||||
#. Set the right IBAN in the :guilabel:`Account Number` field.
|
||||
#. Select :guilabel:`CodaBox synchronisation` as the :guilabel:`Bank Feed`.
|
||||
|
||||
.. image:: belgium/codabox_configuration_coda_journal.png
|
||||
:align: center
|
||||
:alt: Configuration of a CODA journal.
|
||||
|
||||
.. tab:: For SODA files
|
||||
|
||||
#. Create a new miscellaneous journal.
|
||||
#. Go to :menuselection:`Accounting --> Configuration --> Accounting: CodaBox`.
|
||||
#. Select the journal you just created in the SODA journal field.
|
||||
|
||||
.. image:: belgium/codabox_configuration_soda_setting.png
|
||||
:align: center
|
||||
:alt: Configuration of a SODA journal.
|
||||
|
||||
.. _belgium/codabox-configuration-connection:
|
||||
|
||||
Configure the Connection
|
||||
************************
|
||||
|
||||
First, you must select which users can access the **CodaBox** connection settings. To do so, go to
|
||||
:menuselection:`Settings --> Users & Companies --> Groups`, and search for the group
|
||||
:guilabel:`Allow to show and modify the CodaBox Connection Settings`. Add the users you want
|
||||
to this group. By default, only the :guilabel:`Administrator` is part of this group.
|
||||
|
||||
Then, to configure the connection itself, go to
|
||||
:menuselection:`Accounting --> Configuration --> Accounting: CodaBox`.
|
||||
|
||||
The procedure differs depending on whether **CodaBox** is
|
||||
being setup for a first client or an additional one.
|
||||
|
||||
.. tabs::
|
||||
|
||||
.. tab:: First connection
|
||||
|
||||
#. Click on :guilabel:`Connect`, where you are redirected to
|
||||
the **CodaBox** platform, here validate the connection.
|
||||
#. Once redirected back to Odoo, the :guilabel:`Status` should be set to
|
||||
:guilabel:`Connected` and a new field :guilabel:`Access Token` should appear
|
||||
with a unique value generated by Odoo.
|
||||
|
||||
.. image:: belgium/codabox_configuration_connection_ok.png
|
||||
:align: center
|
||||
:alt: Configured connection.
|
||||
|
||||
.. note::
|
||||
This Odoo :guilabel:`Access Token` will be used to create new connections
|
||||
for other clients without having to validate the connection again.
|
||||
|
||||
.. tab:: Following connection
|
||||
|
||||
#. Copy the :guilabel:`Access Token` from a previous connection.
|
||||
#. Click on :guilabel:`Connect`.
|
||||
|
||||
The **CodaBox** connection linked to the :guilabel:`Access Token` should still exist,
|
||||
therefore there is no need to validate the connection again. A new and different
|
||||
:guilabel:`Access Token` is generated by Odoo, and the :guilabel:`Status` should be set to
|
||||
:guilabel:`Connected`.
|
||||
|
||||
.. note::
|
||||
By having a different :guilabel:`Access Token` for each client, you can
|
||||
easily revoke the access of a client to your CodaBox account without
|
||||
affecting the other clients. One client cannot interfere with another.
|
||||
|
||||
Synchronisation
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
Once the connection is established, Odoo can be synchronized with CodaBox.
|
||||
|
||||
.. tabs::
|
||||
|
||||
.. tab:: For CODA files
|
||||
|
||||
CODA files are automatically imported from CodaBox every 12 hours. You do
|
||||
not have to do anything. However, if you wish, it can also be done manually,
|
||||
by clicking on :guilabel:`Fetch CODA's` in the Accounting Dashboard.
|
||||
|
||||
.. image:: belgium/codabox_dashboard_coda.png
|
||||
:align: center
|
||||
:alt: Manually fetch CODA's.
|
||||
|
||||
.. tab:: For SODA files
|
||||
|
||||
SODA files are automatically imported from CodaBox once a day as draft. You do
|
||||
not have to do anything. However, if you wish, it can also be done manually,
|
||||
by clicking on :guilabel:`Fetch SODA's` in the Accounting Dashboard.
|
||||
|
||||
By default, if an account in the SODA is not mapped to an account in Odoo, the Suspense
|
||||
Account (499000) is used and a note is left in the created journal entry.
|
||||
|
||||
.. image:: belgium/codabox_dashboard_soda.png
|
||||
:align: center
|
||||
:alt: Manually fetch SODA's.
|
||||
|
||||
.. note::
|
||||
You can access the mapping between the SODA accounts and the Odoo accounts by clicking
|
||||
on the :guilabel:`SODA Mapping` button in
|
||||
:menuselection:`Accounting --> Configuration --> Accounting: CodaBox`.
|
||||
|
||||
.. note::
|
||||
The connection between Odoo and CodaBox can be revoked by using the
|
||||
:guilabel:`Revoke` button in the CodaBox settings, which will revoke
|
||||
the link on Odoo's side only.
|
||||
|
||||
If you have multiple connections, you will still be able to use the
|
||||
Access Token of one of them to easily reconnect Odoo and CodaBox for
|
||||
another client.
|
||||
|
||||
However, if you have only one (remaining) connection, you will not be able
|
||||
to use its Access Token to create new connections. In that case, you will
|
||||
have to revoke the connection from the CodaBox platform too,
|
||||
and then recreate a new one following the steps in the
|
||||
:ref:`first connection <belgium/codabox-configuration-connection>` section.
|
||||
|
||||
Potential issues
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
CodaBox is not configured. Please check your configuration.
|
||||
Either the Company VAT of the Accounting Firm VAT is not set.
|
||||
|
||||
It seems that the fiduciary VAT number you provided is not valid. Please check your configuration.
|
||||
Either the Company VAT of the Accounting Firm VAT is in the wrong format.
|
||||
|
||||
It seems that the fiduciary VAT number you provided does not exist in CodaBox. Please check your configuration.
|
||||
The Accounting Firm VAT number you provided is not registered in CodaBox.
|
||||
|
||||
Error while connecting to the IAP server. Please contact Odoo support.
|
||||
It seems that Odoo's IAP server is down or unreachable. Please contact
|
||||
Odoo support.
|
||||
|
||||
It seems that your CodaBox connection is not valid anymore. Please check your configuration.
|
||||
It seems that you have either revoked the access of Odoo to your CodaBox account, or that
|
||||
you have not completed the configuration process. In this case, you must click on the
|
||||
:guilabel:`Revoke connection` button in the settings, and follow again the steps in
|
||||
the :ref:`first connection <belgium/codabox-configuration-connection>` section.
|
||||
|
||||
A previous CodaBox registration already exists. Paste the access token from a previous connection here. Odoo will generate a new one, exclusive to this database.
|
||||
It seems that you have already your Accounting Firm with Odoo, but that the Access Token
|
||||
is either not filled or wrong. You should follow the steps in the
|
||||
:ref:`following connection <belgium/codabox-configuration-connection>` tab section.
|
||||
|
||||
If you have lost your Access Token, you have to go on the CodaBox platform,
|
||||
and revoke the access of Odoo to your CodaBox account. Then, you will have to follow
|
||||
the steps in the :ref:`first connection <belgium/codabox-configuration-connection>` section.
|
||||
|
||||
The provided access token is not valid for this fiduciary. Please check your configuration. If you have lost your access token, please contact Odoo support.
|
||||
Same as above.
|
||||
|
||||
It seems that no connection linked to your database/VAT number exists. Please check your configuration.
|
||||
You may obtain this error when revoking or trying to fetch files from CodaBox if
|
||||
the pair (Accounting Firm VAT, Company VAT) is not registered yet. This may happen if
|
||||
you have changed the company VAT after the connection was established for instance.
|
||||
For security reasons, you have to recreate a connection for this company VAT by following the
|
||||
steps in the :ref:`first connection <belgium/codabox-configuration-connection>` section.
|
||||
|
||||
No files were found. Please check your configuration.
|
||||
This may occur if the company VAT has changed after the connection was established.
|
||||
In that case, you must click on the :guilabel:`Revoke connection` button in the settings,
|
||||
and recreate the connection.
|
||||
|
||||
It seems you have already created a connection to CodaBox with this fiduciary. To create a new connection, you must first revoke the old one on myCodaBox portal.
|
||||
You must go on the CodaBox platform, and revoke the access of Odoo to your CodaBox account.
|
||||
Then, you will have to follow the steps in the
|
||||
:ref:`first connection <belgium/codabox-configuration-connection>` section.
|
||||
|
||||
Electronic invoicing
|
||||
====================
|
||||
|
||||
|
||||
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 4.9 KiB |
|
After Width: | Height: | Size: 3.5 KiB |
|
After Width: | Height: | Size: 4.3 KiB |
|
After Width: | Height: | Size: 3.5 KiB |
@@ -126,3 +126,59 @@ Correct an invoice that has been posted but not downloaded yet: Reset e-Faktur
|
||||
|
||||
.. image:: indonesia/indonesia-e-faktur-reset.png
|
||||
:align: center
|
||||
|
||||
.. _localization_indonesia/qris-qr:
|
||||
|
||||
QRIS QR code on invoices
|
||||
========================
|
||||
|
||||
`QRIS <https://qris.online/homepage/>`_ is a digital payment system that allows customers to make
|
||||
payments by scanning the QR code from their preferred e-wallet.
|
||||
|
||||
.. important::
|
||||
According to the `QRIS API documentation <https://qris.online/api-doc/create-invoice.php>`_,
|
||||
QRIS expires after 30 minutes. Due to this restriction, the QR code is not included in reports
|
||||
sent to customers and is only available on the customer portal.
|
||||
|
||||
Activate QR codes
|
||||
-----------------
|
||||
|
||||
Go to :menuselection:`Accounting --> Configuration --> Settings`. Under the :guilabel:`Customer
|
||||
Payments` section, activate the :guilabel:`QR Codes` feature.
|
||||
|
||||
QRIS bank account configuration
|
||||
-------------------------------
|
||||
|
||||
Go to :menuselection:`Contacts --> Configuration --> Bank Accounts` and select the bank account for
|
||||
which you want to activate QRIS. Set the :guilabel:`QRIS API Key` and :guilabel:`QRIS Merchant ID`
|
||||
based on the information provided by QRIS.
|
||||
|
||||
.. important::
|
||||
The account holder's country must be set to `Indonesia` on its contact form.
|
||||
|
||||
.. image:: indonesia/qris-setup.png
|
||||
:alt: QRIS bank account configuration
|
||||
|
||||
.. seealso::
|
||||
:doc:`../accounting/bank`
|
||||
|
||||
Bank journal configuration
|
||||
--------------------------
|
||||
|
||||
Go to :menuselection:`Accounting --> Configuration --> Journals`, open the bank journal, then fill
|
||||
out the :guilabel:`Account Number` and :guilabel:`Bank` under the :guilabel:`Journal Entries` tab.
|
||||
|
||||
.. image:: indonesia/journal-bank-config.png
|
||||
:alt: Bank journal configuration
|
||||
|
||||
Issue invoices with QRIS QR codes
|
||||
---------------------------------
|
||||
|
||||
When creating a new invoice, open the :guilabel:`Other Info` tab and set the :guilabel:`Payment
|
||||
QR-code` option to `QRIS`.
|
||||
|
||||
.. image:: indonesia/invoice-qris.png
|
||||
:alt: Select QRIS QR-code option
|
||||
|
||||
Ensure that the :guilabel:`Recipient Bank` is the one you configured, as Odoo uses this field to
|
||||
generate the QRIS QR code.
|
||||
|
||||
|
After Width: | Height: | Size: 2.1 KiB |
|
After Width: | Height: | Size: 4.1 KiB |
|
After Width: | Height: | Size: 10 KiB |
@@ -1,8 +1,8 @@
|
||||
:show-content:
|
||||
|
||||
=================================================
|
||||
Payment providers (credit cards, online payments)
|
||||
=================================================
|
||||
===============
|
||||
Online payments
|
||||
===============
|
||||
|
||||
.. toctree::
|
||||
:titlesonly:
|
||||
@@ -23,35 +23,33 @@ Payment providers (credit cards, online payments)
|
||||
payment_providers/razorpay
|
||||
payment_providers/sips
|
||||
payment_providers/stripe
|
||||
payment_providers/xendit
|
||||
|
||||
Odoo embeds several **payment providers** that allow your customers to pay on their *Customer
|
||||
Portals* or your *eCommerce website*. They can pay sales orders, invoices, or subscriptions with
|
||||
recurring payments with their favorite payment methods such as **Credit Cards**.
|
||||
Odoo embeds several **payment providers** that allow your customers to pay online, on their
|
||||
*customer portals*, or on your *eCommerce website*. They can pay sales orders, invoices, or
|
||||
subscriptions with recurring payments using their favorite payment methods, such as
|
||||
**credit cards**.
|
||||
|
||||
Offering several payment methods increases the chances of getting paid in time, or even immediately,
|
||||
as you make it more convenient for your customers to pay with the payment method they prefer and
|
||||
trust.
|
||||
Each payment provider is linked to a list of supported :ref:`payment methods
|
||||
<payment_providers/payment_methods>` that can be (de)activated based on your needs.
|
||||
|
||||
.. image:: payment_providers/online-payment.png
|
||||
:align: center
|
||||
:alt: Pay online in the customer portal and select which payment provider to use.
|
||||
:alt: Online payment form
|
||||
|
||||
.. note::
|
||||
Odoo apps delegate the handling of sensitive information to the certified payment provider so
|
||||
that you don't ever have to worry about PCI compliance.
|
||||
|
||||
This means that no sensitive information (such as credit card numbers) is stored on Odoo servers
|
||||
or Odoo databases hosted elsewhere. Instead, Odoo apps use a unique reference number to the data
|
||||
stored safely in the payment providers' systems.
|
||||
that you don't ever have to worry about PCI compliance. No sensitive information (such as credit
|
||||
card numbers) is stored on Odoo servers or Odoo databases hosted elsewhere. Instead, Odoo apps
|
||||
use a unique reference number for the data stored safely in the payment providers' systems.
|
||||
|
||||
.. _payment_providers/supported_providers:
|
||||
|
||||
Supported payment providers
|
||||
===========================
|
||||
|
||||
From an accounting perspective, we can distinguish two types of payment providers: the payment
|
||||
providers that are third-party services and require you to follow another accounting workflow, and
|
||||
the payments that go directly on the bank account and follow the usual reconciliation workflow.
|
||||
To access the supported payment providers, go to :menuselection:`Accounting --> Configuration -->
|
||||
Payment Providers`, :menuselection:`Website --> Configuration --> Payment Providers`, or
|
||||
:menuselection:`Sales --> Configuration --> Payment Providers`.
|
||||
|
||||
.. _payment_providers/online_providers:
|
||||
|
||||
@@ -65,10 +63,10 @@ Online payment providers
|
||||
|
||||
* -
|
||||
- Payment flow from
|
||||
- :ref:`Tokenization <payment_providers/features/tokenization>`
|
||||
- :ref:`Manual capture <payment_providers/features/manual_capture>`
|
||||
- :ref:`Refunds <payment_providers/features/refund>`
|
||||
- :ref:`Express checkout <payment_providers/features/express_checkout>`
|
||||
- :ref:`Tokenization <payment_providers/tokenization>`
|
||||
- :ref:`Manual capture <payment_providers/manual_capture>`
|
||||
- :ref:`Refunds <payment_providers/refunds>`
|
||||
- :ref:`Express checkout <payment_providers/express_checkout>`
|
||||
* - :doc:`Adyen <payment_providers/adyen>`
|
||||
- Odoo
|
||||
- |V|
|
||||
@@ -76,13 +74,13 @@ Online payment providers
|
||||
- Full and partial
|
||||
-
|
||||
* - :doc:`Amazon Payment Services <payment_providers/amazon_payment_services>`
|
||||
- The provider website
|
||||
- The provider's website
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
* - :doc:`AsiaPay <payment_providers/asiapay>`
|
||||
- The provider website
|
||||
- The provider's website
|
||||
-
|
||||
-
|
||||
-
|
||||
@@ -94,31 +92,31 @@ Online payment providers
|
||||
- Full only
|
||||
-
|
||||
* - :doc:`Buckaroo <payment_providers/buckaroo>`
|
||||
- The provider website
|
||||
- The provider's website
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
* - :doc:`Flutterwave <payment_providers/flutterwave>`
|
||||
- The provider website
|
||||
- The provider's website
|
||||
- |V|
|
||||
-
|
||||
-
|
||||
-
|
||||
* - :doc:`Mercado Pago <payment_providers/mercado_pago>`
|
||||
- The provider website
|
||||
- The provider's website
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
* - :doc:`Mollie <payment_providers/mollie>`
|
||||
- The provider website
|
||||
- The provider's website
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
* - :doc:`PayPal <payment_providers/paypal>`
|
||||
- The provider website
|
||||
- The provider's website
|
||||
-
|
||||
-
|
||||
-
|
||||
@@ -130,7 +128,7 @@ Online payment providers
|
||||
- Full and partial
|
||||
-
|
||||
* - :doc:`SIPS <payment_providers/sips>`
|
||||
- The provider website
|
||||
- The provider's website
|
||||
-
|
||||
-
|
||||
-
|
||||
@@ -141,21 +139,29 @@ Online payment providers
|
||||
- Full only
|
||||
- Full and partial
|
||||
- |V|
|
||||
* - :doc:`Xendit <payment_providers/xendit>`
|
||||
- The provider's website
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
|
||||
.. |V| replace:: ✔
|
||||
|
||||
.. note::
|
||||
Some of these online payment providers can also be added as :doc:`bank accounts
|
||||
<../finance/accounting/bank>`, but this is **not** the same process as adding
|
||||
them as payment providers. Payment providers allow customers to pay online, and bank accounts are
|
||||
added and configured on your Accounting app to do a bank reconciliation, which is an accounting
|
||||
control process.
|
||||
- Each provider has its own specific configuration flow, depending on which feature is
|
||||
available.
|
||||
- Some of these online payment providers can also be added as :doc:`bank accounts
|
||||
<../finance/accounting/bank>`, but this is **not** the same process as adding them as payment
|
||||
providers. Payment providers allow customers to pay online, and bank accounts are added and
|
||||
configured in the Accounting app to do a :doc:`bank reconciliation
|
||||
<accounting/bank/reconciliation>`.
|
||||
|
||||
.. tip::
|
||||
In addition to the regular payment providers that integrate with an API such as Stripe, PayPal,
|
||||
In addition to the regular payment providers that integrate with an API, such as Stripe, PayPal,
|
||||
or Adyen, Odoo bundles the :doc:`Demo payment provider <payment_providers/demo>`. This payment
|
||||
provider allows you to make demo payments to test business flows involving online payments. No
|
||||
credentials are required as the demo payments are fake.
|
||||
provider allows you to test business flows involving online payments. No credentials are required
|
||||
as the demo payments are dummy payments.
|
||||
|
||||
.. _payment_providers/bank_payments:
|
||||
|
||||
@@ -164,251 +170,267 @@ Bank payments
|
||||
|
||||
- | :doc:`Wire Transfer <payment_providers/wire_transfer>`
|
||||
| When selected, Odoo displays your payment information with a payment reference. You have to
|
||||
approve the payment manually once you have received it on your bank account.
|
||||
approve the payment manually once you have received it in your bank account.
|
||||
- | :doc:`SEPA Direct Debit <../finance/accounting/payments/batch_sdd>`
|
||||
| Your customers can make a bank transfer to register a SEPA Direct Debit mandate and get their
|
||||
bank account charged directly.
|
||||
|
||||
.. _payment_providers/features:
|
||||
.. _payment_providers/add_new:
|
||||
|
||||
Additional features
|
||||
===================
|
||||
Enable a payment provider
|
||||
=========================
|
||||
|
||||
Some payment providers support additional features for the payment flow. Refer to the :ref:`table
|
||||
above <payment_providers/online_providers>` to check if your payment provider supports these
|
||||
To add a new payment provider and make its related payment methods available to your customers,
|
||||
proceed as follows:
|
||||
|
||||
#. Go to the payment provider's website, create an account, and make sure you have the API
|
||||
credentials requested for third-party use. These are necessary for Odoo to communicate with the
|
||||
payment provider.
|
||||
#. In Odoo, navigate to the :guilabel:`Payment providers` by going to :menuselection:`Accounting -->
|
||||
Configuration --> Payment Providers`, :menuselection:`Website --> Configuration --> Payment
|
||||
Providers`, or :menuselection:`Sales --> Configuration --> Payment Providers`.
|
||||
#. Select the provider and configure the :guilabel:`Credentials` tab.
|
||||
#. Set the :guilabel:`State` field to :guilabel:`Enabled`.
|
||||
|
||||
.. note::
|
||||
- The fields available in the :guilabel:`Credentials` tab depend on the payment provider. Refer
|
||||
to the :ref:`related documentation <payment_providers/supported_providers>` for more
|
||||
information.
|
||||
- Once you have enabled the payment provider, it is automatically published on your website.
|
||||
If you wish to unpublish it, click the :guilabel:`Published` button. Customers cannot make
|
||||
payments through an unpublished provider, but they can still manage
|
||||
:dfn:`(delete and assign to a subscription)` their existing tokens linked to such a provider.
|
||||
|
||||
.. _payment_providers/test-mode:
|
||||
|
||||
Test mode
|
||||
---------
|
||||
|
||||
If you wish to try the payment provider as a test, set the :guilabel:`State` field in the payment
|
||||
provider form to :guilabel:`Test mode`, then enter your provider's test/sandbox credentials in the
|
||||
:guilabel:`Credentials` tab.
|
||||
|
||||
.. note::
|
||||
By default, the payment provider remains **unpublished** in test mode so that it's not visible to
|
||||
visitors.
|
||||
|
||||
.. warning::
|
||||
We recommend using the test mode on a duplicate or a test database to avoid potential issues
|
||||
with your invoice numbering.
|
||||
|
||||
.. _payment_providers/payment_methods:
|
||||
|
||||
Payment methods
|
||||
===============
|
||||
|
||||
Each payment provider is related to a list of supported payment methods; the methods listed in the
|
||||
:guilabel:`Payment methods` field in the :guilabel:`Configuration` tab of the payment provider form
|
||||
are the ones that have been activated. To activate or deactivate a payment method for a provider,
|
||||
click :guilabel:`Enable Payment Methods`, then click the toggle button of the related method.
|
||||
|
||||
.. tip::
|
||||
Payment methods are displayed on your website based on their sequence order. To reorder them,
|
||||
click :guilabel:`Enable Payment Methods` in the payment provider form, then, in the
|
||||
:guilabel:`Payment Methods` list, drag and drop the payment methods in the desired order.
|
||||
|
||||
Icons and brands
|
||||
----------------
|
||||
|
||||
The icons displayed next to the payment method on your website are either the icons of the brands
|
||||
activated for the payment method or, if there aren't any, the icons of the payment methods
|
||||
themselves. To modify them, go to :menuselection:`Accounting --> Configuration --> Payment Methods`,
|
||||
:menuselection:`Website --> Configuration --> Payment Methods` or :menuselection:`Sales -->
|
||||
Configuration --> Payment Methods`, then click on the payment method.
|
||||
|
||||
To modify a payment method's icon, hover your mouse over the image in the upper-right corner of the
|
||||
payment method's form and click the pencil icon (:guilabel:`✎`).
|
||||
|
||||
Select the :guilabel:`Brands` tab to view the brands that have been activated for the payment
|
||||
method. The brands and their related icons are displayed based on their sequence order; to reorder
|
||||
them, drag and drop them in the desired order. To modify a brand's icon, select the brand, then,
|
||||
in the popup window that opens, hover the mouse over the image in the upper-right corner and click
|
||||
the pencil icon (:guilabel:`✎`).
|
||||
|
||||
Advanced configuration
|
||||
----------------------
|
||||
|
||||
To configure payment methods further, go to :menuselection:`Accounting --> Configuration --> Payment
|
||||
Methods`, :menuselection:`Website --> Configuration --> Payment Methods` or :menuselection:`Sales
|
||||
--> Configuration --> Payment Methods`. Click on the payment method, then activate the
|
||||
:ref:`developer mode <developer-mode>`. Click the :guilabel:`Configuration` tab to adapt the
|
||||
features.
|
||||
|
||||
.. _payment_providers/features/tokenization:
|
||||
.. danger::
|
||||
- Each payment method is preconfigured in a way that aligns with the payment providers'
|
||||
behavior and their integration with Odoo. Any change to this configuration may result in errors
|
||||
and should be tested on a duplicate or test database first.
|
||||
- Modifications to the payment method's configuration only work to the extent of the method's
|
||||
and provider's capabilities. For example, adding :ref:`countries
|
||||
<payment_providers/currencies_countries>` for a payment method only supported in one country or
|
||||
enabling :ref:`tokenization <payment_providers/tokenization>` for a method linked to a provider
|
||||
that does not support it will not produce the intended results.
|
||||
|
||||
.. _payment_providers/tokenization:
|
||||
|
||||
Tokenization
|
||||
------------
|
||||
============
|
||||
|
||||
If your payment provider supports this feature, customers can choose to save their card for later. A
|
||||
**payment token** is created in Odoo and can be used as a payment method for subsequent payments
|
||||
without having to enter the card details again. This is particularly useful for the eCommerce
|
||||
conversion rate and for subscriptions that use recurring payments.
|
||||
:ref:`If the payment provider supports this feature <payment_providers/online_providers>`, customers
|
||||
can save their payment method details for later. To enable this feature, go to the
|
||||
:guilabel:`Configuration` tab of the selected payment provider and enable :guilabel:`Allow Saving
|
||||
Payment Methods`.
|
||||
|
||||
Enable this feature by navigating to the :guilabel:`Configuration` tab from your payment provider
|
||||
and by ticking the :guilabel:`Allow Saving Payment Methods` checkbox.
|
||||
In this case, a **payment token** is created in Odoo to be used as a payment method for subsequent
|
||||
payments without the customer having to enter their payment method details again. This is
|
||||
particularly useful for the eCommerce conversion rate and subscriptions that use recurring payments.
|
||||
|
||||
.. note::
|
||||
You remain fully PCI-compliant when you enable this feature because Odoo does not store the card
|
||||
details directly. Instead, it creates a payment token that only holds a reference to the card
|
||||
details stored on the payment provider's server.
|
||||
details directly. Instead, it creates a payment token that only references the card details
|
||||
stored on the payment provider's server.
|
||||
|
||||
.. _payment_providers/features/manual_capture:
|
||||
.. _payment_providers/manual_capture:
|
||||
|
||||
Manual capture
|
||||
--------------
|
||||
==============
|
||||
|
||||
If your payment provider supports this feature, you can authorize and capture payments in two steps
|
||||
instead of one. When you authorize a payment, the funds are reserved on the customer's payment
|
||||
method but they are not immediately charged. The charge is only made when you manually capture the
|
||||
payment later on. You can also void the authorization to release the reserved funds; this is
|
||||
equivalent to a regular cancellation. Capturing payments manually can prove itself useful in many
|
||||
situations:
|
||||
:ref:`If the payment provider supports this feature <payment_providers/online_providers>`, you can
|
||||
authorize and capture payments in two steps instead of one. To enable this feature, go to the
|
||||
:guilabel:`Configuration` tab of the selected payment provider and enable :guilabel:`Capture Amount
|
||||
Manually`.
|
||||
|
||||
- Receive the payment confirmation and wait until the order is shipped to capture the payment.
|
||||
- Review and verify that orders are legitimate before the payment is completed and the fulfillment
|
||||
process starts.
|
||||
- Avoid potentially high processing fees for cancelled payments: payment providers will not charge
|
||||
you for voiding an authorization.
|
||||
- Hold a security deposit to return later, minus any deductions (e.g., after a damage).
|
||||
When you authorize a payment, the funds are reserved on the customer's payment method but not
|
||||
immediately charged. They are charged when you manually capture the payment later on. You can also
|
||||
void the authorization to cancel it and release the reserved funds. Capturing payments manually is
|
||||
helpful in many situations:
|
||||
|
||||
Enable this feature by navigating to the :guilabel:`Configuration` tab from your payment provider
|
||||
and by ticking the :guilabel:`Capture Amount Manually` checkbox.
|
||||
- Receive the payment confirmation and wait until the order is shipped to capture the payment.
|
||||
- Review and verify that orders are legitimate before the payment is completed and the fulfillment
|
||||
process starts.
|
||||
- Avoid potentially high refund fees for refunded payments: payment providers will not charge you
|
||||
for voiding an authorization.
|
||||
- Hold a security deposit to return later, minus any deductions (e.g., in case of damages).
|
||||
|
||||
To capture the payment after it was authorized, go to the related sales order or invoice and click
|
||||
on the :guilabel:`CAPTURE TRANSACTION` button. To release the funds, click on the :guilabel:`VOID
|
||||
TRANSACTION` button.
|
||||
|
||||
If your provider supports partial capture, you can select to capture only a **partial amount** of
|
||||
the full amount. The **remaining (uncaptured) amount** can either be voided or partially captured
|
||||
again later.
|
||||
the :guilabel:`Capture Transaction` button. To release the funds, click the :guilabel:`Void
|
||||
Transaction` button.
|
||||
|
||||
.. note::
|
||||
- Some payment providers support capturing only part of the authorized amount. The remaining
|
||||
amount can then be either captured or voided. These providers have the value **Full and
|
||||
partial** in the :ref:`table above <payment_providers/online_providers>`. The providers that
|
||||
only support capturing or voiding the full amount have the value **Full only**.
|
||||
only support capturing or voiding the total amount have the value **Full only**.
|
||||
- The funds are likely not reserved forever. After a certain time, they may be automatically
|
||||
released back to the customer's payment method. Refer to your payment provider's documentation
|
||||
for the exact reservation duration.
|
||||
- Odoo does not support this feature for all payment providers but some allow the manual capture
|
||||
- Odoo does not support this feature for all payment providers, but some allow the manual capture
|
||||
from their website interface.
|
||||
|
||||
.. _payment_providers/features/refund:
|
||||
.. _payment_providers/refunds:
|
||||
|
||||
Refunds
|
||||
-------
|
||||
=======
|
||||
|
||||
If your payment provider supports this feature, you can refund payments directly from Odoo. It does
|
||||
not need to be enabled first. To refund a customer payment, navigate to it and click on the
|
||||
:guilabel:`REFUND` button.
|
||||
not need to be enabled first. To refund a customer payment, navigate to it and click the
|
||||
:guilabel:`Refund` button.
|
||||
|
||||
.. note::
|
||||
- Some payment providers support refunding only part of the amount. The remaining amount can then
|
||||
optionally be refunded too. These providers have the value **Full and partial** in the
|
||||
optionally be refunded, too. These providers have the value **Full and partial** in the
|
||||
:ref:`table above <payment_providers/online_providers>`. The providers that only support
|
||||
refunding the full amount have the value **Full only**.
|
||||
- Odoo does not support this feature for all payment providers but some allow to refund payments
|
||||
refunding the total amount have the value **Full only**.
|
||||
- Odoo does not support this feature for all payment providers, but some allow to refund payments
|
||||
from their website interface.
|
||||
|
||||
.. _payment_providers/features/express_checkout:
|
||||
.. _payment_providers/express_checkout:
|
||||
|
||||
Express checkout
|
||||
----------------
|
||||
================
|
||||
|
||||
If your payment provider supports this feature, customers can use the **Google Pay** and **Apple
|
||||
Pay** buttons to pay their eCommerce orders in one click without filling the contact form. Using one
|
||||
of those buttons, customers go straight from the cart to the confirmation page, stopping by the
|
||||
payment form of Google or Apple to validate the payment.
|
||||
:ref:`If the payment provider supports this feature <payment_providers/online_providers>`, you can
|
||||
allow customers to use the :guilabel:`Google Pay` and :guilabel:`Apple Pay` buttons and pay their
|
||||
eCommerce orders in one click. When they use one of these buttons, customers go straight from the
|
||||
cart to the confirmation page without filling out the contact form. They just have to validate the
|
||||
payment on Google's or Apple's payment form.
|
||||
|
||||
Enable this feature by navigating to the :guilabel:`Configuration` tab from your payment provider
|
||||
and by ticking the :guilabel:`Allow Express Checkout` checkbox.
|
||||
To enable this feature, go to the :guilabel:`Configuration` tab of the selected payment provider and
|
||||
enable :guilabel:`Allow Express Checkout`.
|
||||
|
||||
.. note::
|
||||
All prices shown in the express checkout payment form are always taxes included.
|
||||
All prices shown on the express checkout payment form always include taxes.
|
||||
|
||||
.. _payment_providers/configuration:
|
||||
Availability
|
||||
============
|
||||
|
||||
Configuration
|
||||
=============
|
||||
You can adapt the payment provider's availability by specifying the :guilabel:`Maximum amount`
|
||||
allowed and modifying the :guilabel:`Currencies` and :guilabel:`Countries` in the
|
||||
:guilabel:`Configuration` tab.
|
||||
|
||||
.. _payment_providers/currencies_countries:
|
||||
|
||||
Currencies and countries
|
||||
------------------------
|
||||
|
||||
All payment providers have a different list of available currencies and countries. They serve as a
|
||||
first filter during payment operations, i.e., the payment methods linked to the payment provider are
|
||||
not available for selection if the customer's currency or country is not in the supported list. As
|
||||
there might be errors, updates, and unknowns in the lists of available currencies and countries,
|
||||
adding or removing a payment provider's supported currencies or countries is possible.
|
||||
|
||||
.. note::
|
||||
Each provider has its specific configuration flow, depending on :ref:`which feature is available
|
||||
<payment_providers/online_providers>`.
|
||||
|
||||
.. _payment_providers/add_new:
|
||||
- :ref:`Payment methods <payment_providers/payment_methods>` also have their own list of
|
||||
available currencies and countries that serves as another filter during payment operations.
|
||||
- If the list of supported currencies or countries is empty, it means the list is too long to be
|
||||
displayed, or Odoo does not have information on that payment provider. The payment provider
|
||||
remains available, even though it is possible the payment will be refused at a later stage
|
||||
should the country or currency not be supported.
|
||||
|
||||
Add a new payment provider
|
||||
--------------------------
|
||||
Maximum amount
|
||||
--------------
|
||||
|
||||
To add a new payment provider and make it available to your customers, go to
|
||||
:menuselection:`Accounting --> Configuration --> Payment Providers`, look for your payment provider,
|
||||
install the related module, and activate it. To do so, open the payment provider and change its
|
||||
state from *Disabled* to *Enabled*.
|
||||
|
||||
.. image:: payment_providers/activation.png
|
||||
:align: center
|
||||
:alt: Click on install, then on activate to make the payment provider available on Odoo.
|
||||
|
||||
.. warning::
|
||||
We recommend using the *Test Mode* on a duplicated database or a test database. The Test Mode is
|
||||
meant to be used with your test/sandbox credentials, but Odoo generates Sales Orders and Invoices
|
||||
as usual. It isn't always possible to cancel an invoice, and this could create some issues with
|
||||
your invoices numbering if you were to test your payment providers on your main database.
|
||||
|
||||
.. _payment_providers/credentials_tab:
|
||||
|
||||
Credentials tab
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
If not done yet, go to the online payment provider website, create an account, and make sure to have
|
||||
the credentials required for third-party use. Odoo requires these credentials to communicate with
|
||||
the payment provider.
|
||||
|
||||
The form in this section is specific to the payment provider you are configuring. Please refer to
|
||||
the related documentation for more information.
|
||||
|
||||
.. _payment_providers/configuration_tab:
|
||||
|
||||
Configuration tab
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
You can change the payment provider's front-end appearance by modifying its name under the
|
||||
**Displayed as** field, and the supported credit card icons displayed under the **Supported Payment Methods**
|
||||
field.
|
||||
|
||||
.. _payment_providers/currencies:
|
||||
|
||||
Currencies
|
||||
**********
|
||||
|
||||
All payment providers have a different list of available currencies. They are preconfigured and
|
||||
available in the :guilabel:`Configuration` tab. They serve as a first filter during payment
|
||||
operations, i.e. the payment provider is not displayed as available for payment if the currency is
|
||||
not in the supported list.
|
||||
|
||||
.. tip::
|
||||
As there might be errors, updates, and unknowns in the lists of available currencies, it is
|
||||
possible to add or remove currencies.
|
||||
|
||||
If the list of supported currencies is empty, it either means the list is too long to be displayed,
|
||||
or Odoo does not have information on that payment provider. The payment provider remains available,
|
||||
even though it is possible the payment will be refused at a later stage should the currency not be
|
||||
supported. This field is required if the user needs to select a currency when setting up their
|
||||
payment provider account.
|
||||
|
||||
.. _payment_providers/countries:
|
||||
|
||||
Countries
|
||||
*********
|
||||
|
||||
Restrict the use of the payment provider to a selection of countries. Leave this field blank to make
|
||||
the payment provider available in all countries.
|
||||
|
||||
Maximum Amount
|
||||
**************
|
||||
|
||||
Restrict the maximum amount that can be paid with the selected provider. Leave this field to `0.00`
|
||||
to make the payment provider available regardless of the payment amount.
|
||||
You can restrict the :guilabel:`Maximum Amount` that can be paid with the selected provider. Leave
|
||||
the field to `0.00` to make the payment provider available regardless of the payment amount.
|
||||
|
||||
.. important::
|
||||
This feature is not intended to work on pages which allow the customer to update the payment
|
||||
amount. For example, the **Donation** snippet of the Website app, and the **Checkout** page of
|
||||
the **eCommerce** app when paid delivery methods are enabled.
|
||||
This feature is not intended to work on pages that allow the customer to update the payment
|
||||
amount, e.g., the **Donation** snippet and the **Checkout** page when paid :doc:`shipping methods
|
||||
<../websites/ecommerce/checkout_payment_shipping/shipping>` are enabled.
|
||||
|
||||
.. _payment_providers/journal:
|
||||
|
||||
Payment journal
|
||||
***************
|
||||
===============
|
||||
|
||||
The **Payment journal** selected for your payment provider must be a *Bank* journal.
|
||||
A :doc:`payment journal <accounting/bank>` must be defined for the payment provider to record the
|
||||
payments on an **outstanding account**. By default, the :guilabel:`Bank` journal is added as the
|
||||
payment journal for all payment providers. To modify it, go to the :guilabel:`Configuration` tab of
|
||||
the selected payment provider and select another :guilabel:`Payment journal`.
|
||||
|
||||
.. _payment_providers/publish:
|
||||
|
||||
Publish on the website
|
||||
----------------------
|
||||
|
||||
By default, payment providers are *unpublished*, which means that only internal users can see them
|
||||
on the website. Your customers cannot make payments through an unpublished provider but they can
|
||||
still manage :dfn:`(delete and assign to a subscription)` their already existing tokens linked to
|
||||
such an provider. This conveniently allows you to test an provider while preventing making payments
|
||||
and registering new tokens.
|
||||
|
||||
Click on the :guilabel:`Publish` button located in the top right corner of the provider's form to
|
||||
publish it on the website and make it available to your customers. Click on the
|
||||
:guilabel:`Unpublish` button to unpublish it.
|
||||
|
||||
.. tip::
|
||||
Payment providers are automatically published and unpublished when you respectively change their
|
||||
state to `enabled` and `test`.
|
||||
|
||||
.. _payment_providers/accounting:
|
||||
.. note::
|
||||
- The payment journal must be a :guilabel:`Bank` journal.
|
||||
- The same journal can be used for several payment providers.
|
||||
- Payment journals must only be configured if the :doc:`Invoicing or Accounting app <accounting>`
|
||||
is installed.
|
||||
|
||||
Accounting perspective
|
||||
======================
|
||||
----------------------
|
||||
|
||||
The **Bank Payments** that go directly to one of your bank accounts follow their usual
|
||||
reconciliation workflows. However, payments recorded with **Online Payment Providers** require you
|
||||
to consider how you want to record your payments' journal entries. We recommend you to ask your
|
||||
accountant for advice.
|
||||
From an accounting perspective, there are two types of online payment workflows: the payments that
|
||||
are directly deposited into your bank account and follow the usual :doc:`reconciliation
|
||||
<accounting/bank/reconciliation>` workflow, and those coming from third-party :ref:`online payment
|
||||
providers <payment_providers/online_providers>` and require you to follow another accounting
|
||||
workflow. For these payments, you need to consider how you want to record your payments' journal
|
||||
entries. We recommend you ask your accountant for advice.
|
||||
|
||||
You need to select a *Payment Journal* on your provider configuration to record the payments,
|
||||
on a **Outstanding Account**. The Journal's **type** must be *Bank Journal*.
|
||||
|
||||
You can use a single journal for many payment methods. And for each payment method, you can either:
|
||||
|
||||
- Define an **Accounting Account** to separate these payments from another payment method.
|
||||
- Leave blank to fallback on the default account, which you can see or change in the settings.
|
||||
By default, the :guilabel:`Bank Account` defined for the :ref:`payment journal
|
||||
<payment_providers/journal>` is used, but you can also specify an :ref:`outstanding account
|
||||
<bank/outstanding-accounts>` for each payment provider to separate the provider's payments from
|
||||
other payments.
|
||||
|
||||
.. image:: payment_providers/bank_journal.png
|
||||
:align: center
|
||||
:alt: A bank journal in the "Incoming Payments Tab".
|
||||
|
||||
You can have the same bank account for the whole company, or for some journals only, or a single
|
||||
payment method... What best suit your needs.
|
||||
:alt: Define an outstanding account for a payment provider.
|
||||
|
||||
.. seealso::
|
||||
- :doc:`payment_providers/wire_transfer`
|
||||
@@ -425,4 +447,6 @@ payment method... What best suit your needs.
|
||||
- :doc:`payment_providers/razorpay`
|
||||
- :doc:`payment_providers/sips`
|
||||
- :doc:`payment_providers/stripe`
|
||||
- :doc:`payment_providers/xendit`
|
||||
- :doc:`../websites/ecommerce/checkout_payment_shipping/payments`
|
||||
- :doc:`accounting/bank`
|
||||
|
||||
|
Before Width: | Height: | Size: 24 KiB |
@@ -141,7 +141,7 @@ Place a hold on a card
|
||||
Adyen allows you to capture an amount manually instead of having an immediate capture.
|
||||
|
||||
To set it up, enable the **Capture Amount Manually** option on Odoo, as explained in the
|
||||
:ref:`payment providers documentation <payment_providers/features/manual_capture>`.
|
||||
:ref:`payment providers documentation <payment_providers/manual_capture>`.
|
||||
|
||||
Then, open your Adyen Merchant Account, go to :menuselection:`Account --> Settings`, and set the
|
||||
**Capture Delay** to **manual**.
|
||||
|
||||
@@ -41,7 +41,7 @@ Place a hold on a card
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
With Authorize.Net, you can enable the :ref:`manual capture
|
||||
<payment_providers/features/manual_capture>`. If enabled, the funds are reserved for 30 days on the
|
||||
<payment_providers/manual_capture>`. If enabled, the funds are reserved for 30 days on the
|
||||
customer's card, but not charged yet.
|
||||
|
||||
.. warning::
|
||||
@@ -66,9 +66,6 @@ previously configured Authorize.Net payment provider on Odoo by going to :menuse
|
||||
(:guilabel:`⛭`) and select :guilabel:`Duplicate`. Change the provider's name to differentiate both
|
||||
versions (e.g., `Authorize.net - Banks`).
|
||||
|
||||
Open the :guilabel:`Configuration` tab, set the :guilabel:`Allow Payments From` field to
|
||||
:guilabel:`Bank Account (USA only)`.
|
||||
|
||||
When ready, change the provider's :guilabel:`State` to :guilabel:`Enabled` for a regular account or
|
||||
:guilabel:`Test Mode` for a sandbox account.
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 13 KiB |
@@ -22,7 +22,6 @@ The method to acquire your credentials depends on your hosting type:
|
||||
#. Confirm your email address when Stripe sends you a confirmation email.
|
||||
#. At the end of the process, you are redirected to Odoo. If you submitted all the requested
|
||||
information, you are all set and your payment provider is enabled.
|
||||
#. Your can continue to :ref:`stripe/local-payment-methods`.
|
||||
|
||||
.. tip::
|
||||
To use your own API keys, :ref:`activate the Developer mode <developer-mode>` and
|
||||
@@ -40,7 +39,6 @@ The method to acquire your credentials depends on your hosting type:
|
||||
#. :ref:`Fill in your credentials <stripe/api_keys>`.
|
||||
#. :ref:`Generate a webhook <stripe/webhook>`.
|
||||
#. Enable the payment provider.
|
||||
#. You are all set and can continue to :ref:`stripe/local-payment-methods`.
|
||||
|
||||
.. tip::
|
||||
To connect your Stripe account after the onboarding is already completed, go to
|
||||
@@ -100,34 +98,5 @@ create a webhook either automatically or manually.
|
||||
When you click on **Add endpoint**, your Webhook is configured. You can then click on
|
||||
**reveal** to display your signing secret.
|
||||
|
||||
.. _stripe/local-payment-methods:
|
||||
|
||||
Enable local payment methods
|
||||
============================
|
||||
|
||||
Local payment methods are payment methods that are only available for certain merchants and
|
||||
customers countries and currencies.
|
||||
|
||||
Odoo supports the following local payment methods:
|
||||
|
||||
- Bancontact
|
||||
- EPS
|
||||
- giropay
|
||||
- iDEAL
|
||||
- Przelewy24 (P24)
|
||||
|
||||
To enable some of these local payment methods with Stripe, list them as supported payment icons. To
|
||||
do so, go to :menuselection:`Payment Providers --> Stripe --> Configuration` and add the desired
|
||||
payment methods in the **Supported Payment Icons** field. If the desired payment method is already
|
||||
listed, you do not have anything to do.
|
||||
|
||||
.. image:: stripe/payments-config.png
|
||||
:alt: Select and add icons of the payment methods you want to enable
|
||||
|
||||
.. note::
|
||||
- If a payment method record does not exist in the database and its related local payment method
|
||||
is listed above, it is considered enabled with Stripe.
|
||||
- If a local payment method is not listed above, it is not supported and cannot be enabled.
|
||||
|
||||
.. seealso::
|
||||
- :doc:`../payment_providers`
|
||||
|
||||
47
content/applications/finance/payment_providers/xendit.rst
Normal file
@@ -0,0 +1,47 @@
|
||||
======
|
||||
Xendit
|
||||
======
|
||||
|
||||
`Xendit <https://www.xendit.co>`_ is an Indonesian-based payment solution provider that covers
|
||||
several Southeast Asian countries. It allows businesses to accept credit cards as well as several
|
||||
local payment methods.
|
||||
|
||||
.. _payment_providers/xendit/configure_dashboard:
|
||||
|
||||
Configuration on the Xendit Dashboard
|
||||
=====================================
|
||||
|
||||
#. Create a Xendit account if necessary and log in to the `Xendit Dashboard
|
||||
<https://dashboard.xendit.co>`_.
|
||||
#. Check your account mode in the top left corner of the page. Use the :guilabel:`Test Mode` to try
|
||||
the integration without charging your customers. Switch to :guilabel:`Live Mode` once you are
|
||||
ready to accept payments.
|
||||
#. Navigate to :menuselection:`Configuration: Settings` in the left part of the application page.
|
||||
In the :guilabel:`Developers` section, click
|
||||
`API Keys <https://dashboard.xendit.co/settings/developers#api-keys>`_.
|
||||
#. Click :guilabel:`Generate Secret Key`. In the popup box, enter any :guilabel:`API key name`,
|
||||
select :guilabel:`Write` for the :guilabel:`Money-in Products` permission and :guilabel:`None`
|
||||
for all other permissions then click :guilabel:`Generate key`.
|
||||
#. Confirm your password to display your API key. Copy or download the key and **save
|
||||
this information securely for later**. This is the only time the API key can be viewed or
|
||||
downloaded.
|
||||
#. Once completed, scroll down the page to the
|
||||
`Webhooks <https://dashboard.xendit.co/settings/developers#webhooks>`_ section to generate
|
||||
the webhook token.
|
||||
#. Under :guilabel:`Webhook verification token`, click :guilabel:`View Webhook Verification Token`,
|
||||
then confirm your password to display the token. Save it for later.
|
||||
#. In the :guilabel:`Webhook URL` section, enter your Odoo database URL (e.g.,
|
||||
`https://example.odoo.com`) in the field :guilabel:`Invoices paid` and click the
|
||||
:guilabel:`Test and save` button next to it.
|
||||
|
||||
Configuration on Odoo
|
||||
=====================
|
||||
|
||||
#. :ref:`Navigate to the payment provider Xendit <payment_providers/add_new>` and change its state
|
||||
to :guilabel:`Enabled`.
|
||||
#. Fill in the :guilabel:`Secret Key` and :guilabel:`Webhook Token` fields with the
|
||||
information saved at the step :ref:`payment_providers/xendit/configure_dashboard`.
|
||||
#. Configure the rest of the options to your liking.
|
||||
|
||||
.. seealso::
|
||||
:doc:`../payment_providers`
|
||||
@@ -100,6 +100,14 @@ and the status of the signatures.
|
||||
.. image:: sign/signature-status.png
|
||||
:alt: Signature status
|
||||
|
||||
Validity dates and reminders
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
You can set **validity dates** on limited-duration agreement documents or send **automatic email
|
||||
reminders** to obtain signatures on time. From your dashboard, click :guilabel:`Send` on your
|
||||
document. On the new page, go to the :guilabel:`Options` section and fill in the :guilabel:`Valid
|
||||
Until` and :guilabel:`Reminder` fields.
|
||||
|
||||
Templates
|
||||
---------
|
||||
|
||||
@@ -120,9 +128,10 @@ immediately.
|
||||
|
||||
.. tip::
|
||||
You can **create a template from a document that was previously sent**. To do so, go to
|
||||
:menuselection:`Documents --> All Documents`. On the document you want to retrieve, click on
|
||||
⋮, then :guilabel:`Template`. Click on ⋮ again, then :guilabel:`Restore`. Your document now
|
||||
appears on your dashboard next to your other templates.
|
||||
:menuselection:`Documents --> All Documents`. On the document you want to retrieve, click on the
|
||||
the vertical ellipsis (:guilabel:`⋮`), then :guilabel:`Template`. Click on the vertical ellipsis
|
||||
(:guilabel:`⋮`) again, then :guilabel:`Restore`. Your document now appears on your dashboard next
|
||||
to your other templates.
|
||||
|
||||
.. _sign/role:
|
||||
|
||||
@@ -226,8 +235,8 @@ document.
|
||||
Tags
|
||||
====
|
||||
|
||||
Tags can be used to categorize and organize documents, allowing users to search for and filter
|
||||
documents based on specific criteria quickly.
|
||||
Tags can be used to categorize and organize documents, allowing users to quickly search for and
|
||||
filter documents based on specific criteria.
|
||||
|
||||
You can manage tags by going to :menuselection:`Configuration --> Tags`. To create a tag, click
|
||||
:guilabel:`New`. On the new line, add the :guilabel:`Tag Name` and select a :guilabel:`Color Index`
|
||||
@@ -235,23 +244,25 @@ for your tag.
|
||||
|
||||
To apply a tag to a document, use the dropdown list available in your document.
|
||||
|
||||
.. note::
|
||||
You can modify the tags of a signed document by going to :menuselection:`Documents --> All
|
||||
Documents`, clicking the vertical ellipsis (:guilabel:`⋮`) on your document, then
|
||||
:guilabel:`Details`, and modifying your :guilabel:`Tags`.
|
||||
|
||||
Sign order
|
||||
==========
|
||||
|
||||
When a document needs to be signed by different parties, the signing order lets you control the
|
||||
order in which your recipients receive it for signature.
|
||||
|
||||
By going to :menuselection:`Configuration --> Settings`, you can :guilabel:`Enable Signing Order`.
|
||||
After uploading a PDF with at least two signature fields with two different roles and clicking
|
||||
:guilabel:`Send`, toggle the :guilabel:`Specify Signing Order` button and search for the signer's
|
||||
name or email information to add them. You can decide on the signing order by typing **1** or **2**
|
||||
in the first column.
|
||||
|
||||
Each recipient receives the signature request notification only once the previous recipient has
|
||||
completed their action.
|
||||
|
||||
Add at least two :guilabel:`Signature` fields with different roles to your document. Click
|
||||
:guilabel:`Send`, go to the :guilabel:`Options` tab, and tick the :guilabel:`Specify signing order`
|
||||
box.
|
||||
|
||||
Add the signer's :guilabel:`Name or email` information. You can decide on the :guilabel:`Sign Order`
|
||||
by typing :guilabel:`1` or :guilabel:`2` in the :guilabel:`Sign Order` column.
|
||||
|
||||
.. seealso::
|
||||
`Odoo Quick Tips: Sign order [video] <https://www.youtube.com/watch?v=2KUq7RPt1cU/>`_
|
||||
|
||||
|
||||
@@ -7,6 +7,5 @@ VoIP (Voice over Internet Protocol)
|
||||
.. toctree::
|
||||
:titlesonly:
|
||||
|
||||
voip/asterisk
|
||||
voip/onsip
|
||||
voip/axivox
|
||||
|
||||
@@ -1,238 +0,0 @@
|
||||
============================================
|
||||
Configure your VoIP Asterisk server for Odoo
|
||||
============================================
|
||||
|
||||
Installing Asterisk server
|
||||
==========================
|
||||
|
||||
Dependencies
|
||||
------------
|
||||
|
||||
Before installing Asterisk you need to install the following dependencies:
|
||||
|
||||
- wget
|
||||
- gcc
|
||||
- g++
|
||||
- ncurses-devel
|
||||
- libxml2-devel
|
||||
- sqlite-devel
|
||||
- libsrtp-devel
|
||||
- libuuid-devel
|
||||
- openssl-devel
|
||||
- pkg-config
|
||||
|
||||
In order to install libsrtp, follow the instructions below:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
cd /usr/local/src/
|
||||
wget http://srtp.sourceforge.net/srtp-1.4.2.tgz
|
||||
tar zxvf srtp-1.4.2.tgz
|
||||
cd /usr/local/src/srtp
|
||||
./configure CFLAGS=-fPIC --prefix=/usr/local/lib
|
||||
make && make install
|
||||
|
||||
You also need to install PJSIP, you can download the source `here
|
||||
<http://www.pjsip.org/download.htm>`_. Once the source directory is extracted:
|
||||
|
||||
- **Change to the pjproject source directory:**
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
# cd pjproject
|
||||
|
||||
- **run:**
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
# ./configure --prefix=/usr --enable-shared --disable-sound --disable-resample --disable-video --disable-opencore-amr CFLAGS='-O2 -DNDEBUG'
|
||||
|
||||
- **Build and install pjproject:**
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
# make dep
|
||||
# make
|
||||
# make install
|
||||
|
||||
- **Update shared library links:**
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
# ldconfig
|
||||
|
||||
- **Verify that pjproject is installed:**
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
# ldconfig -p | grep pj
|
||||
|
||||
- **The result should be:**
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
libpjsua.so (libc6,x86-64) => /usr/lib/libpjsua.so
|
||||
libpjsip.so (libc6,x86-64) => /usr/lib/libpjsip.so
|
||||
libpjsip-ua.so (libc6,x86-64) => /usr/lib/libpjsip-ua.so
|
||||
libpjsip-simple.so (libc6,x86-64) => /usr/lib/libpjsip-simple.so
|
||||
libpjnath.so (libc6,x86-64) => /usr/lib/libpjnath.so
|
||||
libpjmedia.so (libc6,x86-64) => /usr/lib/libpjmedia.so
|
||||
libpjmedia-videodev.so (libc6,x86-64) => /usr/lib/libpjmedia-videodev.so
|
||||
libpjmedia-codec.so (libc6,x86-64) => /usr/lib/libpjmedia-codec.so
|
||||
libpjmedia-audiodev.so (libc6,x86-64) => /usr/lib/libpjmedia-audiodev.so
|
||||
libpjlib-util.so (libc6,x86-64) => /usr/lib/libpjlib-util.so
|
||||
libpj.so (libc6,x86-64) => /usr/lib/libpj.so
|
||||
|
||||
Asterisk
|
||||
--------
|
||||
|
||||
- In order to install Asterisk 13.7.0, you can download the source directly `there
|
||||
<http://downloads.asterisk.org/pub/telephony/asterisk/old-releases/asterisk-13.7.0.tar.gz>`_.
|
||||
|
||||
- Extract Asterisk:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
tar zxvf asterisk*
|
||||
|
||||
- Enter the Asterisk directory:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
cd ./asterisk*
|
||||
|
||||
- Run the Asterisk configure script:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
./configure --with-pjproject --with-ssl --with-srtp
|
||||
|
||||
- Run the Asterisk menuselect tool:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
make menuselect
|
||||
|
||||
- In the menuselect, go to the resources option and ensure that res_srtp is enabled. If there are
|
||||
3 x’s next to res_srtp, there is a problem with the srtp library and you must reinstall it. Save
|
||||
the configuration (press x). You should also see stars in front of the res_pjsip lines.
|
||||
|
||||
- Compile and install Asterisk:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
make && make install
|
||||
|
||||
- If you need the sample configs you can run 'make samples' to install the sample configs. If you
|
||||
need to install the Asterisk startup script you can run 'make config'.
|
||||
|
||||
DTLS Certificates
|
||||
-----------------
|
||||
|
||||
- After you need to setup the DTLS certificates.
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
mkdir /etc/asterisk/keys
|
||||
|
||||
- Enter the Asterisk scripts directory:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
cd /asterisk*/contrib/scripts
|
||||
|
||||
- Create the DTLS certificates (replace pbx.mycompany.com with your ip address or dns name, replace
|
||||
My Super Company with your company name):
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
./ast_tls_cert -C pbx.mycompany.com -O "My Super Company" -d /etc/asterisk/keys
|
||||
|
||||
Configure Asterisk server
|
||||
=========================
|
||||
|
||||
For WebRTC, a lot of the settings that are needed MUST be in the peer settings. The global settings
|
||||
do not flow down into the peer settings very well. By default, Asterisk config files are located in
|
||||
/etc/asterisk/. Start by editing http.conf and make sure that the following lines are uncommented:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
;http.conf
|
||||
[general]
|
||||
enabled=yes
|
||||
bindaddr=127.0.0.1 ; Replace this with your IP address
|
||||
bindport=8088 ; Replace this with the port you want to listen on
|
||||
|
||||
Next, edit sip.conf. The WebRTC peer requires encryption, avpf, and icesupport to be enabled. In
|
||||
most cases, directmedia should be disabled. Also under the WebRTC client, the transport needs to be
|
||||
listed as ‘ws’ to allow websocket connections. All of these config lines should be under the peer
|
||||
itself; setting these config lines globally might not work:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
;sip.conf
|
||||
[general]
|
||||
realm=127.0.0.1 ; Replace this with your IP address
|
||||
udpbindaddr=127.0.0.1 ; Replace this with your IP address
|
||||
transport=udp
|
||||
|
||||
[1060] ; This will be WebRTC client
|
||||
type=friend
|
||||
username=1060 ; The Auth user for SIP.js
|
||||
host=dynamic ; Allows any host to register
|
||||
secret=password ; The SIP Password for SIP.js
|
||||
encryption=yes ; Tell Asterisk to use encryption for this peer
|
||||
avpf=yes ; Tell Asterisk to use AVPF for this peer
|
||||
icesupport=yes ; Tell Asterisk to use ICE for this peer
|
||||
context=default ; Tell Asterisk which context to use when this peer is dialing
|
||||
directmedia=no ; Asterisk will relay media for this peer
|
||||
transport=udp,ws ; Asterisk will allow this peer to register on UDP or WebSockets
|
||||
force_avp=yes ; Force Asterisk to use avp. Introduced in Asterisk 11.11
|
||||
dtlsenable=yes ; Tell Asterisk to enable DTLS for this peer
|
||||
dtlsverify=no ; Tell Asterisk to not verify your DTLS certs
|
||||
dtlscertfile=/etc/asterisk/keys/asterisk.pem ; Tell Asterisk where your DTLS cert file is
|
||||
dtlsprivatekey=/etc/asterisk/keys/asterisk.pem ; Tell Asterisk where your DTLS private key is
|
||||
dtlssetup=actpass ; Tell Asterisk to use actpass SDP parameter when setting up DTLS
|
||||
|
||||
In the sip.conf and rtp.conf files you also need to add or uncomment the lines:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
icesupport = true
|
||||
stunaddr = stun.l.google.com:19302
|
||||
|
||||
Lastly, set up extensions.conf:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
;extensions.conf
|
||||
[default]
|
||||
exten => 1060,1,Dial(SIP/1060) ; Dialing 1060 will call the SIP client registered to 1060
|
||||
|
||||
Configure Odoo VOIP
|
||||
===================
|
||||
|
||||
In Odoo, the configuration should be done in the user's preferences.
|
||||
|
||||
|
||||
.. image:: asterisk/voip_config01.png
|
||||
:align: center
|
||||
|
||||
- The SIP Login/Browser's Extension is the number you configured previously in the sip.conf file (in
|
||||
our example: 1060).
|
||||
|
||||
- The SIP Password is the secret you chose in the sip.conf file.
|
||||
|
||||
- The extension of your office's phone is not a required field but it is used if you want to
|
||||
transfer your call from Odoo to an external phone also configured in the sip.conf file.
|
||||
|
||||
|
||||
The configuration should also be done in the General Settings under the "Integrations" section.
|
||||
|
||||
.. image:: onsip/onsip02.png
|
||||
:align: center
|
||||
|
||||
- The PBX Server IP should be the same as the IP you define in the http.conf file.
|
||||
|
||||
- The WebSocket should be: ws://localhost:XXXX/ws where "localhost" needs to be the same as the IP
|
||||
defined previously and "XXXX" needs to be the port defined in the http.conf file.
|
||||
|
Before Width: | Height: | Size: 64 KiB |
@@ -6,8 +6,7 @@ Introduction
|
||||
============
|
||||
|
||||
Odoo VoIP can be set up to work together with `Axivox <https://www.axivox.com/>`_. In that case, an
|
||||
:doc:`Asterisk server <asterisk>` is not necessary as the infrastructure is hosted and managed by
|
||||
Axivox.
|
||||
Asterisk server is not necessary as the infrastructure, as it is hosted and managed by Axivox.
|
||||
|
||||
To use this service, `contact Axivox <https://www.axivox.com/contact/>`_ to open an account. Before
|
||||
doing so, verify that Axivox covers your area and the areas you wish to call.
|
||||
|
||||
@@ -1,48 +1,151 @@
|
||||
================================================
|
||||
Process to an Inventory Adjustment with Barcodes
|
||||
================================================
|
||||
=========================================
|
||||
Apply inventory adjustments with barcodes
|
||||
=========================================
|
||||
|
||||
To process an inventory adjustment by using barcodes, you first need to
|
||||
open the *Barcode* app. Then, from the application, click on
|
||||
*Inventory Adjustments*.
|
||||
In a warehouse, the recorded inventory counts in the database might not always match the actual,
|
||||
real inventory counts. In such cases, inventory adjustments can be made to reconcile the
|
||||
differences, and ensure that the recorded counts in the database match the actual counts in the
|
||||
warehouse. In Odoo, the *Barcode* app can be used to make these adjustments.
|
||||
|
||||
.. image:: adjustments/adjustments_01.png
|
||||
:align: center
|
||||
These adjustments can be done in real time using an Odoo-compatible barcode scanner or the Odoo
|
||||
mobile app.
|
||||
|
||||
.. note::
|
||||
If you want to fully work with barcodes, you can download the sheet
|
||||
*Commands for Inventory*.
|
||||
For a list of Odoo-compatible barcode mobile scanners, and other hardware for the *Inventory* and
|
||||
*Barcode* apps, refer to the `Odoo Inventory • Hardware page
|
||||
<https://www.odoo.com/app/inventory-hardware>`_.
|
||||
|
||||
Once you have clicked on *Inventory Adjustments*, Odoo will
|
||||
automatically create one. Note that, if you work with multi-location,
|
||||
you first need to specify in which location the inventory adjustment
|
||||
takes place.
|
||||
.. seealso::
|
||||
:doc:`../../inventory/warehouses_storage/inventory_management/count_products`
|
||||
|
||||
.. image:: adjustments/adjustments_02.png
|
||||
:align: center
|
||||
Enable Barcode app
|
||||
==================
|
||||
|
||||
If you don’t work with multi-location, you will be able to scan the
|
||||
different products you want to include in the inventory adjustment.
|
||||
To use the *Barcode* app to create and apply inventory adjustments, it **must** be installed by
|
||||
enabling the feature from the settings of the *Inventory* app.
|
||||
|
||||
.. image:: adjustments/adjustments_03.png
|
||||
:align: center
|
||||
To do so, go to the :menuselection:`Inventory app --> Configuration --> Settings`. Then, scroll down
|
||||
to the :guilabel:`Barcode` section, and click the checkbox next to the :guilabel:`Barcode Scanner`
|
||||
option.
|
||||
|
||||
.. note::
|
||||
If you have 5 identical articles, scan it 5 times or use the keyboard to
|
||||
set the quantity.
|
||||
Once the checkbox is ticked, click :guilabel:`Save` at the top of the page to save changes.
|
||||
|
||||
Besides using the barcode scanner, you can also manually add a product
|
||||
if necessary. To do so, click on *Add Product* and fill the
|
||||
information in manually.
|
||||
After saving, a new drop-down menu appears under the :guilabel:`Barcode Scanner` option, labeled
|
||||
:guilabel:`Barcode Nomenclature`, where either :guilabel:`Default Nomenclature` or
|
||||
:guilabel:`Default GS1 Nomenclature` can be selected. Each nomenclature option determines how
|
||||
scanners interpret barcodes in Odoo.
|
||||
|
||||
.. image:: adjustments/adjustments_04.png
|
||||
:align: center
|
||||
There is also a :guilabel:`Configure Product Barcodes` internal link arrow, along with a set of
|
||||
:guilabel:`Print` buttons for printing barcode commands and a barcode demo sheet.
|
||||
|
||||
.. image:: adjustments/adjustments_05.png
|
||||
:align: center
|
||||
.. image:: adjustments/adjustments-barcode-setting.png
|
||||
:align: center
|
||||
:alt: Enabled Barcode feature in Inventory app settings.
|
||||
|
||||
When you have scanned all the items of the location, validate the
|
||||
inventory manually or scan the *Validate* barcode.
|
||||
.. seealso::
|
||||
For more information on setting up and configuring the :guilabel:`Barcode` app, refer to the
|
||||
:doc:`Set up your barcode scanner <../setup/hardware>` and :doc:`Activate the Barcodes in Odoo
|
||||
<../setup/software>` docs.
|
||||
|
||||
.. image:: adjustments/adjustments_06.png
|
||||
:align: center
|
||||
Perform an inventory adjustment
|
||||
===============================
|
||||
|
||||
Begin by navigating to the :menuselection:`Barcode app --> Barcode Scanning` dashboard, where
|
||||
different options will be displayed, including :guilabel:`Operations`, :guilabel:`Inventory
|
||||
Adjustments`, and :guilabel:`Batch Transfers`.
|
||||
|
||||
To create and apply inventory adjustments, click on the :guilabel:`Inventory Adjustments` button at
|
||||
the bottom of the screen.
|
||||
|
||||
Doing so navigates to the *Barcode Inventory Client Action* page, labeled as :guilabel:`Inventory
|
||||
Adjustment` in the top header section.
|
||||
|
||||
.. image:: adjustments/adjustments-barcode-scanner.png
|
||||
:align: center
|
||||
:alt: Barcode app start screen with scanner.
|
||||
|
||||
To begin the adjustment, first scan the *source location*, which is the current location in the
|
||||
warehouse of the product whose count should be adjusted. Then, scan the product barcode(s).
|
||||
|
||||
The barcode of a specific product can be scanned multiple times to increase the quantity of that
|
||||
product in the adjustment.
|
||||
|
||||
.. tip::
|
||||
If the warehouse *multi-location* feature is **not** enabled in the database, a source location
|
||||
does not need to be scanned. Instead, simply scan the product barcode to start the inventory
|
||||
adjustment.
|
||||
|
||||
Alternatively, the quantity can be changed by clicking the :guilabel:`✏️ (pencil)` icon on the far
|
||||
right of the product line.
|
||||
|
||||
Doing so opens a separate window with a keypad. Edit the number in the :guilabel:`Quantity` line to
|
||||
change the quantity. Additionally, the :guilabel:`+1` and :guilabel:`-1` buttons can be clicked to
|
||||
add or subtract quantity of the product, and the number keys can be used to add quantity, as well.
|
||||
|
||||
.. example::
|
||||
In the below inventory adjustment, the source location `WH/Stock/Shelf/2` was scanned, assigning
|
||||
the location. Then, the barcode for the product `[FURN_7888] Desk Stand with Screen` was scanned
|
||||
3 times, increasing the units in the adjustment. Additional products can be added to this
|
||||
adjustment by scanning the barcodes for those specific products.
|
||||
|
||||
.. image:: adjustments/adjustments-barcode-inventory-client-action.png
|
||||
:align: center
|
||||
:alt: Barcode Inventory Client Action page with inventory adjustment.
|
||||
|
||||
To complete the inventory adjustment, click the green :guilabel:`✅ Apply` button with the check mark
|
||||
at the bottom of the page.
|
||||
|
||||
Once applied, Odoo navigates back to the :guilabel:`Barcode Scanning` screen. A small green banner
|
||||
appears in the top right corner, confirming validation of the adjustment.
|
||||
|
||||
.. admonition:: Did you know?
|
||||
|
||||
Odoo's *Barcode* application provides demo data with barcodes to explore the features of the app.
|
||||
These can be used for testing purposes, and can be printed from the home screen of the app.
|
||||
|
||||
To access this demo data, navigate to the :menuselection:`Barcode app` and click :guilabel:`stock
|
||||
barcodes sheet` and :guilabel:`commands for Inventory` (bolded and highlighted in blue) in the
|
||||
information pop-up window above the scanner.
|
||||
|
||||
.. image:: adjustments/adjustments-barcode-stock-sheets.png
|
||||
:align: center
|
||||
:alt: Demo data prompt pop-up on Barcode app main screen.
|
||||
|
||||
Manually add products to inventory adjustment
|
||||
=============================================
|
||||
|
||||
When the barcodes for the location or product are not available, Odoo *Barcode* can still be used to
|
||||
perform inventory adjustments.
|
||||
|
||||
To do this, navigate to the :menuselection:`Barcode app --> Barcode Scanning --> Inventory
|
||||
Adjustments`.
|
||||
|
||||
Doing so navigates to the *Barcode Inventory Client Action* page, labeled as :guilabel:`Inventory
|
||||
Adjustment` in the top header section.
|
||||
|
||||
To manually add products to this adjustment, click the white :guilabel:`➕ Add Product` button at the
|
||||
bottom of the screen.
|
||||
|
||||
This navigates to a new, blank page where the desired product, quantity, and source location must be
|
||||
chosen.
|
||||
|
||||
.. image:: adjustments/adjustments-keypad.png
|
||||
:align: center
|
||||
:alt: Keypad to add products on Barcode Inventory Client Action page.
|
||||
|
||||
First, click the :guilabel:`Product` line, and choose the product whose stock count should be
|
||||
adjusted. Then, manually enter the quantity of that product, either by changing the `1` in the
|
||||
:guilabel:`Quantity` line, or by clicking the :guilabel:`+1` and :guilabel:`-1` buttons to add or
|
||||
subtract quantity of the product. The number pad can be used to add quantity, as well.
|
||||
|
||||
Below the number pad is the :guilabel:`location` line, which should read `WH/Stock` by default.
|
||||
Click this line to reveal a drop-down menu of locations to choose from, and choose the
|
||||
:guilabel:`source location` for this inventory adjustment.
|
||||
|
||||
Once ready, click :guilabel:`Confirm` to confirm the changes.
|
||||
|
||||
To apply the inventory adjustment, click the green :guilabel:`✅ Apply` button with the check mark,
|
||||
at the bottom of the page.
|
||||
|
||||
Once applied, Odoo navigates back to the :guilabel:`Barcode Scanning` screen. A small green banner
|
||||
appears in the top right corner, confirming validation of the adjustment.
|
||||
|
||||
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 107 KiB |
|
After Width: | Height: | Size: 57 KiB |
|
After Width: | Height: | Size: 57 KiB |
|
After Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 9.0 KiB |
|
Before Width: | Height: | Size: 7.8 KiB |
|
Before Width: | Height: | Size: 7.8 KiB |
|
Before Width: | Height: | Size: 8.8 KiB |
|
Before Width: | Height: | Size: 9.0 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 107 KiB |
|
After Width: | Height: | Size: 57 KiB |
|
After Width: | Height: | Size: 57 KiB |
|
After Width: | Height: | Size: 40 KiB |
@@ -18,4 +18,7 @@ Advanced operations
|
||||
advanced_operations_warehouse/cluster_picking
|
||||
advanced_operations_warehouse/removal
|
||||
advanced_operations_warehouse/fifo
|
||||
advanced_operations_warehouse/lifo
|
||||
advanced_operations_warehouse/fefo
|
||||
advanced_operations_warehouse/closest_location
|
||||
advanced_operations_warehouse/least_packages
|
||||
|
||||
@@ -0,0 +1,98 @@
|
||||
========================
|
||||
Closest location removal
|
||||
========================
|
||||
|
||||
For the *Closest Location* removal strategy, products are picked based on the alphanumeric order of
|
||||
storage location titles.
|
||||
|
||||
The goal of this strategy is to save the warehouse worker from taking a long journey to a farther
|
||||
shelf when the product is also available at a closer location.
|
||||
|
||||
.. seealso::
|
||||
:doc:`About removal strategies <removal>`
|
||||
|
||||
.. _inventory/warehouses_storage/sequence:
|
||||
|
||||
To understand *location sequence* in the closest removal strategy, consider the following example:
|
||||
|
||||
.. example::
|
||||
A product is stored in the following locations: `Shelf A/Pallet`, `Shelf A/Rack 1`, and `Shelf
|
||||
A/Rack 2`.
|
||||
|
||||
.. image:: closest_location/locations.png
|
||||
:align: center
|
||||
:alt: Show a mockup of real storage location in a warehouse.
|
||||
|
||||
The sublocation, `Pallet`, is on the ground level. Products stored here are easier to retrieve,
|
||||
compared to requiring a forklift to reach `Rack 1` and `Rack 2`. The storage locations were
|
||||
strategically named in alphabetic order, based on ease of access.
|
||||
|
||||
.. important::
|
||||
To use this removal strategy, the :guilabel:`Storage Locations` and :guilabel:`Multi-Step Routes`
|
||||
settings **must** be enabled in :menuselection:`Inventory app --> Configuration --> Settings`.
|
||||
|
||||
.. seealso::
|
||||
:ref:`Set up removal strategy <inventory/warehouses_storage/removal-config>`
|
||||
|
||||
.. _inventory/warehouses_storage/location-name:
|
||||
|
||||
Location names
|
||||
==============
|
||||
|
||||
To configure location names, begin by navigating to :menuselection:`Inventory app --> Configuration
|
||||
--> Locations`. Then, select an existing location, or click :guilabel:`New` to create a new one, and
|
||||
then enter the desired name in the :guilabel:`Location Name` field.
|
||||
|
||||
Once the locations are named in alphabetical order, based on their proximity to the output or
|
||||
packing location, set the removal strategy on the :ref:`parent location
|
||||
<inventory/location-hierarchy>`.
|
||||
|
||||
To do that, in the :guilabel:`Locations` list, select the parent location of the alphabetically
|
||||
named storage locations.
|
||||
|
||||
Doing so opens the form for the parent location. In the :guilabel:`Removal Strategy` field, select
|
||||
:guilabel:`Closest Location`.
|
||||
|
||||
.. example::
|
||||
In a warehouse, the storage location `WH/Stock/Shelf 1` is located closest to the packing area,
|
||||
where products retrieved from shelves are packed for shipment. The popular product, `iPhone
|
||||
charger` is stored in three locations, `WH/Stock/Shelf 1`, `WH/Stock/Shelf 2`, and
|
||||
`WH/Stock/Shelf 3`.
|
||||
|
||||
To use closest location, set the removal strategy on the parent location, 'WH/Stock'.
|
||||
|
||||
Workflow
|
||||
========
|
||||
|
||||
To see how the closest location removal strategy works, consider the following example, featuring
|
||||
the popular product, `iPhone charger`, which is stored in `WH/Stock/Shelf 1`, `WH/Stock/Shelf 2`,
|
||||
and `WH/Stock/Shelf 3`.
|
||||
|
||||
Fifteen, five, and thirty units are in stock at each respective location.
|
||||
|
||||
.. tip::
|
||||
To check the on-hand stock at each storage location, navigate to the product form, and click the
|
||||
:guilabel:`On Hand` smart button.
|
||||
|
||||
.. image:: closest_location/on-hand-stock.png
|
||||
:align: center
|
||||
:alt: Show on-hand stock at all locations.
|
||||
|
||||
Create a :ref:`delivery order <inventory/delivery/one-step>` for eighteen units of the `iPhone
|
||||
charger` by navigating to the :menuselection:`Sales app` and creating a new quotation.
|
||||
|
||||
After adding the products, clicking :guilabel:`Confirm` creates a delivery order that reserves items
|
||||
stored at the closest location, using the removal strategy.
|
||||
|
||||
For more details about *where* the units were picked, select the :guilabel:`⦙≣ (bulleted list)`
|
||||
icon, located on the far-right. Doing so opens the :guilabel:`Open: Stock move` pop-up window that
|
||||
displays how the reserved items were picked, according to the removal strategy.
|
||||
|
||||
In the :guilabel:`Open: Stock move` pop-up window, the :guilabel:`Pick from` field displays where
|
||||
the quantities to fulfill the :guilabel:`Demand` are picked. All fifteen of the units stored at the
|
||||
closest location, `WH/Stock/Shelf 1`, are picked first. The remaining three units are then selected
|
||||
from the second closest location, `WH/Stock/Shelf 2`.
|
||||
|
||||
.. image:: closest_location/stock-move-window.png
|
||||
:align: center
|
||||
:alt: Display *Pick From* quantities for the order for iPhone chargers.
|
||||
|
After Width: | Height: | Size: 55 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 13 KiB |
@@ -0,0 +1,72 @@
|
||||
======================
|
||||
Least packages removal
|
||||
======================
|
||||
|
||||
The *Least Packages* removal strategy fulfills an order by opening the fewest number of packages,
|
||||
which is ideal for maintaining organized stock without needing to open multiple boxes.
|
||||
|
||||
.. seealso::
|
||||
- :doc:`Other removal strategies <removal>`
|
||||
- `Odoo Tutorials: Least Packages <https://www.odoo.com/slides/slide/5477/share>`_
|
||||
|
||||
To understand how the removal strategy works, consider the following example, featuring a warehouse
|
||||
that stores packages of flour in bulk packages of `100 kg`.
|
||||
|
||||
To minimize moisture, and/or prevent pests from entering open packages, the least packages removal
|
||||
strategy is used to pick from a single, opened package.
|
||||
|
||||
.. _inventory/warehouses_storage/pkg-qty:
|
||||
|
||||
.. example::
|
||||
A package of `100 kg` of flour is depleted to `54 kg` after fulfilling some orders. There are
|
||||
other packages of `100 kg` in stock.
|
||||
|
||||
#. When an order for `14 kg` of flour is placed, the package of `54 kg` is selected.
|
||||
#. When an order for *more* than `54 kg` of flour is placed, an unopened `100 kg` package is used
|
||||
to fulfill the order. While this temporarily results in two open packages, these open packages
|
||||
are prioritized in the next picking.
|
||||
|
||||
Workflow
|
||||
========
|
||||
|
||||
Using the least package removal strategy, the fewest number of packages is used to fulfill an order.
|
||||
|
||||
.. important::
|
||||
The :ref:`Packages feature <inventory/warehouses_storage/pack-setup>` **must** be enabled to use
|
||||
this strategy.
|
||||
|
||||
Consider the following example, featuring the product, `Flour`. The product's :guilabel:`Units of
|
||||
Measure` field, located on the product form, is set to `kg`. The product is stored in packages of
|
||||
`100 kg`, with one remaining package containing `54 kg`. The product category's :guilabel:`Force
|
||||
Removal Strategy` is set to :guilabel:`Least Packages`.
|
||||
|
||||
.. seealso::
|
||||
- :ref:`Set removal strategy on product category <inventory/warehouses_storage/removal-config>`
|
||||
|
||||
.. tip::
|
||||
To check the product's on-hand stock, navigate to the product form, and click the :guilabel:`On
|
||||
Hand` smart button.
|
||||
|
||||
.. image:: least_packages/on-hand-flour.png
|
||||
:align: center
|
||||
:alt: Show on-hand stock in each package.
|
||||
|
||||
Create a :ref:`delivery order <inventory/delivery/one-step>` for eighty kilograms of flour by going
|
||||
to the :menuselection:`Sales app` and creating a new quotation. After clicking :guilabel:`Confirm`,
|
||||
the delivery order is created.
|
||||
|
||||
On the delivery order, the :guilabel:`Quantity` field displays the amount automatically picked,
|
||||
according to the removal strategy.
|
||||
|
||||
For more details about *where* the units were picked, select the :guilabel:`⦙≣ (bulleted list)`
|
||||
icon, located on the far-right. Doing so opens the :guilabel:`Open: Stock move` pop-up window,
|
||||
displaying how the reserved items were picked, according to the removal strategy.
|
||||
|
||||
In the :guilabel:`Open: Stock move` pop-up window, the :guilabel:`Pick from` field displays where
|
||||
the quantities to fulfill the :guilabel:`Demand` are picked. Since the order demanded eighty
|
||||
kilograms, which exceeds the quantity in the opened package of `54 kg`, an unopened package of `100
|
||||
kg` is selected.
|
||||
|
||||
.. image:: least_packages/least-package.png
|
||||
:align: center
|
||||
:alt: Show which package was picked in the *Pick From* field.
|
||||
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 23 KiB |
@@ -0,0 +1,65 @@
|
||||
============
|
||||
LIFO removal
|
||||
============
|
||||
|
||||
The *Last In, First Out* (LIFO) removal strategy picks the **newest** products on-hand, based on the
|
||||
date they entered a warehouse's stock.
|
||||
|
||||
Every time an order is placed for products using the :abbr:`LIFO (Last In, First Out)` strategy, a
|
||||
transfer is created for the lot/serial number that has most recently entered the stock (the **last**
|
||||
lot/serial number that entered the warehouse's inventory).
|
||||
|
||||
.. seealso::
|
||||
:doc:`About removal strategies <removal>`
|
||||
|
||||
.. warning::
|
||||
In many countries, the :abbr:`LIFO (Last In, First Out)` removal strategy is banned, since it can
|
||||
potentially result in old, expired, or obsolete products being delivered to customers.
|
||||
|
||||
Consider the following example, with the product, `Cinder Block`, which is tracked :guilabel:`By
|
||||
Lots` in the :guilabel:`Inventory` tab of the product form. The :guilabel:`Force Removal Strategy`
|
||||
for the cinder block's product category is set to :guilabel:`Last In, First Out (LIFO)`.
|
||||
|
||||
.. seealso::
|
||||
- :ref:`Set up force removal strategy <inventory/warehouses_storage/removal-config>`
|
||||
- :ref:`Enable lots tracking <inventory/warehouses_storage/lots-setup>`
|
||||
- :ref:`Check arrival date <inventory/warehouses_storage/arrival_date>`
|
||||
|
||||
The following table represents the cinder blocks in stock, and their various lot number details.
|
||||
|
||||
.. list-table::
|
||||
:header-rows: 1
|
||||
:stub-columns: 1
|
||||
|
||||
* -
|
||||
- LOT1
|
||||
- LOT2
|
||||
- LOT3
|
||||
* - On-hand stock
|
||||
- 10
|
||||
- 10
|
||||
- 10
|
||||
* - :ref:`Created on <inventory/warehouses_storage/arrival_date>`
|
||||
- June 1
|
||||
- June 3
|
||||
- June 6
|
||||
|
||||
To see the removal strategy in action, create a :ref:`delivery order <inventory/delivery/one-step>`
|
||||
for seven cinder blocks by navigating to the :menuselection:`Sales app` and creating a new
|
||||
quotation.
|
||||
|
||||
:guilabel:`Confirm` the sales order to create a delivery order. Doing so reserves the newest lot
|
||||
numbers are using the :abbr:`LIFO (Last In, First Out)` removal strategy.
|
||||
|
||||
To view the detailed pickings, click the :guilabel:`⦙≣ (bulleted list)` icon, located on the
|
||||
far-right of the cinder block's product line in the :guilabel:`Operations` tab of the delivery
|
||||
order. Doing so opens the :guilabel:`Open: Stock move` pop-up window.
|
||||
|
||||
In the :guilabel:`Open: Stock move` pop-up window, the :guilabel:`Pick from` field displays where
|
||||
the quantities to fulfill the :guilabel:`Demand` are picked from. Since the order demanded seven
|
||||
cinder blocks, the newest cinder blocks from `LOT3` are selected, using the :abbr:`LIFO (Last In,
|
||||
First Out)` removal strategy.
|
||||
|
||||
.. image:: lifo/cinder-block-picking.png
|
||||
:align: center
|
||||
:alt: The detailed operations shows which lots are being selected for the picking.
|
||||
|
After Width: | Height: | Size: 29 KiB |
@@ -16,16 +16,16 @@ Odoo automatically select how products are selected for orders:
|
||||
|
||||
* -
|
||||
- :doc:`FIFO <fifo>`
|
||||
- LIFO
|
||||
- :doc:`LIFO <lifo>`
|
||||
- :doc:`FEFO <fefo>`
|
||||
- Closest Location
|
||||
- Least Packages
|
||||
- :doc:`Closest Location <closest_location>`
|
||||
- :doc:`Least Packages <least_packages>`
|
||||
* - Based on
|
||||
- :ref:`Incoming date <inventory/warehouses_storage/arrival_date>`
|
||||
- :ref:`Incoming date <inventory/warehouses_storage/arrival_date>`
|
||||
- :ref:`Removal date <inventory/warehouses_storage/removal-date>`
|
||||
- Location sequence
|
||||
- Package quantity
|
||||
- :ref:`Location sequence <inventory/warehouses_storage/sequence>`
|
||||
- :ref:`Package quantity <inventory/warehouses_storage/pkg-qty>`
|
||||
* - Selection order
|
||||
- First in
|
||||
- Last in
|
||||
@@ -144,7 +144,7 @@ and alert dates on a lot or serial number by navigating to :menuselection:`Inven
|
||||
Configuration --> Settings`.
|
||||
|
||||
Under the :guilabel:`Traceability` heading, ensure the :guilabel:`Lots & Serial Numbers` feature is
|
||||
selected, and then select the checkbox for :guilabel:`Expiration Dates` to enable the feature.
|
||||
selected, and then select the check box for :guilabel:`Expiration Dates` to enable the feature.
|
||||
|
||||
.. image:: removal/enable-expiration.png
|
||||
:align: center
|
||||
|
||||
@@ -108,8 +108,9 @@ should be linked to this printer.
|
||||
:align: center
|
||||
:alt: The printer devices listed in the IoT Devices menu.
|
||||
|
||||
Now, each time :guilabel:`Print` is selected in the control panel, instead of downloading a PDF,
|
||||
Odoo sends the report to the selected printer, and automatically prints it.
|
||||
Now, each time :guilabel:`Print` is selected in the control panel, instead of downloading a PDF, a
|
||||
pop-up appears which displays all the printer(s) linked to the report. Then Odoo sends the report to
|
||||
the selected printer(s), and automatically prints it.
|
||||
|
||||
.. seealso::
|
||||
:doc:`POS Order Printing <../../../sales/point_of_sale/restaurant/kitchen_printing>`
|
||||
|
||||
@@ -19,6 +19,8 @@ to move to the next line.
|
||||
later, you must do it manually. To do so, click the name on the top bar and proceed to the
|
||||
modification.
|
||||
|
||||
.. _knowledge/text-editor:
|
||||
|
||||
Text editor
|
||||
-----------
|
||||
|
||||
@@ -90,6 +92,8 @@ proceed equally and click the red-circled :guilabel:`x`.
|
||||
- The emoji is also displayed before the corresponding article in the side panel hierarchic tree.
|
||||
- Click the emoji on the side panel to change it without opening the related article.
|
||||
|
||||
.. _knowledge/powerbox:
|
||||
|
||||
Commands
|
||||
========
|
||||
|
||||
|
||||
@@ -2,341 +2,541 @@
|
||||
PDF reports
|
||||
===========
|
||||
|
||||
With Studio, you can edit existing PDF reports (e.g., orders and quotations) or create new ones.
|
||||
|
||||
.. important::
|
||||
To edit a standard PDF report, it is strongly recommended to **duplicate** it and make changes to
|
||||
the duplicated version, as changes made to standard reports will be overwritten after an Odoo
|
||||
upgrade. To duplicate a report, go to :menuselection:`Studio --> Reports`. Hover the mouse
|
||||
pointer on the top right corner of the report, click the vertical ellipsis icon (:guilabel:`⋮`),
|
||||
and then select :guilabel:`Duplicate`.
|
||||
|
||||
.. image:: pdf_reports/duplicate-report.png
|
||||
:alt: Duplicating a PDF report
|
||||
With Studio, you can :ref:`edit existing PDF reports <studio/pdf-reports/edit>` (e.g., invoices,
|
||||
quotations, etc.) or :ref:`create new ones <studio/pdf-reports/edit>`.
|
||||
|
||||
.. _studio/pdf-reports/default-layout:
|
||||
|
||||
Default layout
|
||||
==============
|
||||
|
||||
The default layout of reports is managed outside Studio. Go to :menuselection:`Settings -->
|
||||
Companies: Document Layout --> Configure Document Layout`. Layout settings apply to all reports but
|
||||
only to the current company.
|
||||
The default layout of reports is managed outside Studio. Go to :menuselection:`Settings`, then, in
|
||||
the :guilabel:`Companies` section, click :guilabel:`Configure Document Layout`. Layout settings are
|
||||
company-specific but apply to all reports.
|
||||
|
||||
.. tip::
|
||||
Use :guilabel:`Download PDF Preview` to view how the different settings affect the layout of a
|
||||
sample invoice.
|
||||
You can see how the different settings affect the report layout in the report preview on the
|
||||
right, or download a sample invoice PDF by clicking :guilabel:`Download PDF Preview`.
|
||||
|
||||
Use the following settings:
|
||||
|
||||
.. _studio/pdf-reports/default-layout/layout:
|
||||
|
||||
Layout
|
||||
------
|
||||
- :guilabel:`Layout`: Four layouts are available:
|
||||
|
||||
Four layouts are available.
|
||||
.. tabs::
|
||||
|
||||
.. tabs::
|
||||
.. tab:: Light
|
||||
|
||||
.. tab:: Light
|
||||
.. image:: pdf_reports/layout-light.png
|
||||
:alt: Light report layout sample
|
||||
|
||||
.. image:: pdf_reports/light.png
|
||||
:alt: Light report layout sample
|
||||
.. tab:: Boxed
|
||||
|
||||
.. tab:: Boxed
|
||||
.. image:: pdf_reports/layout-boxed.png
|
||||
:alt: Boxed report layout sample
|
||||
|
||||
.. image:: pdf_reports/boxed.png
|
||||
:alt: Boxed report layout sample
|
||||
.. tab:: Bold
|
||||
|
||||
.. tab:: Bold
|
||||
.. image:: pdf_reports/layout-bold.png
|
||||
:alt: Bold report layout sample
|
||||
|
||||
.. image:: pdf_reports/bold.png
|
||||
:alt: Bold report layout sample
|
||||
.. tab:: Striped
|
||||
|
||||
.. tab:: Striped
|
||||
|
||||
.. image:: pdf_reports/striped.png
|
||||
:alt: Striped report layout sample
|
||||
.. image:: pdf_reports/layout-striped.png
|
||||
:alt: Striped report layout sample
|
||||
|
||||
.. _studio/pdf-reports/default-layout/font:
|
||||
|
||||
Font
|
||||
----
|
||||
|
||||
Seven fonts are available. Click on the links below to preview them on `Google Fonts
|
||||
<https://fonts.google.com/>`_.
|
||||
|
||||
- `Lato <https://fonts.google.com/specimen/Lato#type-tester>`_
|
||||
- `Roboto <https://fonts.google.com/specimen/Roboto#type-tester>`_
|
||||
- `Open Sans <https://fonts.google.com/specimen/Open+Sans#type-tester>`_
|
||||
- `Montserrat <https://fonts.google.com/specimen/Montserrat#type-tester>`_
|
||||
- `Oswald <https://fonts.google.com/specimen/Oswald#type-tester>`_
|
||||
- `Raleway <https://fonts.google.com/specimen/Raleway#type-tester>`_
|
||||
- `Tajawal <https://fonts.google.com/specimen/Tajawal#type-tester>`_
|
||||
|
||||
.. note::
|
||||
:guilabel:`Tajawal` supports both Arabic and Latin scripts.
|
||||
- :guilabel:`Font`: Seven fonts are available: Lato, Roboto, Open Sans, Montserrat, Oswald, Raleway,
|
||||
and Tajawal (which supports Arabic and Latin scripts). Go to the
|
||||
`Google Fonts website <https://fonts.google.com/>`_ to preview them.
|
||||
|
||||
.. _studio/pdf-reports/default-layout/logo:
|
||||
|
||||
Company logo
|
||||
------------
|
||||
|
||||
Upload an image file to add a :guilabel:`Company Logo`.
|
||||
|
||||
.. note::
|
||||
This adds the logo to the company’s record on the *Company* model, which you can access by going
|
||||
to :menuselection:`General Settings --> Companies --> Update Info`.
|
||||
- :guilabel:`Company logo`: Click the :guilabel:`Edit` button to upload or change the logo. This
|
||||
adds the logo to the company’s record on the *Company* model, which you can access by going to
|
||||
:menuselection:`Settings` and then clicking :guilabel:`Update Info` in the :guilabel:`Companies`
|
||||
section.
|
||||
|
||||
.. _studio/pdf-reports/default-layout/colors:
|
||||
|
||||
Colors
|
||||
------
|
||||
|
||||
Change the primary and secondary colors used throughout reports to highlight important elements.
|
||||
The default colors are automatically generated based on the colors of the logo.
|
||||
- :guilabel:`Colors`: Change the primary and secondary colors used to structure reports. The default
|
||||
colors are automatically generated based on the colors of the logo.
|
||||
|
||||
.. _studio/pdf-reports/default-layout/background:
|
||||
|
||||
Layout background
|
||||
-----------------
|
||||
- :guilabel:`Layout background`: The following backgrounds are available:
|
||||
|
||||
Change the :guilabel:`Layout Background` of the report:
|
||||
|
||||
- :guilabel:`Blank`: nothing is displayed.
|
||||
- :guilabel:`Geometric`: an image featuring geometric shapes is displayed in the background.
|
||||
- :guilabel:`Custom`: use a custom background image by uploading one.
|
||||
- :guilabel:`Blank`: nothing is displayed.
|
||||
- :guilabel:`Geometric`: an image featuring geometric shapes is displayed in the background.
|
||||
- :guilabel:`Custom`: upload a custom background image.
|
||||
|
||||
.. _studio/pdf-reports/default-layout/tagline:
|
||||
|
||||
Company tagline
|
||||
---------------
|
||||
|
||||
The :guilabel:`Company Tagline` is displayed on the header of :ref:`External reports
|
||||
<studio/pdf-reports/header-footer/external>`. You can add multiple lines of text.
|
||||
- :guilabel:`Company tagline`: This is displayed in the header of :ref:`external reports
|
||||
<studio/pdf-reports/header-footer/external>`. You can add multiple lines of text.
|
||||
|
||||
.. _studio/pdf-reports/default-layout/details:
|
||||
|
||||
Company details
|
||||
---------------
|
||||
|
||||
The :guilabel:`Company Details` are displayed on the header of :ref:`External reports
|
||||
<studio/pdf-reports/header-footer/external>`. You can add multiple lines of text.
|
||||
- :guilabel:`Company details`: These are displayed in the header of :ref:`external reports
|
||||
<studio/pdf-reports/header-footer/external>`. You can add multiple lines of text.
|
||||
|
||||
.. _studio/pdf-reports/default-layout/footer:
|
||||
|
||||
Footer
|
||||
------
|
||||
|
||||
Use the :guilabel:`Footer` field to put any text in the :ref:`External reports'
|
||||
<studio/pdf-reports/header-footer/external>` footers. You can add multiple lines of text.
|
||||
- :guilabel:`Footer`: This text is used in the footer of :ref:`external reports
|
||||
<studio/pdf-reports/header-footer/external>`. You can add multiple lines of text. You can also
|
||||
edit the footer using the :ref:`report editor <studio/pdf-reports/edit>`.
|
||||
|
||||
.. _studio/pdf-reports/default-layout/paper:
|
||||
|
||||
Paper format
|
||||
------------
|
||||
- :guilabel:`Paper format`: to define the default paper size of reports. You can select
|
||||
:guilabel:`A4` (21 cm x 29.7 cm), :guilabel:`US Letter` (21.59 cm x 27.54 cm), or
|
||||
:guilabel:`QR codes page`. This can also be defined for individual reports in the
|
||||
:guilabel:`Paper format` field in :ref:`Studio <studio/pdf-reports/create>`.
|
||||
|
||||
Use the :guilabel:`Paper format` field to change the paper size of reports. You can either select
|
||||
:guilabel:`A4` (21 cm x 29.7 cm) or :guilabel:`US Letter` (21.59 cm x 27.54 cm).
|
||||
.. _studio/pdf-reports/create:
|
||||
|
||||
.. tip::
|
||||
You can change the :guilabel:`Paper format` on individual reports. Open the app containing the
|
||||
report, then go to :menuselection:`Studio --> Reports --> Select or Create a report --> Report
|
||||
--> Select a Paper format`.
|
||||
Creating new PDF reports
|
||||
========================
|
||||
|
||||
.. image:: pdf_reports/default-layout.png
|
||||
:alt: Configuration pop-up window for the default layout of PDF reports
|
||||
|
||||
.. _studio/pdf-reports/header-footer:
|
||||
|
||||
Header and footer
|
||||
=================
|
||||
|
||||
When creating a new report in Studio, you must choose between one of three styles of reports first.
|
||||
This is solely used to determine what is displayed on the header and footer. To do so, go to the app
|
||||
on which you want to add a new report, click the **Toggle Studio** button, then click
|
||||
:guilabel:`Reports`. Click :guilabel:`New` and select
|
||||
:ref:`studio/pdf-reports/header-footer/external`, :ref:`studio/pdf-reports/header-footer/internal`,
|
||||
or :ref:`studio/pdf-reports/header-footer/blank`.
|
||||
To create a new report for a model, access the model, click the **Toggle Studio** button, then click
|
||||
:guilabel:`Reports`. Click :guilabel:`New` and, in the popup window that opens, select the type of
|
||||
report. This is solely used to determine what is displayed in the header and footer:
|
||||
|
||||
.. _studio/pdf-reports/header-footer/external:
|
||||
|
||||
External
|
||||
--------
|
||||
- :guilabel:`External`:
|
||||
|
||||
The header displays the company :ref:`studio/pdf-reports/default-layout/logo` and several values
|
||||
set on the *Company* model: the :guilabel:`Company Name`, :guilabel:`Phone`, :guilabel:`Email`, and
|
||||
:guilabel:`Website`.
|
||||
- The header displays the company's :ref:`logo <studio/pdf-reports/default-layout/logo>`,
|
||||
:ref:`tagline <studio/pdf-reports/default-layout/tagline>`, and
|
||||
:ref:`details <studio/pdf-reports/default-layout/details>`.
|
||||
- The footer displays the values set in the
|
||||
:ref:`Footer <studio/pdf-reports/default-layout/footer>` field and the page number.
|
||||
|
||||
- :guilabel:`Internal`: The header displays the user's current date and time,
|
||||
:guilabel:`Company Name`, and page number. There is no footer.
|
||||
|
||||
- :guilabel:`Blank`: There is neither a header nor a footer. Click in the upper left corner of the
|
||||
page to edit the report.
|
||||
|
||||
Once you have created the report, you can start :ref:`editing it <studio/pdf-reports/edit>`.
|
||||
|
||||
.. _studio/pdf-reports/edit:
|
||||
|
||||
Editing PDF reports
|
||||
===================
|
||||
|
||||
To access the reports available for a model, access the model (e.g., sales orders), click the
|
||||
**Toggle Studio** button, then click :guilabel:`Reports`. Select an existing report to open it or
|
||||
:ref:`create a new one <studio/pdf-reports/create>`.
|
||||
|
||||
.. tip::
|
||||
To change a company's information, go to :menuselection:`Settings --> Companies --> Update Info`.
|
||||
Alternatively, you can also open Studio, click :guilabel:`Reports`, and search for a specific
|
||||
report or model.
|
||||
|
||||
.. image:: pdf_reports/external-header.png
|
||||
:alt: Example of an External header
|
||||
.. important::
|
||||
It is strongly recommended to **duplicate** the standard report and perform changes in the
|
||||
duplicated version. To duplicate a report, hover the mouse pointer on the top right corner
|
||||
of the report, click the vertical ellipsis icon (:guilabel:`⋮`), and then select
|
||||
:guilabel:`Duplicate`.
|
||||
|
||||
The footer displays the values set on the :ref:`studio/pdf-reports/default-layout/footer`,
|
||||
:ref:`studio/pdf-reports/default-layout/details`, and
|
||||
:ref:`studio/pdf-reports/default-layout/tagline` fields, as well as the page number.
|
||||
.. image:: pdf_reports/duplicate-report.png
|
||||
:alt: Duplicating a PDF report
|
||||
|
||||
.. image:: pdf_reports/external-footer.png
|
||||
:alt: Example of an External footer
|
||||
Options
|
||||
-------
|
||||
|
||||
.. _studio/pdf-reports/header-footer/internal:
|
||||
Once you've selected or created a report, you can use the options in the left part of the screen to:
|
||||
|
||||
Internal
|
||||
--------
|
||||
|
||||
The header displays the user's current date and time, :guilabel:`Company Name`, and page number.
|
||||
|
||||
There is no footer.
|
||||
|
||||
.. _studio/pdf-reports/header-footer/blank:
|
||||
|
||||
Blank
|
||||
-----
|
||||
|
||||
There is neither a header nor a footer.
|
||||
|
||||
.. _studio/pdf-reports/elements:
|
||||
|
||||
Add tab
|
||||
=======
|
||||
|
||||
After opening an existing report or creating a new one, go to the :guilabel:`Add` tab to add or edit
|
||||
elements. The elements are organized into four categories: :ref:`studio/pdf-reports/elements/block`,
|
||||
:ref:`studio/pdf-reports/elements/inline`, :ref:`studio/pdf-reports/elements/table`, and
|
||||
:ref:`studio/pdf-reports/elements/column`.
|
||||
|
||||
.. _studio/pdf-reports/elements/block:
|
||||
|
||||
Block
|
||||
-----
|
||||
|
||||
Block elements start on a new line and occupy the full width of the page.
|
||||
|
||||
.. tip::
|
||||
You can set an element's width by selecting it and going to the :guilabel:`Options` tab.
|
||||
|
||||
- :guilabel:`Text`: add any text using small font size by default.
|
||||
|
||||
- :guilabel:`Title Block`: add any text using larger font size by default.
|
||||
|
||||
- :guilabel:`Image`: add an image. You can either upload one from your device, add one from
|
||||
an URL, or select one already existing on your database.
|
||||
|
||||
- :guilabel:`Field`: dynamically add a field's value.
|
||||
|
||||
- :guilabel:`Field & Label`: to dynamically add a field's value and label.
|
||||
|
||||
- :guilabel:`Address Block`: to dynamically add the values, if any, of a contact's (`res.partner`
|
||||
model): *Name*, *Address*, *Phone*, *Mobile*, and *Email*.
|
||||
|
||||
.. image:: pdf_reports/address-block.png
|
||||
:alt: Example of an Address Block
|
||||
|
||||
.. _studio/pdf-reports/elements/inline:
|
||||
|
||||
Inline
|
||||
------
|
||||
|
||||
Inline elements are used around other elements. They do not start on a new line and the width adapts
|
||||
to length of the content.
|
||||
|
||||
.. tip::
|
||||
You can set an element's width and margins by selecting it and going to the :guilabel:`Options`
|
||||
tab.
|
||||
|
||||
- :guilabel:`Text`: add any text using small font size by default.
|
||||
|
||||
- :guilabel:`Field`: dynamically add a field's value.
|
||||
|
||||
.. _studio/pdf-reports/elements/table:
|
||||
|
||||
Table
|
||||
-----
|
||||
|
||||
Table elements are used together to create a data table.
|
||||
|
||||
- :guilabel:`Data table`: create a table and dynamically add a first column displaying the *Name*
|
||||
values of a :ref:`Many2Many <studio/fields/relational-fields/many2many>` or :ref:`One2Many
|
||||
<studio/fields/relational-fields/one2many>` field on your model.
|
||||
|
||||
.. image:: pdf_reports/data-table.png
|
||||
:alt: Example of a Data table
|
||||
|
||||
- :guilabel:`Field Column`: add a new column to the table displaying the values of a :ref:`Related
|
||||
Field <studio/fields/relational-fields/related-field>` to the one used to create the
|
||||
:guilabel:`Data table`.
|
||||
|
||||
- :guilabel:`Text in Cell`: add any text within an existing table cell.
|
||||
|
||||
- :guilabel:`Field in Cell`: add, within an existing table cell, the values of a :ref:`Related
|
||||
Field <studio/fields/relational-fields/related-field>` to the one used to create the
|
||||
:guilabel:`Data table`.
|
||||
|
||||
- :guilabel:`Subtotal & Total`: add an existing :guilabel:`Total` field's value. If a
|
||||
:guilabel:`Taxes` field exists, the untaxed and taxes amounts are added before the total amount.
|
||||
|
||||
.. _studio/pdf-reports/elements/column:
|
||||
|
||||
Column
|
||||
------
|
||||
|
||||
Columns are used to add multiple :ref:`blocks <studio/pdf-reports/elements/block>` elements on the
|
||||
same line.
|
||||
|
||||
- :guilabel:`Two Columns`: add any text in two different columns.
|
||||
|
||||
- :guilabel:`Three Columns`: add any text in three different columns.
|
||||
|
||||
Report tab
|
||||
==========
|
||||
|
||||
Several configuration options are available under the :guilabel:`Report` tab.
|
||||
|
||||
- :guilabel:`Name`: change the report name. The new name is applied everywhere (in Studio, under
|
||||
the :guilabel:`Print` button, and for the PDF file name).
|
||||
|
||||
- :guilabel:`Paper format`: change the paper size of the report.
|
||||
|
||||
- :guilabel:`Add in print`: add the report under the :guilabel:`🖶 Print` button available on the
|
||||
- Change the :guilabel:`Report name`. The new name is applied everywhere (in Studio, under
|
||||
the :guilabel:`Print` button, and in the PDF file name).
|
||||
- Modify the :guilabel:`Paper format`. If no value is selected, the format defined in the
|
||||
:ref:`default layout <studio/pdf-reports/default-layout/paper>` is used.
|
||||
- :guilabel:`Show in print menu`: to add the report in the :guilabel:`Print` menu available from the
|
||||
record.
|
||||
|
||||
- :guilabel:`Limit visibility to groups`: limit the availability of the PDF report to specific
|
||||
- :guilabel:`Reload from attachment`: to save the report as an attachment on the record the first
|
||||
time it is generated and reload the original version of the report any subsequent time. This is
|
||||
legally required for invoices and is mainly used in this case.
|
||||
- :guilabel:`Limit visibility to groups`: to limit the availability of the PDF report to specific
|
||||
:doc:`user groups <../../general/users/access_rights>`.
|
||||
- :guilabel:`Edit sources`: to modify the report directly in the :ref:`XML file
|
||||
<studio/pdf-reports/XML-editing>`.
|
||||
- :guilabel:`Reset report`: to discard all changes made to the report and reset it to its standard
|
||||
version.
|
||||
- :guilabel:`Print preview`: to generate and download a report preview.
|
||||
|
||||
Options tab
|
||||
===========
|
||||
Report editor
|
||||
-------------
|
||||
|
||||
Select an element on the report to access the element's options and edit it.
|
||||
The report editor allows you to modify the formatting and contents of the report.
|
||||
|
||||
.. image:: pdf_reports/text-options-tab.png
|
||||
:alt: The Options tab for a text element
|
||||
.. tip::
|
||||
- You can :guilabel:`Undo` or :guilabel:`Redo` changes using the related buttons or the shortcuts
|
||||
`CTRL Z` and `CTRL Y`.
|
||||
|
||||
- Changes are saved automatically when you leave the report or manually using the
|
||||
:guilabel:`Save` button.
|
||||
|
||||
- You can reset the report to its standard version by clicking the :guilabel:`Reset report` button
|
||||
in the left part of the screen.
|
||||
|
||||
.. important::
|
||||
Editing the header and footer of a report impacts all standard and custom reports.
|
||||
|
||||
Conditional blocks
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The dashed rectangles represent **conditional blocks** (*if/else* statements). These are used to
|
||||
show/hide content based on specific conditions. Click on the block to view the conditions.
|
||||
|
||||
.. image:: pdf_reports/conditional-block-if.png
|
||||
:alt: View conditions applied to a block.
|
||||
|
||||
Select a value to preview its corresponding output and edit it if necessary.
|
||||
|
||||
.. image:: pdf_reports/conditional-block-else.png
|
||||
:alt: Preview the output of another condition.
|
||||
|
||||
.. note::
|
||||
You can select and edit multiple elements at the same time by clicking on the different sections
|
||||
or divisions (e.g., `div`, `table`, etc.).
|
||||
Conditions can only be edited in :ref:`XML <studio/pdf-reports/XML-editing>`.
|
||||
|
||||
Below are presented some of the most common options:
|
||||
Other content
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
- :guilabel:`Margins`: add spacing at the :guilabel:`top`, :guilabel:`right`, :guilabel:`bottom`,
|
||||
and :guilabel:`left` of the element.
|
||||
There are two types of text content in reports:
|
||||
|
||||
- :guilabel:`Width`: set the element's maximum width.
|
||||
- Static text, i.e., the text that's not highlighted in blue, which can be modified directly in the
|
||||
editor.
|
||||
- Dynamic text, i.e., the text that's highlighted in blue, which is replaced by field values when
|
||||
the report is generated, e.g., the SO number or the quotation date.
|
||||
|
||||
- :guilabel:`Visible if`: set under which condition(s) the element should be displayed.
|
||||
You can add content (e.g., fields, lists, tables, images, banners, etc.) to the report using
|
||||
commands. Type `/` to open the :ref:`powerbox <knowledge/powerbox>`, then type the command's
|
||||
name or select it from the list.
|
||||
|
||||
- :guilabel:`Visible for`: set for which :doc:`users groups <../../general/users/access_rights>`
|
||||
the element should be displayed.
|
||||
To add static text to the report, type the text where you want it.
|
||||
|
||||
- :guilabel:`Remove from View`: remove the element from the report's view.
|
||||
For more advanced changes, you can :ref:`edit the report in the XML directly
|
||||
<studio/pdf-reports/XML-editing>`.
|
||||
|
||||
- :guilabel:`Text decoration`: bold, italicize, and underline the font.
|
||||
.. _studio/pdf-reports/add-field:
|
||||
|
||||
- :guilabel:`Alignment`: align the element to the left, center, or right of the report.
|
||||
Add a field
|
||||
***********
|
||||
|
||||
- :guilabel:`Font style`: use one of the default font styles.
|
||||
To add a field, type `/` and select the :guilabel:`Field` command. In the list that opens, select
|
||||
or search for the field; click the right arrow next to the field name to access the list of related
|
||||
fields if needed. Then, specify the default value and press `Enter`.
|
||||
|
||||
- :guilabel:`Colors`: change the font's color and the background color.
|
||||
.. image:: pdf_reports/powerbox-field.png
|
||||
:alt: Select a related field.
|
||||
|
||||
.. note::
|
||||
You may need to select a section or division above the element you want to edit to see some of
|
||||
the options described above.
|
||||
Formatting
|
||||
**********
|
||||
|
||||
To format text in the report, select it, then format it using the options in the
|
||||
:ref:`knowledge/text-editor`.
|
||||
|
||||
.. image:: pdf_reports/text-editor.png
|
||||
:alt: Format text using the text editor.
|
||||
|
||||
.. _studio/pdf-reports/XML-editing:
|
||||
|
||||
Editing the report's XML
|
||||
------------------------
|
||||
|
||||
.. warning::
|
||||
Modifying the XML directly may result in report issues during :doc:`upgrades
|
||||
<../../../administration/upgrade>`. If this happens, simply copy your changes from the old
|
||||
database into your upgraded database.
|
||||
|
||||
To edit the report's XML, click :guilabel:`Edit sources` in the left pane.
|
||||
|
||||
Examples
|
||||
~~~~~~~~
|
||||
|
||||
.. spoiler:: Modify a non-compliant table
|
||||
|
||||
Sometimes, tables are not properly recognized as such due to complex structures. In those cases,
|
||||
you can still modify them manually in the report XML. For example, with a sales order, you can
|
||||
find the following structure in the XML (simplified for documentation purposes):
|
||||
|
||||
.. code-block:: xml
|
||||
|
||||
<!-- table root element -->
|
||||
<table>
|
||||
<!-- thead = table header, the row with column titles -->
|
||||
<thead>
|
||||
<!-- table row element -->
|
||||
<tr>
|
||||
<!-- table header element -->
|
||||
<th>Name</th>
|
||||
<th>Price</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<!-- table body, the main content -->
|
||||
<tbody>
|
||||
<!-- we create a row for each subrecord with t-foreach -->
|
||||
<tr t-foreach="record.some_relation_ids" t-as="line">
|
||||
<!-- for each line, we output the name and price as table cells -->
|
||||
<td t-out="line.name"/>
|
||||
<td t-out="line.price"/>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
To modify a table, you must ensure that each row has the same number of data cells. For example,
|
||||
in the case above, you need to add a cell in the header section (with e.g., the column title)
|
||||
and another one in the body section with the field content (usually, with a `t-out` or
|
||||
`t-field` directive).
|
||||
|
||||
.. code-block:: xml
|
||||
:emphasize-lines: 6,13
|
||||
|
||||
<table> <!-- table root element -->
|
||||
<thead> <!-- thead = table header, the row with column titles -->
|
||||
<tr> <!-- table row element -->
|
||||
<th>Name</th> <!-- table header element -->
|
||||
<th>Price</th>
|
||||
<th>Category</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody> <!-- table body, the main content -->
|
||||
<tr t-foreach="record.some_relation_ids" t-as="line"> <!-- we create a row for each subrecord with t-foreach -->
|
||||
<td t-out="line.name"/> <!-- for each line, we output the name and price as table cells -->
|
||||
<td t-out="line.price"/>
|
||||
<td t-out="line.category_id.display_name"/>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
.. note::
|
||||
Cells can span multiple rows or columns. For more information, go to the
|
||||
`Mozilla Developer Network website <https://developer.mozilla.org/en-US/docs/Learn/HTML/Tables/Basics>`_.
|
||||
|
||||
For example, you can modify the **Quotation/Order** report to add a column to display the
|
||||
product category in the main table:
|
||||
|
||||
.. code-block:: xml
|
||||
:emphasize-lines: 6,13
|
||||
|
||||
<table class="table table-sm o_main_table table-borderless mt-4">
|
||||
<!-- In case we want to repeat the header, remove "display: table-row-group" -->
|
||||
<thead style="display: table-row-group">
|
||||
<tr>
|
||||
<th name="th_description" class="text-start">Description</th>
|
||||
<th>Product Category</th>
|
||||
<th name="th_quantity" class="text-end">Quantity</th>
|
||||
<th name="th_priceunit" class="text-end">Unit Price</th>
|
||||
[...]
|
||||
<tr t-att-class="'bg-200 fw-bold o_line_section' if line.display_type == 'line_section' else 'fst-italic o_line_note' if line.display_type == 'line_note' else ''">
|
||||
<t t-if="not line.display_type">
|
||||
<td name="td_name"><span t-field="line.name">Bacon Burger</span></td>
|
||||
<td t-out="line.product_id.categ_id.display_name"/>
|
||||
<td name="td_quantity" class="text-end">
|
||||
<span t-field="line.product_uom_qty">3</span>
|
||||
<span t-field="line.product_uom">units</span>
|
||||
<span t-if="line.product_packaging_id">
|
||||
|
||||
.. image:: pdf_reports/XML-SO-product-category.png
|
||||
:alt: Add a Product Category column in a SO.
|
||||
|
||||
.. spoiler:: Add a data table
|
||||
|
||||
To add a table in XML, you need to know the names of the fields and objects you wish to access
|
||||
and display. As an example, let's add a table that details the tags on a sales order:
|
||||
|
||||
.. code-block:: xml
|
||||
|
||||
<!-- table root element -->
|
||||
<table class="table">
|
||||
<!-- thead = table header, the row with column titles -->
|
||||
<thead>
|
||||
<!-- table row element -->
|
||||
<tr>
|
||||
<!-- table header element -->
|
||||
<th>ID</th>
|
||||
<th>Name</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<!-- table body, the main content -->
|
||||
<tbody>
|
||||
<!-- we create a row for each subrecord with t-foreach -->
|
||||
<tr t-foreach="doc.tag_ids" t-as="tag">
|
||||
<!-- for each line, we output the name and price as table cells -->
|
||||
<td t-out="tag.id"/>
|
||||
<td t-out="tag.name"/>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
.. image:: pdf_reports/XML-data-table.png
|
||||
:alt: Add a data table in XML
|
||||
|
||||
.. note::
|
||||
When adding tables manually, style them using `Bootstrap classes
|
||||
<https://getbootstrap.com/docs/5.1/content/tables>`_, like the `table` class included in the
|
||||
example above.
|
||||
|
||||
.. spoiler:: Conditional blocks
|
||||
|
||||
If you want to show/hide content based on specific conditions, you can manually add `if/else`
|
||||
control statements in the report XML.
|
||||
|
||||
For example, if you want to hide a custom data table if there are no tags, you can use the `t-if`
|
||||
attribute to define the condition, which is then evaluated as `True` or `False`. The table will
|
||||
not be displayed if there are no tags in the quotation.
|
||||
|
||||
.. code-block:: xml
|
||||
:emphasize-lines: 2
|
||||
|
||||
<!-- table root element -->
|
||||
<table class="table" t-if="len(doc.tag_ids) > 0">
|
||||
<!-- thead = table header, the row with column titles -->
|
||||
<thead>
|
||||
<!-- table row element -->
|
||||
<tr>
|
||||
<!-- table header element -->
|
||||
<th>ID</th>
|
||||
<th>Name</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<!-- table body, the main content -->
|
||||
<tbody>
|
||||
<!-- we create a row for each subrecord with t-foreach -->
|
||||
<tr t-foreach="doc.tag_ids" t-as="tag">
|
||||
<!-- for each line, we output the name and price as table cells -->
|
||||
<td t-out="tag.id"/>
|
||||
<td t-out="tag.name"/>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
If you want to display another block in case the `t-if` statement is evaluated as `False`, you
|
||||
can specify it using the `t-else` statement. The `t-else` block must directly follow the `t-if`
|
||||
block in the document structure. There is no need to specify any condition in the `t-else`
|
||||
attribute. As an example, let's show a quick message explaining that there are no tags on the
|
||||
quotation:
|
||||
|
||||
.. code-block:: xml
|
||||
:emphasize-lines: 22
|
||||
|
||||
<!-- table root element -->
|
||||
<table class="table" t-if="len(doc.tag_ids) > 0">
|
||||
<!-- thead = table header, the row with column titles -->
|
||||
<thead>
|
||||
<!-- table row element -->
|
||||
<tr>
|
||||
<!-- table header element -->
|
||||
<th>ID</th>
|
||||
<th>Name</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<!-- table body, the main content -->
|
||||
<tbody>
|
||||
<!-- we create a row for each subrecord with t-foreach -->
|
||||
<tr t-foreach="doc.tag_ids" t-as="tag">
|
||||
<!-- for each line, we output the name and price as table cells -->
|
||||
<td t-out="tag.id"/>
|
||||
<td t-out="tag.name"/>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="text-muted" t-else="">No tag present on this document.</div>
|
||||
|
||||
By using the `t-if/t-else` notation, the report editor recognizes that these sections are
|
||||
mutually exclusive and should be displayed as conditional blocks:
|
||||
|
||||
.. image:: pdf_reports/XML-condition-if.png
|
||||
:alt: Output preview if there are tags.
|
||||
|
||||
You can switch conditions using the editor to preview their output:
|
||||
|
||||
.. image:: pdf_reports/XML-condition-else.png
|
||||
:alt: Output preview if there are no tags.
|
||||
|
||||
If you wish to have multiple options, you can also use `t-elif` directives to add intermediary
|
||||
conditions. For example, this is how the title of sales order reports changes based on the
|
||||
condition of the underlying document.
|
||||
|
||||
.. code-block:: xml
|
||||
|
||||
<h2 class="mt-4">
|
||||
<span t-if="env.context.get('proforma', False) or is_pro_forma">Pro-Forma Invoice # </span>
|
||||
<span t-elif="doc.state in ['draft','sent']">Quotation # </span>
|
||||
<span t-else="">Order # </span>
|
||||
<span t-field="doc.name">SO0000</span>
|
||||
</h2>
|
||||
|
||||
The title *Pro-Forma Invoice* is used depending on some contextual conditions. If these
|
||||
conditions are not met and the state of the document is either `draft` or `sent`, then
|
||||
*Quotation* is used. If none of those conditions are met, the report's title is *Order*.
|
||||
|
||||
.. spoiler:: Images
|
||||
|
||||
Working with images in a report can be challenging, as precise control over image size and
|
||||
behavior is not always obvious. You can insert image fields using the report editor
|
||||
(:ref:`by using the /Field command <studio/pdf-reports/add-field>`), but inserting them in XML
|
||||
using the `t-field` directive and accompanying `t-options` attributes provides better sizing and
|
||||
positioning control.
|
||||
|
||||
For example, the following code outputs the field `image_128` of the line's product as a
|
||||
64px-wide image (with an automatic height based on the image's aspect ratio).
|
||||
|
||||
.. code-block:: xml
|
||||
|
||||
<span t-field="line.product_id.image_128" t-options-widget="image" t-options-width="64px"/>
|
||||
|
||||
The following options are available for image widgets:
|
||||
|
||||
- `width`: width of the image, usually in pixels or CSS length units (e.g., `rem`) (leave empty
|
||||
for auto-width).
|
||||
- `height`: height of the image, usually in pixels or CSS length units (e.g., `rem`) (leave empty
|
||||
for auto-height).
|
||||
- `class`: CSS classes applied on the `img` tag; `Bootstrap classes
|
||||
<https://getbootstrap.com/docs/5.1/content/tables>`_ are available.
|
||||
- `alt`: alternative text of the image
|
||||
- `style`: style attribute; it allows you to override styles more freely than with
|
||||
`Bootstrap classes <https://getbootstrap.com/docs/5.1/content/tables>`_.
|
||||
|
||||
These attributes must contain strings, i.e., text enclosed within quotes within quotes, e.g.,
|
||||
`t-options-width="'64px'"` (or, alternatively, a valid Python expression).
|
||||
|
||||
.. note::
|
||||
The image widget cannot be used on an `img` tag. Instead, set the `t-field` directive on a
|
||||
`span` (for inline content) or `div` (for block content) node.
|
||||
|
||||
For example, let's add a column with the product image in the quotation table:
|
||||
|
||||
.. code-block:: xml
|
||||
:emphasize-lines: 4,14-20
|
||||
|
||||
<table class="table table-sm o_main_table table-borderless mt-4">
|
||||
<thead style="display: table-row-group">
|
||||
<tr>
|
||||
<th>Image</th>
|
||||
<th name="th_description" class="text-start">Description</th>
|
||||
<th>Product Category</th>
|
||||
<th name="th_quantity" class="text-end">Quantity</th>
|
||||
<th name="th_priceunit" class="text-end">Unit Price</th>
|
||||
[...]
|
||||
<t t-foreach="lines_to_report" t-as="line">
|
||||
<t t-set="current_subtotal" t-value="current_subtotal + line.price_subtotal"/>
|
||||
<tr t-att-class="'bg-200 fw-bold o_line_section' if line.display_type == 'line_section' else 'fst-italic o_line_note' if line.display_type == 'line_note' else ''">
|
||||
<t t-if="not line.display_type">
|
||||
<td>
|
||||
<span t-field="line.product_template_id.image_128"
|
||||
t-options-widget="'image'"
|
||||
t-options-width="'64px'"
|
||||
t-options-class="'rounded-3 shadow img-thumbnail'"
|
||||
/>
|
||||
</td>
|
||||
<td name="td_name"><span t-field="line.name">Bacon Burger</span></td>
|
||||
<td t-out="line.product_id.categ_id.display_name"/>
|
||||
|
||||
The `t-options-width` attribute restricts the image width to 64 pixels, and the Bootstrap classes
|
||||
used in `t-options-class` create a thumbnail-like border with rounded corners and a shadow.
|
||||
|
||||
.. image:: pdf_reports/XML-images.png
|
||||
:alt: Add a column with the product image in the quotation table.
|
||||
|
||||
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 7.2 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 5.8 KiB |
|
After Width: | Height: | Size: 3.8 KiB |
|
After Width: | Height: | Size: 7.3 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 94 KiB |
|
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 6.1 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 64 KiB |
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 60 KiB |
|
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 55 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 6.1 KiB |
|
Before Width: | Height: | Size: 14 KiB |
@@ -7,6 +7,14 @@ calls, and share content. Businesses can use `WhatsApp Business
|
||||
<https://developers.facebook.com/products/whatsapp/>`_ to communicate with their customers by text,
|
||||
send documents and provide support.
|
||||
|
||||
.. warning::
|
||||
WhatsApp is an Odoo Enterprise-only application that does not work in Odoo Community edition. To
|
||||
sign up for Odoo Enterprise edition, click here: `Odoo Free Trial <https://www.odoo.com/trial>`_.
|
||||
|
||||
.. seealso::
|
||||
For more information on migrating from Odoo Community version to Odoo Enterprise version see this
|
||||
documentation: :doc:`../../../administration/maintain/enterprise`.
|
||||
|
||||
With the **Odoo WhatsApp** app, a company can connect a WhatsApp Business Account (WABA) to an Odoo
|
||||
database, which allows for the following:
|
||||
|
||||
|
||||
@@ -46,6 +46,10 @@ Once an order is completed, proceed to checkout by clicking :guilabel:`Payment`.
|
||||
- You can use both `,` and `.` on your keyboard as decimal separators.
|
||||
- **Cash** is selected by default if you enter the amount without choosing a payment method.
|
||||
|
||||
.. note::
|
||||
The system can only load a limited number of products for effective opening. Click
|
||||
:guilabel:`Search more` if the desired product is not loaded automatically.
|
||||
|
||||
.. _pos/customers:
|
||||
|
||||
Set customers
|
||||
@@ -173,6 +177,7 @@ the **POS dashboard**.
|
||||
|
||||
point_of_sale/employee_login
|
||||
point_of_sale/receipts_invoices
|
||||
point_of_sale/combos
|
||||
point_of_sale/configuration
|
||||
point_of_sale/shop
|
||||
point_of_sale/restaurant
|
||||
|
||||
60
content/applications/sales/point_of_sale/combos.rst
Normal file
@@ -0,0 +1,60 @@
|
||||
==============
|
||||
Product combos
|
||||
==============
|
||||
|
||||
The **Product Combos** feature allows users to define and manage combination options for a single
|
||||
product.
|
||||
|
||||
In the context of a restaurant, the feature enables users to create multiple-choice menus. For
|
||||
example, a user can define a main dish and specify various options for sides, drinks, or desserts
|
||||
that customers can combine with the main dish.
|
||||
|
||||
In retail, this feature allows you to create a product set with multiple products to choose from and
|
||||
combine.
|
||||
|
||||
Configuration
|
||||
=============
|
||||
|
||||
First, you need to create combination choices. To do so:
|
||||
|
||||
#. Go to :menuselection:`Point of Sale --> Products --> Product Combos` and click :guilabel:`New`.
|
||||
#. Name your combo and add the products you want customers to choose from by clicking :guilabel:`Add
|
||||
a line`. You can also include an extra price for each option in the :guilabel:`Extra Price`
|
||||
column.
|
||||
|
||||
.. note::
|
||||
As a reference, the selected product's original price is displayed in the :guilabel:`Original
|
||||
Price` column.
|
||||
|
||||
.. image:: combos/combo-form.png
|
||||
:scale: 75%
|
||||
|
||||
Second, you need to create a specific product to gather combo choices. To do this:
|
||||
|
||||
#. Go to :menuselection:`Point of Sale --> Products --> Products` and click :guilabel:`New`.
|
||||
#. Set the :guilabel:`Product Type` to :guilabel:`Combo` and fill in the :guilabel:`General
|
||||
Information` tab.
|
||||
|
||||
.. note::
|
||||
The sales price of the combo product is fixed and does not vary based on the individual prices
|
||||
of included items or the quantity of items in the combo. The combo product price is only
|
||||
affected by the extra price optionally defined at the combo choice creation or if a variant of
|
||||
one of the items has a specified extra price.
|
||||
#. Go to the :guilabel:`Combo Choices` tab, click :guilabel:`Add a line`, and select the
|
||||
combinations to add. You can also create a new combination at this step by clicking
|
||||
:guilabel:`New` on the popup window.
|
||||
|
||||
.. image:: combos/combo-product-form.png
|
||||
:scale: 75%
|
||||
|
||||
Once you have created and added the combo choices into a product, you can sell combos in your retail
|
||||
store or restaurant.
|
||||
|
||||
Practical application
|
||||
=====================
|
||||
|
||||
:ref:`Open a POS session <pos/session-start>` and select the combo product. Choose the options and
|
||||
click :guilabel:`Add to order`. As a reminder, the extra price appears under the related choices.
|
||||
|
||||
.. image:: combos/combo-select.png
|
||||
:scale: 75%
|
||||
BIN
content/applications/sales/point_of_sale/combos/combo-form.png
Normal file
|
After Width: | Height: | Size: 9.8 KiB |
|
After Width: | Height: | Size: 20 KiB |