diff --git a/.copier-answers.yml b/.copier-answers.yml
new file mode 100644
index 0000000000..62a0f7b722
--- /dev/null
+++ b/.copier-answers.yml
@@ -0,0 +1,21 @@
+# Do NOT update manually; changes here will be overwritten by Copier
+_commit: v1.14.2
+_src_path: https://github.com/OCA/oca-addons-repo-template.git
+ci: GitHub
+generate_requirements_txt: true
+github_check_license: false
+github_ci_extra_env: {}
+github_enable_codecov: true
+github_enable_makepot: true
+github_enable_stale_action: true
+github_enforce_dev_status_compatibility: false
+include_wkhtmltopdf: false
+odoo_version: 12.0
+org_name: Odoo Community Association (OCA)
+org_slug: OCA
+rebel_module_groups: []
+repo_description: Electronic Data Interchange modules
+repo_name: Electronic Data Interchange modules
+repo_slug: edi
+repo_website: https://github.com/OCA/edi
+
diff --git a/.editorconfig b/.editorconfig
index 62276b0d58..bfd7ac53df 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -7,11 +7,11 @@ indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true
-[.eslintrc,*.{json,yml,yaml,rst,md}]
+[*.{json,yml,yaml,rst,md}]
indent_size = 2
# Do not configure editor for libs and autogenerated content
-[*/static/{lib,src/lib}/**,*/static/description/index.html,*/readme/../README.rst]
+[{*/static/{lib,src/lib}/**,*/static/description/index.html,*/readme/../README.rst}]
charset = unset
end_of_line = unset
indent_size = unset
diff --git a/.flake8 b/.flake8
new file mode 100644
index 0000000000..6363964b54
--- /dev/null
+++ b/.flake8
@@ -0,0 +1,11 @@
+[flake8]
+# E123,E133,E226,E241,E242 are ignored by default by pep8 and flake8
+# F811 is legal in odoo 8 when we implement 2 interfaces for a method
+# F601 pylint support this case with expected tests
+# W503 changed by W504 and OCA prefers allow both
+# E203: whitespace before ':' (black behaviour and not pep8 compliant)
+ignore = E123,E133,E226,E241,E242,F811,F601,W503,W504,E203
+max-line-length = 88
+per-file-ignores=
+ __init__.py:F401
+
diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml
new file mode 100644
index 0000000000..f86d418269
--- /dev/null
+++ b/.github/workflows/pre-commit.yml
@@ -0,0 +1,37 @@
+name: pre-commit
+
+on:
+ pull_request:
+ branches:
+ - "12.0*"
+ push:
+ branches:
+ - "12.0"
+ - "12.0-ocabot-*"
+
+jobs:
+ pre-commit:
+ runs-on: ubuntu-20.04
+ steps:
+ - uses: actions/checkout@v2
+ - uses: actions/setup-python@v2
+ with:
+ python-version: "3.6"
+ - name: Get python version
+ run: echo "PY=$(python -VV | sha256sum | cut -d' ' -f1)" >> $GITHUB_ENV
+ - uses: actions/cache@v1
+ with:
+ path: ~/.cache/pre-commit
+ key: pre-commit|${{ env.PY }}|${{ hashFiles('.pre-commit-config.yaml') }}
+ - name: Install pre-commit
+ run: pip install pre-commit
+ - name: Run pre-commit
+ run: pre-commit run --all-files --show-diff-on-failure --color=always
+ - name: Check that all files generated by pre-commit are in git
+ run: |
+ newfiles="$(git ls-files --others --exclude-from=.gitignore)"
+ if [ "$newfiles" != "" ] ; then
+ echo "Please check-in the following files:"
+ echo "$newfiles"
+ exit 1
+ fi
diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml
new file mode 100644
index 0000000000..1693a1253b
--- /dev/null
+++ b/.github/workflows/stale.yml
@@ -0,0 +1,69 @@
+name: Mark stale issues and pull requests
+
+on:
+ schedule:
+ - cron: "0 12 * * 0"
+
+jobs:
+ stale:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Stale PRs and issues policy
+ uses: actions/stale@v4
+ with:
+ repo-token: ${{ secrets.GITHUB_TOKEN }}
+ # General settings.
+ ascending: true
+ remove-stale-when-updated: true
+ # Pull Requests settings.
+ # 120+30 day stale policy for PRs
+ # * Except PRs marked as "no stale"
+ days-before-pr-stale: 120
+ days-before-pr-close: 30
+ exempt-pr-labels: "no stale"
+ stale-pr-label: "stale"
+ stale-pr-message: >
+ There hasn't been any activity on this pull request in the past 4 months, so
+ it has been marked as stale and it will be closed automatically if no
+ further activity occurs in the next 30 days.
+
+ If you want this PR to never become stale, please ask a PSC member to apply
+ the "no stale" label.
+ # Issues settings.
+ # 180+30 day stale policy for open issues
+ # * Except Issues marked as "no stale"
+ days-before-issue-stale: 180
+ days-before-issue-close: 30
+ exempt-issue-labels: "no stale,needs more information"
+ stale-issue-label: "stale"
+ stale-issue-message: >
+ There hasn't been any activity on this issue in the past 6 months, so it has
+ been marked as stale and it will be closed automatically if no further
+ activity occurs in the next 30 days.
+
+ If you want this issue to never become stale, please ask a PSC member to
+ apply the "no stale" label.
+
+ # 15+30 day stale policy for issues pending more information
+ # * Issues that are pending more information
+ # * Except Issues marked as "no stale"
+ - name: Needs more information stale issues policy
+ uses: actions/stale@v4
+ with:
+ repo-token: ${{ secrets.GITHUB_TOKEN }}
+ ascending: true
+ only-labels: "needs more information"
+ exempt-issue-labels: "no stale"
+ days-before-stale: 15
+ days-before-close: 30
+ days-before-pr-stale: -1
+ days-before-pr-close: -1
+ remove-stale-when-updated: true
+ stale-issue-label: "stale"
+ stale-issue-message: >
+ This issue needs more information and there hasn't been any activity
+ recently, so it has been marked as stale and it will be closed automatically
+ if no further activity occurs in the next 30 days.
+
+ If you think this is a mistake, please ask a PSC member to remove the "needs
+ more information" label.
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
new file mode 100644
index 0000000000..562e73a1a4
--- /dev/null
+++ b/.github/workflows/test.yml
@@ -0,0 +1,71 @@
+name: tests
+
+on:
+ pull_request:
+ branches:
+ - "12.0*"
+ push:
+ branches:
+ - "12.0"
+ - "12.0-ocabot-*"
+
+jobs:
+ unreleased-deps:
+ runs-on: ubuntu-latest
+ name: Detect unreleased dependencies
+ steps:
+ - uses: actions/checkout@v2
+ - run: |
+ for reqfile in requirements.txt test-requirements.txt ; do
+ if [ -f ${reqfile} ] ; then
+ result=0
+ # reject non-comment lines that contain a / (i.e. URLs, relative paths)
+ grep "^[^#].*/" ${reqfile} || result=$?
+ if [ $result -eq 0 ] ; then
+ echo "Unreleased dependencies found in ${reqfile}."
+ exit 1
+ fi
+ fi
+ done
+ test:
+ runs-on: ubuntu-20.04
+ container: ${{ matrix.container }}
+ name: ${{ matrix.name }}
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ - container: ghcr.io/oca/oca-ci/py3.6-odoo12.0:latest
+ makepot: "true"
+ name: test with Odoo
+ - container: ghcr.io/oca/oca-ci/py3.6-ocb12.0:latest
+ name: test with OCB
+ services:
+ postgres:
+ image: postgres:9.6
+ env:
+ POSTGRES_USER: odoo
+ POSTGRES_PASSWORD: odoo
+ POSTGRES_DB: odoo
+ ports:
+ - 5432:5432
+ steps:
+ - uses: actions/checkout@v2
+ with:
+ persist-credentials: false
+ - name: Install addons and dependencies
+ run: oca_install_addons
+ - name: Check licenses
+ run: manifestoo -d . check-licenses
+ continue-on-error: true
+ - name: Check development status
+ run: manifestoo -d . check-dev-status --default-dev-status=Beta
+ continue-on-error: true
+ - name: Initialize test db
+ run: oca_init_test_database
+ - name: Run tests
+ run: oca_run_tests
+ - uses: codecov/codecov-action@v1
+ - name: Update .pot files
+ run: oca_export_and_push_pot https://x-access-token:${{ secrets.GIT_PUSH_TOKEN }}@github.com/${{ github.repository }}
+ if: ${{ matrix.makepot == 'true' && github.event_name == 'push' && github.repository_owner == 'OCA' }}
diff --git a/.gitignore b/.gitignore
index f7f8a408be..9c283fd41f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,8 @@
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
+/.venv
+/.pytest_cache
# C extensions
*.so
@@ -13,7 +15,6 @@ build/
develop-eggs/
dist/
eggs/
-lib/
lib64/
parts/
sdist/
@@ -21,6 +22,7 @@ var/
*.egg-info/
.installed.cfg
*.egg
+*.eggs
# Installer logs
pip-log.txt
@@ -40,6 +42,19 @@ coverage.xml
# Pycharm
.idea
+# Eclipse
+.settings
+
+# Visual Studio cache/options directory
+.vs/
+.vscode
+
+# OSX Files
+.DS_Store
+
+# Django stuff:
+*.log
+
# Mr Developer
.mr.developer.cfg
.project
@@ -55,5 +70,5 @@ docs/_build/
*~
*.swp
-# OSX Files
-*.DS_Store
+# OCA rules
+!static/lib/
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
new file mode 100644
index 0000000000..cbc99efc86
--- /dev/null
+++ b/.pre-commit-config.yaml
@@ -0,0 +1,59 @@
+exclude: |
+ (?x)
+ # NOT INSTALLABLE ADDONS
+ # END NOT INSTALLABLE ADDONS
+ # Files and folders generated by bots, to avoid loops
+ ^setup/|/static/description/index\.html$|
+ # We don't want to mess with tool-generated files
+ .svg$|/tests/([^/]+/)?cassettes/|^.copier-answers.yml$|^.github/|
+ # Maybe reactivate this when all README files include prettier ignore tags?
+ ^README\.md$|
+ # Library files can have extraneous formatting (even minimized)
+ /static/(src/)?lib/|
+ # Repos using Sphinx to generate docs don't need prettying
+ ^docs/_templates/.*\.html$|
+ # You don't usually want a bot to modify your legal texts
+ (LICENSE.*|COPYING.*)
+default_language_version:
+ python: python3.6
+repos:
+ - repo: https://github.com/oca/maintainer-tools
+ rev: ab1d7f6
+ hooks:
+ # update the NOT INSTALLABLE ADDONS section above
+ - id: oca-update-pre-commit-excluded-addons
+ - id: oca-fix-manifest-website
+ args: ["https://github.com/OCA/edi"]
+ - repo: https://github.com/acsone/setuptools-odoo
+ rev: 3.1.8
+ hooks:
+ - id: setuptools-odoo-make-default
+ - id: setuptools-odoo-get-requirements
+ args:
+ - --output
+ - requirements.txt
+ - --header
+ - "# generated from manifests external_dependencies"
+ - repo: https://github.com/OCA/mirrors-flake8
+ rev: v3.4.1
+ hooks:
+ - id: flake8
+ name: flake8 excluding __init__.py
+ exclude: __init__\.py
+ - repo: https://github.com/pre-commit/mirrors-pylint
+ rev: v2.5.3
+ hooks:
+ - id: pylint
+ name: pylint with optional checks
+ args:
+ - --rcfile=.pylintrc
+ - --exit-zero
+ verbose: true
+ additional_dependencies: &pylint_deps
+ - pylint-odoo==3.5.0
+ - id: pylint
+ name: pylint with mandatory checks
+ args:
+ - --rcfile=.pylintrc-mandatory
+ additional_dependencies: *pylint_deps
+
diff --git a/.pylintrc b/.pylintrc
new file mode 100644
index 0000000000..d8abd71292
--- /dev/null
+++ b/.pylintrc
@@ -0,0 +1,156 @@
+[MASTER]
+load-plugins=pylint_odoo
+score=n
+
+[ODOOLINT]
+readme_template_url="https://github.com/OCA/maintainer-tools/blob/master/template/module/README.rst"
+manifest_required_authors=Odoo Community Association (OCA)
+manifest_required_keys=license
+manifest_deprecated_keys=description,active
+license_allowed=AGPL-3,GPL-2,GPL-2 or any later version,GPL-3,GPL-3 or any later version,LGPL-3
+valid_odoo_versions=12.0
+
+[MESSAGES CONTROL]
+disable=all
+
+# Enable message and code:
+# anomalous-backslash-in-string - W1401
+# assignment-from-none - W1111
+# dangerous-default-value - W0102
+# duplicate-key - W0109
+# missing-import-error - W7935
+# missing-manifest-dependency - W7936
+# pointless-statement - W0104
+# pointless-string-statement - W0105
+# print-statement - E1601
+# redundant-keyword-arg - E1124
+# reimported - W0404
+# relative-import - W0403
+# return-in-init - E0101
+# rst-syntax-error - E7901
+# too-few-format-args - E1306
+# unreachable - W0101
+
+
+# This .pylintrc contains optional AND mandatory checks and is meant to be
+# loaded in an IDE to have it check everything, in the hope this will make
+# optional checks more visible to contributors who otherwise never look at a
+# green travis to see optional checks that failed.
+# .pylintrc-mandatory containing only mandatory checks is used the pre-commit
+# config as a blocking check.
+
+# Beta message and code:
+# api-one-deprecated - W8104
+# api-one-multi-together - W8101
+# attribute-deprecated - W8105
+# class-camelcase - C8104
+# create-user-wo-reset-password - W7905
+# consider-merging-classes-inherited - R7980
+# copy-wo-api-one - W8102
+# dangerous-filter-wo-user - W7901
+# dangerous-view-replace-wo-priority - W7940
+# deprecated-module - W0402
+# duplicate-id-csv - W7906
+# duplicate-xml-fields - W7907
+# duplicate-xml-record-id - W7902
+# file-not-used - W7930
+# incoherent-interpreter-exec-perm - W8201
+# invalid-commit - E8102
+# javascript-lint - W7903
+# manifest-deprecated-key - C8103
+# method-compute - C8108
+# method-inverse - C8110
+# method-required-super - W8106
+# method-search - C8109
+# missing-newline-extrafiles - W7908
+# missing-readme - C7902
+# no-utf8-coding-comment - C8201
+# unnecessary-utf8-coding-comment - C8202
+# odoo-addons-relative-import - W7950
+# old-api7-method-defined - R8110
+# openerp-exception-warning - R8101
+# redundant-modulename-xml - W7909
+# sql-injection - E8103
+# too-complex - C0901
+# translation-field - W8103
+# translation-required - C8107
+# use-vim-comment - W8202
+# wrong-tabs-instead-of-spaces - W7910
+# xml-syntax-error - E7902
+
+
+enable=anomalous-backslash-in-string,
+ assignment-from-none,
+ dangerous-default-value,
+ development-status-allowed,
+ duplicate-key,
+ duplicate-po-message-definition,
+ missing-import-error,
+ missing-manifest-dependency,
+ po-msgstr-variables,
+ po-syntax-error,
+ pointless-statement,
+ pointless-string-statement,
+ print-used,
+ redundant-keyword-arg,
+ reimported,
+ relative-import,
+ return-in-init,
+ rst-syntax-error,
+ too-few-format-args,
+ unreachable,
+ eval-used,
+ eval-referenced,
+ license-allowed,
+ manifest-author-string,
+ manifest-required-author,
+ manifest-required-key,
+ manifest-version-format,
+ api-one-deprecated,
+ api-one-multi-together,
+ attribute-deprecated,
+ class-camelcase,
+ create-user-wo-reset-password,
+ consider-merging-classes-inherited,
+ copy-wo-api-one,
+ dangerous-filter-wo-user,
+ dangerous-view-replace-wo-priority,
+ deprecated-module,
+ duplicate-id-csv,
+ duplicate-po-message-definition,
+ duplicate-xml-fields,
+ duplicate-xml-record-id,
+ file-not-used,
+ incoherent-interpreter-exec-perm,
+ invalid-commit,
+ javascript-lint,
+ manifest-deprecated-key,
+ method-compute,
+ method-inverse,
+ method-required-super,
+ method-search,
+ missing-newline-extrafiles,
+ missing-readme,
+ po-msgstr-variables,
+ po-syntax-error,
+ no-utf8-coding-comment,
+ unnecessary-utf8-coding-comment,
+ odoo-addons-relative-import,
+ old-api7-method-defined,
+ openerp-exception-warning,
+ redefined-builtin,
+ redundant-modulename-xml,
+ sql-injection,
+ too-complex,
+ translation-field,
+ translation-required,
+ use-vim-comment,
+ wrong-tabs-instead-of-spaces,
+ xml-syntax-error,
+
+
+[REPORTS]
+msg-template={path}:{line}: [{msg_id}({symbol}), {obj}] {msg}
+output-format=colorized
+reports=no
+
diff --git a/.pylintrc-mandatory b/.pylintrc-mandatory
new file mode 100644
index 0000000000..9b44956f4f
--- /dev/null
+++ b/.pylintrc-mandatory
@@ -0,0 +1,68 @@
+[MASTER]
+load-plugins=pylint_odoo
+score=n
+
+[ODOOLINT]
+readme_template_url="https://github.com/OCA/maintainer-tools/blob/master/template/module/README.rst"
+manifest_required_authors=Odoo Community Association (OCA)
+manifest_required_keys=license
+manifest_deprecated_keys=description,active
+license_allowed=AGPL-3,GPL-2,GPL-2 or any later version,GPL-3,GPL-3 or any later version,LGPL-3
+valid_odoo_versions=12.0
+
+[MESSAGES CONTROL]
+disable=all
+
+# Enable message and code:
+# anomalous-backslash-in-string - W1401
+# assignment-from-none - W1111
+# dangerous-default-value - W0102
+# duplicate-key - W0109
+# missing-import-error - W7935
+# missing-manifest-dependency - W7936
+# pointless-statement - W0104
+# pointless-string-statement - W0105
+# print-statement - E1601
+# redundant-keyword-arg - E1124
+# reimported - W0404
+# relative-import - W0403
+# return-in-init - E0101
+# rst-syntax-error - E7901
+# too-few-format-args - E1306
+# unreachable - W0101
+
+
+
+enable=anomalous-backslash-in-string,
+ assignment-from-none,
+ dangerous-default-value,
+ development-status-allowed,
+ duplicate-key,
+ duplicate-po-message-definition,
+ missing-import-error,
+ missing-manifest-dependency,
+ po-msgstr-variables,
+ po-syntax-error,
+ pointless-statement,
+ pointless-string-statement,
+ print-used,
+ redundant-keyword-arg,
+ reimported,
+ relative-import,
+ return-in-init,
+ rst-syntax-error,
+ too-few-format-args,
+ unreachable,
+ eval-used,
+ eval-referenced,
+ license-allowed,
+ manifest-author-string,
+ manifest-required-author,
+ manifest-required-key,
+ manifest-version-format
+
+[REPORTS]
+msg-template={path}:{line}: [{msg_id}({symbol}), {obj}] {msg}
+output-format=colorized
+reports=no
+
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 1baaadf9fd..0000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,44 +0,0 @@
-language: python
-sudo: true
-cache:
- apt: true
- directories:
- - $HOME/.cache/pip
-
-python:
- - "3.5"
-
-addons:
- postgresql: "9.6"
- apt:
- packages:
- - expect-dev # provides unbuffer utility
- - python-lxml # because pip installation is slow
- - python-simplejson
- - python-serial
- - python-yaml
- - poppler-utils
-
-env:
- global:
- - VERSION="12.0" TESTS="0" LINT_CHECK="0" MAKEPOT="0" MQT_DEP="PIP"
- - WKHTMLTOPDF_VERSION="0.12.5"
-
- matrix:
- - LINT_CHECK="1"
- - TESTS="1" ODOO_REPO="OCA/OCB"
- - TESTS="1" ODOO_REPO="odoo/odoo" MAKEPOT="1"
-
-
-install:
- - git clone --depth=1 https://github.com/OCA/maintainer-quality-tools.git ${HOME}/maintainer-quality-tools
- - export PATH=${HOME}/maintainer-quality-tools/travis:${PATH}
- - travis_install_nightly
- # what we have here is not compatible with Odoo's account_facturx which is autoinstall
- - rm -fr ${HOME}/{odoo,OCB}-12.0/addons/account_facturx
-
-script:
- - travis_run_tests
-
-after_success:
- - travis_after_tests_success
diff --git a/LICENSE b/LICENSE
index 3ffc567893..be3f7b28e5 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,7 +1,7 @@
-GNU AFFERO GENERAL PUBLIC LICENSE
+ GNU AFFERO GENERAL PUBLIC LICENSE
Version 3, 19 November 2007
- Copyright (C) 2007 Free Software Foundation, Inc.
+ Copyright (C) 2007 Free Software Foundation, Inc.
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
@@ -633,8 +633,8 @@ the "copyright" line and a pointer to where the full notice is found.
Copyright (C)
This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License, or
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
@@ -643,7 +643,7 @@ the "copyright" line and a pointer to where the full notice is found.
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see .
+ along with this program. If not, see .
Also add information on how to contact you by electronic and paper mail.
@@ -658,4 +658,4 @@ specific requirements.
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU AGPL, see
-.
\ No newline at end of file
+.
diff --git a/README.md b/README.md
index bed77394f8..c8076edcff 100644
--- a/README.md
+++ b/README.md
@@ -1,19 +1,37 @@
-[![Runbot Status](https://runbot.odoo-community.org/runbot/badge/flat/226/9.0.svg)](https://runbot.odoo-community.org/runbot/repo/github-com-oca-edi-226)
-[![Build Status](https://travis-ci.org/OCA/edi.svg?branch=9.0)](https://travis-ci.org/OCA/edi)
-[![Coverage Status](https://coveralls.io/repos/OCA/edi/badge.svg?branch=9.0&service=github)](https://coveralls.io/github/OCA/edi?branch=9.0)
-# EDI
+[![Runboat](https://img.shields.io/badge/runboat-Try%20me-875A7B.png)](https://runboat.odoo-community.org/builds?repo=OCA/edi&target_branch=12.0)
+[![Pre-commit Status](https://github.com/OCA/edi/actions/workflows/pre-commit.yml/badge.svg?branch=12.0)](https://github.com/OCA/edi/actions/workflows/pre-commit.yml?query=branch%3A12.0)
+[![Build Status](https://github.com/OCA/edi/actions/workflows/test.yml/badge.svg?branch=12.0)](https://github.com/OCA/edi/actions/workflows/test.yml?query=branch%3A12.0)
+[![codecov](https://codecov.io/gh/OCA/edi/branch/12.0/graph/badge.svg)](https://codecov.io/gh/OCA/edi)
+[![Translation Status](https://translation.odoo-community.org/widgets/edi-12-0/-/svg-badge.svg)](https://translation.odoo-community.org/engage/edi-12-0/?utm_source=widget)
-EDI Modules
+
+# Electronic Data Interchange modules
+Electronic Data Interchange modules
-Translation Status
-------------------
-[![Transifex Status](https://www.transifex.com/projects/p/OCA-edi-9-0/chart/image_png)](https://www.transifex.com/projects/p/OCA-edi-9-0)
+
-----
+
+
+[//]: # (addons)
+
+This part will be replaced when running the oca-gen-addons-table script from OCA/maintainer-tools.
+
+[//]: # (end addons)
+
+
-OCA, or the [Odoo Community Association](http://odoo-community.org/), is a nonprofit organization whose
-mission is to support the collaborative development of Odoo features and
-promote its widespread use.
+## Licenses
+
+This repository is licensed under [AGPL-3.0](LICENSE).
+
+However, each module can have a totally different license, as long as they adhere to Odoo Community Association (OCA)
+policy. Consult each module's `__manifest__.py` file, which contains a `license` key
+that explains its license.
+
+----
+OCA, or the [Odoo Community Association](http://odoo-community.org/), is a nonprofit
+organization whose mission is to support the collaborative development of Odoo features
+and promote its widespread use.
diff --git a/edi_oca/README.rst b/edi_oca/README.rst
new file mode 100644
index 0000000000..9af41f347d
--- /dev/null
+++ b/edi_oca/README.rst
@@ -0,0 +1,193 @@
+===
+EDI
+===
+
+.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! This file is generated by oca-gen-addon-readme !!
+ !! changes will be overwritten. !!
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
+ :target: https://odoo-community.org/page/development-status
+ :alt: Beta
+.. |badge2| image:: https://img.shields.io/badge/licence-LGPL--3-blue.png
+ :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html
+ :alt: License: LGPL-3
+.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fedi-lightgray.png?logo=github
+ :target: https://github.com/OCA/edi/tree/14.0/edi_oca
+ :alt: OCA/edi
+.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
+ :target: https://translation.odoo-community.org/projects/edi-14-0/edi-14-0-edi_oca
+ :alt: Translate me on Weblate
+.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
+ :target: https://runbot.odoo-community.org/runbot/226/14.0
+ :alt: Try me on Runbot
+
+|badge1| |badge2| |badge3| |badge4| |badge5|
+
+Base EDI backend.
+
+Provides following models:
+
+1. EDI Backend, to centralize configuration
+2. EDI Backend Type, to classify EDI backends (eg: UBL, GS1, e-invoice, pick-yours)
+3. EDI Exchange Type, to define file types of exchange
+4. EDI Exchange Record, to define a record exchanged between systems
+
+Also define a mixin to be inherited by records that will generate EDIs
+
+**Table of contents**
+
+.. contents::
+ :local:
+
+Configuration
+=============
+
+This module aims to provide an infrastructure to simplify interchangability of documents
+between systems providing a configuration platform.
+It will be inherited by other modules in order to define the proper implementations of
+components.
+
+In order to define a new Exchange Record, we need to configure:
+
+* Backend Type
+* Exchange Type
+* Backend
+* Components
+
+Component definition
+~~~~~~~~~~~~~~~~~~~~
+
+The component usage must be defined like `edi.{direction}.{kind}.{code}` where:
+
+* direction is `output` or `input`
+* kind can be: `generate`, `send`, `check`, `process`, `receive`
+* code is the `{backend type code}` or `{backend type code}.{exchange type code}`
+
+User EDI generation
+~~~~~~~~~~~~~~~~~~~
+
+On the exchange type, it might be possible to define a set of models, a domain and a
+snippet of code.
+After defining this fields, we will automatically see buttons on the view to generate
+the exchange records.
+This configuration is useful to define a way of generation managed by user.
+
+
+Exchange type rules configuration
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Exchange types can be further configured with rules.
+You can use rules to:
+
+1. make buttons automatically appear in forms
+2. define your own custom logic
+
+Go to an exchange type and go to the tab "Model rules".
+There you can add one or more rule, one per model.
+On each rule you can define a domain or a snippet to activate it.
+In case of a "Form button" kind, if the domain and/ the snippet is/are satisfied,
+a form btn will appear on the top of the form.
+This button can be used by the end user to manually generate an exchange.
+If there's more than a backend and the exchange type has not a backend set,
+a wizard will appear asking to select a backend to be used for the exchange.
+
+In case of "Custom" kind, you'll have to define your own logic to do something.
+
+Usage
+=====
+
+After certain operations or manual execution, Exchange records will be generated.
+This Exchange records might be input records or outputs records.
+
+The change of state can be manually executed by the system or be managed through by
+`ir.cron`.
+
+Output Exchange records
+~~~~~~~~~~~~~~~~~~~~~~~
+
+An output record is intended to be used for exchange information from Odoo to another
+system.
+
+The flow of an output record should be:
+
+* Creation
+* Generation of data
+* Validation of data
+* Sending data
+* Validation of data processed properly by the other party
+
+Input Exchange records
+~~~~~~~~~~~~~~~~~~~~~~
+
+An input record is intended to be used for exchange information another system to odoo.
+
+The flow of an input record should be:
+
+* Creation
+* Reception of data
+* Checking data
+* Processing data
+
+Known issues / Roadmap
+======================
+
+14.0.1.0.0
+~~~~~~~~~~
+
+The module name has been changed from edi to edi_oca.
+
+Bug Tracker
+===========
+
+Bugs are tracked on `GitHub Issues `_.
+In case of trouble, please check there if your issue has already been reported.
+If you spotted it first, help us smashing it by providing a detailed and welcomed
+`feedback `_.
+
+Do not contact contributors directly about support or help with technical issues.
+
+Credits
+=======
+
+Authors
+~~~~~~~
+
+* ACSONE
+* Creu Blanca
+* Camptocamp
+
+Contributors
+~~~~~~~~~~~~
+
+* Simone Orsi
+* Enric Tobella
+
+Maintainers
+~~~~~~~~~~~
+
+This module is maintained by the OCA.
+
+.. image:: https://odoo-community.org/logo.png
+ :alt: Odoo Community Association
+ :target: https://odoo-community.org
+
+OCA, or the Odoo Community Association, is a nonprofit organization whose
+mission is to support the collaborative development of Odoo features and
+promote its widespread use.
+
+.. |maintainer-simahawk| image:: https://github.com/simahawk.png?size=40px
+ :target: https://github.com/simahawk
+ :alt: simahawk
+.. |maintainer-etobella| image:: https://github.com/etobella.png?size=40px
+ :target: https://github.com/etobella
+ :alt: etobella
+
+Current `maintainers `__:
+
+|maintainer-simahawk| |maintainer-etobella|
+
+This module is part of the `OCA/edi `_ project on GitHub.
+
+You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/edi_oca/__init__.py b/edi_oca/__init__.py
new file mode 100644
index 0000000000..79dbb94082
--- /dev/null
+++ b/edi_oca/__init__.py
@@ -0,0 +1,3 @@
+from . import components
+from . import models
+from . import wizards
diff --git a/edi_oca/__manifest__.py b/edi_oca/__manifest__.py
new file mode 100644
index 0000000000..273c03850c
--- /dev/null
+++ b/edi_oca/__manifest__.py
@@ -0,0 +1,46 @@
+# Copyright 2020 ACSONE
+# Copyright 2021 Camptocamp
+# @author: Simone Orsi
+# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
+
+{
+ "name": "EDI",
+ "summary": """
+ Define backends, exchange types, exchange records,
+ basic automation and views for handling EDI exchanges.
+ """,
+ "version": "12.0.1.20.1",
+ "website": "https://github.com/OCA/edi",
+ "development_status": "Beta",
+ "license": "LGPL-3",
+ "author": "ACSONE,Creu Blanca,Camptocamp,Odoo Community Association (OCA)",
+ "maintainers": ["simahawk", "etobella"],
+ "depends": [
+ "base_edi",
+ "component_event",
+ "mail",
+ "base_sparse_field",
+ "queue_job",
+ ],
+ "external_dependencies": {"python": ["yaml"]},
+ "data": [
+ "wizards/edi_exchange_record_create_wiz.xml",
+ "data/cron.xml",
+ "data/sequence.xml",
+ "data/job_channel.xml",
+ "data/job_function.xml",
+ "security/res_groups.xml",
+ "security/ir_model_access.xml",
+ "views/edi_backend_views.xml",
+ "views/edi_backend_type_views.xml",
+ "views/edi_exchange_record_views.xml",
+ "views/edi_exchange_type_views.xml",
+ "views/edi_exchange_type_rule_views.xml",
+ "views/menuitems.xml",
+ "templates/exchange_chatter_msg.xml",
+ "templates/exchange_mixin_buttons.xml",
+ "templates/assets.xml",
+ ],
+ "qweb": ["static/src/xml/widget_edi.xml"],
+ "demo": ["demo/edi_backend_demo.xml"],
+}
diff --git a/edi_oca/components/__init__.py b/edi_oca/components/__init__.py
new file mode 100644
index 0000000000..94e4ac1406
--- /dev/null
+++ b/edi_oca/components/__init__.py
@@ -0,0 +1,4 @@
+from . import base
+from . import base_output
+from . import base_input
+from . import base_validate
diff --git a/edi_oca/components/base.py b/edi_oca/components/base.py
new file mode 100644
index 0000000000..1b4c1e6b06
--- /dev/null
+++ b/edi_oca/components/base.py
@@ -0,0 +1,72 @@
+# Copyright 2020 ACSONE
+# @author: Simone Orsi
+# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
+
+from odoo.addons.component.core import AbstractComponent
+
+
+class EDIBackendComponentMixin(AbstractComponent):
+ """Generic mixin for all EDI components."""
+
+ _name = "edi.component.base.mixin"
+ _collection = "edi.backend"
+ _usage = None
+ _backend_type = None
+ _exchange_type = None
+
+ def __init__(self, work_context):
+ super().__init__(work_context)
+ self.backend = work_context.backend
+
+ @staticmethod
+ def _match_attrs():
+ """Attributes to be used for matching this component.
+
+ By default, match by backend and exchange type.
+
+ NOTE: the class attribute must have an underscore, the name here not.
+ """
+ return ("backend_type", "exchange_type")
+
+ @classmethod
+ def _component_match(cls, work, usage=None, model_name=None, **kw):
+ """Override to customize match.
+
+ Registry lookup filtered by usage and model_name when landing here.
+ Now, narrow match to `_match_attrs` attributes.
+ """
+ match_attrs = cls._match_attrs()
+ if not any([kw.get(k) for k in match_attrs]):
+ # No attr to check
+ return True
+
+ backend_type = kw.get("backend_type")
+ exchange_type = kw.get("exchange_type")
+
+ if cls._backend_type and cls._exchange_type:
+ # They must match both
+ return (
+ cls._backend_type == backend_type
+ and cls._exchange_type == exchange_type
+ )
+
+ if cls._backend_type not in (None, kw.get("backend_type")):
+ return False
+
+ if cls._exchange_type not in (None, kw.get("exchange_type")):
+ return False
+
+ return True
+
+
+class EDIBackendRecordComponentMixin(AbstractComponent):
+ """Generic mixin for record-bound components."""
+
+ _name = "edi.component.mixin"
+ _inherit = "edi.component.base.mixin"
+
+ def __init__(self, work_context):
+ super().__init__(work_context)
+ self.exchange_record = work_context.exchange_record
+ self.record = self.exchange_record.record
+ self.type_settings = self.exchange_record.type_id.get_settings()
diff --git a/edi_oca/components/base_input.py b/edi_oca/components/base_input.py
new file mode 100644
index 0000000000..e5436ae4c0
--- /dev/null
+++ b/edi_oca/components/base_input.py
@@ -0,0 +1,24 @@
+# Copyright 2020 ACSONE
+# @author: Simone Orsi
+# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
+
+from odoo.addons.component.core import AbstractComponent
+
+
+class EDIBackendInputComponentMixin(AbstractComponent):
+ """Generate input content."""
+
+ _name = "edi.component.input.mixin"
+ _inherit = "edi.component.mixin"
+
+ def process(self):
+ raise NotImplementedError()
+
+
+class EDIBackendReceiveComponentMixin(AbstractComponent):
+
+ _name = "edi.component.receive.mixin"
+ _inherit = "edi.component.mixin"
+
+ def receive(self):
+ raise NotImplementedError()
diff --git a/edi_oca/components/base_output.py b/edi_oca/components/base_output.py
new file mode 100644
index 0000000000..30cfe06cc3
--- /dev/null
+++ b/edi_oca/components/base_output.py
@@ -0,0 +1,37 @@
+# Copyright 2020 ACSONE
+# @author: Simone Orsi
+# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
+
+from odoo.addons.component.core import AbstractComponent
+
+
+class EDIBackendOutputComponentMixin(AbstractComponent):
+ """Generate output content."""
+
+ _name = "edi.component.output.mixin"
+ _inherit = "edi.component.mixin"
+ _usage = "edi.output.generate.*"
+
+ def generate(self):
+ raise NotImplementedError()
+
+
+class EDIBackendSendComponentMixin(AbstractComponent):
+ """Send output records."""
+
+ _name = "edi.component.send.mixin"
+ _inherit = "edi.component.mixin"
+ _usage = "edi.output.send.*"
+
+ def send(self):
+ raise NotImplementedError()
+
+
+class EDIBackendCheckComponentMixin(AbstractComponent):
+
+ _name = "edi.component.check.mixin"
+ _inherit = "edi.component.mixin"
+ _usage = "edi.output.check.*"
+
+ def check(self):
+ raise NotImplementedError()
diff --git a/edi_oca/components/base_validate.py b/edi_oca/components/base_validate.py
new file mode 100644
index 0000000000..324f0401ad
--- /dev/null
+++ b/edi_oca/components/base_validate.py
@@ -0,0 +1,20 @@
+# Copyright 2020 ACSONE
+# @author: Simone Orsi
+# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
+
+from odoo.addons.component.core import AbstractComponent
+
+
+class EDIBackendValidateComponentMixin(AbstractComponent):
+ """Validate exchange data."""
+
+ _name = "edi.component.validate.mixin"
+ _inherit = "edi.component.mixin"
+ _usage = "edi.validate.*"
+
+ def validate(self, value=None):
+ self._validate(value)
+
+ def _validate(self, value=None):
+ """Return None validated, raise `edi.exceptions.EDIValidationError` if not."""
+ raise NotImplementedError()
diff --git a/edi_oca/data/cron.xml b/edi_oca/data/cron.xml
new file mode 100644
index 0000000000..e182b10acd
--- /dev/null
+++ b/edi_oca/data/cron.xml
@@ -0,0 +1,36 @@
+
+
+
+ EDI exchange check output sync
+
+
+ 1
+ hours
+ -1
+
+
+ code
+ model.search([])._cron_check_output_exchange_sync()
+
+
+
+ EDI exchange check input sync
+
+
+ 1
+ hours
+ -1
+
+
+ code
+ model.search([])._cron_check_input_exchange_sync()
+
+
diff --git a/edi_oca/data/job_channel.xml b/edi_oca/data/job_channel.xml
new file mode 100644
index 0000000000..7718ea76f1
--- /dev/null
+++ b/edi_oca/data/job_channel.xml
@@ -0,0 +1,10 @@
+
+
+ edi
+
+
+
+ edi_exchange
+
+
+
diff --git a/edi_oca/data/job_function.xml b/edi_oca/data/job_function.xml
new file mode 100644
index 0000000000..335ed11ff2
--- /dev/null
+++ b/edi_oca/data/job_function.xml
@@ -0,0 +1,48 @@
+
+
+
+ action_exchange_generate
+
+
+
+
+ action_exchange_send
+
+
+
+
+ action_exchange_receive
+
+
+
+
+ action_exchange_process
+
+
+
+
+ exchange_create_ack_record
+
+
+
+
+
+ exchange_generate
+
+
+
+
+ exchange_send
+
+
+
+
+ exchange_receive
+
+
+
+
+ exchange_process
+
+
+
diff --git a/edi_oca/data/sequence.xml b/edi_oca/data/sequence.xml
new file mode 100644
index 0000000000..37eb198932
--- /dev/null
+++ b/edi_oca/data/sequence.xml
@@ -0,0 +1,11 @@
+
+
+
+
+ EDI Exchange Record
+ edi.exchange
+ EDI/%(year)s/
+ 10
+
+
+
diff --git a/edi_oca/demo/edi_backend_demo.xml b/edi_oca/demo/edi_backend_demo.xml
new file mode 100644
index 0000000000..4e69bf8111
--- /dev/null
+++ b/edi_oca/demo/edi_backend_demo.xml
@@ -0,0 +1,11 @@
+
+
+
+ Demo EDI backend type
+ demo_backend
+
+
+ Demo EDI backend
+
+
+
diff --git a/edi_oca/exceptions.py b/edi_oca/exceptions.py
new file mode 100644
index 0000000000..b9a39b3ff9
--- /dev/null
+++ b/edi_oca/exceptions.py
@@ -0,0 +1,7 @@
+# Copyright 2020 ACSONE
+# @author: Simone Orsi
+# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
+
+
+class EDIValidationError(Exception):
+ """Thrown when a document validation fails."""
diff --git a/edi_oca/i18n/edi_oca.pot b/edi_oca/i18n/edi_oca.pot
new file mode 100644
index 0000000000..9b787287a1
--- /dev/null
+++ b/edi_oca/i18n/edi_oca.pot
@@ -0,0 +1,1288 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * edi_oca
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 14.0\n"
+"Report-Msgid-Bugs-To: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_type__advanced_settings_edit
+msgid ""
+"\n"
+" Advanced technical settings as YAML format.\n"
+" The YAML structure should reproduce a dictionary.\n"
+" The backend might use these settings for automated operations.\n"
+"\n"
+" Currently supported conf:\n"
+"\n"
+" components:\n"
+" generate:\n"
+" usage: $comp_usage\n"
+" # set a value for component work context\n"
+" work_ctx:\n"
+" opt1: True\n"
+" validate:\n"
+" usage: $comp_usage\n"
+" env_ctx:\n"
+" # set a value for the whole processing env\n"
+" opt2: False\n"
+" check:\n"
+" usage: $comp_usage\n"
+" send:\n"
+" usage: $comp_usage\n"
+" receive:\n"
+" usage: $comp_usage\n"
+" process:\n"
+" usage: $comp_usage\n"
+"\n"
+" filename_pattern:\n"
+" force_tz: Europe/Rome\n"
+" date_pattern: %Y-%m-%d-%H-%M-%S\n"
+"\n"
+" In any case, you can use these settings\n"
+" to provide your own configuration for whatever need you might have.\n"
+" "
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_backend__output_sent_processed_auto
+msgid ""
+"\n"
+" Automatically set the record as processed after sending.\n"
+" Usecase: the web service you send the file to processes it on the fly.\n"
+" "
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_type_rule__kind
+msgid ""
+"\n"
+"* Form button: show a button on the related model form\n"
+" when conditions from domain and snippet are satisfied\n"
+"\n"
+"* Custom: let devs handle a custom behavior with specific developments\n"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_consumer_mixin_buttons
+msgid " EDI actions"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_form
+msgid ""
+"\n"
+" The related record is not available anymore.\n"
+" Consider deleting this record too or fixing its relation.\n"
+" "
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.message_edi_exchange_link
+msgid "EDI exchange:"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.message_edi_exchange_link
+msgid "Message:"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.message_edi_exchange_link
+msgid "State:"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.message_edi_exchange_link
+msgid "Type:"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_form
+msgid "ACK"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__ack_exchange_id
+msgid "ACK exchange"
+msgstr ""
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_exchange_record.py:0
+#, python-format
+msgid "ACK file is required for this exchange but not found."
+msgstr ""
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_exchange_record.py:0
+#, python-format
+msgid "ACK file received but contains errors."
+msgstr ""
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_exchange_record.py:0
+#, python-format
+msgid "ACK file received."
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_record__ack_exchange_id
+msgid "ACK generated for current exchange."
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__ack_received_on
+msgid "ACK received on"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model,name:edi_oca.model_edi_exchange_consumer_mixin
+msgid "Abstract record where exchange records can be assigned"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__ack_expected
+msgid "Ack Expected"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__ack_type_id
+msgid "Ack exchange type"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__ack_for_type_ids
+msgid "Ack for exchange type"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__message_needaction
+msgid "Action Needed"
+msgstr ""
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_exchange_record.py:0
+#, python-format
+msgid "Action retry: state moved back to '%s'"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend__active
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__active
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type_rule__active
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_backend_view_search
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_rule_view_search
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_view_search
+msgid "Active"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__advanced_settings
+msgid "Advanced Settings"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__advanced_settings_edit
+msgid "Advanced YAML settings"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_view_form
+msgid "Advanced settings"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.ui.menu,name:edi_oca.menu_edi_exchange_record_all
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_backend_view_search
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_rule_view_search
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_view_search
+msgid "All"
+msgstr ""
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_exchange_record.py:0
+#, python-format
+msgid "An error happened while sending. Please check exchange record info."
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_type_rule__model_id
+msgid "Apply to this model"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_backend_view_form
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_backend_view_search
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_rule_view_form
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_rule_view_search
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_view_form
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_view_search
+msgid "Archived"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__message_attachment_count
+msgid "Attachment Count"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_type__exchange_file_auto_generate
+msgid ""
+"Auto generate output for records missing their payload. If active, a cron "
+"will take care of generating the output when not set yet. "
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__backend_id
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record_create_wiz__backend_id
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__backend_id
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_view_search
+msgid "Backend"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_backend_view_search
+msgid "Backend Type"
+msgstr ""
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_exchange_record.py:0
+#, python-format
+msgid "Backend must match with exchange type's backend!"
+msgstr ""
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_exchange_type.py:0
+#, python-format
+msgid "Backend should respect backend type!"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record_create_wiz__backend_type_id
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__backend_type_id
+msgid "Backend type"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.constraint,message:edi_oca.constraint_edi_backend_type_uniq_code
+msgid "Backend type code must be unique!"
+msgstr ""
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_exchange_record.py:0
+#, python-format
+msgid "Backend type must match with exchange type's backend type!"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.ui.menu,name:edi_oca.menu_edi_backend_type
+msgid "Backend types"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.ui.menu,name:edi_oca.menu_edi_backend
+msgid "Backends"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_create_form_view
+msgid "Cancel"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend_type__code
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__code
+msgid "Code"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.ui.menu,name:edi_oca.menu_edi_config
+msgid "Config"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model,name:edi_oca.model_edi_exchange_record_create_wiz
+msgid "Create an Exchange Record"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+msgid "Create date"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend__create_uid
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend_type__create_uid
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__create_uid
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record_create_wiz__create_uid
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__create_uid
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type_rule__create_uid
+msgid "Created by"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+msgid "Created last 7 days"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend__create_date
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend_type__create_date
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__create_date
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record_create_wiz__create_date
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__create_date
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type_rule__create_date
+msgid "Created on"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+msgid "Created today"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields.selection,name:edi_oca.selection__edi_exchange_type_rule__kind__custom
+msgid "Custom"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_view_form
+msgid "DEPRECATED Model rules"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__deprecated_rule_fields_still_used
+msgid "Deprecated Rule Fields Still Used"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__direction
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__direction
+msgid "Direction"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_consumer_mixin__disable_edi_auto
+msgid "Disable auto"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend__display_name
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend_type__display_name
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_consumer_mixin__display_name
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__display_name
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record_create_wiz__display_name
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__display_name
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type_rule__display_name
+#: model:ir.model.fields,field_description:edi_oca.field_edi_id_mixin__display_name
+msgid "Display Name"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_rule_view_form
+msgid "Domain"
+msgstr ""
+
+#. module: edi_oca
+#: model:res.groups,name:edi_oca.group_edi_advanced_settings_manager
+msgid "EDI Advanced Settings Manager"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.actions.act_window,name:edi_oca.act_open_edi_backend_view
+#: model:ir.model,name:edi_oca.model_edi_backend
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_backend_view_form
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_backend_view_search
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_backend_view_tree
+msgid "EDI Backend"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.actions.act_window,name:edi_oca.act_open_edi_backend_type_view
+#: model:ir.model,name:edi_oca.model_edi_backend_type
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_backend_type_view_form
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_backend_type_view_search
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_backend_type_view_tree
+msgid "EDI Backend Type"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend__backend_type_id
+msgid "EDI Backend type"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_form
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_tree
+msgid "EDI Exchange Record"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.actions.act_window,name:edi_oca.act_open_edi_exchange_type_view
+#: model:ir.model,name:edi_oca.model_edi_exchange_type
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_view_form
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_view_search
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_view_tree
+msgid "EDI Exchange Type"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.actions.act_window,name:edi_oca.act_open_edi_exchange_type_rule_view
+msgid "EDI Exchange Type Rule"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model,name:edi_oca.model_edi_exchange_type_rule
+msgid "EDI Exchange type rule"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model,name:edi_oca.model_edi_id_mixin
+msgid "EDI ID mixin"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model,name:edi_oca.model_edi_exchange_record
+msgid "EDI exchange Record"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.actions.server,name:edi_oca.cron_edi_backend_check_input_exchange_ir_actions_server
+#: model:ir.cron,cron_name:edi_oca.cron_edi_backend_check_input_exchange
+#: model:ir.cron,name:edi_oca.cron_edi_backend_check_input_exchange
+msgid "EDI exchange check input sync"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.actions.server,name:edi_oca.cron_edi_backend_check_output_exchange_ir_actions_server
+#: model:ir.cron,cron_name:edi_oca.cron_edi_backend_check_output_exchange
+#: model:ir.cron,name:edi_oca.cron_edi_backend_check_output_exchange
+msgid "EDI exchange check output sync"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_consumer_mixin__origin_exchange_type_id
+msgid "EDI origin exchange type"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_consumer_mixin__origin_exchange_record_id
+msgid "EDI origin record"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_consumer_mixin__origin_exchange_record_id
+msgid "EDI record that originated this document."
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_id_mixin__edi_id
+msgid "Edi"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_consumer_mixin__edi_config
+msgid "Edi Config"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_consumer_mixin__edi_has_form_config
+msgid "Edi Has Form Config"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__enable_domain
+msgid "Enable Domain"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__enable_snippet
+msgid "Enable Snippet"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type_rule__enable_domain
+msgid "Enable on domain"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type_rule__enable_snippet
+msgid "Enable on snippet"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__partner_ids
+msgid "Enabled for partners"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_form
+msgid "Error"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields.selection,name:edi_oca.selection__edi_exchange_record__edi_exchange_state__input_processed_error
+msgid "Error on process"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields.selection,name:edi_oca.selection__edi_exchange_record__edi_exchange_state__input_receive_error
+msgid "Error on reception"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields.selection,name:edi_oca.selection__edi_exchange_record__edi_exchange_state__validate_error
+msgid "Error on validation"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__exchange_file
+msgid "Exchange File"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__exchange_file_auto_generate
+msgid "Exchange File Auto Generate"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__exchange_file_ext
+msgid "Exchange File Ext"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__exchange_filename
+msgid "Exchange Filename"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__exchange_filename_pattern
+msgid "Exchange Filename Pattern"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_consumer_mixin__exchange_record_ids
+msgid "Exchange Record"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_consumer_mixin__exchange_record_count
+msgid "Exchange Record Count"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record_create_wiz__exchange_type_id
+msgid "Exchange Type"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+msgid "Exchange date"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__exchange_error
+msgid "Exchange error"
+msgstr ""
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_exchange_record.py:0
+#, python-format
+msgid "Exchange not received"
+msgstr ""
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_exchange_record.py:0
+#, python-format
+msgid "Exchange not valid"
+msgstr ""
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_exchange_record.py:0
+#, python-format
+msgid "Exchange processed successfully "
+msgstr ""
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_exchange_record.py:0
+#, python-format
+msgid "Exchange processed with errors"
+msgstr ""
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_exchange_record.py:0
+#, python-format
+msgid "Exchange received successfully "
+msgstr ""
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_backend.py:0
+#, python-format
+msgid "Exchange record ID=%d already has a file to process!"
+msgstr ""
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_backend.py:0
+#, python-format
+msgid "Exchange record ID=%d is not an outgoing record, cannot be generated"
+msgstr ""
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_backend.py:0
+#, python-format
+msgid ""
+"Exchange record ID=%d is not in draft state and has already an output value."
+msgstr ""
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_exchange_record.py:0
+#, python-format
+msgid "Exchange sent"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__edi_exchange_state
+msgid "Exchange state"
+msgstr ""
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_exchange_record.py:0
+#, python-format
+msgid "Exchange state must respect direction!"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__type_id
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_rule_view_search
+msgid "Exchange type"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.ui.menu,name:edi_oca.menu_edi_exchange_type_rule
+msgid "Exchange type rules"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.ui.menu,name:edi_oca.menu_edi_exchange_type
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_backend_view_form
+msgid "Exchange types"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+msgid "Exchanged last 7 days"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__exchanged_on
+msgid "Exchanged on"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+msgid "Exchanged today"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.actions.act_window,name:edi_oca.act_open_edi_exchange_record_view
+#: model:ir.ui.menu,name:edi_oca.menu_edi_exchange_record_root
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_backend_view_form
+msgid "Exchanges"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.actions.act_window,name:edi_oca.act_open_edi_exchange_record_view_failed
+msgid "Exchanges - failed"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.actions.act_window,name:edi_oca.act_open_edi_exchange_record_view_inbound
+msgid "Exchanges - inbound"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.actions.act_window,name:edi_oca.act_open_edi_exchange_record_view_outbound
+msgid "Exchanges - outbound"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.actions.act_window,name:edi_oca.act_open_edi_exchange_record_view_pending
+msgid "Exchanges - pending"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__external_identifier
+msgid "External Identifier"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.ui.menu,name:edi_oca.menu_edi_exchange_record_pending
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+msgid "Failed"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_type_rule__enable_domain
+msgid "Filter domain to be checked on Models"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__message_follower_ids
+msgid "Followers"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__message_channel_ids
+msgid "Followers (Channels)"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__message_partner_ids
+msgid "Followers (Partners)"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_type__exchange_filename_pattern
+msgid ""
+"For output exchange types this should be a formatting string with the following variables available (to be used between brackets, `{}`): `exchange_record`, `record_name`, `type` and `dt`. For instance, a valid string would be {record_name}-{type.code}-{dt}\n"
+"For input exchange types related to storage backends it should be a regex expression to filter the files to be fetched from the pending directory in the related storage. E.g: `.*my-type-[0-9]*.\\.csv`"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_rule_view_form
+msgid "Form"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields.selection,name:edi_oca.selection__edi_exchange_type_rule__kind__form_btn
+msgid "Form button"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type_rule__form_btn_label
+msgid "Form button label"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type_rule__form_btn_tooltip
+msgid "Form button tooltip"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_create_form_view
+msgid "Generate"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.actions.act_window,name:edi_oca.edi_exchange_record_create_act_window
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_create_form_view
+msgid "Generate Exchange Record"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_rule_view_search
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_view_search
+msgid "Group By"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_type_rule__form_btn_tooltip
+msgid "Help message visible as tooltip on button h-over"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend__id
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend_type__id
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_consumer_mixin__id
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__id
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record_create_wiz__id
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__id
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type_rule__id
+#: model:ir.model.fields,field_description:edi_oca.field_edi_id_mixin__id
+msgid "ID"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__identifier
+msgid "Identifier"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_type__ack_type_id
+msgid ""
+"Identify the type of the ack. If this field is valued it means an hack is "
+"expected."
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_record__message_needaction
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_record__message_unread
+msgid "If checked, new messages require your attention."
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_record__message_has_error
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_record__message_has_sms_error
+msgid "If checked, some messages have a delivery error."
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.ui.menu,name:edi_oca.menu_edi_exchange_record_inbound
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_view_search
+msgid "Inbound"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields.selection,name:edi_oca.selection__edi_exchange_type__direction__input
+msgid "Input"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_id_mixin__edi_id
+msgid "Internal or external identifier for records."
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__message_is_follower
+msgid "Is Follower"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__job_channel_id
+msgid "Job Channel"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type_rule__kind
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_rule_view_search
+msgid "Kind"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend____last_update
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend_type____last_update
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_consumer_mixin____last_update
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record____last_update
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record_create_wiz____last_update
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type____last_update
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type_rule____last_update
+#: model:ir.model.fields,field_description:edi_oca.field_edi_id_mixin____last_update
+msgid "Last Modified on"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend__write_uid
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend_type__write_uid
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__write_uid
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record_create_wiz__write_uid
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__write_uid
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type_rule__write_uid
+msgid "Last Updated by"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend__write_date
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend_type__write_date
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__write_date
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record_create_wiz__write_date
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__write_date
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type_rule__write_date
+msgid "Last Updated on"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__message_main_attachment_id
+msgid "Main Attachment"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__message_has_error
+msgid "Message Delivery error"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__message_ids
+msgid "Messages"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__model
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record_create_wiz__model
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__model_ids
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type_rule__model
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type_rule__model_id
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_rule_view_search
+msgid "Model"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__model_manual_btn
+msgid "Model Manual Btn"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_view_form
+msgid "Model rules"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend__name
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend_type__name
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__name
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type_rule__name
+msgid "Name"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields.selection,name:edi_oca.selection__edi_exchange_record__edi_exchange_state__new
+msgid "New"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__message_needaction_counter
+msgid "Number of Actions"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__message_has_error_counter
+msgid "Number of errors"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_record__message_needaction_counter
+msgid "Number of messages which requires an action"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_record__message_has_error_counter
+msgid "Number of messages with delivery error"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_record__message_unread_counter
+msgid "Number of unread messages"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_record__parent_id
+msgid "Original exchange which originated this record"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.ui.menu,name:edi_oca.menu_edi_exchange_record_outbound
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_view_search
+msgid "Outbound"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields.selection,name:edi_oca.selection__edi_exchange_type__direction__output
+msgid "Output"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend__output_sent_processed_auto
+msgid "Output Sent Processed Auto"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__parent_id
+msgid "Parent"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+msgid "Parent exchange"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.ui.menu,name:edi_oca.menu_edi_exchange_record_failed
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+msgid "Pending"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields.selection,name:edi_oca.selection__edi_exchange_record__edi_exchange_state__input_processed
+msgid "Processed"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__quick_exec
+msgid "Quick execution"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields.selection,name:edi_oca.selection__edi_exchange_record__edi_exchange_state__input_received
+msgid "Received"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.ui.menu,name:edi_oca.menu_edi_exchange_record_recent
+msgid "Recent"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.actions.act_window,name:edi_oca.act_open_edi_exchange_record_recent_view
+msgid "Recent exchanges"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__res_id
+msgid "Record"
+msgstr ""
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_backend.py:0
+#, python-format
+msgid "Record ID=%d has no file to process!"
+msgstr ""
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_backend.py:0
+#, python-format
+msgid "Record ID=%d has no file to send!"
+msgstr ""
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_backend.py:0
+#: code:addons/edi_oca/models/edi_backend.py:0
+#, python-format
+msgid "Record ID=%d is not meant to be processed"
+msgstr ""
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_backend.py:0
+#, python-format
+msgid "Record ID=%d is not meant to be sent!"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__related_name
+msgid "Related Name"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__related_record_exists
+msgid "Related Record Exists"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_form
+msgid "Related exchanges"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_form
+msgid "Related record"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__related_exchange_ids
+msgid "Related records"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record_create_wiz__res_id
+msgid "Res"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_form
+msgid "Retry"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__retryable
+msgid "Retryable"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__rule_ids
+msgid "Rule"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_type__rule_ids
+msgid "Rules to handle exchanges and UI automatically"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__message_has_sms_error
+msgid "SMS Delivery error"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields.selection,name:edi_oca.selection__edi_exchange_record__edi_exchange_state__output_sent
+msgid "Sent"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields.selection,name:edi_oca.selection__edi_exchange_record__edi_exchange_state__output_sent_and_error
+msgid "Sent and error"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields.selection,name:edi_oca.selection__edi_exchange_record__edi_exchange_state__output_sent_and_processed
+msgid "Sent and processed"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_record__ack_received_on
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_record__exchanged_on
+msgid "Sent or received on this date."
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+msgid "Show all records created in the last 7 days"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+msgid "Show all records created today"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_rule_view_form
+msgid "Snippet"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_type_rule__enable_snippet
+msgid ""
+"Snippet of code to be checked on Models,\n"
+" You can use `record` and `exchange_type` here.\n"
+" It will be executed if variable result has been defined as True\n"
+" "
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+msgid "State"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_form
+msgid "Status"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+msgid "Successful"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.constraint,message:edi_oca.constraint_edi_exchange_type_code_uniq
+msgid "The code must be unique per backend"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.constraint,message:edi_oca.constraint_edi_exchange_record_external_identifier_uniq
+msgid "The external_identifier must be unique for a type and a backend."
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.constraint,message:edi_oca.constraint_edi_exchange_record_identifier_uniq
+msgid "The identifier must be unique."
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_record__retryable
+msgid "The record state can be rolled back manually in case of failure."
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type_rule__type_id
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+msgid "Type"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_type_rule__form_btn_label
+msgid "Type name used by default"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__message_unread
+msgid "Unread Messages"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__message_unread_counter
+msgid "Unread Messages Counter"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields.selection,name:edi_oca.selection__edi_exchange_record__edi_exchange_state__input_pending
+msgid "Waiting to be received"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields.selection,name:edi_oca.selection__edi_exchange_record__edi_exchange_state__output_pending
+msgid "Waiting to be sent"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_view_form
+msgid ""
+"Warning: these fields are deprecated.\n"
+" If you rely on them for configuring rules via data files,\n"
+" it's strongly recommended to rework such files\n"
+" to use `edi.exchange.type.rule` records.\n"
+" Please note that, due to backward compat,\n"
+" removing a model from here will cause deletion\n"
+" of any existing rule for the model.\n"
+" You can use the button \"Wipe\" to clean them properly."
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__website_message_ids
+msgid "Website Messages"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_record__website_message_ids
+msgid "Website communication history"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_type__quick_exec
+msgid ""
+"When active, records of this type will be processed immediately without "
+"waiting for the cron to pass by."
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_consumer_mixin__disable_edi_auto
+msgid "When marked, EDI automatic processing will be avoided"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_view_form
+msgid "Wipe"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_type__partner_ids
+msgid ""
+"You can use this field to limit generating/processing exchanges for specific"
+" partners. Use it directly or within models rules (domain or snippet)."
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields.selection,name:edi_oca.selection__edi_exchange_record__edi_exchange_state__output_error_on_send
+msgid "error on send"
+msgstr ""
diff --git a/edi_oca/i18n/fr.po b/edi_oca/i18n/fr.po
new file mode 100644
index 0000000000..5ec7d1655a
--- /dev/null
+++ b/edi_oca/i18n/fr.po
@@ -0,0 +1,1187 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * edi_oca
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 14.0\n"
+"Report-Msgid-Bugs-To: \n"
+"PO-Revision-Date: 2021-06-17 15:48+0000\n"
+"Last-Translator: Yves Le Doeuff \n"
+"Language-Team: none\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+"X-Generator: Weblate 4.3.2\n"
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_type__advanced_settings_edit
+msgid ""
+"\n"
+" Advanced technical settings as YAML format.\n"
+" The YAML structure should reproduce a dictionary.\n"
+" The backend might use these settings for automated operations.\n"
+"\n"
+" Currently supported conf:\n"
+"\n"
+" components:\n"
+" generate:\n"
+" usage: $comp_usage\n"
+" # set a value for component work context\n"
+" work_ctx:\n"
+" opt1: True\n"
+" validate:\n"
+" usage: $comp_usage\n"
+" env_ctx:\n"
+" # set a value for the whole processing env\n"
+" opt2: False\n"
+" check:\n"
+" usage: $comp_usage\n"
+" send:\n"
+" usage: $comp_usage\n"
+" receive:\n"
+" usage: $comp_usage\n"
+" process:\n"
+" usage: $comp_usage\n"
+"\n"
+" filename_pattern:\n"
+" force_tz: Europe/Rome\n"
+" date_pattern: %Y-%m-%d-%H-%M-%S\n"
+"\n"
+" In any case, you can use these settings\n"
+" to provide your own configuration for whatever need you might "
+"have.\n"
+" "
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_backend__output_sent_processed_auto
+msgid ""
+"\n"
+" Automatically set the record as processed after sending.\n"
+" Usecase: the web service you send the file to processes it on the fly.\n"
+" "
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_consumer_mixin_buttons
+msgid "This record has EDI exchanges to handle"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_form
+msgid ""
+"\n"
+" The related record is not available anymore.\n"
+" Consider deleting this record too or fixing its "
+"relation.\n"
+" "
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.message_edi_exchange_link
+msgid "EDI exchange:"
+msgstr "Échange EDI:"
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.message_edi_exchange_link
+msgid "Message:"
+msgstr "Message:"
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.message_edi_exchange_link
+msgid "State:"
+msgstr "État:"
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.message_edi_exchange_link
+msgid "Type:"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_form
+msgid "ACK"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__ack_exchange_id
+msgid "ACK exchange"
+msgstr ""
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_exchange_record.py:0
+#, python-format
+msgid "ACK file is required for this exchange but not found."
+msgstr ""
+"Le fichier ACK est nécessaire pour cet échange mais n'a pas été trouvé."
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_exchange_record.py:0
+#, python-format
+msgid "ACK file received but contains errors."
+msgstr "Fichier ACK reçu mais contenant des erreurs."
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_exchange_record.py:0
+#, python-format
+msgid "ACK file received."
+msgstr "Fichier ACK reçu."
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_record__ack_exchange_id
+msgid "ACK generated for current exchange."
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__ack_received_on
+msgid "ACK received on"
+msgstr "ACK bien reçu"
+
+#. module: edi_oca
+#: model:ir.model,name:edi_oca.model_edi_exchange_consumer_mixin
+msgid "Abstract record where exchange records can be assigned"
+msgstr ""
+"Enregistrement abstrait où les enregistrements d'échange peuvent être "
+"assignés"
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__ack_expected
+msgid "Ack Expected"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__ack_type_id
+msgid "Ack exchange type"
+msgstr "Type d'échange Ack"
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__ack_for_type_ids
+msgid "Ack for exchange type"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__message_needaction
+msgid "Action Needed"
+msgstr "Action nécessaire"
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_exchange_record.py:0
+#, python-format
+msgid "Action retry: state moved back to '%s'"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend__active
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__active
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_backend_view_search
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_view_search
+msgid "Active"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__advanced_settings
+msgid "Advanced Settings"
+msgstr "Paramètres avancés"
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__advanced_settings_edit
+msgid "Advanced YAML settings"
+msgstr "Paramètres YAML avancés"
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_view_form
+msgid "Advanced settings"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.ui.menu,name:edi_oca.menu_edi_exchange_record_all
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_backend_view_search
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_view_search
+msgid "All"
+msgstr ""
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_exchange_record.py:0
+#, python-format
+msgid "An error happened while sending. Please check exchange record info."
+msgstr ""
+"Une erreur s'est produite lors de l'envoi. Veuillez vérifier les "
+"informations sur l'enregistrement de l'échange."
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_backend_view_form
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_backend_view_search
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_view_form
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_view_search
+msgid "Archived"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__message_attachment_count
+msgid "Attachment Count"
+msgstr "Nombre de pièces jointes"
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_type__exchange_file_auto_generate
+msgid ""
+"Auto generate output for records missing their payload. If active, a cron "
+"will take care of generating the output when not set yet. "
+msgstr ""
+"Génère automatiquement la sortie pour les enregistrements dont la charge "
+"utile est manquante. Si cette option est active, un cron se chargera de "
+"générer la sortie lorsqu'elle n'est pas encore définie. "
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_type__model_manual_btn
+msgid "Automatically display a button on related models' form."
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__backend_id
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record_create_wiz__backend_id
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__backend_id
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_view_search
+msgid "Backend"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_backend_view_search
+msgid "Backend Type"
+msgstr ""
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_exchange_record.py:0
+#, python-format
+msgid "Backend must match with exchange type's backend!"
+msgstr ""
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_exchange_type.py:0
+#, python-format
+msgid "Backend should respect backend type!"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record_create_wiz__backend_type_id
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__backend_type_id
+msgid "Backend type"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.constraint,message:edi_oca.constraint_edi_backend_type_uniq_code
+msgid "Backend type code must be unique!"
+msgstr ""
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_exchange_record.py:0
+#, python-format
+msgid "Backend type must match with exchange type's backend type!"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.ui.menu,name:edi_oca.menu_edi_backend
+msgid "Backends"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_create_form_view
+msgid "Cancel"
+msgstr "Annuler"
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend_type__code
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__code
+msgid "Code"
+msgstr "Code"
+
+#. module: edi_oca
+#: model:ir.ui.menu,name:edi_oca.menu_edi_config
+msgid "Config"
+msgstr "Paramètres de configuration"
+
+#. module: edi_oca
+#: model:ir.model,name:edi_oca.model_edi_exchange_record_create_wiz
+msgid "Create an Exchange Record"
+msgstr "Créer un enregistrement d'échange"
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+msgid "Create date"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend__create_uid
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend_type__create_uid
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__create_uid
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record_create_wiz__create_uid
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__create_uid
+msgid "Created by"
+msgstr "Créé par"
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+msgid "Created last 7 days"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend__create_date
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend_type__create_date
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__create_date
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record_create_wiz__create_date
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__create_date
+msgid "Created on"
+msgstr "Créé le"
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+msgid "Created today"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__direction
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__direction
+msgid "Direction"
+msgstr "Direction"
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_consumer_mixin__disable_edi_auto
+msgid "Disable auto"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend__display_name
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend_type__display_name
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_consumer_mixin__display_name
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__display_name
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record_create_wiz__display_name
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__display_name
+#: model:ir.model.fields,field_description:edi_oca.field_edi_id_mixin__display_name
+msgid "Display Name"
+msgstr "Afficher Nom"
+
+#. module: edi_oca
+#: model:res.groups,name:edi_oca.group_edi_advanced_settings_manager
+msgid "EDI Advanced Settings Manager"
+msgstr "Gestionnaire des paramètres avancés EDI"
+
+#. module: edi_oca
+#: model:ir.actions.act_window,name:edi_oca.act_open_edi_backend_view
+#: model:ir.model,name:edi_oca.model_edi_backend
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_backend_view_form
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_backend_view_search
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_backend_view_tree
+msgid "EDI Backend"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.actions.act_window,name:edi_oca.act_open_edi_backend_type_view
+#: model:ir.model,name:edi_oca.model_edi_backend_type
+#: model:ir.ui.menu,name:edi_oca.menu_edi_backend_type
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_backend_type_view_form
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_backend_type_view_search
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_backend_type_view_tree
+msgid "EDI Backend Type"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend__backend_type_id
+msgid "EDI Backend type"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_form
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_tree
+msgid "EDI Exchange Record"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.actions.act_window,name:edi_oca.act_open_edi_exchange_type_view
+#: model:ir.model,name:edi_oca.model_edi_exchange_type
+#: model:ir.ui.menu,name:edi_oca.menu_edi_exchange_type
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_view_form
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_view_search
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_view_tree
+msgid "EDI Exchange Type"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model,name:edi_oca.model_edi_id_mixin
+msgid "EDI ID mixin"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model,name:edi_oca.model_edi_exchange_record
+msgid "EDI exchange Record"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.actions.server,name:edi_oca.cron_edi_backend_check_input_exchange_ir_actions_server
+#: model:ir.cron,cron_name:edi_oca.cron_edi_backend_check_input_exchange
+#: model:ir.cron,name:edi_oca.cron_edi_backend_check_input_exchange
+msgid "EDI exchange check input sync"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.actions.server,name:edi_oca.cron_edi_backend_check_output_exchange_ir_actions_server
+#: model:ir.cron,cron_name:edi_oca.cron_edi_backend_check_output_exchange
+#: model:ir.cron,name:edi_oca.cron_edi_backend_check_output_exchange
+msgid "EDI exchange check output sync"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_consumer_mixin__origin_exchange_type_id
+msgid "EDI origin exchange type"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_consumer_mixin__origin_exchange_record_id
+msgid "EDI origin record"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_consumer_mixin__origin_exchange_record_id
+msgid "EDI record that originated this document."
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_id_mixin__edi_id
+msgid "Edi"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_consumer_mixin__edi_config
+msgid "Edi Config"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_consumer_mixin__edi_has_form_config
+msgid "Edi Has Form Config"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__enable_domain
+msgid "Enable on domain"
+msgstr "Activation sur le domaine"
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__enable_snippet
+msgid "Enable on snippet"
+msgstr "Activation sur l'extrait"
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__partner_ids
+msgid "Enabled for partners"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_form
+msgid "Error"
+msgstr "Erreur"
+
+#. module: edi_oca
+#: model:ir.model.fields.selection,name:edi_oca.selection__edi_exchange_record__edi_exchange_state__input_processed_error
+msgid "Error on process"
+msgstr "Erreur de traitement"
+
+#. module: edi_oca
+#: model:ir.model.fields.selection,name:edi_oca.selection__edi_exchange_record__edi_exchange_state__input_receive_error
+msgid "Error on reception"
+msgstr "Erreur de réception"
+
+#. module: edi_oca
+#: model:ir.model.fields.selection,name:edi_oca.selection__edi_exchange_record__edi_exchange_state__validate_error
+msgid "Error on validation"
+msgstr "Erreur lors de la validation"
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__exchange_file
+msgid "Exchange File"
+msgstr "Fichier Exchange"
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__exchange_file_auto_generate
+msgid "Exchange File Auto Generate"
+msgstr "Génération automatique de fichiers Exchange"
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__exchange_file_ext
+msgid "Exchange File Ext"
+msgstr "Extension de fichier Exchange"
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__exchange_filename
+msgid "Exchange Filename"
+msgstr "Nom du fichier Exchange"
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__exchange_filename_pattern
+msgid "Exchange Filename Pattern"
+msgstr "Modèle de nom de fichier Exchange"
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_consumer_mixin__exchange_record_ids
+msgid "Exchange Record"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_consumer_mixin__exchange_record_count
+msgid "Exchange Record Count"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record_create_wiz__exchange_type_id
+msgid "Exchange Type"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+msgid "Exchange date"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__exchange_error
+msgid "Exchange error"
+msgstr ""
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_exchange_record.py:0
+#, python-format
+msgid "Exchange not received"
+msgstr "Échange non reçu"
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_exchange_record.py:0
+#, python-format
+msgid "Exchange not valid"
+msgstr "Échange non valide"
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_exchange_record.py:0
+#, python-format
+msgid "Exchange processed successfully "
+msgstr ""
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_exchange_record.py:0
+#, python-format
+msgid "Exchange processed with errors"
+msgstr "Échange traité avec des erreurs"
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_exchange_record.py:0
+#, python-format
+msgid "Exchange received successfully "
+msgstr "Échange traité avec succès "
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_backend.py:0
+#, python-format
+msgid "Exchange record ID=%d already has a file to process!"
+msgstr ""
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_backend.py:0
+#, python-format
+msgid "Exchange record ID=%d is not an outgoing record, cannot be generated"
+msgstr ""
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_backend.py:0
+#, python-format
+msgid ""
+"Exchange record ID=%d is not in draft state and has already an output value."
+msgstr ""
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_exchange_record.py:0
+#, python-format
+msgid "Exchange sent"
+msgstr "Échange envoyé"
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__edi_exchange_state
+msgid "Exchange state"
+msgstr ""
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_exchange_record.py:0
+#, python-format
+msgid "Exchange state must respect direction!"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__type_id
+msgid "Exchange type"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_backend_view_form
+msgid "Exchange types"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+msgid "Exchanged last 7 days"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__exchanged_on
+msgid "Exchanged on"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+msgid "Exchanged today"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.actions.act_window,name:edi_oca.act_open_edi_exchange_record_view
+#: model:ir.ui.menu,name:edi_oca.menu_edi_exchange_record_root
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_backend_view_form
+msgid "Exchanges"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.actions.act_window,name:edi_oca.act_open_edi_exchange_record_view_failed
+msgid "Exchanges - failed"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.actions.act_window,name:edi_oca.act_open_edi_exchange_record_view_inbound
+msgid "Exchanges - inbound"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.actions.act_window,name:edi_oca.act_open_edi_exchange_record_view_outbound
+msgid "Exchanges - outbound"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.actions.act_window,name:edi_oca.act_open_edi_exchange_record_view_pending
+msgid "Exchanges - pending"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__external_identifier
+msgid "External Identifier"
+msgstr "Lien externe"
+
+#. module: edi_oca
+#: model:ir.ui.menu,name:edi_oca.menu_edi_exchange_record_pending
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+msgid "Failed"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_type__enable_domain
+msgid "Filter domain to be checked on Models"
+msgstr "Domaine de filtrage à vérifier sur les modèles"
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__message_follower_ids
+msgid "Followers"
+msgstr "Abonnés"
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__message_channel_ids
+msgid "Followers (Channels)"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__message_partner_ids
+msgid "Followers (Partners)"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_type__exchange_filename_pattern
+msgid ""
+"For output exchange types this should be a formatting string with the "
+"following variables available (to be used between brackets, `{}`): "
+"`exchange_record`, `record_name`, `type` and `dt`. For instance, a valid "
+"string would be {record_name}-{type.code}-{dt}\n"
+"For input exchange types related to storage backends it should be a regex "
+"expression to filter the files to be fetched from the pending directory in "
+"the related storage. E.g: `.*my-type-[0-9]*.\\.csv`"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_create_form_view
+msgid "Generate"
+msgstr "Générer"
+
+#. module: edi_oca
+#: model:ir.actions.act_window,name:edi_oca.edi_exchange_record_create_act_window
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_create_form_view
+msgid "Generate Exchange Record"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_view_search
+msgid "Group By"
+msgstr "Grouper par"
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend__id
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend_type__id
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_consumer_mixin__id
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__id
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record_create_wiz__id
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__id
+#: model:ir.model.fields,field_description:edi_oca.field_edi_id_mixin__id
+msgid "ID"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__identifier
+msgid "Identifier"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_type__ack_type_id
+msgid ""
+"Identify the type of the ack. If this field is valued it means an hack is "
+"expected."
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_record__message_needaction
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_record__message_unread
+msgid "If checked, new messages require your attention."
+msgstr ""
+"Si cette case est cochée, de nouveaux messages requièrent votre attention."
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_record__message_has_error
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_record__message_has_sms_error
+msgid "If checked, some messages have a delivery error."
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.ui.menu,name:edi_oca.menu_edi_exchange_record_inbound
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_view_search
+msgid "Inbound"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields.selection,name:edi_oca.selection__edi_exchange_type__direction__input
+msgid "Input"
+msgstr "Entrée"
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_id_mixin__edi_id
+msgid "Internal or external identifier for records."
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__message_is_follower
+msgid "Is Follower"
+msgstr "est un abonné"
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__job_channel_id
+msgid "Job Channel"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend____last_update
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend_type____last_update
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_consumer_mixin____last_update
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record____last_update
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record_create_wiz____last_update
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type____last_update
+#: model:ir.model.fields,field_description:edi_oca.field_edi_id_mixin____last_update
+msgid "Last Modified on"
+msgstr "Dernière modification le"
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend__write_uid
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend_type__write_uid
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__write_uid
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record_create_wiz__write_uid
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__write_uid
+msgid "Last Updated by"
+msgstr "Dernière mise à jour par"
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend__write_date
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend_type__write_date
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__write_date
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record_create_wiz__write_date
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__write_date
+msgid "Last Updated on"
+msgstr "Dernière mise à jour le"
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__message_main_attachment_id
+msgid "Main Attachment"
+msgstr "Pièce jointe principale"
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__model_manual_btn
+msgid "Manual button on form"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__message_has_error
+msgid "Message Delivery error"
+msgstr "Erreur de livraison du message"
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__message_ids
+msgid "Messages"
+msgstr "Messages"
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__model
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record_create_wiz__model
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__model_ids
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+msgid "Model"
+msgstr "Modèle"
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_view_form
+msgid "Model rules"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_type__model_ids
+msgid "Modules to be checked for manual EDI generation"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend__name
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend_type__name
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__name
+msgid "Name"
+msgstr "Nom"
+
+#. module: edi_oca
+#: model:ir.model.fields.selection,name:edi_oca.selection__edi_exchange_record__edi_exchange_state__new
+msgid "New"
+msgstr "Nouveau"
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__message_needaction_counter
+msgid "Number of Actions"
+msgstr "Nombre d'actions"
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__message_has_error_counter
+msgid "Number of errors"
+msgstr "Nombre d'erreurs"
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_record__message_needaction_counter
+msgid "Number of messages which requires an action"
+msgstr "Nombre de messages nécessitant une action"
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_record__message_has_error_counter
+msgid "Number of messages with delivery error"
+msgstr "Nombre de messages avec erreur de destinataire"
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_record__message_unread_counter
+msgid "Number of unread messages"
+msgstr "Nombre de messages non lus"
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_record__parent_id
+msgid "Original exchange which originated this record"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.ui.menu,name:edi_oca.menu_edi_exchange_record_outbound
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_type_view_search
+msgid "Outbound"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields.selection,name:edi_oca.selection__edi_exchange_type__direction__output
+msgid "Output"
+msgstr "Sortie"
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_backend__output_sent_processed_auto
+msgid "Output Sent Processed Auto"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__parent_id
+msgid "Parent"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+msgid "Parent exchange"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.ui.menu,name:edi_oca.menu_edi_exchange_record_failed
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+msgid "Pending"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields.selection,name:edi_oca.selection__edi_exchange_record__edi_exchange_state__input_processed
+msgid "Processed"
+msgstr "Traité"
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_type__quick_exec
+msgid "Quick execution"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields.selection,name:edi_oca.selection__edi_exchange_record__edi_exchange_state__input_received
+msgid "Received"
+msgstr "Reçu"
+
+#. module: edi_oca
+#: model:ir.ui.menu,name:edi_oca.menu_edi_exchange_record_recent
+msgid "Recent"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.actions.act_window,name:edi_oca.act_open_edi_exchange_record_recent_view
+msgid "Recent exchanges"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__res_id
+msgid "Record"
+msgstr ""
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_backend.py:0
+#, python-format
+msgid "Record ID=%d has no file to process!"
+msgstr ""
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_backend.py:0
+#, python-format
+msgid "Record ID=%d has no file to send!"
+msgstr ""
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_backend.py:0
+#, python-format
+msgid "Record ID=%d is not meant to be processed"
+msgstr ""
+
+#. module: edi_oca
+#: code:addons/edi_oca/models/edi_backend.py:0
+#, python-format
+msgid "Record ID=%d is not meant to be sent!"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__related_name
+msgid "Related Name"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__related_record_exists
+msgid "Related Record Exists"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_form
+msgid "Related exchanges"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_form
+msgid "Related record"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__related_exchange_ids
+msgid "Related records"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record_create_wiz__res_id
+msgid "Res"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_form
+msgid "Retry"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__retryable
+msgid "Retryable"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__message_has_sms_error
+msgid "SMS Delivery error"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields.selection,name:edi_oca.selection__edi_exchange_record__edi_exchange_state__output_sent
+msgid "Sent"
+msgstr "Envoyé"
+
+#. module: edi_oca
+#: model:ir.model.fields.selection,name:edi_oca.selection__edi_exchange_record__edi_exchange_state__output_sent_and_error
+msgid "Sent and error"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields.selection,name:edi_oca.selection__edi_exchange_record__edi_exchange_state__output_sent_and_processed
+msgid "Sent and processed"
+msgstr "Envoyé et traité"
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_record__ack_received_on
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_record__exchanged_on
+msgid "Sent or received on this date."
+msgstr "Envoyé ou reçu à cette date."
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+msgid "Show all records created in the last 7 days"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+msgid "Show all records created today"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_type__enable_snippet
+msgid ""
+"Snippet of code to be checked on Models,\n"
+" You can use `record` and `exchange_type` here.\n"
+" It will be executed if variable result has been defined as True\n"
+" "
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+msgid "State"
+msgstr "Etat"
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_form
+msgid "Status"
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+msgid "Successful"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.constraint,message:edi_oca.constraint_edi_exchange_type_code_uniq
+msgid "The code must be unique per backend"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.constraint,message:edi_oca.constraint_edi_exchange_record_external_identifier_uniq
+msgid "The external_identifier must be unique for a type and a backend."
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.constraint,message:edi_oca.constraint_edi_exchange_record_identifier_uniq
+msgid "The identifier must be unique."
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_record__retryable
+msgid "The record state can be rolled back manually in case of failure."
+msgstr ""
+
+#. module: edi_oca
+#: model_terms:ir.ui.view,arch_db:edi_oca.edi_exchange_record_view_search
+msgid "Type"
+msgstr "Type"
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__message_unread
+msgid "Unread Messages"
+msgstr "Messages non lus"
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__message_unread_counter
+msgid "Unread Messages Counter"
+msgstr "Compteur de messages non lus"
+
+#. module: edi_oca
+#: model:ir.model.fields.selection,name:edi_oca.selection__edi_exchange_record__edi_exchange_state__input_pending
+msgid "Waiting to be received"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields.selection,name:edi_oca.selection__edi_exchange_record__edi_exchange_state__output_pending
+msgid "Waiting to be sent"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,field_description:edi_oca.field_edi_exchange_record__website_message_ids
+msgid "Website Messages"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_record__website_message_ids
+msgid "Website communication history"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_type__quick_exec
+msgid ""
+"When active, records of this type will be processed immediately without "
+"waiting for the cron to pass by."
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_consumer_mixin__disable_edi_auto
+msgid "When marked, EDI automatic processing will be avoided"
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields,help:edi_oca.field_edi_exchange_type__partner_ids
+msgid ""
+"You can use this field to limit generating/processing exchanges for specific "
+"partners. Use it directly or within models rules (domain or snippet)."
+msgstr ""
+
+#. module: edi_oca
+#: model:ir.model.fields.selection,name:edi_oca.selection__edi_exchange_record__edi_exchange_state__output_error_on_send
+msgid "error on send"
+msgstr ""
+
+#~ msgid ""
+#~ "The record has some pending EDIs to be "
+#~ "generated"
+#~ msgstr ""
+#~ "