Compare commits

...

78 Commits

Author SHA1 Message Date
Marion (masp) e328ef3b9f [IMP] website: landing page
taskID-3710109
2024-08-12 11:00:11 +02:00
tong-odoo cf46224fda [IMP] accounting: clarfy mandatory field for EMV qr code
closes odoo/documentation#10653

Signed-off-by: Tommy Ng (tong) <tong@odoo.com>
2024-08-08 20:37:06 +00:00
KC (ksc) 41a8050f34 [IMP] accounting: adding requested link to sales doc
closes odoo/documentation#10657

Signed-off-by: Samuel Lieber (sali) <sali@odoo.com>
2024-08-08 15:47:51 +00:00
Lara Martini (larm) 45d88420e8 [ADD] Expenses: reinvoicing expenses
closes odoo/documentation#10394

Signed-off-by: Lara Martini (larm) <larm@odoo.com>
2024-08-08 15:47:43 +00:00
afma-odoo cb30a15eb9 [IMP] accounting: clarify SEPA credit transfer page
task-4019186

closes odoo/documentation#10618

X-original-commit: 0665e787a9
Signed-off-by: Anne-Françoise Marcq (afma) <afma@odoo.com>
2024-08-08 13:58:40 +00:00
KC (ksc) c987e2e98e [IMP] crm: add sales/quotation admon
closes odoo/documentation#10637

Signed-off-by: Zachary Straub (zst) <zst@odoo.com>
2024-08-07 23:00:53 +00:00
KC (ksc) 980b6ad41b [IMP] sales: add pricelist to loyalty prgms
closes odoo/documentation#10064

Signed-off-by: Samuel Lieber (sali) <sali@odoo.com>
2024-08-07 23:00:51 +00:00
Lara Martini (larm) b8607a24a8 [IMP] Time Off: updating requested allocation doc
closes odoo/documentation#10627

Signed-off-by: Samuel Lieber (sali) <sali@odoo.com>
2024-08-07 21:18:37 +00:00
Lara Martini (larm) c1d5ddc361 [ADD] Expenses: reimburse employees doc
closes odoo/documentation#10393

Signed-off-by: Lara Martini (larm) <larm@odoo.com>
2024-08-07 21:18:36 +00:00
sami odoo 9dc985ef47 [IMP] reference/user_interface: update documentation regarding widget in graph
This commit aims to update the documentation regarding the adaptability of
widgets in the graph view of Odoo.

Task-3861721

closes odoo/documentation#10573

Signed-off-by: Mathieu Duckerts-Antoine (dam) <dam@odoo.com>
2024-08-05 17:29:49 +00:00
Odoo Translation Bot f78570e908 [I18N] *: fetch 17.0 translations from Transifex 2024-08-05 06:23:22 +00:00
Odoo Translation Bot 469e8b6f17 [I18N] *: fetch 17.0 translations from Transifex 2024-08-05 06:19:38 +00:00
xpl-odoo 36d2b66f59 [ADD] sign: legality in 40 countries
task-4008122

closes odoo/documentation#10575

X-original-commit: 015ce987e2
Signed-off-by: Xavier Platteau (xpl) <xpl@odoo.com>
2024-08-03 07:53:16 +00:00
jero-odoo 3256aa02bd [IMP] iot: remove connect printer to work center
closes odoo/documentation#10536

Signed-off-by: Samuel Lieber (sali) <sali@odoo.com>
2024-08-02 19:28:36 +00:00
KC (ksc) ad0619e7fe [FIX] events: events.rst adjustments
closes odoo/documentation#10479

Signed-off-by: Samuel Lieber (sali) <sali@odoo.com>
2024-08-02 19:28:34 +00:00
KC (ksc) 6aca6f83d3 [REF] sms marketing: remove essentials and pricing
closes odoo/documentation#10277

Signed-off-by: Kevin Scannell (ksc) <ksc@odoo.com>
2024-08-02 19:28:31 +00:00
bve-odoo 00077597d2 [FIX] mail: 17.0 full rework of mail communication documentation
1/ Revamp of email_servers to be a introduction and allow correct redirection
+ redirection to other pages linked to mailing + ToC of email_communication folder

2/ Splitting inbound and outbound message into subfiles:
2.a/ email_servers_inbound: all documentation related to incoming emails
2.b/ email_servers_outbound: documentartion related to outgoing emails

3/ email_domain (as before) about authentication protocols to set on domains.

4/ faq: complete revamp to better match usual issues about mailings.

Also: removed unused images, adding anchors on other docs.

RST co-authored-by: jorv-odoo, jqu-odoo, xpl-odoo

doc writers:
- email_servers_inbound by qco-odoo
- email_servers_outbound by EMBR
- email_servers by abridbus
- email_domain by jqu-odoo
- faq by jorv-odoo

related documentation task-3875591

closes odoo/documentation#9935

Signed-off-by: Xavier Platteau (xpl) <xpl@odoo.com>
2024-08-02 19:28:24 +00:00
igbe c9c5af7045 [IMP] l10n_es_modelo130, l10n_es_reports_modelo130: Tax report: Modelo 130
Add the modelo 130 report and the corresponding BOE files export for spain localization.

As it's a brand-new report, we had to add it in a dedicated module.

task-3866238

closes odoo/documentation#9782

Related: odoo/odoo#164946
Related: odoo/enterprise#62197
Signed-off-by: Igor Bertrand (igbe) <igbe@odoo.com>
2024-08-02 19:28:24 +00:00
Tom Aarab (toaa) c36ad6720b [IMP] accounting: vat unit renamed
taskid-4069502

closes odoo/documentation#10339

Signed-off-by: Audrey Vandromme (auva) <auva@odoo.com>
2024-08-02 07:55:58 +00:00
masi-odoo 3d04daa3f7 [IMP] accounting/l10n_cl: Fiscal PDF report image
Adds image of accepted invoice PDF report with the fiscal elements needed. It replaces the last image used, which had sensitive information of a third party company.

Link to image: https://drive.google.com/file/d/1JYymyUVz_3q6bBg-yrgM_i6Di9gLcqOc/view?usp=sharing

closes odoo/documentation#10524

X-original-commit: 8a0a028f91
Signed-off-by: Audrey Vandromme (auva) <auva@odoo.com>
2024-08-02 06:17:36 +00:00
Audrey (auva) a9febaea2d [FIX] project: change save icon
To comply with (future) guidelines

closes odoo/documentation#10529

Signed-off-by: Audrey Vandromme (auva) <auva@odoo.com>
2024-08-01 19:09:54 +00:00
Ricardo Gomes Rodrigues f1090218e8 [IMP] accounting: add name to hashed fields
This has been done in https://github.com/odoo/odoo/commit/1dcd071b27779e7d6d8f536c7dce7002d27212ba

closes odoo/documentation#10523

X-original-commit: c04c6700f4
Signed-off-by: Audrey Vandromme (auva) <auva@odoo.com>
Signed-off-by: Ricardo Gomes Rodrigues (rigr) <rigr@odoo.com>
2024-08-01 19:09:53 +00:00
Tom Aarab (toaa) 3cce09c199 [IMP] accounting: screenshot and related content update
taskid-3866429

17 and +: change screenshot to new design

closes odoo/documentation#10514

X-original-commit: 01191af74e
Signed-off-by: Audrey Vandromme (auva) <auva@odoo.com>
2024-08-01 19:09:52 +00:00
Sam Lieber (sali) 9e8a7f54e3 [IMP] data cleaning: recycle rules
closes odoo/documentation#9938

Signed-off-by: Zachary Straub (zst) <zst@odoo.com>
Co-authored-by: ksc-odoo <73958186+ksc-odoo@users.noreply.github.com>
2024-08-01 19:09:48 +00:00
Lara Martini (larm) 66b2a2380c [ADD] Expenses: new log expenses doc
closes odoo/documentation#10322

Signed-off-by: Samuel Lieber (sali) <sali@odoo.com>
2024-08-01 19:09:46 +00:00
Parish Bracha b17e44ea59 [ADD] crm: new lead distribution report
closes odoo/documentation#9915

Signed-off-by: Parish Bracha (pabr) <pabr@odoo.com>
2024-08-01 19:09:43 +00:00
rps-odoo 730eb3086d [IMP] accounting/l10n_cl: add Importante note to F29 report
closes odoo/documentation#10161

Signed-off-by: Audrey Vandromme (auva) <auva@odoo.com>
2024-08-01 16:29:49 +00:00
Tom Aarab (toaa) f200abf259 [IMP] accounting: branches oaf vs paid plan
taskid-3943368

closes odoo/documentation#10447

Signed-off-by: Audrey Vandromme (auva) <auva@odoo.com>
2024-08-01 14:48:41 +00:00
Tom Aarab (toaa) 84017e77a5 [IMP] uk: bacs files
Adding BACS files to doc

taskid-3987973

closes odoo/documentation#10307

Signed-off-by: Audrey Vandromme (auva) <auva@odoo.com>
2024-08-01 09:01:36 +00:00
Audrey (auva) d811aef87c [IMP] Studio: update views page
task-3553099

closes odoo/documentation#10449

Signed-off-by: Audrey Vandromme (auva) <auva@odoo.com>
2024-08-01 06:59:42 +00:00
jero-odoo 4f40ebd78f [IMP] iot: add connect printer note
closes odoo/documentation#10450

Signed-off-by: Jessica Rogers (jero) <jero@odoo.com>
Co-authored-by: ksc-odoo <73958186+ksc-odoo@users.noreply.github.com>
2024-07-31 21:06:17 +00:00
John Holton (hojo) 7797ce1fe2 [REF] Manufacturing: reporting restructure
closes odoo/documentation#10405

Signed-off-by: Samuel Lieber (sali) <sali@odoo.com>
2024-07-31 21:06:15 +00:00
John Holton (hojo) be3a6f6f54 [IMP] Purchase: update reporting
closes odoo/documentation#10400

Signed-off-by: John Holton (hojo) <hojo@odoo.com>
2024-07-31 21:06:14 +00:00
Felicious 9a549510be [IMP] inventory: shipping rule note
closes odoo/documentation#10382

X-original-commit: 2fd4af7619
Signed-off-by: Samuel Lieber (sali) <sali@odoo.com>
Signed-off-by: Felicia Kuan (feku) <feku@odoo.com>
2024-07-31 21:06:13 +00:00
Lara Martini (larm) b6372019d6 [ADD] Expenses: approve expense reports
closes odoo/documentation#10360

Signed-off-by: Samuel Lieber (sali) <sali@odoo.com>
2024-07-31 21:06:12 +00:00
John Holton (hojo) fccd4e5d88 [ADD] Inventory: FedEx integration
closes odoo/documentation#10331

Signed-off-by: John Holton (hojo) <hojo@odoo.com>
2024-07-31 21:06:11 +00:00
KC (ksc) 196553ca1e [IMP] social marketing: doc restructure
closes odoo/documentation#10234

Signed-off-by: Samuel Lieber (sali) <sali@odoo.com>
2024-07-31 21:06:07 +00:00
KC (ksc) 5b427ac874 [IMP] subscriptions: physical product admonition
closes odoo/documentation#9843

Signed-off-by: Samuel Lieber (sali) <sali@odoo.com>
2024-07-31 21:06:05 +00:00
laro-odoo 3badb434e1 [IMP] web: make date widget work with datetime field
Task-3698841

closes odoo/documentation#10325

Related: odoo/odoo#161705
Related: odoo/enterprise#67258
Signed-off-by: Mathieu Duckerts-Antoine (dam) <dam@odoo.com>
2024-07-31 21:06:03 +00:00
Felicious 55ec59ba24 [IMP] inventory: reserve full vs partial packaging
closes odoo/documentation#9729

X-original-commit: dc0dec9d65
Signed-off-by: Felicia Kuan (feku) <feku@odoo.com>
Signed-off-by: Samuel Lieber (sali) <sali@odoo.com>
Co-authored-by: ksc-odoo <73958186+ksc-odoo@users.noreply.github.com>
Co-authored-by: Sam Lieber (sali) <36018073+samueljlieber@users.noreply.github.com>
2024-07-31 21:06:00 +00:00
Antoine Vandevenne (anv) 7e3309b922 [FIX] contributing/development: fix doc reference to tutorials.rst
closes odoo/documentation#10471

X-original-commit: 747e1bab14
Signed-off-by: Antoine Vandevenne (anv) <anv@odoo.com>
2024-07-31 15:18:42 +00:00
KC (ksc) 6f74248de1 [IMP] sales: adding global discount info
closes odoo/documentation#9962

Signed-off-by: Kevin Scannell (ksc) <ksc@odoo.com>
2024-07-30 23:55:05 +00:00
KC (ksc) be0b5e65d5 [ADD] events: revenues report
closes odoo/documentation#9953

Signed-off-by: Kevin Scannell (ksc) <ksc@odoo.com>
2024-07-30 22:09:40 +00:00
Lara Martini (larm) 83b6895deb [ADD] Expenses: post expenses to accounting journals
closes odoo/documentation#10392

Signed-off-by: Lara Martini (larm) <larm@odoo.com>
2024-07-30 20:29:06 +00:00
Felicious 16537bb9c5 [IMP] barcode: add nomenclature example
closes odoo/documentation#10432

X-original-commit: 70c736d57a
Signed-off-by: Felicia Kuan (feku) <feku@odoo.com>
Co-authored-by: ksc-odoo <73958186+ksc-odoo@users.noreply.github.com>
Co-authored-by: Sam Lieber (sali) <36018073+samueljlieber@users.noreply.github.com>
2024-07-30 16:12:14 +00:00
Lara Martini (larm) 71e2a50d40 [ADD] Fleet: new accident management doc
closes odoo/documentation#10263

Signed-off-by: Lara Martini (larm) <larm@odoo.com>
2024-07-30 14:38:39 +00:00
xmo-odoo 514c175824 [FIX] contributing: remove smart quotes
There have been several new odooers who've hit legal/cla mismatches, and after
investigation their email address would be smart quoted in git (e.g.
`<“uid@example.org”>`).

That the documentation itself uses smart quotes is highly suspicious, it would
make sense that new developers just pasted the provided command, updated it to
match, and didn't even notice the quotes were wrong: `git` is perfectly happy
with it, only on reading it back can you realise it's wrong and the guide
doesn't say anything about *that*.

So fix the quotes in the doc, and hopefully that'll resolve the issue.

closes odoo/documentation#10442

X-original-commit: 811b442fcc
Signed-off-by: Xavier Morel (xmo) <xmo@odoo.com>
2024-07-30 13:03:27 +00:00
KC (ksc) 65e7f1b3c5 [ADD] events: registration desk doc (17)
closes odoo/documentation#9348

Signed-off-by: Kevin Scannell (ksc) <ksc@odoo.com>
2024-07-29 23:55:40 +00:00
Felicious d362d4ebdb [ADD] inventory: storage categories
closes odoo/documentation#10412

X-original-commit: c70a77153e
Signed-off-by: Felicia Kuan (feku) <feku@odoo.com>
Co-authored-by: pabr-odoo <pabr@odoo.com>
Co-authored-by: ksc-odoo <73958186+ksc-odoo@users.noreply.github.com>
Co-authored-by: Sam Lieber (sali) <36018073+samueljlieber@users.noreply.github.com>
2024-07-29 22:37:40 +00:00
KC (ksc) 1aee294219 [ADD] sales: create quotations doc
closes odoo/documentation#9749

Signed-off-by: Kevin Scannell (ksc) <ksc@odoo.com>
2024-07-29 20:45:38 +00:00
Parish Bracha d8cd13b659 [ADD] Subscriptions: Wire transfer
closes odoo/documentation#10276

Signed-off-by: Parish Bracha (pabr) <pabr@odoo.com>
2024-07-29 18:10:57 +00:00
Marion (masp) 2f5e130179 [IMP] website: complete google search console doc
task-3799063

closes odoo/documentation#10342

X-original-commit: bea85886d4
Signed-off-by: Audrey Vandromme (auva) <auva@odoo.com>
Signed-off-by: Marion Spindler (masp) <masp@odoo.com>
2024-07-29 10:53:47 +00:00
Tom Aarab (toaa) d5fd2f1c66 [IMP] mexico: broken url
Removing a dead URL

taskid-3636231

closes odoo/documentation#10348

X-original-commit: 0451d1f2a8
Signed-off-by: Audrey Vandromme (auva) <auva@odoo.com>
2024-07-29 09:07:04 +00:00
Sam Lieber (sali) 92c5c3db31 [FW][FIX] accounting/l10n_cl: remove company image
closes odoo/documentation#10396

X-original-commit: 44c2b65fa0
Signed-off-by: Zachary Straub (zst) <zst@odoo.com>
2024-07-27 06:05:55 +00:00
jero-odoo bed068f95a [IMP] General: Multi-Company Limitations
closes odoo/documentation#10315

Signed-off-by: Samuel Lieber (sali) <sali@odoo.com>
Co-authored-by: ksc-odoo <73958186+ksc-odoo@users.noreply.github.com>
2024-07-27 06:05:44 +00:00
John Holton (hojo) 7212fc98cd [IMP] Essentials: update search doc
closes odoo/documentation#10235

Signed-off-by: John Holton (hojo) <hojo@odoo.com>
2024-07-27 06:05:43 +00:00
Lara Martini (larm) 3b40e6c1ec [ADD] Expenses: new expese reports doc
closes odoo/documentation#10308

Signed-off-by: Lara Martini (larm) <larm@odoo.com>
2024-07-26 21:19:38 +00:00
jero-odoo d2497d2b14 [IMP] Essentials:  Export and Import
closes odoo/documentation#10293

Signed-off-by: Jessica Rogers (jero) <jero@odoo.com>
Co-authored-by: larm-odoo <121518652+larm-odoo@users.noreply.github.com>
Co-authored-by: ksc-odoo <73958186+ksc-odoo@users.noreply.github.com>
Co-authored-by: Sam Lieber (sali) <36018073+samueljlieber@users.noreply.github.com>
2024-07-26 21:19:36 +00:00
bve-odoo 5965bad8ea [FIX] microsoft_outlook: redirect URL error if not matching
_compute_outlook_uri is using get_base_url, providing the
web.base.url of the database that is subject to changed as
stated on the website documentation: if the user logging-in
is using another URL to connect to the db, and has the
Administration/Settings access right (res.groups: base.group_system)

opw-4056377

closes odoo/documentation#10374

X-original-commit: 1f7c0a9b2e
Signed-off-by: Baptiste Vergote (bve) <bve@odoo.com>
2024-07-26 15:12:40 +00:00
Tom Aarab (toaa) ee8aed02c8 [IMP] argentina: menu move
taskid-3962220

closes odoo/documentation#10333

Signed-off-by: Audrey Vandromme (auva) <auva@odoo.com>
2024-07-26 05:57:45 +00:00
John Holton (hojo) 17787e62c3 [ADD] Manufacturing: Production analysis report
closes odoo/documentation#10155

Signed-off-by: John Holton (hojo) <hojo@odoo.com>
2024-07-25 19:38:39 +00:00
rps-odoo 7ecaf74124 [IMP] accounting/l10n_ec: point of sale invoicing
closes odoo/documentation#8962

Signed-off-by: Samuel Lieber (sali) <sali@odoo.com>
2024-07-25 19:38:38 +00:00
Lara Martini (larm) afbc491940 [ADD] Recruitment: adding new recruitment flow doc
closes odoo/documentation#9616

Signed-off-by: Lara Martini (larm) <larm@odoo.com>
2024-07-25 15:06:16 +00:00
Zuzanna Luczynska b3e2b51a6a [ADD] project: new doc about sub-tasks
taskid-4066254

closes odoo/documentation#10290

Signed-off-by: Audrey Vandromme (auva) <auva@odoo.com>
2024-07-25 13:15:59 +00:00
Donatienne (dopi) acf8d5e4a7 [IMP] Sign: signing order to be updated
taskid-4058926

closes odoo/documentation#10292

Signed-off-by: Audrey Vandromme (auva) <auva@odoo.com>
2024-07-25 10:00:55 +00:00
guillaume gallant (guga) 916b185065 [IMP] Field_Service: Creating tasks page
taskid-4043610

closes odoo/documentation#10176

Signed-off-by: Audrey Vandromme (auva) <auva@odoo.com>
2024-07-24 07:16:39 +00:00
guillaume gallant (guga) 93a0f41756 [IMP] Field_Service: add product to the task
taskid-4043214

closes odoo/documentation#10142

Signed-off-by: Audrey Vandromme (auva) <auva@odoo.com>
2024-07-23 15:52:51 +00:00
Tiffany Chang (tic) bf9bbff058 [I18N] *: export latest terms
As per usual, leave off developer.pot and contributing.pot since we
don't translate them (not useful, can't really contribute to/dev in
Odoo without knowing English)

closes odoo/documentation#10306

Signed-off-by: Tiffany Chang (tic) <tic@odoo.com>
2024-07-23 14:24:44 +00:00
Lara Martini (larm) 32976cdd84 [ADD] spreadsheet: global filters
closes odoo/documentation#9524

Signed-off-by: Samuel Lieber (sali) <sali@odoo.com>
Co-authored-by: Samuel Lieber <sali@odoo.com>
Co-authored-by: Zachary Straub <zst@odoo.com>
2024-07-23 14:24:40 +00:00
jero-odoo 00e96e5635 [ADD] Members: members analysis
closes odoo/documentation#10132

Signed-off-by: Zachary Straub (zst) <zst@odoo.com>
Co-authored-by: ksc-odoo <73958186+ksc-odoo@users.noreply.github.com>
2024-07-22 23:38:34 +00:00
Felicious c4fd10f94e [IMP] inventory: refactor WH and locations
closes odoo/documentation#10287

X-original-commit: 1c927fa911
Signed-off-by: Felicia Kuan (feku) <feku@odoo.com>
Co-authored-by: Jess Rogers <104637850+jero-odoo@users.noreply.github.com>
Co-authored-by: ksc-odoo <73958186+ksc-odoo@users.noreply.github.com>
2024-07-22 17:56:59 +00:00
Odoo Translation Bot 10a92e66cf [I18N] *: export 17.0 source terms 2024-07-20 02:37:50 +00:00
jero-odoo 634a5af824 [IMP] Users: Enforce two-factor authentication
closes odoo/documentation#10237

Signed-off-by: Zachary Straub (zst) <zst@odoo.com>
Co-authored-by: StraubCreative <zst@odoo.com>
Co-authored-by: hojo-odoo <123424465+hojo-odoo@users.noreply.github.com>
Co-authored-by: ksc-odoo <73958186+ksc-odoo@users.noreply.github.com>
2024-07-19 21:12:43 +00:00
Parish Bracha 53f8dcd991 [ADD] crm: add marketing attribution doc
Apply suggestions from code review

closes odoo/documentation#9566

Signed-off-by: Zachary Straub (zst) <zst@odoo.com>
Co-authored-by: Zachary Straub <zst@odoo.com>
2024-07-19 21:12:42 +00:00
KC (ksc) a535d2fe9d [ADD] events: added an event tracks doc
closes odoo/documentation#9241

Signed-off-by: Kevin Scannell (ksc) <ksc@odoo.com>
2024-07-19 00:27:43 +00:00
Felicious cb51299cf1 [IMP] inventory: switch valuation to auto
closes odoo/documentation#10159

Signed-off-by: Felicia Kuan (feku) <feku@odoo.com>
2024-07-18 22:54:49 +00:00
KC (ksc) a42a88bf7c [ADD] events: event booths doc (17)
closes odoo/documentation#9342

Signed-off-by: Kevin Scannell (ksc) <ksc@odoo.com>
2024-07-18 21:07:42 +00:00
jero-odoo 8cea31c24d [ADD] Users: Facebook OAuth
closes odoo/documentation#10189

Signed-off-by: Zachary Straub (zst) <zst@odoo.com>
2024-07-18 16:29:47 +00:00
772 changed files with 611564 additions and 182743 deletions
@@ -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>`.
@@ -2,6 +2,9 @@
Export and import data
======================
.. |list| replace:: :icon:`oi-view-list` :guilabel:`(list)` icon
.. |actions| replace:: :icon:`fa-cog` :guilabel:`Actions`
In Odoo, it is sometimes necessary to export or import data for running reports, or for data
modification. This document covers the export and import of data into and out of Odoo.
@@ -20,9 +23,9 @@ can aid in reporting on activities, although, Odoo provides a precise and easy r
each available application.
With Odoo, the values can be exported from any field in any record. To do so, activate the list view
(:guilabel:`≣ (four horizontal lines)` icon), on the items that need to be exported, and then
select the records that should be exported. To select a record, tick the checkbox next to the
corresponding record. Finally, click on :guilabel:`⚙️ Action`, and then :guilabel:`Export`.
(|list|), on the items that need to be exported, then select the records that should be exported. To
select a record, tick the checkbox next to the corresponding record. Finally, click on |actions|,
then :guilabel:`Export`.
.. image:: export_import_data/list-view-export.png
:align: center
@@ -36,9 +39,10 @@ several options for the data to export:
:alt: Overview of options to consider when exporting data in Odoo..
#. With the :guilabel:`I want to update data (import-compatable export)` option ticked, the system
only shows the fields that can be imported. This is helpful in the case where the existing
records need to be updated. This works like a filter. Leaving the box unticked, gives many more
field options because it shows all the fields, not just the ones that can be imported.
only shows the fields that can be imported. This is helpful in the case where the :ref:`existing
records need to be updated <essentials/update-data>`. This works like a filter. Leaving the box
unticked, gives many more field options because it shows all the fields, not just the ones that
can be imported.
#. When exporting, there is the option to export in two formats: `.csv` and `.xls`. With `.csv`,
items are separated by a comma, while `.xls` holds information about all the worksheets in a
file, including both content and formatting.
@@ -70,7 +74,8 @@ Import data into Odoo
=====================
Importing data into Odoo is extremely helpful during implementation, or in times where data needs to
be updated in bulk. The following documentation covers how to import data into an Odoo database.
be :ref:`updated in bulk <essentials/update-data>`. The following documentation covers how to import
data into an Odoo database.
.. warning::
Imports are permanent and **cannot** be undone. However, it is possible to use filters (`created
@@ -158,6 +163,9 @@ Once the template is downloaded, proceed to follow these steps:
using the fields that should be imported. This way, if there is not a sample import template,
the names are accurate.
.. _essentials/external-id:
Import from another application
-------------------------------
@@ -166,7 +174,8 @@ from previous software to facilitate the transition to Odoo.
Setting an ID is not mandatory when importing, but it helps in many cases:
- Update imports: import the same file several times without creating duplicates.
- :ref:`Update imports <essentials/update-data>`: import the same file several times without
creating duplicates.
- :ref:`Import relation fields <export_import_data/relation-fields>`.
To recreate relationships between different records, the unique identifier from the original
@@ -176,10 +185,7 @@ When another record is imported that links to the first one, use **XXX/ID** (XXX
the original unique identifier. This record can also be found using its name.
.. warning::
It should be noted that there will be a conflict if two or more records have the same name.
The :guilabel:`External ID` (ID) can also be used to update the original import, if modified data
needs to be re-imported later, therefore, it is a good practice to specify it whenever possible.
It should be noted that conflicts occur if two (or more) records have the same *External ID*.
Field missing to map column
---------------------------
@@ -476,3 +482,43 @@ The two files produced are ready to be imported in Odoo without any modification
imported these two :abbr:`CSV (Comma-separated Values)` files, there are four contacts and three
companies (the first two contacts are linked to the first company). Keep in mind to first import
the companies, and then the people.
.. _essentials/update-data:
Update data in Odoo
===================
Existing data can be updated in bulk through a data import, as long as the :ref:`External ID
<essentials/external-id>` remains consistent.
Prepare data export
-------------------
To update data through an import, first navigate to the data to be updated, and select the |list| to
activate list view. On the far-left side of the list, tick the checkbox for any record to be
updated. Then, click |actions|, and select :icon:`fa-upload` :guilabel:`Export` from the drop-down
menu.
On the resulting :guilabel:`Export Data` pop-up window, tick the checkbox labeled, :guilabel:`I want
to update data (import-compatible export)`. This automatically includes the *External ID* in the
export. Additionally, it limits the :guilabel:`Fields to export` list to **only** include fields
that are able to be imported.
.. note::
The :guilabel:`External ID` field does **not** appear in the :guilabel:`Fields to export` list
unless it is manually added, but it is still included in the export. However, if the :guilabel:`I
want to update data (import-compatible export)` checkbox is ticked, it is included in the export.
Select the required fields to be included in the export using the :ref:`options <export-data>` on
the pop-up window, then click :guilabel:`Export`.
Import updated data
-------------------
After exporting, make any necessary changes to the data file. When the file is ready, it can be
:ref:`imported <import-data>` by following the same process as a normal data import.
.. danger::
When updating data, it is extremely important that the *External ID* remain consistent, as
this is how the system identifies a record. If an ID is altered, or removed, the system may add a
duplicate record, instead of updating the existing one.
@@ -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:
@@ -181,6 +181,75 @@ It is possible to *customize groups* by using a field present on the model. To d
cluster, the next one that is added further divides the main group's categories, and so on.
Furthermore, filters and groups can be used together to refine the view even more.
.. _search/comparison:
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/reporting/oee>` report for the *Manufacturing* app, and the
:doc:`Purchase <../inventory_and_mrp/purchase/advanced/analyze>` report for the *Purchase* app,
among others.
The options in the :icon:`fa-adjust` :guilabel:`Comparison` section are used to compare data from
two different time periods. There are two comparison options to choose from: :guilabel:`(Time
Filter): Previous Period` and :guilabel:`(Time Filter): Previous Year`.
.. important::
For some reports, the :guilabel:`Comparison` section **only** appears in the
:guilabel:`Search...` bar drop-down menu if one (or more) time periods have been selected in the
:guilabel:`Filters` column. This is because, if no time period is specified, there is nothing to
compare.
Additionally, some reports only allow use of the :guilabel:`Comparison` feature when the
:icon:`fa-pie-chart` :guilabel:`(pie chart)` graph type, or the :icon:`oi-view-pivot`
:guilabel:`(pivot)` view, is selected. A :guilabel:`Comparison` option can be selected even if
another view is enabled, but doing so does **not** change the way data is displayed on the
report.
.. image:: search/comparison-section.png
:align: center
:alt: The Search... bar for the production analysis report.
To view data using one of the two comparisons, begin by selecting a time period in the
:guilabel:`Filters` column of the :guilabel:`Search...` bar drop-down menu. Then, select either
:guilabel:`(Time Filter): Previous Period` or :guilabel:`(Time Filter): Previous Year` in the
:guilabel:`Comparison` section.
With one of the :guilabel:`Comparison` options enabled, the report compares the data for the
selected period, with the data for the same unit of time (month, quarter, year), one period or year
prior. The way the data is displayed depends on the selected view:
- The :icon:`fa-bar-chart` :guilabel:`(bar chart)` shows two bars, side-by-side, for each unit of
time for the selected time period. The left bar represents the selected time period, while the
right bar represents the previous time period.
- The :icon:`fa-line-chart` :guilabel:`(line chart)` is displayed with two lines, one representing
the selected time period, and the other representing the previous time period.
- The :icon:`fa-pie-chart` :guilabel:`(pie chart)` appears as a large circle with a smaller circle
inside. The larger circle represents the selected time period, while the smaller circle represents
the previous time period.
- The :icon:`oi-view-pivot` :guilabel:`(pivot table)` is displayed with each column split into two
smaller columns. The right column represents the selected time period, while the left column
represents the previous time period.
.. example::
In the :guilabel:`Production Analysis` report of the :menuselection:`Manufacturing` app, data for
the second quarter of 2024 is compared to data for the second quarter of 2023. :guilabel:`Q2` is
selected in the :guilabel:`End Date` filter section of the :guilabel:`Search...` bar drop-down
menu. In the :guilabel:`Comparison` section, :guilabel:`End Date: Previous Year` is selected.
The current year is 2024, so the larger circle shows data for the second quarter (Q2) of 2024.
The smaller circle shows data for the second quarter (Q2) of 2023, which is the same time period,
but one *year* prior.
If :guilabel:`End Date: Previous Period` is selected instead, the smaller circle shows data for
the first quarter (Q1) of 2024, which is the same time period, but one *period* prior.
.. image:: search/comparison.png
:align: center
:alt: The comparison view of the Production Analysis report.
.. _search/favorites:
Favorites
Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

@@ -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 companys 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 cant 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 cant 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 companys 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
Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

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
Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

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
+23 -573
View File
@@ -5,8 +5,8 @@ Expenses
========
Odoo **Expenses** streamlines the management of expenses. After an employee submits their expenses
in Odoo, the expenses are reviewed by management and accounting teams. Once approved, payments can
then be processed and disbursed back to the employee for reimbursement(s).
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::
`Odoo Expenses: product page <https://www.odoo.com/app/expenses>`_
@@ -62,16 +62,16 @@ report the actual cost when submitting an expense report.
Here are some examples for when to set a specific :guilabel:`Cost` on a product vs. leaving the
:guilabel:`Cost` at `0.00`:
- **Meals**: Set the :guilabel:`Cost` to `0.00`. When an employee logs an expense for a meal,
- **Meals**: set the :guilabel:`Cost` to `0.00`. When an employee logs an expense for a meal,
they enter the actual amount of the bill and will be reimbursed for that amount. An expense for
a meal costing $95.23 would equal a reimbursement for $95.23.
- **Mileage**: Set the :guilabel:`Cost` to `0.30`. When an employee logs an expense for
- **Mileage**: set the :guilabel:`Cost` to `0.30`. When an employee logs an expense for
"mileage", they enter the number of miles driven in the :guilabel:`Quantity` field, and are
reimbursed 0.30 per mile they entered. An expense for 100 miles would equal a reimbursement for
$30.00.
- **Monthly Parking**: Set the :guilabel:`Cost` to `75.00`. When an employee logs an expense for
- **Monthly Parking**: set the :guilabel:`Cost` to `75.00`. When an employee logs an expense for
"monthly parking", the reimbursement would be for $75.00.
- **Expenses**: Set the :guilabel:`Cost` to `0.00`. When an employee logs an expense that is not
- **Expenses**: set the :guilabel:`Cost` to `0.00`. When an employee logs an expense that is not
a meal, mileage, or monthly parking, they use the generic :guilabel:`Expenses` product. An
expense for a laptop costing $350.00 would be logged as an :guilabel:`Expenses` product, and
the reimbursement would be for $350.00.
@@ -84,570 +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 account(s) 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 will automatically populate this field.
- :guilabel:`Notes...`: If any notes are needed in order to clarify the expense, enter them in the
notes 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/report:
Create an expense report
========================
When expenses are ready to submit (such as at the end of a business trip, or once a month), an
*expense report* needs to be created. Go to the main :menuselection:`Expenses` app dashboard, which
displays a default :guilabel:`My Expenses` view, or go to :menuselection:`Expenses app --> My
Expenses --> My Expenses`.
Expenses are color coded by status. Any expense with a status of :guilabel:`To Report` (expenses
that still need to be added to an expense report) the text appears in blue. All other statuses
(:guilabel:`To Submit`, :guilabel:`Submitted`, and :guilabel:`Approved`) the text appears in black.
First, select each individual expense for the report by clicking the check box next to each entry,
or quickly select all the expenses in the list by clicking the check box next to :guilabel:`Expense
Date`.
Another way to quickly add all expenses that are not on an expense report is to click
:guilabel:`Create Report` without selecting any expenses, and Odoo will select all expenses with a
status of :guilabel:`To Submit` that are not already on a report.
.. image:: expenses/create-report.png
:align: center
:alt: Select the expenses to submit, then create the report.
.. note::
Any expense can be selected from the :guilabel:`My Expenses` list, regardless of status. The
:guilabel:`Create Report` button is visible as long as there is a minimum of 1 expense with a
status of :guilabel:`To Report` selected. When the :guilabel:`Create Report` button is clicked,
only expenses with a status of :guilabel:`To Submit` that are *not* currently on another expense
report will appear in the newly created expense report.
Once the expenses have been selected, click the :guilabel:`Create Report` button. The new report
appears with all the expenses listed in the :guilabel:`Expense` tab. If there is a receipt attached
to an individual expense, a :guilabel:`📎 (paperclip)` icon appears next to the :guilabel:`Customer
to Reinvoice` and :guilabel:`Analytic Distribution` columns.
When the report is created, the date range for the expenses appears in the :guilabel:`Expense Report
Summary` field by default. It is recommended to edit this field with a short summary for each report
to help keep expenses organized. Enter a short description for the expense report (such as `Client
Trip NYC`, or `Repairs for Company Car`) in the :guilabel:`Expense Report Summary` field. Next,
select a :guilabel:`Manager` from the drop-down menu to assign a manager to review the report. If
needed, the :guilabel:`Journal` can be changed. Use the drop-down menu to select a different
:guilabel:`Journal`.
.. image:: expenses/expense-report-summary.png
:align: center
:alt: Enter a short description and select a manager for the report.
If some expenses are not on the report that should be, they can still be added. Click :guilabel:`Add
a line` at the bottom of the :guilabel:`Expense` tab. A pop up appears with all the available
expenses that can be added to the report (with a status of :guilabel:`To Submit`). Click the check
box next to each expense to add, then click :guilabel:`Select`. The items now appear on the report
that was just created. If a new expense needs to be added that does *not* appear on the list, click
:guilabel:`New` to create a new expense and add it to the report.
.. image:: expenses/add-an-expense-line.png
:align: center
:alt: Add more expenses to the report before submitting.
.. note::
Expense reports can be created in one of three places:
#. Go to the main :menuselection:`Expenses` app dashboard (also accessed by going to
:menuselection:`Expenses app --> My Expenses --> My Expenses`)
#. Go to :menuselection:`Expenses app --> My Expenses --> My Reports`
#. Go to :menuselection:`Expenses app --> Expense Reports`
In any of these views, click :guilabel:`New` to create a new expense report.
.. _expenses/submit:
Submit an expense report
------------------------
When an expense report is completed, the next step is to submit the report to a manager for
approval. Reports must be individually submitted, and cannot be submitted in batches. Open the
specific report from the list of expense reports (if the report is not already open). To view all
expense reports, go to :menuselection:`Expenses app --> My Expenses --> My Reports`.
If the list is large, grouping the results by status may be helpful since only reports that have a
:guilabel:`To Submit` status need to be submitted, reports with an :guilabel:`Approved` or
:guilabel:`Submitted` status do not.
The :guilabel:`To Submit` expenses are easily identifiable not just from the :guilabel:`To Submit`
status, but the text appears in blue, while the other expenses text appears in black.
.. image:: expenses/expense-status.png
:align: center
:alt: Submit the report to the manager.
.. note::
The status of each report is shown in the :guilabel:`Status` column on the right. If the
:guilabel:`Status` column is not visible, click the :guilabel:`Additional Options (two dots)`
icon at the end of the row, and enable :guilabel:`Status`.
Click on a report to open it, then click :guilabel:`Submit To Manager`. After submitting a report,
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 *necessary rights*.
.. _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 that 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 clicking the check box next to each report, or click the box 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
**will not appear**, indicating there is a problem with the selected report(s).
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
clicking the check box next to each report, or click the box 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 clicking the check box next to each report, or click the box 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 expense(s) appears 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 in order to re-invoice a customer. Select the *sales order* the expense will appear on in
the :guilabel:`Customer to Reinvoice` section, from the drop-down menu. Next, select the
:guilabel:`Analytic Account` the expense will be posted to. After the expense(s) are created, the
expense report needs to be :ref:`created <expenses/report>` 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 account(s) from the drop-down menu, and then 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/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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

@@ -0,0 +1,129 @@
===============
Expense reports
===============
When expenses are ready to submit (such as, at the end of a business trip, or once a month), an
*expense report* needs to be created. Open the main :menuselection:`Expenses app` dashboard, which
displays the :guilabel:`My Expenses` dashboard, by default. Alternatively, navigate to
:menuselection:`Expenses app --> My Expenses --> My Expenses`.
Expenses are color-coded by status. Any expense with a status of :guilabel:`To Report` (expenses
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
======================
First, select each desired expense to be added to the report on the :guilabel:`My Expenses`
dashboard, by ticking the checkbox next to each entry, or quickly select all the expenses in the
list by ticking the checkbox next to the :guilabel:`Expense Date` column title, if needed.
Another way to quickly add all expenses that are not on a expense report, is to click the
:guilabel:`Create Report` button, *without* selecting any expenses, and Odoo automatically selects
all expenses with a status of :guilabel:`To Submit` that are not already on a report.
.. image:: expense_reports/create-report.png
:align: center
:alt: Select the expenses to submit, then create the report.
.. note::
Any expense can be selected from the :guilabel:`My Expenses` list, except for expenses with a
status of :guilabel:`Approved`.
The :guilabel:`Create Report` button is visible as long as there is a minimum of one expense on
the list with a status of either :guilabel:`To Report` or :guilabel:`To Submit`.
When the :guilabel:`Create Report` button is clicked, all expenses with a status of :guilabel:`To
Submit` that are *not* currently on another expense report appears in the newly-created expense
report.
If all expenses on the :guilabel:`My Expenses` report are already associated with another expense
report, an :guilabel:`Invalid Operation` pop-up window appears, stating :guilabel:`You have no
expenses to report.`
Once the expenses have been selected, click the :guilabel:`Create Report` button. The new report
appears with all the expenses listed in the :guilabel:`Expense` tab. If there is a receipt attached
to an individual expense, a :icon:`fa-paperclip` :guilabel:`(paperclip)` icon appears between the
:guilabel:`Customer to Reinvoice` and :guilabel:`Analytic Distribution` columns.
When the report is created, the date range for the expenses appears in the :guilabel:`Expense Report
Summary` field, by default. It is recommended to edit this field with a short summary for each
report to help keep expenses organized. Enter a description for the expense report, such as `Client
Trip NYC`, or `Office Supplies for Presentation`, in the :guilabel:`Expense Report Summary` field.
The :guilabel:`Employee`, :guilabel:`Paid By`, and :guilabel:`Company` fields autopoulate with the
information listed on the individual expenses.
Next, select a :guilabel:`Manager` from the drop-down menu to assign a manager to review the report.
If needed, update the :guilabel:`Journal` field, using the drop-down menu.
.. image:: expense_reports/expense-report-summary.png
:align: center
:alt: Enter a short description and select a manager for the report.
If some expenses are missing from the report, they can still be added from this report form. To do
so, click :guilabel:`Add a line` at the bottom of the :guilabel:`Expense` tab.
An :guilabel:`Add: Expense Lines` pop-up window appears, displaying all the available expenses (with
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
: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`.
Doing so removes the pop-up window, and the items now appear on the report.
.. image:: expense_reports/add-an-expense-line.png
:align: center
:alt: Add more expenses to the report before submitting.
.. note::
Expense reports can be created in one of three places:
#. Navigate to the main :menuselection:`Expenses app` dashboard (also accessible, via
:menuselection:`Expenses app --> My Expenses --> My Expenses`)
#. Navigate to :menuselection:`Expenses app --> My Expenses --> My Reports`
#. Navigate to :menuselection:`Expenses app --> Expense Reports`
In any of these views, click :guilabel:`New` to create a new expense report.
.. _expenses/submit:
Submit expense reports
======================
When an expense report is completed, the next step is to submit the report to a manager for
approval. To view all expense reports, navigate to :menuselection:`Expenses app --> My Expenses -->
My Reports`. Open the specific report from the list of expense reports.
.. note::
Reports must be individually submitted, and **cannot** be submitted in batches.
If the list is large, grouping the results by status may be helpful, since only reports with a
:guilabel:`To Submit` status need to be submitted; reports with an :guilabel:`Approved` or
:guilabel:`Submitted` status do not.
The :guilabel:`To Submit` expenses are identifiable by the :guilabel:`To Submit` status, and by the
blue text, while all other expense text appears in black.
.. image:: expense_reports/expense-status.png
:align: center
:alt: Submit the report to the manager.
.. note::
The status of each report is shown in the :guilabel:`Status` column. If the :guilabel:`Status`
column is not visible, click the :icon:`oi-settings-adjust` :guilabel:`(additional options)` icon
at the end of the row, and tick the checkbox beside :guilabel:`Status` from the resulting
drop-down menu.
Click on a report to open it, then click :guilabel:`Submit To Manager`. After submitting a report,
the next step is to wait for the manager to approve it.
.. important::
: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>`.

Before

Width:  |  Height:  |  Size: 8.6 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

@@ -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.
Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

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.
Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

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.
Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

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.
Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

@@ -1018,69 +1018,37 @@ specific product.
Reports
=======
As part of the localization installation, financial reporting for Argentina was added to the
:guilabel:`Accounting` dashboard. Access these reports by navigating to :menuselection:`Accounting
--> Reporting --> Argentinean Reports`
As part of the localization installation, financial reporting for Argentina is available in the
:guilabel:`Accounting` dashboard. To access these reports, navigate to :menuselection:`Accounting
--> Reporting --> Argentinean Statements`.
.. image:: argentina/argentinian-reports.png
:align: center
:alt: Argentinean reports.
To access the VAT book report, go to :menuselection:`Accounting --> Reporting --> Tax Report`, click
the :icon:`fa-book` (:guilabel:`book`), and select :guilabel:`Argentinean VAT book (AR)`.
VAT reports
-----------
Sales VAT book
~~~~~~~~~~~~~~
This report records all the sales, which are taken as the basis for the accounting records
to determine the VAT (Tax Debit). The :guilabel:`Sales VAT` book report can be exported as a `.zip`
file using the :guilabel:`VAT BOOK (ZIP)` button at the top left, containing `.txt` files to upload
to the AFIP portal.
.. image:: argentina/sales-vat-book.png
:align: center
:alt: Sales VAT book.
Purchases VAT book
~~~~~~~~~~~~~~~~~~
The :guilabel:`Purchases VAT` book report can be exported as a `.zip` file using the
:guilabel:`VAT BOOK (ZIP)` button at the top left, which contains `.txt` files to upload to the AFIP
portal.
.. image:: argentina/purchases-vat-book.png
:align: center
:alt: Purchases VAT book.
.. note::
The VAT book report can be exported as a `.zip` file by selecting it in the dropdown menu in the
top-left corner.
VAT summary
~~~~~~~~~~~
-----------
Pivot table designed to check the monthly VAT totals. This report is for internal use and is not
sent to the AFIP.
.. image:: argentina/vat-summary.png
:align: center
:alt: VAT Summary.
IIBB - Reports
--------------
This pivot table is designed to check the monthly VAT totals. This report is for internal use and is
not sent to the AFIP.
IIBB - Sales by jurisdiction
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
----------------------------
Pivot table where you can validate the gross income in each jurisdiction. Affidavit for the
corresponding taxes to pay; and therefore, it is not sent to the AFIP.
This pivot table allows you to validate the gross income in each jurisdiction. It serves as an
affidavit for the corresponding taxes due but is not submitted to the AFIP.
.. image:: argentina/iibb-sales-jurisdiction.png
:align: center
:alt: IIBB Sales by jurisdiction.
IIBB - Purchases by jurisdiction
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--------------------------------
Pivot table where you can validate the gross purchases in each jurisdiction. Affidavit for the
corresponding taxes to pay; and therefore, it is not sent to the AFIP.
This pivot table allows you to validate the gross purchases in each jurisdiction. It serves as an
affidavit for the corresponding taxes due but is not submitted to the AFIP.
.. image:: argentina/iibb-purchases-jurisdiction.png
:align: center
:alt: IIBB Purchases by jurisdiction.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 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,9 +511,8 @@ 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/sii-validation-elements.png
:alt: SII Validation fiscal elements.
:align: center
.. 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
@@ -1232,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)`.
Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

@@ -33,6 +33,8 @@ Here are some terms that are essential on the Ecuadorian localization:
Configuration
=============
.. _l10n_ec/module-installation:
Modules installation
--------------------
@@ -75,7 +77,7 @@ localization:
* - :guilabel:`Ecuadorian Point of Sale`
- `l10n_ec_edi_pos`
- Includes all the technical and functional requirements to generate automatic electronic
invoices from a PoS sale.
invoices from a POS sale.
.. note::
When you install a database from scratch selecting `Ecuador` as the country, Odoo automatically
@@ -631,7 +633,7 @@ time.
eCommerce workflow
~~~~~~~~~~~~~~~~~~
Type and identification number
Identification type and number
******************************
The client who is making a purchase will have the option to indicate their identification type and
@@ -639,18 +641,74 @@ number during the checkout process. This information is required to correctly ge
electronic invoice after the checkout is completed.
.. image:: ecuador/website-checkout-form.png
:align: center
:alt: Website checkout form.
.. note::
Verification is done to ensure the *Identification Number* field is completed and has the correct
number of digits. For RUC identification, 13 digits are required. For Cédula, 9 digits are
required.
Verification is done to ensure the :guilabel:`Identification Number` field is completed and has
the correct number of digits. For RUC identification, 13 digits are required. For Cédula,
9 digits are required.
After finishing the checkout process, a confirmed invoice is generated, ready to be sent manually or
asynchronously to the SRI.
Financial Reports
Point of Sale electronic invoicing
----------------------------------
Make sure the *Ecuadorian module for Point of Sale* (`l10n_ec_edi_pos`) is :ref:`installed
<l10n_ec/module-installation>` to enable the following features and configurations:
- Choose the SRI payment method in each payment method configuration.
- Manually input the customer's identification type and identification number when creating a
new contact on *POS*.
- Automatically generate a valid electronic invoice for Ecuador at the end of the checkout process.
Payment method configuration
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
To :doc:`create a payment method for a point of sale <../../sales/point_of_sale/payment_methods>`,
go to :menuselection:`Point of Sale --> Configuration --> Payment Methods`. Then, set the
:guilabel:`SRI Payment Method` in the payment method form.
Invoicing flows
~~~~~~~~~~~~~~~
Identification type and number
******************************
The POS cashier can :ref:`create a new contact for a customer <pos/customers>` who requests an
invoice from an open POS session.
The *Ecuadorian Module for Point of Sale* adds two new fields to the contact creation form:
:guilabel:`Identification Type` and :guilabel:`Tax ID`.
.. note::
As the identification number length differs depending on the identification type, Odoo
automatically checks the :guilabel:`Tax ID` field upon saving the contact form. To manually
ensure the length is correct, know that the :guilabel:`RUC` and :guilabel:`Citizenship` types
require 13 and 10 digits, respectively.
Electronic invoice: anonymous end consumer
******************************************
When clients do not request an electronic invoice for their purchase, Odoo automatically sets the
customer as :guilabel:`Consumidor Final` and generates an electronic invoice anyway.
.. note::
If the client requests a credit note due to a return of this type of purchase, the credit note
should be made using the client's real contact information. Credit notes cannot be created to
*Consumidor Final* and can be managed :ref:`directly from the POS session <pos/refund>`.
Electronic invoice: specific customer
*************************************
If a customer requests an invoice for their purchase, it is possible to select or create a contact
with their fiscal information. This ensures the invoice is generated with accurate customer details.
.. note::
If the client requests a credit note due to a return of this type of purchase, the credit note
and return process can be managed :ref:`directly from the POS session <pos/refund>`.
Financial reports
=================
In Ecuador, there are fiscal reports that the company presents to SRI. Odoo supports two of the main
@@ -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`
@@ -370,9 +370,8 @@ Payment complements
Payment policy
**************
One addition of the Mexican localization is the :guilabel:`Payment Policy` field . `According to
the SAT documentation <https://www.sat.gob.mx/consultas/92764/comprobante-de-recepcion-de-pagos>`_,
there may be 2 types of payments:
One addition of the Mexican localization is the :guilabel:`Payment Policy` field. According to
the SAT documentation, there are two types of payments:
- `PUE` (Pago en una Sola Exhibición/Payment in a Single Exhibition)
- `PPD` (Pago en Parcialidades o Diferido/Payment in Installements or Deferred)
@@ -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
=========
Binary file not shown.

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.
Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

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.
+7 -6
View File
@@ -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
@@ -34,14 +34,14 @@ registration`. On the :guilabel:`Register an application` screen, rename the :gu
and personal Microsoft accounts (e.g. Skype, Xbox)`.
Under the :guilabel:`Redirect URL` section, select :guilabel:`Web` as the platform, and then input
`https://<odoo base url>/microsoft_outlook/confirm` in the :guilabel:`URL` field. The Odoo base URL
is the canonical domain at which your Odoo instance can be reached in the URL field.
`https://<web base url>/microsoft_outlook/confirm` in the :guilabel:`URL` field. The `web.base.url`
is subject to change depending on the URL used to log in to the database.
.. example::
*mydatabase.odoo.com*, where *mydatabase* is the actual prefix of the database's subdomain,
assuming it's hosted on Odoo.com
.. note::
The documentation about the :ref:`web.base.url <domain-name/web-base-url>` explains how to freeze
a unique URL. It is also possible to add different redirect URLs on the Microsoft app.
After the URL has been added to the field, :guilabel:`Register` the application so it is created.
After the URL has been added to the field, :guilabel:`Register` the application, so it is created.
API permissions
---------------
@@ -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.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

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