Compare commits

...

33 Commits

Author SHA1 Message Date
Denis Vermylen
7d43958d7b [IMP] odoo_sh: FAQ more workers 2024-01-25 18:50:31 +01:00
Donatienne (dopi)
b84e81d3a1 [IMP] elearning: set prerequisite courses
taskid-3433600

closes odoo/documentation#7542

X-original-commit: 2d4a3cc883
Signed-off-by: Audrey Vandromme (auva) <auva@odoo.com>
Signed-off-by: Donatienne Pirlot (dopi) <dopi@odoo.com>
2024-01-25 14:56:28 +00:00
nni-odoo
4f098945d7 [ADD] localizations: indonesia qris
Adding QRIS documentation from the following PR https://github.com/odoo/odoo/pull/146926

closes odoo/documentation#7477

Signed-off-by: Jonathan Castillo (jcs) <jcs@odoo.com>
2024-01-25 13:11:23 +00:00
“Audrey
86fac322d3 [IMP] payment_providers: payment methods + restructure doc page
task-3570280

closes odoo/documentation#7527

X-original-commit: 67894e33f6
Signed-off-by: Audrey Vandromme (auva) <auva@odoo.com>
2024-01-25 05:49:20 +00:00
Julien Alardot (jual)
958fa599e1 [FIX] reference/user_interface: filter element name is mandatory
The filter element attribute 'name' is now required since
odoo/odoo/commit/4ddc3231

closes odoo/documentation#7523

X-original-commit: cbe72a69bb
Signed-off-by: Antoine Vandevenne (anv) <anv@odoo.com>
Signed-off-by: Julien Alardot (jual) <jual@odoo.com>
2024-01-24 10:52:51 +00:00
“Audrey
0604fb56f9 [IMP] Studio: new report editor
task-3553091

closes odoo/documentation#7518

X-original-commit: cf389c1c3e
Signed-off-by: Audrey Vandromme (auva) <auva@odoo.com>
2024-01-24 09:20:37 +00:00
Loredana Perazzo
3fe09dd653 [IMP] pos: note about products loading
task-3095675

closes odoo/documentation#7509

X-original-commit: 5ec37fbb7f
Signed-off-by: Audrey Vandromme (auva) <auva@odoo.com>
Signed-off-by: Loredana Perazzo (lrpz) <lrpz@odoo.com>
2024-01-23 16:03:41 +00:00
tiku-odoo
06eaf3a0c7 [IMP]Productivity WhatsApp Enterprise Edit
closes odoo/documentation#7502

X-original-commit: 474d0b7b94
Signed-off-by: Zachary Straub (zst) <zst@odoo.com>
Signed-off-by: Timothy Kukulka (tiku) <tiku@odoo.com>
2024-01-23 14:35:31 +00:00
Antoine Vandevenne (anv)
14c0438764 [IMP] reference/user_interface: reformat and clarify views reference
In particular, the following changes are made:
- Use the `class` and `attribute` admonitions along with custom
  attributes to define classes, views' root attributes, views'
  components, and attribute values. This allows re-using the responsive
  design that was made for reference lists, and getting rid of the
  previous implementation that relied on class attributes, which were not
  intended for this usage and reduce readability while hindering further
  contributions due to a lack of flexibility (no admonitions,
  sub-attributes...)
- Use definition lists to define view types to allow for clearer and
  longer descriptions.
- Rewrite and restructure the explanations when there is a lack clarity.
- Extract duplicated content to included RST files.
- Display SVG images into dedicated admonitions.
- Fix RST and English mistakes.
- Rename `view_architecture` to `view_architectures`, as it lists all
  existing architectures and doesn't describe "the architecture of a
  view".
- Replace underscores with hyphens in image file names to improve SEO.

task-3458320

closes odoo/documentation#5237

closes odoo/documentation#7497

X-original-commit: a17eaf4c6f
Signed-off-by: Antoine Vandevenne (anv) <anv@odoo.com>
2024-01-23 10:51:24 +00:00
tiku-odoo
db3db3c727 [IMP] IoT Printer doc edits
closes odoo/documentation#7496

X-original-commit: bfe57fdbdd
Signed-off-by: Zachary Straub (zst) <zst@odoo.com>
2024-01-23 10:51:20 +00:00
Donatienne (dopi)
1be6f341dd [IMP] Website: menus
Update screenshots to reflect V17

closes odoo/documentation#7400

X-original-commit: 7e45e144a6
Signed-off-by: Donatienne Pirlot (dopi) <dopi@odoo.com>
2024-01-23 10:51:14 +00:00
Loredana Perazzo
39541bb745 [ADD] POS: page to setup and use product combos
Task-3604850

closes odoo/documentation#7485

X-original-commit: 539435d14d
Signed-off-by: Loredana Perazzo (lrpz) <lrpz@odoo.com>
2024-01-23 09:08:09 +00:00
tiku-odoo
157c1e18ea [RMV]Sales: remove snyc menu line ebay connector
closes odoo/documentation#7471

X-original-commit: 9db684fe86
Signed-off-by: Zachary Straub (zst) <zst@odoo.com>
Signed-off-by: Timothy Kukulka (tiku) <tiku@odoo.com>
2024-01-22 19:21:43 +00:00
nni-odoo
ab5c9feb40 [ADD] payment_providers: Xendit
Documentation for Xendit payment provider

taskid-2946329

closes odoo/documentation#7475

X-original-commit: 05637af163
Signed-off-by: Nigel Nicholas (nni) <nni@odoo.com>
2024-01-22 02:56:57 +00:00
Martin Trigaux (mat)
6c3385cf90 [I18N] *: export 16.0 translations
closes odoo/documentation#7473

X-original-commit: aecf49d6c8
Signed-off-by: Martin Trigaux (mat) <mat@odoo.com>
2024-01-21 08:58:23 +00:00
KC (ksc)
b53427ddde [IMP] subscriptions: update renewals doc
closes odoo/documentation#7433

X-original-commit: 6a7bc2d449
Signed-off-by: Kevin Scannell (ksc) <ksc@odoo.com>
2024-01-20 01:18:24 +00:00
tiku-odoo
e6dbd3d9e4 [IMP] Microsoft Azure Email Phrasing update
closes odoo/documentation#7462

X-original-commit: d902bbbc19
Signed-off-by: Zachary Straub (zst) <zst@odoo.com>
Signed-off-by: Timothy Kukulka (tiku) <tiku@odoo.com>
2024-01-19 21:38:05 +00:00
tiku-odoo
646bfe2e2c [RMV]VOIP:Scrub Asterisk Docs
closes odoo/documentation#7445

X-original-commit: 055e332ef3
Signed-off-by: Zachary Straub (zst) <zst@odoo.com>
Signed-off-by: Timothy Kukulka (tiku) <tiku@odoo.com>
2024-01-19 15:05:16 +00:00
Felicious
e620f27378 [ADD] inventory: least packages removal strategy
closes odoo/documentation#7417

X-original-commit: bc6c92d786
Signed-off-by: Zachary Straub (zst) <zst@odoo.com>
Signed-off-by: Felicia Kuan (feku) <feku@odoo.com>
Co-authored-by: ksc-odoo <73958186+ksc-odoo@users.noreply.github.com>
Co-authored-by: hojo-odoo <123424465+hojo-odoo@users.noreply.github.com>
2024-01-18 03:28:49 +00:00
Brandon Seltenrich (BRSE)
f10c8d4ad2 [IMP] barcode: update adjustments doc
closes odoo/documentation#7424

X-original-commit: a7af9a59ff
Signed-off-by: Zachary Straub (zst) <zst@odoo.com>
2024-01-17 07:54:25 +00:00
Christophe Monniez
b4cab2a3db [FIX] requirements: fix sphinxcontrib versions
It seems that the latest version if sphinx contrib libs needs sphinx 5.0.

closes odoo/documentation#7413

X-original-commit: 38bd71fa13
Signed-off-by: Christophe Monniez (moc) <moc@odoo.com>
2024-01-16 19:28:39 +00:00
Ricardo Gomes Rodrigues
999c8db465 [IMP] l10n: Codabox for Belgium
Add Codabox Belgium documentation following the introduction of the
module introduced in https://github.com/odoo/enterprise/pull/47607

task-id 3592955

closes odoo/documentation#7405

X-original-commit: 4895a3b55c
Signed-off-by: Ricardo Gomes Rodrigues (rigr) <rigr@odoo.com>
2024-01-16 17:58:53 +00:00
Felicious
6ec9eb1fcc [ADD] inventory: lifo removal strategy
closes odoo/documentation#7373

X-original-commit: fd598899c2
Signed-off-by: Zachary Straub (zst) <zst@odoo.com>
Signed-off-by: Felicia Kuan (feku) <feku@odoo.com>
Co-authored-by: ksc-odoo <73958186+ksc-odoo@users.noreply.github.com>
Co-authored-by: hojo-odoo <123424465+hojo-odoo@users.noreply.github.com>
2024-01-16 16:40:25 +00:00
Donatienne (dopi)
baab56946f [IMP] sign: tags, signing orders, reminders, expiration dates
task-3609727

New features are available in v17:
Modify tags on signed documents.
Send automatic email reminders to people who have yet to sign a document after a set delay.
Signing order available as soon as you have more than one signer
Setting expiration dates on signature requests.

closes odoo/documentation#7275

X-original-commit: 054801995e
Signed-off-by: Xavier Platteau (xpl) <xpl@odoo.com>
Signed-off-by: Donatienne Pirlot (dopi) <dopi@odoo.com>
2024-01-16 16:40:23 +00:00
aliya
73499c595e [IMP] accounting: peppol
In 17.0 we have introduced some additional features in Peppol:
- switching between the demo mode/test mode/live
- better UI that allows fetch peppol message status, new documents, etc from the accounting dashboard
- peppol ready filter to filter customer invoices that are ready to be sent via peppol

part of:
task-3614809

closes odoo/documentation#7402

X-original-commit: 47300c10bf
Signed-off-by: Audrey Vandromme (auva) <auva@odoo.com>
Signed-off-by: Aliya Tastemirova (alta) <alta@odoo.com>
2024-01-16 10:03:50 +00:00
“Chiara
2c1277d0f7 [IMP] accounting: internal transfers
taskid-3663508

closes odoo/documentation#7401

X-original-commit: 9223318b05
Signed-off-by: Tom Aarab (toaa) <toaa@odoo.com>
2024-01-16 10:03:49 +00:00
Felicious
fc98af5814 [ADD] inventory: closest locations removal strat
closes odoo/documentation#7367

X-original-commit: a926fbf998
Signed-off-by: Zachary Straub (zst) <zst@odoo.com>
Signed-off-by: Felicia Kuan (feku) <feku@odoo.com>
Co-authored-by: ksc-odoo <73958186+ksc-odoo@users.noreply.github.com>
Co-authored-by: hojo-odoo <123424465+hojo-odoo@users.noreply.github.com>
2024-01-16 03:09:35 +00:00
Olivier Dony
d0b7363de5 [IMP] conf: special case alt lang links for legal terms
Legal terms live under specific URL as their translations are not
managed in the same manner.

Layout is like this:
  /terms/enterprise.html (EN)
  /terms/i18n/enterprise_fr.html (FR)

This commit adapts the generation of alternative languages links for each
"legal terms page", so that it targets the correct i18n link, or goes
back to the canonical EN one, depending on the target language.

closes odoo/documentation#7382

closes odoo/documentation#7384

closes odoo/documentation#7387

Signed-off-by: Olivier Dony (odo) <odo@odoo.com>
2024-01-15 22:56:16 +01:00
Olivier Dony
65f1e3ce0a [CHG] legal: make Spanish partnership contract official
Removed the "not legally binding" warning, as Odoo now has official
establishments in countries when Spanish contracts are mandatory and
need to be binding. More careful reviews of the Spanish translations
will be necessary from now on.

Part-of: odoo/documentation#7387
2024-01-15 22:56:16 +01:00
Olivier Dony
a48ebe55bf [IMP] legal: update spanish Enterprise contract to v10a
Including spellchecking and proper emphasis of some important terms, and
the disambiguation of "Extra Covered Modules" and "Bug"

Removed the "not legally binding" warning, as Odoo now has official
establishments in countries when Spanish contracts are mandatory and
need to be binding. More careful reviews of the Spanish translations
will be necessary from now on.

Part-of: odoo/documentation#7387
2024-01-15 22:56:16 +01:00
Jonathan Castillo (jcs)
3d28850a40 [FIX] redirects: redirection loop on install.rst
closes odoo/documentation#7392

X-original-commit: f4bad01680
Signed-off-by: Jonathan Castillo (jcs) <jcs@odoo.com>
2024-01-15 13:04:21 +00:00
Donatienne (dopi)
83a68e4b9b [MOV] geo ip installation: move page to install
Page moved from Websites to Install section

taskid-3512515

X-original-commit: a9004e844f
Part-of: odoo/documentation#7392
2024-01-15 13:04:21 +00:00
Rémy Voet (ryv)
be60243eff [IMP] orm: update changelog for the new flush strategy
closes odoo/documentation#7194

Related: odoo/upgrade#5469
Related: odoo/odoo#144747
Related: odoo/enterprise#53380
Signed-off-by: Rémy Voet (ryv) <ryv@odoo.com>
2024-01-15 13:04:08 +00:00
196 changed files with 17933 additions and 9030 deletions

16
conf.py
View File

@@ -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 ""}' \

View File

@@ -47,3 +47,4 @@ functionalities, including functional support, upgrades, and hosting. `Pricing
install/deploy
install/cdn
install/email_gateway
install/geo_ip

View File

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

View File

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

View File

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

View File

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

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

View File

@@ -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 countrys 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 countrys 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**
-

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

View File

@@ -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*.

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

View File

@@ -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**.

View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 13 KiB

View File

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

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

View File

@@ -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/>`_

View File

@@ -7,6 +7,5 @@ VoIP (Voice over Internet Protocol)
.. toctree::
:titlesonly:
voip/asterisk
voip/onsip
voip/axivox

View File

@@ -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 xs 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.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

View File

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

View File

@@ -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 dont 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.

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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 companys 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 companys 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.

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

View File

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 64 KiB

View File

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 60 KiB

View File

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 54 KiB

View File

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

View File

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

View File

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

View 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%

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Some files were not shown because too many files have changed in this diff Show More