Compare commits
29 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| aef8ed12cd | |||
| ad624afdf8 | |||
| d0ce383423 | |||
| 1f520a4907 | |||
| 92ac7ee0e6 | |||
| b747dfcbd4 | |||
| 7e23234796 | |||
| 63f88d7adb | |||
| dc4d10edbb | |||
| 8b0fca19f5 | |||
| 65a752daf6 | |||
| 9946fd4ec6 | |||
| 9794fee804 | |||
| 9dec09c9de | |||
| ab963d305d | |||
| 54d35d6cdd | |||
| 8c31ffa49e | |||
| 34a73be30c | |||
| 235b2889ec | |||
| dca01d9587 | |||
| 7a0b3a868c | |||
| 37d18858c4 | |||
| ad6843be92 | |||
| b0ede2819a | |||
| 4556487f10 | |||
| 3156e4ba04 | |||
| ba426cc9ea | |||
| 946c518039 | |||
| 8f73708332 |
@@ -247,6 +247,7 @@ languages_names = {
|
||||
'es': 'ES',
|
||||
'es_419': 'ES (LATAM)',
|
||||
'fr': 'FR',
|
||||
'id': 'ID',
|
||||
'it': 'IT',
|
||||
'ja': 'JA',
|
||||
'ko': 'KR',
|
||||
@@ -256,6 +257,7 @@ languages_names = {
|
||||
'sv': 'SV',
|
||||
'th': 'TH',
|
||||
'uk': 'UA',
|
||||
'vi': 'VI',
|
||||
'zh_CN': 'ZH (CN)',
|
||||
'zh_TW': 'ZH (TW)'
|
||||
}
|
||||
|
||||
@@ -193,3 +193,4 @@ Payments` tab. To display the outstanding accounts column, click on the toggle b
|
||||
bank/reconciliation
|
||||
bank/reconciliation_models
|
||||
bank/foreign_currency
|
||||
bank/loans
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
================
|
||||
Loans management
|
||||
================
|
||||
|
||||
Odoo's loan management gives a comprehensive list of all loans undertaken by your company in order
|
||||
to maintain a holistic and forecasted view of upcoming due dates (e.g., cash forecast). Set up
|
||||
amortization schedules—or import them—and let Odoo automatically handle monthly interest and
|
||||
principal adjustments so that your financial reports are always accurate with minimal effort.
|
||||
|
||||
Create a new loan
|
||||
-----------------
|
||||
|
||||
Create a new loan by going to :menuselection:`Accounting --> Accounting --> Loans`. When creating a
|
||||
new loan, there are three options for how to create amortization schedules:
|
||||
|
||||
- importing it from a supported file;
|
||||
- calculating it from multiple input values (e.g., the :guilabel:`Amount Borrowed`, the
|
||||
:guilabel:`Duration`, etc.) using the :guilabel:`Compute` button;
|
||||
- manually filling in the lines of the schedule.
|
||||
|
||||
In each case, three different fields are required for each line of the amortization schedule: the
|
||||
:guilabel:`Date`, the :guilabel:`Principal`, and the :guilabel:`Interest`.
|
||||
|
||||
The :guilabel:`Amount Borrowed`, :guilabel:`Interest`, and :guilabel:`Duration` fields will be red
|
||||
if the sum of the lines does not match the total of the amortization schedule lines.
|
||||
|
||||
Loan entries mechanism
|
||||
----------------------
|
||||
|
||||
When the amount borrowed is credited to a bank account, it should be transferred to a long-term
|
||||
account (defined in the :guilabel:`Loan Settings` tab). Then, upon the validation of the loan, Odoo
|
||||
creates the necessary journal entries so that there is always a holistic and forecasted view of
|
||||
upcoming due dates. The entire process is completely automated with a long-term and short-term
|
||||
principal reclassification mechanism.
|
||||
|
||||
For each line of the amortization schedule, Odoo creates the following entries:
|
||||
|
||||
A payment entry on the same date that
|
||||
- debits the principal amount to the long-term account;
|
||||
- debits the interest amount to the expense account;
|
||||
- credits the payment amount to the short-term account: this is the amount that will be
|
||||
withdrawn by the bank.
|
||||
|
||||
A reclassification entry on the same date that
|
||||
- debits the sum of the principal amounts of the next 12 months to the long-term account;
|
||||
- credits the sum of the principal amounts of the next 12 months to the short-term account.
|
||||
|
||||
A reversed entry of the reclassification entry on *the next day* that simply reverses the previous
|
||||
one.
|
||||
|
||||
With this mechanism, month after month, the short-term account is always up to date with the
|
||||
current short-term due amounts.
|
||||
|
||||
Closing a loan
|
||||
--------------
|
||||
|
||||
By default, a loan will be closed whenever its last payment entry is posted. However, it can also
|
||||
be manually closed (e.g., because it is being paid off early) by clicking on the :guilabel:`Close`
|
||||
button. A wizard will appear asking from which date the loan should be closed. All draft entries
|
||||
after this date will be deleted too.
|
||||
|
||||
A loan can also be cancelled. In that case, all entries will be deleted even if they were already
|
||||
posted.
|
||||
|
||||
Loans Analysis Report
|
||||
---------------------
|
||||
|
||||
By going to :menuselection:`Accounting --> Reporting --> Loans Analysis`, you can access a
|
||||
report with a pivot view of your ongoing loans. By default, the report shows the principal,
|
||||
interest, and total payment for each year for the loan duration.
|
||||
@@ -41,9 +41,20 @@ Generate Entries
|
||||
:ref:`generate them manually <customer_invoices/deferred/generate_manually>` by selecting the
|
||||
:guilabel:`Manually & Grouped` option instead.
|
||||
Based on
|
||||
Suppose an invoice of $1200 must be deferred over 12 months. The :guilabel:`Months`
|
||||
computation accounts for $100 each month, while the :guilabel:`Days` computation
|
||||
accounts for different amounts depending on the number of days in each month.
|
||||
Suppose an invoice of $1200 must be deferred over 12 months.
|
||||
|
||||
- The :guilabel:`Months` option accounts for $100 each month prorated to the number of days in
|
||||
that month (e.g., $50 for the first month if the :guilabel:`Start Date` is set to the 15th of
|
||||
the month).
|
||||
|
||||
- The :guilabel:`Full Months` option considers each month started to be full (e.g., $100 for the
|
||||
first month even if the :guilabel:`Start Date` is set to the 15th of the month); this means that
|
||||
with the :guilabel:`Full Months` option, a full $100 is recognized in the first partial month,
|
||||
eliminating the need for a 13th month to recognize any remainder as would be the case when using
|
||||
the :guilabel:`Months` option.
|
||||
|
||||
- The :guilabel:`Days` option accounts for different amounts depending on the number of days in
|
||||
each month (e.g., ~$102 for January and ~$92 for February).
|
||||
|
||||
.. _customer_invoices/deferred/generate_on_validation:
|
||||
|
||||
|
||||
@@ -7,20 +7,20 @@ Payments
|
||||
In Odoo, payments can either be automatically linked to an invoice or bill or be stand-alone records
|
||||
for use at a later date:
|
||||
|
||||
- If a payment is **linked to an invoice or bill**, it reduces/settles the amount due of the
|
||||
invoice. You can have multiple payments related to the same invoice.
|
||||
- If a payment is **linked to an invoice or bill**, it reduces/settles the amount due on the
|
||||
invoice. Multiple payments on the same invoice are possible.
|
||||
|
||||
- If a payment is **not linked to an invoice or bill**, the customer has an outstanding credit with
|
||||
your company, or your company has an outstanding debit with a vendor. You can use those
|
||||
outstanding amounts to reduce/settle unpaid invoices/bills.
|
||||
the company, or the company has an outstanding debit with a vendor. Those outstanding amounts
|
||||
reduce/settle unpaid invoices/bills.
|
||||
|
||||
.. seealso::
|
||||
- :doc:`Internal transfers <payments/internal_transfers>`
|
||||
- :doc:`bank/reconciliation`
|
||||
- `Odoo Tutorials: Bank Configuration
|
||||
<https://www.odoo.com/slides/slide/bank-configuration-1880>`_
|
||||
<https://www.odoo.com/slides/slide/bank-configuration-6832>`_
|
||||
|
||||
.. _payments/register:
|
||||
.. _accounting/payments/from-invoice-bill:
|
||||
|
||||
Registering payment from an invoice or bill
|
||||
===========================================
|
||||
@@ -29,11 +29,12 @@ When clicking :guilabel:`Register payment` in a customer invoice or vendor bill,
|
||||
journal entry and changes the amount due according to the payment amount. The counterpart is
|
||||
reflected in an :ref:`outstanding <bank/outstanding-accounts>` **receipts** or **payments** account.
|
||||
At this point, the customer invoice or vendor bill is marked as :guilabel:`In payment`. Then, when
|
||||
the outstanding account is reconciled with a bank statement line, the invoice or vendor bill changes
|
||||
to the :guilabel:`Paid` status.
|
||||
the outstanding account is reconciled with a bank transaction line, the invoice or vendor bill
|
||||
changes to the :guilabel:`Paid` status.
|
||||
|
||||
The information icon near the payment line displays more information about the payment. You can
|
||||
access additional information, such as the related journal, by clicking :guilabel:`View`.
|
||||
The :icon:`fa-info-circle` information icon next to the payment line displays more
|
||||
information about the payment. To access additional information, such as the related journal, click
|
||||
:guilabel:`View`.
|
||||
|
||||
.. image:: payments/information-icon.png
|
||||
:alt: See detailed information of a payment.
|
||||
@@ -41,65 +42,89 @@ access additional information, such as the related journal, by clicking :guilabe
|
||||
.. note::
|
||||
- The customer invoice or vendor bill must be in the :guilabel:`Posted` status to register the
|
||||
payment.
|
||||
- If you unreconcile a payment, it still appears in your books but is no longer linked to the
|
||||
- If a payment is unreconciled, it still appears in the books but is no longer linked to the
|
||||
invoice.
|
||||
- If you (un)reconcile a payment in a different currency, a journal entry is automatically
|
||||
- If a payment is (un)reconciled in a different currency, a journal entry is automatically
|
||||
created to post the currency exchange gains/losses (reversal) amount.
|
||||
- If you (un)reconcile a payment and an invoice having cash basis taxes, a journal entry is
|
||||
automatically created to post the cash basis tax (reversal) amount.
|
||||
- If a payment is (un)reconciled and an invoice with cash-basis taxes, a journal entry is
|
||||
automatically created to post the cash-basis tax (reversal) amount.
|
||||
|
||||
.. tip::
|
||||
- If your main bank account is set as an :ref:`outstanding account
|
||||
<bank/outstanding-accounts>`, and the payment is registered in Odoo (not through a related
|
||||
bank statement), invoices and bills are directly registered as :guilabel:`Paid`.
|
||||
If the main bank account is set as an :ref:`outstanding account
|
||||
<bank/outstanding-accounts>`, and the payment is registered in Odoo (not through a related
|
||||
bank transaction), invoices and bills are directly registered as :guilabel:`Paid`.
|
||||
|
||||
.. _accounting/payments/not-tied:
|
||||
|
||||
Registering payments not tied to an invoice or bill
|
||||
===================================================
|
||||
|
||||
When a new payment is registered via :menuselection:`Customers / Vendors --> Payments` menu, it is
|
||||
not directly linked to an invoice or bill. Instead, the account receivable or the account payable is
|
||||
When a new payment is registered via :menuselection:`Customers / Vendors --> Payments`, it is not
|
||||
directly linked to an invoice or bill. Instead, the account receivable or the account payable is
|
||||
matched with the **outstanding account** until it is manually matched with its related invoice or
|
||||
bill.
|
||||
|
||||
.. _accounting/payments/matching-invoices-bills:
|
||||
|
||||
Matching invoices and bills with payments
|
||||
-----------------------------------------
|
||||
|
||||
A blue banner appears when you validate a new invoice/bill and an **outstanding payment** exists for
|
||||
this specific customer or vendor. It can easily be matched from the invoice or bill by clicking
|
||||
:guilabel:`ADD` under :guilabel:`Outstanding Credits` or :guilabel:`Outstanding Debits`.
|
||||
A blue banner appears when validating a new invoice/bill and an **outstanding payment** exists for
|
||||
this specific customer or vendor. To match it with the invoice or bill, click :guilabel:`ADD`
|
||||
under :guilabel:`Outstanding Credits` or :guilabel:`Outstanding Debits`.
|
||||
|
||||
.. image:: payments/add-option.png
|
||||
:alt: Shows the ADD option to reconcile an invoice or a bill with a payment.
|
||||
|
||||
The invoice or bill is now marked as :guilabel:`In payment` until it is reconciled with its
|
||||
corresponding bank statement.
|
||||
corresponding bank transaction.
|
||||
|
||||
.. _payments/batch-payments:
|
||||
.. _accounting/payments/group-payments:
|
||||
|
||||
Batch payment
|
||||
-------------
|
||||
Group payments
|
||||
--------------
|
||||
|
||||
Batch payments allow you to group different payments to ease :doc:`reconciliation
|
||||
<bank/reconciliation>`. They are also useful when you deposit :doc:`checks <payments/checks>` to the
|
||||
bank or for :doc:`SEPA payments <payments/pay_sepa>`. To do so, go to :menuselection:`Accounting -->
|
||||
Customers --> Batch Payments` or :menuselection:`Accounting --> Vendors --> Batch Payments`. In the
|
||||
list view of payments, you can select and group several payments in a batch by clicking
|
||||
:menuselection:`Action --> Create Batch Payment`.
|
||||
Group payments allow combining outgoing and incoming payments from the same contact into a single
|
||||
payment to simplify the process and improve payment usability. To register a group payment:
|
||||
|
||||
#. Go to :menuselection:`Accounting --> Customers --> Invoices/Credit Notes` or
|
||||
:menuselection:`Accounting --> Vendors --> Bills/Refunds`.
|
||||
#. Select the relevant invoices/credit notes or bills/refunds linked to a specific contact.
|
||||
#. Click the :icon:`fa-cog` (:guilabel:`Action menu`) icon and select :guilabel:`Register Payment`.
|
||||
#. In the :guilabel:`Register Payment` window, select the :guilabel:`Journal`, the
|
||||
:guilabel:`Payment Method`, and the :guilabel:`Payment Date`.
|
||||
#. Enable the :guilabel:`Group Payments` option and click :guilabel:`Create payment`.
|
||||
|
||||
The invoices or bills are now marked as :guilabel:`In payment` until they are reconciled with the
|
||||
corresponding bank transactions. The credit notes or refunds are marked as :guilabel:`Paid`.
|
||||
|
||||
.. _accounting/payments/batch-payments:
|
||||
|
||||
Batch payments
|
||||
--------------
|
||||
|
||||
Batch payments allow grouping payments from multiple contacts to ease
|
||||
:doc:`reconciliation <bank/reconciliation>`. They are also useful when depositing :doc:`checks
|
||||
<payments/checks>` to the bank or for :doc:`SEPA payments <payments/pay_sepa>`. To do so, go to
|
||||
:menuselection:`Accounting --> Customers --> Batch Payments` or :menuselection:`Accounting -->
|
||||
Vendors --> Batch Payments`. In the list view of payments, to group several payments in a
|
||||
batch, select them and click :menuselection:`Action --> Create Batch Payment`.
|
||||
|
||||
.. seealso::
|
||||
- :doc:`payments/batch`
|
||||
- :doc:`payments/batch_sdd`
|
||||
|
||||
.. _payments/matching:
|
||||
.. _accounting/payments/matching:
|
||||
|
||||
Payments matching
|
||||
-----------------
|
||||
|
||||
The :guilabel:`Payments matching` tool opens all unreconciled customer invoices or vendor bills and
|
||||
allows you to process them individually, matching all payments and invoices in one place. You can
|
||||
reach this tool from the :menuselection:`Accounting Dashboard --> Customer Invoices / Vendor Bills`,
|
||||
click the drop-down menu button (:guilabel:`⋮`), and select :guilabel:`Payments Matching`, or go to
|
||||
:menuselection:`Accounting --> Accounting --> Reconciliation`.
|
||||
allows them to be processed individually, matching all payments and invoices in one place. Go to the
|
||||
:guilabel:`Accounting Dashboard`, click the :icon:`fa-ellipsis-v` (:guilabel:`dropdown menu`)
|
||||
button from the :guilabel:`Customer Invoices` or :guilabel:`Vendor Bills` journals, and select
|
||||
:guilabel:`Payments Matching`, or go to :menuselection:`Accounting --> Accounting -->
|
||||
Reconciliation`.
|
||||
|
||||
.. image:: payments/payments-journal.png
|
||||
:alt: Payments matching menu in the drop-down menu.
|
||||
@@ -107,39 +132,49 @@ click the drop-down menu button (:guilabel:`⋮`), and select :guilabel:`Payment
|
||||
.. note::
|
||||
During the :doc:`reconciliation <bank/reconciliation>`, if the sum of the debits and credits does
|
||||
not match, there is a remaining balance. This either needs to be reconciled at a later date or
|
||||
needs to be written off directly.
|
||||
written off directly.
|
||||
|
||||
.. _accounting/payments/batch-payments-matching:
|
||||
|
||||
Batch payments matching
|
||||
-----------------------
|
||||
|
||||
You can use the **batch reconciliation feature** to reconcile several outstanding payments or
|
||||
invoices simultaneously for a specific customer or vendor. Go to your **Accounting Dashboard** and
|
||||
open your **bank journal**. In the **bank reconciliation** view, select a **transaction**, and click
|
||||
the :guilabel:`Batch Payments` tab. From here, you can reconcile your
|
||||
:doc:`batch payments <payments/batch>` with your outstanding payments or invoices.
|
||||
Use the batch reconciliation feature to reconcile several outstanding payments or invoices
|
||||
simultaneously for a specific customer or vendor. Go to :menuselection:`Accounting --> Reporting -->
|
||||
Aged Receivable / Aged Payable`. All transactions that have not yet been reconciled for that
|
||||
contact are visible, and when a customer or vendor is selected, the :guilabel:`Reconcile` option is
|
||||
displayed.
|
||||
|
||||
.. image:: payments/reconcile-option.png
|
||||
:alt: The batch payment reconcile option.
|
||||
|
||||
.. _accounting/payments/partial-payment:
|
||||
|
||||
Registering a partial payment
|
||||
=============================
|
||||
|
||||
To register a **partial payment**, click :guilabel:`Register payment` from the related invoice or
|
||||
bill, and enter the amount received or paid. Upon entering the amount, a prompt appears to decide
|
||||
whether to :guilabel:`Keep open` the invoice or bill, or :guilabel:`Mark as fully paid`. Select
|
||||
:guilabel:`Keep open` and click :guilabel:`Create payment`. The invoice or bill is now marked as
|
||||
:guilabel:`Partial`. Select :guilabel:`Mark as fully paid` if you wish to settle the invoice or bill
|
||||
with a difference in the amount.
|
||||
To register a partial payment, click on :guilabel:`Register Payment` from the related invoice or
|
||||
bill. In the case of a partial payment (when the :guilabel:`Amount` paid is less than the total
|
||||
remaining amount on the invoice or the bill), the :guilabel:`Payment Difference` field displays the
|
||||
outstanding balance. There are two options:
|
||||
|
||||
.. image:: payments/payment-difference.png
|
||||
:alt: Partial payment of an invoice or bill.
|
||||
- :guilabel:`Keep open`: Keep the invoice or the bill open and mark it with a :guilabel:`Partial`
|
||||
banner;
|
||||
- :guilabel:`Mark as fully paid`: Select an account in the :guilabel:`Post Difference In` field and
|
||||
change the :guilabel:`Label` if needed. A journal entry will be created to balance the accounts
|
||||
payable or receivable with the selected account.
|
||||
|
||||
Reconciling payments with bank statements
|
||||
=========================================
|
||||
.. image:: payments/partial-payment.png
|
||||
:alt: register a partial payment
|
||||
|
||||
.. _accounting/payments/reconciling-payments:
|
||||
|
||||
Reconciling payments with bank transactions
|
||||
===========================================
|
||||
|
||||
Once a payment has been registered, the status of the invoice or bill is :guilabel:`In payment`. The
|
||||
next step is :doc:`reconciling <bank/reconciliation>` it with the related bank statement line to
|
||||
have the transaction finalized and the invoice or bill marked as :guilabel:`Paid`.
|
||||
next step is :doc:`reconciling <bank/reconciliation>` it with the related bank transaction line to
|
||||
finalize the payment workflow and mark the invoice or bill as :guilabel:`Paid`.
|
||||
|
||||
.. toctree::
|
||||
:titlesonly:
|
||||
|
||||
|
After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 4.1 KiB |
@@ -62,10 +62,10 @@ Then, to close the fiscal year:
|
||||
<accounting/reporting/aged-payable>` reports.
|
||||
- Audit all accounts, being sure to fully understand all transactions and their nature, making
|
||||
sure to include loans and fixed assets.
|
||||
- Optionally, run :ref:`payments matching <payments/matching>` to validate any open vendor bills
|
||||
and customer invoices with their payments. While this step is optional, it could assist the
|
||||
year-end closing process if all outstanding payments and invoices are reconciled, potentially
|
||||
finding errors or mistakes in the system.
|
||||
- Optionally, run :ref:`payments matching <accounting/payments/matching>` to validate any open
|
||||
vendor bills and customer invoices with their payments. While this step is optional, it could
|
||||
assist the year-end closing process if all outstanding payments and invoices are reconciled,
|
||||
potentially finding errors or mistakes in the system.
|
||||
|
||||
Next, the accountant likely verifies balance sheet items and book entries for:
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@ appropriately completed:
|
||||
- :guilabel:`Vendor`: Odoo automatically fills some information based on the vendor's registered
|
||||
information, previous purchase orders, or bills.
|
||||
- :guilabel:`Bill Reference`: add the sales order reference provided by the vendor and is used to do
|
||||
the :ref:`matching <payments/matching>` when you receive the products.
|
||||
the :ref:`matching <accounting/payments/matching>` when you receive the products.
|
||||
- :guilabel:`Auto-Complete`: select a past bill/purchase order to automatically complete the
|
||||
document. The :guilabel:`Vendor` field should be completed prior to completing this field.
|
||||
- :guilabel:`Bill Date`: is the issuance date of the document.
|
||||
|
||||
@@ -41,9 +41,20 @@ Generate Entries
|
||||
:ref:`generate them manually <vendor_bills/deferred/generate_manually>` by selecting the
|
||||
:guilabel:`Manually & Grouped` option instead.
|
||||
Based on
|
||||
Suppose a bill of $1200 must be deferred over 12 months. The :guilabel:`Months`
|
||||
computation recognizes $100 each month, while the :guilabel:`Days` computation recognizes
|
||||
different amounts depending on the number of days in each month.
|
||||
Suppose a bill of $1200 must be deferred over 12 months.
|
||||
|
||||
- The :guilabel:`Months` option accounts for $100 each month prorated to the number of days in
|
||||
that month (e.g., $50 for the first month if the :guilabel:`Start Date` is set to the 15th of
|
||||
the month).
|
||||
|
||||
- The :guilabel:`Full Months` option considers each month started to be full (e.g., $100 for the
|
||||
first month even if the :guilabel:`Start Date` is set to the 15th of the month); this means that
|
||||
with the :guilabel:`Full Months` option, a full $100 is recognized in the first partial month,
|
||||
eliminating the need for a 13th month to recognize any remainder as would be the case when using
|
||||
the :guilabel:`Months` option.
|
||||
|
||||
- The :guilabel:`Days` option accounts for different amounts depending on the number of days in
|
||||
each month (e.g., ~$102 for January and ~$92 for February).
|
||||
|
||||
.. _vendor_bills/deferred/generate_on_validation:
|
||||
|
||||
|
||||
@@ -619,9 +619,9 @@ document, an automatic validation can be set in :menuselection:`Accounting --> S
|
||||
Argentinean Localization --> Validate document in the AFIP`, considering the following levels:
|
||||
|
||||
- :guilabel:`Not available:` the verification is not done (this is the default value);
|
||||
- :guilabel:`Available:` the verification is done. In case the number is not valid it, only displays
|
||||
- :guilabel:`Available:` the verification is done. In case the number is not valid, it only displays
|
||||
a warning but still allows the vendor bill to be posted;
|
||||
- :guilabel:`Required:` the verification is done and it does not allow the user to post the vendor
|
||||
- :guilabel:`Required:` the verification is done, and it does not allow the user to post the vendor
|
||||
bill if the document number is not valid.
|
||||
|
||||
.. image:: argentina/verify-vendor-bills.png
|
||||
|
||||
@@ -136,6 +136,7 @@ Correction letter, Invalidate invoice number range), an API call is made using c
|
||||
.. note::
|
||||
- Odoo is a certified partner of Avalara Brazil.
|
||||
- You can `buy IAP credit on odoo.com <https://iap.odoo.com/iap/in-app-services/819>`_.
|
||||
- On creation, new databases receive 500 free credits.
|
||||
|
||||
Credential configuration
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
@@ -139,7 +139,7 @@ Positions`.
|
||||
The following fiscal positions are available by default:
|
||||
|
||||
- :guilabel:`Alberta (AB)`
|
||||
- :guilabel:`British Colombia (BC)`
|
||||
- :guilabel:`British Columbia (BC)`
|
||||
- :guilabel:`Manitoba (MB)`
|
||||
- :guilabel:`New Brunswick (NB)`
|
||||
- :guilabel:`Newfoundland and Labrador (NL)`
|
||||
|
||||
@@ -39,12 +39,9 @@ localization.
|
||||
- Adds the *Propuesta F29* and *Balance Tributario (8 columnas)* reports.
|
||||
* - :guilabel:`Chile - E-invoicing`
|
||||
- `l10n_cl_edi`
|
||||
- Includes all technical and functional requirements to generate and receive electronic
|
||||
invoices online based on the :abbr:`SII (Servicio de Impuestos Internos)` regulations.
|
||||
* - :guilabel:`Chile - Electronic Receipt`
|
||||
- `l10n_cl_boletas`
|
||||
- Includes all technical and functional requirements to generate and receive electronic
|
||||
invoices digitally based on the :abbr:`SII (Servicio de Impuestos Internos)` regulations.
|
||||
- Includes all technical and functional requirements to receive and generate **electronic
|
||||
receipts** and **invoices** online based on the :abbr:`SII (Servicio de Impuestos Internos)`
|
||||
regulations.
|
||||
* - :guilabel:`Electronic Exports of Goods for Chile`
|
||||
- `l10n_cl_edi_exports`
|
||||
- Includes technical and functional requirements to generate electronic invoices for exporting
|
||||
|
||||
@@ -3,23 +3,38 @@ Colombia
|
||||
========
|
||||
|
||||
.. |DIAN| replace:: :abbr:`DIAN (Dirección de Impuestos y Aduanas Nacionales)`
|
||||
.. |NIT| replace:: :abbr:`NIT (El Número de Identificación Tributaria)`
|
||||
|
||||
Odoo's Colombian localization package provides accounting, fiscal, and legal features for databases
|
||||
in Colombia – such as chart of accounts, taxes, and electronic invoicing.
|
||||
in Colombia - such as chart of accounts, taxes, and electronic invoicing. The localization has the
|
||||
following `prerequisites
|
||||
<https://micrositios.dian.gov.co/sistema-de-facturacion-electronica/que-requieres-para-factura-electronicamente/>`_
|
||||
when using the `DIAN Own Software
|
||||
<https://micrositios.dian.gov.co/sistema-de-facturacion-electronica/como-puedes-facturar-electronicamente/>`_
|
||||
solution with Odoo:
|
||||
|
||||
In addition, a series of videos on the subject is also available. These videos cover how to start
|
||||
from scratch, set up configurations, complete common workflows, and provide in-depth looks at some
|
||||
specific use cases as well.
|
||||
- Be registered in the `RUT
|
||||
<https://www.dian.gov.co/tramitesservicios/tramites-y-servicios/tributarios/Paginas/RUT.aspx>`_
|
||||
(Registro Único Tributario) with a valid |NIT|.
|
||||
- Have a valid digital signature certificate `approved by the ONAC
|
||||
<https://onac.org.co/directorio-de-acreditados/>`_.
|
||||
- `Register and get enabled
|
||||
<https://micrositios.dian.gov.co/sistema-de-facturacion-electronica/proceso-de-registro-y-habilitacion-como-facturador-electronico/>`_
|
||||
by completing the certification process required by the |DIAN|.
|
||||
|
||||
.. seealso::
|
||||
`Smart Tutorial - Colombian Localization
|
||||
<https://www.odoo.com/slides/smart-tutorial-localizacion-de-colombia-132>`_.
|
||||
- For more information on how to complete the certification process for the |DIAN| module, review
|
||||
the following `webinar <https://www.youtube.com/watch?v=l0G6iDc7NQA>`_.
|
||||
- `Smart Tutorial - Colombian Localization
|
||||
<https://www.odoo.com/slides/smart-tutorial-localizacion-de-colombia-132>`_.
|
||||
|
||||
.. _colombia/configuration:
|
||||
.. _localization/colombia/configuration:
|
||||
|
||||
Configuration
|
||||
=============
|
||||
|
||||
.. _localization/colombia/modules:
|
||||
|
||||
Modules installation
|
||||
--------------------
|
||||
|
||||
@@ -38,155 +53,148 @@ localization:
|
||||
- Default :ref:`fiscal localization package <fiscal_localizations/packages>`. This module adds
|
||||
the base accounting features for the Colombian localization: chart of accounts, taxes,
|
||||
withholdings, and identification document type.
|
||||
* - :guilabel:`Electronic invoicing for Colombia with DIAN`
|
||||
- `l10n_co_dian`
|
||||
- This module includes the features required for integration with the |DIAN| as its own
|
||||
software, and adds the ability to generate electronic invoices and support documents based on
|
||||
|DIAN| regulations.
|
||||
* - :guilabel:`Colombian - Accounting Reports`
|
||||
- `l10n_co_reports`
|
||||
- Includes accounting reports for sending certifications to suppliers for withholdings applied.
|
||||
- This module includes accounting reports for sending certifications to suppliers for
|
||||
withholdings applied.
|
||||
* - :guilabel:`Electronic invoicing for Colombia with Carvajal`
|
||||
- `l10n_co_edi`
|
||||
- This module includes the features required for integration with Carvajal, and
|
||||
generates the electronic invoices and support documents related to the vendor bills, based on
|
||||
|DIAN| regulations.
|
||||
- This module includes the features required for integration with Carvajal. Adds the ability to
|
||||
generate the electronic invoices and support documents, based on |DIAN| regulations.
|
||||
* - :guilabel:`Colombian - Point of Sale`
|
||||
- `l10n_co_pos`
|
||||
- Includes Point of Sale receipts for Colombian localization.
|
||||
- This module includes **Point of Sale** receipts for Colombian localization.
|
||||
|
||||
.. note::
|
||||
When `Colombia` is selected for a company's :guilabel:`Fiscal Localization`, Odoo automatically
|
||||
installs certain modules.
|
||||
.. _localization/colombia/configuration/company:
|
||||
|
||||
Company configuration
|
||||
---------------------
|
||||
Company information
|
||||
-------------------
|
||||
|
||||
To configure your company information, go to the :menuselection:`Contacts` app, and search for your
|
||||
company.
|
||||
To configure your company information:
|
||||
|
||||
Alternatively, activate :ref:`developer mode <developer-mode>` and navigate to
|
||||
:menuselection:`General Setting --> Company --> Update Info --> Contact`. Then, edit the contact
|
||||
form and configure the following information:
|
||||
#. Access your company's contact form:
|
||||
|
||||
- :guilabel:`Company Name`.
|
||||
- :guilabel:`Address`: Including :guilabel:`City`, :guilabel:`Department` and :guilabel:`ZIP` code.
|
||||
- :guilabel:`Identification Number`: Select the :guilabel:`Identification Type` (`NIT`, `Cédula de
|
||||
Ciudadanía`, `Registro Civil`, etc.). When the :guilabel:`Identification Type` is `NIT`, the
|
||||
:guilabel:`Identification Number` **must** have the *verification digit* at the end of the ID
|
||||
prefixed by a hyphen (`-`).
|
||||
- Go to the :guilabel:`Contacts` app and search for your company or;
|
||||
- Go to the :guilabel:`Settings` app, activate the :ref:`developer mode <developer-mode>`, and in
|
||||
the :guilabel:`Companies` section, click :guilabel:`Update Info`. Then, in the
|
||||
:guilabel:`Contact` field, click on the company name.
|
||||
|
||||
Next, configure the :guilabel:`Fiscal Information` in the :guilabel:`Sales & Purchase` tab:
|
||||
#. Configure the following information:
|
||||
|
||||
- :guilabel:`Obligaciones y Responsabilidades`: Select the fiscal responsibility for the company
|
||||
(`O-13` Gran Contribuyente, `O-15` Autorretenedor, `O-23` Agente de retención IVA, `O-47` Regimen
|
||||
de tributación simple, `R-99-PN` No Aplica).
|
||||
- :guilabel:`Gran Contribuyente`: If the company is *Gran Contribuyente* this option should be
|
||||
selected.
|
||||
- :guilabel:`Fiscal Regimen`: Select the Tribute Name for the company (`IVA`, `INC`, `IVA e INC`,
|
||||
or `No Aplica`)
|
||||
- :guilabel:`Commercial Name`: If the company uses a specific commercial name, and it needs to be
|
||||
displayed in the invoice.
|
||||
- :guilabel:`Company Name`.
|
||||
- :guilabel:`Address`: Including :guilabel:`City`, :guilabel:`Department`, and :guilabel:`ZIP`
|
||||
code.
|
||||
- :guilabel:`Identification Number`: Select the :guilabel:`Identification Type` (:guilabel:`NIT`,
|
||||
:guilabel:`Cédula de Ciudadanía`, :guilabel:`Registro Civil`, etc.). When the
|
||||
:guilabel:`Identification Type` is :guilabel:`NIT`, the
|
||||
:guilabel:`Identification Number` **must** have the *verification digit* at the end of the ID
|
||||
prefixed by a hyphen (`-`).
|
||||
|
||||
Carjaval credentials configuration
|
||||
----------------------------------
|
||||
#. Go to the :guilabel:`Sales & Purchase` tab and configure the :guilabel:`Fiscal Information`:
|
||||
|
||||
Once the modules are installed, the user credentials **must** be configured, in order to connect
|
||||
with Carvajal Web Service. To do so, navigate to :menuselection:`Accounting --> Configuration -->
|
||||
Settings` and scroll to the :guilabel:`Colombian Electronic Invoicing` section. Then, fill in the
|
||||
required configuration information provided by Carvajal:
|
||||
|
||||
- :guilabel:`Username` and :guilabel:`Password`: Username and password (provided by Carvajal) to the
|
||||
company.
|
||||
- :guilabel:`Company Registry`: Company's NIT number *without* the verification code.
|
||||
- :guilabel:`Account ID`: Company's NIT number followed by `_01`.
|
||||
- :guilabel:`Colombia Template Code`: Select one of the two available templates (`CGEN03` or
|
||||
`CGNE04`) to be used in the PDF format of the electronic invoice.
|
||||
|
||||
Enable the :guilabel:`Test mode` checkbox to connect with the Carvajal testing environment.
|
||||
|
||||
Once Odoo and Carvajal are fully configured and ready for production, deactivate the :guilabel:`Test
|
||||
mode` checkbox to use the production database.
|
||||
|
||||
.. image:: colombia/carvajal-configuration.png
|
||||
:align: center
|
||||
:alt: Configure credentials for Carvajal web service in Odoo.
|
||||
|
||||
.. important::
|
||||
:guilabel:`Test mode` must **only** be used on duplicated databases, **not** the production
|
||||
environment.
|
||||
|
||||
Report data configuration
|
||||
-------------------------
|
||||
|
||||
Report data can be defined for the fiscal section and bank information of the PDF as part of the
|
||||
configurable information sent in the XML.
|
||||
|
||||
Navigate to :menuselection:`Accounting --> Configuration --> Settings`, and scroll to the
|
||||
:guilabel:`Colombian Electronic Invoicing` section, in order to find the :guilabel:`Report
|
||||
Configuration` fields. Here the header information for each report type can be configured.
|
||||
|
||||
- :guilabel:`Gran Contribuyente`
|
||||
- :guilabel:`Tipo de Régimen`
|
||||
- :guilabel:`Retenedores de IVA`
|
||||
- :guilabel:`Autorretenedores`
|
||||
- :guilabel:`Resolución Aplicable`
|
||||
- :guilabel:`Actividad Económica`
|
||||
- :guilabel:`Bank Information`
|
||||
|
||||
.. _colombia/master-data:
|
||||
|
||||
Master data configuration
|
||||
-------------------------
|
||||
|
||||
Partner
|
||||
~~~~~~~
|
||||
|
||||
Partner contacts can be created in the *Contacts* app. To do so, navigate to
|
||||
:menuselection:`Contacts`, and click the :guilabel:`Create` button.
|
||||
|
||||
Then, name the contact, and using the radio buttons, select the contact type, either
|
||||
:guilabel:`Individual` or :guilabel:`Company`.
|
||||
|
||||
Complete the full :guilabel:`Address`, including the :guilabel:`City`, :guilabel:`State`, and
|
||||
:guilabel:`ZIP` code. Then, complete the identification and fiscal information.
|
||||
|
||||
Identification information
|
||||
**************************
|
||||
|
||||
Identification types, defined by the |DIAN|, are available on the partner form, as part of the
|
||||
Colombian localization. Colombian partners **must** have their :guilabel:`Identification Number`
|
||||
(VAT) and :guilabel:`Document Type` set.
|
||||
- :guilabel:`Obligaciones y Responsabilidades`: Select the fiscal responsibility for the company.
|
||||
(:guilabel:`O-13` Gran Contribuyente, :guilabel:`O-15` Autorretenedor,
|
||||
:guilabel:`O-23` Agente de retención IVA, :guilabel:`O-47` Regimen de tributación simple,
|
||||
:guilabel:`R-99-PN` No Aplica).
|
||||
- :guilabel:`Gran Contribuyente`: If the company is *Gran Contribuyente*, enable this option.
|
||||
- :guilabel:`Fiscal Regimen`: Select the Tribute Name for the company (:guilabel:`IVA`,
|
||||
:guilabel:`INC`, :guilabel:`IVA e INC`, or :guilabel:`No Aplica`)
|
||||
- :guilabel:`Commercial Name`: If the company uses a specific commercial name and it needs to be
|
||||
displayed in the invoice.
|
||||
|
||||
.. tip::
|
||||
When the :guilabel:`Document Type` is `NIT`, the :guilabel:`Identification Number` needs to be
|
||||
configured in Odoo, including the *verification digit at the end of the ID, prefixed by a hyphen
|
||||
(`-`)*.
|
||||
The data configured in the :guilabel:`Fiscal Information` section is printed in the valid fiscal
|
||||
PDF reports.
|
||||
|
||||
Fiscal information
|
||||
******************
|
||||
.. _localization/colombia/einvoice-configuration:
|
||||
|
||||
The partner's responsibility codes (section 53 in the :abbr:`RUT (Registro único tributario)`
|
||||
document) are included as part of the electronic invoicing module, as it is required by the |DIAN|.
|
||||
Electronic invoicing credentials and |DIAN| environment
|
||||
-------------------------------------------------------
|
||||
|
||||
The required fields can be found under :menuselection:`Partner --> Sales & Purchase Tab --> Fiscal
|
||||
Information section`:
|
||||
To configure the user credentials to be used to connect with the |DIAN|'s web service and the
|
||||
|DIAN| environment, navigate to :menuselection:`Accounting --> Configuration --> Settings` and
|
||||
scroll to the :guilabel:`Colombian Electronic Invoicing` section. Then, follow these steps:
|
||||
|
||||
- :guilabel:`Obligaciones y Responsabilidades`: Select the fiscal responsibility for the company
|
||||
(`O-13` Gran Contribuyente, `O-15` Autorretenedor, `O-23` Agente de retención IVA, `O-47` Regimen
|
||||
de tributación simple, or `R-99-PN` No Aplica).
|
||||
- :guilabel:`Gran Contribuyente`: If the company is *Gran Contribuyente* this option should be
|
||||
selected.
|
||||
- :guilabel:`Fiscal Regimen`: Select the tribute name for the company (`IVA`, `INC`, `IVA e INC`, or
|
||||
`No Aplica`)
|
||||
- :guilabel:`Commercial Name`: If the company uses a specific commercial name, and it needs to be
|
||||
displayed in the invoice.
|
||||
#. Select :guilabel:`DIAN: Free Service` as the :guilabel:`Electronic Invoicing Provider`.
|
||||
#. Configure the :guilabel:`Operation Modes` for the respective types of documents
|
||||
(*electronic invoices* or *support documents*) to be generated from Odoo. Click
|
||||
:guilabel:`Add a line`, then fill in the fields:
|
||||
|
||||
- :guilabel:`Software Mode`: the type of document to be generated with the operation mode.
|
||||
- :guilabel:`Software ID`: the ID generated by |DIAN| for the specific operation mode.
|
||||
- :guilabel:`Software PIN`: the PIN selected in the operation mode configuration in the |DIAN|
|
||||
portal.
|
||||
- :guilabel:`Testing ID`: the testing ID generated by |DIAN| and obtained after testing the
|
||||
operation mode.
|
||||
|
||||
#. Configure the available :guilabel:`Certificates` to sign the electronic documents. Click
|
||||
:guilabel:`Add a line`, then fill in the fields:
|
||||
|
||||
- :guilabel:`Name`: the name of the certificate.
|
||||
- :guilabel:`Certificate`: upload the certificate file in PEM format. In the :guilabel:`Private
|
||||
Key` field that appears on the screen, select an existing private key or create a new one. To
|
||||
do so, enter a key name and select :guilabel:`Create and edit`. Then, in the :guilabel:`Create
|
||||
Private Key` wizard, upload a valid :guilabel:`Key file` and click :guilabel:`Save & Close`.
|
||||
|
||||
.. image:: colombia/dian-credentials-configuration.png
|
||||
:alt: Colombian electronic invoicing credentials configured.
|
||||
|
||||
#. Configure the |DIAN| environment; the |DIAN| electronic invoicing module offers three different
|
||||
|DIAN| environments to connect with:
|
||||
|
||||
- **Certification environment**: This environment is useful to pass the |DIAN| certification
|
||||
process and obtain the *Enabled* status to invoice from Odoo. To activate it, enable both the
|
||||
:guilabel:`Test environment` and the :guilabel:`Activate the certification process` checkboxes.
|
||||
|
||||
- **Testing environment**: This environment allows reproducing electronic invoicing flows
|
||||
and validations in the |DIAN| testing portal. To activate it, enable only the :guilabel:`Test
|
||||
Environment` checkbox.
|
||||
|
||||
- **Production environment**: Activate production databases to generate valid electronic documents.
|
||||
To activate it, disable both the :guilabel:`Test environment` and the :guilabel:`Activate the
|
||||
certification process` checkboxes.
|
||||
|
||||
.. note::
|
||||
In a multi-company database, each company can have its own certificate.
|
||||
|
||||
.. seealso::
|
||||
For electronic invoicing configurations using the Carvajal solution, review the following video:
|
||||
`Configuración de Facturación Electrónica - Localización de Colombia
|
||||
<https://www.youtube.com/watch?v=bzweMwTEbfY&list=PL1-aSABtP6ABxZshems3snMjx7bj_7ZsZ&index=3>`_.
|
||||
|
||||
.. _localization/colombia/master-data:
|
||||
|
||||
Master data
|
||||
-----------
|
||||
|
||||
.. _localization/colombia/contacts:
|
||||
|
||||
Contacts
|
||||
~~~~~~~~
|
||||
|
||||
Configure the following fields on the :doc:`contact form <../../essentials/contacts>`:
|
||||
|
||||
- :guilabel:`Identification Number` (VAT): Select the identification number type and enter the
|
||||
identification number. If the identification number type is :guilabel:`NIT`, the identification
|
||||
number must include the verification digit at the end, prefixed by a hyphen (`-`).
|
||||
- :ref:`Fiscal Information fields <localization/colombia/configuration/company>` in the
|
||||
:guilabel:`Sales & Purchase` tab.
|
||||
|
||||
.. _localization/colombia/products:
|
||||
|
||||
Products
|
||||
~~~~~~~~
|
||||
|
||||
To manage products, navigate to :menuselection:`Accounting --> Customers --> Products`, then click
|
||||
on a product.
|
||||
Access the product's form via :menuselection:`Accounting --> Customers --> Products` and ensure
|
||||
that either the :guilabel:`UNSPSC Category` field (found in the :guilabel:`Accounting tab`) or the
|
||||
:guilabel:`Internal Reference` field (in the :guilabel:`General Information` tab) is configured.
|
||||
|
||||
When adding general information on the product form, it is required that either the
|
||||
:guilabel:`UNSPSC Category` (:guilabel:`Accounting` tab), or :guilabel:`Internal Reference`
|
||||
(:guilabel:`General Information` tab) field is configured. Be sure to :guilabel:`Save` the product
|
||||
once configured.
|
||||
.. _localization/colombia/taxes:
|
||||
|
||||
Taxes
|
||||
~~~~~
|
||||
@@ -194,91 +202,103 @@ Taxes
|
||||
To create or modify taxes, go to :menuselection:`Accounting --> Configuration --> Taxes`, and select
|
||||
the related tax.
|
||||
|
||||
If sales transactions include products with taxes, the :guilabel:`Value Type` field in the
|
||||
:guilabel:`Advanced Options` tab needs to be configured per tax. Retention tax types
|
||||
(:guilabel:`ICA`, :guilabel:`IVA`, :guilabel:`Fuente`) are also included. This configuration is used
|
||||
to display taxes correctly in the invoice PDF.
|
||||
If sales transactions include products with taxes, configure the :guilabel:`Value Type` field in the
|
||||
:guilabel:`Advanced Options` tab. Retention tax types (:guilabel:`ICA`, :guilabel:`IVA`,
|
||||
:guilabel:`Fuente`) are also included. This configuration is used to display taxes correctly on the
|
||||
invoice.
|
||||
|
||||
.. image:: colombia/retention-tax-types.png
|
||||
:align: center
|
||||
:alt: The ICA, IVA and Fuente fields in the Advanced Options tab in Odoo.
|
||||
.. image:: colombia/dian-taxes-configuration.png
|
||||
:alt: Specific tax configurations per DIAN regulations.
|
||||
|
||||
.. _co-journals:
|
||||
.. _localization/colombia/co-journals:
|
||||
|
||||
Sales journals
|
||||
~~~~~~~~~~~~~~
|
||||
|
||||
Once the |DIAN| has assigned the official sequence and prefix for the electronic invoice resolution,
|
||||
the sales journals related to the invoice documents **must** be updated in Odoo. To do so, navigate
|
||||
to :menuselection:`Accounting --> Configuration --> Journals`, and select an existing sales journal,
|
||||
the sales journals related to the invoices **must** be updated in Odoo. To do so, navigate
|
||||
to :menuselection:`Accounting --> Configuration --> Journals` and select an existing sales journal
|
||||
or create a new one with the :guilabel:`Create` button.
|
||||
|
||||
On the sales journal form, input the :guilabel:`Journal Name`, :guilabel:`Type`, and set a unique
|
||||
:guilabel:`Short Code` in the :guilabel:`Journals Entries` tab. Then, configure the following data
|
||||
in the :guilabel:`Advanced Settings` tab:
|
||||
On the sales journal form, enter the :guilabel:`Journal Name` and :guilabel:`Type`, then set a
|
||||
unique :guilabel:`Short Code` in the :guilabel:`Journals Entries` tab. Then, configure the following
|
||||
data in the :guilabel:`Advanced Settings` tab:
|
||||
|
||||
- :guilabel:`Electronic invoicing`: Enable :guilabel:`UBL 2.1 (Colombia)`.
|
||||
- :guilabel:`Invoicing Resolution`: Resolution number issued by |DIAN| to the company.
|
||||
- :guilabel:`Resolution Date`: Initial effective date of the resolution.
|
||||
- :guilabel:`Resolution end date`: End date of the resolution's validity.
|
||||
- :guilabel:`Range of Numbering (minimum)`: First authorized invoice number.
|
||||
- :guilabel:`Range of Numbering (maximum)`: Last authorized invoice number.
|
||||
- :guilabel:`Electronic invoicing`: enable UBL 2.1 (Colombia).
|
||||
- :guilabel:`Invoicing Resolution`: resolution number issued by |DIAN| to the company via their test
|
||||
set.
|
||||
- :guilabel:`Resolution Date`: initial effective date of the resolution.
|
||||
- :guilabel:`Resolution End Date`: end date of the resolution's validity.
|
||||
- :guilabel:`Range of Numbering (minimum)`: first authorized invoice number.
|
||||
- :guilabel:`Range of Numbering (maximum)`: last authorized invoice number.
|
||||
- :guilabel:`Technical Key`: control key received from the |DIAN| portal test set or from their web
|
||||
service in case of the production environment.
|
||||
|
||||
.. note::
|
||||
The sequence and resolution of the journal **must** match the one configured in Carvajal and the
|
||||
|DIAN|.
|
||||
When the database is configured for the :ref:`production environment
|
||||
<localization/colombia/einvoice-configuration>`, instead of configuring these fields manually,
|
||||
click the :guilabel:`Reload DIAN configuration` button to obtain the |DIAN| resolution information
|
||||
from the |DIAN| web service.
|
||||
|
||||
Invoice sequence
|
||||
****************
|
||||
.. image:: colombia/reload-dian-configuration-button.png
|
||||
:alt: Reload DIAN configuration button in sale journals.
|
||||
|
||||
The invoice sequence and prefix **must** be correctly configured when the first document is created.
|
||||
.. important::
|
||||
- The short code and resolution of the journal **must** match the ones received in the |DIAN|
|
||||
portal test set or from the MUISCA portal.
|
||||
- The :ref:`invoice sequence and prefix <localization/colombia/invoice-creation>` **must** be
|
||||
correctly configured when the first invoice is created. Odoo automatically assigns a prefix
|
||||
and sequence to the following invoices.
|
||||
|
||||
.. note::
|
||||
Odoo automatically assigns a prefix and sequence to the following invoices.
|
||||
.. _localization/colombia/purchase-journals:
|
||||
|
||||
Purchase journals
|
||||
*****************
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
Once the |DIAN| has assigned the official sequence and prefix for the *support document* related to
|
||||
vendor bills, the purchase journals related to their supporting documents need to be updated in
|
||||
Odoo. The process is similar to the configuration of the :ref:`sales journals <co-journals>`.
|
||||
Odoo. The process is similar to the configuration of the :ref:`sales journals
|
||||
<localization/colombia/co-journals>`.
|
||||
|
||||
.. seealso::
|
||||
For more information on support document journals using the Carvajal solution, review the
|
||||
`Documento Soporte - Localización de Colombia video
|
||||
<https://www.youtube.com/watch?v=UmYsFcD7xzE&list=PL1-aSABtP6ABxZshems3snMjx7bj_7ZsZ&index=8>`_.
|
||||
|
||||
.. _localization/colombia/chart-of-accounts:
|
||||
|
||||
Chart of accounts
|
||||
*****************
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
The :doc:`chart of accounts </applications/finance/accounting/get_started/chart_of_accounts>` is
|
||||
installed by default as part of the localization module, the accounts are mapped automatically in
|
||||
installed by default as part of the localization module. The accounts are mapped automatically in
|
||||
taxes, default account payable, and default account receivable. The chart of accounts for Colombia
|
||||
is based on the PUC (Plan Unico de Cuentas).
|
||||
|
||||
.. _colombia/workflows:
|
||||
.. _localization/colombia/workflows:
|
||||
|
||||
Main workflows
|
||||
==============
|
||||
|
||||
.. _localization/colombia/electronic-invoices:
|
||||
|
||||
Electronic invoices
|
||||
-------------------
|
||||
|
||||
The following is a breakdown of the main workflow for electronic invoices with the Colombian
|
||||
localization:
|
||||
|
||||
#. Sender creates an invoice.
|
||||
#. Electronic invoice provider generates the legal XML file.
|
||||
#. Electronic invoice provider creates the CUFE (Invoice Electronic Code) with the electronic
|
||||
signature.
|
||||
#. Electronic invoice provider sends a notification to |DIAN|.
|
||||
#. The user creates an invoice.
|
||||
#. Odoo generates the legal XML file.
|
||||
#. Odoo generates the CUFE (Invoice Electronic Code) with the electronic signature.
|
||||
#. Odoo sends a notification to DIAN.
|
||||
#. |DIAN| validates the invoice.
|
||||
#. |DIAN| accepts or rejects the invoice.
|
||||
#. Electronic invoice provider generates the PDF invoice with a QR code.
|
||||
#. Electronic invoice provider sends invoice to the acquirer.
|
||||
#. Acquirer sends a receipt of acknowledgement, and accepts or rejects the invoice.
|
||||
#. Sender downloads a :file:`.zip` file with the PDF and XML.
|
||||
#. Odoo generates the PDF invoice with a QR code.
|
||||
#. Odoo compresses the attached document (containing the sent XML file and the DIAN validation
|
||||
response) and the fiscal valid PDF into a :file:`.zip` file.
|
||||
#. The user sends the invoice (:file:`.zip` file) via Odoo to the acquirer.
|
||||
|
||||
.. image:: colombia/workflow-electronic-invoice.png
|
||||
:align: center
|
||||
:alt: Electronic invoice workflow for Colombian localization.
|
||||
|
||||
.. _colombia/invoice-creation:
|
||||
.. _localization/colombia/invoice-creation:
|
||||
|
||||
Invoice creation
|
||||
~~~~~~~~~~~~~~~~
|
||||
@@ -287,58 +307,62 @@ Invoice creation
|
||||
The functional workflow taking place before an invoice validation does **not** alter the main
|
||||
changes introduced with the electronic invoice.
|
||||
|
||||
Electronic invoices are generated and sent to both the |DIAN| and customer through Carvajal's web
|
||||
service integration. These documents can be created from your sales order or manually generated. To
|
||||
create a new invoice, go to :menuselection:`Accounting --> Customers --> Invoices`, and select
|
||||
:guilabel:`Create`. On the invoice form configure the following fields:
|
||||
Electronic invoices are generated and sent to both the |DIAN| and the customer. These documents can
|
||||
be created from the sales order or manually generated. To create a new invoice, go to
|
||||
:menuselection:`Accounting --> Costumers --> Invoices`, and select :guilabel:`Create`. On the
|
||||
invoice form, configure the following fields:
|
||||
|
||||
- :guilabel:`Customer`: Customer's information.
|
||||
- :guilabel:`Journal`: Journal used for electronic invoices.
|
||||
- :guilabel:`Customer`: customer's information.
|
||||
- :guilabel:`Journal`: journal used for electronic invoices.
|
||||
- :guilabel:`Electronic Invoice Type`: Select the type of document. By default, :guilabel:`Factura
|
||||
de Venta` is selected.
|
||||
- :guilabel:`Invoice Lines`: Specify the products with the correct taxes.
|
||||
|
||||
.. important::
|
||||
When creating the first invoice related to an electronic invoicing journal, it is required to
|
||||
manually change the *sequence* of the invoice to the |DIAN| format: `Prefix + Sequence`.
|
||||
|
||||
For example, format the sequence from `SETP/2024/00001` to `SETP1`.
|
||||
|
||||
When done, click :guilabel:`Confirm`.
|
||||
|
||||
.. _colombia/invoice-validation:
|
||||
.. _localization/colombia/send-electronic-invoice:
|
||||
|
||||
Invoice validation
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
Electronic invoice sending
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
After the invoice confirmation, an XML file is created and sent automatically to Carvajal. The
|
||||
invoice is then processed asynchronously by the E-invoicing service UBL 2.1 (Colombia). The file is
|
||||
also displayed in the chatter.
|
||||
After the :ref:`invoice confirmation <localization/colombia/invoice-creation>`, click
|
||||
:guilabel:`Print & Send`. In the wizard that appears, make sure to enable the :guilabel:`DIAN` and
|
||||
:guilabel:`Email` checkboxes to send an XML to the |DIAN| web service and the validated invoice to
|
||||
the client fiscal email and click :guilabel:`Print & Send`. Then:
|
||||
|
||||
.. image:: colombia/invoice-sent.png
|
||||
:align: center
|
||||
:alt: Carvajal XML invoice file in Odoo chatter.
|
||||
- The XML document is created.
|
||||
- The CUFE is generated.
|
||||
- The XML is processed synchronously by the |DIAN|.
|
||||
- If accepted, the file is displayed in the chatter and the email to the client with the
|
||||
corresponding :file:`.zip` file.
|
||||
|
||||
The :guilabel:`Electronic Invoice Name` field is now displayed in the :guilabel:`EDI Documents` tab,
|
||||
with the name of the XML file. Additionally, the :guilabel:`Electronic Invoice Status` field is
|
||||
displayed with the initial value :guilabel:`To Send`. To process the invoice manually, click on the
|
||||
:guilabel:`Process Now` button.
|
||||
.. image:: colombia/zip-xml-chatter-colombia.png
|
||||
:alt: EDI documents available in the chatter.
|
||||
|
||||
.. _colombia/invoice-xml:
|
||||
The :guilabel:`DIAN` tab then displays the following:
|
||||
|
||||
Reception of legal XML and PDF
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
- :guilabel:`Signed Date`: timestamp recorded of the XML creation.
|
||||
- :guilabel:`Status`: Status result obtained in the |DIAN| response. If the invoice was
|
||||
rejected, the error messages can be seen here.
|
||||
- :guilabel:`Testing Environment`: To know if the document sent was delivered to the |DIAN| testing
|
||||
environment.
|
||||
- :guilabel:`Certification Process`: To know if the document was sent as part of the certification
|
||||
process with the |DIAN|.
|
||||
- :guilabel:`Download`: To download the sent XML file, even if the |DIAN| result was
|
||||
rejected.
|
||||
- :guilabel:`Fetch Attached Document`: To download the generated attached document file included in
|
||||
the delivered :file:`.zip` file to the client.
|
||||
|
||||
The electronic invoice vendor (Carvajal) receives the XML file, and proceeds to validate its
|
||||
structure and information.
|
||||
.. image:: colombia/dian-tab-electronic-document.png
|
||||
:alt: EDI document record available in DIAN tab.
|
||||
|
||||
After validating the electronic invoice, proceed to generate a legal XML which includes a digital
|
||||
signature and a unique code (CUFE), a PDF invoice that includes a QR code and the CUFE is also
|
||||
generated. If everything is correct the :guilabel:`Electronic Invoicing` field value changes to
|
||||
:guilabel:`Sent`.
|
||||
|
||||
A :file:`.zip` containing the legal electronic invoice (in XML format) and the invoice in (PDF
|
||||
format) is downloaded and displayed in the invoice chatter:
|
||||
|
||||
.. image:: colombia/invoice-zip.png
|
||||
:align: center
|
||||
:alt: ZIP file displayed in the invoice chatter in Odoo.
|
||||
|
||||
The electronic invoice status changes to :guilabel:`Accepted`.
|
||||
.. _localization/colombia/credit-notes:
|
||||
|
||||
Credit notes
|
||||
------------
|
||||
@@ -364,6 +388,8 @@ an invoice, go to :menuselection:`Accounting --> Customers --> Invoices`. On the
|
||||
|
||||
Once reviewed, click the :guilabel:`Reverse` button.
|
||||
|
||||
.. _localization/colombia/debit-notes:
|
||||
|
||||
Debit notes
|
||||
-----------
|
||||
|
||||
@@ -380,6 +406,8 @@ invoice, go to :menuselection:`Accounting --> Customers --> Invoices`. On the in
|
||||
|
||||
When done, click :guilabel:`Create Debit Note`.
|
||||
|
||||
.. _localization/colombia/support-document:
|
||||
|
||||
Support document for vendor bills
|
||||
---------------------------------
|
||||
|
||||
@@ -397,26 +425,34 @@ Support documents for vendor bills can be created from your purchase order or ma
|
||||
Once reviewed, click the :guilabel:`Confirm` button. Upon confirmation, an XML file is created and
|
||||
automatically sent to Carvajal.
|
||||
|
||||
.. _colombia/common-errors:
|
||||
.. _localization/colombia/common-errors:
|
||||
|
||||
Common errors
|
||||
-------------
|
||||
|
||||
During the XML validation, the most common errors are related to missing master data (*Contact Tax
|
||||
ID*, *Address*, *Products*, *Taxes*). In such cases, error messages are shown in the chatter after
|
||||
updating the electronic invoice status.
|
||||
During the XML validation, the most common errors are related to missing :ref:`master data
|
||||
<localization/colombia/master-data>`. In such cases, a validation error message is displayed and
|
||||
sending is blocked.
|
||||
|
||||
After the master data is corrected, it's possible to reprocess the XML with the new data and send
|
||||
the updated version, using the :guilabel:`Retry` button.
|
||||
If the invoice was sent and set as *Rejected* by the |DIAN|, the error messages are visible by
|
||||
clicking the :icon:`fa-info-circle` :guilabel:`(info circle)` icon next to the :guilabel:`Status`
|
||||
field in the :guilabel:`DIAN` tab. Using the reported error codes, it is possible to review
|
||||
solutions to apply before re-sending.
|
||||
|
||||
.. image:: colombia/xml-validation-error.png
|
||||
:alt: XML validation errors shown in the invoice chatter in Odoo.
|
||||
.. image:: colombia/rejected-invoice-error-message.png
|
||||
:alt: Example of error messages on rejected invoices.
|
||||
|
||||
.. _colombia/reports:
|
||||
After the master data or other issues are corrected, it is possible to reprocess the XML again. Do
|
||||
so by following the :ref:`electronic invoice sending <localization/colombia/send-electronic-invoice>`
|
||||
flow.
|
||||
|
||||
.. _localization/colombia/reports:
|
||||
|
||||
Financial reports
|
||||
=================
|
||||
|
||||
.. _localization/colombia/certificado-ica:
|
||||
|
||||
Certificado de Retención en ICA
|
||||
-------------------------------
|
||||
|
||||
@@ -424,10 +460,14 @@ This report is a certification to vendors for withholdings made for the Colombia
|
||||
Commerce (ICA) tax. The report can be found under :menuselection:`Accounting --> Reporting -->
|
||||
Colombian Statements --> Certificado de Retención en ICA`.
|
||||
|
||||
.. image:: colombia/ica-report.png
|
||||
:align: center
|
||||
Click the :icon:`fa-cog` :guilabel:`(gear)` icon to display options to :guilabel:`Download Excel`
|
||||
and :guilabel:`Copy to Documents`.
|
||||
|
||||
.. image:: colombia/retencion-ica-dian.png
|
||||
:alt: Certificado de Retención en ICA report in Odoo Accounting.
|
||||
|
||||
.. _localization/colombia/certificado-iva:
|
||||
|
||||
Certificado de Retención en IVA
|
||||
-------------------------------
|
||||
|
||||
@@ -435,10 +475,14 @@ This report issues a certificate on the amount withheld from vendors for VAT wit
|
||||
can be found under :menuselection:`Accounting --> Reporting --> Colombian Statements --> Certificado
|
||||
de Retención en IVA`.
|
||||
|
||||
.. image:: colombia/iva-report.png
|
||||
:align: center
|
||||
Click the :icon:`fa-cog` :guilabel:`(gear)` icon to display options to :guilabel:`Download Excel`
|
||||
and :guilabel:`Copy to Documents`.
|
||||
|
||||
.. image:: colombia/retencion-iva-dian.png
|
||||
:alt: Certificado de Retención en IVA report in Odoo Accounting.
|
||||
|
||||
.. _localization/colombia/certificado-fuente:
|
||||
|
||||
Certificado de Retención en la Fuente
|
||||
-------------------------------------
|
||||
|
||||
@@ -446,6 +490,8 @@ This certificate is issued to partners for the withholding tax that they have ma
|
||||
be found under :menuselection:`Accounting --> Reporting --> Colombian Statements --> Certificado de
|
||||
Retención en Fuente`.
|
||||
|
||||
.. image:: colombia/fuente-report.png
|
||||
:align: center
|
||||
Click the :icon:`fa-cog` :guilabel:`(gear)` icon to display options to :guilabel:`Download Excel`
|
||||
and :guilabel:`Copy to Documents`.
|
||||
|
||||
.. image:: colombia/retencion-fuente-dian.png
|
||||
:alt: Certificado de Retención en Fuente report in Odoo Accounting.
|
||||
|
||||
|
Before Width: | Height: | Size: 9.7 KiB |
|
After Width: | Height: | Size: 46 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 7.1 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 8.6 KiB |
|
Before Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 47 KiB |
|
After Width: | Height: | Size: 30 KiB |
@@ -170,9 +170,8 @@ triggered and is being processed. You have to click on *Refresh State* to check
|
||||
German Tax Accounting Standards: Odoo's guide to GoBD Compliance
|
||||
================================================================
|
||||
|
||||
**GoBD** stands for `Grundsätze zur ordnungsmäßigen Führung und Aufbewahrung von Büchern,
|
||||
Aufzeichnungen und Unterlagen in elektronischer Form sowie zum Datenzugriff
|
||||
<https://ao.bundesfinanzministerium.de/ao/2021/Anhaenge/BMF-Schreiben-und-gleichlautende-Laendererlasse/Anhang-64/anhang-64.html>`_.
|
||||
**GoBD** stands for *Grundsätze zur ordnungsmäßigen Führung und Aufbewahrung von Büchern,
|
||||
Aufzeichnungen und Unterlagen in elektronischer Form sowie zum Datenzugriff*.
|
||||
In short, it is a **guideline for the proper management and storage of books, records, and documents
|
||||
in electronic form, as well as for data access**, that is relevant for the German tax authority, tax
|
||||
declaration, and balance sheet.
|
||||
@@ -191,7 +190,7 @@ What do you need to know about GoBD when relying on accounting software?
|
||||
|
||||
.. note::
|
||||
If you can, the best way to understand GoBD is to Read the `Official GoBD text
|
||||
<https://www.bundesfinanzministerium.de/Content/DE/Downloads/BMF_Schreiben/Weitere_Steuerthemen/Abgabenordnung/2019-11-28-GoBD.pdf>`_.
|
||||
<https://ao.bundesfinanzministerium.de/ao/2021/Anhaenge/BMF-Schreiben-und-gleichlautende-Laendererlasse/Anhang-64/anhang-64.html>`_.
|
||||
It is a bit long but quite readable for non-experts. But in short, here is what to expect:
|
||||
|
||||
The **GoBD is binding for companies that have to present accounts, which includes SMEs, freelancers,
|
||||
@@ -312,7 +311,7 @@ offer our customer any legal certainty.
|
||||
|
||||
.. important::
|
||||
The BMF actually states the following in the `Official GoBD text
|
||||
<https://www.bundesfinanzministerium.de/Content/DE/Downloads/BMF_Schreiben/Weitere_Steuerthemen/Abgabenordnung/2019-11-28-GoBD.pdf>`_:
|
||||
<https://ao.bundesfinanzministerium.de/ao/2021/Anhaenge/BMF-Schreiben-und-gleichlautende-Laendererlasse/Anhang-64/anhang-64.html>`_:
|
||||
|
||||
- 180. Positive attestations on the correctness of the bookkeeping - and thus on the correctness
|
||||
of IT-based bookkeeping systems - are not issued either in the context of a tax field audit or
|
||||
|
||||
@@ -2,33 +2,80 @@
|
||||
Peru
|
||||
====
|
||||
|
||||
.. |SUNAT| replace:: :abbr:`SUNAT (Superintendencia Nacional de Aduanas y de Administración Tributaria)`
|
||||
.. |SUNAT| replace:: :abbr:`SUNAT (Superintendencia Nacional de Aduanas y de Administración
|
||||
Tributaria)`
|
||||
.. |GRE| replace:: :abbr:`GRE (Guía de Remisión Electrónica)`
|
||||
.. |RUS| replace:: :abbr:`RUS (Régimen Único Simplificado)`
|
||||
.. |EDI| replace:: :abbr:`EDI (Electronic Data Interchange)`
|
||||
|
||||
Introduction
|
||||
============
|
||||
Modules
|
||||
=======
|
||||
|
||||
The Peruvian localization has been improved and extended, in this version the next modules are
|
||||
available:
|
||||
:ref:`Install <general/install>` the following modules to utilize all the current features of the
|
||||
Peruvian localization.
|
||||
|
||||
- **l10n_pe**: Adds accounting features for the Peruvian localization, which represent the minimal
|
||||
configuration required for a company to operate in Peru and under the SUNAT regulations and
|
||||
guidelines. The main elements included in this module are: Chart of account, taxes,
|
||||
document types.
|
||||
.. list-table::
|
||||
:header-rows: 1
|
||||
|
||||
- **l10n_pe_edi**: includes all technical and functional requirements to generate and validate
|
||||
Electronic Invoice, based on the SUNAT specification to create and process valid electronic
|
||||
documents, for more technical detail you can access the
|
||||
`SUNAT EDI specifications <https://cpe.sunat.gob.pe/node/88/>`_,
|
||||
that keeps track of new changes and updates.
|
||||
The features of this module are based on the resolutions published on the
|
||||
`SUNAT Legislation <https://www.sunat.gob.pe/legislacion/general/index.html/>`_.
|
||||
* - Name
|
||||
- Technical name
|
||||
- Description
|
||||
* - :guilabel:`Peru - Accounting`
|
||||
- `l10n_pe`
|
||||
- Adds accounting features for the Peruvian localization, which represent the minimal
|
||||
configuration required for a company to operate in Peru and under the SUNAT regulations and
|
||||
guidelines. The main elements included in this module are the chart of accounts, taxes,
|
||||
document types.
|
||||
* - :guilabel:`Peru - E-invoicing`
|
||||
- `l10n_pe_edi`
|
||||
- Includes all technical and functional requirements to generate and receive electronic
|
||||
invoices online based on the SUNAT regulations.
|
||||
* - :guilabel:`Peru - Accounting Reports`
|
||||
- `l10n_pe_reports`
|
||||
- Includes the following financial reports:
|
||||
|
||||
- 1st set of main financial reports:
|
||||
|
||||
- Registro de Ventas e Ingresos (RVIE) - 14.4
|
||||
- Registro de Compras Electrónico (RCE) - 8.4
|
||||
- Registro de Compras Electrónico - Información de Operaciones con Sujetos no Domiciliados
|
||||
(RCE) - 8.5
|
||||
|
||||
- 2nd set of financial reports:
|
||||
|
||||
- PLE 5.1 General Journal
|
||||
- PLE 5.3 Chart of Accounts
|
||||
- PLE 6.1 General Ledger
|
||||
|
||||
- 3rd set of financial reports:
|
||||
|
||||
- PLE 1.1 Libro de Caja
|
||||
- PLE 1.2 Libro de Bancos
|
||||
|
||||
* - :guilabel:`Peruvian - Electronic Delivery Note`
|
||||
- `l10n_pe_edi_stock`
|
||||
- Adds the delivery guide (Guía de Remisión), which is needed as proof that you are sending
|
||||
goods between A and B. It is only when a delivery order is validated that the delivery guide
|
||||
can be created.
|
||||
* - :guilabel:`Peruvian eCommerce`
|
||||
- `l10n_pe_website_sale`
|
||||
- Enables the identification type in eCommerce checkout forms and the ability to generate
|
||||
electronic invoices.
|
||||
* - :guilabel:`Peruvian - Point of Sale with PE Doc`
|
||||
- `l10n_pe_pos`
|
||||
- Enables contact fiscal information to be editable from a PoS Session to generate electronic
|
||||
invoices and refunds.
|
||||
|
||||
.. note::
|
||||
- Odoo automatically installs the appropriate package for the company according to the country
|
||||
selected at the creation of the database.
|
||||
- The *Peruvian - Electronic Delivery Guide* module depends on the *Inventory* application to be
|
||||
installed.
|
||||
|
||||
.. seealso::
|
||||
- `App Tour - Localización de Peru <https://youtu.be/Ic3mGovkf8Y>`_
|
||||
- `Smart Tutorial - Localización de Peru <https://www.odoo.com/slides/smart-tutorial-localizacion-de-peru-133>`_
|
||||
- `Smart Tutorial - Localización de Peru (videos for workflows and configurations)
|
||||
<https://www.odoo.com/slides/smart-tutorial-localizacion-de-peru-133>`_
|
||||
|
||||
Configuration
|
||||
=============
|
||||
@@ -41,7 +88,6 @@ dependency with *Peru - Accounting*. In case this last one is not installed, Odo
|
||||
automatically within EDI.
|
||||
|
||||
.. image:: peru/peru-modules.png
|
||||
:align: center
|
||||
:alt: The "Module" filter is set on "Peru"
|
||||
|
||||
.. note::
|
||||
@@ -57,9 +103,7 @@ the establishment code assigned by the SUNAT when companies register their RUC (
|
||||
Registration):
|
||||
|
||||
.. image:: peru/peru-company.png
|
||||
:align: center
|
||||
:alt: Company data for Peru including RUC and Address type code
|
||||
|
||||
:alt: Company data for Peru including RUC and Address type code.
|
||||
|
||||
.. tip::
|
||||
In case the Address type code is unknown, you can set it as the default value: 0000. Be aware
|
||||
@@ -68,7 +112,6 @@ Registration):
|
||||
.. note::
|
||||
The NIF should be set following the RUC format.
|
||||
|
||||
|
||||
Chart of Account
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
@@ -105,7 +148,6 @@ Here are some terms that are essential on the Peruvian localization:
|
||||
- **SOL Credentials**: Sunat Operaciones en Línea. User and password are provided by the SUNAT and
|
||||
grant access to Online Operations systems.
|
||||
|
||||
|
||||
Signature Provider
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
@@ -126,8 +168,7 @@ This is the default and the suggested option, considering the digital ceritifica
|
||||
part of the service.
|
||||
|
||||
.. image:: peru/peru-IAP.png
|
||||
:align: center
|
||||
:alt: IAP option as signature providers
|
||||
:alt: IAP option as signature providers.
|
||||
|
||||
What is the IAP?
|
||||
^^^^^^^^^^^^^^^^
|
||||
@@ -190,8 +231,7 @@ document validation directly to Digiflow. In this case you need to consider:
|
||||
- Provide your SOL credentials.
|
||||
|
||||
.. image:: peru/peru-Digiflow.png
|
||||
:align: center
|
||||
:alt: Digiflow
|
||||
:alt: Digiflow.
|
||||
|
||||
SUNAT
|
||||
*****
|
||||
@@ -230,18 +270,16 @@ certificate with the extension ``.pfx`` is required. Proceed to this section and
|
||||
password.
|
||||
|
||||
.. image:: peru/peru-Certificate.png
|
||||
:align: center
|
||||
:alt: EDI Certificate wizard
|
||||
:alt: EDI Certificate wizard.
|
||||
|
||||
Multicurrency
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
The official currency exchange rate in Peru is provided by the Bank of Peru. Odoo can connect
|
||||
directly to its services and get the currency rate either automatically or manually.
|
||||
The official currency exchange rate in Peru is provided by the SUNAT. Odoo can connect directly to
|
||||
its services and get the currency rate either automatically or manually.
|
||||
|
||||
.. image:: peru/peru-multicurrency.png
|
||||
:align: center
|
||||
:alt: Bank of Peru is displayed in Multicurrency Service option
|
||||
.. image:: peru/l10n-pe-banksync-sunat.png
|
||||
:alt: SUNAT displayed in Multicurrency Service option.
|
||||
|
||||
Please refer to the next section in our documentation for more information about
|
||||
:doc:`multicurrencies <../accounting/get_started/multi_currency>`.
|
||||
@@ -258,8 +296,7 @@ As part of the localization module the taxes are created automatically with thei
|
||||
financial account and electronic invoice configuration.
|
||||
|
||||
.. image:: peru/peru-taxes.png
|
||||
:align: center
|
||||
:alt: List of default taxes
|
||||
:alt: List of default taxes.
|
||||
|
||||
EDI Configuration
|
||||
*****************
|
||||
@@ -269,9 +306,7 @@ the taxes created by default have this data included, but in case you create new
|
||||
sure you fill in the fields:
|
||||
|
||||
.. image:: peru/peru-taxes-edi.png
|
||||
:align: center
|
||||
:alt: Taxes EDI data for Peru
|
||||
|
||||
:alt: Taxes EDI data for Peru.
|
||||
|
||||
Fiscal Positions
|
||||
~~~~~~~~~~~~~~~~
|
||||
@@ -297,8 +332,7 @@ The information required for the document types is included by default so the us
|
||||
to fill anything on this view:
|
||||
|
||||
.. image:: peru/peru-document-type.png
|
||||
:align: center
|
||||
:alt: Document Type list
|
||||
:alt: Document Type list.
|
||||
|
||||
.. warning::
|
||||
Currently the documents supported on customer invoices are: Invoice, Boleta, Debit Note and
|
||||
@@ -324,8 +358,7 @@ This section indicates which EDI workflow is used in the invoice, for Peru we mu
|
||||
“Peru UBL 2.1”.
|
||||
|
||||
.. image:: peru/peru-journal-edi.png
|
||||
:align: center
|
||||
:alt: Journal EDI field
|
||||
:alt: Journal EDI field.
|
||||
|
||||
.. warning::
|
||||
By default, the value Factur-X (FR) is always displayed, make sure you can uncheck it manually.
|
||||
@@ -341,9 +374,7 @@ available on the Partner form, this information is essential for most transactio
|
||||
the sender company and in the customer, make sure you fill in this information in your records.
|
||||
|
||||
.. image:: peru/peru-id-type.png
|
||||
:align: center
|
||||
:alt: Partner identification type
|
||||
|
||||
:alt: Partner identification type.
|
||||
|
||||
Product
|
||||
~~~~~~~
|
||||
@@ -352,9 +383,7 @@ Additional to the basic information in your products, for the Peruvian localizat
|
||||
Code on the product is a required value to be configured.
|
||||
|
||||
.. image:: peru/peru-unspc-code.png
|
||||
:align: center
|
||||
:alt: UNSPC Code on products
|
||||
|
||||
:alt: UNSPC Code on products.
|
||||
|
||||
Usage and testing
|
||||
=================
|
||||
@@ -374,16 +403,14 @@ fields required as part of the Peru EDI:
|
||||
document type if needed and select Boleta for example.
|
||||
|
||||
.. image:: peru/peru-invoice-document-type.png
|
||||
:align: center
|
||||
:alt: Invoice document type field on invoices
|
||||
:alt: Invoice document type field on invoices.
|
||||
|
||||
- **Operation type**: This value is required for Electronic Invoice and indicates the transaction
|
||||
type, the default value is “Internal Sale” but another value can be selected manually when needed,
|
||||
for example Export of Goods.
|
||||
|
||||
.. image:: peru/peru-operation-type.png
|
||||
:align: center
|
||||
:alt: Invoice operation type field on invoices
|
||||
:alt: Invoice operation type field on invoices.
|
||||
|
||||
- **EDI Affectation Reason**: In the invoice lines, additional to the Tax there is a field “EDI
|
||||
Affectation Reason” that determines the tax scope based on the SUNAT list that is displayed.
|
||||
@@ -391,8 +418,7 @@ fields required as part of the Peru EDI:
|
||||
you can manually select another one when creating the invoice.
|
||||
|
||||
.. image:: peru/peru-tax-affectation-reason.png
|
||||
:align: center
|
||||
:alt: Tax affectation reason in invoice line
|
||||
:alt: Tax affectation reason in invoice line.
|
||||
|
||||
Invoice validation
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
@@ -402,8 +428,7 @@ action registers the account move and triggers the Electronic invoice workflow t
|
||||
OSE and the SUNAT. The following message is displayed at the top of the invoice:
|
||||
|
||||
.. image:: peru/peru-posted-invoice.png
|
||||
:align: center
|
||||
:alt: Sending of EDI Invoice in blue
|
||||
:alt: Sending of EDI Invoice in blue.
|
||||
|
||||
Asynchronous means that the document is not sent automatically after the invoice has been posted.
|
||||
|
||||
@@ -417,16 +442,14 @@ done either automatically by Odoo with a *cron* that runs every hour, or the use
|
||||
immediately by clicking on the button “Sent now”.
|
||||
|
||||
.. image:: peru/peru-sent-manual.png
|
||||
:align: center
|
||||
:alt: Send EDI manually
|
||||
:alt: Send EDI manually.
|
||||
|
||||
**Sent**: Indicates the document was sent to the OSE and was successfully validated. As part of
|
||||
the validation a ZIP file is downloaded and a message is logged in the chatter indicating the
|
||||
correct Government validation.
|
||||
|
||||
.. image:: peru/peru-invoice-sent.png
|
||||
:align: center
|
||||
:alt: Message on chatter when the invoice is valid
|
||||
:alt: Message on chatter when the invoice is valid.
|
||||
|
||||
In case there is a validation error the Electronic Invoice status remains in “To be sent” so the
|
||||
corrections can be made and the invoice can be sent again.
|
||||
@@ -453,8 +476,7 @@ If a validation error is received, you have two options:
|
||||
changes, and then send the invoice again to the SUNAT for another validation.
|
||||
|
||||
.. image:: peru/peru-errors.png
|
||||
:align: center
|
||||
:alt: List of common errors on invoices
|
||||
:alt: List of common errors on invoices.
|
||||
|
||||
For more detail please refert to `Common errors in SUNAT
|
||||
<https://www.nubefact.com/codigos-error-sunat/>`_.
|
||||
@@ -466,8 +488,7 @@ After the invoice is accepted and validated by the SUNAT, the invoice PDF report
|
||||
The report includes a QR code, indicating the invoice is a valid fiscal document.
|
||||
|
||||
.. image:: peru/peru-PDF.png
|
||||
:align: center
|
||||
:alt: Invoice PDF report
|
||||
:alt: Invoice PDF report.
|
||||
|
||||
IAP Credits
|
||||
~~~~~~~~~~~
|
||||
@@ -480,8 +501,7 @@ additional credits are required, you can easily buy them by accessing the link p
|
||||
the message.
|
||||
|
||||
.. image:: peru/peru-credits-IAP.png
|
||||
:align: center
|
||||
:alt: Buying credits in the IAP
|
||||
:alt: Buying credits in the IAP.
|
||||
|
||||
In the IAP service includes packages with different pricing based on the number of credits.
|
||||
The price list in the IAP is always displayed in EUR.
|
||||
@@ -497,8 +517,7 @@ If the invoice was already sent and validated by the SUNAT, the correct way to p
|
||||
clicking on the button Request Cancellation:
|
||||
|
||||
.. image:: peru/peru-cancellation.png
|
||||
:align: center
|
||||
:alt: Request invoice cancellation button
|
||||
:alt: Request invoice cancellation button.
|
||||
|
||||
In order to cancel an invoice, please provide a cancellation Reason.
|
||||
|
||||
@@ -511,22 +530,20 @@ immediately by clicking on the button “Send now”. Once it is sent, a cancell
|
||||
created, as a result the next message and CDR File are logged in the chatter:
|
||||
|
||||
.. image:: peru/peru-cancellation-cdr.png
|
||||
:align: center
|
||||
:alt: Cancellation CDR sent by the SUNAT
|
||||
:alt: Cancellation CDR sent by the SUNAT.
|
||||
|
||||
**Cancelled**: Indicates the cancellation request was sent to the OSE and was successfully
|
||||
validated. As part of the validation a ZIP file is downloaded and a message is logged in the
|
||||
chatter indicating the correct Government validation.
|
||||
|
||||
.. image:: peru/peru-cancelled.png
|
||||
:align: center
|
||||
:alt: nvoice after cancellation
|
||||
:alt: Invoice after cancellation.
|
||||
|
||||
.. warning::
|
||||
One credit is consumed on each cancellation request.
|
||||
|
||||
Cancellation process
|
||||
********************
|
||||
Export invoices
|
||||
***************
|
||||
|
||||
When creating exportation invoices, take into account the next considerations:
|
||||
|
||||
@@ -535,8 +552,7 @@ When creating exportation invoices, take into account the next considerations:
|
||||
- The taxes included in the invoice lines should be EXP taxes.
|
||||
|
||||
.. image:: peru/peru-exp-invoice.png
|
||||
:align: center
|
||||
:alt: Exportation invoices main data
|
||||
:alt: Exportation invoices main data.
|
||||
|
||||
Advance Payments
|
||||
****************
|
||||
@@ -555,13 +571,11 @@ When creating invoices that is subject to Detractions, take into account the nex
|
||||
#. All the products included in the invoice must have these fields configured:
|
||||
|
||||
.. image:: peru/peru-detraction.png
|
||||
:align: center
|
||||
:alt: Detraction fields on products
|
||||
:alt: Detraction fields on products.
|
||||
|
||||
#. Operation type in your invoice must be ``1001``
|
||||
|
||||
.. image:: peru/peru-detraction-invoice.png
|
||||
:align: center
|
||||
:alt: Detraction code on invoices.
|
||||
|
||||
Credit Notes
|
||||
@@ -572,8 +586,7 @@ for this just click on the button “Add Credit Note”, a part of the Peruvian
|
||||
to prove a Credit Reason selecting one of the options in the list.
|
||||
|
||||
.. image:: peru/peru-credit-note.png
|
||||
:align: center
|
||||
:alt: Add Credit Note from invoice
|
||||
:alt: Add Credit Note from invoice.
|
||||
|
||||
.. tip::
|
||||
When creating your first credit Note, select the Credit Method: Partial Refund, this allows you
|
||||
@@ -582,8 +595,7 @@ to prove a Credit Reason selecting one of the options in the list.
|
||||
By default the Credit Note is set in the document type:
|
||||
|
||||
.. image:: peru/peru-credit-note-document.png
|
||||
:align: center
|
||||
:alt: Credit Note document type
|
||||
:alt: Credit Note document type.
|
||||
|
||||
To finish the workflow please follow the instructions on :doc:`our page about Credit Notes
|
||||
<../accounting/customer_invoices/credit_notes>`.
|
||||
|
||||
|
After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 15 KiB |
@@ -717,7 +717,7 @@ Create batch payment
|
||||
Now, record each payment in Odoo using the |NACHA| payment method.
|
||||
|
||||
.. seealso::
|
||||
:ref:`Register Payments in Odoo <payments/register>`
|
||||
:ref:`Register Payments in Odoo <accounting/payments/from-invoice-bill>`
|
||||
|
||||
.. important::
|
||||
Be aware of the cut-off time for same-day payments. Either the file needs to have a future date
|
||||
|
||||
@@ -317,3 +317,43 @@ To change the default behavior, enable :ref:`developer-mode`, then go to :menuse
|
||||
.. important::
|
||||
These parameters are only used to prevent the creation of new records. They **do not prevent
|
||||
replies** from being added to the chatter.
|
||||
|
||||
Allow alias domain system parameter
|
||||
===================================
|
||||
|
||||
Incoming aliases are set in the Odoo database to create records by receiving incoming emails. To
|
||||
view aliases set in the Odoo database, first activate the :ref:`developer mode <developer-mode>`.
|
||||
Then, go to :menuselection:`Settings app --> Technical --> Aliases`.
|
||||
|
||||
The following system parameter, `mail.catchall.domain.allowed`, set with allowed alias domain
|
||||
values, separated by commas, filters out correctly addressed emails to aliases. Setting the domains
|
||||
for which the alias can create a ticket, lead, opportunity, etc., eliminates false positives where
|
||||
email addresses with only the prefix alias, not the domain, are present.
|
||||
|
||||
In some instances, matches have been made in the Odoo database when an email is received with the
|
||||
same alias prefix and a different domain on the incoming email address. This is true in the sender,
|
||||
recipient, and :abbr:`CC (Carbon Copy)` email addresses of an incoming email.
|
||||
|
||||
.. example::
|
||||
When Odoo receives emails with the `commercial` prefix alias in the sender, recipient, or
|
||||
:abbr:`CC (Carbon Copy)` email addresses (e.g. commercial\@example.com), the database falsely
|
||||
treats the email as the full `commercial` alias, with a different domain, and therefore, creates
|
||||
a ticket/lead/opportunity/etc.
|
||||
|
||||
To add the `mail.catchall.domain.allowed` system parameter, first, activate the :ref:`developer mode
|
||||
<developer-mode>`. Then, go to :menuselection:`Settings app --> Technical --> System Parameters`.
|
||||
Click :guilabel:`New`. Then, type in `mail.catchall.domain.allowed` for the :guilabel:`Key` field.
|
||||
|
||||
Next, for the :guilabel:`Value` field, add the domains separated by commas. Manually
|
||||
:icon:`fa-cloud-upload` :guilabel:`(Save)`, and the system parameter takes immediate effect.
|
||||
|
||||
.. image:: email_servers_inbound/allowed-domain.png
|
||||
:alt: mail.catchall.domain.allowed system parameter set.
|
||||
|
||||
Local-part based incoming detection
|
||||
===================================
|
||||
|
||||
When creating a new alias, there is an option to enable :guilabel:`Local-part based incoming
|
||||
detection`. If enabled, Odoo only requires the local-part to match for routing an incoming email. If
|
||||
this feature is turned off, Odoo requires the whole email address to match for routing an incoming
|
||||
email.
|
||||
|
||||
|
After Width: | Height: | Size: 7.1 KiB |
@@ -97,8 +97,8 @@ printer.
|
||||
:alt: Edit the printer connected to the IoT box.
|
||||
|
||||
.. note::
|
||||
Epson and Star receipt printers and Zebra label printers do not need a driver to work. Make sure
|
||||
that no driver is selected for those printers.
|
||||
Epson receipt printers and Zebra label printers do not need a driver to work. Make sure that no
|
||||
driver is selected for those printers.
|
||||
|
||||
The printer is detected but is not recognized correctly
|
||||
-------------------------------------------------------
|
||||
|
||||
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 6.8 KiB |
|
Before Width: | Height: | Size: 7.1 KiB |
@@ -192,6 +192,12 @@ The order of the list does not affect the database in any way. However, it may b
|
||||
the vehicle categories in a specific order, for example, by size, or the numbers of passengers the
|
||||
vehicle can carry.
|
||||
|
||||
.. note::
|
||||
When used with the **Inventory** app, the :guilabel:`Max Weight` and :guilabel:`Max Volume`
|
||||
fields track a vehicle's capacity. This helps manage in-house deliveries by :doc:`showing how
|
||||
much space and weight remain for loading products
|
||||
<../../inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch>`.
|
||||
|
||||
.. image:: models/categories.png
|
||||
:align: center
|
||||
:alt: List view of the models in the fleet.
|
||||
|
||||
|
Before Width: | Height: | Size: 9.0 KiB After Width: | Height: | Size: 14 KiB |
@@ -665,25 +665,6 @@ field.
|
||||
|
||||
.. _payroll/salary-attachment-types:
|
||||
|
||||
Salary attachment types
|
||||
-----------------------
|
||||
|
||||
Salary attachments, also thought of as "wage garnishments", are portions of earnings taken out of a
|
||||
payslip for something specific. Much like all other aspects of payroll configurations, the types of
|
||||
salary attachments **must** be defined.
|
||||
|
||||
To view the currently configured salary attachments, navigate to :menuselection:`Payroll app -->
|
||||
Configuration --> Salary --> Salary Attachment Types`. The default salary attachment types are
|
||||
:guilabel:`Attachment of Salary`, :guilabel:`Assignment of Salary`, and :guilabel:`Child Support`.
|
||||
|
||||
To make a new type of salary attachment, click the :guilabel:`New` button. Then, enter the
|
||||
:guilabel:`Name`, the :guilabel:`Code` (used in the salary rules to compute payslips), and decide if
|
||||
it should have :guilabel:`No End Date`.
|
||||
|
||||
.. image:: payroll/new-attachment.png
|
||||
:align: center
|
||||
:alt: A new salary attachment form filled in.
|
||||
|
||||
Salary package configurator
|
||||
===========================
|
||||
|
||||
@@ -960,16 +941,20 @@ form.
|
||||
|
||||
.. seealso::
|
||||
- :doc:`payroll/contracts`
|
||||
- :doc:`payroll/payslips`
|
||||
- :doc:`payroll/work_entries`
|
||||
- :doc:`payroll/salary_attachments`
|
||||
- :doc:`payroll/payslips`
|
||||
- :doc:`payroll/reporting`
|
||||
- :doc:`payroll/work_entry_analysis`
|
||||
- :doc:`payroll/salary_attachment`
|
||||
|
||||
.. toctree::
|
||||
:titlesonly:
|
||||
|
||||
payroll/contracts
|
||||
payroll/work_entries
|
||||
payroll/salary_attachments
|
||||
payroll/payslips
|
||||
payroll/reporting
|
||||
payroll/work_entry_analysis
|
||||
payroll/salary_attachment
|
||||
|
||||
@@ -184,40 +184,6 @@ spreadsheet view with the report added to it.
|
||||
If the **Documents** application *is* installed, the spreadsheet has the option to be stored in
|
||||
either the **Dashboards** app or **Documents** app.
|
||||
|
||||
Salary attachment report
|
||||
------------------------
|
||||
|
||||
The :guilabel:`Salary Attachment Report` shows all deductions or allocations per employee, such as
|
||||
child support payments and wage garnishments. To view this report, navigate to
|
||||
:menuselection:`Payroll app --> Reporting --> Salary Attachment Report`.
|
||||
|
||||
.. image:: reporting/attachment-of-salary.png
|
||||
:align: center
|
||||
:alt: View the Attachment of Salary report that shows all salary garnishments.
|
||||
|
||||
The employees are listed in the left-side column, while the different deductions are listed in the
|
||||
top row, organized by deduction and monthly individual payslips.
|
||||
|
||||
The report can be exported as an XLSX file, or inserted into a spreadsheet, using the corresponding
|
||||
buttons at the top.
|
||||
|
||||
Click the :guilabel:`Measures` button to reveal the options of what data can be displayed.
|
||||
:guilabel:`Assignment of salary`, :guilabel:`Attachment of salary`, :guilabel:`Child support`, and
|
||||
:guilabel:`Count` can all be selected or deselected by clicking on the item. If an item has a
|
||||
checkmark next to it, that information is displayed.
|
||||
|
||||
.. image:: reporting/attachment-measures.png
|
||||
:align: center
|
||||
:alt: Select the options to be displayed in the Salary Attachment Report.
|
||||
|
||||
The :guilabel:`Salary Attachment Report` can be compared to the report for the previous time period
|
||||
or the previous year. To view these comparisons, click the :guilabel:`⬇️ (down arrow)` icon in the
|
||||
search bar to reveal the various :ref:`filter <payroll/filters>` and grouping options.
|
||||
|
||||
In the section titled :guilabel:`Comparison`, click on either :guilabel:`Payslip End Date: Previous
|
||||
Period` or :guilabel:`Payslip End Date: Previous Year`. The report updates and displays the
|
||||
previous time period values, as well as the :guilabel:`Variation` between the two.
|
||||
|
||||
.. _payroll/filters:
|
||||
|
||||
Filters
|
||||
|
||||
|
Before Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 14 KiB |
@@ -0,0 +1,63 @@
|
||||
========================
|
||||
Salary attachment report
|
||||
========================
|
||||
|
||||
*Salary attachments* in Odoo refer to a portion of an employee's earnings that are designated for
|
||||
a specific purpose, both voluntary and involuntary. These can include contributions to a retirement
|
||||
plan, repayment of a loan, wage garnishments, or child support.
|
||||
|
||||
Voluntary salary attachments, such as repaying a loan, or contributing to a charity on a monthly
|
||||
basis, are considered *Assignments of Salary* in Odoo. Salary attachments that are required, such as
|
||||
a lawsuit settlement repayment, or repaying a tax lien, are considered *Attachments of Salary* in
|
||||
Odoo. Child support payments have their own category, and are simply referred to as *Child Support*
|
||||
in Odoo.
|
||||
|
||||
To view this report, navigate to :menuselection:`Payroll app --> Reporting --> Salary Attachment
|
||||
Report`. The :guilabel:`Salary Attachment Report` shows all deductions or allocations per employee,
|
||||
organized by payslip, in a default pivot table. The default filter is the end of the current year
|
||||
(:guilabel:`Payslip End Date: (year)`). The employees populate the rows, while the various
|
||||
deductions populate the columns, organized by type of deduction, and further grouped by individual
|
||||
payslip.
|
||||
|
||||
The default report contains **all** payslips for the current year, so the report typically contains
|
||||
a large number of columns. This could make it difficult to view all the data at once, as the report
|
||||
may be very wide and require scrolling to view all the data.
|
||||
|
||||
To view a condensed version of salary attachments, and have all the salary attachment columns
|
||||
visible on one page, click the :icon:`fa-minus-square-o` :guilabel:`Total` icon at the top of the
|
||||
report, above the various payslips.
|
||||
|
||||
This presents the salary attachments for the current year, and only displays three columns,
|
||||
:guilabel:`Attachment of Salary`, :guilabel:`Assignment of Salary`, and :guilabel:`Child Support.`
|
||||
|
||||
Each entry displays the total amount paid for each specific type of salary attachment, for each
|
||||
employee.
|
||||
|
||||
.. image:: salary_attachment/salary-attachment.png
|
||||
:alt: The Attachment of Salary report that shows all salary garnishments in a condensed view.
|
||||
|
||||
The report can be downloaded as an XLSX file, or :doc:`inserted into a spreadsheet
|
||||
<../../productivity/spreadsheet/insert>` using the corresponding buttons at the top.
|
||||
|
||||
Click the :guilabel:`Measures` button to reveal the options of what data is displayed.
|
||||
:guilabel:`Assignment of salary`, :guilabel:`Attachment of salary`, and :guilabel:`Child support`
|
||||
are all selected and visible, by default, while the :guilabel:`Count` option is not.
|
||||
|
||||
Click an option to either show or hide that particular metric. A :icon:`fa-check`
|
||||
:guilabel:`(checkmark)` icon indicates the data is visible.
|
||||
|
||||
Compare to previous year
|
||||
========================
|
||||
|
||||
The :guilabel:`Salary Attachment Report` can be compared to the report for the previous time period
|
||||
or the previous year.
|
||||
|
||||
To view these comparisons, click the :icon:`fa-caret-down` :guilabel:`(down arrow)` icon in the
|
||||
search bar, then click either :guilabel:`Payslip End Date: Previous Period` or :guilabel:`Payslip
|
||||
End Date: Previous Year`, beneath the :icon:`fa-adjust` :guilabel:`Comparison` column.
|
||||
|
||||
The report updates and displays the current time period values, and the previous time period values,
|
||||
as well as the :guilabel:`Variation` between the two, in a percentage.
|
||||
|
||||
.. image:: salary_attachment/comparison-attachment.png
|
||||
:alt: The salary attachment report modified to compare to the previous year.
|
||||
|
After Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 23 KiB |
@@ -0,0 +1,154 @@
|
||||
==================
|
||||
Salary attachments
|
||||
==================
|
||||
|
||||
Salary attachments are portions of earnings taken directly out of a payslip for a specific purpose,
|
||||
whether voluntary or required.
|
||||
|
||||
When the deduction is voluntary, they are typically considered *deductions*. When the deduction is
|
||||
court-ordered, or involuntary, it is sometimes referred to as a *wage garnishment*. In Odoo, these
|
||||
are all universally called, *salary attachments*.
|
||||
|
||||
.. _payroll/salary-attachment/types:
|
||||
|
||||
Salary attachment types
|
||||
=======================
|
||||
|
||||
To view the currently configured salary attachment types, navigate to :menuselection:`Payroll app
|
||||
--> Configuration --> Salary Attachment Types`. The default salary attachment types are:
|
||||
:guilabel:`Attachment of Salary`, :guilabel:`Assignment of Salary`, and :guilabel:`Child Support`.
|
||||
|
||||
Each salary attachment type displays the :guilabel:`Name` of the attachment type, the
|
||||
:guilabel:`Code` used when calculating payslips, a checkbox to indicate if there is :guilabel:`No
|
||||
End Date`, and whether it is :guilabel:`Country` specific (or universal).
|
||||
|
||||
.. image:: salary_attachments/attachment-types.png
|
||||
:alt: The default salary attachment types.
|
||||
|
||||
Create new salary attachment types
|
||||
----------------------------------
|
||||
|
||||
.. danger::
|
||||
Upon installation of the **Payroll** application, the pre-configured default salary attachment
|
||||
types are linked to a variety of rules that are linked to various salary structures, as well as
|
||||
the installed :ref:`localization package <fiscal_localizations/packages>`.
|
||||
|
||||
It is **not** recommended to alter or modify **any** of the preconfigured salary attachment
|
||||
types, especially if they have been previously used on payslips in the database. Doing so may
|
||||
affect various salary rules, and can prevent the creation of payslips.
|
||||
|
||||
A new salary attachment type *can* be created, but this should only be done when absolutely
|
||||
necessary. All salary attachments can be associated with one of the three default salary
|
||||
attachment types.
|
||||
|
||||
To make a new type of salary attachment, click the :guilabel:`New` button, and a blank
|
||||
:guilabel:`Salary Attachment Types` form loads. Enter the :guilabel:`Name` for the new salary
|
||||
attachment type in the corresponding field. Next, enter the :guilabel:`Code` used in the salary
|
||||
rules to compute payslips. Last, tick the :guilabel:`No End Date` checkbox if this salary attachment
|
||||
never expires.
|
||||
|
||||
If in a multi-company database, with locations in multiple countries, a :guilabel:`Country` field
|
||||
also appears on the :guilabel:`Salary Attachment Types` form. Select the country the attachment
|
||||
applies to, or leave blank if it is universal.
|
||||
|
||||
.. _payroll/salary-attachment/create:
|
||||
|
||||
Create a salary attachment
|
||||
==========================
|
||||
|
||||
All salary attachments must be configured separately for each employee, for each type of salary
|
||||
attachment. To view the currently configured salary attachments, navigate to :menuselection:`Payroll
|
||||
app --> Contracts --> Salary Attachments`.
|
||||
|
||||
All salary attachments appear in a default list view, and displays the name of the
|
||||
:guilabel:`Employees`, :guilabel:`Description`, the salary attachment :guilabel:`Type`, the
|
||||
:guilabel:`Monthly Amount`, :guilabel:`Start Date`, and current :guilabel:`Status`.
|
||||
|
||||
To create a new salary attachment, click the :guilabel:`New` button in the top-left corner, and a
|
||||
blank :guilabel:`Salary Attachment` form loads. Enter the following information on the form:
|
||||
|
||||
- :guilabel:`Employees`: Using the drop-down menu, select the desired employees. Multiple employees
|
||||
can be listed in this field.
|
||||
- :guilabel:`Description`: Enter a short description of the salary attachment.
|
||||
- :guilabel:`Type`: Using the drop-down menu, select the specific :ref:`salary attachment type
|
||||
<payroll/salary-attachment/types>`.
|
||||
- :guilabel:`Start Date`: Using the calendar selector, select the date the salary attachment goes
|
||||
into effect.
|
||||
- :guilabel:`Estimated End Date`: This field is **not** modifiable, and **only** appears after the
|
||||
:guilabel:`Monthly Amount` field is populated. This field is the estimated date when the salary
|
||||
attachment will be completed. Today's date populates the field by default. Then, when the
|
||||
:guilabel:`Total Amount` field is populated, this date is updated.
|
||||
- :guilabel:`Document`: If any documentation is needed, such as a court order, click the
|
||||
:guilabel:`Upload your file` button, and a file explorer window loads. Select the desired document
|
||||
to attach it to the record. Only **one** document can be attached to a salary attachment.
|
||||
- :guilabel:`Monthly Amount`: Enter the amount taken out of each paycheck every month in this field.
|
||||
- :guilabel:`Total Amount`: This field **only** appears if the :ref:`salary attachment type
|
||||
<payroll/salary-attachment/types>` has no end date (the :guilabel:`No End Date` option is
|
||||
**not** ticked.)
|
||||
|
||||
.. image:: salary_attachments/salary-attachment-form.png
|
||||
:alt: The salary attachment form with all fields filled out.
|
||||
|
||||
Since the salary attachment form auto saves as the fields are populated, after making a salary
|
||||
attachment for an individual employee, there is no further action required.
|
||||
|
||||
If creating salary attachments for multiple employees on a single salary attachment form, after the
|
||||
form is filled out, click the :guilabel:`Create Individual Attachments` button. This creates
|
||||
separate salary attachments for each of the employees listed in the :guilabel:`Employees` field.
|
||||
|
||||
After the separate salary attachments have been created, the screen returns to the :guilabel:`Salary
|
||||
Attachment` dashboard, but with a :guilabel:`Description` filter, populated with the description
|
||||
filled in on the salary attachment form. All the salary attachments have a status of
|
||||
:guilabel:`Running`, since they are currently active. Clear the filter in the search box to view the
|
||||
default :guilabel:`Salary Attachment` dashboard in its entirety.
|
||||
|
||||
Manage salary attachments
|
||||
=========================
|
||||
|
||||
Salary attachments can have one of three statuses: *Running*, *Completed*, or *Canceled*. To view
|
||||
the current status of all salary attachments, navigate to :menuselection:`Payroll app --> Contracts
|
||||
--> Salary Attachments`.
|
||||
|
||||
All salary attachments appear in the order they were configured. To view the salary attachments by
|
||||
a particular metric, such as the :guilabel:`Status`, or :guilabel:`Type`, click on the column title
|
||||
to sort by that specific column.
|
||||
|
||||
Completed salary attachments
|
||||
----------------------------
|
||||
|
||||
When a salary attachment is created, it has a status of :guilabel:`Running`. Once the salary
|
||||
attachment is finished (the *Total Amount* entered on the :ref:`salary attachment form
|
||||
<payroll/salary-attachment/create>` has been paid in full), the status automatically changes to
|
||||
*Completed*, and the employee no longer has the money taken out of future paychecks.
|
||||
|
||||
If a salary attachment has been fulfilled, but has not automatically changed to *Completed*, the
|
||||
record can be manually updated. To change the status, open the *Salary Attachment* dashboard by
|
||||
navigating to :menuselection:`Payroll app --> Contracts --> Salary Attachments`.
|
||||
|
||||
Click on the record to update, and the detailed :guilabel:`Salary Attachment` form loads. On the
|
||||
individual :guilabel:`Salary Attachment` record, click the :guilabel:`Mark as Completed` button in
|
||||
the upper-left corner, and the status changes to :guilabel:`Completed`.
|
||||
|
||||
.. example::
|
||||
The following is an example of when a payroll manager may need to manually change a salary
|
||||
attachment from :guilabel:`Active` to :guilabel:`Cancelled`.
|
||||
|
||||
Rose Smith has a salary attachment for a lawsuit settlement, where she is required to pay
|
||||
$3,000.00. A salary attachment is created that takes $250.00 a month out of Rose's paycheck, to
|
||||
go towards this settlement payment.
|
||||
|
||||
After six months, Rose has paid $1,500.00 from her salary. She received a tax refund, and uses
|
||||
the money to pay off the remainder of the lawsuit settlement. After sending the relevant
|
||||
documentation to the payroll manager, showing the settlement has been paid in full, the payroll
|
||||
manager manually changes the status of her salary attachment to :guilabel:`Completed`.
|
||||
|
||||
Cancel salary attachments
|
||||
-------------------------
|
||||
|
||||
Any salary attachment can be cancelled at any time. To cancel a salary attachment, click on the
|
||||
individual attachment record from the main :guilabel:`Salary Attachment` dashboard to open the
|
||||
record. From the :guilabel:`Salary Attachment` record, click the :guilabel:`Cancel` button to cancel
|
||||
the salary attachment, and stop having the designated money taken out of future paychecks.
|
||||
|
||||
.. seealso::
|
||||
:doc:`salary_attachment`
|
||||
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 18 KiB |
@@ -285,3 +285,4 @@ delivery order. To add or change the delivery method on the delivery itself, go
|
||||
setup_configuration/label_type
|
||||
setup_configuration/multipack
|
||||
setup_configuration/print_on_validation
|
||||
setup_configuration/dispatch
|
||||
|
||||
@@ -0,0 +1,267 @@
|
||||
==========================
|
||||
Dispatch management system
|
||||
==========================
|
||||
|
||||
The *dispatch management system* feature in Odoo is used to plan and build shipments. Key features
|
||||
include:
|
||||
|
||||
- **Load building**: Group products for specific carriers, assign those :doc:`batches
|
||||
<../picking_methods/batch>` to loading docks, and manage vehicle assignments based on fleet
|
||||
capacity. This ensures the right products are packed into the appropriate trucks for delivery.
|
||||
- :doc:`Fleet management <../../../../hr/fleet>`: Track and manage the capacity of in-house
|
||||
delivery vehicles.
|
||||
|
||||
Configuration
|
||||
=============
|
||||
|
||||
To use the dispatch management system, the following setup must be completed:
|
||||
|
||||
#. :ref:`Install <general/install>` the **Fleet** application.
|
||||
#. Configure vehicle :ref:`capacity (volume and weight)
|
||||
<inventory/shipping_receiving/vehicle-capacity>`.
|
||||
#. Enter vehicle :doc:`car model(s) <../../../../hr/fleet/models>`.
|
||||
#. Enable :ref:`necessary features <inventory/shipping_receiving/inventory-features>` in the
|
||||
**Inventory** app.
|
||||
#. Set up :ref:`vehicles as delivery methods
|
||||
<inventory/shipping_receiving/delivery-method-for-carrier>`.
|
||||
#. Create :ref:`dock locations <inventory/shipping_receiving/docks>`.
|
||||
|
||||
.. _inventory/shipping_receiving/vehicle-capacity:
|
||||
|
||||
Vehicle capacity
|
||||
----------------
|
||||
|
||||
To configure the vehicle capacity, go to :menuselection:`Fleet app --> Configuration -->
|
||||
Categories`.
|
||||
|
||||
Next, click :guilabel:`New` to add a new category, or click into an existing category to modify it.
|
||||
In the :guilabel:`Name` field, enter the type of vehicle (e.g., `Pick-up truck`, `Van`, or `Cargo
|
||||
truck`). Then, enter the vehicle capacity in the :guilabel:`Max Weight` (in kilograms) and
|
||||
:guilabel:`Max Volume` (in cubic meters) fields.
|
||||
|
||||
|
||||
.. image:: dispatch/categories.png
|
||||
:alt: Vehicle categories with defined weight and volume.
|
||||
|
||||
.. note::
|
||||
The units of measurement for vehicle capacity are assigned at the global level in the
|
||||
**Settings** app, in the :guilabel:`Units of Measure` section.
|
||||
|
||||
.. image:: dispatch/settings.png
|
||||
:alt: Show units of measure settings.
|
||||
|
||||
.. seealso::
|
||||
:ref:`Vehicle category <fleet/categories>`
|
||||
|
||||
|
||||
Car model
|
||||
---------
|
||||
|
||||
Configuring a vehicle's car model is required when adding vehicles in Odoo. Ensure the correct
|
||||
*Category* is selected for a car model. Doing so automatically applies weight and volume capacities
|
||||
to all vehicles of that type.
|
||||
|
||||
To configure, navigate to :menuselection:`Fleet app --> Configuration --> Models`.
|
||||
|
||||
From the :guilabel:`Models` list, select an existing model, or click :guilabel:`New` in the top-left
|
||||
corner to create a new model. Then, set the relevant :guilabel:`Category` field to the relevant
|
||||
vehicle category.
|
||||
|
||||
.. seealso::
|
||||
:doc:`Create car model <../../../../hr/fleet/models>`
|
||||
|
||||
|
||||
.. _inventory/shipping_receiving/inventory-features:
|
||||
|
||||
Inventory settings
|
||||
------------------
|
||||
|
||||
Next, go to :menuselection:`Inventory app --> Configuration --> Settings`, and enable the required
|
||||
features for dispatch management.
|
||||
|
||||
In the :guilabel:`Operations` section, tick the :guilabel:`Batch, Wave & Cluster Transfers`
|
||||
checkbox to prepare batches of orders for delivery.
|
||||
|
||||
In the :guilabel:`Shipping` section, tick the :guilabel:`Delivery Methods` and :guilabel:`Dispatch
|
||||
Management System` checkboxes. Doing so allows specific vehicles to be :ref:`set as carriers
|
||||
<inventory/shipping_receiving/delivery-method-for-carrier>`.
|
||||
|
||||
In the :guilabel:`Warehouse` section, tick the :guilabel:`Storage Locations` checkbox to assign
|
||||
specific locations in the warehouse as loading zones for delivery trucks.
|
||||
|
||||
Then, once all the configurations are complete, be sure to click :guilabel:`Save`.
|
||||
|
||||
.. _inventory/shipping_receiving/delivery-method-for-carrier:
|
||||
|
||||
Delivery method
|
||||
---------------
|
||||
|
||||
Next, assign each delivery vehicle as a *Carrier* by configuring a delivery method.
|
||||
|
||||
To configure delivery methods, go to :menuselection:`Inventory app --> Configuration --> Delivery
|
||||
Methods`. Select an existing delivery method, or click :guilabel:`New`.
|
||||
|
||||
.. seealso::
|
||||
:doc:`Configure delivery method <../setup_configuration>`
|
||||
|
||||
On the :guilabel:`Delivery Method` form, enter a name for the delivery method. It is recommended to
|
||||
use identifying information, such as the vehicle description and license plate number (e.g. `Truck
|
||||
123-ABCD`).
|
||||
|
||||
Since the delivery methods are managed internally, set the :guilabel:`Provider` to either
|
||||
:guilabel:`Fixed Price` or :guilabel:`Based on Rules`. For more information about how shipping
|
||||
prices are calculated, refer to the :doc:`Delivery method <../setup_configuration>` article.
|
||||
|
||||
Next, set a :guilabel:`Delivery Product`, which is the product that shows up as the customer's
|
||||
:ref:`delivery charge <inventory/shipping_receiving/delivery-product>` on the sales order or
|
||||
invoice.
|
||||
|
||||
Optionally, in the :guilabel:`Availability` tab, set the :guilabel:`Countries`, :guilabel:`States`,
|
||||
or :guilabel:`Zip Prefixes` to limit the range of local delivery.
|
||||
|
||||
.. figure:: dispatch/delivery-method.png
|
||||
:alt: Delivery method form.
|
||||
|
||||
Example delivery method, with the :guilabel:`Zip Prefixes` set to San Francisco's zip code.
|
||||
|
||||
.. _inventory/shipping_receiving/docks:
|
||||
|
||||
Dock locations
|
||||
--------------
|
||||
|
||||
Each loading dock must have a dedicated location. To create or configure dock locations, go to
|
||||
:menuselection:`Inventory app --> Configuration --> Locations`.
|
||||
|
||||
Click the desired location, which opens the :guilabel:`Location` form. In the :guilabel:`Additional
|
||||
Information` section, tick the :guilabel:`Is a Dock Location` checkbox.
|
||||
|
||||
.. figure:: dispatch/dock-location.png
|
||||
:alt: Location configuration.
|
||||
|
||||
Location configuration page with :guilabel:`Is a Dock Location` checkbox ticked.
|
||||
|
||||
Build loads
|
||||
===========
|
||||
|
||||
Once setup is complete, :ref:`assign orders to a carrier
|
||||
<inventory/shipping_receiving/assign-carrier>` and :ref:`group them into batches
|
||||
<inventory/shipping_receiving/create-batch>`. Then, :ref:`configure the batch form
|
||||
<inventory/shipping_receiving/batch-form>`, as needed.
|
||||
|
||||
To group products, go to the :menuselection:`Inventory app --> Operations --> Deliveries`, which
|
||||
reveals a list of outgoing deliveries.
|
||||
|
||||
.. seealso::
|
||||
Since this article is about a specific use case, explore details about each picking method in
|
||||
their dedicated articles.
|
||||
|
||||
- :doc:`../picking_methods/batch`
|
||||
- :doc:`Wave picking <../picking_methods/wave>`
|
||||
- :doc:`../picking_methods/cluster`
|
||||
|
||||
|
||||
.. _inventory/shipping_receiving/assign-carrier:
|
||||
|
||||
Carrier assignment
|
||||
------------------
|
||||
|
||||
Reveal the *Carrier* column, if it is not visible by default, by clicking the
|
||||
:icon:`oi-settings-adjust` :guilabel:`(settings)` icon in the top-right corner, and ticking the
|
||||
:guilabel:`Carrier` checkbox.
|
||||
|
||||
.. tip::
|
||||
Other useful columns to enable can be :guilabel:`Zip` code, :guilabel:`Shipping Weight`, and
|
||||
:guilabel:`Shipping Volume`.
|
||||
|
||||
Select the delivery orders for the batch by ticking the checkboxes on the left. Next, click into the
|
||||
line's :guilabel:`Carrier` fields. In the resulting drop-down menu, choose the desired vehicle's
|
||||
:ref:`delivery method <inventory/shipping_receiving/delivery-method-for-carrier>`. A
|
||||
:guilabel:`Confirmation` pop-up window appears, indicating the number of orders being added to the
|
||||
batch. Click :guilabel:`Confirm`, and the carrier is updated for all the selected records.
|
||||
|
||||
.. figure:: dispatch/set-carrier.png
|
||||
:alt: Set carrier.
|
||||
|
||||
The delivery method `Truck 1-MER-001` is set as the :guilabel:`Carrier` for two delivery orders.
|
||||
|
||||
.. _inventory/shipping_receiving/create-batch:
|
||||
|
||||
Create batch
|
||||
------------
|
||||
|
||||
With the carrier set, begin adding orders to a batch or wave transfer by ticking the checkbox.
|
||||
|
||||
.. note::
|
||||
If a delivery order is already assigned to a batch transfer, assigning a batch transfer here does
|
||||
**not** update it.
|
||||
|
||||
Then, click the :icon:`fa-cog` :guilabel:`Actions` button, and click either :guilabel:`Add to batch`
|
||||
or :guilabel:`Add to wave`. In the pop-up window, ensure :guilabel:`Add to` is set to :guilabel:`a
|
||||
new [batch/wave] transfer`, then click :guilabel:`Confirm`.
|
||||
|
||||
.. figure:: dispatch/add-to-wave.png
|
||||
:alt: Example wave.
|
||||
|
||||
Delivery orders are selected to be grouped into a wave transfer.
|
||||
|
||||
Alternative batch creation method
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Another place to create batches is by going to the :menuselection:`Inventory` app, and in the
|
||||
:guilabel:`Delivery Orders` card, click the :icon:`fa-ellipsis-v` :guilabel:`(three dots)` icon. In
|
||||
the resulting drop-down menu, click :guilabel:`Prepare batch`.
|
||||
|
||||
.. note::
|
||||
The :guilabel:`Transport Management` drop-down menu contains other tools for fleet management:
|
||||
|
||||
- :guilabel:`Manage Batches`: open list of batches
|
||||
- :guilabel:`Dock Dispatching`: open weekly calendar view of scheduled batch operations
|
||||
- :guilabel:`Batches by Route`: Kanban view of batches grouped by fulfillment route
|
||||
- :guilabel:`Calendar`: open hourly calendar view of scheduled operations
|
||||
- :guilabel:`Statistics`: open pivot table of the batch transfers
|
||||
|
||||
.. image:: dispatch/prepare-batch.png
|
||||
:alt: Show prepare batch option from the Transport Management drop-down menu.
|
||||
|
||||
.. _inventory/shipping_receiving/batch-form:
|
||||
|
||||
Batch form
|
||||
----------
|
||||
|
||||
On the batch transfer form, fill the following fields out accordingly:
|
||||
|
||||
- :guilabel:`Responsible`: employee assigned to the picking. Leave blank if *any* worker can fulfill
|
||||
this picking.
|
||||
- :guilabel:`Operation Type`: from the drop-down menu, select the operation type under which the
|
||||
picking is categorized.
|
||||
- :guilabel:`Scheduled Date`: specifies the date by which the :guilabel:`Responsible` person should
|
||||
complete the transfer to the output location.
|
||||
- :guilabel:`Dock Location`: select the loading location.
|
||||
- :guilabel:`Vehicle`: select the vehicle, which will auto-fill :guilabel:`Vehicle Category`.
|
||||
- :guilabel:`Vehicle Category`: show if the order exceeds the :ref:`vehicle's capacity limits
|
||||
<inventory/shipping_receiving/vehicle-capacity>`
|
||||
|
||||
.. example::
|
||||
The :guilabel:`Volume` bar is grayed out because the capacity has been reached.
|
||||
|
||||
.. image:: dispatch/batch-form.png
|
||||
:alt: Show batch form.
|
||||
|
||||
Prepare delivery route
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
To help the driver prepare, click the :guilabel:`Map` button at the top of the batch or wave form to
|
||||
view delivery destinations on a map. Selecting an individual delivery order pinpoints its location.
|
||||
|
||||
.. note::
|
||||
The :guilabel:`Map` button is only visible for transfers with the :guilabel:`In progress` status.
|
||||
|
||||
.. image:: dispatch/map.png
|
||||
:alt: Show map in Odoo, with information of the delivery orders.
|
||||
|
||||
Additionally, use the :guilabel:`View in Google Maps` button to generate a route from the warehouse
|
||||
to the delivery points.
|
||||
|
||||
.. image:: dispatch/google-map.png
|
||||
:alt: Show Google Map route.
|
||||
|
||||
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 5.4 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 169 KiB |
|
After Width: | Height: | Size: 184 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 27 KiB |
|
After Width: | Height: | Size: 15 KiB |
@@ -1,6 +1,6 @@
|
||||
=====================================
|
||||
Synchronize Google calendar with Odoo
|
||||
=====================================
|
||||
===============================
|
||||
Google Calendar synchronization
|
||||
===============================
|
||||
|
||||
Synchronize Google Calendar with Odoo to see and manage meetings from both platforms (updates go in
|
||||
both directions). This integration helps organize schedules, so a meeting is never missed.
|
||||
|
||||
@@ -57,6 +57,9 @@ as:
|
||||
#. Document traceability and inalterability (any alteration made to a signed document is detected by
|
||||
Odoo with the use of cryptographic proofs)
|
||||
|
||||
.. note::
|
||||
:doc:`Documentation for Germany <sign/germany>`
|
||||
|
||||
United States of America
|
||||
------------------------
|
||||
|
||||
|
||||
@@ -0,0 +1,74 @@
|
||||
:orphan:
|
||||
|
||||
=============================
|
||||
Odoo Sign legality in Germany
|
||||
=============================
|
||||
|
||||
:doc:`Odoo Sign <../sign>` is your trusted partner for secure, efficient, and legally compliant
|
||||
electronic signatures in Germany.
|
||||
|
||||
Legal framework for electronic signatures in Germany
|
||||
====================================================
|
||||
|
||||
In Germany, electronic signatures are regulated under `eIDAS Regulation No. 910/2014
|
||||
<https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=uriserv%3AOJ.L_.2014.257.01.0073.01.ENG>`_ and
|
||||
the `Trust Services Act <https://www.gesetze-im-internet.de/vdg/BJNR274510017.html>`_. The law
|
||||
establishes the legal basis for acknowledging electronic records, contracts, and digital signatures.
|
||||
The key points of the law include:
|
||||
|
||||
- **Legal recognition**: electronic signatures are legally equivalent to handwritten signatures if
|
||||
they meet certain criteria.
|
||||
- **Reliability and security**: electronic signatures must be created with a secure method that can
|
||||
reliably identify the signatory and ensure the integrity of the signed document.
|
||||
- **Qualified signature**: there are certain use cases that require a qualified signature issued by
|
||||
a trust service provider.
|
||||
|
||||
How Odoo Sign complies with German regulations
|
||||
==============================================
|
||||
|
||||
Odoo Sign ensures full compliance with the Electronic Signature Law of Germany by incorporating the
|
||||
following features:
|
||||
|
||||
- **Secure signature creation**: Odoo Sign utilizes advanced cryptographic techniques to ensure the
|
||||
authenticity and integrity of electronic signatures.
|
||||
- **Third-party signature authenticator**: Odoo Online serves as an independent validation mechanism
|
||||
that adds an extra layer of security to the procurement process.
|
||||
- **Audit trails**: detailed audit logs are maintained to provide evidence of the signing process,
|
||||
including timestamps, IP addresses, and identity verification.
|
||||
- **Cryptographic traceability and immutability**: Odoo Sign ensures that any operation is logged
|
||||
securely. An audit log provides full transparency to all parties while preserving private data.
|
||||
- **Multiple authentication means**: authentication by SMS, email, geoIP or handwritten electronic
|
||||
signature.
|
||||
|
||||
Types of documents you can sign with Odoo Sign
|
||||
==============================================
|
||||
|
||||
Odoo Sign is versatile and can be used for a wide range of documents, including but not limited to:
|
||||
|
||||
- **Contracts and agreements**: business contracts, employment agreements, and service contracts.
|
||||
- **Financial documents**: loan agreements, investment documents, and financial reports.
|
||||
- **HR documents**: employee onboarding forms, non-disclosure agreements (NDAs), and performance
|
||||
reviews.
|
||||
- **Commercial transactions**: purchase orders, sales agreements, and supplier contracts.
|
||||
|
||||
Potential exceptions
|
||||
====================
|
||||
|
||||
While Odoo Sign is broadly applicable, there are certain exceptions where electronic signatures may
|
||||
not be suitable or legally recognized in Germany:
|
||||
|
||||
- **Wills and trusts**: documents related to inheritance, wills, and trusts often require
|
||||
handwritten signatures.
|
||||
- **Real estate transactions**: some property transactions may still require notarized handwritten
|
||||
signatures.
|
||||
- **Government forms**: specific government forms and applications may mandate physical signatures.
|
||||
|
||||
.. admonition:: Disclaimer
|
||||
|
||||
The information provided on this page is for general informational purposes only and does not
|
||||
constitute legal advice. While Odoo Sign complies with the Electronic Signature Law of Germany,
|
||||
users should consult with legal professionals to ensure specific document types and use cases
|
||||
meet all legal requirements. Compliance with additional industry-specific regulations may also be
|
||||
necessary.
|
||||
|
||||
*Last updated: June 21, 2024*
|
||||
@@ -6,20 +6,20 @@ ePOS printers are designed to work seamlessly with Point of Sale systems. Once c
|
||||
devices automatically share information, allowing for direct printing of tickets from the POS system
|
||||
to the ePOS printer.
|
||||
|
||||
.. important::
|
||||
- Epson printers using Wi-Fi/Ethernet connections and following the `EPOS SDK Javascript protocol
|
||||
<https://download4.epson.biz/sec_pubs/pos/reference_en/technology/epson_epos_sdk.html>`_ are
|
||||
compatible with Odoo **without** needing an :doc:`IoT Box
|
||||
</applications/general/iot/devices/printer>`.
|
||||
- Thermal printers using ESC/POS or StarPRNT protocol are compatible **with** an :doc:`IoT Box
|
||||
</applications/general/iot/devices/printer>`.
|
||||
- Epson printers using only USB connections are compatible **with** an :doc:`IoT Box
|
||||
</applications/general/iot/devices/printer>`.
|
||||
- Epson printers that connect via Bluetooth are **not compatible**.
|
||||
Configuration
|
||||
=============
|
||||
|
||||
.. seealso::
|
||||
- :doc:`https`
|
||||
- :doc:`epos_ssc`
|
||||
To use an ePos printer in Point of Sale:
|
||||
|
||||
#. :ref:`Access the POS settings <configuration/settings>`.
|
||||
#. Activate the :guilabel:`ePos Printer` feature.
|
||||
#. Fill in the field with your ePos IP address.
|
||||
|
||||
.. image:: epos_printers/setting.png
|
||||
:alt: setting to enable the ePos printer feature
|
||||
|
||||
.. note::
|
||||
When the printer connects to a network, it automatically prints a ticket with its IP address.
|
||||
|
||||
Directly supported ePOS printers
|
||||
================================
|
||||
@@ -51,3 +51,18 @@ compatible with Odoo:
|
||||
- Epson TM-T20 family (incompatible ePOS software)
|
||||
- Epson TM-T88 family (incompatible ePOS software)
|
||||
- Epson TM-U220 family (incompatible ePOS software)
|
||||
|
||||
.. important::
|
||||
- Epson printers using Wi-Fi/Ethernet connections and following the `EPOS SDK Javascript protocol
|
||||
<https://download4.epson.biz/sec_pubs/pos/reference_en/technology/epson_epos_sdk.html>`_ are
|
||||
compatible with Odoo **without** needing an :doc:`IoT Box
|
||||
</applications/general/iot/devices/printer>`.
|
||||
- Thermal printers using ESC/POS or StarPRNT protocol are compatible **with** an :doc:`IoT Box
|
||||
</applications/general/iot/devices/printer>`.
|
||||
- Epson printers using only USB connections are compatible **with** an :doc:`IoT Box
|
||||
</applications/general/iot/devices/printer>`.
|
||||
- Epson printers that connect via Bluetooth are **not compatible**.
|
||||
|
||||
.. seealso::
|
||||
- :doc:`https`
|
||||
- :doc:`epos_ssc`
|
||||
|
||||
|
After Width: | Height: | Size: 3.9 KiB |
@@ -32,6 +32,20 @@ Then, follow the corresponding documentation to configure your device:
|
||||
Once the terminal is configured, you can :doc:`create the corresponding payment method and add it to
|
||||
the POS <../payment_methods>`.
|
||||
|
||||
Pay with a payment terminal
|
||||
===========================
|
||||
|
||||
When processing a payment, select the terminal's payment method. Check the amount and
|
||||
click on :guilabel:`Send`. Once the payment is successful, the status changes to :guilabel:`Payment
|
||||
Successful`.
|
||||
|
||||
.. note::
|
||||
- | In case of connection issues between Odoo and the payment terminal, force the payment by
|
||||
clicking on :guilabel:`Force Done`, which allows you to validate the order.
|
||||
| This option is only available after receiving an error message informing you that the
|
||||
connection failed.
|
||||
- To cancel the payment request, click on :guilabel:`Cancel`.
|
||||
|
||||
.. toctree::
|
||||
:titlesonly:
|
||||
|
||||
|
||||
@@ -84,17 +84,3 @@ Terminal Identifier <adyen/identifier>`, and :guilabel:`Adyen Merchant Account`.
|
||||
Once the payment method is created, you can select it in your POS settings. To do so, go to the
|
||||
:ref:`POS' settings <configuration/settings>`, click :guilabel:`Edit`, and add the payment method
|
||||
under the :guilabel:`Payments` section.
|
||||
|
||||
Pay with a payment terminal
|
||||
===========================
|
||||
|
||||
When processing a payment, select :guilabel:`Adyen` as the payment method. Check the amount and
|
||||
click on :guilabel:`Send`. Once the payment is successful, the status changes to :guilabel:`Payment
|
||||
Successful`.
|
||||
|
||||
.. note::
|
||||
- | In case of connection issues between Odoo and the payment terminal, force the payment by
|
||||
clicking on :guilabel:`Force Done`, which allows you to validate the order.
|
||||
| This option is only available after receiving an error message informing you that the
|
||||
connection failed.
|
||||
- To cancel the payment request, click on :guilabel:`cancel`.
|
||||
|
||||
@@ -50,33 +50,3 @@ Then, select your terminal device in the :guilabel:`Payment Terminal Device` fie
|
||||
Once the payment method is created, you can select it in your POS settings. To do so, go to the
|
||||
:ref:`POS' settings <configuration/settings>`, click :guilabel:`Edit`, and add the payment method
|
||||
under the :guilabel:`Payments` section.
|
||||
|
||||
Pay with a payment terminal
|
||||
===========================
|
||||
|
||||
In your *PoS interface*, when processing a payment, select a *Payment
|
||||
Method* using a payment terminal. Check that the amount in the tendered
|
||||
column is the one that has to be sent to the payment terminal and click
|
||||
on *Send*. When the payment is successful, the status will change to
|
||||
*Payment Successful*.
|
||||
|
||||
.. image:: ingenico/payment_terminal_05.png
|
||||
:align: center
|
||||
|
||||
If you want to cancel the payment request, click on cancel. You can
|
||||
still retry to send the payment request.
|
||||
|
||||
If there is any issue with the payment terminal, you can still force the
|
||||
payment using the *Force Done*. This will allow you to validate the
|
||||
order in Odoo even if the connection between the terminal and Odoo has
|
||||
issues.
|
||||
|
||||
.. note::
|
||||
This option will only be available if you received an error message
|
||||
telling you the connection failed.
|
||||
|
||||
Once your payment is processed, on the payment record, you’ll find the
|
||||
type of card that has been used and the transaction ID.
|
||||
|
||||
.. image:: ingenico/payment_terminal_06.png
|
||||
:align: center
|
||||
|
||||
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 7.8 KiB |
@@ -95,21 +95,6 @@ Select the payment method by going to the :ref:`POS' settings <configuration/set
|
||||
it to the payment method under the :guilabel:`Payment Methods` field of the :guilabel:`Payment`
|
||||
section.
|
||||
|
||||
.. _pos-mercado-pago-pay:
|
||||
|
||||
Paying with a payment terminal
|
||||
==============================
|
||||
|
||||
When processing a payment, select your Mercado Pago payment method, check the amount, and click
|
||||
:guilabel:`Send`. Once the payment is successful, the status changes to :guilabel:`Payment
|
||||
Successful`.
|
||||
|
||||
.. note::
|
||||
- In case of connection issues between Odoo and the payment terminal, force the payment by
|
||||
clicking :guilabel:`Force Done`, which allows you to validate the order. This option is only
|
||||
available after receiving an error message informing you that the connection failed.
|
||||
- To cancel the payment request, click :guilabel:`Cancel`.
|
||||
|
||||
.. important::
|
||||
Any action made on the terminal should trigger a notification on the POS interface. Ensure the
|
||||
:ref:`webhook secret key <pos-mercado-pago-credentials>` is correctly configured if you are not
|
||||
|
||||
@@ -52,19 +52,5 @@ Configure the payment method
|
||||
Once the payment method is created, you can enable it for your POS. To do so, go to the :ref:`POS'
|
||||
settings <configuration/settings>` and add the payment method under the :guilabel:`Payment` section.
|
||||
|
||||
Pay with a payment terminal
|
||||
===========================
|
||||
|
||||
When processing a payment, select the Razorpay payment method. Check the amount and click
|
||||
:guilabel:`Send`. Once the payment is successful, the status changes to :guilabel:`Payment
|
||||
Successful`. To cancel the payment request, click :guilabel:`Cancel`.
|
||||
|
||||
.. image:: razorpay/payment-screen.png
|
||||
:alt: Razorpay connection form
|
||||
|
||||
.. note::
|
||||
- | In case of connection issues between Odoo and the payment terminal, force the payment by
|
||||
clicking on :guilabel:`Force Done`, which allows you to validate the order.
|
||||
| This option is only available after receiving an error message informing you that the
|
||||
connection failed.
|
||||
- The terminal must have at least a 10% battery level to use it.
|
||||
The terminal must have at least a 10% battery level to use it.
|
||||
|
||||
|
Before Width: | Height: | Size: 38 KiB |
@@ -2,13 +2,15 @@
|
||||
SIX
|
||||
===
|
||||
|
||||
Connecting a **SIX payment terminal** allows you to offer a fluid payment flow to your customers and
|
||||
Connecting a SIX payment terminal allows you to offer a fluid payment flow to your customers and
|
||||
ease the work of your cashiers.
|
||||
|
||||
.. warning::
|
||||
Even though Worldline has acquired SIX Payment Services and both companies use Yomani payment
|
||||
terminals, the firmware they run is different. Terminals received from Worldline are, therefore,
|
||||
not compatible with this integration.
|
||||
- Starting in July 2022, it will **not** be possible anymore to connect and use a Six payment
|
||||
terminal in PoS.
|
||||
- Even though Worldline has recently acquired SIX Payment Services and both companies use Yomani
|
||||
payment terminals, the firmware they run is different. Terminals received from Worldline are
|
||||
therefore not compatible with this integration.
|
||||
|
||||
Configuration
|
||||
=============
|
||||
@@ -59,29 +61,3 @@ Then, select your terminal device in the :guilabel:`Payment Terminal Device` fie
|
||||
|
||||
.. image:: six/new-payment-method.png
|
||||
:alt: Creating a new payment method for the SIX payment terminal
|
||||
|
||||
Once the payment method is created, you can select it in your POS settings. To do so, go to the
|
||||
:ref:`POS' settings <configuration/settings>`, click :guilabel:`Edit`, and add the payment method
|
||||
under the :guilabel:`Payments` section.
|
||||
|
||||
Pay with a payment terminal
|
||||
===========================
|
||||
|
||||
When processing a payment, select :ref:`your Six payment method <six/configure>` in the
|
||||
:guilabel:`Payment Method` section and click :guilabel:`Send`. To cancel the payment request, click
|
||||
:guilabel:`Cancel`. Once the payment is successful, the status switches to :guilabel:`Payment
|
||||
Successful`.
|
||||
|
||||
.. image:: six/payment.png
|
||||
:alt: Paying with Six
|
||||
|
||||
.. note::
|
||||
- Once your payment is processed, the type of card used and the transaction ID appear on the
|
||||
payment record.
|
||||
- The language used for error messages is the same as the Six terminal. Configure the terminal to
|
||||
change the language or contact Six.
|
||||
- By default, the port used by the Six terminal is `7784`.
|
||||
|
||||
.. tip::
|
||||
If there are connection issues between the payment terminal and Odoo, you can still force the
|
||||
payment validation in Odoo using the :guilabel:`Force Done` button.
|
||||
|
||||
@@ -89,21 +89,6 @@ To add a **payment method** to your point of sale, go to :menuselection:`Point o
|
||||
Configuration --> Settings`. Select the POS, scroll down to the :guilabel:`Payments` section, and
|
||||
add your payment method for **Stripe** in the :guilabel:`Payment Methods` field.
|
||||
|
||||
Pay with a payment terminal
|
||||
===========================
|
||||
|
||||
When processing a payment, select :guilabel:`Stripe` as the payment method. Check the amount and
|
||||
click :guilabel:`Send`. Once the payment is successful, the status changes to :guilabel:`Payment
|
||||
Successful`. To cancel the payment request, click :guilabel:`cancel`.
|
||||
|
||||
.. note::
|
||||
- | In case of connection issues between Odoo and the payment terminal, force the payment by
|
||||
clicking on :guilabel:`Force Done`, which allows you to validate the order.
|
||||
| This option is only available after receiving an error message informing you that the
|
||||
connection failed.
|
||||
- The terminal must have at least 10% battery level to use it.
|
||||
- The device does not work for payments under €0.50.
|
||||
|
||||
Troubleshooting
|
||||
===============
|
||||
|
||||
|
||||
@@ -118,17 +118,3 @@ Link the payment method to a POS
|
||||
You can select the payment method in your POS settings once the payment method is created. To do so,
|
||||
go to the :ref:`POS' settings <configuration/settings>` and add the payment method under the
|
||||
:guilabel:`Payment methods` field of the :guilabel:`Payment` section.
|
||||
|
||||
Pay with a payment terminal
|
||||
===========================
|
||||
|
||||
When processing a payment, select the related payment method. Check the amount and click on
|
||||
:guilabel:`Send`. Once the payment is successful, the status changes to :guilabel:`Payment
|
||||
Successful`.
|
||||
|
||||
.. note::
|
||||
- | In case of connection issues between Odoo and the payment terminal, force the payment by
|
||||
clicking on :guilabel:`Force Done`, which allows you to validate the order.
|
||||
| This option is only available after receiving an error message informing you that the
|
||||
connection failed.
|
||||
- To cancel the payment request, click :guilabel:`cancel`.
|
||||
|
||||
@@ -91,21 +91,3 @@ under the :guilabel:`Payments` section.
|
||||
- Configure the cashier terminal if you have both a customer and a cashier terminal.
|
||||
- To avoid blocking the terminal, check the initial configuration beforehand.
|
||||
- Set a fixed IP to your IoT Box’s router to prevent losing the connexion.
|
||||
|
||||
Pay with a payment terminal
|
||||
===========================
|
||||
|
||||
When processing a payment, select *Worldline* as payment method. Check the amount and click on
|
||||
*Send*. Once the payment is successful, the status changes to *Payment Successful*.
|
||||
|
||||
Once your payment is processed, the type of card used and the transaction ID appear on the payment
|
||||
record.
|
||||
|
||||
.. image:: worldline/worldline-payment.png
|
||||
:align: center
|
||||
|
||||
.. note::
|
||||
* In case of connexion issues between Odoo and the payment terminal, force the payment by
|
||||
clicking on *Force Done*, which allows you to validate the order. This option is only available
|
||||
after receiving an error message informing you that the connection failed.
|
||||
* To cancel the payment request, click on **cancel**.
|
||||
|
||||
|
Before Width: | Height: | Size: 63 KiB |
@@ -65,6 +65,7 @@ Tags are used to prefix your commit. They should be one of the following
|
||||
main commit for feature involving several separated commits;
|
||||
- **[CLA]** for signing the Odoo Individual Contributor License;
|
||||
- **[I18N]** for changes in translation files;
|
||||
- **[PERF]** for performance patches;
|
||||
|
||||
After tag comes the modified module name. Use the technical name as functional
|
||||
name may change with time. If several modules are modified, list them or use
|
||||
|
||||
@@ -7,7 +7,7 @@ Command-line interface (CLI)
|
||||
The CLI :dfn:`command-line interface` offers several functionalities related to Odoo. You can use it
|
||||
to :ref:`run the server <reference/cmdline/server>`, :ref:`launch Odoo as a Python console
|
||||
environment <reference/cmdline/shell>`, :ref:`scaffold an Odoo module <reference/cmdline/scaffold>`,
|
||||
or :ref:`count the number of lines of code <reference/cmdline/cloc>`.
|
||||
:ref:`populate a database <reference/cmdline/populate>` or :ref:`count the number of lines of code <reference/cmdline/cloc>`.
|
||||
|
||||
.. important::
|
||||
The command to use to call the CLI depends on how you installed Odoo. In the examples below, we
|
||||
@@ -739,6 +739,39 @@ Scaffolding is available via the :command:`odoo-bin scaffold` subcommand.
|
||||
|
||||
This will create module *my_module* in directory */addons/*.
|
||||
|
||||
.. _reference/cmdline/populate:
|
||||
|
||||
Database population
|
||||
===================
|
||||
|
||||
.. program:: odoo-bin populate
|
||||
|
||||
Odoo Populate allows to duplicate existing data in a given database. This can be used
|
||||
for testing and benchmarking when large tables are needed. The duplication process
|
||||
introduces variation for some fields to respect `UNIQUE` constraints, among other things.
|
||||
It also follows x2Many relationships.
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ odoo-bin populate -d my_database --models res.partner,account.move --factors 1000
|
||||
|
||||
.. option:: -d <database>
|
||||
|
||||
name of the database to populate
|
||||
|
||||
.. option:: --models
|
||||
|
||||
list of models to populate. Models appearing twice will only be populated once.
|
||||
|
||||
.. option:: --factors
|
||||
|
||||
list of populate factors. In case a factor is missing for a model, the last factor in
|
||||
the list will be used.
|
||||
|
||||
.. option:: --sep
|
||||
|
||||
separator used to generate record names
|
||||
|
||||
.. _reference/cmdline/cloc:
|
||||
|
||||
Cloc
|
||||
|
||||
@@ -2392,7 +2392,7 @@ Optional attributes can be added to the root element `kanban` to customize the v
|
||||
.. attribute:: examples
|
||||
:noindex:
|
||||
|
||||
The key in the `KanbanExamplesRegistry` of the examples than can be browsed when creating a new
|
||||
The key in the `KanbanExamplesRegistry` of the examples that can be browsed when creating a new
|
||||
column in the grouped kanban view.
|
||||
|
||||
.. seealso::
|
||||
|
||||
@@ -13,6 +13,7 @@ Tutorials
|
||||
tutorials/define_module_data
|
||||
tutorials/restrict_data_access
|
||||
tutorials/unit_tests
|
||||
tutorials/importable_modules
|
||||
tutorials/mixins
|
||||
tutorials/pdf_reports
|
||||
|
||||
@@ -74,6 +75,11 @@ Expand your knowledge on the server framework
|
||||
Write effective unit tests in Python to ensure the resilience of your code and safeguard it
|
||||
against unexpected behaviors and regressions.
|
||||
|
||||
.. card:: Write importable modules
|
||||
:target: tutorials/importable_modules
|
||||
|
||||
Write modules that define new models, fields and logic using only data files.
|
||||
|
||||
.. card:: Reuse code with mixins
|
||||
:target: tutorials/mixins
|
||||
|
||||
|
||||
@@ -0,0 +1,947 @@
|
||||
========================
|
||||
Write importable modules
|
||||
========================
|
||||
|
||||
.. important::
|
||||
This tutorial assumes familiarity with the :doc:`server_framework_101` tutorial and the
|
||||
:doc:`define_module_data` tutorial.
|
||||
|
||||
Although, as developers, we prefer to have the full power of Python to write our modules,
|
||||
it is sometimes not possible to do so; typically on managed hosting solutions which do not
|
||||
allow the deployment of custom Python code like the `Odoo.com <https://www.odoo.com/start>`_
|
||||
platform.
|
||||
|
||||
However, the flexible nature of Odoo is meant to allow customizations out of the box. Whilst
|
||||
a lot is possible with :doc:`Studio </applications/studio>`, it is also possible to define
|
||||
models, fields and logic in :doc:`XML Data Files <define_module_data>`. This makes it easier
|
||||
to develop, maintain and deploy these customizations.
|
||||
|
||||
In this tutorial, we will learn how to define models, fields and logic in XML data files and bundle
|
||||
them into a module. These are sometimes called *importable modules*, or *data modules*.
|
||||
We will also see the limitations of this approach to module development.
|
||||
|
||||
Problem statement
|
||||
=================
|
||||
|
||||
Like in the :doc:`server_framework_101` tutorial, we will be working on Real Estate concepts.
|
||||
|
||||
Our goal is to create a new application to manage Real Estate properties in a similar (albeit
|
||||
simpler) way to the :doc:`server_framework_101` tutorial. We will define the models, fields and
|
||||
logic in XML data files instead of Python files.
|
||||
|
||||
At the end of this tutorial, we will be able to achieve the following in our app:
|
||||
|
||||
- Manage Real Estate properties that are for sale
|
||||
- Publish these properties on a website
|
||||
- Accept offers online from the website
|
||||
- Invoice the buyer when the property is sold
|
||||
|
||||
Module structure
|
||||
================
|
||||
|
||||
Like in any development project, a clear structure makes it easier to manage and maintain the code.
|
||||
|
||||
Unlike standard Odoo modules that use both Python and XML files, data modules use only XML files.
|
||||
Therefore, it is expected that your work tree will look something like this:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
estate
|
||||
├── actions
|
||||
│ └── *.xml
|
||||
├── models
|
||||
│ └── *.xml
|
||||
├── security
|
||||
│ └── ir.model.access.csv
|
||||
│ └── estate_security.xml
|
||||
├── views
|
||||
│ └── *.xml
|
||||
├── __init__.py
|
||||
└── __manifest__.py
|
||||
|
||||
The only Python files you will have are the :file:`__init__.py` and :file:`__manifest__.py` files.
|
||||
The :file:`__manifest__.py` file will be the same as for any Odoo module, but will also import its
|
||||
models in the `data` list.
|
||||
|
||||
Remember to list files in the `data` section of :file:`__manifest__.py` in order of dependency,
|
||||
typically starting with model files.
|
||||
|
||||
The :file:`__init__.py` file is empty, but is required for Odoo to recognize the module if you ever
|
||||
want to deploy your module in the classic way (by adding it in an addons path). It is not strictly
|
||||
necessary for modules that will be *imported*, but it is a good practice to keep it.
|
||||
|
||||
Deploying the module
|
||||
====================
|
||||
|
||||
To deploy the module, you will need to create a zip file of the module and upload it to your
|
||||
Odoo instance. Make sure that the module `base_import_module` is installed on your instance,
|
||||
then go to the :menuselection:`Apps --> Import Module` and upload the zip file. You must be
|
||||
in :ref:`developer mode <developer-mode>` to see the `Import Module` menu item.
|
||||
|
||||
If you modify the module, you will need to create a new zip file and upload it again, which
|
||||
will reload all the data in the module. Note however that some operations are not possible,
|
||||
like changing the type of a field you created previously. Data created by previous versions of the
|
||||
module (like removed fields) will not be automatically deleted. In general, the simplest way to
|
||||
handle this is to start with a fresh database or to uninstall the module prior to uploading the
|
||||
new version.
|
||||
|
||||
When uploading a module, the wizard will accept two options:
|
||||
|
||||
- `Force init`: if your module is already installed and you upload it again; checking this
|
||||
option will force the update of all data marked as `noupdate="1"` in the XML files.
|
||||
- `Import demo data`: self explanatory
|
||||
|
||||
It is also possible to deploy the module using the :doc:`odoo-bin <../reference/cli>` command line
|
||||
tool with the `deploy` command:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ odoo-bin deploy <path_to_your_module> https://<your_odoo_instance> --login <your_login> --password <your_password>
|
||||
|
||||
This command also accepts the `--force` option, which is equivalent to the :guilabel:`Force init`
|
||||
option in the wizard.
|
||||
|
||||
Note that the user you use to deploy the module must have `Administration/Settings` access rights.
|
||||
|
||||
.. exercise::
|
||||
|
||||
#. Create the following folders and files:
|
||||
|
||||
- :file:`/home/$USER/src/tutorials/estate/__init__.py`
|
||||
- :file:`/home/$USER/src/tutorials/estate/__manifest__.py`
|
||||
|
||||
The :file:`__manifest__.py` file should only define the name and the dependencies of our
|
||||
modules. The only necessary framework module for now is ``base`` (and ``base_import_module`` -
|
||||
although your module does not *depend* on it strictly speaking, you need it to be able to
|
||||
import your module).
|
||||
|
||||
#. Create a zip file of your module and upload it to your Odoo instance.
|
||||
|
||||
Models and basic fields
|
||||
=======================
|
||||
|
||||
As you can imagine, defining models and fields in XML files is not as straightforward as in Python.
|
||||
|
||||
Since data files are read sequentially, you must define the elements in the right order.
|
||||
For example, you must define a model before you can define a field on that model, and you
|
||||
must define fields before adding them to a view.
|
||||
|
||||
In addition, XML is simply much more verbose than Python.
|
||||
|
||||
Let's start by defining a simple model to represent a Real Estate property in the `models`
|
||||
directory of our module.
|
||||
|
||||
Odoo models are stored in database as `ir.model` records. Like any other record, they can be
|
||||
defined in XML files:
|
||||
|
||||
.. code-block:: xml
|
||||
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<record id="model_real_estate_property" model="ir.model">
|
||||
<field name="name">Real Estate Property</field>
|
||||
<field name="model">x_estate.property</field>
|
||||
</record>
|
||||
</odoo>
|
||||
|
||||
Note that all models and fields defined in data files must be prefixed with `x_`; this is
|
||||
mandatory and is used to differentiate them from models and fields defined in Python files.
|
||||
|
||||
Like for classic models defined in Python, Odoo will automatically add several fields to the model:
|
||||
|
||||
- :attr:`~odoo.fields.Model.id` (:class:`~odoo.fields.Id`)
|
||||
The unique identifier for a record of the model.
|
||||
- :attr:`~odoo.fields.Model.create_date` (:class:`~odoo.fields.Datetime`)
|
||||
Creation date of the record.
|
||||
- :attr:`~odoo.fields.Model.create_uid` (:class:`~odoo.fields.Many2one`)
|
||||
User who created the record.
|
||||
- :attr:`~odoo.fields.Model.write_date` (:class:`~odoo.fields.Datetime`)
|
||||
Last modification date of the record.
|
||||
- :attr:`~odoo.fields.Model.write_uid` (:class:`~odoo.fields.Many2one`)
|
||||
User who last modified the record.
|
||||
|
||||
We can also add several fields to our new model. Let's add some simple fields, like a name (string),
|
||||
selling price (float), a description (as html), and a postcode (as a char).
|
||||
|
||||
Like for models, fields are simply records of the `ir.model.fields` model and can be
|
||||
defined as such in data files:
|
||||
|
||||
.. code-block:: xml
|
||||
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<!-- ...model definition from before... -->
|
||||
<record id="field_real_estate_property_name" model="ir.model.fields">
|
||||
<field name="model_id" ref="estate.model_real_estate_property" />
|
||||
<field name="name">x_name</field>
|
||||
<field name="field_description">Name</field>
|
||||
<field name="ttype">char</field>
|
||||
<field name="required">True</field>
|
||||
</record>
|
||||
|
||||
<record id="field_real_estate_property_selling_price" model="ir.model.fields">
|
||||
<field name="model_id" ref="estate.model_real_estate_property" />
|
||||
<field name="name">x_selling_price</field>
|
||||
<field name="field_description">Selling Price</field>
|
||||
<field name="ttype">float</field>
|
||||
<field name="required">True</field>
|
||||
</record>
|
||||
|
||||
<record id="field_real_estate_property_description" model="ir.model.fields">
|
||||
<field name="model_id" ref="estate.model_real_estate_property" />
|
||||
<field name="name">x_description</field>
|
||||
<field name="field_description">Description</field>
|
||||
<field name="ttype">html</field>
|
||||
</record>
|
||||
|
||||
<record id="field_real_estate_property_postcode" model="ir.model.fields">
|
||||
<field name="model_id" ref="estate.model_real_estate_property" />
|
||||
<field name="name">x_postcode</field>
|
||||
<field name="field_description">Postcode</field>
|
||||
<field name="ttype">char</field>
|
||||
</record>
|
||||
</odoo>
|
||||
|
||||
You can set various attributes for your new field. For basic fields, these include:
|
||||
|
||||
- `name`: the technical name of the field (must begin with `x_`)
|
||||
- `field_description`: the label of the field
|
||||
- `help`: a help text for the field, displayed in the interface
|
||||
- `ttype`: the type of the field (e.g. `char`, `integer`, `float`, `html`, etc.)
|
||||
- `required`: whether the field is required or not (default: `False`)
|
||||
- `readonly`: whether the field is read-only or not (default: `False`)
|
||||
- `index`: whether the field is indexed or not (default: `False`)
|
||||
- `copied`: whether the field is copied when duplicating a record or not (default: `True`
|
||||
for non-relational non-computed fields, `False` for relational and computed fields)
|
||||
- `translate`: whether the field is translatable or not (default: `False`)
|
||||
|
||||
Attributes are also available to control HTML sanitization as well as other, more advanced
|
||||
features; for a complete list, refer to the `ir.model.fields` model in the database available
|
||||
in the :menuselection:`Settings --> Technical --> Database Structure --> Fields` menu or
|
||||
see the `ir.model.fields` model definition in the `base` module.
|
||||
|
||||
.. exercise::
|
||||
|
||||
Add the following basic fields to the table:
|
||||
|
||||
========================= ========================= =======================
|
||||
Field Type Required
|
||||
========================= ========================= =======================
|
||||
x_date_availability Date
|
||||
x_expected_price Float True
|
||||
x_bedrooms Integer
|
||||
x_living_area Integer
|
||||
x_facades Integer
|
||||
x_garage Boolean
|
||||
x_garden Boolean
|
||||
x_garden_area Integer
|
||||
x_garden_orientation Selection
|
||||
========================= ========================= =======================
|
||||
|
||||
The ``x_garden_orientation`` field must have 4 possible values: 'North', 'South', 'East'
|
||||
and 'West'. The selection list must be created by first creating the `ir.model.fields`
|
||||
record for the field itself, then creating the `ir.model.fields.selection` records. These
|
||||
records take three fields: `field_id`, `name` (the name in the UI) and `value` (the value
|
||||
in the database). A `sequence` field can also be set, which controls the order in which
|
||||
the selections are displayed in the UI (lower sequence values are displayed first).
|
||||
|
||||
Default values
|
||||
--------------
|
||||
|
||||
In Python, default values can be set on fields using the ``default`` argument in the field
|
||||
declaration. In data modules, default values are set by creating an ``ir.default`` record
|
||||
for each field. For example, it is possible to set the default value of the
|
||||
``x_selling_price`` field to ``100000`` for all properties by creating the following record:
|
||||
|
||||
.. code-block:: xml
|
||||
|
||||
<odoo>
|
||||
<!-- ...model definition from before... -->
|
||||
<record id="default_real_estate_property_selling_price" model="ir.default">
|
||||
<field name="field_id" ref="estate.field_real_estate_property_selling_price" />
|
||||
<field name="json_value">100000</field>
|
||||
</record>
|
||||
</odoo>
|
||||
|
||||
For more details, refer to the `ir.default` model in the database available in the
|
||||
:menuselection:`Settings --> Technical --> Actions --> User-defined Defaults` menu or
|
||||
see the `ir.default` model definition in the `base` module.
|
||||
|
||||
.. warning::
|
||||
These defaults are static but can be set by company and/or user using the ``user_id``
|
||||
and ``company_id`` fields of the ``ir.default`` record. This means that having a dynamic
|
||||
default value of "today" for the ``x_date_availability`` field is not possible, for example.
|
||||
|
||||
Security
|
||||
========
|
||||
|
||||
Security in data modules is exactly the same as for Python modules and can be found
|
||||
in :doc:`server_framework_101/04_securityintro`.
|
||||
|
||||
Refer to that tutorial for details.
|
||||
|
||||
.. exercise::
|
||||
|
||||
#. Create the :file:`ir.model.access.csv` file in the appropriate folder and define it in the
|
||||
:file:`__manifest__.py` file.
|
||||
|
||||
#. Give the read, write, create and unlink permissions to the group ``base.group_user``.
|
||||
|
||||
.. tip::
|
||||
The warning message in the log gives you most of the solution ;-)
|
||||
|
||||
Views
|
||||
=====
|
||||
|
||||
Views are the UI components that allow users to interact with the data. They are defined
|
||||
in XML files and can be found in the :file:`views` directory of your module.
|
||||
|
||||
Since views and actions are already defined in :doc:`server_framework_101/05_firstui` and
|
||||
:doc:`server_framework_101/06_basicviews`, we will not go into details here.
|
||||
|
||||
.. exercise:: Add a basic UI to the `estate` module.
|
||||
|
||||
Add a basic UI to the `estate` module to allow users to view, create, edit and delete
|
||||
Real Estate properties.
|
||||
|
||||
- Create an action for the model ``x_estate.property``.
|
||||
- Create a tree view for the model ``x_estate.property``.
|
||||
- Create a form view for the model ``x_estate.property``.
|
||||
- Add the views to the action.
|
||||
- Add a menu item to the main menu to allow users to access the action.
|
||||
|
||||
Relations
|
||||
=========
|
||||
|
||||
The real power of relational systems like Odoo lies in the ability to link records together.
|
||||
In a normal Python module, one could define new fields on a model to link it to other models
|
||||
in a single line of code. In a data module, this is still possible but requires a bit more
|
||||
legwork since we can't use the same syntax as in Python.
|
||||
|
||||
As in :doc:`server_framework_101/07_relations`, we will add some relations to our `estate`
|
||||
module. We will add links to:
|
||||
|
||||
- the customer who bought the property
|
||||
- the real estate agent who sold the property
|
||||
- the property type: house, apartment, penthouse, castle...
|
||||
- a list of tags characterizing the property: cozy, renovated...
|
||||
- a list of the offers received
|
||||
|
||||
Many-to-one
|
||||
-----------
|
||||
|
||||
A many-to-one is a simple link to another object. For example, in order to define a link to the
|
||||
``res.partner``, we can define a new field in our model:
|
||||
|
||||
.. code-block:: xml
|
||||
|
||||
<odoo>
|
||||
<!-- ...model definition from before... -->
|
||||
<record id="field_real_estate_property_partner_id" model="ir.model.fields">
|
||||
<field name="model_id" ref="estate.model_real_estate_property" />
|
||||
<field name="name">x_partner_id</field>
|
||||
<field name="field_description">Customer</field>
|
||||
<field name="ttype">many2one</field>
|
||||
<field name="relation">res.partner</field>
|
||||
</record>
|
||||
</odoo>
|
||||
|
||||
In the case of many-to-one fields, several attributes can be set to detail the relation:
|
||||
|
||||
- `relation`: the name of the model to link to (required)
|
||||
- `ondelete`: the action to perform when the record is deleted (default: `set null`)
|
||||
- `domain`: a domain filter to apply to the relation
|
||||
|
||||
.. exercise::
|
||||
|
||||
#. Create a new model ``x_estate.property.type`` with the following fields:
|
||||
|
||||
========================= ========================= =======================
|
||||
Field Type Required
|
||||
========================= ========================= =======================
|
||||
`name` Char True
|
||||
========================= ========================= =======================
|
||||
|
||||
#. Add an action, list view and menu item for the ``x_estate.property.type`` model.
|
||||
|
||||
#. Add Access Rights to the ``x_estate.property.type`` model to give access to users.
|
||||
|
||||
#. Create the following fields on the ``x_estate.property`` model:
|
||||
|
||||
========================= ====================================== =======================
|
||||
Field Type Required
|
||||
========================= ====================================== =======================
|
||||
`x_property_type_id` Many2one (``x_estate.property.type``) True
|
||||
`x_partner_id` (buyer) Many2one (``res.partner``)
|
||||
`x_user_id` (salesperson) Many2one (``res.users``)
|
||||
========================= ====================================== =======================
|
||||
|
||||
#. Include the new fields in the form view of the ``x_estate.property`` model.
|
||||
|
||||
Many-to-many
|
||||
------------
|
||||
|
||||
A many-to-many is a relation to a list of objects. In our example, we will define a many-to-many
|
||||
relation towards a new ``x_estate.property.tag`` model. This tag represents a characteristic
|
||||
of the property, for example: renovated, cozy, etc.
|
||||
|
||||
A property can have many tags and a tag can be assigned to many properties - this is the
|
||||
typical many-to-many relationship.
|
||||
|
||||
Many-to-many fields are defined in the same way as many-to-one fields, but with the `ttype`
|
||||
set to `many2many`. The `relation` attribute is also set to the name of the model
|
||||
to link to. Other attributes can be set to control the relation:
|
||||
|
||||
- `relation_table`: the name of the table to use for the relation
|
||||
- `column1` and `column2`: the names of the columns to use for the relation
|
||||
|
||||
These attributes are optional, and should usually be specified only when there
|
||||
are multiple many-to-many fields between two models to avoid conflict; in most cases,
|
||||
the Odoo ORM will be able to determine the correct relation table and columns to use.
|
||||
|
||||
.. exercise::
|
||||
|
||||
#. Create a new model ``x_estate.property.tag`` with the following fields:
|
||||
|
||||
========================= ========================== =======================
|
||||
Field Type Required
|
||||
========================= ========================== =======================
|
||||
`name` Char True
|
||||
========================= ========================== =======================
|
||||
|
||||
#. Add an action, list view and menu item for the ``x_estate.property.tag`` model.
|
||||
|
||||
#. Add Access Rights to the ``x_estate.property.tag`` model to allow access to users.
|
||||
|
||||
#. Create the following fields on the ``x_estate.property`` model:
|
||||
|
||||
========================= ======================================
|
||||
Field Type
|
||||
========================= ======================================
|
||||
`x_property_tag_ids` Many2many (``x_estate.property.tag``)
|
||||
========================= ======================================
|
||||
|
||||
#. Include the new field in the form view of the ``x_estate.property`` model.
|
||||
|
||||
One-to-many
|
||||
-----------
|
||||
|
||||
A one-to-many is a relation to a list of objects. In our example, we will define a one-to-many
|
||||
relation towards a new ``x_estate.property.offer`` model. This offer represent an offer
|
||||
made by a customer to buy a property.
|
||||
|
||||
One-to-many fields are defined in the same way as many-to-one fields, but with the `ttype`
|
||||
set to `one2many`. The `relation` attribute is also set to the name of the model
|
||||
to link to. Another attribute must be set to control the relation:
|
||||
|
||||
- `relation_field`: the name of the field on the related model that contains the
|
||||
reference to the parent model (many-to-one field). This is used to link the two models
|
||||
together.
|
||||
|
||||
.. exercise::
|
||||
|
||||
#. Create a new model ``x_estate.property.offer`` with the following fields:
|
||||
|
||||
========================= ================================== ============ ===================
|
||||
Field Type Required Values
|
||||
========================= ================================== ============ ===================
|
||||
`x_price` Float True
|
||||
`x_status` Selection Accepted, Refused
|
||||
`x_partner_id` Many2one (``res.partner``) True
|
||||
`x_property_id` Many2one (``x_estate.property``) True
|
||||
========================= ================================== ============ ===================
|
||||
|
||||
#. Add Access Rights to the ``x_estate.property.offer`` model to allow access to users.
|
||||
|
||||
#. | Create a tree view and a form view with the price, partner_id and status fields.
|
||||
| No need to create an action or a menu.
|
||||
|
||||
#. Add the field ``x_offer_ids`` to your ``x_estate.property`` model and in its form view.
|
||||
|
||||
Computed and related fields
|
||||
===========================
|
||||
|
||||
Computed fields
|
||||
---------------
|
||||
|
||||
Computed fields are a core concept in Odoo and are used to define fields that are computed
|
||||
based on other fields. This is useful for fields that are derived from other fields, like a
|
||||
sum of sub-records (adding up the price of all the items in a sale order).
|
||||
|
||||
**Reference**: the documentation related to this topic can be found in
|
||||
:ref:`reference/fields/compute`.
|
||||
|
||||
Data modules can define computed fields of any type, but are quite limited compared to Python
|
||||
modules. Indeed, since data modules are meant to be deployed on systems that do not allow arbitrary
|
||||
code to run, the Python code that is allowed is very limited.
|
||||
|
||||
.. note::
|
||||
All Python code written for data modules is executed in a sandboxed environment that limits
|
||||
the operations that can be performed. For example, you cannot import libraries, you cannot
|
||||
access any OS files, and you cannot even print to the console. Some utilities are provided,
|
||||
but this varies with the type of sandboxed environment that is used.
|
||||
|
||||
In the case of compute methods, the sandbox is very limited and only provides the bare minimum
|
||||
of utilities to allow the execution of the code. In addition to the Python builtins, you also
|
||||
have access to the `datetime`, `dateutil` and `time` modules (e.g., to help with date
|
||||
calculations).
|
||||
|
||||
Note also that "dot assignation" is disabled in the sandbox, so you cannot write
|
||||
``property.x_total_area = 1`` in the compute method. You have to use dictionary access:
|
||||
``property['x_total_area'] = 1``. Dot notation for field *access* works normally:
|
||||
``property.x_garden_area`` will return the value of the ``x_garden_area`` field.
|
||||
|
||||
|
||||
We previously defined two "area" fields on our ``x_estate.property`` model: ``living_area``
|
||||
and ``garden_area``. To define a computed field on the model that returns the sum of the two
|
||||
areas, we can add the following code to our data module:
|
||||
|
||||
.. code-block:: xml
|
||||
|
||||
<odoo>
|
||||
<!-- ...model definition from before... -->
|
||||
<record id="field_real_estate_property_total_area" model="ir.model.fields">
|
||||
<field name="model_id" ref="estate.model_real_estate_property" />
|
||||
<field name="name">x_total_area</field>
|
||||
<field name="field_description">Total Area</field>
|
||||
<field name="ttype">float</field>
|
||||
<field name="depends">x_living_area,x_garden_area</field>
|
||||
<field name="compute"><![CDATA[
|
||||
for property in self:
|
||||
property['x_total_area'] = property.x_living_area + property.x_garden_area
|
||||
]]>
|
||||
</field>
|
||||
</record>
|
||||
</odoo>
|
||||
|
||||
.. note::
|
||||
Whilst in server actions, you iterate on a `records` variable, in the case of a computed field,
|
||||
you iterate on a `self` variable that contains the recordset on which the field is computed.
|
||||
|
||||
The ``depends`` attribute is used to define the fields that the computed field depends on and
|
||||
the ``compute`` attribute is used to define the code that is executed to compute the field (using
|
||||
Python code).
|
||||
|
||||
Unlike in Python modules, computed fields are stored by default. If you wish for a computed field to
|
||||
not be stored (e.g., for performance reasons or to avoid database bloat), you can set the ``store``
|
||||
attribute to ``False``.
|
||||
|
||||
The `CDATA` section is used to specify to XML parsers that the content is a string and not XML;
|
||||
this prevents the parser from trying to interpret the Python code as XML, or the addition of
|
||||
extra space, etc. when the code gets inserted into the database at module install time.
|
||||
|
||||
.. exercise::
|
||||
|
||||
#. Add a computed field to the ``x_estate.property`` model that returns the sum of the
|
||||
``x_living_area`` and ``x_garden_area`` fields, as shown above.
|
||||
#. Include the field in the form view of the ``x_estate.property`` model.
|
||||
|
||||
.. note::
|
||||
Unlike in Python modules, it is not possible to define an inverse or search method for
|
||||
computed fields.
|
||||
|
||||
Related fields
|
||||
--------------
|
||||
|
||||
Related fields are a simplified form of computed fields that mirror the value of another field
|
||||
through a many2one relationship.
|
||||
|
||||
**Reference**: the documentation related to this topic can be found in
|
||||
:ref:`reference/fields/related`.
|
||||
|
||||
Related fields can be of any type (the type of the field at the other end of the relation
|
||||
traversal). They are defined as if one were adding the field directly to the model with the
|
||||
addition of a ``related`` attribute that specifies the target field on the related model
|
||||
that contains the value to be mirrored.
|
||||
|
||||
For example, if we want to access the country of the buyer directly from the
|
||||
``x_estate.property`` model, we can add the following code to our data module:
|
||||
|
||||
.. code-block:: xml
|
||||
|
||||
<odoo>
|
||||
<!-- ...model definition from before... -->
|
||||
<record id="field_real_estate_property_country_id" model="ir.model.fields">
|
||||
<field name="model_id" ref="estate.model_real_estate_property" />
|
||||
<field name="name">x_country_id</field>
|
||||
<field name="field_description">Buyer's Country</field>
|
||||
<field name="ttype">many2one</field>
|
||||
<field name="relation">res.country</field>
|
||||
<field name="related">x_partner_id.country_id</field>
|
||||
</record>
|
||||
</odoo>
|
||||
|
||||
The ``related`` attribute is used to specify the target field on the related model that
|
||||
contains the value to be mirrored. This must be a dot-separated list of field names.
|
||||
|
||||
Code and business logic
|
||||
=======================
|
||||
|
||||
Server actions
|
||||
--------------
|
||||
|
||||
In a Python module, you are free to define any method on your model. One common usage pattern
|
||||
is to add so-called "actions" methods to your model then bind these methods to buttons in the UI
|
||||
(e.g to confirm a quote, post an invoice, etc.).
|
||||
|
||||
In a data module, you can achieve the same effect by defining
|
||||
:ref:`Server Actions <reference/actions/server>` bound to your model. Server actions represent
|
||||
pieces of logic that are run dynamically on the server. These actions can be configured manually
|
||||
in the database directly via the
|
||||
:menuselection:`Settings --> Technical --> Actions --> Server Actions` menu and can be of different
|
||||
types; in our case, we will use the ``code`` type which allows us to run any Python code in a
|
||||
sandboxed environment.
|
||||
|
||||
This environment contains several utilities to help you interact with the Odoo database:
|
||||
|
||||
- ``self``: the record on which the action is executed
|
||||
- ``env``: the environment of the record
|
||||
- ``model``: the model of the record
|
||||
- ``user`` and ``uid``: the current user and their id
|
||||
- ``datetime``, ``dateutil``, ``timezone`` and ``time``: libraries to help with date/time calculations
|
||||
- ``float_compare``: a utility function to compare two float values with a given precision
|
||||
- ``b64encode`` and ``b64decode``: utility functions to encode and decode values in base64
|
||||
- ``Command``: a utility class to help build complex expressions and commands (see the `Command`
|
||||
class in the :ref:`ORM reference <reference/fields/relational>`)
|
||||
|
||||
In addition, you have access to the recordset on which the action is executed (typically a single
|
||||
record when the action is executed from a form view, and multiple records when the action is
|
||||
executed from a list view) via the ``record`` and ``records`` variables.
|
||||
|
||||
.. note::
|
||||
If your action needs to return an action to the client (for example to redirect the user to
|
||||
another view), you can assign it to a an ``action`` variable inside your server
|
||||
action's code. The code sandbox will inspect the variables defined in your code after its
|
||||
execution and will automatically return it if it detects the presence of an ``action`` variable.
|
||||
|
||||
If the `website` module is installed, the `request` object will be available in the code sandbox
|
||||
and you can assign a `response` object to the `response` variable to return a response to the
|
||||
client in a similar way. This is explored in more details in the
|
||||
:ref:`tutorials/importable_modules/website_controllers` section.
|
||||
|
||||
For example, we could define an action on the ``x_estate.property`` model that sets the ``x_status``
|
||||
field of all its offers to ``Refused``:
|
||||
|
||||
.. code-block:: xml
|
||||
|
||||
<record id="action_x_estate_property_refuse_all_offers" model="ir.actions.server">
|
||||
<field name="name">Refuse all offers</field>
|
||||
<field name="model_id" ref="estate.model_real_estate_property"/>
|
||||
<field name="state">code</field>
|
||||
<field name="code"><![CDATA[
|
||||
for property in records:
|
||||
property.x_offer_ids.write({'x_status': 'refused'})
|
||||
]]></field>
|
||||
</record>
|
||||
|
||||
To include this action as a button in the form view of the ``x_estate.property`` model, we can
|
||||
add the following :ref:`button <reference/view_architectures/form/button>` node in the header of our
|
||||
form view:
|
||||
|
||||
.. code-block:: xml
|
||||
|
||||
<!-- form view definition from your code... -->
|
||||
<header>
|
||||
<button name="estate.action_x_estate_property_refuse_all_offers" type="action" string="Refuse all offers"/>
|
||||
</header>
|
||||
|
||||
It is also possible to add an entry in the gear icon (:icon:`fa-gear`) to run this action (e.g. to
|
||||
avoid adding buttons to views that are already crowded). To do so, you can *bind* your server action
|
||||
to the model and to specific types of views:
|
||||
|
||||
.. code-block:: xml
|
||||
|
||||
<record id="action_x_estate_property_refuse_all_offers" model="ir.actions.server">
|
||||
<field name="name">Refuse all offers</field>
|
||||
<field name="model_id" ref="estate.model_real_estate_property"/>
|
||||
<field name="state">code</field>
|
||||
<field name="binding_model_id" ref="estate.model_real_estate_property"/>
|
||||
<field name="binding_view_types">tree,form</field>
|
||||
<field name="code"><![CDATA[
|
||||
for property in records:
|
||||
property.x_offer_ids.write({'x_status': 'refused'})
|
||||
]]></field>
|
||||
</record>
|
||||
|
||||
This will make the action available in the gear icon (:icon:`fa-gear`) of the ``x_estate.property``
|
||||
model, in the list (when one or more records are selected via the checkbox) and form views.
|
||||
|
||||
.. exercise::
|
||||
|
||||
#. Add a server action to the ``x_estate.property.offer`` model that sets the ``x_status``
|
||||
field of an offer to ``Accepted`` and updates the selling price and buyer of the property
|
||||
to which the offer is attached accordingly. This action should also mark all the other offers
|
||||
on the same property as ``Refused``.
|
||||
#. Include a button in the embedded list view of offers that allows to execute this action
|
||||
|
||||
.. image:: importable_modules/offer_accept_button.png
|
||||
:align: center
|
||||
|
||||
Overriding Python models
|
||||
------------------------
|
||||
|
||||
Via UI elements
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
Unlike in Python modules, it is not possible to override a Python model's method cleanly.
|
||||
|
||||
However, it is possible (in some cases) to replace the elements of the UI that call
|
||||
these methods and to intercept the calls to these methods in a server action.
|
||||
|
||||
A typical example would be an integration with the ``Sales`` app of Odoo. Let's imagine that your
|
||||
Real Estate module integrates with the Sales application so that when a specific product is sold
|
||||
(e.g., a quote for managing the sale of a property), you want to automatically create a new property
|
||||
record in your module.
|
||||
|
||||
To achieve this, you will need to:
|
||||
|
||||
- create a server action that calls the original method of the button and add custom logic before
|
||||
or after that method call
|
||||
- replace the button in the view with a custom button that calls the server action
|
||||
|
||||
.. code-block:: xml
|
||||
|
||||
<record id="view_sale_order_form" model="ir.ui.view">
|
||||
<field name="name">sale.order.form.inherit.estate</field>
|
||||
<field name="model">sale.order</field>
|
||||
<field name="inherit_id" ref="sale.view_order_form" />
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//button[@name='action_confirm'][@type='object']" position="attributes">
|
||||
<attribute name="type">action</attribute>
|
||||
<attribute name="name">estate.action_x_estate_property_create_from_sale_order</attribute>
|
||||
</xpath>
|
||||
<!-- since the button is present twice in the original view, we need to replace it twice -->
|
||||
<xpath expr="//button[@name='action_confirm'][@type='object']" position="attributes">
|
||||
<attribute name="type">action</attribute>
|
||||
<attribute name="name">estate.action_x_estate_property_create_from_sale_order</attribute>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_x_estate_property_create_from_sale_order" model="ir.actions.server">
|
||||
<field name="name">Confirm and create property from sale order</field>
|
||||
<field name="model_id" ref="sale.model_sale_order"/>
|
||||
<field name="state">code</field>
|
||||
<field name="code"><![CDATA[
|
||||
for order in records:
|
||||
order.action_confirm()
|
||||
property_type = env['x_estate.property.type'].sudo().search([('x_name', '=', 'Other')], limit=1)
|
||||
property = env['x_estate.property'].sudo().create({
|
||||
'x_name': order.name,
|
||||
'x_expected_price': 0,
|
||||
'x_selling_price': 0,
|
||||
'x_sale_order_id': order.id,
|
||||
'x_property_type_id': property_type.id,
|
||||
})
|
||||
]]></field>
|
||||
</record>
|
||||
|
||||
Via automation rules
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Automations rules are a way to automatically execute actions on records in the database based on
|
||||
specific triggers, like state changes, addition of a tag, etc. They can be useful to tie behaviour
|
||||
to life-cycle events of records, for example by sending an email when an offer is accepted.
|
||||
|
||||
Using automation rules for extending a standard behaviour can be more robust than the UI-based
|
||||
approach since it will also run if the life-cycle event is triggered in another way than via
|
||||
a button (e.g., via a webhook or a direct call to the method; for example when a quote
|
||||
is confirmed via the portal or the e-commerce). They are however a bit more finicky to set up
|
||||
properly, as one needs to ensure that the automation will only run at the proper moment by
|
||||
setting up specific fields to watch, etc.
|
||||
|
||||
**Documentation**: a more complete documentation related to this topic can be found in
|
||||
:doc:`/applications/studio/automated_actions`.
|
||||
|
||||
.. note::
|
||||
Automation Rules are not part of the ``base`` module; they come with the ``base_automation``
|
||||
module; so if you define automation rules in your data module, you need to make sure that
|
||||
``base_automation`` is part of your module's dependencies.
|
||||
|
||||
Once installed, Automation Rules are managed via the
|
||||
:menuselection:`Settings --> Technical --> Automations --> Automation Rules` menu.
|
||||
|
||||
Automation Rules are particularly useful to tie a data module to an existing standard Odoo
|
||||
module. Since data modules cannot override methods, tying automation to life-cycle changes
|
||||
of standard models is a common way to extend standard modules.
|
||||
|
||||
If we were to rewrite our example from the previous section using automation rules, a few changes
|
||||
would be needed:
|
||||
|
||||
- the server action should no longer call the original method of the button (instead, the original
|
||||
method will trigger the change that will fire the automation rule)
|
||||
- the view extension is not needed
|
||||
- we need to define an Automation Rule to trigger the server action on the appropriate event
|
||||
|
||||
.. code-block:: xml
|
||||
|
||||
<record id="action_x_estate_property_create_from_sale_order" model="ir.actions.server">
|
||||
<field name="name">Create property from sale order</field>
|
||||
<field name="model_id" ref="sale.model_sale_order"/>
|
||||
<field name="state">code</field>
|
||||
<field name="code"><![CDATA[
|
||||
for order in records:
|
||||
property_type = env['x_estate.property.type'].sudo().search([('x_name', '=', 'Other')], limit=1)
|
||||
property = env['x_estate.property'].sudo().create({
|
||||
'x_name': order.name,
|
||||
'x_expected_price': 0,
|
||||
'x_selling_price': 0,
|
||||
'x_sale_order_id': order.id,
|
||||
'x_property_type_id': property_type.id,
|
||||
})
|
||||
]]></field>
|
||||
</record>
|
||||
|
||||
<record id="automation_rule_x_estate_property_create_from_sale_order" model="base.automation">
|
||||
<field name="name">Create property from sale order</field>
|
||||
<field name="model_id" ref="sale.model_sale_order"/>
|
||||
<field name="trigger">on_state_set</field>
|
||||
<field name="trg_selection_field_id" ref="sale.selection__sale_order__state__sale"/>
|
||||
<field name="trigger_field_ids" eval="[(4, ref('sale.field_sale_order__state'))]"/>
|
||||
<field name="action_server_ids" eval="[(4, ref('estate.action_x_estate_property_create_from_sale_order'))]"/>
|
||||
</record>
|
||||
|
||||
Note that the :ref:`XML IDs <tutorials/define_module_data/xml_id>` to standard Odoo models, fields,
|
||||
selection values, etc. can be found in the Odoo instance itself by navigating to the appropriate
|
||||
record in the technical menus and using the ``View Metadata`` menu entry of the debug menu. XML IDs
|
||||
for models are simply the model name with dots replaced by underscores and prefixed by ``model_``
|
||||
(e.g., ``sale.model_sale_order`` is ``sale.order`` as defined in the `sale` module); XML IDs for
|
||||
fields are the model name with dots replaced by underscores and prefixed by ``field_``, the model's
|
||||
name and the field name (e.g., ``sale.field_sale_order__name`` is the XML ID for the ``name`` field
|
||||
of the ``sale.order`` model which is defined in the `sale` module).
|
||||
|
||||
.. _tutorials/importable_modules/website_controllers:
|
||||
|
||||
Website controllers
|
||||
-------------------
|
||||
|
||||
HTTP Controllers in Odoo are usually defined in the :file:`controllers` directory of a module.
|
||||
In data modules, it is possible to define server actions that behave as controllers if
|
||||
the website module is installed.
|
||||
|
||||
When the website module is installed, server actions can be marked as `Available on the website`
|
||||
and given a path (the full path is always prefixed with `/actions` to avoid URL collisions);
|
||||
the global `request` object is made available in the local scope of the code server action.
|
||||
|
||||
The `request` object provides several methods to access the body of the request:
|
||||
|
||||
- `request.get_http_params()`: extract key-value pairs from the query string and the forms
|
||||
present in the body (both `application/x-www-form-urlencoded` and `multipart/form-data`).
|
||||
- `request.get_json_data()`: extract the JSON data from the body of the request.
|
||||
|
||||
Since it is not possible to return a value from within a server action, to define the response
|
||||
to return, one can assign a response-like object to the `response` variable, which will be
|
||||
returned to the website automatically.
|
||||
|
||||
Here is an example of a simple website controller that will return a list of properties
|
||||
when the URL `/actions/estate` is called:
|
||||
|
||||
.. code-block:: xml
|
||||
|
||||
<record id="server_action_estate_list" model="ir.actions.server">
|
||||
<field name="name">Estate List Controller</field>
|
||||
<field name="model_id" ref="estate.model_real_estate_property" />
|
||||
<field name="website_published">True</field>
|
||||
<field name="website_path">estate</field>
|
||||
<field name="state">code</field>
|
||||
<field name="code"><![CDATA[
|
||||
html = '<html><body><h1>Properties</h1><ul>'
|
||||
for property in request.env['x_estate.property'].search([]):
|
||||
html += f'<li>{property.x_name}</li>'
|
||||
html += '</ul></body></html>'
|
||||
response = request.make_response(html)
|
||||
]]></field>
|
||||
</record>
|
||||
|
||||
Several useful methods are available in the `request` object to facilitate the generation of the
|
||||
response object:
|
||||
|
||||
- `request.render(template, qcontext=None, lazy=True, **kw)` to render a QWeb template using its
|
||||
xmlid; the extra keyword arguments are forwarded to the `werkzeug.Response` object (e.g. to set
|
||||
cookies, headers, etc.)
|
||||
- `request.redirect(location, code=303, local=True)` to redirect to a different URL; the `local`
|
||||
argument is used to specify whether the redirection should be relative to the website or not
|
||||
(default: `True`).
|
||||
- `request.notfound()` to return a `werkzeug.HTTPException` exception to signal a 404 error to
|
||||
the website.
|
||||
- `request.make_response(data, headers=None, cookies=None, status=200)` to manually create a
|
||||
`werkzeug.Response` object; the `status` argument is the HTTP status code to return (default:
|
||||
200).
|
||||
- `request.make_json_response(data, headers=None, cookies=None, status=200)` to manually create a
|
||||
JSON response; the data will be json-serialized using `json.dumps` utility; this can be useful
|
||||
to set up server-to-server communications via API calls.
|
||||
|
||||
For implementation details or other (less common) methods, refer to the `Request` object's
|
||||
implementation in the `odoo.http` module.
|
||||
|
||||
Note that security concerns are left to the developer (typically through security rules or
|
||||
by using `sudo` to access records).
|
||||
|
||||
.. note::
|
||||
The model used in the `model_id` field of the server action must be accessible to the public
|
||||
user for the write operation for this server action to run; otherwise the server action will
|
||||
return a 403 error. A way to avoid giving access is to link your server action to a model
|
||||
that is already accessible to the public user, a typical (if weird) example is to link the
|
||||
server action to the `ir.filters` model.
|
||||
|
||||
.. exercise::
|
||||
|
||||
Add a JSON API to your module so that external services can retrieve a list of properties
|
||||
for sale.
|
||||
|
||||
#. add a new `x_api_published` field to the model to control whether the properties are
|
||||
published on the API or not
|
||||
#. add an access right record to allow public users to read and write the model
|
||||
#. prevent any write from the public user by adding a record rule for the write operation
|
||||
with an impossible domain (e.g. `[('id', '=', False)]`)
|
||||
#. add a record rule so that properties marked as `x_api_published` can be read by the
|
||||
public user
|
||||
#. add a server action to return a list of properties in JSON format when the URL
|
||||
`/actions/api/estate` is called
|
||||
|
||||
A sprinkle of JavaScript
|
||||
========================
|
||||
|
||||
Whilst importable modules cannot include Python files, no such restriction exists for JavaScript
|
||||
files. Adding JavaScript files to your importable module is exactly the same as adding them
|
||||
to a standard Odoo module.
|
||||
|
||||
This means that an importable module can include new field components or even entirely new views.
|
||||
|
||||
As an example, let's add a simple 'tour' to the Estate module. Tours are a standard mechanism in
|
||||
Odoo used to onboard users by guiding them through your application.
|
||||
|
||||
A very minimal tour with a single step can be added by adding this file in `static/src/js/tour.js`:
|
||||
|
||||
.. code-block:: js
|
||||
|
||||
import { registry } from "@web/core/registry";
|
||||
|
||||
|
||||
registry.category("web_tour.tours").add('estate_tour', {
|
||||
url: "/web",
|
||||
sequence: 170,
|
||||
steps: () => [{
|
||||
trigger: '.o_app[data-menu-xmlid="estate.menu_root"]',
|
||||
content: 'Start selling your properties from this app!',
|
||||
position: 'bottom',
|
||||
}],
|
||||
});
|
||||
|
||||
You then need to include the file in the appropriate bundle in the manifest file:
|
||||
|
||||
.. code-block:: py
|
||||
|
||||
{
|
||||
"name": "Real Estate",
|
||||
# [...]
|
||||
"assets": {
|
||||
"web.assets_backend": [
|
||||
"estate/static/src/js/tour.js",
|
||||
],
|
||||
},
|
||||
}
|
||||
|
||||
.. note::
|
||||
Unlike normal Python modules, glob expansion is not supported in importable modules;
|
||||
so you need to list each file you want to include in the module specifically.
|
||||
|
After Width: | Height: | Size: 3.9 KiB |
@@ -57,7 +57,7 @@ Basic Report
|
||||
|
||||
.. note::
|
||||
|
||||
**Goal**: at the end of this section, we will can print a report that displays all offers for a
|
||||
**Goal**: at the end of this section, we will be able to print a report that displays all offers for a
|
||||
property.
|
||||
|
||||
.. image:: pdf_reports/simple_report.png
|
||||
|
||||
@@ -15,7 +15,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo 18.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2024-10-07 14:21+0000\n"
|
||||
"POT-Creation-Date: 2024-11-05 09:20+0000\n"
|
||||
"PO-Revision-Date: 2024-10-08 06:34+0000\n"
|
||||
"Last-Translator: Malaz Abuidris <msea@odoo.com>, 2024\n"
|
||||
"Language-Team: Arabic (https://app.transifex.com/odoo/teams/41243/ar/)\n"
|
||||
@@ -1598,7 +1598,7 @@ msgid "Here is a pseudo-implementation example:"
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/administration/odoo_sh/advanced/submodules.rst:6
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:229
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:249
|
||||
msgid "Submodules"
|
||||
msgstr "التطبيقات الفرعية "
|
||||
|
||||
@@ -4915,10 +4915,54 @@ msgstr ""
|
||||
"فقط. "
|
||||
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:221
|
||||
msgid "GitHub commit statuses"
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:223
|
||||
msgid ""
|
||||
"This option enables Odoo.sh to push commit statuses to your GitHub "
|
||||
"repository when a build is created or updated. It requires a GitHub token "
|
||||
"with permissions to push commit statuses to the repository. Refer to "
|
||||
"`GitHub's documentation on personal access tokens "
|
||||
"<https://docs.github.com/en/authentication/keeping-your-account-and-data-"
|
||||
"secure/managing-your-personal-access-tokens>`_ for instructions to create "
|
||||
"yours."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:229
|
||||
msgid ""
|
||||
"GitHub's **fine-grained personal tokens** have an expiration date and will "
|
||||
"be disabled if they fail to update the commit status. You can replace the "
|
||||
"token at any time on Odoo.sh."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:232
|
||||
msgid "The commit statuses pushed to GitHub can have the following contexts:"
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:234
|
||||
msgid ":guilabel:`ci/odoo.sh (dev)`: status of a development build"
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:235
|
||||
msgid ":guilabel:`ci/odoo.sh (staging)`: status of a staging build"
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:236
|
||||
msgid ":guilabel:`ci/odoo.sh (production)`: status of a production build"
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:237
|
||||
msgid ""
|
||||
":guilabel:`ci/odoo.sh (test_ci)`: testing the token from the Settings page "
|
||||
"will push a test status on the last commit of your repository"
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:241
|
||||
msgid "Custom domains"
|
||||
msgstr "النطاقات المخصصة "
|
||||
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:223
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:243
|
||||
msgid ""
|
||||
"To configure additional domains please refer to the corresponding branch's "
|
||||
":ref:`settings tab <odoosh-gettingstarted-branches-tabs-settings>`."
|
||||
@@ -4926,7 +4970,7 @@ msgstr ""
|
||||
"لتهيئة نطاقات إضافية، يرجى الرجوع إلى الفرع المقابل :ref:`علامة تبويب "
|
||||
"الإعدادات <odoosh-gettingstarted-branches-tabs-settings>`. "
|
||||
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:231
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:251
|
||||
msgid ""
|
||||
"Configure the deploy keys for the private repositories you use as submodules"
|
||||
" in your branches to allow Odoo.sh to download them."
|
||||
@@ -4934,7 +4978,7 @@ msgstr ""
|
||||
"قم بتهيئة مفاتيح النشر للمستودعات الخاصة التي تستخدمها كتطبيقات فرعية في "
|
||||
"فروعك للسماح لـ Odoo.sh بتنزيلها. "
|
||||
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:235
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:255
|
||||
msgid ""
|
||||
"These settings are required for **private repositories** only. If you are "
|
||||
"looking on how to set up your submodules, instructions are available in the "
|
||||
@@ -4945,7 +4989,7 @@ msgstr ""
|
||||
"إعداد تطبيقاتك الفرعية، فالإرشادات متوفرة في فصل :ref:`التطبيقات الفرعية "
|
||||
"<odoosh-advanced-submodules>` في هذه الوثائق. "
|
||||
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:242
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:262
|
||||
msgid ""
|
||||
"When a repository is private, it is not possible to publicly download its "
|
||||
"branches and revisions. For that reason, you need to configure a deploy key "
|
||||
@@ -4956,12 +5000,12 @@ msgstr ""
|
||||
"السبب، تحتاج إلى تهيئة مفتاح نشر لـ Odoo.sh، بحيث يسمح خادم Git عن بُعد "
|
||||
"لمنصتنا بتنزيل مراجعات هذا المستودع الخاص. "
|
||||
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:247
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:267
|
||||
msgid ""
|
||||
"To configure the deploy key for a private repository, proceed as follows:"
|
||||
msgstr "لتهيئة مفتاح النشر لمستودع خاص، اتبع ما يلي: "
|
||||
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:249
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:269
|
||||
msgid ""
|
||||
"in the input, paste the SSH URL of your private sub-repository and click on "
|
||||
"*Add*,"
|
||||
@@ -4969,11 +5013,11 @@ msgstr ""
|
||||
"في المدخلات، قم بلصق عنوان URL لـ SSH لمستودعك الفرعي الخاص ثم اضغط على "
|
||||
"*إضافة*، "
|
||||
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:251
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:271
|
||||
msgid "e.g. *git@github.com:USERNAME/REPOSITORY.git*"
|
||||
msgstr "مثال: *git@github.com:USERNAME/REPOSITORY.git* "
|
||||
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:252
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:272
|
||||
msgid ""
|
||||
"it can be another Git server than Github, such as Bitbucket, Gitlab or even "
|
||||
"your own self-hosted server"
|
||||
@@ -4981,38 +5025,38 @@ msgstr ""
|
||||
"يمكن أن يكون خادم Git آخر غير Github، مثل Bitbucket أو Gitlab أو حتى خادمك "
|
||||
"المستضاف ذاتياً "
|
||||
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:255
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:275
|
||||
msgid "copy the public key,"
|
||||
msgstr "انسخ المفتاح العام، "
|
||||
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:257
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:277
|
||||
msgid "it should look like *ssh-rsa some...random...characters...here...==*"
|
||||
msgstr "ينبغي أن يبدو مثل *ssh-rsa بعض...الأحرف...العشوائية...هنا...==* "
|
||||
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:259
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:279
|
||||
msgid ""
|
||||
"in the settings of the private sub-repository, add the public key amongst "
|
||||
"the deploy keys."
|
||||
msgstr ""
|
||||
"في إعدادات المستودع الفرعي الخاص، أضف المفتاح العام بين مفاتيح النشر. "
|
||||
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:261
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:281
|
||||
msgid ""
|
||||
"Github.com: :menuselection:`Settings --> Deploy keys --> Add deploy key`"
|
||||
msgstr ""
|
||||
"Github.com: :menuselection:`الإعدادات --> مفاتيح النشر --> إضافة مفتاح نشر` "
|
||||
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:262
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:282
|
||||
msgid "Bitbucket.com: :menuselection:`Settings --> Access keys --> Add key`"
|
||||
msgstr ""
|
||||
"Bitbucket.com: :menuselection:`الإعدادات --> مفاتيخ الوصول --> إضافة مفتاح` "
|
||||
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:263
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:283
|
||||
msgid "Gitlab.com: :menuselection:`Settings --> Repository --> Deploy Keys`"
|
||||
msgstr ""
|
||||
"Gitlab.com: :menuselection:`الإعدادات --> المستودع --> مفاتيح النشر` "
|
||||
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:264
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:284
|
||||
msgid ""
|
||||
"Self-hosted: append the key to the git user’s authorized_keys file in its "
|
||||
".ssh directory"
|
||||
@@ -5020,23 +5064,23 @@ msgstr ""
|
||||
"مستضافة ذاتياً: قم بإلحاق المفتاح بملف Author_keys الخاص بمستخدم git في دليل"
|
||||
" .ssh الخاص به "
|
||||
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:267
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:287
|
||||
msgid "Storage Size"
|
||||
msgstr "حجم مساحة التخزين "
|
||||
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:269
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:289
|
||||
msgid "This section shows the storage size used by your project."
|
||||
msgstr "يوضح هذا القسم حجم التخزين الذي يستخدمه مشروعك. "
|
||||
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:274
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:294
|
||||
msgid "Storage size is computed as follows:"
|
||||
msgstr "يتم حساب حجم التخزين على النحو التالي: "
|
||||
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:276
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:296
|
||||
msgid "the size of the PostgreSQL database"
|
||||
msgstr "حجم قاعدة بيانات PostgreSQL "
|
||||
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:278
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:298
|
||||
msgid ""
|
||||
"the size of the disk files available in your container: database filestore, "
|
||||
"sessions storage directory..."
|
||||
@@ -5044,7 +5088,7 @@ msgstr ""
|
||||
"حجم ملفات القرص المتوفرة في حاويتك: مخزن ملفات قاعدة البيانات، دليل تخزين "
|
||||
"الجلسات... "
|
||||
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:281
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:301
|
||||
msgid ""
|
||||
"In case you want to analyze disk usage, you can run the tool `ncdu "
|
||||
"<https://dev.yorhel.nl/ncdu/man>`_ in your Web Shell."
|
||||
@@ -5052,7 +5096,7 @@ msgstr ""
|
||||
"في حالة رغبتك في تحليل استخدام القرص، يمكنك تشغيل أداة `ncdu "
|
||||
"<https://dev.yorhel.nl/ncdu/man>`_ في Web Shell الخاص بك. "
|
||||
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:284
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:304
|
||||
msgid ""
|
||||
"Should your production database size grow to exceed what's provisioned in "
|
||||
"your subscription, it will automatically be synchronized with it."
|
||||
@@ -5060,11 +5104,11 @@ msgstr ""
|
||||
"إذا تجاوز حجم قاعدة بيانات الإنتاج الخاصة بك ما تم تحديده في اشتراكك، فستتم "
|
||||
"مزامنته معه تلقائياً. "
|
||||
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:288
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:308
|
||||
msgid "Database Workers"
|
||||
msgstr "مشغلات قاعدة البيانات "
|
||||
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:290
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:310
|
||||
msgid ""
|
||||
"Additional database workers can be configured here. More workers help "
|
||||
"increase the load your production database is able to handle. If you add "
|
||||
@@ -5074,7 +5118,7 @@ msgstr ""
|
||||
"المشغّلين على زيادة العبء الذي تستطيع قاعدة بيانات الإنتاج الخاصة بك التعامل"
|
||||
" معه. إذا أضفت المزيد، فستتم مزامنته تلقائياً مع اشتراكك. "
|
||||
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:298
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:318
|
||||
msgid ""
|
||||
"Adding more workers will not magically solve all performance issues. It only"
|
||||
" allows the server to handle more connections at the same time. If some "
|
||||
@@ -5088,11 +5132,11 @@ msgstr ""
|
||||
"وإذا لم يكن ذلك بسبب التخصيصات التي قمت بها، فيمكنك فتح تذكرة `هنا "
|
||||
"<https://www.odoo.com/help>`_. "
|
||||
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:304
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:324
|
||||
msgid "Staging Branches"
|
||||
msgstr "الفروع التجريبية "
|
||||
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:306
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:326
|
||||
msgid ""
|
||||
"Additional staging branches allow you to develop and test more features at "
|
||||
"the same time. If you add more, it will automatically be synchronized with "
|
||||
@@ -5101,11 +5145,11 @@ msgstr ""
|
||||
"تتيح لك الفروع التجريبية الإضافية تطوير واختبار المزيد من الخصائص في آن "
|
||||
"واحد. إذا أضفت المزيد، فستتم مزامنته تلقائياً مع اشتراكك. "
|
||||
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:313
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:333
|
||||
msgid "Activation"
|
||||
msgstr "تنشيط"
|
||||
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:315
|
||||
#: ../../content/administration/odoo_sh/getting_started/settings.rst:335
|
||||
msgid ""
|
||||
"Shows the status of the project's activation. You can change the project's "
|
||||
"activation code if needed."
|
||||
@@ -5259,13 +5303,12 @@ msgstr ""
|
||||
" أودو بفتح الاتصالات الصادرة تجاه: "
|
||||
|
||||
#: ../../content/administration/on_premise.rst:64
|
||||
msgid "`services.odoo.com` on port `443` (or `80`)"
|
||||
msgstr "`services.odoo.com` في المعبر `443` (أو `80`) "
|
||||
msgid "Odoo 18.0 and above: `services.odoo.com` on port `443` (or `80`)"
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/administration/on_premise.rst:65
|
||||
msgid "for older deployments, `services.openerp.com` on port `443` (or `80`)"
|
||||
msgid "Odoo 17.0 and below: `services.openerp.com` on port `443` (or `80`)"
|
||||
msgstr ""
|
||||
"أو عمليات النشر الأقدم، `services.openerp.com` في المعبر `443` (أو `80`) "
|
||||
|
||||
#: ../../content/administration/on_premise.rst:67
|
||||
msgid ""
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
# Translators:
|
||||
# Malaz Abuidris <msea@odoo.com>, 2023
|
||||
# Malaz Abuidris <msea@odoo.com>, 2024
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
@@ -12,8 +12,8 @@ msgstr ""
|
||||
"Project-Id-Version: Odoo 17.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2023-11-08 08:46+0000\n"
|
||||
"PO-Revision-Date: 2023-11-08 08:57+0000\n"
|
||||
"Last-Translator: Malaz Abuidris <msea@odoo.com>, 2023\n"
|
||||
"PO-Revision-Date: 2024-10-08 06:34+0000\n"
|
||||
"Last-Translator: Malaz Abuidris <msea@odoo.com>, 2024\n"
|
||||
"Language-Team: Arabic (https://app.transifex.com/odoo/teams/41243/ar/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -23,7 +23,7 @@ msgstr ""
|
||||
|
||||
#: ../../content/applications.rst:9
|
||||
msgid "User Docs"
|
||||
msgstr "مستندات المستخدم "
|
||||
msgstr "دليل المستخدم"
|
||||
|
||||
#: ../../content/applications.rst:11
|
||||
msgid "Discover our user guides and configuration tutorials per application."
|
||||
|
||||
@@ -12,7 +12,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo 18.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2024-10-07 14:21+0000\n"
|
||||
"POT-Creation-Date: 2024-11-05 09:20+0000\n"
|
||||
"PO-Revision-Date: 2024-10-08 06:34+0000\n"
|
||||
"Last-Translator: Malaz Abuidris <msea@odoo.com>, 2024\n"
|
||||
"Language-Team: Arabic (https://app.transifex.com/odoo/teams/41243/ar/)\n"
|
||||
@@ -691,14 +691,10 @@ msgstr "جهات الاتصال"
|
||||
|
||||
#: ../../content/applications/essentials/contacts.rst:7
|
||||
msgid ""
|
||||
"The *Contacts* application comes installed on all Odoo databases. Contacts "
|
||||
"are created for customers the company does business with through Odoo. A "
|
||||
"contact is a repository of vital business information, facilitating "
|
||||
"communication and business transactions."
|
||||
"Contacts are created in the **Contacts** application for customers the "
|
||||
"company does business with through Odoo. A contact is a repository of vital "
|
||||
"business information, facilitating communication and business transactions."
|
||||
msgstr ""
|
||||
"يتم تثبيت تطبيق *جهات الاتصال* على جميع قواعد بيانات Odoo. يتم إنشاء جهات "
|
||||
"الاتصال للعملاء الذين تتعامل معهم الشركة من خلال Odoo. جهة الاتصال هي مستودع"
|
||||
" للمعلومات التجارية الحيوية، مما يسهل الاتصالات والمعاملات التجارية. "
|
||||
|
||||
#: ../../content/applications/essentials/contacts.rst:12
|
||||
msgid "Contact form"
|
||||
|
||||
@@ -14,7 +14,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo 18.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2024-10-07 14:21+0000\n"
|
||||
"POT-Creation-Date: 2024-11-05 09:20+0000\n"
|
||||
"PO-Revision-Date: 2024-10-08 06:34+0000\n"
|
||||
"Last-Translator: Malaz Abuidris <msea@odoo.com>, 2024\n"
|
||||
"Language-Team: Arabic (https://app.transifex.com/odoo/teams/41243/ar/)\n"
|
||||
@@ -2963,9 +2963,10 @@ msgstr ""
|
||||
|
||||
#: ../../content/applications/general/email_communication/email_domain.rst:144
|
||||
msgid ""
|
||||
"`Google Domains <https://support.google.com/domains/answer/3290350?hl=en>`_"
|
||||
"`Squarespace DNS records <https://support.squarespace.com/hc/en-"
|
||||
"us/articles/360002101888-Adding-custom-DNS-records-to-your-Squarespace-"
|
||||
"managed-domain>`_"
|
||||
msgstr ""
|
||||
"`Google Domains <https://support.google.com/domains/answer/3290350?hl=en>`_"
|
||||
|
||||
#: ../../content/applications/general/email_communication/email_domain.rst:145
|
||||
msgid ""
|
||||
@@ -7696,8 +7697,8 @@ msgstr ""
|
||||
|
||||
#: ../../content/applications/general/iot/config/troubleshooting.rst:100
|
||||
msgid ""
|
||||
"Epson and Star receipt printers and Zebra label printers do not need a "
|
||||
"driver to work. Make sure that no driver is selected for those printers."
|
||||
"Epson receipt printers and Zebra label printers do not need a driver to "
|
||||
"work. Make sure that no driver is selected for those printers."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/general/iot/config/troubleshooting.rst:104
|
||||
|
||||
@@ -13,7 +13,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo 18.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2024-10-07 14:21+0000\n"
|
||||
"POT-Creation-Date: 2024-11-05 09:20+0000\n"
|
||||
"PO-Revision-Date: 2024-10-08 06:34+0000\n"
|
||||
"Last-Translator: Malaz Abuidris <msea@odoo.com>, 2024\n"
|
||||
"Language-Team: Arabic (https://app.transifex.com/odoo/teams/41243/ar/)\n"
|
||||
@@ -1873,7 +1873,7 @@ msgid ""
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/attendances.rst:166
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:276
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:190
|
||||
msgid "Filters"
|
||||
msgstr "عوامل التصفية "
|
||||
|
||||
@@ -5964,6 +5964,15 @@ msgid ""
|
||||
"example, by size, or the numbers of passengers the vehicle can carry."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/fleet/models.rst:196
|
||||
msgid ""
|
||||
"When used with the **Inventory** app, the :guilabel:`Max Weight` and "
|
||||
":guilabel:`Max Volume` fields track a vehicle's capacity. This helps manage "
|
||||
"in-house deliveries by :doc:`showing how much space and weight remain for "
|
||||
"loading products "
|
||||
"<../../inventory_and_mrp/inventory/shipping_receiving/setup_configuration/dispatch>`."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/fleet/models.rst-1
|
||||
msgid "List view of the models in the fleet."
|
||||
msgstr ""
|
||||
@@ -11735,6 +11744,14 @@ msgstr ""
|
||||
msgid ":doc:`payroll/reporting`"
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll.rst:966
|
||||
msgid ":doc:`payroll/work_entry_analysis`"
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll.rst:967
|
||||
msgid ":doc:`payroll/salary_attachment`"
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/contracts.rst:5
|
||||
msgid ""
|
||||
"Every employee in Odoo is required to have a contract in order to be paid. A"
|
||||
@@ -13595,7 +13612,6 @@ msgid ""
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:160
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:225
|
||||
msgid ""
|
||||
"To export the data in an XLSX format, click the :guilabel:`Download xlsx` "
|
||||
"button, represented by a :guilabel:`⬇️ (down arrow above a horizontal bar)` "
|
||||
@@ -13624,177 +13640,31 @@ msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:181
|
||||
msgid ""
|
||||
"If the *Documents* app is **not** installed, the :guilabel:`Insert in "
|
||||
"Spreadsheet` option places the newly-created spreadsheet in the *Dashboards*"
|
||||
" app."
|
||||
"If the **Documents** app is **not** installed, the :guilabel:`Insert in "
|
||||
"Spreadsheet` option places the newly-created spreadsheet in the "
|
||||
"**Dashboards** app."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:184
|
||||
msgid ""
|
||||
"If the *Documents* application **is** installed, the spreadsheet has the "
|
||||
"option to be stored in either the *Dashboards* app or *Documents* app."
|
||||
"If the **Documents** application *is* installed, the spreadsheet has the "
|
||||
"option to be stored in either the **Dashboards** app or **Documents** app."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:188
|
||||
msgid "Work entry analysis"
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:190
|
||||
msgid ""
|
||||
"The default :guilabel:`Work entry analysis` report provides an overview of "
|
||||
"the validated work entries for the current month. To view this report, "
|
||||
"navigate to :menuselection:`Payroll app --> Reporting --> Work Entry "
|
||||
"Analysis`."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:194
|
||||
msgid ""
|
||||
"The work entries appear in a pivot table, with the default filters of "
|
||||
"`Current month: (Month)(Year)` and `Validated`. The various types of "
|
||||
":doc:`work_entries` are listed on the left-hand side (x-axis), while the "
|
||||
":guilabel:`Total` values appear along the top (the y-axis)."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:198
|
||||
msgid ""
|
||||
"To change the displayed view, click the :guilabel:`➕ (plus)` icon next to "
|
||||
"the word :guilabel:`Total`, then click on one of the grouping options. The "
|
||||
"available options are :guilabel:`Work Entry Type`, :guilabel:`Employee`, and"
|
||||
" :guilabel:`Department`. If in a multi-company database, a "
|
||||
":guilabel:`Company` option also appears."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:203
|
||||
msgid ""
|
||||
"To add a new group to sort the data, click :guilabel:`Add Custom Group`, "
|
||||
"then click one of the presented options."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:207
|
||||
msgid ""
|
||||
"Wherever a :guilabel:`➕ (plus)` icon appears on a pivot table, the "
|
||||
"information can be further grouped. Click on a :guilabel:`➕ (plus)` icon to "
|
||||
"reveal the available grouping options."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:210
|
||||
msgid ""
|
||||
"Click on a :guilabel:`➖ (minus)` icon anywhere on the pivot table to remove "
|
||||
"that respective grouping."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:213
|
||||
msgid ""
|
||||
"It is possible to compare the current :guilabel:`Work entry analysis` report"
|
||||
" to the previous month or the previous year. To view these comparisons, "
|
||||
"click the :guilabel:`⬇️ (down arrow)` icon in the search bar to reveal the "
|
||||
"various :ref:`filter <payroll/filters>` and grouping options."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:217
|
||||
msgid ""
|
||||
"In the section titled :guilabel:`Comparison`, click on either "
|
||||
":guilabel:`Current Month: Previous Period` or :guilabel:`Current Month: "
|
||||
"Previous Year`. The report updates and displays the previous time period "
|
||||
"values, as well as the :guilabel:`Variation` between the two."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/reporting.rst-1
|
||||
msgid ""
|
||||
"A pivot table comparing the work entries of the current month and the "
|
||||
"previous month."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:229
|
||||
msgid ""
|
||||
"The data can also be inserted into a spreadsheet. Click the "
|
||||
":guilabel:`Insert in Spreadsheet` button and a :guilabel:`Select a "
|
||||
"spreadsheet to insert your (type of report)` pop-up window appears, asking "
|
||||
"which spreadsheet to place the information in. Select an existing "
|
||||
"spreadsheet or dashboard, or select a new :guilabel:`Blank spreadsheet`. "
|
||||
"Click the :guilabel:`Confirm` button to move to a spreadsheet view with the "
|
||||
"report added to it."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:236
|
||||
msgid ""
|
||||
"The work entry analysis spreadsheet is :ref:`stored in the same locations "
|
||||
"<payroll/doc-storage>` as a pivot table."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:240
|
||||
msgid "Salary attachment report"
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:242
|
||||
msgid ""
|
||||
"The :guilabel:`Salary Attachment Report` shows all deductions or allocations"
|
||||
" per employee, such as child support payments and wage garnishments. To view"
|
||||
" this report, navigate to :menuselection:`Payroll app --> Reporting --> "
|
||||
"Salary Attachment Report`."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/reporting.rst-1
|
||||
msgid ""
|
||||
"View the Attachment of Salary report that shows all salary garnishments."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:250
|
||||
msgid ""
|
||||
"The employees are listed in the left-side column, while the different "
|
||||
"deductions are listed in the top row, organized by deduction and monthly "
|
||||
"individual payslips."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:253
|
||||
msgid ""
|
||||
"The report can be exported as an XLSX file, or inserted into a spreadsheet, "
|
||||
"using the corresponding buttons at the top."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:256
|
||||
msgid ""
|
||||
"Click the :guilabel:`Measures` button to reveal the options of what data can"
|
||||
" be displayed. :guilabel:`Assignment of salary`, :guilabel:`Attachment of "
|
||||
"salary`, :guilabel:`Child support`, and :guilabel:`Count` can all be "
|
||||
"selected or deselected by clicking on the item. If an item has a checkmark "
|
||||
"next to it, that information is displayed."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/reporting.rst-1
|
||||
msgid "Select the options to be displayed in the Salary Attachment Report."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:265
|
||||
msgid ""
|
||||
"The :guilabel:`Salary Attachment Report` can be compared to the report for "
|
||||
"the previous time period or the previous year. To view these comparisons, "
|
||||
"click the :guilabel:`⬇️ (down arrow)` icon in the search bar to reveal the "
|
||||
"various :ref:`filter <payroll/filters>` and grouping options."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:269
|
||||
msgid ""
|
||||
"In the section titled :guilabel:`Comparison`, click on either "
|
||||
":guilabel:`Payslip End Date: Previous Period` or :guilabel:`Payslip End "
|
||||
"Date: Previous Year`. The report updates and displays the previous time "
|
||||
"period values, as well as the :guilabel:`Variation` between the two."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:278
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:192
|
||||
msgid ""
|
||||
"At the top of each report, the default filters are shown inside the "
|
||||
":guilabel:`Search...` box."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:280
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:194
|
||||
msgid ""
|
||||
"Click the :guilabel:`⬇️ (down arrow)` icon in the search bar to display the "
|
||||
"available :guilabel:`Filters`. Filters show information that match the "
|
||||
"specific filter parameters."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:284
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:198
|
||||
msgid ""
|
||||
"The :guilabel:`Work Entries Analysis` report has two default filters, the "
|
||||
"`Current month:(Month) (Year)` filter, and the `Validated` filter."
|
||||
@@ -13804,37 +13674,37 @@ msgstr ""
|
||||
msgid "Filters enabled for the Work Entries Analysis report."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:291
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:205
|
||||
msgid ""
|
||||
"The :guilabel:`Payroll` report has only one default filter, the `Last 365 "
|
||||
"Days Payslip` filter."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:293
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:207
|
||||
msgid ""
|
||||
"The :guilabel:`Salary Attachment Report` has only one default filter, the "
|
||||
"`Payslip End Date: (Year)` filter."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:296
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:210
|
||||
msgid ""
|
||||
"All reports can include custom filters, or group information, by different "
|
||||
"metrics (employee, department, company, etc.)."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:299
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:213
|
||||
msgid ""
|
||||
"Some reports have the option to compare the current report to the previous "
|
||||
"time period or year (a :guilabel:`Comparison` option)."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:302
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:216
|
||||
msgid ""
|
||||
"Click on a parameter to select it and activate it. The report is immediately"
|
||||
" updated with the new parameters."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:305
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:219
|
||||
msgid ""
|
||||
"The updated report can be set as a *favorite* report, meaning the parameters"
|
||||
" are stored for quick access in the future. To do that, click "
|
||||
@@ -13843,7 +13713,7 @@ msgid ""
|
||||
"Doing so reveals two options and a :guilabel:`Save` button."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:310
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:224
|
||||
msgid ""
|
||||
"To set the current report as the default configuration when the report is "
|
||||
"accessed, check the box next to :guilabel:`Default filter`. If the current "
|
||||
@@ -13851,13 +13721,130 @@ msgid ""
|
||||
"to :guilabel:`Share`."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:314
|
||||
#: ../../content/applications/hr/payroll/reporting.rst:228
|
||||
msgid ""
|
||||
"Finally, click :guilabel:`Save`, which saves the currently configured "
|
||||
"report. Then, it appears beneath the :guilabel:`Favorites` in the search bar"
|
||||
" drop-down mega menu of filter options."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/salary_attachment.rst:3
|
||||
msgid "Salary attachment report"
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/salary_attachment.rst:5
|
||||
msgid ""
|
||||
"*Salary attachments* in Odoo refer to a portion of an employee's earnings "
|
||||
"that are designated for a specific purpose, both voluntary and involuntary. "
|
||||
"These can include contributions to a retirement plan, repayment of a loan, "
|
||||
"wage garnishments, or child support."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/salary_attachment.rst:9
|
||||
msgid ""
|
||||
"Voluntary salary attachments, such as repaying a loan, or contributing to a "
|
||||
"charity on a monthly basis, are considered *Assignments of Salary* in Odoo. "
|
||||
"Salary attachments that are required, such as a lawsuit settlement "
|
||||
"repayment, or repaying a tax lien, are considered *Attachments of Salary* in"
|
||||
" Odoo. Child support payments have their own category, and are simply "
|
||||
"referred to as *Child Support* in Odoo."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/salary_attachment.rst:15
|
||||
msgid ""
|
||||
"To view this report, navigate to :menuselection:`Payroll app --> Reporting "
|
||||
"--> Salary Attachment Report`. The :guilabel:`Salary Attachment Report` "
|
||||
"shows all deductions or allocations per employee, organized by payslip, in a"
|
||||
" default pivot table. The default filter is the end of the current year "
|
||||
"(:guilabel:`Payslip End Date: (year)`). The employees populate the rows, "
|
||||
"while the various deductions populate the columns, organized by type of "
|
||||
"deduction, and further grouped by individual payslip."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/salary_attachment.rst:22
|
||||
msgid ""
|
||||
"The default report contains **all** payslips for the current year, so the "
|
||||
"report typically contains a large number of columns. This could make it "
|
||||
"difficult to view all the data at once, as the report may be very wide and "
|
||||
"require scrolling to view all the data."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/salary_attachment.rst:26
|
||||
msgid ""
|
||||
"To view a condensed version of salary attachments, and have all the salary "
|
||||
"attachment columns visible on one page, click the :icon:`fa-minus-square-o` "
|
||||
":guilabel:`Total` icon at the top of the report, above the various payslips."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/salary_attachment.rst:30
|
||||
msgid ""
|
||||
"This presents the salary attachments for the current year, and only displays"
|
||||
" three columns, :guilabel:`Attachment of Salary`, :guilabel:`Assignment of "
|
||||
"Salary`, and :guilabel:`Child Support.`"
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/salary_attachment.rst:33
|
||||
msgid ""
|
||||
"Each entry displays the total amount paid for each specific type of salary "
|
||||
"attachment, for each employee."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/salary_attachment.rst-1
|
||||
msgid ""
|
||||
"The Attachment of Salary report that shows all salary garnishments in a "
|
||||
"condensed view."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/salary_attachment.rst:39
|
||||
msgid ""
|
||||
"The report can be downloaded as an XLSX file, or :doc:`inserted into a "
|
||||
"spreadsheet <../../productivity/spreadsheet/insert>` using the corresponding"
|
||||
" buttons at the top."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/salary_attachment.rst:42
|
||||
msgid ""
|
||||
"Click the :guilabel:`Measures` button to reveal the options of what data is "
|
||||
"displayed. :guilabel:`Assignment of salary`, :guilabel:`Attachment of "
|
||||
"salary`, and :guilabel:`Child support` are all selected and visible, by "
|
||||
"default, while the :guilabel:`Count` option is not."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/salary_attachment.rst:46
|
||||
msgid ""
|
||||
"Click an option to either show or hide that particular metric. A :icon:`fa-"
|
||||
"check` :guilabel:`(checkmark)` icon indicates the data is visible."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/salary_attachment.rst:50
|
||||
msgid "Compare to previous year"
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/salary_attachment.rst:52
|
||||
msgid ""
|
||||
"The :guilabel:`Salary Attachment Report` can be compared to the report for "
|
||||
"the previous time period or the previous year."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/salary_attachment.rst:55
|
||||
msgid ""
|
||||
"To view these comparisons, click the :icon:`fa-caret-down` :guilabel:`(down "
|
||||
"arrow)` icon in the search bar, then click either :guilabel:`Payslip End "
|
||||
"Date: Previous Period` or :guilabel:`Payslip End Date: Previous Year`, "
|
||||
"beneath the :icon:`fa-adjust` :guilabel:`Comparison` column."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/salary_attachment.rst:59
|
||||
msgid ""
|
||||
"The report updates and displays the current time period values, and the "
|
||||
"previous time period values, as well as the :guilabel:`Variation` between "
|
||||
"the two, in a percentage."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/salary_attachment.rst-1
|
||||
msgid "The salary attachment report modified to compare to the previous year."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/work_entries.rst:5
|
||||
msgid ""
|
||||
"Work entries are created automatically in the *Payroll* app, based on the "
|
||||
@@ -13965,7 +13952,7 @@ msgstr ""
|
||||
#: ../../content/applications/hr/payroll/work_entries.rst:62
|
||||
msgid ""
|
||||
":guilabel:`Work Entry Type`: select the :ref:`work entry type <payroll/work-"
|
||||
"entries-config>` using the drop-down menu."
|
||||
"entries>` using the drop-down menu."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/work_entries.rst:64
|
||||
@@ -14464,6 +14451,153 @@ msgstr ""
|
||||
msgid ":ref:`Configure work entries <payroll/work-entries-config>`"
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/work_entry_analysis.rst:3
|
||||
msgid "Work entry analysis"
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/work_entry_analysis.rst:5
|
||||
msgid ""
|
||||
"The default *Work Entries Analysis* report provides an overview of the "
|
||||
"validated work entries for the current month. To view this report, navigate "
|
||||
"to :menuselection:`Payroll app --> Reporting --> Work Entry Analysis`."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/work_entry_analysis.rst:9
|
||||
msgid ""
|
||||
"The work entries appear in a pivot table, with the default filters of "
|
||||
":guilabel:`Current month: (Month)(Year)` and :guilabel:`Validated`. The "
|
||||
"various types of :doc:`work_entries` populate the rows, while the "
|
||||
":guilabel:`Total` values populate the only visible column."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/work_entry_analysis.rst:13
|
||||
msgid ""
|
||||
"To change the displayed information, click :icon:`fa-plus-square` "
|
||||
":guilabel:`Total` above the main column, revealing a drop-down menu of "
|
||||
"available metrics. Click on one of the available groupings, and the data is "
|
||||
"further organized by that selected metric. The default options are "
|
||||
":guilabel:`Work Entry Type`, :guilabel:`Employee`, and "
|
||||
":guilabel:`Department`. If in a multi-company database, a "
|
||||
":guilabel:`Company` option also appears."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/work_entry_analysis.rst:20
|
||||
msgid "Work entry analysis comparison"
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/work_entry_analysis.rst:22
|
||||
msgid ""
|
||||
"It is possible to compare the work entries from one time period to a "
|
||||
"previous time period. To view this comparison, first navigate to "
|
||||
":menuselection:`Payroll app --> Reporting --> Work Entry Analysis`."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/work_entry_analysis.rst:26
|
||||
msgid ""
|
||||
"Next, click the :icon:`fa-caret-down` :guilabel:`(down arrow)` icon in the "
|
||||
"search bar, revealing a drop-down menu. Under the :icon:`fa-adjust` "
|
||||
":guilabel:`Comparison` section, click on either :guilabel:`Current Month: "
|
||||
"Previous Period` or :guilabel:`Current Month: Previous Year`."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/work_entry_analysis.rst:30
|
||||
msgid ""
|
||||
"The report updates and displays the data for the current time period, data "
|
||||
"for the selected previous time period, as well as the :guilabel:`Variation` "
|
||||
"between the two, in a percentage."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/work_entry_analysis.rst-1
|
||||
msgid ""
|
||||
"A pivot table comparing the work entries of the current month and the "
|
||||
"previous month."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/work_entry_analysis.rst:37
|
||||
msgid ""
|
||||
"If no work entries for a specific :ref:`work entry type <payroll/work-"
|
||||
"entries>` are logged for the time period, it does **not** appear on the "
|
||||
"report. That does **not** mean the work entry type does not exist, or is not"
|
||||
" configured."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/work_entry_analysis.rst:41
|
||||
msgid ""
|
||||
"Additionally, if the default :guilabel:`Current month: (Month)(Year)` filter"
|
||||
" is removed from the search bar, the :guilabel:`Comparison` column does "
|
||||
"**not** appear; there must be a time-frame selected to view the "
|
||||
":guilabel:`Comparison` column."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/work_entry_analysis.rst:46
|
||||
msgid "Use case: overtime report comparison"
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/work_entry_analysis.rst:48
|
||||
msgid ""
|
||||
"It is possible to alter the *Work Entries Analysis* report to show a "
|
||||
"comparison of only overtime work entries, grouped by employee, for a "
|
||||
"specific time period. To view this data, first navigate to the default *Work"
|
||||
" entry analysis* report by going to :menuselection:`Payroll app --> "
|
||||
"Reporting --> Work Entry Analysis`."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/work_entry_analysis.rst:53
|
||||
msgid ""
|
||||
"Next, click the :icon:`fa-caret-down` :guilabel:`(down arrow)` icon in the "
|
||||
"search bar, revealing a drop-down menu. Under the :icon:`fa-filter` "
|
||||
":guilabel:`Filters` column, click :guilabel:`Add Custom Filter`, and a "
|
||||
":guilabel:`Add Custom Filter` pop-up window appears."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/work_entry_analysis.rst:57
|
||||
msgid ""
|
||||
"Using the drop-down menu, select :guilabel:`Work Entry Type` for the first "
|
||||
"field, leave the middle field as-is (with :guilabel:`is in` populating the "
|
||||
"field), and select :guilabel:`Overtime Hours` for the last field. Click "
|
||||
":guilabel:`Add`, and all other work entry types disappear, and "
|
||||
":guilabel:`Overtime Hours` appear in the sole row."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/work_entry_analysis.rst:62
|
||||
msgid ""
|
||||
"To compare overtime from the current month to the previous month, to see "
|
||||
"which month had more overtime logged, click the :icon:`fa-caret-down` "
|
||||
":guilabel:`(down arrow)` icon again in the search bar. Under the :icon:`fa-"
|
||||
"adjust` :guilabel:`Comparison` section, click :guilabel:`Current Month: "
|
||||
"Previous Period`. Click away from the drop-down menu to close it."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/work_entry_analysis.rst:67
|
||||
msgid ""
|
||||
"Now, the report displays the :guilabel:`Overtime Hours` for the current "
|
||||
"month and the previous month, along with the :guilabel:`Variation`, in a "
|
||||
"percentage."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/work_entry_analysis.rst:70
|
||||
msgid ""
|
||||
"To view which employees received the most overtime, click :icon:`fa-plus-"
|
||||
"square` :guilabel:`Overtime Hours`, revealing a drop-down menu of options. "
|
||||
"Click :guilabel:`Employee`, and all employees with overtime work entries for"
|
||||
" either the current or previous month appears."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/work_entry_analysis.rst:74
|
||||
msgid ""
|
||||
"In this example, it can be determined that :guilabel:`Marc Demo` worked the "
|
||||
"most overtime in :guilabel:`August 2024`, whereas :guilabel:`Beth Evans` "
|
||||
"worked the most overtime hours in :guilabel:`September 2024`. Additionally, "
|
||||
":guilabel:`Mitchell Admin` had the largest variation change, with a "
|
||||
":guilabel:`-100%` change from :guilabel:`August 2024` to "
|
||||
":guilabel:`September 2024`."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/payroll/work_entry_analysis.rst-1
|
||||
msgid ""
|
||||
"A pivot table comparing the overtime from September 2024 with August 2024."
|
||||
msgstr ""
|
||||
|
||||
#: ../../content/applications/hr/recruitment.rst:5
|
||||
msgid "Recruitment"
|
||||
msgstr "التوظيف"
|
||||
|
||||