Compare commits

..

2 Commits

Author SHA1 Message Date
Jonathan Castillo (jcs)
ce49dc81c9 [MOV] live chat: structure
task-3269837
2023-04-11 15:45:59 +02:00
Jonathan Castillo (jcs)
08c192e226 [MOV] website: structure
As a first step to update the doc - at last! - we first need to update
its structure.

task-3269837
2023-04-11 15:45:59 +02:00
54 changed files with 802 additions and 1222 deletions

View File

@@ -13,7 +13,7 @@ personal email address or an address created by a custom domain.
.. seealso::
- :doc:`/applications/general/auth/azure`
- :doc:`/applications/productivity/calendar/outlook`
- :doc:`/applications/general/calendars/outlook/outlook_calendar`
Setup in Microsoft Azure Portal
===============================

View File

@@ -13,7 +13,7 @@ email address or an address created by a custom domain.
.. seealso::
- :doc:`/applications/general/auth/google`
- :doc:`/applications/productivity/calendar/google`
- :doc:`/applications/general/calendars/google/google_calendar_credentials`
Setup in Google
===============

View File

@@ -174,9 +174,8 @@ Do the same for all the sales taxes that the company needs, either those that co
Odoo, or those that you add that are necessary for your company bill.
.. tip::
For the 0% VAT tax, select the option :guilabel:`Tasa` within the :guilabel:`Factor Type` field.
For the 0% VAT **exempt** tax, select the option :guilabel:`Exento` instead of :guilabel:`Tasa`
within the :guilabel:`Factor Type` field.
For the 0% VAT tax, select the option *Exento* instead of *Tasa* within the **Factor Type**
field.
When registering a payment, Odoo will carry out the movement of taxes from the **Cash Basis
Transition Account** to the account set in the **Definition** tab. For such movement, a tax base

View File

@@ -10,5 +10,6 @@ Miscellaneous
general/export_import_data
general/email_communication
general/voip
general/calendars
general/in_app_purchase
general/developer_mode

View File

@@ -6,5 +6,5 @@ Due to specific requirements in Azure's OAuth implementation, Microsoft Azure OA
is NOT compatible with Odoo at the moment.
.. seealso::
- :doc:`../../productivity/calendar/outlook`
- :doc:`/applications/general/calendars/outlook/outlook_calendar`
- :doc:`/administration/maintain/azure_oauth`

View File

@@ -9,7 +9,7 @@ This is particularly helpful if your organization uses Google Workforce and you
within your organization to connect to Odoo with their Google Accounts.
.. seealso::
- :doc:`../../productivity/calendar/google`
- :doc:`/applications/general/calendars/google/google_calendar_credentials`
- :doc:`/administration/maintain/google_oauth`
.. _google-sign-in/configuration:

View File

@@ -0,0 +1,11 @@
:nosearch:
=========
Calendars
=========
.. toctree::
:titlesonly:
calendars/outlook/outlook_calendar
calendars/google/google_calendar_credentials

View File

@@ -1,6 +1,6 @@
===============================
Google Calendar synchronization
===============================
=====================================
Synchronize Google Calendar with Odoo
=====================================
Synchronize Google Calendar with Odoo to see and manage meetings from both platforms (updates go
in both directions). This integration helps organize your schedule so you never miss a meeting.
@@ -25,7 +25,7 @@ Begin by creating a new Google API project and enabling the Google Calendar API.
Next, click :guilabel:`Select a project` and select or create an API project to store credentials.
.. image:: google/new-api-project.png
.. image:: google_calendar_credentials/new-api-project.png
:align: center
:alt: Create a new API project to store credentials.
@@ -34,14 +34,14 @@ Next, click :guilabel:`Select a project` and select or create an API project to
Then, open the API Project and click :guilabel:`Enable APIs and Services`.
.. image:: google/enable-apis-services.png
.. image:: google_calendar_credentials/enable-apis-services.png
:align: center
:alt: Enable APIs and Services on the API Project.
After that, search for *Google Calendar API* using the search bar and select :guilabel:`Google
Calendar API` from the search results. Click :guilabel:`Enable`.
.. image:: google/enable-google-cal-api.png
.. image:: google_calendar_credentials/enable-google-cal-api.png
:align: center
:alt: Enable the Google Calendar API.
@@ -55,7 +55,7 @@ four steps to create your API credentials.
- In the first step, :guilabel:`Credential Type`, select the :guilabel:`Google Calendar API` and
:guilabel:`User Data` options. Then, click :guilabel:`Next`.
.. image:: google/credential-type.png
.. image:: google_calendar_credentials/credential-type.png
:align: center
:alt: Select Google Calendar API and User Data for the Credential Type.
@@ -76,7 +76,7 @@ four steps to create your API credentials.
your company's Odoo URL address followed by */google_account/authentication*. Finally, click
:guilabel:`Create` and :guilabel:`Done`.
.. image:: google/uri.png
.. image:: google_calendar_credentials/uri.png
:align: center
:alt: Add the authorized JavaScript origins and the authorized redirect URIs.
@@ -94,7 +94,7 @@ Next, locate the credentials you just created for the Google Calendar API. Then,
:guilabel:`Edit OAuth Client` (the pencil icon). The page will redirect to the edit page, where you
can view the Client ID and the Client Secret.
.. image:: google/edit-oauth-2.png
.. image:: google_calendar_credentials/edit-oauth-2.png
:align: center
:alt: Click Edit OAuth Client to view the credential details.
@@ -105,7 +105,7 @@ Once the Client ID and the Client Secret are located, open the Odoo database and
:menuselection:`Settings --> General Settings --> Integrations --> Google Calendar`. Check the box
next to :guilabel:`Google Calendar`.
.. image:: google/settings-google-cal.png
.. image:: google_calendar_credentials/settings-google-cal.png
:align: center
:alt: The Google Calendar checkbox in General Settings.
@@ -116,7 +116,7 @@ page into their respective fields below the :guilabel:`Google Calendar` checkbox
Finally, open the Calendar module in Odoo and click on the :guilabel:`Google` sync button to sync
Google Calendar with Odoo.
.. image:: google/sync-google.png
.. image:: google_calendar_credentials/sync-google.png
:align: center
:alt: Click the Google sync button in Odoo Calendar to sync Google Calendar with Odoo.
@@ -124,12 +124,12 @@ Google Calendar with Odoo.
The first time you sync your Google Calendar with Odoo, the page will redirect to your Google
Account. Click :guilabel:`OK` and :guilabel:`Allow` to authorize Odoo to access Google Calendar.
.. image:: google/trust-odoo.png
.. image:: google_calendar_credentials/trust-odoo.png
:align: center
:alt: Give Odoo permission to access Google Calendar.
Now, Odoo Calendar is successfully synced with Google Calendar!
.. image:: google/successful-sync.png
.. image:: google_calendar_credentials/successful-sync.png
:align: center
:alt: Successfully sync between Odoo and Google Calendar.

View File

@@ -1,6 +1,6 @@
================================
Outlook Calendar synchronization
================================
======================================
Synchronize Outlook Calendar with Odoo
======================================
Synchronizing a user's Outlook Calendar with Odoo is useful for keeping track of their tasks and
appointments across all related applications.
@@ -33,7 +33,7 @@ URI (URL) followed by `/microsoft_account/authentication`.
Enter `https://www.companyname.odoo.com/microsoft_account/authentication` for the
:guilabel:`Redirect URI`.
.. image:: outlook/azure-register-application.png
.. image:: outlook_calendar/azure-register-application.png
:align: center
:alt: The "Supported account type" and "Redirect URI" settings in the Microsoft Azure AD portal.
@@ -58,27 +58,27 @@ Configuration in Odoo
In the Odoo database, go to :menuselection:`Settings --> General Settings --> Integrations` and
activate the :guilabel:`Outlook Calendar` setting.
.. image:: outlook/outlook-calendar-setting.png
.. image:: outlook_calendar/outlook-calendar-setting.png
:align: center
:alt: The "Outlook Calendar" setting activated in Odoo.
From the Microsoft Azure portal, under the :guilabel:`Overview` section of the application, copy
the :guilabel:`Application (Client) ID`, and paste it into the :guilabel:`Client ID` field in Odoo.
.. image:: outlook/client-id.png
.. image:: outlook_calendar/client-id.png
:align: center
:alt: The "Client ID" in the Microsoft Azure portal.
In the Microsoft Azure portal, under the :guilabel:`Certificates & secrets` section, copy the
:guilabel:`Client Secret Value` and paste it into the :guilabel:`Client Secret` field in Odoo.
.. image:: outlook/client-secret-value.png
.. image:: outlook_calendar/client-secret-value.png
:align: center
:alt: The "Client Secret" token to be copied from Microsoft to Odoo.
Finally, on the Odoo :menuselection:`Settings --> General Settings` page, click :guilabel:`Save`.
.. _outlook/sync:
.. _outlook_calendar/sync_with_outlook:
Sync with Outlook
=================
@@ -125,7 +125,7 @@ In the Odoo database, go to the :guilabel:`Calendar` module and click the :guila
button. The page will redirect to a Microsoft login page, and the user is asked to log in to
their account, if they are not already, and grant the required permissions.
.. image:: outlook/outlook-sync-button.png
.. image:: outlook_calendar/outlook-sync-button.png
:align: center
:alt: The "Outlook" sync button in Odoo Calendar.
@@ -134,11 +134,11 @@ The synchronization is a two-way process, meaning that events are reconciled in
.. note::
All users that want to use the synchronization simply need to :ref:`sync their calendar with
Outlook <outlook/sync>`. The configuration of Microsoft's Azure account
Outlook <outlook_calendar/sync_with_outlook>`. The configuration of Microsoft's Azure account
is only done once, as Azure AD tenants' Client IDs and Client Secrets are unique, and represent
an organization that helps the user to manage a specific instance of Microsoft cloud services
for their internal and external users.
.. seealso::
- :doc:`../../sales/crm/optimize/outlook_extension`
- :doc:`google`
- :doc:`../../../sales/crm/optimize/outlook_extension`
- :doc:`../google/google_calendar_credentials`

View File

@@ -1,125 +1,45 @@
=================================================
Consignment: buy and sell stock without owning it
=================================================
===============================
Manage Stock that you don't own
===============================
Most of the time, products stored in a company's warehouse are either purchased from suppliers, or
are manufactured in-house. However, suppliers will sometimes let companies store and sell products
in the company's warehouse, without having to buy those items up-front. This is called
*consignment*.
Sometimes, suppliers can offer you to store and sell products without
having to buy those items. This technique is called *consignee stock*.
Consignment is a useful method for suppliers to launch new products, and easily deliver to their
customers. It's also a great way for the company storing the products (the consignee) to earn
something back for their efforts. Consignees can even charge a fee for the convenience of storing
products they don't actually own.
Consignee stock is a great way for manufacturers and suppliers to launch
new products. As resellers may be reluctant to buy a product they are
not sure to be able to sell, consignee stock will allow them to offer an
item to check its market without having to pay for it in the first
place.
Enable the consignment setting
==============================
Of course, Odoo has the ability to manage those consignee stocks through
advanced settings.
To receive, store, and sell consignment stock, the feature needs to be enabled in the settings. To
do this, go to :menuselection:`Inventory --> Configuration --> Settings`, and under the
:guilabel:`Traceability` section, check the box next to :guilabel:`Consignment`, and then click
:guilabel:`Save` to finish.
Configuration
=============
.. image:: owned_stock/owned-stock-enable-consignment.png
:align: center
:alt: Enabled Consignment setting in Inventory configuration.
To use this feature, go to :menuselection:`Inventory --> Configuration --> Settings` in
the inventory app. Then, enable the *Consignment* feature in the
*Traceability* section. Now, hit save.
Receive (and store) consignment stock
=====================================
.. image:: owned_stock/owned_stock_01.png
:align: center
With the feature enabled in Odoo, consignment stock can now be received into a warehouse. From the
main :menuselection:`Inventory` dashboard, click into the :guilabel:`Receipts`
section. Then, click :guilabel:`Create`.
Reception of Consignee Stock
============================
When in the *Inventory* app, open the receipts and create a new
reception. On the right side, you will see that a new line called
*Assign Owner* has appeared. There, you can specify the partner which
owns the stock.
.. image:: owned_stock/owned_stock_02.png
:align: center
.. note::
Consignment stock is not actually purchased from the vendor; it is simply received and stored.
Because of this, there are no quotations or purchase orders involved in receiving consignment
stock. So, *every* receipt of consignment stock will start by creating manual receipts.
If you are the owner, you can leave the field blank.
Choose a vendor to enter in the :guilabel:`Receive From` field, and then choose the same vendor to
enter in the :guilabel:`Assign Owner` field.
Once the receipt is validated, the products enter your stock but still
belong to the owner. They dont impact your inventory valuation.
.. important::
Since the products received from the vendor will be owned by the same vendor, the
:guilabel:`Receive From` and :guilabel:`Assign Owner` fields must match.
Once the vendor-related fields are set, enter products into the :guilabel:`Product` lines, and set
the quantities to be received into the warehouse under the :guilabel:`Done` column. If the
:guilabel:`Units of Measure` feature is enabled, the :abbr:`UoM (Units of Measure)` can be changed,
as well. Once all the consignment stock has been received, :guilabel:`Validate` the receipt.
.. image:: owned_stock/owned-stock-receipt-fields.png
:align: center
:alt: Matching vendor fields in consignment Receipt creation.
Sell and deliver consignment stock
==================================
Once consignment stock has been received into the warehouse, it can be sold the same as any other
in-stock product that has the :guilabel:`Can Be Sold` option enabled on the product form.
To create a sales order, navigate to the :menuselection:`Sales` app, and from the
:guilabel:`Quotations` overview, click :guilabel:`Create`. Next, choose a customer to enter into the
:guilabel:`Customer` field.
.. note::
The :guilabel:`Customer` *must* be different from the :guilabel:`Vendor` that supplied the
consignment stock received (and stored) in the warehouse.
Add the consignment product under the :guilabel:`Product` column in the order lines, set the
:guilabel:`Quantity`, and fill out any other pertinent product details on the form. Once the
quotation is complete, click :guilabel:`Confirm`.
.. image:: owned_stock/owned-stock-sales-order.png
:align: center
:alt: Sales order of consignment stock.
Once the :abbr:`RFQ (Request for Quotation)` has been confirmed, it will become a sales order. From
here, the products can be delivered by clicking on the :guilabel:`Delivery` smart button, and
selecting :guilabel:`Validate` to validate the delivery.
Traceability and reporting of consignment stock
===============================================
Although consignment stock is owned by the vendor who supplied it, and not by the company storing it
in their warehouse, consignment products will *still* appear in certain inventory reports.
To find inventory reports, go to :menuselection:`Inventory --> Reporting`, and choose a report to
view.
.. note::
Since the consignee does not actually own consigment stock, these products are *not* reflected
in the :guilabel:`Stock Valuation` report, and have no impact on the consignee's inventory
valuation.
Product moves report
--------------------
To view all information about on-hand stock moves, navigate to the the :guilabel:`Product Moves`
dashboard by going to :menuselection:`Inventory --> Reporting --> Product Moves`. For consignment
products, the information in this report is the same as any other product: the history
of its product moves can be reviewed; the :guilabel:`Quantity Done` and :guilabel:`Reference`
document are available; and its :guilabel:`Locations` are available, as well. The consignment stock
will originate from :guilabel:`Partner Location/Vendors`.
.. tip::
To view a consignment product's moves by ownership, select the :guilabel:`Group By` filter,
choose the :guilabel:`Add Custom Group` parameter, and then select :guilabel:`From Owner`, and
:guilabel:`Apply` to finish.
.. image:: owned_stock/owned-stock-moves-history.png
:align: center
:alt: Consignment stock moves history.
.. tip::
To see forecasted units of consignment stock, go to :menuselection:`Inventory --> Reporting -->
Forecasted Inventory`.
Stock on hand report
--------------------
View the :guilabel:`Stock On Hand` dashboard by navigating to :menuselection:`Inventory -->
Reporting --> Inventory Report`. From this report, the :guilabel:`Locations` of all stock on-hand
are displayed, in addition to the quantities per location. For consigment products, the
:guilabel:`Owner` column will be populated with the owner of those products, or the original vendor
who supplied the products in the first place.
.. image:: owned_stock/owned_stock_03.png
:align: center

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

View File

@@ -8,6 +8,5 @@ Productivity
.. toctree::
productivity/discuss
productivity/calendar
productivity/iot
productivity/studio

View File

@@ -1,11 +0,0 @@
:nosearch:
========
Calendar
========
.. toctree::
:titlesonly:
calendar/outlook
calendar/google

View File

@@ -10,6 +10,5 @@ Configuration
config/connect
config/pos
config/https_certificate_iot
config/flash_sdcard
config/troubleshooting

View File

@@ -1,260 +0,0 @@
.. _iot/https_certificate_iot:
=======================
HTTPS certificate (IoT)
=======================
What is HTTPS?
==============
*Hypertext Transfer Protocol Secure* (HTTPS) is the secure version of *Hypertext Transfer Protocol*
(HTTP), which is the primary protocol used to send data back and forth between a web browser and a
website. :abbr:`HTTPS (Hypertext Transfer Protocol Secure)` is encrypted in order to increase the
security of data transfer.
:abbr:`HTTPS (Hypertext Transfer Protocol Secure)` uses an encryption protocol to encrypt
communications. The protocol is called *Transport Layer Security* (TLS), although formerly it was
known as *Secure Sockets Layer* (SSL).
:abbr:`HTTPS (Hypertext Transfer Protocol Secure)` occurs based upon the transmission of :abbr:`TLS
(Transport Layer Security)`/:abbr:`SSL (Secure Sockets Layer)` certificates, which verify that a
particular provider is who they say they are.
.. note::
In this documentation and throughout Odoo the term "HTTPS certificate" will be used to define the
fact that the :abbr:`SSL (Secure Sockets Layer)` certificate is valid and allows a :abbr:`HTTPS
(Hypertext Transfer Protocol Secure)` connection.
Why is it needed?
-----------------
In order to communicate with certain network devices (in particular for payment terminals), the
usage of :abbr:`HTTPS (Hypertext Transfer Protocol Secure)` is mandatory. If the :abbr:`HTTPS
(Hypertext Transfer Protocol Secure)` certificate isn't valid, some devices won't be able to
interact with the :abbr:`IoT (Internet of Things)` Box.
How to obtain a Hypertext Transfer Protocol Secure (HTTPS) certificate
======================================================================
The generation of the :abbr:`HTTPS (Hypertext Transfer Protocol Secure)` certificate is automatic.
The :abbr:`IoT (Internet of Things)` Box will send a specific request to `<https://www.odoo.com>`_
which will send back the :abbr:`HTTPS (Hypertext Transfer Protocol Secure)` certificate if the
:abbr:`IoT (Internet of Things)` box and database are eligible.
.. _iot/iot-eligibility:
Internet of Things (IoT) eligibility
------------------------------------
#. The database should be a **production** instance. The database instance should not be a copy, a
duplicate, a staging, or a development environment.
#. The Odoo subscription must:
- Have an :guilabel:`IoT Box Subscription` line.
- :guilabel:`Status` must be :guilabel:`In Progress`.
If the subscription is linked to a `<https://www.odoo.com>`_ portal user check the information
on the portal subscription page.
.. figure:: https_certificate_iot/sub-example-in-progress.png
:align: center
:alt: Odoo.com portal subscriptions filtered by "in progress".
In this case, both subscriptions are considered "in progress" as the :guilabel:`Filter By\:
In Progress` was used.
.. note::
If the subscription is in question, contact the database's Account Manager or Partner
regarding the matter.
Troubleshooting Hypertext Transfer Protocol Secure (HTTPS) certificate errors
=============================================================================
If anything goes wrong during the process of the "HTTPS certificate" generation or reception, a
specific error will code be given on the :abbr:`IoT (Internet of Things)` box home page.
.. tip::
Accessing the :abbr:`IoT (Internet of Things)` box homepage will check for the presence of the
"HTTPS certificate" and will attempt its generation if it is missing. As such, if there is an
error on the :abbr:`IoT (Internet of Things)` box home page, refresh the :abbr:`IoT (Internet of
Things)` home page to see if the error disappears.
`ERR_IOT_HTTPS_CHECK_NO_SERVER`
-------------------------------
Reason:
The configuration regarding the server is missing. In other words, the Odoo instance is not
connected with the IoT box.
Solution:
Ensure that the server is configured.
.. seealso::
:doc:`/applications/productivity/iot/config/connect`
`ERR_IOT_HTTPS_CHECK_CERT_READ_EXCEPTION`
-----------------------------------------
Reason:
An unhandled error happened when trying to read the existing :abbr:`HTTPS (Hypertext Transfer
Protocol Secure)` certificate.
Solution:
Ensure that the :abbr:`HTTPS (Hypertext Transfer Protocol Secure)` certificate file is readable.
`ERR_IOT_HTTPS_LOAD_NO_CREDENTIAL`
----------------------------------
Reason:
The contract and/or database :abbr:`UUID (Universal Unique Identifier)` is missing.
Solution:
Ensure that both values are configured as intended. To modify them, go to the :abbr:`IoT
(Internet of Things)` box home page, and navigate to :guilabel:`Credential`.
`ERR_IOT_HTTPS_LOAD_REQUEST_EXCEPTION`
--------------------------------------
Reason:
An unexpected error happened when the :abbr:`IoT (Internet of Things)` box tried to reach
`<https://www.odoo.com>`_. The causes are likely due to the network
infrastructure/configuration:
- The :abbr:`IoT (Internet of Things)` box does not have access to internet.
- The network does not allow the :abbr:`IoT (Internet of Things)` box to communicate with
`<https://www.odoo.com>`_. This may be due to network devices preventing the communication
(firewalls, etc.) or the network configuration (:abbr:`VPN (Virtual Private Network)`,
etc.).
.. note::
More information regarding the error that occurred can be found in the full request
exception details, which are in the :abbr:`IoT (Internet of Things)` box logs.
Solution:
.. warning::
Consult with your system or network administrator should this issue arise. This error code
depends on the network infrastructure and goes beyond :doc:`Odoo support's service scope
</services/support/what_can_i_expect>`.
`ERR_IOT_HTTPS_LOAD_REQUEST_STATUS`
-----------------------------------
Reason:
The IoT-box was able to reach `<https://www.odoo.com>`_ but received an unusual
`HTTP response (status codes)
<https://developer.mozilla.org/en-US/docs/Web/HTTP/Status>`_.
This error code will also give the HTTP response status codes. For example, if the error reads
`ERR_IOT_HTTPS_LOAD_REQUEST_STATUS 404` it means that the page returned a 404 error, which is
the "Page Not Found" code.
Solution:
Check if `<https://www.odoo.com>`_ is down using a web browser, as it's possible that it is down
due to maintenance.
- If `<https://www.odoo.com>`_ is down due to maintenance, unfortunately there is nothing that
can be done but instead wait for it to recover.
- If `<https://www.odoo.com>`_ is not down due to maintenance, open a `support ticket
<https://www.odoo.com/help>`_ on the matter. Ensure that the 3 digits status code next to the
code error is included in the support ticket.
`ERR_IOT_HTTPS_LOAD_REQUEST_NO_RESULT`
--------------------------------------
Reason:
The :abbr:`IoT (Internet of Things)` box was able to reach `<https://www.odoo.com>`_ but it
refused to deliver the :abbr:`HTTPS (Hypertext Transfer Protocol Secure)` certificate.
Solution:
Ensure that the :abbr:`IoT (Internet of Things)` box and database are eligible for a
certificate: :ref:`Internet of Things (IoT) eligibility <iot/iot-eligibility>`.
How to ensure that the HTTPS certificate is correct
===================================================
If the certificate has been applied successfully, a new :abbr:`HTTPS (Hypertext Transfer Protocol
Secure)` :abbr:`URL (Uniform Resource Locator)` for the :abbr:`IoT (Internet of Things)` box ending
with `.odoo-iot.com` will appear on the Odoo database, inside of the :menuselection:`IoT`
application on that specific device's form.
.. image:: https_certificate_iot/odoo-new-domain.png
:align: center
:alt: Odoo IoT app IoT box with .odoo-iot.com domain.
When navigating to the :abbr:`URL (Uniform Resource Locator)` in a browser a secured :abbr:`HTTPS
(Hypertext Transfer Protocol Secure)` connection will be established.
.. figure:: https_certificate_iot/secured-connection.png
:align: center
:alt: Example of valid SSL certificate details on the browser.
Padlock in Chrome on Windows 10 attesting the fact that the connection is secured in :abbr:`HTTPS
(Hypertext Transfer Protocol Secure)`.
The IoT-box homepage will now display an `OK` status next to `HTTPS certificate`. The
drop-down menu icon, when clicked, will reveal information regarding the certificate.
.. image:: https_certificate_iot/status-ok.png
:align: center
:alt: IoT box homepage with HTTPS certificate OK status.
Domain Name System (DNS) issue
==============================
If the :abbr:`IoT (Internet of Things)` box can be accessed from its :abbr:`IP (Intrernet Protocol)`
address but not the Odoo assigned domain: `.odoo-iot.com`; then the :abbr:`IoT (Internet of Things)`
box is likely running into a :abbr:`DNS (Domain Name System)` issue. On some browsers, it will give
an error code mentioning :abbr:`DNS (Domain Name System)` (like `DNS_PROBE_FINISHED_NXDOMAIN`).
These :abbr:`DNS (Domain Name System)` issues may appear as the following in different browsers:
.. tabs::
.. tab:: Chrome
.. figure:: https_certificate_iot/dns-chrome.png
:align: center
:alt: DNS issue on Chrome browser on Windows 10.
DNS issue on Chrome browser on Windows 10.
.. tab:: Firefox
.. figure:: https_certificate_iot/dns-firefox.png
:align: center
:alt: DNS issue on Firefox browser on Windows 10.
DNS issue on Firefox browser on Windows 10.
.. tab:: Edge
.. figure:: https_certificate_iot/dns-edge.png
:align: center
:alt: DNS issue on Edge browser on Windows 10.
DNS issue on Edge browser on Windows 10.
Domain Name System (DNS) issue solution
---------------------------------------
#. Should the router allow the :abbr:`DNS (Domain Name System)` to be manually changed, change the
DNS to use `Google DNS <https://developers.google.com/speed/public-dns>`_.
#. If your router doesn't allow for this, then a change will need to be made on the :abbr:`DNS
(Domain Name System)` settings of each of the devices using `Google DNS
<https://developers.google.com/speed/public-dns>`_. This will need to occur on **every** device
that plans to interact with the :abbr:`IoT (Internet of Things)` box (e.g. computer, tablet or
phone). The individual device configuration processes can be found on the website of the
device's manufacturer.
.. note::
Other :abbr:`IoT (Internet of Things)` devices such as payment terminals likely won't need
their :abbr:`DNS (Domain Name System)` settings changed as they are already configured with
custom :abbr:`DNS (Domain Name System)`.
.. warning::
Consult with your system or network administrator should this issue arise. This error code
depends on the network infrastructure, and it goes beyond :doc:`Odoo support's service scope
</services/support/what_can_i_expect>`.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -3,7 +3,6 @@
from docutils import nodes
from docutils.parsers.rst.directives import admonitions
from sphinx.locale import admonitionlabels
from sphinx.util.docutils import SphinxRole
class example(nodes.Admonition, nodes.Element):
@@ -22,35 +21,6 @@ class Exercise(admonitions.BaseAdmonition):
node_class = exercise
class Dfn(SphinxRole):
""" Overwrite the `dfn` role to use custom HTML. """
def run(self):
""" Process the content of the role.
We use custom node classes to represent the `span`s rather than the corresponding
sphinx.nodes.* class to prevent automatically setting the name of the node as class (e.g.,
"container") on the element.
"""
outer_span = DfnSpan(classes=['dfn'])
inner_span = DfnSpan()
outer_span.append(inner_span)
text = nodes.Text(self.text)
inner_span.append(text)
return [outer_span], []
class DfnSpan(nodes.General, nodes.Element):
@staticmethod
def visit(translator, node):
translator.body.append(translator.starttag(node, 'span').rstrip())
@staticmethod
def depart(translator, node):
translator.body.append('</span>')
def setup(app):
app.add_directive('example', Example)
app.add_node(example, html=(
@@ -62,8 +32,6 @@ def setup(app):
lambda self, node: self.visit_admonition(node, 'exercise'),
lambda self, node: self.depart_admonition(node),
))
app.add_role('dfn', Dfn(), override=True)
app.add_node(DfnSpan, html=(DfnSpan.visit, DfnSpan.depart))
return {
'parallel_read_safe': True,

View File

@@ -59,11 +59,15 @@
deepestActiveTocEntries.push(lastTocEntry);
}
deepestActiveTocEntries.forEach(deepestTocEntry => {
let tocEntryToHighlight;
const childTocEntryList = deepestTocEntry.querySelector('ul');
if (childTocEntryList) { // The TOC entry has an associated TOC entry list.
tocEntryToHighlight = deepestTocEntry;
childTocEntryList.classList.add('show');
} else { // The TOC entry is at the last level of its branch.
tocEntryToHighlight = deepestTocEntry.parentElement.parentElement;
}
deepestTocEntry.classList.add('o_deepest_active_toc_entry');
tocEntryToHighlight.classList.add('o_deepest_active_toc_entry');
});
return deepestActiveTocEntries;
};

View File

@@ -4,78 +4,63 @@ let tocEntryListId = 0; // Used to generate IDs of toc entry lists for both the
* Update the provided TOC to allow collapsing its entries with Bootstrap's accordion.
*
* The typical structure of a TOC menu is a follows:
* <ul>
* <li>
* <a name="heading_without_children" href="something.html">Something</a>
* </li>
* <li>
* <a name="non-clickable_heading_with_children" href="#">Something</a>
* <ul>...</ul>
* </li>
* <li>
* <a name="clickable_heading_with_children" href="something.html">Something</a>
* <ul>...</ul>
* </li>
* </ul>
* <ul><li>
* <a href="#"/>
* <ul>
* <li><a href="#heading_without_child"/></li>
* <li>
* <a href="#heading_with_children"/>
* <ul>...</ul>
* </li>
* </ul>
* </li></ul>
*
* Since a <ul> is always preceded by a <a>, and since we only need to make change to <a>
* elements followed by a <ul>, we simply loop on <ul> elements to access all parts of the DOM
* that need to be modified.
*
* The final structure must look like this:
* <ul>
* <!-- Unchanged -->
* <li>
* <a name="heading_without_children" href="something.html">Something</a>
* </li>
* <!-- Create a <div>; append <i> and <a> to <div>; set BS target on <a> and <i>; set id on <ul> -->
* <li>
* <div class="o_toc_entry_wrapper">
* <i class="i-chevron-right" data-bs-target="#o_target_123" data-bs-toggle="collapse"/>
* <a name="non-clickable_heading_with_children" href="#" data-bs-target="#o_target_123>" data-bs-toggle="collapse">Something</a>
* </div>
* <ul id="o_target_123" class="collapse">...</ul>
* </li>
* <!-- Create a <div>; append <i> and <a> to <div>; set BS target on only <i> to let the <a> redirect; set id on <ul> -->
* <li>
* <div class="o_toc_entry_wrapper">
* <i class="i-chevron-right" data-bs-target="#o_target_456" data-bs-toggle="collapse"/>
* <a name="clickable_heading_with_children" href="something.html">Something</a>
* </div>
* <ul id="o_target_456" class="collapse">...</ul>
* </li>
*</ul>
* <ul><li>
* <!-- Only <a> element with empty href must expand/collapse on click -->
* <a href="#" data-bs-target="#o_target_{id}>" data-bs-toggle="collapse"/>
* <ul>
* <li><a href="#heading_without_child"/></li>
* <li>
* <div class="o_toc_entry_wrapper">
* <i class="i-chevron-right" data-bs-target="#o_target_{id}" data-bs-toggle="collapse"/>
* <a href="#heading_with_children"/>
* </div>
* <ul id="o_target_{id}" class="collapse">...</ul>
* </li>
* </ul>
* </li></ul>
*
* @param {HTMLElement} tocElement - The element containing the TOC.
* @param {HTMLElement} tocElement - The element containing the TOC
*/
const _prepareAccordion = (tocElement) => {
// Start at the second TOC entry list (<ul>) to avoid collapsing the entire TOC.
// Start at the second TOC entry list (<ul>) to avoid collapsing the entire TOC
const tocRoot = tocElement.querySelector('ul');
tocRoot.querySelectorAll('ul').forEach(tocEntryList => {
// Modify the <ul> element.
// Modify the <ul> element
tocEntryList.id = `o_target_${tocEntryListId++}`;
tocEntryList.classList.add('collapse');
// Modify the <a> element only if it has no href; otherwise, let the redirection happen.
// Create and configure an <i> element
const arrowButton = document.createElement('I');
arrowButton.setAttribute('data-bs-target', `#${tocEntryList.id}`);
arrowButton.setAttribute('data-bs-toggle', 'collapse');
arrowButton.classList.add('i-chevron-right');
// Modify the <a> element (only if it has no href, otherwise let the redirection happen)
const relatedHeadingRef = tocEntryList.previousSibling;
if (relatedHeadingRef.getAttribute('href') === '#') {
relatedHeadingRef.setAttribute('data-bs-target', `#${tocEntryList.id}`);
relatedHeadingRef.setAttribute('data-bs-toggle', 'collapse');
}
// Create and configure a <div> element.
// Create a <div> element
const tocEntryWrapper = document.createElement('DIV');
tocEntryWrapper.classList.add('o_toc_entry_wrapper');
tocEntryList.parentElement.insertBefore(tocEntryWrapper, tocEntryList);
// Create and configure an <i> element.
const arrowButton = document.createElement('I');
arrowButton.setAttribute('data-bs-target', `#${tocEntryList.id}`);
arrowButton.setAttribute('data-bs-toggle', 'collapse');
arrowButton.classList.add('i-chevron-right');
// Insert the <i> and <a> elements inside the <div>.
// Insert the <i> and <a> elements inside the <div> and prepend the <div> to the <ul>
tocEntryWrapper.append(arrowButton, relatedHeadingRef);
tocEntryList.parentNode.insertBefore(tocEntryWrapper, tocEntryList);
});
};

View File

@@ -64,10 +64,19 @@
}
}
@mixin o-content-tab-selected {
font-weight: $font-weight-bolder;
border-bottom: 1px solid $white;
border-left: 1px solid $o-gray-border;
border-right: 1px solid $o-gray-border;
background: $white;
}
@mixin o-code {
display: inline-block;
overflow-wrap: anywhere;
background: $o-literals-bg;
font-size: 0.875rem;
font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
font-weight: inherit;
color: inherit;

View File

@@ -588,15 +588,15 @@ ol.upperroman {
list-style: upper-roman;
}
// :not(li) > ol > li:first-child > :first-child,
// :not(li) > ul > li:first-child > :first-child {
// margin-top: 0px;
// }
:not(li) > ol > li:first-child > :first-child,
:not(li) > ul > li:first-child > :first-child {
margin-top: 0px;
}
// :not(li) > ol > li:last-child > :last-child,
// :not(li) > ul > li:last-child > :last-child {
// margin-bottom: 0px;
// }
:not(li) > ol > li:last-child > :last-child,
:not(li) > ul > li:last-child > :last-child {
margin-bottom: 0px;
}
ol.simple ol p,
ol.simple ul p,

View File

@@ -1,3 +1,9 @@
$o-grid-breakpoint-xxl: 1400px;
$o-grid-breakpoint-xxxl: 1680px;
$o-container-max-width-xxl:1380px;
$o-container-max-width-xxxl: 1560px;
// Typography
// ===============================================
$o-font-family-serif: 'Roboto Slab', Georgia, "Times New Roman", Times, serif;
@@ -136,7 +142,7 @@ $o-codecol-width: 43%;
// Paddings and margins
$o-padding-xs: .5rem;
$o-padding-s: 1rem;
$o-padding-m: 1.5rem;
$o-padding-m: 2rem;
$o-padding-l: 3rem;
$o-margin-s: $o-padding-s;
$o-margin-m: $o-padding-m;

File diff suppressed because it is too large Load Diff

View File

@@ -10,6 +10,7 @@ from sphinx.writers.html5 import HTML5Translator
# └── Odoo Translator
ADMONITION_MAPPING = {
# The alert classes have been replaced by default BS classes to reduce number of scss lines.
'note': 'alert-primary',
'tip': 'alert-tip',
@@ -26,7 +27,7 @@ ADMONITION_MAPPING = {
'example': 'alert-success',
'exercise': 'alert-dark',
} # The alert classes have been replaced by default BS classes to reduce number of scss lines.
}
class BootstrapTranslator(HTML5Translator):

View File

@@ -35,11 +35,6 @@ applications/finance/accounting/fiscal_localizations/overview/localizations_list
applications/finance/accounting/getting_started/memento.rst applications/finance/accounting/getting_started/cheat_sheet.rst # memento -> cheat_sheet
applications/finance/accounting/payables/supplier_bills/manage.rst applications/inventory_and_mrp/purchase/manage_deals/manage.rst # (#3302)
# applications/general
applications/general/calendars/outlook/outlook_calendar.rst applications/productivity/calendar/outlook.rst # general/calendars/outlook/outlook_calendar -> productivity/calendar/outlook
applications/general/calendars/google/google_calendar_credentials.rst applications/productivity/calendar/google.rst # general/calendars/google/google_calendar_credentials -> productivity/calendar/google
# applications/inventory
applications/inventory_and_mrp/inventory/routes/concepts/inter_warehouse.rst applications/inventory_and_mrp/inventory/management/warehouses/warehouse_replenishment_transfer.rst

View File

@@ -4,10 +4,8 @@
}
table.o-showcase-table > tbody > tr.row-odd > td {
display: block;
border: 1px solid #d5d5d5;
padding: 2rem;
border-radius: 3px 3px 0 0;
}
table.o-showcase-table > tbody > tr.row-odd > td .highlight-text {
@@ -19,5 +17,4 @@ table.o-showcase-table > tbody > tr.row-even > td {
padding: 1rem;
background: #f8f8f8;
border: 0;
border-radius: 0 0 3px 3px;
}