Compare commits

..

16 Commits

Author SHA1 Message Date
Demesmaeker
70e1dac884 [REM] sale_amazon: update not necessary anymore
task-2694222
2022-06-03 13:33:37 +02:00
Jonathan Castillo (jcs)
4837aa7eef [ADD] accounting/l10n: new egyptian localization and einvoicing section
task-id 2858349

closes odoo/documentation#2148

X-original-commit: a2cf3da864
Signed-off-by: Antoine Vandevenne (anv) <anv@odoo.com>
2022-06-02 16:54:39 +02:00
Tom Aarab (toaa)
75368f52e8 [IMP] accounting: add note about bank sync not available for trial db
Added a note to specify that bank synchronization is not available on trial databases

closes odoo/documentation#2138

X-original-commit: e4fc5f07ee
Signed-off-by: Castillo Jonathan (jcs) <jcs@odoo.com>
Signed-off-by: Aarab Tom (toaa) <toaa@odoo.com>
2022-06-02 15:51:00 +02:00
Antoine Vandevenne (anv)
646fc412d0 [FIX] homepage: fix the link to the external API page
The page was moved from odoo.rst to external_api.rst with commit
0fc52188.

task-2870501

closes odoo/documentation#2143

X-original-commit: f6cd947d6b
Signed-off-by: Antoine Vandevenne (anv) <anv@odoo.com>
2022-06-02 13:12:53 +02:00
Jonathan Castillo (jcs)
235bcf85f2 [IMP] maintain: add note in hosting changes (on-premise to online)
task-id 2869953

closes odoo/documentation#2129

X-original-commit: 4cd0500408
Signed-off-by: Castillo Jonathan (jcs) <jcs@odoo.com>
2022-06-01 19:32:47 +02:00
Antoine Vandevenne (anv)
e8e75d4175 [IMP] payment_acquirers: explain the different additional features
task-2862636

closes odoo/documentation#2121

X-original-commit: c820aa4951
Signed-off-by: Antoine Vandevenne (anv) <anv@odoo.com>
2022-06-01 14:16:04 +02:00
Horacio Tellez
869d8d1961 [IMP] general/payment_acquirers: authorize support refund from odoo
Add 'x' to make evident that Authorize.net supports refunds directly
from odoo.

Task - 2712287
Task (on payment) - 2678757

closes odoo/documentation#2091

Signed-off-by: Antoine Vandevenne (anv) <anv@odoo.com>
2022-06-01 12:13:59 +02:00
Julien Castiaux
0f2b82cb37 [IMP] install/deploy: serve static file/attachment
Odoo is compatible with X-Sendfile (apache) and X-Accel (nginx). They
are web server extension that can be used by the web application (Odoo)
to delegate serving local files to the web server (apache/nginx). We use
those extension to stream attachments. The documentation now explains
what is X-Sendfile/X-Accel and how to configure each web server.

Along those changes, the few sentences about serving static files have
been reworded and now include various configuration examples.

closes odoo/documentation#2083

Task: 2801675
Related: odoo/odoo#88134
Related: odoo/enterprise#26191
Signed-off-by: Antoine Vandevenne (anv) <anv@odoo.com>
2022-06-01 02:53:55 +02:00
Antoine Vandevenne (anv)
121be6a81e [ADD] payment_acquirers: add configuration steps for Flutterwave
task-2759117

closes odoo/documentation#1939

Related: odoo/odoo#85514
Signed-off-by: Antoine Vandevenne (anv) <anv@odoo.com>
2022-05-31 16:02:02 +02:00
william
978e4b3bac [FIX] conf: dynamic LaTeX releasename
closes odoo/documentation#2116

X-original-commit: 6d4f4f7d9b
Signed-off-by: Victor Feyens (vfe) <vfe@odoo.com>
2022-05-30 18:43:53 +02:00
Demesmaeker
e9943acebe [IMP] amazon: migrate to SPAPI
Starting July 2022, Amazon WMS API is deprecated and we need to use the Selling Partners API.

This brings changes in the authentication flow that are explained.

task-2466636

closes odoo/documentation#2107

X-original-commit: 2dd3a4ae74
Signed-off-by: Antoine Vandevenne (anv) <anv@odoo.com>
2022-05-30 16:45:56 +02:00
Michelle Vu (mivu)
e7aac2eed3 [IMP] payment: update SIX screenshots
closes odoo/documentation#2101

X-original-commit: 6dc30adf15
Signed-off-by: Antoine Vandevenne (anv) <anv@odoo.com>
2022-05-27 13:46:17 +02:00
Michelle Vu (mivu)
8ffc93b3c1 [IMP] helpdesk: update flow and images for reinvoicing time
closes odoo/documentation#2097

X-original-commit: 00ec789d96
Signed-off-by: Antoine Vandevenne (anv) <anv@odoo.com>
2022-05-27 11:46:02 +02:00
Raphael Collet
3da237343f [IMP] developer: new API for flush() and invalidate()
closes odoo/documentation#1909

Signed-off-by: Raphael Collet <rco@odoo.com>
2022-05-25 21:34:53 +02:00
Michelle Vu (mivu)
a0a4a2da98 [FW][IMP] calendar: update Google Calendar sync screenshots
Task ID: 2685658

closes odoo/documentation#2090

Forward-port-of: odoo/documentation#1982
Signed-off-by: Antoine Vandevenne (anv) <anv@odoo.com>
2022-05-25 12:46:11 +02:00
Valentin Chevalier
f93aeec22f [IMP] payment_acquirers/stripe: support refund
Add a check to indicate that Stripe supports refunds.

closes odoo/documentation#2086

Related: odoo/odoo#92235
Signed-off-by: Antoine Vandevenne (anv) <anv@odoo.com>
2022-05-25 12:46:05 +02:00
60 changed files with 774 additions and 278 deletions

View File

@@ -252,7 +252,7 @@ latex_elements = {
'tableofcontents': '', # no TOC
# Output manually in latex docs
'releasename': '14.0',
'releasename': release,
}
latex_additional_files = ['static/latex/odoo.sty']

View File

@@ -11,8 +11,6 @@ Depending on the platforms, you have to do it by yourself or contact our support
From on-premises to Odoo Online
===============================
.. warning:: Odoo Online is not compatible with **non-standard apps**.
1. Create a :ref:`duplicate <duplicate_premise>` of your database: in this duplicate, uninstall all the **non-standard apps**.
2. Grab a "dump with filestore" of your database by using the Database Manager.
3. **If you have time constraints, contact us earlier to schedule the transfer.**
@@ -20,6 +18,11 @@ From on-premises to Odoo Online
5. We will make sure your database is compatible and upload it to our cloud. In case of technical issues, we will get in touch with you.
6. It's done!
.. important::
- Odoo Online is not compatible with **non-standard apps**.
- The database you are moving to Odoo Online must be in a :doc:`supported version
<supported_versions>`.
From on-premises to Odoo.sh
===========================

View File

@@ -21,6 +21,9 @@ To connect to the banks, Odoo uses multiple web-services:
- **Salt Edge**: Europe (:doc:`more information <saltedge>`)
- **Ponto**: Europe (:doc:`more information <ponto>`)
.. important::
- Bank synchronization is not available for trial databases.
Configuration
=============

View File

@@ -12,6 +12,7 @@ Localizations
localizations/chile
localizations/colombia
localizations/colombia_ES
localizations/egypt
localizations/france
localizations/germany
localizations/indonesia

View File

@@ -0,0 +1,241 @@
=====
Egypt
=====
.. _egypt/installation:
Installation
============
:ref:`Install <general/install>` the following modules to get all the features of the Egyptian
localization:
.. list-table::
:header-rows: 1
* - Name
- Technical name
- Description
* - :guilabel:`Egypt - Accounting`
- ``l10n_eg``
- Default :doc:`fiscal localization package <../overview/fiscal_localization_packages>`
* - :guilabel:`Egyptian E-invoice Integration`
- ``l10n_eg_edi_eta``
- :ref:`Egyptian Tax Authority (ETA) e-invoicing integration <egypt/e-invoicing>`
.. _egypt/e-invoicing:
Egyptian e-invoicing
====================
Odoo is compliant with the **Egyptian Tax Authority (ETA) e-invoicing** requirements.
.. important::
Egyptian e-invoicing is available from Odoo 15.0. If needed, :doc:`upgrade
</administration/upgrade>` your database.
.. seealso::
- `Video: Egypt E-invoicing <https://www.youtube.com/watch?v=NXuBPLR4pVw>`_
- :doc:`/administration/upgrade`
.. _egypt/e-invoicing-eta-portal:
Register Odoo on your ETA portal
--------------------------------
You must register your Odoo ERP system on your ETA portal to get your API credentials. You need
these codes to :ref:`configure your Odoo Accounting app <egypt/e-invoicing-configuration>`.
Access your company profile on the ETA portal by clicking on :guilabel:`View Taxpayer Profile`.
.. image:: egypt/taxpayer-profile.png
:align: center
:alt: Clicking on "View Taxpayer Profile" on an ETA invoicing portal
Next, go to the :guilabel:`Representatives` section and then click on :guilabel:`Register ERP`.
Fill out the :guilabel:`ERP Name` (e.g., ``Odoo``) and leave the other fields empty.
.. image:: egypt/add-erp-system.png
:align: center
:alt: Filling out of the form to register an ERP system on the ETA portal.
Once successfully registered, the website displays your API credentials:
- Client ID
- Client Secret 1
- Client Secret 2
.. note::
- ETA should give you a username and a password to access their online portal.
- Ask ETA to provide you with preproduction portal access as well.
- These codes are confidential and should be stored safely.
.. _egypt/e-invoicing-configuration:
Configuration on Odoo
---------------------
To connect your Odoo database to your ETA portal account, go to :menuselection:`Accounting -->
Configuration --> Settings --> ETA E-Invoicing Settings`, and set the :guilabel:`ETA Client ID` and
:guilabel:`ETA Secret` that you retrieved when you :ref:`registered Odoo on your ETA portal
<egypt/e-invoicing-eta-portal>`. Set an invoicing threshold if needed.
.. image:: egypt/eta-api-integration.png
:align: center
:alt: Configuration of the ETA E-Invoicing credentials in Odoo Accounting
.. important::
- **Test on your preproduction portal** before starting to issue real invoices on the production
ETA portal.
- **Credentials** for preproduction and production environments are different. Make sure to
update them on Odoo when you move from one environment to another.
- If not done yet, fill out your company details with your company's full address, country, and
Tax ID.
.. _egypt/e-invoicing-eta-codes:
ETA codes
~~~~~~~~~
E-invoicing works with a set of codes provided by the ETA. You can use the `ETA documentation
<https://sdk.preprod.invoicing.eta.gov.eg/codes/>`_ to code your business attributes.
Most of these codes are handled automatically by Odoo, provided that your :ref:`branches
<egypt/e-invoicing-branches>`, :ref:`customers <egypt/e-invoicing-customers>`, and :ref:`products
<egypt/e-invoicing-products>` are correctly configured.
- Company Information:
- Company Tax ID
- | Branch ID
| If you have only one branch, use ``0`` as the branch code.
- Activity type Code
- Other Information:
- | Product Codes
| Your company's products should be coded and matched with their **GS1** or **EGS** codes.
- | Tax Codes
| Most of the taxes codes are already configured on Odoo in the :guilabel:`ETA Code (Egypt)`
field. We advise you to make sure these codes match your company's taxes.
.. seealso::
- `Egyptian eInvoicing & eReceipt SDK - Code Tables
<https://sdk.preprod.invoicing.eta.gov.eg/codes/>`_
- :doc:`../../taxation/taxes/taxes`
.. _egypt/e-invoicing-branches:
Branches
~~~~~~~~
Create a contact and a journal for each branch of your company and configure its ETA settings.
To do so, go to :menuselection:`Accounting --> Configuration --> Journals`, then click on
:guilabel:`Create`.
Name the journal according to your company's branch and set the :guilabel:`Type` as
:guilabel:`Sales`. Next, open the :menuselection:`Advanced Settings` tab and fill out the
:guilabel:`Egyptian ETA settings` section:
- In the :guilabel:`Branch` field, select the branch's contact or create it.
- Set the :guilabel:`ETA Activity Code`.
- Set the :guilabel:`ETA Branch ID` (use ``0`` if you have one branch only).
.. image:: egypt/branch-journal.png
:align: center
:alt: Sales journal configuration of an Egyptian company's branch
.. important::
The contact selected in the :guilabel:`Branch` field must be set as a :guilabel:`Company`
(**not** as an :guilabel:`Individual`), and the :guilabel:`Address` and :guilabel:`Tax ID` fields
must be filled out.
.. _egypt/e-invoicing-customers:
Customers
~~~~~~~~~
Make sure your customers' contact forms are correctly filled out so your e-invoices are valid:
- contact type: :guilabel:`Individual`: or :guilabel:`Company`:
- :guilabel:`Country`:
- :guilabel:`Tax ID`: Tax ID or Company registry for companies. National ID for individuals.
.. note::
You can edit your customers' contact forms by going to :menuselection:`Accounting --> Customers
--> Customers`.
.. _egypt/e-invoicing-products:
Products
~~~~~~~~
Make sure your products are correctly configured so your e-invoices are valid:
- :guilabel:`Product Type`: storable products, consumables, or services.
- :guilabel:`Unit of Measure`: if you also use Odoo Inventory and have enabled :doc:`Units of
Measure </applications/inventory_and_mrp/inventory/management/products/uom>`.
- :guilabel:`Barcode`: **GS1** or **EGS** barcode
- :guilabel:`ETA Item code` (under the :menuselection:`Accounting` tab): if the barcode doesn't
match your ETA item code.
.. note::
You can edit your products by going to :menuselection:`Accounting --> Customers --> Products`.
.. _egypt/e-invoicing-usb-authentication:
USB authentication
------------------
Each person who needs to electronically sign invoices needs a specific USB key to authenticate and
send invoices to the ETA portal through an ERP.
.. note::
You can contact the :abbr:`ETA (Egyptian Tax Authority)` or `Egypt Trust
<https://www.egypttrust.com/>`_ to get these USB keys.
.. _egypt/e-invoicing-local-proxy:
Install Odoo as a local proxy on your computer
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
An Odoo local server works as a bridge between your computer and your Odoo database hosted online.
Download the Odoo Community installer from the page https://www.odoo.com/page/download and start the
installation on your computer.
Select :guilabel:`Local Proxy Mode` as the type of install.
.. image:: egypt/install-odoo-local-proxy.png
:align: center
:alt: Selection of "Local Proxy Mode" during the installation of Odoo Community.
.. note::
This installation of Odoo only works as a server and does not install any Odoo apps on your
computer.
Once the installation is complete, the installer displays your **access token** for the Odoo Local
Proxy. Copy the token and save it in a safe place for later use.
.. seealso::
- `Odoo: Download Odoo <https://www.odoo.com/page/download>`_
- :doc:`/administration/install/install`
.. _egypt/e-invoicing-usb-configuration:
Configure the USB key
~~~~~~~~~~~~~~~~~~~~~
Once the local proxy server is installed on your computer, you can link it with your Odoo database.
#. Go to :menuselection:`Accounting --> Configurations --> Thumb Drive` and click on
:guilabel:`Create`.
#. Input a :guilabel:`Company` name, the :guilabel:`ETA USB Pin` given to you by your USB key
provider, and the :guilabel:`Access Token` provided at the end of the :ref:`local proxy
installation <egypt/e-invoicing-local-proxy>`, then click on :guilabel:`Save`.
#. Click on :guilabel:`Get certificate`.
.. image:: egypt/thumb-drive.png
:align: center
:alt: Creating a new thumb drive for the e-invoicing of an egyptian company.

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

View File

@@ -12,6 +12,7 @@ Payment acquirers (credit cards, online payments)
payment_acquirers/alipay
payment_acquirers/authorize
payment_acquirers/buckaroo
payment_acquirers/flutterwave
payment_acquirers/mollie
payment_acquirers/ogone
payment_acquirers/paypal
@@ -52,43 +53,76 @@ the payments that go directly on the bank account and follow the usual reconcili
Online payment acquirers
------------------------
+-------------------------------+----------------------+------------+-----------------+-----------+
| | Payment flow | Save cards | Capture amount | Refund |
| | | | manually | from Odoo |
+===============================+======================+============+=================+===========+
| :doc:`Adyen | Payment from Odoo | |V| | |V| | |V| |
| <payment_acquirers/adyen>` | | | | |
+-------------------------------+----------------------+------------+-----------------+-----------+
| :doc:`Alipay | Redirection to the | | | |
| <payment_acquirers/alipay>` | acquirer website | | | |
+-------------------------------+----------------------+------------+-----------------+-----------+
| :doc:`Authorize.Net | Payment from Odoo | |V| | |V| | |
| <payment_acquirers/authorize>`| | | | |
+-------------------------------+----------------------+------------+-----------------+-----------+
| :doc:`Buckaroo | Redirection to the | | | |
| <payment_acquirers/buckaroo>` | acquirer website | | | |
+-------------------------------+----------------------+------------+-----------------+-----------+
| :doc:`Mollie | Redirection to the | | | |
| <payment_acquirers/mollie>` | acquirer website | | | |
+-------------------------------+----------------------+------------+-----------------+-----------+
| :doc:`Ogone | Redirection to the | |V| | | |
| <payment_acquirers/ogone>` | acquirer website | | | |
+-------------------------------+----------------------+------------+-----------------+-----------+
| :doc:`PayPal | Redirection to the | | | |
| <payment_acquirers/paypal>` | acquirer website | | | |
+-------------------------------+----------------------+------------+-----------------+-----------+
| PayU Latam | Redirection to the | | | |
| | acquirer website | | | |
+-------------------------------+----------------------+------------+-----------------+-----------+
| PayUMoney | Redirection to the | | | |
| | acquirer website | | | |
+-------------------------------+----------------------+------------+-----------------+-----------+
| :doc:`SIPS | Redirection to the | | | |
| <payment_acquirers/sips>` | acquirer website | | | |
+-------------------------------+----------------------+------------+-----------------+-----------+
| :doc:`Stripe | Redirection to the | |V| | |V| | |
| <payment_acquirers/stripe>` | acquirer website | | | |
+-------------------------------+----------------------+------------+-----------------+-----------+
.. list-table::
:header-rows: 1
:stub-columns: 1
:widths: auto
* -
- Payment flow
- :ref:`Save cards for later <payment_acquirers/features/tokenization>`
- :ref:`Manual capture <payment_acquirers/features/manual_capture>`
- :ref:`Refunds <payment_acquirers/features/refund>`
* - :doc:`Adyen <payment_acquirers/adyen>`
- Payment from Odoo
- |V|
- Full only
- Full and partial
* - :doc:`Alipay <payment_acquirers/alipay>`
- Payment from the acquirer website
-
-
-
* - :doc:`Authorize.Net <payment_acquirers/authorize>`
- Payment from Odoo
- |V|
- Full only
- Full only
* - :doc:`Buckaroo <payment_acquirers/buckaroo>`
- Payment from the acquirer website
-
-
-
* - :doc:`Flutterwave <payment_acquirers/flutterwave>`
- Payment from the acquirer website
- |V|
-
-
* - :doc:`Mollie <payment_acquirers/mollie>`
- Payment from the acquirer website
-
-
-
* - :doc:`Ogone <payment_acquirers/ogone>`
- Payment from the acquirer website
- |V|
-
-
* - :doc:`PayPal <payment_acquirers/paypal>`
- Payment from the acquirer website
-
-
-
* - PayU Latam
- Payment from the acquirer website
-
-
-
* - PayUMoney
- Payment from the acquirer website
-
-
-
* - :doc:`SIPS <payment_acquirers/sips>`
- Payment from the acquirer website
-
-
-
* - :doc:`Stripe <payment_acquirers/stripe>`
- Payment from the acquirer website
- |V|
- Full only
- Full and partial
.. |V| replace::
@@ -112,6 +146,87 @@ Bank payments
directly. :doc:`Click here <../finance/accounting/receivables/customer_payments/batch_sdd>` for
more information about this payment method.
.. _payment_acquirers/features:
Additional features
===================
Some payment acquirers support additional features for the payment flow. Refer to the :ref:`table
above <payment_acquirers/online_acquirers>` to check if your payment acquirer supports these
features.
.. _payment_acquirers/features/tokenization:
Save cards for later
--------------------
If your payment acquirer supports this feature, customers can choose to save their card details as a
**payment token** in Odoo. When they do, they will not have to enter their card details again when
making a subsequent payment. This is particularly useful for the eCommerce conversion rate and for
subscriptions that use recurring payments.
Enable this feature by navigating to the :guilabel:`Configuration` tab from your payment acquirer
and by ticking the :guilabel:`Allow Saving Payment Methods` checkbox.
.. 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 acquirer's server.
.. _payment_acquirers/features/manual_capture:
Manual capture
--------------
If your payment acquirer 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:
- 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 acquirers will not charge
you for voiding an authorization.
- Hold a security deposit to return later, minus any deductions (e.g., after a damage).
Enable this feature by navigating to the :guilabel:`Configuration` tab from your payment acquirer
and by ticking the :guilabel:`Capture Amount Manually` checkbox.
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.
.. note::
- Some payment acquirers support capturing only part of the authorized amount. The remaining
amount can then be either captured or voided. These acquirers have the value **Full and
partial** in the :ref:`table above <payment_acquirers/online_acquirers>`. The acquirers that
only support capturing or voiding the full 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 acquirer's documentation
for the exact reservation duration.
- Odoo does not support this feature for all payment acquirers but some allow the manual capture
from their website interface.
.. _payment_acquirers/features/refund:
Refunds
-------
If your payment acquirer 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.
.. note::
- Some payment acquirers support refunding only part of the amount. The remaining amount can then
optionally be refunded too. These acquirers have the value **Full and partial** in the
:ref:`table above <payment_acquirers/online_acquirers>`. The acquirers that only support
refunding the full amount have the value **Full only**.
- Odoo does not support this feature for all payment acquirers but some allow to refund payments
from their website interface.
.. _payment_acquirers/configuration:
Configuration
@@ -162,48 +277,6 @@ You can change the payment acquirer's front-end appearance by modifying its name
**Displayed as** field and which credit card icons to display under the **Supported Payment Icons**
field.
.. _payment_acquirers/save_cards:
Save and reuse credit cards
***************************
With the **Save Cards** feature, Odoo can store **Payment Tokens** in your database, which can be
used for subsequent payments, without having to reenter the payment details. This is particularly
useful for the eCommerce conversion rate and subscriptions' recurring payments.
.. _payment_acquirers/capture_amount:
Place a hold on a card
**********************
If you wish to manually capture an amount instead of having an immediate capture, you can enable the
manual capture. Capturing payments manually has many advantages:
- 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 credit card fees in the event of overselling or cancelled orders.
The **Capture Amount Manually** field is under the **Configuration** tab. If enabled, the funds are
reserved for a few days on the customer's card, but not charged yet. Please refer to your acquirer's
documentation for the exact reservation duration.
.. image:: payment_acquirers/capture_manually.png
:align: center
:alt: Configuration tab on Odoo
To capture the payment, you must then go to the related sales order or invoice and manually
*capture* the funds before its automatic cancellation, or *void the transaction* to unlock the funds
from the customer's card.
.. image:: payment_acquirers/capture.png
:align: center
:alt: Hold the credit card payment until you capture or revoke it on Odoo
.. note::
Odoo may not yet support the manual capture for all acquirers, but some acquirers allow managing
the capture from their interfaces.
.. _payment_acquirers/countries:
Countries

View File

@@ -105,7 +105,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 acquirers documentation <payment_acquirers/capture_amount>`.
:ref:`payment acquirers documentation <payment_acquirers/features/manual_capture>`.
Then, open your Adyen Merchant Account, go to :menuselection:`Account --> Settings`, and set the
**Capture Delay** to **manual**.

View File

@@ -42,8 +42,9 @@ Configuration tab
Place a hold on a card
~~~~~~~~~~~~~~~~~~~~~~
With Authorize.net, you can enable the :ref:`manual capture <payment_acquirers/capture_amount>`. If
enabled, the funds are reserved for 30 days on the customer's card, but not charged yet.
With Authorize.net, you can enable the :ref:`manual capture
<payment_acquirers/features/manual_capture>`. If enabled, the funds are reserved for 30 days on the
customer's card, but not charged yet.
.. warning::
After **30 days**, the transaction is **voided automatically** by Authorize.net.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

View File

@@ -0,0 +1,41 @@
===========
Flutterwave
===========
`Flutterwave <https://flutterwave.com/>`_ is an online payments provider established in Nigeria and
covering several African countries and payment methods.
.. _payment_acquirers/flutterwave/configure_dashboard:
Configuration on Flutterwave Dashboard
======================================
#. Log into `Flutterwave Dashboard <https://dashboard.flutterwave.com/>`_ and go to
:menuselection:`Settings --> API`. Copy the values of the :guilabel:`Public Key` and
:guilabel:`Secret Key` fields and save them for later.
#. | Go to :menuselection:`Settings --> Webhooks` and enter your Odoo database URL followed by
`/payment/flutterwave/webhook` in the :guilabel:`URL` text field.
| For example: `https://yourcompany.odoo.com/payment/flutterwave/webhook`.
#. Fill the :guilabel:`Secret hash` with a password that you generate and save its value for later.
#. Make sure all the remaining checkboxes are ticked.
#. Click on **Save** to finalize the configuration.
.. _payment_acquirers/flutterwave/configure_odoo:
Configuration on Odoo
=====================
#. :ref:`Navigate to the payment acquirer Flutterwave <payment_acquirers/add_new>` and change its
state to :guilabel:`Enabled`.
#. In the :guilabel:`Credentials` tab, fill the :guilabel:`Public Key`, :guilabel:`Secret Key`, and
:guilabel:`Webhook Secret` with the values you saved at the step
:ref:`payment_acquirers/flutterwave/configure_dashboard`.
#. Configure the rest of the options to your liking.
.. important::
If you choose to allow saving payment methods, it is recommended to only enable card payments
from Flutterwave dashboard, as only cards can be saved as payment tokens. To do so, go to your
Flutterwave Dashboard and then to :menuselection:`Settings --> Account Settings`.
.. seealso::
- :doc:`../payment_acquirers`

View File

@@ -126,7 +126,7 @@ feature earmarks an amount on the customer's account for a determined period of
the payment method used.
To set it up, enable the :guilabel:`Capture Amount Manually` option on Odoo, as explained in the
:ref:`payment acquirers documentation <payment_acquirers/capture_amount>`.
:ref:`payment acquirers documentation <payment_acquirers/features/manual_capture>`.
.. warning::
When the manual capture feature is activated, your customers are not able to proceed with any

View File

@@ -2,89 +2,130 @@
Synchronize Google Calendar with Odoo
=====================================
Odoo is perfectly integrated with Google Calendar so that you
can see & manage your meetings from both platforms
(updates go through both directions).
Synchronize Google Calendar with Odoo to see and manage meetings from both platforms (updates go
in both directions). This integration helps organize your schedule so you never miss a meeting.
Setup in Google
===============
- Go to `Google APIs platform <https://console.developers.google.com>`__
to generate Google Calendar API credentials. Log in with your Google account.
- Go to the API & Services page.
Enable Google Calendar API
--------------------------
.. image:: google_calendar_credentials/google_calendar_credentials00.png
:align: center
Begin by creating a new Google API project and enabling the Google Calendar API. Then, go to the
`Google API Console <https://console.developers.google.com>`_ and log into your Google account.
- Search for *Google Calendar API* and select it.
.. note::
If this is your first time visiting this page, Google will prompt you to enter a country and
agree to the Terms of Service. Select a country from the drop-down list and agree to the
:abbr:`ToS (Terms of Service)`.
.. image:: google_calendar_credentials/google_calendar_credentials01.png
:align: center
Next, click :guilabel:`Select a project` and select or create an API project to store credentials.
.. image:: google_calendar_credentials/google_calendar_credentials02.png
:align: center
.. image:: google_calendar_credentials/new-api-project.png
:align: center
:alt: Create a new API project to store credentials.
- Enable the API.
.. tip::
Give the API Project a clear name like "Odoo Sync" so you can easily find it.
.. image:: google_calendar_credentials/google_calendar_credentials03.png
:align: center
Then, open the API Project and click :guilabel:`Enable APIs and Services`.
- Select or create an API project to store the credentials if not yet done
before. Give it an explicit name (e.g. Odoo Sync).
.. image:: google_calendar_credentials/enable-apis-services.png
:align: center
:alt: Enable APIs and Services on the API Project.
- Create credentials.
After that, search for *Google Calendar API* using the search bar and select :guilabel:`Google
Calendar API` from the search results. Click :guilabel:`Enable`.
.. image:: google_calendar_credentials/google_calendar_credentials04.png
:align: center
.. image:: google_calendar_credentials/enable-google-cal-api.png
:align: center
:alt: Enable the Google Calendar API.
- Select *Web browser (Javascript)*
as calling source and *User data* as kind of data.
Create credentials
------------------
.. image:: google_calendar_credentials/google_calendar_credentials05.png
:align: center
Now that you have created your API project and enabled the Google Calendar API, you need to create
credentials. Begin by clicking :guilabel:`Create Credentials`. Google will then guide you through
four steps to create your API credentials.
- Then you can create a Client ID.
Enter the name of the application (e.g. Odoo Calendar) and the allowed pages on
which you will be redirected. The *Authorized JavaScript origin* is your
Odoo's instance URL. The *Authorized redirect URI* is your Odoo's instance
URL followed by '/google_account/authentication'.
- In the first step, :guilabel:`Credential Type`, select the :guilabel:`Google Calendar API` and
:guilabel:`User Data` options. Then, click :guilabel:`Next`.
.. image:: google_calendar_credentials/google_calendar_credentials06.png
:align: center
.. image:: google_calendar_credentials/credential-type.png
:align: center
:alt: Select Google Calendar API and User Data for the Credential Type.
- Go through the Consent Screen step by entering a product name
(e.g. Odoo Calendar). Feel free to check the customizations options
but this is not mandatory. The Consent Screen will only show up when you
enter the Client ID in Odoo for the first time.
- In the second step, :guilabel:`OAuth Consent Screen`, type *Odoo* in the :guilabel:`App name`
field, select your email address for the :guilabel:`User support email` field, and type your email
address for the :guilabel:`Developer contact information` section. Then, click :guilabel:`Save
and Continue`.
- Finally you are provided with your **Client ID**. Go to *Credentials* to
get the **Client Secret** as well. Both of them are required in Odoo.
- Skip the third step, :guilabel:`Scopes`, by clicking :guilabel:`Save and Continue`.
.. image:: google_calendar_credentials/google_calendar_credentials07.png
:align: center
- In the last step, :guilabel:`OAuth Client ID`, select :guilabel:`Website application` for the
:guilabel:`Application Type` field and type *My Odoo Database* for the :guilabel:`Name`.
- Under the :guilabel:`Authorized JavaScript Origins` section, click :guilabel:`+ Add URI` and
type your company's Odoo URL address.
- Under the :guilabel:`Authorized redirect URIs` section, click :guilabel:`+ Add URI` and type
your company's Odoo URL address followed by */google_account/authentication*. Finally, click
:guilabel:`Create` and :guilabel:`Done`.
.. image:: google_calendar_credentials/uri.png
:align: center
:alt: Add the authorized JavaScript origins and the authorized redirect URIs.
After successfully creating a new API project, enabling the Google Calendar API, and generating the
Google Calendar API credentials, you should now have a Client ID and Client Secret.
Client ID & Client Secret
-------------------------
The **Client ID** and the **Client Secret** are both needed to connect Google Calendar to Odoo. Find
the Client ID and the Client Secret by opening the Google Cloud Platform navigation menu and going
to :menuselection:`API & Services --> Credentials --> OAuth 2.0 Client IDs`.
Next, locate the credentials you just created for the Google Calendar API. Then, click on
:guilabel:`Edit OAuth Client` (the pencil icon). The page will redirect to the edit page, where you
can view the Client ID and the Client Secret.
.. image:: google_calendar_credentials/edit-oauth-2.png
:align: center
:alt: Click Edit OAuth Client to view the credential details.
Setup in Odoo
=============
- Install the **Google Calendar** App from the *Apps* menu or by checking
the option in :menuselection:`Settings --> General Settings`.
Once the Client ID and the Client Secret are located, open the Odoo database and go to
:menuselection:`Settings --> General Settings --> Integrations --> Google Calendar`. Check the box
next to :guilabel:`Google Calendar`.
.. image:: google_calendar_credentials/google_calendar_credentials08.png
:align: center
.. image:: google_calendar_credentials/settings-google-cal.png
:align: center
:alt: The Google Calendar checkbox in General Settings.
- Go to :menuselection:`Settings --> General Settings` and enter your
**Client ID** and **Client Secret** in Google Calendar option.
Next, copy and paste the Client ID and the Client Secret from the Google Calender API Credentials
page into their respective fields below the :guilabel:`Google Calendar` checkbox. Then, click
:guilabel:`Save`.
.. image:: google_calendar_credentials/google_calendar_credentials09.png
:align: center
Finally, open the Calendar module in Odoo and click on the :guilabel:`Google` sync button to sync
Google Calendar with Odoo.
- The setup is now ready. Open your Odoo Calendar and sync with Google.
The first time you do it you are redirected to Google to authorize
the connection. Once back in Odoo, click the sync button again.
You can click it whenever you want to synchronize your calendar.
.. image:: google_calendar_credentials/sync-google.png
:align: center
:alt: Click the Google sync button in Odoo Calendar to sync Google Calendar with Odoo.
.. image:: google_calendar_credentials/google_calendar_credentials10.png
:align: center
.. note::
The first time you sync your Google Calendar with Odoo, the page will redirect to your Google
Account. Click :guilabel:`OK` and :guilabel:`Allow` to authorize Odoo to access Google Calendar.
As of now you no longer have excuses to miss a meeting!
.. image:: google_calendar_credentials/trust-odoo.png
:align: center
:alt: Give Odoo permission to access Google Calendar.
Now, Odoo Calendar is successfully synced with Google Calendar!
.. image:: google_calendar_credentials/successful-sync.png
:align: center
:alt: Successfully sync between Odoo and Google Calendar.

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@@ -1,15 +1,14 @@
====================================================
Connect a SIX Payment Terminal to your PoS
====================================================
=========================================
Connect a SIX Payment Terminal to the PoS
=========================================
Connecting a SIX payment terminal allows you to offer a fluid
payment flow to your customers and ease the work of your cashiers.
Connecting a SIX payment terminal allows you to offer a fluid payment flow to your customers and
ease the work of your cashiers.
.. warning::
Even though Worldline has recently acquired SIX Payment Services and both
companies use Yomani payment terminals, the firmware they run is different.
Terminals received from Worldline are therefore not compatible with this
integration.
Even though Worldline has recently acquired SIX Payment Services and both companies use Yomani
payment terminals, the firmware they run is different. Terminals received from Worldline are
therefore not compatible with this integration.
Configuration
=============
@@ -17,38 +16,40 @@ Configuration
Configure the Payment Method
----------------------------
First, make sure that the POS Six module is installed. For this, go to *Apps*,
remove the "Apps" filter and search for "POS Six".
First, make sure that the :guilabel:`POS Six` module is installed. For this, go to
:guilabel:`Apps`, remove the :guilabel:`Apps` filter, and search for *POS Six*.
.. image:: six/six_01.png
:align: center
.. image:: six/pos-six-module.png
:align: center
:alt: The POS Six module.
Back in :menuselection:`Point of Sale --> Configuration --> Payment Methods`, create a new payment
method for SIX, select the appropriate journal, select *SIX* in the **Use a Payment Terminal**
field, then enter your payment terminal IP address.
Back in :menuselection:`Point of Sale --> Configuration --> Payment Methods`, click
:guilabel:`Create` to create a new payment method for SIX, select the payment terminal option
:guilabel:`SIX`, and enter the payment terminal IP address.
.. note::
The journal's type must be *bank* to select a payment terminal.
.. image:: six/new-payment-method.png
:align: center
:alt: Create a new payment method for the SIX payment terminal.
Pay with a Payment Terminal
===========================
In your PoS interface, at the moment of the payment, select a payment
method using a payment terminal. Verify that the amount in the tendered
column is the one that has to be sent to the payment terminal and click
on *Send*. If you want to cancel the payment request, click on cancel.
In the :abbr:`PoS (Point of Sale)` interface, at the moment of the payment, select a payment method
using a payment terminal. Verify that the amount in the tendered column is the one that has to be
sent to the payment terminal and click on :guilabel:`Send`. To cancel the payment request, click on
:guilabel:`Cancel`.
.. image:: six/six_06.png
:align: center
.. image:: six/pos-send-payment.png
:align: center
:alt: The PoS interface.
When the payment is done, the status will change to *Payment
Successful*. You can always reverse the last transaction by clicking on
*Reverse*.
When the payment is done, the status will change to :guilabel:`Payment Successful`. If needed,
reverse the last transaction by clicking on :guilabel:`Reverse`.
.. image:: six/six_07.png
:align: center
.. image:: six/pos-reverse-payment.png
:align: center
:alt: The Reverse button on the PoS interface.
If there is any issue with the payment terminal, you can still force the
payment using the *Force Done*. This will allow you to validate the
order in Odoo even if the connection between the terminal and Odoo
encounters issues.
If there is any issue with the payment terminal, you can still force the payment using the
:guilabel:`Force Done` button. This will allow you to validate the order in Odoo even if there are
connection issues between the payment terminal and Odoo.

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -2,71 +2,27 @@
Configure Amazon Connector in Odoo
==================================
Generate an Authorization Token in Seller Central
=================================================
.. _amazon/generate_auth_token:
The Amazon Connector uses an Authorization Token that allows Odoo to fetch data from your Amazon
Seller Central account. This token can be obtained directly through Seller Central in a few clicks
and needs to be set up in your Odoo database configuration.
Connect to your Seller Central account for the marketplace you initially signed
up (e.g. if you created your account on Amazon Germany, go to `Amazon Seller
Central for Germany <https://sellercentral.amazon.de>`_) with an administrator account.
.. note::
You might need to use the *main* (or first) administrator account and not one
added subsequently.
In the main menu, select :menuselection:`Apps & Services --> Manage Your Apps`;
in the page that displays, click on the ``Authorize new developper`` button:
.. image:: setup/seller_central_apps.png
:align: center
Fill in the form depending on your Marketplace:
.. image:: setup/seller_central_form.png
:align: center
If your seller account is registered in the **North America** region, use these values:
- Developer's Name: ``Odoo S.A.``
- Developer ID: ``586127723692``
For the **Europe** region, use these values:
- Developer's Name: ``Odoo S.A.``
- Developer ID: ``579095187166``
Amazon will then inform you that by submitting the form, you are giving access
to your Seller Central Information to Odoo S.A.
.. note::
Odoo S.A. is unable to access your Amazon account's information without the
Authorization Token which is stored in your Odoo database - we do not store
these tokens on our platform directly and are therefore unable to access
your account's information outside of the Amazon Connector normal flows.
Register your Amazon account in Odoo
====================================
.. _amazon/setup:
To register your seller account in Odoo, navigate to :menuselection:`Sales --> Configuration
--> Settings --> Connectors --> Amazon Sync --> Amazon Accounts` and click on **CREATE**.
--> Settings --> Connectors --> Amazon Sync --> Amazon Accounts` and click on :guilabel:`CREATE`.
The **Seller ID** can be found in Seller Central under the link **Your Merchant Token** on the
**Seller Account Information** page. The **Authorization Token** is the one you generated in the
:ref:`previous step <amazon/generate_auth_token>`.
#. Choose a meaningful name for your account (e.g. `Europe`), and select your :guilabel:`Sign-up
Marketplace`. This is the original sign-up marketplace of your seller account (e.g. if you
created your account on Amazon Germany, your sign-up marketplace will be `amazon.de`)
Upon saving, your credentials are checked. In case of issues, an error will be displayed - the
information cannot be saved until your credentials are recognized by Amazon.
#. Upon saving, a button to :guilabel:`link with Amazon` appears. Click on it to be redirected to
the Amazon login page, or directly to the consent page if you are already logged in. There,
confirm that you want Amazon to give Odoo access to your account and related data.
#. Amazon redirects you to Odoo, with your account registered.
Once the account is registered, the marketplaces available to this account are synchronized and
listed under the **Marketplaces** tab. If you wish, you can remove some items from the list of
synchronized marketplaces to disable their synchronization.
listed under the :guilabel:`Marketplaces` tab. If you wish, you can remove some items from the list
of synchronized marketplaces to disable their synchronization.
Match database products in Amazon
=================================
@@ -119,36 +75,39 @@ the subtotals between Seller Central and Odoo.
Add an unsupported marketplace
==============================
Some Amazon Marketplaces, such as Amazon Brazil, are not officially supported by Odoo but might be
compatible with your seller account. These marketplaces can be added manually should you wish to use
them. See :ref:`here <amazon/supported-marketplaces>` for the exhaustive list of natively supported
marketplaces.
Some Amazon Marketplaces, such as Amazon Brazil, are not created by default as they are not
officially supported by Odoo but might be compatible with your seller account. These marketplaces
can be added manually should you wish to use them. See :ref:`here <amazon/supported-marketplaces>`
for the exhaustive list of natively supported marketplaces.
.. tip::
To find out if a marketplace is eventually compatible, check the `Amazon Documentation
<https://docs.developer.amazonservices.com/en_US/dev_guide/DG_Endpoints.html>`_. The marketplace
<https://developer-docs.amazon.com/amazon-shipping/docs/seller-central-urls>`_. The marketplace
must belong to the same region as that of your seller account.
To add a new marketplace, you must first activate the :ref:`developer mode <developer-mode>`.
To add a new marketplace, activate the :ref:`developer mode <developer-mode>`.
Once that is done, go to :menuselection:`Sales --> Configuration --> Settings --> Connectors -->
Amazon Sync --> Amazon Marketplaces`.
From there, you can create a new marketplace record. You will need the Marketplace ID and Endpoint
for your marketplace as described in the `Amazon Documentation
<https://docs.developer.amazonservices.com/en_US/dev_guide/DG_Endpoints.html>`_.
From there, create a new marketplace record. Enter the Marketplace ID and select the Amazon Region
for your marketplace as described in the `Amazon Documentation for marketplace IDs
<https://developer-docs.amazon.com/amazon-shipping/docs/marketplace-ids>`_, and the Seller Central
URL as described in the `Amazon Documentation for seller central URLs
<https://developer-docs.amazon.com/amazon-shipping/docs/seller-central-urls>`_.
Set the name of the record to ``Amazon.<domain>`` to easily retrieve it (for instance:
``Amazon.se``). The **Code**, **Domain** and **API Identifier** fields should respectively hold
the *Country Code*, *Amazon MWS Endpoint* and *MarketplaceId* values from the Amazon Documentation.
Set the name of the record to ``Amazon.<country code>`` to easily retrieve it (e.g.: ``Amazon.se``).
The :guilabel:`API Identifier`, the :guilabel:`Region` and the :guilabel:`Seller Central URL` fields
should respectively hold the *MarketplaceId*, the selected Amazon region and the *Seller Central
URL* values from the Amazon Documentation.
Once the marketplace is saved, you should then update the Amazon Account configuration by going to
Once the marketplace is saved, update the Amazon Account configuration by going to
:menuselection:`Sales --> Configuration --> Settings --> Connectors --> Amazon Sync -->
Amazon Accounts`, open the account on which you wish to use the new marketplace, go to the
**Marketplaces** tab and click on **Update available marketplaces** (an animation should confirm the
success of the operation). Newly added marketplaces are automatically added to the list of
synchronized marketplaces. If the new marketplace is not added to the list, it means that it is
either incompatible or unavailable for your seller account.
Amazon Accounts`. Open the account on which you wish to use the new marketplace, go to the
:guilabel:`Marketplaces` tab and click on :guilabel:`Update available marketplaces` (an animation
should confirm the success of the operation). Newly added marketplaces are automatically added to
the list of synchronized marketplaces. If the new marketplace is not added to the list, it means
that it is either incompatible or unavailable for your seller account.
.. important::
As manually added marketplaces are not officially supported by Odoo, there is no guarantee that

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

View File

@@ -2,35 +2,82 @@
Invoice Time Spent on Tickets (Postpaid Support Services)
=========================================================
Directly pull the billable time you have tracked on your helpdesk tickets into sales orders and
invoices through a project task. It gives you more control over what you charge your client, and it
is more efficient.
The :guilabel:`Timesheet on Ticket` integration provides more control and transparency over how
clients are charged, and what they're specifically billed for.
In Odoo, Project managers can connect Helpdesk tickets to Project tasks. As the Helpdesk agent
works on the ticket, they can use the ticket itself or the Project task to record timesheets.
Thanks to the :guilabel:`Timesheet on Ticket` integration, timesheets will always be consistent and
up-to-date on both records. Once a ticket is solved, the client can be billed for the time spent on
the ticket. Odoo will pull from either the task or the ticket timesheet to accurately bill the
client.
Configuration
=============
| Go to :menuselection:`Helpdesk --> Configuration --> Helpdesk team --> Edit` and enable the options
*Timesheet on Ticket* and *Time Reinvoicing*.
| Under *Timesheet on Ticket*, choose the *Project* to which tickets (and timesheets) will be
linked by default. Open its *External link* to enable the feature *Bill from tasks*.
To turn on the :guilabel:`Timesheet on Ticket` feature, go to :menuselection:`Helpdesk -->
Configuration --> Helpdesk Teams`, select a Helpdesk team, and then, click :guilabel:`Edit`. Next,
enable the options :guilabel:`Timesheet on Ticket` and :guilabel:`Time Reinvoicing`.
.. image:: reinvoice_from_project/reinvoice_time1.png
In the :guilabel:`Timesheet on Ticket` drop-down option, choose the Project to which tickets (and
timesheets) will be linked by default. Then, open the Project's external link to edit its settings
and enable the :guilabel:`Billable` option. Finally, save both the Project and the Helpdesk team's
settings to apply these features.
.. image:: reinvoice_from_project/project-billable.png
:align: center
:alt: Bill from Tasks in Odoo Helpdesk
:alt: Billable feature in Project settings.
Create a sales order and an invoice
====================================
Create a sales order
====================
Now, once you have recorded the time you spent on the helpdesk ticket, under the *Timesheets* tab,
access the task clicking on its name.
After a ticket comes into the pipeline, go to :menuselection:`Sales --> Create`. Then, add the
customer from the ticket to the new quotation. In the :guilabel:`Order Lines` tab, add the
:guilabel:`Service on Timesheet` product. Finally, click :guilabel:`Confirm` to turn the quotation
into a sales order.
.. image:: reinvoice_from_project/reinvoice_time2.png
.. tip::
Remember the sales order name for later to link the Helpdesk ticket to the correct sales order.
.. image:: reinvoice_from_project/service-on-timesheet.png
:align: center
:alt: Sales Order from a task in Odoo Helpdesk
:alt: Add Service on Timesheet product to the SO.
*Create Sales Order* and proceed to create the invoice.
Record a timesheet
==================
.. image:: reinvoice_from_project/reinvoice_time3.png
To record a timesheet, jump back to the Helpdesk ticket by going to the Helpdesk dashboard and
clicking :guilabel:`Tickets` on the team's card (or by going to the Projects dashboard and clicking
:guilabel:`Tickets` on the project card). Then, click :guilabel:`Edit` and use the
:guilabel:`Timesheets` tab to record the time spent on the ticket.
.. image:: reinvoice_from_project/record-timesheet-ticket.png
:align: center
:height: 300
:alt: Sales Order from a task in Odoo Helpdesk
:alt: Record time spent on a ticket.
Link the Helpdesk ticket to the SO
==================================
To link the :abbr:`SO (Sales Order)` to the ticket, start on the ticket form, click
:guilabel:`Edit`, and then, click the :guilabel:`Sales Order Item` field. Next, select the
:abbr:`SO (Sales Order)` that was created earlier from the drop-down menu. Lastly, click
:guilabel:`Save` to connect the ticket and the :abbr:`SO (Sales Order)`.
.. image:: reinvoice_from_project/link-so-ticket.png
:align: center
:alt: Link the SO item to the ticket.
Create the invoice
==================
When the Helpdesk ticket is completed and the client is ready to be billed for time, begin by
clicking the :guilabel:`Sales Order` smart button on the ticket form to navigate to the :abbr:`SO
(Sales Order)`. The :guilabel:`Delivered` column should match the number of hours recorded on the
ticket's timesheet. After checking and filling out the relevant information, click :guilabel:`Create
Invoice` to bill the client for the time spent on the ticket. Odoo will automatically generate an
invoice to send to the client and the Helpdesk ticket can officially be closed.
.. seealso::
- :doc:`invoice_time`
- :doc:`/applications/inventory_and_mrp/inventory/management/products/uom`

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View File

@@ -59,4 +59,4 @@ payment from the related Sales Order.
.. seealso::
- :doc:`../../../finance/payment_acquirers`
- :ref:`Payment Acquirers: Place a hold on a card <payment_acquirers/capture_amount>`
- :ref:`Payment Acquirers: Place a hold on a card <payment_acquirers/features/manual_capture>`

View File

@@ -723,22 +723,100 @@ joins) or for performance reasons::
self.env.cr.execute("some_sql", params)
.. warning::
Executing raw SQL bypasses the ORM and, by consequent, Odoo security rules.
Please make sure your queries are sanitized when using user input and prefer using
ORM utilities if you don't really need to use SQL queries.
One important thing to know about models is that they don't necessarily perform
database updates right away. Indeed, for performance reasons, the framework
delays the recomputation of fields after modifying records. And some database
updates are delayed, too. Therefore, before querying the database, one has to
make sure that it contains the relevant data for the query. This operation is
called *flushing* and performs the expected database updates.
.. example::
.. code-block:: python
# make sure that 'partner_id' is up-to-date in database
self.env['model'].flush_model(['partner_id'])
self.env.cr.execute("SELECT id FROM model WHERE partner_id IN %s", [ids])
ids = [row[0] for row in self.env.cr.fetchall()]
Before every SQL query, one has to flush the data needed for that query. There
are three levels for flushing, each with its own API. One can flush either
everything, all the records of a model, or some specific records. Because
delaying updates improves performance in general, we recommend to be *specific*
when flushing.
.. automethod:: odoo.api.Environment.flush_all
.. automethod:: Model.flush_model
.. automethod:: Model.flush_recordset
Because models use the same cursor and the :class:`~odoo.api.Environment`
holds various caches, these caches must be invalidated when *altering* the
database in raw SQL, or further uses of models may become incoherent. It is
necessary to clear caches when using ``CREATE``, ``UPDATE`` or ``DELETE`` in
SQL, but not ``SELECT`` (which simply reads the database).
.. note::
Clearing caches can be performed using the
:meth:`~odoo.models.Model.invalidate_cache` method.
.. example::
.. automethod:: Model.invalidate_cache
.. code-block:: python
.. warning::
Executing raw SQL bypasses the ORM, and by consequent, Odoo security rules.
Please make sure your queries are sanitized when using user input and prefer using
ORM utilities if you don't really need to use SQL queries.
# make sure 'state' is up-to-date in database
self.env['model'].flush_model(['state'])
self.env.cr.execute("UPDATE model SET state=%s WHERE state=%s", ['new', 'old'])
# invalidate 'state' from the cache
self.env['model'].invalidate_model(['state'])
Just like flushing, one can invalidate either the whole cache, the cache of all
the records of a model, or the cache of specific records. One can even
invalidate specific fields on some records or all records of a model. As the
cache improves performance in general, we recommend to be *specific* when
invalidating.
.. automethod:: odoo.api.Environment.invalidate_all
.. automethod:: Model.invalidate_model
.. automethod:: Model.invalidate_recordset
The methods above keep the caches and the database consistent with each other.
However, if computed field dependencies have been modified in the database, one
has to inform the models for the computed fields to be recomputed. The only
thing the framework needs to know is *what* fields have changed on *which*
records.
.. example::
.. code-block:: python
# make sure 'state' is up-to-date in database
self.env['model'].flush_model(['state'])
# use the RETURNING clause to retrieve which rows have changed
self.env.cr.execute("UPDATE model SET state=%s WHERE state=%s RETURNING id", ['new', 'old'])
ids = [row[0] for row in self.env.cr.fetchall()]
# invalidate the cache, and notify the update to the framework
records = self.env['model'].browse(ids)
records.invalidate_recordset(['state'])
records.modified(['state'])
One has to figure out which records have been modified. There are many ways to
do this, possibly involving extra SQL queries. In the example above, we take
advantage of the ``RETURNING`` clause of PostgreSQL to retrieve the information
without an extra query. After making the cache consistent by invalidation,
invoke the method ``modified`` on the modified records with the fields that
have been updated.
.. automethod:: Model.modified
.. _reference/orm/models/crud:
@@ -763,8 +841,6 @@ Create/update
.. automethod:: Model.write
.. automethod:: Model.flush
Search/Read
-----------

View File

@@ -4,6 +4,15 @@
Changelog
=========
Odoo Online version 15.4
========================
- New API for flushing to the database and invalidating the cache with
`#87527 <https://github.com/odoo/odoo/pull/87527>`_.
New methods have been added to `odoo.models.Model` and `odoo.api.Environment`,
and are less confusing about what is actually done in each case.
See the section :ref:`SQL Execution <reference/orm/sql>`.
Odoo Online version 15.2
========================

View File

@@ -86,7 +86,7 @@
</a>
</li>
<li>
<a href="{{ pathto('developer/misc/api/odoo') }}" class="stretched-link">
<a href="{{ pathto('developer/misc/api/external_api') }}" class="stretched-link">
{{ _("External API") }}
</a>
</li>