Compare commits
51 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e328ef3b9f | |||
| cf46224fda | |||
| 41a8050f34 | |||
| 45d88420e8 | |||
| cb30a15eb9 | |||
| c987e2e98e | |||
| 980b6ad41b | |||
| b8607a24a8 | |||
| c1d5ddc361 | |||
| 9dc985ef47 | |||
| f78570e908 | |||
| 469e8b6f17 | |||
| 36d2b66f59 | |||
| 3256aa02bd | |||
| ad0619e7fe | |||
| 6aca6f83d3 | |||
| 00077597d2 | |||
| c9c5af7045 | |||
| c36ad6720b | |||
| 3d04daa3f7 | |||
| a9febaea2d | |||
| f1090218e8 | |||
| 3cce09c199 | |||
| 9e8a7f54e3 | |||
| 66b2a2380c | |||
| b17e44ea59 | |||
| 730eb3086d | |||
| f200abf259 | |||
| 84017e77a5 | |||
| d811aef87c | |||
| 4f40ebd78f | |||
| 7797ce1fe2 | |||
| be3a6f6f54 | |||
| 9a549510be | |||
| b6372019d6 | |||
| fccd4e5d88 | |||
| 196553ca1e | |||
| 5b427ac874 | |||
| 3badb434e1 | |||
| 55ec59ba24 | |||
| 7e3309b922 | |||
| 6f74248de1 | |||
| be0b5e65d5 | |||
| 83b6895deb | |||
| 16537bb9c5 | |||
| 71e2a50d40 | |||
| 514c175824 | |||
| 65e7f1b3c5 | |||
| d362d4ebdb | |||
| 1aee294219 | |||
| d8cd13b659 |
@@ -402,9 +402,9 @@ we are considering the feature if there is enough demand.
|
||||
|
||||
In case the domain of your users email addresses use SPF (Sender Policy Framework) or DKIM
|
||||
(DomainKeys Identified Mail), don't forget to authorize Odoo as a sending host in your domain name
|
||||
settings to increase the deliverability of your outgoing emails.
|
||||
The configuration steps are explained in the documentation about :ref:`SPF
|
||||
<email_communication/spf_compliant>` and :ref:`DKIM <email_communication/dkim_compliant>`.
|
||||
settings to increase the deliverability of your outgoing emails. The configuration steps are
|
||||
explained in the documentation about :ref:`SPF <email-domain-spf>` and :ref:`DKIM
|
||||
<email-domain-dkim>`.
|
||||
|
||||
.. Warning::
|
||||
Forgetting to configure your SPF or DKIM to authorize Odoo as a sending host can lead to the
|
||||
|
||||
@@ -33,7 +33,6 @@ In you alias config (:file:`/etc/aliases`):
|
||||
- `Postfix aliases <http://www.postfix.org/aliases.5.html>`_
|
||||
- `Postfix virtual <http://www.postfix.org/virtual.8.html>`_
|
||||
|
||||
|
||||
For Exim
|
||||
--------
|
||||
|
||||
@@ -47,5 +46,5 @@ For Exim
|
||||
- `Exim <https://www.exim.org/docs.html>`_
|
||||
|
||||
.. tip::
|
||||
If you don't have access/manage your email server, use :ref:`inbound messages
|
||||
<email_communication/inbound_messages>`.
|
||||
If you do not have access/manage your email server, use :ref:`incoming mail servers
|
||||
<email-inbound-custom-domain-incoming-server>`.
|
||||
|
||||
@@ -89,7 +89,7 @@ settings. To use a service, simply interact with it wherever it appears in the d
|
||||
- :doc:`Lead mining <../sales/crm/acquire_leads/lead_mining>`
|
||||
- :doc:`Enrich your contacts base with Partner Autocomplete
|
||||
<../sales/crm/optimize/partner_autocomplete>`
|
||||
- :doc:`SMS essentials <../marketing/sms_marketing/essentials/sms_essentials>`
|
||||
- :doc:`SMS Marketing <../marketing/sms_marketing>`
|
||||
|
||||
.. _in_app_purchase/credits:
|
||||
|
||||
@@ -119,7 +119,7 @@ Credits are purchased in *Packs* from the `Odoo IAP Catalog
|
||||
The number of credits consumed depends on the length of the SMS and the country of destination.
|
||||
|
||||
For more information, refer to the :doc:`SMS Pricing and FAQ
|
||||
<../marketing/sms_marketing/pricing/pricing_and_faq>` documentation.
|
||||
<../marketing/sms_marketing/pricing_and_faq>` documentation.
|
||||
|
||||
.. _iap/buying_credits:
|
||||
|
||||
|
||||
@@ -188,7 +188,7 @@ Comparison
|
||||
|
||||
Certain reporting dashboards include a :guilabel:`Comparison` section in the drop-down menus of
|
||||
their :guilabel:`Search...` bars. This includes the :doc:`Overall Equipment Effectiveness
|
||||
<../inventory_and_mrp/manufacturing/workflows/oee>` report for the *Manufacturing* app, and the
|
||||
<../inventory_and_mrp/manufacturing/reporting/oee>` report for the *Manufacturing* app, and the
|
||||
:doc:`Purchase <../inventory_and_mrp/purchase/advanced/analyze>` report for the *Purchase* app,
|
||||
among others.
|
||||
|
||||
|
||||
@@ -36,6 +36,8 @@ follow the instructions.
|
||||
.. seealso::
|
||||
:doc:`bank/bank_synchronization`
|
||||
|
||||
.. _bank_accounts/create:
|
||||
|
||||
Create a bank account
|
||||
---------------------
|
||||
|
||||
|
||||
@@ -18,8 +18,13 @@ To specify a sales order's invoice and delivery addresses, first go to :menusele
|
||||
|
||||
On quotations and sales orders, there are now fields for :guilabel:`Invoice Address` and
|
||||
:guilabel:`Delivery Address`. If the customer has an invoice or delivery address listed on their
|
||||
contact record, the corresponding field will use that address by default, but any contact's address
|
||||
can be used instead.
|
||||
:ref:`contact record <sales/send_quotations/contact-form-config>`, the corresponding field uses that
|
||||
address, by default, but any contact's address can be used instead.
|
||||
|
||||
.. seealso::
|
||||
For more information, refer to the documentation on :ref:`Contact Form Configuration
|
||||
<sales/send_quotations/contact-form-config>`.
|
||||
|
||||
|
||||
Invoice and deliver to different addresses
|
||||
==========================================
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
Get started
|
||||
===========
|
||||
|
||||
When you first open your Odoo Accounting app, the *Accounting Overview* page welcomes you with a
|
||||
step-by-step onboarding banner, a wizard that helps you get started. This onboarding banner is
|
||||
When you first open your Odoo Accounting app, the :guilabel:`Accounting Dashboard` welcomes you with
|
||||
a step-by-step onboarding banner, a wizard that helps you get started. This onboarding banner is
|
||||
displayed until you choose to close it.
|
||||
|
||||
The settings visible in the onboarding banner can still be modified later by going to
|
||||
@@ -22,69 +22,22 @@ Accounting onboarding banner
|
||||
|
||||
The step-by-step Accounting onboarding banner is composed of four steps:
|
||||
|
||||
.. image:: get_started/setup_accounting_onboarding.png
|
||||
.. image:: get_started/setup-accounting-onboarding.png
|
||||
:alt: Step-by-step onboarding banner in Odoo Accounting
|
||||
|
||||
#. :ref:`accounting-setup-company`
|
||||
#. :ref:`accounting-setup-bank`
|
||||
#. :ref:`accounting-setup-periods`
|
||||
#. :ref:`accounting-setup-bank`
|
||||
#. :ref:`accounting-setup-taxes`
|
||||
#. :ref:`accounting-setup-chart`
|
||||
|
||||
.. _accounting-setup-company:
|
||||
|
||||
Company Data
|
||||
------------
|
||||
|
||||
This menu allows you to add your company’s details such as the name, address, logo, website, phone
|
||||
number, email address, and Tax ID, or VAT number. These details are then displayed on your documents,
|
||||
such as on invoices.
|
||||
|
||||
.. image:: get_started/setup_company.png
|
||||
:alt: Add your company's details in Odoo Accounting and Odoo Invoicing
|
||||
|
||||
.. note::
|
||||
You can also change these settings by going to :menuselection:`Settings --> General Settings -->
|
||||
Settings --> Companies` and clicking on **Update Info**.
|
||||
|
||||
.. _accounting-setup-bank:
|
||||
|
||||
Bank Account
|
||||
------------
|
||||
|
||||
Connect your bank account to your database and have your bank statements synced automatically. To do
|
||||
so, find your bank in the list, click on *Connect*, and follow the instructions on-screen.
|
||||
|
||||
.. note::
|
||||
:doc:`Click here <bank/bank_synchronization>` for more information about this feature.
|
||||
|
||||
If your Bank Institution can’t be synchronized automatically, or if you prefer not to sync it with
|
||||
your database, you may also configure your bank account manually by clicking on *Create it*, and
|
||||
filling out the form.
|
||||
|
||||
- **Name**: the bank account's name, as displayed on Odoo.
|
||||
- **Account Number**: your bank account number (IBAN in Europe).
|
||||
- **Bank**: click on *Create and Edit* to configure the bank's details. Add the bank institution's
|
||||
name and its Identifier Code (BIC or SWIFT).
|
||||
- **Code**: this code is your Journal's *Short Code*, as displayed on Odoo. By default, Odoo creates
|
||||
a new Journal with this Short Code.
|
||||
- **Journal**: This field is displayed if you have an existing Bank Journal that is not linked yet
|
||||
to a bank account. If so, then select the *Journal* you want to use to record the financial
|
||||
transactions linked to this bank account or create a new one by clicking on *Create and Edit*.
|
||||
|
||||
.. note::
|
||||
- You can add as many bank accounts as needed with this tool by going to :menuselection:`Accounting
|
||||
--> Configuration`, and clicking on *Add a Bank Account*.
|
||||
- :doc:`Click here <bank>` for more information about Bank
|
||||
Accounts.
|
||||
|
||||
.. _accounting-setup-periods:
|
||||
|
||||
Accounting Periods
|
||||
------------------
|
||||
|
||||
Define here your **Fiscal Years**’ opening and closing dates, which are used to generate reports
|
||||
automatically, and your **Tax Return Periodicity**, along with a reminder to never miss a tax return
|
||||
deadline.
|
||||
Define the **Fiscal Years**’ opening and closing dates, which are used to generate reports
|
||||
automatically, and set your **Tax Return Periodicity**, along with a reminder to never miss a tax
|
||||
return deadline.
|
||||
|
||||
By default, the opening date is set on the 1st of January and the closing date on the 31st of
|
||||
December, as this is the most common use.
|
||||
@@ -93,6 +46,49 @@ December, as this is the most common use.
|
||||
You can also change these settings by going to :menuselection:`Accounting --> Configuration -->
|
||||
Settings --> Fiscal Periods` and updating the values.
|
||||
|
||||
.. _accounting-setup-bank:
|
||||
|
||||
Bank Account
|
||||
------------
|
||||
|
||||
Connect your bank account to your database and have your bank statements synced automatically. To do
|
||||
so, find your bank in the list, click :guilabel:`Connect`, and follow the instructions on-screen.
|
||||
|
||||
.. note::
|
||||
:doc:`Click here <bank/bank_synchronization>` for more information about this feature.
|
||||
|
||||
If your Bank Institution can’t be synchronized automatically, or if you prefer not to sync it with
|
||||
your database, you can also configure your bank account manually by typing its name, clicking
|
||||
:guilabel:`Create your Bank Account`, and filling out the form.
|
||||
|
||||
- :guilabel:`Name`: the bank account's name, as displayed in Odoo.
|
||||
- :guilabel:`Account Number`: your bank account number (IBAN in Europe).
|
||||
- :guilabel:`Bank`: click :guilabel:`Create and edit` to configure the bank's details. Add the
|
||||
bank institution's :guilabel:`Name` and its :guilabel:`Identifier Code` (BIC or SWIFT).
|
||||
- :guilabel:`Code`: this code is your Journal's :guilabel:`Short Code`, as displayed in Odoo.
|
||||
By default, Odoo creates a new Journal with this short code.
|
||||
- :guilabel:`Journal`: This field is displayed if you have an existing bank journal that is not
|
||||
linked yet to a bank account. If so, then select the :guilabel:`Journal` you want to use to record
|
||||
the financial transactions linked to this bank account or create a new one by clicking
|
||||
:guilabel:`Create and Edit`.
|
||||
|
||||
.. note::
|
||||
- You can add as many bank accounts as needed with this tool by going to
|
||||
:menuselection:`Accounting --> Configuration --> Add a Bank Account`.
|
||||
- :doc:`Click here <bank>` for more information about Bank Accounts.
|
||||
|
||||
.. _accounting-setup-taxes:
|
||||
|
||||
Taxes
|
||||
-----
|
||||
|
||||
This menu allows you to create new taxes, (de)activate, or modify existing taxes. Depending on the
|
||||
:doc:`localization package <../fiscal_localizations>` installed on your database, taxes required for
|
||||
your country are already configured.
|
||||
|
||||
.. note::
|
||||
:doc:`Click here <taxes>` for more information about taxes.
|
||||
|
||||
.. _accounting-setup-chart:
|
||||
|
||||
Chart of Accounts
|
||||
@@ -102,20 +98,20 @@ With this menu, you can add accounts to your **Chart of Accounts** and indicate
|
||||
opening balances.
|
||||
|
||||
Basic settings are displayed on this page to help you review your Chart of Accounts. To access all
|
||||
the settings of an account, click on the *double arrow button* at the end of the line.
|
||||
the settings of an account, click on the :guilabel:`Setup` button at the end of the line.
|
||||
|
||||
.. image:: get_started/setup_chart_of_accounts.png
|
||||
:alt: Setup of the Chart of Accounts and their opening balances in Odoo Accounting
|
||||
|
||||
.. note::
|
||||
:doc:`Click here <get_started/chart_of_accounts>` for more information on how to configure your Chart of
|
||||
Accounts.
|
||||
:doc:`Click here <get_started/chart_of_accounts>` for more information on how to configure your
|
||||
Chart of Accounts.
|
||||
|
||||
Invoicing onboarding banner
|
||||
===========================
|
||||
|
||||
There is another step-by-step onboarding banner that helps you take advantage of your Odoo Invoicing
|
||||
and Accounting apps. The *Invoicing onboarding banner* is the one that welcomes you if you use the
|
||||
and Accounting apps. The Invoicing onboarding banner is the one that welcomes you if you use the
|
||||
Invoicing app rather than the Accounting app.
|
||||
|
||||
If you have Odoo Accounting installed on your database, you can reach it by going to
|
||||
@@ -123,65 +119,67 @@ If you have Odoo Accounting installed on your database, you can reach it by goin
|
||||
|
||||
The Invoicing onboarding banner is composed of four main steps:
|
||||
|
||||
.. image:: get_started/setup_invoicing_onboarding.png
|
||||
.. image:: get_started/setup-invoicing-onboarding.png
|
||||
:alt: Step-by-step onboarding banner in Odoo Invoicing
|
||||
|
||||
#. :ref:`invoicing-setup-company`
|
||||
#. :ref:`invoicing-setup-bank`
|
||||
#. :ref:`invoicing-setup-layout`
|
||||
#. :ref:`invoicing-setup-payment`
|
||||
#. :ref:`invoicing-setup-sample`
|
||||
#. :ref:`invoicing-setup-invoice`
|
||||
|
||||
.. _invoicing-setup-company:
|
||||
|
||||
Company Data
|
||||
------------
|
||||
|
||||
This form is the same as :ref:`the one presented in the Accounting onboarding banner
|
||||
<accounting-setup-company>`.
|
||||
This form allows you to add your company’s details, such as the name, address, logo, website, phone
|
||||
number, email address, and Tax ID or VAT number. These details are then displayed on your
|
||||
documents, such as invoices.
|
||||
|
||||
.. image:: get_started/setup_company.png
|
||||
:alt: Add your company's details in Odoo Accounting and Odoo Invoicing
|
||||
|
||||
.. note::
|
||||
You can also change the company's details by going to :menuselection:`Settings --> General
|
||||
Settings`, scrolling down to the :guilabel:`Companies` section, and :guilabel:`Update Info`.
|
||||
|
||||
.. _invoicing-setup-bank:
|
||||
|
||||
Bank Account
|
||||
------------
|
||||
|
||||
Use this button to create and link a bank account in Odoo. To add additional bank accounts, go to
|
||||
:guilabel:`Invoicing --> Configuration --> Add a Bank Account` and :ref:`configure the fields
|
||||
<bank_accounts/create>`.
|
||||
|
||||
.. tip::
|
||||
:doc:`Synchronize <bank/bank_synchronization>` your bank account(s) with your Odoo database to
|
||||
automatically update your bank transactions.
|
||||
|
||||
.. _invoicing-setup-layout:
|
||||
|
||||
Invoice Layout
|
||||
--------------
|
||||
|
||||
With this tool, you can design the appearance of your documents by selecting which layout template,
|
||||
paper format, colors, font, and logo you want to use.
|
||||
Use this button to customize the :ref:`default invoice layout <studio/pdf-reports/default-layout>`.
|
||||
|
||||
You can also add your *Company Tagline* and the content of the documents’ *footer*. Note that Odoo
|
||||
automatically adds the company's phone number, email, website URL, and Tax ID (or VAT number) to the
|
||||
footer, according to the values you previously configured in the :ref:`Company Data
|
||||
<accounting-setup-company>`.
|
||||
.. note::
|
||||
You can also change the invoice layout by going to :menuselection:`Settings --> General
|
||||
Settings`, scrolling down to the :guilabel:`Companies` section, and clicking :guilabel:`Configure
|
||||
Document Layout`.
|
||||
|
||||
.. image:: get_started/setup_document_layout.png
|
||||
:alt: Document layout configuration in Odoo Invoicing
|
||||
.. _invoicing-setup-invoice:
|
||||
|
||||
Invoice Creation
|
||||
----------------
|
||||
|
||||
This button takes you to the invoice creation view, where you can create your first invoice.
|
||||
|
||||
.. tip::
|
||||
Add your **bank account number** and a link to your **General Terms & Condition** in the footer.
|
||||
This way, your contacts can find the full content of your GT&C online without having to print
|
||||
them on the invoices you issue.
|
||||
|
||||
.. note::
|
||||
These settings can also be modified by going to :menuselection:`Settings --> General Settings`,
|
||||
under the *Business Documents* section.
|
||||
|
||||
.. _invoicing-setup-payment:
|
||||
|
||||
Payment Method
|
||||
--------------
|
||||
|
||||
This menu helps you configure the payment methods with which your customers can pay you.
|
||||
|
||||
.. important::
|
||||
Configuring a *Payment Provider* with this tool also activates the *Invoice Online Payment*
|
||||
option automatically. With this, users can directly pay online, from their Customer Portal.
|
||||
|
||||
.. _invoicing-setup-sample:
|
||||
|
||||
Sample Invoice
|
||||
--------------
|
||||
|
||||
Send yourself a sample invoice by email to make sure everything is correctly configured.
|
||||
|
||||
.. seealso::
|
||||
* :doc:`bank`
|
||||
* :doc:`get_started/chart_of_accounts`
|
||||
@@ -197,4 +195,4 @@ Send yourself a sample invoice by email to make sure everything is correctly con
|
||||
get_started/chart_of_accounts
|
||||
get_started/multi_currency
|
||||
get_started/avg_price_valuation
|
||||
get_started/vat_units
|
||||
get_started/tax_units
|
||||
|
||||
|
After Width: | Height: | Size: 129 KiB |
|
After Width: | Height: | Size: 167 KiB |
|
Before Width: | Height: | Size: 57 KiB |
|
Before Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 71 KiB |
@@ -1,50 +1,35 @@
|
||||
=========
|
||||
VAT units
|
||||
Tax units
|
||||
=========
|
||||
|
||||
.. important::
|
||||
This is only applicable to multi-company environments.
|
||||
|
||||
A **VAT unit** is a group of VAT-taxable enterprises that are legally independent of each other but
|
||||
A **tax unit** is a group of VAT-taxable enterprises that are legally independent of each other but
|
||||
are closely linked financially, organizationally, and economically and therefore considered the same
|
||||
VAT-taxable enterprise. **VAT units** are not mandatory, but if created, constituent companies of
|
||||
VAT-taxable enterprise. **Tax units** are not mandatory, but if created, constituent companies of
|
||||
the unit must belong to the same **country**, use the same **currency**, and one company must be
|
||||
designated as the **representative** company of the **VAT unit**. **VAT units** receive a specific
|
||||
designated as the **representative** company of the **tax unit**. **Tax units** receive a specific
|
||||
**tax ID** intended only for **tax returns**. **Constituent** companies keep their **tax ID** used
|
||||
for **commercial purposes**.
|
||||
|
||||
.. example::
|
||||
Enterprise **A** owes €300.000,00 of VAT taxes and enterprise **B** can recover €280.000,00 of
|
||||
VAT taxes. They form up as a **VAT unit** so that the two amounts balance out and must conjointly
|
||||
VAT taxes. They form up as a **tax unit** so that the two amounts balance out and must conjointly
|
||||
only pay €20.000,00 of VAT taxes.
|
||||
|
||||
Configuration
|
||||
=============
|
||||
|
||||
To configure a **VAT unit**, go to :menuselection:`Settings --> General Settings`, scroll down to
|
||||
the :guilabel:`Companies` section, and click :guilabel:`Manage Companies`. Select the company to
|
||||
serve the **representative** role, and in the :guilabel:`General Information` tab, fill in the
|
||||
mandatory fields for the .XML export when exporting the **tax report**: :guilabel:`Company Name`,
|
||||
:guilabel:`Address`, :guilabel:`VAT`, :guilabel:`Currency`, :guilabel:`Phone`, and
|
||||
:guilabel:`Email`.
|
||||
|
||||
.. image:: vat_units/general.png
|
||||
:align: center
|
||||
:alt: General information tab
|
||||
|
||||
Then, click on the :guilabel:`VAT Units` tab, :guilabel:`Add a line`, and either select an existing
|
||||
**VAT unit**, or create a new one. Enter a **name** for the unit, :guilabel:`Country` of the
|
||||
constituent companies and tax report, the :guilabel:`Companies`, the :guilabel:`Main Company` that
|
||||
serves the **representative** role, and the :guilabel:`Tax ID` of the **VAT unit**.
|
||||
|
||||
.. image:: vat_units/vat-unit.png
|
||||
:align: center
|
||||
:alt: VAT units tab
|
||||
To create a **tax unit**, go to :menuselection:`Accounting --> Configuration --> Tax Units`, and
|
||||
click :guilabel:`New`. Enter a **name** for the unit, select a :guilabel:`Country`, the
|
||||
:guilabel:`Companies` to incorporate in the unit, the :guilabel:`Main Company`, and the
|
||||
:guilabel:`Tax ID` of the **constituent** company of that tax unit.
|
||||
|
||||
Fiscal position
|
||||
---------------
|
||||
|
||||
As transactions between constituents of the same **VAT unit** are not subject to VAT, it is possible
|
||||
As transactions between constituents of the same **tax unit** are not subject to VAT, it is possible
|
||||
to create a :doc:`tax mapping (fiscal position) <../taxes/fiscal_positions>` to avoid the
|
||||
application of VAT on inter-constituent transactions.
|
||||
|
||||
@@ -61,13 +46,12 @@ Do the same for the :guilabel:`Account Mapping` tab if required, and repeat this
|
||||
Depending on your :doc:`localization package </applications/finance/fiscal_localizations>`, taxes
|
||||
may vary from the screenshot displayed.
|
||||
|
||||
.. image:: vat_units/fiscal-positions.png
|
||||
:align: center
|
||||
:alt: Tax mapping of fiscal position for VAT unit
|
||||
.. image:: tax_units/fiscal-positions.png
|
||||
:alt: Tax mapping of fiscal position for tax unit
|
||||
|
||||
Then, assign the fiscal position by opening the **Contacts** app. Search for a **constituent**
|
||||
company, and open the contact's **card**. Click the :guilabel:`Sales & Purchase` tab, and in the
|
||||
:guilabel:`Fiscal Position` field, input the **fiscal position** created for the **VAT unit**.
|
||||
:guilabel:`Fiscal Position` field, input the **fiscal position** created for the **tax unit**.
|
||||
Repeat the process for each **constituent** company card form, on each company database.
|
||||
|
||||
.. seealso::
|
||||
@@ -76,11 +60,10 @@ Repeat the process for each **constituent** company card form, on each company d
|
||||
Tax report
|
||||
==========
|
||||
|
||||
The **representative** company can access the aggregated tax report of the **VAT unit** by going to
|
||||
:menuselection:`Accounting --> Reporting --> Tax Report`, and selecting the **VAT unit** in
|
||||
The **representative** company can access the aggregated tax report of the **tax unit** by going to
|
||||
:menuselection:`Accounting --> Reporting --> Tax Report`, and selecting the **tax unit** in
|
||||
:guilabel:`Tax Unit`. This report contains the aggregated transactions of all **constituents** and
|
||||
the .XML export contains the name and VAT number of the **main** company.
|
||||
|
||||
.. image:: vat_units/report.png
|
||||
:align: center
|
||||
:alt: VAT unit tax report
|
||||
.. image:: tax_units/report.png
|
||||
:alt: tax unit tax report
|
||||
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 5.8 KiB |
|
Before Width: | Height: | Size: 10 KiB |
@@ -16,6 +16,8 @@ Go to :menuselection:`Accounting --> Configuration --> Settings --> Customer Pay
|
||||
Deposit multiple payments in batch
|
||||
==================================
|
||||
|
||||
.. _batch-payments/register-payments:
|
||||
|
||||
Register payments
|
||||
-----------------
|
||||
|
||||
|
||||
@@ -91,5 +91,5 @@ select :guilabel:`Process follow-ups`.
|
||||
|
||||
.. seealso::
|
||||
- :doc:`/applications/essentials/in_app_purchase`
|
||||
- :doc:`/applications/marketing/sms_marketing/pricing/pricing_and_faq`
|
||||
- :doc:`/applications/marketing/sms_marketing/pricing_and_faq`
|
||||
- :doc:`../customer_invoices/snailmail`
|
||||
|
||||
@@ -30,8 +30,9 @@ Non-EEA territories:
|
||||
- Jersey;
|
||||
- Isle of Man.
|
||||
|
||||
When paying a bill in Odoo, you can select SEPA mandates as a payment option. At the day's end,
|
||||
you can generate the SEPA file containing all bank wire transfers and send it to the bank.
|
||||
When paying a bill in Odoo, you can select SEPA mandates as a payment option. At the end of the day,
|
||||
you can generate the SEPA file containing all bank wire transfers and upload it to your online
|
||||
banking interface to process the payments.
|
||||
|
||||
By default, the file follows the SEPA Credit Transfer **'pain.001.001.03'** specifications. This is
|
||||
a well-defined standard among banks. However, for Swiss and German companies, other formats are used
|
||||
@@ -69,7 +70,7 @@ the BIC (bank identifier code) in the :guilabel:`Journal Entries` tab.
|
||||
Registering payments
|
||||
--------------------
|
||||
|
||||
You can register and vendor payments made with SEPA. To do so, go to :menuselection:`Accounting -->
|
||||
You can register any vendor payments made with SEPA. To do so, go to :menuselection:`Accounting -->
|
||||
Vendors --> Payments`. When creating your payment, select :guilabel:`SEPA Credit Transfer` as the
|
||||
:guilabel:`Payment Method`.
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ inalterable**, meaning that once an entry has been posted, it can no longer be c
|
||||
|
||||
To do so, Odoo can use the **SHA-256 algorithm** to create a unique fingerprint for each posted
|
||||
entry. This fingerprint is called a hash. The hash is generated by taking an entry's essential data
|
||||
(the values of the `date`, `journal_id`, `company_id`, `debit`, `credit`, `account_id`, and
|
||||
(the values of the `name`, `date`, `journal_id`, `company_id`, `debit`, `credit`, `account_id`, and
|
||||
`partner_id` fields), concatenating it, and inputting it to the SHA-256 hash function, which then
|
||||
outputs a fixed size (256-bit) string of characters. The hash function is deterministic (:dfn:`the
|
||||
same input always creates the same output`): any minor modification to the original data would
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
Expenses
|
||||
========
|
||||
|
||||
Odoo *Expenses* streamlines the management of expenses. After an employee submits their expenses in
|
||||
Odoo, they are reviewed by management and accounting teams. Once approved, payments can then be
|
||||
Odoo **Expenses** streamlines the management of expenses. After an employee submits their expenses
|
||||
in Odoo, they are reviewed by management and accounting teams. Once approved, payments can then be
|
||||
processed, and disbursed back to the employee for reimbursement.
|
||||
|
||||
.. seealso::
|
||||
@@ -84,474 +84,20 @@ Set a tax on each product in the :guilabel:`Vendor Taxes` and :guilabel:`Custome
|
||||
applicable. It is considered good practice to use a tax that is configured with :ref:`Tax Included
|
||||
in Price <taxes/included-in-price>`. Taxes will be automatically configured if this is set.
|
||||
|
||||
.. _expenses/new:
|
||||
|
||||
Record expenses
|
||||
===============
|
||||
|
||||
Manually create a new expense
|
||||
-----------------------------
|
||||
|
||||
To record a new expense, begin in the main :menuselection:`Expenses` app dashboard, which presents
|
||||
the default :guilabel:`My Expenses` view. This view can also be accessed from
|
||||
:menuselection:`Expenses app --> My Expenses --> My Expenses`.
|
||||
|
||||
First, click :guilabel:`New`, and then fill out the various fields on the form.
|
||||
|
||||
- :guilabel:`Description`: enter a short description for the expense in the :guilabel:`Description`
|
||||
field. This should be short and informative, such as `lunch with client` or `hotel for
|
||||
conference`.
|
||||
- :guilabel:`Category`: select the expense category from the drop-down menu that most closely
|
||||
corresponds to the expense. For example, an airplane ticket would be appropriate for an expense
|
||||
:guilabel:`Category` named :guilabel:`Air Travel`.
|
||||
- :guilabel:`Total`: Enter the total amount paid for the expense in one of two ways:
|
||||
|
||||
#. If the expense is for one single item/expense, and the category selected was for a single item,
|
||||
enter the cost in the :guilabel:`Total` field (the :guilabel:`Quantity` field is hidden).
|
||||
#. If the expense is for multiples of the same item/expense with a fixed price, the
|
||||
:guilabel:`Unit Price` is displayed. Enter the quantity in the :guilabel:`Quantity` field, and
|
||||
the total cost is automatically updated with the correct total (the :guilabel:`Unit Price` x
|
||||
the :guilabel:`Quantity` = the total). Be advised, the word "total" does not appear, the total
|
||||
cost simply appears below the :guilabel:`Quantity`.
|
||||
|
||||
.. example::
|
||||
For example, in the case of mileage driven, the :guilabel:`Unit Price` is populated as the
|
||||
cost *per mile*. Set the :guilabel:`Quantity` to the *number of miles* driven, and the total
|
||||
is calculated.
|
||||
|
||||
- :guilabel:`Included Taxes`: if taxes were configured on the expense category, the tax percentage
|
||||
and amount appear automatically after entering either the :guilabel:`Total` or the
|
||||
:guilabel:`Quantity`.
|
||||
|
||||
.. note::
|
||||
When a tax is configured on an expense category, the :guilabel:`Included Taxes` value will
|
||||
update in real time as the :guilabel:`Total` or :guilabel:`Quantity` is updated.
|
||||
|
||||
- :guilabel:`Employee`: using the drop-down menu, select the employee this expense is for.
|
||||
- :guilabel:`Paid By`: click the radio button to indicate who paid for the expense and should be
|
||||
reimbursed. If the employee paid for the expense (and should be reimbursed) select
|
||||
:guilabel:`Employee (to reimburse)`. If the company paid directly instead (e.g. if the company
|
||||
credit card was used to pay for the expense) select :guilabel:`Company`. Depending on the expense
|
||||
category selected, this field may not appear.
|
||||
- :guilabel:`Bill Reference`: if there is any reference text that should be included for the
|
||||
expense, enter it in this field.
|
||||
- :guilabel:`Expense Date`: using the calendar module, enter the date the expense was incurred. Use
|
||||
the :guilabel:`< (left)` and :guilabel:`> (right)` arrows to navigate to the correct month, then
|
||||
click on the specific day to enter the selection.
|
||||
- :guilabel:`Account`: select the expense account that this expense should be logged on from the
|
||||
drop-down menu.
|
||||
- :guilabel:`Customer to Reinvoice`: if the expense is something that should be paid for by a
|
||||
customer, select the :abbr:`SO (Sales Order)` and customer that will be invoiced for this expense
|
||||
from the drop-down menu. All sales orders in the drop-down menu list both the :abbr:`SO (Sales
|
||||
Order)` as well as the company the sales order is written for, but after the expense is saved, the
|
||||
customer name disappears and only the :abbr:`SO (Sales Order)` is visible on the expense.
|
||||
|
||||
.. example::
|
||||
A customer wishes to have an on-site meeting for a custom garden (design and installation) and
|
||||
agrees to pay for the expenses associated with it (such as travel, hotel, meals, etc.). All
|
||||
expenses tied to that meeting would indicate the sales order for the custom garden (which also
|
||||
references the customer) as the :guilabel:`Customer to Reinvoice`.
|
||||
|
||||
- :guilabel:`Analytic Distribution`: select the accounts the expense should be written against from
|
||||
the drop-down menu for either :guilabel:`Projects`, :guilabel:`Departments`, or both. Multiple
|
||||
accounts can be listed for each category, if needed. Adjust the percentage for each analytic
|
||||
account by typing in the percentage value next to the account.
|
||||
- :guilabel:`Company`: if multiple companies are set up, select the company this expense should be
|
||||
filed for from the drop-down menu. The current company automatically populates this field.
|
||||
- :guilabel:`Notes...`: if any notes are needed to clarify the expense, enter them in this field.
|
||||
|
||||
.. image:: expenses/expense-filled-in.png
|
||||
:align: center
|
||||
:alt: A filled in expense form for a client lunch.
|
||||
|
||||
Attach a receipt
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
After the expense is created, the next step is to attach a receipt. Click the :guilabel:`Attach
|
||||
Receipt` button, and a file explorer appears. Navigate to the receipt to be attached, and click
|
||||
:guilabel:`Open`. The new receipt is recorded in the chatter, and the number of receipts will appear
|
||||
next to the :guilabel:`📎 (paperclip)` icon beneath the expense form. More than one receipt can be
|
||||
attached to an individual expense, as needed. The number of receipts attached to the expense will be
|
||||
noted on the paperclip icon.
|
||||
|
||||
.. image:: expenses/receipt-icon.png
|
||||
:align: center
|
||||
:alt: Attach a receipt and it appears in the chatter.
|
||||
|
||||
Create new expenses from a scanned receipt
|
||||
------------------------------------------
|
||||
|
||||
Rather than manually inputting all of the information for an expense, expenses can be created by
|
||||
scanning a PDF receipt.
|
||||
|
||||
First, in the main :guilabel:`Expenses` app dashboard view (this view can also be accessed from
|
||||
:menuselection:`Expenses app --> My Expenses --> My Expenses`), click :guilabel:`Scan`, and a file
|
||||
explorer pops up. Navigate to the receipt to be uploaded, click on it to select it, and then click
|
||||
:guilabel:`Open`.
|
||||
|
||||
.. image:: expenses/scan.png
|
||||
:align: center
|
||||
:alt: Create an expense by scanning a receipt. Click Scan at the top of the Expenses dashboard
|
||||
view.
|
||||
|
||||
The receipt is scanned, and a new entry is created with today's date as the :guilabel:`Expense
|
||||
Date`, and any other fields it can populate based on the scanned data, such as the total. Click on
|
||||
the new entry to open the individual expense form, and make any changes needed. The scanned receipt
|
||||
appears in the chatter.
|
||||
|
||||
Automatically create new expenses from an email
|
||||
-----------------------------------------------
|
||||
|
||||
Instead of individually creating each expense in the *Expenses* app, expenses can be automatically
|
||||
created by sending an email to an email alias.
|
||||
|
||||
To do so, first, an email alias needs to be configured. Go to :menuselection:`Expenses app -->
|
||||
Configuration --> Settings`. Ensure :guilabel:`Incoming Emails` is enabled.
|
||||
|
||||
.. image:: expenses/email-alias.png
|
||||
:align: center
|
||||
:alt: Create the domain alias by clicking the link.
|
||||
|
||||
.. note::
|
||||
If the domain alias needs to be set up, :guilabel:`Setup your domain alias` will appear beneath
|
||||
the incoming emails check box instead of the email address field. Refer to this documentation for
|
||||
setup instructions and more information:
|
||||
:doc:`/applications/websites/website/configuration/domain_names`. Once the domain alias is
|
||||
configured, the email address field will be visible beneath the incoming emails section.
|
||||
|
||||
Next, enter the email address to be used in the email field, and then click :guilabel:`Save`. Now
|
||||
that the email address has been entered, emails can be sent to that alias to create new expenses
|
||||
without having to be in the Odoo database.
|
||||
|
||||
To submit an expense via email, create a new email and enter the product's *internal reference* code
|
||||
(if available) and the amount of the expense in the email subject. Next, attach the receipt to the
|
||||
email. Odoo creates the expense by taking the information in the email subject and combining it with
|
||||
the receipt.
|
||||
|
||||
To check an expense categories internal reference, go to :menuselection:`Expenses app -->
|
||||
Configuration --> Expense Categories`. If an internal reference is listed on the expense category,
|
||||
it is listed in the :guilabel:`Internal Reference` column.
|
||||
|
||||
.. image:: expenses/ref.png
|
||||
:align: center
|
||||
:alt: Internal reference numbers are listed in the main Expense Categories view.
|
||||
|
||||
To add an internal reference on an expense category, click on the category to open the form. Enter
|
||||
the internal reference in the field. Beneath the :guilabel:`Internal Reference` field, this sentence
|
||||
appears: :guilabel:`Use this reference as a subject prefix when submitting by email.`
|
||||
|
||||
.. image:: expenses/mileage-internal-reference.png
|
||||
:align: center
|
||||
:alt: Internal reference numbers are listed in the main Expense Products view.
|
||||
|
||||
.. note::
|
||||
For security purposes, only authenticated employee emails are accepted by Odoo when creating an
|
||||
expense from an email. To confirm an authenticated employee email address, go to the employee
|
||||
card in the :menuselection:`Employees` app, and refer to the :guilabel:`Work Email`
|
||||
|
||||
.. image:: expenses/authenticated-email-address.png
|
||||
:align: center
|
||||
:alt: Create the domain alias by clicking the link.
|
||||
|
||||
.. example::
|
||||
If submitting an expense via email for a $25.00 meal during a work trip, the email subject would
|
||||
be `FOOD $25.00`.
|
||||
|
||||
Explanation:
|
||||
|
||||
- The :guilabel:`Internal Reference` for the expense category `Meals` is `FOOD`
|
||||
- The :guilabel:`Cost` for the expense is `$25.00`
|
||||
|
||||
.. _expenses/approve:
|
||||
|
||||
Approve expenses
|
||||
================
|
||||
|
||||
In Odoo, not just anyone can approve expense reports— only users with the necessary rights (or
|
||||
permissions) can. This means that a user must have at least *Team Approver* rights for the
|
||||
*Expenses* app. Employees with the necessary rights can review expense reports, approve or reject
|
||||
them, and provide feedback thanks to the integrated communication tool.
|
||||
|
||||
To see who has rights to approve, go to the main :menuselection:`Settings` app and click on
|
||||
:guilabel:`Manage Users`.
|
||||
|
||||
.. note::
|
||||
If the *Settings* app is not available, then certain rights are not set on the account. Check the
|
||||
:guilabel:`Access Rights` tab of a user's card in the :menuselection:`Settings` app. the
|
||||
:guilabel:`Administration` section (bottom right of the :guilabel:`Access Rights` tab) is set to
|
||||
one of three options:
|
||||
|
||||
- :guilabel:`None (blank)`: the user cannot access the *Settings* app at all.
|
||||
- :guilabel:`Access Rights`: the user can only view the :guilabel:`User's & Companies` section of
|
||||
the *Settings* app.
|
||||
- :guilabel:`Settings`: the user has access to the entire *Settings* app with no restrictions.
|
||||
|
||||
Please refer to :doc:`this document </applications/general/users>` to learn more about managing
|
||||
users and their access rights.
|
||||
|
||||
Click on an individual to view their card, which displays the :guilabel:`Access Rights` tab in the
|
||||
default view. Scroll down to the :guilabel:`Human Resources` section. Under :guilabel:`Expenses`,
|
||||
there are four options:
|
||||
|
||||
- :guilabel:`None (blank)`: a blank field means the user has no rights to view or approve expense
|
||||
reports, and can only view their own.
|
||||
- :guilabel:`Team Approver`: the user can only view and approve expense reports for their own
|
||||
specific team.
|
||||
- :guilabel:`All Approver`: the user can view and approve any expense report.
|
||||
- :guilabel:`Administrator`: the user can view and approve any expense report, as well as access the
|
||||
reporting and configuration menus in the *Expenses* app.
|
||||
|
||||
Users who are able to approve expense reports (typically managers) can easily view all expense
|
||||
reports they have access rights to. Go to :menuselection:`Expenses app --> Expense Reports`, and a
|
||||
list appears with all expense reports that have a status of either :guilabel:`To Submit`,
|
||||
:guilabel:`Submitted`, :guilabel:`Approved`, :guilabel:`Posted`, or :guilabel:`Done`. Expense
|
||||
reports with a status of :guilabel:`Refused` are hidden in the default view.
|
||||
|
||||
.. image:: expenses/expense-reports-list.png
|
||||
:align: center
|
||||
:alt: Reports to validate are found on the Reports to Approve page.
|
||||
|
||||
When viewing expense reports, there is a panel of filters that can be enabled (or disabled) on the
|
||||
left side. The three categories where filters can be applied on are :guilabel:`Status`,
|
||||
:guilabel:`Employee`, and :guilabel:`Company`. To view only expense reports with a particular
|
||||
status, enable the specific status filter to display the expense reports with only that status.
|
||||
Disable the specific status filter to hide the reports with that status. To view expense reports for
|
||||
a particular employee and/or company, enable the specific employee name filter and/or company filter
|
||||
in the :guilabel:`Employee` and :guilabel:`Company` sections.
|
||||
|
||||
Reports can be approved in two ways (individually or several at once), and refused only one way. To
|
||||
approve multiple expense reports at once, remain in the list view. First, select the reports to
|
||||
approve by ticking the checkbox next to each report, or tick the checkbox next to
|
||||
:guilabel:`Employee` to select all the reports in the list.
|
||||
|
||||
.. important::
|
||||
Only reports with a status of :guilabel:`Submitted` can be approved. It is recommended to only
|
||||
display the submitted reports by adjusting the status filter on the left side by only having the
|
||||
:guilabel:`Submitted` filter enabled.
|
||||
|
||||
If a report is selected that is unable to be approved, the :guilabel:`Approve Report` button
|
||||
does **not** appear, indicating there is a problem with the selected report.
|
||||
|
||||
Next, click the :guilabel:`Approve Report` button.
|
||||
|
||||
.. image:: expenses/approve-report.png
|
||||
:align: center
|
||||
:alt: Approve multiple reports by clicking the checkboxes next to each report.
|
||||
|
||||
To approve an individual report, click on a report to go to a detailed view of that report. In this
|
||||
view, several options are presented: :guilabel:`Approve`, :guilabel:`Report in Next Payslip`,
|
||||
:guilabel:`Refuse`, or :guilabel:`Reset to draft`. Click :guilabel:`Approve` to approve the report.
|
||||
|
||||
If :guilabel:`Refuse` is clicked, a pop-up window appears. Enter a brief explanation for the refusal
|
||||
in the :guilabel:`Reason to Refuse Expense` field, and then click :guilabel:`Refuse`.
|
||||
|
||||
.. image:: expenses/refuse-expense.png
|
||||
:align: center
|
||||
:alt: Send messages in the chatter.
|
||||
|
||||
Team managers can easily view all the expense reports for their team members. While in the
|
||||
:guilabel:`Expense Reports` view, click the drop-down arrow in the right-side of the search box, and
|
||||
click on :guilabel:`My Team` in the :guilabel:`Filters` section. This presents all the reports for
|
||||
the manager's team.
|
||||
|
||||
.. image:: expenses/my-team-filter.png
|
||||
:align: center
|
||||
:alt: Select the My Team filter.
|
||||
|
||||
.. tip::
|
||||
If more information is needed, such as a missing receipt, communication is easy from the chatter.
|
||||
In an individual report, simply click :guilabel:`Send message` to open the message text box. Type
|
||||
in a message, tagging the proper person (if needed), and post it to the chatter by clicking
|
||||
:guilabel:`Send`. The message is posted in the chatter, and the person tagged will be notified
|
||||
via email of the message, as well as any followers.
|
||||
|
||||
The only people that can be tagged in a message are *followers*. To see who is a follower, click
|
||||
on the :guilabel:`👤 (person)` icon to display the followers of the expense.
|
||||
|
||||
.. image:: expenses/chatter.png
|
||||
:align: center
|
||||
:alt: Send messages in the chatter.
|
||||
|
||||
.. _expenses/post:
|
||||
|
||||
Post expenses in accounting
|
||||
===========================
|
||||
|
||||
Once an expense report is approved, the next step is to post the report to the accounting journal.
|
||||
To view all expense reports, go to :menuselection:`Expenses app --> Expense Reports`. To view only
|
||||
the expense reports that have been approved and need to be posted, adjust the filters on the left
|
||||
side so that only the :guilabel:`Approved` status is enabled.
|
||||
|
||||
.. image:: expenses/post-reports.png
|
||||
:align: center
|
||||
:alt: View reports to post by clicking on expense reports, then reports to post.
|
||||
|
||||
Just like approvals, expense reports can be posted in two ways (individually or several at once). To
|
||||
post multiple expense reports at once, remain in the list view. First, select the reports to post by
|
||||
ticking the checkbox next to each report, or tick the checkbox next to :guilabel:`Employee` to
|
||||
select all the reports in the list. Next, click :guilabel:`Post Entries`.
|
||||
|
||||
.. image:: expenses/post-entries.png
|
||||
:align: center
|
||||
:alt: Post multiple reports at a time from the Expense Reports view, with the Approved filter.
|
||||
|
||||
To post an individual report, click on a report to go to the detailed view of that report. In this
|
||||
view, several options are presented: :guilabel:`Post Journal Entries`, :guilabel:`Report In Next
|
||||
Payslip`, :guilabel:`Refuse`, or :guilabel:`Reset to Draft`. Click :guilabel:`Post Journal Entries`
|
||||
to post the report.
|
||||
|
||||
If :guilabel:`Refuse` is clicked, a pop-up window appears. Enter a brief explanation for the refusal
|
||||
in the :guilabel:`Reason to Refuse Expense` field, and then click :guilabel:`Refuse`. Refused
|
||||
reports can be viewed by going to :menuselection:`Expenses app --> Expense Reports`, then adjusting
|
||||
the filters on the left so that only :guilabel:`Refused` is selected. This will only show the
|
||||
refused expense reports.
|
||||
|
||||
.. important::
|
||||
To post expense reports to an accounting journal, the user must have following access rights:
|
||||
|
||||
- Accounting: Accountant or Adviser
|
||||
- Expenses: Manager
|
||||
|
||||
.. _expenses/reimburse:
|
||||
|
||||
Reimburse employees
|
||||
===================
|
||||
|
||||
After an expense report is posted to an accounting journal, the next step is to reimburse the
|
||||
employee. To view all the expense reports to pay, go to :menuselection:`Expenses app --> Expense
|
||||
Reports --> Reports To Pay`.
|
||||
|
||||
.. image:: expenses/reports-to-pay.png
|
||||
:align: center
|
||||
:alt: View reports to pay by clicking on expense reports, then reports to pay.
|
||||
|
||||
Just like approvals and posting, expense reports can be paid in two ways (individually or several at
|
||||
once). To pay multiple expense reports at once, remain in the list view. First, select the reports
|
||||
to pay by ticking the checkbox next to each report, or tick the checkbox next to
|
||||
:guilabel:`Employee` to select all the reports in the list. Next, click :guilabel:`Register
|
||||
Payment`.
|
||||
|
||||
.. image:: expenses/register-payment.png
|
||||
:align: center
|
||||
:alt: Post multiple reports by selecting them, clicking the gear, and then post the entries.
|
||||
|
||||
To pay an individual report, click on a report to go to a detailed view of that report. Click
|
||||
:guilabel:`Register Payment` to pay the employee.
|
||||
|
||||
A :guilabel:`Register Payment` pop-up appears, and the :guilabel:`Journal`, :guilabel:`Payment
|
||||
Method`, and :guilabel:`Payment Date` can be modified, if needed. When the selections are correct,
|
||||
click :guilabel:`Create Payment` to send the payment to the employee.
|
||||
|
||||
To pay an individual report, click on a report in the list view to go to a detailed view of that
|
||||
report. Click :guilabel:`Register Payment` to pay the employee. A :guilabel:`Register Payment`
|
||||
pop-up appears, but when paying an individual expense report instead of several at once, more
|
||||
options appear in the pop-up. In addition to the :guilabel:`Journal`, :guilabel:`Payment Method`,
|
||||
and :guilabel:`Payment Date` fields, a :guilabel:`Recipient Bank Account`, :guilabel:`Amount`, and
|
||||
:guilabel:`Memo` field appear. Select the employee's bank account from the drop-down menu to
|
||||
directly deposit the payment to their account. When all other selections are correct, click
|
||||
:guilabel:`Create Payment` to send the payment to the employee.
|
||||
|
||||
.. image:: expenses/two-payment-posting-options.png
|
||||
:align: center
|
||||
:alt: Different options appear when registering an individual expense report versus multiple
|
||||
expense reports at once.
|
||||
|
||||
Re-invoice expenses to customers
|
||||
================================
|
||||
|
||||
If expenses are tracked on customer projects, expenses can be automatically charged back to the
|
||||
customer. This is done by creating an expense, referencing the :abbr:`SO (Sales Order)` the expense
|
||||
should be added to, and then creating the expense report. Next, managers approve the expense report,
|
||||
and the accounting department posts the journal entries. Finally, once the expense report is posted
|
||||
to a journal, the expenses appear on the :abbr:`SO (Sales Order)` that was referenced. The sales
|
||||
order can then be invoiced, thus invoicing the customer for the expense.
|
||||
|
||||
Setup
|
||||
-----
|
||||
|
||||
First, specify the invoicing policy for each expense category. Go to :menuselection:`Expenses app
|
||||
--> Configuration --> Expense Categories`. Click on the expense category to open the expense
|
||||
category form. Under the :guilabel:`Invoicing` section, click the radio button next to the desired
|
||||
selection for :guilabel:`Re-Invoicing Expenses`. Options are :guilabel:`None`, :guilabel:`At cost`,
|
||||
and :guilabel:`Sales price`.
|
||||
|
||||
:guilabel:`Re-Invoicing Expenses`:
|
||||
|
||||
- :guilabel:`None`: Expense category will not be re-invoiced.
|
||||
- :guilabel:`At cost`: Expense category will invoice expenses at their real cost.
|
||||
- :guilabel:`At sales price`: Expense category will invoice the price set on the sale order.
|
||||
|
||||
Create an expense
|
||||
-----------------
|
||||
|
||||
First, when :ref:`creating a new expense <expenses/new>`, the correct information needs to be
|
||||
entered to re-invoice a customer. Select the sales order the expense should appear on in the
|
||||
:guilabel:`Customer to Reinvoice` section, from the drop-down menu. Next, select the
|
||||
:guilabel:`Analytic Account` the expense should be posted to. After the expenses are created, the
|
||||
expense report needs to be :doc:`created <expenses/expense_reports>`, and :ref:`submitted
|
||||
<expenses/submit>`, as usual.
|
||||
|
||||
.. image:: expenses/reinvoice-expense.png
|
||||
:align: center
|
||||
:alt: Ensure the customer to be invoiced is called out on the expense.
|
||||
|
||||
.. important::
|
||||
Selecting a :guilabel:`Customer to Reinvoice` when creating an expense is critical, since this is
|
||||
what causes the expenses to be automatically invoiced after an expense report is approved.
|
||||
|
||||
The :guilabel:`Customer to Reinvoice` field can be modified *until an expense report is*
|
||||
**approved**, then the field is no longer able to be modified.
|
||||
|
||||
Validate and post expenses
|
||||
--------------------------
|
||||
|
||||
Only employees with permissions (typically, managers or supervisors) can :ref:`approve expenses
|
||||
<expenses/approve>`. Before approving an expense report, ensure the :guilabel:`Analytic
|
||||
Distribution` is set on every expense line of a report. If an :guilabel:`Analytic Distribution` is
|
||||
missing, assign the correct accounts from the drop-down menu, and click :guilabel:`Approve` or
|
||||
:guilabel:`Refuse`.
|
||||
|
||||
The accounting department is typically responsible for :ref:`posting journal entries
|
||||
<expenses/post>`. Once an expense report is approved, it can then be posted. The :abbr:`SO (Sales
|
||||
Order)` is **only** updated *after the journal entries are posted*. One the journal entries are
|
||||
posted, the expenses now appear on the referenced :abbr:`SO (Sales Order)`.
|
||||
|
||||
Invoice expenses
|
||||
----------------
|
||||
|
||||
Once the :abbr:`SO (Sales Order)` has been updated, it is time to invoice the customer. After the
|
||||
expense report has been approved and the journal entries have been posted, click the
|
||||
:guilabel:`Sales Orders` smart button to open the :abbr:`SO (Sales Order)`. The expenses to be
|
||||
re-invoiced are now on the :abbr:`SO (Sales Order)`.
|
||||
|
||||
.. image:: expenses/sales-order.png
|
||||
:align: center
|
||||
:alt: After the expense report is posted to the journal entry, the sales order can be called up
|
||||
by clicking on the sales order number.
|
||||
|
||||
.. note::
|
||||
More than one :abbr:`SO (Sales Order)` can be referenced on an expense report. If more than one
|
||||
:abbr:`SO (Sales Order)` is referenced, the :guilabel:`Sales Orders` smart button will list the
|
||||
number of :abbr:`SO (Sales Order)`'s. If multiple :abbr:`SO (Sales Order)`'s are listed, the
|
||||
:guilabel:`Sales Orders` smart button opens a list view of all the :abbr:`SO (Sales Order)`'s on
|
||||
the expense report. Click on a :abbr:`SO (Sales Order)` to open the individual :abbr:`SO (Sales
|
||||
Order)`.
|
||||
|
||||
The expenses are listed in the :abbr:`SO (Sales Order)` :guilabel:`Order Lines` tab.
|
||||
|
||||
.. image:: expenses/so-details.png
|
||||
:align: center
|
||||
:alt: See the expenses listed on the sales order after clicking into it.
|
||||
|
||||
Next, click :guilabel:`Create Invoice`, and select if the invoice is for a :guilabel:`Regular
|
||||
invoice`, a :guilabel:`Down payment (percentage)`, or a :guilabel:`Down payment (fixed amount)` by
|
||||
clicking the radio button next to it. Then, click :guilabel:`Create Invoice`. The customer has now
|
||||
been invoiced for the expenses.
|
||||
|
||||
.. seealso::
|
||||
:doc:`expenses/expense_reports`
|
||||
- :doc:`expenses/log_expenses`
|
||||
- :doc:`expenses/expense_reports`
|
||||
- :doc:`expenses/post_expenses`
|
||||
- :doc:`expenses/reimburse`
|
||||
- :doc:`expenses/reinvoice_expenses`
|
||||
|
||||
.. toctree::
|
||||
:titlesonly:
|
||||
|
||||
|
||||
expenses/approve_expenses
|
||||
expenses/log_expenses
|
||||
expenses/expense_reports
|
||||
expenses/post_expenses
|
||||
expenses/reimburse
|
||||
expenses/reinvoice_expenses
|
||||
|
||||
@@ -0,0 +1,119 @@
|
||||
================
|
||||
Approve expenses
|
||||
================
|
||||
|
||||
In Odoo, not just anyone can approve expense reports, only users with the necessary rights (or
|
||||
permissions) can. This means that a user **must** have at least *Team Approver* rights for the
|
||||
*Expenses* app. Employees with the necessary rights can review expense reports, approve or reject
|
||||
them, and provide feedback thanks to the integrated communication tool.
|
||||
|
||||
Please refer to the :doc:`access rights documentation </applications/general/users>` to learn more
|
||||
about managing users and their access rights.
|
||||
|
||||
View expense reports
|
||||
====================
|
||||
|
||||
Users who are able to approve expense reports, typically managers, can easily view all expense
|
||||
reports they have access rights to. Go to :menuselection:`Expenses app --> Expense Reports`, to view
|
||||
the :guilabel:`All Reports` dashboard.
|
||||
|
||||
A list of all expense reports with a status of either :guilabel:`To Submit`, :guilabel:`Submitted`,
|
||||
:guilabel:`Approved`, :guilabel:`Posted`, or :guilabel:`Done` appears. Expense reports with a status
|
||||
of :guilabel:`Refused` are hidden, by default.
|
||||
|
||||
.. image:: approve_expenses/expense-reports-list.png
|
||||
:align: center
|
||||
:alt: Reports to validate are found on the Reports to Approve page.
|
||||
|
||||
Approve expense reports
|
||||
=======================
|
||||
|
||||
Expense reports can be approved in two ways: :ref:`individually <expenses/individual>` or :ref:`in
|
||||
bulk <expenses/multiple>`.
|
||||
|
||||
.. important::
|
||||
Only reports with a status of :guilabel:`Submitted` can be approved.
|
||||
|
||||
It is recommended to display only :guilabel:`Submitted` reports by ticking the checkbox beside
|
||||
the :guilabel:`Submitted` filter, in the left column, under the :guilabel:`Status` section.
|
||||
|
||||
If a report is **not** able to be approved, the :guilabel:`Approve Report` button **does not**
|
||||
appear on the :guilabel:`All Reports` page.
|
||||
|
||||
.. _expenses/individual:
|
||||
|
||||
Approve individual reports
|
||||
--------------------------
|
||||
|
||||
To approve an individual report, navigate to :menuselection:`Expenses app --> Expense Reports`, and
|
||||
click on an individual report to view the report form.
|
||||
|
||||
From here, several options are presented: :guilabel:`Approve`, :guilabel:`Refuse`, and
|
||||
:guilabel:`Reset to draft`.
|
||||
|
||||
Click :guilabel:`Approve` to approve the report.
|
||||
|
||||
.. _expenses/multiple:
|
||||
|
||||
Approve multiple reports
|
||||
------------------------
|
||||
|
||||
To approve multiple expense reports at once, first navigate to :menuselection:`Expenses app -->
|
||||
Expense Reports` to view a list of expense reports. Next, select the reports to approve by ticking
|
||||
the checkbox next to each report being approved, or tick the checkbox next to the
|
||||
:guilabel:`Employee` column title to select all the reports in the list.
|
||||
|
||||
Next, click the :guilabel:`Approve Report` button.
|
||||
|
||||
.. image:: approve_expenses/approve-report.png
|
||||
:align: center
|
||||
:alt: Approve multiple reports by clicking the checkboxes next to each report.
|
||||
|
||||
.. tip::
|
||||
It is possible for team managers to view all the expense reports for just their team members.
|
||||
|
||||
To do so, while on the :guilabel:`All Reports` page, click the :icon:`fa-caret-down`
|
||||
:guilabel:`(down arrow)` to the right of the search bar, then click :guilabel:`My Team` in the
|
||||
:icon:`fa-filter` :guilabel:`Filters` section.
|
||||
|
||||
This presents all the reports for only the manager's team.
|
||||
|
||||
.. image:: approve_expenses/my-team-filter.png
|
||||
:align: center
|
||||
:alt: Select the My Team filter.
|
||||
|
||||
Refuse expense reports
|
||||
======================
|
||||
|
||||
Expense reports can **only** be refused on the individual expense report, and **not** from the
|
||||
:guilabel:`All Reports` dashboard. To open an individual expense report, navigate to
|
||||
:menuselection:`Expenses app --> Expense Reports`, then click on an individual expense report to
|
||||
view the report form.
|
||||
|
||||
If more information is needed, such as a missing receipt, communicate any necessary information
|
||||
requests in the *chatter* of the report form. On the individual expense report, click
|
||||
:guilabel:`Send message` to open a message text box.
|
||||
|
||||
Type in a message, tagging the proper people, and post it to the *chatter* by clicking
|
||||
:guilabel:`Send`. The message is posted in the chatter, and the tagged people are notified, via
|
||||
email.
|
||||
|
||||
.. note::
|
||||
The only people that can be tagged in a message are *followers* of the specific report. To see
|
||||
who is a follower, click the :icon:`fa-user-o` :guilabel:`(user)` icon to display the followers
|
||||
of the expense report.
|
||||
|
||||
.. image:: approve_expenses/chatter.png
|
||||
:align: center
|
||||
:alt: Send messages in the chatter.
|
||||
|
||||
To refuse an expense report, click :guilabel:`Refuse`, and a :guilabel:`Refuse Expense` pop-up
|
||||
window appears. Enter a brief explanation for the refusal beneath the :guilabel:`REASON TO REFUSE
|
||||
EXPENSE` field, then click :guilabel:`Refuse`.
|
||||
|
||||
.. image:: approve_expenses/refuse-expense.png
|
||||
:align: center
|
||||
:alt: Send messages in the chatter.
|
||||
|
||||
Once the expense report is refused, the status changes to :guilabel:`Refused`, and the only button
|
||||
that appears in the top-left is :guilabel:`Reset to Draft`.
|
||||
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 7.6 KiB |
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 18 KiB |
@@ -11,6 +11,8 @@ Expenses are color-coded by status. Any expense with a status of :guilabel:`To R
|
||||
that still need to be added to an expense report) is shown in blue text. All other statuses
|
||||
(:guilabel:`To Submit`, :guilabel:`Submitted`, and :guilabel:`Approved`) the text appears in black.
|
||||
|
||||
.. _expenses/create_report:
|
||||
|
||||
Create expense reports
|
||||
======================
|
||||
|
||||
@@ -68,7 +70,7 @@ An :guilabel:`Add: Expense Lines` pop-up window appears, displaying all the avai
|
||||
a :guilabel:`To Submit` status) that can be added to the report.
|
||||
|
||||
If a new expense needs to be added that does **not** appear on the list, click :guilabel:`New` to
|
||||
:ref:`create a new expense <expenses/new>` and add it to the report.
|
||||
:doc:`create a new expense <../expenses/log_expenses>` and add it to the report.
|
||||
|
||||
Tick the checkbox next to each expense being added, then click :guilabel:`Select`.
|
||||
|
||||
@@ -121,5 +123,7 @@ Click on a report to open it, then click :guilabel:`Submit To Manager`. After su
|
||||
the next step is to wait for the manager to approve it.
|
||||
|
||||
.. important::
|
||||
The :ref:`expenses/approve`, :ref:`expenses/post`, and :ref:`expenses/reimburse` sections are
|
||||
**only** for users with the appropriate *access rights*.
|
||||
:doc:`Approving <../expenses/approve_expenses>` expenses, :doc:`posting
|
||||
<../expenses/post_expenses>` expenses, and :doc:`reimbursing <../expenses/reimburse>` expenses
|
||||
are **only** for users with the appropriate :doc:`access rights documentation
|
||||
</applications/general/users>`.
|
||||
|
||||
@@ -0,0 +1,230 @@
|
||||
============
|
||||
Log expenses
|
||||
============
|
||||
|
||||
Before expenses can be reimbursed, each individual expense needs to be logged in the database.
|
||||
Expense records can be created in three different ways: :ref:`manually enter an expense record
|
||||
<expenses/manual_expense>`, :ref:`upload a receipt <expenses/upload_receipt>`, or :ref:`email a
|
||||
receipt <expenses/email_expense>` to a preconfigured email address.
|
||||
|
||||
.. _expenses/manual_expense:
|
||||
|
||||
Manually enter expenses
|
||||
=======================
|
||||
|
||||
To record a new expense, open the :menuselection:`Expenses app`, which displays the :guilabel:`My
|
||||
Expenses` page, by default.
|
||||
|
||||
.. tip::
|
||||
This view can also be accessed from :menuselection:`Expenses app --> My Expenses --> My
|
||||
Expenses`.
|
||||
|
||||
Then, click :guilabel:`New`, and then fill out the following fields on the form that appears:
|
||||
|
||||
- :guilabel:`Description`: Enter a short description for the expense. This should be concise and
|
||||
informative, such as `lunch with client` or `hotel for conference`.
|
||||
- :guilabel:`Category`: Select the expense category from the drop-down menu that most closely
|
||||
corresponds to the expense.
|
||||
- :guilabel:`Total`: Enter the total amount paid for the expense in one of two ways:
|
||||
|
||||
#. If the expense is for a single item/expense, and the category selected was for a single item,
|
||||
enter the cost in the :guilabel:`Total` field (the :guilabel:`Quantity` field is hidden).
|
||||
#. If the expense is for multiples of the same item/expense with a fixed price, the
|
||||
:guilabel:`Unit Price` is displayed. Enter the quantity in the :guilabel:`Quantity` field, and
|
||||
the total cost is automatically updated with the correct total. The total cost appears below
|
||||
the :guilabel:`Quantity`.
|
||||
|
||||
.. example::
|
||||
In the case of mileage driven, the :guilabel:`Unit Price` is populated as the cost *per
|
||||
mile*. Set the :guilabel:`Quantity` to the *number of miles driven*, and the total is
|
||||
calculated.
|
||||
|
||||
- :guilabel:`Included Taxes`: If taxes were configured on the expense category, the tax percentage
|
||||
and amount appear automatically after entering either the :guilabel:`Total` or the
|
||||
:guilabel:`Quantity`.
|
||||
|
||||
.. note::
|
||||
When a tax is configured on an expense category, the :guilabel:`Included Taxes` value updates
|
||||
in real time, as the :guilabel:`Total` or :guilabel:`Quantity` is updated.
|
||||
|
||||
- :guilabel:`Employee`: Using the drop-down menu, select the employee this expense is for.
|
||||
- :guilabel:`Paid By`: Click the radio button to indicate who paid for the expense, and should be
|
||||
reimbursed. Select either :guilabel:`Employee (to reimburse)` or :guilabel:`Company`. Depending on
|
||||
the expense category selected, this field may not appear.
|
||||
- :guilabel:`Expense Date`: Using the calendar popover window that appears when this field is
|
||||
clicked, enter the date the expense was incurred.
|
||||
- :guilabel:`Account`: Using the drop-down menu, select the expense account the expense should be
|
||||
logged in.
|
||||
- :guilabel:`Customer to Reinvoice`: If the expense is something that should be paid for by a
|
||||
customer, select the :abbr:`SO (Sales Order)` and customer that should be invoiced for this
|
||||
expense from the drop-down menu. All sales orders in the drop-down menu list both the :abbr:`SO
|
||||
(Sales Order)`, as well as the company the sales order is written for. After the expense is saved,
|
||||
the customer name disappears, and only the :abbr:`SO (Sales Order)` is visible on the expense.
|
||||
|
||||
.. example::
|
||||
A customer wishes to have an on-site meeting for the design and installation of a custom
|
||||
garden, and agrees to pay for the expenses associated with it (such as travel, hotel, meals,
|
||||
etc). All expenses tied to that meeting would indicate the sales order for the custom garden
|
||||
(which also references the customer) as the :guilabel:`Customer to Reinvoice`.
|
||||
|
||||
- :guilabel:`Analytic Distribution`: Select the account the expense should be written against from
|
||||
the drop-down menu for either :guilabel:`Projects`, :guilabel:`Departments`, or both. Multiple
|
||||
accounts can be listed for each category, if needed. Adjust the percentage for each analytic
|
||||
account by typing in the percentage value next to each account.
|
||||
- :guilabel:`Company`: If multiple companies are set up, select the company the expense should be
|
||||
filed for from the drop-down menu. The current company automatically populates this field.
|
||||
- :guilabel:`Notes...`: If any notes are needed to clarify the expense, enter them in the notes
|
||||
field.
|
||||
|
||||
.. image:: log_expenses/expense-filled-in.png
|
||||
:align: center
|
||||
:alt: A filled in expense form for a client lunch.
|
||||
|
||||
Attach receipts
|
||||
---------------
|
||||
|
||||
After the expense record is created, the next step is to attach a receipt. Click the
|
||||
:guilabel:`Attach Receipt` button, and a file explorer appears. Navigate to the receipt to be
|
||||
attached, and click :guilabel:`Open`.
|
||||
|
||||
The new receipt is recorded in the *chatter*, and the number of receipts appears next to the
|
||||
:icon:`fa-paperclip` :guilabel:`(paperclip)` icon. Multiple receipts can be attached to an
|
||||
individual expense record, as needed.
|
||||
|
||||
.. image:: log_expenses/receipt-icon.png
|
||||
:align: center
|
||||
:alt: Attach a receipt and it appears in the chatter.
|
||||
|
||||
.. _expenses/upload_receipt:
|
||||
|
||||
Upload expenses
|
||||
===============
|
||||
|
||||
It is possible to have expense records created automatically, by uploading a PDF receipt. This
|
||||
feature requires the enabling of a setting, and the purchasing of :abbr:`IAP (in-app purchases)`
|
||||
credits.
|
||||
|
||||
Digitalization settings
|
||||
-----------------------
|
||||
|
||||
To enable receipt scanning, navigate to :menuselection:`Expenses app --> Configuration -->
|
||||
Settings`, and tick the checkbox beside the :guilabel:`Expense Digitization (OCR)` option. Then,
|
||||
click :guilabel:`Save`. When enabled, additional options appear. Click on the corresponding radio
|
||||
button to select one of the following options:
|
||||
|
||||
- :guilabel:`Do not digitize`: turns off receipt digitization.
|
||||
- :guilabel:`Digitize on demand only`: only digitizes receipts when requested. A
|
||||
:guilabel:`Digitize document` button appears on expense records. When clicked, the receipt is
|
||||
scanned and the expense record is updated.
|
||||
- :guilabel:`Digitize automatically`: automatically digitizes all receipts when they are uploaded.
|
||||
|
||||
Beneath these options are two additional links. Click the :icon:`fa-arrow-right` :guilabel:`Buy
|
||||
credits` link to purchase credits for receipt digitization. Click the :icon:`fa-arrow-right`
|
||||
:guilabel:`View My Services` link to view a list of all current services, and their remaining credit
|
||||
balances.
|
||||
|
||||
For more information on document digitization and :abbr:`IAPs (in-app purchases)`, refer to the
|
||||
:doc:`In-app purchase (IAP) <../../essentials/in_app_purchase>` documentation.
|
||||
|
||||
.. note::
|
||||
When the :guilabel:`Expense Digitization (OCR)` option is enabled, a necessary module is
|
||||
installed, so receipts can be scanned. Disabling this option uninstalls the module.
|
||||
|
||||
If, at some point, there is a desire to temporarily stop digitizing receipts, select the
|
||||
:guilabel:`Do not digitize` option. The reason this option is available is so the module is not
|
||||
uninstalled, allowing for digitization to be enabled in the future by selecting one of the other
|
||||
two options.
|
||||
|
||||
Upload receipts
|
||||
---------------
|
||||
|
||||
Open the :guilabel:`Expenses app`, and from the :guilabel:`My Expenses` dashboard, click
|
||||
:guilabel:`Upload`, and a file explorer appears. Navigate to the desired receipt, select it, then
|
||||
click :guilabel:`Open`.
|
||||
|
||||
.. image:: log_expenses/upload.png
|
||||
:align: center
|
||||
:alt: Create an expense by scanning a receipt. Click Scan at the top of the Expenses dashboard
|
||||
view.
|
||||
|
||||
The receipt is scanned, and a new expense record is created. The :guilabel:`Expense Date` field is
|
||||
populated with today's date, along with any other fields based on the scanned data, such as the
|
||||
:guilabel:`Total`.
|
||||
|
||||
Click on the new entry to open the individual expense form, and make any changes, if needed. The
|
||||
scanned receipt appears in the *chatter*.
|
||||
|
||||
.. _expenses/email_expense:
|
||||
|
||||
Email expenses
|
||||
==============
|
||||
|
||||
Instead of individually creating each expense in the **Expenses** app, expenses can be automatically
|
||||
created by sending an email to an email alias.
|
||||
|
||||
To do so, an email alias must first be configured. Navigate to :menuselection:`Expenses app -->
|
||||
Configuration --> Settings`. Ensure the checkbox beside :guilabel:`Incoming Emails` is ticked. The
|
||||
default email alias is *expense@(domain).com*. Change the email alias by entering the desired email
|
||||
in the field to the right of :guilabel:`Alias`. Then, click :guilabel:`Save`.
|
||||
|
||||
.. image:: log_expenses/alias-email.png
|
||||
:align: center
|
||||
:alt: Te default email that populates the expenses email alias.
|
||||
|
||||
.. note::
|
||||
If the domain alias needs to be set up, :icon:`fa-arrow-right` :guilabel:`Setup your domain
|
||||
alias` appears beneath the :guilabel:`Incoming Emails` checkbox, instead of the email address
|
||||
field.
|
||||
|
||||
.. image:: log_expenses/email-alias.png
|
||||
:align: center
|
||||
:alt: Create the domain alias by clicking the link.
|
||||
|
||||
Refer to the :doc:`/applications/websites/website/configuration/domain_names` documentation for
|
||||
setup instructions and more information.
|
||||
|
||||
Once the domain alias is configured, the email address field is visible beneath the
|
||||
:guilabel:`Incoming Emails` feature on the :guilabel:`Settings` page in the **Expenses** app.
|
||||
|
||||
Once the email address has been entered, emails can be sent to that alias to create new expenses,
|
||||
without having to be in the Odoo database.
|
||||
|
||||
To submit an expense via email, create a new email, and enter the product's *internal reference*
|
||||
code (if available) and the amount of the expense as the subject of the email. Next, attach the
|
||||
receipt to the email. Odoo creates the expense by taking the information in the email subject, and
|
||||
combining it with the receipt.
|
||||
|
||||
To check an expense category's internal reference, go to :menuselection:`Expenses app -->
|
||||
Configuration --> Expense Categories`. If an internal reference is listed on the expense category,
|
||||
it is listed in the :guilabel:`Internal Reference` column.
|
||||
|
||||
.. image:: log_expenses/ref.png
|
||||
:align: center
|
||||
:alt: Internal reference numbers are listed in the main Expense Categories view.
|
||||
|
||||
To add an internal reference on an expense category, click on the category to open the expense
|
||||
category form. Enter the :guilabel:`Internal Reference` in the corresponding field. Beneath the
|
||||
:guilabel:`Internal Reference` field, this sentence appears: :guilabel:`Use this reference as a
|
||||
subject prefix when submitting by email.`
|
||||
|
||||
.. image:: log_expenses/mileage-internal-reference.png
|
||||
:align: center
|
||||
:alt: Internal reference numbers are listed in the main Expense Products view.
|
||||
|
||||
.. example::
|
||||
If submitting an expense, via email, for a $25.00 meal during a work trip, the email subject
|
||||
would be `FOOD $25.00`.
|
||||
|
||||
Explanation:
|
||||
|
||||
- The :guilabel:`Internal Reference` for the expense category `Meals` is `FOOD`
|
||||
- The :guilabel:`Cost` for the expense is `$25.00`
|
||||
|
||||
.. note::
|
||||
For security purposes, only authenticated employee emails are accepted by Odoo when creating an
|
||||
expense from an email. To confirm an authenticated employee email address, go to the employee
|
||||
card in the :menuselection:`Employees app`, and refer to the :guilabel:`Work Email` field.
|
||||
|
||||
.. image:: log_expenses/authenticated-email-address.png
|
||||
:align: center
|
||||
:alt: Create the domain alias by clicking the link.
|
||||
|
After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 3.6 KiB |
|
After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 8.5 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 14 KiB |
@@ -0,0 +1,75 @@
|
||||
=============
|
||||
Post expenses
|
||||
=============
|
||||
|
||||
Once an expense report is :doc:`approved <../expenses/approve_expenses>`, the next step is to post
|
||||
the expense report to the proper accounting journal.
|
||||
|
||||
.. important::
|
||||
To post expense reports to an accounting journal, the user **must** have the following
|
||||
:doc:`access rights <../../general/users/access_rights>`:
|
||||
|
||||
- Accounting: *Accountant* or *Adviser*
|
||||
- Expenses: *Manager*
|
||||
|
||||
Only expense reports with an *Approved* status can post the expenses to a journal. To view all
|
||||
expense reports, navigate to :menuselection:`Expenses app --> Expense Reports`. Next, to view
|
||||
**only** approved expense reports that need to be posted, adjust the filters on the left side, so
|
||||
only the :guilabel:`Approved` checkbox is ticked.
|
||||
|
||||
.. image:: post_expenses/post-reports.png
|
||||
:align: center
|
||||
:alt: View reports to post by clicking on expense reports, then reports to post.
|
||||
|
||||
.. note::
|
||||
The default :guilabel:`All Reports` dashboard displays all expense reports, except reports with a
|
||||
status of :guilabel:`Refused`.
|
||||
|
||||
Expense reports can be posted to accounting journals in two ways: :ref:`individually
|
||||
<expenses/individual-reports>` or :ref:`in bulk <expenses/multiple-reports>`.
|
||||
|
||||
.. _expenses/individual-reports:
|
||||
|
||||
Post individual reports
|
||||
-----------------------
|
||||
|
||||
To post an individual report, navigate to :menuselection:`Expenses app --> Expense Reports`, and
|
||||
click on an individual report with a :guilabel:`Status` of :guilabel:`Approved`, to view the report
|
||||
form. In this view, several options are presented: :guilabel:`Post Journal Entries`,
|
||||
:guilabel:`Report In Next Payslip`, :guilabel:`Refuse`, or :guilabel:`Reset to Draft`.
|
||||
|
||||
Click :guilabel:`Post Journal Entries` to post the report.
|
||||
|
||||
The accounting journal the expenses are posted to is listed in the :guilabel:`Journal` field of the
|
||||
expense report.
|
||||
|
||||
After posting the expenses to an accounting journal, a :guilabel:`Journal Entry` smart button
|
||||
appears at the top of the screen. Click the :guilabel:`Journal Entry` smart button, and the details
|
||||
for the journal entry appear, with a status of :guilabel:`Posted`.
|
||||
|
||||
.. _expenses/multiple-reports:
|
||||
|
||||
Post multiple reports
|
||||
---------------------
|
||||
|
||||
To post multiple expense reports at once, navigate to :menuselection:`Expenses app --> Expense
|
||||
Reports` to view a list of expense reports. Next, select the reports to approve by ticking the
|
||||
checkbox next to each report being approved.
|
||||
|
||||
.. note::
|
||||
Only expense reports with a status of :guilabel:`Approved` are able to post the expenses to an
|
||||
accounting journal. If an expense report is selected that **cannot** be posted, such as an
|
||||
unapproved report, or the report has already been posted to a journal, the :guilabel:`Post
|
||||
Entries` button is **not** visible.
|
||||
|
||||
.. tip::
|
||||
To select **only** approved expense reports, adjust the filters on the left side, so that only
|
||||
the :guilabel:`Approved` checkbox is ticked. Next, tick the checkbox next to the
|
||||
:guilabel:`Employee` column title to select **all** the :guilabel:`Approved` reports in the list
|
||||
at once.
|
||||
|
||||
Next, click the :guilabel:`Post Entries` button.
|
||||
|
||||
.. image:: post_expenses/post-entries.png
|
||||
:align: center
|
||||
:alt: Post multiple reports at a time from the Expense Reports view, with the Approved filter.
|
||||
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 13 KiB |
@@ -0,0 +1,140 @@
|
||||
===================
|
||||
Reimburse employees
|
||||
===================
|
||||
|
||||
After an expense report is :doc:`posted to an accounting journal <../expenses/post_expenses>`, the
|
||||
next step is to reimburse the employee. Just like approving and posting expenses, employees can be
|
||||
reimbursed in two ways: with cash, check, or direct deposit (:ref:`individually
|
||||
<expenses/reimburse-single>` or :ref:`in bulk <expenses/reimburse-bulk>`), or :ref:`reimbursed in a
|
||||
payslip <expenses/reimburse-payslip>`.
|
||||
|
||||
Settings
|
||||
========
|
||||
|
||||
Reimbursements can be paid via paycheck, check, cash, or bank transfer. To set up payment options,
|
||||
first configure the various settings by navigating to :menuselection:`Expenses app -->
|
||||
Configuration --> Settings`.
|
||||
|
||||
To reimburse employees for expenses :ref:`in their paychecks <expenses/reimburse-payslip>`, tick the
|
||||
checkbox beside the :guilabel:`Reimburse in Payslip` option in the :guilabel:`Expenses` section.
|
||||
|
||||
Next, set how payments are made in the :guilabel:`Accounting` section. Click the drop-down menu
|
||||
under :guilabel:`Payment Methods`, and select the desired payment option. Default options include
|
||||
paying by :guilabel:`Manual (Cash)`, :guilabel:`Checks (Bank)`, :guilabel:`NACHA (Bank)`, and
|
||||
others. Leaving this field blank allows for **all** available payment options to be used.
|
||||
|
||||
When all desired configurations are complete, click :guilabel:`Save` to activate the settings.
|
||||
|
||||
.. _expenses/reimburse-single:
|
||||
|
||||
Reimburse individually
|
||||
======================
|
||||
|
||||
To reimburse an individual expense report, first navigate to :menuselection:`Expenses app -->
|
||||
Expense Reports`. All expense reports are presented in a default list view. Click on the expense
|
||||
report being reimbursed to view the report details.
|
||||
|
||||
.. important::
|
||||
**Only** expense reports with a status of :guilabel:`Posted` can be reimbursed.
|
||||
|
||||
Click the :guilabel:`Register Payment` button in the top-left corner of the expense report, and a
|
||||
:guilabel:`Register Payment` pop-up window appears. Enter the following information in the pop-up
|
||||
window:
|
||||
|
||||
- :guilabel:`Journal`: Select the accounting journal to post the payment to using the drop-down
|
||||
menu. The default options are :guilabel:`Bank` or :guilabel:`Cash`.
|
||||
- :guilabel:`Payment Method`: Select how the payment is made using the drop-down menu. If
|
||||
:guilabel:`Cash` is selected for the :guilabel:`Journal`, the only option available is
|
||||
:guilabel:`Manual`. If :guilabel:`Bank` is selected for the :guilabel:`Journal`, the default
|
||||
options are :guilabel:`Manual` or :guilabel:`Checks`.
|
||||
- :guilabel:`Recipient Bank Account`: Select the employee's bank account the payment is being sent
|
||||
to. If the employee has a bank account on file in the :ref:`Private Information tab
|
||||
<employees/private-info>` of their employee form in the **Employees** app, that bank account
|
||||
populates this field, by default.
|
||||
- :guilabel:`Amount`: The total amount being reimbursed populates this field, by default. The
|
||||
currency, located to the right of the field, can be modified using the drop-down menu.
|
||||
- :guilabel:`Payment Date`: Enter the date the payments are issued in this field. The current date
|
||||
populates this field, by default.
|
||||
- :guilabel:`Memo`: The text entered in the :doc:`Expense Report Summary
|
||||
<../expenses/expense_reports>` field of the expense report populates this field, by default.
|
||||
|
||||
.. image:: reimburse/payment.png
|
||||
:align: center
|
||||
:alt: The Register Payment pop-up window filled out for an individual expense report
|
||||
reimbursement.
|
||||
|
||||
When the fields of the pop-up window are completed, click the :guilabel:`Create Payment` button to
|
||||
register the payment, and reimburse the employee.
|
||||
|
||||
.. _expenses/reimburse-bulk:
|
||||
|
||||
Reimburse in bulk
|
||||
=================
|
||||
|
||||
To reimburse multiple expense reports at once, navigate to :menuselection:`Expenses app --> Expense
|
||||
Reports` to view all expense reports in a list view. Next, adjust the :guilabel:`STATUS` filters on
|
||||
the left side to only present expense reports with a status of :guilabel:`Posted`.
|
||||
|
||||
.. tip::
|
||||
Adjusting the :guilabel:`STATUS` filters to only show :guilabel:`Posted` expense reports is not
|
||||
necessary, but removes the step of selecting each individual report in the list.
|
||||
|
||||
Tick the checkbox next to the :guilabel:`Employee` column title to select all the reports in the
|
||||
list. Once ticked, the number of selected expense reports appears at the top of the page
|
||||
(:guilabel:`(#) Selected`). Additionally, a :guilabel:`Register Payment` button also appears in the
|
||||
upper-left corner.
|
||||
|
||||
.. image:: reimburse/multiple-reports.png
|
||||
:align: center
|
||||
:alt: Expense reports filtered by the status Posted, making the Register Payment button visible.
|
||||
|
||||
Click the :guilabel:`Register Payment` button, and a :guilabel:`Register Payment` pop-up window
|
||||
appears. Enter the following information in the pop-up window:
|
||||
|
||||
- :guilabel:`Journal`: Select the accounting journal the payment should be posted to, using the
|
||||
drop-down menu. The default options are :guilabel:`Bank` or :guilabel:`Cash`.
|
||||
- :guilabel:`Payment Method`: Select how the payment is made using the drop-down menu. If
|
||||
:guilabel:`Cash` is selected for the :guilabel:`Journal`, the only option available is
|
||||
:guilabel:`Manual`. If :guilabel:`Bank` is selected for the :guilabel:`Journal`, the default
|
||||
options are :guilabel:`Manual` or :guilabel:`Checks`.
|
||||
- :guilabel:`Group Payments`: When multiple expense reports are selected for the same employee, this
|
||||
option appears. Tick the checkbox to have only one payment made, rather than issuing multiple
|
||||
payments to the same employee.
|
||||
- :guilabel:`Payment Date`: Enter the date the payments are issued. The current date populates this
|
||||
field, by default.
|
||||
|
||||
.. image:: reimburse/register.png
|
||||
:align: center
|
||||
:alt: The Register Payment pop-up window filled out.
|
||||
|
||||
When the fields on the pop-up window are completed, click the :guilabel:`Create Payments` button to
|
||||
register the payments, and reimburse the employees.
|
||||
|
||||
.. _expenses/reimburse-payslip:
|
||||
|
||||
Report in next payslip
|
||||
======================
|
||||
|
||||
If the *Reimburse in Payslip* option is activated on the *Settings* page, payments can be added to
|
||||
their next payslip, instead of issued manually.
|
||||
|
||||
.. important::
|
||||
Reimbursing expenses on payslips can **only** be done individually, on an expense report with a
|
||||
status of *Approved*. Once an expense report has a status of *Posted*, the option to reimburse in
|
||||
the following payslip does **not** appear.
|
||||
|
||||
Navigate to :menuselection:`Expenses app --> Expense Reports`, and click on the individual expense
|
||||
report being reimbursed on the following paycheck. Click the :guilabel:`Report in Next Payslip`
|
||||
smart button, and the expenses are added to the next payslip issued for that employee. Additionally,
|
||||
a message is logged in the chatter stating the expense is added to the following payslip.
|
||||
|
||||
.. image:: reimburse/pay-via-payslip.png
|
||||
:align: center
|
||||
:alt: The Report in Next Payslip button, visible with an expense report status of Approved.
|
||||
|
||||
The status for the expense report remains :guilabel:`Approved`. The status only changes to
|
||||
:guilabel:`Posted` (and then :guilabel:`Done`), when the paycheck is processed.
|
||||
|
||||
.. seealso::
|
||||
Refer to the :doc:`Payslips <../../hr/payroll/payslips>` documentation for more information about
|
||||
processing paychecks.
|
||||
|
After Width: | Height: | Size: 46 KiB |
|
After Width: | Height: | Size: 47 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 48 KiB |
|
Before Width: | Height: | Size: 15 KiB |
@@ -0,0 +1,151 @@
|
||||
===================
|
||||
Re-invoice expenses
|
||||
===================
|
||||
|
||||
If expenses are tracked on customer projects, they can be automatically charged back to the
|
||||
customer. This is done by :ref:`creating an expense <expenses/reinvoice-create>`, referencing the
|
||||
sales order the expense is added to, and then :ref:`creating an expense report
|
||||
<expenses/reinvoice-report>`.
|
||||
|
||||
Next, managers :ref:`approve the expense report <expenses/reinvoice-approve>`, before the accounting
|
||||
department :ref:`posts the journal entries <expenses/reinvoice-approve>`.
|
||||
|
||||
Finally, once the expense report is posted to a journal, the expenses appears on the specified
|
||||
:abbr:`SO (Sales Order)`. The :abbr:`SO (Sales Order)` is then :ref:`invoiced <expenses/reinvoice>`,
|
||||
thus charging the customer for the expenses.
|
||||
|
||||
.. important::
|
||||
Approving expenses, posting expenses to accounting, and reinvoicing expenses on :abbr:`SOs (Sales
|
||||
Orders)` is **only** possible for users with the appropriate :doc:`access rights
|
||||
<../../general/users/access_rights>`.
|
||||
|
||||
.. seealso::
|
||||
This document provides lower-level instructions for the creation, submission, approval, and
|
||||
posting of expenses. For fully-detailed instructions for any of these steps, refer to the
|
||||
following documentation:
|
||||
|
||||
- :doc:`Log expenses <../expenses/log_expenses>`
|
||||
- :doc:`Expense reports <../expenses/expense_reports>`
|
||||
- :doc:`Approving expenses <../expenses/approve_expenses>`
|
||||
- :doc:`Posting expenses in accounting <../expenses/post_expenses>`
|
||||
|
||||
Setup
|
||||
=====
|
||||
|
||||
First, specify the invoicing policy for each expense category. Navigate to :menuselection:`Expenses
|
||||
app --> Configuration --> Expense Categories`. Click on an expense category to view the expense
|
||||
category form. Under the :guilabel:`INVOICING` section, click the radio button next to the desired
|
||||
selection for :guilabel:`Re-Invoice Expenses`:
|
||||
|
||||
- :guilabel:`No`: The expense category cannot be re-invoiced.
|
||||
- :guilabel:`At cost`: The expense category invoices expenses at the cost set on the expense
|
||||
category form.
|
||||
- :guilabel:`Sales price`: The expense category invoices at the sales price set on the expense form.
|
||||
|
||||
.. _expenses/reinvoice-create:
|
||||
|
||||
Create an expense
|
||||
=================
|
||||
|
||||
First, when :doc:`creating a new expense <../expenses/log_expenses>`, the correct information needs
|
||||
to be entered to re-invoice the expense to a customer. Using the drop-down menu, select the
|
||||
:abbr:`SO (Sales Order)` to add the expense to in the :guilabel:`Customer to Reinvoice` field.
|
||||
|
||||
Next, select the :guilabel:`Analytic Distribution` the expense is posted to. Multiple accounts can
|
||||
be selected, if desired.
|
||||
|
||||
To add another :guilabel:`Analytic Distribution`, click on the line to reveal the
|
||||
:guilabel:`Analytic` pop-over window. Click :guilabel:`Add a line`, then select the desired
|
||||
:guilabel:`Analytic Distribution` from the drop-down field. If selecting more than one
|
||||
:guilabel:`Analytic Distribution`, the :guilabel:`Percentage` fields **must** be modified. By
|
||||
default, both fields are populated with `100%`. Adjust the percentages for all the fields, so the
|
||||
total of all selected accounts equals `100%`.
|
||||
|
||||
.. example::
|
||||
A painting company agrees to paint an office building that houses two different companies. During
|
||||
the estimate, a meeting is held at the office location to discuss the project.
|
||||
|
||||
Both companies agree to pay for the travel expenses for the painting company employees. When
|
||||
creating the expenses for the mileage and hotels, **both companies** are listed in the
|
||||
:guilabel:`Analytic Distribution` line, for 50% each.
|
||||
|
||||
.. _expenses/reinvoice-report:
|
||||
|
||||
Create an expense report
|
||||
========================
|
||||
|
||||
After the expenses are created, the expense report must be :ref:`created <expenses/create_report>`
|
||||
and :ref:`submitted <expenses/submit>`, in the same manner as all other expenses.
|
||||
|
||||
Once the expense report is submitted, a :icon:`fa-money` :guilabel:`Sales Orders` smart button
|
||||
appears at the top-center of both the expense report, and each individual expense record being
|
||||
reinvoiced.
|
||||
|
||||
.. image:: reinvoice_expenses/reinvoice-expense.png
|
||||
:align: center
|
||||
:alt: Ensure the customer to be invoiced is called out on the expense.
|
||||
|
||||
.. important::
|
||||
Selecting the proper :abbr:`SO (Sales Order)` in the :guilabel:`Customer to Reinvoice` field is
|
||||
**critical**, since this is how expenses are automatically invoiced after an expense report is
|
||||
approved.
|
||||
|
||||
The :guilabel:`Customer to Reinvoice` field can be modified *only* until an expense report is
|
||||
**approved**. After an expense report is approved, the :guilabel:`Customer to Reinvoice` field is
|
||||
no longer able to be modified.
|
||||
|
||||
.. _expenses/reinvoice-approve:
|
||||
|
||||
Approve and post expenses
|
||||
=========================
|
||||
|
||||
Before :doc:`approving an expense report <../expenses/approve_expenses>`, ensure the
|
||||
:guilabel:`Analytic Distribution` section is populated for every expense line.
|
||||
|
||||
If an :guilabel:`Analytic Distribution` entry is missing, assign the correct accounts from the
|
||||
drop-down menu, then click :guilabel:`Approve`.
|
||||
|
||||
.. image:: reinvoice_expenses/analytic-dist.png
|
||||
:align: center
|
||||
:alt: The expense report with all the Analytic Distribution lines populated.
|
||||
|
||||
.. note::
|
||||
The :guilabel:`Approve` button **only** appears after an expense report has been :ref:`submitted
|
||||
<expenses/submit>`.
|
||||
|
||||
The accounting department is typically responsible for :doc:`posting journal entries
|
||||
<../expenses/post_expenses>`. To post expenses to an accounting journal, click :guilabel:`Post
|
||||
Journal Entries`. Once an expense report is approved, it can then be posted.
|
||||
|
||||
The :abbr:`SO (Sales Order)` is **only** updated *after* the journal entries are posted. Once the
|
||||
journal entries are posted, the expenses now appear on the referenced :abbr:`SO (Sales Order)`.
|
||||
|
||||
.. _expenses/reinvoice:
|
||||
|
||||
Invoice expenses
|
||||
================
|
||||
|
||||
After the expense report has been approved, and the journal entries have been posted, the :abbr:`SO
|
||||
(Sales Order)` is updated, and the customer can be invoiced.
|
||||
|
||||
Select the expense report, and click the :icon:`fa-money` :guilabel:`Sales Orders` smart button to
|
||||
open the :abbr:`SO (Sales Order)`. The expenses to be re-invoiced now appear on the :abbr:`SO (Sales
|
||||
Order)`.
|
||||
|
||||
.. note::
|
||||
More than one :abbr:`SO (Sales Order)` can be referenced on an expense report. If more than one
|
||||
:abbr:`SO (Sales Order)` is referenced, clicking the :guilabel:`Sales Orders` smart button opens
|
||||
a list displaying all the :abbr:`SOs (Sales Order)` associated with that expense report. Click on
|
||||
a :abbr:`SO (Sales Order)` to open the individual :abbr:`SO (Sales Order)` details.
|
||||
|
||||
The expenses are listed in the :abbr:`SO (Sales Order)` :guilabel:`Order Lines` tab.
|
||||
|
||||
.. image:: reinvoice_expenses/so-details.png
|
||||
:align: center
|
||||
:alt: See the expenses listed on the sales order after clicking into it.
|
||||
|
||||
Next, click :guilabel:`Create Invoice`, and a :guilabel:`Create invoices` pop-up window appears.
|
||||
Select if the invoice is a :guilabel:`Regular invoice`, a :guilabel:`Down payment (percentage)`, or
|
||||
a :guilabel:`Down payment (fixed amount)`. Then, click :guilabel:`Create Draft Invoice`. Doing so
|
||||
creates a draft invoice for the customer. Click :guilabel:`Confirm` to confirm the invoice, and the
|
||||
customer is invoiced for the expenses.
|
||||
|
After Width: | Height: | Size: 53 KiB |
|
After Width: | Height: | Size: 43 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 9.1 KiB |
|
Before Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 7.5 KiB |
@@ -152,7 +152,7 @@ Electrónicos)` incoming email server.
|
||||
.. important::
|
||||
In order to receive your SII documents, it's necessary to set up your own email server. More
|
||||
information on how to do this can be found in this documentation:
|
||||
:doc:`../../general/email_communication/email_servers`
|
||||
:doc:`../../general/email_communication`
|
||||
|
||||
Begin by clicking :guilabel:`Configure DTE Incoming Email`, then click :guilabel:`New` to add a
|
||||
server and fill in the following fields:
|
||||
@@ -511,6 +511,9 @@ Once the invoice is accepted and validated by the :abbr:`SII (Servicio de Impues
|
||||
the PDF is printed, it includes the fiscal elements that indicate that the document is fiscally
|
||||
valid.
|
||||
|
||||
.. image:: chile/accepted-invoice-fiscal-information.png
|
||||
:alt: Fiscal elements and barcode printed in accepted invoices.
|
||||
|
||||
.. important::
|
||||
If you are hosted in Odoo SH or On-Premise, you should manually install the `pdf417gen
|
||||
<https://pypi.org/project/pdf417gen/>`_ library. Use the following command to install it:
|
||||
@@ -1228,6 +1231,10 @@ taxpayers, and that replaces the *Purchase and Sales Books*. This report is inte
|
||||
Register (CR) and the Sales Register (RV). Its purpose is to support the transactions related to
|
||||
VAT, improving its control and declaration.
|
||||
|
||||
.. important::
|
||||
The *Propuesta F29 (CL)* report in Odoo covers the basic legal requirements as a first proposal
|
||||
for your final tax declaration.
|
||||
|
||||
This record is supplied by the electronic tax documents (DTE's) that have been received by the
|
||||
:abbr:`SII (Servicio de Impuestos Internos)`.
|
||||
|
||||
|
||||
|
After Width: | Height: | Size: 69 KiB |
@@ -58,7 +58,10 @@ checkbox.
|
||||
:alt: FPS bank account configuration.
|
||||
|
||||
.. important::
|
||||
The account holder's country **must** be set to `Hong Kong` on their contact form.
|
||||
- The account holder's country must be set to `Hong Kong` on its contact form.
|
||||
- The account holder's city is mandatory.
|
||||
- You could also include the invoice number in the QR code by checking the :guilabel:`Include
|
||||
Reference` checkbox.
|
||||
|
||||
.. seealso::
|
||||
:doc:`../accounting/bank`
|
||||
|
||||
@@ -22,7 +22,8 @@ which you want to activate PayNow. Set the :guilabel:`Proxy Type` and fill in th
|
||||
Value` field depending on the type you chose.
|
||||
|
||||
.. important::
|
||||
- The account holder's country must be set to Singapore on its contact form.
|
||||
- The account holder's country must be set to `Singapore` on its contact form.
|
||||
- The account holder's city is mandatory.
|
||||
- You could also include the invoice number in the QR code by checking the :guilabel:`Include
|
||||
Reference` checkbox.
|
||||
|
||||
|
||||
@@ -48,6 +48,7 @@ Here is the list of Spanish-specific statement reports available:
|
||||
- EC Sales List;
|
||||
- Tax Report (Modelo 111);
|
||||
- Tax Report (Modelo 115);
|
||||
- Tax Report (Modelo 130);
|
||||
- Tax Report (Modelo 303);
|
||||
- Tax Report (Modelo 347);
|
||||
- Tax Report (Modelo 349);
|
||||
@@ -59,6 +60,38 @@ selecting its Spain-specific version: :guilabel:`(ES)`.
|
||||
.. image:: spain/modelo-reports.png
|
||||
:alt: Spain-specific tax reports.
|
||||
|
||||
Modelo 130
|
||||
----------
|
||||
|
||||
Change the percentage
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
If you wish to change the percentage computation of the box :guilabel:`[04]` under the :guilabel:`I`
|
||||
section and/or of the box :guilabel:`[09]` under the :guilabel:`II` section:
|
||||
|
||||
#. Activate the :ref:`developer mode <developer-mode>`, go to :menuselection:`Accounting -->
|
||||
Reporting --> Tax Report`, and select the report :guilabel:`Tax report (Modelo 130)`.
|
||||
#. Click the :icon:`fa-cogs` (:guilabel:`cogs`) icon to the right of :guilabel:`Report: Tax Report
|
||||
(Mod 130) (ES)`.
|
||||
#. Click the box you wish to change, and in the pop-up window, click on the :guilabel:`percentage`
|
||||
line. In the new pop-up window, change the value in the :guilabel:`Formula` field to the
|
||||
percentage you wish to apply.
|
||||
Repeat this action if you wish to modify the other box as well.
|
||||
|
||||
Report agriculture activity
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
If you wish to have any amount input in the :guilabel:`II` section (from boxes :guilabel:`[08]` to
|
||||
:guilabel:`[11]`), you must change the **industry** of the corresponding contact to
|
||||
:guilabel:`Agriculture`:
|
||||
|
||||
#. Go to the contact form (:menuselection:`Accounting --> Customers --> Customers`
|
||||
or :menuselection:`Accounting --> Vendors --> Vendors`, for example), and select a contact.
|
||||
#. In the :guilabel:`Sales & Purchase` tab, set the :guilabel:`Industry` field to
|
||||
:guilabel:`Agriculture`.
|
||||
|
||||
Repeat this operation for all contacts related to the **agriculture** industry.
|
||||
|
||||
TicketBAI
|
||||
=========
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 8.9 KiB |
@@ -135,6 +135,7 @@ which you want to activate PromptPay QR. Set the :guilabel:`Proxy Type` and fill
|
||||
:guilabel:`Proxy Value` field depending on the chosen type.
|
||||
|
||||
.. important::
|
||||
- The account holder's city is mandatory.
|
||||
- The :guilabel:`Include Reference` checkbox doesn't work for PromptPay QR codes.
|
||||
|
||||
.. image:: thailand/qr-promptpay-bank.png
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
United Kingdom
|
||||
==============
|
||||
|
||||
.. _united-kingdom/modules:
|
||||
|
||||
Configuration
|
||||
=============
|
||||
|
||||
@@ -23,10 +25,9 @@ Reports` modules to get all the features of the UK localization.
|
||||
- `l10n_uk_reports`
|
||||
- - Accounting reports for the UK
|
||||
- Allows sending the tax report via the MTD-VAT API to HMRC.
|
||||
|
||||
.. image:: united_kingdom/uk.png
|
||||
:align: center
|
||||
:alt: Odoo uk packages
|
||||
* - :guilabel:`UK BACS Payment Files`
|
||||
- `account_bacs`
|
||||
- Allows generating :ref:`united-kingdom/BACS-files` for bill and invoice payments
|
||||
|
||||
.. note::
|
||||
- Only UK-based companies can submit reports to HMRC.
|
||||
@@ -122,3 +123,95 @@ each submission:
|
||||
.. note::
|
||||
During this process, the :guilabel:`Connect to HMRC` button no longer appears for other UK-based
|
||||
companies.
|
||||
|
||||
.. _united-kingdom/BACS-files:
|
||||
|
||||
Bacs files
|
||||
==========
|
||||
|
||||
:abbr:`Bacs (Bankers' Automated Clearing Services)` files are electronic files used in the UK to
|
||||
process payments and transfers between bank accounts.
|
||||
|
||||
To enable the use of Bacs files, make sure the :ref:`UK BACS Payment Files <united-kingdom/modules>`
|
||||
module is installed, then:
|
||||
|
||||
#. Configure your Bacs Service User Number:
|
||||
|
||||
#. Go to :menuselection:`Accounting --> Configuration --> Settings` and scroll down to the
|
||||
:guilabel:`Customer Payments` section.
|
||||
#. Enter your :guilabel:`Service User Number` under :guilabel:`BACS` and manually save.
|
||||
|
||||
#. Configure your **bank** journal:
|
||||
|
||||
#. Go to :menuselection:`Accounting --> Configuration --> Journals` and select your **bank**
|
||||
journal.
|
||||
#. In the :guilabel:`Journal Entries` tab, configure the :guilabel:`Account Number` and
|
||||
:guilabel:`Bank` fields.
|
||||
#. In the :guilabel:`Incoming Payments` and :guilabel:`Outgoing Payments` tabs, make sure the
|
||||
:guilabel:`BACS Direct Debit` payment method is enabled.
|
||||
|
||||
#. Configure the contacts for whom you wish to use Bacs files: Access the contact form and, in
|
||||
the :guilabel:`Accounting` tab, click :guilabel:`Add a line` and fill in the
|
||||
:guilabel:`Account Number` and :guilabel:`Bank` fields.
|
||||
|
||||
Bill payments
|
||||
-------------
|
||||
|
||||
To generate Bacs files for bill payments, set the :guilabel:`Payment Method` to
|
||||
:guilabel:`BACS Direct Debit` when :ref:`registering vendor payments <batch-payments/register-payments>`.
|
||||
|
||||
Then, create a vendor batch payment:
|
||||
|
||||
#. Go to :menuselection:`Accounting --> Vendors --> Batch Payments`, and click :guilabel:`New`.
|
||||
#. Select the bank journal in the :guilabel:`Bank` field, set the :guilabel:`Payment Method` to
|
||||
:guilabel:`BACS Direct Credit`, and select a :guilabel:`BACS Processing Date`.
|
||||
#. Optionally, you can also:
|
||||
|
||||
- select a :guilabel:`BACS Expiry Date`;
|
||||
- enable :guilabel:`BACS Multi Mode` to process the payments on their individual date.
|
||||
|
||||
#. Click :guilabel:`Add a line`, select the payments you want to include, click :guilabel:`Select`,
|
||||
then :guilabel:`Validate`.
|
||||
|
||||
Once validated, the Bacs file is available in the chatter. You can also :guilabel:`Re-generate
|
||||
Export File` if you need a new Bacs file for that batch payment.
|
||||
|
||||
.. image:: united_kingdom/bacs-files.png
|
||||
:alt: Vendor Batch Payment view with generated BACS file.
|
||||
|
||||
Invoice payments
|
||||
----------------
|
||||
|
||||
Before generating Bacs files for invoice payments, you must first create a **BACS Direct Debit
|
||||
Instruction**: Go to :menuselection:`Accounting --> Customers --> BACS Direct Debit Instructions`
|
||||
and click :guilabel:`New`. Select a :guilabel:`Customer`, their :guilabel:`IBAN`, and the
|
||||
:guilabel:`Journal` you wish to use.
|
||||
|
||||
To generate Bacs files for invoice payments, set the :guilabel:`Payment Method` to
|
||||
:guilabel:`BACS Direct Debit` when :ref:`registering invoice payments <batch-payments/register-payments>`.
|
||||
|
||||
.. tip::
|
||||
If you register the payment for an invoice linked to a subscription or via
|
||||
:menuselection:`Accounting --> Customers --> Payments`, you can select the :guilabel:`BACS
|
||||
Payment Type`:
|
||||
|
||||
- :guilabel:`Direct debit-first collection of a series`;
|
||||
- :guilabel:`Direct debit single collection`;
|
||||
- :guilabel:`Direct debit repeating collection in a series`;
|
||||
- :guilabel:`Direct debit-final collection of a series`.
|
||||
|
||||
Then, create a customer batch payment:
|
||||
|
||||
#. Go to :menuselection:`Accounting --> Customers --> Batch Payments`, and click :guilabel:`New`.
|
||||
#. Select the bank journal in the :guilabel:`Bank` field, set the :guilabel:`Payment Method` to
|
||||
:guilabel:`BACS Direct Credit`, and select a :guilabel:`BACS Processing Date`.
|
||||
#. Optionally, you can also:
|
||||
|
||||
- select a :guilabel:`BACS Expiry Date`;
|
||||
- enable :guilabel:`BACS Multi Mode` to process the payments on their individual date.
|
||||
|
||||
#. Click :guilabel:`Add a line`, select the payments you want to include, click :guilabel:`Select`,
|
||||
then :guilabel:`Validate`.
|
||||
|
||||
Once validated, the Bacs file is available in the chatter. You can also :guilabel:`Re-generate
|
||||
Export File` if you need a new Bacs file for that batch payment.
|
||||
|
||||
|
After Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 12 KiB |
@@ -23,7 +23,8 @@ bank. Then set the :guilabel:`Proxy Type` and fill in the :guilabel:`Proxy Value
|
||||
the type you chose.
|
||||
|
||||
.. important::
|
||||
- The account holder's country must be set to Vietnam on its contact form.
|
||||
- The account holder's country must be set to `Vietnam` on its contact form.
|
||||
- The account holder's city is mandatory.
|
||||
- You could also include the invoice number in the QR code by checking the :guilabel:`Include
|
||||
Reference` checkbox.
|
||||
|
||||
|
||||
@@ -65,8 +65,8 @@ company to edit it.
|
||||
|
||||
.. tip::
|
||||
Activate the :ref:`developer mode <developer-mode>` to set social media accounts and
|
||||
company-specific email system parameters. See this documentation on
|
||||
:doc:`../marketing/social_marketing` and :ref:`email_servers/outbound`.
|
||||
company-specific email parameters. See this documentation on
|
||||
:doc:`../marketing/social_marketing` and :doc:`email_communication`.
|
||||
|
||||
Companies also have a :guilabel:`Parent Company` set on the company form in :ref:`developer mode
|
||||
<developer-mode>`.
|
||||
@@ -119,7 +119,7 @@ appears.
|
||||
.. tip::
|
||||
Activate the :ref:`developer mode <developer-mode>` to set social media accounts and
|
||||
company-specific email system parameters. See this documentation on
|
||||
:doc:`../marketing/social_marketing` and :ref:`email_servers/outbound`.
|
||||
:doc:`../marketing/social_marketing` and :doc:`email_communication`.
|
||||
|
||||
Branches also have a :guilabel:`Parent Company` set on the branch form in :ref:`developer mode
|
||||
<developer-mode>`. Accounting and fiscal localizations for the branch are set on the
|
||||
@@ -127,9 +127,10 @@ appears.
|
||||
menu, and go to :menuselection:`Settings app --> Accounting --> Fiscal Localization`.
|
||||
|
||||
.. danger::
|
||||
Adding a branch to a company triggers an upsell, should the database be in the *Standard* or
|
||||
*One App Free* pricing plans. Adding one or more branches constitutes a multi-company database,
|
||||
and needs to be moved to the *Custom* pricing plan.
|
||||
If the database is on the standard *Paid* pricing plan, adding a branch to a company triggers an
|
||||
upsell. Since adding one or more branches turns the database into a multi-company setup, it
|
||||
will need to switch to the *Custom* pricing plan. This does not affect databases on the *One-app
|
||||
free* plan.
|
||||
|
||||
For more information on pricing, see `Odoo's pricing <https://www.odoo.com/pricing-plan>`_ page.
|
||||
|
||||
|
||||
@@ -1,13 +1,110 @@
|
||||
:nosearch:
|
||||
:show-content:
|
||||
|
||||
===================
|
||||
Email communication
|
||||
===================
|
||||
==============================
|
||||
Communication in Odoo by email
|
||||
==============================
|
||||
|
||||
Communication in Odoo related to records such as CRM opportunities, sales orders, invoices, ...
|
||||
have a discussion thread called **chatter**, often displayed on the right side of the record.
|
||||
|
||||
On the chatter, you can send direct emails or Odoo notifications to the followers of a document
|
||||
(depending on their notification preferences), log internal notes, send WhatsApp messages or SMSes,
|
||||
and schedule activities.
|
||||
|
||||
If a follower replies to a message, the reply updates the chatter, and Odoo relays it to the
|
||||
followers as a notification. All emails - outgoing and incoming - appear in the same chatter.
|
||||
|
||||
.. _email-online-sh:
|
||||
|
||||
Odoo Online and Odoo.sh users
|
||||
=============================
|
||||
|
||||
On Odoo Online and Odoo.sh, outgoing and incoming emails work out of the box, **nothing needs to be
|
||||
done**. Everything is already configured on your subdomain.
|
||||
|
||||
By default, outgoing emails use the following :ref:`notification email address
|
||||
<email-outbound-notifications>` `notifications@company-name.odoo.com`.
|
||||
|
||||
.. _email-online-sh-domain:
|
||||
|
||||
Using another domain
|
||||
--------------------
|
||||
|
||||
If you prefer not to have outgoing emails sent from Odoo's subdomain `@company-name.odoo.com` but
|
||||
instead :ref:`from your own domain <email-outbound-custom-domain>`, **additional configuration will
|
||||
be necessary** on the domain and within Odoo. This introduces an extra layer of complexity and
|
||||
necessitates technical knowledge (mainly regarding DNS and mail protocols).
|
||||
|
||||
By adding a domain and configuring the administration access rights, you can also access the
|
||||
:ref:`new domain alias <email-outbound-alias-domain>` page to configure the alias of your companies.
|
||||
If only one domain is configured, this domain will be shared by all companies on the database.
|
||||
|
||||
If you want to keep using Odoo's mail server, you will have to :ref:`configure the SPF and DKIM
|
||||
<email-domain-spf>`.
|
||||
|
||||
If :ref:`you want to use your own mail server <email-outbound-custom-domain-smtp-server>`, you will
|
||||
have to follow the mail server provider's specific documentation.
|
||||
|
||||
For incoming emails, after adding your own domain, :ref:`replies from customers will come back to
|
||||
your domain <email-inbound-custom-domain>`, and you will need to use one of the three possible ways
|
||||
to get the emails back into Odoo (using either :ref:`incoming mail server
|
||||
<email-inbound-custom-domain-incoming-server>`, :ref:`redirection/forwarding
|
||||
<email-inbound-custom-domain-redirections>` or :ref:`DNS MX record
|
||||
<email-inbound-custom-domain-mx>`). Everything is covered in the :doc:`Manage inbound messages
|
||||
documentation <email_communication/email_servers_inbound>`.
|
||||
|
||||
.. _email-on-premise:
|
||||
|
||||
On-premise users
|
||||
================
|
||||
|
||||
If you are on-premise, you will have to completely configure your outgoing and incoming emails:
|
||||
|
||||
- For outgoing emails, you will need :ref:`to use an SMTP server and a custom domain
|
||||
<email-outbound-custom-domain-odoo-server>`.
|
||||
- For incoming emails, set the frequency at which you fetch new emails low enough for responsiveness
|
||||
but high enough in order not to stress your system or provider. Due to this reason and the
|
||||
simplicity of this configuration, we usually advise on using incoming mail servers. To use an SMTP
|
||||
server, check out the :ref:`"Use a custom domain for inbound messages" documentation
|
||||
<email-inbound-custom-domain>`.
|
||||
|
||||
.. _email-third-party-server:
|
||||
|
||||
Using a third-party provider's mail server
|
||||
==========================================
|
||||
|
||||
Odoo's documentation also covers several popular mail servers. As they require specific
|
||||
authorizations and configuration, they add a layer of complexity. For this reason, using Odoo's
|
||||
outgoing mail server is recommended.
|
||||
|
||||
- :doc:`Outlook documentation <email_communication/azure_oauth>`
|
||||
- :doc:`Gmail documentation <email_communication/google_oauth>`
|
||||
- :doc:`Mailjet documentation <email_communication/mailjet_api>`
|
||||
|
||||
.. note::
|
||||
Every provider has its own limitations. Research the desired provider *before* configuring it.
|
||||
For example, Outlook and Gmail might not be suitable for large marketing campaigns.
|
||||
|
||||
.. seealso::
|
||||
- :doc:`Activities <../essentials/activities>`
|
||||
- :doc:`Discuss app <../productivity/discuss>`
|
||||
- :doc:`Digest emails <companies/digest_emails>`
|
||||
- :doc:`Email Marketing app <../marketing/email_marketing>`
|
||||
- :doc:`Email templates <companies/email_template>`
|
||||
- :ref:`Expense creation using an email alias <expenses/email_expense>`
|
||||
- :ref:`Helpdesk ticket creation using an email alias <helpdesk/receiving_tickets/email-alias>`
|
||||
- :ref:`Lead creation using an email alias <crm/configure_email_alias>`
|
||||
- :ref:`Project task creation using an email alias <task_creation/email_alias>`
|
||||
- :doc:`Technical mail getaway for on-premise users
|
||||
<../../administration/on_premise/email_gateway>`
|
||||
- :ref:`Technical start of Odoo database with an outgoing mail server configured from the
|
||||
command-line interface <reference/cmdline/server/emails>`
|
||||
|
||||
.. toctree::
|
||||
:titlesonly:
|
||||
|
||||
email_communication/email_servers
|
||||
email_communication/email_servers_inbound
|
||||
email_communication/email_servers_outbound
|
||||
email_communication/email_domain
|
||||
email_communication/azure_oauth
|
||||
email_communication/google_oauth
|
||||
|
||||
@@ -165,7 +165,7 @@ Then, create a new email server and check the box for :guilabel:`Outlook`. Next,
|
||||
:guilabel:`Name` (it can be anything) and the Microsoft Outlook email :guilabel:`Username`.
|
||||
|
||||
If the :guilabel:`From Filter` field is empty, enter either a :ref:`domain or email address
|
||||
<email_communication/default>`.
|
||||
<email-outbound-unique-address>`.
|
||||
|
||||
Then, click on :guilabel:`Connect your Outlook account`.
|
||||
|
||||
@@ -203,7 +203,8 @@ This address must also match the `{mail.default.from}@{mail.catchall.domain}` ke
|
||||
system parameters.
|
||||
|
||||
.. seealso::
|
||||
For more information on the from filter visit: :ref:`email_communication/default`.
|
||||
Visit the :ref:`From Filtering documentation <email-outbound-different-servers-personalized-from-filtering>` for more
|
||||
information.
|
||||
|
||||
.. note::
|
||||
The :guilabel:`System Parameters` can be accessed by activating :ref:`developer-mode` in the
|
||||
@@ -244,7 +245,8 @@ so that only the user's email is sent from that server. In other words, only a u
|
||||
address that matches the set :guilabel:`FROM Filtering` is able to use this server.
|
||||
|
||||
.. seealso::
|
||||
For more information on the from filter visit: :ref:`email_communication/default`.
|
||||
Visit the :ref:`From Filtering documentation <email-outbound-different-servers-personalized-from-filtering>` for more
|
||||
information.
|
||||
|
||||
A :ref:`fallback server <azure_oauth/notifications>` must be setup to allow for the sending of
|
||||
:guilabel:`notifications`. The :guilabel:`FROM Filtering` for this server should have the value of
|
||||
@@ -261,7 +263,7 @@ the `{mail.default.from}@{mail.catchall.domain}`.
|
||||
|
||||
.. seealso::
|
||||
For more information on setting the mass-mailing email server visit
|
||||
:ref:`email_communication/mass_mails`.
|
||||
:ref:`email-outbound-custom-domain-smtp-server`.
|
||||
|
||||
.. example::
|
||||
Multiple user outgoing mail server configuration:
|
||||
@@ -288,6 +290,3 @@ new configuration. Check or Select the button next to :guilabel:`Outlook Oauth A
|
||||
enter the :guilabel:`Microsoft Outlook username`. Click on :guilabel:`Connect your Outlook
|
||||
account`. Odoo will state: :guilabel:`Outlook Token Valid` Now :guilabel:`Test and Confirm` the
|
||||
account. The account should be ready to receive email to the Odoo database.
|
||||
|
||||
.. seealso::
|
||||
:doc:`email_servers`
|
||||
|
||||
@@ -2,204 +2,144 @@
|
||||
Configure DNS records to send emails in Odoo
|
||||
============================================
|
||||
|
||||
SPAM labels overview
|
||||
====================
|
||||
This documentation presents three complementary authentication protocols (SPF, DKIM, and DMARC) used
|
||||
to prove the legitimacy of an email sender. Not complying with these protocols will greatly reduce
|
||||
chances of your emails to reach their destination.
|
||||
|
||||
Sometimes, emails from Odoo are misclassified by the different email providers and end up in spam
|
||||
folders. At the moment, some settings are out of Odoo's control, notably the way the different email
|
||||
providers classify Odoo's emails according to their own restriction policy and/or limitations.
|
||||
**Odoo Online** and **Odoo.sh** databases using the **default Odoo subdomain address** (e.g.,
|
||||
`\@company-name.odoo.com`) are pre-configured to **send authenticated emails** compliant with the
|
||||
SPF, DKIM, and DMARC protocols.
|
||||
|
||||
It is standard in Odoo that emails are received from ``"name of the author"
|
||||
<notifications@mycompany.odoo.com>``. In other words this can be translated to: ``"name of the
|
||||
author" <{ICP.mail.from.filter}@{mail.catchall.domain}>``. In this case ICP stands for
|
||||
`ir.config_parameter`, which are the System Parameters. Deliverability is greatly improved with the
|
||||
:ref:`notifications configuration <email_servers/notifications>`.
|
||||
If choosing to use a **custom domain** instead, **configuring SPF and DKIM records correctly is
|
||||
essential** to prevent emails from being quarantined as spam or not being delivered to recipients.
|
||||
|
||||
In order for servers to accept emails from Odoo on a more regular basis, one of the solutions is
|
||||
for customers to create rules within their own mailbox. A filter can be added to the email inbox so
|
||||
that when email is received from Odoo (`notifications@mycompany.odoo.com`) it is moved to the
|
||||
inbox. It is also possible to add the Odoo database domain onto a safe senders list or whitelist
|
||||
on the receiving domain.
|
||||
|
||||
If an Odoo email server appears on a blacklist, notify Odoo via a `new help ticket
|
||||
<https://www.odoo.com/help>`_ and the support team will work to get the servers removed from the
|
||||
blacklist.
|
||||
|
||||
Should the Odoo database be using a custom domain for sending emails from Odoo there are three
|
||||
records that should be implemented on the custom domain's DNS to ensure deliverability of email.
|
||||
This includes setting records for :abbr:`SPF (Sender Policy Framework)`,
|
||||
:abbr:`DKIM (DomainKeys Identified Mail)` and
|
||||
:abbr:`DMARC (Domain-based Message Authentication, Reporting, & Conformance)`. Ultimately though,
|
||||
it is up to the discretion of the final receiving mailbox.
|
||||
|
||||
.. _email_communication/spf_compliant:
|
||||
|
||||
Be SPF compliant
|
||||
================
|
||||
|
||||
The Sender Policy Framework (SPF) protocol allows the owner of a domain name to specify which
|
||||
servers are allowed to send emails from that domain. When a server receives an incoming email,
|
||||
it checks whether the IP address of the sending server is on the list of allowed IPs according to
|
||||
the sender's :abbr:`SPF (Sender Policy Framework)` record.
|
||||
If using :ref:`the default Odoo email server to send emails from a custom domain
|
||||
<email-outbound-custom-domain-odoo-server>`, the SPF and DKIM records must be configured as
|
||||
presented below. If using an outgoing email server, it is required to use the SPF and DKIM records
|
||||
specific to that email service and a custom domain.
|
||||
|
||||
.. note::
|
||||
The :abbr:`SPF (Sender Policy Framework)` verification is performed on the domain mentioned in
|
||||
the `Return-Path` field of the email. In the case of an email sent by Odoo, this domain
|
||||
corresponds to the value of the `mail.catchall.domain` key in the database system parameters.
|
||||
Email service providers apply different rules to incoming emails. An email may be classified as
|
||||
spam even if it passes the SPF and DKIM checks.
|
||||
|
||||
The :abbr:`SPF (Sender Policy Framework)` policy of a domain is set using a TXT record. The way to
|
||||
create or modify a TXT record depends on the provider hosting the :abbr:`DNS (Domain Name System)`
|
||||
zone of the domain name. In order for the verification to work properly, each domain can only have
|
||||
one :abbr:`SPF (Sender Policy Framework)` record.
|
||||
.. _email-domain-spf:
|
||||
|
||||
If the domain name does not yet have a :abbr:`SPF (Sender Policy Framework)` record, create one
|
||||
using the following input: `v=spf1 include:_spf.odoo.com ~all`
|
||||
SPF (Sender Policy Framework)
|
||||
=============================
|
||||
|
||||
If the domain name already has a :abbr:`SPF (Sender Policy Framework)` record, the record must be
|
||||
updated (and do not create a new one).
|
||||
The Sender Policy Framework (SPF) protocol allows the owner of a domain name to specify which
|
||||
servers are allowed to send emails from that domain. When a server receives an incoming email, it
|
||||
checks whether the IP address of the sending server is on the list of allowed IPs according to the
|
||||
sender's :abbr:`SPF (Sender Policy Framework)` record.
|
||||
|
||||
In Odoo, the **SPF test is performed on the bounce address** defined under the :guilabel:`Alias
|
||||
Domain` field found under the database's :guilabel:`General Settings`. If using a custom domain as
|
||||
:guilabel:`Alias Domain`, it is necessary to configure it to be SPF-compliant.
|
||||
|
||||
The SPF policy of a domain is set using a TXT record. The way to create or modify this record
|
||||
depends on the provider hosting the :abbr:`DNS (Domain Name System)` zone of the domain name.
|
||||
|
||||
If the domain name does not yet have an SPF record, create one using the following input:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
v=spf1 include:_spf.odoo.com ~all
|
||||
|
||||
If the domain name **already has an SPF record, the record must be updated**. Do not create a new
|
||||
one, as a domain must have only one SPF record.
|
||||
|
||||
.. example::
|
||||
|
||||
If the TXT record is `v=spf1 include:_spf.google.com ~all`, edit it to add
|
||||
`include:_spf.odoo.com`: `v=spf1 include:_spf.odoo.com include:_spf.google.com ~all`
|
||||
|
||||
Check if the :abbr:`SPF (Sender Policy Framework)` record is valid with a free tool like `MXToolbox
|
||||
SPF <https://mxtoolbox.com/spf.aspx>`_.
|
||||
Check the SPF record using a tool like `MXToolbox SPF Record Check
|
||||
<https://mxtoolbox.com/spf.aspx>`_. The process to create or modify an SPF record depends on the
|
||||
provider hosting the DNS zone of the domain name. The :ref:`most common providers
|
||||
<email-domain-providers-documentation>` and their documentation are listed below.
|
||||
|
||||
.. _email_communication/DKIM_compliant:
|
||||
.. _email-domain-dkim:
|
||||
|
||||
Enable DKIM
|
||||
===========
|
||||
DKIM (DomainKeys Identified Mail)
|
||||
=================================
|
||||
|
||||
The DomainKeys Identified Mail (DKIM) allows a user to authenticate emails with a digital
|
||||
signature.
|
||||
The DomainKeys Identified Mail (DKIM) allows a user to authenticate emails with a digital signature.
|
||||
|
||||
When sending an email, the Odoo server includes a unique :abbr:`DKIM (DomainKeys Identified Mail)`
|
||||
signature in the headers. The recipient's server decrypts this signature using the :abbr:`DKIM
|
||||
(DomainKeys Identified Mail)` record in the database's domain name. If the signature and the key
|
||||
contained in the record match, this guarantees that the message is authentic and has not been
|
||||
altered during transport.
|
||||
When sending an email, the Odoo email server includes a unique :abbr:`DKIM (DomainKeys Identified
|
||||
Mail)` signature in the headers. The recipient's server decrypts this signature using the DKIM
|
||||
record in the database's domain name. If the signature and the key contained in the record match, it
|
||||
proves the message is authentic and has not been altered during transport.
|
||||
|
||||
To enable :abbr:`DKIM (DomainKeys Identified Mail)`, add a :abbr:`CNAME (Canonical Name)` record to
|
||||
the :abbr:`DNS (Domain Name System)` zone of the domain name:
|
||||
Enabling DKIM is **required** when sending emails **from a custom domain** using the Odoo email
|
||||
server.
|
||||
|
||||
`odoo._domainkey IN CNAME odoo._domainkey.odoo.com.`
|
||||
To enable DKIM, add a :abbr:`CNAME (Canonical Name)` record to the :abbr:`DNS (Domain Name System)`
|
||||
zone of the domain name:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
odoo._domainkey IN CNAME odoo._domainkey.odoo.com.
|
||||
|
||||
.. tip::
|
||||
If the domain name is `mycompany.com`, make sure to create a subdomain
|
||||
`odoo._domainkey.mycompany.com` whose canonical name is `odoo._domainkey.odoo.com.`.
|
||||
If the domain name is `company-name.com`, make sure to create a subdomain
|
||||
`odoo._domainkey.company-name.com` whose canonical name is `odoo._domainkey.odoo.com.`.
|
||||
|
||||
The way to create or modify a :abbr:`CNAME (Canonical Name)` record depends on the provider hosting
|
||||
the :abbr:`DNS (Domain Name System)` zone of the domain name. The most common providers are
|
||||
:ref:`listed below <email_communication/SPFDKIM_common_providers>`.
|
||||
The way to create or modify a CNAME record depends on the provider hosting the DNS zone of the
|
||||
domain name. The :ref:`most common providers <email-domain-providers-documentation>` and their
|
||||
documentation are listed below.
|
||||
|
||||
Check if the :abbr:`DKIM (DomainKeys Identified Mail)` record is valid with a free tool like `DKIM
|
||||
Core <https://dkimcore.org/tools/>`_. If a selector is asked, enter `odoo`.
|
||||
Check if the DKIM record is valid using a tool like `MXToolbox DKIM Record Lookup
|
||||
<https://mxtoolbox.com/dkim.aspx>`_. Enter `example.com:odoo` in the DKIM lookup tool, specifying
|
||||
that the selector being tested is `odoo` for the custom domain `example.com`.
|
||||
|
||||
.. _email_communication/DMARC_compliant:
|
||||
.. _email-domain-dmarc:
|
||||
|
||||
Check the DMARC policy
|
||||
======================
|
||||
DMARC (Domain-based Message Authentication, Reporting and Conformance)
|
||||
======================================================================
|
||||
|
||||
The Domain-based Message Authentication, Reporting, & Conformance (DMARC) record is a protocol that
|
||||
unifies :abbr:`SPF (Sender Policy Framework)` and :abbr:`DKIM (DomainKeys Identified Mail)`. The
|
||||
instructions contained in the :abbr:`DMARC (Domain-based Message Authentication, Reporting, &
|
||||
Conformance)` record of a domain name tell the destination server what to do with an incoming email
|
||||
that fails the :abbr:`SPF (Sender Policy Framework)` and/or :abbr:`DKIM (DomainKeys Identified
|
||||
Mail)` check.
|
||||
The :abbr:`DMARC (Domain-based Message Authentication, Reporting, & Conformance)` record is a
|
||||
protocol that unifies :abbr:`SPF (Sender Policy Framework)` and :abbr:`DKIM (DomainKeys Identified
|
||||
Mail)`. The instructions contained in the DMARC record of a domain name tell the destination server
|
||||
what to do with an incoming email that fails the SPF and/or DKIM check.
|
||||
|
||||
.. example::
|
||||
DMARC: TXT record
|
||||
.. note::
|
||||
The aim of this documentation is to help **understand the impact DMARC has on the deliverability
|
||||
of emails**, rather than give precise instructions for creating a DMARC record. Refer to a
|
||||
resource like `DMARC.org <https://dmarc.org/>`_ to set the DMARC record.
|
||||
|
||||
`v=DMARC1; p=none;`
|
||||
|
||||
There are three :abbr:`DMARC (Domain-based Message Authentication, Reporting, & Conformance)`
|
||||
policies:
|
||||
There are three DMARC policies:
|
||||
|
||||
- `p=none`
|
||||
- `p=quarantine`
|
||||
- `p=reject`
|
||||
|
||||
`p=quarantine` and `p=reject` instruct the server that receives an email to quarantine that email or
|
||||
ignore it if the :abbr:`SPF (Sender Policy Framework)` and/or :abbr:`DKIM (DomainKeys Identified
|
||||
Mail)` check fails.
|
||||
ignore it if the SPF or DKIM check fails.
|
||||
|
||||
If the domain name uses :abbr:`DMARC (Domain-based Message Authentication, Reporting, &
|
||||
Conformance)` and has defined one of these policies, the domain must be :abbr:`SPF (Sender Policy
|
||||
Framework)` compliant or enable :abbr:`DKIM (DomainKeys Identified Mail)`.
|
||||
.. note::
|
||||
**For the DMARC to pass, the DKIM or SPF check needs to pass** and the domains must be in
|
||||
alignment. If the hosting type is Odoo Online, DKIM configuration on the sending domain is
|
||||
required to pass the DMARC.
|
||||
|
||||
.. warning::
|
||||
Yahoo or AOL are examples of email providers with a :abbr:`DMARC (Domain-based Message
|
||||
Authentication, Reporting, & Conformance)` policy set to `p=reject`. Odoo strongly advises
|
||||
against using an *@yahoo.com* or *@aol.com* address for the database users. These emails will
|
||||
never reach their recipient.
|
||||
Passing DMARC generally means that the email will be successfully delivered. However, it's important
|
||||
to note that **other factors like spam filters can still reject or quarantine a message**.
|
||||
|
||||
`p=none` is used for the domain owner to receive reports about entities using their domain. It
|
||||
should not impact the deliverability if the :abbr:`DMARC (Domain-based Message Authentication,
|
||||
Reporting, & Conformance)` check fails.
|
||||
should not impact the deliverability.
|
||||
|
||||
:abbr:`DMARC (Domain-based Message Authentication, Reporting, & Conformance)` records are comprised
|
||||
of tags in the form of :abbr:`DNS (Domain Name System)` records. These tags/parameters allow for
|
||||
reporting, such as :abbr:`RUA (Reporting URI of aggregate reports)` and :abbr:`RUF (Reporting URI
|
||||
for forensic reports)`, along with more precise specification like :abbr:`PCT (Percentage of
|
||||
messages subjected to filtering)`, :abbr:`P (Policy for organizational domain)`, :abbr:`SP (Policy
|
||||
for subdomains of the OD)` :abbr:`ADKIM (Alignment mode for DKIM)` & :abbr:`ASPF (Alignment mode for
|
||||
SPF)`. For best practice, the the :abbr:`DMARC (Domain-based Message Authentication, Reporting, &
|
||||
Conformance)` policy should not start out being too restrictive.
|
||||
.. example::
|
||||
:literal:`_dmarc IN TXT “v=DMARC1; p=none; rua=mailto:postmaster@example.com”` means that
|
||||
aggregate DMARC reports will be sent to `postmaster\@example.com`.
|
||||
|
||||
The following chart displays available tags:
|
||||
.. _email_domain/mail_config_common_providers:
|
||||
.. _email-domain-providers-documentation:
|
||||
|
||||
.. list-table::
|
||||
:header-rows: 1
|
||||
:widths: 15 50 35
|
||||
|
||||
* - Tag Name
|
||||
- Purpose
|
||||
- Example
|
||||
* - v
|
||||
- Protocol version
|
||||
- `v=DMARC1`
|
||||
* - pct
|
||||
- Percentage of messages subjected to filtering
|
||||
- `pct=20`
|
||||
* - ruf
|
||||
- Reporting URI for forensic reports
|
||||
- `ruf=mailto:authfail@example.com`
|
||||
* - rua
|
||||
- Reporting URI of aggregate reports
|
||||
- `rua=mailto:aggrep@example.com`
|
||||
* - p
|
||||
- Policy for organizational domain
|
||||
- `p=quarantine`
|
||||
* - sp
|
||||
- Policy for subdomains of the OD
|
||||
- `sp=reject`
|
||||
* - adkim
|
||||
- Alignment mode for DKIM
|
||||
- `adkim=s`
|
||||
* - aspf
|
||||
- Alignment mode for SPF
|
||||
- `aspf=r`
|
||||
|
||||
Check the :abbr:`DMARC (Domain-based Message Authentication, Reporting, & Conformance)` record of a
|
||||
domain name with a tool like `MXToolbox DMARC <https://mxtoolbox.com/DMARC.aspx>`_.
|
||||
|
||||
.. seealso::
|
||||
`DMARC.org is another great resource to learn about DMARC records.
|
||||
<https://dmarc.org/overview/>`_
|
||||
|
||||
.. _email_communication/SPFDKIM_common_providers:
|
||||
|
||||
SPF, DKIM & DMARC documentation of common providers
|
||||
===================================================
|
||||
SPF, DKIM and DMARC documentation of common providers
|
||||
=====================================================
|
||||
|
||||
- `OVH DNS <https://docs.ovh.com/us/en/domains/web_hosting_how_to_edit_my_dns_zone/>`_
|
||||
- `OVH SPF <https://docs.ovh.com/us/en/domains/web_hosting_the_spf_record/>`_
|
||||
- `GoDaddy TXT record <https://www.godaddy.com/help/add-a-txt-record-19232>`_
|
||||
- `GoDaddy SPF <https://www.godaddy.com/help/add-an-spf-record-19218>`_
|
||||
- `GoDaddy DKIM <https://www.godaddy.com/help/add-a-cname-record-19236>`_
|
||||
- `NameCheap <https://www.namecheap.com/support/knowledgebase/article.aspx/317/2237/how-do-i-add-
|
||||
txtspfdkimdmarc-records-for-my-domain/>`_
|
||||
- `GoDaddy CNAME record <https://www.godaddy.com/help/add-a-cname-record-19236>`_
|
||||
- `NameCheap <https://www.namecheap.com/support/knowledgebase/article.aspx/317/2237/how-do-i-add-txtspfdkimdmarc-records-for-my-domain/>`_
|
||||
- `CloudFlare DNS <https://support.cloudflare.com/hc/en-us/articles/360019093151>`_
|
||||
- `Google Domains <https://support.google.com/domains/answer/3290350?hl=en>`_
|
||||
- `Azure DNS <https://docs.microsoft.com/en-us/azure/dns/dns-getstarted-portal>`_
|
||||
|
||||
@@ -1,345 +0,0 @@
|
||||
.. _communication/emails_servers:
|
||||
|
||||
====================================================
|
||||
Send and receive emails in Odoo with an email server
|
||||
====================================================
|
||||
|
||||
Odoo Online or Odoo.sh users
|
||||
============================
|
||||
|
||||
Since **Odoo sets up its own mail servers for the database**, outgoing and incoming emails already
|
||||
work out-of-the-box. So for **Odoo Online** and **Odoo.sh** customers, nothing needs to be
|
||||
configured!
|
||||
|
||||
Unless an external mail server is required to send large batches of mass emails, simply use the
|
||||
standard online Odoo database normally since it has already been pre-configured to send email.
|
||||
|
||||
.. important::
|
||||
The Odoo server is subject to a daily email limit to prevent abuse. The default limit is 200
|
||||
emails sent per day for databases with an **Enterprise** subscription. This limit can be
|
||||
increased under certain conditions. See the :doc:`FAQ <faq>` or contact support for more
|
||||
information.
|
||||
|
||||
Scope of this documentation
|
||||
===========================
|
||||
|
||||
This document is **mainly dedicated to Odoo on-premise databases** that do not benefit from an
|
||||
out-of-the-box solution to send and receive emails in Odoo, unlike `Odoo Online <https://www.odoo.
|
||||
com/trial>`_ and `Odoo.sh <https://www.odoo.sh>`_. Incoming and outgoing servers must be configured
|
||||
for on-premise databases.
|
||||
|
||||
The following sections below contain information on how to integrate an external email server with
|
||||
Odoo.
|
||||
|
||||
.. warning::
|
||||
If no one in the company is employed to manage email servers, Odoo Online and Odoo.sh are
|
||||
strongly recommended. In these Odoo hosting types email sending and receiving works instantly
|
||||
and is monitored by professionals. Nevertheless, a company can use their own email server if
|
||||
they want to manage the email server's reputation themselves. For more information see
|
||||
:doc:`Configure DNS records to send emails in Odoo <email_domain>`
|
||||
|
||||
.. _email_servers/notifications:
|
||||
|
||||
Default notifications system
|
||||
============================
|
||||
|
||||
Documents in Odoo (such as a CRM opportunity, a sales order, an invoice, etc.) have a discussion
|
||||
thread, called *chatter*.
|
||||
|
||||
When a database user posts a message in the chatter, this message is sent by email to the followers
|
||||
of the document as a notification (except to the sender). If a follower replies to the message,
|
||||
the reply updates the chatter, and Odoo relays another reply to the followers as a notification.
|
||||
Messages sent back to the chatter from users or external users will appear in the chatter from
|
||||
their respective email, or as the name listed in their *Contacts* record.
|
||||
|
||||
These notifications are sent using a default from address. For more information see
|
||||
:ref:`Use a default email address <email_communication/default>`.
|
||||
|
||||
.. _email_servers/outbound:
|
||||
|
||||
Manage outbound messages
|
||||
========================
|
||||
|
||||
As a system administrator, go to :menuselection:`Settings --> General Settings --> Discuss` in Odoo,
|
||||
and enable the :guilabel:`Custom Email Servers` option. Then, click :guilabel:`Save`. Next, click
|
||||
:guilabel:`Outgoing Email Servers` and click :guilabel:`Create` to create a new outgoing mail server
|
||||
record in Odoo. Reference the SMTP data of the external email server. Once all the information has
|
||||
been filled out, click :guilabel:`Test Connection`.
|
||||
|
||||
.. seealso::
|
||||
- :doc:`google_oauth`
|
||||
- :doc:`azure_oauth`
|
||||
|
||||
.. note::
|
||||
Ensuring the outgoing domain has :abbr:`SPF (Sender Policy Framework)`, :abbr:`DKIM (DomainKeys
|
||||
Identified Mail)` and :abbr:`DMARC (Domain-based Message Authentication, Reporting, &
|
||||
Conformance)` set up on the :abbr:`DNS (Domain Name System)` will improve deliverability. For
|
||||
more information see :doc:`email_domain`.
|
||||
|
||||
.. _email_servers/restriction:
|
||||
|
||||
Port restriction
|
||||
----------------
|
||||
|
||||
Note that port 25 is blocked for security reasons on the Odoo Online and Odoo.sh platforms. Try
|
||||
using ports 465, 587, or 2525 instead.
|
||||
|
||||
.. _email_communication/default:
|
||||
|
||||
Use a default "From" email address
|
||||
----------------------------------
|
||||
|
||||
Sometimes, an email's "From" (outgoing) address can belong to a different domain, and that can be a
|
||||
problem.
|
||||
|
||||
For example, if a customer with the email address `mary\@customer.example.com` responds to a
|
||||
message, Odoo will try to redistribute that same email to the other subscribers in the thread.
|
||||
However, if the domain `customer.example.com` forbids that kind of usage for security, the email
|
||||
that Odoo is trying to redistribute would get rejected by some recipients' email servers.
|
||||
|
||||
To avoid that problem, Odoo sends all emails using a "From" address from the same authorized
|
||||
domain.
|
||||
|
||||
Access the :guilabel:`System Parameters` by activating :ref:`developer mode <developer-mode>` and
|
||||
going to :menuselection:`Settings --> Technical --> Parameters --> System Parameters` menu.
|
||||
|
||||
To force the email address from which emails are sent, a combination of the following keys needs to
|
||||
be set in the system parameters of the database:
|
||||
|
||||
- `mail.default.from`: accepts the local part or a complete email address as value
|
||||
- `mail.default.from_filter`: accepts a domain name or a full email address as value
|
||||
|
||||
.. note::
|
||||
The `mail.default.from_filter` works only for `odoo-bin` configurations or the default Odoo email
|
||||
server, otherwise this parameter can be set using the `from_filter` field on `ir.mail_server`.
|
||||
|
||||
The field can be a domain name or an entire email address, or it can remain empty. If the sender's
|
||||
email address does not match this set filter, then the email will be encapsulated using a
|
||||
combination of the two system parameters: `mail.default.from` and `mail.catchall.domain`.
|
||||
|
||||
.. example::
|
||||
In the following example, the from email address is replaced with the combination of the the two
|
||||
system parameters (`mail.default.from` and `mail.catchall.domain`). This is the default \
|
||||
notifications configuration in Odoo: ``“Admin” <admin@example.com>`` => ``“Admin”
|
||||
<notifications@mycompany.com>``.
|
||||
|
||||
In other words if the email address of the author does not match `mail.default.from_filter`, the
|
||||
email address is replaced by `mail.default.from` (if it contains a full email address) or a
|
||||
combination of `mail.default.from` and `mail.catchall.domain`.
|
||||
|
||||
If the `from_filter` contains a full email address, and if the `mail.default.from` is the same as
|
||||
this address, then all of the email addresses that are different from `mail.default.from` will be
|
||||
encapsulated in `mail.default.from`.
|
||||
|
||||
.. _email_communication/from_filter:
|
||||
|
||||
Utilizing the "From" filter on an outgoing email server
|
||||
-------------------------------------------------------
|
||||
|
||||
The :guilabel:`FROM Filtering` field allows for the use of a specific outgoing email server
|
||||
depending on the :guilabel:`From` email address or domain that Odoo is sending on behalf of. This
|
||||
setting can be used to improve the deliverability or sending success rate of emails sent from the
|
||||
database. Setting the :guilabel:`FROM Filtering` field can also be used to send from different
|
||||
domains in a multi-company environment. Access this field in Odoo by navigating to
|
||||
:menuselection:`Settings --> Discuss --> Custom Mail Servers --> Outgoing Mail Servers --> New`.
|
||||
|
||||
.. image:: email_servers/from-filter-setting.png
|
||||
:align: center
|
||||
:alt: Outgoing email server settings and the FROM filter settings.
|
||||
|
||||
When an email is sent from Odoo while the :guilabel:`FROM Filtering` field is set, an email server
|
||||
is chosen in the following sequence:
|
||||
|
||||
#. First, Odoo searches for an email server that has the same :guilabel:`FROM Filtering` value as
|
||||
the :guilabel:`From` value (email address) defined in the outgoing email. For example, if the
|
||||
:guilabel:`From` value (email address) is `test\@example.com`, only the email servers that have
|
||||
the :guilabel:`FROM Filtering` value equal to `test\@example.com` are returned.
|
||||
#. However, if no email servers are found that use the :guilabel:`From` value, then Odoo searches
|
||||
for an email server that has the same *domain* as the :guilabel:`From` value (email address)
|
||||
defined in the outgoing email. For example, if the :guilabel:`From` email address is
|
||||
`test\@example.com`, only the email servers that have the :guilabel:`FROM Filtering` value equal
|
||||
to `example.com` are returned.
|
||||
|
||||
If no email servers are found after checking for the domain, then Odoo returns all email servers
|
||||
that do not have any :guilabel:`FROM Filtering` value(s) set.
|
||||
|
||||
Should this query return no results, then Odoo performs a search for an email server using the
|
||||
system parameter: `mail.default.from`. First, the email address listed attempts to match an email
|
||||
server, and then the domain attempts to find a match. If no email server is found, Odoo returns the
|
||||
first outgoing email server (sorted by priority).
|
||||
|
||||
.. note::
|
||||
If several email servers are found, then Odoo uses the first one according to its priority. For
|
||||
example, if there are two email servers, one with a priority of `10` and the other with a
|
||||
priority of `20`, then the email server with a priority of `10` is used first.
|
||||
|
||||
.. _email_communication/mass_mails:
|
||||
|
||||
Set up different dedicated servers for transactional and mass emails
|
||||
--------------------------------------------------------------------
|
||||
|
||||
In Odoo a separate email server can be used for transactional emails and mass
|
||||
mailings. Example: Use Postmark or SendinBlue for transactional emails, and Amazon SES, Mailgun,
|
||||
Sendgrid or :doc:`Mailjet <mailjet_api>` for mass mailings.
|
||||
|
||||
.. important::
|
||||
A default outgoing email server is already configured. Do not create an alternative one unless a
|
||||
specific external outgoing email server is needed for technical reasons.
|
||||
|
||||
To do this, first activate the :ref:`developer mode <developer-mode>`, and then go to
|
||||
:menuselection:`Settings --> Technical --> Outgoing` email servers. There, create two outgoing email
|
||||
server settings; one for the transactional emails and one for the mass mailing server. Make sure to
|
||||
give priority to the transactional server over the mass mailing server by providing a lower priority
|
||||
number for the transactional email server.
|
||||
|
||||
Now, go to :menuselection:`Email Marketing --> Settings` and enable :guilabel:`Dedicated Server`.
|
||||
Choose the appropriate email server. With these settings, Odoo uses the server with the lower
|
||||
priority for transactional emails, and the server here selected for mass mails. Note that in this
|
||||
case, the domain's Sender Policy Framework (SPF) records must be set to include both transactional
|
||||
and mass mail servers.
|
||||
|
||||
.. seealso::
|
||||
- :doc:`email_domain`
|
||||
|
||||
.. _email_communication/inbound_messages:
|
||||
|
||||
Manage inbound messages
|
||||
=======================
|
||||
|
||||
Odoo relies on generic email aliases to fetch incoming messages.
|
||||
|
||||
* **Reply messages** of messages sent from Odoo are routed to their original discussion thread (and
|
||||
to the inbox of all its followers) by the alias of the model if there is any or by the catchall
|
||||
alias (**catchall@**). Replies to messages of models that do not have a custom alias will use the
|
||||
catchall alias (`catchall@mycompany.odoo.com`). The catchall address, however, does not have
|
||||
another action attached to it like other aliases might, it is only used to collect replies.
|
||||
* **Bounced messages** are used as a Return-Path. One example this is especially
|
||||
useful for is in `Odoo Email Marketing <https://www.odoo.com/page/email-marketing>`__. In this
|
||||
case bounces are opt-out based on if the email bounced too many times (5) in the last month and
|
||||
the bounces are separated by one week. This is done to avoid blacklisting someone because of a
|
||||
mail server error. If these circumstances are met then the email is considered invalid and is
|
||||
blacklisted. A log note is added on the contact under :guilabel:`Blacklisted Email Addresses` on
|
||||
the :guilabel:`Email Marketing Configuration Menu`.
|
||||
|
||||
Messages that bounce in the chatter (outside of Email Marketing) will populate a red envelope
|
||||
indicating the failed delivery. This can be helpful to know that a Sales Order or an Invoice did
|
||||
not reach its final destination.
|
||||
* **Original messages**: several business objects have their own alias to create new records in Odoo
|
||||
from incoming emails:
|
||||
|
||||
* Sales channel (to create *Leads* or *Opportunities* in `Odoo CRM <https://www.odoo.com/page/
|
||||
crm>`_)
|
||||
* Support channel (to create *Tickets* in `Odoo Helpdesk <https://www.odoo.com/page/helpdesk>`_)
|
||||
* Projects (to create new *Tasks* in `Odoo Project <https://www.odoo.com/page
|
||||
/project-management>`_)
|
||||
* Job positions (to create *Applicants* in `Odoo Recruitment <https://www.odoo.com/page
|
||||
/recruitment>`_)
|
||||
|
||||
Depending on the mail server, there might be several methods to fetch emails. The easiest and most
|
||||
recommended method is to manage one email address per Odoo alias in the mail server.
|
||||
|
||||
* Create the corresponding email addresses in the mail server (**catchall@**, **bounce@**,
|
||||
**sales@**, etc.).
|
||||
* Set the :guilabel:`Alias Domain` name in :menuselection:`Settings --> General Settings -->
|
||||
Discuss`. Changing the :guilabel:`Alias Domain` will change the catchall's domain for the
|
||||
database.
|
||||
* If the database's hosting type is Odoo on-premise, create an :guilabel:`Incoming Mail Server` in
|
||||
Odoo for each alias. To create a new incoming server go to: :menuselection:`Settings --> Discuss
|
||||
--> Custom Mail Servers --> Incoming Mail Servers --> New` Fill out the form according to the
|
||||
email provider's settings. Leave the :guilabel:`Actions to Perform on Incoming Mails` field blank.
|
||||
Once all the information has been filled out, click on :guilabel:`TEST & CONFIRM`.
|
||||
|
||||
.. image:: email_servers/incoming-server.png
|
||||
:align: center
|
||||
:alt: Incoming mail server configuration on Odoo.
|
||||
|
||||
* If the database's hosting type is Odoo Online or Odoo.sh, redirecting or forwarding incoming
|
||||
messages to Odoo's domain name instead of the external email server is recommended. That way,
|
||||
incoming messages can be received without delay. Redirections for all email addresses should be
|
||||
set to Odoo's domain name in the email server (e.g. `catchall\@mydomain.ext` to
|
||||
`catchall\@mycompany.odoo.com`).
|
||||
|
||||
All the aliases are customizable in Odoo. Object aliases can be edited from their respective
|
||||
configuration view by navigating to :menuselection:`Settings --> Technical Menu --> Email -->
|
||||
Aliases`.
|
||||
|
||||
To edit catchall and bounce aliases, first activate the :ref:`developer mode <developer-mode>`.
|
||||
Then, go to :menuselection:`Settings --> Technical --> Parameters --> System Parameters` to
|
||||
customize the aliases (`mail.catchall.alias` & `mail.bounce.alias`). These types of changes should
|
||||
be completed prior to the database going live. If a customer replies after a change is made then the
|
||||
system will not recognize the old alias, and the reply will not be received.
|
||||
|
||||
By default, inbound messages are fetched every 5 minutes for on-premise databases.
|
||||
|
||||
.. note::
|
||||
This value can be changed in :ref:`developer mode <developer-mode>`. Go to
|
||||
:menuselection:`Settings --> Technical --> Automation --> Scheduled Actions` and look for
|
||||
:guilabel:`Mail: Fetchmail Service`.
|
||||
|
||||
System parameters that prevent feedback loops
|
||||
---------------------------------------------
|
||||
|
||||
There are two system parameters that help prevent email loops from occurring in Odoo. These
|
||||
parameters were introduced in Odoo 16 to prevent aliases from creating too many records and to
|
||||
prevent feedback loops on the catchall reply-to email address. They are present in database but not
|
||||
in the *System Parameters*. To override the following defaults they need to be added in.
|
||||
|
||||
The two system parameters are as follows:
|
||||
|
||||
- `mail.gateway.loop.minutes` (120 minutes by default)
|
||||
- `mail.gateway.loop.threshold` (20 by default)
|
||||
|
||||
Add these fields in Odoo by first enabling :ref:`developer mode <developer-mode>`, and then
|
||||
navigating to :menuselection:`Settings --> Technical Menu --> Parameters --> System Parameters`.
|
||||
Change the value of these parameters, as needed.
|
||||
|
||||
When an email is received in the Odoo database on the catchall email address or on any alias, Odoo
|
||||
looks at the mail received for the given period of time defined in the system parameter
|
||||
`mail.gateway.loop.minutes`. If the received email was sent to an alias then Odoo will reference the
|
||||
`mail.gateway.loop.threshold` system parameter and determine the value as the number of records this
|
||||
alias is allowed to create in the given period of time (value of `mail.gateway.loop.minutes`).
|
||||
|
||||
In addition, when email is received to the catchall email address, Odoo will reference the emails
|
||||
received to the database during the set period of time (as stated by the value in the system
|
||||
parameter: `mail.gateway.loop.minutes`). Odoo will then determine whether any of the emails
|
||||
received match that of the email(s) being received during the specified time-frame, and will prevent
|
||||
a feedback loop from occurring if a duplicate email is detected.
|
||||
|
||||
Allow alias domain system parameter
|
||||
-----------------------------------
|
||||
|
||||
Incoming aliases are set in the Odoo database to create records by receiving incoming emails. To
|
||||
view aliases set in the Odoo database, first activate the :ref:`developer mode <developer-mode>`.
|
||||
Then, go to :menuselection:`Settings app --> Technical --> Email section --> Aliases`.
|
||||
|
||||
The following system parameter, `mail.catchall.domain.allowed`, set with allowed alias domain
|
||||
values, separated by commas, filters out correctly addressed emails to aliases. Setting the
|
||||
domain(s) for which the alias can create a ticket, lead, opportunity, etc., eliminates false
|
||||
positives where email addresses with only the prefix alias (not the domain) are present.
|
||||
|
||||
In some instances, matches have been made in the Odoo database when an email is received with the
|
||||
same alias prefix and a different domain on the incoming email address. This is true in the sender,
|
||||
recipient, and :abbr:`CC (Carbon Copy)` email addresses of an incoming email.
|
||||
|
||||
.. example::
|
||||
When Odoo receives emails that have the name `commercial` prefix alias in the sender, recipient,
|
||||
or :abbr:`CC (Carbon Copy)` email address(es) (e.g. commercial@gmail.com, commercial@odoo.net),
|
||||
the database falsely treats the email as the full `commercial` alias (with a different domain),
|
||||
and therefore, creates a ticket/lead/opportunity/etc.
|
||||
|
||||
.. important::
|
||||
This alias mismatch issue has been resolved in Odoo 17, however, the
|
||||
`mail.catchall.domain.allowed` system parameter is still used in Odoo 17 for backward
|
||||
compatibility.
|
||||
|
||||
To add the `mail.catchall.domain.allowed` system parameter, first, activate the :ref:`developer mode
|
||||
<developer-mode>`. Then, go to :menuselection:`Settings app --> Technical --> Parameters section -->
|
||||
System Parameters`. Click :guilabel:`Create`. Then, type in `mail.catchall.domain.allowed` for the
|
||||
:guilabel:`Key` field.
|
||||
|
||||
Next, for the :guilabel:`Value` field, add the domain(s) separated by comma(s) (if plural domains).
|
||||
Manually :guilabel:`Save`, and the system parameter takes immediate effect.
|
||||
|
||||
.. image:: email_servers/allowed-domain.png
|
||||
:align: center
|
||||
:alt: mail.catchall.domain.allowed system parameter set with key and value highlighted.
|
||||
|
Before Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 90 KiB |
|
Before Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 117 KiB |
@@ -0,0 +1,319 @@
|
||||
=======================
|
||||
Manage inbound messages
|
||||
=======================
|
||||
|
||||
An inbound message is an email delivered to an Odoo database. Anyone can send an email to an email
|
||||
alias created in the database or reply to an email that was previously sent from the database based
|
||||
on the *reply-to* header.
|
||||
|
||||
.. _email-inbound-aliases:
|
||||
|
||||
Email aliases
|
||||
=============
|
||||
|
||||
.. _email-inbound-aliases-model:
|
||||
|
||||
Model specific aliases
|
||||
----------------------
|
||||
|
||||
Some applications have their specific aliases (sales teams, helpdesk teams, projects, etc.). These
|
||||
aliases are used to:
|
||||
|
||||
- Create a record when an email is sent directly to the alias,
|
||||
- Receive replies to an email initially sent from a record.
|
||||
|
||||
.. example::
|
||||
|
||||
.. image:: email_servers_inbound/sales-team-alias-config.png
|
||||
:alt: The local-part "info" is used for the alias of the sales team.
|
||||
|
||||
In the example displayed above, sending an email to `info@company-name.odoo.com` will create a
|
||||
new opportunity or a new lead automatically assigned to the corresponding sales team. If an email
|
||||
is sent from the chatter of an existing opportunity, the *reply-to* will be
|
||||
`info@company-name.odoo.com`. The reply will be posted in the right chatter, according to the
|
||||
*message-id* header.
|
||||
|
||||
.. _email-inbound-aliases-catchall:
|
||||
|
||||
Catchall
|
||||
--------
|
||||
|
||||
If an application does not have an alias, a generic fallback alias is used: the catchall. An email
|
||||
sent from a chatter has a reply address set to this catchall alias. A reply sent to the catchall is
|
||||
posted to the right chatter thanks to the *message-id* header.
|
||||
|
||||
By default, the local-part *catchall* will be used. Enable :ref:`developer-mode` and go to
|
||||
:menuselection:`Settings --> Technical --> Emails: Alias Domains` to access the configuration.
|
||||
|
||||
An email to the catchall always needs to be a reply to a previous email sent from the database. If
|
||||
an email is sent directly to the catchall, the sender will receive the following message:
|
||||
|
||||
.. image:: email_servers_inbound/direct-mail-to-catchall.png
|
||||
:alt: Bounce email from "MAILER-DEAMON" explaining how to contact the database.
|
||||
|
||||
.. note::
|
||||
The email address `info@company-name.com` displayed in the screenshot above is the email address
|
||||
set on the company. Upon entering the developer mode on a company profile, additional
|
||||
configuration options (such as catchall and bounce) become readable. It can be modified by
|
||||
clicking on the internal link of the Email Domain. It is generally not recommended to modify
|
||||
these options unless specific needs dictate, as it will affect all replies to previously sent
|
||||
emails.
|
||||
|
||||
.. example::
|
||||
An alias can be configured on a sales team in the CRM app. When a customer replies to an email
|
||||
coming from the CRM app, the *reply-to* is `info@company-name.odoo.com`.
|
||||
|
||||
When an email is sent from the Contact app, the reply address is `catchall@company-name.odoo.com`
|
||||
because there is no alias on the contact model.
|
||||
|
||||
.. note::
|
||||
It is advised to keep the local-part of the catchall and the bounce unchanged. If this value is
|
||||
modified, previous emails sent from the database will still have the previous local-part values.
|
||||
This could lead to replies not being correctly received in the database.
|
||||
|
||||
.. _email-inbound-aliases-bounce:
|
||||
|
||||
Bounce
|
||||
------
|
||||
|
||||
In the same way the catchall alias is used to build the reply address, the bounce alias is used to
|
||||
build the *return-path* of the email. The *return-path* is used when emails cannot be delivered to
|
||||
the recipient and an error is returned to the sender.
|
||||
|
||||
By default the name *bounce* will be used. Enable :ref:`developer-mode` and go to
|
||||
:menuselection:`Settings --> Technical --> Emails: Alias Domains` to access the configuration.
|
||||
|
||||
.. note::
|
||||
On Odoo Online, when using the default outgoing email server, the return-path address is forced
|
||||
to the value `bounce@company-name.odoo.com` independently of the value set as bounce alias.
|
||||
|
||||
When an error occurs, a notification is received and displayed in a red envelope in the chatter. In
|
||||
some cases, the red envelope can just contain a `no error` message, meaning there is an error that
|
||||
could not be handled by Odoo.
|
||||
|
||||
A notification will also be displayed in the Discuss icon on the navigation bar.
|
||||
|
||||
.. image:: email_servers_inbound/mail-error-notif-navbar.png
|
||||
:alt: An email sent to a contact had an issue and the error is reported on the navbar.
|
||||
|
||||
.. example::
|
||||
If the email address of the recipient is incorrect, by clicking on the red envelope in the
|
||||
chatter an error message containing the reason for the failure will be given.
|
||||
|
||||
.. image:: email_servers_inbound/red-envelope-info.png
|
||||
:alt: An email sent to a wrong domain generates a bounce displayed as a red envelope.
|
||||
|
||||
.. _email-inbound-default:
|
||||
|
||||
Receive emails with Odoo's default configuration
|
||||
================================================
|
||||
|
||||
On **Odoo Online** and **Odoo.sh**, the email alias, reply, and bounce addresses are pre-configured.
|
||||
These addresses use the alias domain automatically added to a standard database.
|
||||
|
||||
.. example::
|
||||
Assuming the database URL is `https://mydatabase.odoo.com`, the alias domain
|
||||
`mydatabase.odoo.com` is automatically created. Catchall and bounce can be used and their address
|
||||
is respectively `catchall@mydatabase.odoo.com`, and `bounce@mydatabase.odoo.com`.
|
||||
|
||||
If the CRM app is installed, and a sales team with the alias `info` is created, the
|
||||
`info@mydatabase.odoo.com` address can be used immediately. The same goes for any other alias
|
||||
created in other applications.
|
||||
|
||||
The database domain is ready to be used to receive emails without any additional configuration.
|
||||
|
||||
.. _email-inbound-multiple-subdomains:
|
||||
|
||||
Use multiple Odoo subdomains
|
||||
============================
|
||||
|
||||
On **Odoo Online**, the only Odoo subdomain is the one defined at the database creation.
|
||||
|
||||
On **Odoo.sh**, it is possible to use several Odoo subdomains. In the settings of the branch,
|
||||
additional Odoo subdomains can be added as long as they are not used yet in another branch. These
|
||||
domains must then be added to the alias domains to be used by a company.
|
||||
|
||||
.. image:: email_servers_inbound/custom-subdomain-sh.png
|
||||
:alt: Setting up an Odoo subdomain on a branch.
|
||||
|
||||
.. _email-inbound-custom-domain:
|
||||
|
||||
Use a custom domain for inbound messages
|
||||
========================================
|
||||
|
||||
The :ref:`alias domain <email-outbound-alias-domain>` must be selected in the general
|
||||
settings. If you have multiple companies, each one must be configured.
|
||||
|
||||
.. image:: email_servers_inbound/alias-domain-settings.png
|
||||
:alt: The alias domain in the general settings.
|
||||
|
||||
All the aliases will use this custom domain. Replies on models for which an alias is configured
|
||||
are done to `[alias]@my-custom-domain.com`. Replies to other models are sent to the catchall through
|
||||
`catchall@my-custom-domain.com`.
|
||||
|
||||
.. image:: email_servers_inbound/diagram-mail-custom-domain.png
|
||||
:alt: Technical schema of mailing route when using a custom domain in Odoo.
|
||||
|
||||
.. important::
|
||||
If emails are sent using Odoo's email servers while using a custom domain, follow the
|
||||
:ref:`"Using a custom domain with Odoo’s email server" instructions
|
||||
<email-outbound-custom-domain-odoo-server>`.
|
||||
|
||||
Since this custom domain is used, all emails using an alias (replies, bounces and direct
|
||||
sends) are sent to an address of the domain. They are thus delivered to the email server linked to the domain (MX record). To
|
||||
display them in the chatter or to create new records, it is necessary to retrieve these incoming
|
||||
emails in the Odoo database.
|
||||
|
||||
.. list-table::
|
||||
:header-rows: 1
|
||||
:stub-columns: 1
|
||||
|
||||
* - Method
|
||||
- Benefits
|
||||
- Drawbacks
|
||||
* - :ref:`Redirections <email-inbound-custom-domain-redirections>`
|
||||
- Easy to set up, emails are directly sent to the database.
|
||||
- Each alias of a database needs to be configured.
|
||||
* - :ref:`Incoming mail servers <email-inbound-custom-domain-incoming-server>`
|
||||
- Allows to keep a copy of the email in your mailbox (with IMAP).
|
||||
Allows to create records in the chosen model.
|
||||
- Depends on a CRON, meaning emails are not retrieved immediately in the database.
|
||||
Each alias of a database needs to be configured.
|
||||
* - :ref:`MX record <email-inbound-custom-domain-mx>`
|
||||
- Only one record needs to be created to make all aliases work properly.
|
||||
- Using a subdomain is required.
|
||||
Requires advanced technical knowledge.
|
||||
|
||||
.. important::
|
||||
For **on-premise databases**, the redirection and the MX record methods also require configuring
|
||||
the :doc:`mail gateway script <../../../../administration/on_premise/email_gateway>`. Going
|
||||
through this script requires **advanced technical and infrastructure knowledge**.
|
||||
|
||||
.. important::
|
||||
Refer to your provider’s documentation for more detailed information on how to handle the methods
|
||||
detailed below.
|
||||
|
||||
.. _email-inbound-custom-domain-redirections:
|
||||
|
||||
Redirections
|
||||
------------
|
||||
|
||||
If the database is hosted on **Odoo Online** or **Odoo.sh**, using redirections is recommended. They
|
||||
allow messages to be received without delay in the database.
|
||||
|
||||
It is mandatory to redirect the catchall and bounce address to the Odoo subdomain of the database.
|
||||
Every other alias used must be redirected as well.
|
||||
|
||||
.. example::
|
||||
With one sales team, the following redirections are required:
|
||||
|
||||
- `catchall@company-name.com` → `catchall@company-name.odoo.com`
|
||||
- `bounce@company-name.com` → `bounce@company-name.odoo.com`
|
||||
- `info@company-name.com` → `info@company-name.odoo.com`
|
||||
|
||||
.. important::
|
||||
Some providers ask to validate the redirection by sending a link to the target email address.
|
||||
This procedure is an issue for catchall and bounce since they are not used to create records.
|
||||
|
||||
#. Modify the catchall value on the mail alias domain. :ref:`developer-mode` must be enabled to
|
||||
access this menu. For example, it can be changed from `catchall` to `temp-catchall`. This will
|
||||
allow to use `catchall` as the local-part of another alias.
|
||||
#. Open an app that uses an alias. For example, CRM contains aliases for each sales team. Set
|
||||
`catchall` as the local-part of the alias of a sales team.
|
||||
#. The validation email will create a record in the CRM app. The email sent will be visible in
|
||||
the chatter, allowing you to validate the redirection.
|
||||
#. Do not forget to change back the alias of the sales team and the catchall value on the mail
|
||||
alias domain, just as they were before this procedure.
|
||||
|
||||
.. note::
|
||||
An alternative to redirections is **forwarding**. With forwarding, **the address forwarding the
|
||||
email will be identified as the sender**, while with redirections, the original sender will
|
||||
always remain.
|
||||
|
||||
.. _email-inbound-custom-domain-incoming-server:
|
||||
|
||||
Incoming mail servers
|
||||
---------------------
|
||||
|
||||
As mentioned earlier, using redirections is the recommended method to receive emails in Odoo.
|
||||
However, it is also possible to set up incoming mail servers. Using this method means creating an
|
||||
incoming email server for each mailbox on your server, catchall, bounce, and every alias of the
|
||||
database, in order to fetch all incoming emails. Incoming mail servers are created by going to
|
||||
:menuselection:`Settings --> Technical --> Emails: Incoming Mail Servers`.
|
||||
|
||||
.. important::
|
||||
We recommend using the IMAP protocol over the POP protocol, as IMAP fetches all unread emails,
|
||||
while POP fetches all the emails' history and then tags them as deleted in your mailbox.
|
||||
|
||||
.. tip::
|
||||
It is also possible to connect a mailbox through :doc:`Gmail with Google OAuth <google_oauth>` or
|
||||
:doc:`Outlook with Microsoft Azure OAuth <azure_oauth>`.
|
||||
|
||||
Regardless of the protocol chosen, emails are fetched using the *Mail: Fetchmail Service* scheduled
|
||||
action.
|
||||
|
||||
Additionally, using an incoming mail server in Odoo gives the opportunity to create new records in a
|
||||
specified model. Each incoming mail server can create records in a different model.
|
||||
|
||||
.. example::
|
||||
Emails received on `task@company-name.com` are fetched by the Odoo database. All fetched emails will
|
||||
create a new project task in the database.
|
||||
|
||||
.. image:: email_servers_inbound/incoming-mail-server.png
|
||||
:alt: Technical schema of mailing route when using a custom domain in Odoo.
|
||||
|
||||
.. _email-inbound-custom-domain-mx:
|
||||
|
||||
MX record
|
||||
---------
|
||||
|
||||
A third option is to create a MX record in your DNS zone which specifies the mail server managing
|
||||
emails sent to your domain. **Advanced technical knowledge is required.**
|
||||
|
||||
.. important::
|
||||
This configuration only works with a subdomain on the Odoo Online or Odoo.sh infrastructure
|
||||
(e.g., `@mail.mydomain.com`)
|
||||
|
||||
Below are presented some specifications depending on the hosting type:
|
||||
|
||||
.. tabs::
|
||||
|
||||
.. group-tab:: Odoo Online
|
||||
|
||||
The custom subdomain must be added to your :doc:`Odoo Portal
|
||||
<../../websites/website/configuration/domain_names>`.
|
||||
|
||||
.. group-tab:: Odoo.sh
|
||||
|
||||
The custom subdomain must be added to the :doc:`settings of the project
|
||||
<../../../administration/odoo_sh/getting_started/settings>`:
|
||||
|
||||
.. image:: email_servers_inbound/custom-subdomain-sh.png
|
||||
:alt: Adding a custom subdomain for mail to Odoo.sh project settings.
|
||||
|
||||
.. _email-inbound-loops:
|
||||
|
||||
Infinite email loops
|
||||
====================
|
||||
|
||||
In some cases, infinite mailing loops can be created. Odoo provides some protection against such
|
||||
loops, ensuring the same sender cannot send too many emails **that would create records** to an alias in
|
||||
a specific time span.
|
||||
|
||||
By default, an email address can send up to 20 emails in 120 minutes. If more emails are sent, they
|
||||
are blocked and the sender receives the following message:
|
||||
|
||||
.. image:: email_servers_inbound/bounce-mail-loop.png
|
||||
:alt: Bounce email received after attempting contact too many times an alias.
|
||||
|
||||
To change the default behavior, enable :ref:`developer-mode`, then go to :menuselection:`Settings
|
||||
--> Technical --> Parameters: System Parameters` to add two parameters.
|
||||
|
||||
- For the first parameter, enter `mail.gateway.loop.minutes` as the :guilabel:`Key` and choose a
|
||||
number of minutes as the :guilabel:`Value` (`120` is the default behavior).
|
||||
- For the second parameter, enter `mail.gateway.loop.threshold` as the :guilabel:`Key` and choose a
|
||||
number of emails as the :guilabel:`Value` (`20` is the default behavior).
|
||||
|
||||
.. important::
|
||||
These parameters are only used to prevent the creation of new records. They **do not prevent
|
||||
replies** from being added to the chatter.
|
||||
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 9.6 KiB |
|
After Width: | Height: | Size: 4.7 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 12 KiB |
@@ -0,0 +1,332 @@
|
||||
========================
|
||||
Manage outbound messages
|
||||
========================
|
||||
|
||||
.. _email-outbound-default:
|
||||
|
||||
Sending emails with Odoo's default configuration
|
||||
================================================
|
||||
|
||||
On **Odoo Online** and **Odoo.sh**, sending and receiving emails works out of the box. No
|
||||
configuration is required.
|
||||
|
||||
When a database is created, the subdomain `company-name.odoo.com` is used to send and receive
|
||||
emails. The deliverability is optimized for this subdomain as it uses Odoo’s DNS configuration.
|
||||
|
||||
.. example::
|
||||
If the database subdomain is `company-name.odoo.com` and all mailing configurations are the
|
||||
default ones, all emails will be sent from `notifications@company-name.odoo.com`.
|
||||
|
||||
.. image:: email_servers_outbound/diagram-inbound-mailing-method.png
|
||||
:alt: Odoo’s default outbound messages configuration.
|
||||
|
||||
Emails are sent with `catchall@company-name.odoo.com` as the *reply-to* address. In addition,
|
||||
delivery errors are sent to `bounce@company-name.odoo.com`.
|
||||
|
||||
.. note::
|
||||
The catchall, bounce, and notification addresses do not work like other aliases. They do not have
|
||||
the vocation to create records in a database. Emails sent to an alias are automatically routed
|
||||
and will reply to an existing and linked record or will create a new one in the database.
|
||||
|
||||
.. _email-outbound-custom-domain:
|
||||
|
||||
Using a custom domain to send emails
|
||||
====================================
|
||||
|
||||
The database can be configured to use a custom domain, in which case all default email addresses are
|
||||
built using the custom domain. If the custom domain is `company-name.com`, the sender address will
|
||||
be `notifications@company-name.com`, the *reply-to* address `catchall@company-name.com`, and the
|
||||
*bounce* address `bounce@company-name.com`. The custom domain can be utilized when sending emails
|
||||
either with Odoo’s email servers or an external one.
|
||||
|
||||
This section assumes ownership of a custom domain. If not, a custom domain must be purchased from a
|
||||
domain registrar such as GoDaddy, Namecheap, or any alternative provider.
|
||||
|
||||
.. _email-outbound-custom-domain-odoo-server:
|
||||
|
||||
Using a custom domain with Odoo’s email server
|
||||
----------------------------------------------
|
||||
|
||||
On **Odoo Online** or **Odoo.sh**, some configurations are mandatory in the custom domain's DNS to
|
||||
ensure good deliverability.
|
||||
|
||||
.. warning::
|
||||
Most of the configuration will be done on the domain provider’s side, and it might require some
|
||||
configuration on the mail server itself. **Some technical knowledge is required.**
|
||||
|
||||
The first step is to configure the :ref:`SPF <email-domain-spf>` and :ref:`DKIM <email-domain-dkim>`
|
||||
to be compliant with Odoo’s mail server.
|
||||
|
||||
Next, the custom domain must be set as the alias domain of a company. Select the company, open the
|
||||
:guilabel:`Settings`, and add the custom domain under the :guilabel:`Alias Domain` field.
|
||||
|
||||
After adding the alias domain, click the :icon:`oi-arrow-right` (:guilabel:`internal link`) icon to
|
||||
assign more companies to the custom domain if needed. Enable the :ref:`developer-mode` mode to
|
||||
modify the default aliases if desired:
|
||||
|
||||
- :guilabel:`Bounce Alias`: the mailbox used to catch delivery errors and populate the :ref:`red
|
||||
envelope <email-issues-outgoing-delivery-failure>` on the corresponding message.
|
||||
- :guilabel:`Catchall Alias`: the default mailbox used to centralize all replies.
|
||||
- :guilabel:`Default From Alias`: the default sender address.
|
||||
|
||||
.. note::
|
||||
At the creation of the first alias domain, all companies will use it. If you create a new
|
||||
company, the alias domain automatically set is the one with the lowest priority (ad displayed on
|
||||
the alias domain list in :ref:`developer-mode`).
|
||||
|
||||
All email aliases (e.g., related to CRM or Helpdesk teams) must have their corresponding mailbox in
|
||||
the custom domain mail server.
|
||||
|
||||
.. image:: email_servers_outbound/diagram-owned-domain-odoo-server.png
|
||||
:alt: Technical schema of external mail server configuration with Odoo.
|
||||
|
||||
To receive emails in the Odoo database within the corresponding chatter (CRM, invoices, sales
|
||||
orders, etc.), one of these three methods must be used:
|
||||
|
||||
- :ref:`Redirections/forwarding <email-inbound-custom-domain-redirections>`,
|
||||
- :ref:`Incoming mail servers <email-inbound-custom-domain-incoming-server>`,
|
||||
- :ref:`MX record <email-inbound-custom-domain-mx>` (requires advanced technical knowledge)
|
||||
|
||||
Using a custom domain implies that specific :ref:`local-parts
|
||||
<email-outbound-custom-domain-smtp-server-local-part>` might be used by Odoo to send emails.
|
||||
|
||||
.. _email-outbound-custom-domain-smtp-server:
|
||||
|
||||
Sending emails with an external SMTP server
|
||||
-------------------------------------------
|
||||
|
||||
.. note::
|
||||
If utilizing your own outgoing mail server, it must be paired with your own domain, as updating
|
||||
the DNS of an Odoo subdomain is not feasible.
|
||||
|
||||
To add an external SMTP server in Odoo, open :guilabel:`Settings`, and enable the :guilabel:`Use
|
||||
Custom Email Servers` option found under the :guilabel:`Discuss` section.
|
||||
|
||||
Still under the :guilabel:`Discuss` section, click :guilabel:`Outgoing Email Servers`, then `New` to
|
||||
create an outgoing mail server record. Most fields are the common parameters used to set up a
|
||||
connection to an SMTP server; use the values provided by your email provider.
|
||||
|
||||
Once completed, click :guilabel:`Test Connection`. Note that a successful test connection does not
|
||||
confirm that the email will go out as some restriction might remain on the provider side, thus, it
|
||||
is recommended to consult your provider’s documentation.
|
||||
|
||||
.. _email-outbound-custom-domain-smtp-server-local-part:
|
||||
|
||||
Local-part values
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
Below are presented the different local-part values that can be used by Odoo to send emails. It
|
||||
might be required to whitelist them in your mail server:
|
||||
|
||||
- The Alias Domain Bounce Alias (default value = `bounce`),
|
||||
- The Alias Domain Default From (default value = `notifications`),
|
||||
- The default admin address `admin@company-name.odoo.com` or, if changed, the new value),
|
||||
- The default Odoobot address `odoobot@company-name.odoo.com` or, if changed, the new value),
|
||||
- The specific FROM defined on an email marketing campaign,
|
||||
- The specific FROM that can be defined in an email template.
|
||||
|
||||
.. seealso::
|
||||
- :doc:`google_oauth`
|
||||
- :doc:`azure_oauth`
|
||||
|
||||
.. _email-outbound-different-servers:
|
||||
|
||||
Setting up different servers for transactional and mass emails
|
||||
==============================================================
|
||||
|
||||
.. _email-outbound-different-servers-personalized:
|
||||
|
||||
Personalized mail servers
|
||||
-------------------------
|
||||
|
||||
Transactional emails and mass mailings can be sent using separate email servers in Odoo. Doing so
|
||||
means day-to-day emails, quotations, or invoices sent to clients will be handled as *transactional
|
||||
emails*. *Mass mailing emails*, including the sending of batches of invoices or quotations, will be
|
||||
managed by the Marketing Automation or Email Marketing application.
|
||||
|
||||
.. example::
|
||||
You can use services like Gmail, Amazon SES, or Brevo for transactional emails, and services like
|
||||
Mailgun, Sendgrid, or Mailjet for mass mailings.
|
||||
|
||||
First, activate the :ref:`developer-mode` and go to :menuselection:`Settings --> Technical -->
|
||||
Email: Outgoing Mail Servers`. There, add two outgoing email server records, one for the
|
||||
transactional emails server and one for the mass mailings server. Enter a lower :guilabel:`Priority`
|
||||
value for the transactional server (e.g., `1`) over the mass mailings server (e.g., `2`) so
|
||||
transactional emails are given priority.
|
||||
|
||||
.. image:: email_servers_outbound/split-transaction-massmail-mail-servers.png
|
||||
:alt: Example of split between transaction and mass mailing mail servers.
|
||||
|
||||
Now, go to :menuselection:`Email Marketing --> Configuration --> Settings`, enable
|
||||
:guilabel:`Dedicated Server`, and select the appropriate email server. Odoo uses the server
|
||||
with the lowest priority value for transactional emails, and the server selected here for mass
|
||||
mailings.
|
||||
|
||||
.. image:: email_servers_outbound/dedicated-mass-mail-server.png
|
||||
:alt: Dedicated mail server on Email Marketing app settings.
|
||||
|
||||
.. _email-outbound-different-servers-personalized-from-filtering:
|
||||
|
||||
FROM filtering
|
||||
~~~~~~~~~~~~~~
|
||||
|
||||
.. important::
|
||||
It’s **highly recommended** to configure the FROM Filtering on the outgoing mail servers as per
|
||||
the instructions of your provider.
|
||||
|
||||
The :guilabel:`FROM Filtering` field allows for the use of a specific outgoing email server
|
||||
depending on the *From* email address or domain that Odoo is sending on behalf of. The **value must
|
||||
be a domain or a complete address** that matches the sender’s email address and is trusted on the
|
||||
outgoing mail server provider's side.
|
||||
|
||||
If FROM filtering is not used, emails will go out using the notification address.
|
||||
|
||||
.. warning::
|
||||
Some outgoing mail servers require a specific configuration of the FROM filter.
|
||||
|
||||
When an email is sent from Odoo, the following sequence is used to choose the outgoing email server:
|
||||
|
||||
- First, Odoo searches for a server that has the same FROM filtering value as the From value (i.e.,
|
||||
email address) defined in the outgoing email. This configuration is ideal if all users of a
|
||||
company share the same domain but have different local-parts.
|
||||
|
||||
.. example::
|
||||
If the sender's email address is `test@example.com`, only an email server having a FROM filtering
|
||||
value equal to `test@example.com` or `example.com` can be used.
|
||||
|
||||
- If no server is found based on the first criteria, Odoo looks for the first server
|
||||
without a FROM filtering value set. The email will be overridden with the notification address.
|
||||
|
||||
- If no server is found based on the second criteria, Odoo uses the first server, and the email will
|
||||
be overridden with the notification address.
|
||||
|
||||
.. note::
|
||||
To determine which server is first, Odoo uses the priority value (the lower the value is, the
|
||||
higher the priority is). Failing to do so, the first server is determined by the servers' names,
|
||||
using alphabetical order.
|
||||
|
||||
It is also possible to use Odoo's mail server for transactional emails in addition to mass mailings.
|
||||
|
||||
.. _email-outbound-different-servers-external-odoo:
|
||||
|
||||
Using an external email server and Odoo’s default server
|
||||
--------------------------------------------------------
|
||||
|
||||
On Odoo Online and Odoo.sh, databases are started with Odoo's SMTP server. If no outgoing mail
|
||||
server is set, the default Odoo's SMTP server will be used.
|
||||
|
||||
.. image:: email_servers_outbound/command-line-interface-option-mail-server.png
|
||||
:alt: Adding a mail server using the Odoo's mail server with the CLI authentication.
|
||||
|
||||
.. example::
|
||||
If an outgoing mail server is used simultaneously with Odoo’s default server (CLI), the FROM
|
||||
filter of the outgoing mail server must contain a custom domain, and the FROM filter of the CLI
|
||||
must contain Odoo’s subdomain. If there is no FROM filtering, the email will go out using the
|
||||
notification address.
|
||||
|
||||
.. image:: email_servers_outbound/split-mail-servers.png
|
||||
:alt: Splitting of Odoo mail server for transactional emails and Mail server for Mass mailing.
|
||||
|
||||
.. note::
|
||||
On Odoo Online, the command line interface is equivalent to the default Odoo mail
|
||||
server, using the same limit as if there was no outgoing mail server in place.
|
||||
|
||||
.. tip::
|
||||
On Odoo Online, the page also shows your daily email usage and your daily limit. On Odoo.sh, you
|
||||
need to check on the monitor page the number of outgoing emails that were sent.
|
||||
|
||||
.. note::
|
||||
On Odoo.sh, to use the command-line interface, an outgoing mail server can be configured on the
|
||||
configuration file.
|
||||
|
||||
.. warning::
|
||||
Odoo’s mail server is meant for transactional emails and small-scale marketing campaigns. The
|
||||
:ref:`daily limit <email-issues-outgoing-delivery-failure-messages-limit>` depends on the
|
||||
database type and the applications used.
|
||||
|
||||
.. _email-outbound-custom-domain-external-server:
|
||||
|
||||
Using a custom domain with an external email server
|
||||
===================================================
|
||||
|
||||
Similar to the :ref:`previous chapter <email-outbound-different-servers-external-odoo>`, proper
|
||||
configuration might be needed to ensure that the external email server is allowed to send emails
|
||||
using your custom domain. Refer to your provider’s documentation to properly set up the relevant
|
||||
records (SPF, DKIM, and DMARC). A list of the :ref:`most common providers is available
|
||||
<email-domain-providers-documentation>`.
|
||||
|
||||
.. note::
|
||||
DNS configuration is required when you use your own domain. If an external outgoing mail server
|
||||
is used, configuring the records as described in the :doc:`Odoo DNS configuration for our mail
|
||||
servers documentation <email_domain>` **will not have the desired effect**, as it is independent
|
||||
of Odoo when using a custom email server. Odoo does not allow the configuration of Odoo's
|
||||
subdomain.
|
||||
|
||||
.. _email-outbound-port-restriction:
|
||||
|
||||
Port restriction
|
||||
================
|
||||
|
||||
Port 25 is blocked for security reasons on Odoo Online and Odoo.sh. Try using port 465, 587, or 2525
|
||||
instead.
|
||||
|
||||
.. _email-outbound-alias-domain:
|
||||
|
||||
Alias domain
|
||||
============
|
||||
|
||||
The catchall domain is company-specific. By default, all companies share Odoo’s subdomain (e.g.,
|
||||
`company-name.odoo.com`), but each company may have its own custom email domain.
|
||||
|
||||
When the :ref:`developer-mode` is activated, the alias domain options are available by going to
|
||||
:menuselection:`Settings --> Technical --> Email: Alias Domains`.
|
||||
|
||||
.. warning::
|
||||
Any modification of the alias domain must be done very carefully. If one of the aliases (bounce,
|
||||
catchall, default from) is changed, all previous emails that are not properly redirected to the
|
||||
new aliases will be lost.
|
||||
|
||||
The :guilabel:`Default From Alias` field can be filled with a local-part of the email address (by
|
||||
default `notifications`) or a full email address. Configure it to determine the `FROM` header of
|
||||
your emails. If a full email address is used, all outgoing emails will be overwritten with this
|
||||
address.
|
||||
|
||||
.. _email-outbound-notifications:
|
||||
|
||||
Notification system
|
||||
===================
|
||||
|
||||
When an email is sent from the chatter, customers can reply directly to it. If a customer replies
|
||||
directly to an email, the answer is logged in the same chatter, thus functioning as a message thread
|
||||
related to the record.
|
||||
|
||||
Upon receiving the reply, Odoo then uses the subscribed followers (based on the subscribed subtypes)
|
||||
to send them a notification by email, or in the Odoo inbox, depending on the user’s preferences.
|
||||
|
||||
.. example::
|
||||
If a customer with the email address `“Mary” <mary@customer.example.com>` makes a direct reply to
|
||||
an email coming from the Odoo database, Odoo's default behavior is to redistribute the email's
|
||||
content to all other followers within the thread.
|
||||
|
||||
As Mary’s domain does not belong to the alias domain, Odoo overrides the email address and uses
|
||||
the notification email address to notify the followers. This override depends on the
|
||||
configuration done in the database. By default, on Odoo Online and Odoo.sh, the email `FROM`
|
||||
address will be overridden with the value `notifications@company-name.odoo.com` instead of
|
||||
`mary@customer.example.com`.
|
||||
|
||||
The address is constructed using the name of the sender and
|
||||
`{alias domain, default from alias}`@`{alias domain, domain name}`, by default,
|
||||
`notifications@company-name.odoo.com`.
|
||||
|
||||
.. _email-outbound-unique-address:
|
||||
|
||||
Using a unique email address for all outgoing emails
|
||||
====================================================
|
||||
|
||||
To force the email address from which emails are sent, activate the :ref:`developer-mode`, and go to
|
||||
:menuselection:`Settings --> Technical --> Email: Alias Domains`. On the :guilabel:`Default From
|
||||
Alias`, use the the local-part or a complete email address as the value.
|
||||
|
||||
.. warning::
|
||||
If a **complete address** is used as the :guilabel:`Default From Alias` value, **all** outgoing
|
||||
emails will be overwritten by this address.
|
||||
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 5.7 KiB |
|
After Width: | Height: | Size: 7.7 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 8.7 KiB |