33 Commits

Author SHA1 Message Date
f4d9cd008c init 18.0 2025-10-09 11:07:40 +02:00
3bfe2752b5 [ADD]hr_employee_stats_sheet_lunch_voucher 2025-10-07 07:33:02 +00:00
eecdf0c727 [ADD]hr_employee_stats_sheet 2025-10-07 07:32:52 +00:00
0dc8075a81 [IMP]hr_timesheet_import_from_calendar: display unit amount with time format widget instead of float 2025-10-01 08:04:58 +02:00
6c008cce4d [FIX]allow_negative_leave_and_allocation:fix recorsed send to _check_holidays 2025-09-30 18:10:41 +02:00
dc5fd2897a [MIG]l10n_fr_hr_holidays:backport from v17 to 16 2025-09-24 07:06:22 +00:00
f206606a96 Sync config from odoo-elabore-ci:16.0
Some checks failed
pre-commit / pre-commit (pull_request) Failing after 7m49s
2025-09-17 13:40:10 +00:00
e8a819d594 [FIX]allow_negative_leave_and_allocation:fix duration check 2025-09-15 11:27:50 +02:00
0437a9c9be [ADD]hr_timesheet_sheet_usability 2025-09-15 11:13:30 +02:00
d52b8c424e [ADD]allow_negative_leave_and_allocation_hr_holidays_attendance 2025-04-16 15:06:21 +02:00
4a00e642e0 [ADD]allow_negative_leave_and_allocation 2025-04-16 15:05:12 +02:00
Stéphan Sainléger
beb64d034d [FIX] hr_usability: add missing add-ons dependency to hr_holidays 2025-02-21 16:18:07 +01:00
ec7c402a26 [ADD]timesheet_timesheet_analysis_report 2025-02-03 17:50:37 +01:00
clementthomas
fd45cf17a2 [NEW] hr_timesheet_import_from_calendar 2024-12-16 14:05:05 +01:00
091fefc763 [ADD]project_timesheet_holidays_type 2024-06-27 09:19:00 +02:00
583b6e30b2 [ADD]project_timesheet_holidays_type 2024-06-27 09:19:00 +02:00
34abfad364 [ADD]hr_usability_elabore 2024-02-15 16:10:22 +01:00
edc8cffc69 Initial Commit 2023-12-21 12:02:04 +01:00
clementthomas
141ad6bfcd [IMP] hr_expense_specific_journal: set default journal 2023-10-17 12:29:02 +02:00
clementthomas
d59b2df993 [NEW] hr_expense_specific_journal 2023-10-11 09:30:35 +02:00
clementthomas
cf29d356fe [IMP] hr_expense_report_merge_attachment: rename module 2023-07-10 16:37:45 +02:00
clementthomas
b282d2f726 [IMP] hr_expense_analytic_account_preselect_with_project: String and required project field 2023-06-23 11:04:10 +02:00
clementthomas
0e80defb81 [NEW] hr_expense_analytic_account_preselect_with_project: new module 2023-06-22 14:28:18 +02:00
clementthomas
81010e0145 [ADD] hr_expense_report_merge_attachment: Merge expense attachments in report 2023-05-16 09:56:53 +02:00
clementthomas
7694bd5c06 [IMP] hr_luncheon_voucher: add voucher balance field 2023-04-28 14:55:46 +02:00
clementthomas
0538e04997 [IMP] hr_luncheon_voucher: search of Luncheon Voucher
add search by employee and distrib_campaign_name, whatever the company
2023-04-17 15:13:00 +02:00
clementthomas
c7f2d0683b [FIX] hr_effective_attendance_period: DST
daylight saving time (DST) fix when compute UTC time
2023-04-13 08:36:10 +02:00
Stéphan Sainléger
070bdaca52 [FIX] hr_effective_attendance_period: fix timezone consideration 2023-02-27 16:05:46 +01:00
Stéphan Sainléger
b08119cf4e [FIX] hr_luncheon_voucher: only consider employee's meetings 2023-02-06 23:36:39 +01:00
Stéphan Sainléger
dbfa5624a3 [I18N] hr_effective_attendance_period: add french translation 2023-02-01 23:35:55 +01:00
Stéphan Sainléger
06e0793a6c [FIX] hr_luncheon_voucher: fix french translation issues
french translations weren not loaded
2023-02-01 23:34:16 +01:00
Stéphan Sainléger
cc901c2e62 [REF] hr_luncheon_voucher: remove useless code 2023-02-01 23:25:51 +01:00
Stéphan Sainléger
8579e22474 [REF] hr-luncheon-voucher: rename add-on in hr_luncheon_voucher
to respect OCA guidelines
2023-02-01 23:25:51 +01:00
37 changed files with 662 additions and 1966 deletions

20
.editorconfig Normal file
View File

@@ -0,0 +1,20 @@
# Configuration for known file extensions
[*.{css,js,json,less,md,py,rst,sass,scss,xml,yaml,yml}]
charset = utf-8
end_of_line = lf
indent_size = 4
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true
[*.{json,yml,yaml,rst,md}]
indent_size = 2
# Do not configure editor for libs and autogenerated content
[{*/static/{lib,src/lib}/**,*/static/description/index.html,*/readme/../README.rst}]
charset = unset
end_of_line = unset
indent_size = unset
indent_style = unset
insert_final_newline = false
trim_trailing_whitespace = false

188
.eslintrc.yml Normal file
View File

@@ -0,0 +1,188 @@
env:
browser: true
es6: true
# See https://github.com/OCA/odoo-community.org/issues/37#issuecomment-470686449
parserOptions:
ecmaVersion: 2019
overrides:
- files:
- "**/*.esm.js"
parserOptions:
sourceType: module
# Globals available in Odoo that shouldn't produce errorings
globals:
_: readonly
$: readonly
fuzzy: readonly
jQuery: readonly
moment: readonly
odoo: readonly
openerp: readonly
owl: readonly
luxon: readonly
# Styling is handled by Prettier, so we only need to enable AST rules;
# see https://github.com/OCA/maintainer-quality-tools/pull/618#issuecomment-558576890
rules:
accessor-pairs: warn
array-callback-return: warn
callback-return: warn
capitalized-comments:
- warn
- always
- ignoreConsecutiveComments: true
ignoreInlineComments: true
complexity:
- warn
- 15
constructor-super: warn
dot-notation: warn
eqeqeq: warn
global-require: warn
handle-callback-err: warn
id-blacklist: warn
id-match: warn
init-declarations: error
max-depth: warn
max-nested-callbacks: warn
max-statements-per-line: warn
no-alert: warn
no-array-constructor: warn
no-caller: warn
no-case-declarations: warn
no-class-assign: warn
no-cond-assign: error
no-const-assign: error
no-constant-condition: warn
no-control-regex: warn
no-debugger: error
no-delete-var: warn
no-div-regex: warn
no-dupe-args: error
no-dupe-class-members: error
no-dupe-keys: error
no-duplicate-case: error
no-duplicate-imports: error
no-else-return: warn
no-empty-character-class: warn
no-empty-function: error
no-empty-pattern: error
no-empty: warn
no-eq-null: error
no-eval: error
no-ex-assign: error
no-extend-native: warn
no-extra-bind: warn
no-extra-boolean-cast: warn
no-extra-label: warn
no-fallthrough: warn
no-func-assign: error
no-global-assign: error
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-irregular-whitespace: warn
no-iterator: warn
no-label-var: warn
no-labels: warn
no-lone-blocks: warn
no-lonely-if: error
no-mixed-requires: error
no-multi-str: warn
no-native-reassign: error
no-negated-condition: warn
no-negated-in-lhs: error
no-new-func: warn
no-new-object: warn
no-new-require: warn
no-new-symbol: warn
no-new-wrappers: warn
no-new: warn
no-obj-calls: warn
no-octal-escape: warn
no-octal: warn
no-param-reassign: warn
no-path-concat: warn
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: error
no-script-url: warn
no-self-assign: warn
no-self-compare: warn
no-sequences: warn
no-shadow-restricted-names: warn
no-shadow: warn
no-sparse-arrays: warn
no-sync: warn
no-this-before-super: warn
no-throw-literal: warn
no-undef-init: warn
no-undef: error
no-unmodified-loop-condition: warn
no-unneeded-ternary: error
no-unreachable: error
no-unsafe-finally: error
no-unused-expressions: error
no-unused-labels: error
no-unused-vars: error
no-use-before-define: error
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-with: warn
operator-assignment: [error, always]
prefer-const: warn
radix: warn
require-yield: warn
sort-imports: warn
spaced-comment: [error, always]
strict: [error, function]
use-isnan: error
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
yoda: warn

View File

@@ -0,0 +1,42 @@
name: pre-commit
on:
pull_request:
branches:
- "18.0*"
jobs:
pre-commit:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Get python version
run: echo "PY=$(python -VV | sha256sum | cut -d' ' -f1)" >> $GITHUB_ENV
# - uses: actions/cache@v4
# with:
# path: ~/.cache/pre-commit
# key: pre-commit|${{ env.PY }}|${{ hashFiles('.pre-commit-config.yaml') }}
- name: Install pre-commit
run: pip install pre-commit
- name: Run pre-commit
run: pre-commit run --all-files --show-diff-on-failure --color=always
env:
# Consider valid a PR that changes README fragments but doesn't
# change the README.rst file itself. It's not really a problem
# because the bot will update it anyway after merge. This way, we
# lower the barrier for functional contributors that want to fix the
# readme fragments, while still letting developers get README
# auto-generated (which also helps functionals when using runboat).
# DOCS https://pre-commit.com/#temporarily-disabling-hooks
SKIP: oca-gen-addon-readme
- name: Check that all files generated by pre-commit are in git
run: |
newfiles="$(git ls-files --others --exclude-from=.gitignore)"
if [ "$newfiles" != "" ] ; then
echo "Please check-in the following files:"
echo "$newfiles"
exit 1
fi

2
.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
*.*~
*.pyc

150
.pre-commit-config.yaml Normal file
View File

@@ -0,0 +1,150 @@
exclude: |
(?x)
# NOT INSTALLABLE ADDONS
# END NOT INSTALLABLE ADDONS
# Files and folders generated by bots, to avoid loops
^setup/|/static/description/index\.html$|
# We don't want to mess with tool-generated files
.svg$|/tests/([^/]+/)?cassettes/|^.copier-answers.yml$|^.github/|^eslint.config.cjs|^prettier.config.cjs|
# Maybe reactivate this when all README files include prettier ignore tags?
^README\.md$|
# Library files can have extraneous formatting (even minimized)
/static/(src/)?lib/|
# Repos using Sphinx to generate docs don't need prettying
^docs/_templates/.*\.html$|
# Don't bother non-technical authors with formatting issues in docs
readme/.*\.(rst|md)$|
# Ignore build and dist directories in addons
/build/|/dist/|
# Ignore test files in addons
/tests/samples/.*|
# You don't usually want a bot to modify your legal texts
(LICENSE.*|COPYING.*)
default_language_version:
python: python3
node: "16.17.0"
repos:
- repo: local
hooks:
# These files are most likely copier diff rejection junks; if found,
# review them manually, fix the problem (if needed) and remove them
- id: forbidden-files
name: forbidden files
entry: found forbidden files; remove them
language: fail
files: "\\.rej$"
- id: en-po-files
name: en.po files cannot exist
entry: found a en.po file
language: fail
files: '[a-zA-Z0-9_]*/i18n/en\.po$'
- repo: https://github.com/oca/maintainer-tools
rev: f9b919b9868143135a9c9cb03021089cabba8223
hooks:
# update the NOT INSTALLABLE ADDONS section above
- id: oca-update-pre-commit-excluded-addons
- id: oca-fix-manifest-website
entry:
bash -c 'oca-fix-manifest-website "https://git.elabore.coop/elabore/$(basename
$(git rev-parse --show-toplevel))"'
- id: oca-gen-addon-readme
entry:
bash -c 'oca-gen-addon-readme
--addons-dir=.
--branch=$(git symbolic-ref
refs/remotes/origin/HEAD | sed "s@^refs/remotes/origin/@@")
--repo-name=$(basename $(git rev-parse --show-toplevel))
--org-name="Elabore"
--if-source-changed --keep-source-digest'
- repo: https://github.com/OCA/odoo-pre-commit-hooks
rev: v0.1.4
hooks:
- id: oca-checks-odoo-module
- id: oca-checks-po
args:
- --disable=po-pretty-format
- repo: local
hooks:
- id: prettier
name: prettier (with plugin-xml)
entry: prettier
args:
- --write
- --list-different
- --ignore-unknown
types: [text]
files: \.(css|htm|html|js|json|jsx|less|md|scss|toml|ts|xml|yaml|yml)$
language: node
additional_dependencies:
- "prettier@2.7.1"
- "@prettier/plugin-xml@2.2.0"
- repo: local
hooks:
- id: eslint
name: eslint
entry: eslint
args:
- --color
- --fix
verbose: true
types: [javascript]
language: node
additional_dependencies:
- "eslint@8.24.0"
- "eslint-plugin-jsdoc@"
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v5.0.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: fix-encoding-pragma
args: ["--remove"]
- id: check-case-conflict
- id: check-docstring-first
- id: check-executables-have-shebangs
- id: check-merge-conflict
# exclude files where underlines are not distinguishable from merge conflicts
exclude: /README\.rst$|^docs/.*\.rst$
- id: check-symlinks
- id: check-xml
- id: mixed-line-ending
args: ["--fix=lf"]
- repo: https://github.com/PyCQA/docformatter
rev: v1.7.7
hooks:
- id: docformatter
args: [
"--in-place", # modify the files
"--recursive", # run on all the files
"--wrap-summaries",
"88", # max length of 1st line
"--wrap-descriptions",
"88", # max length of other lines
"--pre-summary-newline", # new line before a long summary
"--make-summary-multi-line", # force summary on multilines
]
additional_dependencies: ["tomli"] # if Python <3.11
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.12.0
hooks:
- id: ruff
args: [--fix, --exit-non-zero-on-fix]
- id: ruff-format
- repo: https://github.com/OCA/pylint-odoo
rev: v9.1.3
hooks:
- id: pylint_odoo
name: pylint with optional checks
args:
- --rcfile=.pylintrc
- --exit-zero
verbose: true
- id: pylint_odoo
args:
- --rcfile=.pylintrc-mandatory

8
.prettierrc.yml Normal file
View File

@@ -0,0 +1,8 @@
# Defaults for all prettier-supported languages.
# Prettier will complete this with settings from .editorconfig file.
bracketSpacing: false
printWidth: 88
proseWrap: always
semi: true
trailingComma: "es5"
xmlWhitespaceSensitivity: "strict"

123
.pylintrc Normal file
View File

@@ -0,0 +1,123 @@
[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=Elabore
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=18.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,
development-status-allowed,
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,
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,
attribute-string-redundant,
character-not-valid-in-resource-link,
consider-merging-classes-inherited,
context-overridden,
create-user-wo-reset-password,
dangerous-filter-wo-user,
dangerous-qweb-replace-wo-priority,
deprecated-data-xml-node,
deprecated-openerp-xml-node,
duplicate-po-message-definition,
except-pass,
file-not-used,
invalid-commit,
manifest-maintainers-list,
missing-newline-extrafiles,
missing-readme,
missing-return,
odoo-addons-relative-import,
old-api7-method-defined,
po-msgstr-variables,
po-syntax-error,
renamed-field-parameter,
resource-not-exist,
str-format-used,
test-folder-imported,
translation-contains-variable,
translation-positional-used,
unnecessary-utf8-coding-comment,
website-manifest-key-not-valid-uri,
xml-attribute-translatable,
xml-deprecated-qweb-directive,
xml-deprecated-tree-attribute,
external-request-timeout,
# 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-manifest-dependency,
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

98
.pylintrc-mandatory Normal file
View File

@@ -0,0 +1,98 @@
[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=Elabore
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=18.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,
development-status-allowed,
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,
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,
attribute-string-redundant,
character-not-valid-in-resource-link,
consider-merging-classes-inherited,
context-overridden,
create-user-wo-reset-password,
dangerous-filter-wo-user,
dangerous-qweb-replace-wo-priority,
deprecated-data-xml-node,
deprecated-openerp-xml-node,
duplicate-po-message-definition,
except-pass,
file-not-used,
invalid-commit,
manifest-maintainers-list,
missing-newline-extrafiles,
missing-readme,
missing-return,
odoo-addons-relative-import,
old-api7-method-defined,
po-msgstr-variables,
po-syntax-error,
renamed-field-parameter,
resource-not-exist,
str-format-used,
test-folder-imported,
translation-contains-variable,
translation-positional-used,
unnecessary-utf8-coding-comment,
website-manifest-key-not-valid-uri,
xml-attribute-translatable,
xml-deprecated-qweb-directive,
xml-deprecated-tree-attribute,
external-request-timeout
[REPORTS]
msg-template={path}:{line}: [{msg_id}({symbol}), {obj}] {msg}
output-format=colorized
reports=no

31
.ruff.toml Normal file
View File

@@ -0,0 +1,31 @@
target-version = "py310"
fix = true
[lint]
extend-select = [
"B",
"C90",
"E501", # line too long (default 88)
"I", # isort
"UP", # pyupgrade
]
extend-safe-fixes = ["UP008"]
exclude = ["setup/*"]
[format]
exclude = ["setup/*"]
[lint.per-file-ignores]
"__init__.py" = ["F401", "I001"] # ignore unused and unsorted imports in __init__.py
"__manifest__.py" = ["B018"] # useless expression
[lint.isort]
section-order = ["future", "standard-library", "third-party", "odoo", "odoo-addons", "first-party", "local-folder"]
[lint.isort.sections]
"odoo" = ["odoo"]
"odoo-addons" = ["odoo.addons"]
[lint.mccabe]
max-complexity = 16

View File

@@ -1,80 +0,0 @@
===================
HR Luncheon Voucher
===================
.. |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%2Faccount--analytic-lightgray.png?logo=github
:target: https://github.com/elabore-coop/hr-tools
:alt: elabore/hr-tools
|badge1| |badge2| |badge3|
This module allows the management of Luncheon Vouchers attribution and distribution.
Employees can indicate which days are not concerned by luncheon vouchers.
HR managers can ajust the number of luncheon vouchers to distribute, and follow each employee credit.
Installation
============
Use Odoo normal module installation procedure to install ``hr-luncheon-voucher``.
Configuration
=============
1. Go to ``Configuration > Technical > Calendar > Meeting Types`` and define the meeting categories which cancel the daily luncheon voucher distribution.
2. Go to ``Configuration > General Settings > Employees`` and define if employees need to work the whole day to get a luncheon voucher.
3. Go to ``Employees`` and define for each employee the default number of luncheon vouchers to distribute in each distribution campaign.
4. Go to ``Configuration > Technical > Resource > Working Times`` and create Working Times for each combination of attendance that you have in your company. Do not forget to indicate which period are effectively attended.
Use
===
- when an calendar event makes the luncheon voucher distribution cancelled (Off-site or free lunch for instance), add the corresponding category to the event.
- for each distribution period, the HR manager should:
- go in ``Employees`` tree view
- select all the employees concerned by luncheon vouchers distribution
- click on header button ``Generate luncheon vouchers allocation``
- Fill the wizard form
- a voucher allocation request is created for each employee
- HR manager confirms an allocation request when the figures are confirmed
- HR manager marks the requests as "Distributed" when the vouchers has been effectively distributed
- HR manager can correct the allocation requests with ``Back to draft`` button
- employees' luncheon voucher counters are updated considering the vouchers acquired, dued and distributed at each campaign.
**Attribution rules:**
- a luncheon voucher is acquired for a working day if:
- the employee worked on one or all the attendances of the day (depending if option ``Half working days cancel luncheon vouchers`` is True or not)
- there is no meeting which cancel the voucher during that day (``Site off`` or ``Free lunch`` meeting for instance)
- an attendance is considered as worked as long as there is no leave on the whole attendance time slot
Known issues / Roadmap
======================
None yet.
Bug Tracker
===========
Bugs are tracked on `GitHub Issues
<https://github.com/elabore-coop/hr-tools/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.
Credits
=======
Contributors
------------
- Stéphan Sainléger <https://github.com/stephansainleger>
Funders
-------
The development of this module has been financially supported by:
- Elabore (https://elabore.coop)
- Amaco (https://amaco.org)
Maintainer
----------
This module is maintained by ELABORE.

View File

@@ -1,4 +0,0 @@
# -*- coding: utf-8 -*-
from . import models
from . import wizard

View File

@@ -1,31 +0,0 @@
# -*- coding: utf-8 -*-
{
"name": "HR Luncheon Voucher",
"category": "Human Resources",
"version": "14.0.2.0.0",
"summary": "Manage luncheon vouchers credit and distribution",
"author": "Elabore",
"website": "https://elabore.coop/",
"installable": True,
"application": True,
"auto_install": False,
"depends": [
"base",
"calendar",
"hr",
"hr_effective_attendance_period",
"hr_holidays",
"resource",
],
"data": [
"security/ir.model.access.csv",
"views/event_type.xml",
"views/hr_employee_views.xml",
"views/hr_lv_allocation_views.xml",
"views/res_config_settings_views.xml",
"views/menus.xml",
"wizard/generate_lv_allocations_wizard.xml",
"data/event_type_data.xml",
],
"qweb": [],
}

View File

@@ -1,16 +0,0 @@
<?xml version="1.0"?>
<odoo>
<data>
<record id="categ_meet_free_lunch" model="calendar.event.type">
<field name="name">Free lunch</field>
<field name="ref">categ_meet_free_lunch</field>
<field name="remove_luncheon_voucher">1</field>
</record>
<record id="categ_meet_offsite" model="calendar.event.type">
<field name="name">Off-site</field>
<field name="ref">categ_meet_offsite</field>
<field name="remove_luncheon_voucher">1</field>
</record>
</data>
</odoo>

View File

@@ -1,547 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr-luncheon-voucher
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-18 15:03+0000\n"
"PO-Revision-Date: 2023-01-18 15:03+0000\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: hr-luncheon-voucher
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.view_employee_form_lv
msgid "Acquired"
msgstr "Acquis"
#. module: hr-luncheon-voucher
#: code:addons/hr-luncheon-voucher/models/hr_lv_allocation.py:0
#: code:addons/hr-luncheon-voucher/models/hr_lv_allocation.py:0
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__number_acquired_lv
#, python-format
msgid "Acquired Vouchers"
msgstr "Tickets acquis"
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__message_needaction
msgid "Action Needed"
msgstr "Action nécessaire"
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__activity_ids
msgid "Activities"
msgstr "Activités"
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__activity_exception_decoration
msgid "Activity Exception Decoration"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__activity_state
msgid "Activity State"
msgstr "État de l'activité"
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__activity_type_icon
msgid "Activity Type Icon"
msgstr ""
#. module: hr-luncheon-voucher
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.hr_lv_allocation_form
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.hr_lv_allocation_tree
msgid "Adjust distribution"
msgstr "Ajuster la distribution"
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__message_attachment_count
msgid "Attachment Count"
msgstr "Nombre de pièces jointes"
#. module: hr-luncheon-voucher
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.hr_lv_allocation_form
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.hr_lv_allocation_tree
msgid "Back to draft"
msgstr "Retour en brouillon"
#. module: hr-luncheon-voucher
#: model:ir.model,name:hr-luncheon-voucher.model_hr_employee_base
msgid "Basic Employee"
msgstr "Employé basique"
#. module: hr-luncheon-voucher
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.lv_allocations_requests_wizard
msgid "Cancel"
msgstr "Annuler"
#. module: hr-luncheon-voucher
#: model:ir.model,name:hr-luncheon-voucher.model_res_company
msgid "Companies"
msgstr "Sociétés"
#. module: hr-luncheon-voucher
#: model:ir.model,name:hr-luncheon-voucher.model_res_config_settings
msgid "Config Settings"
msgstr "Paramètres de config"
#. module: hr-luncheon-voucher
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.hr_lv_allocation_form
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.hr_lv_allocation_tree
msgid "Confirm"
msgstr "Confirmer"
#. module: hr-luncheon-voucher
#: model:ir.model.fields.selection,name:hr-luncheon-voucher.selection__hr_lv_allocation__state__confirmed
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.hr_lv_allocation_search
msgid "Confirmed"
msgstr "Confirmé"
#. module: hr-luncheon-voucher
#: model:ir.actions.act_window,name:hr-luncheon-voucher.lv_allocations_requests_wizard_action
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.lv_allocations_requests_wizard
msgid "Create Luncheon Vouchers allocations requests"
msgstr "Créer demandes d'allocation de Tickets Restaurants"
#. module: hr-luncheon-voucher
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.lv_allocations_requests_wizard
msgid "Create allocations requests"
msgstr "Créer les demandes d'allocation"
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_generate_lv_allocation_requests__create_uid
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__create_uid
msgid "Created by"
msgstr "Créé par"
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_generate_lv_allocation_requests__create_date
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__create_date
msgid "Created on"
msgstr "Créé le"
#. module: hr-luncheon-voucher
#: code:addons/hr-luncheon-voucher/models/hr_employee.py:0
#: code:addons/hr-luncheon-voucher/models/hr_employee.py:0
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_employee__default_monthly_lv
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_employee_base__default_monthly_lv
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_employee_public__default_monthly_lv
#, python-format
msgid "Default monthly distribution"
msgstr "Distribution mensuel par défaut"
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_calendar_event_type__display_name
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_generate_lv_allocation_requests__display_name
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_employee_base__display_name
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__display_name
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_res_company__display_name
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_res_config_settings__display_name
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_resource_calendar__display_name
msgid "Display Name"
msgstr "Nom affiché"
#. module: hr-luncheon-voucher
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.hr_lv_allocation_form
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.hr_lv_allocation_tree
msgid "Distribute Vouchers"
msgstr "Tickets distribués"
#. module: hr-luncheon-voucher
#: model:ir.model.fields.selection,name:hr-luncheon-voucher.selection__hr_lv_allocation__state__distributed
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.hr_lv_allocation_search
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.view_employee_form_lv
msgid "Distributed"
msgstr "Distribué"
#. module: hr-luncheon-voucher
#: code:addons/hr-luncheon-voucher/models/hr_lv_allocation.py:0
#: code:addons/hr-luncheon-voucher/models/hr_lv_allocation.py:0
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__number_distributed_lv
#, python-format
msgid "Distributed Vouchers"
msgstr "Tickets distribués"
#. module: hr-luncheon-voucher
#: code:addons/hr-luncheon-voucher/models/hr_employee.py:0
#: code:addons/hr-luncheon-voucher/models/hr_employee.py:0
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_employee__distributed_lv
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_employee_base__distributed_lv
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_employee_public__distributed_lv
#, python-format
msgid "Distributed luncheon vouchers"
msgstr "Tickets distribués"
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_generate_lv_allocation_requests__distrib_campaign_name
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__distrib_campaign_name
msgid "Distribution campaign"
msgstr "Campagne de distribution"
#. module: hr-luncheon-voucher
#: model:ir.model.fields.selection,name:hr-luncheon-voucher.selection__hr_lv_allocation__state__draft
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.hr_lv_allocation_search
msgid "Draft"
msgstr "Brouillon"
#. module: hr-luncheon-voucher
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.view_employee_form_lv
msgid "Dued"
msgstr "Dû"
#. module: hr-luncheon-voucher
#: code:addons/hr-luncheon-voucher/models/hr_lv_allocation.py:0
#: code:addons/hr-luncheon-voucher/models/hr_lv_allocation.py:0
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__number_dued_lv
#, python-format
msgid "Dued Vouchers"
msgstr "Tickets dûs"
#. module: hr-luncheon-voucher
#: code:addons/hr-luncheon-voucher/models/hr_lv_allocation.py:0
#: code:addons/hr-luncheon-voucher/models/hr_lv_allocation.py:0
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__employee_id
#, python-format
msgid "Employee"
msgstr "Employé"
#. module: hr-luncheon-voucher
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.res_config_settings_lv_form
msgid "Employee Luncheon Vouchers"
msgstr "Tickets restaurant"
#. module: hr-luncheon-voucher
#: code:addons/hr-luncheon-voucher/models/hr_lv_allocation.py:0
#: code:addons/hr-luncheon-voucher/models/hr_lv_allocation.py:0
#: code:addons/hr-luncheon-voucher/wizard/generate_lv_allocations_wizard.py:0
#: code:addons/hr-luncheon-voucher/wizard/generate_lv_allocations_wizard.py:0
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_generate_lv_allocation_requests__date_to
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__date_to
#, python-format
msgid "End Date"
msgstr "Date de fin"
#. module: hr-luncheon-voucher
#: model:ir.model,name:hr-luncheon-voucher.model_calendar_event_type
msgid "Event Meeting Type"
msgstr "Type d'événement réunion"
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__message_follower_ids
msgid "Followers"
msgstr "Abonnés"
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__message_channel_ids
msgid "Followers (Channels)"
msgstr "Abonnés (Canaux)"
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__message_partner_ids
msgid "Followers (Partners)"
msgstr "Abonnés (Contacts)"
#. module: hr-luncheon-voucher
#: model:ir.model.fields,help:hr-luncheon-voucher.field_hr_lv_allocation__activity_type_icon
msgid "Font awesome icon e.g. fa-tasks"
msgstr ""
#. module: hr-luncheon-voucher
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.view_employee_tree_lv
msgid "Generate Luncheon Vouchers Allocations"
msgstr "Générer les allocations de Tickets Restaurants"
#. module: hr-luncheon-voucher
#: model:ir.model,name:hr-luncheon-voucher.model_generate_lv_allocation_requests
msgid "Generate Luncheon Vouchers Allocations Requests"
msgstr "Générer les demandes d'allocations de Tickets Restaurants"
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_res_company__hr_half_day_cancels_voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_res_config_settings__hr_half_day_cancels_voucher
msgid "Half working days cancel luncheon vouchers"
msgstr "Une demi-journée travaillée annule les tickets restaurants."
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_calendar_event_type__id
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_generate_lv_allocation_requests__id
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_employee_base__id
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__id
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_res_company__id
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_res_config_settings__id
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_resource_calendar__id
msgid "ID"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__activity_exception_icon
msgid "Icon"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,help:hr-luncheon-voucher.field_hr_lv_allocation__activity_exception_icon
msgid "Icon to indicate an exception activity."
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,help:hr-luncheon-voucher.field_hr_lv_allocation__message_needaction
#: model:ir.model.fields,help:hr-luncheon-voucher.field_hr_lv_allocation__message_unread
msgid "If checked, new messages require your attention."
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,help:hr-luncheon-voucher.field_hr_lv_allocation__message_has_error
msgid "If checked, some messages have a delivery error."
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__message_is_follower
msgid "Is Follower"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_calendar_event_type____last_update
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_generate_lv_allocation_requests____last_update
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_employee_base____last_update
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation____last_update
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_res_company____last_update
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_res_config_settings____last_update
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_resource_calendar____last_update
msgid "Last Modified on"
msgstr "Dernière modification le"
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_generate_lv_allocation_requests__write_uid
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__write_uid
msgid "Last Updated by"
msgstr "Dernière mise à jour par"
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_generate_lv_allocation_requests__write_date
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__write_date
msgid "Last Updated on"
msgstr "Dernière mise à jour le"
#. module: hr-luncheon-voucher
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.view_employee_form_lv
msgid "Luncheon Vouchers"
msgstr "Tickets Restaurants"
#. module: hr-luncheon-voucher
#: model:ir.model,name:hr-luncheon-voucher.model_hr_lv_allocation
msgid "Luncheon Vouchers Allocation"
msgstr "Allocation de Tickets Restaurants"
#. module: hr-luncheon-voucher
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.res_config_settings_lv_form
msgid "Luncheon Vouchers Half-day Cancel"
msgstr "Annulation Tickets Restaurants sur une demi-journée"
#. module: hr-luncheon-voucher
#: model:ir.ui.menu,name:hr-luncheon-voucher.menu_hr_lv_allocations
msgid "Luncheon vouchers"
msgstr "Ticket restaurants"
#. module: hr-luncheon-voucher
#: model:ir.actions.act_window,name:hr-luncheon-voucher.act_lv_allocations
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.hr_lv_allocation_search
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.hr_lv_allocation_tree
msgid "Luncheon vouchers allocations"
msgstr "Allocations de Tickets restaurant"
#. module: hr-luncheon-voucher
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.hr_lv_allocation_form
msgid "Luncheon vouchers calculation"
msgstr "Calculs des tickets restaurants"
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_employee__lv_allocations_ids
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_employee_base__lv_allocations_ids
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_employee_public__lv_allocations_ids
msgid "Lv Allocations"
msgstr "Allocations TR"
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__message_main_attachment_id
msgid "Main Attachment"
msgstr "Pièce jointe principale"
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__message_has_error
msgid "Message Delivery error"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__message_ids
msgid "Messages"
msgstr "Messages"
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__my_activity_date_deadline
msgid "My Activity Deadline"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__name
msgid "Name"
msgstr "Nom"
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__activity_date_deadline
msgid "Next Activity Deadline"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__activity_summary
msgid "Next Activity Summary"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__activity_type_id
msgid "Next Activity Type"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__message_needaction_counter
msgid "Number of Actions"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__message_has_error_counter
msgid "Number of errors"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,help:hr-luncheon-voucher.field_hr_lv_allocation__message_needaction_counter
msgid "Number of messages which requires an action"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,help:hr-luncheon-voucher.field_hr_lv_allocation__message_has_error_counter
msgid "Number of messages with delivery error"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,help:hr-luncheon-voucher.field_hr_lv_allocation__message_unread_counter
msgid "Number of unread messages"
msgstr ""
#. module: hr-luncheon-voucher
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.lv_allocations_requests_wizard
msgid "Period to consider"
msgstr ""
#. module: hr-luncheon-voucher
#: code:addons/hr-luncheon-voucher/models/calendar_event_type.py:0
#: code:addons/hr-luncheon-voucher/models/calendar_event_type.py:0
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_calendar_event_type__ref
#, python-format
msgid "Reference"
msgstr ""
#. module: hr-luncheon-voucher
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.view_employee_form_lv
msgid "Refresh Luncheon Vouchers"
msgstr "Rafraîchir les Tickets Restaurants"
#. module: hr-luncheon-voucher
#: code:addons/hr-luncheon-voucher/models/hr_employee.py:0
#: code:addons/hr-luncheon-voucher/models/hr_employee.py:0
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_employee__dued_lv
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_employee_base__dued_lv
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_employee_public__dued_lv
#, python-format
msgid "Remaining luncheon vouchers"
msgstr "Tickets restaurants restants"
#. module: hr-luncheon-voucher
#: code:addons/hr-luncheon-voucher/models/calendar_event_type.py:0
#: code:addons/hr-luncheon-voucher/models/calendar_event_type.py:0
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_calendar_event_type__remove_luncheon_voucher
#, python-format
msgid "Remove luncheon voucher"
msgstr "Retirer Ticket restaurant"
#. module: hr-luncheon-voucher
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.hr_lv_allocation_form
msgid "Request context"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model,name:hr-luncheon-voucher.model_resource_calendar
msgid "Resource Working Time"
msgstr "Temps de travail de la ressource"
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__activity_user_id
msgid "Responsible User"
msgstr ""
#. module: hr-luncheon-voucher
#: code:addons/hr-luncheon-voucher/models/hr_lv_allocation.py:0
#: code:addons/hr-luncheon-voucher/models/hr_lv_allocation.py:0
#: code:addons/hr-luncheon-voucher/wizard/generate_lv_allocations_wizard.py:0
#: code:addons/hr-luncheon-voucher/wizard/generate_lv_allocations_wizard.py:0
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_generate_lv_allocation_requests__date_from
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__date_from
#, python-format
msgid "Start Date"
msgstr "Date de début"
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__state
msgid "Status"
msgstr "Statut"
#. module: hr-luncheon-voucher
#: model:ir.model.fields,help:hr-luncheon-voucher.field_hr_lv_allocation__activity_state
msgid ""
"Status based on activities\n"
"Overdue: Due date is already passed\n"
"Today: Activity date is today\n"
"Planned: Future activities."
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,help:hr-luncheon-voucher.field_hr_lv_allocation__state
msgid ""
"The status is set to 'Draft', when an allocation request is created.\n"
"The status is 'Confirmed', when an allocation request is confirmed by HR manager.\n"
"The status is 'Distributed', when the luncheon vouchers have been distributed."
msgstr ""
#. module: hr-luncheon-voucher
#: code:addons/hr-luncheon-voucher/models/hr_employee.py:0
#: code:addons/hr-luncheon-voucher/models/hr_employee.py:0
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_employee__total_acquired_lv
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_employee_base__total_acquired_lv
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_employee_public__total_acquired_lv
#, python-format
msgid "Total allocated luncheon vouchers"
msgstr "Total Tickets restaurant alloués"
#. module: hr-luncheon-voucher
#: model:ir.model.fields,help:hr-luncheon-voucher.field_hr_lv_allocation__activity_exception_decoration
msgid "Type of the exception activity on record."
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__message_unread
msgid "Unread Messages"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__message_unread_counter
msgid "Unread Messages Counter"
msgstr ""
#. module: hr-luncheon-voucher
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.res_config_settings_lv_form
msgid ""
"Voucher is acquired only if the employee worked during all his attendance."
msgstr "Les tickets sont acquis seulement si l'employé a travaillé durant toutes la période de présence."

View File

@@ -1,547 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr-luncheon-voucher
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-18 15:02+0000\n"
"PO-Revision-Date: 2023-01-18 15:02+0000\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: hr-luncheon-voucher
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.view_employee_form_lv
msgid "Acquired"
msgstr ""
#. module: hr-luncheon-voucher
#: code:addons/hr-luncheon-voucher/models/hr_lv_allocation.py:0
#: code:addons/hr-luncheon-voucher/models/hr_lv_allocation.py:0
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__number_acquired_lv
#, python-format
msgid "Acquired Vouchers"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__message_needaction
msgid "Action Needed"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__activity_ids
msgid "Activities"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__activity_exception_decoration
msgid "Activity Exception Decoration"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__activity_state
msgid "Activity State"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__activity_type_icon
msgid "Activity Type Icon"
msgstr ""
#. module: hr-luncheon-voucher
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.hr_lv_allocation_form
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.hr_lv_allocation_tree
msgid "Adjust distribution"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__message_attachment_count
msgid "Attachment Count"
msgstr ""
#. module: hr-luncheon-voucher
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.hr_lv_allocation_form
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.hr_lv_allocation_tree
msgid "Back to draft"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model,name:hr-luncheon-voucher.model_hr_employee_base
msgid "Basic Employee"
msgstr ""
#. module: hr-luncheon-voucher
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.lv_allocations_requests_wizard
msgid "Cancel"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model,name:hr-luncheon-voucher.model_res_company
msgid "Companies"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model,name:hr-luncheon-voucher.model_res_config_settings
msgid "Config Settings"
msgstr ""
#. module: hr-luncheon-voucher
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.hr_lv_allocation_form
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.hr_lv_allocation_tree
msgid "Confirm"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields.selection,name:hr-luncheon-voucher.selection__hr_lv_allocation__state__confirmed
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.hr_lv_allocation_search
msgid "Confirmed"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.actions.act_window,name:hr-luncheon-voucher.lv_allocations_requests_wizard_action
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.lv_allocations_requests_wizard
msgid "Create Luncheon Vouchers allocations requests"
msgstr ""
#. module: hr-luncheon-voucher
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.lv_allocations_requests_wizard
msgid "Create allocations requests"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_generate_lv_allocation_requests__create_uid
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__create_uid
msgid "Created by"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_generate_lv_allocation_requests__create_date
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__create_date
msgid "Created on"
msgstr ""
#. module: hr-luncheon-voucher
#: code:addons/hr-luncheon-voucher/models/hr_employee.py:0
#: code:addons/hr-luncheon-voucher/models/hr_employee.py:0
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_employee__default_monthly_lv
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_employee_base__default_monthly_lv
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_employee_public__default_monthly_lv
#, python-format
msgid "Default monthly distribution"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_calendar_event_type__display_name
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_generate_lv_allocation_requests__display_name
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_employee_base__display_name
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__display_name
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_res_company__display_name
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_res_config_settings__display_name
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_resource_calendar__display_name
msgid "Display Name"
msgstr ""
#. module: hr-luncheon-voucher
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.hr_lv_allocation_form
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.hr_lv_allocation_tree
msgid "Distribute Vouchers"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields.selection,name:hr-luncheon-voucher.selection__hr_lv_allocation__state__distributed
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.hr_lv_allocation_search
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.view_employee_form_lv
msgid "Distributed"
msgstr ""
#. module: hr-luncheon-voucher
#: code:addons/hr-luncheon-voucher/models/hr_lv_allocation.py:0
#: code:addons/hr-luncheon-voucher/models/hr_lv_allocation.py:0
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__number_distributed_lv
#, python-format
msgid "Distributed Vouchers"
msgstr ""
#. module: hr-luncheon-voucher
#: code:addons/hr-luncheon-voucher/models/hr_employee.py:0
#: code:addons/hr-luncheon-voucher/models/hr_employee.py:0
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_employee__distributed_lv
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_employee_base__distributed_lv
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_employee_public__distributed_lv
#, python-format
msgid "Distributed luncheon vouchers"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_generate_lv_allocation_requests__distrib_campaign_name
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__distrib_campaign_name
msgid "Distribution campaign"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields.selection,name:hr-luncheon-voucher.selection__hr_lv_allocation__state__draft
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.hr_lv_allocation_search
msgid "Draft"
msgstr ""
#. module: hr-luncheon-voucher
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.view_employee_form_lv
msgid "Dued"
msgstr ""
#. module: hr-luncheon-voucher
#: code:addons/hr-luncheon-voucher/models/hr_lv_allocation.py:0
#: code:addons/hr-luncheon-voucher/models/hr_lv_allocation.py:0
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__number_dued_lv
#, python-format
msgid "Dued Vouchers"
msgstr ""
#. module: hr-luncheon-voucher
#: code:addons/hr-luncheon-voucher/models/hr_lv_allocation.py:0
#: code:addons/hr-luncheon-voucher/models/hr_lv_allocation.py:0
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__employee_id
#, python-format
msgid "Employee"
msgstr ""
#. module: hr-luncheon-voucher
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.res_config_settings_lv_form
msgid "Employee Luncheon Vouchers"
msgstr ""
#. module: hr-luncheon-voucher
#: code:addons/hr-luncheon-voucher/models/hr_lv_allocation.py:0
#: code:addons/hr-luncheon-voucher/models/hr_lv_allocation.py:0
#: code:addons/hr-luncheon-voucher/wizard/generate_lv_allocations_wizard.py:0
#: code:addons/hr-luncheon-voucher/wizard/generate_lv_allocations_wizard.py:0
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_generate_lv_allocation_requests__date_to
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__date_to
#, python-format
msgid "End Date"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model,name:hr-luncheon-voucher.model_calendar_event_type
msgid "Event Meeting Type"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__message_follower_ids
msgid "Followers"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__message_channel_ids
msgid "Followers (Channels)"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__message_partner_ids
msgid "Followers (Partners)"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,help:hr-luncheon-voucher.field_hr_lv_allocation__activity_type_icon
msgid "Font awesome icon e.g. fa-tasks"
msgstr ""
#. module: hr-luncheon-voucher
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.view_employee_tree_lv
msgid "Generate Luncheon Vouchers Allocations"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model,name:hr-luncheon-voucher.model_generate_lv_allocation_requests
msgid "Generate Luncheon Vouchers Allocations Requests"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_res_company__hr_half_day_cancels_voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_res_config_settings__hr_half_day_cancels_voucher
msgid "Half working days cancel luncheon vouchers"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_calendar_event_type__id
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_generate_lv_allocation_requests__id
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_employee_base__id
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__id
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_res_company__id
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_res_config_settings__id
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_resource_calendar__id
msgid "ID"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__activity_exception_icon
msgid "Icon"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,help:hr-luncheon-voucher.field_hr_lv_allocation__activity_exception_icon
msgid "Icon to indicate an exception activity."
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,help:hr-luncheon-voucher.field_hr_lv_allocation__message_needaction
#: model:ir.model.fields,help:hr-luncheon-voucher.field_hr_lv_allocation__message_unread
msgid "If checked, new messages require your attention."
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,help:hr-luncheon-voucher.field_hr_lv_allocation__message_has_error
msgid "If checked, some messages have a delivery error."
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__message_is_follower
msgid "Is Follower"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_calendar_event_type____last_update
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_generate_lv_allocation_requests____last_update
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_employee_base____last_update
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation____last_update
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_res_company____last_update
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_res_config_settings____last_update
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_resource_calendar____last_update
msgid "Last Modified on"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_generate_lv_allocation_requests__write_uid
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__write_uid
msgid "Last Updated by"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_generate_lv_allocation_requests__write_date
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__write_date
msgid "Last Updated on"
msgstr ""
#. module: hr-luncheon-voucher
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.view_employee_form_lv
msgid "Luncheon Vouchers"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model,name:hr-luncheon-voucher.model_hr_lv_allocation
msgid "Luncheon Vouchers Allocation"
msgstr ""
#. module: hr-luncheon-voucher
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.res_config_settings_lv_form
msgid "Luncheon Vouchers Half-day Cancel"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.ui.menu,name:hr-luncheon-voucher.menu_hr_lv_allocations
msgid "Luncheon vouchers"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.actions.act_window,name:hr-luncheon-voucher.act_lv_allocations
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.hr_lv_allocation_search
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.hr_lv_allocation_tree
msgid "Luncheon vouchers allocations"
msgstr ""
#. module: hr-luncheon-voucher
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.hr_lv_allocation_form
msgid "Luncheon vouchers calculation"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_employee__lv_allocations_ids
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_employee_base__lv_allocations_ids
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_employee_public__lv_allocations_ids
msgid "Lv Allocations"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__message_main_attachment_id
msgid "Main Attachment"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__message_has_error
msgid "Message Delivery error"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__message_ids
msgid "Messages"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__my_activity_date_deadline
msgid "My Activity Deadline"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__name
msgid "Name"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__activity_date_deadline
msgid "Next Activity Deadline"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__activity_summary
msgid "Next Activity Summary"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__activity_type_id
msgid "Next Activity Type"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__message_needaction_counter
msgid "Number of Actions"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__message_has_error_counter
msgid "Number of errors"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,help:hr-luncheon-voucher.field_hr_lv_allocation__message_needaction_counter
msgid "Number of messages which requires an action"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,help:hr-luncheon-voucher.field_hr_lv_allocation__message_has_error_counter
msgid "Number of messages with delivery error"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,help:hr-luncheon-voucher.field_hr_lv_allocation__message_unread_counter
msgid "Number of unread messages"
msgstr ""
#. module: hr-luncheon-voucher
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.lv_allocations_requests_wizard
msgid "Period to consider"
msgstr ""
#. module: hr-luncheon-voucher
#: code:addons/hr-luncheon-voucher/models/calendar_event_type.py:0
#: code:addons/hr-luncheon-voucher/models/calendar_event_type.py:0
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_calendar_event_type__ref
#, python-format
msgid "Reference"
msgstr ""
#. module: hr-luncheon-voucher
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.view_employee_form_lv
msgid "Refresh Luncheon Vouchers"
msgstr ""
#. module: hr-luncheon-voucher
#: code:addons/hr-luncheon-voucher/models/hr_employee.py:0
#: code:addons/hr-luncheon-voucher/models/hr_employee.py:0
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_employee__dued_lv
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_employee_base__dued_lv
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_employee_public__dued_lv
#, python-format
msgid "Remaining luncheon vouchers"
msgstr ""
#. module: hr-luncheon-voucher
#: code:addons/hr-luncheon-voucher/models/calendar_event_type.py:0
#: code:addons/hr-luncheon-voucher/models/calendar_event_type.py:0
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_calendar_event_type__remove_luncheon_voucher
#, python-format
msgid "Remove luncheon voucher"
msgstr ""
#. module: hr-luncheon-voucher
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.hr_lv_allocation_form
msgid "Request context"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model,name:hr-luncheon-voucher.model_resource_calendar
msgid "Resource Working Time"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__activity_user_id
msgid "Responsible User"
msgstr ""
#. module: hr-luncheon-voucher
#: code:addons/hr-luncheon-voucher/models/hr_lv_allocation.py:0
#: code:addons/hr-luncheon-voucher/models/hr_lv_allocation.py:0
#: code:addons/hr-luncheon-voucher/wizard/generate_lv_allocations_wizard.py:0
#: code:addons/hr-luncheon-voucher/wizard/generate_lv_allocations_wizard.py:0
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_generate_lv_allocation_requests__date_from
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__date_from
#, python-format
msgid "Start Date"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__state
msgid "Status"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,help:hr-luncheon-voucher.field_hr_lv_allocation__activity_state
msgid ""
"Status based on activities\n"
"Overdue: Due date is already passed\n"
"Today: Activity date is today\n"
"Planned: Future activities."
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,help:hr-luncheon-voucher.field_hr_lv_allocation__state
msgid ""
"The status is set to 'Draft', when an allocation request is created.\n"
"The status is 'Confirmed', when an allocation request is confirmed by HR manager.\n"
"The status is 'Distributed', when the luncheon vouchers have been distributed."
msgstr ""
#. module: hr-luncheon-voucher
#: code:addons/hr-luncheon-voucher/models/hr_employee.py:0
#: code:addons/hr-luncheon-voucher/models/hr_employee.py:0
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_employee__total_acquired_lv
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_employee_base__total_acquired_lv
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_employee_public__total_acquired_lv
#, python-format
msgid "Total allocated luncheon vouchers"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,help:hr-luncheon-voucher.field_hr_lv_allocation__activity_exception_decoration
msgid "Type of the exception activity on record."
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__message_unread
msgid "Unread Messages"
msgstr ""
#. module: hr-luncheon-voucher
#: model:ir.model.fields,field_description:hr-luncheon-voucher.field_hr_lv_allocation__message_unread_counter
msgid "Unread Messages Counter"
msgstr ""
#. module: hr-luncheon-voucher
#: model_terms:ir.ui.view,arch_db:hr-luncheon-voucher.res_config_settings_lv_form
msgid ""
"Voucher is acquired only if the employee worked during all his attendance."
msgstr ""

View File

@@ -1,7 +0,0 @@
# -*- coding: utf-8 -*-
from . import calendar_event_type
from . import hr_employee
from . import hr_lv_allocation
from . import res_company
from . import res_config_settings

View File

@@ -1,19 +0,0 @@
# -*- coding: utf-8 -*-
from odoo import fields, models, _
class MeetingType(models.Model):
_inherit = "calendar.event.type"
ref = fields.Char(
string=_("Reference"),
copy=False,
store=True,
)
remove_luncheon_voucher = fields.Boolean(
string=_("Remove luncheon voucher"),
copy=True,
store=True,
)

View File

@@ -1,76 +0,0 @@
# -*- coding: utf-8 -*-
from xml.dom.minicompat import EmptyNodeList
from odoo import fields, models, api, _
class HrEmployeeBase(models.AbstractModel):
_inherit = "hr.employee.base"
lv_allocations_ids = fields.One2many("hr.lv.allocation", "employee_id")
total_acquired_lv = fields.Integer(
string=_("Total allocated luncheon vouchers"), store=True, copy=False
)
distributed_lv = fields.Integer(
string=_("Distributed luncheon vouchers"), store=True, copy=False
)
dued_lv = fields.Integer(
string=_("Remaining luncheon vouchers"), store=True, copy=False
)
default_monthly_lv = fields.Integer(
string=_("Default monthly distribution"), store=True, copy=True
)
def refresh_lv_values(self):
for record in self:
record._compute_total_acquired_lv()
record._compute_distributed_lv()
record._compute_dued_lv()
def _compute_total_acquired_lv(self):
for record in self:
allocations = self.env["hr.lv.allocation"].search(
[("employee_id", "=", record.id), ("state", "=", ["confirmed", "distributed"])]
)
record.total_acquired_lv = sum(allocations.mapped("number_acquired_lv"))
def _compute_distributed_lv(self):
for record in self:
allocations = self.env["hr.lv.allocation"].search(
[("employee_id", "=", record.id), ("state", "=", "distributed")]
)
record.distributed_lv = sum(allocations.mapped("number_distributed_lv"))
def _compute_dued_lv(self):
for record in self:
record.dued_lv = record.total_acquired_lv - record.distributed_lv
def generate_mass_lv_allocation(self, values):
for record in self:
record.generate_lv_allocation(values)
def generate_lv_allocation(self, values):
self.ensure_one()
values["employee_id"] = self.id
values["name"] = values["distrib_campaign_name"] + " - " + self.name
self.env["hr.lv.allocation"].create(values)
def action_lv_allocations(self):
action = self.env["ir.actions.act_window"]._for_xml_id("hr-luncheon-voucher.act_lv_allocations")
action['context'] = {
'search_default_employee_id': self.id,
'default_employee_id': self.id,
}
action['domain'] = [('employee_id', '=', self.id)]
return action
def action_lv_allocations_requests_wizard(self):
action = self.env["ir.actions.act_window"]._for_xml_id(
"hr-luncheon-voucher.lv_allocations_requests_wizard_action"
)
ctx = dict(self.env.context)
ctx["active_ids"] = self.ids
action["context"] = ctx
return action

View File

@@ -1,188 +0,0 @@
# -*- coding: utf-8 -*-
import math
from datetime import datetime, date, timedelta, time
from dateutil.rrule import rrule, DAILY
from pytz import timezone, UTC, utc
from odoo import fields, models, api, _
class LuncheonVouchersAllocation(models.Model):
_name = "hr.lv.allocation"
_description = "Luncheon Vouchers Allocation"
_order = "create_date desc"
_inherit = ["mail.thread", "mail.activity.mixin"]
_mail_post_access = "read"
name = fields.Char('Name')
distrib_campaign_name = fields.Char('Distribution campaign')
state = fields.Selection(
[
("draft", "Draft"),
("confirmed", "Confirmed"),
("distributed", "Distributed"),
],
string="Status",
readonly=True,
tracking=True,
copy=False,
default="draft",
help="The status is set to 'Draft', when an allocation request is created."
+ "\nThe status is 'Confirmed', when an allocation request is confirmed by HR manager."
+ "\nThe status is 'Distributed', when the luncheon vouchers have been distributed.",
)
date_from = fields.Datetime(
string=_("Start Date"),
store=True,
readonly=False,
copy=False,
tracking=True,
states={
"confirmed": [("readonly", True)],
"distributed": [("readonly", True)],
},
)
date_to = fields.Datetime(
string=_("End Date"),
store=True,
readonly=False,
copy=False,
tracking=True,
states={
"confirmed": [("readonly", True)],
"distributed": [("readonly", True)],
},
)
employee_id = fields.Many2one(
"hr.employee",
store=True,
string=_("Employee"),
index=True,
readonly=False,
ondelete="restrict",
tracking=True,
states={
"confirmed": [("readonly", True)],
"distributed": [("readonly", True)],
},
)
number_acquired_lv = fields.Integer(
string=_("Acquired Vouchers"),
store=True,
readonly=False,
tracking=True,
states={
"confirmed": [("readonly", True)],
"distributed": [("readonly", True)],
},
)
number_dued_lv = fields.Integer(
string=_("Dued Vouchers"),
store=True,
readonly=False,
tracking=True,
states={
"confirmed": [("readonly", True)],
"distributed": [("readonly", True)],
},
)
number_distributed_lv = fields.Integer(
string=_("Distributed Vouchers"),
store=True,
readonly=False,
tracking=True,
states={
"confirmed": [("readonly", False)],
"distributed": [("readonly", True)],
},
)
@api.model_create_multi
def create(self, values):
res = super(LuncheonVouchersAllocation, self).create(values)
res._calculate_number_acquired_lv()
res._calculate_number_dued_lv()
res._default_number_distributed_lv()
return res
@api.depends("employee_id")
def _default_number_distributed_lv(self):
for record in self:
record.number_distributed_lv = record.employee_id.default_monthly_lv
def _has_cancelling_voucher_event(self, day):
category_no_voucher_ids = self.env["calendar.event.type"].search([("remove_luncheon_voucher", "=", True)])
events = self.env["calendar.event"].search([("categ_ids", "in", category_no_voucher_ids.ids)])
day_start = fields.Datetime.to_datetime(day.date())
day_end = fields.Datetime.to_datetime(day.date()) + timedelta(hours=24)
cancelling_events = events.filtered(lambda x: not((x.start < day_start) and (x.stop <= day_start)) and not((x.start >= day_end) and (x.stop > day_end)) )
if len(cancelling_events) > 0:
return True
else:
return False
def _calculate_number_acquired_lv(self):
nb_eligible_days = 0
dfrom = datetime.combine(fields.Date.from_string(self.date_from), time.min).replace(tzinfo=UTC)
dto = datetime.combine(fields.Date.from_string(self.date_to), time.max).replace(tzinfo=UTC)
period_days = rrule(DAILY, dfrom, until=dto)
calendar_resource = self.employee_id.resource_calendar_id
for day in period_days:
# Check if this days is a working day
if not calendar_resource.is_working_day(day):
continue
# The employee should work this day but...
if self.env.company.hr_half_day_cancels_voucher and not calendar_resource.is_full_working_day(day):
# The luncheon voucher is acquired only if the employee has worked the entire day
continue
# Check leaves
if not calendar_resource.is_worked_day(self.employee_id, day):
continue
# The employee has worked this day but...
if self.env.company.hr_half_day_cancels_voucher and not calendar_resource.all_attendances_worked(self.employee_id.resource_id, day):
# The luncheon voucher is acquired only if the employee has worked the entire day
continue
# Check there is no event cancelling the voucher
if self._has_cancelling_voucher_event(day):
continue
# All checks passed, the days is eligible for a voucher
nb_eligible_days += 1
self.number_acquired_lv = nb_eligible_days
def _calculate_number_dued_lv(self):
for record in self:
if record.state == "distributed":
record.number_dued_lv = record.employee_id.dued_lv
else:
record.number_dued_lv = (
record.employee_id.dued_lv + record.number_acquired_lv
)
def confirm_allocation(self):
for record in self:
if record.state == "draft":
record.state = "confirmed"
record.employee_id._compute_total_acquired_lv()
record.employee_id._compute_dued_lv()
def back_to_draft(self):
for record in self:
if record.state in ["confirmed","distributed"]:
record.state = "draft"
record.employee_id._compute_total_acquired_lv()
record.employee_id._compute_distributed_lv()
record.employee_id._compute_dued_lv()
def distribute_allocation(self):
for record in self:
if record.state == "confirmed":
record.state = "distributed"
record.employee_id._compute_distributed_lv()
record.employee_id._compute_dued_lv()
def adjust_distribution(self):
for record in self:
for record in self:
if record.state == "draft":
record.number_distributed_lv = record.employee_id.dued_lv + record.number_acquired_lv

View File

@@ -1,7 +0,0 @@
from odoo import fields, models
class Company(models.Model):
_inherit = 'res.company'
hr_half_day_cancels_voucher = fields.Boolean(string="Half working days cancel luncheon vouchers")

View File

@@ -1,10 +0,0 @@
# -*- coding: utf-8 -*-
from odoo import fields, models
class ResConfigSettings(models.TransientModel):
_inherit = 'res.config.settings'
hr_half_day_cancels_voucher = fields.Boolean(string="Half working days cancel luncheon vouchers", related="company_id.hr_half_day_cancels_voucher", readonly=False)

View File

@@ -1,5 +0,0 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_lv_allocation_user,access_lv_allocation_user,model_hr_lv_allocation,hr.group_hr_user,1,0,0,0
access_lv_allocation_manager,access_lv_allocation_manager,model_hr_lv_allocation,hr.group_hr_manager,1,1,1,1
access_lv_allocation_wizard_user,access_lv_allocation_wizard_user,model_generate_lv_allocation_requests,hr.group_hr_user,1,0,0,0
access_lv_allocation_wizard_manager,access_lv_allocation_wizard_manager,model_generate_lv_allocation_requests,hr.group_hr_manager,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_lv_allocation_user access_lv_allocation_user model_hr_lv_allocation hr.group_hr_user 1 0 0 0
3 access_lv_allocation_manager access_lv_allocation_manager model_hr_lv_allocation hr.group_hr_manager 1 1 1 1
4 access_lv_allocation_wizard_user access_lv_allocation_wizard_user model_generate_lv_allocation_requests hr.group_hr_user 1 0 0 0
5 access_lv_allocation_wizard_manager access_lv_allocation_wizard_manager model_generate_lv_allocation_requests hr.group_hr_manager 1 1 1 1

View File

@@ -1,13 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_event_type_luncheonvoucher_tree" model="ir.ui.view">
<field name="name">event.type.luncheonvoucher</field>
<field name="model">calendar.event.type</field>
<field name="inherit_id" ref="calendar.view_calendar_event_type_tree" />
<field name="arch" type="xml">
<xpath expr="//field[@name='name']" position="after">
<field name="remove_luncheon_voucher" />
</xpath>
</field>
</record>
</odoo>

View File

@@ -1,45 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_employee_form_lv" model="ir.ui.view">
<field name="name">hr.employee.form.lv</field>
<field name="model">hr.employee</field>
<field name="inherit_id" ref="hr.view_employee_form" />
<field name="arch" type="xml">
<header position="inside">
<button type="object" name="refresh_lv_values" string="Refresh Luncheon Vouchers" class="btn-secundary" />
</header>
<xpath expr="//div[@name='button_box']" position="inside">
<button type="object" name="action_lv_allocations" class="oe_stat_button" icon="fa-ticket">
<field name="total_acquired_lv" widget="statinfo" string="Acquired" />
</button>
<button type="object" name="action_lv_allocations" class="oe_stat_button" icon="fa-ticket">
<field name="distributed_lv" widget="statinfo" string="Distributed" />
</button>
<button type="object" name="action_lv_allocations" class="oe_stat_button" icon="fa-ticket">
<field name="dued_lv" widget="statinfo" string="Dued" />
</button>
</xpath>
<xpath expr="//page[@name='hr_settings']/group" position="inside">
<group name="luncheon_vouchers" string="Luncheon Vouchers">
<field name="default_monthly_lv" />
<field name="lv_allocations_ids" />
</group>
</xpath>
</field>
</record>
<record id="view_employee_tree_lv" model="ir.ui.view">
<field name="name">view_employee_tree_lv</field>
<field name="model">hr.employee</field>
<field name="inherit_id" ref="hr.view_employee_tree" />
<field name="arch" type="xml">
<xpath expr="//tree" position="inside">
<header>
<button type="object" name="action_lv_allocations_requests_wizard" string="Generate Luncheon Vouchers Allocations" class="btn-primary" />
</header>
</xpath>
</field>
</record>
</odoo>

View File

@@ -1,86 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="hr_lv_allocation_search" model="ir.ui.view">
<field name="name">hr.lv.allocation.search</field>
<field name="model">hr.lv.allocation</field>
<field name="arch" type="xml">
<search string="Luncheon vouchers allocations">
<field name="state" />
<filter name="draft" string="Draft" domain="[('state', '=', 'draft')]" />
<filter name="confirmed" string="Confirmed" domain="[('state', '=', 'confirmed')]" />
<filter name="distributed" string="Distributed"
domain="[('state', '=', 'distributed')]" />
</search>
</field>
</record>
<record id="hr_lv_allocation_tree" model="ir.ui.view">
<field name="name">hr.lv.allocation.tree</field>
<field name="model">hr.lv.allocation</field>
<field name="arch" type="xml">
<tree string="Luncheon vouchers allocations">
<header>
<button type="object" name="confirm_allocation" string="Confirm"
class="btn-primary" />
<button type="object" name="distribute_allocation" string="Distribute Vouchers"
class="btn-primary" />
<button type="object" name="back_to_draft" string="Back to draft"
class="btn-secundary" />
<button type="object" name="adjust_distribution" string="Adjust distribution"
class="btn-secundary" />
</header>
<field name="distrib_campaign_name" />
<field name="employee_id" />
<field name="state" />
<field name="date_from" widget="date" />
<field name="date_to" widget="date" />
<field name="number_acquired_lv" />
<field name="number_dued_lv" />
<field name="number_distributed_lv" />
</tree>
</field>
</record>
<record id="hr_lv_allocation_form" model="ir.ui.view">
<field name="name">hr.lv.allocation.form</field>
<field name="model">hr.lv.allocation</field>
<field name="arch" type="xml">
<form string="">
<header>
<button type="object" name="confirm_allocation" string="Confirm"
class="btn-primary" attrs="{'invisible': [('state', '!=', 'draft')]}" />
<button type="object" name="distribute_allocation" string="Distribute Vouchers"
class="btn-primary" attrs="{'invisible': [('state', '!=', 'confirmed')]}" />
<button type="object" name="back_to_draft" string="Back to draft"
class="btn-secundary" attrs="{'invisible': [('state', '=', 'draft')]}" />
<button type="object" name="adjust_distribution" string="Adjust distribution"
class="btn-secundary" attrs="{'invisible': [('state', '!=', 'draft')]}" />
</header>
<sheet>
<h1>
<field name="name" readonly="1" />
</h1>
<group string="Request context">
<field name="distrib_campaign_name" />
<field name="employee_id" />
<field name="state" />
<field name="date_from" widget="date" />
<field name="date_to" widget="date" />
</group>
<group string="Luncheon vouchers calculation">
<field name="number_acquired_lv" />
<field name="number_dued_lv" />
<field name="number_distributed_lv" />
</group>
</sheet>
</form>
</field>
</record>
<record id="act_lv_allocations" model="ir.actions.act_window">
<field name="name">Luncheon vouchers allocations</field>
<field name="res_model">hr.lv.allocation</field>
<field name="view_mode">tree,form</field>
</record>
</odoo>

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<menuitem id="menu_hr_lv_allocations" action="act_lv_allocations" parent="hr.menu_hr_employee_payroll" sequence="1" name="Luncheon vouchers" />
</odoo>

View File

@@ -1,27 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="res_config_settings_lv_form" model="ir.ui.view">
<field name="name">res.config.settings.view.form.inherit.lv</field>
<field name="model">res.config.settings</field>
<field name="priority" eval="99" />
<field name="inherit_id" ref="hr.res_config_settings_view_form" />
<field name="arch" type="xml">
<xpath expr="//div[@name='employee_rights_setting_container']/.." position="inside">
<h2>Employee Luncheon Vouchers</h2>
<div class="row mt16 o_settings_container" name="employee_lv_container">
<div class="col-12 col-lg-6 o_setting_box" id="employee_lv_halfday_cancel" title="Luncheon Vouchers Half-day Cancel">
<div class="o_setting_left_pane">
<field name="hr_half_day_cancels_voucher" />
</div>
<div class="o_setting_right_pane">
<label for="hr_half_day_cancels_voucher" />
<div class="text-muted" name="hr_presence_options_advanced">
Voucher is acquired only if the employee worked during all his attendance.
</div>
</div>
</div>
</div>
</xpath>
</field>
</record>
</odoo>

View File

@@ -1,3 +0,0 @@
# -*- coding: utf-8 -*-
from . import generate_lv_allocations_wizard

View File

@@ -1,29 +0,0 @@
from odoo import _, api, fields, models
class GenerateLVAllocationRequests(models.TransientModel):
_name = "generate.lv.allocation.requests"
_description = "Generate Luncheon Vouchers Allocations Requests"
distrib_campaign_name = fields.Char('Distribution campaign', required=True)
date_from = fields.Datetime(
string=_("Start Date"),
required=True
)
date_to = fields.Datetime(
string=_("End Date"),
required=True
)
def generate_lv_allocations(self):
values = {}
values["distrib_campaign_name"] = self.distrib_campaign_name
values["date_from"] = self.date_from
values["date_to"] = self.date_to
employees = self.env["hr.employee"].search(
[
("id", "in", self.env.context.get("active_ids")),
]
)
employees.generate_mass_lv_allocation(values)
# Open lv allocation tree view
return self.env["ir.actions.act_window"]._for_xml_id("hr-luncheon-voucher.act_lv_allocations")

View File

@@ -1,32 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="lv_allocations_requests_wizard" model="ir.ui.view">
<field name="name">lv.allocations.requests.wizard</field>
<field name="model">generate.lv.allocation.requests</field>
<field name="arch" type="xml">
<form string="Create Luncheon Vouchers allocations requests">
<group name="dates" string="Period to consider">
<group>
<field name="distrib_campaign_name" />
<field name="date_from" widget="date" />
<field name="date_to" widget="date" />
</group>
</group>
<footer>
<button string="Create allocations requests" name="generate_lv_allocations" type="object" class="btn-primary" />
<button string="Cancel" class="btn-secondary" special="cancel" />
</footer>
</form>
</field>
</record>
<record id="lv_allocations_requests_wizard_action" model="ir.actions.act_window">
<field name="name">Create Luncheon Vouchers allocations requests</field>
<field name="res_model">generate.lv.allocation.requests</field>
<field name="view_mode">form</field>
<field name="view_id" ref="lv_allocations_requests_wizard" />
<field name="target">new</field>
</record>
</data>
</odoo>

View File

@@ -1,43 +0,0 @@
==============================
hr_effective_attendance_period
==============================
Provide indication that attendance are effectively worked periods or not
Installation
============
Use Odoo normal module installation procedure to install
``hr_effective_attendance_period``.
Known issues / Roadmap
======================
None yet.
Bug Tracker
===========
Bugs are tracked on `our issues website <https://github.com/elabore-coop/hr-tools/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.
Credits
=======
Contributors
------------
* Stéphan Sainléger
Funders
-------
The development of this module has been financially supported by:
* Elabore (https://elabore.coop)
Maintainer
----------
This module is maintained by Elabore.

View File

@@ -1,3 +0,0 @@
# -*- coding: utf-8 -*-
from . import models

View File

@@ -1,37 +0,0 @@
# Copyright 2023 Stéphan Sainléger (Elabore)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
"name": "hr_effective_attendance_period",
"version": "14.0.2.0.0",
"author": "Elabore",
"website": "https://elabore.coop",
"maintainer": "Stéphan Sainléger",
"license": "AGPL-3",
"category": "Tools",
"summary": "Provide indication that attendance are effectively worked periods or not",
# any module necessary for this one to work correctly
"depends": [
"base",
"resource",
],
"qweb": [
# "static/src/xml/*.xml",
],
"external_dependencies": {
"python": [],
},
# always loaded
"data": [
"views/resource_views.xml",
],
# only loaded in demonstration mode
"demo": [],
"js": [],
"css": [],
"installable": True,
# Install this module automatically if all dependency have been previously
# and independently installed. Used for synergetic or glue modules.
"auto_install": False,
"application": False,
}

View File

@@ -1 +0,0 @@
This directory should contain the *.po for Odoo translation.

View File

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

View File

@@ -1,77 +0,0 @@
import math
from datetime import timedelta
from odoo import models, fields
class ResourceCalendarAttendance(models.Model):
_inherit = "resource.calendar.attendance"
effective_attendance_period = fields.Boolean('Effective Attendance Period', store=True)
class ResourceCalendar(models.Model):
_inherit = "resource.calendar"
def _retrieve_day_matching_attendances(self, day):
domain = [
("calendar_id", "=", self.id),
("dayofweek", "=", day.weekday()),
("effective_attendance_period", "=", True)
]
if self.two_weeks_calendar:
# Employee has Even/Odd weekly calendar
week_type = 1 if int(math.floor((day.toordinal() - 1) / 7) % 2) else 0
domain.append(("week_type", "=", week_type))
result = self.env["resource.calendar.attendance"].search(domain)
return result
def is_working_day(self, day):
day_attendances = self._retrieve_day_matching_attendances(day)
if len(day_attendances) == 0:
# This day of the week is not supposed to be a working day
return False
else:
# This day of the week is supposed to be a working day
return True
def is_full_working_day(self, day):
day_attendances = self._retrieve_day_matching_attendances(day)
morning_worked = len(day_attendances.filtered(lambda x: x.day_period == "morning")) > 0
afternoon_worked = len(day_attendances.filtered(lambda x: x.day_period == "afternoon")) > 0
return morning_worked and afternoon_worked
def _is_worked_attendance(self, resource, day, attendance):
attendance_start = fields.Datetime.to_datetime(day.date()) + timedelta(hours=attendance.hour_from)
attendance_end = fields.Datetime.to_datetime(day.date()) + timedelta(hours=attendance.hour_to)
resource_leaves = self.env["resource.calendar.leaves"].search(
[
("company_id", "=", resource.company_id.id),
("date_from", "<=", attendance_start),
("date_to", ">=", attendance_end),
"|",
("resource_id", "=", resource.id),
("resource_id", "=", None),
]
)
if resource_leaves:
return False
else:
# a part or the whole attendance is worked
return True
def is_worked_day(self, resource, day):
day_attendances = self._retrieve_day_matching_attendances(day)
# If at least one attendance is worked, return True
for attendance in day_attendances:
if self._is_worked_attendance(resource, day, attendance):
return True
return False
def all_attendances_worked(self, resource, day):
day_attendances = self._retrieve_day_matching_attendances(day)
# If at least one attendance is not worked, return False
for attendance in day_attendances:
if not self._is_worked_attendance(resource, day, attendance):
return False
return True

View File

@@ -1,26 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="view_resource_calendar_attendance_tree_inherit_effective_attendance"
model="ir.ui.view">
<field name="name">resource.calendar.attendance.view.tree.inherit</field>
<field name="model">resource.calendar.attendance</field>
<field name="inherit_id" ref="resource.view_resource_calendar_attendance_tree" />
<field name="arch" type="xml">
<xpath expr="//field[@name='week_type']" position="after">
<field name="effective_attendance_period" />
</xpath>
</field>
</record>
<record id="view_resource_calendar_attendance_form_inherit_effective_attendance"
model="ir.ui.view">
<field name="name">resource.calendar.attendance.view.tree.inherit</field>
<field name="model">resource.calendar.attendance</field>
<field name="inherit_id" ref="resource.view_resource_calendar_attendance_form" />
<field name="arch" type="xml">
<xpath expr="//field[@name='day_period']" position="after">
<field name="effective_attendance_period" />
</xpath>
</field>
</record>
</odoo>