Compare commits

...

No commits in common. '12.0' and '13.0-mig-contract' have entirely different histories.

  1. 291
      .eslintrc
  2. 10
      .flake8
  3. 12
      .isort.cfg
  4. 68
      .pre-commit-config.yaml
  5. 87
      .pylintrc
  6. 65
      .pylintrc-mandatory
  7. 34
      .travis.yml
  8. 10
      README.md
  9. 100
      agreement/README.rst
  10. 1
      agreement/__init__.py
  11. 28
      agreement/__manifest__.py
  12. 63
      agreement/demo/demo.xml
  13. 214
      agreement/i18n/agreement.pot
  14. 232
      agreement/i18n/fr.po
  15. 218
      agreement/i18n/hr.po
  16. 218
      agreement/i18n/pt_BR.po
  17. 227
      agreement/i18n/pt_PT.po
  18. 219
      agreement/i18n/zh_CN.po
  19. 2
      agreement/models/__init__.py
  20. 50
      agreement/models/agreement.py
  21. 12
      agreement/models/agreement_type.py
  22. 3
      agreement/readme/CONTRIBUTORS.rst
  23. 14
      agreement/readme/DESCRIPTION.rst
  24. 26
      agreement/security/agreement_security.xml
  25. 3
      agreement/security/ir.model.access.csv
  26. BIN
      agreement/static/description/icon.png
  27. 436
      agreement/static/description/index.html
  28. 90
      agreement/views/agreement.xml
  29. 54
      agreement/views/agreement_type.xml
  30. 142
      agreement_legal/README.rst
  31. 12
      agreement_legal/__init__.py
  32. 51
      agreement_legal/__manifest__.py
  33. 58
      agreement_legal/data/agreement_stage.xml
  34. 16
      agreement_legal/data/agreement_type.xml
  35. 13
      agreement_legal/data/ir_sequence.xml
  36. 9
      agreement_legal/data/module_category.xml
  37. 40
      agreement_legal/demo/demo.xml
  38. 1697
      agreement_legal/i18n/agreement_legal.pot
  39. 1983
      agreement_legal/i18n/fr.po
  40. 1710
      agreement_legal/i18n/pt_BR.po
  41. 1730
      agreement_legal/i18n/pt_PT.po
  42. 1740
      agreement_legal/i18n/zh_CN.po
  43. 18
      agreement_legal/models/__init__.py
  44. 371
      agreement_legal/models/agreement.py
  45. 73
      agreement_legal/models/agreement_appendix.py
  46. 71
      agreement_legal/models/agreement_clause.py
  47. 27
      agreement_legal/models/agreement_increasetype.py
  48. 30
      agreement_legal/models/agreement_line.py
  49. 63
      agreement_legal/models/agreement_recital.py
  50. 23
      agreement_legal/models/agreement_renewaltype.py
  51. 63
      agreement_legal/models/agreement_section.py
  52. 31
      agreement_legal/models/agreement_stage.py
  53. 12
      agreement_legal/models/agreement_status.py
  54. 14
      agreement_legal/models/agreement_subtype.py
  55. 15
      agreement_legal/models/agreement_type.py
  56. 12
      agreement_legal/models/product_template.py
  57. 38
      agreement_legal/models/res_config_settings.py
  58. 13
      agreement_legal/models/res_partner.py
  59. 6
      agreement_legal/readme/CONFIGURE.rst
  60. 6
      agreement_legal/readme/CONTRIBUTORS.rst
  61. 5
      agreement_legal/readme/CREDITS.rst
  62. 9
      agreement_legal/readme/DESCRIPTION.rst
  63. 3
      agreement_legal/readme/ROADMAP.rst
  64. 13
      agreement_legal/readme/USAGE.rst
  65. 151
      agreement_legal/report/agreement.xml
  66. 29
      agreement_legal/security/ir.model.access.csv
  67. 30
      agreement_legal/security/res_groups.xml
  68. BIN
      agreement_legal/static/description/icon.png
  69. 481
      agreement_legal/static/description/index.html
  70. 80
      agreement_legal/static/src/js/domain_widget_ext.js
  71. 179
      agreement_legal/static/src/xml/domain_widget_view.xml
  72. 372
      agreement_legal/views/agreement.xml
  73. 86
      agreement_legal/views/agreement_appendix.xml
  74. 88
      agreement_legal/views/agreement_clause.xml
  75. 45
      agreement_legal/views/agreement_increasetype.xml
  76. 87
      agreement_legal/views/agreement_recital.xml
  77. 41
      agreement_legal/views/agreement_renewaltype.xml
  78. 100
      agreement_legal/views/agreement_section.xml
  79. 45
      agreement_legal/views/agreement_stages.xml
  80. 45
      agreement_legal/views/agreement_subtype.xml
  81. 40
      agreement_legal/views/agreement_type.xml
  82. 147
      agreement_legal/views/menu.xml
  83. 161
      agreement_legal/views/res_config_settings.xml
  84. 17
      agreement_legal/views/res_partner.xml
  85. 131
      agreement_legal_sale/README.rst
  86. 3
      agreement_legal_sale/__init__.py
  87. 26
      agreement_legal_sale/__manifest__.py
  88. 55
      agreement_legal_sale/i18n/agreement_legal_sale.pot
  89. 64
      agreement_legal_sale/i18n/agreement_sale.pot
  90. 76
      agreement_legal_sale/i18n/de.po
  91. 70
      agreement_legal_sale/i18n/fr.po
  92. 68
      agreement_legal_sale/i18n/zh_CN.po
  93. 6
      agreement_legal_sale/models/__init__.py
  94. 21
      agreement_legal_sale/models/agreement.py
  95. 61
      agreement_legal_sale/models/sale_order.py
  96. 6
      agreement_legal_sale/readme/CONFIGURE.rst
  97. 3
      agreement_legal_sale/readme/CONTRIBUTORS.rst
  98. 4
      agreement_legal_sale/readme/CREDITS.rst
  99. 5
      agreement_legal_sale/readme/DESCRIPTION.rst
  100. 1
      agreement_legal_sale/readme/ROADMAP.rst

291
.eslintrc

@ -0,0 +1,291 @@
{
"globals": {
"$": false,
"_": false,
"fuzzy": false,
"jQuery": false,
"moment": false,
"odoo": false,
"openerp": false,
"self": false
},
"env": {
"browser": true
},
"rules": {
"no-alert": "warn",
"no-array-constructor": "warn",
"no-bitwise": "off",
"no-caller": "warn",
"no-case-declarations": "warn",
"no-catch-shadow": "warn",
"no-class-assign": "warn",
"no-cond-assign": "warn",
"no-confusing-arrow": "warn",
"no-console": "off",
"no-const-assign": "warn",
"no-constant-condition": "warn",
"no-continue": "off",
"no-control-regex": "warn",
"no-debugger": "warn",
"no-delete-var": "warn",
"no-div-regex": "warn",
"no-dupe-args": "warn",
"no-dupe-class-members": "warn",
"no-dupe-keys": "warn",
"no-duplicate-case": "warn",
"no-duplicate-imports": "warn",
"no-else-return": "warn",
"no-empty": "warn",
"no-empty-character-class": "warn",
"no-empty-function": "warn",
"no-empty-pattern": "warn",
"no-eq-null": "warn",
"no-eval": "warn",
"no-ex-assign": "warn",
"no-extend-native": "warn",
"no-extra-bind": "warn",
"no-extra-boolean-cast": "warn",
"no-extra-label": "warn",
"no-extra-parens": "warn",
"no-extra-semi": "warn",
"no-fallthrough": "warn",
"no-floating-decimal": "warn",
"no-func-assign": "warn",
"no-implicit-coercion": ["warn", {
"allow": ["~"]
}],
"no-implicit-globals": "warn",
"no-implied-eval": "warn",
"no-inline-comments": "warn",
"no-inner-declarations": "warn",
"no-invalid-regexp": "warn",
"no-invalid-this": "off",
"no-irregular-whitespace": "warn",
"no-iterator": "warn",
"no-label-var": "warn",
"no-labels": "warn",
"no-lone-blocks": "warn",
"no-lonely-if": "warn",
"no-loop-func": "off",
"no-magic-numbers": "off",
"no-mixed-operators": "warn",
"no-mixed-requires": "warn",
"no-mixed-spaces-and-tabs": "warn",
"no-multi-spaces": "warn",
"no-multi-str": "warn",
"no-multiple-empty-lines": "warn",
"no-native-reassign": "warn",
"no-negated-condition": "warn",
"no-negated-in-lhs": "warn",
"no-nested-ternary": "off",
"no-new": "warn",
"no-new-func": "warn",
"no-new-object": "warn",
"no-new-require": "warn",
"no-new-symbol": "warn",
"no-new-wrappers": "warn",
"no-obj-calls": "warn",
"no-octal": "warn",
"no-octal-escape": "warn",
"no-param-reassign": "warn",
"no-path-concat": "warn",
"no-plusplus": "off",
"no-process-env": "warn",
"no-process-exit": "warn",
"no-proto": "warn",
"no-prototype-builtins": "warn",
"no-redeclare": "warn",
"no-regex-spaces": "warn",
"no-restricted-globals": "warn",
"no-restricted-imports": "warn",
"no-restricted-modules": "warn",
"no-restricted-syntax": "warn",
"no-return-assign": "warn",
"no-script-url": "warn",
"no-self-assign": "warn",
"no-self-compare": "warn",
"no-sequences": "warn",
"no-shadow": "warn",
"no-shadow-restricted-names": "warn",
"no-whitespace-before-property": "warn",
"no-spaced-func": "warn",
"no-sparse-arrays": "warn",
"no-sync": "warn",
"no-tabs": "warn",
"no-ternary": "off",
"no-trailing-spaces": "warn",
"no-this-before-super": "warn",
"no-throw-literal": "warn",
"no-undef": "warn",
"no-undef-init": "warn",
"no-undefined": "off",
"no-unexpected-multiline": "warn",
"no-underscore-dangle": "off",
"no-unmodified-loop-condition": "warn",
"no-unneeded-ternary": "warn",
"no-unreachable": "warn",
"no-unsafe-finally": "warn",
"no-unused-expressions": "warn",
"no-unused-labels": "warn",
"no-unused-vars": "warn",
"no-use-before-define": "warn",
"no-useless-call": "warn",
"no-useless-computed-key": "warn",
"no-useless-concat": "warn",
"no-useless-constructor": "warn",
"no-useless-escape": "warn",
"no-useless-rename": "warn",
"no-void": "warn",
"no-var": "off",
"no-warning-comments": "off",
"no-with": "warn",
"array-bracket-spacing": "off",
"array-callback-return": "warn",
"arrow-body-style": "warn",
"arrow-parens": "warn",
"arrow-spacing": "off",
"accessor-pairs": "warn",
"block-scoped-var": "off",
"block-spacing": ["warn", "always"],
"brace-style": "warn",
"callback-return": "warn",
"camelcase": "off",
"capitalized-comments": ["warn", "always", {
"ignoreConsecutiveComments": true,
"ignoreInlineComments": true
}],
"comma-dangle": ["warn", "always-multiline"],
"comma-spacing": ["warn", {
"before": false,
"after": true
}],
"comma-style": "warn",
"complexity": [
"warn",
15
],
"computed-property-spacing": "off",
"consistent-return": "off",
"consistent-this": "off",
"constructor-super": "warn",
"curly": "warn",
"default-case": "off",
"dot-location": ["warn", "property"],
"dot-notation": "warn",
"eol-last": "warn",
"eqeqeq": "warn",
"func-names": "off",
"func-style": "off",
"generator-star-spacing": "off",
"global-require": "warn",
"guard-for-in": "off",
"handle-callback-err": "warn",
"id-blacklist": "warn",
"id-length": "off",
"id-match": "warn",
"indent": "warn",
"init-declarations": "warn",
"jsx-quotes": "warn",
"key-spacing": "off",
"keyword-spacing": "warn",
"linebreak-style": [
"warn",
"unix"
],
"lines-around-comment": "warn",
"max-depth": "warn",
"max-len": ["warn", {
"code": 88,
"ignorePattern": "odoo\\.define\\(",
"tabWidth": 4
}],
"max-lines": "off",
"max-nested-callbacks": "warn",
"max-params": "off",
"max-statements": "off",
"max-statements-per-line": "warn",
"multiline-ternary": "off",
"new-cap": "off",
"new-parens": "warn",
"newline-after-var": "off",
"newline-before-return": "off",
"newline-per-chained-call": "off",
"object-curly-newline": ["warn", { "consistent": true }],
"object-curly-spacing": ["warn", "never"],
"object-property-newline": ["warn", {
"allowAllPropertiesOnSameLine": true
}],
"object-shorthand": "off",
"one-var": "off",
"one-var-declaration-per-line": "off",
"operator-assignment": "warn",
"operator-linebreak": "warn",
"padded-blocks": "off",
"prefer-arrow-callback": "off",
"prefer-const": "warn",
"prefer-reflect": "off",
"prefer-rest-params": "off",
"prefer-spread": "off",
"prefer-template": "off",
"quote-props": "off",
"quotes": "off",
"radix": "warn",
"require-yield": "warn",
"rest-spread-spacing": "off",
"semi": [
"warn",
"always"
],
"semi-spacing": "warn",
"sort-imports": "warn",
"sort-vars": "off",
"space-before-blocks": "warn",
"space-before-function-paren": "warn",
"space-in-parens": "off",
"space-infix-ops": "off",
"space-unary-ops": "off",
"spaced-comment": ["warn", "always"],
"strict": ["warn", "function"],
"template-curly-spacing": "off",
"unicode-bom": "warn",
"use-isnan": "warn",
"valid-jsdoc": ["warn", {
"prefer": {
"arg": "param",
"argument": "param",
"augments": "extends",
"constructor": "class",
"exception": "throws",
"func": "function",
"method": "function",
"prop": "property",
"return": "returns",
"virtual": "abstract",
"yield": "yields"
},
"preferType": {
"array": "Array",
"bool": "Boolean",
"boolean": "Boolean",
"number": "Number",
"object": "Object",
"str": "String",
"string": "String"
},
"requireParamDescription": false,
"requireReturn": false,
"requireReturnDescription": false,
"requireReturnType": false
}],
"valid-typeof": "warn",
"vars-on-top": "off",
"wrap-iife": "warn",
"wrap-regex": "warn",
"yield-star-spacing": "off",
"yoda": "warn"
},
"parserOptions": {
"ecmaVersion": 2017
}
}

10
.flake8

@ -0,0 +1,10 @@
[flake8]
max-line-length = 80
max-complexity = 16
# B = bugbear
# B9 = bugbear opinionated (incl line length)
select = C,E,F,W,B,B9
# E203: whitespace before ':' (black behaviour)
# E501: flake8 line length (covered by bugbear B950)
# W503: line break before binary operator (black behaviour)
ignore = E203,E501,W503

12
.isort.cfg

@ -0,0 +1,12 @@
[settings]
; see https://github.com/psf/black
multi_line_output=3
include_trailing_comma=True
force_grid_wrap=0
combine_as_imports=True
use_parentheses=True
line_length=88
known_odoo=odoo
known_odoo_addons=odoo.addons
sections=FUTURE,STDLIB,THIRDPARTY,ODOO,ODOO_ADDONS,FIRSTPARTY,LOCALFOLDER
known_third_party=

68
.pre-commit-config.yaml

@ -0,0 +1,68 @@
exclude: "^setup/|/static/lib/|/static/src/lib/"
default_language_version:
python: python3
repos:
- repo: https://github.com/psf/black
rev: 19.3b0
hooks:
- id: black
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v2.3.0
hooks:
- id: trailing-whitespace
# exclude autogenerated files
exclude: /README\.rst$|\.pot?$
- id: end-of-file-fixer
# exclude autogenerated files
exclude: /README\.rst$|\.pot?$
- id: debug-statements
- id: flake8
name: flake8 except __init__.py
exclude: /__init__\.py$
additional_dependencies: ["flake8-bugbear==19.8.0"]
- id: flake8
name: flake8 only __init__.py
args: ["--extend-ignore=F401"] # ignore unused imports in __init__.py
files: /__init__\.py$
additional_dependencies: ["flake8-bugbear==19.8.0"]
- id: fix-encoding-pragma
args: ["--remove"]
- id: check-case-conflict
- id: check-docstring-first
- id: check-executables-have-shebangs
- id: check-merge-conflict
- id: check-symlinks
- id: check-xml
- id: mixed-line-ending
args: ["--fix=lf"]
- repo: https://github.com/pre-commit/mirrors-pylint
rev: v2.3.1
hooks:
- id: pylint
name: pylint with optional checks
args: ["--rcfile=.pylintrc", "--exit-zero"]
verbose: true
additional_dependencies: ["pylint-odoo==3.0.3"]
- id: pylint
name: pylint with mandatory checks
args: ["--rcfile=.pylintrc-mandatory"]
additional_dependencies: ["pylint-odoo==3.0.3"]
- repo: https://github.com/asottile/pyupgrade
rev: v1.24.0
hooks:
- id: pyupgrade
- repo: https://github.com/asottile/seed-isort-config
rev: v1.9.3
hooks:
- id: seed-isort-config
- repo: https://github.com/pre-commit/mirrors-isort
rev: v4.3.21
hooks:
- id: isort
name: isort except __init__.py
exclude: /__init__\.py$
- repo: https://github.com/pre-commit/mirrors-eslint
rev: v6.5.1
hooks:
- id: eslint
verbose: true

87
.pylintrc

@ -0,0 +1,87 @@
[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=13.0
[MESSAGES CONTROL]
disable=all
# 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.
enable=anomalous-backslash-in-string,
api-one-deprecated,
api-one-multi-together,
assignment-from-none,
attribute-deprecated,
class-camelcase,
dangerous-default-value,
dangerous-view-replace-wo-priority,
duplicate-id-csv,
duplicate-key,
duplicate-xml-fields,
duplicate-xml-record-id,
eval-referenced,
eval-used,
incoherent-interpreter-exec-perm,
license-allowed,
manifest-author-string,
manifest-deprecated-key,
manifest-required-author,
manifest-required-key,
manifest-version-format,
method-compute,
method-inverse,
method-required-super,
method-search,
missing-import-error,
missing-manifest-dependency,
openerp-exception-warning,
pointless-statement,
pointless-string-statement,
print-used,
redundant-keyword-arg,
redundant-modulename-xml,
reimported,
relative-import,
return-in-init,
rst-syntax-error,
sql-injection,
too-few-format-args,
translation-field,
translation-required,
unreachable,
use-vim-comment,
wrong-tabs-instead-of-spaces,
xml-syntax-error,
# messages that do not cause the lint step to fail
consider-merging-classes-inherited,
create-user-wo-reset-password,
dangerous-filter-wo-user,
deprecated-module,
file-not-used,
invalid-commit,
missing-newline-extrafiles,
missing-readme,
no-utf8-coding-comment,
odoo-addons-relative-import,
old-api7-method-defined,
redefined-builtin,
too-complex,
unnecessary-utf8-coding-comment
[REPORTS]
msg-template={path}:{line}: [{msg_id}({symbol}), {obj}] {msg}
output-format=colorized
reports=no

65
.pylintrc-mandatory

@ -0,0 +1,65 @@
[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=13.0
[MESSAGES CONTROL]
disable=all
enable=anomalous-backslash-in-string,
api-one-deprecated,
api-one-multi-together,
assignment-from-none,
attribute-deprecated,
class-camelcase,
dangerous-default-value,
dangerous-view-replace-wo-priority,
duplicate-id-csv,
duplicate-key,
duplicate-xml-fields,
duplicate-xml-record-id,
eval-referenced,
eval-used,
incoherent-interpreter-exec-perm,
license-allowed,
manifest-author-string,
manifest-deprecated-key,
manifest-required-author,
manifest-required-key,
manifest-version-format,
method-compute,
method-inverse,
method-required-super,
method-search,
missing-import-error,
missing-manifest-dependency,
openerp-exception-warning,
pointless-statement,
pointless-string-statement,
print-used,
redundant-keyword-arg,
redundant-modulename-xml,
reimported,
relative-import,
return-in-init,
rst-syntax-error,
sql-injection,
too-few-format-args,
translation-field,
translation-required,
unreachable,
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

34
.travis.yml

@ -1,9 +1,11 @@
language: python
sudo: false
cache: pip
cache:
directories:
- $HOME/.cache/pip
- $HOME/.cache/pre-commit
python:
- "3.5"
- "3.6"
addons:
postgresql: "9.6"
@ -11,14 +13,28 @@ addons:
packages:
- expect-dev # provides unbuffer utility
env:
global:
- VERSION="12.0" TESTS="0" LINT_CHECK="0" MAKEPOT="0"
stages:
- linting
- test
matrix:
- LINT_CHECK="1"
- TESTS="1" ODOO_REPO="OCA/OCB"
jobs:
include:
- stage: linting
name: "pre-commit"
before_install:
install: pip install pre-commit
script: pre-commit run --all --show-diff-on-failure
after_success:
- stage: test
env:
- TESTS="1" ODOO_REPO="odoo/odoo" MAKEPOT="1"
- stage: test
env:
- TESTS="1" ODOO_REPO="OCA/OCB"
env:
global:
- VERSION="13.0" TESTS="0" LINT_CHECK="0" MAKEPOT="0"
install:
- git clone --depth=1 https://github.com/OCA/maintainer-quality-tools.git ${HOME}/maintainer-quality-tools

10
README.md

@ -1,6 +1,6 @@
[![Runbot Status](https://runbot.odoo-community.org/runbot/badge/flat/110/12.0.svg)](https://runbot.odoo-community.org/runbot/repo/github-com-oca-contract-110)
[![Build Status](https://travis-ci.org/OCA/contract.svg?branch=12.0)](https://travis-ci.org/OCA/contract)
[![Coverage Status](https://coveralls.io/repos/OCA/contract/badge.svg?branch=12.0)](https://coveralls.io/r/OCA/contract?branch=12.0)
[![Runbot Status](https://runbot.odoo-community.org/runbot/badge/flat/110/13.0.svg)](https://runbot.odoo-community.org/runbot/repo/github-com-oca-contract-110)
[![Build Status](https://travis-ci.org/OCA/contract.svg?branch=13.0)](https://travis-ci.org/OCA/contract)
[![Coverage Status](https://coveralls.io/repos/OCA/contract/badge.svg?branch=13.0)](https://coveralls.io/r/OCA/contract?branch=13.0)
# Contracts
@ -13,6 +13,4 @@ For Project related extensions please see the
## Translation Status
[![Translation Status](https://translation.odoo-community.org/widgets/contract-12-0/-/multi-auto.svg)](https://translation.odoo-community.org/engage/contract-12-0/?utm_source=widget)
[![Translation Status](https://translation.odoo-community.org/widgets/contract-13-0/-/multi-auto.svg)](https://translation.odoo-community.org/engage/contract-13-0/?utm_source=widget)

100
agreement/README.rst

@ -1,100 +0,0 @@
=========
Agreement
=========
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! 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-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fcontract-lightgray.png?logo=github
:target: https://github.com/OCA/contract/tree/12.0/agreement
:alt: OCA/contract
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/contract-12-0/contract-12-0-agreement
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
:target: https://runbot.odoo-community.org/runbot/110/12.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
This module adds an *Agreement* object with the following properties:
* code,
* name,
* link to a partner,
* signature date.
* start date.
* end date.
Optionally, you can also enable using:
* agreement types
* a flag to set an agreement as a template agreement
(Install agreement_sale to get the configuration settings for these).
**Table of contents**
.. contents::
:local:
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/contract/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 <https://github.com/OCA/contract/issues/new?body=module:%20agreement%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* Akretion
* Yves Goldberg (Ygol Internetwork)
Contributors
~~~~~~~~~~~~
* Alexis de Lattre <alexis.delattre@akretion.com>
* Yves Goldberg <yves@ygol.com>
* Alexandre Fayolle <alexandre.fayolle@camptocamp.com>
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-ygol| image:: https://github.com/ygol.png?size=40px
:target: https://github.com/ygol
:alt: ygol
.. |maintainer-alexis-via| image:: https://github.com/alexis-via.png?size=40px
:target: https://github.com/alexis-via
:alt: alexis-via
Current `maintainers <https://odoo-community.org/page/maintainer-role>`__:
|maintainer-ygol| |maintainer-alexis-via|
This module is part of the `OCA/contract <https://github.com/OCA/contract/tree/12.0/agreement>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

1
agreement/__init__.py

@ -1 +0,0 @@
from . import models

28
agreement/__manifest__.py

@ -1,28 +0,0 @@
# © 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
'name': 'Agreement',
'summary': "Adds an agreement object",
'version': '12.0.1.0.0',
'category': 'Contract',
'author': 'Akretion, '
'Yves Goldberg (Ygol Internetwork), '
'Odoo Community Association (OCA)',
'website': 'https://github.com/oca/contract',
'license': 'AGPL-3',
'depends': ['base'],
'data': [
'security/ir.model.access.csv',
'security/agreement_security.xml',
'views/agreement.xml',
'views/agreement_type.xml',
],
'demo': ['demo/demo.xml'],
'development_status': 'Beta',
'maintainers': [
'ygol',
'alexis-via',
],
'installable': True,
}

63
agreement/demo/demo.xml

@ -1,63 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
© 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo noupdate="1">
<record id="market1" model="agreement">
<field name="code">C2C-IT0042</field>
<field name="name">Hardware IT</field>
<field name="partner_id" ref="base.res_partner_12"/>
<field name="signature_date">2017-09-10</field>
<field name="start_date">2017-09-10</field>
<field name="end_date">2018-09-10</field>
</record>
<record id="market2" model="agreement">
<field name="code">C2C-IT0043</field>
<field name="name">Fiber access office Lausanne</field>
<field name="partner_id" ref="base.res_partner_12"/>
<field name="signature_date" eval="time.strftime('%Y-01-01')"/>
<field name="start_date" eval="time.strftime('%Y-01-01')"/>
<field name="end_date" eval="time.strftime('%Y-01-01')"/>
</record>
<record id="market3" model="agreement">
<field name="code">AGR-VETO001</field>
<field name="name">Vétérinaire</field>
<field name="partner_id" ref="base.res_partner_2"/>
<field name="signature_date">2017-08-01</field>
<field name="start_date">2017-08-01</field>
<field name="end_date">2018-08-01</field>
</record>
<record id="market4" model="agreement">
<field name="code">AGR-TEL001</field>
<field name="name">Wazo IPBX deployment and maintenance</field>
<field name="partner_id" ref="base.res_partner_2"/>
<field name="signature_date">2017-05-05</field>
<field name="start_date">2017-05-05</field>
<field name="end_date">2018-09-10</field>
</record>
<record id="market5" model="agreement">
<field name="code">BUY-VOIP012</field>
<field name="name">SIP Phones supply</field>
<field name="partner_id" ref="base.res_partner_1"/>
<field name="signature_date" eval="time.strftime('%Y-01-01')"/>
<field name="start_date" eval="time.strftime('%Y-01-01')"/>
<field name="end_date" eval="time.strftime('%Y-01-01')"/>
</record>
<record id="market6" model="agreement">
<field name="code">BUY-VOIP013</field>
<field name="name">SIP-ISDN gateways</field>
<field name="partner_id" ref="base.res_partner_3"/>
<field name="signature_date">2017-09-02</field>
</record>
</odoo>

214
agreement/i18n/agreement.pot

@ -1,214 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * agreement
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.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: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__active
#: model:ir.model.fields,field_description:agreement.field_agreement_type__active
msgid "Active"
msgstr ""
#. module: agreement
#: model:ir.model,name:agreement.model_agreement
#: model_terms:ir.ui.view,arch_db:agreement.agreement_form
msgid "Agreement"
msgstr ""
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__agreement_type_id
#: model_terms:ir.ui.view,arch_db:agreement.agreement_type_form_view
#: model_terms:ir.ui.view,arch_db:agreement.agreement_type_search
msgid "Agreement Type"
msgstr ""
#. module: agreement
#: model:ir.actions.act_window,name:agreement.agreement_type_action
#: model:ir.model,name:agreement.model_agreement_type
#: model:ir.ui.menu,name:agreement.agreement_type_menu
#: model_terms:ir.ui.view,arch_db:agreement.agreement_type_list_view
msgid "Agreement Types"
msgstr ""
#. module: agreement
#: model:ir.actions.act_window,name:agreement.agreement_action
#: model:ir.ui.menu,name:agreement.agreement_menu
#: model_terms:ir.ui.view,arch_db:agreement.agreement_tree
msgid "Agreements"
msgstr ""
#. module: agreement
#: model_terms:ir.ui.view,arch_db:agreement.agreement_search
#: model_terms:ir.ui.view,arch_db:agreement.agreement_type_search
msgid "Archived"
msgstr ""
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__company_id
msgid "Company"
msgstr ""
#. module: agreement
#: model_terms:ir.ui.view,arch_db:agreement.agreement_form
msgid "Configuration"
msgstr ""
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__create_uid
#: model:ir.model.fields,field_description:agreement.field_agreement_type__create_uid
msgid "Created by"
msgstr ""
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__create_date
#: model:ir.model.fields,field_description:agreement.field_agreement_type__create_date
msgid "Created on"
msgstr ""
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__display_name
#: model:ir.model.fields,field_description:agreement.field_agreement_type__display_name
msgid "Display Name"
msgstr ""
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__end_date
msgid "End Date"
msgstr ""
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__id
#: model:ir.model.fields,field_description:agreement.field_agreement_type__id
msgid "ID"
msgstr ""
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__code
msgid "ID used for internal contract tracking."
msgstr ""
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__active
msgid "If unchecked, it will allow you to hide the agreement without removing it."
msgstr ""
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__is_template
msgid "Is a Template?"
msgstr ""
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement____last_update
#: model:ir.model.fields,field_description:agreement.field_agreement_type____last_update
msgid "Last Modified on"
msgstr ""
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__write_uid
#: model:ir.model.fields,field_description:agreement.field_agreement_type__write_uid
msgid "Last Updated by"
msgstr ""
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__write_date
#: model:ir.model.fields,field_description:agreement.field_agreement_type__write_date
msgid "Last Updated on"
msgstr ""
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement_type__name
msgid "Name"
msgstr ""
#. module: agreement
#: model_terms:ir.ui.view,arch_db:agreement.agreement_search
msgid "Name or Number"
msgstr ""
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__partner_id
#: model_terms:ir.ui.view,arch_db:agreement.agreement_search
msgid "Partner"
msgstr ""
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__code
msgid "Reference"
msgstr ""
#. module: agreement
#: model_terms:ir.ui.view,arch_db:agreement.agreement_search
msgid "Search Agreements"
msgstr ""
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__agreement_type_id
msgid "Select the type of agreement"
msgstr ""
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__is_template
msgid "Set if the agreement is a template. Template agreements don't require a partner."
msgstr ""
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__signature_date
#: model_terms:ir.ui.view,arch_db:agreement.agreement_search
msgid "Signature Date"
msgstr ""
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__start_date
msgid "Start Date"
msgstr ""
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__partner_id
msgid "The customer or vendor this agreement is related to."
msgstr ""
#. module: agreement
#: sql_constraint:agreement:0
msgid "This agreement code already exists for this partner!"
msgstr ""
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__name
msgid "Title"
msgstr ""
#. module: agreement
#: model_terms:ir.ui.view,arch_db:agreement.agreement_type_list_view
msgid "Type Name"
msgstr ""
#. module: agreement
#: model:res.groups,name:agreement.group_use_agreement_template
msgid "Use agreement template"
msgstr ""
#. module: agreement
#: model:res.groups,name:agreement.group_use_agreement_type
msgid "Use agreement type"
msgstr ""
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__end_date
msgid "When the agreement ends."
msgstr ""
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__start_date
msgid "When the agreement starts."
msgstr ""

232
agreement/i18n/fr.po

@ -1,232 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * agreement
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2019-07-28 11:47+0000\n"
"Last-Translator: jcleonard2018 <jcl@solutionsmakers.fr>\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 3.7.1\n"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__active
#: model:ir.model.fields,field_description:agreement.field_agreement_type__active
msgid "Active"
msgstr "Actif"
#. module: agreement
#: model:ir.model,name:agreement.model_agreement
#: model_terms:ir.ui.view,arch_db:agreement.agreement_form
msgid "Agreement"
msgstr "Accord"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__agreement_type_id
#: model_terms:ir.ui.view,arch_db:agreement.agreement_type_form_view
#: model_terms:ir.ui.view,arch_db:agreement.agreement_type_search
#, fuzzy
#| msgid "Agreement"
msgid "Agreement Type"
msgstr "Accord"
#. module: agreement
#: model:ir.actions.act_window,name:agreement.agreement_type_action
#: model:ir.model,name:agreement.model_agreement_type
#: model:ir.ui.menu,name:agreement.agreement_type_menu
#: model_terms:ir.ui.view,arch_db:agreement.agreement_type_list_view
#, fuzzy
#| msgid "Agreements"
msgid "Agreement Types"
msgstr "Accords"
#. module: agreement
#: model:ir.actions.act_window,name:agreement.agreement_action
#: model:ir.ui.menu,name:agreement.agreement_menu
#: model_terms:ir.ui.view,arch_db:agreement.agreement_tree
msgid "Agreements"
msgstr "Accords"
#. module: agreement
#: model_terms:ir.ui.view,arch_db:agreement.agreement_search
#: model_terms:ir.ui.view,arch_db:agreement.agreement_type_search
msgid "Archived"
msgstr "Archivé"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__company_id
msgid "Company"
msgstr "Entreprise"
#. module: agreement
#: model_terms:ir.ui.view,arch_db:agreement.agreement_form
msgid "Configuration"
msgstr "Configuration"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__create_uid
#: model:ir.model.fields,field_description:agreement.field_agreement_type__create_uid
msgid "Created by"
msgstr "Créé par"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__create_date
#: model:ir.model.fields,field_description:agreement.field_agreement_type__create_date
msgid "Created on"
msgstr "Créé le"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__display_name
#: model:ir.model.fields,field_description:agreement.field_agreement_type__display_name
msgid "Display Name"
msgstr "Nom d'affichage"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__end_date
msgid "End Date"
msgstr "Date de fin"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__id
#: model:ir.model.fields,field_description:agreement.field_agreement_type__id
msgid "ID"
msgstr "ID"
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__code
msgid "ID used for internal contract tracking."
msgstr "Numéro utilisé pour le suivi interne du contrat."
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__active
msgid ""
"If unchecked, it will allow you to hide the agreement without removing it."
msgstr "Si coché, Cela vous permettra de cacher le contrat sans l'enlever."
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__is_template
msgid "Is a Template?"
msgstr ""
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement____last_update
#: model:ir.model.fields,field_description:agreement.field_agreement_type____last_update
msgid "Last Modified on"
msgstr "Dernière modification le"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__write_uid
#: model:ir.model.fields,field_description:agreement.field_agreement_type__write_uid
msgid "Last Updated by"
msgstr "Dernière mise à jour par"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__write_date
#: model:ir.model.fields,field_description:agreement.field_agreement_type__write_date
msgid "Last Updated on"
msgstr "Dernière mise à jour le"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement_type__name
msgid "Name"
msgstr "Nom"
#. module: agreement
#: model_terms:ir.ui.view,arch_db:agreement.agreement_search
msgid "Name or Number"
msgstr "Nom ou Numéro"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__partner_id
#: model_terms:ir.ui.view,arch_db:agreement.agreement_search
msgid "Partner"
msgstr "Partenaire"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__code
msgid "Reference"
msgstr "Référence"
#. module: agreement
#: model_terms:ir.ui.view,arch_db:agreement.agreement_search
msgid "Search Agreements"
msgstr "Recherche Accords"
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__agreement_type_id
msgid "Select the type of agreement"
msgstr ""
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__is_template
msgid ""
"Set if the agreement is a template. Template agreements don't require a "
"partner."
msgstr ""
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__signature_date
#: model_terms:ir.ui.view,arch_db:agreement.agreement_search
msgid "Signature Date"
msgstr "Date Signature"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__start_date
msgid "Start Date"
msgstr "Date Début"
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__partner_id
msgid "The customer or vendor this agreement is related to."
msgstr "Client ou fournisseur avec lequel le contrat est lié."
#. module: agreement
#: sql_constraint:agreement:0
msgid "This agreement code already exists for this partner!"
msgstr "Code accord existant pour ce partenaire !"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__name
msgid "Title"
msgstr "Titre"
#. module: agreement
#: model_terms:ir.ui.view,arch_db:agreement.agreement_type_list_view
#, fuzzy
#| msgid "Name"
msgid "Type Name"
msgstr "Nom"
#. module: agreement
#: model:res.groups,name:agreement.group_use_agreement_template
#, fuzzy
#| msgid "When the agreement starts."
msgid "Use agreement template"
msgstr "Quand le contrat débute."
#. module: agreement
#: model:res.groups,name:agreement.group_use_agreement_type
#, fuzzy
#| msgid "When the agreement ends."
msgid "Use agreement type"
msgstr "Quand le contrat finit."
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__end_date
msgid "When the agreement ends."
msgstr "Quand le contrat finit."
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__start_date
msgid "When the agreement starts."
msgstr "Quand le contrat débute."
#~ msgid "Code"
#~ msgstr "Code"

218
agreement/i18n/hr.po

@ -1,218 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * agreement
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2019-11-12 16:34+0000\n"
"Last-Translator: Bole <bole@dajmi5.com>\n"
"Language-Team: none\n"
"Language: hr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<="
"4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 3.8\n"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__active
#: model:ir.model.fields,field_description:agreement.field_agreement_type__active
msgid "Active"
msgstr "Aktivan"
#. module: agreement
#: model:ir.model,name:agreement.model_agreement
#: model_terms:ir.ui.view,arch_db:agreement.agreement_form
msgid "Agreement"
msgstr "Sporazum"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__agreement_type_id
#: model_terms:ir.ui.view,arch_db:agreement.agreement_type_form_view
#: model_terms:ir.ui.view,arch_db:agreement.agreement_type_search
msgid "Agreement Type"
msgstr "Tip sporazuma"
#. module: agreement
#: model:ir.actions.act_window,name:agreement.agreement_type_action
#: model:ir.model,name:agreement.model_agreement_type
#: model:ir.ui.menu,name:agreement.agreement_type_menu
#: model_terms:ir.ui.view,arch_db:agreement.agreement_type_list_view
msgid "Agreement Types"
msgstr "Tipovi sporazuma"
#. module: agreement
#: model:ir.actions.act_window,name:agreement.agreement_action
#: model:ir.ui.menu,name:agreement.agreement_menu
#: model_terms:ir.ui.view,arch_db:agreement.agreement_tree
msgid "Agreements"
msgstr "Sporazumi"
#. module: agreement
#: model_terms:ir.ui.view,arch_db:agreement.agreement_search
#: model_terms:ir.ui.view,arch_db:agreement.agreement_type_search
msgid "Archived"
msgstr "Arhivirano"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__company_id
msgid "Company"
msgstr "Tvrtka"
#. module: agreement
#: model_terms:ir.ui.view,arch_db:agreement.agreement_form
msgid "Configuration"
msgstr "Postavke"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__create_uid
#: model:ir.model.fields,field_description:agreement.field_agreement_type__create_uid
msgid "Created by"
msgstr "Kreirao"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__create_date
#: model:ir.model.fields,field_description:agreement.field_agreement_type__create_date
msgid "Created on"
msgstr "Kreirano"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__display_name
#: model:ir.model.fields,field_description:agreement.field_agreement_type__display_name
msgid "Display Name"
msgstr "Naziv"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__end_date
msgid "End Date"
msgstr "Završni datum"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__id
#: model:ir.model.fields,field_description:agreement.field_agreement_type__id
msgid "ID"
msgstr "ID"
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__code
msgid "ID used for internal contract tracking."
msgstr "ID za interno praćenje sporazuma"
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__active
msgid "If unchecked, it will allow you to hide the agreement without removing it."
msgstr "Ako nije označeno, omogućuje vam skrivanje porazuma bez brisanja."
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__is_template
msgid "Is a Template?"
msgstr "Je predložak?"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement____last_update
#: model:ir.model.fields,field_description:agreement.field_agreement_type____last_update
msgid "Last Modified on"
msgstr "Zadnje uređivano"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__write_uid
#: model:ir.model.fields,field_description:agreement.field_agreement_type__write_uid
msgid "Last Updated by"
msgstr "Zadnje ažurirano"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__write_date
#: model:ir.model.fields,field_description:agreement.field_agreement_type__write_date
msgid "Last Updated on"
msgstr "Zadnje ažuriranje"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement_type__name
msgid "Name"
msgstr "Naziv"
#. module: agreement
#: model_terms:ir.ui.view,arch_db:agreement.agreement_search
msgid "Name or Number"
msgstr "Naziv ili broj"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__partner_id
#: model_terms:ir.ui.view,arch_db:agreement.agreement_search
#, fuzzy
msgid "Partner"
msgstr "Partner"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__code
msgid "Reference"
msgstr "Referenca"
#. module: agreement
#: model_terms:ir.ui.view,arch_db:agreement.agreement_search
msgid "Search Agreements"
msgstr "Pretraži sporazume"
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__agreement_type_id
msgid "Select the type of agreement"
msgstr "Odaberi tip sporazuma"
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__is_template
msgid "Set if the agreement is a template. Template agreements don't require a partner."
msgstr ""
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__signature_date
#: model_terms:ir.ui.view,arch_db:agreement.agreement_search
msgid "Signature Date"
msgstr ""
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__start_date
msgid "Start Date"
msgstr ""
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__partner_id
msgid "The customer or vendor this agreement is related to."
msgstr ""
#. module: agreement
#: sql_constraint:agreement:0
msgid "This agreement code already exists for this partner!"
msgstr ""
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__name
msgid "Title"
msgstr ""
#. module: agreement
#: model_terms:ir.ui.view,arch_db:agreement.agreement_type_list_view
msgid "Type Name"
msgstr ""
#. module: agreement
#: model:res.groups,name:agreement.group_use_agreement_template
msgid "Use agreement template"
msgstr ""
#. module: agreement
#: model:res.groups,name:agreement.group_use_agreement_type
msgid "Use agreement type"
msgstr ""
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__end_date
msgid "When the agreement ends."
msgstr ""
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__start_date
msgid "When the agreement starts."
msgstr ""

218
agreement/i18n/pt_BR.po

@ -1,218 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * agreement
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2019-12-16 15:05+0000\n"
"Last-Translator: Augusto D. Lisbôa <augusto.diniz.l@gmail.com>\n"
"Language-Team: none\n"
"Language: pt_BR\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 3.9.1\n"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__active
#: model:ir.model.fields,field_description:agreement.field_agreement_type__active
msgid "Active"
msgstr "Ativo"
#. module: agreement
#: model:ir.model,name:agreement.model_agreement
#: model_terms:ir.ui.view,arch_db:agreement.agreement_form
msgid "Agreement"
msgstr "Acordo"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__agreement_type_id
#: model_terms:ir.ui.view,arch_db:agreement.agreement_type_form_view
#: model_terms:ir.ui.view,arch_db:agreement.agreement_type_search
msgid "Agreement Type"
msgstr "Tipo de acordo"
#. module: agreement
#: model:ir.actions.act_window,name:agreement.agreement_type_action
#: model:ir.model,name:agreement.model_agreement_type
#: model:ir.ui.menu,name:agreement.agreement_type_menu
#: model_terms:ir.ui.view,arch_db:agreement.agreement_type_list_view
msgid "Agreement Types"
msgstr "Tipos de acordos"
#. module: agreement
#: model:ir.actions.act_window,name:agreement.agreement_action
#: model:ir.ui.menu,name:agreement.agreement_menu
#: model_terms:ir.ui.view,arch_db:agreement.agreement_tree
msgid "Agreements"
msgstr "Acordo"
#. module: agreement
#: model_terms:ir.ui.view,arch_db:agreement.agreement_search
#: model_terms:ir.ui.view,arch_db:agreement.agreement_type_search
msgid "Archived"
msgstr "Arquivado"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__company_id
msgid "Company"
msgstr "Compania"
#. module: agreement
#: model_terms:ir.ui.view,arch_db:agreement.agreement_form
msgid "Configuration"
msgstr "Configuração"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__create_uid
#: model:ir.model.fields,field_description:agreement.field_agreement_type__create_uid
msgid "Created by"
msgstr "Criado por"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__create_date
#: model:ir.model.fields,field_description:agreement.field_agreement_type__create_date
msgid "Created on"
msgstr "Criado em"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__display_name
#: model:ir.model.fields,field_description:agreement.field_agreement_type__display_name
msgid "Display Name"
msgstr "Nome exibido"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__end_date
msgid "End Date"
msgstr "Data final"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__id
#: model:ir.model.fields,field_description:agreement.field_agreement_type__id
msgid "ID"
msgstr "ID"
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__code
msgid "ID used for internal contract tracking."
msgstr "ID interno para rastreamento de contrato."
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__active
msgid "If unchecked, it will allow you to hide the agreement without removing it."
msgstr "Se desmarcada, permitirá ocultar o contrato sem removê-lo."
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__is_template
msgid "Is a Template?"
msgstr "É um modelo?"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement____last_update
#: model:ir.model.fields,field_description:agreement.field_agreement_type____last_update
msgid "Last Modified on"
msgstr "Última modificação"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__write_uid
#: model:ir.model.fields,field_description:agreement.field_agreement_type__write_uid
msgid "Last Updated by"
msgstr "Atualizado recentemente por"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__write_date
#: model:ir.model.fields,field_description:agreement.field_agreement_type__write_date
msgid "Last Updated on"
msgstr "Última atualização em"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement_type__name
msgid "Name"
msgstr "Nome"
#. module: agreement
#: model_terms:ir.ui.view,arch_db:agreement.agreement_search
msgid "Name or Number"
msgstr "Nome ou número"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__partner_id
#: model_terms:ir.ui.view,arch_db:agreement.agreement_search
msgid "Partner"
msgstr "Parceiro"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__code
msgid "Reference"
msgstr "Referência"
#. module: agreement
#: model_terms:ir.ui.view,arch_db:agreement.agreement_search
msgid "Search Agreements"
msgstr "Buscar acordos"
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__agreement_type_id
msgid "Select the type of agreement"
msgstr "Selecione o tipo do contrato"
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__is_template
msgid "Set if the agreement is a template. Template agreements don't require a partner."
msgstr ""
"Defina se o contrato é um modelo. Os contratos de modelo não exigem um "
"parceiro."
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__signature_date
#: model_terms:ir.ui.view,arch_db:agreement.agreement_search
msgid "Signature Date"
msgstr "Data de assinatura"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__start_date
msgid "Start Date"
msgstr "Data de início"
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__partner_id
msgid "The customer or vendor this agreement is related to."
msgstr "O cliente ou parceiro ao qual este acordo se refere."
#. module: agreement
#: sql_constraint:agreement:0
msgid "This agreement code already exists for this partner!"
msgstr "Este código de acordo já existe para este parceiro!"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__name
msgid "Title"
msgstr "Título"
#. module: agreement
#: model_terms:ir.ui.view,arch_db:agreement.agreement_type_list_view
msgid "Type Name"
msgstr "Nome do tipo"
#. module: agreement
#: model:res.groups,name:agreement.group_use_agreement_template
msgid "Use agreement template"
msgstr "Usar modelo de acordo"
#. module: agreement
#: model:res.groups,name:agreement.group_use_agreement_type
msgid "Use agreement type"
msgstr "Usar tipo de acordo"
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__end_date
msgid "When the agreement ends."
msgstr "Final do acordo."
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__start_date
msgid "When the agreement starts."
msgstr "Início do acordo."

227
agreement/i18n/pt_PT.po

@ -1,227 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * agreement
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2019-05-04 21:02+0000\n"
"Last-Translator: JC <rdc02271@yahoo.com>\n"
"Language-Team: none\n"
"Language: pt_PT\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 3.5.1\n"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__active
#: model:ir.model.fields,field_description:agreement.field_agreement_type__active
msgid "Active"
msgstr "Activo"
#. module: agreement
#: model:ir.model,name:agreement.model_agreement
#: model_terms:ir.ui.view,arch_db:agreement.agreement_form
msgid "Agreement"
msgstr "Contrato"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__agreement_type_id
#: model_terms:ir.ui.view,arch_db:agreement.agreement_type_form_view
#: model_terms:ir.ui.view,arch_db:agreement.agreement_type_search
#, fuzzy
#| msgid "Agreement"
msgid "Agreement Type"
msgstr "Contrato"
#. module: agreement
#: model:ir.actions.act_window,name:agreement.agreement_type_action
#: model:ir.model,name:agreement.model_agreement_type
#: model:ir.ui.menu,name:agreement.agreement_type_menu
#: model_terms:ir.ui.view,arch_db:agreement.agreement_type_list_view
#, fuzzy
#| msgid "Agreements"
msgid "Agreement Types"
msgstr "Contratos"
#. module: agreement
#: model:ir.actions.act_window,name:agreement.agreement_action
#: model:ir.ui.menu,name:agreement.agreement_menu
#: model_terms:ir.ui.view,arch_db:agreement.agreement_tree
msgid "Agreements"
msgstr "Contratos"
#. module: agreement
#: model_terms:ir.ui.view,arch_db:agreement.agreement_search
#: model_terms:ir.ui.view,arch_db:agreement.agreement_type_search
msgid "Archived"
msgstr "Arquivado"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__company_id
msgid "Company"
msgstr "Empresa"
#. module: agreement
#: model_terms:ir.ui.view,arch_db:agreement.agreement_form
msgid "Configuration"
msgstr "Configuração"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__create_uid
#: model:ir.model.fields,field_description:agreement.field_agreement_type__create_uid
msgid "Created by"
msgstr "Criado por"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__create_date
#: model:ir.model.fields,field_description:agreement.field_agreement_type__create_date
msgid "Created on"
msgstr "Criado em"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__display_name
#: model:ir.model.fields,field_description:agreement.field_agreement_type__display_name
msgid "Display Name"
msgstr "Nome"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__end_date
msgid "End Date"
msgstr "Fim de Contrato"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__id
#: model:ir.model.fields,field_description:agreement.field_agreement_type__id
msgid "ID"
msgstr "Código"
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__code
msgid "ID used for internal contract tracking."
msgstr "Código usado internamente para acompanhamento do contrato."
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__active
msgid ""
"If unchecked, it will allow you to hide the agreement without removing it."
msgstr "Desmarcar se quiser esconder o contrato mas sem o apagar."
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__is_template
msgid "Is a Template?"
msgstr ""
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement____last_update
#: model:ir.model.fields,field_description:agreement.field_agreement_type____last_update
msgid "Last Modified on"
msgstr "Modificado em"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__write_uid
#: model:ir.model.fields,field_description:agreement.field_agreement_type__write_uid
msgid "Last Updated by"
msgstr "Actualizado por"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__write_date
#: model:ir.model.fields,field_description:agreement.field_agreement_type__write_date
msgid "Last Updated on"
msgstr "Actualizado em"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement_type__name
msgid "Name"
msgstr ""
#. module: agreement
#: model_terms:ir.ui.view,arch_db:agreement.agreement_search
msgid "Name or Number"
msgstr "Nome ou número"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__partner_id
#: model_terms:ir.ui.view,arch_db:agreement.agreement_search
msgid "Partner"
msgstr "Parceiro"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__code
msgid "Reference"
msgstr "Referência"
#. module: agreement
#: model_terms:ir.ui.view,arch_db:agreement.agreement_search
msgid "Search Agreements"
msgstr "Pesquisar Contratos"
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__agreement_type_id
msgid "Select the type of agreement"
msgstr ""
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__is_template
msgid ""
"Set if the agreement is a template. Template agreements don't require a "
"partner."
msgstr ""
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__signature_date
#: model_terms:ir.ui.view,arch_db:agreement.agreement_search
msgid "Signature Date"
msgstr "Data da assinatura"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__start_date
msgid "Start Date"
msgstr "Data Inicial"
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__partner_id
msgid "The customer or vendor this agreement is related to."
msgstr "O cliente ou fornecedor com o qual este contrato está relacionado."
#. module: agreement
#: sql_constraint:agreement:0
msgid "This agreement code already exists for this partner!"
msgstr "Este código de contrato já existe para este parceiro!"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__name
msgid "Title"
msgstr "Título"
#. module: agreement
#: model_terms:ir.ui.view,arch_db:agreement.agreement_type_list_view
msgid "Type Name"
msgstr ""
#. module: agreement
#: model:res.groups,name:agreement.group_use_agreement_template
#, fuzzy
#| msgid "When the agreement starts."
msgid "Use agreement template"
msgstr "A data em que se inicia o contrato."
#. module: agreement
#: model:res.groups,name:agreement.group_use_agreement_type
#, fuzzy
#| msgid "When the agreement ends."
msgid "Use agreement type"
msgstr "A data em que termina o contrato."
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__end_date
msgid "When the agreement ends."
msgstr "A data em que termina o contrato."
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__start_date
msgid "When the agreement starts."
msgstr "A data em que se inicia o contrato."

219
agreement/i18n/zh_CN.po

@ -1,219 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * agreement
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2019-10-16 18:31+0000\n"
"Last-Translator: 黎伟杰 <674416404@qq.com>\n"
"Language-Team: none\n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 3.8\n"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__active
#: model:ir.model.fields,field_description:agreement.field_agreement_type__active
msgid "Active"
msgstr "有效"
#. module: agreement
#: model:ir.model,name:agreement.model_agreement
#: model_terms:ir.ui.view,arch_db:agreement.agreement_form
msgid "Agreement"
msgstr "协议"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__agreement_type_id
#: model_terms:ir.ui.view,arch_db:agreement.agreement_type_form_view
#: model_terms:ir.ui.view,arch_db:agreement.agreement_type_search
msgid "Agreement Type"
msgstr "协议类型"
#. module: agreement
#: model:ir.actions.act_window,name:agreement.agreement_type_action
#: model:ir.model,name:agreement.model_agreement_type
#: model:ir.ui.menu,name:agreement.agreement_type_menu
#: model_terms:ir.ui.view,arch_db:agreement.agreement_type_list_view
msgid "Agreement Types"
msgstr "协议类型"
#. module: agreement
#: model:ir.actions.act_window,name:agreement.agreement_action
#: model:ir.ui.menu,name:agreement.agreement_menu
#: model_terms:ir.ui.view,arch_db:agreement.agreement_tree
msgid "Agreements"
msgstr "协议"
#. module: agreement
#: model_terms:ir.ui.view,arch_db:agreement.agreement_search
#: model_terms:ir.ui.view,arch_db:agreement.agreement_type_search
msgid "Archived"
msgstr "已归档"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__company_id
msgid "Company"
msgstr "公司"
#. module: agreement
#: model_terms:ir.ui.view,arch_db:agreement.agreement_form
msgid "Configuration"
msgstr "配置"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__create_uid
#: model:ir.model.fields,field_description:agreement.field_agreement_type__create_uid
msgid "Created by"
msgstr "创建者"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__create_date
#: model:ir.model.fields,field_description:agreement.field_agreement_type__create_date
msgid "Created on"
msgstr "创建时间"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__display_name
#: model:ir.model.fields,field_description:agreement.field_agreement_type__display_name
msgid "Display Name"
msgstr "显示名称"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__end_date
msgid "End Date"
msgstr "结束日期"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__id
#: model:ir.model.fields,field_description:agreement.field_agreement_type__id
msgid "ID"
msgstr "ID"
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__code
msgid "ID used for internal contract tracking."
msgstr "用于内部合同跟踪的ID。"
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__active
msgid ""
"If unchecked, it will allow you to hide the agreement without removing it."
msgstr "如果不选中,它将允许您隐藏协议而不删除它。"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__is_template
msgid "Is a Template?"
msgstr "是模板吗?"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement____last_update
#: model:ir.model.fields,field_description:agreement.field_agreement_type____last_update
msgid "Last Modified on"
msgstr "最后修改时间"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__write_uid
#: model:ir.model.fields,field_description:agreement.field_agreement_type__write_uid
msgid "Last Updated by"
msgstr "最后更新者"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__write_date
#: model:ir.model.fields,field_description:agreement.field_agreement_type__write_date
msgid "Last Updated on"
msgstr "最后更新时间"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement_type__name
msgid "Name"
msgstr "名称"
#. module: agreement
#: model_terms:ir.ui.view,arch_db:agreement.agreement_search
msgid "Name or Number"
msgstr "姓名或号码"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__partner_id
#: model_terms:ir.ui.view,arch_db:agreement.agreement_search
msgid "Partner"
msgstr "业务伙伴"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__code
msgid "Reference"
msgstr "参考"
#. module: agreement
#: model_terms:ir.ui.view,arch_db:agreement.agreement_search
msgid "Search Agreements"
msgstr "搜索协议"
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__agreement_type_id
msgid "Select the type of agreement"
msgstr "选择协议类型"
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__is_template
msgid ""
"Set if the agreement is a template. Template agreements don't require a "
"partner."
msgstr "如果协议是模板,则设置。模板协议不需要合作伙伴。"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__signature_date
#: model_terms:ir.ui.view,arch_db:agreement.agreement_search
msgid "Signature Date"
msgstr "签名日期"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__start_date
msgid "Start Date"
msgstr "开始日期"
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__partner_id
msgid "The customer or vendor this agreement is related to."
msgstr "与本协议相关的客户或供应商。"
#. module: agreement
#: sql_constraint:agreement:0
msgid "This agreement code already exists for this partner!"
msgstr "此合作伙伴的协议代码已存在!"
#. module: agreement
#: model:ir.model.fields,field_description:agreement.field_agreement__name
msgid "Title"
msgstr "标题"
#. module: agreement
#: model_terms:ir.ui.view,arch_db:agreement.agreement_type_list_view
msgid "Type Name"
msgstr "类型名称"
#. module: agreement
#: model:res.groups,name:agreement.group_use_agreement_template
msgid "Use agreement template"
msgstr "使用协议模板"
#. module: agreement
#: model:res.groups,name:agreement.group_use_agreement_type
msgid "Use agreement type"
msgstr "使用协议类型"
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__end_date
msgid "When the agreement ends."
msgstr "协议结束时。"
#. module: agreement
#: model:ir.model.fields,help:agreement.field_agreement__start_date
msgid "When the agreement starts."
msgstr "协议开始时。"

2
agreement/models/__init__.py

@ -1,2 +0,0 @@
from . import agreement
from . import agreement_type

50
agreement/models/agreement.py

@ -1,50 +0,0 @@
# © 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import models, fields
class Agreement(models.Model):
_name = 'agreement'
_description = 'Agreement'
code = fields.Char(required=True, copy=False)
name = fields.Char(required=True)
partner_id = fields.Many2one(
'res.partner', string='Partner', ondelete='restrict',
domain=[('parent_id', '=', False)])
company_id = fields.Many2one(
'res.company', string='Company',
default=lambda self: self.env['res.company']._company_default_get())
is_template = fields.Boolean(
string="Is a Template?",
default=False,
copy=False,
help="Set if the agreement is a template. "
"Template agreements don't require a partner."
)
agreement_type_id = fields.Many2one(
'agreement.type',
string="Agreement Type",
help="Select the type of agreement",
)
active = fields.Boolean(default=True)
signature_date = fields.Date()
start_date = fields.Date()
end_date = fields.Date()
def name_get(self):
res = []
for agr in self:
name = agr.name
if agr.code:
name = '[%s] %s' % (agr.code, agr.name)
res.append((agr.id, name))
return res
_sql_constraints = [(
'code_partner_company_unique',
'unique(code, partner_id, company_id)',
'This agreement code already exists for this partner!'
)]

12
agreement/models/agreement_type.py

@ -1,12 +0,0 @@
# Copyright (C) 2018 - TODAY, Pavlov Media
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import fields, models
class AgreementType(models.Model):
_name = "agreement.type"
_description = "Agreement Types"
name = fields.Char(string="Name", required=True)
active = fields.Boolean(default=True)

3
agreement/readme/CONTRIBUTORS.rst

@ -1,3 +0,0 @@
* Alexis de Lattre <alexis.delattre@akretion.com>
* Yves Goldberg <yves@ygol.com>
* Alexandre Fayolle <alexandre.fayolle@camptocamp.com>

14
agreement/readme/DESCRIPTION.rst

@ -1,14 +0,0 @@
This module adds an *Agreement* object with the following properties:
* code,
* name,
* link to a partner,
* signature date.
* start date.
* end date.
Optionally, you can also enable using:
* agreement types
* a flag to set an agreement as a template agreement
(Install agreement_sale to get the configuration settings for these).

26
agreement/security/agreement_security.xml

@ -1,26 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
© 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo noupdate="1">
<record id="agreement_rule" model="ir.rule">
<field name="name">Agreement multi-company</field>
<field name="model_id" ref="model_agreement"/>
<field name="domain_force">['|', ('company_id', '=', False), ('company_id', 'child_of', [user.company_id.id])]</field>
</record>
<record id="group_use_agreement_type" model="res.groups">
<field name="name">Use agreement type</field>
<field name="category_id" ref="base.module_category_hidden"/>
</record>
<record id="group_use_agreement_template" model="res.groups">
<field name="name">Use agreement template</field>
<field name="category_id" ref="base.module_category_hidden"/>
</record>
</odoo>

3
agreement/security/ir.model.access.csv

@ -1,3 +0,0 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_agreement_read,Read access on agreement to Employees,model_agreement,base.group_user,1,0,0,0
access_agreement_full,Full access on agreement grp,model_agreement,base.group_no_one,1,1,1,1

BIN
agreement/static/description/icon.png

Before

Width: 128  |  Height: 128  |  Size: 9.2 KiB

436
agreement/static/description/index.html

@ -1,436 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
<title>Agreement</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: grey; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="agreement">
<h1 class="title">Agreement</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/contract/tree/12.0/agreement"><img alt="OCA/contract" src="https://img.shields.io/badge/github-OCA%2Fcontract-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/contract-12-0/contract-12-0-agreement"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/110/12.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
<p>This module adds an <em>Agreement</em> object with the following properties:</p>
<ul class="simple">
<li>code,</li>
<li>name,</li>
<li>link to a partner,</li>
<li>signature date.</li>
<li>start date.</li>
<li>end date.</li>
</ul>
<p>Optionally, you can also enable using:
* agreement types
* a flag to set an agreement as a template agreement</p>
<p>(Install agreement_sale to get the configuration settings for these).</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#bug-tracker" id="id1">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id2">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id3">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id4">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="id5">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#id1">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/contract/issues">GitHub Issues</a>.
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
<a class="reference external" href="https://github.com/OCA/contract/issues/new?body=module:%20agreement%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#id2">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#id3">Authors</a></h2>
<ul class="simple">
<li>Akretion</li>
<li>Yves Goldberg (Ygol Internetwork)</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#id4">Contributors</a></h2>
<ul class="simple">
<li>Alexis de Lattre &lt;<a class="reference external" href="mailto:alexis.delattre&#64;akretion.com">alexis.delattre&#64;akretion.com</a>&gt;</li>
<li>Yves Goldberg &lt;<a class="reference external" href="mailto:yves&#64;ygol.com">yves&#64;ygol.com</a>&gt;</li>
<li>Alexandre Fayolle &lt;<a class="reference external" href="mailto:alexandre.fayolle&#64;camptocamp.com">alexandre.fayolle&#64;camptocamp.com</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#id5">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>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.</p>
<p>Current <a class="reference external" href="https://odoo-community.org/page/maintainer-role">maintainers</a>:</p>
<p><a class="reference external" href="https://github.com/ygol"><img alt="ygol" src="https://github.com/ygol.png?size=40px" /></a> <a class="reference external" href="https://github.com/alexis-via"><img alt="alexis-via" src="https://github.com/alexis-via.png?size=40px" /></a></p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/contract/tree/12.0/agreement">OCA/contract</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

90
agreement/views/agreement.xml

@ -1,90 +0,0 @@
<?xml version="1.0"?>
<!--
© 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="agreement_form" model="ir.ui.view">
<field name="name">agreement.form</field>
<field name="model">agreement</field>
<field name="arch" type="xml">
<form string="Agreement">
<div class="oe_button_box" name="button_box">
<button name="toggle_active" type="object"
class="oe_stat_button" icon="fa-archive">
<field name="active" widget="boolean_button"
options='{"terminology": "archive"}'/>
</button>
</div>
<group name="main">
<group name="left">
<field name="agreement_type_id"
groups="agreement.group_use_agreement_type"/>
<field name="is_template" groups="agreement.group_use_agreement_template"/>
<field name="partner_id"
attrs="{'required': [('is_template', '=', False)]}"/>
<field name="name"/>
<field name="signature_date"/>
</group>
<group name="right">
<field name="start_date"/>
<field name="end_date"/>
<field name="code"/>
<field name="company_id" groups="base.group_multi_company"/>
</group>
</group>
<notebook>
<page name="config" string="Configuration" attrs="{'invisible': True}"/>
</notebook>
</form>
</field>
</record>
<record id="agreement_tree" model="ir.ui.view">
<field name="name">agreement.tree</field>
<field name="model">agreement</field>
<field name="arch" type="xml">
<tree string="Agreements">
<field name="partner_id"/>
<field name="code"/>
<field name="name"/>
<field name="signature_date"/>
<field name="start_date"/>
<field name="end_date"/>
<field name="company_id" groups="base.group_multi_company"/>
</tree>
</field>
</record>
<record id="agreement_search" model="ir.ui.view">
<field name="name">agreement.search</field>
<field name="model">agreement</field>
<field name="arch" type="xml">
<search string="Search Agreements">
<field name="name" filter_domain="['|', ('name', 'ilike', self), ('code', 'ilike', self)]" string="Name or Number"/>
<field name="partner_id"/>
<separator/>
<filter name="inactive" string="Archived" domain="[('active', '=', False)]"/>
<group name="groupby">
<filter name="partner_groupby" string="Partner"
context="{'group_by': 'partner_id'}"/>
<filter name="signature_date_groupby" string="Signature Date"
context="{'group_by': 'signature_date'}"/>
</group>
</search>
</field>
</record>
<record id="agreement_action" model="ir.actions.act_window">
<field name="name">Agreements</field>
<field name="res_model">agreement</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem id="agreement_menu" action="agreement_action"
sequence="100"/>
</odoo>

54
agreement/views/agreement_type.xml

@ -1,54 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Agreement Type List View-->
<record model="ir.ui.view" id="agreement_type_list_view">
<field name="name">Agreement Type List</field>
<field name="model">agreement.type</field>
<field name="arch" type="xml">
<tree string="Agreement Types" default_order="name">
<field name="name" string="Type Name"/>
</tree>
</field>
</record>
<!-- Agreement Type Form View -->
<record model="ir.ui.view" id="agreement_type_form_view">
<field name="name">Agreement Type Form</field>
<field name="model">agreement.type</field>
<field name="arch" type="xml">
<form string="Agreement Type">
<div class="oe_button_box" name="button_box">
<button name="toggle_active" type="object"
class="oe_stat_button" icon="fa-archive">
<field name="active" widget="boolean_button"
options='{"terminology": "archive"}'/>
</button>
</div>
<sheet>
<div class="oe_title">
<label for="name" class="oe_edit_only"/>
<h1><field name="name"/></h1>
</div>
</sheet>
</form>
</field>
</record>
<record id="agreement_type_search" model="ir.ui.view">
<field name="name">agreement.type.search</field>
<field name="model">agreement.type</field>
<field name="arch" type="xml">
<search string="Agreement Type">
<field name="name"/>
<filter name="archived" string="Archived" domain="[('active', '=', False)]"/>
</search>
</field>
</record>
<!-- Actions opening views on models -->
<record model="ir.actions.act_window" id="agreement_type_action">
<field name="name">Agreement Types</field>
<field name="res_model">agreement.type</field>
<field name="view_mode">tree,form</field>
</record>
</odoo>

142
agreement_legal/README.rst

@ -1,142 +0,0 @@
================
Agreements Legal
================
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! 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-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fcontract-lightgray.png?logo=github
:target: https://github.com/OCA/contract/tree/12.0/agreement_legal
:alt: OCA/contract
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/contract-12-0/contract-12-0-agreement_legal
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
:target: https://runbot.odoo-community.org/runbot/110/12.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
This module allows you to manage agreements, letter of intent and contract content.
The module is meant to be used by the legal team of a company and to allow them
to define sections, clauses and templates with their respective content that can
be dynamic.
Based on the template, an agreement can be created and the pdf document generated.
The agreement would go through a workflow to finally become a contract with the
customer signature.
**Table of contents**
.. contents::
:local:
Configuration
=============
To configure this module:
* Go to Agreement > Configuration > Templates
* Create a new template with sections and clauses and their respective content
* Go to Agreement > Configuration > Stages
* Create and reorder stages to match your process
Usage
=====
To use this module:
* Go to Agreement > Agreements
* Create a new agreement
* Select a template
* Follow the process to get the required approval
* Send the invitation to the customer to review and sign the agreement
* Define Field using widget domain but having partial_use option true:
* For Ex:
* <field name="field_domain" widget="domain" nolabel="1"
* options="{'model': 'agreement.recital',
* 'partial_use': True}"/>
Known issues / Roadmap
======================
* Split the module to remove the dependencies on sale and account and provide
the same feature in extra modules (agreement_sale, agreement_account,
agreement_purchase)
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/contract/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 <https://github.com/OCA/contract/issues/new?body=module:%20agreement_legal%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* Pavlov Media
* Open Source Integrators
* Yves Goldberg (Ygol Internetwork)
Contributors
~~~~~~~~~~~~
* Patrick Wilson <pwilson@pavlovmedia.com>
* Bhavesh Odedra <bodedra@opensourceintegrators.com>
* Wolfgang Hall <whall@opensourceintegrators.com>
* Maxime Chambreuil <mchambreuil@opensourceintegrators.com>
* Sandip Mangukiya <smangukiya@opensourceintegrators.com>
* Yves Goldberg <yves@ygol.com>
Other credits
~~~~~~~~~~~~~
The development of this module has been financially supported by:
* Pavlov Media
* Open Source Integrators
* Yves Goldberg
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-max3903| image:: https://github.com/max3903.png?size=40px
:target: https://github.com/max3903
:alt: max3903
.. |maintainer-ygol| image:: https://github.com/ygol.png?size=40px
:target: https://github.com/ygol
:alt: ygol
Current `maintainers <https://odoo-community.org/page/maintainer-role>`__:
|maintainer-max3903| |maintainer-ygol|
This module is part of the `OCA/contract <https://github.com/OCA/contract/tree/12.0/agreement_legal>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

12
agreement_legal/__init__.py

@ -1,12 +0,0 @@
# Copyright (C) 2018 - TODAY, Pavlov Media
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, SUPERUSER_ID
from . import models
def post_init_agreement_legal(cr, registry):
env = api.Environment(cr, SUPERUSER_ID, dict())
cr.execute('UPDATE agreement SET stage_id = %s WHERE stage_id IS NULL;',
(env.ref('agreement_legal.agreement_stage_new').id,))
return True

51
agreement_legal/__manifest__.py

@ -1,51 +0,0 @@
# Copyright (C) 2018 - TODAY, Pavlov Media
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
"name": "Agreements Legal",
"summary": "Manage Agreements, LOI and Contracts",
"author": "Pavlov Media, "
"Open Source Integrators, "
"Yves Goldberg (Ygol Internetwork), "
"Odoo Community Association (OCA)",
"website": "https://github.com/OCA/contract",
"category": "Partner",
"license": "AGPL-3",
"version": "12.0.1.1.1",
"depends": ["contacts", "agreement", "product"],
"data": [
"data/ir_sequence.xml",
"data/module_category.xml",
"data/agreement_stage.xml",
"data/agreement_type.xml",
"security/res_groups.xml",
"security/ir.model.access.csv",
"report/agreement.xml",
"views/res_config_settings.xml",
"views/agreement_appendix.xml",
"views/agreement_clause.xml",
"views/agreement_recital.xml",
"views/agreement_section.xml",
"views/agreement_stages.xml",
"views/agreement_type.xml",
"views/agreement_subtype.xml",
"views/agreement_renewaltype.xml",
"views/agreement_increasetype.xml",
"views/res_partner.xml",
"views/agreement.xml",
"views/menu.xml",
],
"demo": [
"demo/demo.xml"
],
'qweb': [
"static/src/xml/domain_widget_view.xml"
],
"post_init_hook": "post_init_agreement_legal",
"application": True,
"development_status": "Beta",
"maintainers": [
"max3903",
"ygol"
],
}

58
agreement_legal/data/agreement_stage.xml

@ -1,58 +0,0 @@
<?xml version="1.0"?>
<odoo>
<record id="agreement_stage_new" model="agreement.stage">
<field name="name">New</field>
<field name="sequence">10</field>
<field name="stage_type">agreement</field>
</record>
<record id="agreement_stage_draft" model="agreement.stage">
<field name="name">Draft</field>
<field name="sequence">20</field>
<field name="stage_type">agreement</field>
</record>
<record id="agreement_stage_reviewed" model="agreement.stage">
<field name="name">Reviewed</field>
<field name="sequence">30</field>
<field name="stage_type">agreement</field>
</record>
<record id="agreement_stage_negotiation" model="agreement.stage">
<field name="name">Negotiation</field>
<field name="sequence">40</field>
<field name="stage_type">agreement</field>
</record>
<record id="agreement_stage_out" model="agreement.stage">
<field name="name">Out for Customer Signature</field>
<field name="sequence">50</field>
<field name="stage_type">agreement</field>
</record>
<record id="agreement_stage_internal" model="agreement.stage">
<field name="name">Waiting Internal Signature</field>
<field name="sequence">60</field>
<field name="stage_type">agreement</field>
</record>
<record id="agreement_stage_active" model="agreement.stage">
<field name="name">Active</field>
<field name="sequence">70</field>
<field name="stage_type">agreement</field>
</record>
<record id="agreement_stage_expired" model="agreement.stage">
<field name="name">Expired</field>
<field name="sequence">80</field>
<field name="stage_type">agreement</field>
</record>
<record id="agreement_stage_cancelled" model="agreement.stage">
<field name="name">Cancelled</field>
<field name="sequence">100</field>
<field name="fold">True</field>
<field name="stage_type">agreement</field>
</record>
</odoo>

16
agreement_legal/data/agreement_type.xml

@ -1,16 +0,0 @@
<?xml version="1.0"?>
<odoo>
<record id="agreement_type_agreement" model="agreement.type">
<field name="name">Agreement</field>
</record>
<record id="agreement_type_contract" model="agreement.type">
<field name="name">Contract</field>
</record>
<record id="agreement_type_loi" model="agreement.type">
<field name="name">Letter of Intent</field>
</record>
</odoo>

13
agreement_legal/data/ir_sequence.xml

@ -1,13 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo noupdate="1">
<!-- Sequence for agreement -->
<record id="seq_agreement" model="ir.sequence">
<field name="name">Agreements</field>
<field name="code">agreement</field>
<field name="prefix">AG</field>
<field name="padding">3</field>
<field name="company_id" eval="False"/>
</record>
</odoo>

9
agreement_legal/data/module_category.xml

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="agreement" model="ir.module.category">
<field name="name">Agreement</field>
<field name="sequence">80</field>
</record>
</odoo>

40
agreement_legal/demo/demo.xml

@ -1,40 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
© 2019 Ygol Internetwork (yves@ygol.com)
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo noupdate="1">
<record id="agreement.market1" model="agreement">
<field name="description">Hardware IT (C2C-IT0042)</field>
<field name="agreement_type_id" ref="agreement_type_agreement"/>
</record>
<record id="agreement.market2" model="agreement">
<field name="description">Fiber access office Lausanne (C2C-IT0043)</field>
<field name="agreement_type_id" ref="agreement_type_contract"/>
</record>
<record id="agreement.market3" model="agreement">
<field name="description">Vétérinaire (AGR-VETO001)</field>
<field name="agreement_type_id" ref="agreement_type_loi"/>
</record>
<record id="agreement.market4" model="agreement">
<field name="description">Wazo IPBX deployment and maintenance (AGR-TEL001)</field>
<field name="agreement_type_id" ref="agreement_type_loi"/>
</record>
<record id="agreement.market5" model="agreement">
<field name="description">SIP Phones supply (BUY-VOIP012)</field>
<field name="agreement_type_id" ref="agreement_type_agreement"/>
</record>
<record id="agreement.market6" model="agreement">
<field name="is_template">True</field>
<field name="description">SIP-ISDN gateways (BUY-VOIP013)</field>
<field name="agreement_type_id" ref="agreement_legal.agreement_type_contract"/>
</record>
</odoo>

1697
agreement_legal/i18n/agreement_legal.pot
File diff suppressed because it is too large
View File

1983
agreement_legal/i18n/fr.po
File diff suppressed because it is too large
View File

1710
agreement_legal/i18n/pt_BR.po
File diff suppressed because it is too large
View File

1730
agreement_legal/i18n/pt_PT.po
File diff suppressed because it is too large
View File

1740
agreement_legal/i18n/zh_CN.po
File diff suppressed because it is too large
View File

18
agreement_legal/models/__init__.py

@ -1,18 +0,0 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from . import (
res_config_settings,
agreement_stage,
agreement,
agreement_appendix,
agreement_clause,
agreement_line,
agreement_recital,
agreement_section,
agreement_type,
agreement_subtype,
res_partner,
product_template,
agreement_renewaltype,
agreement_increasetype,
)

371
agreement_legal/models/agreement.py

@ -1,371 +0,0 @@
# Copyright (C) 2018 - TODAY, Pavlov Media
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import _, api, fields, models
class Agreement(models.Model):
_name = "agreement"
_inherit = ["agreement", "mail.thread"]
# General
name = fields.Char(string="Title", required=True)
version = fields.Integer(
string="Version",
default=1,
copy=False,
help="The versions are used to keep track of document history and "
"previous versions can be referenced.")
revision = fields.Integer(
string="Revision",
default=0,
copy=False,
help="The revision will increase with every save event.")
description = fields.Text(
string="Description",
track_visibility="onchange",
help="Description of the agreement")
dynamic_description = fields.Text(
compute="_compute_dynamic_description",
string="Dynamic Description",
help="Compute dynamic description")
start_date = fields.Date(
string="Start Date",
track_visibility="onchange",
help="When the agreement starts.")
end_date = fields.Date(
string="End Date",
track_visibility="onchange",
help="When the agreement ends.")
color = fields.Integer(string="Color")
active = fields.Boolean(
string="Active",
default=True,
help="If unchecked, it will allow you to hide the agreement without "
"removing it.")
company_signed_date = fields.Date(
string="Signed on",
track_visibility="onchange",
help="Date the contract was signed by Company.")
partner_signed_date = fields.Date(
string="Signed on (Partner)",
track_visibility="onchange",
help="Date the contract was signed by the Partner.")
term = fields.Integer(
string="Term (Months)",
track_visibility="onchange",
help="Number of months this agreement/contract is in effect with the "
"partner.")
expiration_notice = fields.Integer(
string="Exp. Notice (Days)",
track_visibility="onchange",
help="Number of Days before expiration to be notified.")
change_notice = fields.Integer(
string="Change Notice (Days)",
track_visibility="onchange",
help="Number of Days to be notified before changes.")
special_terms = fields.Text(
string="Special Terms",
track_visibility="onchange",
help="Any terms that you have agreed to and want to track on the "
"agreement/contract.")
dynamic_special_terms = fields.Text(
compute="_compute_dynamic_special_terms",
string="Dynamic Special Terms",
help="Compute dynamic special terms")
code = fields.Char(
string="Reference",
required=True,
default=lambda self: _("New"),
track_visibility="onchange",
copy=False,
help="ID used for internal contract tracking.")
increase_type_id = fields.Many2one(
"agreement.increasetype",
string="Increase Type",
track_visibility="onchange",
help="The amount that certain rates may increase.")
termination_requested = fields.Date(
string="Termination Requested Date",
track_visibility="onchange",
help="Date that a request for termination was received.")
termination_date = fields.Date(
string="Termination Date",
track_visibility="onchange",
help="Date that the contract was terminated.")
reviewed_date = fields.Date(
string="Reviewed Date", track_visibility="onchange")
reviewed_user_id = fields.Many2one(
"res.users", string="Reviewed By", track_visibility="onchange")
approved_date = fields.Date(
string="Approved Date", track_visibility="onchange")
approved_user_id = fields.Many2one(
"res.users", string="Approved By", track_visibility="onchange")
currency_id = fields.Many2one("res.currency", string="Currency")
partner_id = fields.Many2one(
"res.partner",
string="Partner",
required=False,
copy=True,
help="The customer or vendor this agreement is related to.")
partner_contact_id = fields.Many2one(
"res.partner",
string="Partner Contact",
copy=True,
help="The primary partner contact (If Applicable).")
partner_contact_phone = fields.Char(
related="partner_contact_id.phone", string="Partner Phone")
partner_contact_email = fields.Char(
related="partner_contact_id.email", string="Partner Email")
company_contact_id = fields.Many2one(
"res.partner",
string="Company Contact",
copy=True,
help="The primary contact in the company.")
company_contact_phone = fields.Char(
related="company_contact_id.phone", string="Phone")
company_contact_email = fields.Char(
related="company_contact_id.email", string="Email")
use_parties_content = fields.Boolean(
string="Use parties content",
help="Use custom content for parties")
def _get_default_parties(self):
deftext = """
<h3>Company Information</h3>
<p>
${object.company_id.partner_id.name or ''}.<br>
${object.company_id.partner_id.street or ''} <br>
${object.company_id.partner_id.state_id.code or ''}
${object.company_id.partner_id.zip or ''}
${object.company_id.partner_id.city or ''}<br>
${object.company_id.partner_id.country_id.name or ''}.<br><br>
Represented by <b>${object.company_contact_id.name or ''}.</b>
</p>
<p></p>
<h3>Partner Information</h3>
<p>
${object.partner_id.name or ''}.<br>
${object.partner_id.street or ''} <br>
${object.partner_id.state_id.code or ''}
${object.partner_id.zip or ''} ${object.partner_id.city or ''}<br>
${object.partner_id.country_id.name or ''}.<br><br>
Represented by <b>${object.partner_contact_id.name or ''}.</b>
</p>
"""
return deftext
parties = fields.Html(
string="Parties",
track_visibility="onchange",
default=_get_default_parties,
help="Parties of the agreement")
dynamic_parties = fields.Html(
compute="_compute_dynamic_parties",
string="Dynamic Parties",
help="Compute dynamic parties")
agreement_type_id = fields.Many2one(
track_visibility="onchange",
)
agreement_subtype_id = fields.Many2one(
"agreement.subtype",
string="Agreement Sub-type",
track_visibility="onchange",
help="Select the sub-type of this agreement. Sub-Types are related to "
"agreement types.")
product_ids = fields.Many2many(
"product.template", string="Products & Services")
assigned_user_id = fields.Many2one(
"res.users",
string="Assigned To",
track_visibility="onchange",
help="Select the user who manages this agreement.")
company_signed_user_id = fields.Many2one(
"res.users",
string="Signed By",
track_visibility="onchange",
help="The user at our company who authorized/signed the agreement or "
"contract.")
partner_signed_user_id = fields.Many2one(
"res.partner",
string="Signed By (Partner)",
track_visibility="onchange",
help="Contact on the account that signed the agreement/contract.")
parent_agreement_id = fields.Many2one(
"agreement",
string="Parent Agreement",
help="Link this agreement to a parent agreement. For example if this "
"agreement is an amendment to another agreement. This list will "
"only show other agreements related to the same account.")
renewal_type_id = fields.Many2one(
"agreement.renewaltype",
string="Renewal Type",
track_visibility="onchange",
help="Describes what happens after the contract expires.")
recital_ids = fields.One2many(
"agreement.recital", "agreement_id", string="Recitals", copy=True)
sections_ids = fields.One2many(
"agreement.section", "agreement_id", string="Sections", copy=True)
clauses_ids = fields.One2many(
"agreement.clause", "agreement_id", string="Clauses")
appendix_ids = fields.One2many(
"agreement.appendix", "agreement_id", string="Appendices", copy=True)
previous_version_agreements_ids = fields.One2many(
"agreement",
"parent_agreement_id",
string="Previous Versions",
copy=False,
domain=[("active", "=", False)])
child_agreements_ids = fields.One2many(
"agreement",
"parent_agreement_id",
string="Child Agreements",
copy=False,
domain=[("active", "=", True)])
line_ids = fields.One2many(
"agreement.line",
"agreement_id",
string="Products/Services",
copy=False)
state = fields.Selection(
[("draft", "Draft"), ("active", "Active"), ("inactive", "Inactive")],
default="draft",
track_visibility="always")
notification_address_id = fields.Many2one(
"res.partner",
string="Notification Address",
help="The address to send notificaitons to, if different from "
"customer address.(Address Type = Other)")
signed_contract_filename = fields.Char(string="Filename")
signed_contract = fields.Binary(
string="Signed Document", track_visibility="always")
# Dynamic field editor
field_domain = fields.Char(string='Field Expression',
default='[["active", "=", True]]')
default_value = fields.Char(
string="Default Value",
help="Optional value to use if the target field is empty.")
copyvalue = fields.Char(
string="Placeholder Expression",
help="""Final placeholder expression, to be copy-pasted in the desired
template field.""")
@api.onchange("field_domain", "default_value")
def onchange_copyvalue(self):
self.copyvalue = False
if self.field_domain:
string_list = self.field_domain.split(",")
if string_list:
field_domain = string_list[0][3:-1]
self.copyvalue = "${{object.{} or {}}}".format(
field_domain,
self.default_value or "''")
# compute the dynamic content for mako expression
@api.multi
def _compute_dynamic_description(self):
MailTemplates = self.env["mail.template"]
for agreement in self:
lang = agreement.partner_id.lang or "en_US"
description = MailTemplates.with_context(
lang=lang
)._render_template(
agreement.description, "agreement", agreement.id
)
agreement.dynamic_description = description
@api.multi
def _compute_dynamic_parties(self):
MailTemplates = self.env["mail.template"]
for agreement in self:
lang = agreement.partner_id.lang or "en_US"
parties = MailTemplates.with_context(
lang=lang
)._render_template(
agreement.parties, "agreement", agreement.id
)
agreement.dynamic_parties = parties
@api.multi
def _compute_dynamic_special_terms(self):
MailTemplates = self.env["mail.template"]
for agreement in self:
lang = agreement.partner_id.lang or "en_US"
special_terms = MailTemplates.with_context(
lang=lang
)._render_template(
agreement.special_terms, "agreement", agreement.id
)
agreement.dynamic_special_terms = special_terms
# Used for Kanban grouped_by view
@api.model
def _read_group_stage_ids(self, stages, domain, order):
stage_ids = self.env["agreement.stage"].search(
[('stage_type', '=', 'agreement')])
return stage_ids
stage_id = fields.Many2one(
"agreement.stage",
string="Stage",
group_expand="_read_group_stage_ids",
help="Select the current stage of the agreement.",
track_visibility="onchange",
index=True)
# Create New Version Button
@api.multi
def create_new_version(self, vals):
for rec in self:
if not rec.state == "draft":
# Make sure status is draft
rec.state = "draft"
default_vals = {
"name": "{} - OLD VERSION".format(rec.name),
"active": False,
"parent_agreement_id": rec.id,
}
# Make a current copy and mark it as old
rec.copy(default=default_vals)
# Increment the Version
rec.version = rec.version + 1
# Reset revision to 0 since it's a new version
vals["revision"] = 0
return super(Agreement, self).write(vals)
def create_new_agreement(self):
default_vals = {
"name": "NEW",
"active": True,
"version": 1,
"revision": 0,
"state": "draft",
"stage_id": self.env.ref("agreement_legal.agreement_stage_new").id,
}
res = self.copy(default=default_vals)
res.sections_ids.clauses_ids.write({'agreement_id': res.id})
return {
"res_model": "agreement",
"type": "ir.actions.act_window",
"view_mode": "form",
"view_type": "form",
"res_id": res.id,
}
@api.model
def create(self, vals):
if vals.get("code", _("New")) == _("New"):
vals["code"] = self.env["ir.sequence"].next_by_code(
"agreement"
) or _("New")
if not vals.get('stage_id'):
vals["stage_id"] = \
self.env.ref("agreement_legal.agreement_stage_new").id
return super(Agreement, self).create(vals)
# Increments the revision on each save action
@api.multi
def write(self, vals):
vals["revision"] = self.revision + 1
return super(Agreement, self).write(vals)

73
agreement_legal/models/agreement_appendix.py

@ -1,73 +0,0 @@
# Copyright (C) 2018 - TODAY, Pavlov Media
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, fields, models
class AgreementAppendix(models.Model):
_name = "agreement.appendix"
_description = "Agreement Appendices"
_order = "sequence"
name = fields.Char(string="Name", required=True)
title = fields.Char(
string="Title",
required=True,
help="The title is displayed on the PDF." "The name is not.",
)
sequence = fields.Integer(
string="Sequence",
default=10)
content = fields.Html(string="Content")
dynamic_content = fields.Html(
compute="_compute_dynamic_content",
string="Dynamic Content",
help="compute dynamic Content",
)
agreement_id = fields.Many2one(
"agreement",
string="Agreement",
ondelete="cascade")
active = fields.Boolean(
string="Active",
default=True,
help="If unchecked, it will allow you to hide this appendix without "
"removing it.",
)
# Dynamic field editor
field_domain = fields.Char(string='Field Expression',
default='[["active", "=", True]]')
default_value = fields.Char(
string="Default Value",
help="Optional value to use if the target field is empty.")
copyvalue = fields.Char(
string="Placeholder Expression",
help="""Final placeholder expression, to be copy-pasted in the desired
template field.""")
@api.onchange("field_domain", "default_value")
def onchange_copyvalue(self):
self.copyvalue = False
if self.field_domain:
string_list = self.field_domain.split(",")
if string_list:
field_domain = string_list[0][3:-1]
self.copyvalue = "${{object.{} or {}}}".format(
field_domain,
self.default_value or "''")
# compute the dynamic content for mako expression
@api.multi
def _compute_dynamic_content(self):
MailTemplates = self.env["mail.template"]
for appendix in self:
lang = (
appendix.agreement_id
and appendix.agreement_id.partner_id.lang
or "en_US"
)
content = MailTemplates.with_context(lang=lang)._render_template(
appendix.content, "agreement.appendix", appendix.id
)
appendix.dynamic_content = content

71
agreement_legal/models/agreement_clause.py

@ -1,71 +0,0 @@
# Copyright (C) 2018 - TODAY, Pavlov Media
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, fields, models
class AgreementClause(models.Model):
_name = "agreement.clause"
_description = "Agreement Clauses"
_order = "sequence"
name = fields.Char(string="Name", required=True)
title = fields.Char(
string="Title",
help="The title is displayed on the PDF." "The name is not.")
sequence = fields.Integer(string="Sequence")
agreement_id = fields.Many2one(
"agreement",
string="Agreement",
ondelete="cascade")
section_id = fields.Many2one(
"agreement.section",
string="Section",
ondelete="cascade")
content = fields.Html(string="Clause Content")
dynamic_content = fields.Html(
compute="_compute_dynamic_content",
string="Dynamic Content",
help="compute dynamic Content")
active = fields.Boolean(
string="Active",
default=True,
help="If unchecked, it will allow you to hide the agreement without "
"removing it.")
# Dynamic field editor
field_domain = fields.Char(string='Field Expression',
default='[["active", "=", True]]')
default_value = fields.Char(
string="Default Value",
help="Optional value to use if the target field is empty.")
copyvalue = fields.Char(
string="Placeholder Expression",
help="""Final placeholder expression, to be copy-pasted in the desired
template field.""")
@api.onchange("field_domain", "default_value")
def onchange_copyvalue(self):
self.copyvalue = False
if self.field_domain:
string_list = self.field_domain.split(",")
if string_list:
field_domain = string_list[0][3:-1]
self.copyvalue = "${{object.{} or {}}}".format(
field_domain,
self.default_value or "''")
# compute the dynamic content for mako expression
@api.multi
def _compute_dynamic_content(self):
MailTemplates = self.env["mail.template"]
for clause in self:
lang = (
clause.agreement_id
and clause.agreement_id.partner_id.lang
or "en_US"
)
content = MailTemplates.with_context(lang=lang)._render_template(
clause.content, "agreement.clause", clause.id
)
clause.dynamic_content = content

27
agreement_legal/models/agreement_increasetype.py

@ -1,27 +0,0 @@
# Copyright (C) 2018 - TODAY, Pavlov Media
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import fields, models
# Main Agreement Increase Type Records Model
class AgreementIncreaseType(models.Model):
_name = "agreement.increasetype"
_description = "Agreement Increase Type"
# General
name = fields.Char(
string="Title",
required=True,
help="Increase types describe any increases that may happen during "
"the contract.",
)
description = fields.Text(
string="Description",
required=True,
help="Description of the renewal type."
)
increase_percent = fields.Integer(
string="Increase Percentage",
help="Percentage that the amount will increase."
)

30
agreement_legal/models/agreement_line.py

@ -1,30 +0,0 @@
# Copyright (C) 2018 - TODAY, Pavlov Media
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, fields, models
class AgreementLine(models.Model):
_name = "agreement.line"
_description = "Agreement Lines"
product_id = fields.Many2one(
"product.product",
string="Product")
name = fields.Char(
string="Description",
required=True)
agreement_id = fields.Many2one(
"agreement",
string="Agreement",
ondelete="cascade")
qty = fields.Float(string="Quantity")
uom_id = fields.Many2one(
"uom.uom",
string="Unit of Measure",
required=True)
@api.onchange("product_id")
def _onchange_product_id(self):
self.name = self.product_id.name
self.uom_id = self.product_id.uom_id.id

63
agreement_legal/models/agreement_recital.py

@ -1,63 +0,0 @@
# Copyright (C) 2018 - TODAY, Pavlov Media
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, fields, models
class AgreementRecital(models.Model):
_name = "agreement.recital"
_description = "Agreement Recitals"
_order = "sequence"
name = fields.Char(string="Name", required=True)
title = fields.Char(
string="Title",
help="The title is displayed on the PDF." "The name is not.")
sequence = fields.Integer(string="Sequence", default=10)
content = fields.Html(string="Content")
dynamic_content = fields.Html(
compute="_compute_dynamic_content",
string="Dynamic Content",
help="compute dynamic Content")
agreement_id = fields.Many2one(
"agreement", string="Agreement", ondelete="cascade")
active = fields.Boolean(
string="Active",
default=True,
help="If unchecked, it will allow you to hide this recital without "
"removing it.")
# Dynamic field editor
field_domain = fields.Char(string='Field Expression',
default='[["active", "=", True]]')
default_value = fields.Char(
string="Default Value",
help="Optional value to use if the target field is empty.")
copyvalue = fields.Char(
string="Placeholder Expression",
help="""Final placeholder expression, to be copy-pasted in the desired
template field.""")
@api.onchange("field_domain", "default_value")
def onchange_copyvalue(self):
self.copyvalue = False
if self.field_domain:
string_list = self.field_domain.split(",")
if string_list:
field_domain = string_list[0][3:-1]
self.copyvalue = "${{object.{} or {}}}".format(
field_domain,
self.default_value or "''")
# compute the dynamic content for mako expression
@api.multi
def _compute_dynamic_content(self):
MailTemplates = self.env["mail.template"]
for recital in self:
lang = (
recital.agreement_id
and recital.agreement_id.partner_id.lang
or "en_US")
content = MailTemplates.with_context(lang=lang)._render_template(
recital.content, "agreement.recital", recital.id)
recital.dynamic_content = content

23
agreement_legal/models/agreement_renewaltype.py

@ -1,23 +0,0 @@
# Copyright (C) 2018 - TODAY, Pavlov Media
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import fields, models
# Main Agreement Section Records Model
class AgreementRenewalType(models.Model):
_name = "agreement.renewaltype"
_description = "Agreement Renewal Type"
# General
name = fields.Char(
string="Title",
required=True,
help="Renewal types describe what happens after the "
"agreement/contract expires.",
)
description = fields.Text(
string="Description",
required=True,
help="Description of the renewal type."
)

63
agreement_legal/models/agreement_section.py

@ -1,63 +0,0 @@
# Copyright (C) 2018 - TODAY, Pavlov Media
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, fields, models
class AgreementSection(models.Model):
_name = "agreement.section"
_description = "Agreement Sections"
_order = "sequence"
name = fields.Char(string="Name", required=True)
title = fields.Char(
string="Title",
help="The title is displayed on the PDF. The name is not.")
sequence = fields.Integer(string="Sequence")
agreement_id = fields.Many2one(
"agreement", string="Agreement", ondelete="cascade")
clauses_ids = fields.One2many(
"agreement.clause", "section_id", string="Clauses", copy=True)
content = fields.Html(string="Section Content")
dynamic_content = fields.Html(
compute="_compute_dynamic_content",
string="Dynamic Content",
help="compute dynamic Content")
active = fields.Boolean(
string="Active",
default=True,
help="If unchecked, it will allow you to hide the agreement without "
"removing it.")
# Dynamic field editor
field_domain = fields.Char(string='Field Expression',
default='[["active", "=", True]]')
default_value = fields.Char(
string="Default Value",
help="Optional value to use if the target field is empty.")
copyvalue = fields.Char(
string="Placeholder Expression",
help="""Final placeholder expression, to be copy-pasted in the desired
template field.""")
@api.onchange("field_domain", "default_value")
def onchange_copyvalue(self):
self.copyvalue = False
if self.field_domain:
string_list = self.field_domain.split(",")
if string_list:
field_domain = string_list[0][3:-1]
self.copyvalue = "${{object.{} or {}}}".format(
field_domain,
self.default_value or "''")
# compute the dynamic content for mako expression
@api.multi
def _compute_dynamic_content(self):
MailTemplates = self.env["mail.template"]
for section in self:
lang = (section.agreement_id and
section.agreement_id.partner_id.lang or "en_US")
content = MailTemplates.with_context(lang=lang)._render_template(
section.content, "agreement.section", section.id)
section.dynamic_content = content

31
agreement_legal/models/agreement_stage.py

@ -1,31 +0,0 @@
# Copyright (C) 2018 - TODAY, Pavlov Media
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import fields, models
# Main Agreement Section Records Model
class AgreementStage(models.Model):
_name = "agreement.stage"
_description = "Agreement Stages"
_order = "sequence"
# General
name = fields.Char(
string="Stage Name",
required=True)
description = fields.Text(
string="Description",
required=False)
sequence = fields.Integer(
string="Sequence",
default="1",
required=False)
fold = fields.Boolean(
string="Is Folded",
required=False,
help="This stage is folded in the kanban view by default.",
)
stage_type = fields.Selection(
[('agreement', 'Agreement')],
string='Type', required=True)

12
agreement_legal/models/agreement_status.py

@ -1,12 +0,0 @@
# Copyright (C) 2018 - TODAY, Pavlov Media
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import fields, models
# Main Agreement Status Records Model
class AgreementStatus(models.Model):
_name = "agreement.type"
# General
name = fields.Char(string="Title", required=True)

14
agreement_legal/models/agreement_subtype.py

@ -1,14 +0,0 @@
# Copyright (C) 2018 - TODAY, Pavlov Media
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import fields, models
class AgreementSubtype(models.Model):
_name = "agreement.subtype"
_description = "Agreement Subtypes"
name = fields.Char(string="Name", required=True)
agreement_type_id = fields.Many2one(
"agreement.type",
string="Agreement Type")

15
agreement_legal/models/agreement_type.py

@ -1,15 +0,0 @@
# Copyright (C) 2018 - TODAY, Pavlov Media
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import fields, models
class AgreementType(models.Model):
_inherit = "agreement.type"
_description = "Agreement Types"
agreement_subtypes_ids = fields.One2many(
"agreement.subtype",
"agreement_type_id",
string="Subtypes"
)

12
agreement_legal/models/product_template.py

@ -1,12 +0,0 @@
# Copyright (C) 2018 - TODAY, Pavlov Media
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import fields, models
class Product(models.Model):
_inherit = "product.template"
agreements_ids = fields.Many2many(
"agreement",
string="Agreements")

38
agreement_legal/models/res_config_settings.py

@ -1,38 +0,0 @@
# Copyright (C) 2018 - TODAY, Open Source Integrators
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import fields, models
class ResConfigSettings(models.TransientModel):
_inherit = "res.config.settings"
module_agreement_maintenance = fields.Boolean(
string="Manage maintenance agreements and contracts."
)
module_agreement_mrp = fields.Boolean(
string="Link your manufacturing orders to an agreement."
)
module_agreement_project = fields.Boolean(
string="Link your projects and tasks to an agreement."
)
module_agreement_repair = fields.Boolean(
string="Link your repair orders to an agreement."
)
module_agreement_rma = fields.Boolean(
string="Link your RMAs to an agreement.")
module_agreement_sale = fields.Boolean(
string="Create an agreement when the sale order is confirmed."
)
module_agreement_sale_subscription = fields.Boolean(
string="Link your subscriptions to an agreement."
)
module_agreement_stock = fields.Boolean(
string="Link your pickings to an agreement."
)
module_fieldservice_agreement = fields.Boolean(
string="Link your Field Service orders and equipments to an agreement."
)
module_agreement_helpdesk = fields.Boolean(
string="Link your Helpdesk tickets to an agreement."
)

13
agreement_legal/models/res_partner.py

@ -1,13 +0,0 @@
# Copyright (C) 2018 - TODAY, Pavlov Media
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import fields, models
class Partner(models.Model):
_inherit = "res.partner"
agreement_ids = fields.One2many(
"agreement",
"partner_id",
string="Agreements")

6
agreement_legal/readme/CONFIGURE.rst

@ -1,6 +0,0 @@
To configure this module:
* Go to Agreement > Configuration > Templates
* Create a new template with sections and clauses and their respective content
* Go to Agreement > Configuration > Stages
* Create and reorder stages to match your process

6
agreement_legal/readme/CONTRIBUTORS.rst

@ -1,6 +0,0 @@
* Patrick Wilson <pwilson@pavlovmedia.com>
* Bhavesh Odedra <bodedra@opensourceintegrators.com>
* Wolfgang Hall <whall@opensourceintegrators.com>
* Maxime Chambreuil <mchambreuil@opensourceintegrators.com>
* Sandip Mangukiya <smangukiya@opensourceintegrators.com>
* Yves Goldberg <yves@ygol.com>

5
agreement_legal/readme/CREDITS.rst

@ -1,5 +0,0 @@
The development of this module has been financially supported by:
* Pavlov Media
* Open Source Integrators
* Yves Goldberg

9
agreement_legal/readme/DESCRIPTION.rst

@ -1,9 +0,0 @@
This module allows you to manage agreements, letter of intent and contract content.
The module is meant to be used by the legal team of a company and to allow them
to define sections, clauses and templates with their respective content that can
be dynamic.
Based on the template, an agreement can be created and the pdf document generated.
The agreement would go through a workflow to finally become a contract with the
customer signature.

3
agreement_legal/readme/ROADMAP.rst

@ -1,3 +0,0 @@
* Split the module to remove the dependencies on sale and account and provide
the same feature in extra modules (agreement_sale, agreement_account,
agreement_purchase)

13
agreement_legal/readme/USAGE.rst

@ -1,13 +0,0 @@
To use this module:
* Go to Agreement > Agreements
* Create a new agreement
* Select a template
* Follow the process to get the required approval
* Send the invitation to the customer to review and sign the agreement
* Define Field using widget domain but having partial_use option true:
* For Ex:
* <field name="field_domain" widget="domain" nolabel="1"
* options="{'model': 'agreement.recital',
* 'partial_use': True}"/>

151
agreement_legal/report/agreement.xml

@ -1,151 +0,0 @@
<?xml version="1.0"?>
<odoo>
<report
id="partner_agreement_contract_document"
model="agreement"
string="Contract Document"
name="agreement_legal.report_agreement_document"
file="agreement_legal.report_agreement_document"
report_type="qweb-pdf"/>
<report
id="partner_agreement_contract_document_preview"
model="agreement"
string="Contract Document Preview"
name="agreement_legal.report_agreement_document"
file="agreement_legal.report_agreement_document"
report_type="qweb-html"/>
<template id="report_agreement_document">
<t t-name="agreement.report_agreement_document">
<t t-call="web.html_container">
<t t-foreach="docs" t-as="doc">
<t t-call="web.external_layout">
<div class="page">
<h1 t-field="doc.name"/>
<div name="description">
<span t-field="doc.dynamic_description"/>
</div>
<h2>Parties</h2>
<div name="parties">
<t t-if="doc.use_parties_content">
<p t-field="doc.dynamic_parties"/>
</t>
</div>
<t t-if="not doc.use_parties_content">
<h3>Company Information</h3>
<div name="company_address">
<address t-field="doc.company_id.partner_id"
t-options='{"widget": "contact", "fields": ["address", "name"], "no_marker": True}' />
</div>
<div name="company_contact">
Represented by <span t-field="doc.company_contact_id.name"/>.
</div>
<h3>Partner Information</h3>
<div name="partner_address">
<address t-field="doc.partner_id"
t-options='{"widget": "contact", "fields": ["address", "name"], "no_marker": True}' />
</div>
<div name="partner_contact">
Represented by <span t-field="doc.partner_contact_id.name"/>.
</div>
</t>
<h2>Agreement</h2>
<h3>Recitals</h3>
<table class="table table-condensed">
<tbody>
<tr>
<td>
<ol>
<li t-foreach="doc.recital_ids" t-as="r">
<t t-if="r.title">
<h3 t-field="r.title"/>
</t>
<p t-field="r.dynamic_content"/>
</li>
</ol>
</td>
</tr>
</tbody>
</table>
<table class="table table-condensed">
<tbody class="section_tbody">
<tr>
<td>
<ol>
<li t-foreach="doc.sections_ids" t-as="s">
<t t-if="s.title">
<h3 t-field="s.title"/>
</t>
<p t-field="s.dynamic_content"/>
<ol>
<li t-foreach="s.clauses_ids" t-as="c">
<t t-if="c.title">
<h4 t-field="c.title"/>
</t>
<p t-field="c.dynamic_content"/>
</li>
</ol>
</li>
</ol>
</td>
</tr>
</tbody>
</table>
<t t-if="doc.special_terms">
<h2>Special Terms</h2>
<div name="special_term">
<p t-field="doc.dynamic_special_terms"/>
</div>
</t>
<h2>Signatures</h2>
<table class="table table-condensed">
<theader>
<tr>
<th>Partner</th>
<th>Company</th>
</tr>
</theader>
<tbody class="section_tbody">
<tr>
<td>
<p t-field="doc.partner_id"/>
<p>By: </p>
<p>
Name: <span t-field="doc.partner_contact_id.name"/>
</p>
<p>
Title: <span t-field="doc.partner_contact_id.function"/>
</p>
<p>Date: </p>
</td>
<td>
<p t-field="doc.company_id.partner_id"/>
<p>By: </p>
<p>
Name: <span t-field="doc.company_contact_id.name"/>
</p>
<p>
Title: <span t-field="doc.company_contact_id.function"/>
</p>
<p>Date: </p>
</td>
</tr>
</tbody>
</table>
</div>
<div t-foreach="doc.appendix_ids" t-as="a">
<div class="page">
<h1 t-field="a.title"
style="page-break-before: always;"/>
<p t-field="a.dynamic_content"/>
</div>
</div>
</t>
</t>
</t>
</t>
</template>
</odoo>

29
agreement_legal/security/ir.model.access.csv

@ -1,29 +0,0 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_agreement_readonly,agreement readonly,model_agreement,group_agreement_readonly,1,0,0,0
access_agreement_allusers,agreement all users,model_agreement,group_agreement_user,1,1,1,0
access_agreement_manager,agreement manager,model_agreement,group_agreement_manager,1,1,1,1
access_agreement_recital_readonly,recital readonly,model_agreement_recital,group_agreement_readonly,1,0,0,0
access_agreement_recital_allusers,recital all users,model_agreement_recital,group_agreement_user,1,1,1,0
access_agreement_recital_manager,recital manager,model_agreement_recital,group_agreement_manager,1,1,1,1
access_agreement_section_readonly,section readonly,model_agreement_section,group_agreement_readonly,1,0,0,0
access_agreement_section_allusers,section all users,model_agreement_section,group_agreement_user,1,1,1,0
access_agreement_section_manager,section manager,model_agreement_section,group_agreement_manager,1,1,1,1
access_agreement_clause_readonly,clause readonly,model_agreement_clause,group_agreement_readonly,1,0,0,0
access_agreement_clause_allusers,clause all users,model_agreement_clause,group_agreement_user,1,1,1,0
access_agreement_clause_manager,clause manager,model_agreement_clause,group_agreement_manager,1,1,1,1
access_agreement_appendix_readonly,appendix readonly,model_agreement_appendix,group_agreement_readonly,1,0,0,0
access_agreement_appendix_allusers,appendix all users,model_agreement_appendix,group_agreement_user,1,1,1,0
access_agreement_appendix_manager,appendix manager,model_agreement_appendix,group_agreement_manager,1,1,1,1
access_agreement_line_readonly,agreement line readonly,model_agreement_line,group_agreement_readonly,1,0,0,0
access_agreement_line_allusers,agreement line all users,model_agreement_line,group_agreement_user,1,1,1,0
access_agreement_line_manager,agreement line manager,model_agreement_line,group_agreement_manager,1,1,1,1
access_agreement_stage_readonly,stage readonly,model_agreement_stage,group_agreement_readonly,1,0,0,0
access_agreement_stage_manager,stage manager,model_agreement_stage,group_agreement_manager,1,1,1,1
access_agreement_type_readonly,type readonly,model_agreement_type,group_agreement_readonly,1,0,0,0
access_agreement_type_manager,type manager,model_agreement_type,group_agreement_manager,1,1,1,1
access_agreement_subtype_readonly,subtype readonly,model_agreement_subtype,group_agreement_readonly,1,0,0,0
access_agreement_subtype_manager,subtype manager,model_agreement_subtype,group_agreement_manager,1,1,1,1
access_agreement_renewaltype_readonly,renewaltype readonly,model_agreement_renewaltype,group_agreement_readonly,1,0,0,0
access_agreement_renewaltype_manager,renewaltype manager,model_agreement_renewaltype,group_agreement_manager,1,1,1,1
access_agreement_increasetype_readonly,increasetype readonly,model_agreement_increasetype,group_agreement_readonly,1,0,0,0
access_agreement_increasetype_manager,increasetype manager,model_agreement_increasetype,group_agreement_manager,1,1,1,1

30
agreement_legal/security/res_groups.xml

@ -1,30 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="module_agreement_legal_category" model="ir.module.category">
<field name ="name">Agreement</field>
<field name ="sequence">17</field>
</record>
<!-- Readonly group -->
<record id="group_agreement_readonly" model="res.groups">
<field name="name">Read-Only Users</field>
<field name="category_id" ref="module_agreement_legal_category"/>
<field name="implied_ids" eval="[(4, ref('base.group_user')), (4, ref('agreement.group_use_agreement_type')), (4, ref('agreement.group_use_agreement_template'))]"/>
</record>
<!-- User group -->
<record id="group_agreement_user" model="res.groups">
<field name="name">User</field>
<field name="category_id" ref="module_agreement_legal_category"/>
<field name="implied_ids" eval="[(4, ref('group_agreement_readonly'))]"/>
</record>
<!-- Manager group -->
<record id="group_agreement_manager" model="res.groups">
<field name="name">Manager</field>
<field name="category_id" ref="module_agreement_legal_category"/>
<field name="implied_ids" eval="[(4, ref('group_agreement_user'))]"/>
<field name="users" eval="[(4, ref('base.user_root')), (4, ref('base.user_admin'))]"/>
</record>
</odoo>

BIN
agreement_legal/static/description/icon.png

Before

Width: 64  |  Height: 64  |  Size: 6.6 KiB

481
agreement_legal/static/description/index.html

@ -1,481 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
<title>Agreements Legal</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: grey; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="agreements-legal">
<h1 class="title">Agreements Legal</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/contract/tree/12.0/agreement_legal"><img alt="OCA/contract" src="https://img.shields.io/badge/github-OCA%2Fcontract-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/contract-12-0/contract-12-0-agreement_legal"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/110/12.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
<p>This module allows you to manage agreements, letter of intent and contract content.
The module is meant to be used by the legal team of a company and to allow them
to define sections, clauses and templates with their respective content that can
be dynamic.</p>
<p>Based on the template, an agreement can be created and the pdf document generated.</p>
<p>The agreement would go through a workflow to finally become a contract with the
customer signature.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#configuration" id="id1">Configuration</a></li>
<li><a class="reference internal" href="#usage" id="id2">Usage</a></li>
<li><a class="reference internal" href="#known-issues-roadmap" id="id3">Known issues / Roadmap</a></li>
<li><a class="reference internal" href="#bug-tracker" id="id4">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id5">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id6">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id7">Contributors</a></li>
<li><a class="reference internal" href="#other-credits" id="id8">Other credits</a></li>
<li><a class="reference internal" href="#maintainers" id="id9">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="configuration">
<h1><a class="toc-backref" href="#id1">Configuration</a></h1>
<p>To configure this module:</p>
<ul class="simple">
<li>Go to Agreement &gt; Configuration &gt; Templates</li>
<li>Create a new template with sections and clauses and their respective content</li>
<li>Go to Agreement &gt; Configuration &gt; Stages</li>
<li>Create and reorder stages to match your process</li>
</ul>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#id2">Usage</a></h1>
<p>To use this module:</p>
<ul class="simple">
<li>Go to Agreement &gt; Agreements</li>
<li>Create a new agreement</li>
<li>Select a template</li>
<li>Follow the process to get the required approval</li>
<li>Send the invitation to the customer to review and sign the agreement</li>
<li>Define Field using widget domain but having partial_use option true:</li>
<li>For Ex:</li>
<li>&lt;field name=”field_domain” widget=”domain” nolabel=”1”</li>
<li>options=”{‘model’: ‘agreement.recital’,</li>
<li>‘partial_use’: True}”/&gt;</li>
</ul>
</div>
<div class="section" id="known-issues-roadmap">
<h1><a class="toc-backref" href="#id3">Known issues / Roadmap</a></h1>
<ul class="simple">
<li>Split the module to remove the dependencies on sale and account and provide
the same feature in extra modules (agreement_sale, agreement_account,
agreement_purchase)</li>
</ul>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#id4">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/contract/issues">GitHub Issues</a>.
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
<a class="reference external" href="https://github.com/OCA/contract/issues/new?body=module:%20agreement_legal%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#id5">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#id6">Authors</a></h2>
<ul class="simple">
<li>Pavlov Media</li>
<li>Open Source Integrators</li>
<li>Yves Goldberg (Ygol Internetwork)</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#id7">Contributors</a></h2>
<ul class="simple">
<li>Patrick Wilson &lt;<a class="reference external" href="mailto:pwilson&#64;pavlovmedia.com">pwilson&#64;pavlovmedia.com</a>&gt;</li>
<li>Bhavesh Odedra &lt;<a class="reference external" href="mailto:bodedra&#64;opensourceintegrators.com">bodedra&#64;opensourceintegrators.com</a>&gt;</li>
<li>Wolfgang Hall &lt;<a class="reference external" href="mailto:whall&#64;opensourceintegrators.com">whall&#64;opensourceintegrators.com</a>&gt;</li>
<li>Maxime Chambreuil &lt;<a class="reference external" href="mailto:mchambreuil&#64;opensourceintegrators.com">mchambreuil&#64;opensourceintegrators.com</a>&gt;</li>
<li>Sandip Mangukiya &lt;<a class="reference external" href="mailto:smangukiya&#64;opensourceintegrators.com">smangukiya&#64;opensourceintegrators.com</a>&gt;</li>
<li>Yves Goldberg &lt;<a class="reference external" href="mailto:yves&#64;ygol.com">yves&#64;ygol.com</a>&gt;</li>
</ul>
</div>
<div class="section" id="other-credits">
<h2><a class="toc-backref" href="#id8">Other credits</a></h2>
<p>The development of this module has been financially supported by:</p>
<ul class="simple">
<li>Pavlov Media</li>
<li>Open Source Integrators</li>
<li>Yves Goldberg</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#id9">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>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.</p>
<p>Current <a class="reference external" href="https://odoo-community.org/page/maintainer-role">maintainers</a>:</p>
<p><a class="reference external" href="https://github.com/max3903"><img alt="max3903" src="https://github.com/max3903.png?size=40px" /></a> <a class="reference external" href="https://github.com/ygol"><img alt="ygol" src="https://github.com/ygol.png?size=40px" /></a></p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/contract/tree/12.0/agreement_legal">OCA/contract</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

80
agreement_legal/static/src/js/domain_widget_ext.js

@ -1,80 +0,0 @@
odoo.define('agreement_legal.domain_widget_ext', function (require) {
'use strict';
var basic_fields = require('web.basic_fields');
var DomainSelector = require('web.DomainSelector');
var session = require('web.session');
var core = require('web.core');
var qweb = core.qweb;
var _t = core._t;
basic_fields.FieldDomain.include({
/**
* Init
*/
init : function () {
this._super.apply(this, arguments);
// Add Additional options
this.partialUse = this.nodeOptions.partial_use || false;
},
//----------------------------------------------------------------------
// Private
//----------------------------------------------------------------------
/**
* @private
* @override _render from AbstractField
* @returns {Deferred}
*/
_render: function () {
// If there is no model, only change the non-domain-selector content
if (!this._domainModel) {
this._replaceContent();
return $.when();
}
// Convert char value to array value
var value = this.value || "[]";
// Create the domain selector or change the value of the current
// one...
var def;
if (!this.domainSelector) {
this.domainSelector = new DomainSelector(
this, this._domainModel, value, {
readonly: this.mode === "readonly" || this.inDialog,
filters: this.fsFilters,
debugMode: session.debug,
partialUse: this.partialUse || false,
});
def = this.domainSelector.prependTo(this.$el);
} else {
def = this.domainSelector.setDomain(value);
}
// ... then replace the other content (matched records, etc)
return def.then(this._replaceContent.bind(this));
},
/**
* Render the field DOM except for the domain selector part. The full
* field DOM is composed of a DIV which contains the domain selector
* widget, followed by other content. This other content is handled by
* this method.
*
* @private
*/
_replaceContent: function () {
if (this._$content) {
this._$content.remove();
}
this._$content = $(qweb.render("FieldDomain.content", {
hasModel: !!this._domainModel,
isValid: !!this._isValidForModel,
nbRecords: this.record.specialData[this.name].nbRecords || 0,
inDialogEdit: this.inDialog && this.mode === "edit",
partialUse: this.partialUse || false,
}));
this._$content.appendTo(this.$el);
},
});
});

179
agreement_legal/static/src/xml/domain_widget_view.xml

@ -1,179 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<templates id="template" xml:space="preserve">
<t t-name="FieldDomain.content">
<t t-if="partialUse">
<div t-if="hasModel" class="o_field_domain_panel">
<!--<div t-if="hasModel" class="o_field_domain_panel">
<i class="fa fa-arrow-right" role="img" aria-label="Domain" title="Domain"/>
<button t-if="isValid" class="btn btn-sm btn-secondary o_domain_show_selection_button" type="button">
<t t-esc="nbRecords"/> record(s)
</button>
<span t-else="" class="text-warning" role="alert"><i class="fa fa-exclamation-triangle" role="img" aria-label="Warning" title="Warning"/> Invalid domain</span>
<button t-if="inDialogEdit" class="btn btn-sm btn-primary o_field_domain_dialog_button">Edit Domain</button>
</div>
<div t-else="">Select a model to add a filter.</div>-->
</div>
</t>
<t t-if="!partialUse">
<div t-if="hasModel" class="o_field_domain_panel">
<i class="fa fa-arrow-right" role="img" aria-label="Domain" title="Domain"/>
<button t-if="isValid" class="btn btn-sm btn-secondary o_domain_show_selection_button" type="button">
<t t-esc="nbRecords"/> record(s)
</button>
<span t-else="" class="text-warning" role="alert"><i class="fa fa-exclamation-triangle" role="img" aria-label="Warning" title="Warning"/> Invalid domain</span>
<button t-if="inDialogEdit" class="btn btn-sm btn-primary o_field_domain_dialog_button">Edit Domain</button>
</div>
<div t-else="">Select a model to add a filter.</div>
</t>
</t>
<div aria-atomic="true" t-name="DomainSelector" t-attf-class="o_domain_node o_domain_tree o_domain_selector #{widget.readonly ? 'o_read_mode' : 'o_edit_mode'}">
<t t-if="widget.options.partialUse">
<t t-if="widget.children.length === 0">
<span>SMatch <strong>all records</strong></span>
<button t-if="!widget.readonly" class="btn btn-sm btn-primary o_domain_add_first_node_button"><i class="fa fa-plus"/> Add filter</button>
</t>
<t t-else="">
<div class="o_domain_tree_header">
<t t-if="widget.children.length === 1">Please navigate below and select field:</t>
<t t-else="">
<span>SSMatch records with</span>
<t t-call="DomainTree.OperatorSelector"/>
<span>of the following rules:</span>
</t>
</div>
<div class="o_domain_node_children_container"/>
</t>
</t>
<t t-if="!widget.options.partialUse">
<t t-if="widget.children.length === 0">
<span>Match <strong>all records</strong></span>
<button t-if="!widget.readonly" class="btn btn-sm btn-primary o_domain_add_first_node_button"><i class="fa fa-plus"/> Add filter</button>
</t>
<t t-else="">
<div class="o_domain_tree_header">
<t t-if="widget.children.length === 1">Match records with the following rule:</t>
<t t-else="">
<span>Match records with</span>
<t t-call="DomainTree.OperatorSelector"/>
<span>of the following rules:</span>
</t>
</div>
<div class="o_domain_node_children_container"/>
</t>
<label t-if="widget.debug &amp;&amp; !widget.readonly" class="o_domain_debug_container">
<span class="small"># Code editor</span>
<input type="text" class="o_domain_debug_input"/>
</label>
</t>
</div>
<t t-name="DomainNode.ControlPanel">
<t t-if="widget.options.partialUse">
<div t-if="!widget.readonly &amp;&amp; !widget.noControlPanel" class="o_domain_node_control_panel" role="toolbar" aria-label="Domain node">
</div>
</t>
<t t-if="!widget.options.partialUse">
<div t-if="!widget.readonly &amp;&amp; !widget.noControlPanel" class="o_domain_node_control_panel" role="toolbar" aria-label="Domain node">
<button class="btn o_domain_delete_node_button" title="Delete node" aria-label="Delete node"><i class="fa fa-times"/></button>
<button class="btn o_domain_add_node_button" title="Add node" aria-label="Add node"><i class="fa fa-plus-circle"/></button>
<button class="btn o_domain_add_node_button" title="Add branch" aria-label="Add branch" data-branch="1"><i class="fa fa-ellipsis-h"/></button>
</div>
</t>
</t>
<div t-name="DomainLeaf" t-attf-class="o_domain_node o_domain_leaf o_domain_selector_row #{widget.readonly ? 'o_read_mode' : 'o_edit_mode'}">
<t t-call="DomainNode.ControlPanel"/>
<div t-if="!widget.readonly" class="o_domain_leaf_edition">
<!-- field selector will be instantiated here -->
<t t-if="!widget.options.partialUse">
<div> <!-- used for flex stretching -->
<select class="o_domain_leaf_operator_select o_input">
<option t-foreach="widget.operators" t-as="key"
t-att-value="key"
t-att-selected="widget.displayOperator === key ? 'selected' : None">
<t t-esc="key_value"/>
</option>
</select>
</div>
<div t-attf-class="o_ds_value_cell#{_.contains(['set', 'not set'], widget.displayOperator) ? ' d-none' : ''}">
<t t-if="widget.selectionChoices !== null">
<select class="o_domain_leaf_value_input o_input">
<option t-foreach="widget.selectionChoices" t-as="val"
t-att-value="val[0]"
t-att-selected="_.contains(val, widget.displayValue) ? 'selected' : None">
<t t-esc="val[1]"/>
</option>
</select>
</t>
<t t-else="">
<t t-if="_.contains(['in', 'not in'], widget.operator)">
<div class="o_domain_leaf_value_input">
<span class="badge badge-pill" t-foreach="widget.displayValue" t-as="val">
<t t-esc="val"/> <i class="o_domain_leaf_value_remove_tag_button fa fa-times" t-att-data-value="val" role="img" aria-label="Remove tag" title="Remove tag"/>
</span>
</div>
<div class="o_domain_leaf_value_tags">
<input placeholder="Add new value" type="text" class="o_input"/>
<button class="btn btn-sm btn-primary fa fa-plus o_domain_leaf_value_add_tag_button" aria-label="Add tag" title="Add tag"/>
</div>
</t>
<t t-else="">
<input class="o_domain_leaf_value_input o_input" type="text" t-att-value="widget.displayValue"/>
</t>
</t>
</div>
</t>
</div>
<div t-else="" class="o_domain_leaf_info">
<!-- field selector will be instantiated here -->
<t t-if="_.isString(widget.value)">
<span class="o_domain_leaf_operator"><t t-esc="widget.operator_mapping[widget.operator]"/></span>
<span class="o_domain_leaf_value text-primary">"<t t-esc="widget.value"/>"</span>
</t>
<t t-if="_.isArray(widget.value)">
<span class="o_domain_leaf_operator"><t t-esc="widget.operator_mapping[widget.operator]"/></span>
<t t-foreach="widget.value" t-as="v">
<span class="o_domain_leaf_value text-primary">"<t t-esc="v"/>"</span>
<t t-if="!v_last"> or </t>
</t>
</t>
<t t-if="_.isNumber(widget.value)">
<span class="o_domain_leaf_operator"><t t-esc="widget.operator_mapping[widget.operator]"/></span>
<span class="o_domain_leaf_value text-primary"><t t-esc="widget.value"></t></span>
</t>
<t t-if="_.isBoolean(widget.value)">
is
<t t-if="widget.operator === '=' &amp;&amp; widget.value === false || widget.operator === '!=' &amp;&amp; widget.value === true">not</t>
set
</t>
</div>
</div>
<div aria-atomic="true" t-name="ModelFieldSelector" t-attf-class="o_field_selector#{!widget.options.readonly ? ' o_edit_mode o_input' : ''}">
<div class="o_field_selector_value" tabindex="0"/>
<t t-if="!widget.options.partialUse">
<div class="o_field_selector_controls" tabindex="0">
<i role="alert" class="fa fa-exclamation-triangle o_field_selector_warning d-none" title="Invalid field chain" aria-label="Invalid field chain"/>
</div>
</t>
<div t-if="!widget.options.readonly" class="o_field_selector_popover d-none" tabindex="0">
<div class="o_field_selector_popover_header text-center">
<i class="fa fa-arrow-left o_field_selector_popover_option o_field_selector_prev_page" title="Previous" role="img" aria-label="Previous"/>
<div class="o_field_selector_title"/>
<i class="fa fa-times o_field_selector_popover_option o_field_selector_close" title="Close" role="img" aria-label="Close"/>
</div>
<div class="o_field_selector_popover_body">
<ul class="o_field_selector_page"/>
</div>
<div t-if="widget.options.debugMode" class="o_field_selector_popover_footer">
<input type="text" class="o_input"/>
</div>
</div>
</div>
</templates>

372
agreement_legal/views/agreement.xml

@ -1,372 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="assets_backend" name="agreement_legal assets"
inherit_id="web.assets_backend">
<xpath expr="." position="inside">
<script type="text/javascript"
src="/agreement_legal/static/src/js/domain_widget_ext.js"/>
</xpath>
</template>
<!-- Agreement List View-->
<record model="ir.ui.view" id="partner_agreement_list_view">
<field name="name">Agreement List</field>
<field name="model">agreement</field>
<field name="arch" type="xml">
<tree string="Agreements" default_order='name'>
<field name="name"/>
<field name="partner_id"/>
<field name="company_id"/>
<field name="parent_agreement_id"/>
<field name="agreement_type_id"/>
<field name="agreement_subtype_id"/>
<field name="active" invisible="1"/>
</tree>
</field>
</record>
<!-- Agreement Form View -->
<record model="ir.ui.view" id="partner_agreement_form_view">
<field name="name">Agreement Form</field>
<field name="model">agreement</field>
<field name="priority" eval="1"/>
<field name="arch" type="xml">
<form string="Agreement">
<header>
<button string="New Version" type="object" name="create_new_version" class="oe_highlight" attrs="{'invisible': [('state', '=', 'active')]}"/>
<button string="New Agreement" type="object" name="create_new_agreement" class="oe_highlight" attrs="{'invisible': [('is_template', '=', False)]}"/>
<field name="stage_id" widget="statusbar" clickable="True" options="{'fold_field': 'fold'}" domain="[('stage_type', '=', 'agreement')]"/>
</header>
<sheet>
<div class="oe_button_box" name="button_box">
</div>
<div class="oe_title">
<label for="name" class="oe_edit_only" string="Agreement Name"/>
<h1>
<field name="name"/>
</h1>
</div>
<group string="General">
<group>
<field name="code" readonly="1"/>
<field name="parent_agreement_id"
domain="[('partner_id', '=', partner_id)]"/>
<field name="is_template"/>
</group>
<group>
<field name="agreement_type_id"
widget="selection"
required="True"/>
<field name="agreement_subtype_id"
widget="selection"
domain="[('agreement_type_id', '=', agreement_type_id)]"/>
<field name="assigned_user_id"
attrs="{'invisible': [('is_template', '=', True)], 'readonly':[('is_template', '=', True)]}"/>
<field name="active" invisible="1"/>
<field name="state" invisible="1"/>
</group>
</group>
<group string="Description">
<field name="description"
required="True"
nolabel="1"/>
</group>
<group class="oe_edit_only">
<field name="field_domain" widget="domain" nolabel="1"
options="{'model': 'agreement',
'partial_use': True}" />
<group>
<field name="default_value"/>
<field name="copyvalue"/>
</group>
<p>
This section (on the left) allows you to add dynamic fields inside the description and special terms.
<ol>
<li>Select the agreement field using the popup</li>
<li>Enter the default value if the field is empty</li>
<li>Copy and paste the placeholder expression in the description or the special terms</li>
</ol>
</p>
</group>
<group name="parties" string="Parties">
<group name="cust_parties">
<field name="use_parties_content" string="Use custom content" />
</group>
<group name="cust_parties">
<p>
This section (on the left) allows you to replace the default listing of the parties with custom dynamic content.
</p>
</group>
<group name="partner"
string="Partner">
<div class="o_address_format">
<field name="partner_id"
domain="[('customer', '=', True)]"
context="{'show_address': 1}"
options="{&quot;always_reload&quot;: True}"/>
</div>
</group>
<group name="company"
string="Company">
<div class="o_address_format">
<field name="company_id"
readonly="1"
context="{'show_address': 1}"
options="{&quot;always_reload&quot;: True}"/>
</div>
</group>
<group name="partner_left" string="Primary Contact">
<field name="partner_contact_id" domain="[('parent_id', '=', partner_id)]" nolabel="1"/>
<field name="partner_contact_phone" widget="phone" readonly="1" nolabel="1"/>
<field name="partner_contact_email" widget="email" readonly="1" nolabel="1"/>
</group>
<group name="contact_right" string="Primary Contact">
<field name="company_contact_id" domain="[('parent_id', '=', company_id.partner_id)]" nolabel="1"/>
<field name="company_contact_phone" widget="phone" readonly="1" nolabel="1"/>
<field name="company_contact_email" widget="email" readonly="1" nolabel="1"/>
</group>
</group>
<group name="parties_content" string="Parties Content" attrs="{'invisible':[('use_parties_content', '=', False)]}">
<field name="parties" nolabel="1"/>
</group>
<group name="term_information">
<group name="termdates_left" string="Term Dates">
<field name="start_date" attrs="{'required': [('is_template', '=', False)], 'invisible': [('is_template', '=', True)]}"/>
<field name="end_date" attrs="{'required': [('is_template', '=', False)], 'invisible': [('is_template', '=', True)]}"/>
<field name="expiration_notice"/>
<field name="change_notice"/>
<field name="notification_address_id" domain="['|', ('parent_id', '=', partner_id), ('parent_id', '=', company_id.partner_id)]"/>
<field name="termination_requested"/>
<field name="termination_date"/>
</group>
</group>
<group string="Special Terms">
<field name="special_terms"
nolabel="1"/>
</group>
<notebook>
<page name="structure" string="Structure">
<div>
<button name="%(partner_agreement_contract_document_preview)d" string="Preview" type="action" class="oe_highlight"/>
<button name="%(partner_agreement_contract_document)d" string="Print" type="action" class="oe_highlight"/>
</div>
<separator string="Recitals"/>
<field name="recital_ids"
default_order="sequence"
nolabel="1"
context="{'default_agreement': active_id}"/>
<separator string="Sections"/>
<field name="sections_ids"
default_order='sequence'
nolabel="1"
context="{'default_agreement': active_id}"/>
<separator string="Clauses"/>
<field name="clauses_ids"
default_order='clause_id, sequence'
nolabel="1"
context="{'default_agreement': active_id}"/>
<separator string="Appendices"/>
<field name="appendix_ids"
default_order='sequence'
nolabel="1"
context="{'default_agreement': active_id}"/>
</page>
<page name="signature" string="Signatures">
<group>
<group string="Partner">
<field name="partner_signed_date"/>
<field name="partner_signed_user_id" domain="[('parent_id', '=', partner_id)]"/>
</group>
<group string="Company">
<field name="company_signed_date"/>
<field name="company_signed_user_id"/>
<field name="signed_contract" filename="signed_contract_filename"/>
<field name="signed_contract_filename" invisible="1"/>
</group>
</group>
</page>
<page name="products" string="Products/Services">
<field name="line_ids" nolabel="1">
<tree editable="top">
<field name="product_id"/>
<field name="name"/>
<field name="qty"/>
<field name="uom_id" groups="uom.group_uom"/>
</tree>
</field>
</page>
<page name="child_agreements" string="Child Agreements">
<field name="child_agreements_ids">
<tree default_order='version desc'>
<field name="name"/>
<field name="version"/>
<field name="revision"/>
</tree>
</field>
</page>
<page name="old_versions" string="Revisions">
<field name="previous_version_agreements_ids" string="Previouse Versions">
<tree default_order='version desc'>
<field name="name"/>
<field name="version"/>
<field name="revision"/>
</tree>
</field>
</page>
<page name="performance" string="Performance">
<p>This section is a place where financial records will show the current performance of this agreement.</p>
<p>Perhaps include invoices with total vs costs? </p>
</page>
</notebook>
<group string="Administration">
<div>
<p>Reviewed by <field name="reviewed_user_id" class="oe_inline"/> on <field name="reviewed_date" class="oe_inline"/>.</p>
<p>Approved by <field name="approved_user_id" class="oe_inline"/> on <field name="approved_date" class="oe_inline"/>.</p>
</div>
</group>
<footer>
Version: <field name="version" readonly="True"/>.<field name="revision" readonly="True"/>
| Created By: <field name="create_uid" readonly="True"/>
| Created On: <field name="create_date" readonly="True"/>
</footer>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</form>
</field>
</record>
<!-- Agreement Kanban View -->
<record id="view_project_agreement_kanban" model="ir.ui.view">
<field name="name">Agreement Kanban</field>
<field name="model">agreement</field>
<field name="arch" type="xml">
<kanban default_group_by="stage_id">
<field name="color"/>
<field name="assigned_user_id"/>
<templates>
<t t-name="kanban-box">
<div t-attf-class="oe_kanban_color_#{kanban_getcolor(record.color.raw_value)} oe_kanban_card oe_kanban_global_click">
<div class="oe_kanban_content">
<div class="o_kanban_record_top">
<div class="o_kanban_record_headings">
<strong class="o_kanban_record_title">
<field name="name"/>
</strong><br/>
<div class="o_kanban_record_subtitle text-muted">
<field name="partner_id" invisible="context.get('default_partner_id', False)"/>
<t t-if="record.end_date.raw_value and record.end_date.raw_value lt (new Date())" t-set="red">oe_kanban_text_red</t>
<div t-attf-class="#{red || ''}">
<i><field name="end_date"/></i>
</div>
</div>
</div>
<div class="o_dropdown_kanban dropdown" groups="base.group_user">
<a role="button" class="dropdown-toggle btn" data-toggle="dropdown" href="#">
<span class="fa fa-ellipsis-v" aria-hidden="true"/>
</a>
<ul class="dropdown-menu" role="menu" aria-labelledby="dLabel">
<li t-if="widget.editable"><a type="edit">Edit</a></li>
<li class="divider"/>
<li class="dropdown-header">Record's Colour</li>
<li>
<ul class="oe_kanban_colorpicker" data-field="color"/>
</li>
</ul>
</div>
</div>
<div class="o_kanban_record_body">
<field name="agreement_type_id"/> - <field name="agreement_subtype_id"/>
</div>
<div class="o_kanban_record_bottom">
<div class="oe_kanban_bottom_left">
V: <field name="version"/>
</div>
<div class="oe_kanban_bottom_right">
<img t-att-src="kanban_image('res.users', 'image_small', record.assigned_user_id.raw_value)" t-att-title="record.assigned_user_id.value" width="36" height="36" class="oe_kanban_avatar" alt="user &amp; picture"/>
</div>
</div>
</div>
<div class="oe_clear"/>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<!-- Agreement Search View -->
<record model="ir.ui.view" id="partner_agreement_search_view">
<field name="name">Agreement Search</field>
<field name="model">agreement</field>
<field name="arch" type="xml">
<search string="Agreement Search">
<field name="name"/>
<field name="partner_id"/>
<field name="agreement_type_id"/>
<field name="agreement_subtype_id"/>
<filter name="filter_non_template" string="Non-Templates" domain="[('active','=',True),('is_template', '=', False)]"/>
<filter name="filter_inactive" string="Archived" domain="[('active','=',False)]"/>
<filter name="filter_templates" string="Templates" domain="[('active','=',True),('is_template', '=', True)]"/>
<filter name="group_partner_id" string="Partners" icon="terp-partner" context="{'group_by':'partner_id'}"/>
<filter name="group_status" string="Status" icon="terp-partner" context="{'group_by':'state'}"/>
</search>
</field>
</record>
<!-- Agreement Reporting -->
<record id="agreement_graph_view" model="ir.ui.view">
<field name="name">agreement.graph</field>
<field name="model">agreement</field>
<field name="arch" type="xml">
<graph string="Agreements" type="bar">
<field name="stage_id" type="row"/>
</graph>
</field>
</record>
<record id="agreement_pivot_view" model="ir.ui.view">
<field name="name">agreement.pivot</field>
<field name="model">agreement</field>
<field name="arch" type="xml">
<pivot string="Agreements" display_quantity="true">
<field name="stage_id" type="row"/>
</pivot>
</field>
</record>
<record id="action_agreement_report_order" model="ir.actions.act_window">
<field name="name">Agreements</field>
<field name="res_model">agreement</field>
<field name="view_type">form</field>
<field name="view_mode">graph,pivot</field>
</record>
<!-- actions opening views on models -->
<record model="ir.actions.act_window" id="agreement_dashboard_agreement">
<field name="name">Agreements</field>
<field name="res_model">agreement</field>
<field name="domain">[('is_template', '=', False)]</field>
<field name="view_mode">kanban,tree,form</field>
</record>
<record model="ir.actions.act_window" id="agreement_operations_agreement">
<field name="name">Agreements</field>
<field name="res_model">agreement</field>
<field name="domain">[('is_template', '=', False)]</field>
<field name="view_mode">tree,form</field>
</record>
<record model="ir.actions.act_window" id="partner_agreement_agreement_templates">
<field name="name">Templates</field>
<field name="res_model">agreement</field>
<field name="domain">[('is_template', '=', True)]</field>
<!-- <field name="context">[('is_template', '=', True)]</field> -->
<field name="view_mode">tree,kanban,form</field>
</record>
</odoo>

86
agreement_legal/views/agreement_appendix.xml

@ -1,86 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Agreement Appendix List View-->
<record model="ir.ui.view" id="agreement_appendix_tree">
<field name="name">Agreement Appendix Tree</field>
<field name="model">agreement.appendix</field>
<field name="arch" type="xml">
<tree string="Appendices" default_order='agreement_id, sequence'>
<field name="sequence" widget="handle"/>
<field name="name"/>
<field name="title"/>
<field name="agreement_id"/>
<field name="active" invisible="1"/>
</tree>
</field>
</record>
<!-- Agreement Appendix Form View -->
<record model="ir.ui.view" id="agreement_appendix_form">
<field name="name">Agreement Appendix Form</field>
<field name="model">agreement.appendix</field>
<field name="arch" type="xml">
<form string="Appendix">
<sheet>
<div class="oe_button_box" name="button_box">
<button name="toggle_active" type="object" class="oe_stat_button" icon="fa-archive">
<field name="active" widget="boolean_button" options="{&quot;terminology&quot;: &quot;archive&quot;}"/>
</button>
</div>
<div class="oe_title">
<label for="name" class="oe_edit_only"/>
<h1><field name="name"/></h1>
</div>
<group>
<group>
<field name="title"/>
<field name="agreement_id"/>
</group>
<group>
<field name="sequence"/>
</group>
</group>
<field name="content" widget="html"/>
<group class="oe_edit_only">
<field name="field_domain" widget="domain" nolabel="1"
options="{'model': 'agreement.appendix',
'partial_use': True}" />
<group>
<field name="default_value"/>
<field name="copyvalue"/>
</group>
<p>
This section (on the left) allows you to add dynamic fields inside the content.
<ol>
<li>Select the field using the popup</li>
<li>Enter the default value if the field is empty</li>
<li>Copy and paste the placeholder expression in the content</li>
</ol>
</p>
</group>
</sheet>
</form>
</field>
</record>
<!-- Agreement Appendix Search View -->
<record model="ir.ui.view" id="agreement_appendix_search">
<field name="name">Agreement Appendix Search</field>
<field name="model">agreement.appendix</field>
<field name="arch" type="xml">
<search>
<filter name="group_agreement" icon="terp-partner" context="{'group_by':'agreement_id'}"/>
</search>
</field>
</record>
<!-- Actions opening views on models -->
<record model="ir.actions.act_window" id="agreement_appendix_action">
<field name="name">Appendices</field>
<field name="res_model">agreement.appendix</field>
<field name="view_mode">tree,form</field>
</record>
</odoo>

88
agreement_legal/views/agreement_clause.xml

@ -1,88 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Agreement Clause List View-->
<record model="ir.ui.view" id="partner_agreement_clause_list_view">
<field name="name">Agreement Clause List</field>
<field name="model">agreement.clause</field>
<field name="arch" type="xml">
<tree string="Clauses" default_order='agreement_id, sequence'>
<field name="sequence" widget="handle"/>
<field name="name"/>
<field name="title"/>
<field name="agreement_id"/>
<field name="section_id"/>
<field name="active" invisible="1"/>
</tree>
</field>
</record>
<!-- Agreement Clause Form View -->
<record model="ir.ui.view" id="partner_agreement_clause_form_view">
<field name="name">Agreement clause Form</field>
<field name="model">agreement.clause</field>
<field name="arch" type="xml">
<form string="Clause">
<sheet>
<div class="oe_button_box" name="button_box">
<button name="toggle_active" type="object" class="oe_stat_button" icon="fa-archive">
<field name="active" widget="boolean_button" options="{&quot;terminology&quot;: &quot;archive&quot;}"/>
</button>
</div>
<div class="oe_title">
<label for="name" class="oe_edit_only"/>
<h1><field name="name"/></h1>
</div>
<group>
<group>
<field name="title"/>
<field name="agreement_id"/>
<field name="section_id" domain="[('agreement_id', '=', agreement_id)]"/>
</group>
<group>
<field name="sequence"/>
</group>
</group>
<field name="content" widget="html"/>
<group class="oe_edit_only">
<field name="field_domain" widget="domain" nolabel="1"
options="{'model': 'agreement.clause',
'partial_use': True}" />
<group>
<field name="default_value"/>
<field name="copyvalue"/>
</group>
<p>
This section (on the left) allows you to add dynamic fields inside the content.
<ol>
<li>Select the field using the popup</li>
<li>Enter the default value if the field is empty</li>
<li>Copy and paste the placeholder expression in the content</li>
</ol>
</p>
</group>
</sheet>
</form>
</field>
</record>
<!-- Agreement Clause Search View -->
<record model="ir.ui.view" id="agreement_clause_search_view">
<field name="name">Agreement Clause Search</field>
<field name="model">agreement.clause</field>
<field name="arch" type="xml">
<search string="Agreement Clause Search">
<filter name="group_agreement" icon="terp-partner" context="{'group_by':'agreement_id'}"/>
<filter name="group_section" icon="terp-partner" context="{'group_by':'section_id'}"/>
</search>
</field>
</record>
<!-- Actions opening views on models -->
<record model="ir.actions.act_window" id="partner_agreement_action_clause">
<field name="name">Clauses</field>
<field name="res_model">agreement.clause</field>
<field name="view_mode">tree,form</field>
</record>
</odoo>

45
agreement_legal/views/agreement_increasetype.xml

@ -1,45 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Agreement Increase Type List View-->
<record model="ir.ui.view" id="partner_agreement_increasetype_list_view">
<field name="name">Agreement Increase Type List</field>
<field name="model">agreement.increasetype</field>
<field name="arch" type="xml">
<tree default_order='name'>
<field name="name"/>
<field name="description"/>
<field name="increase_percent"/>
</tree>
</field>
</record>
<!-- Agreement Increase Type Form View -->
<record model="ir.ui.view" id="partner_agreement_increasetype_form_view">
<field name="name">Agreement Increase Type Form</field>
<field name="model">agreement.increasetype</field>
<field name="arch" type="xml">
<form string="Agreements Type Form">
<sheet>
<group>
<field name="name"/>
</group>
<group>
<field name="increase_percent"/>
</group>
<group string="Description">
<field name="description" nolabel="1"/>
</group>
</sheet>
</form>
</field>
</record>
<!-- Actions opening views on models -->
<record model="ir.actions.act_window" id="partner_agreement_action_increasetype">
<field name="name">Agreement Increase Type</field>
<field name="res_model">agreement.increasetype</field>
<field name="view_mode">tree,form</field>
</record>
</odoo>

87
agreement_legal/views/agreement_recital.xml

@ -1,87 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Agreement Recital List View-->
<record model="ir.ui.view" id="agreement_recital_tree">
<field name="name">Agreement Recital Tree</field>
<field name="model">agreement.recital</field>
<field name="arch" type="xml">
<tree string="Recitals" default_order='agreement_id, sequence'>
<field name="sequence" widget="handle"/>
<field name="name"/>
<field name="title"/>
<field name="agreement_id"/>
<field name="active" invisible="1"/>
</tree>
</field>
</record>
<!-- Agreement Recital Form View -->
<record model="ir.ui.view" id="agreement_recital_form">
<field name="name">Agreement Recital Form</field>
<field name="model">agreement.recital</field>
<field name="arch" type="xml">
<form string="Recital">
<sheet>
<div class="oe_button_box" name="button_box">
<button name="toggle_active" type="object"
class="oe_stat_button" icon="fa-archive">
<field name="active" widget="boolean_button"
options="{&quot;terminology&quot;: &quot;archive&quot;}"/>
</button>
</div>
<div class="oe_title">
<label for="name" class="oe_edit_only"/>
<h1><field name="name"/></h1>
</div>
<group>
<group>
<field name="title"/>
<field name="agreement_id"/>
</group>
<group>
<field name="sequence"/>
</group>
</group>
<field name="content" widget="html"/>
<group class="oe_edit_only">
<field name="field_domain" widget="domain" nolabel="1"
options="{'model': 'agreement.recital',
'partial_use': True}" />
<group>
<field name="default_value"/>
<field name="copyvalue"/>
</group>
<p>
This section (on the left) allows you to add dynamic fields inside the content.
<ol>
<li>Select the field using the popup</li>
<li>Enter the default value if the field is empty</li>
<li>Copy and paste the placeholder expression in the content</li>
</ol>
</p>
</group>
</sheet>
</form>
</field>
</record>
<!-- Agreement Recital Search View -->
<record model="ir.ui.view" id="agreement_recital_search">
<field name="name">Agreement Recital Search</field>
<field name="model">agreement.recital</field>
<field name="arch" type="xml">
<search>
<filter name="group_agreement" icon="terp-partner" context="{'group_by':'agreement_id'}"/>
</search>
</field>
</record>
<!-- Actions opening views on models -->
<record model="ir.actions.act_window" id="agreement_recital_action">
<field name="name">Recitals</field>
<field name="res_model">agreement.recital</field>
<field name="view_mode">tree,form</field>
</record>
</odoo>

41
agreement_legal/views/agreement_renewaltype.xml

@ -1,41 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Agreement Renewal Type List View-->
<record model="ir.ui.view" id="partner_agreement_renewaltype_list_view">
<field name="name">Agreement Renewal Type List</field>
<field name="model">agreement.renewaltype</field>
<field name="arch" type="xml">
<tree default_order='name'>
<field name="name"/>
<field name="description"/>
</tree>
</field>
</record>
<!-- Agreement Renewal Type Form View -->
<record model="ir.ui.view" id="partner_agreement_renewaltype_form_view">
<field name="name">Agreement Renewal Type Form</field>
<field name="model">agreement.renewaltype</field>
<field name="arch" type="xml">
<form string="Agreements Type Form">
<sheet>
<group>
<field name="name"/>
</group>
<group string="Description">
<field name="description" nolabel="1"/>
</group>
</sheet>
</form>
</field>
</record>
<!-- Actions opening views on models -->
<record model="ir.actions.act_window" id="partner_agreement_action_renewaltype">
<field name="name">Agreement Renewal Type</field>
<field name="res_model">agreement.renewaltype</field>
<field name="view_mode">tree,form</field>
</record>
</odoo>

100
agreement_legal/views/agreement_section.xml

@ -1,100 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Agreement Sections List View-->
<record model="ir.ui.view" id="partner_agreement_section_list_view">
<field name="name">Agreement Section List</field>
<field name="model">agreement.section</field>
<field name="arch" type="xml">
<tree string="Sections" default_order='agreement_id, sequence'>
<field name="sequence" widget="handle"/>
<field name="name"/>
<field name="title"/>
<field name="agreement_id"/>
<field name="active" invisible="1"/>
</tree>
</field>
</record>
<!-- Agreement Sections Form View -->
<record model="ir.ui.view" id="partner_agreement_section_form_view">
<field name="name">Agreement Section Form</field>
<field name="model">agreement.section</field>
<field name="arch" type="xml">
<form string="Section">
<sheet>
<div class="oe_button_box" name="button_box">
<button name="toggle_active" type="object" class="oe_stat_button" icon="fa-archive">
<field name="active" widget="boolean_button" options="{&quot;terminology&quot;: &quot;archive&quot;}"/>
</button>
</div>
<div class="oe_title">
<label for="name" class="oe_edit_only"/>
<h1><field name="name"/></h1>
</div>
<group>
<group>
<field name="title"/>
<field name="agreement_id"/>
</group>
<group>
<field name="sequence"/>
</group>
</group>
<notebook>
<page string="Content">
<field name='content' nolabel="1"/>
<group class="oe_edit_only">
<field name="field_domain" widget="domain" nolabel="1"
options="{'model': 'agreement.section',
'partial_use': True}" />
<group>
<field name="default_value"/>
<field name="copyvalue"/>
</group>
<p>
This section (on the left) allows you to add dynamic fields inside the content.
<ol>
<li>Select the field using the popup</li>
<li>Enter the default value if the field is empty</li>
<li>Copy and paste the placeholder expression in the content</li>
</ol>
</p>
</group>
</page>
<page string="Clauses">
<field name="clauses_ids"
nolabel="1"
context="{'default_section_id': active_id, 'default_agreement_id': agreement_id}">
<tree>
<field name="sequence" widget="handle"/>
<field name="name"/>
<field name="title"/>
</tree>
</field>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<!-- Agreement Section Search View -->
<record model="ir.ui.view" id="partner_agreement_section_search_view">
<field name="name">Agreement Section Search</field>
<field name="model">agreement.section</field>
<field name="arch" type="xml">
<search string="Agreement Section Search">
<filter name="group_agreement" string="Agreements" icon="terp-partner" context="{'group_by':'agreement_id'}"/>
</search>
</field>
</record>
<!-- Actions opening views on models -->
<record model="ir.actions.act_window" id="partner_agreement_action_section">
<field name="name">Agreement Sections</field>
<field name="res_model">agreement.section</field>
<field name="view_mode">tree,form</field>
</record>
</odoo>

45
agreement_legal/views/agreement_stages.xml

@ -1,45 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Agreement Stage List View-->
<record model="ir.ui.view" id="partner_agreement_stage_list_view">
<field name="name">Agreement Stage List</field>
<field name="model">agreement.stage</field>
<field name="arch" type="xml">
<tree default_order='sequence, name'>
<field name="sequence" widget="handle"/>
<field name="name" string="Stage Name"/>
<field name="stage_type"/>
</tree>
</field>
</record>
<!-- Agreement Stage Form View -->
<record model="ir.ui.view" id="partner_agreement_stage_form_view">
<field name="name">Agreement Stage Form</field>
<field name="model">agreement.stage</field>
<field name="arch" type="xml">
<form string="Agreements Stage Form">
<sheet>
<div class="oe_title">
<label for="name" class="oe_edit_only" string="Stage Name"/>
<h1><field name="name" string="Stage Name"/></h1>
</div>
<group>
<field name="sequence"/>
<field name="stage_type"/>
<field name="fold"/>
</group>
</sheet>
</form>
</field>
</record>
<!-- Actions opening views on models -->
<record model="ir.actions.act_window" id="partner_agreement_action_stage">
<field name="name">Agreement Stage</field>
<field name="res_model">agreement.stage</field>
<field name="view_mode">tree,form</field>
</record>
</odoo>

45
agreement_legal/views/agreement_subtype.xml

@ -1,45 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Agreement Sub Type List View-->
<record model="ir.ui.view" id="partner_agreement_subtype_list_view">
<field name="name">Agreement Subtype List</field>
<field name="model">agreement.subtype</field>
<field name="arch" type="xml">
<tree default_order='name'>
<field name="name" string="Sub-Type Name"/>
<field name="agreement_type_id" string="Agreement Type"/>
</tree>
</field>
</record>
<!-- Agreement Sub Type Form View -->
<record model="ir.ui.view" id="partner_agreement_subtype_form_view">
<field name="name">Agreement Sub Type Form</field>
<field name="model">agreement.subtype</field>
<field name="arch" type="xml">
<form string="Agreement Sub-Types">
<sheet>
<div class="oe_title">
<label for="name" class="oe_edit_only"/>
<h1><field name="name"/></h1>
</div>
<group>
<group>
<field name="agreement_type_id"/>
</group>
<group></group>
</group>
</sheet>
</form>
</field>
</record>
<!-- Actions opening views on models -->
<record model="ir.actions.act_window" id="partner_agreement_action_subtype">
<field name="name">Agreement Sub-Types</field>
<field name="res_model">agreement.subtype</field>
<field name="view_mode">tree,form</field>
</record>
</odoo>

40
agreement_legal/views/agreement_type.xml

@ -1,40 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Agreement Type List View-->
<record model="ir.ui.view" id="partner_agreement_type_list_view">
<field name="name">Agreement Type List</field>
<field name="model">agreement.type</field>
<field name="inherit_id" ref="agreement.agreement_type_list_view"/>
<field name="arch" type="xml">
<field name="name" position="after">
<field name="agreement_subtypes_ids" string="Sub-Types"/>
</field>
</field>
</record>
<!-- Agreement Type Form View -->
<record model="ir.ui.view" id="partner_agreement_type_form_view">
<field name="name">Agreement Type Form</field>
<field name="model">agreement.type</field>
<field name="inherit_id" ref="agreement.agreement_type_form_view"/>
<field name="arch" type="xml">
<xpath expr="//sheet" position="inside">
<field name="agreement_subtypes_ids"
nolabel="1">
<tree editable="bottom">
<field name="name"/>
</tree>
</field>
</xpath>
</field>
</record>
<!-- Actions opening views on models -->
<record model="ir.actions.act_window" id="partner_agreement_action_type">
<field name="name">Agreement Types</field>
<field name="res_model">agreement.type</field>
<field name="view_mode">tree,form</field>
</record>
</odoo>

147
agreement_legal/views/menu.xml

@ -1,147 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Remove top menu from agreement module -->
<!-- <delete model="ir.ui.menu" id="agreement.agreement_menu" /> -->
<!-- Top menu item -->
<menuitem
name="Agreements"
id="agreement.agreement_menu"
web_icon="agreement_legal,static/description/icon.png"
sequence="80"
action="agreement_dashboard_agreement"
groups="agreement_legal.group_agreement_readonly"/>
<!-- Dashboard -->
<menuitem
name="Dashboard"
id="agreement_dashboard"
parent="agreement.agreement_menu"
sequence="10"/>
<menuitem
name="Agreements"
id="dashboard_agreements"
parent="agreement_dashboard"
sequence="10"
action="agreement_dashboard_agreement"/>
<!-- Operations -->
<menuitem
name="Operations"
id="agreement_operations"
parent="agreement.agreement_menu"
sequence="20"/>
<menuitem
name="Agreements"
id="operations_agreements"
parent="agreement_operations"
sequence="10"
action="agreement_operations_agreement"/>
<!-- Master Data -->
<menuitem
name="Master Data"
id="agreement_masterdata"
parent="agreement.agreement_menu"
sequence="30"/>
<menuitem
name="Contents"
id="agreement_data_contents"
parent="agreement_masterdata"
sequence="10"/>
<menuitem
name="Recitals"
id="agreement_recitals"
parent="agreement_data_contents"
sequence="10"
action="agreement_recital_action"/>
<menuitem
name="Clauses"
id="agreement_clauses"
parent="agreement_data_contents"
sequence="20"
action="partner_agreement_action_clause"/>
<menuitem
name="Sections"
id="agreement_sections"
parent="agreement_data_contents"
sequence="30"
action="partner_agreement_action_section"/>
<menuitem
name="Appendices"
id="agreement_appendices"
parent="agreement_data_contents"
sequence="40"
action="agreement_appendix_action"/>
<menuitem
name="Products"
id="agreement_products"
sequence="100"
parent="agreement_masterdata"
action="product.product_template_action"/>
<!-- Reporting -->
<menuitem
name="Reporting"
id="agreement_reporting"
sequence="40"
parent="agreement.agreement_menu"
groups="agreement_legal.group_agreement_manager"/>
<menuitem
name="Agreements"
id="agreement_agreement_reporting"
sequence="10"
parent="agreement_reporting"
action="action_agreement_report_order"/>
<!-- Configuration -->
<menuitem
name="Configuration"
id="agreement_configuration"
sequence="50"
parent="agreement.agreement_menu"
groups="agreement_legal.group_agreement_manager"/>
<menuitem
name="Settings"
id="agreement_settings"
sequence="10"
parent="agreement_configuration"
action="agreement_legal.action_agreement_config"/>
<menuitem
name="Templates"
id="template"
parent="agreement_configuration"
sequence="20"
action="partner_agreement_agreement_templates"/>
<menuitem
name="Renewal Types"
id="agreement_renewaltype"
parent="agreement_configuration"
sequence="30"
action="partner_agreement_action_renewaltype"/>
<menuitem
name="Increase Types"
id="agreement_increamenttypes"
parent="agreement_configuration"
sequence="31"
action="partner_agreement_action_increasetype"/>
<menuitem
name="Stages"
id="agreement_stages"
parent="agreement_configuration"
sequence="40"
action="partner_agreement_action_stage"/>
<menuitem
name="Types"
id="agreement_types"
parent="agreement_configuration"
sequence="50"
action="partner_agreement_action_type"/>
<menuitem
name="Sub-Types"
id="agreement_subtypes"
parent="agreement_configuration"
sequence="60"
action="partner_agreement_action_subtype"/>
</odoo>

161
agreement_legal/views/res_config_settings.xml

@ -1,161 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="res_config_settings_view_form" model="ir.ui.view">
<field name="name">res.config.settings.view.form.agreement</field>
<field name="model">res.config.settings</field>
<field name="priority" eval="40"/>
<field name="inherit_id" ref="base.res_config_settings_view_form"/>
<field name="arch" type="xml">
<xpath expr="//div[hasclass('settings')]" position="inside">
<div class="app_settings_block"
data-string="Agreements"
string="Agreements"
data-key="agreement_legal"
groups="agreement_legal.group_agreement_manager">
<h2>Operations</h2>
<div class="row mt16 o_settings_container">
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="group_uom"/>
</div>
<div class="o_setting_right_pane">
<label for="group_uom"/>
<div class="text-muted">
Sell and purchase products in different units of measure
</div>
<div class="content-group">
<div class="mt16" attrs="{'invisible': [('group_uom', '=', False)]}">
<button name="%(uom.product_uom_form_action)d" icon="fa-arrow-right" type="action" string="Units Of Measure" class="btn-link"/>
</div>
</div>
</div>
</div>
</div>
<h2>Advanced Features</h2>
<div class="row mt16 o_settings_container">
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="module_agreement_sale"/>
</div>
<div class="o_setting_right_pane">
<label for="" string="Sales"/>
<div class="text-muted">
Create an agreement when the sales order is confirmed
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box"
attrs="{'invisible': [('module_agreement_sale', '!=', True)]}">
<div class="o_setting_left_pane">
<field name="module_agreement_sale_subscription"/>
</div>
<div class="o_setting_right_pane">
<label for="" string="Sale Subscriptions"/>
<div class="text-muted">
Link your subscriptions to an agreement
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="module_fieldservice_agreement"/>
</div>
<div class="o_setting_right_pane">
<label for="" string="Field Service"/>
<div class="text-muted">
Link your Field Service orders and equipments to an agreement
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="module_agreement_stock"/>
</div>
<div class="o_setting_right_pane">
<label for="" string="Inventory"/>
<div class="text-muted">
Link your transfers to an agreement
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="module_agreement_rma"/>
</div>
<div class="o_setting_right_pane">
<label for="" string="Returns"/>
<div class="text-muted">
Link your returns to an agreement
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="module_agreement_maintenance"/>
</div>
<div class="o_setting_right_pane">
<label for="" string="Maintenance"/>
<div class="text-muted">
Manage maintenance agreements and contracts
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="module_agreement_mrp"/>
</div>
<div class="o_setting_right_pane">
<label for="" string="Manufacturing"/>
<div class="text-muted">
Link your manufacturing orders to an agreement
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="module_agreement_repair"/>
</div>
<div class="o_setting_right_pane">
<label for="" string="Repair"/>
<div class="text-muted">
Link your repair orders to an agreement
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="module_agreement_project"/>
</div>
<div class="o_setting_right_pane">
<label for="" string="Project"/>
<div class="text-muted">
Link your projects and tasks to an agreement
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="module_agreement_helpdesk"/>
</div>
<div class="o_setting_right_pane">
<label for="" string="Helpdesk"/>
<div class="text-muted">
Link your Helpdesk tickets to an agreement
</div>
</div>
</div>
</div>
</div>
</xpath>
</field>
</record>
<act_window id="action_agreement_config"
name="Settings"
res_model="res.config.settings"
view_mode="form"
target="inline"
context="{'module': 'agreement'}"/>
</odoo>

17
agreement_legal/views/res_partner.xml

@ -1,17 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record model="ir.ui.view" id="partner_form">
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form"/>
<field name="arch" type="xml">
<xpath expr="//page[@name='internal_notes']" position="after">
<page name="agreement" string="Agreements">
<group>
<field name="agreement_ids" nolabel="1"/>
</group>
</page>
</xpath>
</field>
</record>
</odoo>

131
agreement_legal_sale/README.rst

@ -1,131 +0,0 @@
====================
Agreement Legal Sale
====================
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! 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-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fcontract-lightgray.png?logo=github
:target: https://github.com/OCA/contract/tree/12.0/agreement_legal_sale
:alt: OCA/contract
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/contract-12-0/contract-12-0-agreement_legal_sale
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
:target: https://runbot.odoo-community.org/runbot/110/12.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
Odoo Sales App does not support the management of legal content for agreements
and contracts. It's also not integrated with the Agreement App.
This module is for companies that needs their customer to sign an agreement
with all the legal information based on the selected agreement template.
**Table of contents**
.. contents::
:local:
Configuration
=============
To configure this module:
* Go to Agreement > Configuration > Templates
* Create a new template with sections and clauses and their respective content
* Go to Agreement > Configuration > Stages
* Create and reorder stages to match your process
Usage
=====
To use this module:
* Go to Sales
* Create or select a quotation
* Set the agreement template and add some products
* Confirm the quotation. An agreement is created and linked to the sales order:
* the agreement template is copied into an agreement with a copy of the
sections, clauses, recitals and appendices
* all the sales order lines are added as agreement lines
* the service products (with is_serviceprofile = True) on the SO are added as service profile on the agreement
* the customer information is set from the sales order
* the eventual analytic account linked to the sales order is set on the agreement
* the agreement is linked to the sales order and vice versa
Known issues / Roadmap
======================
The roadmap is documented on https://github.com/OCA/contract/issues.
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/contract/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 <https://github.com/OCA/contract/issues/new?body=module:%20agreement_legal_sale%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* Open Source Integrators
Contributors
~~~~~~~~~~~~
* Steven Campbell <scampbell@opensourceintegrators.com>
* Maxime Chambreuil <mchambreuil@opensourceintegrators.com>
* Serpent Consulting Services Pvt. Ltd. <support@serpentcs.com>
Other credits
~~~~~~~~~~~~~
The development of this module has been financially supported by:
* Pavlov Media
* Open Source Integrators
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-osi-scampbell| image:: https://github.com/osi-scampbell.png?size=40px
:target: https://github.com/osi-scampbell
:alt: osi-scampbell
.. |maintainer-max3903| image:: https://github.com/max3903.png?size=40px
:target: https://github.com/max3903
:alt: max3903
Current `maintainers <https://odoo-community.org/page/maintainer-role>`__:
|maintainer-osi-scampbell| |maintainer-max3903|
This module is part of the `OCA/contract <https://github.com/OCA/contract/tree/12.0/agreement_legal_sale>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

3
agreement_legal_sale/__init__.py

@ -1,3 +0,0 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from . import models

26
agreement_legal_sale/__manifest__.py

@ -1,26 +0,0 @@
# Copyright (C) 2019 - TODAY, Open Source Integrators
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
'name': 'Agreement Legal Sale',
'summary': 'Create an agreement when the sale order is confirmed',
'version': '12.0.1.1.0',
'license': 'AGPL-3',
'author': 'Open Source Integrators, Odoo Community Association (OCA)',
'category': 'Agreement',
'website': 'https://github.com/OCA/contract',
'depends': [
'agreement_legal',
'agreement_sale',
],
'data': [
'views/agreement.xml',
'views/sale_order.xml',
],
'installable': True,
'development_status': 'Beta',
'maintainers': [
'osi-scampbell',
'max3903',
],
}

55
agreement_legal_sale/i18n/agreement_legal_sale.pot

@ -1,55 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * agreement_legal_sale
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.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: agreement_legal_sale
#: model:ir.model,name:agreement_legal_sale.model_agreement
msgid "Agreement"
msgstr ""
#. module: agreement_legal_sale
#: model:ir.model,name:agreement_legal_sale.model_agreement_line
msgid "Agreement Lines"
msgstr ""
#. module: agreement_legal_sale
#: model:ir.model.fields,field_description:agreement_legal_sale.field_sale_order__agreement_template_id
msgid "Agreement Template"
msgstr ""
#. module: agreement_legal_sale
#: model:ir.model.fields,field_description:agreement_legal_sale.field_agreement__analytic_account_id
msgid "Analytic Account"
msgstr ""
#. module: agreement_legal_sale
#: model:ir.model,name:agreement_legal_sale.model_sale_order
msgid "Sale Order"
msgstr ""
#. module: agreement_legal_sale
#: model_terms:ir.ui.view,arch_db:agreement_legal_sale.agreement_sale_form_view
msgid "Sales"
msgstr ""
#. module: agreement_legal_sale
#: model:ir.model.fields,field_description:agreement_legal_sale.field_agreement__sale_id
msgid "Sales Order"
msgstr ""
#. module: agreement_legal_sale
#: model:ir.model.fields,field_description:agreement_legal_sale.field_agreement_line__sale_line_id
msgid "Sales Order Line"
msgstr ""

64
agreement_legal_sale/i18n/agreement_sale.pot

@ -1,64 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * agreement_sale
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.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: agreement_sale
#: model:ir.model.fields,field_description:agreement_sale.field_sale_order_agreement_id
#: model:ir.ui.view,arch_db:agreement_sale.product_template_form_view
msgid "Agreement"
msgstr ""
#. module: agreement_sale
#: model:ir.model.fields,field_description:agreement_sale.field_sale_order_agreement_template_id
msgid "Agreement Template"
msgstr ""
#. module: agreement_sale
#: model:ir.model.fields,field_description:agreement_sale.field_product_product_is_serviceprofile
#: model:ir.model.fields,field_description:agreement_sale.field_product_template_is_serviceprofile
msgid "Create a Service Profile"
msgstr ""
#. module: agreement_sale
#: model:ir.model.fields,help:agreement_sale.field_product_product_is_serviceprofile
#: model:ir.model.fields,help:agreement_sale.field_product_template_is_serviceprofile
msgid "If True, this product will create a service profile on the\n"
" agreement when the sales order is confirmed."
msgstr ""
#. module: agreement_sale
#: model:ir.model,name:agreement_sale.model_product_template
msgid "Product Template"
msgstr ""
#. module: agreement_sale
#: model:ir.model,name:agreement_sale.model_sale_order
msgid "Quotation"
msgstr ""
#. module: agreement_sale
#: model:ir.ui.view,arch_db:agreement_sale.agreement_sale_form_view
msgid "Sales"
msgstr ""
#. module: agreement_sale
#: model:ir.model.fields,field_description:agreement_sale.field_agreement_sale_id
msgid "Sales Order"
msgstr ""
#. module: agreement_sale
#: model:ir.model,name:agreement_sale.model_agreement
msgid "agreement"
msgstr ""

76
agreement_legal_sale/i18n/de.po

@ -1,76 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * agreement_sale
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2019-05-10 14:03+0000\n"
"Last-Translator: Maria Sparenberg <maria.sparenberg@gmx.net>\n"
"Language-Team: none\n"
"Language: de\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 3.5.1\n"
#. module: agreement_legal_sale
#: model:ir.model,name:agreement_legal_sale.model_agreement
msgid "Agreement"
msgstr "Vereinbarung"
#. module: agreement_legal_sale
#: model:ir.model,name:agreement_legal_sale.model_agreement_line
msgid "Agreement Lines"
msgstr "Vereinbarungspositionen"
#. module: agreement_legal_sale
#: model:ir.model.fields,field_description:agreement_legal_sale.field_sale_order__agreement_template_id
msgid "Agreement Template"
msgstr "Vereinbarungsvorlage"
#. module: agreement_legal_sale
#: model:ir.model.fields,field_description:agreement_legal_sale.field_agreement__analytic_account_id
msgid "Analytic Account"
msgstr "Kostenstelle"
#. module: agreement_legal_sale
#: model:ir.model,name:agreement_legal_sale.model_sale_order
msgid "Sale Order"
msgstr "Verkaufsauftrag"
#. module: agreement_legal_sale
#: model_terms:ir.ui.view,arch_db:agreement_legal_sale.agreement_sale_form_view
msgid "Sales"
msgstr "Verkauf"
#. module: agreement_legal_sale
#: model:ir.model.fields,field_description:agreement_legal_sale.field_agreement__sale_id
msgid "Sales Order"
msgstr "Verkaufsauftrag"
#. module: agreement_legal_sale
#: model:ir.model.fields,field_description:agreement_legal_sale.field_agreement_line__sale_line_id
msgid "Sales Order Line"
msgstr "Auftragszeile"
#~ msgid "Create a Service Profile"
#~ msgstr "Dienstleistungsprofil erstellen"
#~ msgid ""
#~ "If True, this product will create a service profile on the\n"
#~ " agreement when the sales order is confirmed."
#~ msgstr ""
#~ "Wenn der Haken gesetzt ist, wird dieses Produkt ein Dienstleistungsprofil "
#~ "in der Vereinbarung erzeugen, sobald der Verkaufsauftrag bestätigt wird."
#~ msgid "Product Template"
#~ msgstr "Produktvorlage"
#~ msgid "Quotation"
#~ msgstr "Angebot"
#~ msgid "agreement"
#~ msgstr "Vereinbarung"

70
agreement_legal_sale/i18n/fr.po

@ -1,70 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * agreement_legal_sale
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2019-04-19 17:15+0000\n"
"Last-Translator: Yves Goldberg <admin@ygol.com>\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 3.5.1\n"
#. module: agreement_legal_sale
#: model:ir.model,name:agreement_legal_sale.model_agreement
msgid "Agreement"
msgstr "Accord"
#. module: agreement_legal_sale
#: model:ir.model,name:agreement_legal_sale.model_agreement_line
msgid "Agreement Lines"
msgstr "Lignes de l'accord"
#. module: agreement_legal_sale
#: model:ir.model.fields,field_description:agreement_legal_sale.field_sale_order__agreement_template_id
msgid "Agreement Template"
msgstr "Modèle d'accord"
#. module: agreement_legal_sale
#: model:ir.model.fields,field_description:agreement_legal_sale.field_agreement__analytic_account_id
msgid "Analytic Account"
msgstr "Compte Analytique"
#. module: agreement_legal_sale
#: model:ir.model,name:agreement_legal_sale.model_sale_order
msgid "Sale Order"
msgstr "Commande"
#. module: agreement_legal_sale
#: model_terms:ir.ui.view,arch_db:agreement_legal_sale.agreement_sale_form_view
msgid "Sales"
msgstr "Vente"
#. module: agreement_legal_sale
#: model:ir.model.fields,field_description:agreement_legal_sale.field_agreement__sale_id
msgid "Sales Order"
msgstr "Commandes"
#. module: agreement_legal_sale
#: model:ir.model.fields,field_description:agreement_legal_sale.field_agreement_line__sale_line_id
msgid "Sales Order Line"
msgstr "Ligne de commande"
#~ msgid "Create a Service Profile"
#~ msgstr "Créer un profil de service"
#~ msgid ""
#~ "If True, this product will create a service profile on the\n"
#~ " agreement when the sales order is confirmed."
#~ msgstr ""
#~ "Si Vrai, ce produit créera un profil de service dans\n"
#~ "          l'accord a la confirmation de la commande client."
#~ msgid "Product Template"
#~ msgstr "Modèle Produit"

68
agreement_legal_sale/i18n/zh_CN.po

@ -1,68 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * agreement_legal_sale
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2019-09-04 18:23+0000\n"
"Last-Translator: 黎伟杰 <674416404@qq.com>\n"
"Language-Team: none\n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 3.8\n"
#. module: agreement_legal_sale
#: model:ir.model,name:agreement_legal_sale.model_agreement
msgid "Agreement"
msgstr "协议"
#. module: agreement_legal_sale
#: model:ir.model,name:agreement_legal_sale.model_agreement_line
msgid "Agreement Lines"
msgstr "协议行"
#. module: agreement_legal_sale
#: model:ir.model.fields,field_description:agreement_legal_sale.field_sale_order__agreement_template_id
msgid "Agreement Template"
msgstr "协议模板"
#. module: agreement_legal_sale
#: model:ir.model.fields,field_description:agreement_legal_sale.field_agreement__analytic_account_id
msgid "Analytic Account"
msgstr "分析账户"
#. module: agreement_legal_sale
#: model:ir.model,name:agreement_legal_sale.model_sale_order
msgid "Sale Order"
msgstr "销售订单"
#. module: agreement_legal_sale
#: model_terms:ir.ui.view,arch_db:agreement_legal_sale.agreement_sale_form_view
msgid "Sales"
msgstr "销售"
#. module: agreement_legal_sale
#: model:ir.model.fields,field_description:agreement_legal_sale.field_agreement__sale_id
msgid "Sales Order"
msgstr "销售订单"
#. module: agreement_legal_sale
#: model:ir.model.fields,field_description:agreement_legal_sale.field_agreement_line__sale_line_id
msgid "Sales Order Line"
msgstr "销售订单行"
#~ msgid "Create a Service Profile"
#~ msgstr "创建服务配置文件"
#~ msgid ""
#~ "If True, this product will create a service profile on the\n"
#~ " agreement when the sales order is confirmed."
#~ msgstr "如果为真,则当确认销售订单时,此产品将在协议上创建服务配置文件。"
#~ msgid "Product Template"
#~ msgstr "产品模版"

6
agreement_legal_sale/models/__init__.py

@ -1,6 +0,0 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from . import (
sale_order,
agreement,
)

21
agreement_legal_sale/models/agreement.py

@ -1,21 +0,0 @@
# Copyright (C) 2019 - TODAY, Open Source Integrators
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import fields, models
class Agreement(models.Model):
_inherit = 'agreement'
sale_id = fields.Many2one('sale.order', string='Sales Order')
analytic_account_id = fields.Many2one(
'account.analytic.account',
'Analytic Account',
copy=False)
class AgreementLine(models.Model):
_inherit = "agreement.line"
sale_line_id = fields.Many2one('sale.order.line',
string='Sales Order Line')

61
agreement_legal_sale/models/sale_order.py

@ -1,61 +0,0 @@
# Copyright (C) 2019 - TODAY, Open Source Integrators
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, fields, models
class SaleOrder(models.Model):
_inherit = 'sale.order'
agreement_template_id = fields.Many2one(
'agreement',
string="Agreement Template",
domain="[('is_template', '=', True)]")
@api.multi
def _action_confirm(self):
res = super(SaleOrder, self)._action_confirm()
for order in self:
if order.agreement_template_id:
order.agreement_id = order.agreement_template_id.copy(default={
'name': order.name,
'code': order.name,
'is_template': False,
'sale_id': order.id,
'partner_id': order.partner_id.id,
'analytic_account_id': order.analytic_account_id and
order.analytic_account_id.id or False,
})
for line in order.order_line:
# Create agreement line
self.env['agreement.line'].create({
'product_id': line.product_id.id,
'name': line.name,
'agreement_id': order.agreement_id.id,
'qty': line.product_uom_qty,
'sale_line_id': line.id,
'uom_id': line.product_uom.id
})
# If the product creates service profiles, create one
if line.product_id.product_tmpl_id.is_serviceprofile:
self.env['agreement.serviceprofile'].create({
'name': line.name,
'product_id': line.product_id.product_tmpl_id.id,
'agreement_id': order.agreement_id.id,
})
return res
def action_confirm(self):
# If sale_timesheet is installed, the _action_confirm()
# may be setting an Analytic Account on the SO.
# But since it is not a dependency, that can happen after
# we create the Agreement.
# To work around that, we check if that is the case,
# and make sure the SO Analytic Account is copied to the Agreement.
res = super(SaleOrder, self).action_confirm()
for order in self:
agreement = order.agreement_id
if (order.analytic_account_id and agreement and
not agreement.analytic_account_id):
agreement.analytic_account_id = order.analytic_account_id
return res

6
agreement_legal_sale/readme/CONFIGURE.rst

@ -1,6 +0,0 @@
To configure this module:
* Go to Agreement > Configuration > Templates
* Create a new template with sections and clauses and their respective content
* Go to Agreement > Configuration > Stages
* Create and reorder stages to match your process

3
agreement_legal_sale/readme/CONTRIBUTORS.rst

@ -1,3 +0,0 @@
* Steven Campbell <scampbell@opensourceintegrators.com>
* Maxime Chambreuil <mchambreuil@opensourceintegrators.com>
* Serpent Consulting Services Pvt. Ltd. <support@serpentcs.com>

4
agreement_legal_sale/readme/CREDITS.rst

@ -1,4 +0,0 @@
The development of this module has been financially supported by:
* Pavlov Media
* Open Source Integrators

5
agreement_legal_sale/readme/DESCRIPTION.rst

@ -1,5 +0,0 @@
Odoo Sales App does not support the management of legal content for agreements
and contracts. It's also not integrated with the Agreement App.
This module is for companies that needs their customer to sign an agreement
with all the legal information based on the selected agreement template.

1
agreement_legal_sale/readme/ROADMAP.rst

@ -1 +0,0 @@
The roadmap is documented on https://github.com/OCA/contract/issues.

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save