Compare commits
1 Commits
15.0-check
...
15.0-follo
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8c1972f674 |
@@ -43,7 +43,7 @@ Configuration samples
|
||||
|
||||
* Show only databases with names beginning with 'mycompany'
|
||||
|
||||
in :ref:`the configuration file <reference/cmdline/config_file>` set:
|
||||
in ``/etc/odoo.conf`` set:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
@@ -55,7 +55,7 @@ in :ref:`the configuration file <reference/cmdline/config_file>` set:
|
||||
was sent to ``www.mycompany.com`` or ``mycompany.co.uk``, but not
|
||||
for ``www2.mycompany.com`` or ``helpdesk.mycompany.com``.
|
||||
|
||||
in :ref:`the configuration file <reference/cmdline/config_file>` set:
|
||||
in ``/etc/odoo.conf`` set:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
@@ -150,7 +150,7 @@ Configuration sample
|
||||
* with 'pwd' as a password
|
||||
* filtering only db with a name beginning with 'mycompany'
|
||||
|
||||
in :ref:`the configuration file <reference/cmdline/config_file>` set:
|
||||
in ``/etc/odoo.conf`` set:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
@@ -238,7 +238,7 @@ Configuration sample
|
||||
* We'll use 8 workers + 1 for cron. We'll also use a monitoring system to measure cpu load, and check if it's between 7 and 7.5 .
|
||||
* RAM = 9 * ((0.8*150) + (0.2*1024)) ~= 3Go RAM for Odoo
|
||||
|
||||
in :ref:`the configuration file <reference/cmdline/config_file>`:
|
||||
in ``/etc/odoo.conf``:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
@@ -273,7 +273,7 @@ Configuration sample
|
||||
* Redirect http requests to https
|
||||
* Proxy requests to odoo
|
||||
|
||||
in :ref:`the configuration file <reference/cmdline/config_file>` set:
|
||||
in ``/etc/odoo.conf`` set:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
|
||||
.. _setup/enterprise:
|
||||
|
||||
===================================
|
||||
Switch from Community to Enterprise
|
||||
===================================
|
||||
===============================
|
||||
Upgrade Community to Enterprise
|
||||
===============================
|
||||
|
||||
Depending on your current installation, there are multiple ways to upgrade
|
||||
your community version.
|
||||
@@ -98,7 +98,7 @@ On Windows
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ ..\python\python.exe odoo-bin -d <database_name> -i web_enterprise --stop-after-init
|
||||
$ odoo.exe -d <database_name> -i web_enterprise --stop-after-init
|
||||
|
||||
* No need to manually launch the server, the service is running.
|
||||
You should be able to connect to your Odoo Enterprise instance using your usual
|
||||
|
||||
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 27 KiB |
@@ -45,101 +45,41 @@ these databases if they have one, using their regular credentials.
|
||||
|
||||
In addition, they cannot use the webshell nor have access to the server logs.
|
||||
|
||||
.. list-table::
|
||||
:header-rows: 1
|
||||
:widths: auto
|
||||
|
||||
* -
|
||||
-
|
||||
- User
|
||||
- Admin
|
||||
* - Development
|
||||
- History
|
||||
- |green|
|
||||
- |green|
|
||||
* -
|
||||
- 1-click connect
|
||||
- |green|
|
||||
- |green|
|
||||
* -
|
||||
- Logs
|
||||
- |green|
|
||||
- |green|
|
||||
* -
|
||||
- Shell/SSH
|
||||
- |green|
|
||||
- |green|
|
||||
* -
|
||||
- Mails
|
||||
- |green|
|
||||
- |green|
|
||||
* -
|
||||
- Upgrade
|
||||
- |green|
|
||||
- |green|
|
||||
* -
|
||||
- Settings
|
||||
- |green|
|
||||
- |green|
|
||||
* - Production & Staging
|
||||
- History
|
||||
- |green|
|
||||
- |green|
|
||||
* -
|
||||
- 1-click connect
|
||||
-
|
||||
- |green|
|
||||
* -
|
||||
- Logs
|
||||
-
|
||||
- |green|
|
||||
* -
|
||||
- Shell/SSH
|
||||
-
|
||||
- |green|
|
||||
* -
|
||||
- Mails
|
||||
-
|
||||
- |green|
|
||||
* -
|
||||
- Monitoring
|
||||
-
|
||||
- |green|
|
||||
* -
|
||||
- Backups
|
||||
-
|
||||
- |green|
|
||||
* -
|
||||
- Upgrade
|
||||
-
|
||||
- |green|
|
||||
* -
|
||||
- Settings
|
||||
- |green|\*
|
||||
- |green|
|
||||
* - Status
|
||||
-
|
||||
- |green|
|
||||
- |green|
|
||||
* - Settings
|
||||
-
|
||||
-
|
||||
- |green|
|
||||
|
||||
.. note::
|
||||
\* Only in staging branches
|
||||
|
||||
.. |green| raw:: html
|
||||
|
||||
<span class="text-success" style="font-size: 32px; line-height: 0.5">●</span>
|
||||
|
||||
.. |orange| raw:: html
|
||||
|
||||
<span class="text-warning" style="font-size: 32px; line-height: 0.5">●</span>
|
||||
|
||||
.. |red| raw:: html
|
||||
|
||||
<span class="text-danger" style="font-size: 32px; line-height: 0.5">●</span>
|
||||
+---------------------+-----------------+-----------+-----------+
|
||||
| | | User | Admin |
|
||||
+=====================+=================+===========+===========+
|
||||
|Development | History | X | X |
|
||||
+---------------------+-----------------+-----------+-----------+
|
||||
| | 1-click connect | X | X |
|
||||
+---------------------+-----------------+-----------+-----------+
|
||||
| | Logs | X | X |
|
||||
+---------------------+-----------------+-----------+-----------+
|
||||
| | Shell/SSH | X | X |
|
||||
+---------------------+-----------------+-----------+-----------+
|
||||
| | Mails | X | X |
|
||||
+---------------------+-----------------+-----------+-----------+
|
||||
| | Settings | X | X |
|
||||
+---------------------+-----------------+-----------+-----------+
|
||||
|Production & Staging | History | X | X |
|
||||
+---------------------+-----------------+-----------+-----------+
|
||||
| | 1-click connect | | X |
|
||||
+---------------------+-----------------+-----------+-----------+
|
||||
| | Logs | | X |
|
||||
+---------------------+-----------------+-----------+-----------+
|
||||
| | Shell/SSH | | X |
|
||||
+---------------------+-----------------+-----------+-----------+
|
||||
| | Mails | | X |
|
||||
+---------------------+-----------------+-----------+-----------+
|
||||
| | Monitoring | | X |
|
||||
+---------------------+-----------------+-----------+-----------+
|
||||
| | Backups | | X |
|
||||
+---------------------+-----------------+-----------+-----------+
|
||||
| | Settings | X | X |
|
||||
+---------------------+-----------------+-----------+-----------+
|
||||
|Status | | X | X |
|
||||
+---------------------+-----------------+-----------+-----------+
|
||||
|Settings | | | X |
|
||||
+---------------------+-----------------+-----------+-----------+
|
||||
|
||||
Public Access
|
||||
=============
|
||||
|
||||
@@ -187,6 +187,3 @@ To do so, check the :guilabel:`Deprecated` box in the account's settings, and sa
|
||||
* :doc:`../vendor_bills/deferred_expenses`
|
||||
* :doc:`../customer_invoices/deferred_revenues`
|
||||
* :doc:`../../fiscal_localizations`
|
||||
* `Odoo Tutorials: Chart of accounts <https://www.odoo.com/slides/slide/chart-of-accounts-1630>`_
|
||||
* `Odoo Tutorials: Update your chart of accounts
|
||||
<https://www.odoo.com/slides/slide/update-your-chart-of-accounts-1658>`_
|
||||
|
||||
@@ -2,122 +2,128 @@
|
||||
Checks
|
||||
======
|
||||
|
||||
There are two ways to handle payments received by checks in Odoo, either by using :ref:`outstanding
|
||||
accounts <checks/outstanding-account>` or by :ref:`bypassing the reconciliation process
|
||||
<checks/reconciliation-bypass>`.
|
||||
There are two ways to handle payments received by checks. Odoo support
|
||||
both approaches so that you can use the one that better fits your
|
||||
habits.
|
||||
|
||||
**Using outstanding accounts is recommended**, as your bank account balance stays accurate by taking
|
||||
into account checks yet to be cashed.
|
||||
1. **Undeposited Funds:**
|
||||
once you receive the check, you record a payment
|
||||
by check on the invoice. (using a Check journal and posted on the
|
||||
Undeposited Fund account) Then, once the check arrives in your
|
||||
bank account, move money from Undeposited Funds to your bank
|
||||
account.
|
||||
|
||||
.. note::
|
||||
Both methods produce the same data in your accounting at the end of the process. But if you
|
||||
have checks that have not been cashed in, the **Outstanding Account** method reports these
|
||||
checks in the **Outstanding Receipts** account. However, funds appear in your bank account
|
||||
whether or not they are reconciled, as the bank value is reflected at the moment of the bank
|
||||
statement.
|
||||
2. **One journal entry only:**
|
||||
once your receive the check, you record a
|
||||
payment on your bank, paid by check, without going through the
|
||||
**Undeposited Funds**. Once you process your bank statement, you do
|
||||
the matching with your bank feed and the check payment, without
|
||||
creating a dedicated journal entry.
|
||||
|
||||
.. seealso::
|
||||
* :ref:`Outstanding accounts <bank/outstanding-accounts>`
|
||||
* :ref:`Bank reconciliation <accounting/reconciliation>`
|
||||
We recommend the first approach as it is more accurate (your bank
|
||||
account balance is accurate, taking into accounts checks that have not
|
||||
been cashed yet). Both approaches require the same effort.
|
||||
|
||||
.. _checks/outstanding-account:
|
||||
Even if the first method is cleaner, Odoo support the second approach
|
||||
because some accountants are used to it (quickbooks and peachtree
|
||||
users).
|
||||
|
||||
Method 1: Outstanding account
|
||||
=============================
|
||||
.. Note::
|
||||
You may have a look at the *Deposit Ticket feature* if you deposit
|
||||
several checks to your bank accounts in batch.
|
||||
|
||||
When you receive a check, you :doc:`record a payment <../bank/reconciliation>` by check on the
|
||||
invoice. Then, when your bank account is credited with the check's amount, you reconcile the payment
|
||||
and statement to move the amount from the **Outstanding Receipt** account to the **Bank** account.
|
||||
Option 1: Undeposited Funds
|
||||
===========================
|
||||
|
||||
.. tip::
|
||||
You can create a new payment method named *Checks* if you would like to identify such payments
|
||||
quickly. To do so, go to :menuselection:`Accounting --> Configuration --> Journals --> Bank`,
|
||||
click the :guilabel:`Incoming Payments` tab, and :guilabel:`Add a line`. As :guilabel:`Payment
|
||||
Method`, select :guilabel:`Manual`, enter `Checks` as name, and :guilabel:`Save`.
|
||||
Configuration
|
||||
-------------
|
||||
|
||||
.. _checks/reconciliation-bypass:
|
||||
- Create a journal **Checks**
|
||||
|
||||
Method 2: Reconciliation bypass
|
||||
===============================
|
||||
- Set **Undeposited Checks** as a default credit/debit account
|
||||
|
||||
When you receive a check, you :doc:`record a payment <../bank/reconciliation>` on the related
|
||||
invoice. The amount is then moved from the **Account Receivable** to the **Bank** account, bypassing
|
||||
the reconciliation and creating only **one journal entry**.
|
||||
- Set the bank account related to this journal as **Allow Reconciliation**
|
||||
|
||||
To do so, you *must* follow the following setup. Go to :menuselection:`Accounting --> Configuration
|
||||
--> Journals --> Bank`. Click the :guilabel:`Incoming Payments` tab and then :guilabel:`Add a line`,
|
||||
select :guilabel:`Manual` as :guilabel:`Payment Method`, and enter `Checks` as :guilabel:`Name`.
|
||||
Click the :guilabel:`⋮` button, tick :guilabel:`Outstanding Receipts accounts`, and in the
|
||||
:guilabel:`Outstanding Receipts accounts` column, set the :guilabel:`Bank` account for the
|
||||
**Checks** payment method, and :guilabel:`Save`.
|
||||
From check payments to bank statements
|
||||
--------------------------------------
|
||||
|
||||
.. image:: checks/outstanding-payment-accounts.png
|
||||
:alt: Bypass the Outstanding Receipts account using the Bank account.
|
||||
The first way to handle checks is to create a check journal. Thus,
|
||||
checks become a payment method in itself and you will record two
|
||||
transactions.
|
||||
|
||||
Payment registration
|
||||
====================
|
||||
Once you receive a customer check, go to the related invoice and click
|
||||
on **Register Payment**. Fill in the information about the payment:
|
||||
|
||||
.. note::
|
||||
By default, there are two ways to register payments made by check:
|
||||
- Payment method: Check Journal (that you configured with the debit and
|
||||
credit default accounts as **Undeposited Funds**)
|
||||
|
||||
- **Manual**: for single checks;
|
||||
- **Batch**: for multiple checks at once.
|
||||
- Memo: write the Check number
|
||||
|
||||
This documentation focuses on **single-check** payments. For **batch deposits**, see :doc:`the
|
||||
batch payments documentation <batch>`.
|
||||
.. image:: checks/check02.png
|
||||
|
||||
Once you receive a customer check, go to the related invoice (:menuselection:`Accounting -->
|
||||
Customer --> Invoices)`, and click :guilabel:`Register Payment`. Fill in the payment information:
|
||||
|
||||
- :guilabel:`Journal: Bank`;
|
||||
- :guilabel:`Payment method`: :guilabel:`Manual` (or **Checks** if you have created a specific
|
||||
payment method);
|
||||
- :guilabel:`Memo`: enter the check number;
|
||||
- Click :guilabel:`Create Payment`.
|
||||
|
||||
.. image:: checks/payment-checks.png
|
||||
:alt: Check payment info
|
||||
|
||||
The generated journal entries are different depending on the payment registration method chosen.
|
||||
|
||||
Journal entries
|
||||
===============
|
||||
|
||||
Outstanding account
|
||||
-------------------
|
||||
|
||||
The invoice is marked as :guilabel:`In Payment` as soon as you record the payment. This operation
|
||||
produces the following **journal entry**:
|
||||
This operation will produce the following journal entry:
|
||||
|
||||
+----------------------+-------------------+----------+----------+
|
||||
| Account | Statement Match | Debit | Credit |
|
||||
+======================+===================+==========+==========+
|
||||
| Account Receivable | | | 100.00 |
|
||||
+----------------------+-------------------+----------+----------+
|
||||
| Outstanding Receipts | | 100.00 | |
|
||||
| Undeposited Funds | | 100.00 | |
|
||||
+----------------------+-------------------+----------+----------+
|
||||
|
||||
Then, once you receive the bank statements, match this statement with the check of the **Outstanding
|
||||
Receipts** account. This produces the following **journal entry**:
|
||||
The invoice is marked as paid as soon as you record the check.
|
||||
|
||||
Then, once you get the bank statements, you will match this statement
|
||||
with the check that is in Undeposited Funds.
|
||||
|
||||
+---------------------+-------------------+----------+----------+
|
||||
| Account | Statement Match | Debit | Credit |
|
||||
+=====================+===================+==========+==========+
|
||||
| Outstanding Receipts| X | | 100.00 |
|
||||
| Undeposited Funds | X | | 100.00 |
|
||||
+---------------------+-------------------+----------+----------+
|
||||
| Bank | | 100.00 | |
|
||||
+---------------------+-------------------+----------+----------+
|
||||
|
||||
If you use this approach to manage received checks, you get the list of checks that have not been
|
||||
cashed in the **Outstanding Receipt** account (accessible, for example, from the general ledger).
|
||||
|
||||
Reconciliation bypass
|
||||
---------------------
|
||||
If you use this approach to manage received checks, you get the list of
|
||||
checks that have not been cashed in the **Undeposit Funds** account
|
||||
(accessible, for example, from the general ledger).
|
||||
|
||||
The invoice is marked as :guilabel:`Paid` as soon as you record the check.
|
||||
.. Note::
|
||||
Both methods will produce the same data in your accounting at the
|
||||
end of the process. But, if you have checks that have not been cashed,
|
||||
this one is cleaner because those checks have not been reported yet on
|
||||
your bank account.
|
||||
|
||||
With this approach, you bypass the use of **outstanding accounts**, effectively getting only one
|
||||
journal entry in your books and bypassing the reconciliation:
|
||||
Option 2: One journal entry only
|
||||
================================
|
||||
|
||||
Configuration
|
||||
-------------
|
||||
|
||||
These is nothing to configure if you plan to manage your checks using
|
||||
this method.
|
||||
|
||||
From check payments to bank statements
|
||||
--------------------------------------
|
||||
|
||||
Once you receive a customer check, go to the related invoice and click
|
||||
on **Register Payment**. Fill in the information about the payment:
|
||||
|
||||
- **Payment method:** the bank that will be used for the deposit
|
||||
|
||||
- Memo: write the check number
|
||||
|
||||
.. image:: checks/check03.png
|
||||
|
||||
The invoice is marked as paid as soon as you record the check.
|
||||
|
||||
Once you will receive the bank statements, you will do the matching with
|
||||
the statement and this actual payment. (technically: point this payment
|
||||
and relate it to the statement line)
|
||||
|
||||
With this approach, you will get the following journal entry in your
|
||||
books:
|
||||
|
||||
+----------------------+-------------------+----------+----------+
|
||||
| Account | Statement Match | Debit | Credit |
|
||||
@@ -126,3 +132,17 @@ journal entry in your books and bypassing the reconciliation:
|
||||
+----------------------+-------------------+----------+----------+
|
||||
| Bank | | 100.00 | |
|
||||
+----------------------+-------------------+----------+----------+
|
||||
|
||||
.. tip::
|
||||
You may also record the payment directly without going on the
|
||||
customer invoice, using the menu :menuselection:`Sales --> Payments`. This method may
|
||||
be more convenient if you have a lot of checks to record in a batch but
|
||||
you will have to reconcile entries afterwards (matching payments with
|
||||
invoices)
|
||||
|
||||
If you use this approach to manage received checks, you can use the
|
||||
report **Bank Reconciliation Report** to verify which checks have been
|
||||
received or paid by the bank. (this report is available from the **More**
|
||||
option from the Accounting dashboard on the related bank account).
|
||||
|
||||
.. image:: checks/check01.png
|
||||
|
||||
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 13 KiB |
@@ -2,64 +2,68 @@
|
||||
EU intra-community distance selling
|
||||
===================================
|
||||
|
||||
EU intra-community distance selling involves the cross-border trade of goods and services from
|
||||
vendors registered for VAT purposes to individuals (B2C) located in a European Union member state.
|
||||
The transaction is conducted remotely, typically through online platforms, mail orders, telephone,
|
||||
or other means of communication.
|
||||
|
||||
EU intra-community distance selling is subject to specific VAT rules and regulations. The vendor
|
||||
must charge VAT per the VAT rate applicable in the buyer's country.
|
||||
**Distance sales within the European Union** include cross-border sales of goods and services to a
|
||||
private consumer (B2C) in another EU Member State when the seller doesn't meet face-to-face with the
|
||||
customer. Organizations must ensure that the VAT on distance sales is paid to the Member State in
|
||||
which the goods or services are delivered.
|
||||
|
||||
.. note::
|
||||
This remains applicable even if the vendor is located outside of the European Union.
|
||||
This remains true even if your organization is located outside of the European Union.
|
||||
|
||||
While this regulation mainly applies to :doc:`eCommerce <../../../websites/ecommerce>` sales to
|
||||
private EU consumers, it is also valid for mail order sales and telesales.
|
||||
|
||||
The Union **One-Stop Shop (OSS)** is an online portal where businesses can register for the OSS and
|
||||
declare their intra-community distance sales. Each EU member state integrates an online OSS portal.
|
||||
|
||||
The **EU intra-community Distance Selling** feature helps your organization comply with this
|
||||
regulation by creating and configuring new :doc:`fiscal positions <fiscal_positions>` and
|
||||
:doc:`taxes <../taxes>` based on your company's country.
|
||||
|
||||
.. seealso::
|
||||
- `European Commission: OSS | Taxation and Customs Union
|
||||
<https://ec.europa.eu/taxation_customs/business/vat/oss_en>`_
|
||||
|
||||
.. _eu_distance_selling/configuration:
|
||||
|
||||
Configuration
|
||||
=============
|
||||
|
||||
The **EU Intra-community Distance Selling** feature helps you comply with this regulation by
|
||||
creating and configuring new **fiscal positions** and **taxes** based on your company's country. To
|
||||
enable it, go to :menuselection:`Accounting --> Configuration --> Settings --> Taxes`, tick
|
||||
:guilabel:`EU Intra-community Distance Selling`, and :guilabel:`Save`.
|
||||
Go to :menuselection:`Accounting/Invoicing --> Settings --> Taxes`, then enable **EU intra-community
|
||||
Distance Selling** (or **EU Digital Goods VAT** if you created your database before July 1, 2021),
|
||||
and *Save*.
|
||||
|
||||
.. image:: eu_distance_selling/enable-feature.png
|
||||
:align: center
|
||||
:alt: EU intra-community Distance Selling feature in Odoo Accounting settings
|
||||
|
||||
.. tip::
|
||||
Whenever you add or modify taxes, you can automatically update your fiscal positions. To do so,
|
||||
go to :menuselection:`Accounting/Invoicing --> Settings --> Taxes --> EU Intra-community Distance
|
||||
Selling` and click on the :guilabel:`Refresh tax mapping`.
|
||||
.. important::
|
||||
Please :ref:`upgrade the module <general/upgrade>` `l10n_eu_service` if you already installed it
|
||||
before **July 1, 2021**, or if you activated the feature **EU Digital Goods VAT** in the
|
||||
Accounting settings. Then, make sure to :ref:`refresh the tax mapping
|
||||
<eu_distance_selling/refresh-mapping>`.
|
||||
|
||||
.. note::
|
||||
We highly recommend checking that the proposed mapping is suitable for the products and services
|
||||
you sell before using it.
|
||||
.. _eu_distance_selling/taxes:
|
||||
|
||||
Fiscal Positions and Taxes
|
||||
==========================
|
||||
|
||||
Once enabled, the feature automatically creates all the necessary taxes and fiscal positions needed
|
||||
for each EU member state, based on your company's country.
|
||||
|
||||
We highly recommend checking that the proposed mapping is suitable for the products and services you
|
||||
sell before using it.
|
||||
|
||||
.. _eu_distance_selling/refresh-mapping:
|
||||
|
||||
Refresh tax mapping
|
||||
-------------------
|
||||
|
||||
Whenever you add or modify taxes, you can update automatically your fiscal positions.
|
||||
|
||||
To do so, go to :menuselection:`Accounting/Invoicing --> Settings --> Taxes --> EU intra-community
|
||||
Distance Selling` and click on the *Refresh tax mapping* button.
|
||||
|
||||
.. seealso::
|
||||
- :doc:`../taxes`
|
||||
- :doc:`../../fiscal_localizations`
|
||||
- :doc:`fiscal_positions`
|
||||
|
||||
One-Stop Shop (OSS)
|
||||
===================
|
||||
|
||||
The :abbr:`OSS (One-Stop Shop)` system introduced by the European Union simplifies VAT collection
|
||||
for **cross-border** sales of goods and services. It primarily applies to business-to-consumer
|
||||
**(B2C)** cases. With the OSS, businesses can register for VAT in their home country and use a
|
||||
single online portal to handle VAT obligations for their sales within the EU. There are **two
|
||||
primary schemes**: the **Union OSS** scheme for cross-border services and the **Import OSS** scheme
|
||||
for goods valued at or below €150.
|
||||
|
||||
Reports
|
||||
-------
|
||||
|
||||
To generate **OSS sales** or **OSS imports** reports and submit them onto the OSS portal, go to
|
||||
:menuselection:`Accounting --> Reporting --> Tax Report`, click :guilabel:`Tax Report: Global
|
||||
Summary`, and select either :guilabel:`OSS Sales` or :guilabel:`OSS Imports`. Once selected, click
|
||||
on :guilabel:`PDF`, :guilabel:`XLSX`, or :guilabel:`XML` in the top-left corner. This generates the
|
||||
currently-opened report in the selected format. Once generated, log into the platform of your
|
||||
competent federal authority to submit it onto the OSS portal.
|
||||
|
||||
.. image:: eu_distance_selling/oss-report.png
|
||||
:alt: OSS reports view
|
||||
|
||||
.. seealso::
|
||||
- `European Commission: OSS | Taxation and Customs Union <https://ec.europa.eu/taxation_customs/business/vat/oss_en>`_
|
||||
- :doc:`../taxes`
|
||||
|
||||
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 4.5 KiB |
|
Before Width: | Height: | Size: 5.2 KiB |
@@ -23,16 +23,15 @@ products in a default kanban view.
|
||||
:align: center
|
||||
:alt: Set expense costs on products.
|
||||
|
||||
To create a new expense product, click :guilabel:`Create`. A product form will appear. Only the
|
||||
:guilabel:`Product Name` and :guilabel:`Unit of Measure` fields are required to create a new expense
|
||||
product. Enter the :guilabel:`Product Name` in the field, and select the :guilabel:`Unit of Measure`
|
||||
from the drop-down menu (most products will be set to :guilabel:`Units`, which is the default
|
||||
selection).
|
||||
To create a new expense product, click :guilabel:`Create`. A product form will appear. Only two
|
||||
fields are required, the :guilabel:`Product Name` and the :guilabel:`Unit of Measure`. Enter the
|
||||
:guilabel:`Product Name` in the field, and select the :guilabel:`Unit of Measure` from the drop-down
|
||||
menu (most products will be set to :guilabel:`Units`).
|
||||
|
||||
.. tip::
|
||||
The *Sales* app is where specification on the units of measure are created and edited (e.g.
|
||||
units, miles, nights, etc.). Go to :menuselection:`Sales app --> Configuration --> Settings` and
|
||||
ensure `Units of Measure` is enabled in the `Product Catalog` section. Click on the
|
||||
ensure `Units of Measure` is checked off in the `Product Catalog` section. Click on the
|
||||
:guilabel:`Units of Measure` internal link to view, create, and edit the units of measure. Refer
|
||||
to :doc:`this document </applications/inventory_and_mrp/inventory/management/products/uom>` to
|
||||
learn more about units of measure and how to configure them.
|
||||
@@ -50,9 +49,9 @@ 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,
|
||||
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.
|
||||
- **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", they enter the number of miles driven, and are reimbursed 0.30 per mile they
|
||||
entered. An expense for 100 miles would equal a reimbursement for $30.00.
|
||||
@@ -91,55 +90,48 @@ First, click :guilabel:`Create`, and then fill out the various fields on the for
|
||||
- :guilabel:`Product`: Select the product from the drop-down menu that most closely corresponds to
|
||||
the expense. For example, an airplane ticket would be appropriate for an expense
|
||||
:guilabel:`Product` named :guilabel:`Air Travel`.
|
||||
- :guilabel:`Total`: Enter the total amount paid for the expense in one of two ways:
|
||||
- :guilabel:`Unit Price`: Enter the total amount paid for the expense in one of two ways:
|
||||
|
||||
#. If the expense is for one single item/expense with a variable price, enter the cost in the
|
||||
:guilabel:`Total` field. Odoo will not display the :guilabel:`Quantity` field for a product if
|
||||
it does not need to have the quantity specified (a product with a unit price of `0.00` and a
|
||||
quantity of `1.00`).
|
||||
|
||||
#. 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 :guilabel:`Total` is automatically updated with the correct total (the :guilabel:`Quantity`
|
||||
x the :guilabel:`Unit Price` = the :guilabel:`Total`).
|
||||
#. If the expense is for one single item/expense, enter the cost in the :guilabel:`Unit Price`
|
||||
field, and leave the :guilabel:`Quantity` `1.00`.
|
||||
#. If the expense is for multiples of the same item/expense, enter the price *per unit* in the
|
||||
:guilabel:`Unit Price` field, and enter the *quantity of units* in the :guilabel:`Quantity`
|
||||
field.
|
||||
|
||||
.. example::
|
||||
For example, in the case of mileage driven, the :guilabel:`Unit Price` would be set in the
|
||||
product form as the cost *per mile*. Simply set the :guilabel:`Quantity` to the *number of
|
||||
miles* driven, and the total for the expense is updated.
|
||||
In the case of a hotel stay, for example, the :guilabel:`Unit Price` would be set as the
|
||||
cost *per night*, and set the :guilabel:`Quantity` to the *number of nights* stayed.
|
||||
|
||||
- :guilabel:`Bill Reference`: If there is any reference text that should be included for the
|
||||
expense, enter it in this field. This field is not visible for expense products that require a
|
||||
:guilabel:`Quantity` to be entered.
|
||||
- :guilabel:`Taxes`: If taxes were paid on the expense, select the tax percentage using the
|
||||
drop-down menu. Tax options are pre-configured based on the localization setting selected when the
|
||||
database was created. Adding any new taxes should only be done when necessary.
|
||||
|
||||
.. note::
|
||||
When a tax is selected, the :guilabel:`Total` value will update in real time to show the added
|
||||
taxes.
|
||||
|
||||
- :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`.
|
||||
- :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:`Bill Reference`: If there is any reference text that should be included for the
|
||||
expense, enter it in this field.
|
||||
- :guilabel:`Account`: Select the expense account that this expense should be logged on from the
|
||||
drop-down menu.
|
||||
- :guilabel:`Employee`: Using the drop-down menu, select the employee this expense is for.
|
||||
- :guilabel:`Customer to Reinvoice`: If the expense is something that should be paid for by a
|
||||
customer, select the customer and related sales order that will be invoiced for this expense from
|
||||
the drop-down menu. For example, if a customer wishes to have a custom designed piece of
|
||||
furniture, and purchased design hours from our employee, that sales order listing the hours would
|
||||
be referenced as the :guilabel:`Customer to Reinvoice`. In the list view, there may be many
|
||||
different sales orders referencing the same company, so be sure the correct sales order is
|
||||
selected.
|
||||
|
||||
.. note::
|
||||
The :guilabel:`Customer to Reinvoice` field is only visible if the expense product has either
|
||||
:guilabel:`At cost` or :guilabel:`Sales price` selected under the :guilabel:`Re-Invoice Expenses`
|
||||
section. If :guilabel:`No` is selected for the :guilabel:`Re-Invoice Expenses` section, the
|
||||
:guilabel:`Customer to Reinvoice` field is hidden.
|
||||
|
||||
customer, select the customer that will be invoiced for this expense from the drop-down menu. For
|
||||
example, if a customer wishes to have an on-site meeting, and agrees to pay for the expenses
|
||||
associated with it (such as travel, hotel, meals, etc.), then all expenses tied to that meeting
|
||||
would indicate that customer as the :guilabel:`Customer to Reinvoice`.
|
||||
- :guilabel:`Analytic Account`: Select the account the expense should be written against from the
|
||||
drop-down menu.
|
||||
- :guilabel:`Company`: If multiple companies are set-up, select the company this expense should be
|
||||
filed for from the drop-down menu. If there is only one company, this field will be automatically
|
||||
populated.
|
||||
- :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`.
|
||||
- :guilabel:`Notes...`: If any notes are needed in order to clarify the expense, enter them in the
|
||||
notes field.
|
||||
|
||||
@@ -161,37 +153,14 @@ into an :guilabel:`Edit` button).
|
||||
:alt: Attach a receipt after saving the record.
|
||||
|
||||
Click the new :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.
|
||||
receipt to be attached, and click :guilabel:`Open`. A new :guilabel:`Receipts` smart button appears
|
||||
at the top, and the new receipt is recorded in the chatter. 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 smart button.
|
||||
|
||||
.. image:: expenses/receipt-icon.png
|
||||
.. image:: expenses/receipt-smartbutton.png
|
||||
:align: center
|
||||
:alt: View receipts in the chatter and see how many receipts are attached byu looking at the
|
||||
paperclip icon in the chatter beneath the record.
|
||||
|
||||
Create new expenses from a scanned receipt
|
||||
------------------------------------------
|
||||
|
||||
Rather than manually inputting all of the information for an expense, expenses can be created
|
||||
automatically 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 to Report`), 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 click :guilabel:`Edit` to make changes. The
|
||||
receipt that was scanned in appears in the chatter. Make any edits to the form, then click
|
||||
:guilabel:`Save` when all the information is entered.
|
||||
:alt: Attach a receipt after saving the record.
|
||||
|
||||
Automatically create new expenses from an email
|
||||
-----------------------------------------------
|
||||
@@ -200,7 +169,7 @@ Instead of individually creating each expense in the *Expenses* app, expenses ca
|
||||
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.
|
||||
Configuration --> Settings`. Ensure :guilabel:`Incoming Emails` is checked off.
|
||||
|
||||
.. image:: expenses/email-alias.png
|
||||
:align: center
|
||||
@@ -224,9 +193,9 @@ the receipt.
|
||||
|
||||
To check an expense product's internal reference, go to :menuselection:`Expenses app -->
|
||||
Configuration --> Expense Products`. If an internal reference is listed on the product, it is
|
||||
visible in this view.
|
||||
visible in this view as :guilabel:`(Ref###)`.
|
||||
|
||||
.. image:: expenses/internal-reference.png
|
||||
.. image:: expenses/internal-ref-numbers.png
|
||||
:align: center
|
||||
:alt: Internal reference numbers are listed in the main Expense Products view.
|
||||
|
||||
@@ -235,7 +204,7 @@ To add an internal reference on an expense product, click on the product, then c
|
||||
:guilabel:`Internal Reference` field, this sentence appears: :guilabel:`Use this reference as a
|
||||
subject prefix when submitting by email.`.
|
||||
|
||||
.. image:: expenses/accomodation-internal-reference.png
|
||||
.. image:: expenses/meals-internal-reference.png
|
||||
:align: center
|
||||
:alt: Internal reference numbers are listed in the main Expense Products view.
|
||||
|
||||
@@ -257,8 +226,6 @@ subject prefix when submitting by email.`.
|
||||
- The :guilabel:`Internal Reference` for the expense product `Meals` is `Ref005`
|
||||
- The :guilabel:`Cost` for the expense is `$25.00`
|
||||
|
||||
.. _expenses/report:
|
||||
|
||||
Create an expense report
|
||||
========================
|
||||
|
||||
@@ -276,19 +243,13 @@ each entry, or quickly select all the expenses in the list by clicking the check
|
||||
:alt: Select the expenses to submit, then create the report.
|
||||
|
||||
Once the expenses have been selected, click the :guilabel:`Create Report` button. The new report
|
||||
appears with all the expenses listed, and the :guilabel:`Employee`, :guilabel:`Paid By`,
|
||||
:guilabel:`Expense Journal`, and :guilabel:`Company` fields are automatically populated from the
|
||||
individual expenses in the report.
|
||||
appears with all the expenses listed, and the number of documents is visible in the
|
||||
:guilabel:`Documents` smart button.
|
||||
|
||||
It is recommended to add 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.
|
||||
|
||||
.. note::
|
||||
If all the expenses are listed for the same date, the :guilabel:`Expense Report Summary`
|
||||
field will be pre-populated with the date for the expenses.
|
||||
|
||||
Next, select a :guilabel:`Manager` from the drop-down menu to assign a manager to review the report.
|
||||
It is recommended to add a short summary for each report to help keep expenses organized. Click the
|
||||
:guilabel:`Edit` button, and the :guilabel:`Expense Report Summary` field appears. Enter a short
|
||||
description for the expense report (such as `Client Trip NYC`, or `Repairs for Company Car`). Next,
|
||||
select a :guilabel:`Manager` from the drop-down menu to assign a manager to review the report.
|
||||
|
||||
.. image:: expenses/expense-report-summary.png
|
||||
:align: center
|
||||
@@ -302,16 +263,11 @@ add, then click :guilabel:`Select`. The items now appear on the report that was
|
||||
:align: center
|
||||
:alt: Add more expenses to the report before submitting.
|
||||
|
||||
When all edits have been completed, click :guilabel:`Save`. Once the expense report is saved, an
|
||||
:guilabel:`Expenses` smart button appears in the top-right corner, listing the number of expenses on
|
||||
the report. Click the :guilabel:`Expenses` smart button to view the individual expenses for the
|
||||
report in a list.
|
||||
.. note::
|
||||
:guilabel:`Add a line` only appears when the document is in edit mode. It does not appear
|
||||
otherwise.
|
||||
|
||||
.. image:: expenses/expense-smart-button.png
|
||||
:align: center
|
||||
:alt: An Expenses smart button appears after saving the expense report.
|
||||
|
||||
.. _expenses/submit:
|
||||
When all edits have been completed, click :guilabel:`Save`.
|
||||
|
||||
Submit an expense report
|
||||
------------------------
|
||||
@@ -391,9 +347,8 @@ noted by the :guilabel:`Submitted` tag in the status column.
|
||||
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 reports in the list. Next, click the :guilabel:`Approve Report` button. The number of
|
||||
reports that are selected appear next to the :guilabel:`Approve Report` button, in an :guilabel:`X
|
||||
Selected` button, with X being the number of reports currently selected.
|
||||
to select all reports in the list. Next, click on the :guilabel:`⚙️ Action (gear)` icon, then click
|
||||
:guilabel:`Approve Report`.
|
||||
|
||||
.. image:: expenses/approve-report.png
|
||||
:align: center
|
||||
@@ -410,27 +365,20 @@ in the :guilabel:`Reason to refuse Expense` field, then click :guilabel:`Refuse`
|
||||
:align: center
|
||||
:alt: Send messages in the chatter.
|
||||
|
||||
Team managers can easily view all the expense reports to approve for their team members. While in
|
||||
the :guilabel:`Reports to Approve` view, click on :guilabel:`Filters`, then click :guilabel:`My
|
||||
Team`. This presents all the reports to approve for the manager's team. Manager's can easily view
|
||||
*all* reports for their team by simply clicking on and removing the :guilabel:`To Approve` filter in
|
||||
the :guilabel:`Search...` bar, leaving only the :guilabel:`My Team` filter active.
|
||||
Team managers can easily view all the expense reports for their team members. While in the
|
||||
:guilabel:`Reports to Approve` view, click on :guilabel:`Filters`, then click :guilabel:`My Team`.
|
||||
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`, then type in a message in the
|
||||
text box that appears, 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 anyone following.
|
||||
|
||||
Note that only followers can be tagged in a message. To tag someone who is not following, add
|
||||
them as a follower first. Click the :guilabel:`👤 (person)` icon, then click :guilabel:`Add
|
||||
Followers`, then enter their name in the :guilabel:`Recipients` field, and finally, click
|
||||
:guilabel:`Add Followers`.
|
||||
.. note::
|
||||
If more information is needed, such as a receipt is missing, communication is easy from the
|
||||
chatter. In an individual report, simply 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 anyone
|
||||
following.
|
||||
|
||||
.. image:: expenses/chatter.png
|
||||
:align: center
|
||||
@@ -452,7 +400,8 @@ 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 reports in the list. Next, click :guilabel:`Post Entries`.
|
||||
all reports in the list. Next, click on the :guilabel:`⚙️ Action (gear)` icon, then click
|
||||
:guilabel:`Post Entries`.
|
||||
|
||||
.. image:: expenses/post-entries.png
|
||||
:align: center
|
||||
@@ -460,8 +409,7 @@ all reports in the list. Next, click :guilabel:`Post Entries`.
|
||||
|
||||
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.
|
||||
Payslip`, or :guilabel:`Refuse`. 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, then click :guilabel:`Refuse`. Refused reports
|
||||
@@ -490,7 +438,8 @@ 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 reports in the list. Next, click :guilabel:`Register Payment`.
|
||||
to select all reports in the list. Next, click on the :guilabel:`⚙️ Action (gear)` icon, then click
|
||||
:guilabel:`Register Payment`.
|
||||
|
||||
.. image:: expenses/register-payment.png
|
||||
:align: center
|
||||
@@ -502,19 +451,10 @@ To pay an individual report, click on a report to go to a detailed view of that
|
||||
Re-invoice expenses to customers
|
||||
================================
|
||||
|
||||
If an expense is to be reimbursed by a customer and not the company, the expense can be
|
||||
automatically charged to the customer. This is done by first referencing the :abbr:`SO (Sales
|
||||
Order)` the expense should be applied to when creating the expense.
|
||||
|
||||
The next steps are the same as if the expense is being reimbursed by the company instead of a
|
||||
customer. The expense or expenses are placed on an expense report, and then the expense report is
|
||||
submitted for approval. Next, managers approve the expense report, and the accounting department
|
||||
post the journal entry.
|
||||
|
||||
Finally, once the expense report is posted to a journal, the expense then appears on the :abbr:`SO
|
||||
(Sales Order)` that was referenced when the expense was first created.
|
||||
|
||||
The sales order can then be invoiced, thus invoicing the customer for the expense.
|
||||
If expenses are tracked on customer projects, expenses can be automatically charged back to the
|
||||
customer. This is done by creating an expense report, then creating a sales order with the expensed
|
||||
items on it. Then, managers approve the expense report, and the accounting department posts the
|
||||
journal entries. Finally, the customer is invoiced.
|
||||
|
||||
Setup
|
||||
-----
|
||||
@@ -537,23 +477,37 @@ and :guilabel:`Re-Invoicing Policy` by clicking the radio button next to the des
|
||||
- :guilabel:`At cost`: Expense product will invoice expenses at their real cost.
|
||||
- :guilabel:`At sales price`: Expense product will invoice the price set on the sale order.
|
||||
|
||||
Create an expense and expense report
|
||||
------------------------------------
|
||||
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. Using the drop-down menu, select the *sales order* the
|
||||
expense will appear on in the :guilabel:`Customer to Reinvoice` section. Next, select the
|
||||
:guilabel:`Analytic Account` the expense will be posted to. After the expense(s) is created, the
|
||||
expense report needs to be :ref:`created <expenses/report>` and :ref:`submitted <expenses/submit>`
|
||||
as usual.
|
||||
entered in order to re-invoice a customer. Select the :guilabel:`Customer to Reinvoice` from the
|
||||
drop-down menu. Next, select the :guilabel:`Analytic Account` the expense will be posted to.
|
||||
|
||||
.. 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
|
||||
field is unable to be modified once the expense is added to an expense report.
|
||||
Create a quote and sales order
|
||||
------------------------------
|
||||
|
||||
In the :menuselection:`Sales` app, create a quote for the customer being invoiced, listing the
|
||||
expense products. First, click :guilabel:`Create` to create a new quotation. Next, select the
|
||||
:guilabel:`Customer` being invoiced for the expenses from the drop-down menu.
|
||||
|
||||
In the :guilabel:`Order Lines` tab, click :guilabel:`Add a product`. In the :guilabel:`Product`
|
||||
field, select the first item being invoiced from the drop-down menu, or type in the product name.
|
||||
Then, update the :guilabel:`Quantity`, the :guilabel:`Delivered` quantity, and the :guilabel:`Unit
|
||||
Price` if needed. Repeat this for all products being invoiced. When all the products have been added
|
||||
to the quote, click :guilabel:`Confirm` and the quotation becomes a sales order.
|
||||
|
||||
.. image:: expenses/expenses-salesorder.png
|
||||
:align: center
|
||||
:alt: Create and confirm the sales order with the expenses listed as products.
|
||||
|
||||
Once the quote turns into a sales order, a :guilabel:`Delivered` column appears. The delivered
|
||||
quantity must be updated for each item. Click on the `0.000` field for each product, and enter the
|
||||
delivered quantity. When all delivered quantities have been entered, click :guilabel:`Save`.
|
||||
|
||||
Validate and post expenses
|
||||
--------------------------
|
||||
@@ -565,32 +519,18 @@ set on every expense line of a report. If an :guilabel:`Analytic Account` is mis
|
||||
: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 entry is posted*, and the expense(s) now appear on
|
||||
the referenced :abbr:`SO (Sales Order)`.
|
||||
<expenses/post>`. Once an expense report is approved, it can then be posted.
|
||||
|
||||
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 entry has been posted, the :abbr:`SO (Sales
|
||||
Order)` can be opened and the expenses can be seen on it. Click anywhere on an expense line, and the
|
||||
details for that individual expense appears in a pop-up. Click on the :abbr:`SO (Sales Order)` that
|
||||
is listed next to :guilabel:`Customer to Reinvoice`.
|
||||
Once the quote has turned into a sales order, and the expense report has been approved, it is time
|
||||
to invoice the customer. Go to :menuselection:`Sales app --> To Invoice --> Orders to Invoice` to
|
||||
view the sales orders ready to be invoiced.
|
||||
|
||||
.. 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.
|
||||
|
||||
The :abbr:`SO (Sales Order)` appears, and now the expenses are listed in the :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.
|
||||
Next, find the sales order related to the expense report, click into it, and then click
|
||||
:guilabel:`Create Invoice` and a :guilabel:`Create invoices` pop-up window appears. Select if the
|
||||
invoice is a :guilabel:`Regular invoice`, :guilabel:`Down payment (percentage)`, or :guilabel:`Down
|
||||
payment (fixed amount)` by clicking the radio button next to the selection. For either down payment
|
||||
options, enter the amount (fixed or percentage) in the :guilabel:`Down Payment Amount` field.
|
||||
Finally, click either :guilabel:`create and view invoice` or :guilabel:`create invoice`.
|
||||
|
||||
|
Before Width: | Height: | Size: 8.7 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 7.9 KiB After Width: | Height: | Size: 12 KiB |
BIN
content/applications/finance/expenses/create-new-expense.png
Normal file
|
After Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 8.0 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 3.1 KiB |
BIN
content/applications/finance/expenses/expenses-salesorder.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
content/applications/finance/expenses/internal-ref-numbers.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 3.9 KiB |
|
After Width: | Height: | Size: 11 KiB |
BIN
content/applications/finance/expenses/new-expense-form.png
Normal file
|
After Width: | Height: | Size: 9.0 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 7.2 KiB |
|
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 15 KiB |
BIN
content/applications/finance/expenses/receipt-smartbutton.png
Normal file
|
After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 8.0 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 7.7 KiB After Width: | Height: | Size: 7.7 KiB |
|
Before Width: | Height: | Size: 8.9 KiB After Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 21 KiB |
@@ -2,7 +2,7 @@
|
||||
Belgium
|
||||
=======
|
||||
|
||||
.. _belgium/pos-restaurant-certification:
|
||||
.. _belgium/introduction:
|
||||
|
||||
Fiscal certification: POS restaurant
|
||||
====================================
|
||||
@@ -12,14 +12,14 @@ use a government-certified **Cash Register System** for their receipts. This app
|
||||
earnings (excluding VAT, drinks, and take-away food) exceed 25,000 euros.
|
||||
|
||||
This government-certified system entails the use of a :ref:`certified POS system
|
||||
<belgium/certified-pos>`, along with a device called a :ref:`Fiscal Data Module <belgium/fdm>` (or
|
||||
<belgium/certified>`, along with a device called a :ref:`Fiscal Data Module <belgium/fdm>` (or
|
||||
**black box**) and a :ref:`VAT Signing Card <belgium/vat>`.
|
||||
|
||||
.. important::
|
||||
Do not forget to register as *foodservice industry manager* on the `Federal Public Service
|
||||
Finance registration form <https://www.systemedecaisseenregistreuse.be/fr/enregistrement>`_.
|
||||
|
||||
.. _belgium/certified-pos:
|
||||
.. _belgium/certified:
|
||||
|
||||
Certified POS system
|
||||
--------------------
|
||||
@@ -121,6 +121,7 @@ As a pre-requisite, :ref:`activate <general/install>` the `Belgian Registered Ca
|
||||
(technical name: `pos_blackbox_be`).
|
||||
|
||||
.. image:: belgium/be-modules.png
|
||||
:align: center
|
||||
:alt: black box modules for belgian fiscal certification
|
||||
|
||||
Once the module is activated, add your VAT number to your company information. To set it up, go to
|
||||
@@ -130,6 +131,7 @@ so, go to the :guilabel:`Employees` app and open an employee form. There, go to
|
||||
settings tab --> Attendance/Point of Sale`, and fill in the :guilabel:`INSZ or BIS number` field.
|
||||
|
||||
.. image:: belgium/bis-number.png
|
||||
:align: center
|
||||
:alt: ISNZ or BIS number field on employee form
|
||||
|
||||
.. tip::
|
||||
@@ -158,6 +160,7 @@ database. To verify that the IoT Box recognizes the FDM, go to the IoT homepage
|
||||
:guilabel:`IOT Device` section, which should display the FDM.
|
||||
|
||||
.. image:: belgium/iot-devices.png
|
||||
:align: center
|
||||
:alt: Hardware status page on a registered IoT Box
|
||||
|
||||
Then, add the IoT to your POS. To do so, go to :menuselection:`Point of Sale --> Configuration -->
|
||||
|
||||
@@ -33,7 +33,7 @@ localization in Odoo, it is necessary to meet the following requirements:
|
||||
<https://www.gob.mx/sat/acciones-y-programas/certificado-de-sello-digital>`_ (CSD).
|
||||
#. Choose a PAC and purchase stamps. Currently the Mexican location in Odoo works with the following
|
||||
PACs: `Solución Factible <https://solucionfactible.com/>`_, `Quadrum (formerly Finkok)
|
||||
<https://cfdiquadrum.com.mx/index.html>`_ and `SW Sapien - Smarter Web <https://info.sw.com.mx/sw-smarter-odoo/>`_.
|
||||
<https://cfdiquadrum.com.mx/index.html>`_ and `SW Sapien - Smarter Web <https://sw.com.mx/>`_.
|
||||
#. Have knowledge and experience with billing, sales and accounting in Odoo. This documentation
|
||||
contains only the information necessary to enable the use of Odoo in a company based in Mexico.
|
||||
|
||||
@@ -211,7 +211,7 @@ working with and the credentials. That way, electronic invoicing will be enabled
|
||||
Remember that you must register directly with the PAC of your choice before you start creating
|
||||
invoices from Odoo. We have the following PACs available: `Quadrum
|
||||
<https://cfdiquadrum.com.mx/index.html>`_, `Solución Factible <https://solucionfactible.com/>`_
|
||||
and `SW Sapien - Smarter Web <https://info.sw.com.mx/sw-smarter-odoo/>`_.
|
||||
and `SW Sapien - Smarter Web <https://sw.com.mx/>`_.
|
||||
|
||||
You must process your **Private Key (CSD)** with the SAT institution before following these
|
||||
steps. If you do not have this information, try with the Test Credentials and return to this
|
||||
|
||||
@@ -104,18 +104,16 @@ URLs, proceed as follows:
|
||||
:alt: Copy the prefix for the Adyen APIs
|
||||
|
||||
#. In Odoo, :ref:`navigate to the payment acquirer Adyen <payment_acquirers/add_new>`.
|
||||
#. In the :guilabel:`Checkout API URL` field, enter the following URL and replace `yourprefix` with
|
||||
the prefix you previously saved:
|
||||
`https://yourprefix-checkout-live.adyenpayments.com/checkout`.
|
||||
#. In the :guilabel:`Checkout API URL` field, enter the following URL and replace `yourprefix` with the
|
||||
prefix you previously saved: `https://yourprefix.com/checkout`.
|
||||
#. In the :guilabel:`Recurring API URL` field, enter the following URL and replace `yourprefix` with
|
||||
the prefix you previously saved:
|
||||
`https://yourprefix-pal-live.adyenpayments.com/pal/servlet/Recurring`.
|
||||
the prefix you previously saved: `https://yourprefix.com/pal/servlet/Recurring`.
|
||||
|
||||
.. note::
|
||||
If you are trying Adyen as a test, you can use the following URLs instead:
|
||||
|
||||
- :guilabel:`Checkout API URL`: `https://checkout-test.adyen.com`
|
||||
- :guilabel:`Recurring API URL`: `https://pal-test.adyen.com/pal/servlet/Recurring`
|
||||
- :guilabel:`Checkout API URL`: `https://checkout-test.adyen.com/checkout/`
|
||||
- :guilabel:`Recurring API URL`: `https://pal-test.adyen.com/pal/servlet/Recurring/`
|
||||
|
||||
Adyen Account
|
||||
-------------
|
||||
|
||||
@@ -1,82 +1,109 @@
|
||||
======
|
||||
PayPal
|
||||
Paypal
|
||||
======
|
||||
|
||||
`Paypal <https://www.paypal.com/>`_ is an American online payment acquirer available worldwide, and
|
||||
one of the few that does not charge a subscription fee.
|
||||
`Paypal <https://www.paypal.com/>`_ is available and popular worldwide. It doesn't charge any
|
||||
subscription fee, and creating an account is very easy. That's why we recommend it for starters in
|
||||
Odoo. It works as a seamless flow where the customer is routed to the Paypal website to register the
|
||||
payment.
|
||||
|
||||
Settings in PayPal
|
||||
==================
|
||||
Settings in Odoo
|
||||
================
|
||||
|
||||
To access your PayPal account settings, log into PayPal, open the :guilabel:`Account Settings`, and
|
||||
open the :guilabel:`Website payments` menu.
|
||||
.. seealso::
|
||||
- :ref:`payment_acquirers/add_new`
|
||||
|
||||
.. image:: paypal/paypal-account.png
|
||||
:align: center
|
||||
:alt: PayPal account menu
|
||||
Credentials tab
|
||||
---------------
|
||||
|
||||
Odoo needs your **API Credentials** to connect with your PayPal account, which comprise:
|
||||
|
||||
- **Email**: your login email address in Paypal.
|
||||
- **PDT Identity Token**: the key used to verify the authenticity of transactions.
|
||||
- **Use IPN**: whether you want to use Instant Payment Notification. Already checked, you don't have
|
||||
to change it.
|
||||
|
||||
You can copy your credentials from your Paypal account and paste them into the related fields under
|
||||
the **Credentials** tab.
|
||||
|
||||
|
||||
To set the **PDT Identity Token**, switch to :ref:`developer mode <developer-mode>` and retrieve the
|
||||
token by following the configuration step :ref:`paypal/enable-pdt`.
|
||||
|
||||
.. important::
|
||||
Note that for PayPal to work **in Odoo**, the options :ref:`Auto Return <paypal/auto-return>`,
|
||||
:ref:`PDT <paypal/pdt>`, and :ref:`IPN <paypal/ipn>` **must** all be enabled.
|
||||
If you are trying Paypal as a test, using a :ref:`Paypal Sandbox account <paypal/testing>`,
|
||||
change the **State** to *Test Mode*. We recommend doing this on a test Odoo database rather than
|
||||
on your main database.
|
||||
|
||||
.. _paypal/auto-return:
|
||||
Fees tab
|
||||
--------
|
||||
|
||||
Auto Return
|
||||
-----------
|
||||
You can charge extra fees to your customers for paying with Paypal to cover the transaction fees
|
||||
Paypal charges you. Once redirected to Paypal, your customer sees an extra amount applied to the
|
||||
order amount.
|
||||
|
||||
The **Auto Return** feature automatically redirects customers to Odoo once the payment is processed.
|
||||
To activate this, go to Paypal configuration's :guilabel:`Fees` tab in Odoo and activate
|
||||
:guilabel:`Add Extra Fees`.
|
||||
|
||||
From :guilabel:`Website payments`, go to :menuselection:`Website preferences --> Update --> Auto
|
||||
return for website payments --> Auto return` and select :guilabel:`On`. Enter the address of your
|
||||
Odoo database (e.g., `https://yourcompany.odoo.com`) in the :guilabel:`Return URL` field, and
|
||||
:guilabel:`Save`.
|
||||
You can refer to `Paypal Fees <https://www.paypal.com/webapps/mpp/paypal-fees>`_ to set up fees.
|
||||
|
||||
.. note::
|
||||
Any URL does the job. Odoo only needs the setting to be enabled since it uses another URL.
|
||||
`Traders in the EU <https://europa.eu/youreurope/citizens/consumers/shopping/pricing-payments/
|
||||
index_en.htm>`_ are not allowed to charge extra fees for paying with credit cards.
|
||||
|
||||
.. _paypal/pdt:
|
||||
Settings in Paypal
|
||||
==================
|
||||
|
||||
Payment Data Transfer (PDT)
|
||||
---------------------------
|
||||
First, set up your Paypal account to build a seamless customer experience with Odoo.
|
||||
|
||||
:abbr:`PDT (Payment Data Transfer)` allows to receive payment confirmations, displays the payment
|
||||
status to the customers, and verifies the authenticity of the payments. From :menuselection:`Website
|
||||
preferences --> Update`, scroll down to :guilabel:`Payment data transfer` and select :guilabel:`On`.
|
||||
Log into your PayPal account and open the account settings. Then, go to :menuselection:`Account menu
|
||||
--> Account settings --> Website payments`.
|
||||
|
||||
.. tip::
|
||||
PayPal displays your **PDT Identity Token** as soon as :ref:`Auto return <paypal/auto-return>`
|
||||
and :ref:`Payment Data Transfer (PDT) <paypal/pdt>` are enabled. If you need the **PDT Identity
|
||||
Token**, disable and re-enable :guilabel:`Payment data transfer` to display the token again.
|
||||
Enable Auto Return
|
||||
------------------
|
||||
|
||||
.. _paypal/ipn:
|
||||
The *Auto Return* feature automatically redirects your customers to Odoo once the payment is
|
||||
processed.
|
||||
|
||||
Instant Payment Notification (IPN)
|
||||
From the *Website payments* settings page, go to :menuselection:`Website preferences --> Update -->
|
||||
Auto return for website payments` and select **On**. Enter the address of your Odoo database (e.g.,
|
||||
`https://yourcompany.odoo.com`) in the **Return URL** field.
|
||||
|
||||
.. note::
|
||||
Any URL will do the job. Odoo only needs the setting to be enabled since it uses another URL.
|
||||
|
||||
.. _paypal/enable-pdt:
|
||||
|
||||
Enable Payment Data Transfer (PDT)
|
||||
----------------------------------
|
||||
|
||||
:abbr:`IPN (Instant Payment Notifications)` is similar to **PDT**, but allows for more
|
||||
notifications, such as chargeback notifications. To enable **IPN**, go to :menuselection:`Website
|
||||
payments --> Instant payment notifications --> Update` and click :guilabel:`Choose IPN settings`.
|
||||
Enter a :guilabel:`Notification URL`, select :guilabel:`Receive IPN messages (Enabled)`, and
|
||||
:guilabel:`Save`.
|
||||
Enable the *Payment Data Transfer* feature to receive payment confirmations immediately. This
|
||||
feature also displays the payment status to the customers and verifies the authenticity of the
|
||||
payments.
|
||||
|
||||
PayPal Account Optional
|
||||
From the *Website payments* settings page, go to :menuselection:`Website preferences --> Update -->
|
||||
Payment data transfer` and select **On**. PayPal displays your **PDT Identity Token** as soon as
|
||||
the change is saved.
|
||||
|
||||
Paypal Account Optional
|
||||
-----------------------
|
||||
|
||||
We advise not to prompt customers to log in with a PayPal account upon payment. It is better and
|
||||
more accessible for customers to pay with a debit/credit card. To disable that prompt, go to
|
||||
:menuselection:`Account Settings --> Website payments --> Update` and select :guilabel:`On` for
|
||||
:guilabel:`PayPal account optional`.
|
||||
We advise you to not prompt customers to log in with a Paypal account when they get to pay. Let them
|
||||
pay with debit/credit cards as well, or you might lose some deals. Make sure this setting is turned
|
||||
on.
|
||||
|
||||
Payment Messages Format
|
||||
-----------------------
|
||||
|
||||
If you use accented characters (or anything other than primary Latin characters) for customer names
|
||||
or addresses, then you **must** configure the encoding format of the payment request sent by Odoo to
|
||||
PayPal. If you do not, some transactions fail without notice.
|
||||
Suppose you use accented characters (or anything else than primary Latin characters) for your
|
||||
customer names or addresses. In that case, you **must** configure the encoding format of the payment
|
||||
request sent by Odoo to Paypal. Otherwise, some transactions fail without notice.
|
||||
|
||||
To do so, go to `your production account <https://www.paypal.com/cgi-bin/customerprofileweb
|
||||
?cmd=_profile-language-encoding>`_. Then, click :guilabel:`More Options` and set the two default
|
||||
encoding formats as :guilabel:`UTF-8`.
|
||||
?cmd=_profile-language-encoding>`_. Then, click *More Options* and set the two default encoding
|
||||
formats as **UTF-8**.
|
||||
|
||||
Your Paypal account is ready!
|
||||
|
||||
.. tip::
|
||||
- For Encrypted Website Payments & EWP_SETTINGS error, please check the `Paypal documentation
|
||||
@@ -86,52 +113,6 @@ encoding formats as :guilabel:`UTF-8`.
|
||||
`link <https://sandbox.paypal.com/cgi-bin/customerprofileweb?cmd=_profile-language-encoding>`_
|
||||
to configure the encoding format in a test environment.
|
||||
|
||||
Settings in Odoo
|
||||
================
|
||||
|
||||
.. seealso::
|
||||
:ref:`payment_acquirers/add_new`
|
||||
|
||||
Credentials
|
||||
-----------
|
||||
|
||||
Odoo needs your **API Credentials** to connect with your PayPal account. To do so, go to
|
||||
:menuselection:`Accounting --> Configuration --> Payment Acquirers` and :guilabel:`Activate` PayPal.
|
||||
Then, enter your PayPal account credentials in the :guilabel:`Credentials` tab:
|
||||
|
||||
- :guilabel:`Email`: the login email address in Paypal;
|
||||
- :guilabel:`PDT Identity Token`: the key used to verify the authenticity of transactions;
|
||||
- :guilabel:`Use IPN`: enable for PayPal to work properly in Odoo.
|
||||
|
||||
.. tip::
|
||||
Save the :guilabel:`PDT Identity Token` for later use.
|
||||
|
||||
To set the :guilabel:`PDT Identity Token`, switch to :ref:`developer mode <developer-mode>` and
|
||||
retrieve the token by following the configuration steps at :ref:`paypal/pdt`.
|
||||
|
||||
.. note::
|
||||
The PayPal **Merchant ID** is not required in Odoo.
|
||||
.. important::
|
||||
If you are trying PayPal as a test, using a :ref:`PayPal Sandbox account <paypal/testing>`,
|
||||
change the :guilabel:`State` to :guilabel:`Test Mode`. We recommend doing this on a test Odoo
|
||||
database rather than on your main database.
|
||||
|
||||
Extra fees
|
||||
----------
|
||||
|
||||
You can charge **extra fees** to customers choosing to pay with PayPal in order to cover the
|
||||
transaction fees PayPal charges you. Once redirected to Paypal, your customer sees an extra amount
|
||||
applied to the order amount.
|
||||
|
||||
To activate this option, go to :menuselection:`Accounting --> Configuration --> Payment Acquirers`
|
||||
and select :guilabel:`PayPal`. Then, go to the :guilabel:`Fees` tab and tick the :guilabel:`Add
|
||||
Extra Fees` box.
|
||||
|
||||
.. note::
|
||||
- You can refer to `Paypal Fees <https://www.paypal.com/webapps/mpp/paypal-fees>`_ to set up
|
||||
fees.
|
||||
- `Traders in the EU <https://europa.eu/youreurope/citizens/consumers/shopping/pricing-payments/index_en.htm>`_ are not allowed to charge extra fees for paying with credit cards.
|
||||
|
||||
.. _paypal/testing:
|
||||
|
||||
Test environment
|
||||
@@ -140,21 +121,19 @@ Test environment
|
||||
Configuration
|
||||
-------------
|
||||
|
||||
Thanks to PayPal sandbox accounts, you can test the entire payment flow in Odoo.
|
||||
Thanks to Paypal Sandbox accounts, you can test the entire payment flow in Odoo.
|
||||
|
||||
Log into the `Paypal Developer Site <https://developer.paypal.com/>`_ using your PayPal credentials,
|
||||
which creates two sandbox accounts:
|
||||
Log into the `Paypal Developer Site <https://developer.paypal.com/>`_ using your Paypal
|
||||
credentials, which creates two sandbox accounts:
|
||||
|
||||
- A business account (to use as merchants, e.g.,
|
||||
`pp.merch01-facilitator@example.com <mailto:pp.merch01-facilitator@example.com>`_);
|
||||
`pp.merch01-facilitator@example.com <mailto:pp.merch01-facilitator@example.com>`_).
|
||||
- A default personal account (to use as shoppers, e.g.,
|
||||
`pp.merch01-buyer@example.com <mailto:pp.merch01-buyer@example.com>`_).
|
||||
|
||||
Log into PayPal sandbox using the merchant account and follow the same configuration instructions.
|
||||
Enter your sandbox credentials in Odoo (:menuselection:`Accounting --> Configuration --> Payment
|
||||
Acquirer --> PayPal` in the :guilabel:`Credentials` tab, and make sure the status is set on
|
||||
:guilabel:`Test Mode`. We recommend doing this on a test Odoo database rather than your main
|
||||
database.
|
||||
Log into Paypal Sandbox using the merchant account and follow the same configuration instructions.
|
||||
Enter your sandbox credentials in Odoo and ensure Paypal is set on *Test Mode*. We recommend doing
|
||||
this on a test Odoo database rather than your main database.
|
||||
|
||||
Run a test transaction from Odoo using the sandbox personal account.
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 14 KiB |
@@ -7,4 +7,3 @@ Human resources
|
||||
.. toctree::
|
||||
|
||||
hr/attendances
|
||||
hr/employees
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
:nosearch:
|
||||
:show-content:
|
||||
:show-toc:
|
||||
|
||||
=========
|
||||
Employees
|
||||
=========
|
||||
|
||||
Odoo *Employees* organizes a company's employee records, contracts, and departments.
|
||||
|
||||
.. toctree::
|
||||
:titlesonly:
|
||||
|
||||
employees/new_employee
|
||||
@@ -1,266 +0,0 @@
|
||||
==================
|
||||
Add a new employee
|
||||
==================
|
||||
|
||||
When a new employee is hired, the first step is to create a new employee form. Starting in the
|
||||
:menuselection:`Employees` app default view, click the :guilabel:`Create` button to access a new
|
||||
employee form. Fill out the required information (underlined in bold) and any additional details,
|
||||
then click :guilabel:`Save`.
|
||||
|
||||
.. image:: new_employee/employee-new.png
|
||||
:align: center
|
||||
:alt: Create a new employee card.
|
||||
|
||||
.. note::
|
||||
The current company phone number and name is populated in the :guilabel:`Work Phone` and
|
||||
:guilabel:`Company` fields.
|
||||
|
||||
General information
|
||||
===================
|
||||
|
||||
Required fields
|
||||
---------------
|
||||
|
||||
- :guilabel:`Name`: Enter the employee's name.
|
||||
- :guilabel:`Company`: Select the company from the drop-down menu that the new employee is hired by,
|
||||
or create a new company by typing the name in the field.
|
||||
- :guilabel:`Working Hours`: In the :guilabel:`Work Information` tab, select the desired
|
||||
:guilabel:`Working Hours` from the drop-down menu.
|
||||
|
||||
.. image:: new_employee/working-hours.png
|
||||
:align: center
|
||||
:alt: Working Hours are located in the Work Information tab.
|
||||
|
||||
.. note::
|
||||
:guilabel:`Working Hours` are related to a company's working times, and an employee cannot have
|
||||
working hours that are outside of a company's working times.
|
||||
|
||||
Each individual working time is company-specific, so for multi-company databases, each company
|
||||
needs to have its own working hours set.
|
||||
|
||||
If an employee's working hours are not configured as a working time for the company, new working
|
||||
times can be added, or existing working times can be modified. To add or modify a working time,
|
||||
go to the :menuselection:`Payroll app --> Configuration --> Working Times`, and add a new working
|
||||
time or edit an existing one.
|
||||
|
||||
After the new working time is created, set the working hours for the employee.
|
||||
|
||||
Optional fields
|
||||
---------------
|
||||
|
||||
- :guilabel:`Photo`: In the top right image box of the employee card, click on the :guilabel:`✏️
|
||||
(pencil)` edit icon to select a photo to upload.
|
||||
- :guilabel:`Job Position`: Enter the employee's job position title.
|
||||
- Tags: Click on a tag in the drop-down menu to add any tags applicable to the employee. Any tag can
|
||||
be created in this field by typing it in. Once created, the new tag is available for all employee
|
||||
cards. There is no limit to the amount of tags that can be added.
|
||||
- Work Contact Information: Enter the employees :guilabel:`Work Mobile`, :guilabel:`Work Phone`,
|
||||
:guilabel:`Work Email`, and/or :guilabel:`Company` name.
|
||||
- :guilabel:`Department`: Select the employee's department from the drop-down menu.
|
||||
- :guilabel:`Manager`: Select the employee's manager from the drop-down menu.
|
||||
- :guilabel:`Coach`: Select the employee's coach from the drop-down menu.
|
||||
|
||||
.. note::
|
||||
After a :guilabel:`Manager` is selected, if the :guilabel:`Coach` field is blank, the selected
|
||||
manager automatically populates the :guilabel:`Coach` field.
|
||||
|
||||
.. tip::
|
||||
To make edits to the selected :guilabel:`Department`, :guilabel:`Manager`, :guilabel:`Coach`, or
|
||||
:guilabel:`Company`, click the :guilabel:`External Link` button next to the respective selection.
|
||||
The :guilabel:`External Link` button opens the selected form, allowing for modifications. Click
|
||||
:guilabel:`Save` after any edits are made.
|
||||
|
||||
Additional information tabs
|
||||
===========================
|
||||
|
||||
Resumé tab
|
||||
----------
|
||||
|
||||
Resumé
|
||||
~~~~~~
|
||||
|
||||
Next, the employee's work history is entered in the :guilabel:`Resumé` tab. Each previous experience
|
||||
must be entered individually. Click :guilabel:`Create a New Entry`, and the :guilabel:`Create Resumé
|
||||
lines` form appears. Enter the following information, then click the :guilabel:`Save & Close` button
|
||||
if there is only one entry to add, or click the :guilabel:`Save & New` button to save the current
|
||||
entry and create another line.
|
||||
|
||||
.. image:: new_employee/resume-lines.png
|
||||
:align: center
|
||||
:alt: Add information for the previous work experience in this form.
|
||||
|
||||
- :guilabel:`Name`: Type in the name of the previous work experience.
|
||||
- :guilabel:`Type`: From the drop-down menu, select either :guilabel:`Experience`,
|
||||
:guilabel:`Education`, :guilabel:`Internal Certification`, :guilabel:`Internal Training`, or type
|
||||
in a new entry.
|
||||
- :guilabel:`Display Type`: Select either :guilabel:`Classic`, :guilabel:`Certification`, or
|
||||
:guilabel:`Course` from the drop-down menu.
|
||||
- :guilabel:`Date Start` and :guilabel:`Date End`: Enter the start and end dates for the work
|
||||
experience. To select a date, use the :guilabel:`< (left)` and :guilabel:`> (right)` arrow icons
|
||||
to scroll to the desired month, then click on the day to select it.
|
||||
- :guilabel:`Description`: Enter any relevant details in the field.
|
||||
|
||||
Skills
|
||||
~~~~~~
|
||||
|
||||
An employee's skills can be entered in the :guilabel:`Resumé` tab in the same manner a resumé line
|
||||
is created. Click the :guilabel:`Create a New Entry` button under :guilabel:`Skills` and a
|
||||
:guilabel:`Create Skills` form appears. Fill in the information, then click the :guilabel:`Save &
|
||||
Close` button if there is only one entry to add, or click the :guilabel:`Save & New` button to save
|
||||
the current entry and immediately create a new entry.
|
||||
|
||||
.. image:: new_employee/create-skill.png
|
||||
:align: center
|
||||
:alt: Create a new skill for the employee.
|
||||
|
||||
- :guilabel:`Skill Type`: Select from the drop-down menu either :guilabel:`Languages`,
|
||||
:guilabel:`Dev`, :guilabel:`Music`, :guilabel:`Marketing`, or type in a new skill type. After
|
||||
entering the new skill type, an option to :guilabel:`Create` the skill or :guilabel:`Create and
|
||||
Edit` the skill appears. Click :guilabel:`Create and Edit`, and a pop-up for the specific skill
|
||||
type appears. This can also be accessed with the :guilabel:`External Link` button next to the new
|
||||
skill. This form allows for the creation of specific skills and levels. Click :guilabel:`Add a
|
||||
line` and enter the information for the new skill, then repeat for all other added skills. Repeat
|
||||
this process for the :guilabel:`Levels` section. Click :guilabel:`Add a line` to add each level
|
||||
and progress.
|
||||
|
||||
.. image:: new_employee/new-skills.png
|
||||
:align: center
|
||||
:alt: Add a new skill and levels.
|
||||
|
||||
.. example::
|
||||
To add a math skill set, enter `Math` in the :guilabel:`Name` field. In the :guilabel:`Skills`
|
||||
field, enter `Algebra`, `Calculus`, and `Trigonometry`. And, in the :guilabel:`Levels` field
|
||||
enter `beginner`, `intermediate`, and `expert`. Then, either click :guilabel:`Save & Close` or
|
||||
:guilabel:`Save & New`.
|
||||
|
||||
- :guilabel:`Skill`: The corresponding skills associated with the selected :guilabel:`Skill Type`
|
||||
appear in a drop-down menu. For example, selecting :guilabel:`Language` as the :guilabel:`Skill
|
||||
Type` presents a variety of languages to select from under the :guilabel:`Skills` field. Select
|
||||
the appropriate pre-configured skill, or type in a new one.
|
||||
- :guilabel:`Skill Level`: Pre-defined skill levels associated with the selected :guilabel:`Skill
|
||||
Type` appear in a drop-down menu. Select a level or create a new skill level by typing it in.
|
||||
- :guilabel:`Progress`: Progress is automatically selected based on the selected :guilabel:`Skill
|
||||
Level`. Skill levels and progress can be modified in the :guilabel:`Skill Type` pop-up form, which
|
||||
is accessed via the :guilabel:`External Link` button next to :guilabel:`Skill Type` field.
|
||||
|
||||
To delete any line from the :guilabel:`Resumé` tab, click the :guilabel:`🗑️ (trash can)` delete icon
|
||||
to delete the entry. Add a new line by clicking the :guilabel:`ADD` button next to the corresponding
|
||||
section.
|
||||
|
||||
Work information tab
|
||||
--------------------
|
||||
|
||||
- :guilabel:`Location`: Select the :guilabel:`Work Address` from the drop-down menu. The
|
||||
:guilabel:`External Link` button opens up the selected company form in a window, and allows for
|
||||
editing. The :guilabel:`Work Location` is where any specific location details should be noted,
|
||||
such as a floor, or building.
|
||||
- :guilabel:`Approvers`: Using the drop-down menus, select the employees responsible for approving
|
||||
:guilabel:`Time Off`, :guilabel:`Expenses`, and :guilabel:`Timesheets` for the employee. The
|
||||
:guilabel:`External Link` button opens a form with the approver's :guilabel:`Name`,
|
||||
:guilabel:`Email Address`, :guilabel:`Company`, :guilabel:`Phone`, and :guilabel:`Mobile` fields.
|
||||
These can be modified, if needed. Click :guilabel:`Save` after making any edits.
|
||||
- :guilabel:`Schedule`: Select the :guilabel:`Working Hours` (required) and :guilabel:`Timezone` for
|
||||
the employee. The :guilabel:`External Link` button opens up a detailed view of the specific daily
|
||||
working hours. Working hours can be created, modified, or deleted here. Global time off (such as
|
||||
holidays) can be entered in the :guilabel:`Global Time Off` tab. Click :guilabel:`Add a line` to
|
||||
add a new global time off.
|
||||
- :guilabel:`Planning`: Click on a planning role from the drop-down menu for both the
|
||||
:guilabel:`Default Planning Role` and the :guilabel:`Planning Roles` fields to add a role. There
|
||||
is no limit to the amount of :guilabel:`Planning Roles` that can be selected for an employee, but
|
||||
there can only be one :guilabel:`Default Planning Role`. The default is the *typical* role that
|
||||
the employee performs, where the :guilabel:`Planning Roles` are *all* the specific roles the
|
||||
employee is able to perform.
|
||||
|
||||
.. image:: new_employee/work-info.png
|
||||
:align: center
|
||||
:alt: Add the work information to the Work Information tab.
|
||||
|
||||
Private information tab
|
||||
-----------------------
|
||||
|
||||
No information in the :guilabel:`Private Information` tab is required, however, some information in
|
||||
this section may be critical for the company's payroll department. In order to properly process
|
||||
payslips and ensure all deductions are accounted for, the employee's personal information should be
|
||||
entered.
|
||||
|
||||
Here, the employee's :guilabel:`Private Contact`, :guilabel:`Marital Status`, :guilabel:`Emergency
|
||||
Contact`, :guilabel:`Education`, :guilabel:`Citizenship`, :guilabel:`Dependant`, and :guilabel:`Work
|
||||
Permit` information is entered. Fields are entered either using a drop-down menu, clicking a check
|
||||
box, or typing in the information.
|
||||
|
||||
- :guilabel:`Private Contact`: Enter the :guilabel:`Address` for the employee. The selection can be
|
||||
made with the drop-down menu. If the information is not available, type in the name for the new
|
||||
address. To edit the new address, click the :guilabel:`External Link` button to open the address
|
||||
form. On the address form, enter the necessary details, then click :guilabel:`Save`. Some other
|
||||
information in the :guilabel:`Private Contact` section may auto-populate, if the address is
|
||||
already listed in the drop-down menu.
|
||||
- :guilabel:`Marital Status`: Select either :guilabel:`Single`, :guilabel:`Married`,
|
||||
:guilabel:`Legal Cohabitant`, :guilabel:`Widower`, or :guilabel:`Divorced` from the drop-down
|
||||
menu.
|
||||
- :guilabel:`Emergency Contact`: Type in the name and phone number of the employee's emergency
|
||||
contact.
|
||||
- :guilabel:`Education`: Select the highest level of education completed by the employee from the
|
||||
:guilabel:`Certificate Level` drop-down menu. Options include :guilabel:`Graduate`,
|
||||
:guilabel:`Bachelor`, :guilabel:`Master`, :guilabel:`Doctor`, or :guilabel:`Other`. Type in the
|
||||
:guilabel:`Field of Study`, and the name of the :guilabel:`School` in the respective fields.
|
||||
- :guilabel:`Citizenship`: This section houses all the information relevant to the citizenship of
|
||||
the employee. Some selections use a drop-down menu, as does the :guilabel:`Nationality (Country)`,
|
||||
:guilabel:`Gender`, and :guilabel:`Country of Birth` sections. The :guilabel:`Date of Birth` uses
|
||||
a calendar module to select the date. First, click on the name of the month, then the year, to
|
||||
access the year ranges. Use the :guilabel:`< (left)` and :guilabel:`> (right)` arrow icons,
|
||||
navigate to the correct year range, and click on the year. Next, click on the month. Last, click
|
||||
on the day to select the date. Type in the information for the :guilabel:`Identification No`,
|
||||
:guilabel:`Passport No`, and :guilabel:`Place of Birth` fields. If the employee is
|
||||
:guilabel:`Disabled` or a :guilabel:`Nonresident`, click the check box next to the respective
|
||||
fields.
|
||||
- :guilabel:`Dependant`: If the employee has any dependants, that information is entered here. Type
|
||||
in the number of children the employee has, and check the boxes next to :guilabel:`Disabled
|
||||
Children` and/or :guilabel:`Other Dependent People` if applicable.
|
||||
- :guilabel:`Work Permit`: If the employee has a work permit, enter the information in this section.
|
||||
Type in the :guilabel:`Visa No` and/or :guilabel:`Work Permit No` in the corresponding fields.
|
||||
Using the calendar module, select the :guilabel:`Visa Expire Date` to enter the expiration date.
|
||||
|
||||
.. image:: new_employee/private-info.png
|
||||
:align: center
|
||||
:alt: Add the private information to the Private Information tab.
|
||||
|
||||
HR settings tab
|
||||
---------------
|
||||
|
||||
This tab provides various fields for different information, depending on the country the company is
|
||||
located. Different fields are configured for different locations, however some sections appear
|
||||
regardless.
|
||||
|
||||
- :guilabel:`Status`: If applicable, select a :guilabel:`Related User`, :guilabel:`Job Position`,
|
||||
and :guilabel:`Language` with the drop-down menus. Type in the :guilabel:`Registration Number of
|
||||
the Employee`, and the :guilabel:`NIF Country Code` if available.
|
||||
- :guilabel:`Fleet`: If the employee has access to a company car, enter the :guilabel:`Mobility
|
||||
Card` information here.
|
||||
- :guilabel:`Timesheets`: Enter the employee's cost per hour in a $XX.XX format. This is factored in
|
||||
when the employee is working at a work center. This value affects the employee's pay, and may also
|
||||
affect manufacturing costs for a product, if the value of the manufactured product is not a fixed
|
||||
amount.
|
||||
- :guilabel:`Attendance`: This section may only appear for Belgian companies. Enter the
|
||||
:guilabel:`INSZ or BIS` number if applicable. :guilabel:`Badge ID` and a :guilabel:`PIN Code` can
|
||||
be entered here, if the employee needs/has one. Click :guilabel:`Generate` next to the
|
||||
:guilabel:`Badge ID` to create a badge ID.
|
||||
|
||||
.. image:: new_employee/hr-settings.png
|
||||
:align: center
|
||||
:alt: Enter any information prompted in the HR Settings tab for the employee.
|
||||
|
||||
Personal documents tab
|
||||
----------------------
|
||||
|
||||
The :guilabel:`Personal Documents` tab is only displayed for certain countries. If this tab is not
|
||||
visible, it is not applicable to the company's location.
|
||||
|
||||
Add a file for the employee's :guilabel:`ID Card Copy`, :guilabel:`Driving License`,
|
||||
:guilabel:`Mobile Subscription Invoice`, :guilabel:`SIM Card Copy`, and :guilabel:`Internet
|
||||
Subscription Invoice` by clicking the :guilabel:`Upload Your File` button next to the corresponding
|
||||
field. File types that can be accepted are :file:`.jpg`, :file:`.png`, and :file:`.pdf`.
|
||||
|
||||
.. image:: new_employee/personal.png
|
||||
:align: center
|
||||
:alt: Upload personal documents for the employee in the Personal Documents tab, either a jpg,
|
||||
png, or pdf.
|
||||
|
Before Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 6.0 KiB |
|
Before Width: | Height: | Size: 9.2 KiB |
|
Before Width: | Height: | Size: 7.1 KiB |
|
Before Width: | Height: | Size: 6.7 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 6.4 KiB |
|
Before Width: | Height: | Size: 9.2 KiB |
|
Before Width: | Height: | Size: 15 KiB |
@@ -1,267 +1,65 @@
|
||||
================
|
||||
Expiration dates
|
||||
Expiration Dates
|
||||
================
|
||||
|
||||
In Odoo, *expiration dates* can be used to manage and track the lifecycles of perishable products,
|
||||
from purchase to sale. Using expiration dates reduces product loss due to unexpected expiry, and
|
||||
helps to avoid sending expired products to customers.
|
||||
In many companies, products have expiration dates and they should be managed based on those dates.
|
||||
In the food industry, for example, tracking and managing product stock based on expiration dates is
|
||||
mandatory to avoid selling expired products to customers.
|
||||
|
||||
In Odoo, only products that are tracked using *lots* and *serial numbers* can be assigned expiration
|
||||
information. Once a lot or serial number has been assigned, an expiration date can be set. This is
|
||||
especially helpful for companies (such as food manufacturers) that consistently, or exclusively, buy
|
||||
and sell perishable products.
|
||||
With Odoo, you can track and manage your products based on their expiration dates, even if they are
|
||||
already tracked by lots or serial numbers.
|
||||
|
||||
.. seealso::
|
||||
- :doc:`/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/lots`
|
||||
- :doc:`/applications/inventory_and_mrp/inventory/management/lots_serial_numbers/serial_numbers`
|
||||
Configuration
|
||||
=============
|
||||
|
||||
Enable expiration dates
|
||||
=======================
|
||||
Application configuration
|
||||
-------------------------
|
||||
|
||||
To enable the use of *expiration dates*, go to :menuselection:`Inventory app --> Configuration -->
|
||||
Settings`, and scroll down to the :guilabel:`Traceability` section. Then, click the checkbox to
|
||||
enable the :guilabel:`Lots & Serial Numbers` feature.
|
||||
To use expiration date tracking, open the *Inventory* application and go to
|
||||
:menuselection:`Configuration --> Settings` and activate the *Lots & Serial Numbers* and *Expiration
|
||||
Dates* features.
|
||||
|
||||
Once that feature is activated, a new option will appear to enable :guilabel:`Expiration Dates`.
|
||||
Click that checkbox to enable the feature, and be sure to :guilabel:`Save` changes.
|
||||
|
||||
.. image:: expiration_dates/expiration-dates-enabled-settings.png
|
||||
.. image:: expiration_dates/expiration_dates_01.png
|
||||
:align: center
|
||||
:alt: Enabled lots and serial numbers and expiration dates settings.
|
||||
|
||||
.. tip::
|
||||
Once the :guilabel:`Lots & Serial Numbers` feature is activated, additional features appear to
|
||||
:guilabel:`Display Lots & Serial Numbers on Delivery Slips`; to :guilabel:`Display Lots & Serial
|
||||
Numbers on Invoices`; and to :guilabel:`Display Expiration Dates on Delivery Slips`. Activating
|
||||
these features helps with end-to-end traceability, making it easier to manage product recalls,
|
||||
identify "bad" batches of products, and more.
|
||||
Product configuration
|
||||
---------------------
|
||||
|
||||
Configure expiration dates on products
|
||||
Now, you can define different dates in the *inventory tab* of the product form:
|
||||
|
||||
- Product Use Time: the number of days before the goods start deteriorating, without being
|
||||
dangerous. This is used to calculate the Best before date on each lot/serial number received.
|
||||
- Product Life Time: the number of days before the goods may become dangerous and must not be
|
||||
consumed. This is used to calculate the Expiration date on each lot/serial number received.
|
||||
- Product Removal Time: shows the number of days before the goods should be removed from the stock.
|
||||
This is used to calculate the Removal date on each lot/serial number received.
|
||||
- Product Alert Time: refers to the number of days before an alert should be raised on the
|
||||
lot/serial number. This is used to calculate the Alert date on each lot/serial number received.
|
||||
Once the Alert date is reached, an Activity is assigned on the relevant lot/serial number to the
|
||||
Responsible user defined on the Product.
|
||||
|
||||
.. image:: expiration_dates/expiration_dates_02.png
|
||||
:align: center
|
||||
|
||||
Expiration Date on Lots/Serial Numbers
|
||||
======================================
|
||||
|
||||
Once the :guilabel:`Lots & Serial Numbers` and :guilabel:`Expiration Dates` features have been
|
||||
enabled in the settings of the *Inventory* app, expiration information can be configured on
|
||||
individual products.
|
||||
When receiving a product into inventory, the dates will automatically be updated on the
|
||||
corresponding lot/serial number. These updates will be based on the receipt date of the product and
|
||||
the days set on the product form.
|
||||
|
||||
To do so, go to :menuselection:`Inventory app --> Products --> Products`, and select a product to
|
||||
edit. Selecting a product reveals the product form for that particular item. Once on the product
|
||||
form, click :guilabel:`Edit` in the upper-left corner to make changes.
|
||||
|
||||
.. important::
|
||||
To be tracked using lots or serial numbers, or to configure expiration information, products
|
||||
*must* have their :guilabel:`Product Type` set as :guilabel:`Storable Product` under the
|
||||
:guilabel:`General Information` tab.
|
||||
|
||||
Then, click the :guilabel:`Inventory` tab, and scroll down to the :guilabel:`Traceability` section.
|
||||
From here, make sure that either :guilabel:`By Unique Serial Number` or :guilabel:`By Lots` is
|
||||
checked.
|
||||
|
||||
Once it is, a new :guilabel:`Expiration Date` checkbox appears that must also be clicked. When both
|
||||
are enabled, a new :guilabel:`Dates` field appears to the right.
|
||||
|
||||
.. note::
|
||||
If a product has stock on-hand prior to activating tracking by lots or serial numbers, an
|
||||
inventory adjustment might need to be performed in order to assign lot numbers to the existing
|
||||
stock.
|
||||
|
||||
.. tip::
|
||||
For processing large quantities of products on receipts or deliveries, it is recommended to track
|
||||
using lots, so multiple products can be traced back to the same lot, if any issues arise.
|
||||
|
||||
.. image:: expiration_dates/expiration-dates-product-configuration.png
|
||||
.. image:: expiration_dates/expiration_dates_03.png
|
||||
:align: center
|
||||
:alt: Expiration dates configuration on the product form.
|
||||
|
||||
Under the :guilabel:`Dates` field, there are four categories of expiration information to configure
|
||||
for the product:
|
||||
|
||||
- :guilabel:`Expiration Time`: the number of days after receiving products (either from a vendor or
|
||||
in stock after production) in which goods may become dangerous and should not be used or consumed.
|
||||
- :guilabel:`Best Before Time`: the number of days before the expiration date in which the goods
|
||||
start deteriorating, **without** necessarily being dangerous yet.
|
||||
- :guilabel:`Removal Time`: the number of days before the expiration date in which the goods should
|
||||
be removed from stock.
|
||||
- :guilabel:`Alert Time`: the number of days before the expiration date in which an alert should be
|
||||
raised on goods in a particular lot or containing a particular serial number.
|
||||
|
||||
.. note::
|
||||
The values entered into these fields automatically compute the expiration date for goods entered
|
||||
into stock, whether purchased from a vendor or manufactured in-house.
|
||||
|
||||
Once all the expiration information has been configured, click :guilabel:`Save` to save all changes.
|
||||
|
||||
.. tip::
|
||||
If the :guilabel:`Dates` field is not populated with any values for expiration information, dates
|
||||
(and lots) can be manually assigned upon receipts and deliveries in and out of the warehouse.
|
||||
Even when assigned, they can still be overwritten and changed manually if needed, as well.
|
||||
|
||||
Set expiration dates on receipts with lots & serial numbers
|
||||
===========================================================
|
||||
|
||||
Generating expiration dates for **incoming** goods can be done directly from the purchase order. To
|
||||
create a purchase order, go to the :menuselection:`Purchase` app and click :guilabel:`Create` to
|
||||
create a new request for quotation (RFQ).
|
||||
|
||||
Then, fill out the information by adding a :guilabel:`Vendor`, and add products to the
|
||||
:guilabel:`Product` lines by clicking :guilabel:`Add a product`.
|
||||
|
||||
Choose the desired quantity to order by changing the number in the :guilabel:`Quantity` column, and
|
||||
click :guilabel:`Confirm Order`. This converts the :abbr:`RFQ (request for quotation)` into a
|
||||
purchase order.
|
||||
|
||||
Click the :guilabel:`Receipt` smart button at the top of the purchase order to be taken to the
|
||||
warehouse receipt form.
|
||||
|
||||
.. note::
|
||||
Clicking :guilabel:`Validate` before assigning a serial number to the ordered product quantities
|
||||
causes a :guilabel:`User Error` popup to appear. The popup requires entry of a lot or serial
|
||||
number for the ordered products. The :abbr:`RFQ (request for quotation)` cannot be validated
|
||||
without an assigned lot or serial number.
|
||||
|
||||
.. image:: expiration_dates/expiration-dates-user-error-popup.png
|
||||
:align: center
|
||||
:alt: User error popup when validating an order with no lot number.
|
||||
|
||||
From here, click the :guilabel:`Additional Options` menu (hamburger) icon located on the far-right
|
||||
of the product line. When clicked, a :guilabel:`Detailed Operations` pop-up will appear.
|
||||
|
||||
In this pop-up, click :guilabel:`Add a line`, and assign a lot or serial number under the
|
||||
:guilabel:`Lot/Serial Number Name` field.
|
||||
|
||||
An expiration date automatically populates, based on the configuration on the product form (if
|
||||
previously configured).
|
||||
|
||||
.. tip::
|
||||
If the :guilabel:`Dates` field on the product form has not been configured, this date can be
|
||||
manually entered.
|
||||
|
||||
After the expiration date has been established, mark the :guilabel:`Done` quantities, and click
|
||||
:guilabel:`Confirm` to close the pop-up. Finally, click :guilabel:`Validate`.
|
||||
|
||||
.. image:: expiration_dates/expiration-dates-detailed-operations-popup.png
|
||||
.. image:: expiration_dates/expiration_dates_04.png
|
||||
:align: center
|
||||
:alt: Detailed operations popup showing expiration dates for ordered products.
|
||||
|
||||
A :guilabel:`Traceability` smart button will appear upon validating the receipt. Click the
|
||||
:guilabel:`Traceability` smart button to see the updated :guilabel:`Traceability Report`, which
|
||||
includes: a :guilabel:`Reference` document; the :guilabel:`Product` being traced; the
|
||||
:guilabel:`Lot/Serial #`; and more.
|
||||
Expiration Alerts
|
||||
=================
|
||||
|
||||
Set expiration dates on manufactured products
|
||||
=============================================
|
||||
You can access expiration alerts from the *inventory* app. To do so, go to :menuselection:`Master
|
||||
Data --> Lots/Serial Numbers`. There, you can use the pre-existing filter to show all the
|
||||
lots/serial numbers that have exceeded their respective alert dates.
|
||||
|
||||
Expiration dates can also be generated for products manufactured in-house. To assign expiration
|
||||
dates to manufactured products, a manufacturing order (MO) needs to be completed.
|
||||
|
||||
To create a :abbr:`MO (manufacturing order)`, go to :menuselection:`Manufacturing app --> Operations
|
||||
--> Manufacturing Orders`, and click :guilabel:`Create`. Choose a product to manufacture from the
|
||||
:guilabel:`Product` field drop-down menu, then select the :guilabel:`Quantity` to produce.
|
||||
|
||||
.. image:: expiration_dates/expiration-dates-manufacturing-order.png
|
||||
.. image:: expiration_dates/expiration_dates_05.png
|
||||
:align: center
|
||||
:alt: Manufacturing order for product with expiration date.
|
||||
|
||||
.. note::
|
||||
To manufacture a product, there must be materials to consume in the lines in the
|
||||
:guilabel:`Product` column. This can be achieved either by creating a :guilabel:`Bill of
|
||||
Material` for the :guilabel:`Product`, or manually adding materials to consume by clicking
|
||||
:guilabel:`Add a line`.
|
||||
|
||||
Once ready, click :guilabel:`Confirm`.
|
||||
|
||||
Next to :guilabel:`Lot/Serial Number`, either select an existing lot number from the drop-down menu,
|
||||
or click the green :guilabel:`+` sign to automatically assign a new lot number.
|
||||
|
||||
Then, select a number of units for the :guilabel:`Quantity` field, and click :guilabel:`Mark as
|
||||
Done`.
|
||||
|
||||
Click on the :guilabel:`External Link` icon in the assigned :guilabel:`Lot/Serial Number` field. A
|
||||
pop-up appears, revealing a detail form for that specific number.
|
||||
|
||||
On that pop-up, under the :guilabel:`Dates` tab, all expiration information that was previously
|
||||
configured for the product is displayed. That same information is also available on the detail form
|
||||
for that specific product, or by going to :menuselection:`Inventory app --> Products --> Lots/Serial
|
||||
Numbers`.
|
||||
|
||||
.. image:: expiration_dates/expiration-dates-dates-tab-lot-number.png
|
||||
:align: center
|
||||
:alt: Dates tab with expiration information for specific lot number.
|
||||
|
||||
Sell products with expiration dates
|
||||
===================================
|
||||
|
||||
Selling perishable products with expiration dates is done the same as any other type of product. The
|
||||
first step in selling perishable products is to create a sales order.
|
||||
|
||||
To do that, go to :menuselection:`Sales app --> Create` to create a new quotation, and fill out the
|
||||
information on the sales order form.
|
||||
|
||||
Add a :guilabel:`Customer`, click :guilabel:`Add a product` to add the desired products to the
|
||||
:guilabel:`Product` lines, and set a :guilabel:`Quantity` for the products.
|
||||
|
||||
Then, click the :guilabel:`Other Info` tab. Under the :guilabel:`Delivery` section, change the
|
||||
:guilabel:`Delivery Date` to a date after the expected date, and click the :guilabel:`green
|
||||
checkmark` icon to confirm the date. Finally, click :guilabel:`Confirm` to confirm the sales order.
|
||||
|
||||
Next, click the :guilabel:`Delivery` smart button at the top of the sales order to see the warehouse
|
||||
receipt form.
|
||||
|
||||
On the warehouse receipt form, click :guilabel:`Validate`, and then :guilabel:`Apply` in the
|
||||
accompanying pop-up window, to automatically process all :guilabel:`Done` quantities, and deliver
|
||||
the products to the customer.
|
||||
|
||||
If the products are delivered before the :guilabel:`Alert Date` set on the product form, then no
|
||||
alerts will be created.
|
||||
|
||||
.. important::
|
||||
To sell perishable products with expiration dates, the :guilabel:`Removal Strategy` for the
|
||||
:guilabel:`Location` the products are stored in must be set to :abbr:`FEFO (First Expiry, First
|
||||
Out)`. If there is not enough stock of perishable products in one lot, Odoo will automatically
|
||||
take the remaining quantity required from a second lot with the next-soonest expiration date.
|
||||
Removal strategies can also be set on :guilabel:`Product Categories`.
|
||||
|
||||
.. seealso::
|
||||
:doc:`/applications/inventory_and_mrp/inventory/routes/strategies/removal`
|
||||
|
||||
View expiration dates for lots & serial numbers
|
||||
===============================================
|
||||
|
||||
To view (and/or group) all products with expiration dates by lot number, go to
|
||||
:menuselection:`Inventory app --> Products --> Lots/Serial Numbers`.
|
||||
|
||||
Once there, remove any default search filters from the :guilabel:`Search...` bar. Then, click
|
||||
:guilabel:`Group By`, choose :guilabel:`Add Custom Group`, and select the :guilabel:`Expiration
|
||||
Date` parameter from the drop-down menu. Finally, click :guilabel:`Apply` to apply the filter.
|
||||
|
||||
Doing so breaks down all perishable products, their expiration dates, and the assigned lot number.
|
||||
|
||||
.. image:: expiration_dates/expiration-dates-group-by-dates.png
|
||||
:align: center
|
||||
:alt: Group by expiration dates on lots and serial numbers page.
|
||||
|
||||
Expiration alerts
|
||||
-----------------
|
||||
|
||||
To see expiration alerts, go to :menuselection:`Inventory app --> Products --> Lots/Serial Numbers`.
|
||||
|
||||
Then, click into a :guilabel:`Lot/Serial Number` with perishable products. Doing so reveals the
|
||||
serial number detail form. On the serial number detail form, click the :guilabel:`Dates` tab to see
|
||||
all expiration information related to the products.
|
||||
|
||||
To edit the form, click :guilabel:`Edit` in the upper-left corner of the form, then change the
|
||||
:guilabel:`Expiration Date` to today's date (or earlier), and click :guilabel:`Save` to save
|
||||
changes.
|
||||
|
||||
After saving, the lot number form displays a red :guilabel:`Expiration Alert` at the top of the form
|
||||
to indicate that the products in this lot are either expired or expiring soon. From here, click back
|
||||
to the :guilabel:`Lots/Serial Numbers` page (via the breadcrumbs).
|
||||
|
||||
To see the new expiration alert, or any expiration alerts for products that are expired (or will
|
||||
expire soon), remove all of the search filters from the :guilabel:`Search...` bar on the
|
||||
:guilabel:`Lots/Serial Numbers` dashboard.
|
||||
|
||||
Then, click :guilabel:`Filters`, and choose :guilabel:`Expiration Alerts`.
|
||||
|
||||
.. image:: expiration_dates/expiration-dates-expiration-alert.png
|
||||
:align: center
|
||||
:alt: Expiration alert for product past the expiration date.
|
||||
|
||||
|
Before Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 8.0 KiB |
|
After Width: | Height: | Size: 9.0 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 8.2 KiB |
|
After Width: | Height: | Size: 13 KiB |
@@ -1,16 +1,11 @@
|
||||
==================================
|
||||
Selecting a replenishment strategy
|
||||
==================================
|
||||
===============================
|
||||
Select a replenishment strategy
|
||||
===============================
|
||||
|
||||
.. |MTO| replace:: :abbr:`MTO (Make to Oder)`
|
||||
.. |PO| replace:: :abbr:`PO (Purchase Order)`
|
||||
.. |MO| replace:: :abbr:`MO (Manufacturing Order)`
|
||||
.. |SO| replace:: :abbr:`SO (Sales Order)`
|
||||
|
||||
In Odoo, there are two strategies for automatically replenishing inventory: *reordering rules* and
|
||||
the *make to order (MTO)* route. Although these strategies differ slightly, they both have similar
|
||||
consequences: triggering the automatic creation of a |PO| or |MO|. The choice of which strategy to
|
||||
use depends on the business's manufacturing and delivery processes.
|
||||
In Odoo, there are two strategies for replenishing inventory: **Reordering Rules** and the **Make
|
||||
to Order (MTO)** route. Although these strategies differ slightly, they both have similar
|
||||
consequences: triggering the automatic creation of a purchase or manufacturing order. The choice of
|
||||
which strategy to use depends on the business's manufacturing and delivery processes.
|
||||
|
||||
Terminology
|
||||
===========
|
||||
@@ -20,32 +15,31 @@ Replenishment report and reordering rules
|
||||
|
||||
The replenishment report is a list of all products that have a negative forecast quantity.
|
||||
|
||||
*Reordering rules* are used to ensure there's always a minimum amount of a product in-stock, in
|
||||
order to manufacture products and/or fulfill sales orders. When the stock level of a product reaches
|
||||
its minimum, Odoo automatically generates a purchase order with the quantity needed to reach the
|
||||
maximum stock level.
|
||||
Reordering rules are used to ensure that there's always a minimum amount of a product in stock in
|
||||
order to manufacture products and/or fulfill sales orders. When the stock level of a product
|
||||
reaches its minimum, Odoo automatically generates a purchase order with the quantity needed to
|
||||
reach the maximum stock level.
|
||||
|
||||
Reordering rules can be created and managed in the replenishment report, or from the product form.
|
||||
Reordering rules can be created and managed in the replenishment report or from the product form.
|
||||
|
||||
Make to order
|
||||
Make to Order
|
||||
-------------
|
||||
|
||||
*Make to order (MTO)* is a procurement route that creates a draft purchase order (or manufacturing
|
||||
order) each time a sales order is confirmed, **regardless of the current stock level**.
|
||||
Make to Order (MTO) is a procurement route that creates a draft purchase order or manufacturing
|
||||
order each time a sales order is confirmed, *regardless of the current stock level*.
|
||||
|
||||
Unlike products replenished using reordering rules, Odoo automatically links the sales order to the
|
||||
|PO| or |MO| generated by the |MTO| route.
|
||||
|
||||
Another difference between reordering rules and |MTO| is, with |MTO|, Odoo generates a draft |PO| or
|
||||
|MO| immediately after the |SO| is confirmed. With reordering rules, Odoo generates a draft |PO| or
|
||||
|MO| when the product's forecasted stock falls below the set minimum quantity.
|
||||
|
||||
In addition, Odoo automatically adds quantities to the |PO| or |MO| as the forecast changes, so long
|
||||
as the |PO| or |MO| is not confirmed.
|
||||
|
||||
The |MTO| route is the best replenishment strategy for products that are customized, and/or for
|
||||
products that have no stock kept on-hand.
|
||||
purchase order (PO) or manufacturing order (MO) generated by the MTO route. Another difference
|
||||
between reordering rules and MTO is with MTO, Odoo generates a draft :abbr:`PO (Purchase Order)` or
|
||||
:abbr:`MO (Manufacturing Order)` immediately after the sales order is confirmed. With reordering
|
||||
rules, Odoo generates a draft :abbr:`PO (Purchase Order)` or :abbr:`MO (Manufacturing Order)` when
|
||||
the product's forecasted stock falls below the set minimum quantity. In addition, Odoo will
|
||||
automatically add quantities to the :abbr:`PO (Purchase Order)`/:abbr:`MO (Manufacturing Order)` as
|
||||
the forecast changes, as long as the :abbr:`PO (Purchase Order)`/:abbr:`MO (Manufacturing Order)`
|
||||
is not confirmed.
|
||||
|
||||
The MTO route is the best replenishment strategy for products that are customized and should be
|
||||
used for this purpose only.
|
||||
|
||||
Configuration
|
||||
=============
|
||||
@@ -53,146 +47,92 @@ Configuration
|
||||
Replenishment report and reordering rules
|
||||
-----------------------------------------
|
||||
|
||||
To access the replenishment report, go to :menuselection:`Inventory app --> Operations -->
|
||||
Replenishment.`
|
||||
To access the replenishment report, go to :menuselection:`Inventory --> Operations -->
|
||||
Replenishment`. By default, the replenishment report shows every product that needs to be manually
|
||||
reordered. If there is no specific rule for a product, Odoo assumes that the :guilabel:`Minimum
|
||||
Quantity` and :guilabel:`Maximum Quantity` stock are both `0.00`.
|
||||
|
||||
By default, the replenishment report dashboard shows every product that needs to be manually
|
||||
reordered. If there is no specific rule for a product, Odoo assumes the :guilabel:`Min Quantity` and
|
||||
:guilabel:`Max Quantity` stock are both `0.00`
|
||||
.. image:: strategies/replenishment-report.png
|
||||
:align: center
|
||||
:alt: The replenishment report shows products that need to be reordered manually.
|
||||
|
||||
.. note::
|
||||
For products that don't have a set reordering rule, Odoo calculates the forecast based on
|
||||
confirmed sales orders, deliveries, and receipts. For products that have a set reordering rule,
|
||||
Odoo calculates the forecast normally, but also takes into account the purchase/manufacturing
|
||||
lead time and security lead time.
|
||||
For products that don't have a set reordering rule, Odoo calculates the forecast as sales orders,
|
||||
deliveries, and receipts are confirmed. For products that have a set reordering rule, Odoo
|
||||
calculates the forecast normally, but also takes into account the purchase/manufacturing lead
|
||||
time and security lead time.
|
||||
|
||||
.. important::
|
||||
Before creating a new reordering rule, make sure the product has a *vendor* or a *bill of
|
||||
materials* configured on the product form. To check this, go to :menuselection:`Inventory app
|
||||
--> Products --> Products`, and select the product to open its product form. The vendor, if
|
||||
configured, is listed in the :guilabel:`Purchase` tab, and the bill on materials, if configured,
|
||||
is found in the :guilabel:`Bill of Materials` smart button at the top of the form.
|
||||
Before creating a new reordering rule, make sure the product has a vendor or a bill of materials
|
||||
configured on the product form. Also, make sure the :guilabel:`Product Type` is set to `Storable
|
||||
Product` on the product form. By definition, a consumable product does not have its inventory
|
||||
levels tracked, so Odoo can not account for a consumable product in the stock valuation.
|
||||
|
||||
The :guilabel:`Product Type`, located in the :guilabel:`General Information` tab on the product
|
||||
form, **must** be set to :guilabel:`Storable Product`. By definition, a consumable product does
|
||||
not have its inventory levels tracked, so Odoo cannot account for a consumable product in the
|
||||
replenishment report.
|
||||
To create a new reordering rule from the replenishment report, go to :menuselection:`Inventory -->
|
||||
Operations --> Replenishment`, click :guilabel:`Create`, and set the :guilabel:`Product`. If
|
||||
desired, set a :guilabel:`Min Quantity` and a :guilabel:`Max Quantity`. Finally, click
|
||||
:guilabel:`Save`.
|
||||
|
||||
.. image:: strategies/replenishment-report-dashboard.png
|
||||
:align: center
|
||||
:alt: Replenishment report listing all items needing to be purchased to meet current needs.
|
||||
To create a new reordering rule from the product form, go to :menuselection:`Inventory --> Products
|
||||
--> Products`, select a product to open its product form, click the :guilabel:`Reordering Rules`
|
||||
smart button, and click :guilabel:`Create`. Then, fill out the fields and save the new reordering
|
||||
rule.
|
||||
|
||||
To create a new reordering rule from the replenishment report, go to :menuselection:`Inventory app
|
||||
--> Operations --> Replenishment`, click :guilabel:`Create`, and select the desired product from the
|
||||
drop-down menu in the :guilabel:`Product` column. If necessary, a :guilabel:`Min Quantity` and a
|
||||
:guilabel:`Max Quantity` can be configured in the corresponding columns on the
|
||||
:guilabel:`Replenishment` report page, as well.
|
||||
By default, the quantity in the :guilabel:`To Order` field is the quantity required to reach the
|
||||
set :guilabel:`Max Quantity`. However, the :guilabel:`To Order` quantity can be adjusted by
|
||||
clicking on the field, changing the value, and clicking :guilabel:`Save`. To replenish a product
|
||||
manually, click :guilabel:`Order Once`.
|
||||
|
||||
To create a new reordering rule from the product form, go to :menuselection:`Inventory app -->
|
||||
Products --> Products`, and select a product to open its product form. Click the
|
||||
:guilabel:`Reordering Rules` smart button, click :guilabel:`Create`, and fill out the fields.
|
||||
To automate replenishment, click :guilabel:`Automate Orders`. When this button is clicked, Odoo
|
||||
will automatically generate a draft :abbr:`PO (Purchase Order)`/:abbr:`MO (Manufacturing Order)`
|
||||
every time the forecasted stock level falls below the set :guilabel:`Min Quantity` of the
|
||||
reordering rule.
|
||||
|
||||
Replenishment report fields
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The following fields are on the :guilabel:`Replenishment` report. If any of these fields are not
|
||||
visible, click the :guilabel:`⋮ (additional options)` icon on the far right side of the report, then
|
||||
click the checkbox next to a field to make it visible.
|
||||
|
||||
- :guilabel:`Product`: the product that requires a replenishment.
|
||||
- :guilabel:`Location`: the specific location where the product is stored.
|
||||
- :guilabel:`Warehouse`: the warehouse where the product is stored.
|
||||
- :guilabel:`On Hand`: the amount of product currently available.
|
||||
- :guilabel:`Forecast`: the amount of product available after all current orders (sales,
|
||||
manufacturing, purchase, etc.) are taken into account.
|
||||
- :guilabel:`Preferred Route`: how the product is procured, either :guilabel:`Buy`,
|
||||
:guilabel:`Manufactured`, :guilabel:`Dropship`, etc.
|
||||
- :guilabel:`Vendor`: the company from which the product is acquired.
|
||||
- :guilabel:`Bill of Materials`: the bill of materials for the product (if one is configured).
|
||||
- :guilabel:`Trigger`: how the replenishment is created, either :guilabel:`Auto` (automatically,
|
||||
once the :guilabel:`On Hand` quantity goes below the :guilabel:`Min Quantity`) or
|
||||
:guilabel:`Manual` (only when the replenishment is requested).
|
||||
- :guilabel:`Procurement Group`: the reference number for how the product is being acquired, such as
|
||||
a sales order, purchase order, or manufacturing order.
|
||||
- :guilabel:`Min Quantity`: the minimum amount of product that should be available. When inventory
|
||||
levels goes below this number, the replenishment is triggered.
|
||||
- :guilabel:`Max Quantity`: the amount of product that should be available after replenishing the
|
||||
product.
|
||||
- :guilabel:`Multiple Quantity`: if the product should be ordered in specific quantities, enter the
|
||||
number that should be ordered. For example, if the :guilabel:`Multiple Quantity` is set to `5`,
|
||||
and only 3 are needed, 5 products are replenished.
|
||||
- :guilabel:`To Order`: the amount of product that is currently needed, and will be ordered, if the
|
||||
:guilabel:`Order Once` or :guilabel:`Automate Orders` button is clicked.
|
||||
- :guilabel:`UoM`: the unit of measure used to acquire the product.
|
||||
- :guilabel:`Company`: the company for which the product is acquired.
|
||||
|
||||
By default, the quantity in the :guilabel:`To Order` field is the quantity required to reach the set
|
||||
:guilabel:`Max Quantity`. However, the :guilabel:`To Order` quantity can be adjusted by clicking on
|
||||
the field and, changing the value, and clicking :guilabel:`Save`. To replenish a product manually,
|
||||
click :guilabel:`Order Once`.
|
||||
|
||||
To automate a replenishment from the :guilabel:`Replenishment` page, click :guilabel:`Automate
|
||||
Orders` on the right-side of the line, represented by a :guilabel:`🔄 (circular arrow)` icon.
|
||||
|
||||
When this button is clicked, Odoo will automatically generate a draft |PO|/|MO| every time the
|
||||
forecasted stock level falls below the set :guilabel:`Min Quantity` of the reordering rule.
|
||||
|
||||
On the :guilabel:`Replenishment` page, a reordering rule or manual replenishment can be temporarily
|
||||
deactivated for a given period, by clicking the :guilabel:`🔕 (snooze)` icon on the far-right of the
|
||||
line.
|
||||
A reordering rule can be temporarily deactivated for a given period by using the :guilabel:`Snooze`
|
||||
button.
|
||||
|
||||
.. image:: strategies/reordering-rule-snooze-settings.png
|
||||
:align: center
|
||||
:alt: Snooze options to turn off notifications for reordering for a period of time.
|
||||
:alt: Snooze feature to temporarily deactivate reordering rules.
|
||||
|
||||
A |PO| or |MO| created by a manual replenishment has a :guilabel:`Replenishment Report` as the
|
||||
source document. A |PO| or |MO| created by an automated reordering rule has the |SO| reference
|
||||
number(s) that triggered the rule as the source document.
|
||||
A :abbr:`PO (Purchase Order)` or :abbr:`MO (Manufacturing Order)` created by a manual replenishment
|
||||
will have `Replenishment Report` as the source document. A :abbr:`PO (Purchase Order)` or
|
||||
:abbr:`MO (Manufacturing Order)` created by an automated reordering rule will have the sales
|
||||
order(s) reference number(s) that triggered the rule as the source document.
|
||||
|
||||
.. image:: strategies/rfq-source-document.png
|
||||
:align: center
|
||||
:alt: Quote request list shows which quotes are directly from the replenishment report.
|
||||
:alt: Look at the source panel showing where RFQ/MFG orders originated from.
|
||||
|
||||
Make to order (MTO) route
|
||||
=========================
|
||||
Make to order
|
||||
-------------
|
||||
|
||||
Since the |MTO| route is recommended for customized products, the route is hidden by default.
|
||||
Since the Make to Order (MTO) route is only recommended for customized products, the route is
|
||||
hidden by default.
|
||||
|
||||
To activate the |MTO| route in Odoo:
|
||||
#. Go to :menuselection:`Inventory app --> Configuration --> Settings`.
|
||||
#. Activate the :guilabel:`Multi-Step Routes` setting, located under the :guilabel:`Warehouse`
|
||||
section, and click :guilabel:`Save`.
|
||||
#. Then, go to :menuselection:`Inventory app --> Configuration --> Routes`.
|
||||
#. Click on :menuselection:`Filters --> Archived` to show archived routes.
|
||||
#. Select the checkbox next to :guilabel:`Replenish on Order (MTO)`, and click on
|
||||
:menuselection:`Action --> Unarchive`.
|
||||
To activate the Make to Order (MTO) route in Odoo:
|
||||
|
||||
#. Go to :menuselection:`Inventory --> Configuration --> Settings --> Warehouse`.
|
||||
#. Activate :guilabel:`Multi-Step Routes` setting and click :guilabel:`Save`.
|
||||
#. Go to :menuselection:`Inventory --> Configuration --> Routes`.
|
||||
#. Click on :menuselection:`Filters --> Archived` to show archived routes.
|
||||
#. Select the checkbox next to :guilabel:`Replenish on Order (MTO)`, and click on
|
||||
:menuselection:`Action --> Unarchive`.
|
||||
|
||||
.. note::
|
||||
Activating the :guilabel:`Multi-Step Routes` setting also activates :guilabel:`Storage
|
||||
Locations`. If these features aren't applicable to the warehouse, disable these settings after
|
||||
unarchiving the |MTO| route.
|
||||
Activating the :guilabel:`Multi-Step Routes` setting also activates :guilabel:`Storage Locations`
|
||||
setting. If these features aren't applicable to the warehouse, disable these settings after
|
||||
unarchiving the MTO route.
|
||||
|
||||
To set a product's procurement route to |MTO|, go to :menuselection:`Inventory app --> Products -->
|
||||
Products`, click on the desired product to open its product form, and click :guilabel:`Edit`.
|
||||
To set a product's procurement route to MTO, go to :menuselection:`Inventory --> Products -->
|
||||
Products`, click on a product to open the product form, and click :guilabel:`Edit`. Then, click on
|
||||
the :guilabel:`Inventory` tab and in the :guilabel:`Routes` options, select :guilabel:`Replenish on
|
||||
Order (MTO)`. For products purchased directly from a vendor, make sure the :guilabel:`Buy` route is
|
||||
selected in addition to the MTO route and a vendor is configured in the :guilabel:`Purchase` tab.
|
||||
For products manufactured in-house, make sure the :guilabel:`Manufacture` route is selected in
|
||||
addition to the MTO route and a bill of materials is configured for the product. Finally, click
|
||||
:guilabel:`Save`.
|
||||
|
||||
Then, click the :guilabel:`Inventory` tab, and in the :guilabel:`Routes` section of options, select
|
||||
:guilabel:`Replenish on Order (MTO)`.
|
||||
|
||||
For products purchased directly from a vendor, make sure the :guilabel:`Buy` route is selected, in
|
||||
addition to the :guilabel:`Replenish on Order (MTO)` route. Also, make sure a vendor is configured
|
||||
in the :guilabel:`Purchase` tab of the product form.
|
||||
|
||||
For products manufactured in-house, make sure the :guilabel:`Manufacture` route is selected, in
|
||||
addition to the :guilabel:`Replenish on Order (MTO)` route. Also, make sure a bill of materials is
|
||||
configured for the product, which is accessible via the :guilabel:`Bill of Materials` smart button
|
||||
on the product form.
|
||||
|
||||
Finally, when all configurations are complete, click :guilabel:`Save`.
|
||||
|
||||
.. note::
|
||||
The |MTO| route cannot be selected alone. |MTO| **only** works if the :guilabel:`Manufacture` or
|
||||
:guilabel:`Buy` route is also selected.
|
||||
|
||||
.. image:: strategies/acoustic-block-screen-replenish.png
|
||||
.. image:: strategies/replenish-on-order-product-setting.png
|
||||
:align: center
|
||||
:alt: Replenish on Order selected on the product form.
|
||||
:alt: Enable the Replenish on Order (MTO) route on the product settings.
|
||||
|
||||
|
Before Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 38 KiB |
@@ -12,6 +12,7 @@ Manufacturing management
|
||||
management/kit_shipping
|
||||
management/sub_assemblies
|
||||
management/quality_control
|
||||
management/alternative_wc
|
||||
management/subcontracting
|
||||
management/use_mps
|
||||
management/using_work_centers
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
========================
|
||||
Alternative Work Centers
|
||||
========================
|
||||
|
||||
Manufacturing several different products simultaneously at the same work center is a common issue
|
||||
for manufacturing companies. Although in practice, employees can manufacture the goods at another
|
||||
work center instead of waiting for one to be available, it's not always simple to have visibility
|
||||
on which work center is busy and plan resources accordingly in real-time.
|
||||
|
||||
With Odoo, you can configure alternative work centers to solve this issue. This automatically
|
||||
checks which work center is busy and which equivalent ones are free, and schedules orders and
|
||||
maintenance accordingly.
|
||||
|
||||
This way, your process becomes more efficient, as work center utilisation is optimised.
|
||||
|
||||
Configure your Work Centers
|
||||
===========================
|
||||
|
||||
First, go to the :menuselection:`Manufacturing app --> Configuration --> Settings`. Then, enable
|
||||
the :guilabel:`Work Orders` feature and hit :guilabel:`Save`.
|
||||
|
||||
.. image:: alternative_wc/work-orders-setting.png
|
||||
:align: center
|
||||
:alt: Work order settings ticked in Odoo Manufacturing.
|
||||
|
||||
Now, go to :menuselection:`Configuration --> Work Centers` and create two new work centers. Add the
|
||||
second work center as an alternative to the first one and vice versa.
|
||||
|
||||
.. image:: alternative_wc/alternative-wc-config.png
|
||||
:align: center
|
||||
:alt: Create a secondary work center as an alternate to the first.
|
||||
|
||||
Next, go to :menuselection:`Products --> Bills of Materials`, choose your product, and add these
|
||||
work centers to the operations of your :abbr:`BoM (Bill of Materials)`.
|
||||
|
||||
.. image:: alternative_wc/wc-bom-operations.png
|
||||
:align: center
|
||||
:alt: Add work centers to Bill of Materials operations.
|
||||
|
||||
Create your Work Orders
|
||||
=======================
|
||||
|
||||
Now that everything is configured, you can create your *Work Orders*.
|
||||
|
||||
Go to :menuselection:`Operations --> Manufacturing Orders`, and hit :guilabel:`Create`. There, add
|
||||
your product to your manufacturing order and plan it. You can then retrieve them from the
|
||||
:guilabel:`Work Orders` list view, under :menuselection:`Operations > Work Orders`.
|
||||
|
||||
Each new *Work Order*, which will be created before the end of the first one, will be scheduled at
|
||||
the alternative work center you configured, as shown below.
|
||||
|
||||
.. image:: alternative_wc/work-orders-by-wc.png
|
||||
:align: center
|
||||
:alt: Work order creation and scheduling.
|
||||
|
||||
.. note::
|
||||
Keep in mind that, if you add time after production to your work center, you may have work
|
||||
orders scheduled for your alternative work center even if the usual one is free.
|
||||
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 59 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 61 KiB |
@@ -76,8 +76,6 @@ to a work center. The following information will be displayed for each piece of
|
||||
:guilabel:`MTBF`, :guilabel:`MTTR`, and :guilabel:`Est. Next Failure` are all calculated
|
||||
automatically based on past failure data, if any exists.
|
||||
|
||||
.. _workcenter_iot:
|
||||
|
||||
Integrate IoT devices
|
||||
---------------------
|
||||
|
||||
|
||||
@@ -2,17 +2,16 @@
|
||||
Target an audience
|
||||
==================
|
||||
|
||||
Delivering marketing campaigns to the right audience is paramount when trying to grow a business.
|
||||
The Odoo *Marketing Automation* application helps marketers to do just that by providing detailed
|
||||
filtering tools, which can be as simple (or as complex) as necessary, to reach the right customers
|
||||
at the right time.
|
||||
Delivering marketing campaigns to the *right* audience is paramount when trying to grow a business.
|
||||
The :guilabel:`Odoo Marketing Automation` application helps marketers to do just that by providing
|
||||
filtering tools, that can be as simple or as complex as necessary, to reach the right customers at
|
||||
the right time.
|
||||
|
||||
Configure target filters
|
||||
Work with target filters
|
||||
========================
|
||||
|
||||
When configuring the target filters on a marketing campaign, there are some options that have an
|
||||
:guilabel:`> (arrow)` icon beside them. The :guilabel:`> (arrow)` icon signifies that the particular
|
||||
filter has more refined parameters within it that can be customized.
|
||||
When configuring the filters on a marketing campaign, there are some options that have an arrow
|
||||
icon beside them. The arrow signifies that the filter has more refined parameters within it.
|
||||
|
||||
.. image:: target_audience/marketing-filters.png
|
||||
:align: center
|
||||
@@ -20,22 +19,22 @@ filter has more refined parameters within it that can be customized.
|
||||
|
||||
Filters can be extended by adding *branches* and *nodes*. A *node* adds another filtering parameter
|
||||
to a group of targeting conditions (e.g. a new line), and a *branch* creates a narrowly refined
|
||||
cluster of parameters, allowing filters to be grouped with :guilabel:`ANY` or :guilabel:`ALL`
|
||||
statements.
|
||||
cluster of parameters, allowing filters to be grouped with *Any* or *All* statements.
|
||||
|
||||
Every time a new branch is created, there are two options:
|
||||
|
||||
- Either the records can match :guilabel:`ALL` criteria for the upcoming rules (creating an AND
|
||||
statement where *all* criteria must match).
|
||||
- Or, the records can match :guilabel:`ANY` criteria for the upcoming rules (creating an OR
|
||||
statement where *only one* of the criteria must match).
|
||||
- Either the records can match :guilabel:`ALL` criteria for the upcoming rules (an AND statement
|
||||
where all criteria must match).
|
||||
|
||||
- Or, the records can match :guilabel:`ANY` criteria for the upcoming rules (an OR statement where
|
||||
only one of the criteria must match).
|
||||
|
||||
To change between these two options, simply click the drop-down arrow icon in the green box and
|
||||
select :guilabel:`ANY` or :guilabel:`ALL`.
|
||||
select :guilabel:`Any` or :guilabel:`All`.
|
||||
|
||||
To add a node, click on the :guilabel:`➕ (plus sign)` icon, and to add another branch click on the
|
||||
:guilabel:`⋯ (ellipses)` icon. To exclude a node or a branch, click on :guilabel:`✖ (delete)` icon
|
||||
to delete it.
|
||||
To add a node, click on the :guilabel:`+ (plus sign icon)` and to add another branch click on the
|
||||
:guilabel:`... (ellipses icon)`. To exclude a :guilabel:`node` (or a :guilabel:`branch`), click on
|
||||
:guilabel:`x (delete)`.
|
||||
|
||||
.. image:: target_audience/marketing-filter-nodes.png
|
||||
:align: center
|
||||
@@ -44,79 +43,78 @@ to delete it.
|
||||
Use cases
|
||||
=========
|
||||
|
||||
The following scenarios outline different combinations of filters a marketing campaign might
|
||||
The following scenarios below outline different combinations of filters a marketing campaign might
|
||||
commonly use.
|
||||
|
||||
Scenario #1: Narrow target down to new opportunities in the pipeline
|
||||
--------------------------------------------------------------------
|
||||
Scenario #1: Narrow the target down to new opportunities in the pipeline
|
||||
------------------------------------------------------------------------
|
||||
|
||||
While in *Edit mode* on a campaign template form (by clicking the :guilabel:`Edit` button), select
|
||||
the :guilabel:`Target` field, and click :guilabel:`Search More` from the drop-down menu. Then,
|
||||
search for :guilabel:`Lead/Opportunity`, and select it.
|
||||
While in Edit mode on a campaign template form, select the :guilabel:`Target` field, and click
|
||||
:guilabel:`Search More` from the drop-down menu. Then, search for :guilabel:`Lead/Opportunity` and
|
||||
select it.
|
||||
|
||||
Next, click :guilabel:`Add Filter` in the :guilabel:`Filter` field. Then, click on the default
|
||||
Next, click :guilabel:`Add Filter` in the :guilabel:`Filter` field. Click on the default
|
||||
:guilabel:`ID` filter option in the first portion of the filter equation. Doing so reveals a
|
||||
drop-down menu full of filter options. From this drop-down, scroll down (or search for)
|
||||
:guilabel:`Type`.
|
||||
|
||||
Keep the second portion of the filter equation on the default :guilabel:`🟰 (equal sign)` icon.
|
||||
Keep the second portion of the filter equation on the default :guilabel:`= (equal sign)`.
|
||||
|
||||
Next, change the third (and final) portion of the filter equation from :guilabel:`Lead` to
|
||||
Then, change the third (and final) portion of the filter equation from :guilabel:`Lead` to
|
||||
:guilabel:`Opportunity`. The number of :guilabel:`Records` that fit this specific filter equation
|
||||
changes as the equation is customized.
|
||||
will change as the equation is customized.
|
||||
|
||||
Add another node to this filter by clicking the :guilabel:`➕ (plus sign)` icon to the right of the
|
||||
Add another node to this filter by clicking the :guilabel:`+ (plus sign)` to the right of the
|
||||
equation.
|
||||
|
||||
With "new" opportunities being the target of this filter, the second node will focus on *only*
|
||||
With "new" opportunities being the target of this filter, the second node will focus on only
|
||||
locating opportunities that are in the :guilabel:`New` stage of the pipeline. To do that, select
|
||||
the default :guilabel:`ID` from the first portion of the second filter equation, and scroll down (or
|
||||
search for) :guilabel:`Stage` from the field drop-down menu.
|
||||
the default :guilabel:`ID` from the first portion of the second filter equation, and scroll down
|
||||
(or search for) :guilabel:`Stage` from the field drop-down menu.
|
||||
|
||||
Once again, leave the second portion of the filter equation on :guilabel:`🟰 (equal sign)` icon.
|
||||
Once again, leave the second portion of the filter equation on :guilabel:`= (equal sign)`.
|
||||
|
||||
Lastly, highlight the default value in the third (and final) portion of the second filter equation,
|
||||
and type in `New`. With that in place, Odoo only targets opportunities that are in the "New" stage
|
||||
of the pipeline.
|
||||
Lastly, highlight the default value in the third (and final) portion of the second filter equation
|
||||
and type in :guilabel:`New`. With that completed, Odoo will only target opportunities that are in
|
||||
the "New" stage of the pipeline.
|
||||
|
||||
.. image:: target_audience/filters-opportunities.png
|
||||
:align: center
|
||||
:alt: A standard scenario using filters in the Odoo Marketing Automation app.
|
||||
|
||||
Scenario #2: Narrow down target to event attendees who purchased a specific ticket
|
||||
----------------------------------------------------------------------------------
|
||||
Scenario #2: Narrow the target down to the event attendees that purchased a specific ticket
|
||||
-------------------------------------------------------------------------------------------
|
||||
|
||||
While in *Edit mode* on a campaign template form (by clicking the :guilabel:`Edit` button), select
|
||||
the :guilabel:`Target` field, and click :guilabel:`Search More` from the drop-down menu. Then,
|
||||
scroll down (or search for) :guilabel:`Event`, and select it.
|
||||
While in Edit mode on a campaign template form, select the :guilabel:`Target` field, and click
|
||||
:guilabel:`Search More` from the drop-down menu. Then, scroll down (or search for)
|
||||
:guilabel:`Event` and select it.
|
||||
|
||||
Next, click :guilabel:`Add Filter` in the :guilabel:`Filter` field. Click on the default
|
||||
:guilabel:`ID` filter option in the first portion of the filter equation. Doing so reveals a
|
||||
drop-down menu full of filter options. From this drop-down, scroll down (or search for)
|
||||
:guilabel:`Event`.
|
||||
|
||||
Click the default :guilabel:`🟰 (equal sign)` icon in the second portion of the filter equation. This
|
||||
reveals a drop-down menu. From this drop-down menu, select :guilabel:`contains`.
|
||||
Click the the default :guilabel:`= (equal sign)` in the second portion of the filter equation.
|
||||
This reveals a drop-down menu. On this menu, select :guilabel:`contains`.
|
||||
|
||||
In the third (and final) empty portion of the filter equation, type in the name of the event(s) that
|
||||
Odoo should consider for this campaign filter.
|
||||
In the third (and final) empty portion of the filter equation, type in the name of the event(s)
|
||||
that you would like Odoo to consider for this campaign filter.
|
||||
|
||||
Then, add another node to this filter by clicking the :guilabel:`➕ (plus sign)` icon to the right of
|
||||
the equation.
|
||||
Add another node to this filter by clicking the :guilabel:`+ (plus sign)` to the right of the
|
||||
equation.
|
||||
|
||||
The second node will focus on targeting this campaign to attendees who purchase a specific type of
|
||||
ticket to the aforementioned event(s) mentioned in the first filter equation.
|
||||
ticket to the aforementioned event(s) in the first filter equation. To do that, select the default
|
||||
:guilabel:`ID` from the first portion of the second filter equation, and scroll down (or search
|
||||
for) :guilabel:`Event Ticket` from the field drop-down menu. Then, in that same drop-down menu,
|
||||
select :guilabel:`Name`.
|
||||
|
||||
To do that, select the default :guilabel:`ID` from the first portion of the second filter equation,
|
||||
and scroll down (or search for) :guilabel:`Event Ticket` from the field drop-down menu. Then, in
|
||||
that same drop-down menu, select :guilabel:`Name`.
|
||||
|
||||
Once again, click the default :guilabel:`🟰 (equal sign)` icon in the second portion of the filter
|
||||
Once again, click the the default :guilabel:`= (equal sign)` in the second portion of the filter
|
||||
equation, and select :guilabel:`contains`.
|
||||
|
||||
Lastly, in the third (and final) portion of the second filter equation, which is blank, type in the
|
||||
name of the ticket type that should be used for the filter. In this case, :guilabel:`Standard` is
|
||||
the name of the event ticket type for this sample filter.
|
||||
Lastly, in the third (and final) portion of the second filter equation, which will be blank, type
|
||||
in the name of the ticket type that should be used for the filter. In this case,
|
||||
:guilabel:`Standard` is the name of the event ticket type for this sample filter.
|
||||
|
||||
.. image:: target_audience/filters-event-ticket.png
|
||||
:align: center
|
||||
|
||||
@@ -1,52 +1,41 @@
|
||||
=========================
|
||||
Testing/running campaigns
|
||||
=========================
|
||||
==============================
|
||||
Testing and running a campaign
|
||||
==============================
|
||||
|
||||
Odoo gives users the ability to test marketing campaigns (and mailings) before officially running
|
||||
them.
|
||||
|
||||
First, open the :menuselection:`Marketing Automation` application, and select the desired campaign,
|
||||
which reveals that campaign's detail form.
|
||||
|
||||
On the campaign detail form, make sure the campaign already has activities configured (or build a
|
||||
campaign by following the directions here on :doc:`this documentation
|
||||
</applications/marketing/marketing_automation/getting_started/workflow_activities>`).
|
||||
|
||||
To start a test, click the :guilabel:`Launch a Test` button at the top of the campaign form.
|
||||
First, open the :guilabel:`Marketing Automation` application and click on a campaign. Make sure
|
||||
the campaign already has activities configured on it (or build a campaign by following the
|
||||
directions here on :doc:`this documentation <workflow_activities>`). To start a test, click the
|
||||
:guilabel:`Launch a Test` button at the top of the template form.
|
||||
|
||||
.. image:: testing_running/launch-test.png
|
||||
:align: center
|
||||
:alt: Launch a test button in Odoo Marketing Automation.
|
||||
|
||||
When clicked, a :guilabel:`Launch a test` pop-up window appears. In the drop-down field, choose an
|
||||
existing record (or create a new one) to run the test on. To create a brand new record, click the
|
||||
:guilabel:`Search More...` link at the bottom of the drop-down menu, and then click the
|
||||
:guilabel:`Create` button.
|
||||
When clicked, a pop-up window appears. In the dropdown field choose a specific record to run the
|
||||
test on, or create a brand new record by clicking the :guilabel:`Search More...` link at the bottom
|
||||
of the dropdown menu, and then click the :guilabel:`Create` button.
|
||||
|
||||
Doing so reveals a blank contact form, in which the :guilabel:`Name` and :guilabel:`Email` **must**
|
||||
be entered. When all the necessary information has been entered, click :guilabel:`Save`, and Odoo
|
||||
returns to the :guilabel:`Launch a test` pop-up, with that new record in the :guilabel:`Choose an
|
||||
existing record or create a new one to test` field.
|
||||
|
||||
Once a record is selected, click :guilabel:`Continue`, and Odoo reveals the campaign test page.
|
||||
Once the record is selected, click :guilabel:`Continue`, and Odoo will redirect to the campaign
|
||||
test page.
|
||||
|
||||
.. image:: testing_running/test-screen.png
|
||||
:align: center
|
||||
:alt: Test screen in Odoo Marketing Automation.
|
||||
|
||||
On the campaign test page, the name of the :guilabel:`Record` being tested is visible, along with
|
||||
the precise time this test workflow was started in the :guilabel:`Workflow Started On` field.
|
||||
Beneath that, in the :guilabel:`Workflow` section is the first activity (or activities) in the
|
||||
workflow that's being tested.
|
||||
Here, the name of the :guilabel:`Record` being tested is visible, along with the precise time this
|
||||
test workflow was started. Beneath that is the first activity (or activities) in the workflow.
|
||||
|
||||
To start a test, click the :guilabel:`Run` button, represented by a :guilabel:`▶️ (play button)`
|
||||
icon beside the first activity in the workflow. When clicked, the page reloads, and Odoo shows the
|
||||
various results (and analytics) connected to that specific activity as they occur, in real-time.
|
||||
To start a test, click the :guilabel:`Run` icon beside the first activity in the workflow. When
|
||||
clicked, the page will reload, and Odoo will show the various results (and analytics) connected to
|
||||
that specific activity.
|
||||
|
||||
.. image:: testing_running/workflow-test-progress.png
|
||||
:align: center
|
||||
:alt: Workflow test progress in Odoo Marketing Automation.
|
||||
|
||||
Once all the workflow activities are completed, the test will end, and move to the
|
||||
Once all the workflow activities are completed, the test will end and be moved to the
|
||||
:guilabel:`Completed` stage. To stop a test before all the workflow activities are completed, click
|
||||
the :guilabel:`Stop` button in the upper-left corner of the campaign test page.
|
||||
the :guilabel:`Stop` button.
|
||||
|
||||
@@ -2,51 +2,44 @@
|
||||
Marketing activities
|
||||
====================
|
||||
|
||||
When creating a campaign in the *Marketing Automation* app, users can plan marketing activities,
|
||||
such as email or SMS campaigns.
|
||||
When creating a campaign in the :guilabel:`Marketing Automation` app, users can plan marketing
|
||||
activities such as email or SMS campaigns. To get started, navigate to the :guilabel:`Workflow`
|
||||
area, and click :guilabel:`Add New Activity`. A blank activity template will appear where
|
||||
parameters can be set for that specific activity.
|
||||
|
||||
To get started, navigate to the bottom of a marketing automation campaign detail form, and click
|
||||
:guilabel:`Add New Activity`. Doing so reveals a :guilabel:`Create Activities` pop-up window. This
|
||||
pop-up window is a blank activity template, where specific parameters can be set for that particular
|
||||
activity.
|
||||
|
||||
The following fields are available in the :guilabel:`Create Activities` pop-up window (when
|
||||
:guilabel:`Add New Activity` is clicked):
|
||||
When :guilabel:`Add New Activity` is selected, a blank activity template will appear with the
|
||||
following customizable fields:
|
||||
|
||||
.. image:: workflow_activities/activity-template.png
|
||||
:align: center
|
||||
:alt: An activity template in Odoo Marketing Automation.
|
||||
|
||||
- :guilabel:`Activity Name`: the title of the activity.
|
||||
- :guilabel:`Activity Type`: choose between `Email`, `Server Action` (internal Odoo operation), or
|
||||
`SMS`.
|
||||
- :guilabel:`Activity Type`: choose between Email, Server Action (internal Odoo operation), or SMS.
|
||||
- :guilabel:`Mail Template`: choose from pre-configured templates (or create a new one on-the-fly).
|
||||
- :guilabel:`Trigger`: choose when this activity should be triggered.
|
||||
- :guilabel:`Expiry Duration`: configure to stop the actions after a specific amount of time (after
|
||||
the scheduled date). When selected, a :guilabel:`Cancel after` field appears, in which the user
|
||||
can choose how many :guilabel:`Hours, Days, Weeks, or Months` they want the actions to cease after
|
||||
the initial date.
|
||||
- :guilabel:`Activity Filter`: domain related to this activity (and all subsequent child
|
||||
activities).
|
||||
- :guilabel:`Applied Filter`: activity will *only* be performed if it satisfies the specified domain
|
||||
(filter).
|
||||
can choose how many :guilabel:`Hours, Days, Weeks, or Months` they want the actions to cease
|
||||
after the initial date.
|
||||
- :guilabel:`Activity Filter`: domain related to this activity (and all subsequent Child
|
||||
Activities).
|
||||
- :guilabel:`Applied Filter`: activity will *only* be performed if it satisfies the specified
|
||||
domain (filter).
|
||||
|
||||
After the activity's settings are fully configured, click :guilabel:`Save & Close` to save the
|
||||
activity and return to the marketing automation campaign form, :guilabel:`Save & New` to save the
|
||||
activity and immediately create another one in a fresh :guilabel:`Create Activities` pop-up window,
|
||||
or :guilabel:`Discard` to delete the activity and return to the marketing automation campaign form.
|
||||
After the activity's settings are fully configured, click :guilabel:`Save & Close` to finish
|
||||
creating the activity.
|
||||
|
||||
Workflow activity
|
||||
=================
|
||||
|
||||
Once an activity is saved, the :guilabel:`Workflow Activity` section appears at the bottom of the
|
||||
marketing automation campaign form. Each activity is displayed as a line graph.
|
||||
Once saved, the :guilabel:`Workflow Activity` will appear in Odoo, where each activity will be
|
||||
shown as a graph by default. The configured trigger time for that activity can be found to the left
|
||||
of the :guilabel:`Workflow Activity` card.
|
||||
|
||||
The configured :guilabel:`Trigger` time for that activity can be found to the left of the
|
||||
:guilabel:`Workflow Activity` card in the :guilabel:`Workflow` section.
|
||||
|
||||
Once the activity has been triggered, a figure representing the number of :guilabel:`Success` or
|
||||
:guilabel:`Rejected` activities will be displayed to the right of the graph.
|
||||
In the :guilabel:`Workflow Activity` section, there is also the number of activities that are
|
||||
successful or rejected. The :guilabel:`Success` and :guilabel:`Rejected` numbers are color-coded
|
||||
in the graph for easy reference (in green and red, respectively).
|
||||
|
||||
.. image:: workflow_activities/workflow-activity.png
|
||||
:align: center
|
||||
@@ -54,23 +47,20 @@ Once the activity has been triggered, a figure representing the number of :guila
|
||||
|
||||
.. tip::
|
||||
If the :guilabel:`Activity Type` of the activity is set to :guilabel:`Email`, there are more
|
||||
in-depth analytics beneath the activity graph data, detailing how many emails have been
|
||||
:guilabel:`Sent`, and what percentage of those have been :guilabel:`Clicked`, :guilabel:`Replied`
|
||||
to, or :guilabel:`Bounced`.
|
||||
in-depth analytics beneath the :guilabel:`Workflow Activity` data detailing how many emails have
|
||||
been :guilabel:`Sent`, and what percentage of those have been :guilabel:`Clicked`,
|
||||
:guilabel:`Replied` to, or :guilabel:`Bounced`.
|
||||
|
||||
Child activities
|
||||
================
|
||||
|
||||
There is also the option to add a *child activity* by clicking :guilabel:`Add child activity`,
|
||||
located at the bottom of each activity block in the :guilabel:`Workflow` section of a marketing
|
||||
automation form.
|
||||
Odoo also has the option to :guilabel:`Add Child Activity`. *Child Activities* are sub-activities
|
||||
that are connected to (and triggered by) the activity above it, which is also known as its *Parent
|
||||
Activity*.
|
||||
|
||||
Child activities are sub-activities that are connected to (and triggered by) the activity above it,
|
||||
which is also known as its *parent activity*.
|
||||
|
||||
Odoo provides a number of triggering options to launch a child activity - all of which depend on the
|
||||
trigger configurations related to the parent activity. Under the desired parent activity, hover over
|
||||
:guilabel:`Add child activity`, and select any of the following triggers:
|
||||
Odoo provides a number of triggering options to launch a :guilabel:`Child Activity` - all of which
|
||||
depend on the trigger configurations related to the parent activity. Under the desired parent
|
||||
activity, hover over :guilabel:`Add child activity`, and select the trigger:
|
||||
|
||||
- :guilabel:`Add Another Activity`: instantly add another activity.
|
||||
- :guilabel:`Opened`: the next activity will be triggered if the (email) recipient opens the
|
||||
@@ -86,7 +76,6 @@ trigger configurations related to the parent activity. Under the desired parent
|
||||
link included in the mailing.
|
||||
- :guilabel:`Bounced`: the next activity will be triggered if the mailing is bounced (not sent).
|
||||
|
||||
Once a trigger is selected, the user can configure the child activity (it has the same configuration
|
||||
options as a regular activity), and click :guilabel:`Save & Close` to finish creating the child
|
||||
activity, which will then be displayed in the :guilabel:`Workflow` section, in a slightly indented
|
||||
position beneath its parent activity.
|
||||
Once a trigger is selected, the user can configure the child activity (it has the same
|
||||
configuration options as a regular activity) and click :guilabel:`Save & Close`` to finish creating
|
||||
the child activity.
|
||||
|
||||
@@ -10,7 +10,7 @@ calls, and then, connect that Twilio account to Odoo.
|
||||
Create a Twilio account
|
||||
=======================
|
||||
|
||||
First, go to `Twilio <https://www.twilio.com>`_ and click :guilabel:`Sign up` to create a new
|
||||
First, go to `Twilio <https://www.twilio.com_>`_ and click :guilabel:`Sign up` to create a new
|
||||
Twilio account. Next, enter your name and email address, create a password, and accept Twilio's
|
||||
terms of service. Then, click :guilabel:`Start your free trial`. Verify your email address with
|
||||
Twilio, as per their instructions.
|
||||
|
||||
@@ -1,181 +1,81 @@
|
||||
==========================
|
||||
Connect an IoT box to Odoo
|
||||
==========================
|
||||
===================================
|
||||
Connect an IoT Box to your database
|
||||
===================================
|
||||
|
||||
An Internet of Things (IoT) box is a micro-computer device that allows for the connection of input
|
||||
and output devices to an Odoo database. An :abbr:`IoT (Internet of Things)` box subscription is
|
||||
required in order to use the :abbr:`IoT (Internet of Things)` box with a secured connection. A
|
||||
computer is also required to set up the :abbr:`IoT (Internet of Things)` box.
|
||||
Install the Internet of Things (IoT) App on your Odoo Database.
|
||||
|
||||
.. seealso::
|
||||
`IoT Box FAQ <https://www.odoo.com/app/iot-faq>`_
|
||||
|
||||
Begin the :abbr:`IoT (Internet of Things)` configuration process by :ref:`installing the IoT app
|
||||
<general/install>` on the Odoo database through the :menuselection:`Apps` application.
|
||||
|
||||
.. image:: connect/install-iot-app.png
|
||||
.. image:: connect/connect01.png
|
||||
:align: center
|
||||
:alt: The Internet of Things (IoT) app on the Odoo database.
|
||||
|
||||
Next, after the *IoT app* is installed, navigate to :menuselection:`IoT app --> IoT Boxes`, and then
|
||||
click on the :guilabel:`Connect` button located in the upper-left corner of the :menuselection:`IoT
|
||||
Boxes` dashboard.
|
||||
Go in the IoT App and click on Connect on the IoT Boxes page.
|
||||
|
||||
.. image:: connect/connect-iot.png
|
||||
.. image:: connect/connect02.png
|
||||
:align: center
|
||||
:alt: Connecting an IoT box to the Odoo database.
|
||||
|
||||
There are two recommended ways to connect the :abbr:`IoT (Internet of Things)` box to the database
|
||||
once the *IoT app* is installed. Follow the steps in either of the next two sections to connect the
|
||||
:abbr:`IoT (Internet of Things)` box via :ref:`wired ethernet connection <iot_connect/ethernet>` or
|
||||
via :ref:`WiFi <iot_connect/wifi>`.
|
||||
Follow the steps to connect your IoT Box.
|
||||
|
||||
.. image:: connect/connect-iot-box.png
|
||||
.. image:: connect/connect03.png
|
||||
:align: center
|
||||
:alt: Connection steps for a wired connection or WiFi connection.
|
||||
|
||||
.. important::
|
||||
The disk image that the :abbr:`IoT (Internet of Things)` box SD card is formatted with is unique
|
||||
to the version of the Odoo database that the :abbr:`IoT (Internet of Things)` box is running on.
|
||||
Ensure that the :abbr:`IoT (Internet of Things)` box is :doc:`flashed <flash_sdcard>` with the
|
||||
most up-to-date disk image.
|
||||
|
||||
.. _iot_connect/ethernet:
|
||||
|
||||
Ethernet connection
|
||||
Ethernet Connection
|
||||
===================
|
||||
|
||||
The following is the process to connect the :abbr:`IoT (Internet of Things)` box via an ethernet
|
||||
cable to the Odoo database (by way of the ethernet port; RJ-45).
|
||||
#. Connect to the IoT Box all the devices that have to be connected with
|
||||
cables (ethernet, usb devices, etc.).
|
||||
|
||||
First, connect all wired devices to the :abbr:`IoT (Internet of Things)` box (ethernet, :abbr:`USB
|
||||
(Universal Serial Bus)` devices, etc.). At minimum, an HDMI screen should be connected. Then, plug
|
||||
the :abbr:`IoT (Internet of Things)` box into a power source.
|
||||
#. Power on the IoT Box.
|
||||
|
||||
Immediately after the unit powers on and boots up, read the *pairing code* from the screen or from
|
||||
the printout of a receipt printer connected to the :abbr:`IoT (Internet of Things)` box.
|
||||
#. Read the Pairing Code from a screen or a receipt printer connected to the IoT Box.
|
||||
|
||||
.. warning::
|
||||
By default, the :abbr:`IoT (Internet of Things)` box will display the *pairing code* for a
|
||||
maximum of 5 minutes after the unit boots up. After 5 minutes, the *pairing code* will disappear
|
||||
for security purposes and the :abbr:`IoT (Internet of Things)` box will need to be rebooted
|
||||
manually by unplugging the unit from the power source for ten seconds and re-plugging it back in.
|
||||
.. image:: connect/connect04.png
|
||||
|
||||
#. Input the Pairing Code and click on the Pair button.
|
||||
|
||||
.. note::
|
||||
If no screen is attached to the :abbr:`IoT (Internet of Things)` box, then the *pairing code* can
|
||||
be accessed from the :abbr:`IoT (Internet of Things)` box homepage by clicking on the
|
||||
:guilabel:`POS Display` button. For instructions on how to access the :abbr:`IoT (Internet of
|
||||
Things)` box homepage visit :ref:`iot_connect/token`.
|
||||
Recent changes in modern web browsers forced us to modify the connection wizard.
|
||||
If your screen is different from the screenshots, make sure that the
|
||||
``iot_pairing`` module is installed.
|
||||
|
||||
On the computer, navigate to :menuselection:`IoT app --> IoT Boxes`, and then click on the
|
||||
:guilabel:`Connect` button located in the upper-left corner of the the :menuselection:`IoT Boxes`
|
||||
dashboard. Input the *pairing code* in the :guilabel:`Pairing Code` field and click on the
|
||||
:guilabel:`Pair` button. The database will now link to the :abbr:`IoT (Internet of Things)` box and
|
||||
it will appear on the :menuselection:`IoT Boxes` page.
|
||||
|
||||
.. _iot_connect/wifi:
|
||||
|
||||
WiFi connection
|
||||
WiFi Connection
|
||||
===============
|
||||
|
||||
The following is the process to connect the :abbr:`IoT (Internet of Things)` box via a WiFi
|
||||
connection to the Odoo database.
|
||||
#. Power on the IoT Box
|
||||
|
||||
First, ensure there is no ethernet cable plugged into the :abbr:`IoT (Internet of Things)` box.
|
||||
Then, connect all wired devices to the :abbr:`IoT (Internet of Things)` box (:abbr:`USB (Universal
|
||||
Serial Bus)` devices, etc.).
|
||||
#. Copy the token
|
||||
|
||||
After connecting the devices, plug the :abbr:`IoT (Internet of Things)` box into to a power source.
|
||||
On the computer, navigate to :menuselection:`IoT app --> IoT Boxes`, and then click on the
|
||||
:guilabel:`Connect` button located in the upper-left corner of the the :menuselection:`IoT Boxes`
|
||||
dashboard. Then copy the :guilabel:`Token` from the :guilabel:`WiFi connection` section as this will
|
||||
later be used to link the Odoo database to the :abbr:`IoT (Internet of Things)` box.
|
||||
.. image:: connect/connect05.png
|
||||
|
||||
Back on the computer, navigate to the available WiFi networks and connect to the :abbr:`IoT
|
||||
(Internet of Things)` box WiFi network. The WiFi network dispersed by the :abbr:`IoT (Internet of
|
||||
Things)` box will start with `IoTBox-xxxxxxxxxx`.
|
||||
#. Connect to the IoT Box WiFi Network (make sure there is no ethernet
|
||||
cable plugged in your computer).
|
||||
|
||||
.. image:: connect/connect-iot-wifi.png
|
||||
.. image:: connect/connect06.png
|
||||
|
||||
#. You will be redirected to the IoT Box Homepage (if it doesn't work,
|
||||
connect to the IP address of the box). Give a name to your IoT Box (not
|
||||
required) and paste the token, then click on next.
|
||||
|
||||
.. image:: connect/connect07.png
|
||||
|
||||
.. tip::
|
||||
If you are on Runbot, do not forget to add the -all or -base in the
|
||||
token (e.g. this token
|
||||
**http://375228-saas-11-5-iot-f3f920.runbot16.odoo.com\|4957098401**
|
||||
should become
|
||||
**http://375228-saas-11-5-iot-f3f920-all.runbot16.odoo.com\|4957098401**).
|
||||
|
||||
#. Choose the WiFi network you want to connect with (enter the password
|
||||
if there is one) and click on Submit. Wait a few seconds before being
|
||||
redirected to your database.
|
||||
|
||||
.. image:: connect/connect08.png
|
||||
|
||||
You should now see the IoT Box.
|
||||
|
||||
.. image:: connect/connect09.png
|
||||
:align: center
|
||||
:alt: WiFi networks available on the computer.
|
||||
|
||||
Upon connecting to the :abbr:`IoT (Internet of Things)` box WiFi, a browser will automatically
|
||||
redirect to the :menuselection:`Configure Iot Box` wizard. Name the :abbr:`IoT (Internet of Things)`
|
||||
box, then paste the previously copied *token* into the :guilabel:`Server Token` field, and then
|
||||
click on :guilabel:`Next`.
|
||||
|
||||
.. image:: connect/server-token.png
|
||||
:align: center
|
||||
:alt: Enter the server token into the IoT box.
|
||||
|
||||
.. note::
|
||||
If the :abbr:`IoT (Internet of Things)` box WiFi connection wizard doesn't start, then see the
|
||||
documentation on :ref:`connecting with a token <iot_connect/token>`.
|
||||
|
||||
Now, choose the WiFi network that the :abbr:`IoT (Internet of Things)` box will connect with (enter
|
||||
the password if there is one) and click on :guilabel:`Connect`. Wait a few seconds and the browser
|
||||
will redirect to the :abbr:`IoT (Internet of Things)` box homepage. The computer may need to be
|
||||
manually re-connected back to the original WiFi connection, if this does not happen automatically.
|
||||
|
||||
.. image:: connect/configure-wifi-network-iot.png
|
||||
:align: center
|
||||
:alt: Configuring the WiFi for the IoT box.
|
||||
|
||||
After completing each step, the :abbr:`IoT (Internet of Things)` box should appear when navigating
|
||||
to :menuselection:`IoT app --> IoT Boxes` on the Odoo database.
|
||||
|
||||
.. image:: connect/iot-box-connected.png
|
||||
:align: center
|
||||
:alt: The IoT box has been successfully configured on the Odoo database.
|
||||
|
||||
.. important::
|
||||
The :abbr:`IoT (Internet of Things)` box may need to be manually rebooted upon successfully
|
||||
connecting via WiFi for the box to appear in the *IoT app* on the Odoo database. To do so, simply
|
||||
unplug the device and plug it back into the power source after ten seconds.
|
||||
|
||||
.. _iot_connect/token:
|
||||
|
||||
Manually connecting the IoT box using the token
|
||||
===============================================
|
||||
|
||||
A manual connection of the :abbr:`IoT (Internet of Things)` box to the :abbr:`IoT (Internet of
|
||||
Things)` app can be made using the *token*, from a computer. The *token* can be found by navigating
|
||||
to :menuselection:`IoT app --> IoT Boxes` and clicking on :guilabel:`Connect`.
|
||||
|
||||
Under the :guilabel:`WiFi Connection` section of the :guilabel:`Connect an IoT Box` page that
|
||||
appears, click :guilabel:`Copy` to the right of the :guilabel:`Token`. This token will be entered
|
||||
into the :abbr:`IoT (Internet of Things)` box homepage.
|
||||
|
||||
Access the :abbr:`IoT (Internet of Things)` box homepage by entering the :abbr:`IP (Internet
|
||||
Protocol)` address of the :abbr:`IoT (Internet of Things)` box into a browser window from a computer
|
||||
on the same network as the :abbr:`IoT (Internet of Things)` box (preferably by ethernet connection).
|
||||
|
||||
.. note::
|
||||
The :abbr:`IP (Internet Protocol)` address can be accessed by the router admin console that the
|
||||
:abbr:`IoT (Internet of Things)` box is connected to, or by connecting a receipt printer to the
|
||||
:abbr:`IoT (Internet of Things)` box. A receipt will print out with the :abbr:`IoT (Internet of
|
||||
Things)` box's :abbr:`IP (Internet Protocol)` address on it.
|
||||
|
||||
On the :abbr:`IoT (Internet of Things)` box homepage, enter the *token* under the :guilabel:`Server`
|
||||
section by clicking on :guilabel:`Configure`. Then, paste the *token* into the :guilabel:`Server
|
||||
Token` field and click :guilabel:`Connect`. The :abbr:`IoT (Internet of Things)` box will then link
|
||||
to the Odoo database.
|
||||
|
||||
.. _iot/connect_schema:
|
||||
|
||||
IoT box schema
|
||||
IoT Box Schema
|
||||
==============
|
||||
|
||||
Raspberry Pi 4
|
||||
--------------
|
||||
|
||||
.. figure:: connect/iot-box-schema.png
|
||||
|
||||
The Odoo IoT box (Raspberry Pi 4) schema with labels.
|
||||
|
||||
Raspberry Pi 3
|
||||
--------------
|
||||
|
||||
.. figure:: connect/iox-box-schema-3.png
|
||||
|
||||
The Odoo IoT box (Raspberry Pi 3) schema with labels.
|
||||
.. image:: connect/connect10.png
|
||||
:align: center
|
||||
|
||||
|
Before Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 48 KiB |
|
Before Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 8.6 KiB |
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 3.8 KiB |
|
After Width: | Height: | Size: 3.0 KiB |
|
After Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 10 KiB |