Compare commits

..

13 Commits

Author SHA1 Message Date
Raphael Collet
ec6e9b27a0 [IMP] core: add SQL wrapper
This completes https://github.com/odoo/odoo/pull/134677.
2023-11-29 13:25:44 +01:00
Xavier (XPL)
c9affa54a8 [IMP] reporting: improve grammar and remove image centering
closes odoo/documentation#6653

X-original-commit: 3ead6e0f99
Signed-off-by: Xavier Platteau (xpl) <xpl@odoo.com>
2023-11-25 04:36:03 +00:00
“Chiara
1860805474 [IMP] accounting: branch management in main page
taskid-3609491

closes odoo/documentation#6646

X-original-commit: eafe834cf4
Signed-off-by: Xavier Platteau (xpl) <xpl@odoo.com>
2023-11-25 04:36:02 +00:00
“Chiara
8025fdd915 [IMP] accounting: peppol changes
taskid-3450738

closes odoo/documentation#6634

X-original-commit: 4728e6db23
Signed-off-by: Xavier Platteau (xpl) <xpl@odoo.com>
2023-11-24 11:17:02 +00:00
Xavier (XPL)
ae08218516 [IMP] outlook: remove note about multi-user sync spam
task-3575806

closes odoo/documentation#6625

X-original-commit: b4302e4023
Signed-off-by: Xavier Platteau (xpl) <xpl@odoo.com>
2023-11-24 08:52:34 +00:00
Xavier (XPL)
25a7492e74 [FIX] accounting: update link to getting started video tutorial
task-3608613

closes odoo/documentation#6614

X-original-commit: c0653112a1
Signed-off-by: Xavier Platteau (xpl) <xpl@odoo.com>
2023-11-24 08:52:33 +00:00
Claire Bretton (clbr)
32517aa638 [FIX] getting_started: remove useless lambda
The lambda function here is useless and makes newdooers think
they need to use it everytime.
`default=fields.Date.add(fields.Date.today(), months=3))`
should do the trick, no lambda involved.

closes odoo/documentation#6631

X-original-commit: 620508fb29
Signed-off-by: Antoine Vandevenne (anv) <anv@odoo.com>
Signed-off-by: Claire Bretton (clbr) <clbr@odoo.com>
2023-11-24 06:53:31 +00:00
Claire Bretton (clbr)
e8106a55c4 [FIX] getting_started: invalid addons-path
The "../technical-training-sandbox" is added too early in the path since
its still empty, and results into an "invalid addons-path" error.

X-original-commit: 8707609b38
Part-of: odoo/documentation#6631
2023-11-24 06:53:31 +00:00
Felicious
05da049af4 [ADD] inventory: cluster picking
closes odoo/documentation#6591

X-original-commit: 32900efbb9
Signed-off-by: Zachary Straub (zst) <zst@odoo.com>
Co-authored-by: hojo-odoo <123424465+hojo-odoo@users.noreply.github.com>
Co-authored-by: ksc-odoo <73958186+ksc-odoo@users.noreply.github.com>
Co-authored-by: meng-odoo <101904966+meng-odoo@users.noreply.github.com>
2023-11-24 06:53:30 +00:00
Xavier (XPL)
4d48d1dfa6 [IMP] paypal: add note about supported currencies
task-3608056

closes odoo/documentation#6571

X-original-commit: 5f1881a88a
Signed-off-by: Xavier Platteau (xpl) <xpl@odoo.com>
2023-11-23 08:52:05 +00:00
Felicious
3da8280f33 [IMP] inventory: update delivery methods from 12 to 16
closes odoo/documentation#6602

X-original-commit: 4e2b634a50
Signed-off-by: Zachary Straub (zst) <zst@odoo.com>
Co-authored-by: hojo-odoo <123424465+hojo-odoo@users.noreply.github.com>
Co-authored-by: Zachary Straub <zst@odoo.com>
2023-11-23 07:40:03 +00:00
KC (ksc)
ccf0b02713 [IMP] sales: updated deadline doc for 16
closes odoo/documentation#6584

X-original-commit: 75c24e7e88
Signed-off-by: Zachary Straub (zst) <zst@odoo.com>
2023-11-23 07:40:03 +00:00
John Holton (hojo)
37e10a53d9 [ADD] Quality: Measure quality check
closes odoo/documentation#6578

X-original-commit: 78713f1637
Signed-off-by: Zachary Straub (zst) <zst@odoo.com>
2023-11-23 07:40:02 +00:00
36 changed files with 496 additions and 163 deletions

View File

@@ -96,6 +96,12 @@ gains and losses after reconciling the journal items.
.. seealso::
:doc:`Manage a bank in a foreign currency <accounting/bank/foreign_currency>`
Branch management
=================
Multiple branches can be managed thanks to multi-company hierarchies. This allows to post journal
entries on each branch as well as setting up a common lock date managed by the main company.
International standards
=======================

View File

@@ -72,33 +72,6 @@ You can define a specific e-invoicing format for each customer. To do so, go to
.. image:: electronic_invoicing/customer-form.png
:alt: Select an EDI format for a specific customer
Peppol formats
--------------
Use the fields :guilabel:`Peppol e-address (EAS)` and :guilabel:`Peppol Endpoint` to identify the
recipient in the Peppol Network.
.. seealso::
`Peppol BIS Billing 3.0 - Electronic Address Scheme (EAS) code list
<https://docs.peppol.eu/poacc/billing/3.0/codelist/eas/>`_
.. example::
.. list-table::
:header-rows: 1
* - Partner's country
- Peppol e-address (EAS)
- Peppol Endpoint
* - Luxembourg
- 9938 - Luxemburg VAT number
- a valid Luxemburgish VAT number
* - Netherlands
- 0190 - Dutch Originator's Identification Number
- a valid OIN number
* - Belgium
- 9925 - Belgium VAT number
- a valid Belgian VAT number
National electronic invoicing
-----------------------------
@@ -121,3 +94,45 @@ e-invoicing option to generate and attach the e-invoice file.
.. image:: electronic_invoicing/send-window.png
:alt: The Peppol option is checked and an e-invoicing XML file is attached to the email.
Peppol
======
The `Peppol <https://peppol.org/about/>`_ network ensures the exchange of documents and information
between enterprises and governmental authorities. It is primarily used for electronic invoicing, and
its access points (connectors to the Peppol network) allow enterprises to exchange electronic
documents.
Odoo is now an **access point** enabling electronic invoicing transactions without the need to send
invoices and bills by email or post.
Configuration
-------------
First, :ref:`install <general/install>` the :guilabel:`Peppol` module (`account_peppol`).
.. image:: electronic_invoicing/peppol-module.png
:alt: Peppol module install
Then, go to :menuselection:`Accounting --> Configuration --> Settings`, tick the
:guilabel:`Use PEPPOL Invoicing`, and fill in the following information:
- `PEPPOL EAS <https://ec.europa.eu/digital-building-blocks/wikis/display/DIGITAL/Code+lists/>`_
- :guilabel:`Peppol Endpoint`
- :guilabel:`Phone Number`, including the country code (e.g., `+32` in Belgium)
- :guilabel:`Primary contact email`
If you are migrating from another access point, insert the :guilabel:`Migration key` from
the previous provider.
.. image:: electronic_invoicing/peppol-settings.png
:alt: Configuration for peppol
Finally, click on :guilabel:`Validate registration`.
A text message containing a code is sent to the phone number provided to finalize the registration
process.
.. image:: electronic_invoicing/phone-registration.png
:alt: phone validation
All invoices and vendor bills are now sent directly using the Peppol network.

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

View File

@@ -187,7 +187,8 @@ Send yourself a sample invoice by email to make sure everything is correctly con
* :doc:`get_started/chart_of_accounts`
* :doc:`bank/bank_synchronization`
* :doc:`../fiscal_localizations`
* `Odoo Tutorials: Accounting Basics <https://www.odoo.com/r/lsZ>`_
* `Odoo Tutorials: Accounting and Invoicing - Getting started [video]
<https://www.odoo.com/slides/slide/getting-started-1692>`_
.. toctree::
:titlesonly:

View File

@@ -5,6 +5,11 @@ PayPal
`Paypal <https://www.paypal.com/>`_ is an American online payment provider available worldwide, and
one of the few that does not charge a subscription fee.
.. note::
While PayPal is available in `over 200 countries/regions
<https://www.paypal.com/webapps/mpp/country-worldwide>`_, only `a selection of currencies are
supported <https://developer.paypal.com/docs/reports/reference/paypal-supported-currencies>`_.
Settings in PayPal
==================

View File

@@ -2,8 +2,8 @@
Reporting
=========
You can find under the :guilabel:`Reporting` menu of most apps several reports that let you analyze
and visualize your records' data.
You can find several reports under the :guilabel:`Reporting` menu of most apps that let you analyze
and visualize the data of your records.
.. _reporting/views:
@@ -25,7 +25,6 @@ but can be found elsewhere. Click the **graph view button** located at the top r
it.
.. image:: reporting/graph-button.png
:align: center
:alt: Selecting the graph view
.. _reporting/views/pivot:
@@ -38,7 +37,6 @@ down for analysis. The view is often found under the :guilabel:`Reporting` menu
found elsewhere. Click the **pivot view button** located at the top right to access it.
.. image:: reporting/pivot-button.png
:align: center
:alt: Selecting the pivot view
.. _reporting/choosing-measures:
@@ -65,7 +63,6 @@ grouped by *Date > Month*, which is used to analyze the evolution of a measure o
When you filter a single time period, the option to compare it against another one appears.
.. image:: reporting/comparison.png
:align: center
:alt: Using the comparison option
.. example::
@@ -79,7 +76,6 @@ grouped by *Date > Month*, which is used to analyze the evolution of a measure o
selected.
.. image:: reporting/measures.png
:align: center
:alt: Selecting different measures on the Sales Analysis report
.. tab:: Group measures
@@ -88,7 +84,6 @@ grouped by *Date > Month*, which is used to analyze the evolution of a measure o
previous Sales Analysis report example.
.. image:: reporting/single-group.png
:align: center
:alt: Adding a group on the Sales Analysis report
.. _reporting/using-pivot:
@@ -111,7 +106,6 @@ subgroups.
group on the :guilabel:`All / Saleable / Office Furniture` product category.
.. image:: reporting/multiple-groups.png
:align: center
:alt: Adding multiple groups on the Sales Analysis report
.. tip::
@@ -124,7 +118,7 @@ subgroups.
Using the graph view
====================
Three graphs are available, the bar, line, and pie charts.
Three graphs are available: the bar, line, and pie charts.
**Bar charts** are used to show the distribution or a comparison of several categories. They are
especially useful as they can deal with larger data sets.
@@ -139,19 +133,16 @@ when they form a meaningful whole.
.. tab:: Bar chart
.. image:: reporting/bar.png
:align: center
:alt: Viewing the Sales Analysis report as a bar chart
.. tab:: Line chart
.. image:: reporting/line.png
:align: center
:alt: Viewing the Sales Analysis report as a line chart
.. tab:: Pie chart
.. image:: reporting/pie.png
:align: center
:alt: Viewing the Sales Analysis report as a pie chart
.. tip::
@@ -163,25 +154,21 @@ when they form a meaningful whole.
.. tab:: Stacked bar chart
.. image:: reporting/stacked-bar.png
:align: center
:alt: Stacked bar chart example
.. tab:: Regular bar chart
.. image:: reporting/non-stacked-bar.png
:align: center
:alt: Non-stacked bar chart example
.. tab:: Stacked line chart
.. image:: reporting/stacked-line.png
:align: center
:alt: Stacked line chart example
.. tab:: Regular line chart
.. image:: reporting/non-stacked-line.png
:align: center
:alt: Non-stacked line chart example
For **line** charts, you can use the cumulative option to sum values, which is especially useful
@@ -192,11 +179,9 @@ when they form a meaningful whole.
.. tab:: Cumulative line chart
.. image:: reporting/cumulative.png
:align: center
:alt: Cumulative line chart example
.. tab:: Regular line chart
.. image:: reporting/non-cumulative.png
:align: center
:alt: Regular line chart example

View File

@@ -2,6 +2,8 @@
How to invoice the shipping cost to the customer?
=================================================
.. _inventory/shipping/invoice:
Overview
========

View File

@@ -1,100 +1,213 @@
===============================
How to setup a delivery method?
===============================
================
Delivery methods
================
Overview
========
When activated in Odoo, the *Delivery Methods* setting adds the option of calculating the cost of
shipping on sales orders and e-commerce shopping carts.
Odoo can handle various delivery methods, but it is not activated by
default. Delivery methods can be used for your sale orders, your
deliveries but also on your e-commerce.
When integrated with a :ref:`third-party carrier <inventory/shipping/third_party>`, shipping prices
are calculated based on the carrier's pricing and packaging information.
Delivery methods allow you to manage the transport company, the price
and the destination. You can even integrate Odoo with external shippers
to compute the real price and the packagings.
.. seealso::
- :ref:`Third-party shipping carrier setup <inventory/shipping/third_party>`
- `Odoo Tutorials: Delivery Prices
<https://www.odoo.com/slides/slide/delivery-prices-613?fullscreen=1>`_
Configuration
=============
Install the inventory module
----------------------------
To calculate shipping on sales orders and e-commerce, the *Delivery Costs* module must be installed.
To do so, navigate to the :menuselection:`Apps` application from the main Odoo dashboard.
Delivery methods are handled by the **Delivery costs** module. Go to
**Apps** and search for the module. You should remove the **Apps** filter in
order to see it :
Then, remove the :guilabel:`Apps` filter, and type in `Delivery Costs` in the :guilabel:`Search...`
bar. After finding the :guilabel:`Delivery Costs` module, click :guilabel:`Activate` to install it.
.. image:: delivery_method/setup05.png
.. image:: delivery_method/install-module.png
:align: center
:alt: Install the *Delivery Costs* module.
Add shipping method
===================
To configure delivery methods, go to :menuselection:`Inventory app --> Configuration --> Shipping
Methods`.
.. note::
If you want to integrate delivery methods in your e-commerce,
you'll have to install the **eCommerce Delivery** module.
If the :guilabel:`Shipping Methods` option is not available from the :guilabel:`Configuration`
drop-down menu, verify whether the feature is enabled by following these steps:
Configure the delivery method
-----------------------------
#. Go to :menuselection:`Inventory app --> Configuration --> Settings`.
#. Scroll to the :guilabel:`Shipping` section and enable the :guilabel:`Delivery Methods` feature
by checking the corresponding checkbox.
To configure your delivery methods, go to the **Inventory** module,
click on :menuselection:`Configuration --> Delivery Methods`.
.. image:: delivery_method/enable-delivery.png
:align: center
:alt: Enable the *Delivery Methods* feature by checking the box in Configuration > Settings.
First set a name and a transporter company.
On the :guilabel:`Shipping Methods` page, add a method by clicking :guilabel:`New`. Doing so opens
a form to provide details about the shipping provider, including:
.. image:: delivery_method/setup03.png
:align: center
- :guilabel:`Shipping Method` (*Required field*): the name of the delivery method (e.g. `flat-rate
shipping`, `same day delivery`, etc.).
- :guilabel:`Provider` (*Required field*): choose the delivery service, like Fedex, if using a
:ref:`third-party carrier <inventory/shipping/third_party>`. Ensure the integration with the
shipping carrier is properly installed and select the provider from the drop-down menu.
Then you'll have to set the pricing. It can be fixed or based on rules.
For more details on configuring custom shipping methods, such as :ref:`fixed price
<inventory/shipping/fixed>`, :ref:`based on rules <inventory/shipping/rules>`, or :ref:`pickup in
store <inventory/shipping/pickup>` options, refer to their respective sections below.
- :guilabel:`Website`: configure shipping methods for an e-commerce page. Select the applicable
website from the drop-down menu, or leave it blank to apply the method to all web pages.
- :guilabel:`Company`: if the shipping method should apply to a specific company, select it from the
drop-down menu. Leave the field blank to apply the method to all companies.
- :guilabel:`Delivery Product` (*Required field*): the product listed on the :ref:`sales order line
<inventory/shipping/sales-order>` as the delivery charge.
- :guilabel:`Free if order amount is above`: checking this box enables free shipping if the customer
spends above the specified amount.
- If the price is fixed, tick **Fixed price**. You'll just have to define
the price. If you want the delivery to be free above a certain
amount, tick the option **Free if Order total is more
than** and set a price.
For examples on how to configure specific shipping methods, refer to the sections below.
.. image:: delivery_method/setup06.png
:align: center
.. _inventory/shipping/fixed:
- If the price varies according to rules, tick **Based on Rules**. Click
on **add an item to a pricing rule**. Choose a condition based on
either the weight, the volume, the price or the quantity.
Fixed price
-----------
.. image:: delivery_method/setup04.png
:align: center
To configure a shipping price that is the same for all orders, go to :menuselection:`Inventory app
--> Configuration --> Shipping Methods`. Then, click :guilabel:`New`, and on the shipping method
form, set the :guilabel:`Provider` to the :guilabel:`Fixed Price` option. Selecting this option
makes the :guilabel:`Fixed Price` field become available, which is where the fixed rate shipping
amount is defined.
Finally you can limit the delivery method to a few destinations. The
limit can be applied to some countries, states or even zip codes. This
feature limits the list of countries on your e-commerce.
To enable free shipping if the amount of the order exceeds a specified amount, check the box
:guilabel:`Free if order amount is above` and fill in the amount.
.. image:: delivery_method/setup02.png
:align: center
.. example::
To set up `$20` flat-rate shipping that becomes free if the customer spends over `$100`, fill in
the following fields:
.. note::
You can integrate Odoo with external shippers in order to compute the
real price and packagings, and handle the printing the shipping labels.
See :doc:`third_party_shipper`
- :guilabel:`Shipping Method`: `Flat-rate shipping`
- :guilabel:`Provider`: :guilabel:`Fixed Price`
- :guilabel:`Fixed Price`: `$20.00`
- :guilabel:`Free if order amount is above`: `$100.00`
- :guilabel:`Delivery Product`: `[SHIP] Flat`
Delivery process
================
.. image:: delivery_method/new-shipping-method.png
:align: center
:alt: Example of filling out a shipping method.
Sale order
----------
.. _inventory/shipping/rules:
.. image:: delivery_method/setup07.png
:align: center
Based on rules
--------------
You can now choose the **Delivery Method** on your sale order. If you want
to invoice the price of the delivery charge on the sale order, click on
**Set price**, it will add a line with the name of the delivery method as
a product.
To calculate the price of shipping based on pricing rules, set the :guilabel:`Provider` field to the
:guilabel:`Based on Rules` option. Optionally, adjust :guilabel:`Margin on Rate` and
:guilabel:`Additional margin` to include additional shipping costs.
Delivery
--------
Create pricing rules
~~~~~~~~~~~~~~~~~~~~
You can add or change the delivery method on the delivery itself.
Navigate to the :guilabel:`Pricing` tab and click :guilabel:`Add a line`. Doing so opens the
:guilabel:`Create Pricing Rules` window, where the :guilabel:`Condition` related to the product
weight, volume, price, or quantity is compared to a defined amount to calculate the
:guilabel:`Delivery Cost`.
.. image:: delivery_method/setup01.png
:align: center
Once finished, click either :guilabel:`Save & New` to add another rule, or :guilabel:`Save & Close`.
On the delivery, check the **Carrier Information**. The carrier is the
chosen delivery method.
.. example::
To charge customers $20 in shipping for orders with five or fewer products, set the
:guilabel:`Condition` to `Quantity <= 5.00`, and the :guilabel:`Delivery Cost` to `$20`.
.. image:: delivery_method/pricing-rule.png
:align: center
:alt: Display window to add a pricing rule. Set a condition and delivery cost.
To restrict shipping to specific destinations on the eCommerce website, in the shipping method form,
navigate to the :guilabel:`Destination Availability` tab and define the :guilabel:`Countries`,
:guilabel:`States`, and :guilabel:`Zip Prefixes`. Leave these fields empty if all locations apply.
Calculate delivery cost
~~~~~~~~~~~~~~~~~~~~~~~
Shipping cost is the :guilabel:`Delivery cost` specified in the rule that satisfies the
:guilabel:`Condition`, plus any extra charges from the :guilabel:`Margin on rate` and
:guilabel:`Additional margin`.
.. math::
Total = Rule's~Delivery~Cost + (Margin~on~rate \times Rule's~Delivery~Cost) + Additional~margin
.. example::
With the two following rules set up:
#. If the order contains five or fewer products, shipping is $20
#. If the order contains more than five products, shipping is $50.
:guilabel:`Margin on Rate` is `10%` and :guilabel:`Additional margin` is `$9.00`.
.. image:: delivery_method/delivery-cost-example.png
:align: center
:alt: Show example of "Based on rules" shipping method with margins configured.
When the first rule is applied, the delivery cost is $31 (20 + (0.1 * 20) + 9). When the second
rule is applied, the delivery cost is $64 (50 + (0.1 * 50) + 9).
.. _inventory/shipping/pickup:
Pickup in store
---------------
To configure in-store pickup, select :guilabel:`Pickup in store` in the :guilabel:`Provider` field
and specify the pickup location in :guilabel:`Warehouse`.
To invoice the customer for the shipping cost to the pickup location, choose the :guilabel:`Get Rate
and Create Shipment` option in the :guilabel:`Integration Level` field. Then, pick either the
:guilabel:`Estimated cost` or :guilabel:`Real cost` radio options in the :guilabel:`Invoicing
Policy` field to decide whether the added shipping charge on the sales order is the precise cost
from the shipping carrier.
.. seealso::
* :doc:`third_party_shipper`
* :doc:`../operation/invoicing`
:ref:`Invoice cost of shipping <inventory/shipping/invoice>`
.. _inventory/shipping/sales-order:
Add shipping
============
Shipping methods can be added to sales orders in the form of delivery products, which appear as
individual line items. First, navigate to the desired sales order by going to :menuselection:`Sales
app --> Orders --> Orders`.
On the sales order, click the :guilabel:`Add shipping` button, which opens the :guilabel:`Add a
shipping method` pop-up window. Then, choose a :guilabel:`Shipping Method` from the list.
The :guilabel:`Total Order Weight` is pre-filled based on product weights (that are defined in the
:guilabel:`Inventory` tab for each product form). Edit the field to specify the exact weight, and
then click :guilabel:`Add` to add the shipping method.
.. note::
The amount defined in :guilabel:`Total Order Weight` overwrites the total product weights defined
on the product form.
The shipping cost is added to the *sales order line* as the :guilabel:`Delivery Product` detailed on
the shipping method form.
.. example::
`Furniture Delivery`, a delivery product with a fixed rate of `$200`, is added to sales order
`S00088`.
.. image:: delivery_method/delivery-product.png
:align: center
:alt: Show delivery order on the sales order line.
Delivery order
--------------
The shipping method added to the sales order is linked to the shipping carrier details on the
delivery order. To add or change the delivery method on the delivery itself, go to the
:guilabel:`Additional Info` tab and modify the :guilabel:`Carrier` field.
.. image:: delivery_method/delivery-order.png
:align: center
:alt: Shipping carrier information on the delivery form.

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

View File

@@ -2,6 +2,8 @@
How to integrate a third party shipper?
=======================================
.. _inventory/shipping/third_party:
Overview
========

View File

@@ -9,3 +9,4 @@ Quality check types
quality_check_types/instructions_check
quality_check_types/pass_fail_check
quality_check_types/measure_check

View File

@@ -0,0 +1,194 @@
=====================
Measure quality check
=====================
.. |QCP| replace:: :abbr:`QCP (Quality Control Point)`
.. |QCPs| replace:: :abbr:`QCPs (Quality Control Points)`
In Odoo *Quality*, a *Measure* check is one of the quality check types that can be selected when
creating a new quality check or quality control point (QCP). *Measure* checks prompt users to
measure a certain aspect of a product and record the measurement in Odoo. For the quality check to
pass, the recorded measurement must be within a certain *tolerance* of a *norm* value.
Create a Measure quality check
==============================
There are two distinct ways that *Measure* quality checks can be created. A single check can be
manually created. Alternatively, a |QCP| can be configured that automatically creates checks at a
predetermined interval.
This documentation only details the configuration options that are unique to *Measure* quality
checks and |QCPs|. For a full overview of all the configuration options available when creating a
single check or a |QCP|, see the documentation on :ref:`quality checks
<quality/quality_management/quality-checks>` and :ref:`quality control points
<quality/quality_management/quality-control-points>`.
Quality check
-------------
To create a single *Measure* quality check, navigate to :menuselection:`Quality --> Quality Control
--> Quality Checks`, and click :guilabel:`New`. Fill out the new quality check form as follows:
- In the :guilabel:`Type` drop-down field, select the :guilabel:`Measure` quality check type.
- In the :guilabel:`Team` drop-down field, select the quality team responsible for managing the
check.
- In the :guilabel:`Instructions` text field of the :guilabel:`Notes` tab, enter instructions for
how the picture should be taken.
.. image:: measure_check/measure-check-form-1.png
:align: center
:alt: A quality check form configured for a Measure quality check.
Quality control point (QCP)
---------------------------
To create a |QCP| that generates *Measure* quality checks automatically, navigate to
:menuselection:`Quality --> Quality Control --> Control Points`, and click :guilabel:`New`. Fill out
the new |QCP| form as follows:
- In the :guilabel:`Type` drop-down field, select the :guilabel:`Measure` quality check type. Doing
so causes two new fields to appear: :guilabel:`Norm` and :guilabel:`Tolerance`.
- Use the first text-entry field of the :guilabel:`Norm` field to record the ideal measurement
that the product should conform to. Use the second text-entry field to specify the unit of
measurement that should be used.
- The :guilabel:`Tolerance` field features two sub-fields: :guilabel:`from` and :guilabel:`to`.
Use the :guilabel:`from` field to specify the minimum acceptable measurement, and the
:guilabel:`to` field to specify the maximum acceptable measurement.
- In the :guilabel:`Team` drop-down field, select the quality team responsible for managing the
checks created by the |QCP|.
- In the :guilabel:`Instructions` text field, enter instructions for how the measurement should be
taken.
.. image:: measure_check/measure-check-qcp-form.png
:align: center
:alt: A QCP form configured to create Measure quality checks.
Process a Measure quality check
===============================
Once created, there are multiple ways that *Measure* quality checks can be processed. If a quality
check is assigned to a specific inventory, manufacturing, or work order, the check can be processed
on the order itself. Alternatively, a check can be processed from the check's page.
From the check's page
---------------------
To process a *Measure* quality check from the check's page, begin by navigating to
:menuselection:`Quality --> Quality Control --> Quality Checks`, and select a quality check. Follow
the :guilabel:`Instructions` for how to take the measurement.
After taking the measurement, record the value in the :guilabel:`Measure` field on the quality check
form. To manually pass or fail the check, click :guilabel:`Pass` or :guilabel:`Fail` at the top-left
corner of the check.
Alternatively, if the quality check is assigned to a |QCP| for which *norm* and *tolerance* values
have been specified, click :guilabel:`Measure` at the top-left corner of the check instead. Doing so
automatically marks the check as *Passed* if the recorded value is within the specified *tolerance*,
or *Failed* if the value is outside of it.
On an order
-----------
To process a *Measure* quality check on an order, select a manufacturing order or inventory order
(receipt, delivery, return, etc.), for which a check is required. Manufacturing orders can be
selected by navigating to :menuselection:`Manufacturing --> Operations --> Manufacturing Orders`,
and clicking on an order. Inventory orders can be selected by navigating to
:menuselection:`Inventory`, clicking the :guilabel:`# To Process` button on an operation card, and
selecting an order.
On the selected manufacturing or inventory order, a purple :guilabel:`Quality Checks` button appears
at the top of the page. Click the button to open the :guilabel:`Quality Check` pop-up window, which
shows all of the quality checks required for that order.
To process a *Measure* quality check, measure the product as instructed, then enter the value in the
:guilabel:`Measure` field on the pop-up window. Finally, click :guilabel:`Validate` to register the
recorded value.
.. image:: measure_check/measure-check-pop-up.png
:align: center
:alt: A Measure quality check pop-up window on a manufacturing or inventory order.
If the value entered is within the range specified in the :guilabel:`Tolerance` section of the
|QCP|, the quality check passes and the pop-up window closes. The rest of the manufacturing or
inventory order can then be processed as usual.
However, if the value entered is outside of the specified range, a new pop-up window appears, titled
:guilabel:`Quality Check Failed`. The body of the pop-up shows a warning message that states,
:guilabel:`You measured # units and it should be between # units and # units.`, as well as the
instructions entered in the :guilabel:`Message If Failure` tab of the |QCP|. At the bottom of the
pop-up, two buttons appear: :guilabel:`Correct Measure` and :guilabel:`Confirm Measure`.
.. image:: measure_check/measure-check-failed.png
:align: center
:alt: The "Quality Check Failed" pop-up window.
If the measurement was not entered correctly and should be changed, select :guilabel:`Correct
Measure`. Doing so re-opens the :guilabel:`Quality Check` pop-up window. Enter the corrected
measurement in the :guilabel:`Measure` field, and then click :guilabel:`Validate` to complete the
check.
If the measurement was entered correctly, click :guilabel:`Confirm Measure` instead, and the quality
check fails. Follow any instructions that were listed on the :guilabel:`Quality Check Failed` pop-up
window.
If a quality alert must be created, click the :guilabel:`Quality Alert` button that appears at the
top of the manufacturing or inventory order after the check fails. Clicking :guilabel:`Quality
Alert` opens a quality alert form on a new page.
For a complete guide on how to fill out the quality alert form, view the documentation on
:ref:`quality alerts <quality/quality_management/quality-alerts>`.
On a work order
---------------
When configuring a |QCP| that is triggered during manufacturing, a specific work order can also be
specified in the :guilabel:`Work Order Operation` field on the |QCP| form. If a work order is
specified, a *Measure* quality check is created for that specific work order, rather than the
manufacturing order as a whole.
*Measure* quality checks created for work orders must be processed from the tablet view. To do so,
begin by navigating to :menuselection:`Manufacturing --> Operations --> Manufacturing Orders`.
Select a manufacturing order that includes a work order for which a quality check is required. Open
the tablet view for that work order by selecting the :guilabel:`Work Orders` tab, and then clicking
the :guilabel:`📱 (tablet)` button on the order's line.
With tablet view open, complete the steps listed on the left side of the screen until the *Measure*
quality check step is reached. Upon reaching the check, the instructions for how to take the
measurement appear at the top of the screen. Enter the measured value in the :guilabel:`Measure`
field above the instructions, and then click :guilabel:`Validate`.
.. image:: measure_check/measure-tablet-view.png
:align: center
:alt: A Measure quality check in the Manufacturing tablet view.
If the measurement entered is within the range specified in the :guilabel:`Tolerance` section of the
|QCP|, the quality check passes and the tablet view moves on to the next step of the work order.
However, if the measurement entered is outside of the specified range, a pop-up window appears,
titled :guilabel:`Quality Check Failed`.
The body of the :guilabel:`Quality Check Failed` pop-up window shows a warning message that states,
:guilabel:`You measured # units and it should be between # units and # units.`, as well as the
instructions entered in the :guilabel:`Message If Failure` tab of the |QCP|. At the bottom of the
pop-up, two buttons appear: :guilabel:`Correct Measure` and :guilabel:`Confirm Measure`.
.. image:: measure_check/measure-check-failed.png
:align: center
:alt: The "Quality Check Failed" pop-up window.
If the measurement was not entered correctly, and should be changed, select :guilabel:`Correct
Measure`. Doing so opens a new pop-up window, titled :guilabel:`Quality Check`. Enter the corrected
measurement in the :guilabel:`Measure` field, then click :guilabel:`Validate` to complete the check,
and move on to the next step of the work order.
If the measurement was entered correctly, click :guilabel:`Confirm Measure` instead, and the quality
check fails. Follow any instructions that were listed on the :guilabel:`Quality Check Failed` pop-up
window.
If a quality alert must be created, do so by clicking the :guilabel:`☰ (three horizontal lines)`
button, and selecting :guilabel:`Quality Alert` from the :guilabel:`Menu` pop-up window. A
:guilabel:`Quality Alerts` pop-up window appears, from which a quality alert can be created.
For a complete guide on how to fill out the quality alert form, view the documentation on
:ref:`quality alerts <quality/quality_management/quality-alerts>`.

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@@ -103,13 +103,6 @@ Sync with Outlook
unarchived, or event date/time changed), with no exceptions. This is a limitation that cannot be
fixed from Odoo's side.
After one user syncs their Outlook calendar to the Odoo database, unwanted email notifications
are unavoidable because the first synchronized user's events will be in the Odoo Calendar. If
the Odoo database is shared amongst multiple users, and another user wants to sync their Outlook
calendar with Odoo Calendar, Outlook will again pull the existing Odoo Calendar events during
the sync and treat them as new events, causing Outlook to send email invitations to all event
attendees.
In summary, once a user synchronizes their Outlook calendar with the Odoo calendar:
- Creating an event in Odoo causes Outlook to send an invitation to all event attendees.

View File

@@ -2,6 +2,8 @@
Connect a measurement tool
==========================
.. _iot/devices/measurement-tool:
With Odoo's :abbr:`IoT (Internet of Things)` box, it is possible to connect measurement tools to the
Odoo database for use in the *Quality app* on a quality control point/quality check, or for use in a
work center during the manufacturing process.

View File

@@ -7,54 +7,50 @@ encourages customers to act quickly during sales negotiations, for they might fe
on a good deal. As well, deadlines also can also act as protection for a company in case an order
has to be fulfilled at a price that is no longer profitable for the business.
Expiration date deadlines
=========================
Quotation expiration
====================
On an Odoo *Sales* quotation, add an expiration date in the :guilabel:`Expiration` field located at
the top of the quotation or sales order form.
In Odoo *Sales*, there's the option to add an expiration date to a quotation.
To add an expiration date to a quotation, navigate to :menuselection:`Sales app`, and select a
desired quotation, or create a new one by clicking :guilabel:`Create`.
desired quotation, or create a new one by clicking :guilabel:`New`.
On the quotation form, click :guilabel:`Edit` (if modifying a pre-existing quotation), and click the
:guilabel:`Expiration` field. Doing so reveals a drop-down calendar, in which the month and date can
be designated as the expiration date of the quotation.
On the quotation form, click the :guilabel:`Expiration` field to reveal a pop-up calendar. From this
pop-up calendar, select the desired month and date as the expiration date for the quotation.
.. image:: deadline/quotation-deadlines-expiration-field.png
:align: center
:alt: How to configure deadlines on Odoo Sales.
Once the expiration date is selected, click :guilabel:`Save` to save all changes.
Deadlines in quotation templates
================================
The Odoo *Sales* application also makes it possible to add a deadline to every quotation template.
Whenever a specific quotation template is used in a quote, its associated deadline is automatically
applied.
To add a deadline to a quotation template, navigate to :menuselection:`Sales app --> Configuration
--> Quotation Templates`, and either select the desired quotation template to which a deadline
should be added, or click :guilabel:`Create` to build a new quotation template from scratch.
On the quotation template detail page, click the :guilabel:`Edit` button to edit the quotation.
Then, add a specific number of days to the :guilabel:`Quotation expires after` field, located
beneath the quotation template name. The number of days represents how long the quotation will be
valid for, before it expires. When done, click :guilabel:`Save`.
.. image:: deadline/quotation-deadlines-expires-after.png
:align: center
:alt: How to use deadline in a quotation template on Odoo Sales.
:alt: The expiration field on a standard quotation form in Odoo Sales.
.. tip::
By clicking the :guilabel:`Customer Preview` button on a quotation, Odoo clearly displays when
that specific offer expires. As a reminder, the number of days is the same as those mentioned in
the quotation template (if a quotation template was used for the initial quotation).
By clicking the :guilabel:`Preview` button on a quotation, Odoo clearly displays when that
specific offer expires.
.. image:: deadline/quotation-deadlines-preview.png
:align: center
:alt: How customers will see deadlines on Odoo Sales.
Quotation template expiration
=============================
The Odoo *Sales* application also makes it possible to add a deadline expiration date to quotation
templates.
To add a deadline expiration date to a quotation template, navigate to :menuselection:`Sales app -->
Configuration --> Quotation Templates`, and either select the desired quotation template to which a
deadline should be added, or click :guilabel:`New` to build a new quotation template from scratch.
On the quotation template form, add a specific number of days to the :guilabel:`Quotation expires
after` field, located beneath the quotation template name. The number of days represents how long
the quotation will be valid for, before it expires.
.. image:: deadline/quotation-deadlines-expires-after.png
:align: center
:alt: The quotation expires after field on a quotation template form in Odoo Sales.
Then, whenever that specific quotation template is used in a quote, an expiration date is
automatically calculated, based on the number of days designated above. However, this date can be
overwritten before sending the quotation to the customer.
.. seealso::
:doc:`/applications/sales/sales/send_quotations/quote_template`

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.3 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

After

Width:  |  Height:  |  Size: 27 KiB

View File

@@ -726,6 +726,13 @@ joins) or for performance reasons::
Please make sure your queries are sanitized when using user input and prefer using
ORM utilities if you don't really need to use SQL queries.
The recommended way to build SQL queries is to use the wrapper object
.. autoclass:: odoo.tools.SQL
.. automethod:: SQL.join
.. automethod:: SQL.identifier
One important thing to know about models is that they don't necessarily perform
database updates right away. Indeed, for performance reasons, the framework
delays the recomputation of fields after modifying records. And some database
@@ -740,7 +747,7 @@ called *flushing* and performs the expected database updates.
# make sure that 'partner_id' is up-to-date in database
self.env['model'].flush_model(['partner_id'])
self.env.cr.execute("SELECT id FROM model WHERE partner_id IN %s", [ids])
self.env.cr.execute(SQL("SELECT id FROM model WHERE partner_id IN %s", ids))
ids = [row[0] for row in self.env.cr.fetchall()]
Before every SQL query, one has to flush the data needed for that query. There

View File

@@ -4,17 +4,24 @@
Changelog
=========
Odoo version 17.0
=================
- Introduce an :class:`~odoo.tools.SQL` wrapper object to make SQL composition
easier and safer with respect to SQL injections. Methods of the ORM now use it
internally. Introduced by `#134677 <https://github.com/odoo/odoo/pull/134677>`_.
Odoo Online version 16.4
========================
- `odoo.models.Model.name_get` has been deprecated with
- Method :meth:`~odoo.models.Model.name_get` has been deprecated with
`#122085 <https://github.com/odoo/odoo/pull/122085>`_.
Read `display_name` instead.
Read field `display_name` instead.
Odoo Online version 16.3
========================
- `odoo.models.Model._read_group` has a new signature with
- Method :meth:`~odoo.models.Model._read_group` has a new signature with
`#110737 <https://github.com/odoo/odoo/pull/110737>`_
Odoo Online version 16.2
@@ -22,9 +29,9 @@ Odoo Online version 16.2
- Refactor the implementation of searching and reading methods to be able to
combine both in a minimal number of SQL queries. We introduce two new methods
`odoo.models.Model.search_fetch` and `odoo.models.Model.fetch` that take
advantage of the combination. More details can be found on the pull request
`#112126 <https://github.com/odoo/odoo/pull/112126>`_.
:meth:`~odoo.models.Model.search_fetch` and :meth:`~odoo.models.Model.fetch`
that take advantage of the combination. More details can be found on the pull
request `#112126 <https://github.com/odoo/odoo/pull/112126>`_.
Odoo version 16.0
=================

View File

@@ -74,7 +74,7 @@ interface of the server.
.. code-block:: console
$ cd $HOME/src/odoo/
$ ./odoo-bin --addons-path="addons/,../enterprise/,../technical-training-sandbox" -d rd-demo
$ ./odoo-bin --addons-path="addons/,../enterprise/" -d rd-demo
There are multiple :ref:`command-line arguments <reference/cmdline/server>` that you can use to run
the server. In this training you will only need some of them.
@@ -118,6 +118,10 @@ the server. In this training you will only need some of them.
- :option:`-u <odoo-bin --update>`: Update some modules before running the server
(comma-separated list).
.. note::
For now you cannot add `../technical-training-sandbox` to your `addons-path` as it is empty
and will result into an invalid addons-path folder error, but you will have to add it back later on !
Log in to Odoo
--------------

View File

@@ -232,7 +232,7 @@ Any field can be given a default value. In the field definition, add the option
float, string) or a function taking a model and returning a value::
name = fields.Char(default="Unknown")
last_seen = fields.Datetime("Last Seen", default=lambda self: fields.Datetime.now())
last_seen = fields.Datetime("Last Seen", default=fields.Datetime.now)
The ``name`` field will have the value 'Unknown' by default while the ``last_seen`` field will be
set as the current time.