From 04edd72c68401b08370c0341bb5d72836312542c Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sun, 23 May 2021 18:09:54 +0200 Subject: [PATCH 001/133] init --- Admin/Install/Navigation.install.json | 0 Admin/Install/Navigation.php | 43 +++++++++++++++ Admin/Install/db.json | 0 Admin/Installer.php | 29 ++++++++++ Admin/Routes/Web/Backend.php | 9 ++++ Admin/Status.php | 29 ++++++++++ Admin/Uninstaller.php | 29 ++++++++++ Admin/Updater.php | 29 ++++++++++ Controller/ApiController.php | 36 +++++++++++++ Controller/BackendController.php | 39 ++++++++++++++ Controller/Controller.php | 78 +++++++++++++++++++++++++++ info.json | 59 ++++++++++++++++++++ 12 files changed, 380 insertions(+) create mode 100644 Admin/Install/Navigation.install.json create mode 100644 Admin/Install/Navigation.php create mode 100644 Admin/Install/db.json create mode 100644 Admin/Installer.php create mode 100644 Admin/Routes/Web/Backend.php create mode 100644 Admin/Status.php create mode 100644 Admin/Uninstaller.php create mode 100644 Admin/Updater.php create mode 100644 Controller/ApiController.php create mode 100644 Controller/BackendController.php create mode 100644 Controller/Controller.php create mode 100644 info.json diff --git a/Admin/Install/Navigation.install.json b/Admin/Install/Navigation.install.json new file mode 100644 index 0000000..e69de29 diff --git a/Admin/Install/Navigation.php b/Admin/Install/Navigation.php new file mode 100644 index 0000000..8363f99 --- /dev/null +++ b/Admin/Install/Navigation.php @@ -0,0 +1,43 @@ + __DIR__ . '/Navigation.install.json']); + } +} diff --git a/Admin/Install/db.json b/Admin/Install/db.json new file mode 100644 index 0000000..e69de29 diff --git a/Admin/Installer.php b/Admin/Installer.php new file mode 100644 index 0000000..f24d371 --- /dev/null +++ b/Admin/Installer.php @@ -0,0 +1,29 @@ + Date: Fri, 28 May 2021 20:28:40 +0200 Subject: [PATCH 002/133] general fixes and tpl additions --- .directory | 6 + .github/dev_bug_report.md | 35 ++++++ .github/dev_feature_request.md | 18 +++ .github/user_bug_report.md | 34 +++++ .github/user_feature_request.md | 18 +++ .github/workflows/greetings.yml | 13 ++ .github/workflows/image.yml | 24 ++++ .github/workflows/main.yml | 172 ++++++++++++++++++++++++++ Admin/Install/Navigation.install.json | 33 +++++ Admin/Install/db.json | 46 +++++++ 10 files changed, 399 insertions(+) create mode 100644 .directory create mode 100755 .github/dev_bug_report.md create mode 100755 .github/dev_feature_request.md create mode 100755 .github/user_bug_report.md create mode 100755 .github/user_feature_request.md create mode 100755 .github/workflows/greetings.yml create mode 100755 .github/workflows/image.yml create mode 100755 .github/workflows/main.yml diff --git a/.directory b/.directory new file mode 100644 index 0000000..12730b6 --- /dev/null +++ b/.directory @@ -0,0 +1,6 @@ +[Dolphin] +Timestamp=2021,5,23,18,50,7 +Version=4 + +[Settings] +HiddenFilesShown=true diff --git a/.github/dev_bug_report.md b/.github/dev_bug_report.md new file mode 100755 index 0000000..ef93e56 --- /dev/null +++ b/.github/dev_bug_report.md @@ -0,0 +1,35 @@ +--- +name: Dev Bug Report +about: Create a report to help us improve +title: '' +labels: stat_backlog, type_bug +assignees: '' + +--- + +# Bug Description +A clear and concise description of what the bug is. + +# How to Reproduce + +Steps to reproduce the behavior: + +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +## Minimal Code Example + +``` +// your code ... +``` + +# Expected Behavior +A clear and concise description of what you expected to happen. + +# Screenshots +If applicable, add screenshots to help explain your problem. + +# Additional Information +Add any other context about the problem here. diff --git a/.github/dev_feature_request.md b/.github/dev_feature_request.md new file mode 100755 index 0000000..9573c35 --- /dev/null +++ b/.github/dev_feature_request.md @@ -0,0 +1,18 @@ +--- +name: Dev Feature Request +about: Suggest an idea for this project +title: '' +labels: stat_backlog, type_feature +assignees: '' + +--- + +# What is the feature you request +* A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] +* A clear and concise description of what you want to happen. + +# Alternatives +A clear and concise description of any alternative solutions or features you've considered. + +# Additional Information +Add any other context or screenshots about the feature request here. diff --git a/.github/user_bug_report.md b/.github/user_bug_report.md new file mode 100755 index 0000000..df09513 --- /dev/null +++ b/.github/user_bug_report.md @@ -0,0 +1,34 @@ +--- +name: User Bug Report +about: Create a report to help us improve +title: '' +labels: stat_backlog, type_bug +assignees: '' + +--- + +# Bug Description +A clear and concise description of what the bug is. + +# How to Reproduce +Steps to reproduce the behavior: + +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +# Expected Behavior +A clear and concise description of what you expected to happen. + +# Screenshots +If applicable, add screenshots to help explain your problem. + +# System Information + - System: [e.g. PC or iPhone11, ...] + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Orange Management Version [e.g. 22] + +# Additional Information +Add any other context about the problem here. diff --git a/.github/user_feature_request.md b/.github/user_feature_request.md new file mode 100755 index 0000000..6eb8ddc --- /dev/null +++ b/.github/user_feature_request.md @@ -0,0 +1,18 @@ +--- +name: User Feature Request +about: Suggest an idea for this project +title: '' +labels: stat_backlog, type_feature +assignees: '' + +--- + +# What is the feature you request +* A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] +* A clear and concise description of what you want to happen. + +# Alternatives +A clear and concise description of any alternative solutions or features you've considered. + +# Additional Information +Add any other context or screenshots about the feature request here. diff --git a/.github/workflows/greetings.yml b/.github/workflows/greetings.yml new file mode 100755 index 0000000..adb8716 --- /dev/null +++ b/.github/workflows/greetings.yml @@ -0,0 +1,13 @@ +name: Greetings + +on: [pull_request, issues] + +jobs: + greeting: + runs-on: ubuntu-latest + steps: + - uses: actions/first-interaction@v1 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + issue-message: 'Thank you for createing this issue. We will check it as soon as possible.' + pr-message: 'Thank you for your pull request. We will check it as soon as possible.' diff --git a/.github/workflows/image.yml b/.github/workflows/image.yml new file mode 100755 index 0000000..d2fb2d4 --- /dev/null +++ b/.github/workflows/image.yml @@ -0,0 +1,24 @@ +name: Compress images +on: + push: + paths: + - '**.jpg' + - '**.png' + - '**.webp' + pull_request: + paths: + - '**.jpg' + - '**.png' + - '**.webp' +jobs: + build: + name: calibreapp/image-actions + runs-on: ubuntu-latest + steps: + - name: Checkout Repo + uses: actions/checkout@master + + - name: Compress Images + uses: calibreapp/image-actions@master + with: + githubToken: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100755 index 0000000..295f795 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,172 @@ +name: CI/CD + +on: [push] + +jobs: + autoformat: + runs-on: ubuntu-latest + if: "!contains(github.event.head_commit.message, 'NO_CI')" + strategy: + fail-fast: false + max-parallel: 3 + steps: + - name: Checkout Repository + uses: actions/checkout@master + with: + fetch-depth: 1 + - name: Get Composer Cache Directory + id: composer-cache + run: echo "::set-output name=dir::$(composer config cache-files-dir)" + - name: Cache dependencies + uses: actions/cache@v1 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} + restore-keys: ${{ runner.os }}-composer- + - name: Setup Composer + run: composer install + - name: Autoformat + run: 'vendor/bin/php-cs-fixer fix ./ --rules=''{"array_syntax": {"syntax": "short"}, "blank_line_after_namespace": true, "binary_operator_spaces": {"operators": {"=": "align", ".=": "align", "+=": "align", "-=": "align", "*=": "align", "/=": "align", "|=": "align", "&=": "align", "=>": "align", "??=": "align"}}, "cast_spaces": {"space": "single"}, "class_attributes_separation": { "elements": ["const", "method", "property"] }, "combine_consecutive_issets": true, "compact_nullable_typehint": true, "declare_strict_types": true, "declare_equal_normalize": {"space": "none"}, "elseif": true, "encoding": true, "explicit_indirect_variable": true, "explicit_string_variable": true, "function_to_constant": true, "implode_call": true, "increment_style": {"style": "pre"}, "is_null": {"use_yoda_style": false}, "line_ending": true, "logical_operators": true, "lowercase_cast": true, "lowercase_constants": true, "lowercase_keywords": true, "modernize_types_casting": true, "native_constant_invocation": true, "native_function_casing": true, "native_function_invocation": true, "new_with_braces": true, "no_extra_blank_lines": ["break", "case", "continue", "curly_brace_block", "extra", "return", "switch", "throw", "use"], "no_spaces_after_function_name": true, "no_alias_functions": true, "no_closing_tag": true, "no_empty_comment": true, "no_empty_phpdoc": true, "no_empty_statement": true, "no_homoglyph_names": true, "no_mixed_echo_print": {"use": "echo"}, "no_php4_constructor": true, "no_singleline_whitespace_before_semicolons": true, "no_spaces_inside_parenthesis": true, "no_trailing_whitespace": true, "no_unneeded_final_method": true, "no_unused_imports": true, "no_useless_return": true, "no_whitespace_before_comma_in_array": true, "no_whitespace_in_blank_line": true, "non_printable_character": true, "normalize_index_brace": true, "ordered_imports": {"sort_algorithm": "alpha"}, "ordered_interfaces": {"order": "alpha"}, "php_unit_construct": true, "php_unit_internal_class": true, "php_unit_ordered_covers": true, "php_unit_set_up_tear_down_visibility": true, "phpdoc_indent": true, "phpdoc_align": {"align": "vertical"}, "phpdoc_annotation_without_dot": true, "phpdoc_scalar": true, "phpdoc_return_self_reference": {"this": "self"}, "phpdoc_trim": true, "phpdoc_trim_consecutive_blank_line_separation": true, "random_api_migration": true, "self_accessor": true, "return_type_declaration": {"space_before": "one"}, "semicolon_after_instruction": true, "set_type_to_cast": true, "short_scalar_cast": true, "single_blank_line_at_eof": true, "single_line_after_imports": true, "standardize_increment": true, "trailing_comma_in_multiline_array": true, "trim_array_spaces": true, "visibility_required": true, "void_return": true}'' --allow-risky=yes' + - name: Check for modified files + id: git-check + run: echo ::set-output name=modified::$(if git diff-index --quiet HEAD --; then echo "false"; else echo "true"; fi) + - name: Push changes + if: steps.git-check.outputs.modified == 'true' + run: | + git config --global user.name 'Formatter Bot' + git config --global user.email 'formatter.bot@orange-management.email' + git remote set-url origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }} + git commit -am "Automated formatting changes" + git push + code-tests: + runs-on: ubuntu-latest + if: "!contains(github.event.head_commit.message, 'NO_CI')" + services: + mysql: + image: mysql:5.7 + env: + MYSQL_ALLOW_EMPTY_PASSWORD: false + MYSQL_ROOT_PASSWORD: root + MYSQL_DATABASE: oms + ports: + - 3306:3306 + options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 + postgres: + image: postgres:10.8 + env: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: root + POSTGRES_DB: oms + ports: + - 5432:5432 + options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 3 + redis: + image: redis + ports: + - 6379:6379 + options: --entrypoint redis-server + memcached: + image: memcached + ports: + - 11211:11211 + strategy: + fail-fast: false + max-parallel: 3 + matrix: + php-versions: ['8.0'] + steps: + - name: Checkout Repository + uses: actions/checkout@master + with: + fetch-depth: 1 + - name: Checkout Build Repository + uses: actions/checkout@master + with: + fetch-depth: 1 + ref: develop + repository: Orange-Management/Build + path: Build + - name: Checkout Resource Repository + uses: actions/checkout@master + with: + fetch-depth: 1 + ref: develop + repository: Orange-Management/Resources + path: Resources + - name: Checkout phpOMS Repository + uses: actions/checkout@master + with: + fetch-depth: 1 + ref: develop + repository: Orange-Management/phpOMS + path: phpOMS + - name: Checkout Orange-Management Repository + uses: actions/checkout@master + with: + fetch-depth: 1 + ref: develop + repository: Orange-Management/Orange-Management + path: Orange-Management + - name: Setup PHP, with composer and extensions + uses: shivammathur/setup-php@master + with: + php-version: ${{ matrix.php-versions }} + extensions: mbstring, gd, zip, dom, mysql, pgsql, sqlite, imap, bcmath, redis, memcached + ini-values: opcache.jit_buffer_size=256M, opcache.jit=1235, pcre.jit=1 + coverage: pcov + - name: Get Composer Cache Directory + id: composer-cache + run: echo "::set-output name=dir::$(composer config cache-files-dir)" + - name: Cache dependencies + uses: actions/cache@v1 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} + restore-keys: ${{ runner.os }}-composer- + - name: Setup Composer + run: composer install + - name: phpunit + run: vendor/bin/phpunit --coverage-clover tests/coverage.xml --configuration tests/phpunit_default.xml + - name: codecov + env: + CODECOV_TOKEN: "${{ secrets.CODECOV_TOKEN }}" + run: "bash <(curl -s https://codecov.io/bash) -f tests/coverage.xml" + custom: + runs-on: ubuntu-latest + if: "!contains(github.event.head_commit.message, 'NO_CI')" + strategy: + fail-fast: false + max-parallel: 3 + matrix: + php-versions: ['8.0'] + steps: + - name: Checkout Repository + uses: actions/checkout@master + with: + fetch-depth: 1 + - name: Checkout Build Repository + uses: actions/checkout@master + with: + fetch-depth: 1 + ref: develop + repository: Orange-Management/Build + path: Build + - name: Setup PHP, with composer and extensions + uses: shivammathur/setup-php@master + with: + php-version: ${{ matrix.php-versions }} + extensions: mbstring, gd, zip, dom, mysql, pgsql, sqlite, imap, bcmath, redis, memcached + ini-values: opcache.jit_buffer_size=256M, opcache.jit=1235, pcre.jit=1 + - name: PHP linting + run: find ./ -type f -name '*.php' -print0 | xargs -0 -n1 -P4 php -l -n | (! grep -v "No syntax errors detected" ) + - name: Php strict + run: if [[ $(grep -r -L "declare(strict_types=1);" --include=*.php --exclude={*.tpl.php,*Hooks.php,*Routes.php,*SearchCommands.php} ./) -ne "" ]]; then exit 1; fi + - name: Html inspection + run: | + if [[ $(find ./ -name "*tpl.php" | xargs grep -E '=\"[\#\$\%\^\&\*\(\)\\/\ ]*\"') -ne "" ]]; then exit 1; fi + if [[ $(find ./ -name "*tpl.php" | xargs grep -P '(\)') -ne "" ]]; then exit 1; fi + - name: Js strict + run: if [[ $(grep -r -L "\"use strict\";" --include=*.js ./) -ne "" ]]; then exit 1; fi + - name: Js inspection + run: | + if [[ $(grep -rlni "onafterprint=\|onbeforeprint=\|onbeforeunload=\|onerror=\|onhaschange=\|onload=\|onmessage=\|onoffline=\|ononline=\|onpagehide=\|onpageshow=\|onpopstate=\|onredo=\|onresize=\|onstorage=\|onund=o\|onunload=\|onblur=\|onchage=\|oncontextmenu=\|onfocus=\|onformchange=\|onforminput=\|oninput=\|oninvalid=\|onreset=\|onselect=\|onsubmit=\|onkeydown=\|onkeypress=\|onkeyup=\|onclick=\|ondblclic=k\|ondrag=\|ondragend=\|ondragenter=\|ondragleave=\|ondragover=\|ondragstart=\|ondrop=\|onmousedown=\|onmousemove=\|onmouseout=\|onmouseover=\|onmouseup=\|onmousewheel=\|onscroll=\|onabor=t\|oncanplay=\|oncanplaythrough=\|ondurationchange=\|onemptied=\|onended=\|onerror=\|onloadeddata=\|onloadedmetadata=\|onloadstart=\|onpause=\|onplay=\|onplaying=\|onprogress=\|onratechange=\|onreadystatechange=\|onseeked=\|onseeking=\|onstalled=\|onsuspend=\|ontimeupdate=\|onvolumechange=" --include=*.js ./) -ne "" ]]; then exit 1; fi diff --git a/Admin/Install/Navigation.install.json b/Admin/Install/Navigation.install.json index e69de29..5dfd2f5 100644 --- a/Admin/Install/Navigation.install.json +++ b/Admin/Install/Navigation.install.json @@ -0,0 +1,33 @@ +[ + { + "id": 1007901001, + "pid": "/", + "type": 2, + "subtype": 1, + "name": "Contract", + "uri": "{/prefix}contract/list?{?}", + "target": "self", + "icon": null, + "order": 45, + "from": "Kanban", + "permission": { "permission": 2, "type": null, "element": null }, + "parent": 1003301001, + "children": [ + { + "id": 1007902001, + "pid": "/contract", + "type": 3, + "subtype": 1, + "name": "Boards", + "uri": "{/prefix}contract/list?{?}", + "target": "self", + "icon": null, + "order": 1, + "from": "Kanban", + "permission": { "permission": 2, "type": null, "element": null }, + "parent": 1007901001, + "children": [] + } + ] + } +] diff --git a/Admin/Install/db.json b/Admin/Install/db.json index e69de29..d1aca03 100644 --- a/Admin/Install/db.json +++ b/Admin/Install/db.json @@ -0,0 +1,46 @@ +{ + "media_contract": { + "name": "media_contract", + "fields": { + "media_contract_id": { + "name": "media_contract_id", + "type": "INT", + "null": false, + "primary": true + }, + "media_contract_start": { + "name": "media_contract_start", + "type": "DATETIME", + "default": null, + "null": false + }, + "media_contract_end": { + "name": "media_contract_end", + "type": "DATETIME", + "null": false + }, + "media_contract_autorenewal": { + "name": "media_contract_autorenewal", + "type": "TINYINT", + "default": 1, + "null": false + }, + "media_contract_renewaltime": { + "name": "media_contract_renewaltime", + "type": "INT", + "default": null, + "null": true + }, + "media_contract_costs": { + "name": "media_contract_costs", + "type": "BIGINT", + "null": false + }, + "media_contract_value": { + "name": "media_contract_value", + "type": "BIGINT", + "null": false + } + } + } +} \ No newline at end of file From 4aa6376238c8bea6d8ce5d3c97b082c24ca9976f Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sat, 5 Jun 2021 11:01:03 +0200 Subject: [PATCH 003/133] bug fixes --- Controller/BackendController.php | 3 +-- Controller/Controller.php | 4 +--- Theme/Backend/Lang/Navigation.en.lang.php | 19 +++++++++++++++++++ info.json | 9 --------- 4 files changed, 21 insertions(+), 14 deletions(-) create mode 100644 Theme/Backend/Lang/Navigation.en.lang.php diff --git a/Controller/BackendController.php b/Controller/BackendController.php index 02ed4ba..2364ec7 100644 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -14,7 +14,6 @@ declare(strict_types=1); namespace Modules\ContractManagement\Controller; -use Modules\Dashboard\Models\DashboardElementInterface; use Modules\ContractManagement\Models\PermissionState; use phpOMS\Account\PermissionType; use phpOMS\Asset\AssetType; @@ -34,6 +33,6 @@ use phpOMS\Views\View; * @link https://orange-management.org * @since 1.0.0 */ -final class BackendController extends Controller implements DashboardElementInterface +final class BackendController extends Controller { } diff --git a/Controller/Controller.php b/Controller/Controller.php index 292ca46..d80d32d 100644 --- a/Controller/Controller.php +++ b/Controller/Controller.php @@ -64,9 +64,7 @@ class Controller extends ModuleAbstract * @var string[] * @since 1.0.0 */ - protected static array $providing = [ - 'Navigation', - ]; + protected static array $providing = []; /** * Dependencies. diff --git a/Theme/Backend/Lang/Navigation.en.lang.php b/Theme/Backend/Lang/Navigation.en.lang.php new file mode 100644 index 0000000..eedccf8 --- /dev/null +++ b/Theme/Backend/Lang/Navigation.en.lang.php @@ -0,0 +1,19 @@ + [ + 'Create' => 'Create', + 'Contract' => 'Contract', + 'List' => 'List', +]]; diff --git a/info.json b/info.json index c669822..50e2367 100644 --- a/info.json +++ b/info.json @@ -37,15 +37,6 @@ "from": "ContractManagement", "file": "ContractManagement" }, - { - "pid": [ - "/" - ], - "type": 4, - "for": "Navigation", - "from": "ContractManagement", - "file": "ContractManagement" - }, { "pid": [ "/" From 4b2a771dddf9454db015994a5e91e04da14c5194 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Thu, 24 Jun 2021 00:03:34 +0200 Subject: [PATCH 004/133] add app to installer --- Admin/Install/Navigation.install.json | 2 +- Admin/Install/Navigation.php | 8 +- Admin/Install/db.json | 161 +++++++++++++++++++++----- Admin/Routes/Web/Backend.php | 22 ++++ 4 files changed, 157 insertions(+), 36 deletions(-) diff --git a/Admin/Install/Navigation.install.json b/Admin/Install/Navigation.install.json index 5dfd2f5..5f2f9c4 100644 --- a/Admin/Install/Navigation.install.json +++ b/Admin/Install/Navigation.install.json @@ -18,7 +18,7 @@ "pid": "/contract", "type": 3, "subtype": 1, - "name": "Boards", + "name": "Contracts", "uri": "{/prefix}contract/list?{?}", "target": "self", "icon": null, diff --git a/Admin/Install/Navigation.php b/Admin/Install/Navigation.php index 8363f99..776434f 100644 --- a/Admin/Install/Navigation.php +++ b/Admin/Install/Navigation.php @@ -14,7 +14,7 @@ declare(strict_types=1); namespace Modules\ContractManagement\Admin\Install; -use phpOMS\DataStorage\Database\DatabasePool; +use phpOMS\Application\ApplicationAbstract; /** * Navigation class. @@ -30,14 +30,14 @@ class Navigation * Install navigation providing * * @param string $path Module path - * @param DatabasePool $dbPool Database pool for database interaction + * @param ApplicationAbstract $app Application * * @return void * * @since 1.0.0 */ - public static function install(string $path, DatabasePool $dbPool) : void + public static function install(string $path, ApplicationAbstract $app) : void { - \Modules\Navigation\Admin\Installer::installExternal($dbPool, ['path' => __DIR__ . '/Navigation.install.json']); + \Modules\Navigation\Admin\Installer::installExternal($app, ['path' => __DIR__ . '/Navigation.install.json']); } } diff --git a/Admin/Install/db.json b/Admin/Install/db.json index d1aca03..b539b7e 100644 --- a/Admin/Install/db.json +++ b/Admin/Install/db.json @@ -1,45 +1,144 @@ { - "media_contract": { - "name": "media_contract", + "contractmgmt_type": { + "name": "contractmgmt_type", "fields": { - "media_contract_id": { - "name": "media_contract_id", + "contractmgmt_type_id": { + "name": "contractmgmt_type_id", "type": "INT", "null": false, - "primary": true + "primary": true, + "autoincrement": true }, - "media_contract_start": { - "name": "media_contract_start", - "type": "DATETIME", - "default": null, + "contractmgmt_type_name": { + "name": "contractmgmt_type_name", + "type": "VARCHAR(255)", "null": false - }, - "media_contract_end": { - "name": "media_contract_end", - "type": "DATETIME", - "null": false - }, - "media_contract_autorenewal": { - "name": "media_contract_autorenewal", - "type": "TINYINT", - "default": 1, - "null": false - }, - "media_contract_renewaltime": { - "name": "media_contract_renewaltime", + } + } + }, + "contractmgmt_type_l11n": { + "name": "contractmgmt_type_l11n", + "fields": { + "contractmgmt_type_l11n_id": { + "name": "contractmgmt_type_l11n_id", "type": "INT", + "null": false, + "primary": true, + "autoincrement": true + }, + "contractmgmt_type_l11n_title": { + "name": "contractmgmt_type_l11n_title", + "type": "VARCHAR(255)", + "null": false + }, + "contractmgmt_type_l11n_type": { + "name": "contractmgmt_type_l11n_type", + "type": "INT(11)", + "null": false, + "foreignTable": "contractmgmt_type", + "foreignKey": "contractmgmt_type_id" + }, + "contractmgmt_type_l11n_lang": { + "name": "contractmgmt_type_l11n_lang", + "type": "VARCHAR(2)", + "null": false, + "foreignTable": "language", + "foreignKey": "language_639_1" + } + } + }, + "contractmgmt_contract": { + "name": "contractmgmt_contract", + "fields": { + "contractmgmt_contract_id": { + "name": "contractmgmt_contract_id", + "type": "INT", + "null": false, + "primary": true, + "autoincrement": true + }, + "contractmgmt_contract_title": { + "name": "contractmgmt_contract_title", + "type": "VARCHAR(255)", + "null": false + }, + "contractmgmt_contract_description": { + "name": "contractmgmt_contract_description", + "type": "TEXT", + "null": false + }, + "contractmgmt_contract_start": { + "name": "contractmgmt_contract_start", + "type": "DATETIME", + "null": false + }, + "contractmgmt_contract_end": { + "name": "contractmgmt_contract_end", + "type": "DATETIME", + "null": true, + "default": null + }, + "contractmgmt_contract_costs": { + "name": "contractmgmt_contract_costs", + "type": "BIGINT", + "null": true, + "default": null + }, + "contractmgmt_contract_duration": { + "name": "contractmgmt_contract_duration", + "type": "INT", + "null": false + }, + "contractmgmt_contract_warning": { + "name": "contractmgmt_contract_warning", + "type": "INT", + "null": false + }, + "contractmgmt_contract_type": { + "name": "contractmgmt_contract_type", + "type": "INT", + "null": false, + "foreignTable": "contractmgmt_type", + "foreignKey": "contractmgmt_type_id" + }, + "contractmgmt_contract_responsible": { + "name": "contractmgmt_contract_responsible", + "type": "INT", + "null": true, "default": null, - "null": true + "foreignTable": "account", + "foreignKey": "account_id" }, - "media_contract_costs": { - "name": "media_contract_costs", - "type": "BIGINT", + "contractmgmt_contract_created_at": { + "name": "contractmgmt_contract_created_at", + "type": "DATETIME", "null": false + } + } + }, + "contractmgmt_contract_media": { + "name": "contractmgmt_contract_media", + "fields": { + "contractmgmt_contract_media_id": { + "name": "contractmgmt_contract_media_id", + "type": "INT", + "null": false, + "primary": true, + "autoincrement": true }, - "media_contract_value": { - "name": "media_contract_value", - "type": "BIGINT", - "null": false + "contractmgmt_contract_media_contract": { + "name": "contractmgmt_contract_media_contract", + "type": "INT", + "null": false, + "foreignTable": "contractmgmt_contract", + "foreignKey": "contractmgmt_contract_id" + }, + "contractmgmt_contract_media_media": { + "name": "contractmgmt_contract_media_media", + "type": "INT", + "null": false, + "foreignTable": "media", + "foreignKey": "media_id" } } } diff --git a/Admin/Routes/Web/Backend.php b/Admin/Routes/Web/Backend.php index aef3f28..7804181 100644 --- a/Admin/Routes/Web/Backend.php +++ b/Admin/Routes/Web/Backend.php @@ -6,4 +6,26 @@ use phpOMS\Account\PermissionType; use phpOMS\Router\RouteVerb; return [ + '^.*/contract/list.*$' => [ + [ + 'dest' => '\Modules\ContractManagement\Controller\BackendController:viewContractList', + 'verb' => RouteVerb::GET, + 'permission' => [ + 'module' => BackendController::MODULE_NAME, + 'type' => PermissionType::READ, + 'state' => PermissionState::CONTRACT, + ], + ], + ], + '^.*/contract/single.*$' => [ + [ + 'dest' => '\Modules\ContractManagement\Controller\BackendController:viewContract', + 'verb' => RouteVerb::GET, + 'permission' => [ + 'module' => BackendController::MODULE_NAME, + 'type' => PermissionType::READ, + 'state' => PermissionState::CONTRACT, + ], + ], + ], ]; From 8b33381d0cfca9d41e688d21d1797e1cfd6684e5 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Thu, 24 Jun 2021 00:04:58 +0200 Subject: [PATCH 005/133] create draft --- Controller/ApiController.php | 261 ++++++++++++++++++++++ Controller/BackendController.php | 66 ++++++ Models/Contract.php | 136 +++++++++++ Models/ContractMapper.php | 102 +++++++++ Models/ContractType.php | 129 +++++++++++ Models/ContractTypeL11n.php | 147 ++++++++++++ Models/ContractTypeL11nMapper.php | 57 +++++ Models/ContractTypeMapper.php | 72 ++++++ Models/NullContract.php | 39 ++++ Models/NullContractType.php | 39 ++++ Models/NullContractTypeL11n.php | 39 ++++ Models/PermissionState.php | 30 +++ Theme/Backend/Lang/Navigation.en.lang.php | 1 + Theme/Backend/Lang/en.lang.php | 19 ++ Theme/Backend/contract-list.tpl.php | 99 ++++++++ Theme/Backend/contract-single.tpl.php | 46 ++++ 16 files changed, 1282 insertions(+) create mode 100644 Models/Contract.php create mode 100644 Models/ContractMapper.php create mode 100644 Models/ContractType.php create mode 100644 Models/ContractTypeL11n.php create mode 100644 Models/ContractTypeL11nMapper.php create mode 100644 Models/ContractTypeMapper.php create mode 100644 Models/NullContract.php create mode 100644 Models/NullContractType.php create mode 100644 Models/NullContractTypeL11n.php create mode 100644 Models/PermissionState.php create mode 100644 Theme/Backend/Lang/en.lang.php create mode 100644 Theme/Backend/contract-list.tpl.php create mode 100644 Theme/Backend/contract-single.tpl.php diff --git a/Controller/ApiController.php b/Controller/ApiController.php index 94dc7f7..d89b25d 100644 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -15,6 +15,10 @@ declare(strict_types=1); namespace Modules\ContractManagement\Controller; use Modules\Admin\Models\NullAccount; +use Modules\ContractManagement\Models\ContractType; +use Modules\ContractManagement\Models\ContractTypeMapper; +use Modules\ContractManagement\Models\ContractTypeL11n; +use Modules\ContractManagement\Models\ContractTypeL11nMapper; use phpOMS\Message\Http\HttpResponse; use phpOMS\Message\Http\RequestStatusCode; use phpOMS\Message\NotificationLevel; @@ -22,6 +26,11 @@ use phpOMS\Message\RequestAbstract; use phpOMS\Message\ResponseAbstract; use phpOMS\Model\Message\FormValidation; use phpOMS\Utils\Parser\Markdown\Markdown; +use phpOMS\Message\Http\HttpRequest; +use Modules\Media\Models\PathSettings; +use Modules\ContractManagement\Models\Contract; +use Modules\ContractManagement\Models\NullContractType; +use Modules\ContractManagement\Models\ContractMapper; /** * Api controller for the contracts module. @@ -33,4 +42,256 @@ use phpOMS\Utils\Parser\Markdown\Markdown; */ final class ApiController extends Controller { + /** + * Api method to create a contract + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiContractCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + if (!empty($val = $this->validateContractCreate($request))) { + $response->set('contract_create', new FormValidation($val)); + $response->header->status = RequestStatusCode::R_400; + + return; + } + + $contract = $this->createContractFromRequest($request); + $this->createModel($request->header->account, $contract, ContractMapper::class, 'contract', $request->getOrigin()); + $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Contract', 'Contract successfully created', $contract); + } + + /** + * Validate contract create request + * + * @param RequestAbstract $request Request + * + * @return array + * + * @since 1.0.0 + */ + private function validateContractCreate(RequestAbstract $request) : array + { + $val = []; + if (($val['title'] = empty($request->getData('title'))) + || ($val['start'] = empty($request->getData('start'))) + || ($val['duration'] = empty($request->getData('duration'))) + || ($val['type'] = empty($request->getData('type'))) + ) { + return $val; + } + + return []; + } + + /** + * Method to create item l11n from request. + * + * @param RequestAbstract $request Request + * + * @return Contract + * + * @since 1.0.0 + */ + private function createContractFromRequest(RequestAbstract $request) : Contract + { + $contract = new Contract(); + $contract->title = (string) ($request->getData('title') ?? ''); + $contract->description = (string) ($request->getData('description') ?? ''); + $contract->type = new NullContractType((int) ($request->getData('type') ?? 0)); + $contract->start = new \DateTime($request->getData('start') ?? 'now'); + + if (!empty($request->getData('end'))) { + $contract->end = new \DateTime($request->getData('end')); + } + + return $contract; + } + + /** + * Api method to create a contract document + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiContractDocumentCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + $uploadedFiles = $request->getFiles() ?? []; + + if (empty($uploadedFiles)) { + $this->fillJsonResponse($request, $response, NotificationLevel::ERROR, 'Contract', 'Invalid contract image', $uploadedFiles); + $response->header->status = RequestStatusCode::R_400; + + return; + } + + $uploaded = $this->app->moduleManager->get('Media')->uploadFiles( + $request->getData('name') ?? '', + $uploadedFiles, + $request->header->account, + __DIR__ . '/../../../Modules/Media/Files/Modules/ContractManagement/Contracts/' . ($request->getData('contract_title') ?? '0'), + '/Modules/ContractManagement/Contracts/' . ($request->getData('contract_title') ?? '0'), + $request->getData('type') ?? '', + '', + '', + PathSettings::FILE_PATH + ); + + $this->createModelRelation( + $request->header->account, + (int) $request->getData('contract'), + \reset($uploaded)->getId(), + ContractMapper::class, 'files', '', $request->getOrigin() + ); + + $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Image', 'Image successfully updated', $uploaded); + } + + /** + * Api method to create item attribute type + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiContractTypeCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + if (!empty($val = $this->validateContractTypeCreate($request))) { + $response->set('contract_type_create', new FormValidation($val)); + $response->header->status = RequestStatusCode::R_400; + + return; + } + + $contractType = $this->createContractTypeFromRequest($request); + $contractType->setL11n($request->getData('title'), $request->getData('language')); + $this->createModel($request->header->account, $contractType, ContractTypeMapper::class, 'contract_type', $request->getOrigin()); + + $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Contract type', 'Contract type successfully created', $contractType); + } + + /** + * Method to create item attribute from request. + * + * @param RequestAbstract $request Request + * + * @return ContractType + * + * @since 1.0.0 + */ + private function createContractTypeFromRequest(RequestAbstract $request) : ContractType + { + $contractType = new ContractType(); + $contractType->name = (string) ($request->getData('name') ?? ''); + + return $contractType; + } + + /** + * Validate item attribute create request + * + * @param RequestAbstract $request Request + * + * @return array + * + * @since 1.0.0 + */ + private function validateContractTypeCreate(RequestAbstract $request) : array + { + $val = []; + if (($val['name'] = empty($request->getData('name'))) + || ($val['title'] = empty($request->getData('title'))) + ) { + return $val; + } + + return []; + } + + /** + * Api method to create item l11n type + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiContractTypeL11nCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + if (!empty($val = $this->validateContractTypeL11nCreate($request))) { + $response->set('contract_type_create', new FormValidation($val)); + $response->header->status = RequestStatusCode::R_400; + + return; + } + + $itemL11nType = $this->createContractTypeL11nFromRequest($request); + $this->createModel($request->header->account, $itemL11nType, ContractTypeL11nMapper::class, 'contract_type', $request->getOrigin()); + $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Contract type', 'Contract localization type successfully created', $itemL11nType); + } + + /** + * Method to create item l11n type from request. + * + * @param RequestAbstract $request Request + * + * @return ContractTypeL11n + * + * @since 1.0.0 + */ + private function createContractTypeL11nFromRequest(RequestAbstract $request) : ContractTypeL11n + { + $typeL11n = new ContractTypeL11n( + (int) ($request->getData('type') ?? 0), + (string) ($request->getData('title') ?? ''), + $request->getData('language') ?? $request->getLanguage() + ); + + return $typeL11n; + } + + /** + * Validate item l11n type create request + * + * @param RequestAbstract $request Request + * + * @return array + * + * @since 1.0.0 + */ + private function validateContractTypeL11nCreate(RequestAbstract $request) : array + { + $val = []; + if (($val['title'] = empty($request->getData('title')))) { + return $val; + } + + return []; + } } diff --git a/Controller/BackendController.php b/Controller/BackendController.php index 2364ec7..d0c5322 100644 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -22,6 +22,7 @@ use phpOMS\Message\Http\RequestStatusCode; use phpOMS\Message\RequestAbstract; use phpOMS\Message\ResponseAbstract; use phpOMS\Views\View; +use Modules\ContractManagement\Models\ContractMapper; /** * Backend controller for the contracts module. @@ -35,4 +36,69 @@ use phpOMS\Views\View; */ final class BackendController extends Controller { + /** + * Routing end-point for application behaviour. + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return RenderableInterface + * + * @since 1.0.0 + * @codeCoverageIgnore + */ + public function viewContractList(RequestAbstract $request, ResponseAbstract $response, $data = null) : RenderableInterface + { + $view = new View($this->app->l11nManager, $request, $response); + + $view->setTemplate('/Modules/ContractManagement/Theme/Backend/contract-list'); + $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1007901001, $request, $response)); + + if ($request->getData('ptype') === 'p') { + $view->setData('contracts', + ContractMapper::with('language', $response->getLanguage()) + ::getBeforePivot((int) ($request->getData('id') ?? 0), null, 25) + ); + } elseif ($request->getData('ptype') === 'n') { + $view->setData('contracts', + ContractMapper::with('language', $response->getLanguage()) + ::getAfterPivot((int) ($request->getData('id') ?? 0), null, 25) + ); + } else { + $view->setData('contracts', + ContractMapper::with('language', $response->getLanguage()) + ::getAfterPivot(0, null, 25) + ); + } + + return $view; + } + + /** + * Routing end-point for application behaviour. + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return RenderableInterface + * + * @since 1.0.0 + * @codeCoverageIgnore + */ + public function viewContract(RequestAbstract $request, ResponseAbstract $response, $data = null) : RenderableInterface + { + $view = new View($this->app->l11nManager, $request, $response); + + $view->setTemplate('/Modules/ContractManagement/Theme/Backend/contract-single'); + $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1007901001, $request, $response)); + + $view->addData('contract', ContractMapper::get((int) $request->getData('id'))); + + $editor = new \Modules\Editor\Theme\Backend\Components\Editor\BaseView($this->app->l11nManager, $request, $response); + $view->addData('editor', $editor); + + return $view; + } } diff --git a/Models/Contract.php b/Models/Contract.php new file mode 100644 index 0000000..ba3db57 --- /dev/null +++ b/Models/Contract.php @@ -0,0 +1,136 @@ +createdAt = new \DateTimeImmutable('now'); + } + + /** + * Get id + * + * @return int + * + * @since 1.0.0 + */ + public function getId() : int + { + return $this->id; + } + + /** + * Get files + * + * @return Media[] + * + * @since 1.0.0 + */ + public function getFiles() : array + { + return $this->files; + } + + /** + * Add media to item + * + * @param Media $media Media + * + * @return void + * + * @since 1.0.0 + */ + public function addFile(Media $media) : void + { + $this->files[] = $media; + } + + /** + * {@inheritdoc} + */ + public function toArray() : array + { + return []; + } + + /** + * {@inheritdoc} + */ + public function jsonSerialize() + { + return $this->toArray(); + } +} diff --git a/Models/ContractMapper.php b/Models/ContractMapper.php new file mode 100644 index 0000000..653ae15 --- /dev/null +++ b/Models/ContractMapper.php @@ -0,0 +1,102 @@ + + * @since 1.0.0 + */ + protected static array $columns = [ + 'contractmgmt_contract_id' => ['name' => 'contractmgmt_contract_id', 'type' => 'int', 'internal' => 'id'], + 'contractmgmt_contract_title' => ['name' => 'contractmgmt_contract_title', 'type' => 'string', 'internal' => 'title', 'autocomplete' => true], + 'contractmgmt_contract_description' => ['name' => 'contractmgmt_contract_description', 'type' => 'string', 'internal' => 'description'], + 'contractmgmt_contract_costs' => ['name' => 'contractmgmt_contract_costs', 'type' => 'Serializable', 'internal' => 'costs'], + 'contractmgmt_contract_duration' => ['name' => 'contractmgmt_contract_duration', 'type' => 'int', 'internal' => 'duration'], + 'contractmgmt_contract_warning' => ['name' => 'contractmgmt_contract_warning', 'type' => 'int', 'internal' => 'warning'], + 'contractmgmt_contract_start' => ['name' => 'contractmgmt_contract_start', 'type' => 'DateTime', 'internal' => 'start'], + 'contractmgmt_contract_end' => ['name' => 'contractmgmt_contract_end', 'type' => 'DateTime', 'internal' => 'end'], + 'contractmgmt_contract_responsible' => ['name' => 'contractmgmt_contract_responsible', 'type' => 'int', 'internal' => 'responsible'], + 'contractmgmt_contract_type' => ['name' => 'contractmgmt_contract_type', 'type' => 'int', 'internal' => 'type'], + 'contractmgmt_contract_created_at' => ['name' => 'contractmgmt_contract_created_at', 'type' => 'DateTimeImmutable', 'internal' => 'createdAt'], + ]; + + /** + * Primary table. + * + * @var string + * @since 1.0.0 + */ + protected static string $table = 'contractmgmt_contract'; + + /** + * Primary field name. + * + * @var string + * @since 1.0.0 + */ + protected static string $primaryField = 'contractmgmt_contract_id'; + + /** + * Created at. + * + * @var string + * @since 1.0.0 + */ + protected static string $createdAt = 'contractmgmt_contract_created_at'; + + /** + * Has one relation. + * + * @var array + * @since 1.0.0 + */ + protected static array $ownsOne = [ + 'type' => [ + 'mapper' => ContractTypeMapper::class, + 'external' => 'contractmgmt_contract_type', + ], + ]; + + /** + * Has many relation. + * + * @var array + * @since 1.0.0 + */ + protected static array $hasMany = [ + 'files' => [ + 'mapper' => MediaMapper::class, /* mapper of the related object */ + 'table' => 'contractmgmt_contract_media', /* table of the related object, null if no relation table is used (many->1) */ + 'external' => 'contractmgmt_contract_media_media', + 'self' => 'contractmgmt_contract_media_contract', + ], + ]; +} diff --git a/Models/ContractType.php b/Models/ContractType.php new file mode 100644 index 0000000..0f60880 --- /dev/null +++ b/Models/ContractType.php @@ -0,0 +1,129 @@ +setL11n($name); + } + } + + /** + * Get id + * + * @return int + * + * @since 1.0.0 + */ + public function getId() : int + { + return $this->id; + } + + /** + * Set l11n + * + * @param string|ContractTypeL11n $l11n Tag article l11n + * @param string $lang Language + * + * @return void + * + * @since 1.0.0 + */ + public function setL11n($l11n, string $lang = ISO639x1Enum::_EN) : void + { + if ($l11n instanceof ContractTypeL11n) { + $this->l11n = $l11n; + } elseif (\is_string($l11n)) { + $this->l11n = new ContractTypeL11n(); + $this->l11n->title = $l11n; + $this->l11n->setLanguage($lang); + } elseif ($this->l11n instanceof ContractTypeL11n && \is_string($l11n)) { + $this->l11n->title = $l11n; + } + } + + /** + * @return string + * + * @since 1.0.0 + */ + public function getL11n() : string + { + return $this->l11n instanceof ContractTypeL11n ? $this->l11n->title : $this->l11n; + } + + /** + * {@inheritdoc} + */ + public function toArray() : array + { + return []; + } + + /** + * {@inheritdoc} + */ + public function jsonSerialize() + { + return $this->toArray(); + } +} diff --git a/Models/ContractTypeL11n.php b/Models/ContractTypeL11n.php new file mode 100644 index 0000000..7092063 --- /dev/null +++ b/Models/ContractTypeL11n.php @@ -0,0 +1,147 @@ +type = $type; + $this->title = $title; + $this->language = $language; + } + + /** + * Get id + * + * @return int + * + * @since 1.0.0 + */ + public function getId() : int + { + return $this->id; + } + + /** + * Get attribute type + * + * @return int|ContractType + * + * @since 1.0.0 + */ + public function getType() : int | ContractType + { + return $this->type; + } + + /** + * Set type. + * + * @param int $type Type id + * + * @return void + * + * @since 1.0.0 + */ + public function setType(int $type) : void + { + $this->type = $type; + } + + /** + * Set language + * + * @param string $language Language + * + * @return void + * + * @since 1.0.0 + */ + public function setLanguage(string $language) : void + { + $this->language = $language; + } + + /** + * {@inheritdoc} + */ + public function toArray() : array + { + return []; + } + + /** + * {@inheritdoc} + */ + public function jsonSerialize() + { + return $this->toArray(); + } +} diff --git a/Models/ContractTypeL11nMapper.php b/Models/ContractTypeL11nMapper.php new file mode 100644 index 0000000..4a2bc42 --- /dev/null +++ b/Models/ContractTypeL11nMapper.php @@ -0,0 +1,57 @@ + + * @since 1.0.0 + */ + protected static array $columns = [ + 'contractmgmt_type_l11n_id' => ['name' => 'contractmgmt_type_l11n_id', 'type' => 'int', 'internal' => 'id'], + 'contractmgmt_type_l11n_title' => ['name' => 'contractmgmt_type_l11n_title', 'type' => 'string', 'internal' => 'title', 'autocomplete' => true], + 'contractmgmt_type_l11n_type' => ['name' => 'contractmgmt_type_l11n_type', 'type' => 'int', 'internal' => 'type'], + 'contractmgmt_type_l11n_lang' => ['name' => 'contractmgmt_type_l11n_lang', 'type' => 'string', 'internal' => 'language'], + ]; + + /** + * Primary table. + * + * @var string + * @since 1.0.0 + */ + protected static string $table = 'contractmgmt_type_l11n'; + + /** + * Primary field name. + * + * @var string + * @since 1.0.0 + */ + protected static string $primaryField = 'contractmgmt_type_l11n_id'; +} diff --git a/Models/ContractTypeMapper.php b/Models/ContractTypeMapper.php new file mode 100644 index 0000000..e4e5c10 --- /dev/null +++ b/Models/ContractTypeMapper.php @@ -0,0 +1,72 @@ + + * @since 1.0.0 + */ + protected static array $columns = [ + 'contractmgmt_type_id' => ['name' => 'contractmgmt_type_id', 'type' => 'int', 'internal' => 'id'], + 'contractmgmt_type_name' => ['name' => 'contractmgmt_type_name', 'type' => 'string', 'internal' => 'name', 'autocomplete' => true], + ]; + + /** + * Has many relation. + * + * @var array + * @since 1.0.0 + */ + protected static array $hasMany = [ + 'l11n' => [ + 'mapper' => ContractTypeL11nMapper::class, + 'table' => 'contractmgmt_type_l11n', + 'self' => 'contractmgmt_type_l11n_type', + 'column' => 'title', + 'conditional' => true, + 'external' => null, + ] + ]; + + /** + * Primary table. + * + * @var string + * @since 1.0.0 + */ + protected static string $table = 'contractmgmt_type'; + + /** + * Primary field name. + * + * @var string + * @since 1.0.0 + */ + protected static string $primaryField = 'contractmgmt_type_id'; +} diff --git a/Models/NullContract.php b/Models/NullContract.php new file mode 100644 index 0000000..87a990f --- /dev/null +++ b/Models/NullContract.php @@ -0,0 +1,39 @@ +id = $id; + parent::__construct(); + } +} diff --git a/Models/NullContractType.php b/Models/NullContractType.php new file mode 100644 index 0000000..f990d81 --- /dev/null +++ b/Models/NullContractType.php @@ -0,0 +1,39 @@ +id = $id; + parent::__construct(); + } +} diff --git a/Models/NullContractTypeL11n.php b/Models/NullContractTypeL11n.php new file mode 100644 index 0000000..fbcb6a9 --- /dev/null +++ b/Models/NullContractTypeL11n.php @@ -0,0 +1,39 @@ +id = $id; + parent::__construct(); + } +} diff --git a/Models/PermissionState.php b/Models/PermissionState.php new file mode 100644 index 0000000..a7e0c63 --- /dev/null +++ b/Models/PermissionState.php @@ -0,0 +1,30 @@ + [ 'Create' => 'Create', 'Contract' => 'Contract', + 'Contracts' => 'Contracts', 'List' => 'List', ]]; diff --git a/Theme/Backend/Lang/en.lang.php b/Theme/Backend/Lang/en.lang.php new file mode 100644 index 0000000..d7a021d --- /dev/null +++ b/Theme/Backend/Lang/en.lang.php @@ -0,0 +1,19 @@ + [ + 'Contract' => 'Contract', + 'Contracts' => 'Contracts', + 'Title' => 'Title', +]]; diff --git a/Theme/Backend/contract-list.tpl.php b/Theme/Backend/contract-list.tpl.php new file mode 100644 index 0000000..0da1544 --- /dev/null +++ b/Theme/Backend/contract-list.tpl.php @@ -0,0 +1,99 @@ +getData('contracts') ?? []; + +$previous = empty($contracts) ? '{/prefix}contract/list' : '{/prefix}contract/list?{?}&id=' . \reset($contracts)->getId() . '&ptype=p'; +$next = empty($contracts) ? '{/prefix}contract/list' : '{/prefix}contract/list?{?}&id=' . \end($contracts)->getId() . '&ptype=n'; + +$now = new \DateTime('now'); + +echo $this->getData('nav')->render(); ?> + +
+
+
+
getHtml('Contracts'); ?>
+ + + + + $value) : + $url = UriFactory::build('{/prefix}contract/single?{?}&id=' . $value->getId()); + + $type = 'ok'; + if ($value->end->getTimestamp() < $now->getTimestamp() && $value->end->getTimestamp() + 129600 > $now->getTimestamp()) { + $type = 'error'; + } elseif ($value->end->getTimestamp() < $now->getTimestamp()) { + $type = 'info'; + } elseif ($value->end->getTimestamp() + 129600 < $now->getTimestamp()) { + $type = 'warning'; + } + ?> + +
getHtml('ID', '0', '0'); ?> + + + + getHtml('Title'); ?> + + + + getHtml('End'); ?> + + + +
getId(); ?> + printHtml($value->title); ?> + end !== null ? $value->end->format('Y-m-d') : ''; ?> + +
+ +
+
+
diff --git a/Theme/Backend/contract-single.tpl.php b/Theme/Backend/contract-single.tpl.php new file mode 100644 index 0000000..33c5d8e --- /dev/null +++ b/Theme/Backend/contract-single.tpl.php @@ -0,0 +1,46 @@ +getData('contract'); + +echo $this->getData('nav')->render(); ?> + +
+
+ +
+
+ request->uri->fragment === 'c-tab-1' ? ' checked' : ''; ?>> +
+
+
+
+ + request->uri->fragment === 'c-tab-2' ? ' checked' : ''; ?>> +
+
+
+
+
+
From 4838f51422fef08686cf5f4a9ce52ba9d107b3c3 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sat, 26 Jun 2021 14:38:08 +0200 Subject: [PATCH 006/133] fix phpstan/phpcs --- Admin/Install/Navigation.php | 4 ++-- Admin/Routes/Web/Backend.php | 2 +- Controller/ApiController.php | 14 +++++++------- Controller/BackendController.php | 2 +- Models/Contract.php | 2 +- Models/ContractType.php | 14 ++++++-------- Models/ContractTypeL11n.php | 8 +++----- Theme/Backend/contract-single.tpl.php | 14 +++++++------- 8 files changed, 28 insertions(+), 32 deletions(-) diff --git a/Admin/Install/Navigation.php b/Admin/Install/Navigation.php index 776434f..fd47f56 100644 --- a/Admin/Install/Navigation.php +++ b/Admin/Install/Navigation.php @@ -29,8 +29,8 @@ class Navigation /** * Install navigation providing * - * @param string $path Module path - * @param ApplicationAbstract $app Application + * @param string $path Module path + * @param ApplicationAbstract $app Application * * @return void * diff --git a/Admin/Routes/Web/Backend.php b/Admin/Routes/Web/Backend.php index 7804181..464ba16 100644 --- a/Admin/Routes/Web/Backend.php +++ b/Admin/Routes/Web/Backend.php @@ -6,7 +6,7 @@ use phpOMS\Account\PermissionType; use phpOMS\Router\RouteVerb; return [ - '^.*/contract/list.*$' => [ + '^.*/contract/list.*$' => [ [ 'dest' => '\Modules\ContractManagement\Controller\BackendController:viewContractList', 'verb' => RouteVerb::GET, diff --git a/Controller/ApiController.php b/Controller/ApiController.php index d89b25d..622014a 100644 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -42,7 +42,7 @@ use Modules\ContractManagement\Models\ContractMapper; */ final class ApiController extends Controller { - /** + /** * Api method to create a contract * * @param RequestAbstract $request Request @@ -57,7 +57,7 @@ final class ApiController extends Controller */ public function apiContractCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void { - if (!empty($val = $this->validateContractCreate($request))) { + if (!empty($val = $this->validateContractCreate($request))) { $response->set('contract_create', new FormValidation($val)); $response->header->status = RequestStatusCode::R_400; @@ -103,11 +103,11 @@ final class ApiController extends Controller */ private function createContractFromRequest(RequestAbstract $request) : Contract { - $contract = new Contract(); - $contract->title = (string) ($request->getData('title') ?? ''); + $contract = new Contract(); + $contract->title = (string) ($request->getData('title') ?? ''); $contract->description = (string) ($request->getData('description') ?? ''); - $contract->type = new NullContractType((int) ($request->getData('type') ?? 0)); - $contract->start = new \DateTime($request->getData('start') ?? 'now'); + $contract->type = new NullContractType((int) ($request->getData('type') ?? 0)); + $contract->start = new \DateTime($request->getData('start') ?? 'now'); if (!empty($request->getData('end'))) { $contract->end = new \DateTime($request->getData('end')); @@ -202,7 +202,7 @@ final class ApiController extends Controller */ private function createContractTypeFromRequest(RequestAbstract $request) : ContractType { - $contractType = new ContractType(); + $contractType = new ContractType(); $contractType->name = (string) ($request->getData('name') ?? ''); return $contractType; diff --git a/Controller/BackendController.php b/Controller/BackendController.php index d0c5322..d796bee 100644 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -36,7 +36,7 @@ use Modules\ContractManagement\Models\ContractMapper; */ final class BackendController extends Controller { - /** + /** * Routing end-point for application behaviour. * * @param RequestAbstract $request Request diff --git a/Models/Contract.php b/Models/Contract.php index ba3db57..f334b7a 100644 --- a/Models/Contract.php +++ b/Models/Contract.php @@ -77,7 +77,7 @@ class Contract */ public function __construct() { - $this->createdAt = new \DateTimeImmutable('now'); + $this->createdAt = new \DateTimeImmutable('now'); } /** diff --git a/Models/ContractType.php b/Models/ContractType.php index 0f60880..1b54edd 100644 --- a/Models/ContractType.php +++ b/Models/ContractType.php @@ -48,9 +48,7 @@ class ContractType implements \JsonSerializable, ArrayableInterface * * @var ContractTypeL11n */ - protected string | - - ContractTypeL11n $l11n; + protected string | ContractTypeL11n $l11n; /** * Constructor. @@ -82,22 +80,22 @@ class ContractType implements \JsonSerializable, ArrayableInterface * Set l11n * * @param string|ContractTypeL11n $l11n Tag article l11n - * @param string $lang Language + * @param string $lang Language * * @return void * * @since 1.0.0 */ - public function setL11n($l11n, string $lang = ISO639x1Enum::_EN) : void + public function setL11n(string|ContractTypeL11n $l11n, string $lang = ISO639x1Enum::_EN) : void { if ($l11n instanceof ContractTypeL11n) { $this->l11n = $l11n; - } elseif (\is_string($l11n)) { + } elseif ($this->l11n instanceof ContractTypeL11n) { + $this->l11n->title = $l11n; + } else { $this->l11n = new ContractTypeL11n(); $this->l11n->title = $l11n; $this->l11n->setLanguage($lang); - } elseif ($this->l11n instanceof ContractTypeL11n && \is_string($l11n)) { - $this->l11n->title = $l11n; } } diff --git a/Models/ContractTypeL11n.php b/Models/ContractTypeL11n.php index 7092063..7da01e5 100644 --- a/Models/ContractTypeL11n.php +++ b/Models/ContractTypeL11n.php @@ -41,9 +41,7 @@ class ContractTypeL11n implements \JsonSerializable, ArrayableInterface * @var int|ContractType * @since 1.0.0 */ - protected int | - -ContractType $type = 0; + protected int | ContractType $type = 0; /** * Language. @@ -65,8 +63,8 @@ ContractType $type = 0; * Constructor. * * @param int|ContractType $type Attribute type - * @param string $title Localized title - * @param string $language Language + * @param string $title Localized title + * @param string $language Language * * @since 1.0.0 */ diff --git a/Theme/Backend/contract-single.tpl.php b/Theme/Backend/contract-single.tpl.php index 33c5d8e..8863029 100644 --- a/Theme/Backend/contract-single.tpl.php +++ b/Theme/Backend/contract-single.tpl.php @@ -33,14 +33,14 @@ echo $this->getData('nav')->render(); ?>
request->uri->fragment === 'c-tab-1' ? ' checked' : ''; ?>>
-
-
-
+
+
+
- request->uri->fragment === 'c-tab-2' ? ' checked' : ''; ?>> + request->uri->fragment === 'c-tab-2' ? ' checked' : ''; ?>>
-
-
-
+
+
+ From f1a90be86d1782145e9cb4d2c8de706cf4fb41e0 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sun, 4 Jul 2021 18:27:20 +0200 Subject: [PATCH 007/133] formatting fixes, bug fixes and support impl. --- .directory | 0 Admin/Install/Navigation.install.json | 0 Admin/Install/Navigation.php | 0 Admin/Install/db.json | 0 Admin/Installer.php | 0 Admin/Routes/Web/Backend.php | 0 Admin/Status.php | 0 Admin/Uninstaller.php | 0 Admin/Updater.php | 0 Controller/ApiController.php | 2 +- Controller/BackendController.php | 0 Controller/Controller.php | 2 +- Models/Contract.php | 0 Models/ContractMapper.php | 0 Models/ContractType.php | 2 +- Models/ContractTypeL11n.php | 0 Models/ContractTypeL11nMapper.php | 0 Models/ContractTypeMapper.php | 0 Models/NullContract.php | 0 Models/NullContractType.php | 0 Models/NullContractTypeL11n.php | 0 Models/PermissionState.php | 0 README.md | 0 Theme/Backend/Lang/Navigation.en.lang.php | 0 Theme/Backend/Lang/en.lang.php | 0 Theme/Backend/contract-list.tpl.php | 6 ++++-- Theme/Backend/contract-single.tpl.php | 0 info.json | 0 28 files changed, 7 insertions(+), 5 deletions(-) mode change 100644 => 100755 .directory mode change 100644 => 100755 Admin/Install/Navigation.install.json mode change 100644 => 100755 Admin/Install/Navigation.php mode change 100644 => 100755 Admin/Install/db.json mode change 100644 => 100755 Admin/Installer.php mode change 100644 => 100755 Admin/Routes/Web/Backend.php mode change 100644 => 100755 Admin/Status.php mode change 100644 => 100755 Admin/Uninstaller.php mode change 100644 => 100755 Admin/Updater.php mode change 100644 => 100755 Controller/ApiController.php mode change 100644 => 100755 Controller/BackendController.php mode change 100644 => 100755 Controller/Controller.php mode change 100644 => 100755 Models/Contract.php mode change 100644 => 100755 Models/ContractMapper.php mode change 100644 => 100755 Models/ContractType.php mode change 100644 => 100755 Models/ContractTypeL11n.php mode change 100644 => 100755 Models/ContractTypeL11nMapper.php mode change 100644 => 100755 Models/ContractTypeMapper.php mode change 100644 => 100755 Models/NullContract.php mode change 100644 => 100755 Models/NullContractType.php mode change 100644 => 100755 Models/NullContractTypeL11n.php mode change 100644 => 100755 Models/PermissionState.php mode change 100644 => 100755 README.md mode change 100644 => 100755 Theme/Backend/Lang/Navigation.en.lang.php mode change 100644 => 100755 Theme/Backend/Lang/en.lang.php mode change 100644 => 100755 Theme/Backend/contract-list.tpl.php mode change 100644 => 100755 Theme/Backend/contract-single.tpl.php mode change 100644 => 100755 info.json diff --git a/.directory b/.directory old mode 100644 new mode 100755 diff --git a/Admin/Install/Navigation.install.json b/Admin/Install/Navigation.install.json old mode 100644 new mode 100755 diff --git a/Admin/Install/Navigation.php b/Admin/Install/Navigation.php old mode 100644 new mode 100755 diff --git a/Admin/Install/db.json b/Admin/Install/db.json old mode 100644 new mode 100755 diff --git a/Admin/Installer.php b/Admin/Installer.php old mode 100644 new mode 100755 diff --git a/Admin/Routes/Web/Backend.php b/Admin/Routes/Web/Backend.php old mode 100644 new mode 100755 diff --git a/Admin/Status.php b/Admin/Status.php old mode 100644 new mode 100755 diff --git a/Admin/Uninstaller.php b/Admin/Uninstaller.php old mode 100644 new mode 100755 diff --git a/Admin/Updater.php b/Admin/Updater.php old mode 100644 new mode 100755 diff --git a/Controller/ApiController.php b/Controller/ApiController.php old mode 100644 new mode 100755 index 622014a..5d1434a --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -141,7 +141,7 @@ final class ApiController extends Controller } $uploaded = $this->app->moduleManager->get('Media')->uploadFiles( - $request->getData('name') ?? '', + [$request->getData('name') ?? ''], $uploadedFiles, $request->header->account, __DIR__ . '/../../../Modules/Media/Files/Modules/ContractManagement/Contracts/' . ($request->getData('contract_title') ?? '0'), diff --git a/Controller/BackendController.php b/Controller/BackendController.php old mode 100644 new mode 100755 diff --git a/Controller/Controller.php b/Controller/Controller.php old mode 100644 new mode 100755 index d80d32d..fc8fecd --- a/Controller/Controller.php +++ b/Controller/Controller.php @@ -17,7 +17,7 @@ namespace Modules\ContractManagement\Controller; use phpOMS\Module\ModuleAbstract; /** - * Task class. + * Contract controller class. * * @package Modules\ContractManagement * @license OMS License 1.0 diff --git a/Models/Contract.php b/Models/Contract.php old mode 100644 new mode 100755 diff --git a/Models/ContractMapper.php b/Models/ContractMapper.php old mode 100644 new mode 100755 diff --git a/Models/ContractType.php b/Models/ContractType.php old mode 100644 new mode 100755 index 1b54edd..d4b292b --- a/Models/ContractType.php +++ b/Models/ContractType.php @@ -90,7 +90,7 @@ class ContractType implements \JsonSerializable, ArrayableInterface { if ($l11n instanceof ContractTypeL11n) { $this->l11n = $l11n; - } elseif ($this->l11n instanceof ContractTypeL11n) { + } elseif (isset($this->l11n) && $this->l11n instanceof ContractTypeL11n) { $this->l11n->title = $l11n; } else { $this->l11n = new ContractTypeL11n(); diff --git a/Models/ContractTypeL11n.php b/Models/ContractTypeL11n.php old mode 100644 new mode 100755 diff --git a/Models/ContractTypeL11nMapper.php b/Models/ContractTypeL11nMapper.php old mode 100644 new mode 100755 diff --git a/Models/ContractTypeMapper.php b/Models/ContractTypeMapper.php old mode 100644 new mode 100755 diff --git a/Models/NullContract.php b/Models/NullContract.php old mode 100644 new mode 100755 diff --git a/Models/NullContractType.php b/Models/NullContractType.php old mode 100644 new mode 100755 diff --git a/Models/NullContractTypeL11n.php b/Models/NullContractTypeL11n.php old mode 100644 new mode 100755 diff --git a/Models/PermissionState.php b/Models/PermissionState.php old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/Navigation.en.lang.php b/Theme/Backend/Lang/Navigation.en.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/en.lang.php b/Theme/Backend/Lang/en.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/contract-list.tpl.php b/Theme/Backend/contract-list.tpl.php old mode 100644 new mode 100755 index 0da1544..3d80889 --- a/Theme/Backend/contract-list.tpl.php +++ b/Theme/Backend/contract-list.tpl.php @@ -76,11 +76,13 @@ echo $this->getData('nav')->render(); ?> $url = UriFactory::build('{/prefix}contract/single?{?}&id=' . $value->getId()); $type = 'ok'; - if ($value->end->getTimestamp() < $now->getTimestamp() && $value->end->getTimestamp() + 129600 > $now->getTimestamp()) { + if (($value->end->getTimestamp() < $now->getTimestamp() && $value->end->getTimestamp() + 7776000 > $now->getTimestamp()) + || ($value->end->getTimestamp() > $now->getTimestamp() && $value->end->getTimestamp() - 7776000 < $now->getTimestamp()) + ) { $type = 'error'; } elseif ($value->end->getTimestamp() < $now->getTimestamp()) { $type = 'info'; - } elseif ($value->end->getTimestamp() + 129600 < $now->getTimestamp()) { + } elseif ($value->end->getTimestamp() + 7776000 < $now->getTimestamp()) { $type = 'warning'; } ?> diff --git a/Theme/Backend/contract-single.tpl.php b/Theme/Backend/contract-single.tpl.php old mode 100644 new mode 100755 diff --git a/info.json b/info.json old mode 100644 new mode 100755 From 2e50640665fad5740e87ef5a411be93d07517485 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Thu, 15 Jul 2021 21:51:30 +0200 Subject: [PATCH 008/133] implement todos --- Docs/Dev/img/er.png | Bin 0 -> 165442 bytes Theme/Backend/contract-list.tpl.php | 13 ------------- 2 files changed, 13 deletions(-) create mode 100644 Docs/Dev/img/er.png diff --git a/Docs/Dev/img/er.png b/Docs/Dev/img/er.png new file mode 100644 index 0000000000000000000000000000000000000000..e99eb15563fc86556fd73759eb3702d06939984a GIT binary patch literal 165442 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 z%0A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

#3qxmQjyf{*d zk)XzNXK|yuH#m|7S`RBS{**9(jB|{6!JR$BEDPu}-gLzar!%S_X^pT$&6p?l*JqPb z0iO-&y7`r>zMDWx&*8N~BpfnUrXzw*c>VJ6mw&+1`Nv)#m&Ph5k5>Jeko)A=ire!# zmQJtNX?GatuZwq6^?^Q)76~TpfeqCya8%K@3!&=Pa7CfOY4N5mp9xwrl*grp?SRhp zr8runfS%WIpp2xoF-SJ`#Vsh~3cq$oahTLkZPZ^N^dZ7miREv$eOjZM0uk168KvYy=&{eTy=-ZS-XhINky z@f{2_v_1-GH#eEe)afry*&TYFao9sj~1Q4-ZYty`VdyzJ$UN|R?zQp~;=TjN#MLNrasses zq`RNMmIw-c7G=17~uf=nwUp=!~PD;Dh_Pf<=%0D^9APKqd<}!9+R>d3=>r<=5cqD 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 Pfrt2GnMWB9HQ)UYRKLD$ literal 0 HcmV?d00001 diff --git a/Theme/Backend/contract-list.tpl.php b/Theme/Backend/contract-list.tpl.php index 3d80889..50eec30 100755 --- a/Theme/Backend/contract-list.tpl.php +++ b/Theme/Backend/contract-list.tpl.php @@ -35,18 +35,6 @@ echo $this->getData('nav')->render(); ?> - -
getHtml('ID', '0', '0'); ?> - - - getHtml('Title'); ?>
getId(); ?> printHtml($value->title); ?> end !== null ? $value->end->format('Y-m-d') : ''; ?> From 24c9ae4bcc88ab05e6b5b2ddf7421606377ec61e Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Thu, 15 Jul 2021 21:54:04 +0200 Subject: [PATCH 009/133] link er diagrams --- Docs/Dev/en/SUMMARY.md | 3 +++ Docs/Dev/en/structure.md | 5 +++++ 2 files changed, 8 insertions(+) create mode 100644 Docs/Dev/en/SUMMARY.md create mode 100644 Docs/Dev/en/structure.md diff --git a/Docs/Dev/en/SUMMARY.md b/Docs/Dev/en/SUMMARY.md new file mode 100644 index 0000000..8a97952 --- /dev/null +++ b/Docs/Dev/en/SUMMARY.md @@ -0,0 +1,3 @@ +# Developer Content + +* [Structure]({%}&page=Dev/structure) diff --git a/Docs/Dev/en/structure.md b/Docs/Dev/en/structure.md new file mode 100644 index 0000000..81d0bd8 --- /dev/null +++ b/Docs/Dev/en/structure.md @@ -0,0 +1,5 @@ +# Structure + +## ER + +![ER](Modules/ContractManagement/Docs/Dev/img/er.png) \ No newline at end of file From eb184b72dedaf0833f9277ccdeebe67d6c29e2e3 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Tue, 17 Aug 2021 13:40:08 +0200 Subject: [PATCH 010/133] add account reference in order to assign a contract to an account --- Admin/Install/db.json | 7 +++++++ Controller/ApiController.php | 1 + Models/Contract.php | 5 +++++ Models/ContractMapper.php | 6 ++++++ Theme/Backend/contract-list.tpl.php | 21 +++++++++++++++++---- 5 files changed, 36 insertions(+), 4 deletions(-) diff --git a/Admin/Install/db.json b/Admin/Install/db.json index b539b7e..969bfb0 100755 --- a/Admin/Install/db.json +++ b/Admin/Install/db.json @@ -67,6 +67,13 @@ "type": "TEXT", "null": false }, + "contractmgmt_contract_account": { + "name": "contractmgmt_contract_account", + "type": "INT", + "null": true, + "foreignTable": "account", + "foreignKey": "account_id" + }, "contractmgmt_contract_start": { "name": "contractmgmt_contract_start", "type": "DATETIME", diff --git a/Controller/ApiController.php b/Controller/ApiController.php index 5d1434a..2fb0298 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -108,6 +108,7 @@ final class ApiController extends Controller $contract->description = (string) ($request->getData('description') ?? ''); $contract->type = new NullContractType((int) ($request->getData('type') ?? 0)); $contract->start = new \DateTime($request->getData('start') ?? 'now'); + $contract->account = new NullAccount((int) $request->getData('account')); if (!empty($request->getData('end'))) { $contract->end = new \DateTime($request->getData('end')); diff --git a/Models/Contract.php b/Models/Contract.php index f334b7a..4168f1a 100755 --- a/Models/Contract.php +++ b/Models/Contract.php @@ -16,6 +16,8 @@ namespace Modules\ContractManagement\Models; use Modules\Media\Models\Media; use Modules\Media\Models\NullMedia; +use Modules\Admin\Models\Account; +use Modules\Admin\Models\NullAccount; use phpOMS\Localization\Money; /** @@ -58,6 +60,8 @@ class Contract public ?int $responsible = null; + public Account $account; + /** * Created at. * @@ -78,6 +82,7 @@ class Contract public function __construct() { $this->createdAt = new \DateTimeImmutable('now'); + $this->account = new NullAccount(); } /** diff --git a/Models/ContractMapper.php b/Models/ContractMapper.php index 653ae15..86cdf5e 100755 --- a/Models/ContractMapper.php +++ b/Models/ContractMapper.php @@ -16,6 +16,7 @@ namespace Modules\ContractManagement\Models; use Modules\Editor\Models\EditorDocMapper; use Modules\Media\Models\MediaMapper; +use Modules\Admin\Models\AccountMapper; use phpOMS\DataStorage\Database\DataMapperAbstract; /** @@ -38,6 +39,7 @@ final class ContractMapper extends DataMapperAbstract 'contractmgmt_contract_id' => ['name' => 'contractmgmt_contract_id', 'type' => 'int', 'internal' => 'id'], 'contractmgmt_contract_title' => ['name' => 'contractmgmt_contract_title', 'type' => 'string', 'internal' => 'title', 'autocomplete' => true], 'contractmgmt_contract_description' => ['name' => 'contractmgmt_contract_description', 'type' => 'string', 'internal' => 'description'], + 'contractmgmt_contract_accouunt' => ['name' => 'contractmgmt_contract_accouunt', 'type' => 'int', 'internal' => 'accouunt'], 'contractmgmt_contract_costs' => ['name' => 'contractmgmt_contract_costs', 'type' => 'Serializable', 'internal' => 'costs'], 'contractmgmt_contract_duration' => ['name' => 'contractmgmt_contract_duration', 'type' => 'int', 'internal' => 'duration'], 'contractmgmt_contract_warning' => ['name' => 'contractmgmt_contract_warning', 'type' => 'int', 'internal' => 'warning'], @@ -83,6 +85,10 @@ final class ContractMapper extends DataMapperAbstract 'mapper' => ContractTypeMapper::class, 'external' => 'contractmgmt_contract_type', ], + 'account' => [ + 'mapper' => AccountMapper::class, + 'external' => 'contractmgmt_contract_account', + ], ]; /** diff --git a/Theme/Backend/contract-list.tpl.php b/Theme/Backend/contract-list.tpl.php index 50eec30..5332b60 100755 --- a/Theme/Backend/contract-list.tpl.php +++ b/Theme/Backend/contract-list.tpl.php @@ -36,6 +36,18 @@ echo $this->getData('nav')->render(); ?>
getHtml('Title'); ?> + + + + getHtml('Account'); ?> getHtml('End'); ?> -
printHtml($value->title); ?> + printHtml($value->account->name1); ?> printHtml($value->account->name2); ?> end !== null ? $value->end->format('Y-m-d') : ''; ?>
From bdee6f52d33de70b80d50e56ff97d58435d1385c Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sun, 29 Aug 2021 10:55:43 +0200 Subject: [PATCH 011/133] add/change docs --- Controller/ApiController.php | 2 +- Controller/BackendController.php | 8 +++++--- Models/Contract.php | 1 - Models/ContractMapper.php | 3 +-- Theme/Backend/contract-list.tpl.php | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Controller/ApiController.php b/Controller/ApiController.php index 2fb0298..a61264f 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -108,7 +108,7 @@ final class ApiController extends Controller $contract->description = (string) ($request->getData('description') ?? ''); $contract->type = new NullContractType((int) ($request->getData('type') ?? 0)); $contract->start = new \DateTime($request->getData('start') ?? 'now'); - $contract->account = new NullAccount((int) $request->getData('account')); + $contract->account = new NullAccount((int) ($request->getData('account') ?? 0)); if (!empty($request->getData('end'))) { $contract->end = new \DateTime($request->getData('end')); diff --git a/Controller/BackendController.php b/Controller/BackendController.php index d796bee..99b28e8 100755 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -23,6 +23,8 @@ use phpOMS\Message\RequestAbstract; use phpOMS\Message\ResponseAbstract; use phpOMS\Views\View; use Modules\ContractManagement\Models\ContractMapper; +use Modules\ContractManagement\Models\ContractType; +use Modules\ContractManagement\Models\ContractTypeL11n; /** * Backend controller for the contracts module. @@ -57,17 +59,17 @@ final class BackendController extends Controller if ($request->getData('ptype') === 'p') { $view->setData('contracts', - ContractMapper::with('language', $response->getLanguage()) + ContractMapper::with('language', $response->getLanguage(), [ContractTypeL11n::class]) ::getBeforePivot((int) ($request->getData('id') ?? 0), null, 25) ); } elseif ($request->getData('ptype') === 'n') { $view->setData('contracts', - ContractMapper::with('language', $response->getLanguage()) + ContractMapper::with('language', $response->getLanguage(), [ContractTypeL11n::class]) ::getAfterPivot((int) ($request->getData('id') ?? 0), null, 25) ); } else { $view->setData('contracts', - ContractMapper::with('language', $response->getLanguage()) + ContractMapper::with('language', $response->getLanguage(), [ContractTypeL11n::class]) ::getAfterPivot(0, null, 25) ); } diff --git a/Models/Contract.php b/Models/Contract.php index 4168f1a..1e66fab 100755 --- a/Models/Contract.php +++ b/Models/Contract.php @@ -15,7 +15,6 @@ declare(strict_types=1); namespace Modules\ContractManagement\Models; use Modules\Media\Models\Media; -use Modules\Media\Models\NullMedia; use Modules\Admin\Models\Account; use Modules\Admin\Models\NullAccount; use phpOMS\Localization\Money; diff --git a/Models/ContractMapper.php b/Models/ContractMapper.php index 86cdf5e..058bb2e 100755 --- a/Models/ContractMapper.php +++ b/Models/ContractMapper.php @@ -14,7 +14,6 @@ declare(strict_types=1); namespace Modules\ContractManagement\Models; -use Modules\Editor\Models\EditorDocMapper; use Modules\Media\Models\MediaMapper; use Modules\Admin\Models\AccountMapper; use phpOMS\DataStorage\Database\DataMapperAbstract; @@ -39,7 +38,7 @@ final class ContractMapper extends DataMapperAbstract 'contractmgmt_contract_id' => ['name' => 'contractmgmt_contract_id', 'type' => 'int', 'internal' => 'id'], 'contractmgmt_contract_title' => ['name' => 'contractmgmt_contract_title', 'type' => 'string', 'internal' => 'title', 'autocomplete' => true], 'contractmgmt_contract_description' => ['name' => 'contractmgmt_contract_description', 'type' => 'string', 'internal' => 'description'], - 'contractmgmt_contract_accouunt' => ['name' => 'contractmgmt_contract_accouunt', 'type' => 'int', 'internal' => 'accouunt'], + 'contractmgmt_contract_account' => ['name' => 'contractmgmt_contract_account', 'type' => 'int', 'internal' => 'account'], 'contractmgmt_contract_costs' => ['name' => 'contractmgmt_contract_costs', 'type' => 'Serializable', 'internal' => 'costs'], 'contractmgmt_contract_duration' => ['name' => 'contractmgmt_contract_duration', 'type' => 'int', 'internal' => 'duration'], 'contractmgmt_contract_warning' => ['name' => 'contractmgmt_contract_warning', 'type' => 'int', 'internal' => 'warning'], diff --git a/Theme/Backend/contract-list.tpl.php b/Theme/Backend/contract-list.tpl.php index 5332b60..872a046 100755 --- a/Theme/Backend/contract-list.tpl.php +++ b/Theme/Backend/contract-list.tpl.php @@ -88,7 +88,7 @@ echo $this->getData('nav')->render(); ?> ?> printHtml($value->title); ?> - printHtml($value->account->name1); ?> printHtml($value->account->name2); ?> + printHtml($value->account->name1); ?> printHtml($value->account->name2); ?> end !== null ? $value->end->format('Y-m-d') : ''; ?> From a2bf6b9c2a7ff3b19e6c402be94a74c33199e771 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sun, 5 Sep 2021 20:16:54 +0200 Subject: [PATCH 012/133] fix table overflow --- Theme/Backend/contract-list.tpl.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Theme/Backend/contract-list.tpl.php b/Theme/Backend/contract-list.tpl.php index 872a046..6b0f5b0 100755 --- a/Theme/Backend/contract-list.tpl.php +++ b/Theme/Backend/contract-list.tpl.php @@ -32,6 +32,7 @@ echo $this->getData('nav')->render(); ?>

getHtml('Contracts'); ?>
+
@@ -92,6 +93,7 @@ echo $this->getData('nav')->render(); ?>
end !== null ? $value->end->format('Y-m-d') : ''; ?>
+
getHtml('Previous', '0', '0'); ?> getHtml('Next', '0', '0'); ?> From e90cf138badf61d764b0f46a44be54046c202781 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sun, 19 Sep 2021 19:50:14 +0200 Subject: [PATCH 013/133] september update 1 --- Admin/Routes/Web/Backend.php | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/Admin/Routes/Web/Backend.php b/Admin/Routes/Web/Backend.php index 464ba16..e7aa318 100755 --- a/Admin/Routes/Web/Backend.php +++ b/Admin/Routes/Web/Backend.php @@ -1,4 +1,16 @@ - Date: Sat, 25 Sep 2021 14:48:54 +0200 Subject: [PATCH 014/133] bug fixes --- Controller/ApiController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Controller/ApiController.php b/Controller/ApiController.php index a61264f..7abc0ce 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -147,7 +147,7 @@ final class ApiController extends Controller $request->header->account, __DIR__ . '/../../../Modules/Media/Files/Modules/ContractManagement/Contracts/' . ($request->getData('contract_title') ?? '0'), '/Modules/ContractManagement/Contracts/' . ($request->getData('contract_title') ?? '0'), - $request->getData('type') ?? '', + $request->getData('type', 'int'), '', '', PathSettings::FILE_PATH From 0b5bc3092bd8b89e1c609f6cbea6f056651aa492 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Mon, 27 Sep 2021 23:14:00 +0200 Subject: [PATCH 015/133] impl. todos or move to Project.md --- Models/ContractType.php | 8 -------- 1 file changed, 8 deletions(-) diff --git a/Models/ContractType.php b/Models/ContractType.php index d4b292b..e700dfe 100755 --- a/Models/ContractType.php +++ b/Models/ContractType.php @@ -35,14 +35,6 @@ class ContractType implements \JsonSerializable, ArrayableInterface */ protected int $id = 0; - /** - * Name/string identifier by which it can be found/categorized - * - * @var string - * @since 1.0.0 - */ - public string $name = ''; // @todo: currently not filled, should be used as identifier or if not required removed (at the moment it seems like it is useless?!) - /** * Localization * From 4143eff4ec2ecb6b02f6db2836b07fe92d66d777 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Tue, 28 Sep 2021 18:28:42 +0200 Subject: [PATCH 016/133] rename module constants and fix some unit test bugs --- Admin/Routes/Web/Backend.php | 4 ++-- Controller/Controller.php | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Admin/Routes/Web/Backend.php b/Admin/Routes/Web/Backend.php index e7aa318..0a66f09 100755 --- a/Admin/Routes/Web/Backend.php +++ b/Admin/Routes/Web/Backend.php @@ -23,7 +23,7 @@ return [ 'dest' => '\Modules\ContractManagement\Controller\BackendController:viewContractList', 'verb' => RouteVerb::GET, 'permission' => [ - 'module' => BackendController::MODULE_NAME, + 'module' => BackendController::NAME, 'type' => PermissionType::READ, 'state' => PermissionState::CONTRACT, ], @@ -34,7 +34,7 @@ return [ 'dest' => '\Modules\ContractManagement\Controller\BackendController:viewContract', 'verb' => RouteVerb::GET, 'permission' => [ - 'module' => BackendController::MODULE_NAME, + 'module' => BackendController::NAME, 'type' => PermissionType::READ, 'state' => PermissionState::CONTRACT, ], diff --git a/Controller/Controller.php b/Controller/Controller.php index fc8fecd..6218edd 100755 --- a/Controller/Controller.php +++ b/Controller/Controller.php @@ -32,7 +32,7 @@ class Controller extends ModuleAbstract * @var string * @since 1.0.0 */ - public const MODULE_PATH = __DIR__ . '/../'; + public const PATH = __DIR__ . '/../'; /** * Module version. @@ -40,7 +40,7 @@ class Controller extends ModuleAbstract * @var string * @since 1.0.0 */ - public const MODULE_VERSION = '1.0.0'; + public const VERSION = '1.0.0'; /** * Module name. @@ -48,7 +48,7 @@ class Controller extends ModuleAbstract * @var string * @since 1.0.0 */ - public const MODULE_NAME = 'ContractManagement'; + public const NAME = 'ContractManagement'; /** * Module id. @@ -56,7 +56,7 @@ class Controller extends ModuleAbstract * @var int * @since 1.0.0 */ - public const MODULE_ID = 1007900000; + public const ID = 1007900000; /** * Providing. From bea84a4b79f8dc11ed58da4ce6bb659632699f8a Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sat, 2 Oct 2021 20:49:17 +0200 Subject: [PATCH 017/133] test fixes and added more tests --- Admin/Install/db.json | 5 ----- Controller/ApiController.php | 6 ++---- Models/ContractTypeMapper.php | 1 - 3 files changed, 2 insertions(+), 10 deletions(-) diff --git a/Admin/Install/db.json b/Admin/Install/db.json index 969bfb0..526b00c 100755 --- a/Admin/Install/db.json +++ b/Admin/Install/db.json @@ -8,11 +8,6 @@ "null": false, "primary": true, "autoincrement": true - }, - "contractmgmt_type_name": { - "name": "contractmgmt_type_name", - "type": "VARCHAR(255)", - "null": false } } }, diff --git a/Controller/ApiController.php b/Controller/ApiController.php index 7abc0ce..0c97ee8 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -203,8 +203,7 @@ final class ApiController extends Controller */ private function createContractTypeFromRequest(RequestAbstract $request) : ContractType { - $contractType = new ContractType(); - $contractType->name = (string) ($request->getData('name') ?? ''); + $contractType = new ContractType(); return $contractType; } @@ -221,8 +220,7 @@ final class ApiController extends Controller private function validateContractTypeCreate(RequestAbstract $request) : array { $val = []; - if (($val['name'] = empty($request->getData('name'))) - || ($val['title'] = empty($request->getData('title'))) + if (($val['title'] = empty($request->getData('title'))) ) { return $val; } diff --git a/Models/ContractTypeMapper.php b/Models/ContractTypeMapper.php index e4e5c10..e8efc6c 100755 --- a/Models/ContractTypeMapper.php +++ b/Models/ContractTypeMapper.php @@ -34,7 +34,6 @@ final class ContractTypeMapper extends DataMapperAbstract */ protected static array $columns = [ 'contractmgmt_type_id' => ['name' => 'contractmgmt_type_id', 'type' => 'int', 'internal' => 'id'], - 'contractmgmt_type_name' => ['name' => 'contractmgmt_type_name', 'type' => 'string', 'internal' => 'name', 'autocomplete' => true], ]; /** From eebd9e0c4776d2c92f89ce70ff22e906e02d24da Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sun, 3 Oct 2021 01:25:37 +0200 Subject: [PATCH 018/133] bug fixes --- Controller/BackendController.php | 1 + 1 file changed, 1 insertion(+) diff --git a/Controller/BackendController.php b/Controller/BackendController.php index 99b28e8..29812ba 100755 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -35,6 +35,7 @@ use Modules\ContractManagement\Models\ContractTypeL11n; * @license OMS License 1.0 * @link https://orange-management.org * @since 1.0.0 + * @codeCoverageIgnore */ final class BackendController extends Controller { From 2d9e99ce657ab39e943ad77f9353d572e83803a6 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sun, 3 Oct 2021 09:16:47 +0200 Subject: [PATCH 019/133] phpcs, static and unit test fixes --- Admin/Installer.php | 7 +++++++ Admin/Status.php | 7 +++++++ Admin/Uninstaller.php | 9 ++++++++- Models/Contract.php | 2 +- 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/Admin/Installer.php b/Admin/Installer.php index f24d371..f9dc147 100755 --- a/Admin/Installer.php +++ b/Admin/Installer.php @@ -26,4 +26,11 @@ use phpOMS\Module\InstallerAbstract; */ final class Installer extends InstallerAbstract { + /** + * Path of the file + * + * @var string + * @since 1.0.0 + */ + public const PATH = __DIR__; } diff --git a/Admin/Status.php b/Admin/Status.php index 3d7c831..2d47680 100755 --- a/Admin/Status.php +++ b/Admin/Status.php @@ -26,4 +26,11 @@ use phpOMS\Module\StatusAbstract; */ final class Status extends StatusAbstract { + /** + * Path of the file + * + * @var string + * @since 1.0.0 + */ + public const PATH = __DIR__; } diff --git a/Admin/Uninstaller.php b/Admin/Uninstaller.php index a1931a0..f1724b6 100755 --- a/Admin/Uninstaller.php +++ b/Admin/Uninstaller.php @@ -24,6 +24,13 @@ use phpOMS\Module\UninstallerAbstract; * @link https://orange-management.org * @since 1.0.0 */ -final class Uninstaller extends UninstallerAbstract +final class Installer extends InstallerAbstract { + /** + * Path of the file + * + * @var string + * @since 1.0.0 + */ + public const PATH = __DIR__; } diff --git a/Models/Contract.php b/Models/Contract.php index 1e66fab..6506b2f 100755 --- a/Models/Contract.php +++ b/Models/Contract.php @@ -81,7 +81,7 @@ class Contract public function __construct() { $this->createdAt = new \DateTimeImmutable('now'); - $this->account = new NullAccount(); + $this->account = new NullAccount(); } /** From 9de77c1ca0da4da1a51134ae0a50019bfa3f6ab2 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sun, 3 Oct 2021 09:27:46 +0200 Subject: [PATCH 020/133] fix class names and typos --- Admin/Uninstaller.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Admin/Uninstaller.php b/Admin/Uninstaller.php index f1724b6..a73203f 100755 --- a/Admin/Uninstaller.php +++ b/Admin/Uninstaller.php @@ -24,7 +24,7 @@ use phpOMS\Module\UninstallerAbstract; * @link https://orange-management.org * @since 1.0.0 */ -final class Installer extends InstallerAbstract +final class Uninstaller extends UninstallerAbstract { /** * Path of the file From 665216258a015d58ea737150d979a39fc71e2736 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Mon, 11 Oct 2021 22:01:04 +0200 Subject: [PATCH 021/133] fix phpstan and phpcs --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 295f795..9e8ad00 100755 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -26,7 +26,7 @@ jobs: - name: Setup Composer run: composer install - name: Autoformat - run: 'vendor/bin/php-cs-fixer fix ./ --rules=''{"array_syntax": {"syntax": "short"}, "blank_line_after_namespace": true, "binary_operator_spaces": {"operators": {"=": "align", ".=": "align", "+=": "align", "-=": "align", "*=": "align", "/=": "align", "|=": "align", "&=": "align", "=>": "align", "??=": "align"}}, "cast_spaces": {"space": "single"}, "class_attributes_separation": { "elements": ["const", "method", "property"] }, "combine_consecutive_issets": true, "compact_nullable_typehint": true, "declare_strict_types": true, "declare_equal_normalize": {"space": "none"}, "elseif": true, "encoding": true, "explicit_indirect_variable": true, "explicit_string_variable": true, "function_to_constant": true, "implode_call": true, "increment_style": {"style": "pre"}, "is_null": {"use_yoda_style": false}, "line_ending": true, "logical_operators": true, "lowercase_cast": true, "lowercase_constants": true, "lowercase_keywords": true, "modernize_types_casting": true, "native_constant_invocation": true, "native_function_casing": true, "native_function_invocation": true, "new_with_braces": true, "no_extra_blank_lines": ["break", "case", "continue", "curly_brace_block", "extra", "return", "switch", "throw", "use"], "no_spaces_after_function_name": true, "no_alias_functions": true, "no_closing_tag": true, "no_empty_comment": true, "no_empty_phpdoc": true, "no_empty_statement": true, "no_homoglyph_names": true, "no_mixed_echo_print": {"use": "echo"}, "no_php4_constructor": true, "no_singleline_whitespace_before_semicolons": true, "no_spaces_inside_parenthesis": true, "no_trailing_whitespace": true, "no_unneeded_final_method": true, "no_unused_imports": true, "no_useless_return": true, "no_whitespace_before_comma_in_array": true, "no_whitespace_in_blank_line": true, "non_printable_character": true, "normalize_index_brace": true, "ordered_imports": {"sort_algorithm": "alpha"}, "ordered_interfaces": {"order": "alpha"}, "php_unit_construct": true, "php_unit_internal_class": true, "php_unit_ordered_covers": true, "php_unit_set_up_tear_down_visibility": true, "phpdoc_indent": true, "phpdoc_align": {"align": "vertical"}, "phpdoc_annotation_without_dot": true, "phpdoc_scalar": true, "phpdoc_return_self_reference": {"this": "self"}, "phpdoc_trim": true, "phpdoc_trim_consecutive_blank_line_separation": true, "random_api_migration": true, "self_accessor": true, "return_type_declaration": {"space_before": "one"}, "semicolon_after_instruction": true, "set_type_to_cast": true, "short_scalar_cast": true, "single_blank_line_at_eof": true, "single_line_after_imports": true, "standardize_increment": true, "trailing_comma_in_multiline_array": true, "trim_array_spaces": true, "visibility_required": true, "void_return": true}'' --allow-risky=yes' + run: 'vendor/bin/php-cs-fixer fix ./ --rules=''{"array_syntax": {"syntax": "short"}, "blank_line_after_namespace": true, "binary_operator_spaces": {"operators": {"=": "align", ".=": "align", "+=": "align", "-=": "align", "*=": "align", "/=": "align", "|=": "align", "&=": "align", "=>": "align", "??=": "align"}}, "cast_spaces": {"space": "single"}, "class_attributes_separation": { "elements": {"const": "one", "method": "one", "property": "one"} }, "combine_consecutive_issets": true, "compact_nullable_typehint": true, "declare_strict_types": true, "declare_equal_normalize": {"space": "none"}, "elseif": true, "encoding": true, "explicit_indirect_variable": true, "explicit_string_variable": true, "function_to_constant": true, "implode_call": true, "increment_style": {"style": "pre"}, "is_null": true, "yoda_style": {"equal": false, "identical": false, "less_and_greater": false}, "line_ending": true, "logical_operators": true, "lowercase_cast": true, "constant_case": {"case": "lower"}, "lowercase_keywords": true, "modernize_types_casting": true, "native_constant_invocation": true, "native_function_casing": true, "native_function_invocation": true, "new_with_braces": true, "no_extra_blank_lines": {"tokens": ["break", "case", "continue", "curly_brace_block", "extra", "return", "switch", "throw", "use"]}, "no_spaces_after_function_name": true, "no_alias_functions": true, "no_closing_tag": true, "no_empty_comment": true, "no_empty_phpdoc": true, "no_empty_statement": true, "no_homoglyph_names": true, "no_mixed_echo_print": {"use": "echo"}, "no_php4_constructor": true, "no_singleline_whitespace_before_semicolons": true, "no_spaces_inside_parenthesis": true, "no_trailing_whitespace": true, "no_unneeded_final_method": true, "no_unused_imports": true, "no_useless_return": true, "no_whitespace_before_comma_in_array": true, "no_whitespace_in_blank_line": true, "non_printable_character": true, "normalize_index_brace": true, "ordered_imports": {"sort_algorithm": "alpha"}, "ordered_interfaces": {"order": "alpha"}, "php_unit_construct": true, "php_unit_internal_class": true, "php_unit_set_up_tear_down_visibility": true, "phpdoc_indent": true, "phpdoc_align": {"align": "vertical"}, "phpdoc_annotation_without_dot": true, "phpdoc_scalar": true, "phpdoc_return_self_reference": {"replacements": {"this": "self"}}, "phpdoc_trim": true, "phpdoc_trim_consecutive_blank_line_separation": true, "random_api_migration": true, "self_accessor": true, "return_type_declaration": {"space_before": "one"}, "semicolon_after_instruction": true, "set_type_to_cast": true, "short_scalar_cast": true, "single_blank_line_at_eof": true, "single_line_after_imports": true, "standardize_increment": true, "trailing_comma_in_multiline": true, "trim_array_spaces": true, "visibility_required": true, "void_return": true}'' --allow-risky=yes' - name: Check for modified files id: git-check run: echo ::set-output name=modified::$(if git diff-index --quiet HEAD --; then echo "false"; else echo "true"; fi) From 11120ecaa6838bd2e8c13c60caf9e2c1f388b263 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Mon, 11 Oct 2021 22:22:28 +0200 Subject: [PATCH 022/133] fix root namespace usage --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 9e8ad00..2f66fb5 100755 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -26,7 +26,7 @@ jobs: - name: Setup Composer run: composer install - name: Autoformat - run: 'vendor/bin/php-cs-fixer fix ./ --rules=''{"array_syntax": {"syntax": "short"}, "blank_line_after_namespace": true, "binary_operator_spaces": {"operators": {"=": "align", ".=": "align", "+=": "align", "-=": "align", "*=": "align", "/=": "align", "|=": "align", "&=": "align", "=>": "align", "??=": "align"}}, "cast_spaces": {"space": "single"}, "class_attributes_separation": { "elements": {"const": "one", "method": "one", "property": "one"} }, "combine_consecutive_issets": true, "compact_nullable_typehint": true, "declare_strict_types": true, "declare_equal_normalize": {"space": "none"}, "elseif": true, "encoding": true, "explicit_indirect_variable": true, "explicit_string_variable": true, "function_to_constant": true, "implode_call": true, "increment_style": {"style": "pre"}, "is_null": true, "yoda_style": {"equal": false, "identical": false, "less_and_greater": false}, "line_ending": true, "logical_operators": true, "lowercase_cast": true, "constant_case": {"case": "lower"}, "lowercase_keywords": true, "modernize_types_casting": true, "native_constant_invocation": true, "native_function_casing": true, "native_function_invocation": true, "new_with_braces": true, "no_extra_blank_lines": {"tokens": ["break", "case", "continue", "curly_brace_block", "extra", "return", "switch", "throw", "use"]}, "no_spaces_after_function_name": true, "no_alias_functions": true, "no_closing_tag": true, "no_empty_comment": true, "no_empty_phpdoc": true, "no_empty_statement": true, "no_homoglyph_names": true, "no_mixed_echo_print": {"use": "echo"}, "no_php4_constructor": true, "no_singleline_whitespace_before_semicolons": true, "no_spaces_inside_parenthesis": true, "no_trailing_whitespace": true, "no_unneeded_final_method": true, "no_unused_imports": true, "no_useless_return": true, "no_whitespace_before_comma_in_array": true, "no_whitespace_in_blank_line": true, "non_printable_character": true, "normalize_index_brace": true, "ordered_imports": {"sort_algorithm": "alpha"}, "ordered_interfaces": {"order": "alpha"}, "php_unit_construct": true, "php_unit_internal_class": true, "php_unit_set_up_tear_down_visibility": true, "phpdoc_indent": true, "phpdoc_align": {"align": "vertical"}, "phpdoc_annotation_without_dot": true, "phpdoc_scalar": true, "phpdoc_return_self_reference": {"replacements": {"this": "self"}}, "phpdoc_trim": true, "phpdoc_trim_consecutive_blank_line_separation": true, "random_api_migration": true, "self_accessor": true, "return_type_declaration": {"space_before": "one"}, "semicolon_after_instruction": true, "set_type_to_cast": true, "short_scalar_cast": true, "single_blank_line_at_eof": true, "single_line_after_imports": true, "standardize_increment": true, "trailing_comma_in_multiline": true, "trim_array_spaces": true, "visibility_required": true, "void_return": true}'' --allow-risky=yes' + run: 'vendor/bin/php-cs-fixer fix ./ --rules=''{"array_syntax": {"syntax": "short"}, "blank_line_after_namespace": true, "global_namespace_import": {"import_classes": false, "import_constants": false, "import_functions": false}, "binary_operator_spaces": {"operators": {"=": "align", ".=": "align", "+=": "align", "-=": "align", "*=": "align", "/=": "align", "|=": "align", "&=": "align", "=>": "align", "??=": "align"}}, "cast_spaces": {"space": "single"}, "class_attributes_separation": { "elements": {"const": "one", "method": "one", "property": "one"} }, "combine_consecutive_issets": true, "compact_nullable_typehint": true, "declare_strict_types": true, "declare_equal_normalize": {"space": "none"}, "elseif": true, "encoding": true, "explicit_indirect_variable": true, "explicit_string_variable": true, "function_to_constant": true, "implode_call": true, "increment_style": {"style": "pre"}, "is_null": true, "yoda_style": {"equal": false, "identical": false, "less_and_greater": false}, "line_ending": true, "logical_operators": true, "lowercase_cast": true, "constant_case": {"case": "lower"}, "lowercase_keywords": true, "modernize_types_casting": true, "native_constant_invocation": true, "native_function_casing": true, "native_function_invocation": true, "new_with_braces": true, "no_extra_blank_lines": {"tokens": ["break", "case", "continue", "curly_brace_block", "extra", "return", "switch", "throw", "use"]}, "no_spaces_after_function_name": true, "no_alias_functions": true, "no_closing_tag": true, "no_empty_comment": true, "no_empty_phpdoc": true, "no_empty_statement": true, "no_homoglyph_names": true, "no_mixed_echo_print": {"use": "echo"}, "no_php4_constructor": true, "no_singleline_whitespace_before_semicolons": true, "no_spaces_inside_parenthesis": true, "no_trailing_whitespace": true, "no_unneeded_final_method": true, "no_unused_imports": true, "no_useless_return": true, "no_whitespace_before_comma_in_array": true, "no_whitespace_in_blank_line": true, "non_printable_character": true, "normalize_index_brace": true, "ordered_imports": {"sort_algorithm": "alpha"}, "ordered_interfaces": {"order": "alpha"}, "php_unit_construct": true, "php_unit_internal_class": true, "php_unit_set_up_tear_down_visibility": true, "phpdoc_indent": true, "phpdoc_align": {"align": "vertical"}, "phpdoc_annotation_without_dot": true, "phpdoc_scalar": true, "phpdoc_return_self_reference": {"replacements": {"this": "self"}}, "phpdoc_trim": true, "phpdoc_trim_consecutive_blank_line_separation": true, "random_api_migration": true, "self_accessor": true, "return_type_declaration": {"space_before": "one"}, "semicolon_after_instruction": true, "set_type_to_cast": true, "short_scalar_cast": true, "single_blank_line_at_eof": true, "single_line_after_imports": true, "standardize_increment": true, "trailing_comma_in_multiline": true, "trim_array_spaces": true, "visibility_required": true, "void_return": true}'' --allow-risky=yes' - name: Check for modified files id: git-check run: echo ::set-output name=modified::$(if git diff-index --quiet HEAD --; then echo "false"; else echo "true"; fi) From 599bd0861bd9448976f69b66ca430e31c83c66b7 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Mon, 11 Oct 2021 22:45:07 +0200 Subject: [PATCH 023/133] fix native function call phpcsfixer --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 2f66fb5..a8532c0 100755 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -26,7 +26,7 @@ jobs: - name: Setup Composer run: composer install - name: Autoformat - run: 'vendor/bin/php-cs-fixer fix ./ --rules=''{"array_syntax": {"syntax": "short"}, "blank_line_after_namespace": true, "global_namespace_import": {"import_classes": false, "import_constants": false, "import_functions": false}, "binary_operator_spaces": {"operators": {"=": "align", ".=": "align", "+=": "align", "-=": "align", "*=": "align", "/=": "align", "|=": "align", "&=": "align", "=>": "align", "??=": "align"}}, "cast_spaces": {"space": "single"}, "class_attributes_separation": { "elements": {"const": "one", "method": "one", "property": "one"} }, "combine_consecutive_issets": true, "compact_nullable_typehint": true, "declare_strict_types": true, "declare_equal_normalize": {"space": "none"}, "elseif": true, "encoding": true, "explicit_indirect_variable": true, "explicit_string_variable": true, "function_to_constant": true, "implode_call": true, "increment_style": {"style": "pre"}, "is_null": true, "yoda_style": {"equal": false, "identical": false, "less_and_greater": false}, "line_ending": true, "logical_operators": true, "lowercase_cast": true, "constant_case": {"case": "lower"}, "lowercase_keywords": true, "modernize_types_casting": true, "native_constant_invocation": true, "native_function_casing": true, "native_function_invocation": true, "new_with_braces": true, "no_extra_blank_lines": {"tokens": ["break", "case", "continue", "curly_brace_block", "extra", "return", "switch", "throw", "use"]}, "no_spaces_after_function_name": true, "no_alias_functions": true, "no_closing_tag": true, "no_empty_comment": true, "no_empty_phpdoc": true, "no_empty_statement": true, "no_homoglyph_names": true, "no_mixed_echo_print": {"use": "echo"}, "no_php4_constructor": true, "no_singleline_whitespace_before_semicolons": true, "no_spaces_inside_parenthesis": true, "no_trailing_whitespace": true, "no_unneeded_final_method": true, "no_unused_imports": true, "no_useless_return": true, "no_whitespace_before_comma_in_array": true, "no_whitespace_in_blank_line": true, "non_printable_character": true, "normalize_index_brace": true, "ordered_imports": {"sort_algorithm": "alpha"}, "ordered_interfaces": {"order": "alpha"}, "php_unit_construct": true, "php_unit_internal_class": true, "php_unit_set_up_tear_down_visibility": true, "phpdoc_indent": true, "phpdoc_align": {"align": "vertical"}, "phpdoc_annotation_without_dot": true, "phpdoc_scalar": true, "phpdoc_return_self_reference": {"replacements": {"this": "self"}}, "phpdoc_trim": true, "phpdoc_trim_consecutive_blank_line_separation": true, "random_api_migration": true, "self_accessor": true, "return_type_declaration": {"space_before": "one"}, "semicolon_after_instruction": true, "set_type_to_cast": true, "short_scalar_cast": true, "single_blank_line_at_eof": true, "single_line_after_imports": true, "standardize_increment": true, "trailing_comma_in_multiline": true, "trim_array_spaces": true, "visibility_required": true, "void_return": true}'' --allow-risky=yes' + run: 'vendor/bin/php-cs-fixer fix ./ --rules=''{"array_syntax": {"syntax": "short"}, "blank_line_after_namespace": true, "global_namespace_import": {"import_classes": false, "import_constants": false, "import_functions": false}, "binary_operator_spaces": {"operators": {"=": "align", ".=": "align", "+=": "align", "-=": "align", "*=": "align", "/=": "align", "|=": "align", "&=": "align", "=>": "align", "??=": "align"}}, "cast_spaces": {"space": "single"}, "class_attributes_separation": { "elements": {"const": "one", "method": "one", "property": "one"} }, "combine_consecutive_issets": true, "compact_nullable_typehint": true, "declare_strict_types": true, "declare_equal_normalize": {"space": "none"}, "elseif": true, "encoding": true, "explicit_indirect_variable": true, "explicit_string_variable": true, "function_to_constant": true, "implode_call": true, "increment_style": {"style": "pre"}, "is_null": true, "yoda_style": {"equal": false, "identical": false, "less_and_greater": false}, "line_ending": true, "logical_operators": true, "lowercase_cast": true, "constant_case": {"case": "lower"}, "lowercase_keywords": true, "modernize_types_casting": true, "native_constant_invocation": true, "native_function_casing": true, "native_function_invocation": {"include": ["@all"]}, "new_with_braces": true, "no_extra_blank_lines": {"tokens": ["break", "case", "continue", "curly_brace_block", "extra", "return", "switch", "throw", "use"]}, "no_spaces_after_function_name": true, "no_alias_functions": true, "no_closing_tag": true, "no_empty_comment": true, "no_empty_phpdoc": true, "no_empty_statement": true, "no_homoglyph_names": true, "no_mixed_echo_print": {"use": "echo"}, "no_php4_constructor": true, "no_singleline_whitespace_before_semicolons": true, "no_spaces_inside_parenthesis": true, "no_trailing_whitespace": true, "no_unneeded_final_method": true, "no_unused_imports": true, "no_useless_return": true, "no_whitespace_before_comma_in_array": true, "no_whitespace_in_blank_line": true, "non_printable_character": true, "normalize_index_brace": true, "ordered_imports": {"sort_algorithm": "alpha"}, "ordered_interfaces": {"order": "alpha"}, "php_unit_construct": true, "php_unit_internal_class": true, "php_unit_set_up_tear_down_visibility": true, "phpdoc_indent": true, "phpdoc_align": {"align": "vertical"}, "phpdoc_annotation_without_dot": true, "phpdoc_scalar": true, "phpdoc_return_self_reference": {"replacements": {"this": "self"}}, "phpdoc_trim": true, "phpdoc_trim_consecutive_blank_line_separation": true, "random_api_migration": true, "self_accessor": true, "return_type_declaration": {"space_before": "one"}, "semicolon_after_instruction": true, "set_type_to_cast": true, "short_scalar_cast": true, "single_blank_line_at_eof": true, "single_line_after_imports": true, "standardize_increment": true, "trailing_comma_in_multiline": true, "trim_array_spaces": true, "visibility_required": true, "void_return": true}'' --allow-risky=yes' - name: Check for modified files id: git-check run: echo ::set-output name=modified::$(if git diff-index --quiet HEAD --; then echo "false"; else echo "true"; fi) From 443eb647a1c7f5509b79c1578d6fd1f0702b80b5 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Thu, 21 Oct 2021 22:16:06 +0200 Subject: [PATCH 024/133] more tests and make classes final --- tests/Admin/AdminTest.php | 27 +++++++++++++++++ tests/Models/NullContract.php | 42 +++++++++++++++++++++++++++ tests/Models/NullContractTest.php | 42 +++++++++++++++++++++++++++ tests/Models/NullContractType.php | 42 +++++++++++++++++++++++++++ tests/Models/NullContractTypeL11n.php | 42 +++++++++++++++++++++++++++ tests/Models/NullContractTypeTest.php | 42 +++++++++++++++++++++++++++ 6 files changed, 237 insertions(+) create mode 100644 tests/Admin/AdminTest.php create mode 100644 tests/Models/NullContract.php create mode 100644 tests/Models/NullContractTest.php create mode 100644 tests/Models/NullContractType.php create mode 100644 tests/Models/NullContractTypeL11n.php create mode 100644 tests/Models/NullContractTypeTest.php diff --git a/tests/Admin/AdminTest.php b/tests/Admin/AdminTest.php new file mode 100644 index 0000000..25c04be --- /dev/null +++ b/tests/Admin/AdminTest.php @@ -0,0 +1,27 @@ +getId()); + } +} diff --git a/tests/Models/NullContractTest.php b/tests/Models/NullContractTest.php new file mode 100644 index 0000000..be77912 --- /dev/null +++ b/tests/Models/NullContractTest.php @@ -0,0 +1,42 @@ +getId()); + } +} diff --git a/tests/Models/NullContractType.php b/tests/Models/NullContractType.php new file mode 100644 index 0000000..1dee31e --- /dev/null +++ b/tests/Models/NullContractType.php @@ -0,0 +1,42 @@ +getId()); + } +} diff --git a/tests/Models/NullContractTypeL11n.php b/tests/Models/NullContractTypeL11n.php new file mode 100644 index 0000000..20a95ba --- /dev/null +++ b/tests/Models/NullContractTypeL11n.php @@ -0,0 +1,42 @@ +getId()); + } +} diff --git a/tests/Models/NullContractTypeTest.php b/tests/Models/NullContractTypeTest.php new file mode 100644 index 0000000..3fed45f --- /dev/null +++ b/tests/Models/NullContractTypeTest.php @@ -0,0 +1,42 @@ +getId()); + } +} From c16725caeb86c8d965632968469e4e3d443855b1 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Thu, 21 Oct 2021 22:19:50 +0200 Subject: [PATCH 025/133] make classes final --- tests/Admin/AdminTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Admin/AdminTest.php b/tests/Admin/AdminTest.php index 25c04be..fbdfedb 100644 --- a/tests/Admin/AdminTest.php +++ b/tests/Admin/AdminTest.php @@ -17,7 +17,7 @@ namespace Modules\ContractManagement\tests\Admin; /** * @internal */ -class AdminTest extends \PHPUnit\Framework\TestCase +final class AdminTest extends \PHPUnit\Framework\TestCase { protected const NAME = 'ContractManagement'; From 9cf2887c3ba87b8020f1a10bba7f67c8a8817761 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sun, 24 Oct 2021 13:18:08 +0200 Subject: [PATCH 026/133] get overall coverage to 76% --- Controller/ApiController.php | 7 +- Models/Contract.php | 17 +- Models/ContractType.php | 11 +- Models/ContractTypeL11n.php | 31 +-- tests/Controller/ApiControllerTest.php | 247 ++++++++++++++++++ tests/Controller/test.pdf | 76 ++++++ tests/Models/ContractTest.php | 86 ++++++ tests/Models/ContractTypeL11nTest.php | 87 ++++++ tests/Models/ContractTypeTest.php | 75 ++++++ tests/Models/NullContract.php | 42 --- tests/Models/NullContractType.php | 42 --- ...eL11n.php => NullContractTypeL11nTest.php} | 0 12 files changed, 608 insertions(+), 113 deletions(-) create mode 100644 tests/Controller/ApiControllerTest.php create mode 100644 tests/Controller/test.pdf create mode 100644 tests/Models/ContractTest.php create mode 100644 tests/Models/ContractTypeL11nTest.php create mode 100644 tests/Models/ContractTypeTest.php delete mode 100644 tests/Models/NullContract.php delete mode 100644 tests/Models/NullContractType.php rename tests/Models/{NullContractTypeL11n.php => NullContractTypeL11nTest.php} (100%) diff --git a/Controller/ApiController.php b/Controller/ApiController.php index 0c97ee8..7d98bf4 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -31,6 +31,7 @@ use Modules\Media\Models\PathSettings; use Modules\ContractManagement\Models\Contract; use Modules\ContractManagement\Models\NullContractType; use Modules\ContractManagement\Models\ContractMapper; +use phpOMS\Localization\ISO639x1Enum; /** * Api controller for the contracts module. @@ -186,7 +187,6 @@ final class ApiController extends Controller } $contractType = $this->createContractTypeFromRequest($request); - $contractType->setL11n($request->getData('title'), $request->getData('language')); $this->createModel($request->header->account, $contractType, ContractTypeMapper::class, 'contract_type', $request->getOrigin()); $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Contract type', 'Contract type successfully created', $contractType); @@ -204,6 +204,7 @@ final class ApiController extends Controller private function createContractTypeFromRequest(RequestAbstract $request) : ContractType { $contractType = new ContractType(); + $contractType->setL11n($request->getData('title'), $request->getData('language') ?? ISO639x1Enum::_EN); return $contractType; } @@ -287,7 +288,9 @@ final class ApiController extends Controller private function validateContractTypeL11nCreate(RequestAbstract $request) : array { $val = []; - if (($val['title'] = empty($request->getData('title')))) { + if (($val['title'] = empty($request->getData('title'))) + || ($val['type'] = empty($request->getData('type'))) + ) { return $val; } diff --git a/Models/Contract.php b/Models/Contract.php index 6506b2f..d9c88cb 100755 --- a/Models/Contract.php +++ b/Models/Contract.php @@ -49,7 +49,7 @@ class Contract public string $description = ''; - public \DateTime $start; + public ?\DateTime $start = null; public ?\DateTime $end = null; @@ -82,6 +82,7 @@ class Contract { $this->createdAt = new \DateTimeImmutable('now'); $this->account = new NullAccount(); + $this->type = new ContractType(); } /** @@ -127,7 +128,19 @@ class Contract */ public function toArray() : array { - return []; + return [ + 'id' => $this->id, + 'title' => $this->title, + 'description' => $this->description, + 'start' => $this->start, + 'end' => $this->end, + 'duration' => $this->duration, + 'warning' => $this->warning, + 'responsible' => $this->responsible, + 'createdAt' => $this->createdAt, + 'costs' => $this->costs, + 'type' => $this->type, + ]; } /** diff --git a/Models/ContractType.php b/Models/ContractType.php index e700dfe..27eb374 100755 --- a/Models/ContractType.php +++ b/Models/ContractType.php @@ -45,15 +45,13 @@ class ContractType implements \JsonSerializable, ArrayableInterface /** * Constructor. * - * @param string $name Name/identifier of the attribute type + * @param string $name Name * * @since 1.0.0 */ public function __construct(string $name = '') { - if (!empty($name)) { - $this->setL11n($name); - } + $this->setL11n($name); } /** @@ -106,7 +104,10 @@ class ContractType implements \JsonSerializable, ArrayableInterface */ public function toArray() : array { - return []; + return [ + 'id' => $this->id, + 'l11n' => $this->l11n, + ]; } /** diff --git a/Models/ContractTypeL11n.php b/Models/ContractTypeL11n.php index 7da01e5..e9994ca 100755 --- a/Models/ContractTypeL11n.php +++ b/Models/ContractTypeL11n.php @@ -41,7 +41,7 @@ class ContractTypeL11n implements \JsonSerializable, ArrayableInterface * @var int|ContractType * @since 1.0.0 */ - protected int | ContractType $type = 0; + public int | ContractType $type = 0; /** * Language. @@ -88,29 +88,15 @@ class ContractTypeL11n implements \JsonSerializable, ArrayableInterface } /** - * Get attribute type + * Get language * - * @return int|ContractType + * @return string * * @since 1.0.0 */ - public function getType() : int | ContractType + public function getLanguage() : string { - return $this->type; - } - - /** - * Set type. - * - * @param int $type Type id - * - * @return void - * - * @since 1.0.0 - */ - public function setType(int $type) : void - { - $this->type = $type; + return $this->language; } /** @@ -132,7 +118,12 @@ class ContractTypeL11n implements \JsonSerializable, ArrayableInterface */ public function toArray() : array { - return []; + return [ + 'id' => $this->id, + 'title' => $this->title, + 'type' => $this->type, + 'language' => $this->language, + ]; } /** diff --git a/tests/Controller/ApiControllerTest.php b/tests/Controller/ApiControllerTest.php new file mode 100644 index 0000000..7320305 --- /dev/null +++ b/tests/Controller/ApiControllerTest.php @@ -0,0 +1,247 @@ +app = new class() extends ApplicationAbstract + { + protected string $appName = 'Api'; + }; + + $this->app->dbPool = $GLOBALS['dbpool']; + $this->app->orgId = 1; + $this->app->accountManager = new AccountManager($GLOBALS['session']); + $this->app->appSettings = new CoreSettings(); + $this->app->moduleManager = new ModuleManager($this->app, __DIR__ . '/../../../../Modules/'); + $this->app->dispatcher = new Dispatcher($this->app); + $this->app->eventManager = new EventManager($this->app->dispatcher); + $this->app->eventManager->importFromFile(__DIR__ . '/../../../../Web/Api/Hooks.php'); + $this->app->sessionManager = new HttpSession(36000); + + $account = new Account(); + TestUtils::setMember($account, 'id', 1); + + $permission = new AccountPermission(); + $permission->setUnit(1); + $permission->setApp('backend'); + $permission->setPermission( + PermissionType::READ + | PermissionType::CREATE + | PermissionType::MODIFY + | PermissionType::DELETE + | PermissionType::PERMISSION + ); + + $account->addPermission($permission); + + $this->app->accountManager->add($account); + $this->app->router = new WebRouter(); + + $this->module = $this->app->moduleManager->get('ContractManagement'); + + TestUtils::setMember($this->module, 'app', $this->app); + } + + /** + * @covers Modules\ContractManagement\Controller\ApiController + * @group module + */ + public function testApiContractTypeCreate() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('title', 'Test'); + $request->setData('language', ISO639x1Enum::_EN); + + $this->module->apiContractTypeCreate($request, $response); + self::assertGreaterThan(0, $response->get('')['response']->getId()); + } + + /** + * @covers Modules\ContractManagement\Controller\ApiController + * @group module + */ + public function testApiContractTypeCreateInvalidData() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('invalid', '1'); + + $this->module->apiContractTypeCreate($request, $response); + self::assertEquals(RequestStatusCode::R_400, $response->header->status); + } + + /** + * @covers Modules\ContractManagement\Controller\ApiController + * @group module + */ + public function testApiContractTypeL11nCreate() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('title', 'Test'); + $request->setData('type', '1'); + $request->setData('language', ISO639x1Enum::_DE); + + $this->module->apiContractTypeL11nCreate($request, $response); + self::assertGreaterThan(0, $response->get('')['response']->getId()); + } + + /** + * @covers Modules\ContractManagement\Controller\ApiController + * @group module + */ + public function testApiContractTypeL11nCreateInvalidData() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('invalid', '1'); + + $this->module->apiContractTypeL11nCreate($request, $response); + self::assertEquals(RequestStatusCode::R_400, $response->header->status); + } + + /** + * @covers Modules\ContractManagement\Controller\ApiController + * @group module + */ + public function testApiContractCreate() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('title', 'Title'); + $request->setData('start', '2010-10-09'); + $request->setData('end', '2011-10-09'); + $request->setData('duration', '2'); + $request->setData('type', '1'); + + $this->module->apiContractCreate($request, $response); + self::assertGreaterThan(0, $response->get('')['response']->getId()); + } + + /** + * @covers Modules\ContractManagement\Controller\ApiController + * @group module + */ + public function testApiContractCreateInvalidData() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('invalid', '1'); + + $this->module->apiContractCreate($request, $response); + self::assertEquals(RequestStatusCode::R_400, $response->header->status); + } + + /** + * @covers Modules\ContractManagement\Controller\ApiController + * @group module + */ + public function testApiContractDocCreate() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + if (!\is_file(__DIR__ . '/test_tmp.pdf')) { + \copy(__DIR__ . '/test.pdf', __DIR__ . '/test_tmp.pdf'); + } + + $request->header->account = 1; + $request->setData('contract', 1); + $request->setData('contract_title', 'Test title'); + + TestUtils::setMember($request, 'files', [ + 'file1' => [ + 'name' => 'test.pdf', + 'type' => 'pdf', + 'tmp_name' => __DIR__ . '/test_tmp.pdf', + 'error' => \UPLOAD_ERR_OK, + 'size' => \filesize(__DIR__ . '/test_tmp.pdf'), + ], + ]); + + $this->module->apiContractDocumentCreate($request, $response); + self::assertCount(1, $response->get('')['response']); + } + + /** + * @covers Modules\ContractManagement\Controller\ApiController + * @group module + */ + public function testApiContractDocCreateInvalidData() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('invalid', '1'); + + $this->module->apiContractCreate($request, $response); + self::assertEquals(RequestStatusCode::R_400, $response->header->status); + } +} diff --git a/tests/Controller/test.pdf b/tests/Controller/test.pdf new file mode 100644 index 0000000..4a7256a --- /dev/null +++ b/tests/Controller/test.pdf @@ -0,0 +1,76 @@ +%PDF-1.5 +%µí®û +3 0 obj +<< /Length 4 0 R + /Filter /FlateDecode +>> +stream +xœmPËjÄ0 ¼û+æœX²å” +½·`è9 +›…BC“ìÿSy“@ ‹i¥ÑØ‹yÇb\Ç‘S()ŽJTâ)Ő°^Ñ×ÍøˆìÂ6Å‚õ‚é>ýàâ³Yп +·Ûe1nèÛ8Ÿb”u ˜¶…]͐ð̝hL°‘N5uFê¨Y”Â$II–œ9ü±øRMÈpz4‘úâ$÷I´«~›~²Î:êdžœs¤`…W…(âQKG-+Êsý2¯uÿª»ü¿•´×4IŒ]&F{ƒ•ñ¦I|<åÍ/ΐUe +endstream +endobj +4 0 obj + 224 +endobj +2 0 obj +<< + /ExtGState << + /a0 << /CA 1 /ca 1 >> + >> + /Pattern << /p5 5 0 R >> + /Font << + /f-0-0 6 0 R + >> +>> +endobj +7 0 obj +<< /Type /Page + /Parent 1 0 R + /MediaBox [ 0 0 595 841 ] + /Contents 3 0 R + /Group << + /Type /Group + /S /Transparency + /CS /DeviceRGB + >> + /Resources 2 0 R +>> +endobj +9 0 obj +<< /Length 10 0 R + /Filter /FlateDecode + /Type /XObject + /Subtype /Image + /Width 565 + /Height 532 + /ColorSpace /DeviceGray + /BitsPerComponent 8 +>> +stream +xœíÝg`TÅ೩$t’ÐbB/RB•""Ò»€¨x ýZP@PE”&R¤Di"A@/HÔJ!m³¹ H`“ìî™™÷œ9ßó[6ûͼîœ2EQ´Ä¹dß Á#?ïVÓýMˆ8y–èÔiûºÓIÜ +ýß¶ÖÎèïD4¬TÙFÝ^ŒKJçÞ¶éýZV+žýíˆÖöê4ãêù¤ŒÄŸÝüÝçÝjåBO¢ Îî~ín<~2É’abžŠ8¾sz6Wô7&P~¥Í›wþŠ +qyæjÊhUã%wôw'ây7ïöí´#§ì‰KÚÑê䚩ëçFWADqÍ×jÒ÷¡Ñvý¾X~üïõ_µñótCWD¸*X­ñŒ£{UçåKlô™eýè7GR^~çJŒa˜g6OÞ½N!t…„)Ÿj Nœ3s Ì·OïÙ0¡{%t©„W¿®}¸Ë5/iœmá‚®˜¨S®Gïe¡¢òòØýùÙÑUG™JõØ¸ä¢ØÀ<öm~tíĹ+}¸ü¶ú›jýRI1¡[€Ø)GÓÕwQyäÒGè& öq}eS442)fE7±]öú¿ŸE'&ÅÝ¢4Dé„GûMÂn®³p º1ˆM:ˆBgå™;_н·æyô›»_²nG ¡4-ÇÇÐyÑå²èf!ó³«Îô@· É@éV Ó‘¡‰ôxX‹J +:ˆNFfö6¢{o­yyÄat,²pýut‘tüzÜCg"k·Þ¥{oíÈ=ØÑ™ábÅ®(…n*ò˜kµåè4Øl×[èÖ")*‡AGÁÑ£Ð +F”žWÑ9°98ºÉŒ®à–øe¾ÌÄäâœÍ·pé¦ +Û|<`Èì™36<vçîôÍó`E×âÌÿ¶Nlõ¸ +‰q£R—Oͦ¶œ]= +È_´\…Æm[ô¼hÁŠ{w_Nˆ3›³ZmlÞ4©Š·o⪾ɽ‹Šßûo’9Ý,5«¢ü»õ7iþª +‡î »wË‘‰ÐW¶¶÷3Ø]\öÁ×õ&oQW¯ü4®[ßFÙ_~þì‡;­Õõ_,!êܷ퍴/SÑ%ꍷۗwÏ™27°^¡ìOî”*]·˜Ó-"ßìãPõÙ&²šý|jq¯Êٔɭµ†oš“nŸØ0¿× Àzå_øâc“âÓ]olwä‚´øl†Û<85ºº—¶Õ :ˆ]ÿ–ÑütXÓ×ʽä™ÑW‘|ß”¶ËØ? ´Gãï}Íà’ª:Dû +ÌeÛfªÅÅÄ_úgù½š/çÕÿ²®?'ÿƒÄ´?6§«ÙW¾GŸ;ìK0ošÐ¬€ÄuŠü;Íu-æÂÖåÁÚ½UÚæ+ÚRþaBâ³_›‹ +í)¿ÚÚ¸ ¿Ž*—e¾™j̧Íìt=毹u®P,·½—Õo¤ü{‹9þéÝwD3Ûÿõküf +I|3Uü·V³•åöÖO^övx¿¢n ?å٥ͽŽ6þÓ|#8¿Ï—ôfj*ßVËÚÕUëª+alê'%&>¹´‰ýÀ¦Xä7þåÉx3剽×]ß¹šê_p·_Ÿ|œåÉâ¸Ol¸ +m)æjN¾›©Žœ.mðð\H÷"Lþô=öôC-©?6 ÁY}2»zY“ëf*ÏVa +—^ï:ø1+£^š»æ'×ÃS3ߘé=Ht3ÕEhÃ=õÛ”:E˜ÖÑÓÊY˜Ù‰@¬èeMš›)·ŸD7]²° +ýØO|™bå­ôÊè¿æò@ÏRÜL5¾ZèÜ^Ey î9¬ÝýVØúÌí^Öô3•Sì«móÝ9ì®cžSÊÚ)d;‹YûO9>гÞo¦"¶Uèì…xNþ~óÁs1åŠxÏ‹;ãs —5óúôyì«ÉIùFT+Åm™Ñ„û‘¬ýåcÏ?8ñ@Ï ®”—w‹°çd*)æjðöžÏš‹8 Ò4Ëjï¤%聞 +â¯NéœOg³ŠMÎÊHMö÷À:¢®ûòìxñï[’n¾ýì¿ù@Ï¡[;•õÐÑe±›âw™w›Ä„ +­Àþî:cå¬×ððé‹(Ñôl±êóW +l#5œ\”þ,{ž%áÜþé +D/jaõ˜²Øá/ÀÅ?г…%éÚÚ¯Zzéà%ƒÉM)x‚S+Ü<~`ÍÐ.µ|T¯BrÀ§Ö¿ÒÚ2¸z61‡.mTÄ]ã+‹ÝLNÙï—®oš9t`µb"‡¤ôœZÿf׆µÃ=гMôå½Jjù†Êä¢ädºÏkbÜê¥Ãº”Ïp¸(ùvYÿ‚ ÿ²,—Ä¤SˆÖÓìvp®ÎJSV¥Þ=½åCÞ-禑wq¯°* ãþá)]¼Ý´x…ã¢({Õ×·{äˆ ƒ¼V(ºœ´LíµuWm?Ëý#ÓÚA\f*ù‚«­š›Ï‡‘—¶Õ­SWSO\ó¬4búâý·˜uŒ%~oH¿W4òÛý˜SrhŸqgý´Üš¹Ð7åõö/ûêûŸÏZ³ëh|Ã~û¾ûËfžšyò笸uð°¯+#û×CýGLJε›¿3 dמ3·n³í-͈¿÷çØ6¥ÑMýHòMGJˆŽžZþNß䜷@…ú|9÷Ñðˆ‡I;Oˆ½DóفþðWTN&¥Ã}»¿üɝAžÀûi“sžÂeª7ï1cÙî¢ã9tަ…mþ°†r 2™”fvo^txd>Ô÷u©X÷w>˜¶rDZˆ›Òÿ®d(:bՐ73˜‡(€I©mß“Œè“ëÿ=s,֥ߠ³÷]»)ÿ(”5‹%ê÷Nâ»!U¹Óv|Õã;{ˆ½€ÏY TÅ&&Ì_²+"ž¢òœã¾"»"²ûmþŽ·6g¾vˆ!S¡ +õ;w=mÛÁ›74þ’çNEQÝ‘žÏvÛ¾_❆uËf¶pˆ©Rßï8wõ®ÅB¿-™/ªCÒñ°m£CË[ }S=ŒscËâ\‘½òD7þ_^8ô]Á º +®ãßÞrøFlǁ¹ª=/PIÒµwOá¦Â Ç9%®éŒ›¡ñŒµ0“ŒY‚„uMŽ1Ïýí#[ib³É|ˆmÿt툰ÿÕë§Ÿ#¹n”~dRTÒˁvšaé,¨kr¯Ló!zmP~A7K¦~Â÷ŠÔ½Íbæ™›ú<û¡ùãOøäög¼v[_§Î yÛcRžµ2v Ã§pQ9Ë÷îä_ éš©á^›\SÈŸ³Ãl¹VEŠq)€ǘ¼Ï¤ü©cqûÆd$o;ƒLuÐ5ß$%™Chjs‡Tèæ×§yü_¾ù`J£›_Ÿ"jqŠjô‡Öö¦'YûÝs@QèÖשýðW†0.óЍ¯WÑï û¦È±¬›‡Xµ^‹·5Bkxg_K \ No newline at end of file diff --git a/tests/Models/ContractTest.php b/tests/Models/ContractTest.php new file mode 100644 index 0000000..45b6e47 --- /dev/null +++ b/tests/Models/ContractTest.php @@ -0,0 +1,86 @@ +contract = new Contract(); + } + + /** + * @covers Modules\ContractManagement\Models\Contract + * @group module + */ + public function testDefault() : void + { + self::assertEquals(0, $this->contract->getId()); + self::assertEquals([], $this->contract->getFiles()); + } + + /** + * @covers Modules\ContractManagement\Models\Contract + * @group module + */ + public function testMediaInputOutput() : void + { + $this->contract->addFile(new Media()); + self::assertCount(1, $this->contract->getFiles()); + } + + /** + * @covers Modules\ContractManagement\Models\Contract + * @group module + */ + public function testSerialize() : void + { + $this->contract->title = 'Title'; + $this->contract->description = 'Description'; + $this->contract->duration = 123; + $this->contract->warning = 2; + + $serialized = $this->contract->jsonSerialize(); + unset($serialized['createdAt']); + + self::assertEquals( + [ + 'id' => 0, + 'title' => 'Title', + 'description' => 'Description', + 'start' => null, + 'end' => null, + 'duration' => 123, + 'warning' => 2, + 'responsible' => null, + 'costs' => null, + 'type' => new ContractType(), + ], + $serialized + ); + } +} diff --git a/tests/Models/ContractTypeL11nTest.php b/tests/Models/ContractTypeL11nTest.php new file mode 100644 index 0000000..efa9e53 --- /dev/null +++ b/tests/Models/ContractTypeL11nTest.php @@ -0,0 +1,87 @@ +l11n = new ContractTypeL11n(); + } + + /** + * @covers Modules\ContractManagement\Models\ContractTypeL11n + * @group module + */ + public function testDefault() : void + { + self::assertEquals(0, $this->l11n->getId()); + self::assertEquals('', $this->l11n->title); + self::assertEquals(0, $this->l11n->type); + self::assertEquals(ISO639x1Enum::_EN, $this->l11n->getLanguage()); + } + + /** + * @covers Modules\ContractManagement\Models\ContractTypeL11n + * @group module + */ + public function testNameInputOutput() : void + { + $this->l11n->title = 'TestName'; + self::assertEquals('TestName', $this->l11n->title); + } + + /** + * @covers Modules\ContractManagement\Models\ContractTypeL11n + * @group module + */ + public function testLanguageInputOutput() : void + { + $this->l11n->setLanguage(ISO639x1Enum::_DE); + self::assertEquals(ISO639x1Enum::_DE, $this->l11n->getLanguage()); + } + + /** + * @covers Modules\ContractManagement\Models\ContractTypeL11n + * @group module + */ + public function testSerialize() : void + { + $this->l11n->title = 'Title'; + $this->l11n->type = 2; + $this->l11n->setLanguage(ISO639x1Enum::_DE); + + self::assertEquals( + [ + 'id' => 0, + 'title' => 'Title', + 'type' => 2, + 'language' => ISO639x1Enum::_DE, + ], + $this->l11n->jsonSerialize() + ); + } +} diff --git a/tests/Models/ContractTypeTest.php b/tests/Models/ContractTypeTest.php new file mode 100644 index 0000000..19a6917 --- /dev/null +++ b/tests/Models/ContractTypeTest.php @@ -0,0 +1,75 @@ +type = new ContractType(); + } + + /** + * @covers Modules\ContractManagement\Models\ContractType + * @group module + */ + public function testDefault() : void + { + self::assertEquals(0, $this->type->getId()); + self::assertEquals('', $this->type->getL11n()); + } + + /** + * @covers Modules\ContractManagement\Models\ContractType + * @group module + */ + public function testL11nInputOutput() : void + { + $this->type->setL11n('Test'); + self::assertEquals('Test', $this->type->getL11n()); + + $this->type->setL11n(new ContractTypeL11n(0, 'NewTest')); + self::assertEquals('NewTest', $this->type->getL11n()); + } + + /** + * @covers Modules\ContractManagement\Models\ContractType + * @group module + */ + public function testSerialize() : void + { + $this->type->type = 1; + + self::assertEquals( + [ + 'id' => 0, + 'l11n' => new ContractTypeL11n(), + ], + $this->type->jsonSerialize() + ); + } +} diff --git a/tests/Models/NullContract.php b/tests/Models/NullContract.php deleted file mode 100644 index 8ec6095..0000000 --- a/tests/Models/NullContract.php +++ /dev/null @@ -1,42 +0,0 @@ -getId()); - } -} diff --git a/tests/Models/NullContractType.php b/tests/Models/NullContractType.php deleted file mode 100644 index 1dee31e..0000000 --- a/tests/Models/NullContractType.php +++ /dev/null @@ -1,42 +0,0 @@ -getId()); - } -} diff --git a/tests/Models/NullContractTypeL11n.php b/tests/Models/NullContractTypeL11nTest.php similarity index 100% rename from tests/Models/NullContractTypeL11n.php rename to tests/Models/NullContractTypeL11nTest.php From a710da7d2a3e336783695c6171d3488f98eb637f Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Fri, 29 Oct 2021 14:49:55 +0200 Subject: [PATCH 027/133] bug and media fixes --- Controller/ApiController.php | 18 ++++++++---------- Controller/BackendController.php | 9 ++------- Models/Contract.php | 20 ++++++++++---------- Models/ContractMapper.php | 22 +++++++++++----------- Models/ContractType.php | 2 +- Models/ContractTypeL11n.php | 6 +++--- Models/ContractTypeMapper.php | 2 +- Theme/Backend/Lang/Navigation.en.lang.php | 6 +++--- Theme/Backend/Lang/en.lang.php | 4 ++-- Theme/Backend/contract-list.tpl.php | 3 +-- Theme/Backend/contract-single.tpl.php | 5 +---- tests/Controller/ApiControllerTest.php | 14 +++++--------- tests/Models/ContractTest.php | 22 +++++++++++----------- tests/Models/ContractTypeL11nTest.php | 8 ++++---- tests/Models/ContractTypeTest.php | 3 +-- 15 files changed, 64 insertions(+), 80 deletions(-) diff --git a/Controller/ApiController.php b/Controller/ApiController.php index 7d98bf4..6fe1c12 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -15,23 +15,20 @@ declare(strict_types=1); namespace Modules\ContractManagement\Controller; use Modules\Admin\Models\NullAccount; +use Modules\ContractManagement\Models\Contract; +use Modules\ContractManagement\Models\ContractMapper; use Modules\ContractManagement\Models\ContractType; -use Modules\ContractManagement\Models\ContractTypeMapper; use Modules\ContractManagement\Models\ContractTypeL11n; use Modules\ContractManagement\Models\ContractTypeL11nMapper; -use phpOMS\Message\Http\HttpResponse; +use Modules\ContractManagement\Models\ContractTypeMapper; +use Modules\ContractManagement\Models\NullContractType; +use Modules\Media\Models\PathSettings; +use phpOMS\Localization\ISO639x1Enum; use phpOMS\Message\Http\RequestStatusCode; use phpOMS\Message\NotificationLevel; use phpOMS\Message\RequestAbstract; use phpOMS\Message\ResponseAbstract; use phpOMS\Model\Message\FormValidation; -use phpOMS\Utils\Parser\Markdown\Markdown; -use phpOMS\Message\Http\HttpRequest; -use Modules\Media\Models\PathSettings; -use Modules\ContractManagement\Models\Contract; -use Modules\ContractManagement\Models\NullContractType; -use Modules\ContractManagement\Models\ContractMapper; -use phpOMS\Localization\ISO639x1Enum; /** * Api controller for the contracts module. @@ -143,7 +140,8 @@ final class ApiController extends Controller } $uploaded = $this->app->moduleManager->get('Media')->uploadFiles( - [$request->getData('name') ?? ''], + $request->getDataList('names') ?? [], + $request->getDataList('filenames') ?? [], $uploadedFiles, $request->header->account, __DIR__ . '/../../../Modules/Media/Files/Modules/ContractManagement/Contracts/' . ($request->getData('contract_title') ?? '0'), diff --git a/Controller/BackendController.php b/Controller/BackendController.php index 29812ba..6eec690 100755 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -14,17 +14,12 @@ declare(strict_types=1); namespace Modules\ContractManagement\Controller; -use Modules\ContractManagement\Models\PermissionState; -use phpOMS\Account\PermissionType; -use phpOMS\Asset\AssetType; +use Modules\ContractManagement\Models\ContractMapper; +use Modules\ContractManagement\Models\ContractTypeL11n; use phpOMS\Contract\RenderableInterface; -use phpOMS\Message\Http\RequestStatusCode; use phpOMS\Message\RequestAbstract; use phpOMS\Message\ResponseAbstract; use phpOMS\Views\View; -use Modules\ContractManagement\Models\ContractMapper; -use Modules\ContractManagement\Models\ContractType; -use Modules\ContractManagement\Models\ContractTypeL11n; /** * Backend controller for the contracts module. diff --git a/Models/Contract.php b/Models/Contract.php index d9c88cb..615542b 100755 --- a/Models/Contract.php +++ b/Models/Contract.php @@ -14,9 +14,9 @@ declare(strict_types=1); namespace Modules\ContractManagement\Models; -use Modules\Media\Models\Media; use Modules\Admin\Models\Account; use Modules\Admin\Models\NullAccount; +use Modules\Media\Models\Media; use phpOMS\Localization\Money; /** @@ -129,17 +129,17 @@ class Contract public function toArray() : array { return [ - 'id' => $this->id, - 'title' => $this->title, + 'id' => $this->id, + 'title' => $this->title, 'description' => $this->description, - 'start' => $this->start, - 'end' => $this->end, - 'duration' => $this->duration, - 'warning' => $this->warning, + 'start' => $this->start, + 'end' => $this->end, + 'duration' => $this->duration, + 'warning' => $this->warning, 'responsible' => $this->responsible, - 'createdAt' => $this->createdAt, - 'costs' => $this->costs, - 'type' => $this->type, + 'createdAt' => $this->createdAt, + 'costs' => $this->costs, + 'type' => $this->type, ]; } diff --git a/Models/ContractMapper.php b/Models/ContractMapper.php index 058bb2e..345379e 100755 --- a/Models/ContractMapper.php +++ b/Models/ContractMapper.php @@ -14,8 +14,8 @@ declare(strict_types=1); namespace Modules\ContractManagement\Models; -use Modules\Media\Models\MediaMapper; use Modules\Admin\Models\AccountMapper; +use Modules\Media\Models\MediaMapper; use phpOMS\DataStorage\Database\DataMapperAbstract; /** @@ -35,18 +35,18 @@ final class ContractMapper extends DataMapperAbstract * @since 1.0.0 */ protected static array $columns = [ - 'contractmgmt_contract_id' => ['name' => 'contractmgmt_contract_id', 'type' => 'int', 'internal' => 'id'], - 'contractmgmt_contract_title' => ['name' => 'contractmgmt_contract_title', 'type' => 'string', 'internal' => 'title', 'autocomplete' => true], + 'contractmgmt_contract_id' => ['name' => 'contractmgmt_contract_id', 'type' => 'int', 'internal' => 'id'], + 'contractmgmt_contract_title' => ['name' => 'contractmgmt_contract_title', 'type' => 'string', 'internal' => 'title', 'autocomplete' => true], 'contractmgmt_contract_description' => ['name' => 'contractmgmt_contract_description', 'type' => 'string', 'internal' => 'description'], - 'contractmgmt_contract_account' => ['name' => 'contractmgmt_contract_account', 'type' => 'int', 'internal' => 'account'], - 'contractmgmt_contract_costs' => ['name' => 'contractmgmt_contract_costs', 'type' => 'Serializable', 'internal' => 'costs'], - 'contractmgmt_contract_duration' => ['name' => 'contractmgmt_contract_duration', 'type' => 'int', 'internal' => 'duration'], - 'contractmgmt_contract_warning' => ['name' => 'contractmgmt_contract_warning', 'type' => 'int', 'internal' => 'warning'], - 'contractmgmt_contract_start' => ['name' => 'contractmgmt_contract_start', 'type' => 'DateTime', 'internal' => 'start'], - 'contractmgmt_contract_end' => ['name' => 'contractmgmt_contract_end', 'type' => 'DateTime', 'internal' => 'end'], + 'contractmgmt_contract_account' => ['name' => 'contractmgmt_contract_account', 'type' => 'int', 'internal' => 'account'], + 'contractmgmt_contract_costs' => ['name' => 'contractmgmt_contract_costs', 'type' => 'Serializable', 'internal' => 'costs'], + 'contractmgmt_contract_duration' => ['name' => 'contractmgmt_contract_duration', 'type' => 'int', 'internal' => 'duration'], + 'contractmgmt_contract_warning' => ['name' => 'contractmgmt_contract_warning', 'type' => 'int', 'internal' => 'warning'], + 'contractmgmt_contract_start' => ['name' => 'contractmgmt_contract_start', 'type' => 'DateTime', 'internal' => 'start'], + 'contractmgmt_contract_end' => ['name' => 'contractmgmt_contract_end', 'type' => 'DateTime', 'internal' => 'end'], 'contractmgmt_contract_responsible' => ['name' => 'contractmgmt_contract_responsible', 'type' => 'int', 'internal' => 'responsible'], - 'contractmgmt_contract_type' => ['name' => 'contractmgmt_contract_type', 'type' => 'int', 'internal' => 'type'], - 'contractmgmt_contract_created_at' => ['name' => 'contractmgmt_contract_created_at', 'type' => 'DateTimeImmutable', 'internal' => 'createdAt'], + 'contractmgmt_contract_type' => ['name' => 'contractmgmt_contract_type', 'type' => 'int', 'internal' => 'type'], + 'contractmgmt_contract_created_at' => ['name' => 'contractmgmt_contract_created_at', 'type' => 'DateTimeImmutable', 'internal' => 'createdAt'], ]; /** diff --git a/Models/ContractType.php b/Models/ContractType.php index 27eb374..86095df 100755 --- a/Models/ContractType.php +++ b/Models/ContractType.php @@ -105,7 +105,7 @@ class ContractType implements \JsonSerializable, ArrayableInterface public function toArray() : array { return [ - 'id' => $this->id, + 'id' => $this->id, 'l11n' => $this->l11n, ]; } diff --git a/Models/ContractTypeL11n.php b/Models/ContractTypeL11n.php index e9994ca..9244c4c 100755 --- a/Models/ContractTypeL11n.php +++ b/Models/ContractTypeL11n.php @@ -119,9 +119,9 @@ class ContractTypeL11n implements \JsonSerializable, ArrayableInterface public function toArray() : array { return [ - 'id' => $this->id, - 'title' => $this->title, - 'type' => $this->type, + 'id' => $this->id, + 'title' => $this->title, + 'type' => $this->type, 'language' => $this->language, ]; } diff --git a/Models/ContractTypeMapper.php b/Models/ContractTypeMapper.php index e8efc6c..886e666 100755 --- a/Models/ContractTypeMapper.php +++ b/Models/ContractTypeMapper.php @@ -50,7 +50,7 @@ final class ContractTypeMapper extends DataMapperAbstract 'column' => 'title', 'conditional' => true, 'external' => null, - ] + ], ]; /** diff --git a/Theme/Backend/Lang/Navigation.en.lang.php b/Theme/Backend/Lang/Navigation.en.lang.php index cc9f997..9555eb4 100755 --- a/Theme/Backend/Lang/Navigation.en.lang.php +++ b/Theme/Backend/Lang/Navigation.en.lang.php @@ -13,8 +13,8 @@ declare(strict_types=1); return ['Navigation' => [ - 'Create' => 'Create', - 'Contract' => 'Contract', + 'Create' => 'Create', + 'Contract' => 'Contract', 'Contracts' => 'Contracts', - 'List' => 'List', + 'List' => 'List', ]]; diff --git a/Theme/Backend/Lang/en.lang.php b/Theme/Backend/Lang/en.lang.php index d7a021d..be48f1b 100755 --- a/Theme/Backend/Lang/en.lang.php +++ b/Theme/Backend/Lang/en.lang.php @@ -13,7 +13,7 @@ declare(strict_types=1); return ['ContractManagement' => [ - 'Contract' => 'Contract', + 'Contract' => 'Contract', 'Contracts' => 'Contracts', - 'Title' => 'Title', + 'Title' => 'Title', ]]; diff --git a/Theme/Backend/contract-list.tpl.php b/Theme/Backend/contract-list.tpl.php index 6b0f5b0..c8284ce 100755 --- a/Theme/Backend/contract-list.tpl.php +++ b/Theme/Backend/contract-list.tpl.php @@ -12,11 +12,10 @@ */ declare(strict_types=1); -use Modules\Media\Models\NullMedia; use phpOMS\Uri\UriFactory; /** - * @var \phpOMS\Views\View $this + * @var \phpOMS\Views\View $this * @var \Modules\ContractManagement\Models\Contract[] $contracts */ $contracts = $this->getData('contracts') ?? []; diff --git a/Theme/Backend/contract-single.tpl.php b/Theme/Backend/contract-single.tpl.php index 8863029..5a96bfe 100755 --- a/Theme/Backend/contract-single.tpl.php +++ b/Theme/Backend/contract-single.tpl.php @@ -12,11 +12,8 @@ */ declare(strict_types=1); -use Modules\Media\Models\NullMedia; -use phpOMS\Uri\UriFactory; - /** - * @var \phpOMS\Views\View $this + * @var \phpOMS\Views\View $this * @var \Modules\ContractManagement\Models\Contract $contract */ $contract = $this->getData('contract'); diff --git a/tests/Controller/ApiControllerTest.php b/tests/Controller/ApiControllerTest.php index 7320305..4bd3e3e 100644 --- a/tests/Controller/ApiControllerTest.php +++ b/tests/Controller/ApiControllerTest.php @@ -16,26 +16,22 @@ namespace Modules\ContractManagement\tests\Controller; use Model\CoreSettings; use Modules\Admin\Models\AccountPermission; -use phpOMS\DataStorage\Session\HttpSession; use phpOMS\Account\Account; use phpOMS\Account\AccountManager; use phpOMS\Account\PermissionType; use phpOMS\Application\ApplicationAbstract; +use phpOMS\DataStorage\Session\HttpSession; use phpOMS\Dispatcher\Dispatcher; use phpOMS\Event\EventManager; -use phpOMS\Module\ModuleAbstract; -use phpOMS\Module\ModuleManager; -use phpOMS\Router\WebRouter; -use phpOMS\Utils\TestUtils; use phpOMS\Localization\ISO639x1Enum; -use Modules\Media\Models\MediaMapper; -use Modules\Media\Models\PathSettings; -use Modules\Media\Models\UploadStatus; use phpOMS\Message\Http\HttpRequest; use phpOMS\Message\Http\HttpResponse; use phpOMS\Message\Http\RequestStatusCode; -use phpOMS\System\File\Local\Directory; +use phpOMS\Module\ModuleAbstract; +use phpOMS\Module\ModuleManager; +use phpOMS\Router\WebRouter; use phpOMS\Uri\HttpUri; +use phpOMS\Utils\TestUtils; /** * @testdox Modules\ContractManagement\tests\Controller\ApiControllerTest: ContractManagement api controller diff --git a/tests/Models/ContractTest.php b/tests/Models/ContractTest.php index 45b6e47..37e6329 100644 --- a/tests/Models/ContractTest.php +++ b/tests/Models/ContractTest.php @@ -59,26 +59,26 @@ final class ContractTest extends \PHPUnit\Framework\TestCase */ public function testSerialize() : void { - $this->contract->title = 'Title'; + $this->contract->title = 'Title'; $this->contract->description = 'Description'; - $this->contract->duration = 123; - $this->contract->warning = 2; + $this->contract->duration = 123; + $this->contract->warning = 2; $serialized = $this->contract->jsonSerialize(); unset($serialized['createdAt']); self::assertEquals( [ - 'id' => 0, - 'title' => 'Title', + 'id' => 0, + 'title' => 'Title', 'description' => 'Description', - 'start' => null, - 'end' => null, - 'duration' => 123, - 'warning' => 2, + 'start' => null, + 'end' => null, + 'duration' => 123, + 'warning' => 2, 'responsible' => null, - 'costs' => null, - 'type' => new ContractType(), + 'costs' => null, + 'type' => new ContractType(), ], $serialized ); diff --git a/tests/Models/ContractTypeL11nTest.php b/tests/Models/ContractTypeL11nTest.php index efa9e53..ca3967c 100644 --- a/tests/Models/ContractTypeL11nTest.php +++ b/tests/Models/ContractTypeL11nTest.php @@ -70,16 +70,16 @@ final class ContractTypeL11nTest extends \PHPUnit\Framework\TestCase */ public function testSerialize() : void { - $this->l11n->title = 'Title'; + $this->l11n->title = 'Title'; $this->l11n->type = 2; $this->l11n->setLanguage(ISO639x1Enum::_DE); self::assertEquals( [ - 'id' => 0, - 'title' => 'Title', + 'id' => 0, + 'title' => 'Title', 'type' => 2, - 'language' => ISO639x1Enum::_DE, + 'language' => ISO639x1Enum::_DE, ], $this->l11n->jsonSerialize() ); diff --git a/tests/Models/ContractTypeTest.php b/tests/Models/ContractTypeTest.php index 19a6917..85854e0 100644 --- a/tests/Models/ContractTypeTest.php +++ b/tests/Models/ContractTypeTest.php @@ -16,7 +16,6 @@ namespace Modules\ContractManagement\tests\Models; use Modules\ContractManagement\Models\ContractType; use Modules\ContractManagement\Models\ContractTypeL11n; -use phpOMS\Localization\ISO639x1Enum; /** * @internal @@ -67,7 +66,7 @@ final class ContractTypeTest extends \PHPUnit\Framework\TestCase self::assertEquals( [ 'id' => 0, - 'l11n' => new ContractTypeL11n(), + 'l11n' => new ContractTypeL11n(), ], $this->type->jsonSerialize() ); From 747f34fd03ce78a09a6b43402b68b5e844b228e4 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sat, 20 Nov 2021 17:10:09 +0100 Subject: [PATCH 028/133] todo implementations --- .directory | 6 ----- Admin/Install/Admin.install.php | 25 +++++++++++++++++++ Admin/Install/Media.install.json | 16 ++++++++++++ Admin/Install/Media.php | 43 ++++++++++++++++++++++++++++++++ Admin/Install/db.json | 18 +++++++++++++ Controller/ApiController.php | 3 +++ Models/Contract.php | 12 +++++++++ Models/ContractMapper.php | 9 +++++++ Models/SettingsEnum.php | 30 ++++++++++++++++++++++ info.json | 2 ++ 10 files changed, 158 insertions(+), 6 deletions(-) delete mode 100755 .directory create mode 100644 Admin/Install/Admin.install.php create mode 100644 Admin/Install/Media.install.json create mode 100644 Admin/Install/Media.php create mode 100644 Models/SettingsEnum.php diff --git a/.directory b/.directory deleted file mode 100755 index 12730b6..0000000 --- a/.directory +++ /dev/null @@ -1,6 +0,0 @@ -[Dolphin] -Timestamp=2021,5,23,18,50,7 -Version=4 - -[Settings] -HiddenFilesShown=true diff --git a/Admin/Install/Admin.install.php b/Admin/Install/Admin.install.php new file mode 100644 index 0000000..bbddc43 --- /dev/null +++ b/Admin/Install/Admin.install.php @@ -0,0 +1,25 @@ + 'setting', + 'name' => SettingsEnum::CONTRACT_RENEWAL_WARNING, + 'content' => '7776000', + 'module' => ApiController::NAME, + ] +]; diff --git a/Admin/Install/Media.install.json b/Admin/Install/Media.install.json new file mode 100644 index 0000000..ab03a33 --- /dev/null +++ b/Admin/Install/Media.install.json @@ -0,0 +1,16 @@ +[ + { + "type": "type", + "name": "contract", + "l11n": [ + { + "title": "Contract", + "lang": "en" + }, + { + "title": "Vertrag", + "lang": "de" + } + ] + } +] \ No newline at end of file diff --git a/Admin/Install/Media.php b/Admin/Install/Media.php new file mode 100644 index 0000000..d086eab --- /dev/null +++ b/Admin/Install/Media.php @@ -0,0 +1,43 @@ + __DIR__ . '/Media.install.json']); + } +} diff --git a/Admin/Install/db.json b/Admin/Install/db.json index 526b00c..0028a7c 100755 --- a/Admin/Install/db.json +++ b/Admin/Install/db.json @@ -86,6 +86,16 @@ "null": true, "default": null }, + "contractmgmt_contract_renewal": { + "name": "contractmgmt_contract_renewal", + "type": "INT", + "null": false + }, + "contractmgmt_contract_autorenewal": { + "name": "contractmgmt_contract_autorenewal", + "type": "INT", + "null": false + }, "contractmgmt_contract_duration": { "name": "contractmgmt_contract_duration", "type": "INT", @@ -103,6 +113,14 @@ "foreignTable": "contractmgmt_type", "foreignKey": "contractmgmt_type_id" }, + "contractmgmt_contract_unit": { + "name": "contractmgmt_contract_unit", + "type": "INT", + "null": true, + "default": null, + "foreignTable": "organization_unit", + "foreignKey": "organization_unit_id" + }, "contractmgmt_contract_responsible": { "name": "contractmgmt_contract_responsible", "type": "INT", diff --git a/Controller/ApiController.php b/Controller/ApiController.php index 6fe1c12..37a88ec 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -107,6 +107,9 @@ final class ApiController extends Controller $contract->type = new NullContractType((int) ($request->getData('type') ?? 0)); $contract->start = new \DateTime($request->getData('start') ?? 'now'); $contract->account = new NullAccount((int) ($request->getData('account') ?? 0)); + $contract->renewal = (int) ($request->getData('renewal') ?? 0); + $contract->autoRenewal = (bool) ($request->getData('autorenewal') ?? false); + $contract->unit = $request->getData('unit', 'int') ?? null; if (!empty($request->getData('end'))) { $contract->end = new \DateTime($request->getData('end')); diff --git a/Models/Contract.php b/Models/Contract.php index 615542b..7329763 100755 --- a/Models/Contract.php +++ b/Models/Contract.php @@ -17,6 +17,7 @@ namespace Modules\ContractManagement\Models; use Modules\Admin\Models\Account; use Modules\Admin\Models\NullAccount; use Modules\Media\Models\Media; +use Modules\Organization\Models\Unit; use phpOMS\Localization\Money; /** @@ -53,6 +54,15 @@ class Contract public ?\DateTime $end = null; + /** + * Months until end of contract + * + * The renewal sometimes can be done up until the end of the contract and sometimes x-months prior to the contract end. + */ + public int $renewal = 0; + + public bool $autoRenewal = false; + public int $duration = 0; public int $warning = 0; @@ -73,6 +83,8 @@ class Contract public ContractType $type; + public ?Unit $unit = null; + /** * Constructor. * diff --git a/Models/ContractMapper.php b/Models/ContractMapper.php index 345379e..ada2412 100755 --- a/Models/ContractMapper.php +++ b/Models/ContractMapper.php @@ -1,4 +1,5 @@ ['name' => 'contractmgmt_contract_description', 'type' => 'string', 'internal' => 'description'], 'contractmgmt_contract_account' => ['name' => 'contractmgmt_contract_account', 'type' => 'int', 'internal' => 'account'], 'contractmgmt_contract_costs' => ['name' => 'contractmgmt_contract_costs', 'type' => 'Serializable', 'internal' => 'costs'], + 'contractmgmt_contract_renewal' => ['name' => 'contractmgmt_contract_renewal', 'type' => 'int', 'internal' => 'renewal'], + 'contractmgmt_contract_autorenewal' => ['name' => 'contractmgmt_contract_autorenewal', 'type' => 'int', 'internal' => 'autoRenewal'], 'contractmgmt_contract_duration' => ['name' => 'contractmgmt_contract_duration', 'type' => 'int', 'internal' => 'duration'], 'contractmgmt_contract_warning' => ['name' => 'contractmgmt_contract_warning', 'type' => 'int', 'internal' => 'warning'], 'contractmgmt_contract_start' => ['name' => 'contractmgmt_contract_start', 'type' => 'DateTime', 'internal' => 'start'], 'contractmgmt_contract_end' => ['name' => 'contractmgmt_contract_end', 'type' => 'DateTime', 'internal' => 'end'], 'contractmgmt_contract_responsible' => ['name' => 'contractmgmt_contract_responsible', 'type' => 'int', 'internal' => 'responsible'], + 'contractmgmt_contract_unit' => ['name' => 'contractmgmt_contract_unit', 'type' => 'int', 'internal' => 'unit'], 'contractmgmt_contract_type' => ['name' => 'contractmgmt_contract_type', 'type' => 'int', 'internal' => 'type'], 'contractmgmt_contract_created_at' => ['name' => 'contractmgmt_contract_created_at', 'type' => 'DateTimeImmutable', 'internal' => 'createdAt'], ]; @@ -88,6 +93,10 @@ final class ContractMapper extends DataMapperAbstract 'mapper' => AccountMapper::class, 'external' => 'contractmgmt_contract_account', ], + 'unit' => [ + 'mapper' => UnitMapper::class, + 'external' => 'contractmgmt_contract_unit', + ], ]; /** diff --git a/Models/SettingsEnum.php b/Models/SettingsEnum.php new file mode 100644 index 0000000..51032ae --- /dev/null +++ b/Models/SettingsEnum.php @@ -0,0 +1,30 @@ + Date: Mon, 29 Nov 2021 20:08:13 +0100 Subject: [PATCH 029/133] fix bugs --- Models/ContractMapper.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Models/ContractMapper.php b/Models/ContractMapper.php index ada2412..2d4c789 100755 --- a/Models/ContractMapper.php +++ b/Models/ContractMapper.php @@ -18,6 +18,7 @@ namespace Modules\ContractManagement\Models; use Modules\Admin\Models\AccountMapper; use Modules\Media\Models\MediaMapper; +use Modules\Organization\Models\UnitMapper; use phpOMS\DataStorage\Database\DataMapperAbstract; /** @@ -43,7 +44,7 @@ final class ContractMapper extends DataMapperAbstract 'contractmgmt_contract_account' => ['name' => 'contractmgmt_contract_account', 'type' => 'int', 'internal' => 'account'], 'contractmgmt_contract_costs' => ['name' => 'contractmgmt_contract_costs', 'type' => 'Serializable', 'internal' => 'costs'], 'contractmgmt_contract_renewal' => ['name' => 'contractmgmt_contract_renewal', 'type' => 'int', 'internal' => 'renewal'], - 'contractmgmt_contract_autorenewal' => ['name' => 'contractmgmt_contract_autorenewal', 'type' => 'int', 'internal' => 'autoRenewal'], + 'contractmgmt_contract_autorenewal' => ['name' => 'contractmgmt_contract_autorenewal', 'type' => 'bool', 'internal' => 'autoRenewal'], 'contractmgmt_contract_duration' => ['name' => 'contractmgmt_contract_duration', 'type' => 'int', 'internal' => 'duration'], 'contractmgmt_contract_warning' => ['name' => 'contractmgmt_contract_warning', 'type' => 'int', 'internal' => 'warning'], 'contractmgmt_contract_start' => ['name' => 'contractmgmt_contract_start', 'type' => 'DateTime', 'internal' => 'start'], From ea2b0af46a623c1a2d8aaf91b1d9600deedf8515 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sat, 11 Dec 2021 11:54:16 +0100 Subject: [PATCH 030/133] new datamapper mostly implemented --- Admin/Install/db.json | 2 +- Controller/BackendController.php | 11 ++++------- Models/ContractMapper.php | 16 ++++++++-------- Models/ContractTypeL11nMapper.php | 10 +++++----- Models/ContractTypeMapper.php | 13 ++++++------- 5 files changed, 24 insertions(+), 28 deletions(-) diff --git a/Admin/Install/db.json b/Admin/Install/db.json index 0028a7c..8ab2469 100755 --- a/Admin/Install/db.json +++ b/Admin/Install/db.json @@ -93,7 +93,7 @@ }, "contractmgmt_contract_autorenewal": { "name": "contractmgmt_contract_autorenewal", - "type": "INT", + "type": "TINYINT", "null": false }, "contractmgmt_contract_duration": { diff --git a/Controller/BackendController.php b/Controller/BackendController.php index 6eec690..e776a0d 100755 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -55,18 +55,15 @@ final class BackendController extends Controller if ($request->getData('ptype') === 'p') { $view->setData('contracts', - ContractMapper::with('language', $response->getLanguage(), [ContractTypeL11n::class]) - ::getBeforePivot((int) ($request->getData('id') ?? 0), null, 25) + ContractMapper::getAll()->where('id', (int) ($request->getData('id') ?? 0), '<')->limit(25)->execute() ); } elseif ($request->getData('ptype') === 'n') { $view->setData('contracts', - ContractMapper::with('language', $response->getLanguage(), [ContractTypeL11n::class]) - ::getAfterPivot((int) ($request->getData('id') ?? 0), null, 25) + ContractMapper::getAll()->where('id', (int) ($request->getData('id') ?? 0), '>')->limit(25)->execute() ); } else { $view->setData('contracts', - ContractMapper::with('language', $response->getLanguage(), [ContractTypeL11n::class]) - ::getAfterPivot(0, null, 25) + ContractMapper::getAll()->where('id', 0, '>')->limit(25)->execute() ); } @@ -92,7 +89,7 @@ final class BackendController extends Controller $view->setTemplate('/Modules/ContractManagement/Theme/Backend/contract-single'); $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1007901001, $request, $response)); - $view->addData('contract', ContractMapper::get((int) $request->getData('id'))); + $view->addData('contract', ContractMapper::get()->where('id', (int) $request->getData('id'))->execute()); $editor = new \Modules\Editor\Theme\Backend\Components\Editor\BaseView($this->app->l11nManager, $request, $response); $view->addData('editor', $editor); diff --git a/Models/ContractMapper.php b/Models/ContractMapper.php index 2d4c789..94e7b97 100755 --- a/Models/ContractMapper.php +++ b/Models/ContractMapper.php @@ -19,7 +19,7 @@ namespace Modules\ContractManagement\Models; use Modules\Admin\Models\AccountMapper; use Modules\Media\Models\MediaMapper; use Modules\Organization\Models\UnitMapper; -use phpOMS\DataStorage\Database\DataMapperAbstract; +use phpOMS\DataStorage\Database\Mapper\DataMapperFactory; /** * Contract mapper class. @@ -29,7 +29,7 @@ use phpOMS\DataStorage\Database\DataMapperAbstract; * @link https://orange-management.org * @since 1.0.0 */ -final class ContractMapper extends DataMapperAbstract +final class ContractMapper extends DataMapperFactory { /** * Columns. @@ -37,7 +37,7 @@ final class ContractMapper extends DataMapperAbstract * @var array * @since 1.0.0 */ - protected static array $columns = [ + public const COLUMNS = [ 'contractmgmt_contract_id' => ['name' => 'contractmgmt_contract_id', 'type' => 'int', 'internal' => 'id'], 'contractmgmt_contract_title' => ['name' => 'contractmgmt_contract_title', 'type' => 'string', 'internal' => 'title', 'autocomplete' => true], 'contractmgmt_contract_description' => ['name' => 'contractmgmt_contract_description', 'type' => 'string', 'internal' => 'description'], @@ -61,7 +61,7 @@ final class ContractMapper extends DataMapperAbstract * @var string * @since 1.0.0 */ - protected static string $table = 'contractmgmt_contract'; + public const TABLE = 'contractmgmt_contract'; /** * Primary field name. @@ -69,7 +69,7 @@ final class ContractMapper extends DataMapperAbstract * @var string * @since 1.0.0 */ - protected static string $primaryField = 'contractmgmt_contract_id'; + public const PRIMARYFIELD ='contractmgmt_contract_id'; /** * Created at. @@ -77,7 +77,7 @@ final class ContractMapper extends DataMapperAbstract * @var string * @since 1.0.0 */ - protected static string $createdAt = 'contractmgmt_contract_created_at'; + public const CREATED_AT = 'contractmgmt_contract_created_at'; /** * Has one relation. @@ -85,7 +85,7 @@ final class ContractMapper extends DataMapperAbstract * @var array * @since 1.0.0 */ - protected static array $ownsOne = [ + public const OWNS_ONE = [ 'type' => [ 'mapper' => ContractTypeMapper::class, 'external' => 'contractmgmt_contract_type', @@ -106,7 +106,7 @@ final class ContractMapper extends DataMapperAbstract * @var array * @since 1.0.0 */ - protected static array $hasMany = [ + public const HAS_MANY = [ 'files' => [ 'mapper' => MediaMapper::class, /* mapper of the related object */ 'table' => 'contractmgmt_contract_media', /* table of the related object, null if no relation table is used (many->1) */ diff --git a/Models/ContractTypeL11nMapper.php b/Models/ContractTypeL11nMapper.php index 4a2bc42..6b4a08c 100755 --- a/Models/ContractTypeL11nMapper.php +++ b/Models/ContractTypeL11nMapper.php @@ -14,7 +14,7 @@ declare(strict_types=1); namespace Modules\ContractManagement\Models; -use phpOMS\DataStorage\Database\DataMapperAbstract; +use phpOMS\DataStorage\Database\Mapper\DataMapperFactory; /** * Contract type l11n mapper class. @@ -24,7 +24,7 @@ use phpOMS\DataStorage\Database\DataMapperAbstract; * @link https://orange-management.org * @since 1.0.0 */ -final class ContractTypeL11nMapper extends DataMapperAbstract +final class ContractTypeL11nMapper extends DataMapperFactory { /** * Columns. @@ -32,7 +32,7 @@ final class ContractTypeL11nMapper extends DataMapperAbstract * @var array * @since 1.0.0 */ - protected static array $columns = [ + public const COLUMNS = [ 'contractmgmt_type_l11n_id' => ['name' => 'contractmgmt_type_l11n_id', 'type' => 'int', 'internal' => 'id'], 'contractmgmt_type_l11n_title' => ['name' => 'contractmgmt_type_l11n_title', 'type' => 'string', 'internal' => 'title', 'autocomplete' => true], 'contractmgmt_type_l11n_type' => ['name' => 'contractmgmt_type_l11n_type', 'type' => 'int', 'internal' => 'type'], @@ -45,7 +45,7 @@ final class ContractTypeL11nMapper extends DataMapperAbstract * @var string * @since 1.0.0 */ - protected static string $table = 'contractmgmt_type_l11n'; + public const TABLE = 'contractmgmt_type_l11n'; /** * Primary field name. @@ -53,5 +53,5 @@ final class ContractTypeL11nMapper extends DataMapperAbstract * @var string * @since 1.0.0 */ - protected static string $primaryField = 'contractmgmt_type_l11n_id'; + public const PRIMARYFIELD ='contractmgmt_type_l11n_id'; } diff --git a/Models/ContractTypeMapper.php b/Models/ContractTypeMapper.php index 886e666..d488b61 100755 --- a/Models/ContractTypeMapper.php +++ b/Models/ContractTypeMapper.php @@ -14,7 +14,7 @@ declare(strict_types=1); namespace Modules\ContractManagement\Models; -use phpOMS\DataStorage\Database\DataMapperAbstract; +use phpOMS\DataStorage\Database\Mapper\DataMapperFactory; /** * Contract type mapper class. @@ -24,7 +24,7 @@ use phpOMS\DataStorage\Database\DataMapperAbstract; * @link https://orange-management.org * @since 1.0.0 */ -final class ContractTypeMapper extends DataMapperAbstract +final class ContractTypeMapper extends DataMapperFactory { /** * Columns. @@ -32,7 +32,7 @@ final class ContractTypeMapper extends DataMapperAbstract * @var array * @since 1.0.0 */ - protected static array $columns = [ + public const COLUMNS = [ 'contractmgmt_type_id' => ['name' => 'contractmgmt_type_id', 'type' => 'int', 'internal' => 'id'], ]; @@ -42,13 +42,12 @@ final class ContractTypeMapper extends DataMapperAbstract * @var array * @since 1.0.0 */ - protected static array $hasMany = [ + public const HAS_MANY = [ 'l11n' => [ 'mapper' => ContractTypeL11nMapper::class, 'table' => 'contractmgmt_type_l11n', 'self' => 'contractmgmt_type_l11n_type', 'column' => 'title', - 'conditional' => true, 'external' => null, ], ]; @@ -59,7 +58,7 @@ final class ContractTypeMapper extends DataMapperAbstract * @var string * @since 1.0.0 */ - protected static string $table = 'contractmgmt_type'; + public const TABLE = 'contractmgmt_type'; /** * Primary field name. @@ -67,5 +66,5 @@ final class ContractTypeMapper extends DataMapperAbstract * @var string * @since 1.0.0 */ - protected static string $primaryField = 'contractmgmt_type_id'; + public const PRIMARYFIELD ='contractmgmt_type_id'; } From 8442cf344593cf95819b31b8063fb5a0badfd4bf Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sun, 19 Dec 2021 20:20:39 +0100 Subject: [PATCH 031/133] bug fixes / dbmapper fixes --- Models/ContractMapper.php | 42 +++++++++++++++---------------- Models/ContractTypeL11nMapper.php | 8 +++--- Models/ContractTypeMapper.php | 12 ++++----- 3 files changed, 31 insertions(+), 31 deletions(-) diff --git a/Models/ContractMapper.php b/Models/ContractMapper.php index 94e7b97..3cb24b1 100755 --- a/Models/ContractMapper.php +++ b/Models/ContractMapper.php @@ -38,21 +38,21 @@ final class ContractMapper extends DataMapperFactory * @since 1.0.0 */ public const COLUMNS = [ - 'contractmgmt_contract_id' => ['name' => 'contractmgmt_contract_id', 'type' => 'int', 'internal' => 'id'], - 'contractmgmt_contract_title' => ['name' => 'contractmgmt_contract_title', 'type' => 'string', 'internal' => 'title', 'autocomplete' => true], - 'contractmgmt_contract_description' => ['name' => 'contractmgmt_contract_description', 'type' => 'string', 'internal' => 'description'], - 'contractmgmt_contract_account' => ['name' => 'contractmgmt_contract_account', 'type' => 'int', 'internal' => 'account'], - 'contractmgmt_contract_costs' => ['name' => 'contractmgmt_contract_costs', 'type' => 'Serializable', 'internal' => 'costs'], - 'contractmgmt_contract_renewal' => ['name' => 'contractmgmt_contract_renewal', 'type' => 'int', 'internal' => 'renewal'], - 'contractmgmt_contract_autorenewal' => ['name' => 'contractmgmt_contract_autorenewal', 'type' => 'bool', 'internal' => 'autoRenewal'], - 'contractmgmt_contract_duration' => ['name' => 'contractmgmt_contract_duration', 'type' => 'int', 'internal' => 'duration'], - 'contractmgmt_contract_warning' => ['name' => 'contractmgmt_contract_warning', 'type' => 'int', 'internal' => 'warning'], - 'contractmgmt_contract_start' => ['name' => 'contractmgmt_contract_start', 'type' => 'DateTime', 'internal' => 'start'], - 'contractmgmt_contract_end' => ['name' => 'contractmgmt_contract_end', 'type' => 'DateTime', 'internal' => 'end'], - 'contractmgmt_contract_responsible' => ['name' => 'contractmgmt_contract_responsible', 'type' => 'int', 'internal' => 'responsible'], - 'contractmgmt_contract_unit' => ['name' => 'contractmgmt_contract_unit', 'type' => 'int', 'internal' => 'unit'], - 'contractmgmt_contract_type' => ['name' => 'contractmgmt_contract_type', 'type' => 'int', 'internal' => 'type'], - 'contractmgmt_contract_created_at' => ['name' => 'contractmgmt_contract_created_at', 'type' => 'DateTimeImmutable', 'internal' => 'createdAt'], + 'contractmgmt_contract_id' => ['name' => 'contractmgmt_contract_id', 'type' => 'int', 'internal' => 'id'], + 'contractmgmt_contract_title' => ['name' => 'contractmgmt_contract_title', 'type' => 'string', 'internal' => 'title', 'autocomplete' => true], + 'contractmgmt_contract_description' => ['name' => 'contractmgmt_contract_description', 'type' => 'string', 'internal' => 'description'], + 'contractmgmt_contract_account' => ['name' => 'contractmgmt_contract_account', 'type' => 'int', 'internal' => 'account'], + 'contractmgmt_contract_costs' => ['name' => 'contractmgmt_contract_costs', 'type' => 'Serializable', 'internal' => 'costs'], + 'contractmgmt_contract_renewal' => ['name' => 'contractmgmt_contract_renewal', 'type' => 'int', 'internal' => 'renewal'], + 'contractmgmt_contract_autorenewal' => ['name' => 'contractmgmt_contract_autorenewal', 'type' => 'bool', 'internal' => 'autoRenewal'], + 'contractmgmt_contract_duration' => ['name' => 'contractmgmt_contract_duration', 'type' => 'int', 'internal' => 'duration'], + 'contractmgmt_contract_warning' => ['name' => 'contractmgmt_contract_warning', 'type' => 'int', 'internal' => 'warning'], + 'contractmgmt_contract_start' => ['name' => 'contractmgmt_contract_start', 'type' => 'DateTime', 'internal' => 'start'], + 'contractmgmt_contract_end' => ['name' => 'contractmgmt_contract_end', 'type' => 'DateTime', 'internal' => 'end'], + 'contractmgmt_contract_responsible' => ['name' => 'contractmgmt_contract_responsible', 'type' => 'int', 'internal' => 'responsible'], + 'contractmgmt_contract_unit' => ['name' => 'contractmgmt_contract_unit', 'type' => 'int', 'internal' => 'unit'], + 'contractmgmt_contract_type' => ['name' => 'contractmgmt_contract_type', 'type' => 'int', 'internal' => 'type'], + 'contractmgmt_contract_created_at' => ['name' => 'contractmgmt_contract_created_at', 'type' => 'DateTimeImmutable', 'internal' => 'createdAt'], ]; /** @@ -87,16 +87,16 @@ final class ContractMapper extends DataMapperFactory */ public const OWNS_ONE = [ 'type' => [ - 'mapper' => ContractTypeMapper::class, - 'external' => 'contractmgmt_contract_type', + 'mapper' => ContractTypeMapper::class, + 'external' => 'contractmgmt_contract_type', ], 'account' => [ - 'mapper' => AccountMapper::class, - 'external' => 'contractmgmt_contract_account', + 'mapper' => AccountMapper::class, + 'external' => 'contractmgmt_contract_account', ], 'unit' => [ - 'mapper' => UnitMapper::class, - 'external' => 'contractmgmt_contract_unit', + 'mapper' => UnitMapper::class, + 'external' => 'contractmgmt_contract_unit', ], ]; diff --git a/Models/ContractTypeL11nMapper.php b/Models/ContractTypeL11nMapper.php index 6b4a08c..63655b1 100755 --- a/Models/ContractTypeL11nMapper.php +++ b/Models/ContractTypeL11nMapper.php @@ -33,10 +33,10 @@ final class ContractTypeL11nMapper extends DataMapperFactory * @since 1.0.0 */ public const COLUMNS = [ - 'contractmgmt_type_l11n_id' => ['name' => 'contractmgmt_type_l11n_id', 'type' => 'int', 'internal' => 'id'], - 'contractmgmt_type_l11n_title' => ['name' => 'contractmgmt_type_l11n_title', 'type' => 'string', 'internal' => 'title', 'autocomplete' => true], - 'contractmgmt_type_l11n_type' => ['name' => 'contractmgmt_type_l11n_type', 'type' => 'int', 'internal' => 'type'], - 'contractmgmt_type_l11n_lang' => ['name' => 'contractmgmt_type_l11n_lang', 'type' => 'string', 'internal' => 'language'], + 'contractmgmt_type_l11n_id' => ['name' => 'contractmgmt_type_l11n_id', 'type' => 'int', 'internal' => 'id'], + 'contractmgmt_type_l11n_title' => ['name' => 'contractmgmt_type_l11n_title', 'type' => 'string', 'internal' => 'title', 'autocomplete' => true], + 'contractmgmt_type_l11n_type' => ['name' => 'contractmgmt_type_l11n_type', 'type' => 'int', 'internal' => 'type'], + 'contractmgmt_type_l11n_lang' => ['name' => 'contractmgmt_type_l11n_lang', 'type' => 'string', 'internal' => 'language'], ]; /** diff --git a/Models/ContractTypeMapper.php b/Models/ContractTypeMapper.php index d488b61..63bb58b 100755 --- a/Models/ContractTypeMapper.php +++ b/Models/ContractTypeMapper.php @@ -33,7 +33,7 @@ final class ContractTypeMapper extends DataMapperFactory * @since 1.0.0 */ public const COLUMNS = [ - 'contractmgmt_type_id' => ['name' => 'contractmgmt_type_id', 'type' => 'int', 'internal' => 'id'], + 'contractmgmt_type_id' => ['name' => 'contractmgmt_type_id', 'type' => 'int', 'internal' => 'id'], ]; /** @@ -44,11 +44,11 @@ final class ContractTypeMapper extends DataMapperFactory */ public const HAS_MANY = [ 'l11n' => [ - 'mapper' => ContractTypeL11nMapper::class, - 'table' => 'contractmgmt_type_l11n', - 'self' => 'contractmgmt_type_l11n_type', - 'column' => 'title', - 'external' => null, + 'mapper' => ContractTypeL11nMapper::class, + 'table' => 'contractmgmt_type_l11n', + 'self' => 'contractmgmt_type_l11n_type', + 'column' => 'title', + 'external' => null, ], ]; From 8f4ced590f271a30505890c48acf4ac34a0a0a43 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sat, 12 Feb 2022 21:18:49 +0100 Subject: [PATCH 032/133] update lang files --- Theme/Backend/Lang/Navigation.ar.lang.php | 20 ++++++++++++++++++++ Theme/Backend/Lang/Navigation.cs.lang.php | 20 ++++++++++++++++++++ Theme/Backend/Lang/Navigation.da.lang.php | 20 ++++++++++++++++++++ Theme/Backend/Lang/Navigation.de.lang.php | 20 ++++++++++++++++++++ Theme/Backend/Lang/Navigation.el.lang.php | 20 ++++++++++++++++++++ Theme/Backend/Lang/Navigation.en.lang.php | 4 ++-- Theme/Backend/Lang/Navigation.es.lang.php | 20 ++++++++++++++++++++ Theme/Backend/Lang/Navigation.fi.lang.php | 20 ++++++++++++++++++++ Theme/Backend/Lang/Navigation.fr.lang.php | 20 ++++++++++++++++++++ Theme/Backend/Lang/Navigation.hu.lang.php | 20 ++++++++++++++++++++ Theme/Backend/Lang/Navigation.it.lang.php | 20 ++++++++++++++++++++ Theme/Backend/Lang/Navigation.ja.lang.php | 20 ++++++++++++++++++++ Theme/Backend/Lang/Navigation.ko.lang.php | 20 ++++++++++++++++++++ Theme/Backend/Lang/Navigation.no.lang.php | 20 ++++++++++++++++++++ Theme/Backend/Lang/Navigation.pl.lang.php | 20 ++++++++++++++++++++ Theme/Backend/Lang/Navigation.pt.lang.php | 20 ++++++++++++++++++++ Theme/Backend/Lang/Navigation.ru.lang.php | 20 ++++++++++++++++++++ Theme/Backend/Lang/Navigation.sv.lang.php | 20 ++++++++++++++++++++ Theme/Backend/Lang/Navigation.th.lang.php | 20 ++++++++++++++++++++ Theme/Backend/Lang/Navigation.tr.lang.php | 20 ++++++++++++++++++++ Theme/Backend/Lang/Navigation.uk.lang.php | 20 ++++++++++++++++++++ Theme/Backend/Lang/Navigation.zh.lang.php | 20 ++++++++++++++++++++ Theme/Backend/Lang/ar.lang.php | 23 +++++++++++++++++++++++ Theme/Backend/Lang/cs.lang.php | 23 +++++++++++++++++++++++ Theme/Backend/Lang/da.lang.php | 23 +++++++++++++++++++++++ Theme/Backend/Lang/de.lang.php | 23 +++++++++++++++++++++++ Theme/Backend/Lang/el.lang.php | 23 +++++++++++++++++++++++ Theme/Backend/Lang/en.lang.php | 10 +++++++--- Theme/Backend/Lang/es.lang.php | 23 +++++++++++++++++++++++ Theme/Backend/Lang/fi.lang.php | 23 +++++++++++++++++++++++ Theme/Backend/Lang/fr.lang.php | 23 +++++++++++++++++++++++ Theme/Backend/Lang/hu.lang.php | 23 +++++++++++++++++++++++ Theme/Backend/Lang/it.lang.php | 23 +++++++++++++++++++++++ Theme/Backend/Lang/ja.lang.php | 23 +++++++++++++++++++++++ Theme/Backend/Lang/ko.lang.php | 23 +++++++++++++++++++++++ Theme/Backend/Lang/no.lang.php | 23 +++++++++++++++++++++++ Theme/Backend/Lang/pl.lang.php | 23 +++++++++++++++++++++++ Theme/Backend/Lang/pt.lang.php | 23 +++++++++++++++++++++++ Theme/Backend/Lang/ru.lang.php | 23 +++++++++++++++++++++++ Theme/Backend/Lang/sv.lang.php | 23 +++++++++++++++++++++++ Theme/Backend/Lang/th.lang.php | 23 +++++++++++++++++++++++ Theme/Backend/Lang/tr.lang.php | 23 +++++++++++++++++++++++ Theme/Backend/Lang/uk.lang.php | 23 +++++++++++++++++++++++ Theme/Backend/Lang/zh.lang.php | 23 +++++++++++++++++++++++ 44 files changed, 912 insertions(+), 5 deletions(-) create mode 100644 Theme/Backend/Lang/Navigation.ar.lang.php create mode 100644 Theme/Backend/Lang/Navigation.cs.lang.php create mode 100644 Theme/Backend/Lang/Navigation.da.lang.php create mode 100644 Theme/Backend/Lang/Navigation.de.lang.php create mode 100644 Theme/Backend/Lang/Navigation.el.lang.php create mode 100644 Theme/Backend/Lang/Navigation.es.lang.php create mode 100644 Theme/Backend/Lang/Navigation.fi.lang.php create mode 100644 Theme/Backend/Lang/Navigation.fr.lang.php create mode 100644 Theme/Backend/Lang/Navigation.hu.lang.php create mode 100644 Theme/Backend/Lang/Navigation.it.lang.php create mode 100644 Theme/Backend/Lang/Navigation.ja.lang.php create mode 100644 Theme/Backend/Lang/Navigation.ko.lang.php create mode 100644 Theme/Backend/Lang/Navigation.no.lang.php create mode 100644 Theme/Backend/Lang/Navigation.pl.lang.php create mode 100644 Theme/Backend/Lang/Navigation.pt.lang.php create mode 100644 Theme/Backend/Lang/Navigation.ru.lang.php create mode 100644 Theme/Backend/Lang/Navigation.sv.lang.php create mode 100644 Theme/Backend/Lang/Navigation.th.lang.php create mode 100644 Theme/Backend/Lang/Navigation.tr.lang.php create mode 100644 Theme/Backend/Lang/Navigation.uk.lang.php create mode 100644 Theme/Backend/Lang/Navigation.zh.lang.php create mode 100644 Theme/Backend/Lang/ar.lang.php create mode 100644 Theme/Backend/Lang/cs.lang.php create mode 100644 Theme/Backend/Lang/da.lang.php create mode 100644 Theme/Backend/Lang/de.lang.php create mode 100644 Theme/Backend/Lang/el.lang.php create mode 100644 Theme/Backend/Lang/es.lang.php create mode 100644 Theme/Backend/Lang/fi.lang.php create mode 100644 Theme/Backend/Lang/fr.lang.php create mode 100644 Theme/Backend/Lang/hu.lang.php create mode 100644 Theme/Backend/Lang/it.lang.php create mode 100644 Theme/Backend/Lang/ja.lang.php create mode 100644 Theme/Backend/Lang/ko.lang.php create mode 100644 Theme/Backend/Lang/no.lang.php create mode 100644 Theme/Backend/Lang/pl.lang.php create mode 100644 Theme/Backend/Lang/pt.lang.php create mode 100644 Theme/Backend/Lang/ru.lang.php create mode 100644 Theme/Backend/Lang/sv.lang.php create mode 100644 Theme/Backend/Lang/th.lang.php create mode 100644 Theme/Backend/Lang/tr.lang.php create mode 100644 Theme/Backend/Lang/uk.lang.php create mode 100644 Theme/Backend/Lang/zh.lang.php diff --git a/Theme/Backend/Lang/Navigation.ar.lang.php b/Theme/Backend/Lang/Navigation.ar.lang.php new file mode 100644 index 0000000..d0a4cbe --- /dev/null +++ b/Theme/Backend/Lang/Navigation.ar.lang.php @@ -0,0 +1,20 @@ + [ + 'Contract' => 'اتفافية', + 'Contracts' => 'انكماش', + 'Create' => 'يخلق', + 'List' => 'قائمة', +]]; diff --git a/Theme/Backend/Lang/Navigation.cs.lang.php b/Theme/Backend/Lang/Navigation.cs.lang.php new file mode 100644 index 0000000..e6fe3c2 --- /dev/null +++ b/Theme/Backend/Lang/Navigation.cs.lang.php @@ -0,0 +1,20 @@ + [ + 'Contract' => 'Smlouva', + 'Contracts' => 'Smlouvy', + 'Create' => 'Vytvořit', + 'List' => 'Seznam', +]]; diff --git a/Theme/Backend/Lang/Navigation.da.lang.php b/Theme/Backend/Lang/Navigation.da.lang.php new file mode 100644 index 0000000..01804ee --- /dev/null +++ b/Theme/Backend/Lang/Navigation.da.lang.php @@ -0,0 +1,20 @@ + [ + 'Contract' => 'Kontrakt', + 'Contracts' => 'Kontrakter', + 'Create' => 'skab', + 'List' => 'Liste', +]]; diff --git a/Theme/Backend/Lang/Navigation.de.lang.php b/Theme/Backend/Lang/Navigation.de.lang.php new file mode 100644 index 0000000..d9a581b --- /dev/null +++ b/Theme/Backend/Lang/Navigation.de.lang.php @@ -0,0 +1,20 @@ + [ + 'Contract' => 'Vertrag', + 'Contracts' => 'Verträge', + 'Create' => 'Erstellen', + 'List' => 'Aufführen', +]]; diff --git a/Theme/Backend/Lang/Navigation.el.lang.php b/Theme/Backend/Lang/Navigation.el.lang.php new file mode 100644 index 0000000..a83d569 --- /dev/null +++ b/Theme/Backend/Lang/Navigation.el.lang.php @@ -0,0 +1,20 @@ + [ + 'Contract' => 'Σύμβαση', + 'Contracts' => 'Συμβάσεις', + 'Create' => 'Δημιουργώ', + 'List' => 'Λίστα', +]]; diff --git a/Theme/Backend/Lang/Navigation.en.lang.php b/Theme/Backend/Lang/Navigation.en.lang.php index 9555eb4..87468da 100755 --- a/Theme/Backend/Lang/Navigation.en.lang.php +++ b/Theme/Backend/Lang/Navigation.en.lang.php @@ -4,7 +4,7 @@ * * PHP Version 8.0 * - * @package Modules\Contracts + * @package Modules\Localization * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 @@ -13,8 +13,8 @@ declare(strict_types=1); return ['Navigation' => [ - 'Create' => 'Create', 'Contract' => 'Contract', 'Contracts' => 'Contracts', + 'Create' => 'Create', 'List' => 'List', ]]; diff --git a/Theme/Backend/Lang/Navigation.es.lang.php b/Theme/Backend/Lang/Navigation.es.lang.php new file mode 100644 index 0000000..e0472e2 --- /dev/null +++ b/Theme/Backend/Lang/Navigation.es.lang.php @@ -0,0 +1,20 @@ + [ + 'Contract' => 'Contrato', + 'Contracts' => 'Contrato', + 'Create' => 'Crear', + 'List' => 'Lista', +]]; diff --git a/Theme/Backend/Lang/Navigation.fi.lang.php b/Theme/Backend/Lang/Navigation.fi.lang.php new file mode 100644 index 0000000..a46dea3 --- /dev/null +++ b/Theme/Backend/Lang/Navigation.fi.lang.php @@ -0,0 +1,20 @@ + [ + 'Contract' => 'Sopimus', + 'Contracts' => 'Sopimukset', + 'Create' => 'Luoda', + 'List' => 'Lista', +]]; diff --git a/Theme/Backend/Lang/Navigation.fr.lang.php b/Theme/Backend/Lang/Navigation.fr.lang.php new file mode 100644 index 0000000..b8d4b20 --- /dev/null +++ b/Theme/Backend/Lang/Navigation.fr.lang.php @@ -0,0 +1,20 @@ + [ + 'Contract' => 'Contracter', + 'Contracts' => 'Contrats', + 'Create' => 'Créer', + 'List' => 'Lister', +]]; diff --git a/Theme/Backend/Lang/Navigation.hu.lang.php b/Theme/Backend/Lang/Navigation.hu.lang.php new file mode 100644 index 0000000..6569d7d --- /dev/null +++ b/Theme/Backend/Lang/Navigation.hu.lang.php @@ -0,0 +1,20 @@ + [ + 'Contract' => 'Szerződés', + 'Contracts' => 'Szerződések', + 'Create' => 'Teremt', + 'List' => 'Lista', +]]; diff --git a/Theme/Backend/Lang/Navigation.it.lang.php b/Theme/Backend/Lang/Navigation.it.lang.php new file mode 100644 index 0000000..f2557cd --- /dev/null +++ b/Theme/Backend/Lang/Navigation.it.lang.php @@ -0,0 +1,20 @@ + [ + 'Contract' => 'Contrarre', + 'Contracts' => 'Contratti', + 'Create' => 'Creare', + 'List' => 'Elenco', +]]; diff --git a/Theme/Backend/Lang/Navigation.ja.lang.php b/Theme/Backend/Lang/Navigation.ja.lang.php new file mode 100644 index 0000000..32b1618 --- /dev/null +++ b/Theme/Backend/Lang/Navigation.ja.lang.php @@ -0,0 +1,20 @@ + [ + 'Contract' => '契約', + 'Contracts' => '契約', + 'Create' => '作成', + 'List' => 'リスト', +]]; diff --git a/Theme/Backend/Lang/Navigation.ko.lang.php b/Theme/Backend/Lang/Navigation.ko.lang.php new file mode 100644 index 0000000..3361cfe --- /dev/null +++ b/Theme/Backend/Lang/Navigation.ko.lang.php @@ -0,0 +1,20 @@ + [ + 'Contract' => '계약', + 'Contracts' => '계약서', + 'Create' => '만들다', + 'List' => '목록', +]]; diff --git a/Theme/Backend/Lang/Navigation.no.lang.php b/Theme/Backend/Lang/Navigation.no.lang.php new file mode 100644 index 0000000..959b599 --- /dev/null +++ b/Theme/Backend/Lang/Navigation.no.lang.php @@ -0,0 +1,20 @@ + [ + 'Contract' => 'Kontrakt', + 'Contracts' => 'Kontrakter', + 'Create' => 'Skape', + 'List' => 'Liste', +]]; diff --git a/Theme/Backend/Lang/Navigation.pl.lang.php b/Theme/Backend/Lang/Navigation.pl.lang.php new file mode 100644 index 0000000..1637219 --- /dev/null +++ b/Theme/Backend/Lang/Navigation.pl.lang.php @@ -0,0 +1,20 @@ + [ + 'Contract' => 'Kontrakt', + 'Contracts' => 'Kontrakty', + 'Create' => 'Tworzyć', + 'List' => 'Lista', +]]; diff --git a/Theme/Backend/Lang/Navigation.pt.lang.php b/Theme/Backend/Lang/Navigation.pt.lang.php new file mode 100644 index 0000000..163f635 --- /dev/null +++ b/Theme/Backend/Lang/Navigation.pt.lang.php @@ -0,0 +1,20 @@ + [ + 'Contract' => 'Contrato', + 'Contracts' => 'Contratos', + 'Create' => 'Crio', + 'List' => 'Lista', +]]; diff --git a/Theme/Backend/Lang/Navigation.ru.lang.php b/Theme/Backend/Lang/Navigation.ru.lang.php new file mode 100644 index 0000000..2fa186e --- /dev/null +++ b/Theme/Backend/Lang/Navigation.ru.lang.php @@ -0,0 +1,20 @@ + [ + 'Contract' => 'Договор', + 'Contracts' => 'Контракты', + 'Create' => 'Создавать', + 'List' => 'Список', +]]; diff --git a/Theme/Backend/Lang/Navigation.sv.lang.php b/Theme/Backend/Lang/Navigation.sv.lang.php new file mode 100644 index 0000000..411c351 --- /dev/null +++ b/Theme/Backend/Lang/Navigation.sv.lang.php @@ -0,0 +1,20 @@ + [ + 'Contract' => 'Avtal', + 'Contracts' => 'Kontrakt', + 'Create' => 'Skapa', + 'List' => 'Lista', +]]; diff --git a/Theme/Backend/Lang/Navigation.th.lang.php b/Theme/Backend/Lang/Navigation.th.lang.php new file mode 100644 index 0000000..eb64779 --- /dev/null +++ b/Theme/Backend/Lang/Navigation.th.lang.php @@ -0,0 +1,20 @@ + [ + 'Contract' => 'สัญญา', + 'Contracts' => 'สัญญา', + 'Create' => 'สร้าง', + 'List' => 'รายการ', +]]; diff --git a/Theme/Backend/Lang/Navigation.tr.lang.php b/Theme/Backend/Lang/Navigation.tr.lang.php new file mode 100644 index 0000000..8782aaa --- /dev/null +++ b/Theme/Backend/Lang/Navigation.tr.lang.php @@ -0,0 +1,20 @@ + [ + 'Contract' => 'Sözleşme', + 'Contracts' => 'Sözleşme', + 'Create' => 'Yaratmak', + 'List' => 'Liste', +]]; diff --git a/Theme/Backend/Lang/Navigation.uk.lang.php b/Theme/Backend/Lang/Navigation.uk.lang.php new file mode 100644 index 0000000..dabb110 --- /dev/null +++ b/Theme/Backend/Lang/Navigation.uk.lang.php @@ -0,0 +1,20 @@ + [ + 'Contract' => 'Договір', + 'Contracts' => 'Контракти', + 'Create' => 'Створювати', + 'List' => 'Список', +]]; diff --git a/Theme/Backend/Lang/Navigation.zh.lang.php b/Theme/Backend/Lang/Navigation.zh.lang.php new file mode 100644 index 0000000..d7b5384 --- /dev/null +++ b/Theme/Backend/Lang/Navigation.zh.lang.php @@ -0,0 +1,20 @@ + [ + 'Contract' => '合同', + 'Contracts' => '合同', + 'Create' => '创建', + 'List' => '列表', +]]; diff --git a/Theme/Backend/Lang/ar.lang.php b/Theme/Backend/Lang/ar.lang.php new file mode 100644 index 0000000..91128ee --- /dev/null +++ b/Theme/Backend/Lang/ar.lang.php @@ -0,0 +1,23 @@ + [ + 'Account' => '#VALUE!', + 'Contract' => 'اتفافية', + 'Contracts' => 'انكماش', + 'End' => '#VALUE!', + 'Files' => '#VALUE!', + 'Overview' => '#VALUE!', + 'Title' => 'عنوان', +]]; diff --git a/Theme/Backend/Lang/cs.lang.php b/Theme/Backend/Lang/cs.lang.php new file mode 100644 index 0000000..1e97ecf --- /dev/null +++ b/Theme/Backend/Lang/cs.lang.php @@ -0,0 +1,23 @@ + [ + 'Account' => '#VALUE!', + 'Contract' => 'Smlouva', + 'Contracts' => 'Smlouvy', + 'End' => '#VALUE!', + 'Files' => '#VALUE!', + 'Overview' => '#VALUE!', + 'Title' => 'Titul', +]]; diff --git a/Theme/Backend/Lang/da.lang.php b/Theme/Backend/Lang/da.lang.php new file mode 100644 index 0000000..1bed0ae --- /dev/null +++ b/Theme/Backend/Lang/da.lang.php @@ -0,0 +1,23 @@ + [ + 'Account' => '#VALUE!', + 'Contract' => 'Kontrakt', + 'Contracts' => 'Kontrakter', + 'End' => '#VALUE!', + 'Files' => '#VALUE!', + 'Overview' => '#VALUE!', + 'Title' => 'Titel', +]]; diff --git a/Theme/Backend/Lang/de.lang.php b/Theme/Backend/Lang/de.lang.php new file mode 100644 index 0000000..b1c9568 --- /dev/null +++ b/Theme/Backend/Lang/de.lang.php @@ -0,0 +1,23 @@ + [ + 'Account' => '#VALUE!', + 'Contract' => 'Vertrag', + 'Contracts' => 'Verträge', + 'End' => '#VALUE!', + 'Files' => '#VALUE!', + 'Overview' => '#VALUE!', + 'Title' => 'Titel', +]]; diff --git a/Theme/Backend/Lang/el.lang.php b/Theme/Backend/Lang/el.lang.php new file mode 100644 index 0000000..50658d2 --- /dev/null +++ b/Theme/Backend/Lang/el.lang.php @@ -0,0 +1,23 @@ + [ + 'Account' => '#VALUE!', + 'Contract' => 'Σύμβαση', + 'Contracts' => 'Συμβάσεις', + 'End' => '#VALUE!', + 'Files' => '#VALUE!', + 'Overview' => '#VALUE!', + 'Title' => 'Τίτλος', +]]; diff --git a/Theme/Backend/Lang/en.lang.php b/Theme/Backend/Lang/en.lang.php index be48f1b..19d56c6 100755 --- a/Theme/Backend/Lang/en.lang.php +++ b/Theme/Backend/Lang/en.lang.php @@ -13,7 +13,11 @@ declare(strict_types=1); return ['ContractManagement' => [ - 'Contract' => 'Contract', - 'Contracts' => 'Contracts', - 'Title' => 'Title', + 'Account' => '', + 'Contract' => 'Contract', + 'Contracts' => 'Contracts', + 'End' => '', + 'Files' => '', + 'Overview' => '', + 'Title' => 'Title', ]]; diff --git a/Theme/Backend/Lang/es.lang.php b/Theme/Backend/Lang/es.lang.php new file mode 100644 index 0000000..3bb0610 --- /dev/null +++ b/Theme/Backend/Lang/es.lang.php @@ -0,0 +1,23 @@ + [ + 'Account' => '#VALUE!', + 'Contract' => 'Contrato', + 'Contracts' => 'Contrato', + 'End' => '#VALUE!', + 'Files' => '#VALUE!', + 'Overview' => '#VALUE!', + 'Title' => 'Título', +]]; diff --git a/Theme/Backend/Lang/fi.lang.php b/Theme/Backend/Lang/fi.lang.php new file mode 100644 index 0000000..e0dfcf3 --- /dev/null +++ b/Theme/Backend/Lang/fi.lang.php @@ -0,0 +1,23 @@ + [ + 'Account' => '#VALUE!', + 'Contract' => 'Sopimus', + 'Contracts' => 'Sopimukset', + 'End' => '#VALUE!', + 'Files' => '#VALUE!', + 'Overview' => '#VALUE!', + 'Title' => 'Otsikko', +]]; diff --git a/Theme/Backend/Lang/fr.lang.php b/Theme/Backend/Lang/fr.lang.php new file mode 100644 index 0000000..58dc248 --- /dev/null +++ b/Theme/Backend/Lang/fr.lang.php @@ -0,0 +1,23 @@ + [ + 'Account' => '#VALUE!', + 'Contract' => 'Contracter', + 'Contracts' => 'Contrats', + 'End' => '#VALUE!', + 'Files' => '#VALUE!', + 'Overview' => '#VALUE!', + 'Title' => 'Titre', +]]; diff --git a/Theme/Backend/Lang/hu.lang.php b/Theme/Backend/Lang/hu.lang.php new file mode 100644 index 0000000..3994926 --- /dev/null +++ b/Theme/Backend/Lang/hu.lang.php @@ -0,0 +1,23 @@ + [ + 'Account' => '#VALUE!', + 'Contract' => 'Szerződés', + 'Contracts' => 'Szerződések', + 'End' => '#VALUE!', + 'Files' => '#VALUE!', + 'Overview' => '#VALUE!', + 'Title' => 'Cím', +]]; diff --git a/Theme/Backend/Lang/it.lang.php b/Theme/Backend/Lang/it.lang.php new file mode 100644 index 0000000..907bc1c --- /dev/null +++ b/Theme/Backend/Lang/it.lang.php @@ -0,0 +1,23 @@ + [ + 'Account' => '#VALUE!', + 'Contract' => 'Contrarre', + 'Contracts' => 'Contratti', + 'End' => '#VALUE!', + 'Files' => '#VALUE!', + 'Overview' => '#VALUE!', + 'Title' => 'Titolo', +]]; diff --git a/Theme/Backend/Lang/ja.lang.php b/Theme/Backend/Lang/ja.lang.php new file mode 100644 index 0000000..03fe460 --- /dev/null +++ b/Theme/Backend/Lang/ja.lang.php @@ -0,0 +1,23 @@ + [ + 'Account' => '#VALUE!', + 'Contract' => '契約', + 'Contracts' => '契約', + 'End' => '#VALUE!', + 'Files' => '#VALUE!', + 'Overview' => '#VALUE!', + 'Title' => 'タイトル', +]]; diff --git a/Theme/Backend/Lang/ko.lang.php b/Theme/Backend/Lang/ko.lang.php new file mode 100644 index 0000000..172bd49 --- /dev/null +++ b/Theme/Backend/Lang/ko.lang.php @@ -0,0 +1,23 @@ + [ + 'Account' => '#VALUE!', + 'Contract' => '계약', + 'Contracts' => '계약서', + 'End' => '#VALUE!', + 'Files' => '#VALUE!', + 'Overview' => '#VALUE!', + 'Title' => '제목', +]]; diff --git a/Theme/Backend/Lang/no.lang.php b/Theme/Backend/Lang/no.lang.php new file mode 100644 index 0000000..1365ba8 --- /dev/null +++ b/Theme/Backend/Lang/no.lang.php @@ -0,0 +1,23 @@ + [ + 'Account' => '#VALUE!', + 'Contract' => 'Kontrakt', + 'Contracts' => 'Kontrakter', + 'End' => '#VALUE!', + 'Files' => '#VALUE!', + 'Overview' => '#VALUE!', + 'Title' => 'Tittel', +]]; diff --git a/Theme/Backend/Lang/pl.lang.php b/Theme/Backend/Lang/pl.lang.php new file mode 100644 index 0000000..351d1e0 --- /dev/null +++ b/Theme/Backend/Lang/pl.lang.php @@ -0,0 +1,23 @@ + [ + 'Account' => '#VALUE!', + 'Contract' => 'Kontrakt', + 'Contracts' => 'Kontrakty', + 'End' => '#VALUE!', + 'Files' => '#VALUE!', + 'Overview' => '#VALUE!', + 'Title' => 'Tytuł', +]]; diff --git a/Theme/Backend/Lang/pt.lang.php b/Theme/Backend/Lang/pt.lang.php new file mode 100644 index 0000000..9127010 --- /dev/null +++ b/Theme/Backend/Lang/pt.lang.php @@ -0,0 +1,23 @@ + [ + 'Account' => '#VALUE!', + 'Contract' => 'Contrato', + 'Contracts' => 'Contratos', + 'End' => '#VALUE!', + 'Files' => '#VALUE!', + 'Overview' => '#VALUE!', + 'Title' => 'Título', +]]; diff --git a/Theme/Backend/Lang/ru.lang.php b/Theme/Backend/Lang/ru.lang.php new file mode 100644 index 0000000..5d35f61 --- /dev/null +++ b/Theme/Backend/Lang/ru.lang.php @@ -0,0 +1,23 @@ + [ + 'Account' => '#VALUE!', + 'Contract' => 'Договор', + 'Contracts' => 'Контракты', + 'End' => '#VALUE!', + 'Files' => '#VALUE!', + 'Overview' => '#VALUE!', + 'Title' => 'Заголовок', +]]; diff --git a/Theme/Backend/Lang/sv.lang.php b/Theme/Backend/Lang/sv.lang.php new file mode 100644 index 0000000..80cb7a5 --- /dev/null +++ b/Theme/Backend/Lang/sv.lang.php @@ -0,0 +1,23 @@ + [ + 'Account' => '#VALUE!', + 'Contract' => 'Avtal', + 'Contracts' => 'Kontrakt', + 'End' => '#VALUE!', + 'Files' => '#VALUE!', + 'Overview' => '#VALUE!', + 'Title' => 'Titel', +]]; diff --git a/Theme/Backend/Lang/th.lang.php b/Theme/Backend/Lang/th.lang.php new file mode 100644 index 0000000..fc3be0d --- /dev/null +++ b/Theme/Backend/Lang/th.lang.php @@ -0,0 +1,23 @@ + [ + 'Account' => '#VALUE!', + 'Contract' => 'สัญญา', + 'Contracts' => 'สัญญา', + 'End' => '#VALUE!', + 'Files' => '#VALUE!', + 'Overview' => '#VALUE!', + 'Title' => 'ชื่อ', +]]; diff --git a/Theme/Backend/Lang/tr.lang.php b/Theme/Backend/Lang/tr.lang.php new file mode 100644 index 0000000..a36a9e5 --- /dev/null +++ b/Theme/Backend/Lang/tr.lang.php @@ -0,0 +1,23 @@ + [ + 'Account' => '#VALUE!', + 'Contract' => 'Sözleşme', + 'Contracts' => 'Sözleşme', + 'End' => '#VALUE!', + 'Files' => '#VALUE!', + 'Overview' => '#VALUE!', + 'Title' => 'Başlık', +]]; diff --git a/Theme/Backend/Lang/uk.lang.php b/Theme/Backend/Lang/uk.lang.php new file mode 100644 index 0000000..46f8da4 --- /dev/null +++ b/Theme/Backend/Lang/uk.lang.php @@ -0,0 +1,23 @@ + [ + 'Account' => '#VALUE!', + 'Contract' => 'Договір', + 'Contracts' => 'Контракти', + 'End' => '#VALUE!', + 'Files' => '#VALUE!', + 'Overview' => '#VALUE!', + 'Title' => 'Заголовок', +]]; diff --git a/Theme/Backend/Lang/zh.lang.php b/Theme/Backend/Lang/zh.lang.php new file mode 100644 index 0000000..2d076a2 --- /dev/null +++ b/Theme/Backend/Lang/zh.lang.php @@ -0,0 +1,23 @@ + [ + 'Account' => '#VALUE!', + 'Contract' => '合同', + 'Contracts' => '合同', + 'End' => '#VALUE!', + 'Files' => '#VALUE!', + 'Overview' => '#VALUE!', + 'Title' => '标题', +]]; From 0af377ed893175a63ef8e6a1e9c6566951b52c9e Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sat, 19 Feb 2022 13:57:38 +0100 Subject: [PATCH 033/133] fix name --- Admin/Install/Admin.install.php | 4 ++-- Admin/Install/Media.php | 6 +++--- Admin/Install/Navigation.php | 6 +++--- Admin/Installer.php | 6 +++--- Admin/Routes/Web/Backend.php | 4 ++-- Admin/Status.php | 6 +++--- Admin/Uninstaller.php | 6 +++--- Admin/Updater.php | 6 +++--- Controller/ApiController.php | 6 +++--- Controller/BackendController.php | 6 +++--- Controller/Controller.php | 6 +++--- Docs/Dev/en/SUMMARY.md | 0 Docs/Dev/en/structure.md | 0 Docs/Dev/img/er.png | Bin Models/Contract.php | 6 +++--- Models/ContractMapper.php | 6 +++--- Models/ContractType.php | 6 +++--- Models/ContractTypeL11n.php | 6 +++--- Models/ContractTypeL11nMapper.php | 6 +++--- Models/ContractTypeMapper.php | 6 +++--- Models/NullContract.php | 6 +++--- Models/NullContractType.php | 6 +++--- Models/NullContractTypeL11n.php | 6 +++--- Models/PermissionState.php | 6 +++--- Models/SettingsEnum.php | 6 +++--- Theme/Backend/Lang/Navigation.ar.lang.php | 4 ++-- Theme/Backend/Lang/Navigation.cs.lang.php | 4 ++-- Theme/Backend/Lang/Navigation.da.lang.php | 4 ++-- Theme/Backend/Lang/Navigation.de.lang.php | 4 ++-- Theme/Backend/Lang/Navigation.el.lang.php | 4 ++-- Theme/Backend/Lang/Navigation.en.lang.php | 4 ++-- Theme/Backend/Lang/Navigation.es.lang.php | 4 ++-- Theme/Backend/Lang/Navigation.fi.lang.php | 4 ++-- Theme/Backend/Lang/Navigation.fr.lang.php | 4 ++-- Theme/Backend/Lang/Navigation.hu.lang.php | 4 ++-- Theme/Backend/Lang/Navigation.it.lang.php | 4 ++-- Theme/Backend/Lang/Navigation.ja.lang.php | 4 ++-- Theme/Backend/Lang/Navigation.ko.lang.php | 4 ++-- Theme/Backend/Lang/Navigation.no.lang.php | 4 ++-- Theme/Backend/Lang/Navigation.pl.lang.php | 4 ++-- Theme/Backend/Lang/Navigation.pt.lang.php | 4 ++-- Theme/Backend/Lang/Navigation.ru.lang.php | 4 ++-- Theme/Backend/Lang/Navigation.sv.lang.php | 4 ++-- Theme/Backend/Lang/Navigation.th.lang.php | 4 ++-- Theme/Backend/Lang/Navigation.tr.lang.php | 4 ++-- Theme/Backend/Lang/Navigation.uk.lang.php | 4 ++-- Theme/Backend/Lang/Navigation.zh.lang.php | 4 ++-- Theme/Backend/Lang/ar.lang.php | 4 ++-- Theme/Backend/Lang/cs.lang.php | 4 ++-- Theme/Backend/Lang/da.lang.php | 4 ++-- Theme/Backend/Lang/de.lang.php | 4 ++-- Theme/Backend/Lang/el.lang.php | 4 ++-- Theme/Backend/Lang/en.lang.php | 4 ++-- Theme/Backend/Lang/es.lang.php | 4 ++-- Theme/Backend/Lang/fi.lang.php | 4 ++-- Theme/Backend/Lang/fr.lang.php | 4 ++-- Theme/Backend/Lang/hu.lang.php | 4 ++-- Theme/Backend/Lang/it.lang.php | 4 ++-- Theme/Backend/Lang/ja.lang.php | 4 ++-- Theme/Backend/Lang/ko.lang.php | 4 ++-- Theme/Backend/Lang/no.lang.php | 4 ++-- Theme/Backend/Lang/pl.lang.php | 4 ++-- Theme/Backend/Lang/pt.lang.php | 4 ++-- Theme/Backend/Lang/ru.lang.php | 4 ++-- Theme/Backend/Lang/sv.lang.php | 4 ++-- Theme/Backend/Lang/th.lang.php | 4 ++-- Theme/Backend/Lang/tr.lang.php | 4 ++-- Theme/Backend/Lang/uk.lang.php | 4 ++-- Theme/Backend/Lang/zh.lang.php | 4 ++-- Theme/Backend/contract-list.tpl.php | 4 ++-- Theme/Backend/contract-single.tpl.php | 4 ++-- info.json | 2 +- tests/Admin/AdminTest.php | 4 ++-- tests/Controller/ApiControllerTest.php | 4 ++-- tests/Models/ContractTest.php | 4 ++-- tests/Models/ContractTypeL11nTest.php | 4 ++-- tests/Models/ContractTypeTest.php | 4 ++-- tests/Models/NullContractTest.php | 4 ++-- tests/Models/NullContractTypeL11nTest.php | 4 ++-- tests/Models/NullContractTypeTest.php | 4 ++-- 80 files changed, 173 insertions(+), 173 deletions(-) mode change 100644 => 100755 Docs/Dev/en/SUMMARY.md mode change 100644 => 100755 Docs/Dev/en/structure.md mode change 100644 => 100755 Docs/Dev/img/er.png mode change 100755 => 100644 Theme/Backend/Lang/Navigation.en.lang.php mode change 100755 => 100644 Theme/Backend/Lang/en.lang.php diff --git a/Admin/Install/Admin.install.php b/Admin/Install/Admin.install.php index bbddc43..723ae21 100644 --- a/Admin/Install/Admin.install.php +++ b/Admin/Install/Admin.install.php @@ -1,6 +1,6 @@ Date: Sat, 19 Feb 2022 14:25:28 +0100 Subject: [PATCH 034/133] fix name --- .github/user_bug_report.md | 2 +- .github/workflows/main.yml | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/user_bug_report.md b/.github/user_bug_report.md index df09513..9e5f2a5 100755 --- a/.github/user_bug_report.md +++ b/.github/user_bug_report.md @@ -28,7 +28,7 @@ If applicable, add screenshots to help explain your problem. - System: [e.g. PC or iPhone11, ...] - OS: [e.g. iOS] - Browser [e.g. chrome, safari] - - Orange Management Version [e.g. 22] + - KarakaVersion [e.g. 22] # Additional Information Add any other context about the problem here. diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index a8532c0..25248d1 100755 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -34,7 +34,7 @@ jobs: if: steps.git-check.outputs.modified == 'true' run: | git config --global user.name 'Formatter Bot' - git config --global user.email 'formatter.bot@orange-management.email' + git config --global user.email 'formatter.bot@karaka.app' git remote set-url origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }} git commit -am "Automated formatting changes" git push @@ -84,29 +84,29 @@ jobs: with: fetch-depth: 1 ref: develop - repository: Orange-Management/Build + repository: Karaka/Build path: Build - name: Checkout Resource Repository uses: actions/checkout@master with: fetch-depth: 1 ref: develop - repository: Orange-Management/Resources + repository: Karaka/Resources path: Resources - name: Checkout phpOMS Repository uses: actions/checkout@master with: fetch-depth: 1 ref: develop - repository: Orange-Management/phpOMS + repository: Karaka/phpOMS path: phpOMS - - name: Checkout Orange-Management Repository + - name: Checkout Karaka Repository uses: actions/checkout@master with: fetch-depth: 1 ref: develop - repository: Orange-Management/Orange-Management - path: Orange-Management + repository: Karaka/Karaka + path: Karaka - name: Setup PHP, with composer and extensions uses: shivammathur/setup-php@master with: @@ -149,7 +149,7 @@ jobs: with: fetch-depth: 1 ref: develop - repository: Orange-Management/Build + repository: Karaka/Build path: Build - name: Setup PHP, with composer and extensions uses: shivammathur/setup-php@master From 501dd49f7dd2f03bb9bf272d5ccbef3f2c399cd7 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sat, 19 Feb 2022 14:33:14 +0100 Subject: [PATCH 035/133] fix name --- Theme/Backend/Lang/Navigation.ar.lang.php | 2 +- Theme/Backend/Lang/Navigation.cs.lang.php | 2 +- Theme/Backend/Lang/Navigation.da.lang.php | 2 +- Theme/Backend/Lang/Navigation.de.lang.php | 2 +- Theme/Backend/Lang/Navigation.el.lang.php | 2 +- Theme/Backend/Lang/Navigation.en.lang.php | 2 +- Theme/Backend/Lang/Navigation.es.lang.php | 2 +- Theme/Backend/Lang/Navigation.fi.lang.php | 2 +- Theme/Backend/Lang/Navigation.fr.lang.php | 2 +- Theme/Backend/Lang/Navigation.hu.lang.php | 2 +- Theme/Backend/Lang/Navigation.it.lang.php | 2 +- Theme/Backend/Lang/Navigation.ja.lang.php | 2 +- Theme/Backend/Lang/Navigation.ko.lang.php | 2 +- Theme/Backend/Lang/Navigation.no.lang.php | 2 +- Theme/Backend/Lang/Navigation.pl.lang.php | 2 +- Theme/Backend/Lang/Navigation.pt.lang.php | 2 +- Theme/Backend/Lang/Navigation.ru.lang.php | 2 +- Theme/Backend/Lang/Navigation.sv.lang.php | 2 +- Theme/Backend/Lang/Navigation.th.lang.php | 2 +- Theme/Backend/Lang/Navigation.tr.lang.php | 2 +- Theme/Backend/Lang/Navigation.uk.lang.php | 2 +- Theme/Backend/Lang/Navigation.zh.lang.php | 2 +- Theme/Backend/Lang/ar.lang.php | 2 +- Theme/Backend/Lang/cs.lang.php | 2 +- Theme/Backend/Lang/da.lang.php | 2 +- Theme/Backend/Lang/de.lang.php | 2 +- Theme/Backend/Lang/el.lang.php | 2 +- Theme/Backend/Lang/en.lang.php | 2 +- Theme/Backend/Lang/es.lang.php | 2 +- Theme/Backend/Lang/fi.lang.php | 2 +- Theme/Backend/Lang/fr.lang.php | 2 +- Theme/Backend/Lang/hu.lang.php | 2 +- Theme/Backend/Lang/it.lang.php | 2 +- Theme/Backend/Lang/ja.lang.php | 2 +- Theme/Backend/Lang/ko.lang.php | 2 +- Theme/Backend/Lang/no.lang.php | 2 +- Theme/Backend/Lang/pl.lang.php | 2 +- Theme/Backend/Lang/pt.lang.php | 2 +- Theme/Backend/Lang/ru.lang.php | 2 +- Theme/Backend/Lang/sv.lang.php | 2 +- Theme/Backend/Lang/th.lang.php | 2 +- Theme/Backend/Lang/tr.lang.php | 2 +- Theme/Backend/Lang/uk.lang.php | 2 +- Theme/Backend/Lang/zh.lang.php | 2 +- 44 files changed, 44 insertions(+), 44 deletions(-) diff --git a/Theme/Backend/Lang/Navigation.ar.lang.php b/Theme/Backend/Lang/Navigation.ar.lang.php index 56a7b68..781d31c 100644 --- a/Theme/Backend/Lang/Navigation.ar.lang.php +++ b/Theme/Backend/Lang/Navigation.ar.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.cs.lang.php b/Theme/Backend/Lang/Navigation.cs.lang.php index a1ba21b..a57a8c3 100644 --- a/Theme/Backend/Lang/Navigation.cs.lang.php +++ b/Theme/Backend/Lang/Navigation.cs.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.da.lang.php b/Theme/Backend/Lang/Navigation.da.lang.php index b887fb3..277eded 100644 --- a/Theme/Backend/Lang/Navigation.da.lang.php +++ b/Theme/Backend/Lang/Navigation.da.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.de.lang.php b/Theme/Backend/Lang/Navigation.de.lang.php index 26c379a..6e1c92c 100644 --- a/Theme/Backend/Lang/Navigation.de.lang.php +++ b/Theme/Backend/Lang/Navigation.de.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.el.lang.php b/Theme/Backend/Lang/Navigation.el.lang.php index 9a4a3da..44ad979 100644 --- a/Theme/Backend/Lang/Navigation.el.lang.php +++ b/Theme/Backend/Lang/Navigation.el.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.en.lang.php b/Theme/Backend/Lang/Navigation.en.lang.php index ecbb223..6923de4 100644 --- a/Theme/Backend/Lang/Navigation.en.lang.php +++ b/Theme/Backend/Lang/Navigation.en.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.es.lang.php b/Theme/Backend/Lang/Navigation.es.lang.php index ade7f42..ae090b8 100644 --- a/Theme/Backend/Lang/Navigation.es.lang.php +++ b/Theme/Backend/Lang/Navigation.es.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.fi.lang.php b/Theme/Backend/Lang/Navigation.fi.lang.php index 07f8fff..944ca7d 100644 --- a/Theme/Backend/Lang/Navigation.fi.lang.php +++ b/Theme/Backend/Lang/Navigation.fi.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.fr.lang.php b/Theme/Backend/Lang/Navigation.fr.lang.php index 42c1e7d..bfa048a 100644 --- a/Theme/Backend/Lang/Navigation.fr.lang.php +++ b/Theme/Backend/Lang/Navigation.fr.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.hu.lang.php b/Theme/Backend/Lang/Navigation.hu.lang.php index 0b3442d..0fc4ea2 100644 --- a/Theme/Backend/Lang/Navigation.hu.lang.php +++ b/Theme/Backend/Lang/Navigation.hu.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.it.lang.php b/Theme/Backend/Lang/Navigation.it.lang.php index b76aed8..23392e4 100644 --- a/Theme/Backend/Lang/Navigation.it.lang.php +++ b/Theme/Backend/Lang/Navigation.it.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.ja.lang.php b/Theme/Backend/Lang/Navigation.ja.lang.php index a546500..73e2f44 100644 --- a/Theme/Backend/Lang/Navigation.ja.lang.php +++ b/Theme/Backend/Lang/Navigation.ja.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.ko.lang.php b/Theme/Backend/Lang/Navigation.ko.lang.php index 55250f3..b02bdf1 100644 --- a/Theme/Backend/Lang/Navigation.ko.lang.php +++ b/Theme/Backend/Lang/Navigation.ko.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.no.lang.php b/Theme/Backend/Lang/Navigation.no.lang.php index 220c488..538a854 100644 --- a/Theme/Backend/Lang/Navigation.no.lang.php +++ b/Theme/Backend/Lang/Navigation.no.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.pl.lang.php b/Theme/Backend/Lang/Navigation.pl.lang.php index 9c9a862..536f1a1 100644 --- a/Theme/Backend/Lang/Navigation.pl.lang.php +++ b/Theme/Backend/Lang/Navigation.pl.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.pt.lang.php b/Theme/Backend/Lang/Navigation.pt.lang.php index 26f9ec0..acd9f36 100644 --- a/Theme/Backend/Lang/Navigation.pt.lang.php +++ b/Theme/Backend/Lang/Navigation.pt.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.ru.lang.php b/Theme/Backend/Lang/Navigation.ru.lang.php index 865f8aa..056e7c3 100644 --- a/Theme/Backend/Lang/Navigation.ru.lang.php +++ b/Theme/Backend/Lang/Navigation.ru.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.sv.lang.php b/Theme/Backend/Lang/Navigation.sv.lang.php index f46214c..691f405 100644 --- a/Theme/Backend/Lang/Navigation.sv.lang.php +++ b/Theme/Backend/Lang/Navigation.sv.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.th.lang.php b/Theme/Backend/Lang/Navigation.th.lang.php index f70e968..03047c8 100644 --- a/Theme/Backend/Lang/Navigation.th.lang.php +++ b/Theme/Backend/Lang/Navigation.th.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.tr.lang.php b/Theme/Backend/Lang/Navigation.tr.lang.php index a8d6c59..d57c594 100644 --- a/Theme/Backend/Lang/Navigation.tr.lang.php +++ b/Theme/Backend/Lang/Navigation.tr.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.uk.lang.php b/Theme/Backend/Lang/Navigation.uk.lang.php index ba442cf..744c97b 100644 --- a/Theme/Backend/Lang/Navigation.uk.lang.php +++ b/Theme/Backend/Lang/Navigation.uk.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.zh.lang.php b/Theme/Backend/Lang/Navigation.zh.lang.php index 7b0597b..313888f 100644 --- a/Theme/Backend/Lang/Navigation.zh.lang.php +++ b/Theme/Backend/Lang/Navigation.zh.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/ar.lang.php b/Theme/Backend/Lang/ar.lang.php index 32df39a..93ff068 100644 --- a/Theme/Backend/Lang/ar.lang.php +++ b/Theme/Backend/Lang/ar.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/cs.lang.php b/Theme/Backend/Lang/cs.lang.php index 7e7cb03..3870907 100644 --- a/Theme/Backend/Lang/cs.lang.php +++ b/Theme/Backend/Lang/cs.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/da.lang.php b/Theme/Backend/Lang/da.lang.php index cb7af9b..7df1dd9 100644 --- a/Theme/Backend/Lang/da.lang.php +++ b/Theme/Backend/Lang/da.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/de.lang.php b/Theme/Backend/Lang/de.lang.php index ec37726..cc18fe7 100644 --- a/Theme/Backend/Lang/de.lang.php +++ b/Theme/Backend/Lang/de.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/el.lang.php b/Theme/Backend/Lang/el.lang.php index 70e7553..86c9c66 100644 --- a/Theme/Backend/Lang/el.lang.php +++ b/Theme/Backend/Lang/el.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/en.lang.php b/Theme/Backend/Lang/en.lang.php index c831d7a..1274256 100644 --- a/Theme/Backend/Lang/en.lang.php +++ b/Theme/Backend/Lang/en.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/es.lang.php b/Theme/Backend/Lang/es.lang.php index ff72d10..e28b8f8 100644 --- a/Theme/Backend/Lang/es.lang.php +++ b/Theme/Backend/Lang/es.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/fi.lang.php b/Theme/Backend/Lang/fi.lang.php index dd2a7a6..25e015d 100644 --- a/Theme/Backend/Lang/fi.lang.php +++ b/Theme/Backend/Lang/fi.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/fr.lang.php b/Theme/Backend/Lang/fr.lang.php index 7b3fecc..2ab12e4 100644 --- a/Theme/Backend/Lang/fr.lang.php +++ b/Theme/Backend/Lang/fr.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/hu.lang.php b/Theme/Backend/Lang/hu.lang.php index e0779d7..d945424 100644 --- a/Theme/Backend/Lang/hu.lang.php +++ b/Theme/Backend/Lang/hu.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/it.lang.php b/Theme/Backend/Lang/it.lang.php index 43c44fd..37a29b7 100644 --- a/Theme/Backend/Lang/it.lang.php +++ b/Theme/Backend/Lang/it.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/ja.lang.php b/Theme/Backend/Lang/ja.lang.php index 3bacb2c..c26bf33 100644 --- a/Theme/Backend/Lang/ja.lang.php +++ b/Theme/Backend/Lang/ja.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/ko.lang.php b/Theme/Backend/Lang/ko.lang.php index 8dc2662..5c753ea 100644 --- a/Theme/Backend/Lang/ko.lang.php +++ b/Theme/Backend/Lang/ko.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/no.lang.php b/Theme/Backend/Lang/no.lang.php index 6a6c8b2..2996f89 100644 --- a/Theme/Backend/Lang/no.lang.php +++ b/Theme/Backend/Lang/no.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/pl.lang.php b/Theme/Backend/Lang/pl.lang.php index 8f88cb3..8ceb802 100644 --- a/Theme/Backend/Lang/pl.lang.php +++ b/Theme/Backend/Lang/pl.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/pt.lang.php b/Theme/Backend/Lang/pt.lang.php index d5ab816..9c9fc2f 100644 --- a/Theme/Backend/Lang/pt.lang.php +++ b/Theme/Backend/Lang/pt.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/ru.lang.php b/Theme/Backend/Lang/ru.lang.php index cb778f1..314b841 100644 --- a/Theme/Backend/Lang/ru.lang.php +++ b/Theme/Backend/Lang/ru.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/sv.lang.php b/Theme/Backend/Lang/sv.lang.php index 1b780a6..79e1f18 100644 --- a/Theme/Backend/Lang/sv.lang.php +++ b/Theme/Backend/Lang/sv.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/th.lang.php b/Theme/Backend/Lang/th.lang.php index 16ed947..0595e49 100644 --- a/Theme/Backend/Lang/th.lang.php +++ b/Theme/Backend/Lang/th.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/tr.lang.php b/Theme/Backend/Lang/tr.lang.php index 9d7f3d4..2c43a41 100644 --- a/Theme/Backend/Lang/tr.lang.php +++ b/Theme/Backend/Lang/tr.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/uk.lang.php b/Theme/Backend/Lang/uk.lang.php index 9334396..e601d51 100644 --- a/Theme/Backend/Lang/uk.lang.php +++ b/Theme/Backend/Lang/uk.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/zh.lang.php b/Theme/Backend/Lang/zh.lang.php index b230249..6b4edc1 100644 --- a/Theme/Backend/Lang/zh.lang.php +++ b/Theme/Backend/Lang/zh.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.org + * @link https://karaka.app */ declare(strict_types=1); From 363ec90d6ed835639532163543a52ebbf814e1ce Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sat, 5 Mar 2022 17:03:46 +0100 Subject: [PATCH 036/133] render fixes, minor bug fixes --- Theme/Backend/Lang/en.lang.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Theme/Backend/Lang/en.lang.php b/Theme/Backend/Lang/en.lang.php index 1274256..fa0aafa 100644 --- a/Theme/Backend/Lang/en.lang.php +++ b/Theme/Backend/Lang/en.lang.php @@ -13,11 +13,11 @@ declare(strict_types=1); return ['ContractManagement' => [ - 'Account' => '', + 'Account' => 'Account', 'Contract' => 'Contract', 'Contracts' => 'Contracts', - 'End' => '', - 'Files' => '', - 'Overview' => '', + 'End' => 'End', + 'Files' => 'Files', + 'Overview' => 'Overview', 'Title' => 'Title', ]]; From 87c7ea1cb62bfc35014984bb0e5bdfca74bd45e9 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Thu, 17 Mar 2022 22:39:51 +0100 Subject: [PATCH 037/133] always use and many other todo implementations --- Admin/Install/Navigation.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Admin/Install/Navigation.php b/Admin/Install/Navigation.php index 90f6410..41b9a57 100755 --- a/Admin/Install/Navigation.php +++ b/Admin/Install/Navigation.php @@ -29,14 +29,14 @@ class Navigation /** * Install navigation providing * - * @param string $path Module path * @param ApplicationAbstract $app Application + * @param string $path Module path * * @return void * * @since 1.0.0 */ - public static function install(string $path, ApplicationAbstract $app) : void + public static function install(ApplicationAbstract $app, string $path) : void { \Modules\Navigation\Admin\Installer::installExternal($app, ['path' => __DIR__ . '/Navigation.install.json']); } From 89590da47d39679edd2cb13c28b9c6bca07fa4f2 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Thu, 17 Mar 2022 23:01:29 +0100 Subject: [PATCH 038/133] changed badly named permission type to permission category because type should only be read/write/... --- Admin/Routes/Web/Backend.php | 6 +++--- Models/{PermissionState.php => PermissionCategory.php} | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) rename Models/{PermissionState.php => PermissionCategory.php} (91%) diff --git a/Admin/Routes/Web/Backend.php b/Admin/Routes/Web/Backend.php index f88bb40..82fb566 100755 --- a/Admin/Routes/Web/Backend.php +++ b/Admin/Routes/Web/Backend.php @@ -13,7 +13,7 @@ declare(strict_types=1); use Modules\ContractManagement\Controller\BackendController; -use Modules\ContractManagement\Models\PermissionState; +use Modules\ContractManagement\Models\PermissionCategory; use phpOMS\Account\PermissionType; use phpOMS\Router\RouteVerb; @@ -25,7 +25,7 @@ return [ 'permission' => [ 'module' => BackendController::NAME, 'type' => PermissionType::READ, - 'state' => PermissionState::CONTRACT, + 'state' => PermissionCategory::CONTRACT, ], ], ], @@ -36,7 +36,7 @@ return [ 'permission' => [ 'module' => BackendController::NAME, 'type' => PermissionType::READ, - 'state' => PermissionState::CONTRACT, + 'state' => PermissionCategory::CONTRACT, ], ], ], diff --git a/Models/PermissionState.php b/Models/PermissionCategory.php similarity index 91% rename from Models/PermissionState.php rename to Models/PermissionCategory.php index ee5d41b..1130453 100755 --- a/Models/PermissionState.php +++ b/Models/PermissionCategory.php @@ -24,7 +24,7 @@ use phpOMS\Stdlib\Base\Enum; * @link https://karaka.app * @since 1.0.0 */ -abstract class PermissionState extends Enum +abstract class PermissionCategory extends Enum { public const CONTRACT = 1; } From ef624e1adf03827e6cdb7a2a1e61583e091b8fef Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sat, 19 Mar 2022 00:02:43 +0100 Subject: [PATCH 039/133] bug fixes from the day before --- Admin/Install/Media.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Admin/Install/Media.php b/Admin/Install/Media.php index e96a55c..de619d9 100644 --- a/Admin/Install/Media.php +++ b/Admin/Install/Media.php @@ -29,14 +29,14 @@ class Media /** * Install media providing * - * @param string $path Module path * @param ApplicationAbstract $app Application + * @param string $path Module path * * @return void * * @since 1.0.0 */ - public static function install(string $path, ApplicationAbstract $app) : void + public static function install(ApplicationAbstract $app, string $path) : void { \Modules\Media\Admin\Installer::installExternal($app, ['path' => __DIR__ . '/Media.install.json']); } From 9926e5cd0887aefef75f7746b4b227fd4220fad1 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Tue, 22 Mar 2022 17:34:58 +0100 Subject: [PATCH 040/133] fixed php 8.1 type bugs --- Models/Contract.php | 2 +- Models/ContractType.php | 2 +- Models/ContractTypeL11n.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Models/Contract.php b/Models/Contract.php index dd203d1..c48788d 100755 --- a/Models/Contract.php +++ b/Models/Contract.php @@ -158,7 +158,7 @@ class Contract /** * {@inheritdoc} */ - public function jsonSerialize() + public function jsonSerialize() : mixed { return $this->toArray(); } diff --git a/Models/ContractType.php b/Models/ContractType.php index a3ffad1..b9e2d83 100755 --- a/Models/ContractType.php +++ b/Models/ContractType.php @@ -113,7 +113,7 @@ class ContractType implements \JsonSerializable, ArrayableInterface /** * {@inheritdoc} */ - public function jsonSerialize() + public function jsonSerialize() : mixed { return $this->toArray(); } diff --git a/Models/ContractTypeL11n.php b/Models/ContractTypeL11n.php index 12b6337..2ab8b48 100755 --- a/Models/ContractTypeL11n.php +++ b/Models/ContractTypeL11n.php @@ -129,7 +129,7 @@ class ContractTypeL11n implements \JsonSerializable, ArrayableInterface /** * {@inheritdoc} */ - public function jsonSerialize() + public function jsonSerialize() : mixed { return $this->toArray(); } From 777e1ebd68f4b6dcea5e7ad0a32e30d725d47b59 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sat, 26 Mar 2022 15:01:45 +0100 Subject: [PATCH 041/133] undo serialize deprecation and switch to installExternal api calls --- Models/ContractType.php | 3 +-- Models/ContractTypeL11n.php | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Models/ContractType.php b/Models/ContractType.php index b9e2d83..a484441 100755 --- a/Models/ContractType.php +++ b/Models/ContractType.php @@ -14,7 +14,6 @@ declare(strict_types=1); namespace Modules\ContractManagement\Models; -use phpOMS\Contract\ArrayableInterface; use phpOMS\Localization\ISO639x1Enum; /** @@ -25,7 +24,7 @@ use phpOMS\Localization\ISO639x1Enum; * @link https://karaka.app * @since 1.0.0 */ -class ContractType implements \JsonSerializable, ArrayableInterface +class ContractType implements \JsonSerializable { /** * Id diff --git a/Models/ContractTypeL11n.php b/Models/ContractTypeL11n.php index 2ab8b48..db28998 100755 --- a/Models/ContractTypeL11n.php +++ b/Models/ContractTypeL11n.php @@ -14,7 +14,6 @@ declare(strict_types=1); namespace Modules\ContractManagement\Models; -use phpOMS\Contract\ArrayableInterface; use phpOMS\Localization\ISO639x1Enum; /** @@ -25,7 +24,7 @@ use phpOMS\Localization\ISO639x1Enum; * @link https://karaka.app * @since 1.0.0 */ -class ContractTypeL11n implements \JsonSerializable, ArrayableInterface +class ContractTypeL11n implements \JsonSerializable { /** * ID. From 197f920ef5b3d5f4dbd1ae35708f3ed164ecfac5 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Tue, 29 Mar 2022 16:41:16 +0200 Subject: [PATCH 042/133] phpstan and phpcs fixes --- Admin/Install/Navigation.install.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Admin/Install/Navigation.install.json b/Admin/Install/Navigation.install.json index 5f2f9c4..211f2df 100755 --- a/Admin/Install/Navigation.install.json +++ b/Admin/Install/Navigation.install.json @@ -10,7 +10,7 @@ "icon": null, "order": 45, "from": "Kanban", - "permission": { "permission": 2, "type": null, "element": null }, + "permission": { "permission": 2, "category": null, "element": null }, "parent": 1003301001, "children": [ { @@ -24,7 +24,7 @@ "icon": null, "order": 1, "from": "Kanban", - "permission": { "permission": 2, "type": null, "element": null }, + "permission": { "permission": 2, "category": null, "element": null }, "parent": 1007901001, "children": [] } From ab04a574f5387b83ef4e020320741b9e5985e605 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Mon, 4 Apr 2022 19:13:18 +0200 Subject: [PATCH 043/133] fix img. minification action --- .github/workflows/image.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/image.yml b/.github/workflows/image.yml index d2fb2d4..8900845 100755 --- a/.github/workflows/image.yml +++ b/.github/workflows/image.yml @@ -19,6 +19,6 @@ jobs: uses: actions/checkout@master - name: Compress Images - uses: calibreapp/image-actions@master + uses: calibreapp/image-actions@main with: githubToken: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file From 94e348e0b3491cb172b91afe45e54158abfa81bc Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Tue, 5 Apr 2022 20:04:47 +0200 Subject: [PATCH 044/133] static code analysis fixes --- Controller/ApiController.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Controller/ApiController.php b/Controller/ApiController.php index f8706b1..07003fd 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -133,7 +133,7 @@ final class ApiController extends Controller */ public function apiContractDocumentCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void { - $uploadedFiles = $request->getFiles() ?? []; + $uploadedFiles = $request->getFiles(); if (empty($uploadedFiles)) { $this->fillJsonResponse($request, $response, NotificationLevel::ERROR, 'Contract', 'Invalid contract image', $uploadedFiles); @@ -143,8 +143,8 @@ final class ApiController extends Controller } $uploaded = $this->app->moduleManager->get('Media')->uploadFiles( - $request->getDataList('names') ?? [], - $request->getDataList('filenames') ?? [], + $request->getDataList('names'), + $request->getDataList('filenames'), $uploadedFiles, $request->header->account, __DIR__ . '/../../../Modules/Media/Files/Modules/ContractManagement/Contracts/' . ($request->getData('contract_title') ?? '0'), From d21ec9f4164de755e73281561ed7a68a8e6eced8 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sun, 10 Apr 2022 17:20:27 +0200 Subject: [PATCH 045/133] update workflow --- .github/workflows/main.yml | 95 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 25248d1..bdf3062 100755 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -131,6 +131,96 @@ jobs: env: CODECOV_TOKEN: "${{ secrets.CODECOV_TOKEN }}" run: "bash <(curl -s https://codecov.io/bash) -f tests/coverage.xml" + static-tests: + runs-on: ubuntu-latest + if: "!contains(github.event.head_commit.message, 'NO_CI')" + strategy: + fail-fast: false + max-parallel: 3 + matrix: + php-versions: ['8.0'] + steps: + - name: Checkout Repository + uses: actions/checkout@master + with: + fetch-depth: 1 + submodules: recursive + token: ${{ secrets.GITHUB }} + - name: Checkout Build Repository + uses: actions/checkout@master + with: + fetch-depth: 1 + ref: develop + repository: Karaka/Build + path: Build + - name: Setup PHP, with composer and extensions + uses: shivammathur/setup-php@master + with: + php-version: ${{ matrix.php-versions }} + extensions: mbstring, gd, zip, dom, mysql, pgsql, sqlite, imap, bcmath, redis, memcached + ini-values: opcache.jit_buffer_size=256M, opcache.jit=1235, pcre.jit=1 + - name: Get Composer Cache Directory + id: composer-cache + run: echo "::set-output name=dir::$(composer config cache-files-dir)" + - name: Cache dependencies + uses: actions/cache@v1 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} + restore-keys: ${{ runner.os }}-composer- + - name: Setup Composer + run: composer install + - name: phpstan + run: vendor/bin/phpstan analyse -a phpOMS/Autoloader.php --no-progress -l 9 -c Build/Config/phpstan.neon ./ + codestyle-tests: + runs-on: ubuntu-latest + if: "!contains(github.event.head_commit.message, 'NO_CI')" + strategy: + fail-fast: false + max-parallel: 3 + matrix: + php-versions: ['8.0'] + steps: + - name: Checkout Repository + uses: actions/checkout@master + with: + fetch-depth: 1 + submodules: recursive + token: ${{ secrets.GITHUB }} + - name: Checkout Build Repository + uses: actions/checkout@master + with: + fetch-depth: 1 + ref: develop + repository: Karaka/Build + path: Build + - name: Setup PHP, with composer and extensions + uses: shivammathur/setup-php@master + with: + php-version: ${{ matrix.php-versions }} + extensions: mbstring, gd, zip, dom, mysql, pgsql, sqlite, imap, bcmath, redis, memcached + ini-values: opcache.jit_buffer_size=256M, opcache.jit=1235, pcre.jit=1 + - name: Get Composer Cache Directory + id: composer-cache + run: echo "::set-output name=dir::$(composer config cache-files-dir)" + - name: Cache dependencies + uses: actions/cache@v1 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} + restore-keys: ${{ runner.os }}-composer- + - name: Setup Composer + run: composer install + - name: phpcs + run: vendor/bin/phpcs ./ --standard="Build/Config/phpcs.xml" -s --report=full + - name: Install NPM + uses: actions/setup-node@v3 + with: + node-version: '14' + cache: 'npm' + - run: npm install + - name: eslint + run: npx eslint ./ -c Build/Config/.eslintrc.json custom: runs-on: ubuntu-latest if: "!contains(github.event.head_commit.message, 'NO_CI')" @@ -165,6 +255,11 @@ jobs: run: | if [[ $(find ./ -name "*tpl.php" | xargs grep -E '=\"[\#\$\%\^\&\*\(\)\\/\ ]*\"') -ne "" ]]; then exit 1; fi if [[ $(find ./ -name "*tpl.php" | xargs grep -P '(\)') -ne "" ]]; then exit 1; fi + if [[ $(find ./ -name "*tpl.php" | xargs grep -P '()') -ne "" ]]; then exit 1; fi + if [[ $(find ./ -name "*tpl.php" | xargs grep -P '()') -ne "" ]]; then exit 1; fi + if [[ $(find ./ -name "*tpl.php" | xargs grep -P '(style=)') -ne "" ]]; then exit 1; fi + if [[ $(find ./ -name "*tpl.php" | xargs grep -P '(value|title|alt|aria\-label)(=\")((?!\<\?).)*(>)') -ne "" ]]; then exit 1; fi + if [[ $(find ./ -name "*tpl.php" | xargs grep -P '(\|\|\|\)) -ne "" ]]; then exit 1; fi - name: Js strict run: if [[ $(grep -r -L "\"use strict\";" --include=*.js ./) -ne "" ]]; then exit 1; fi - name: Js inspection From dfff2934aaff5ba261b4ebe792969c6844cbaef3 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sun, 10 Apr 2022 17:54:24 +0200 Subject: [PATCH 046/133] update composer --- .github/workflows/main.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index bdf3062..2bf2da5 100755 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -84,7 +84,7 @@ jobs: with: fetch-depth: 1 ref: develop - repository: Karaka/Build + repository: Karaka-Management/Build path: Build - name: Checkout Resource Repository uses: actions/checkout@master @@ -151,7 +151,7 @@ jobs: with: fetch-depth: 1 ref: develop - repository: Karaka/Build + repository: Karaka-Management/Build path: Build - name: Setup PHP, with composer and extensions uses: shivammathur/setup-php@master @@ -192,7 +192,7 @@ jobs: with: fetch-depth: 1 ref: develop - repository: Karaka/Build + repository: Karaka-Management/Build path: Build - name: Setup PHP, with composer and extensions uses: shivammathur/setup-php@master @@ -239,7 +239,7 @@ jobs: with: fetch-depth: 1 ref: develop - repository: Karaka/Build + repository: Karaka-Management/Build path: Build - name: Setup PHP, with composer and extensions uses: shivammathur/setup-php@master From 6305b22fbe15ed330da290c9cbe0a0bf3d0ff716 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sun, 10 Apr 2022 18:22:02 +0200 Subject: [PATCH 047/133] workflow fixes --- .github/workflows/main.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 2bf2da5..4036c97 100755 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -100,6 +100,7 @@ jobs: ref: develop repository: Karaka/phpOMS path: phpOMS + token: ${{ secrets.GITHUB }} - name: Checkout Karaka Repository uses: actions/checkout@master with: @@ -127,10 +128,6 @@ jobs: run: composer install - name: phpunit run: vendor/bin/phpunit --coverage-clover tests/coverage.xml --configuration tests/phpunit_default.xml - - name: codecov - env: - CODECOV_TOKEN: "${{ secrets.CODECOV_TOKEN }}" - run: "bash <(curl -s https://codecov.io/bash) -f tests/coverage.xml" static-tests: runs-on: ubuntu-latest if: "!contains(github.event.head_commit.message, 'NO_CI')" From 98762068759aac32039a691407fed2ae6943751a Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sun, 10 Apr 2022 18:49:26 +0200 Subject: [PATCH 048/133] workflow fixes --- .github/workflows/main.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 4036c97..afe85ad 100755 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -100,7 +100,7 @@ jobs: ref: develop repository: Karaka/phpOMS path: phpOMS - token: ${{ secrets.GITHUB }} + token: ${{ secrets.GH_PAT }} - name: Checkout Karaka Repository uses: actions/checkout@master with: @@ -142,7 +142,7 @@ jobs: with: fetch-depth: 1 submodules: recursive - token: ${{ secrets.GITHUB }} + token: ${{ secrets.GH_PAT }} - name: Checkout Build Repository uses: actions/checkout@master with: @@ -183,7 +183,7 @@ jobs: with: fetch-depth: 1 submodules: recursive - token: ${{ secrets.GITHUB }} + token: ${{ secrets.GH_PAT }} - name: Checkout Build Repository uses: actions/checkout@master with: From 688e0e5bb7da72fcd15fc373c5452a40872fce29 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sun, 10 Apr 2022 18:51:42 +0200 Subject: [PATCH 049/133] workflow fixes --- .github/workflows/main.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index afe85ad..c4a8038 100755 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -91,14 +91,14 @@ jobs: with: fetch-depth: 1 ref: develop - repository: Karaka/Resources + repository: Karaka-Management/Resources path: Resources - name: Checkout phpOMS Repository uses: actions/checkout@master with: fetch-depth: 1 ref: develop - repository: Karaka/phpOMS + repository: Karaka-Management/phpOMS path: phpOMS token: ${{ secrets.GH_PAT }} - name: Checkout Karaka Repository @@ -106,7 +106,7 @@ jobs: with: fetch-depth: 1 ref: develop - repository: Karaka/Karaka + repository: Karaka-Management/Karaka path: Karaka - name: Setup PHP, with composer and extensions uses: shivammathur/setup-php@master From cfbd8aabe66c302daf3d839c15819da1c97212d2 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sun, 10 Apr 2022 19:17:20 +0200 Subject: [PATCH 050/133] workflow fixes --- .github/workflows/main.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index c4a8038..86fa970 100755 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -150,6 +150,14 @@ jobs: ref: develop repository: Karaka-Management/Build path: Build + - name: Checkout phpOMS Repository + uses: actions/checkout@master + with: + fetch-depth: 1 + ref: develop + repository: Karaka-Management/phpOMS + path: phpOMS + token: ${{ secrets.GH_PAT }} - name: Setup PHP, with composer and extensions uses: shivammathur/setup-php@master with: From 8a8b22c56bc1f5de6e1325f5dcf7fbf0041fa57e Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Mon, 18 Apr 2022 22:39:00 +0200 Subject: [PATCH 051/133] ical update --- .github/workflows/image.yml | 2 +- .github/workflows/main.yml | 45 +++++++++++++++++++++++---------- Controller/ApiController.php | 4 +-- ICAL.txt | 49 ++++++++++++++++++++++++++++++++++++ 4 files changed, 83 insertions(+), 17 deletions(-) create mode 100644 ICAL.txt diff --git a/.github/workflows/image.yml b/.github/workflows/image.yml index 8900845..d079329 100755 --- a/.github/workflows/image.yml +++ b/.github/workflows/image.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout Repo - uses: actions/checkout@master + uses: actions/checkout@main - name: Compress Images uses: calibreapp/image-actions@main diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 86fa970..3bb205d 100755 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -11,7 +11,7 @@ jobs: max-parallel: 3 steps: - name: Checkout Repository - uses: actions/checkout@master + uses: actions/checkout@main with: fetch-depth: 1 - name: Get Composer Cache Directory @@ -76,25 +76,25 @@ jobs: php-versions: ['8.0'] steps: - name: Checkout Repository - uses: actions/checkout@master + uses: actions/checkout@main with: fetch-depth: 1 - name: Checkout Build Repository - uses: actions/checkout@master + uses: actions/checkout@main with: fetch-depth: 1 ref: develop repository: Karaka-Management/Build path: Build - name: Checkout Resource Repository - uses: actions/checkout@master + uses: actions/checkout@main with: fetch-depth: 1 ref: develop repository: Karaka-Management/Resources path: Resources - name: Checkout phpOMS Repository - uses: actions/checkout@master + uses: actions/checkout@main with: fetch-depth: 1 ref: develop @@ -102,7 +102,7 @@ jobs: path: phpOMS token: ${{ secrets.GH_PAT }} - name: Checkout Karaka Repository - uses: actions/checkout@master + uses: actions/checkout@main with: fetch-depth: 1 ref: develop @@ -138,20 +138,20 @@ jobs: php-versions: ['8.0'] steps: - name: Checkout Repository - uses: actions/checkout@master + uses: actions/checkout@main with: fetch-depth: 1 submodules: recursive token: ${{ secrets.GH_PAT }} - name: Checkout Build Repository - uses: actions/checkout@master + uses: actions/checkout@main with: fetch-depth: 1 ref: develop repository: Karaka-Management/Build path: Build - name: Checkout phpOMS Repository - uses: actions/checkout@master + uses: actions/checkout@main with: fetch-depth: 1 ref: develop @@ -187,13 +187,13 @@ jobs: php-versions: ['8.0'] steps: - name: Checkout Repository - uses: actions/checkout@master + uses: actions/checkout@main with: fetch-depth: 1 submodules: recursive token: ${{ secrets.GH_PAT }} - name: Checkout Build Repository - uses: actions/checkout@master + uses: actions/checkout@main with: fetch-depth: 1 ref: develop @@ -226,6 +226,25 @@ jobs: - run: npm install - name: eslint run: npx eslint ./ -c Build/Config/.eslintrc.json + linting: + runs-on: ubuntu-latest + if: "!contains(github.event.head_commit.message, 'NO_CI')" + strategy: + fail-fast: false + max-parallel: 3 + steps: + - name: Checkout Repository + uses: actions/checkout@main + with: + fetch-depth: 0 + submodules: recursive + token: ${{ secrets.GH_PAT }} + - name: Lint Code Base + uses: github/super-linter@v4 + env: + VALIDATE_ALL_CODEBASE: false + DEFAULT_BRANCH: develop + GITHUB_TOKEN: ${{ secrets.GH_PAT }} custom: runs-on: ubuntu-latest if: "!contains(github.event.head_commit.message, 'NO_CI')" @@ -236,11 +255,11 @@ jobs: php-versions: ['8.0'] steps: - name: Checkout Repository - uses: actions/checkout@master + uses: actions/checkout@main with: fetch-depth: 1 - name: Checkout Build Repository - uses: actions/checkout@master + uses: actions/checkout@main with: fetch-depth: 1 ref: develop diff --git a/Controller/ApiController.php b/Controller/ApiController.php index 07003fd..e9621d6 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -150,9 +150,7 @@ final class ApiController extends Controller __DIR__ . '/../../../Modules/Media/Files/Modules/ContractManagement/Contracts/' . ($request->getData('contract_title') ?? '0'), '/Modules/ContractManagement/Contracts/' . ($request->getData('contract_title') ?? '0'), $request->getData('type', 'int'), - '', - '', - PathSettings::FILE_PATH + pathSettings: PathSettings::FILE_PATH ); $this->createModelRelation( diff --git a/ICAL.txt b/ICAL.txt new file mode 100644 index 0000000..019045f --- /dev/null +++ b/ICAL.txt @@ -0,0 +1,49 @@ +# Individual Contributor License Agreement ("CLA") 1.0 + +Thank you for your interest in Karaka-Management (the "Company"). In order to clarify the intellectual property license granted with Contributions from any person or entity, the Company must provide a Contributor License Agreement ("CLA") on file that has been made available to each Contributor. This license is for your protection as a Contributor as well as the protection of the Company and its users; it does not change your rights to use your own Contributions for any other purpose. + +By contributing to the Company You accept and agree to the following terms and conditions for Your present and future Contributions submitted to the Company. In return, the Company shall not use Your Contributions in a way that is contrary to the public benefit or inconsistent with its bylaws in effect at the time of the Contribution. Except for the license granted herein to the Company and recipients of software distributed by the Company, You reserve all right, title, and interest in and to Your Contributions. + +## Definitions + +**"You" (or "Your")** + +"You" (or "Your") shall mean the copyright owner or legal entity authorized by the copyright owner that is making this Agreement with the Company. For legal entities, the entity making a Contribution and all other entities that control, are controlled by, or are under common control with that entity are considered to be a single Contributor. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +**"Contribution"** + +"Contribution" shall mean any original work of authorship, including any modifications or additions to an existing work, that is intentionally submitted by You to the Company for inclusion in, or documentation of, any of the products owned or managed by the Company (the "Work"). This includes but is not limited to technical material, techniques, articles, sketches, drawings, images, models, inventions, know-how, processes, apparatus, equipment, algorithms, software programs, software source documents, and formula related to the current, future and proposed products and services regarding the Company". For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Company or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Company for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by You as "Not a Contribution." + +## Grant of Copyright License + +Subject to the terms and conditions of this Agreement, You hereby grant to the Company and to recipients of software distributed by the Company a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sub license, and distribute Your Contributions and such derivative works. + +## Grant of Patent License + +Subject to the terms and conditions of this Agreement, You hereby grant to the Company and to recipients of software distributed by the Company a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by You that are necessarily infringed by Your Contribution(s) alone or by combination of Your Contribution(s) with the Work to which such Contribution(s) was submitted. If any entity institutes patent litigation against You or any other entity (including a cross-claim or counterclaim in a lawsuit) alleging that your Contribution, or the Work to which you have contributed, constitutes direct or contributory patent infringement, then any patent licenses granted to that entity under this Agreement for that Contribution or Work shall terminate as of the date such litigation is filed. + +## Authorization + +You represent that you are legally entitled to grant the above license. If your employer(s) has rights to intellectual property that you create that includes your Contributions, you represent that you have received permission to make Contributions on behalf of that employer, that your employer has waived such rights for your Contributions to the Company, or that your employer has executed a separate Corporate CLA with the Company. + +You represent that each of Your Contributions is Your original creation (see "Third-party Contribution" for submissions on behalf of others). You represent that Your Contribution submissions include complete details of any third-party license or other restriction (including, but not limited to, related patents and trademarks) of which you are personally aware and which are associated with any part of Your Contributions. + +## Support + +You are not expected to provide support for Your Contributions, except to the extent You desire to provide support. You may provide support for free, for a fee, or not at all. Unless required by applicable law or agreed to in writing, You provide Your Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON- INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. + +## Third-party Contribution + +Should You wish to submit work that is not Your original creation, You may submit it to the Company separately from any Contribution, identifying the complete details of its source and of any license or other restriction (including, but not limited to, related patents, trademarks, and license agreements) of which you are personally aware, and conspicuously marking the work as "Submitted on behalf of a third-party: [named here]". + +## Survival + +This Agreement shall govern all communications between the parties. You understand that this Agreement stays active even if the connection with You gets terminated unless the project the Company gets officially canceled by the project manager "Dennis Eichhorn". + +## Governing Law and Jurisdiction + +This Agreement shall be governed exclusively by German law. The courts of Hessen, Germany shall have exclusive jurisdiction. + +## Entire Agreement + +This agreement constitutes the entire agreement and supersedes all prior or contemporaneous oral or written agreements concerning such Contribution. This agreement may only be changed by mutual agreement of authorized representatives of the parties in writing. You agree to notify the Company of any facts or circumstances of which you become aware that would make these representations inaccurate in any respect. \ No newline at end of file From 35aba28ba8c90364655be825ed05d5617bbdc0cf Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Tue, 19 Apr 2022 23:37:06 +0200 Subject: [PATCH 052/133] update php version --- .github/workflows/main.yml | 2 -- Admin/Install/Admin.install.php | 2 +- Admin/Install/Media.php | 2 +- Admin/Install/Navigation.php | 2 +- Admin/Installer.php | 2 +- Admin/Routes/Web/Backend.php | 2 +- Admin/Status.php | 2 +- Admin/Uninstaller.php | 2 +- Admin/Updater.php | 2 +- Controller/ApiController.php | 2 +- Controller/BackendController.php | 2 +- Controller/Controller.php | 2 +- Models/Contract.php | 2 +- Models/ContractMapper.php | 2 +- Models/ContractType.php | 2 +- Models/ContractTypeL11n.php | 2 +- Models/ContractTypeL11nMapper.php | 2 +- Models/ContractTypeMapper.php | 2 +- Models/NullContract.php | 2 +- Models/NullContractType.php | 2 +- Models/NullContractTypeL11n.php | 2 +- Models/PermissionCategory.php | 2 +- Models/SettingsEnum.php | 2 +- Theme/Backend/Lang/Navigation.ar.lang.php | 2 +- Theme/Backend/Lang/Navigation.cs.lang.php | 2 +- Theme/Backend/Lang/Navigation.da.lang.php | 2 +- Theme/Backend/Lang/Navigation.de.lang.php | 2 +- Theme/Backend/Lang/Navigation.el.lang.php | 2 +- Theme/Backend/Lang/Navigation.en.lang.php | 2 +- Theme/Backend/Lang/Navigation.es.lang.php | 2 +- Theme/Backend/Lang/Navigation.fi.lang.php | 2 +- Theme/Backend/Lang/Navigation.fr.lang.php | 2 +- Theme/Backend/Lang/Navigation.hu.lang.php | 2 +- Theme/Backend/Lang/Navigation.it.lang.php | 2 +- Theme/Backend/Lang/Navigation.ja.lang.php | 2 +- Theme/Backend/Lang/Navigation.ko.lang.php | 2 +- Theme/Backend/Lang/Navigation.no.lang.php | 2 +- Theme/Backend/Lang/Navigation.pl.lang.php | 2 +- Theme/Backend/Lang/Navigation.pt.lang.php | 2 +- Theme/Backend/Lang/Navigation.ru.lang.php | 2 +- Theme/Backend/Lang/Navigation.sv.lang.php | 2 +- Theme/Backend/Lang/Navigation.th.lang.php | 2 +- Theme/Backend/Lang/Navigation.tr.lang.php | 2 +- Theme/Backend/Lang/Navigation.uk.lang.php | 2 +- Theme/Backend/Lang/Navigation.zh.lang.php | 2 +- Theme/Backend/Lang/ar.lang.php | 2 +- Theme/Backend/Lang/cs.lang.php | 2 +- Theme/Backend/Lang/da.lang.php | 2 +- Theme/Backend/Lang/de.lang.php | 2 +- Theme/Backend/Lang/el.lang.php | 2 +- Theme/Backend/Lang/en.lang.php | 2 +- Theme/Backend/Lang/es.lang.php | 2 +- Theme/Backend/Lang/fi.lang.php | 2 +- Theme/Backend/Lang/fr.lang.php | 2 +- Theme/Backend/Lang/hu.lang.php | 2 +- Theme/Backend/Lang/it.lang.php | 2 +- Theme/Backend/Lang/ja.lang.php | 2 +- Theme/Backend/Lang/ko.lang.php | 2 +- Theme/Backend/Lang/no.lang.php | 2 +- Theme/Backend/Lang/pl.lang.php | 2 +- Theme/Backend/Lang/pt.lang.php | 2 +- Theme/Backend/Lang/ru.lang.php | 2 +- Theme/Backend/Lang/sv.lang.php | 2 +- Theme/Backend/Lang/th.lang.php | 2 +- Theme/Backend/Lang/tr.lang.php | 2 +- Theme/Backend/Lang/uk.lang.php | 2 +- Theme/Backend/Lang/zh.lang.php | 2 +- Theme/Backend/contract-list.tpl.php | 2 +- Theme/Backend/contract-single.tpl.php | 2 +- tests/Admin/AdminTest.php | 2 +- tests/Controller/ApiControllerTest.php | 2 +- tests/Models/ContractTest.php | 2 +- tests/Models/ContractTypeL11nTest.php | 2 +- tests/Models/ContractTypeTest.php | 2 +- tests/Models/NullContractTest.php | 2 +- tests/Models/NullContractTypeL11nTest.php | 2 +- tests/Models/NullContractTypeTest.php | 2 +- 77 files changed, 76 insertions(+), 78 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3bb205d..01f0653 100755 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -284,8 +284,6 @@ jobs: if [[ $(find ./ -name "*tpl.php" | xargs grep -P '(style=)') -ne "" ]]; then exit 1; fi if [[ $(find ./ -name "*tpl.php" | xargs grep -P '(value|title|alt|aria\-label)(=\")((?!\<\?).)*(>)') -ne "" ]]; then exit 1; fi if [[ $(find ./ -name "*tpl.php" | xargs grep -P '(\|\|\|\)) -ne "" ]]; then exit 1; fi - - name: Js strict - run: if [[ $(grep -r -L "\"use strict\";" --include=*.js ./) -ne "" ]]; then exit 1; fi - name: Js inspection run: | if [[ $(grep -rlni "onafterprint=\|onbeforeprint=\|onbeforeunload=\|onerror=\|onhaschange=\|onload=\|onmessage=\|onoffline=\|ononline=\|onpagehide=\|onpageshow=\|onpopstate=\|onredo=\|onresize=\|onstorage=\|onund=o\|onunload=\|onblur=\|onchage=\|oncontextmenu=\|onfocus=\|onformchange=\|onforminput=\|oninput=\|oninvalid=\|onreset=\|onselect=\|onsubmit=\|onkeydown=\|onkeypress=\|onkeyup=\|onclick=\|ondblclic=k\|ondrag=\|ondragend=\|ondragenter=\|ondragleave=\|ondragover=\|ondragstart=\|ondrop=\|onmousedown=\|onmousemove=\|onmouseout=\|onmouseover=\|onmouseup=\|onmousewheel=\|onscroll=\|onabor=t\|oncanplay=\|oncanplaythrough=\|ondurationchange=\|onemptied=\|onended=\|onerror=\|onloadeddata=\|onloadedmetadata=\|onloadstart=\|onpause=\|onplay=\|onplaying=\|onprogress=\|onratechange=\|onreadystatechange=\|onseeked=\|onseeking=\|onstalled=\|onsuspend=\|ontimeupdate=\|onvolumechange=" --include=*.js ./) -ne "" ]]; then exit 1; fi diff --git a/Admin/Install/Admin.install.php b/Admin/Install/Admin.install.php index 723ae21..31ec307 100644 --- a/Admin/Install/Admin.install.php +++ b/Admin/Install/Admin.install.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\ContractManagement\Admin * @copyright Dennis Eichhorn diff --git a/Admin/Install/Media.php b/Admin/Install/Media.php index de619d9..986f20c 100644 --- a/Admin/Install/Media.php +++ b/Admin/Install/Media.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\ContractManagement\Admin\Install * @copyright Dennis Eichhorn diff --git a/Admin/Install/Navigation.php b/Admin/Install/Navigation.php index 41b9a57..ba6fe2b 100755 --- a/Admin/Install/Navigation.php +++ b/Admin/Install/Navigation.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\ContractManagement\Admin\Install * @copyright Dennis Eichhorn diff --git a/Admin/Installer.php b/Admin/Installer.php index 3933990..408d124 100755 --- a/Admin/Installer.php +++ b/Admin/Installer.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\ContractManagement\Admin * @copyright Dennis Eichhorn diff --git a/Admin/Routes/Web/Backend.php b/Admin/Routes/Web/Backend.php index 82fb566..6f11eff 100755 --- a/Admin/Routes/Web/Backend.php +++ b/Admin/Routes/Web/Backend.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules * @copyright Dennis Eichhorn diff --git a/Admin/Status.php b/Admin/Status.php index d1d88a5..e47d2d7 100755 --- a/Admin/Status.php +++ b/Admin/Status.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\ContractManagement\Admin * @copyright Dennis Eichhorn diff --git a/Admin/Uninstaller.php b/Admin/Uninstaller.php index 400ddb6..294d432 100755 --- a/Admin/Uninstaller.php +++ b/Admin/Uninstaller.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\ContractManagement\Admin * @copyright Dennis Eichhorn diff --git a/Admin/Updater.php b/Admin/Updater.php index 4b5b628..d74ee02 100755 --- a/Admin/Updater.php +++ b/Admin/Updater.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\ContractManagement\Admin * @copyright Dennis Eichhorn diff --git a/Controller/ApiController.php b/Controller/ApiController.php index e9621d6..36380ae 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\ContractManagement * @copyright Dennis Eichhorn diff --git a/Controller/BackendController.php b/Controller/BackendController.php index 875763b..f604de3 100755 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\ContractManagement * @copyright Dennis Eichhorn diff --git a/Controller/Controller.php b/Controller/Controller.php index d814a40..36f9365 100755 --- a/Controller/Controller.php +++ b/Controller/Controller.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\ContractManagement * @copyright Dennis Eichhorn diff --git a/Models/Contract.php b/Models/Contract.php index c48788d..c4395f5 100755 --- a/Models/Contract.php +++ b/Models/Contract.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\ContractManagement\Models * @copyright Dennis Eichhorn diff --git a/Models/ContractMapper.php b/Models/ContractMapper.php index 03b81a6..7fb5dee 100755 --- a/Models/ContractMapper.php +++ b/Models/ContractMapper.php @@ -3,7 +3,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\ContractManagement\Models * @copyright Dennis Eichhorn diff --git a/Models/ContractType.php b/Models/ContractType.php index a484441..5a80c85 100755 --- a/Models/ContractType.php +++ b/Models/ContractType.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\ContractManagement\Models * @copyright Dennis Eichhorn diff --git a/Models/ContractTypeL11n.php b/Models/ContractTypeL11n.php index db28998..9325f58 100755 --- a/Models/ContractTypeL11n.php +++ b/Models/ContractTypeL11n.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\ContractManagement\Models * @copyright Dennis Eichhorn diff --git a/Models/ContractTypeL11nMapper.php b/Models/ContractTypeL11nMapper.php index ef67783..b72a272 100755 --- a/Models/ContractTypeL11nMapper.php +++ b/Models/ContractTypeL11nMapper.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\ContractManagement\Models * @copyright Dennis Eichhorn diff --git a/Models/ContractTypeMapper.php b/Models/ContractTypeMapper.php index 2ae9bbf..70dd259 100755 --- a/Models/ContractTypeMapper.php +++ b/Models/ContractTypeMapper.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\ContractManagement\Models * @copyright Dennis Eichhorn diff --git a/Models/NullContract.php b/Models/NullContract.php index 9980120..93694fb 100755 --- a/Models/NullContract.php +++ b/Models/NullContract.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\ContractManagement\Models * @copyright Dennis Eichhorn diff --git a/Models/NullContractType.php b/Models/NullContractType.php index 010c339..9a75955 100755 --- a/Models/NullContractType.php +++ b/Models/NullContractType.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\ContractManagement\Models * @copyright Dennis Eichhorn diff --git a/Models/NullContractTypeL11n.php b/Models/NullContractTypeL11n.php index 83733a3..d232979 100755 --- a/Models/NullContractTypeL11n.php +++ b/Models/NullContractTypeL11n.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\ContractManagement\Models * @copyright Dennis Eichhorn diff --git a/Models/PermissionCategory.php b/Models/PermissionCategory.php index 1130453..175dcdf 100755 --- a/Models/PermissionCategory.php +++ b/Models/PermissionCategory.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\ContractManagement\Models * @copyright Dennis Eichhorn diff --git a/Models/SettingsEnum.php b/Models/SettingsEnum.php index b1d76d4..432905b 100644 --- a/Models/SettingsEnum.php +++ b/Models/SettingsEnum.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\ContractManagement\Models * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/Navigation.ar.lang.php b/Theme/Backend/Lang/Navigation.ar.lang.php index 781d31c..6297f0e 100644 --- a/Theme/Backend/Lang/Navigation.ar.lang.php +++ b/Theme/Backend/Lang/Navigation.ar.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/Navigation.cs.lang.php b/Theme/Backend/Lang/Navigation.cs.lang.php index a57a8c3..375b66a 100644 --- a/Theme/Backend/Lang/Navigation.cs.lang.php +++ b/Theme/Backend/Lang/Navigation.cs.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/Navigation.da.lang.php b/Theme/Backend/Lang/Navigation.da.lang.php index 277eded..c45dff6 100644 --- a/Theme/Backend/Lang/Navigation.da.lang.php +++ b/Theme/Backend/Lang/Navigation.da.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/Navigation.de.lang.php b/Theme/Backend/Lang/Navigation.de.lang.php index 6e1c92c..6e62f8f 100644 --- a/Theme/Backend/Lang/Navigation.de.lang.php +++ b/Theme/Backend/Lang/Navigation.de.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/Navigation.el.lang.php b/Theme/Backend/Lang/Navigation.el.lang.php index 44ad979..fdfd374 100644 --- a/Theme/Backend/Lang/Navigation.el.lang.php +++ b/Theme/Backend/Lang/Navigation.el.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/Navigation.en.lang.php b/Theme/Backend/Lang/Navigation.en.lang.php index 6923de4..5ec3fd1 100644 --- a/Theme/Backend/Lang/Navigation.en.lang.php +++ b/Theme/Backend/Lang/Navigation.en.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/Navigation.es.lang.php b/Theme/Backend/Lang/Navigation.es.lang.php index ae090b8..76883c7 100644 --- a/Theme/Backend/Lang/Navigation.es.lang.php +++ b/Theme/Backend/Lang/Navigation.es.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/Navigation.fi.lang.php b/Theme/Backend/Lang/Navigation.fi.lang.php index 944ca7d..e10a5e4 100644 --- a/Theme/Backend/Lang/Navigation.fi.lang.php +++ b/Theme/Backend/Lang/Navigation.fi.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/Navigation.fr.lang.php b/Theme/Backend/Lang/Navigation.fr.lang.php index bfa048a..af588a4 100644 --- a/Theme/Backend/Lang/Navigation.fr.lang.php +++ b/Theme/Backend/Lang/Navigation.fr.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/Navigation.hu.lang.php b/Theme/Backend/Lang/Navigation.hu.lang.php index 0fc4ea2..86621d1 100644 --- a/Theme/Backend/Lang/Navigation.hu.lang.php +++ b/Theme/Backend/Lang/Navigation.hu.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/Navigation.it.lang.php b/Theme/Backend/Lang/Navigation.it.lang.php index 23392e4..691e4a5 100644 --- a/Theme/Backend/Lang/Navigation.it.lang.php +++ b/Theme/Backend/Lang/Navigation.it.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/Navigation.ja.lang.php b/Theme/Backend/Lang/Navigation.ja.lang.php index 73e2f44..0384dcd 100644 --- a/Theme/Backend/Lang/Navigation.ja.lang.php +++ b/Theme/Backend/Lang/Navigation.ja.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/Navigation.ko.lang.php b/Theme/Backend/Lang/Navigation.ko.lang.php index b02bdf1..f88c550 100644 --- a/Theme/Backend/Lang/Navigation.ko.lang.php +++ b/Theme/Backend/Lang/Navigation.ko.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/Navigation.no.lang.php b/Theme/Backend/Lang/Navigation.no.lang.php index 538a854..18083e0 100644 --- a/Theme/Backend/Lang/Navigation.no.lang.php +++ b/Theme/Backend/Lang/Navigation.no.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/Navigation.pl.lang.php b/Theme/Backend/Lang/Navigation.pl.lang.php index 536f1a1..ce66cd3 100644 --- a/Theme/Backend/Lang/Navigation.pl.lang.php +++ b/Theme/Backend/Lang/Navigation.pl.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/Navigation.pt.lang.php b/Theme/Backend/Lang/Navigation.pt.lang.php index acd9f36..79d1049 100644 --- a/Theme/Backend/Lang/Navigation.pt.lang.php +++ b/Theme/Backend/Lang/Navigation.pt.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/Navigation.ru.lang.php b/Theme/Backend/Lang/Navigation.ru.lang.php index 056e7c3..b770676 100644 --- a/Theme/Backend/Lang/Navigation.ru.lang.php +++ b/Theme/Backend/Lang/Navigation.ru.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/Navigation.sv.lang.php b/Theme/Backend/Lang/Navigation.sv.lang.php index 691f405..a967eba 100644 --- a/Theme/Backend/Lang/Navigation.sv.lang.php +++ b/Theme/Backend/Lang/Navigation.sv.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/Navigation.th.lang.php b/Theme/Backend/Lang/Navigation.th.lang.php index 03047c8..d736573 100644 --- a/Theme/Backend/Lang/Navigation.th.lang.php +++ b/Theme/Backend/Lang/Navigation.th.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/Navigation.tr.lang.php b/Theme/Backend/Lang/Navigation.tr.lang.php index d57c594..637467d 100644 --- a/Theme/Backend/Lang/Navigation.tr.lang.php +++ b/Theme/Backend/Lang/Navigation.tr.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/Navigation.uk.lang.php b/Theme/Backend/Lang/Navigation.uk.lang.php index 744c97b..cfa4e27 100644 --- a/Theme/Backend/Lang/Navigation.uk.lang.php +++ b/Theme/Backend/Lang/Navigation.uk.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/Navigation.zh.lang.php b/Theme/Backend/Lang/Navigation.zh.lang.php index 313888f..1a1f26a 100644 --- a/Theme/Backend/Lang/Navigation.zh.lang.php +++ b/Theme/Backend/Lang/Navigation.zh.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/ar.lang.php b/Theme/Backend/Lang/ar.lang.php index 93ff068..8d8b2c6 100644 --- a/Theme/Backend/Lang/ar.lang.php +++ b/Theme/Backend/Lang/ar.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/cs.lang.php b/Theme/Backend/Lang/cs.lang.php index 3870907..5b19dd5 100644 --- a/Theme/Backend/Lang/cs.lang.php +++ b/Theme/Backend/Lang/cs.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/da.lang.php b/Theme/Backend/Lang/da.lang.php index 7df1dd9..0217524 100644 --- a/Theme/Backend/Lang/da.lang.php +++ b/Theme/Backend/Lang/da.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/de.lang.php b/Theme/Backend/Lang/de.lang.php index cc18fe7..663ef46 100644 --- a/Theme/Backend/Lang/de.lang.php +++ b/Theme/Backend/Lang/de.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/el.lang.php b/Theme/Backend/Lang/el.lang.php index 86c9c66..640a9ad 100644 --- a/Theme/Backend/Lang/el.lang.php +++ b/Theme/Backend/Lang/el.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/en.lang.php b/Theme/Backend/Lang/en.lang.php index fa0aafa..061b393 100644 --- a/Theme/Backend/Lang/en.lang.php +++ b/Theme/Backend/Lang/en.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/es.lang.php b/Theme/Backend/Lang/es.lang.php index e28b8f8..cbaa822 100644 --- a/Theme/Backend/Lang/es.lang.php +++ b/Theme/Backend/Lang/es.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/fi.lang.php b/Theme/Backend/Lang/fi.lang.php index 25e015d..512ef06 100644 --- a/Theme/Backend/Lang/fi.lang.php +++ b/Theme/Backend/Lang/fi.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/fr.lang.php b/Theme/Backend/Lang/fr.lang.php index 2ab12e4..31750bf 100644 --- a/Theme/Backend/Lang/fr.lang.php +++ b/Theme/Backend/Lang/fr.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/hu.lang.php b/Theme/Backend/Lang/hu.lang.php index d945424..396688f 100644 --- a/Theme/Backend/Lang/hu.lang.php +++ b/Theme/Backend/Lang/hu.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/it.lang.php b/Theme/Backend/Lang/it.lang.php index 37a29b7..cda9d41 100644 --- a/Theme/Backend/Lang/it.lang.php +++ b/Theme/Backend/Lang/it.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/ja.lang.php b/Theme/Backend/Lang/ja.lang.php index c26bf33..abb7fc1 100644 --- a/Theme/Backend/Lang/ja.lang.php +++ b/Theme/Backend/Lang/ja.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/ko.lang.php b/Theme/Backend/Lang/ko.lang.php index 5c753ea..c2a7f1c 100644 --- a/Theme/Backend/Lang/ko.lang.php +++ b/Theme/Backend/Lang/ko.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/no.lang.php b/Theme/Backend/Lang/no.lang.php index 2996f89..2343349 100644 --- a/Theme/Backend/Lang/no.lang.php +++ b/Theme/Backend/Lang/no.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/pl.lang.php b/Theme/Backend/Lang/pl.lang.php index 8ceb802..2fb44fc 100644 --- a/Theme/Backend/Lang/pl.lang.php +++ b/Theme/Backend/Lang/pl.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/pt.lang.php b/Theme/Backend/Lang/pt.lang.php index 9c9fc2f..b419fa8 100644 --- a/Theme/Backend/Lang/pt.lang.php +++ b/Theme/Backend/Lang/pt.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/ru.lang.php b/Theme/Backend/Lang/ru.lang.php index 314b841..bf07d1b 100644 --- a/Theme/Backend/Lang/ru.lang.php +++ b/Theme/Backend/Lang/ru.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/sv.lang.php b/Theme/Backend/Lang/sv.lang.php index 79e1f18..da45f76 100644 --- a/Theme/Backend/Lang/sv.lang.php +++ b/Theme/Backend/Lang/sv.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/th.lang.php b/Theme/Backend/Lang/th.lang.php index 0595e49..073fb57 100644 --- a/Theme/Backend/Lang/th.lang.php +++ b/Theme/Backend/Lang/th.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/tr.lang.php b/Theme/Backend/Lang/tr.lang.php index 2c43a41..4e0ba5a 100644 --- a/Theme/Backend/Lang/tr.lang.php +++ b/Theme/Backend/Lang/tr.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/uk.lang.php b/Theme/Backend/Lang/uk.lang.php index e601d51..4143074 100644 --- a/Theme/Backend/Lang/uk.lang.php +++ b/Theme/Backend/Lang/uk.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/Lang/zh.lang.php b/Theme/Backend/Lang/zh.lang.php index 6b4edc1..82e2982 100644 --- a/Theme/Backend/Lang/zh.lang.php +++ b/Theme/Backend/Lang/zh.lang.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\Localization * @copyright Dennis Eichhorn diff --git a/Theme/Backend/contract-list.tpl.php b/Theme/Backend/contract-list.tpl.php index fbef0ac..5a3e83c 100755 --- a/Theme/Backend/contract-list.tpl.php +++ b/Theme/Backend/contract-list.tpl.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\ContractManagement * @copyright Dennis Eichhorn diff --git a/Theme/Backend/contract-single.tpl.php b/Theme/Backend/contract-single.tpl.php index 5139dc5..a5142a4 100755 --- a/Theme/Backend/contract-single.tpl.php +++ b/Theme/Backend/contract-single.tpl.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package Modules\ContractManagement * @copyright Dennis Eichhorn diff --git a/tests/Admin/AdminTest.php b/tests/Admin/AdminTest.php index 37f30e5..6fe499e 100644 --- a/tests/Admin/AdminTest.php +++ b/tests/Admin/AdminTest.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package tests * @copyright Dennis Eichhorn diff --git a/tests/Controller/ApiControllerTest.php b/tests/Controller/ApiControllerTest.php index fb9ffe7..9e759b8 100644 --- a/tests/Controller/ApiControllerTest.php +++ b/tests/Controller/ApiControllerTest.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package tests * @copyright Dennis Eichhorn diff --git a/tests/Models/ContractTest.php b/tests/Models/ContractTest.php index cbb70d1..0401886 100644 --- a/tests/Models/ContractTest.php +++ b/tests/Models/ContractTest.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package tests * @copyright Dennis Eichhorn diff --git a/tests/Models/ContractTypeL11nTest.php b/tests/Models/ContractTypeL11nTest.php index c44bdff..714a9d4 100644 --- a/tests/Models/ContractTypeL11nTest.php +++ b/tests/Models/ContractTypeL11nTest.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package tests * @copyright Dennis Eichhorn diff --git a/tests/Models/ContractTypeTest.php b/tests/Models/ContractTypeTest.php index 856b025..55ef2f5 100644 --- a/tests/Models/ContractTypeTest.php +++ b/tests/Models/ContractTypeTest.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package tests * @copyright Dennis Eichhorn diff --git a/tests/Models/NullContractTest.php b/tests/Models/NullContractTest.php index 29d4863..58cbded 100644 --- a/tests/Models/NullContractTest.php +++ b/tests/Models/NullContractTest.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package tests * @copyright Dennis Eichhorn diff --git a/tests/Models/NullContractTypeL11nTest.php b/tests/Models/NullContractTypeL11nTest.php index cd60bcb..da3dc2c 100644 --- a/tests/Models/NullContractTypeL11nTest.php +++ b/tests/Models/NullContractTypeL11nTest.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package tests * @copyright Dennis Eichhorn diff --git a/tests/Models/NullContractTypeTest.php b/tests/Models/NullContractTypeTest.php index 0fa796e..4e0c991 100644 --- a/tests/Models/NullContractTypeTest.php +++ b/tests/Models/NullContractTypeTest.php @@ -2,7 +2,7 @@ /** * Karaka * - * PHP Version 8.0 + * PHP Version 8.1 * * @package tests * @copyright Dennis Eichhorn From d604bb1afcaf80fd802f90a5e6e8d6992e3613ce Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Thu, 21 Apr 2022 23:52:00 +0200 Subject: [PATCH 053/133] doc fixes --- Controller/ApiController.php | 8 ++++---- Controller/BackendController.php | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Controller/ApiController.php b/Controller/ApiController.php index 36380ae..f728dd1 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -53,7 +53,7 @@ final class ApiController extends Controller * * @since 1.0.0 */ - public function apiContractCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + public function apiContractCreate(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : void { if (!empty($val = $this->validateContractCreate($request))) { $response->set('contract_create', new FormValidation($val)); @@ -131,7 +131,7 @@ final class ApiController extends Controller * * @since 1.0.0 */ - public function apiContractDocumentCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + public function apiContractDocumentCreate(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : void { $uploadedFiles = $request->getFiles(); @@ -176,7 +176,7 @@ final class ApiController extends Controller * * @since 1.0.0 */ - public function apiContractTypeCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + public function apiContractTypeCreate(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : void { if (!empty($val = $this->validateContractTypeCreate($request))) { $response->set('contract_type_create', new FormValidation($val)); @@ -241,7 +241,7 @@ final class ApiController extends Controller * * @since 1.0.0 */ - public function apiContractTypeL11nCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + public function apiContractTypeL11nCreate(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : void { if (!empty($val = $this->validateContractTypeL11nCreate($request))) { $response->set('contract_type_create', new FormValidation($val)); diff --git a/Controller/BackendController.php b/Controller/BackendController.php index f604de3..d7fc461 100755 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -46,7 +46,7 @@ final class BackendController extends Controller * @since 1.0.0 * @codeCoverageIgnore */ - public function viewContractList(RequestAbstract $request, ResponseAbstract $response, $data = null) : RenderableInterface + public function viewContractList(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : RenderableInterface { $view = new View($this->app->l11nManager, $request, $response); @@ -82,7 +82,7 @@ final class BackendController extends Controller * @since 1.0.0 * @codeCoverageIgnore */ - public function viewContract(RequestAbstract $request, ResponseAbstract $response, $data = null) : RenderableInterface + public function viewContract(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : RenderableInterface { $view = new View($this->app->l11nManager, $request, $response); From fe16c605b54ad94de30de8a239657d7f9adac679 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sat, 23 Apr 2022 16:30:47 +0200 Subject: [PATCH 054/133] fixes --- .github/workflows/main.yml | 44 +------------------------------------- 1 file changed, 1 insertion(+), 43 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 01f0653..80098e9 100755 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -217,7 +217,7 @@ jobs: - name: Setup Composer run: composer install - name: phpcs - run: vendor/bin/phpcs ./ --standard="Build/Config/phpcs.xml" -s --report=full + run: vendor/bin/phpcs --severity=1 ./ --standard="Build/Config/phpcs.xml" -s --report=full - name: Install NPM uses: actions/setup-node@v3 with: @@ -245,45 +245,3 @@ jobs: VALIDATE_ALL_CODEBASE: false DEFAULT_BRANCH: develop GITHUB_TOKEN: ${{ secrets.GH_PAT }} - custom: - runs-on: ubuntu-latest - if: "!contains(github.event.head_commit.message, 'NO_CI')" - strategy: - fail-fast: false - max-parallel: 3 - matrix: - php-versions: ['8.0'] - steps: - - name: Checkout Repository - uses: actions/checkout@main - with: - fetch-depth: 1 - - name: Checkout Build Repository - uses: actions/checkout@main - with: - fetch-depth: 1 - ref: develop - repository: Karaka-Management/Build - path: Build - - name: Setup PHP, with composer and extensions - uses: shivammathur/setup-php@master - with: - php-version: ${{ matrix.php-versions }} - extensions: mbstring, gd, zip, dom, mysql, pgsql, sqlite, imap, bcmath, redis, memcached - ini-values: opcache.jit_buffer_size=256M, opcache.jit=1235, pcre.jit=1 - - name: PHP linting - run: find ./ -type f -name '*.php' -print0 | xargs -0 -n1 -P4 php -l -n | (! grep -v "No syntax errors detected" ) - - name: Php strict - run: if [[ $(grep -r -L "declare(strict_types=1);" --include=*.php --exclude={*.tpl.php,*Hooks.php,*Routes.php,*SearchCommands.php} ./) -ne "" ]]; then exit 1; fi - - name: Html inspection - run: | - if [[ $(find ./ -name "*tpl.php" | xargs grep -E '=\"[\#\$\%\^\&\*\(\)\\/\ ]*\"') -ne "" ]]; then exit 1; fi - if [[ $(find ./ -name "*tpl.php" | xargs grep -P '(\)') -ne "" ]]; then exit 1; fi - if [[ $(find ./ -name "*tpl.php" | xargs grep -P '()') -ne "" ]]; then exit 1; fi - if [[ $(find ./ -name "*tpl.php" | xargs grep -P '()') -ne "" ]]; then exit 1; fi - if [[ $(find ./ -name "*tpl.php" | xargs grep -P '(style=)') -ne "" ]]; then exit 1; fi - if [[ $(find ./ -name "*tpl.php" | xargs grep -P '(value|title|alt|aria\-label)(=\")((?!\<\?).)*(>)') -ne "" ]]; then exit 1; fi - if [[ $(find ./ -name "*tpl.php" | xargs grep -P '(\|\|\|\)) -ne "" ]]; then exit 1; fi - - name: Js inspection - run: | - if [[ $(grep -rlni "onafterprint=\|onbeforeprint=\|onbeforeunload=\|onerror=\|onhaschange=\|onload=\|onmessage=\|onoffline=\|ononline=\|onpagehide=\|onpageshow=\|onpopstate=\|onredo=\|onresize=\|onstorage=\|onund=o\|onunload=\|onblur=\|onchage=\|oncontextmenu=\|onfocus=\|onformchange=\|onforminput=\|oninput=\|oninvalid=\|onreset=\|onselect=\|onsubmit=\|onkeydown=\|onkeypress=\|onkeyup=\|onclick=\|ondblclic=k\|ondrag=\|ondragend=\|ondragenter=\|ondragleave=\|ondragover=\|ondragstart=\|ondrop=\|onmousedown=\|onmousemove=\|onmouseout=\|onmouseover=\|onmouseup=\|onmousewheel=\|onscroll=\|onabor=t\|oncanplay=\|oncanplaythrough=\|ondurationchange=\|onemptied=\|onended=\|onerror=\|onloadeddata=\|onloadedmetadata=\|onloadstart=\|onpause=\|onplay=\|onplaying=\|onprogress=\|onratechange=\|onreadystatechange=\|onseeked=\|onseeking=\|onstalled=\|onsuspend=\|ontimeupdate=\|onvolumechange=" --include=*.js ./) -ne "" ]]; then exit 1; fi From fc982ea4bd9a3e255dba76732b2577225a8c602a Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Fri, 30 Sep 2022 00:37:11 +0200 Subject: [PATCH 055/133] workflow fix --- .github/workflows/main.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 80098e9..05f5df8 100755 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -73,7 +73,7 @@ jobs: fail-fast: false max-parallel: 3 matrix: - php-versions: ['8.0'] + php-versions: ['8.1'] steps: - name: Checkout Repository uses: actions/checkout@main @@ -135,7 +135,7 @@ jobs: fail-fast: false max-parallel: 3 matrix: - php-versions: ['8.0'] + php-versions: ['8.1'] steps: - name: Checkout Repository uses: actions/checkout@main @@ -184,7 +184,7 @@ jobs: fail-fast: false max-parallel: 3 matrix: - php-versions: ['8.0'] + php-versions: ['8.1'] steps: - name: Checkout Repository uses: actions/checkout@main @@ -240,7 +240,7 @@ jobs: submodules: recursive token: ${{ secrets.GH_PAT }} - name: Lint Code Base - uses: github/super-linter@v4 + uses: github/super-linter/slim@v4 env: VALIDATE_ALL_CODEBASE: false DEFAULT_BRANCH: develop From 353447994efb55a0af3b3f4e5a8d4089616cdc41 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sat, 1 Oct 2022 18:03:49 +0200 Subject: [PATCH 056/133] update workflows --- .github/workflows/main.yml | 58 ++++++++++++++++++++++++++++++-------- 1 file changed, 46 insertions(+), 12 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 05f5df8..6dcd721 100755 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,6 +1,6 @@ -name: CI/CD +name: CI -on: [push] +on: [push, pull_request] jobs: autoformat: @@ -226,22 +226,56 @@ jobs: - run: npm install - name: eslint run: npx eslint ./ -c Build/Config/.eslintrc.json - linting: +# linting: +# runs-on: ubuntu-latest +# if: "!contains(github.event.head_commit.message, 'NO_CI')" +# strategy: +# fail-fast: false +# max-parallel: 3 +# steps: +# - name: Checkout Repository +# uses: actions/checkout@main +# with: +# fetch-depth: 0 +# submodules: recursive +# token: ${{ secrets.GH_TOKEN }} +# - name: Lint Code Base +# uses: github/super-linter/slim@v4 +# env: +# VALIDATE_ALL_CODEBASE: false +# VALIDATE_PHP: true +# VALIDATE_PHP_BUILTIN: true +# DEFAULT_BRANCH: develop +# GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} + custom: runs-on: ubuntu-latest if: "!contains(github.event.head_commit.message, 'NO_CI')" strategy: fail-fast: false max-parallel: 3 + matrix: + php-versions: ['8.1'] steps: - name: Checkout Repository uses: actions/checkout@main with: - fetch-depth: 0 - submodules: recursive - token: ${{ secrets.GH_PAT }} - - name: Lint Code Base - uses: github/super-linter/slim@v4 - env: - VALIDATE_ALL_CODEBASE: false - DEFAULT_BRANCH: develop - GITHUB_TOKEN: ${{ secrets.GH_PAT }} + fetch-depth: 1 + - name: Checkout Build Repository + uses: actions/checkout@main + with: + fetch-depth: 1 + ref: develop + repository: Karaka-Management/Build + path: Build + - name: Setup PHP, with composer and extensions + uses: shivammathur/setup-php@master + with: + php-version: ${{ matrix.php-versions }} + extensions: mbstring, gd, zip, dom, mysql, pgsql, sqlite, bcmath, redis, memcached + ini-values: opcache.jit_buffer_size=256M, opcache.jit=1235, pcre.jit=1 + - name: PHP linting + run: | + find ./ -type f \ + -name '*.php' -print0 | xargs -0 -n1 -P4 php -l -n | (! grep -v "No syntax errors detected" ) + - name: Php strict + run: if [[ $(grep -r -L "declare(strict_types=1);" --include=*.php --exclude={*.tpl.php,*Hooks.php,*Routes.php,*SearchCommands.php} ./) -ne "" ]]; then exit 1; fi From 2e6dd6ef3af48e90fdf3bcdff26275a518e208e0 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Wed, 9 Nov 2022 22:56:18 +0100 Subject: [PATCH 057/133] permission changes & minor bug fixes --- Admin/Install/Admin.install.php | 0 Admin/Install/Media.install.json | 0 Admin/Install/Media.php | 0 ICAL.txt | 0 Models/SettingsEnum.php | 0 Theme/Backend/Lang/Navigation.ar.lang.php | 0 Theme/Backend/Lang/Navigation.cs.lang.php | 0 Theme/Backend/Lang/Navigation.da.lang.php | 0 Theme/Backend/Lang/Navigation.de.lang.php | 0 Theme/Backend/Lang/Navigation.el.lang.php | 0 Theme/Backend/Lang/Navigation.en.lang.php | 0 Theme/Backend/Lang/Navigation.es.lang.php | 0 Theme/Backend/Lang/Navigation.fi.lang.php | 0 Theme/Backend/Lang/Navigation.fr.lang.php | 0 Theme/Backend/Lang/Navigation.hu.lang.php | 0 Theme/Backend/Lang/Navigation.it.lang.php | 0 Theme/Backend/Lang/Navigation.ja.lang.php | 0 Theme/Backend/Lang/Navigation.ko.lang.php | 0 Theme/Backend/Lang/Navigation.no.lang.php | 0 Theme/Backend/Lang/Navigation.pl.lang.php | 0 Theme/Backend/Lang/Navigation.pt.lang.php | 0 Theme/Backend/Lang/Navigation.ru.lang.php | 0 Theme/Backend/Lang/Navigation.sv.lang.php | 0 Theme/Backend/Lang/Navigation.th.lang.php | 0 Theme/Backend/Lang/Navigation.tr.lang.php | 0 Theme/Backend/Lang/Navigation.uk.lang.php | 0 Theme/Backend/Lang/Navigation.zh.lang.php | 0 Theme/Backend/Lang/ar.lang.php | 0 Theme/Backend/Lang/cs.lang.php | 0 Theme/Backend/Lang/da.lang.php | 0 Theme/Backend/Lang/de.lang.php | 0 Theme/Backend/Lang/el.lang.php | 0 Theme/Backend/Lang/en.lang.php | 0 Theme/Backend/Lang/es.lang.php | 0 Theme/Backend/Lang/fi.lang.php | 0 Theme/Backend/Lang/fr.lang.php | 0 Theme/Backend/Lang/hu.lang.php | 0 Theme/Backend/Lang/it.lang.php | 0 Theme/Backend/Lang/ja.lang.php | 0 Theme/Backend/Lang/ko.lang.php | 0 Theme/Backend/Lang/no.lang.php | 0 Theme/Backend/Lang/pl.lang.php | 0 Theme/Backend/Lang/pt.lang.php | 0 Theme/Backend/Lang/ru.lang.php | 0 Theme/Backend/Lang/sv.lang.php | 0 Theme/Backend/Lang/th.lang.php | 0 Theme/Backend/Lang/tr.lang.php | 0 Theme/Backend/Lang/uk.lang.php | 0 Theme/Backend/Lang/zh.lang.php | 0 Theme/Backend/contract-list.tpl.php | 8 ++++---- tests/Admin/AdminTest.php | 0 tests/Controller/ApiControllerTest.php | 0 tests/Controller/test.pdf | 0 tests/Models/ContractTest.php | 0 tests/Models/ContractTypeL11nTest.php | 0 tests/Models/ContractTypeTest.php | 0 tests/Models/NullContractTest.php | 0 tests/Models/NullContractTypeL11nTest.php | 0 tests/Models/NullContractTypeTest.php | 0 59 files changed, 4 insertions(+), 4 deletions(-) mode change 100644 => 100755 Admin/Install/Admin.install.php mode change 100644 => 100755 Admin/Install/Media.install.json mode change 100644 => 100755 Admin/Install/Media.php mode change 100644 => 100755 ICAL.txt mode change 100644 => 100755 Models/SettingsEnum.php mode change 100644 => 100755 Theme/Backend/Lang/Navigation.ar.lang.php mode change 100644 => 100755 Theme/Backend/Lang/Navigation.cs.lang.php mode change 100644 => 100755 Theme/Backend/Lang/Navigation.da.lang.php mode change 100644 => 100755 Theme/Backend/Lang/Navigation.de.lang.php mode change 100644 => 100755 Theme/Backend/Lang/Navigation.el.lang.php mode change 100644 => 100755 Theme/Backend/Lang/Navigation.en.lang.php mode change 100644 => 100755 Theme/Backend/Lang/Navigation.es.lang.php mode change 100644 => 100755 Theme/Backend/Lang/Navigation.fi.lang.php mode change 100644 => 100755 Theme/Backend/Lang/Navigation.fr.lang.php mode change 100644 => 100755 Theme/Backend/Lang/Navigation.hu.lang.php mode change 100644 => 100755 Theme/Backend/Lang/Navigation.it.lang.php mode change 100644 => 100755 Theme/Backend/Lang/Navigation.ja.lang.php mode change 100644 => 100755 Theme/Backend/Lang/Navigation.ko.lang.php mode change 100644 => 100755 Theme/Backend/Lang/Navigation.no.lang.php mode change 100644 => 100755 Theme/Backend/Lang/Navigation.pl.lang.php mode change 100644 => 100755 Theme/Backend/Lang/Navigation.pt.lang.php mode change 100644 => 100755 Theme/Backend/Lang/Navigation.ru.lang.php mode change 100644 => 100755 Theme/Backend/Lang/Navigation.sv.lang.php mode change 100644 => 100755 Theme/Backend/Lang/Navigation.th.lang.php mode change 100644 => 100755 Theme/Backend/Lang/Navigation.tr.lang.php mode change 100644 => 100755 Theme/Backend/Lang/Navigation.uk.lang.php mode change 100644 => 100755 Theme/Backend/Lang/Navigation.zh.lang.php mode change 100644 => 100755 Theme/Backend/Lang/ar.lang.php mode change 100644 => 100755 Theme/Backend/Lang/cs.lang.php mode change 100644 => 100755 Theme/Backend/Lang/da.lang.php mode change 100644 => 100755 Theme/Backend/Lang/de.lang.php mode change 100644 => 100755 Theme/Backend/Lang/el.lang.php mode change 100644 => 100755 Theme/Backend/Lang/en.lang.php mode change 100644 => 100755 Theme/Backend/Lang/es.lang.php mode change 100644 => 100755 Theme/Backend/Lang/fi.lang.php mode change 100644 => 100755 Theme/Backend/Lang/fr.lang.php mode change 100644 => 100755 Theme/Backend/Lang/hu.lang.php mode change 100644 => 100755 Theme/Backend/Lang/it.lang.php mode change 100644 => 100755 Theme/Backend/Lang/ja.lang.php mode change 100644 => 100755 Theme/Backend/Lang/ko.lang.php mode change 100644 => 100755 Theme/Backend/Lang/no.lang.php mode change 100644 => 100755 Theme/Backend/Lang/pl.lang.php mode change 100644 => 100755 Theme/Backend/Lang/pt.lang.php mode change 100644 => 100755 Theme/Backend/Lang/ru.lang.php mode change 100644 => 100755 Theme/Backend/Lang/sv.lang.php mode change 100644 => 100755 Theme/Backend/Lang/th.lang.php mode change 100644 => 100755 Theme/Backend/Lang/tr.lang.php mode change 100644 => 100755 Theme/Backend/Lang/uk.lang.php mode change 100644 => 100755 Theme/Backend/Lang/zh.lang.php mode change 100644 => 100755 tests/Admin/AdminTest.php mode change 100644 => 100755 tests/Controller/ApiControllerTest.php mode change 100644 => 100755 tests/Controller/test.pdf mode change 100644 => 100755 tests/Models/ContractTest.php mode change 100644 => 100755 tests/Models/ContractTypeL11nTest.php mode change 100644 => 100755 tests/Models/ContractTypeTest.php mode change 100644 => 100755 tests/Models/NullContractTest.php mode change 100644 => 100755 tests/Models/NullContractTypeL11nTest.php mode change 100644 => 100755 tests/Models/NullContractTypeTest.php diff --git a/Admin/Install/Admin.install.php b/Admin/Install/Admin.install.php old mode 100644 new mode 100755 diff --git a/Admin/Install/Media.install.json b/Admin/Install/Media.install.json old mode 100644 new mode 100755 diff --git a/Admin/Install/Media.php b/Admin/Install/Media.php old mode 100644 new mode 100755 diff --git a/ICAL.txt b/ICAL.txt old mode 100644 new mode 100755 diff --git a/Models/SettingsEnum.php b/Models/SettingsEnum.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/Navigation.ar.lang.php b/Theme/Backend/Lang/Navigation.ar.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/Navigation.cs.lang.php b/Theme/Backend/Lang/Navigation.cs.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/Navigation.da.lang.php b/Theme/Backend/Lang/Navigation.da.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/Navigation.de.lang.php b/Theme/Backend/Lang/Navigation.de.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/Navigation.el.lang.php b/Theme/Backend/Lang/Navigation.el.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/Navigation.en.lang.php b/Theme/Backend/Lang/Navigation.en.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/Navigation.es.lang.php b/Theme/Backend/Lang/Navigation.es.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/Navigation.fi.lang.php b/Theme/Backend/Lang/Navigation.fi.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/Navigation.fr.lang.php b/Theme/Backend/Lang/Navigation.fr.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/Navigation.hu.lang.php b/Theme/Backend/Lang/Navigation.hu.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/Navigation.it.lang.php b/Theme/Backend/Lang/Navigation.it.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/Navigation.ja.lang.php b/Theme/Backend/Lang/Navigation.ja.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/Navigation.ko.lang.php b/Theme/Backend/Lang/Navigation.ko.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/Navigation.no.lang.php b/Theme/Backend/Lang/Navigation.no.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/Navigation.pl.lang.php b/Theme/Backend/Lang/Navigation.pl.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/Navigation.pt.lang.php b/Theme/Backend/Lang/Navigation.pt.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/Navigation.ru.lang.php b/Theme/Backend/Lang/Navigation.ru.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/Navigation.sv.lang.php b/Theme/Backend/Lang/Navigation.sv.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/Navigation.th.lang.php b/Theme/Backend/Lang/Navigation.th.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/Navigation.tr.lang.php b/Theme/Backend/Lang/Navigation.tr.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/Navigation.uk.lang.php b/Theme/Backend/Lang/Navigation.uk.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/Navigation.zh.lang.php b/Theme/Backend/Lang/Navigation.zh.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/ar.lang.php b/Theme/Backend/Lang/ar.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/cs.lang.php b/Theme/Backend/Lang/cs.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/da.lang.php b/Theme/Backend/Lang/da.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/de.lang.php b/Theme/Backend/Lang/de.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/el.lang.php b/Theme/Backend/Lang/el.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/en.lang.php b/Theme/Backend/Lang/en.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/es.lang.php b/Theme/Backend/Lang/es.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/fi.lang.php b/Theme/Backend/Lang/fi.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/fr.lang.php b/Theme/Backend/Lang/fr.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/hu.lang.php b/Theme/Backend/Lang/hu.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/it.lang.php b/Theme/Backend/Lang/it.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/ja.lang.php b/Theme/Backend/Lang/ja.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/ko.lang.php b/Theme/Backend/Lang/ko.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/no.lang.php b/Theme/Backend/Lang/no.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/pl.lang.php b/Theme/Backend/Lang/pl.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/pt.lang.php b/Theme/Backend/Lang/pt.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/ru.lang.php b/Theme/Backend/Lang/ru.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/sv.lang.php b/Theme/Backend/Lang/sv.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/th.lang.php b/Theme/Backend/Lang/th.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/tr.lang.php b/Theme/Backend/Lang/tr.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/uk.lang.php b/Theme/Backend/Lang/uk.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/Lang/zh.lang.php b/Theme/Backend/Lang/zh.lang.php old mode 100644 new mode 100755 diff --git a/Theme/Backend/contract-list.tpl.php b/Theme/Backend/contract-list.tpl.php index 5a3e83c..74672f0 100755 --- a/Theme/Backend/contract-list.tpl.php +++ b/Theme/Backend/contract-list.tpl.php @@ -20,8 +20,8 @@ use phpOMS\Uri\UriFactory; */ $contracts = $this->getData('contracts') ?? []; -$previous = empty($contracts) ? '{/prefix}contract/list' : '{/prefix}contract/list?{?}&id=' . \reset($contracts)->getId() . '&ptype=p'; -$next = empty($contracts) ? '{/prefix}contract/list' : '{/prefix}contract/list?{?}&id=' . \end($contracts)->getId() . '&ptype=n'; +$previous = empty($contracts) ? 'contract/list' : 'contract/list?{?}&id=' . \reset($contracts)->getId() . '&ptype=p'; +$next = empty($contracts) ? 'contract/list' : 'contract/list?{?}&id=' . \end($contracts)->getId() . '&ptype=n'; $now = new \DateTime('now'); @@ -73,7 +73,7 @@ echo $this->getData('nav')->render(); ?> $value) : - $url = UriFactory::build('{/prefix}contract/single?{?}&id=' . $value->getId()); + $url = UriFactory::build('contract/single?{?}&id=' . $value->getId()); $type = 'ok'; if (($value->end->getTimestamp() < $now->getTimestamp() && $value->end->getTimestamp() + 7776000 > $now->getTimestamp()) @@ -88,7 +88,7 @@ echo $this->getData('nav')->render(); ?> ?> printHtml($value->title); ?> - printHtml($value->account->name1); ?> printHtml($value->account->name2); ?> + printHtml($value->account->name1); ?> printHtml($value->account->name2); ?> end !== null ? $value->end->format('Y-m-d') : ''; ?> diff --git a/tests/Admin/AdminTest.php b/tests/Admin/AdminTest.php old mode 100644 new mode 100755 diff --git a/tests/Controller/ApiControllerTest.php b/tests/Controller/ApiControllerTest.php old mode 100644 new mode 100755 diff --git a/tests/Controller/test.pdf b/tests/Controller/test.pdf old mode 100644 new mode 100755 diff --git a/tests/Models/ContractTest.php b/tests/Models/ContractTest.php old mode 100644 new mode 100755 diff --git a/tests/Models/ContractTypeL11nTest.php b/tests/Models/ContractTypeL11nTest.php old mode 100644 new mode 100755 diff --git a/tests/Models/ContractTypeTest.php b/tests/Models/ContractTypeTest.php old mode 100644 new mode 100755 diff --git a/tests/Models/NullContractTest.php b/tests/Models/NullContractTest.php old mode 100644 new mode 100755 diff --git a/tests/Models/NullContractTypeL11nTest.php b/tests/Models/NullContractTypeL11nTest.php old mode 100644 new mode 100755 diff --git a/tests/Models/NullContractTypeTest.php b/tests/Models/NullContractTypeTest.php old mode 100644 new mode 100755 From 53f95ed9628713d2cafb734d6491505674c410ee Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Wed, 9 Nov 2022 23:02:52 +0100 Subject: [PATCH 058/133] reduce serialization of null models --- Models/NullContract.php | 8 ++++++++ Models/NullContractType.php | 8 ++++++++ Models/NullContractTypeL11n.php | 8 ++++++++ 3 files changed, 24 insertions(+) diff --git a/Models/NullContract.php b/Models/NullContract.php index 93694fb..3f81f8c 100755 --- a/Models/NullContract.php +++ b/Models/NullContract.php @@ -36,4 +36,12 @@ final class NullContract extends Contract $this->id = $id; parent::__construct(); } + + /** + * {@inheritdoc} + */ + public function jsonSerialize() : mixed + { + return ['id' => $this->id]; + } } diff --git a/Models/NullContractType.php b/Models/NullContractType.php index 9a75955..36a652d 100755 --- a/Models/NullContractType.php +++ b/Models/NullContractType.php @@ -36,4 +36,12 @@ final class NullContractType extends ContractType $this->id = $id; parent::__construct(); } + + /** + * {@inheritdoc} + */ + public function jsonSerialize() : mixed + { + return ['id' => $this->id]; + } } diff --git a/Models/NullContractTypeL11n.php b/Models/NullContractTypeL11n.php index d232979..4e42cb9 100755 --- a/Models/NullContractTypeL11n.php +++ b/Models/NullContractTypeL11n.php @@ -36,4 +36,12 @@ final class NullContractTypeL11n extends ContractTypeL11n $this->id = $id; parent::__construct(); } + + /** + * {@inheritdoc} + */ + public function jsonSerialize() : mixed + { + return ['id' => $this->id]; + } } From 813d6b73f7256ff8f67474bffcecfc28c41d2e6e Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sat, 10 Dec 2022 22:17:54 +0100 Subject: [PATCH 059/133] fix urls --- Admin/Install/Navigation.install.json | 4 ++-- Theme/Backend/contract-list.tpl.php | 8 ++++---- info.json | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Admin/Install/Navigation.install.json b/Admin/Install/Navigation.install.json index 211f2df..14aa3ed 100755 --- a/Admin/Install/Navigation.install.json +++ b/Admin/Install/Navigation.install.json @@ -5,7 +5,7 @@ "type": 2, "subtype": 1, "name": "Contract", - "uri": "{/prefix}contract/list?{?}", + "uri": "{/lang}/{/app}/contract/list?{?}", "target": "self", "icon": null, "order": 45, @@ -19,7 +19,7 @@ "type": 3, "subtype": 1, "name": "Contracts", - "uri": "{/prefix}contract/list?{?}", + "uri": "{/lang}/{/app}/contract/list?{?}", "target": "self", "icon": null, "order": 1, diff --git a/Theme/Backend/contract-list.tpl.php b/Theme/Backend/contract-list.tpl.php index 74672f0..170deff 100755 --- a/Theme/Backend/contract-list.tpl.php +++ b/Theme/Backend/contract-list.tpl.php @@ -20,8 +20,8 @@ use phpOMS\Uri\UriFactory; */ $contracts = $this->getData('contracts') ?? []; -$previous = empty($contracts) ? 'contract/list' : 'contract/list?{?}&id=' . \reset($contracts)->getId() . '&ptype=p'; -$next = empty($contracts) ? 'contract/list' : 'contract/list?{?}&id=' . \end($contracts)->getId() . '&ptype=n'; +$previous = empty($contracts) ? '{/lang}/{/app}/contract/list' : '{/lang}/{/app}/contract/list?{?}&id=' . \reset($contracts)->getId() . '&ptype=p'; +$next = empty($contracts) ? '{/lang}/{/app}/contract/list' : '{/lang}/{/app}/contract/list?{?}&id=' . \end($contracts)->getId() . '&ptype=n'; $now = new \DateTime('now'); @@ -73,7 +73,7 @@ echo $this->getData('nav')->render(); ?> $value) : - $url = UriFactory::build('contract/single?{?}&id=' . $value->getId()); + $url = UriFactory::build('{/lang}/{/app}/contract/single?{?}&id=' . $value->getId()); $type = 'ok'; if (($value->end->getTimestamp() < $now->getTimestamp() && $value->end->getTimestamp() + 7776000 > $now->getTimestamp()) @@ -88,7 +88,7 @@ echo $this->getData('nav')->render(); ?> ?> printHtml($value->title); ?> - printHtml($value->account->name1); ?> printHtml($value->account->name2); ?> + printHtml($value->account->name1); ?> printHtml($value->account->name2); ?> end !== null ? $value->end->format('Y-m-d') : ''; ?> diff --git a/info.json b/info.json index 432df04..c4ce549 100755 --- a/info.json +++ b/info.json @@ -12,7 +12,7 @@ }, "creator": { "name": "Karaka", - "website": "www.spl1nes.com" + "website": "jingga.app" }, "description": "ContractManagement module.", "directory": "ContractManagement", From 5e1ca777a6783c93a9ee07262ea0225b72f7a797 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Fri, 16 Dec 2022 21:59:20 +0100 Subject: [PATCH 060/133] fix url --- Admin/Install/Admin.install.php | 2 +- Admin/Install/Media.php | 4 ++-- Admin/Install/Navigation.php | 4 ++-- Admin/Installer.php | 4 ++-- Admin/Routes/Web/Backend.php | 2 +- Admin/Status.php | 4 ++-- Admin/Uninstaller.php | 4 ++-- Admin/Updater.php | 4 ++-- Controller/ApiController.php | 4 ++-- Controller/BackendController.php | 4 ++-- Controller/Controller.php | 4 ++-- Models/Contract.php | 4 ++-- Models/ContractMapper.php | 4 ++-- Models/ContractType.php | 4 ++-- Models/ContractTypeL11n.php | 4 ++-- Models/ContractTypeL11nMapper.php | 4 ++-- Models/ContractTypeMapper.php | 4 ++-- Models/NullContract.php | 4 ++-- Models/NullContractType.php | 4 ++-- Models/NullContractTypeL11n.php | 4 ++-- Models/PermissionCategory.php | 4 ++-- Models/SettingsEnum.php | 4 ++-- Theme/Backend/Lang/Navigation.ar.lang.php | 2 +- Theme/Backend/Lang/Navigation.cs.lang.php | 2 +- Theme/Backend/Lang/Navigation.da.lang.php | 2 +- Theme/Backend/Lang/Navigation.de.lang.php | 2 +- Theme/Backend/Lang/Navigation.el.lang.php | 2 +- Theme/Backend/Lang/Navigation.en.lang.php | 2 +- Theme/Backend/Lang/Navigation.es.lang.php | 2 +- Theme/Backend/Lang/Navigation.fi.lang.php | 2 +- Theme/Backend/Lang/Navigation.fr.lang.php | 2 +- Theme/Backend/Lang/Navigation.hu.lang.php | 2 +- Theme/Backend/Lang/Navigation.it.lang.php | 2 +- Theme/Backend/Lang/Navigation.ja.lang.php | 2 +- Theme/Backend/Lang/Navigation.ko.lang.php | 2 +- Theme/Backend/Lang/Navigation.no.lang.php | 2 +- Theme/Backend/Lang/Navigation.pl.lang.php | 2 +- Theme/Backend/Lang/Navigation.pt.lang.php | 2 +- Theme/Backend/Lang/Navigation.ru.lang.php | 2 +- Theme/Backend/Lang/Navigation.sv.lang.php | 2 +- Theme/Backend/Lang/Navigation.th.lang.php | 2 +- Theme/Backend/Lang/Navigation.tr.lang.php | 2 +- Theme/Backend/Lang/Navigation.uk.lang.php | 2 +- Theme/Backend/Lang/Navigation.zh.lang.php | 2 +- Theme/Backend/Lang/ar.lang.php | 2 +- Theme/Backend/Lang/cs.lang.php | 2 +- Theme/Backend/Lang/da.lang.php | 2 +- Theme/Backend/Lang/de.lang.php | 2 +- Theme/Backend/Lang/el.lang.php | 2 +- Theme/Backend/Lang/en.lang.php | 2 +- Theme/Backend/Lang/es.lang.php | 2 +- Theme/Backend/Lang/fi.lang.php | 2 +- Theme/Backend/Lang/fr.lang.php | 2 +- Theme/Backend/Lang/hu.lang.php | 2 +- Theme/Backend/Lang/it.lang.php | 2 +- Theme/Backend/Lang/ja.lang.php | 2 +- Theme/Backend/Lang/ko.lang.php | 2 +- Theme/Backend/Lang/no.lang.php | 2 +- Theme/Backend/Lang/pl.lang.php | 2 +- Theme/Backend/Lang/pt.lang.php | 2 +- Theme/Backend/Lang/ru.lang.php | 2 +- Theme/Backend/Lang/sv.lang.php | 2 +- Theme/Backend/Lang/th.lang.php | 2 +- Theme/Backend/Lang/tr.lang.php | 2 +- Theme/Backend/Lang/uk.lang.php | 2 +- Theme/Backend/Lang/zh.lang.php | 2 +- Theme/Backend/contract-list.tpl.php | 2 +- Theme/Backend/contract-single.tpl.php | 2 +- tests/Admin/AdminTest.php | 2 +- tests/Controller/ApiControllerTest.php | 2 +- tests/Models/ContractTest.php | 2 +- tests/Models/ContractTypeL11nTest.php | 2 +- tests/Models/ContractTypeTest.php | 2 +- tests/Models/NullContractTest.php | 2 +- tests/Models/NullContractTypeL11nTest.php | 2 +- tests/Models/NullContractTypeTest.php | 2 +- 76 files changed, 96 insertions(+), 96 deletions(-) diff --git a/Admin/Install/Admin.install.php b/Admin/Install/Admin.install.php index 31ec307..512daa8 100755 --- a/Admin/Install/Admin.install.php +++ b/Admin/Install/Admin.install.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Admin/Install/Media.php b/Admin/Install/Media.php index 986f20c..d8a7eb2 100755 --- a/Admin/Install/Media.php +++ b/Admin/Install/Media.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); @@ -21,7 +21,7 @@ use phpOMS\Application\ApplicationAbstract; * * @package Modules\ContractManagement\Admin\Install * @license OMS License 1.0 - * @link https://karaka.app + * @link https://jingga.app * @since 1.0.0 */ class Media diff --git a/Admin/Install/Navigation.php b/Admin/Install/Navigation.php index ba6fe2b..0ff6994 100755 --- a/Admin/Install/Navigation.php +++ b/Admin/Install/Navigation.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); @@ -21,7 +21,7 @@ use phpOMS\Application\ApplicationAbstract; * * @package Modules\ContractManagement\Admin\Install * @license OMS License 1.0 - * @link https://karaka.app + * @link https://jingga.app * @since 1.0.0 */ class Navigation diff --git a/Admin/Installer.php b/Admin/Installer.php index 408d124..bca8168 100755 --- a/Admin/Installer.php +++ b/Admin/Installer.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); @@ -21,7 +21,7 @@ use phpOMS\Module\InstallerAbstract; * * @package Modules\ContractManagement\Admin * @license OMS License 1.0 - * @link https://karaka.app + * @link https://jingga.app * @since 1.0.0 */ final class Installer extends InstallerAbstract diff --git a/Admin/Routes/Web/Backend.php b/Admin/Routes/Web/Backend.php index 6f11eff..822763b 100755 --- a/Admin/Routes/Web/Backend.php +++ b/Admin/Routes/Web/Backend.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Admin/Status.php b/Admin/Status.php index e47d2d7..47dbc7c 100755 --- a/Admin/Status.php +++ b/Admin/Status.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); @@ -21,7 +21,7 @@ use phpOMS\Module\StatusAbstract; * * @package Modules\ContractManagement\Admin * @license OMS License 1.0 - * @link https://karaka.app + * @link https://jingga.app * @since 1.0.0 */ final class Status extends StatusAbstract diff --git a/Admin/Uninstaller.php b/Admin/Uninstaller.php index 294d432..edafbed 100755 --- a/Admin/Uninstaller.php +++ b/Admin/Uninstaller.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); @@ -21,7 +21,7 @@ use phpOMS\Module\UninstallerAbstract; * * @package Modules\ContractManagement\Admin * @license OMS License 1.0 - * @link https://karaka.app + * @link https://jingga.app * @since 1.0.0 */ final class Uninstaller extends UninstallerAbstract diff --git a/Admin/Updater.php b/Admin/Updater.php index d74ee02..80f71aa 100755 --- a/Admin/Updater.php +++ b/Admin/Updater.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); @@ -21,7 +21,7 @@ use phpOMS\Module\UpdaterAbstract; * * @package Modules\ContractManagement\Admin * @license OMS License 1.0 - * @link https://karaka.app + * @link https://jingga.app * @since 1.0.0 */ final class Updater extends UpdaterAbstract diff --git a/Controller/ApiController.php b/Controller/ApiController.php index f728dd1..a684dea 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); @@ -35,7 +35,7 @@ use phpOMS\Model\Message\FormValidation; * * @package Modules\ContractManagement * @license OMS License 1.0 - * @link https://karaka.app + * @link https://jingga.app * @since 1.0.0 */ final class ApiController extends Controller diff --git a/Controller/BackendController.php b/Controller/BackendController.php index d7fc461..6a2d802 100755 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); @@ -28,7 +28,7 @@ use phpOMS\Views\View; * * @package Modules\ContractManagement * @license OMS License 1.0 - * @link https://karaka.app + * @link https://jingga.app * @since 1.0.0 * @codeCoverageIgnore */ diff --git a/Controller/Controller.php b/Controller/Controller.php index 36f9365..925b86f 100755 --- a/Controller/Controller.php +++ b/Controller/Controller.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); @@ -21,7 +21,7 @@ use phpOMS\Module\ModuleAbstract; * * @package Modules\ContractManagement * @license OMS License 1.0 - * @link https://karaka.app + * @link https://jingga.app * @since 1.0.0 */ class Controller extends ModuleAbstract diff --git a/Models/Contract.php b/Models/Contract.php index c4395f5..057f250 100755 --- a/Models/Contract.php +++ b/Models/Contract.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); @@ -25,7 +25,7 @@ use phpOMS\Localization\Money; * * @package Modules\ContractManagement\Models * @license OMS License 1.0 - * @link https://karaka.app + * @link https://jingga.app * @since 1.0.0 */ class Contract diff --git a/Models/ContractMapper.php b/Models/ContractMapper.php index 7fb5dee..c5f848b 100755 --- a/Models/ContractMapper.php +++ b/Models/ContractMapper.php @@ -9,7 +9,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); @@ -26,7 +26,7 @@ use phpOMS\DataStorage\Database\Mapper\DataMapperFactory; * * @package Modules\ContractManagement\Models * @license OMS License 1.0 - * @link https://karaka.app + * @link https://jingga.app * @since 1.0.0 */ final class ContractMapper extends DataMapperFactory diff --git a/Models/ContractType.php b/Models/ContractType.php index 5a80c85..e81371b 100755 --- a/Models/ContractType.php +++ b/Models/ContractType.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); @@ -21,7 +21,7 @@ use phpOMS\Localization\ISO639x1Enum; * * @package Modules\ContractManagement\Models * @license OMS License 1.0 - * @link https://karaka.app + * @link https://jingga.app * @since 1.0.0 */ class ContractType implements \JsonSerializable diff --git a/Models/ContractTypeL11n.php b/Models/ContractTypeL11n.php index 9325f58..c8eff79 100755 --- a/Models/ContractTypeL11n.php +++ b/Models/ContractTypeL11n.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); @@ -21,7 +21,7 @@ use phpOMS\Localization\ISO639x1Enum; * * @package Modules\ContractManagement\Models * @license OMS License 1.0 - * @link https://karaka.app + * @link https://jingga.app * @since 1.0.0 */ class ContractTypeL11n implements \JsonSerializable diff --git a/Models/ContractTypeL11nMapper.php b/Models/ContractTypeL11nMapper.php index b72a272..02e1397 100755 --- a/Models/ContractTypeL11nMapper.php +++ b/Models/ContractTypeL11nMapper.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); @@ -21,7 +21,7 @@ use phpOMS\DataStorage\Database\Mapper\DataMapperFactory; * * @package Modules\ContractManagement\Models * @license OMS License 1.0 - * @link https://karaka.app + * @link https://jingga.app * @since 1.0.0 */ final class ContractTypeL11nMapper extends DataMapperFactory diff --git a/Models/ContractTypeMapper.php b/Models/ContractTypeMapper.php index 70dd259..4d2793e 100755 --- a/Models/ContractTypeMapper.php +++ b/Models/ContractTypeMapper.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); @@ -21,7 +21,7 @@ use phpOMS\DataStorage\Database\Mapper\DataMapperFactory; * * @package Modules\ContractManagement\Models * @license OMS License 1.0 - * @link https://karaka.app + * @link https://jingga.app * @since 1.0.0 */ final class ContractTypeMapper extends DataMapperFactory diff --git a/Models/NullContract.php b/Models/NullContract.php index 3f81f8c..0d60354 100755 --- a/Models/NullContract.php +++ b/Models/NullContract.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); @@ -19,7 +19,7 @@ namespace Modules\ContractManagement\Models; * * @package Modules\ContractManagement\Models * @license OMS License 1.0 - * @link https://karaka.app + * @link https://jingga.app * @since 1.0.0 */ final class NullContract extends Contract diff --git a/Models/NullContractType.php b/Models/NullContractType.php index 36a652d..5240d17 100755 --- a/Models/NullContractType.php +++ b/Models/NullContractType.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); @@ -19,7 +19,7 @@ namespace Modules\ContractManagement\Models; * * @package Modules\ContractManagement\Models * @license OMS License 1.0 - * @link https://karaka.app + * @link https://jingga.app * @since 1.0.0 */ final class NullContractType extends ContractType diff --git a/Models/NullContractTypeL11n.php b/Models/NullContractTypeL11n.php index 4e42cb9..c8aacb2 100755 --- a/Models/NullContractTypeL11n.php +++ b/Models/NullContractTypeL11n.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); @@ -19,7 +19,7 @@ namespace Modules\ContractManagement\Models; * * @package Modules\ContractManagement\Models * @license OMS License 1.0 - * @link https://karaka.app + * @link https://jingga.app * @since 1.0.0 */ final class NullContractTypeL11n extends ContractTypeL11n diff --git a/Models/PermissionCategory.php b/Models/PermissionCategory.php index 175dcdf..64d672a 100755 --- a/Models/PermissionCategory.php +++ b/Models/PermissionCategory.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); @@ -21,7 +21,7 @@ use phpOMS\Stdlib\Base\Enum; * * @package Modules\ContractManagement\Models * @license OMS License 1.0 - * @link https://karaka.app + * @link https://jingga.app * @since 1.0.0 */ abstract class PermissionCategory extends Enum diff --git a/Models/SettingsEnum.php b/Models/SettingsEnum.php index 432905b..83e1318 100755 --- a/Models/SettingsEnum.php +++ b/Models/SettingsEnum.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); @@ -21,7 +21,7 @@ use phpOMS\Stdlib\Base\Enum; * * @package Modules\ContractManagement\Models * @license OMS License 1.0 - * @link https://karaka.app + * @link https://jingga.app * @since 1.0.0 */ abstract class SettingsEnum extends Enum diff --git a/Theme/Backend/Lang/Navigation.ar.lang.php b/Theme/Backend/Lang/Navigation.ar.lang.php index 6297f0e..a35f6ee 100755 --- a/Theme/Backend/Lang/Navigation.ar.lang.php +++ b/Theme/Backend/Lang/Navigation.ar.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.cs.lang.php b/Theme/Backend/Lang/Navigation.cs.lang.php index 375b66a..5e1d4e6 100755 --- a/Theme/Backend/Lang/Navigation.cs.lang.php +++ b/Theme/Backend/Lang/Navigation.cs.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.da.lang.php b/Theme/Backend/Lang/Navigation.da.lang.php index c45dff6..560f9f1 100755 --- a/Theme/Backend/Lang/Navigation.da.lang.php +++ b/Theme/Backend/Lang/Navigation.da.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.de.lang.php b/Theme/Backend/Lang/Navigation.de.lang.php index 6e62f8f..54b538d 100755 --- a/Theme/Backend/Lang/Navigation.de.lang.php +++ b/Theme/Backend/Lang/Navigation.de.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.el.lang.php b/Theme/Backend/Lang/Navigation.el.lang.php index fdfd374..741b3ab 100755 --- a/Theme/Backend/Lang/Navigation.el.lang.php +++ b/Theme/Backend/Lang/Navigation.el.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.en.lang.php b/Theme/Backend/Lang/Navigation.en.lang.php index 5ec3fd1..2b1d280 100755 --- a/Theme/Backend/Lang/Navigation.en.lang.php +++ b/Theme/Backend/Lang/Navigation.en.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.es.lang.php b/Theme/Backend/Lang/Navigation.es.lang.php index 76883c7..3925074 100755 --- a/Theme/Backend/Lang/Navigation.es.lang.php +++ b/Theme/Backend/Lang/Navigation.es.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.fi.lang.php b/Theme/Backend/Lang/Navigation.fi.lang.php index e10a5e4..91a2e2c 100755 --- a/Theme/Backend/Lang/Navigation.fi.lang.php +++ b/Theme/Backend/Lang/Navigation.fi.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.fr.lang.php b/Theme/Backend/Lang/Navigation.fr.lang.php index af588a4..029b06a 100755 --- a/Theme/Backend/Lang/Navigation.fr.lang.php +++ b/Theme/Backend/Lang/Navigation.fr.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.hu.lang.php b/Theme/Backend/Lang/Navigation.hu.lang.php index 86621d1..59467b1 100755 --- a/Theme/Backend/Lang/Navigation.hu.lang.php +++ b/Theme/Backend/Lang/Navigation.hu.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.it.lang.php b/Theme/Backend/Lang/Navigation.it.lang.php index 691e4a5..c4382d6 100755 --- a/Theme/Backend/Lang/Navigation.it.lang.php +++ b/Theme/Backend/Lang/Navigation.it.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.ja.lang.php b/Theme/Backend/Lang/Navigation.ja.lang.php index 0384dcd..529a17c 100755 --- a/Theme/Backend/Lang/Navigation.ja.lang.php +++ b/Theme/Backend/Lang/Navigation.ja.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.ko.lang.php b/Theme/Backend/Lang/Navigation.ko.lang.php index f88c550..9cf0cde 100755 --- a/Theme/Backend/Lang/Navigation.ko.lang.php +++ b/Theme/Backend/Lang/Navigation.ko.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.no.lang.php b/Theme/Backend/Lang/Navigation.no.lang.php index 18083e0..93552b6 100755 --- a/Theme/Backend/Lang/Navigation.no.lang.php +++ b/Theme/Backend/Lang/Navigation.no.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.pl.lang.php b/Theme/Backend/Lang/Navigation.pl.lang.php index ce66cd3..ebf910d 100755 --- a/Theme/Backend/Lang/Navigation.pl.lang.php +++ b/Theme/Backend/Lang/Navigation.pl.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.pt.lang.php b/Theme/Backend/Lang/Navigation.pt.lang.php index 79d1049..ba91b8c 100755 --- a/Theme/Backend/Lang/Navigation.pt.lang.php +++ b/Theme/Backend/Lang/Navigation.pt.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.ru.lang.php b/Theme/Backend/Lang/Navigation.ru.lang.php index b770676..c4e646b 100755 --- a/Theme/Backend/Lang/Navigation.ru.lang.php +++ b/Theme/Backend/Lang/Navigation.ru.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.sv.lang.php b/Theme/Backend/Lang/Navigation.sv.lang.php index a967eba..5b43127 100755 --- a/Theme/Backend/Lang/Navigation.sv.lang.php +++ b/Theme/Backend/Lang/Navigation.sv.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.th.lang.php b/Theme/Backend/Lang/Navigation.th.lang.php index d736573..6f8c177 100755 --- a/Theme/Backend/Lang/Navigation.th.lang.php +++ b/Theme/Backend/Lang/Navigation.th.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.tr.lang.php b/Theme/Backend/Lang/Navigation.tr.lang.php index 637467d..33e26cd 100755 --- a/Theme/Backend/Lang/Navigation.tr.lang.php +++ b/Theme/Backend/Lang/Navigation.tr.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.uk.lang.php b/Theme/Backend/Lang/Navigation.uk.lang.php index cfa4e27..63fbb0e 100755 --- a/Theme/Backend/Lang/Navigation.uk.lang.php +++ b/Theme/Backend/Lang/Navigation.uk.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/Navigation.zh.lang.php b/Theme/Backend/Lang/Navigation.zh.lang.php index 1a1f26a..f42c45d 100755 --- a/Theme/Backend/Lang/Navigation.zh.lang.php +++ b/Theme/Backend/Lang/Navigation.zh.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/ar.lang.php b/Theme/Backend/Lang/ar.lang.php index 8d8b2c6..892f9c2 100755 --- a/Theme/Backend/Lang/ar.lang.php +++ b/Theme/Backend/Lang/ar.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/cs.lang.php b/Theme/Backend/Lang/cs.lang.php index 5b19dd5..00fa7e7 100755 --- a/Theme/Backend/Lang/cs.lang.php +++ b/Theme/Backend/Lang/cs.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/da.lang.php b/Theme/Backend/Lang/da.lang.php index 0217524..2eede48 100755 --- a/Theme/Backend/Lang/da.lang.php +++ b/Theme/Backend/Lang/da.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/de.lang.php b/Theme/Backend/Lang/de.lang.php index 663ef46..084c7cd 100755 --- a/Theme/Backend/Lang/de.lang.php +++ b/Theme/Backend/Lang/de.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/el.lang.php b/Theme/Backend/Lang/el.lang.php index 640a9ad..c798edc 100755 --- a/Theme/Backend/Lang/el.lang.php +++ b/Theme/Backend/Lang/el.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/en.lang.php b/Theme/Backend/Lang/en.lang.php index 061b393..c74fb26 100755 --- a/Theme/Backend/Lang/en.lang.php +++ b/Theme/Backend/Lang/en.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/es.lang.php b/Theme/Backend/Lang/es.lang.php index cbaa822..a5f58d4 100755 --- a/Theme/Backend/Lang/es.lang.php +++ b/Theme/Backend/Lang/es.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/fi.lang.php b/Theme/Backend/Lang/fi.lang.php index 512ef06..5e31180 100755 --- a/Theme/Backend/Lang/fi.lang.php +++ b/Theme/Backend/Lang/fi.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/fr.lang.php b/Theme/Backend/Lang/fr.lang.php index 31750bf..3e3cfee 100755 --- a/Theme/Backend/Lang/fr.lang.php +++ b/Theme/Backend/Lang/fr.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/hu.lang.php b/Theme/Backend/Lang/hu.lang.php index 396688f..d874336 100755 --- a/Theme/Backend/Lang/hu.lang.php +++ b/Theme/Backend/Lang/hu.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/it.lang.php b/Theme/Backend/Lang/it.lang.php index cda9d41..09ace4d 100755 --- a/Theme/Backend/Lang/it.lang.php +++ b/Theme/Backend/Lang/it.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/ja.lang.php b/Theme/Backend/Lang/ja.lang.php index abb7fc1..f767fe7 100755 --- a/Theme/Backend/Lang/ja.lang.php +++ b/Theme/Backend/Lang/ja.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/ko.lang.php b/Theme/Backend/Lang/ko.lang.php index c2a7f1c..08fa3dd 100755 --- a/Theme/Backend/Lang/ko.lang.php +++ b/Theme/Backend/Lang/ko.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/no.lang.php b/Theme/Backend/Lang/no.lang.php index 2343349..e37cf3e 100755 --- a/Theme/Backend/Lang/no.lang.php +++ b/Theme/Backend/Lang/no.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/pl.lang.php b/Theme/Backend/Lang/pl.lang.php index 2fb44fc..d1ffb8e 100755 --- a/Theme/Backend/Lang/pl.lang.php +++ b/Theme/Backend/Lang/pl.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/pt.lang.php b/Theme/Backend/Lang/pt.lang.php index b419fa8..d76a21a 100755 --- a/Theme/Backend/Lang/pt.lang.php +++ b/Theme/Backend/Lang/pt.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/ru.lang.php b/Theme/Backend/Lang/ru.lang.php index bf07d1b..f520d32 100755 --- a/Theme/Backend/Lang/ru.lang.php +++ b/Theme/Backend/Lang/ru.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/sv.lang.php b/Theme/Backend/Lang/sv.lang.php index da45f76..8ab2d4a 100755 --- a/Theme/Backend/Lang/sv.lang.php +++ b/Theme/Backend/Lang/sv.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/th.lang.php b/Theme/Backend/Lang/th.lang.php index 073fb57..239591a 100755 --- a/Theme/Backend/Lang/th.lang.php +++ b/Theme/Backend/Lang/th.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/tr.lang.php b/Theme/Backend/Lang/tr.lang.php index 4e0ba5a..e3c7098 100755 --- a/Theme/Backend/Lang/tr.lang.php +++ b/Theme/Backend/Lang/tr.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/uk.lang.php b/Theme/Backend/Lang/uk.lang.php index 4143074..1e07912 100755 --- a/Theme/Backend/Lang/uk.lang.php +++ b/Theme/Backend/Lang/uk.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/Lang/zh.lang.php b/Theme/Backend/Lang/zh.lang.php index 82e2982..42a8568 100755 --- a/Theme/Backend/Lang/zh.lang.php +++ b/Theme/Backend/Lang/zh.lang.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/contract-list.tpl.php b/Theme/Backend/contract-list.tpl.php index 170deff..e89294b 100755 --- a/Theme/Backend/contract-list.tpl.php +++ b/Theme/Backend/contract-list.tpl.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/Theme/Backend/contract-single.tpl.php b/Theme/Backend/contract-single.tpl.php index a5142a4..43ad643 100755 --- a/Theme/Backend/contract-single.tpl.php +++ b/Theme/Backend/contract-single.tpl.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/tests/Admin/AdminTest.php b/tests/Admin/AdminTest.php index 6fe499e..dc0c39d 100755 --- a/tests/Admin/AdminTest.php +++ b/tests/Admin/AdminTest.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/tests/Controller/ApiControllerTest.php b/tests/Controller/ApiControllerTest.php index 9e759b8..03df45d 100755 --- a/tests/Controller/ApiControllerTest.php +++ b/tests/Controller/ApiControllerTest.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/tests/Models/ContractTest.php b/tests/Models/ContractTest.php index 0401886..531e565 100755 --- a/tests/Models/ContractTest.php +++ b/tests/Models/ContractTest.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/tests/Models/ContractTypeL11nTest.php b/tests/Models/ContractTypeL11nTest.php index 714a9d4..2680bc3 100755 --- a/tests/Models/ContractTypeL11nTest.php +++ b/tests/Models/ContractTypeL11nTest.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/tests/Models/ContractTypeTest.php b/tests/Models/ContractTypeTest.php index 55ef2f5..8af2103 100755 --- a/tests/Models/ContractTypeTest.php +++ b/tests/Models/ContractTypeTest.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/tests/Models/NullContractTest.php b/tests/Models/NullContractTest.php index 58cbded..2090576 100755 --- a/tests/Models/NullContractTest.php +++ b/tests/Models/NullContractTest.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/tests/Models/NullContractTypeL11nTest.php b/tests/Models/NullContractTypeL11nTest.php index da3dc2c..6d157c1 100755 --- a/tests/Models/NullContractTypeL11nTest.php +++ b/tests/Models/NullContractTypeL11nTest.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); diff --git a/tests/Models/NullContractTypeTest.php b/tests/Models/NullContractTypeTest.php index 4e0c991..5b953c1 100755 --- a/tests/Models/NullContractTypeTest.php +++ b/tests/Models/NullContractTypeTest.php @@ -8,7 +8,7 @@ * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 - * @link https://karaka.app + * @link https://jingga.app */ declare(strict_types=1); From e7998b35f33f6e072124274efea225de37243602 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Mon, 26 Dec 2022 20:52:58 +0100 Subject: [PATCH 061/133] fix phpstan lvl 9 bugs --- Controller/ApiController.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Controller/ApiController.php b/Controller/ApiController.php index a684dea..a6ec253 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -23,6 +23,7 @@ use Modules\ContractManagement\Models\ContractTypeL11nMapper; use Modules\ContractManagement\Models\ContractTypeMapper; use Modules\ContractManagement\Models\NullContractType; use Modules\Media\Models\PathSettings; +use Modules\Organization\Models\NullUnit; use phpOMS\Localization\ISO639x1Enum; use phpOMS\Message\Http\RequestStatusCode; use phpOMS\Message\NotificationLevel; @@ -109,7 +110,7 @@ final class ApiController extends Controller $contract->account = new NullAccount((int) ($request->getData('account') ?? 0)); $contract->renewal = (int) ($request->getData('renewal') ?? 0); $contract->autoRenewal = (bool) ($request->getData('autorenewal') ?? false); - $contract->unit = $request->getData('unit', 'int') ?? null; + $contract->unit = New NullUnit((int) ($request->getData('unit') ?? 0)); if (!empty($request->getData('end'))) { $contract->end = new \DateTime($request->getData('end')); From cf4cec9836dc265929e215a06d247a82fa5650b4 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Thu, 26 Jan 2023 21:54:13 +0100 Subject: [PATCH 062/133] org -> unit change, some new functionality --- Admin/Install/db.json | 4 ++-- tests/Controller/ApiControllerTest.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Admin/Install/db.json b/Admin/Install/db.json index 8ab2469..9bbdb4d 100755 --- a/Admin/Install/db.json +++ b/Admin/Install/db.json @@ -118,8 +118,8 @@ "type": "INT", "null": true, "default": null, - "foreignTable": "organization_unit", - "foreignKey": "organization_unit_id" + "foreignTable": "unit", + "foreignKey": "unit_id" }, "contractmgmt_contract_responsible": { "name": "contractmgmt_contract_responsible", diff --git a/tests/Controller/ApiControllerTest.php b/tests/Controller/ApiControllerTest.php index 03df45d..c4ce2f0 100755 --- a/tests/Controller/ApiControllerTest.php +++ b/tests/Controller/ApiControllerTest.php @@ -58,7 +58,7 @@ final class ApiControllerTest extends \PHPUnit\Framework\TestCase }; $this->app->dbPool = $GLOBALS['dbpool']; - $this->app->orgId = 1; + $this->app->unitId = 1; $this->app->accountManager = new AccountManager($GLOBALS['session']); $this->app->appSettings = new CoreSettings(); $this->app->moduleManager = new ModuleManager($this->app, __DIR__ . '/../../../../Modules/'); From 067a4b563d1eabf332053f30c30f2b3318d9f039 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Fri, 27 Jan 2023 22:12:09 +0100 Subject: [PATCH 063/133] phpstan, phpcs, phpunit fixes --- Controller/ApiController.php | 28 +++++++++++++++++++++------- Models/ContractMapper.php | 4 ++-- Models/ContractTypeMapper.php | 2 +- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/Controller/ApiController.php b/Controller/ApiController.php index a6ec253..2455d28 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -22,6 +22,7 @@ use Modules\ContractManagement\Models\ContractTypeL11n; use Modules\ContractManagement\Models\ContractTypeL11nMapper; use Modules\ContractManagement\Models\ContractTypeMapper; use Modules\ContractManagement\Models\NullContractType; +use Modules\Media\Models\MediaMapper; use Modules\Media\Models\PathSettings; use Modules\Organization\Models\NullUnit; use phpOMS\Localization\ISO639x1Enum; @@ -144,16 +145,29 @@ final class ApiController extends Controller } $uploaded = $this->app->moduleManager->get('Media')->uploadFiles( - $request->getDataList('names'), - $request->getDataList('filenames'), - $uploadedFiles, - $request->header->account, - __DIR__ . '/../../../Modules/Media/Files/Modules/ContractManagement/Contracts/' . ($request->getData('contract_title') ?? '0'), - '/Modules/ContractManagement/Contracts/' . ($request->getData('contract_title') ?? '0'), - $request->getData('type', 'int'), + names: $request->getDataList('names'), + fileNames: $request->getDataList('filenames'), + files: $uploadedFiles, + account: $request->header->account, + basePath: __DIR__ . '/../../../Modules/Media/Files/Modules/ContractManagement/Contracts/' . ($request->getData('contract_title') ?? '0'), + virtualPath: '/Modules/ContractManagement/Contracts/' . ($request->getData('contract_title') ?? '0'), pathSettings: PathSettings::FILE_PATH ); + if ($request->hasData('type')) { + foreach ($uploaded as $file) { + $this->createModelRelation( + $request->header->account, + $file->getId(), + $request->getData('type', 'int'), + MediaMapper::class, + 'types', + '', + $request->getOrigin() + ); + } + } + $this->createModelRelation( $request->header->account, (int) $request->getData('contract'), diff --git a/Models/ContractMapper.php b/Models/ContractMapper.php index c5f848b..8b3c06e 100755 --- a/Models/ContractMapper.php +++ b/Models/ContractMapper.php @@ -82,7 +82,7 @@ final class ContractMapper extends DataMapperFactory /** * Has one relation. * - * @var array + * @var array * @since 1.0.0 */ public const OWNS_ONE = [ @@ -103,7 +103,7 @@ final class ContractMapper extends DataMapperFactory /** * Has many relation. * - * @var array + * @var array * @since 1.0.0 */ public const HAS_MANY = [ diff --git a/Models/ContractTypeMapper.php b/Models/ContractTypeMapper.php index 4d2793e..3a67519 100755 --- a/Models/ContractTypeMapper.php +++ b/Models/ContractTypeMapper.php @@ -39,7 +39,7 @@ final class ContractTypeMapper extends DataMapperFactory /** * Has many relation. * - * @var array + * @var array * @since 1.0.0 */ public const HAS_MANY = [ From fbc7b3d22dea0a5bf5fd5c0b32f21db0ea098fab Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sat, 11 Mar 2023 23:38:17 +0100 Subject: [PATCH 064/133] too many changes --- Models/ContractMapper.php | 2 +- Models/ContractTypeL11nMapper.php | 2 +- Models/ContractTypeMapper.php | 2 +- info.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Models/ContractMapper.php b/Models/ContractMapper.php index 8b3c06e..81f779c 100755 --- a/Models/ContractMapper.php +++ b/Models/ContractMapper.php @@ -69,7 +69,7 @@ final class ContractMapper extends DataMapperFactory * @var string * @since 1.0.0 */ - public const PRIMARYFIELD ='contractmgmt_contract_id'; + public const PRIMARYFIELD = 'contractmgmt_contract_id'; /** * Created at. diff --git a/Models/ContractTypeL11nMapper.php b/Models/ContractTypeL11nMapper.php index 02e1397..f405878 100755 --- a/Models/ContractTypeL11nMapper.php +++ b/Models/ContractTypeL11nMapper.php @@ -53,5 +53,5 @@ final class ContractTypeL11nMapper extends DataMapperFactory * @var string * @since 1.0.0 */ - public const PRIMARYFIELD ='contractmgmt_type_l11n_id'; + public const PRIMARYFIELD = 'contractmgmt_type_l11n_id'; } diff --git a/Models/ContractTypeMapper.php b/Models/ContractTypeMapper.php index 3a67519..2f016d8 100755 --- a/Models/ContractTypeMapper.php +++ b/Models/ContractTypeMapper.php @@ -66,5 +66,5 @@ final class ContractTypeMapper extends DataMapperFactory * @var string * @since 1.0.0 */ - public const PRIMARYFIELD ='contractmgmt_type_id'; + public const PRIMARYFIELD = 'contractmgmt_type_id'; } diff --git a/info.json b/info.json index c4ce549..3e6a4a1 100755 --- a/info.json +++ b/info.json @@ -11,7 +11,7 @@ "phpOMS-db": "1.0.0" }, "creator": { - "name": "Karaka", + "name": "Jingga", "website": "jingga.app" }, "description": "ContractManagement module.", From 6a1693debfa9ed0a851d025a1b8e54e187b0e310 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Fri, 24 Mar 2023 16:20:21 +0100 Subject: [PATCH 065/133] registration fixes --- Admin/Install/Admin.install.php | 2 +- Admin/Install/Media.php | 4 +-- Admin/Install/Navigation.install.json | 4 +-- Admin/Install/Navigation.php | 4 +-- Admin/Installer.php | 4 +-- Admin/Routes/Web/Backend.php | 2 +- Admin/Status.php | 4 +-- Admin/Uninstaller.php | 4 +-- Admin/Updater.php | 4 +-- Controller/ApiController.php | 35 +++++++++++------------ Controller/BackendController.php | 8 +++--- Controller/Controller.php | 4 +-- Models/Contract.php | 4 +-- Models/ContractMapper.php | 4 +-- Models/ContractType.php | 4 +-- Models/ContractTypeL11n.php | 4 +-- Models/ContractTypeL11nMapper.php | 4 +-- Models/ContractTypeMapper.php | 4 +-- Models/NullContract.php | 4 +-- Models/NullContractType.php | 4 +-- Models/NullContractTypeL11n.php | 4 +-- Models/PermissionCategory.php | 4 +-- Models/SettingsEnum.php | 4 +-- Theme/Backend/Lang/Navigation.ar.lang.php | 2 +- Theme/Backend/Lang/Navigation.cs.lang.php | 2 +- Theme/Backend/Lang/Navigation.da.lang.php | 2 +- Theme/Backend/Lang/Navigation.de.lang.php | 2 +- Theme/Backend/Lang/Navigation.el.lang.php | 2 +- Theme/Backend/Lang/Navigation.en.lang.php | 2 +- Theme/Backend/Lang/Navigation.es.lang.php | 2 +- Theme/Backend/Lang/Navigation.fi.lang.php | 2 +- Theme/Backend/Lang/Navigation.fr.lang.php | 2 +- Theme/Backend/Lang/Navigation.hu.lang.php | 2 +- Theme/Backend/Lang/Navigation.it.lang.php | 2 +- Theme/Backend/Lang/Navigation.ja.lang.php | 2 +- Theme/Backend/Lang/Navigation.ko.lang.php | 2 +- Theme/Backend/Lang/Navigation.no.lang.php | 2 +- Theme/Backend/Lang/Navigation.pl.lang.php | 2 +- Theme/Backend/Lang/Navigation.pt.lang.php | 2 +- Theme/Backend/Lang/Navigation.ru.lang.php | 2 +- Theme/Backend/Lang/Navigation.sv.lang.php | 2 +- Theme/Backend/Lang/Navigation.th.lang.php | 2 +- Theme/Backend/Lang/Navigation.tr.lang.php | 2 +- Theme/Backend/Lang/Navigation.uk.lang.php | 2 +- Theme/Backend/Lang/Navigation.zh.lang.php | 2 +- Theme/Backend/Lang/ar.lang.php | 2 +- Theme/Backend/Lang/cs.lang.php | 2 +- Theme/Backend/Lang/da.lang.php | 2 +- Theme/Backend/Lang/de.lang.php | 2 +- Theme/Backend/Lang/el.lang.php | 2 +- Theme/Backend/Lang/en.lang.php | 2 +- Theme/Backend/Lang/es.lang.php | 2 +- Theme/Backend/Lang/fi.lang.php | 2 +- Theme/Backend/Lang/fr.lang.php | 2 +- Theme/Backend/Lang/hu.lang.php | 2 +- Theme/Backend/Lang/it.lang.php | 2 +- Theme/Backend/Lang/ja.lang.php | 2 +- Theme/Backend/Lang/ko.lang.php | 2 +- Theme/Backend/Lang/no.lang.php | 2 +- Theme/Backend/Lang/pl.lang.php | 2 +- Theme/Backend/Lang/pt.lang.php | 2 +- Theme/Backend/Lang/ru.lang.php | 2 +- Theme/Backend/Lang/sv.lang.php | 2 +- Theme/Backend/Lang/th.lang.php | 2 +- Theme/Backend/Lang/tr.lang.php | 2 +- Theme/Backend/Lang/uk.lang.php | 2 +- Theme/Backend/Lang/zh.lang.php | 2 +- Theme/Backend/contract-list.tpl.php | 10 +++---- Theme/Backend/contract-single.tpl.php | 2 +- tests/Admin/AdminTest.php | 2 +- tests/Controller/ApiControllerTest.php | 2 +- tests/Models/ContractTest.php | 2 +- tests/Models/ContractTypeL11nTest.php | 2 +- tests/Models/ContractTypeTest.php | 2 +- tests/Models/NullContractTest.php | 2 +- tests/Models/NullContractTypeL11nTest.php | 2 +- tests/Models/NullContractTypeTest.php | 2 +- 77 files changed, 118 insertions(+), 121 deletions(-) diff --git a/Admin/Install/Admin.install.php b/Admin/Install/Admin.install.php index 512daa8..5fe9393 100755 --- a/Admin/Install/Admin.install.php +++ b/Admin/Install/Admin.install.php @@ -6,7 +6,7 @@ * * @package Modules\ContractManagement\Admin * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Admin/Install/Media.php b/Admin/Install/Media.php index d8a7eb2..068b074 100755 --- a/Admin/Install/Media.php +++ b/Admin/Install/Media.php @@ -6,7 +6,7 @@ * * @package Modules\ContractManagement\Admin\Install * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ @@ -20,7 +20,7 @@ use phpOMS\Application\ApplicationAbstract; * Media class. * * @package Modules\ContractManagement\Admin\Install - * @license OMS License 1.0 + * @license OMS License 2.0 * @link https://jingga.app * @since 1.0.0 */ diff --git a/Admin/Install/Navigation.install.json b/Admin/Install/Navigation.install.json index 14aa3ed..c6eb094 100755 --- a/Admin/Install/Navigation.install.json +++ b/Admin/Install/Navigation.install.json @@ -5,7 +5,7 @@ "type": 2, "subtype": 1, "name": "Contract", - "uri": "{/lang}/{/app}/contract/list?{?}", + "uri": "{/base}/contract/list?{?}", "target": "self", "icon": null, "order": 45, @@ -19,7 +19,7 @@ "type": 3, "subtype": 1, "name": "Contracts", - "uri": "{/lang}/{/app}/contract/list?{?}", + "uri": "{/base}/contract/list?{?}", "target": "self", "icon": null, "order": 1, diff --git a/Admin/Install/Navigation.php b/Admin/Install/Navigation.php index 0ff6994..d147194 100755 --- a/Admin/Install/Navigation.php +++ b/Admin/Install/Navigation.php @@ -6,7 +6,7 @@ * * @package Modules\ContractManagement\Admin\Install * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ @@ -20,7 +20,7 @@ use phpOMS\Application\ApplicationAbstract; * Navigation class. * * @package Modules\ContractManagement\Admin\Install - * @license OMS License 1.0 + * @license OMS License 2.0 * @link https://jingga.app * @since 1.0.0 */ diff --git a/Admin/Installer.php b/Admin/Installer.php index bca8168..3fe846e 100755 --- a/Admin/Installer.php +++ b/Admin/Installer.php @@ -6,7 +6,7 @@ * * @package Modules\ContractManagement\Admin * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ @@ -20,7 +20,7 @@ use phpOMS\Module\InstallerAbstract; * Installer class. * * @package Modules\ContractManagement\Admin - * @license OMS License 1.0 + * @license OMS License 2.0 * @link https://jingga.app * @since 1.0.0 */ diff --git a/Admin/Routes/Web/Backend.php b/Admin/Routes/Web/Backend.php index 822763b..e7bb0cc 100755 --- a/Admin/Routes/Web/Backend.php +++ b/Admin/Routes/Web/Backend.php @@ -6,7 +6,7 @@ * * @package Modules * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Admin/Status.php b/Admin/Status.php index 47dbc7c..fab636a 100755 --- a/Admin/Status.php +++ b/Admin/Status.php @@ -6,7 +6,7 @@ * * @package Modules\ContractManagement\Admin * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ @@ -20,7 +20,7 @@ use phpOMS\Module\StatusAbstract; * Status class. * * @package Modules\ContractManagement\Admin - * @license OMS License 1.0 + * @license OMS License 2.0 * @link https://jingga.app * @since 1.0.0 */ diff --git a/Admin/Uninstaller.php b/Admin/Uninstaller.php index edafbed..6c15d0d 100755 --- a/Admin/Uninstaller.php +++ b/Admin/Uninstaller.php @@ -6,7 +6,7 @@ * * @package Modules\ContractManagement\Admin * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ @@ -20,7 +20,7 @@ use phpOMS\Module\UninstallerAbstract; * Uninstaller class. * * @package Modules\ContractManagement\Admin - * @license OMS License 1.0 + * @license OMS License 2.0 * @link https://jingga.app * @since 1.0.0 */ diff --git a/Admin/Updater.php b/Admin/Updater.php index 80f71aa..fcbc9c0 100755 --- a/Admin/Updater.php +++ b/Admin/Updater.php @@ -6,7 +6,7 @@ * * @package Modules\ContractManagement\Admin * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ @@ -20,7 +20,7 @@ use phpOMS\Module\UpdaterAbstract; * Updater class. * * @package Modules\ContractManagement\Admin - * @license OMS License 1.0 + * @license OMS License 2.0 * @link https://jingga.app * @since 1.0.0 */ diff --git a/Controller/ApiController.php b/Controller/ApiController.php index 2455d28..c365a38 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -6,7 +6,7 @@ * * @package Modules\ContractManagement * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ @@ -36,7 +36,7 @@ use phpOMS\Model\Message\FormValidation; * Api controller for the contracts module. * * @package Modules\ContractManagement - * @license OMS License 1.0 + * @license OMS License 2.0 * @link https://jingga.app * @since 1.0.0 */ @@ -104,18 +104,15 @@ final class ApiController extends Controller private function createContractFromRequest(RequestAbstract $request) : Contract { $contract = new Contract(); - $contract->title = (string) ($request->getData('title') ?? ''); - $contract->description = (string) ($request->getData('description') ?? ''); - $contract->type = new NullContractType((int) ($request->getData('type') ?? 0)); - $contract->start = new \DateTime($request->getData('start') ?? 'now'); - $contract->account = new NullAccount((int) ($request->getData('account') ?? 0)); - $contract->renewal = (int) ($request->getData('renewal') ?? 0); - $contract->autoRenewal = (bool) ($request->getData('autorenewal') ?? false); - $contract->unit = New NullUnit((int) ($request->getData('unit') ?? 0)); - - if (!empty($request->getData('end'))) { - $contract->end = new \DateTime($request->getData('end')); - } + $contract->title = $request->getDataString('title') ?? ''; + $contract->description = $request->getDataString('description') ?? ''; + $contract->type = new NullContractType($request->getDataInt('type') ?? 0); + $contract->start = $request->getDataDateTime('start') ?? new \DateTime('now'); + $contract->account = new NullAccount($request->getDataInt('account') ?? 0); + $contract->renewal = $request->getDataInt('renewal') ?? 0; + $contract->autoRenewal = $request->getDataBool('autorenewal') ?? false; + $contract->unit = New NullUnit($request->getDataInt('unit') ?? 0); + $contract->end = $request->getDataDateTime('end'); return $contract; } @@ -159,7 +156,7 @@ final class ApiController extends Controller $this->createModelRelation( $request->header->account, $file->getId(), - $request->getData('type', 'int'), + $request->getDataInt('type'), MediaMapper::class, 'types', '', @@ -218,7 +215,7 @@ final class ApiController extends Controller private function createContractTypeFromRequest(RequestAbstract $request) : ContractType { $contractType = new ContractType(); - $contractType->setL11n($request->getData('title'), $request->getData('language') ?? ISO639x1Enum::_EN); + $contractType->setL11n($request->getDataString('title') ?? '', $request->getDataString('language') ?? ISO639x1Enum::_EN); return $contractType; } @@ -282,9 +279,9 @@ final class ApiController extends Controller private function createContractTypeL11nFromRequest(RequestAbstract $request) : ContractTypeL11n { $typeL11n = new ContractTypeL11n( - (int) ($request->getData('type') ?? 0), - (string) ($request->getData('title') ?? ''), - $request->getData('language') ?? $request->getLanguage() + $request->getDataInt('type') ?? 0, + $request->getDataString('title') ?? '', + $request->getDataString('language') ?? $request->getLanguage() ); return $typeL11n; diff --git a/Controller/BackendController.php b/Controller/BackendController.php index 6a2d802..c8e409a 100755 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -6,7 +6,7 @@ * * @package Modules\ContractManagement * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ @@ -27,7 +27,7 @@ use phpOMS\Views\View; * @property \Web\WebApplication $app * * @package Modules\ContractManagement - * @license OMS License 1.0 + * @license OMS License 2.0 * @link https://jingga.app * @since 1.0.0 * @codeCoverageIgnore @@ -55,11 +55,11 @@ final class BackendController extends Controller if ($request->getData('ptype') === 'p') { $view->setData('contracts', - ContractMapper::getAll()->where('id', (int) ($request->getData('id') ?? 0), '<')->limit(25)->execute() + ContractMapper::getAll()->where('id', $request->getDataInt('id') ?? 0, '<')->limit(25)->execute() ); } elseif ($request->getData('ptype') === 'n') { $view->setData('contracts', - ContractMapper::getAll()->where('id', (int) ($request->getData('id') ?? 0), '>')->limit(25)->execute() + ContractMapper::getAll()->where('id', $request->getDataInt('id') ?? 0, '>')->limit(25)->execute() ); } else { $view->setData('contracts', diff --git a/Controller/Controller.php b/Controller/Controller.php index 925b86f..2b32b31 100755 --- a/Controller/Controller.php +++ b/Controller/Controller.php @@ -6,7 +6,7 @@ * * @package Modules\ContractManagement * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ @@ -20,7 +20,7 @@ use phpOMS\Module\ModuleAbstract; * Contract controller class. * * @package Modules\ContractManagement - * @license OMS License 1.0 + * @license OMS License 2.0 * @link https://jingga.app * @since 1.0.0 */ diff --git a/Models/Contract.php b/Models/Contract.php index 057f250..4e6e832 100755 --- a/Models/Contract.php +++ b/Models/Contract.php @@ -6,7 +6,7 @@ * * @package Modules\ContractManagement\Models * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ @@ -24,7 +24,7 @@ use phpOMS\Localization\Money; * Account class. * * @package Modules\ContractManagement\Models - * @license OMS License 1.0 + * @license OMS License 2.0 * @link https://jingga.app * @since 1.0.0 */ diff --git a/Models/ContractMapper.php b/Models/ContractMapper.php index 81f779c..24aa0a2 100755 --- a/Models/ContractMapper.php +++ b/Models/ContractMapper.php @@ -7,7 +7,7 @@ * * @package Modules\ContractManagement\Models * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ @@ -25,7 +25,7 @@ use phpOMS\DataStorage\Database\Mapper\DataMapperFactory; * Contract mapper class. * * @package Modules\ContractManagement\Models - * @license OMS License 1.0 + * @license OMS License 2.0 * @link https://jingga.app * @since 1.0.0 */ diff --git a/Models/ContractType.php b/Models/ContractType.php index e81371b..7679b71 100755 --- a/Models/ContractType.php +++ b/Models/ContractType.php @@ -6,7 +6,7 @@ * * @package Modules\ContractManagement\Models * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ @@ -20,7 +20,7 @@ use phpOMS\Localization\ISO639x1Enum; * Contract Type class. * * @package Modules\ContractManagement\Models - * @license OMS License 1.0 + * @license OMS License 2.0 * @link https://jingga.app * @since 1.0.0 */ diff --git a/Models/ContractTypeL11n.php b/Models/ContractTypeL11n.php index c8eff79..1d64d90 100755 --- a/Models/ContractTypeL11n.php +++ b/Models/ContractTypeL11n.php @@ -6,7 +6,7 @@ * * @package Modules\ContractManagement\Models * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ @@ -20,7 +20,7 @@ use phpOMS\Localization\ISO639x1Enum; * Contract type l11n class. * * @package Modules\ContractManagement\Models - * @license OMS License 1.0 + * @license OMS License 2.0 * @link https://jingga.app * @since 1.0.0 */ diff --git a/Models/ContractTypeL11nMapper.php b/Models/ContractTypeL11nMapper.php index f405878..751a599 100755 --- a/Models/ContractTypeL11nMapper.php +++ b/Models/ContractTypeL11nMapper.php @@ -6,7 +6,7 @@ * * @package Modules\ContractManagement\Models * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ @@ -20,7 +20,7 @@ use phpOMS\DataStorage\Database\Mapper\DataMapperFactory; * Contract type l11n mapper class. * * @package Modules\ContractManagement\Models - * @license OMS License 1.0 + * @license OMS License 2.0 * @link https://jingga.app * @since 1.0.0 */ diff --git a/Models/ContractTypeMapper.php b/Models/ContractTypeMapper.php index 2f016d8..690fdd9 100755 --- a/Models/ContractTypeMapper.php +++ b/Models/ContractTypeMapper.php @@ -6,7 +6,7 @@ * * @package Modules\ContractManagement\Models * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ @@ -20,7 +20,7 @@ use phpOMS\DataStorage\Database\Mapper\DataMapperFactory; * Contract type mapper class. * * @package Modules\ContractManagement\Models - * @license OMS License 1.0 + * @license OMS License 2.0 * @link https://jingga.app * @since 1.0.0 */ diff --git a/Models/NullContract.php b/Models/NullContract.php index 0d60354..a45e082 100755 --- a/Models/NullContract.php +++ b/Models/NullContract.php @@ -6,7 +6,7 @@ * * @package Modules\ContractManagement\Models * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ @@ -18,7 +18,7 @@ namespace Modules\ContractManagement\Models; * Contract model. * * @package Modules\ContractManagement\Models - * @license OMS License 1.0 + * @license OMS License 2.0 * @link https://jingga.app * @since 1.0.0 */ diff --git a/Models/NullContractType.php b/Models/NullContractType.php index 5240d17..65983e8 100755 --- a/Models/NullContractType.php +++ b/Models/NullContractType.php @@ -6,7 +6,7 @@ * * @package Modules\ContractManagement\Models * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ @@ -18,7 +18,7 @@ namespace Modules\ContractManagement\Models; * Contract model. * * @package Modules\ContractManagement\Models - * @license OMS License 1.0 + * @license OMS License 2.0 * @link https://jingga.app * @since 1.0.0 */ diff --git a/Models/NullContractTypeL11n.php b/Models/NullContractTypeL11n.php index c8aacb2..adad4a1 100755 --- a/Models/NullContractTypeL11n.php +++ b/Models/NullContractTypeL11n.php @@ -6,7 +6,7 @@ * * @package Modules\ContractManagement\Models * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ @@ -18,7 +18,7 @@ namespace Modules\ContractManagement\Models; * Contract model. * * @package Modules\ContractManagement\Models - * @license OMS License 1.0 + * @license OMS License 2.0 * @link https://jingga.app * @since 1.0.0 */ diff --git a/Models/PermissionCategory.php b/Models/PermissionCategory.php index 64d672a..86b799b 100755 --- a/Models/PermissionCategory.php +++ b/Models/PermissionCategory.php @@ -6,7 +6,7 @@ * * @package Modules\ContractManagement\Models * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ @@ -20,7 +20,7 @@ use phpOMS\Stdlib\Base\Enum; * Permision state enum. * * @package Modules\ContractManagement\Models - * @license OMS License 1.0 + * @license OMS License 2.0 * @link https://jingga.app * @since 1.0.0 */ diff --git a/Models/SettingsEnum.php b/Models/SettingsEnum.php index 83e1318..95c8962 100755 --- a/Models/SettingsEnum.php +++ b/Models/SettingsEnum.php @@ -6,7 +6,7 @@ * * @package Modules\ContractManagement\Models * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ @@ -20,7 +20,7 @@ use phpOMS\Stdlib\Base\Enum; * Module settings enum. * * @package Modules\ContractManagement\Models - * @license OMS License 1.0 + * @license OMS License 2.0 * @link https://jingga.app * @since 1.0.0 */ diff --git a/Theme/Backend/Lang/Navigation.ar.lang.php b/Theme/Backend/Lang/Navigation.ar.lang.php index a35f6ee..1a765d0 100755 --- a/Theme/Backend/Lang/Navigation.ar.lang.php +++ b/Theme/Backend/Lang/Navigation.ar.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/Navigation.cs.lang.php b/Theme/Backend/Lang/Navigation.cs.lang.php index 5e1d4e6..8a9786a 100755 --- a/Theme/Backend/Lang/Navigation.cs.lang.php +++ b/Theme/Backend/Lang/Navigation.cs.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/Navigation.da.lang.php b/Theme/Backend/Lang/Navigation.da.lang.php index 560f9f1..1377993 100755 --- a/Theme/Backend/Lang/Navigation.da.lang.php +++ b/Theme/Backend/Lang/Navigation.da.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/Navigation.de.lang.php b/Theme/Backend/Lang/Navigation.de.lang.php index 54b538d..686df94 100755 --- a/Theme/Backend/Lang/Navigation.de.lang.php +++ b/Theme/Backend/Lang/Navigation.de.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/Navigation.el.lang.php b/Theme/Backend/Lang/Navigation.el.lang.php index 741b3ab..f37eb8c 100755 --- a/Theme/Backend/Lang/Navigation.el.lang.php +++ b/Theme/Backend/Lang/Navigation.el.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/Navigation.en.lang.php b/Theme/Backend/Lang/Navigation.en.lang.php index 2b1d280..9315dd0 100755 --- a/Theme/Backend/Lang/Navigation.en.lang.php +++ b/Theme/Backend/Lang/Navigation.en.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/Navigation.es.lang.php b/Theme/Backend/Lang/Navigation.es.lang.php index 3925074..29503ff 100755 --- a/Theme/Backend/Lang/Navigation.es.lang.php +++ b/Theme/Backend/Lang/Navigation.es.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/Navigation.fi.lang.php b/Theme/Backend/Lang/Navigation.fi.lang.php index 91a2e2c..096e126 100755 --- a/Theme/Backend/Lang/Navigation.fi.lang.php +++ b/Theme/Backend/Lang/Navigation.fi.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/Navigation.fr.lang.php b/Theme/Backend/Lang/Navigation.fr.lang.php index 029b06a..81879f6 100755 --- a/Theme/Backend/Lang/Navigation.fr.lang.php +++ b/Theme/Backend/Lang/Navigation.fr.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/Navigation.hu.lang.php b/Theme/Backend/Lang/Navigation.hu.lang.php index 59467b1..8cae809 100755 --- a/Theme/Backend/Lang/Navigation.hu.lang.php +++ b/Theme/Backend/Lang/Navigation.hu.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/Navigation.it.lang.php b/Theme/Backend/Lang/Navigation.it.lang.php index c4382d6..2048e9a 100755 --- a/Theme/Backend/Lang/Navigation.it.lang.php +++ b/Theme/Backend/Lang/Navigation.it.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/Navigation.ja.lang.php b/Theme/Backend/Lang/Navigation.ja.lang.php index 529a17c..e837bd3 100755 --- a/Theme/Backend/Lang/Navigation.ja.lang.php +++ b/Theme/Backend/Lang/Navigation.ja.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/Navigation.ko.lang.php b/Theme/Backend/Lang/Navigation.ko.lang.php index 9cf0cde..b3e2c97 100755 --- a/Theme/Backend/Lang/Navigation.ko.lang.php +++ b/Theme/Backend/Lang/Navigation.ko.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/Navigation.no.lang.php b/Theme/Backend/Lang/Navigation.no.lang.php index 93552b6..b43a96c 100755 --- a/Theme/Backend/Lang/Navigation.no.lang.php +++ b/Theme/Backend/Lang/Navigation.no.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/Navigation.pl.lang.php b/Theme/Backend/Lang/Navigation.pl.lang.php index ebf910d..9d6601a 100755 --- a/Theme/Backend/Lang/Navigation.pl.lang.php +++ b/Theme/Backend/Lang/Navigation.pl.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/Navigation.pt.lang.php b/Theme/Backend/Lang/Navigation.pt.lang.php index ba91b8c..7bb9aac 100755 --- a/Theme/Backend/Lang/Navigation.pt.lang.php +++ b/Theme/Backend/Lang/Navigation.pt.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/Navigation.ru.lang.php b/Theme/Backend/Lang/Navigation.ru.lang.php index c4e646b..e0828c3 100755 --- a/Theme/Backend/Lang/Navigation.ru.lang.php +++ b/Theme/Backend/Lang/Navigation.ru.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/Navigation.sv.lang.php b/Theme/Backend/Lang/Navigation.sv.lang.php index 5b43127..53f1d8b 100755 --- a/Theme/Backend/Lang/Navigation.sv.lang.php +++ b/Theme/Backend/Lang/Navigation.sv.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/Navigation.th.lang.php b/Theme/Backend/Lang/Navigation.th.lang.php index 6f8c177..7c49fe1 100755 --- a/Theme/Backend/Lang/Navigation.th.lang.php +++ b/Theme/Backend/Lang/Navigation.th.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/Navigation.tr.lang.php b/Theme/Backend/Lang/Navigation.tr.lang.php index 33e26cd..3e1d2d5 100755 --- a/Theme/Backend/Lang/Navigation.tr.lang.php +++ b/Theme/Backend/Lang/Navigation.tr.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/Navigation.uk.lang.php b/Theme/Backend/Lang/Navigation.uk.lang.php index 63fbb0e..ef7dbc0 100755 --- a/Theme/Backend/Lang/Navigation.uk.lang.php +++ b/Theme/Backend/Lang/Navigation.uk.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/Navigation.zh.lang.php b/Theme/Backend/Lang/Navigation.zh.lang.php index f42c45d..fc3cf39 100755 --- a/Theme/Backend/Lang/Navigation.zh.lang.php +++ b/Theme/Backend/Lang/Navigation.zh.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/ar.lang.php b/Theme/Backend/Lang/ar.lang.php index 892f9c2..29f5dcb 100755 --- a/Theme/Backend/Lang/ar.lang.php +++ b/Theme/Backend/Lang/ar.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/cs.lang.php b/Theme/Backend/Lang/cs.lang.php index 00fa7e7..dceb82c 100755 --- a/Theme/Backend/Lang/cs.lang.php +++ b/Theme/Backend/Lang/cs.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/da.lang.php b/Theme/Backend/Lang/da.lang.php index 2eede48..786806b 100755 --- a/Theme/Backend/Lang/da.lang.php +++ b/Theme/Backend/Lang/da.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/de.lang.php b/Theme/Backend/Lang/de.lang.php index 084c7cd..b7ca940 100755 --- a/Theme/Backend/Lang/de.lang.php +++ b/Theme/Backend/Lang/de.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/el.lang.php b/Theme/Backend/Lang/el.lang.php index c798edc..5a465bc 100755 --- a/Theme/Backend/Lang/el.lang.php +++ b/Theme/Backend/Lang/el.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/en.lang.php b/Theme/Backend/Lang/en.lang.php index c74fb26..57e6b07 100755 --- a/Theme/Backend/Lang/en.lang.php +++ b/Theme/Backend/Lang/en.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/es.lang.php b/Theme/Backend/Lang/es.lang.php index a5f58d4..159dea9 100755 --- a/Theme/Backend/Lang/es.lang.php +++ b/Theme/Backend/Lang/es.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/fi.lang.php b/Theme/Backend/Lang/fi.lang.php index 5e31180..41bc5ea 100755 --- a/Theme/Backend/Lang/fi.lang.php +++ b/Theme/Backend/Lang/fi.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/fr.lang.php b/Theme/Backend/Lang/fr.lang.php index 3e3cfee..ead6890 100755 --- a/Theme/Backend/Lang/fr.lang.php +++ b/Theme/Backend/Lang/fr.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/hu.lang.php b/Theme/Backend/Lang/hu.lang.php index d874336..1730309 100755 --- a/Theme/Backend/Lang/hu.lang.php +++ b/Theme/Backend/Lang/hu.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/it.lang.php b/Theme/Backend/Lang/it.lang.php index 09ace4d..80e196c 100755 --- a/Theme/Backend/Lang/it.lang.php +++ b/Theme/Backend/Lang/it.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/ja.lang.php b/Theme/Backend/Lang/ja.lang.php index f767fe7..54ad5f2 100755 --- a/Theme/Backend/Lang/ja.lang.php +++ b/Theme/Backend/Lang/ja.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/ko.lang.php b/Theme/Backend/Lang/ko.lang.php index 08fa3dd..b508670 100755 --- a/Theme/Backend/Lang/ko.lang.php +++ b/Theme/Backend/Lang/ko.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/no.lang.php b/Theme/Backend/Lang/no.lang.php index e37cf3e..7f6a627 100755 --- a/Theme/Backend/Lang/no.lang.php +++ b/Theme/Backend/Lang/no.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/pl.lang.php b/Theme/Backend/Lang/pl.lang.php index d1ffb8e..2c87708 100755 --- a/Theme/Backend/Lang/pl.lang.php +++ b/Theme/Backend/Lang/pl.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/pt.lang.php b/Theme/Backend/Lang/pt.lang.php index d76a21a..ffaf4ba 100755 --- a/Theme/Backend/Lang/pt.lang.php +++ b/Theme/Backend/Lang/pt.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/ru.lang.php b/Theme/Backend/Lang/ru.lang.php index f520d32..68c9e5f 100755 --- a/Theme/Backend/Lang/ru.lang.php +++ b/Theme/Backend/Lang/ru.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/sv.lang.php b/Theme/Backend/Lang/sv.lang.php index 8ab2d4a..0104c28 100755 --- a/Theme/Backend/Lang/sv.lang.php +++ b/Theme/Backend/Lang/sv.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/th.lang.php b/Theme/Backend/Lang/th.lang.php index 239591a..f7a229f 100755 --- a/Theme/Backend/Lang/th.lang.php +++ b/Theme/Backend/Lang/th.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/tr.lang.php b/Theme/Backend/Lang/tr.lang.php index e3c7098..74b29a2 100755 --- a/Theme/Backend/Lang/tr.lang.php +++ b/Theme/Backend/Lang/tr.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/uk.lang.php b/Theme/Backend/Lang/uk.lang.php index 1e07912..8ba04a9 100755 --- a/Theme/Backend/Lang/uk.lang.php +++ b/Theme/Backend/Lang/uk.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/Lang/zh.lang.php b/Theme/Backend/Lang/zh.lang.php index 42a8568..1bc5d82 100755 --- a/Theme/Backend/Lang/zh.lang.php +++ b/Theme/Backend/Lang/zh.lang.php @@ -6,7 +6,7 @@ * * @package Modules\Localization * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/Theme/Backend/contract-list.tpl.php b/Theme/Backend/contract-list.tpl.php index e89294b..79305ab 100755 --- a/Theme/Backend/contract-list.tpl.php +++ b/Theme/Backend/contract-list.tpl.php @@ -6,7 +6,7 @@ * * @package Modules\ContractManagement * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ @@ -20,8 +20,8 @@ use phpOMS\Uri\UriFactory; */ $contracts = $this->getData('contracts') ?? []; -$previous = empty($contracts) ? '{/lang}/{/app}/contract/list' : '{/lang}/{/app}/contract/list?{?}&id=' . \reset($contracts)->getId() . '&ptype=p'; -$next = empty($contracts) ? '{/lang}/{/app}/contract/list' : '{/lang}/{/app}/contract/list?{?}&id=' . \end($contracts)->getId() . '&ptype=n'; +$previous = empty($contracts) ? '{/base}/contract/list' : '{/base}/contract/list?{?}&id=' . \reset($contracts)->getId() . '&ptype=p'; +$next = empty($contracts) ? '{/base}/contract/list' : '{/base}/contract/list?{?}&id=' . \end($contracts)->getId() . '&ptype=n'; $now = new \DateTime('now'); @@ -73,7 +73,7 @@ echo $this->getData('nav')->render(); ?> $value) : - $url = UriFactory::build('{/lang}/{/app}/contract/single?{?}&id=' . $value->getId()); + $url = UriFactory::build('{/base}/contract/single?{?}&id=' . $value->getId()); $type = 'ok'; if (($value->end->getTimestamp() < $now->getTimestamp() && $value->end->getTimestamp() + 7776000 > $now->getTimestamp()) @@ -88,7 +88,7 @@ echo $this->getData('nav')->render(); ?> ?> printHtml($value->title); ?> - printHtml($value->account->name1); ?> printHtml($value->account->name2); ?> + printHtml($value->account->name1); ?> printHtml($value->account->name2); ?> end !== null ? $value->end->format('Y-m-d') : ''; ?> diff --git a/Theme/Backend/contract-single.tpl.php b/Theme/Backend/contract-single.tpl.php index 43ad643..588e9f7 100755 --- a/Theme/Backend/contract-single.tpl.php +++ b/Theme/Backend/contract-single.tpl.php @@ -6,7 +6,7 @@ * * @package Modules\ContractManagement * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/tests/Admin/AdminTest.php b/tests/Admin/AdminTest.php index dc0c39d..c268787 100755 --- a/tests/Admin/AdminTest.php +++ b/tests/Admin/AdminTest.php @@ -6,7 +6,7 @@ * * @package tests * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/tests/Controller/ApiControllerTest.php b/tests/Controller/ApiControllerTest.php index c4ce2f0..053d697 100755 --- a/tests/Controller/ApiControllerTest.php +++ b/tests/Controller/ApiControllerTest.php @@ -6,7 +6,7 @@ * * @package tests * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/tests/Models/ContractTest.php b/tests/Models/ContractTest.php index 531e565..9efd01d 100755 --- a/tests/Models/ContractTest.php +++ b/tests/Models/ContractTest.php @@ -6,7 +6,7 @@ * * @package tests * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/tests/Models/ContractTypeL11nTest.php b/tests/Models/ContractTypeL11nTest.php index 2680bc3..79b1241 100755 --- a/tests/Models/ContractTypeL11nTest.php +++ b/tests/Models/ContractTypeL11nTest.php @@ -6,7 +6,7 @@ * * @package tests * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/tests/Models/ContractTypeTest.php b/tests/Models/ContractTypeTest.php index 8af2103..ab9ba80 100755 --- a/tests/Models/ContractTypeTest.php +++ b/tests/Models/ContractTypeTest.php @@ -6,7 +6,7 @@ * * @package tests * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/tests/Models/NullContractTest.php b/tests/Models/NullContractTest.php index 2090576..785d4c9 100755 --- a/tests/Models/NullContractTest.php +++ b/tests/Models/NullContractTest.php @@ -6,7 +6,7 @@ * * @package tests * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/tests/Models/NullContractTypeL11nTest.php b/tests/Models/NullContractTypeL11nTest.php index 6d157c1..070b3de 100755 --- a/tests/Models/NullContractTypeL11nTest.php +++ b/tests/Models/NullContractTypeL11nTest.php @@ -6,7 +6,7 @@ * * @package tests * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ diff --git a/tests/Models/NullContractTypeTest.php b/tests/Models/NullContractTypeTest.php index 5b953c1..f02e318 100755 --- a/tests/Models/NullContractTypeTest.php +++ b/tests/Models/NullContractTypeTest.php @@ -6,7 +6,7 @@ * * @package tests * @copyright Dennis Eichhorn - * @license OMS License 1.0 + * @license OMS License 2.0 * @version 1.0.0 * @link https://jingga.app */ From 6922d3c5d3dd066ff9394a029fe03d6b031d1272 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sat, 8 Apr 2023 04:36:25 +0200 Subject: [PATCH 066/133] fix billing process --- .github/user_bug_report.md | 14 ++++++++++---- Controller/ApiController.php | 14 +++++++------- tests/Controller/ApiControllerTest.php | 2 +- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/.github/user_bug_report.md b/.github/user_bug_report.md index 9e5f2a5..4b92a8e 100755 --- a/.github/user_bug_report.md +++ b/.github/user_bug_report.md @@ -8,9 +8,11 @@ assignees: '' --- # Bug Description + A clear and concise description of what the bug is. # How to Reproduce + Steps to reproduce the behavior: 1. Go to '...' @@ -19,16 +21,20 @@ Steps to reproduce the behavior: 4. See error # Expected Behavior + A clear and concise description of what you expected to happen. # Screenshots + If applicable, add screenshots to help explain your problem. # System Information - - System: [e.g. PC or iPhone11, ...] - - OS: [e.g. iOS] - - Browser [e.g. chrome, safari] - - KarakaVersion [e.g. 22] + +- System: [e.g. PC or iPhone11, ...] +- OS: [e.g. iOS] +- Browser [e.g. chrome, safari] +- KarakaVersion [e.g. 22] # Additional Information + Add any other context about the problem here. diff --git a/Controller/ApiController.php b/Controller/ApiController.php index c365a38..d0ea70a 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -81,10 +81,10 @@ final class ApiController extends Controller private function validateContractCreate(RequestAbstract $request) : array { $val = []; - if (($val['title'] = empty($request->getData('title'))) - || ($val['start'] = empty($request->getData('start'))) - || ($val['duration'] = empty($request->getData('duration'))) - || ($val['type'] = empty($request->getData('type'))) + if (($val['title'] = !$request->hasData('title')) + || ($val['start'] = !$request->hasData('start')) + || ($val['duration'] = !$request->hasData('duration')) + || ($val['type'] = !$request->hasData('type')) ) { return $val; } @@ -232,7 +232,7 @@ final class ApiController extends Controller private function validateContractTypeCreate(RequestAbstract $request) : array { $val = []; - if (($val['title'] = empty($request->getData('title'))) + if (($val['title'] = !$request->hasData('title')) ) { return $val; } @@ -299,8 +299,8 @@ final class ApiController extends Controller private function validateContractTypeL11nCreate(RequestAbstract $request) : array { $val = []; - if (($val['title'] = empty($request->getData('title'))) - || ($val['type'] = empty($request->getData('type'))) + if (($val['title'] = !$request->hasData('title')) + || ($val['type'] = !$request->hasData('type')) ) { return $val; } diff --git a/tests/Controller/ApiControllerTest.php b/tests/Controller/ApiControllerTest.php index 053d697..13b240b 100755 --- a/tests/Controller/ApiControllerTest.php +++ b/tests/Controller/ApiControllerTest.php @@ -72,7 +72,7 @@ final class ApiControllerTest extends \PHPUnit\Framework\TestCase $permission = new AccountPermission(); $permission->setUnit(1); - $permission->setApp('backend'); + $permission->setApp(2); $permission->setPermission( PermissionType::READ | PermissionType::CREATE From 291ac578db855ac6943f89fedb703b9bbb7b62d5 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Tue, 11 Apr 2023 00:20:12 +0200 Subject: [PATCH 067/133] fix static analysis --- .github/user_feature_request.md | 3 +++ Models/ContractMapper.php | 3 +++ Models/ContractTypeL11nMapper.php | 3 +++ Models/ContractTypeMapper.php | 3 +++ 4 files changed, 12 insertions(+) diff --git a/.github/user_feature_request.md b/.github/user_feature_request.md index 6eb8ddc..c9595e8 100755 --- a/.github/user_feature_request.md +++ b/.github/user_feature_request.md @@ -8,11 +8,14 @@ assignees: '' --- # What is the feature you request + * A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] * A clear and concise description of what you want to happen. # Alternatives + A clear and concise description of any alternative solutions or features you've considered. # Additional Information + Add any other context or screenshots about the feature request here. diff --git a/Models/ContractMapper.php b/Models/ContractMapper.php index 24aa0a2..a70c639 100755 --- a/Models/ContractMapper.php +++ b/Models/ContractMapper.php @@ -28,6 +28,9 @@ use phpOMS\DataStorage\Database\Mapper\DataMapperFactory; * @license OMS License 2.0 * @link https://jingga.app * @since 1.0.0 + * + * @template T of Contract + * @extends DataMapperFactory */ final class ContractMapper extends DataMapperFactory { diff --git a/Models/ContractTypeL11nMapper.php b/Models/ContractTypeL11nMapper.php index 751a599..03b1380 100755 --- a/Models/ContractTypeL11nMapper.php +++ b/Models/ContractTypeL11nMapper.php @@ -23,6 +23,9 @@ use phpOMS\DataStorage\Database\Mapper\DataMapperFactory; * @license OMS License 2.0 * @link https://jingga.app * @since 1.0.0 + * + * @template T of BaseStringL11n + * @extends DataMapperFactory */ final class ContractTypeL11nMapper extends DataMapperFactory { diff --git a/Models/ContractTypeMapper.php b/Models/ContractTypeMapper.php index 690fdd9..e9be544 100755 --- a/Models/ContractTypeMapper.php +++ b/Models/ContractTypeMapper.php @@ -23,6 +23,9 @@ use phpOMS\DataStorage\Database\Mapper\DataMapperFactory; * @license OMS License 2.0 * @link https://jingga.app * @since 1.0.0 + * + * @template T of Contract + * @extends DataMapperFactory */ final class ContractTypeMapper extends DataMapperFactory { From 02fbb6f1ef504870fb1f20630b111c0af3df72b1 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sun, 16 Apr 2023 01:55:34 +0200 Subject: [PATCH 068/133] fix demoSetup --- Admin/Install/db.json | 21 ++++- Admin/Install/types.json | 58 +++++++++++++ Admin/Installer.php | 90 ++++++++++++++++++++ Controller/ApiController.php | 43 ++++++++-- Models/Contract.php | 7 +- Models/ContractMapper.php | 2 + Models/ContractType.php | 35 +++++--- Models/ContractTypeL11n.php | 135 ------------------------------ Models/ContractTypeL11nMapper.php | 13 ++- Models/ContractTypeMapper.php | 11 ++- Models/NullContractTypeL11n.php | 47 ----------- 11 files changed, 254 insertions(+), 208 deletions(-) create mode 100644 Admin/Install/types.json delete mode 100755 Models/ContractTypeL11n.php delete mode 100755 Models/NullContractTypeL11n.php diff --git a/Admin/Install/db.json b/Admin/Install/db.json index 9bbdb4d..e3b51c9 100755 --- a/Admin/Install/db.json +++ b/Admin/Install/db.json @@ -8,6 +8,11 @@ "null": false, "primary": true, "autoincrement": true + }, + "contractmgmt_type_name": { + "name": "contractmgmt_type_name", + "type": "VARCHAR(255)", + "null": false } } }, @@ -52,6 +57,11 @@ "primary": true, "autoincrement": true }, + "contractmgmt_contract_template": { + "name": "contractmgmt_contract_template", + "type": "TINYINT", + "null": false + }, "contractmgmt_contract_title": { "name": "contractmgmt_contract_title", "type": "VARCHAR(255)", @@ -109,10 +119,19 @@ "contractmgmt_contract_type": { "name": "contractmgmt_contract_type", "type": "INT", - "null": false, + "null": true, + "default": null, "foreignTable": "contractmgmt_type", "foreignKey": "contractmgmt_type_id" }, + "contractmgmt_contract_parent": { + "name": "contractmgmt_contract_parent", + "type": "INT", + "null": true, + "default": null, + "foreignTable": "contractmgmt_contract", + "foreignKey": "contractmgmt_contract_id" + }, "contractmgmt_contract_unit": { "name": "contractmgmt_contract_unit", "type": "INT", diff --git a/Admin/Install/types.json b/Admin/Install/types.json new file mode 100644 index 0000000..fcdb49e --- /dev/null +++ b/Admin/Install/types.json @@ -0,0 +1,58 @@ +[ + { + "name": "rent", + "l11n": { + "en": "Rent", + "de": "Miete" + } + }, + { + "name": "it", + "l11n": { + "en": "IT", + "de": "IT" + } + }, + { + "name": "utilities", + "l11n": { + "en": "Utilities", + "de": "Nebenkosten" + } + }, + { + "name": "energy", + "l11n": { + "en": "Energy", + "de": "Energie" + } + }, + { + "name": "procurement", + "l11n": { + "en": "Procurement", + "de": "Einkauf" + } + }, + { + "name": "sales", + "l11n": { + "en": "Sales", + "de": "Vertrieb" + } + }, + { + "name": "sales_subscription", + "l11n": { + "en": "Sales subscription", + "de": "Vertriebsabonnement" + } + }, + { + "name": "nda", + "l11n": { + "en": "NDA", + "de": "NDA" + } + } +] \ No newline at end of file diff --git a/Admin/Installer.php b/Admin/Installer.php index 3fe846e..d129c20 100755 --- a/Admin/Installer.php +++ b/Admin/Installer.php @@ -14,7 +14,13 @@ declare(strict_types=1); namespace Modules\ContractManagement\Admin; +use phpOMS\Application\ApplicationAbstract; +use phpOMS\Config\SettingsInterface; +use phpOMS\Message\Http\HttpRequest; +use phpOMS\Message\Http\HttpResponse; use phpOMS\Module\InstallerAbstract; +use phpOMS\Module\ModuleInfo; +use phpOMS\Uri\HttpUri; /** * Installer class. @@ -33,4 +39,88 @@ final class Installer extends InstallerAbstract * @since 1.0.0 */ public const PATH = __DIR__; + + /** + * {@inheritdoc} + */ + public static function install(ApplicationAbstract $app, ModuleInfo $info, SettingsInterface $cfgHandler) : void + { + parent::install($app, $info, $cfgHandler); + + /* Bill types */ + $fileContent = \file_get_contents(__DIR__ . '/Install/types.json'); + if ($fileContent === false) { + return; + } + + /** @var array $types */ + $types = \json_decode($fileContent, true); + if ($types === false) { + return; + } + + self::createContractTypes($app, $types); + } + + /** + * Install default contract types + * + * @param ApplicationAbstract $app Application + * @param array $types Bill types + * @param int $template Default template + * + * @return array + * + * @since 1.0.0 + */ + private static function createContractTypes(ApplicationAbstract $app, array $types) : array + { + $contractTypes = []; + + /** @var \Modules\ContractManagement\Controller\ApiController $module */ + $module = $app->moduleManager->getModuleInstance('ContractManagement'); + + foreach ($types as $type) { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('name', $type['name'] ?? ''); + $request->setData('title', \reset($type['l11n'])); + $request->setData('language', \array_keys($type['l11n'])[0] ?? 'en'); + + $module->apiContractTypeCreate($request, $response); + + $responseData = $response->get(''); + if (!\is_array($responseData)) { + continue; + } + + $billType = !\is_array($responseData['response']) + ? $responseData['response']->toArray() + : $responseData['response']; + + $contractTypes[] = $billType; + + $isFirst = true; + foreach ($type['l11n'] as $language => $l11n) { + if ($isFirst) { + $isFirst = false; + continue; + } + + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('title', $l11n); + $request->setData('language', $language); + $request->setData('type', $billType['id']); + + $module->apiContractTypeL11nCreate($request, $response); + } + } + + return $contractTypes; + } } diff --git a/Controller/ApiController.php b/Controller/ApiController.php index d0ea70a..6b919f5 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -18,13 +18,13 @@ use Modules\Admin\Models\NullAccount; use Modules\ContractManagement\Models\Contract; use Modules\ContractManagement\Models\ContractMapper; use Modules\ContractManagement\Models\ContractType; -use Modules\ContractManagement\Models\ContractTypeL11n; use Modules\ContractManagement\Models\ContractTypeL11nMapper; use Modules\ContractManagement\Models\ContractTypeMapper; use Modules\ContractManagement\Models\NullContractType; use Modules\Media\Models\MediaMapper; use Modules\Media\Models\PathSettings; use Modules\Organization\Models\NullUnit; +use phpOMS\Localization\BaseStringL11n; use phpOMS\Localization\ISO639x1Enum; use phpOMS\Message\Http\RequestStatusCode; use phpOMS\Message\NotificationLevel; @@ -92,6 +92,21 @@ final class ApiController extends Controller return []; } + /** + * Create media directory path + * + * @param Contract $contract Contract + * + * @return string + * + * @since 1.0.0 + */ + private function createContractDir(Contract $contract) : string + { + return '/Modules/ContractManagement/Contract/' + . $contract->getId(); + } + /** * Method to create item l11n from request. * @@ -141,14 +156,22 @@ final class ApiController extends Controller return; } + /** @var \Modules\ContractManagement\Models\Contract */ + $contract = ContractMapper::get() + ->where('id', $request->getDataInt('contract')) + ->execute(); + + $path = $this->createContractDir($contract); + $uploaded = $this->app->moduleManager->get('Media')->uploadFiles( names: $request->getDataList('names'), fileNames: $request->getDataList('filenames'), files: $uploadedFiles, account: $request->header->account, - basePath: __DIR__ . '/../../../Modules/Media/Files/Modules/ContractManagement/Contracts/' . ($request->getData('contract_title') ?? '0'), - virtualPath: '/Modules/ContractManagement/Contracts/' . ($request->getData('contract_title') ?? '0'), - pathSettings: PathSettings::FILE_PATH + basePath: __DIR__ . '/../../../Modules/Media/Files' . $path, + virtualPath: $path, + pathSettings: PathSettings::FILE_PATH, + readContent: true ); if ($request->hasData('type')) { @@ -216,6 +239,7 @@ final class ApiController extends Controller { $contractType = new ContractType(); $contractType->setL11n($request->getDataString('title') ?? '', $request->getDataString('language') ?? ISO639x1Enum::_EN); + $contractType->name = $request->getDataString('name') ?? ''; return $contractType; } @@ -272,15 +296,16 @@ final class ApiController extends Controller * * @param RequestAbstract $request Request * - * @return ContractTypeL11n + * @return BaseStringL11n * * @since 1.0.0 */ - private function createContractTypeL11nFromRequest(RequestAbstract $request) : ContractTypeL11n + private function createContractTypeL11nFromRequest(RequestAbstract $request) : BaseStringL11n { - $typeL11n = new ContractTypeL11n( - $request->getDataInt('type') ?? 0, - $request->getDataString('title') ?? '', + $typeL11n = new BaseStringL11n(); + $typeL11n->ref = $request->getDataInt('type') ?? 0; + $typeL11n->content = $request->getDataString('title') ?? ''; + $typeL11n->setLanguage( $request->getDataString('language') ?? $request->getLanguage() ); diff --git a/Models/Contract.php b/Models/Contract.php index 4e6e832..900a162 100755 --- a/Models/Contract.php +++ b/Models/Contract.php @@ -38,6 +38,10 @@ class Contract */ protected int $id = 0; + public ?int $parent = null; + + public bool $isTemplate = false; + /** * Files. * @@ -81,7 +85,7 @@ class Contract public ?Money $costs = null; - public ContractType $type; + public ?ContractType $type = null; public ?Unit $unit = null; @@ -94,7 +98,6 @@ class Contract { $this->createdAt = new \DateTimeImmutable('now'); $this->account = new NullAccount(); - $this->type = new ContractType(); } /** diff --git a/Models/ContractMapper.php b/Models/ContractMapper.php index a70c639..52b750c 100755 --- a/Models/ContractMapper.php +++ b/Models/ContractMapper.php @@ -42,6 +42,8 @@ final class ContractMapper extends DataMapperFactory */ public const COLUMNS = [ 'contractmgmt_contract_id' => ['name' => 'contractmgmt_contract_id', 'type' => 'int', 'internal' => 'id'], + 'contractmgmt_contract_parent' => ['name' => 'contractmgmt_contract_parent', 'type' => 'int', 'internal' => 'parent'], + 'contractmgmt_contract_template' => ['name' => 'contractmgmt_contract_template', 'type' => 'int', 'internal' => 'isTemplate'], 'contractmgmt_contract_title' => ['name' => 'contractmgmt_contract_title', 'type' => 'string', 'internal' => 'title', 'autocomplete' => true], 'contractmgmt_contract_description' => ['name' => 'contractmgmt_contract_description', 'type' => 'string', 'internal' => 'description'], 'contractmgmt_contract_account' => ['name' => 'contractmgmt_contract_account', 'type' => 'int', 'internal' => 'account'], diff --git a/Models/ContractType.php b/Models/ContractType.php index 7679b71..c83a236 100755 --- a/Models/ContractType.php +++ b/Models/ContractType.php @@ -14,6 +14,7 @@ declare(strict_types=1); namespace Modules\ContractManagement\Models; +use phpOMS\Localization\BaseStringL11n; use phpOMS\Localization\ISO639x1Enum; /** @@ -34,12 +35,22 @@ class ContractType implements \JsonSerializable */ protected int $id = 0; + /** + * Name. + * + * Name used for additional identification, doesn't have to be unique. + * + * @var string + * @since 1.0.0 + */ + public string $name = ''; + /** * Localization * - * @var ContractTypeL11n + * @var BaseStringL11n */ - protected string | ContractTypeL11n $l11n; + protected string | BaseStringL11n $l11n; /** * Constructor. @@ -68,22 +79,23 @@ class ContractType implements \JsonSerializable /** * Set l11n * - * @param string|ContractTypeL11n $l11n Tag article l11n - * @param string $lang Language + * @param string|BaseStringL11n $l11n Tag article l11n + * @param string $lang Language * * @return void * * @since 1.0.0 */ - public function setL11n(string|ContractTypeL11n $l11n, string $lang = ISO639x1Enum::_EN) : void + public function setL11n(string|BaseStringL11n $l11n, string $lang = ISO639x1Enum::_EN) : void { - if ($l11n instanceof ContractTypeL11n) { + if ($l11n instanceof BaseStringL11n) { $this->l11n = $l11n; - } elseif (isset($this->l11n) && $this->l11n instanceof ContractTypeL11n) { - $this->l11n->title = $l11n; + } elseif (isset($this->l11n) && $this->l11n instanceof BaseStringL11n) { + $this->l11n->content = $l11n; } else { - $this->l11n = new ContractTypeL11n(); - $this->l11n->title = $l11n; + $this->l11n = new BaseStringL11n(); + $this->l11n->ref = $this->id; + $this->l11n->content = $l11n; $this->l11n->setLanguage($lang); } } @@ -95,7 +107,7 @@ class ContractType implements \JsonSerializable */ public function getL11n() : string { - return $this->l11n instanceof ContractTypeL11n ? $this->l11n->title : $this->l11n; + return $this->l11n instanceof BaseStringL11n ? $this->l11n->content : $this->l11n; } /** @@ -106,6 +118,7 @@ class ContractType implements \JsonSerializable return [ 'id' => $this->id, 'l11n' => $this->l11n, + 'name' => $this->name, ]; } diff --git a/Models/ContractTypeL11n.php b/Models/ContractTypeL11n.php deleted file mode 100755 index 1d64d90..0000000 --- a/Models/ContractTypeL11n.php +++ /dev/null @@ -1,135 +0,0 @@ -type = $type; - $this->title = $title; - $this->language = $language; - } - - /** - * Get id - * - * @return int - * - * @since 1.0.0 - */ - public function getId() : int - { - return $this->id; - } - - /** - * Get language - * - * @return string - * - * @since 1.0.0 - */ - public function getLanguage() : string - { - return $this->language; - } - - /** - * Set language - * - * @param string $language Language - * - * @return void - * - * @since 1.0.0 - */ - public function setLanguage(string $language) : void - { - $this->language = $language; - } - - /** - * {@inheritdoc} - */ - public function toArray() : array - { - return [ - 'id' => $this->id, - 'title' => $this->title, - 'type' => $this->type, - 'language' => $this->language, - ]; - } - - /** - * {@inheritdoc} - */ - public function jsonSerialize() : mixed - { - return $this->toArray(); - } -} diff --git a/Models/ContractTypeL11nMapper.php b/Models/ContractTypeL11nMapper.php index 03b1380..aba79ee 100755 --- a/Models/ContractTypeL11nMapper.php +++ b/Models/ContractTypeL11nMapper.php @@ -15,6 +15,7 @@ declare(strict_types=1); namespace Modules\ContractManagement\Models; use phpOMS\DataStorage\Database\Mapper\DataMapperFactory; +use phpOMS\Localization\BaseStringL11n; /** * Contract type l11n mapper class. @@ -37,8 +38,8 @@ final class ContractTypeL11nMapper extends DataMapperFactory */ public const COLUMNS = [ 'contractmgmt_type_l11n_id' => ['name' => 'contractmgmt_type_l11n_id', 'type' => 'int', 'internal' => 'id'], - 'contractmgmt_type_l11n_title' => ['name' => 'contractmgmt_type_l11n_title', 'type' => 'string', 'internal' => 'title', 'autocomplete' => true], - 'contractmgmt_type_l11n_type' => ['name' => 'contractmgmt_type_l11n_type', 'type' => 'int', 'internal' => 'type'], + 'contractmgmt_type_l11n_title' => ['name' => 'contractmgmt_type_l11n_title', 'type' => 'string', 'internal' => 'content', 'autocomplete' => true], + 'contractmgmt_type_l11n_type' => ['name' => 'contractmgmt_type_l11n_type', 'type' => 'int', 'internal' => 'ref'], 'contractmgmt_type_l11n_lang' => ['name' => 'contractmgmt_type_l11n_lang', 'type' => 'string', 'internal' => 'language'], ]; @@ -57,4 +58,12 @@ final class ContractTypeL11nMapper extends DataMapperFactory * @since 1.0.0 */ public const PRIMARYFIELD = 'contractmgmt_type_l11n_id'; + + /** + * Model to use by the mapper. + * + * @var class-string + * @since 1.0.0 + */ + public const MODEL = BaseStringL11n::class; } diff --git a/Models/ContractTypeMapper.php b/Models/ContractTypeMapper.php index e9be544..e336163 100755 --- a/Models/ContractTypeMapper.php +++ b/Models/ContractTypeMapper.php @@ -37,6 +37,7 @@ final class ContractTypeMapper extends DataMapperFactory */ public const COLUMNS = [ 'contractmgmt_type_id' => ['name' => 'contractmgmt_type_id', 'type' => 'int', 'internal' => 'id'], + 'contractmgmt_type_name' => ['name' => 'contractmgmt_type_name', 'type' => 'string', 'internal' => 'name'], ]; /** @@ -50,11 +51,19 @@ final class ContractTypeMapper extends DataMapperFactory 'mapper' => ContractTypeL11nMapper::class, 'table' => 'contractmgmt_type_l11n', 'self' => 'contractmgmt_type_l11n_type', - 'column' => 'title', + 'column' => 'content', 'external' => null, ], ]; + /** + * Model to use by the mapper. + * + * @var class-string + * @since 1.0.0 + */ + public const MODEL = ContractType::class; + /** * Primary table. * diff --git a/Models/NullContractTypeL11n.php b/Models/NullContractTypeL11n.php deleted file mode 100755 index adad4a1..0000000 --- a/Models/NullContractTypeL11n.php +++ /dev/null @@ -1,47 +0,0 @@ -id = $id; - parent::__construct(); - } - - /** - * {@inheritdoc} - */ - public function jsonSerialize() : mixed - { - return ['id' => $this->id]; - } -} From 11a65af910ae3e543a8bdbdee22d4a8e5346dd73 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Mon, 17 Apr 2023 19:44:57 +0200 Subject: [PATCH 069/133] test fixes --- tests/Controller/ApiControllerTest.php | 2 + tests/Models/ContractTypeL11nTest.php | 87 ----------------------- tests/Models/ContractTypeTest.php | 7 +- tests/Models/NullContractTypeL11nTest.php | 42 ----------- 4 files changed, 5 insertions(+), 133 deletions(-) delete mode 100755 tests/Models/ContractTypeL11nTest.php delete mode 100755 tests/Models/NullContractTypeL11nTest.php diff --git a/tests/Controller/ApiControllerTest.php b/tests/Controller/ApiControllerTest.php index 13b240b..cd55607 100755 --- a/tests/Controller/ApiControllerTest.php +++ b/tests/Controller/ApiControllerTest.php @@ -24,6 +24,7 @@ use phpOMS\DataStorage\Session\HttpSession; use phpOMS\Dispatcher\Dispatcher; use phpOMS\Event\EventManager; use phpOMS\Localization\ISO639x1Enum; +use phpOMS\Localization\L11nManager; use phpOMS\Message\Http\HttpRequest; use phpOMS\Message\Http\HttpResponse; use phpOMS\Message\Http\RequestStatusCode; @@ -66,6 +67,7 @@ final class ApiControllerTest extends \PHPUnit\Framework\TestCase $this->app->eventManager = new EventManager($this->app->dispatcher); $this->app->eventManager->importFromFile(__DIR__ . '/../../../../Web/Api/Hooks.php'); $this->app->sessionManager = new HttpSession(36000); + $this->app->l11nManager = new L11nManager(); $account = new Account(); TestUtils::setMember($account, 'id', 1); diff --git a/tests/Models/ContractTypeL11nTest.php b/tests/Models/ContractTypeL11nTest.php deleted file mode 100755 index 79b1241..0000000 --- a/tests/Models/ContractTypeL11nTest.php +++ /dev/null @@ -1,87 +0,0 @@ -l11n = new ContractTypeL11n(); - } - - /** - * @covers Modules\ContractManagement\Models\ContractTypeL11n - * @group module - */ - public function testDefault() : void - { - self::assertEquals(0, $this->l11n->getId()); - self::assertEquals('', $this->l11n->title); - self::assertEquals(0, $this->l11n->type); - self::assertEquals(ISO639x1Enum::_EN, $this->l11n->getLanguage()); - } - - /** - * @covers Modules\ContractManagement\Models\ContractTypeL11n - * @group module - */ - public function testNameInputOutput() : void - { - $this->l11n->title = 'TestName'; - self::assertEquals('TestName', $this->l11n->title); - } - - /** - * @covers Modules\ContractManagement\Models\ContractTypeL11n - * @group module - */ - public function testLanguageInputOutput() : void - { - $this->l11n->setLanguage(ISO639x1Enum::_DE); - self::assertEquals(ISO639x1Enum::_DE, $this->l11n->getLanguage()); - } - - /** - * @covers Modules\ContractManagement\Models\ContractTypeL11n - * @group module - */ - public function testSerialize() : void - { - $this->l11n->title = 'Title'; - $this->l11n->type = 2; - $this->l11n->setLanguage(ISO639x1Enum::_DE); - - self::assertEquals( - [ - 'id' => 0, - 'title' => 'Title', - 'type' => 2, - 'language' => ISO639x1Enum::_DE, - ], - $this->l11n->jsonSerialize() - ); - } -} diff --git a/tests/Models/ContractTypeTest.php b/tests/Models/ContractTypeTest.php index ab9ba80..6c2b259 100755 --- a/tests/Models/ContractTypeTest.php +++ b/tests/Models/ContractTypeTest.php @@ -16,6 +16,7 @@ namespace Modules\ContractManagement\tests\Models; use Modules\ContractManagement\Models\ContractType; use Modules\ContractManagement\Models\ContractTypeL11n; +use phpOMS\Localization\BaseStringL11n; /** * @internal @@ -51,7 +52,7 @@ final class ContractTypeTest extends \PHPUnit\Framework\TestCase $this->type->setL11n('Test'); self::assertEquals('Test', $this->type->getL11n()); - $this->type->setL11n(new ContractTypeL11n(0, 'NewTest')); + $this->type->setL11n(new BaseStringL11n('NewTest')); self::assertEquals('NewTest', $this->type->getL11n()); } @@ -61,12 +62,10 @@ final class ContractTypeTest extends \PHPUnit\Framework\TestCase */ public function testSerialize() : void { - $this->type->type = 1; - self::assertEquals( [ 'id' => 0, - 'l11n' => new ContractTypeL11n(), + 'l11n' => new BaseStringL11n(), ], $this->type->jsonSerialize() ); diff --git a/tests/Models/NullContractTypeL11nTest.php b/tests/Models/NullContractTypeL11nTest.php deleted file mode 100755 index 070b3de..0000000 --- a/tests/Models/NullContractTypeL11nTest.php +++ /dev/null @@ -1,42 +0,0 @@ -getId()); - } -} From 3341dd02b911739e1fabfd89cb98c0df347ca0d9 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Fri, 21 Apr 2023 19:13:03 +0000 Subject: [PATCH 070/133] prepare workflows --- Admin/Install/types.json | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 Admin/Install/types.json diff --git a/Admin/Install/types.json b/Admin/Install/types.json old mode 100644 new mode 100755 From 46389c0dcc0fa91720c1f5e889f6093ee0c1f131 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Tue, 25 Apr 2023 01:51:27 +0000 Subject: [PATCH 071/133] bug fixes and subscription improvements --- Admin/Installer.php | 1 - 1 file changed, 1 deletion(-) diff --git a/Admin/Installer.php b/Admin/Installer.php index d129c20..c0fb91d 100755 --- a/Admin/Installer.php +++ b/Admin/Installer.php @@ -67,7 +67,6 @@ final class Installer extends InstallerAbstract * * @param ApplicationAbstract $app Application * @param array $types Bill types - * @param int $template Default template * * @return array * From e4a929f0e1857efc64fe8dcdbe663ce03d60634f Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sat, 6 May 2023 11:42:05 +0000 Subject: [PATCH 072/133] make id public, organigram impl. media password/encryption, settings bug fix, Money->FloatInt change, ... --- Controller/ApiController.php | 6 +++--- Models/Contract.php | 2 +- Models/ContractType.php | 2 +- Theme/Backend/contract-list.tpl.php | 8 ++++---- tests/Controller/ApiControllerTest.php | 6 +++--- tests/Models/ContractTest.php | 2 +- tests/Models/ContractTypeTest.php | 2 +- tests/Models/NullContractTest.php | 2 +- tests/Models/NullContractTypeTest.php | 2 +- 9 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Controller/ApiController.php b/Controller/ApiController.php index 6b919f5..fa5e41e 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -104,7 +104,7 @@ final class ApiController extends Controller private function createContractDir(Contract $contract) : string { return '/Modules/ContractManagement/Contract/' - . $contract->getId(); + . $contract->id; } /** @@ -178,7 +178,7 @@ final class ApiController extends Controller foreach ($uploaded as $file) { $this->createModelRelation( $request->header->account, - $file->getId(), + $file->id, $request->getDataInt('type'), MediaMapper::class, 'types', @@ -191,7 +191,7 @@ final class ApiController extends Controller $this->createModelRelation( $request->header->account, (int) $request->getData('contract'), - \reset($uploaded)->getId(), + \reset($uploaded)->id, ContractMapper::class, 'files', '', $request->getOrigin() ); diff --git a/Models/Contract.php b/Models/Contract.php index 900a162..bf2abcd 100755 --- a/Models/Contract.php +++ b/Models/Contract.php @@ -36,7 +36,7 @@ class Contract * @var int * @since 1.0.0 */ - protected int $id = 0; + public int $id = 0; public ?int $parent = null; diff --git a/Models/ContractType.php b/Models/ContractType.php index c83a236..dfa2e78 100755 --- a/Models/ContractType.php +++ b/Models/ContractType.php @@ -33,7 +33,7 @@ class ContractType implements \JsonSerializable * @var int * @since 1.0.0 */ - protected int $id = 0; + public int $id = 0; /** * Name. diff --git a/Theme/Backend/contract-list.tpl.php b/Theme/Backend/contract-list.tpl.php index 79305ab..cfe04dc 100755 --- a/Theme/Backend/contract-list.tpl.php +++ b/Theme/Backend/contract-list.tpl.php @@ -20,8 +20,8 @@ use phpOMS\Uri\UriFactory; */ $contracts = $this->getData('contracts') ?? []; -$previous = empty($contracts) ? '{/base}/contract/list' : '{/base}/contract/list?{?}&id=' . \reset($contracts)->getId() . '&ptype=p'; -$next = empty($contracts) ? '{/base}/contract/list' : '{/base}/contract/list?{?}&id=' . \end($contracts)->getId() . '&ptype=n'; +$previous = empty($contracts) ? '{/base}/contract/list' : '{/base}/contract/list?{?}&id=' . \reset($contracts)->id . '&ptype=p'; +$next = empty($contracts) ? '{/base}/contract/list' : '{/base}/contract/list?{?}&id=' . \end($contracts)->id . '&ptype=n'; $now = new \DateTime('now'); @@ -73,7 +73,7 @@ echo $this->getData('nav')->render(); ?> $value) : - $url = UriFactory::build('{/base}/contract/single?{?}&id=' . $value->getId()); + $url = UriFactory::build('{/base}/contract/single?{?}&id=' . $value->id); $type = 'ok'; if (($value->end->getTimestamp() < $now->getTimestamp() && $value->end->getTimestamp() + 7776000 > $now->getTimestamp()) @@ -88,7 +88,7 @@ echo $this->getData('nav')->render(); ?> ?> printHtml($value->title); ?> - printHtml($value->account->name1); ?> printHtml($value->account->name2); ?> + printHtml($value->account->name1); ?> printHtml($value->account->name2); ?> end !== null ? $value->end->format('Y-m-d') : ''; ?> diff --git a/tests/Controller/ApiControllerTest.php b/tests/Controller/ApiControllerTest.php index cd55607..81aa2cf 100755 --- a/tests/Controller/ApiControllerTest.php +++ b/tests/Controller/ApiControllerTest.php @@ -107,7 +107,7 @@ final class ApiControllerTest extends \PHPUnit\Framework\TestCase $request->setData('language', ISO639x1Enum::_EN); $this->module->apiContractTypeCreate($request, $response); - self::assertGreaterThan(0, $response->get('')['response']->getId()); + self::assertGreaterThan(0, $response->get('')['response']->id); } /** @@ -141,7 +141,7 @@ final class ApiControllerTest extends \PHPUnit\Framework\TestCase $request->setData('language', ISO639x1Enum::_DE); $this->module->apiContractTypeL11nCreate($request, $response); - self::assertGreaterThan(0, $response->get('')['response']->getId()); + self::assertGreaterThan(0, $response->get('')['response']->id); } /** @@ -177,7 +177,7 @@ final class ApiControllerTest extends \PHPUnit\Framework\TestCase $request->setData('type', '1'); $this->module->apiContractCreate($request, $response); - self::assertGreaterThan(0, $response->get('')['response']->getId()); + self::assertGreaterThan(0, $response->get('')['response']->id); } /** diff --git a/tests/Models/ContractTest.php b/tests/Models/ContractTest.php index 9efd01d..14dc3be 100755 --- a/tests/Models/ContractTest.php +++ b/tests/Models/ContractTest.php @@ -39,7 +39,7 @@ final class ContractTest extends \PHPUnit\Framework\TestCase */ public function testDefault() : void { - self::assertEquals(0, $this->contract->getId()); + self::assertEquals(0, $this->contract->id); self::assertEquals([], $this->contract->getFiles()); } diff --git a/tests/Models/ContractTypeTest.php b/tests/Models/ContractTypeTest.php index 6c2b259..d4ece31 100755 --- a/tests/Models/ContractTypeTest.php +++ b/tests/Models/ContractTypeTest.php @@ -39,7 +39,7 @@ final class ContractTypeTest extends \PHPUnit\Framework\TestCase */ public function testDefault() : void { - self::assertEquals(0, $this->type->getId()); + self::assertEquals(0, $this->type->id); self::assertEquals('', $this->type->getL11n()); } diff --git a/tests/Models/NullContractTest.php b/tests/Models/NullContractTest.php index 785d4c9..325f61f 100755 --- a/tests/Models/NullContractTest.php +++ b/tests/Models/NullContractTest.php @@ -37,6 +37,6 @@ final class NullContractTest extends \PHPUnit\Framework\TestCase public function testId() : void { $null = new NullContract(2); - self::assertEquals(2, $null->getId()); + self::assertEquals(2, $null->id); } } diff --git a/tests/Models/NullContractTypeTest.php b/tests/Models/NullContractTypeTest.php index f02e318..ffd48b1 100755 --- a/tests/Models/NullContractTypeTest.php +++ b/tests/Models/NullContractTypeTest.php @@ -37,6 +37,6 @@ final class NullContractTypeTest extends \PHPUnit\Framework\TestCase public function testId() : void { $null = new NullContractType(2); - self::assertEquals(2, $null->getId()); + self::assertEquals(2, $null->id); } } From e2f4de99f2732d16bba5004bb458f711ced396cd Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Fri, 19 May 2023 02:37:35 +0000 Subject: [PATCH 073/133] test fixes + new test data --- Admin/Updater.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Admin/Updater.php b/Admin/Updater.php index fcbc9c0..816b593 100755 --- a/Admin/Updater.php +++ b/Admin/Updater.php @@ -26,4 +26,11 @@ use phpOMS\Module\UpdaterAbstract; */ final class Updater extends UpdaterAbstract { + /** + * Path of the file + * + * @var string + * @since 1.0.0 + */ + public const PATH = __DIR__; } From f40ad93760c19e743f75c4004f4b0e9d09c144b8 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sun, 28 May 2023 01:13:22 +0000 Subject: [PATCH 074/133] style fixes, bug fixes --- Controller/BackendController.php | 31 +++++++-- Models/Contract.php | 6 ++ Theme/Backend/Lang/en.lang.php | 7 ++ Theme/Backend/contract-list.tpl.php | 4 +- Theme/Backend/contract-single.tpl.php | 93 +++++++++++++++++++++++++-- 5 files changed, 129 insertions(+), 12 deletions(-) diff --git a/Controller/BackendController.php b/Controller/BackendController.php index c8e409a..a5f7829 100755 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -15,7 +15,8 @@ declare(strict_types=1); namespace Modules\ContractManagement\Controller; use Modules\ContractManagement\Models\ContractMapper; -use Modules\ContractManagement\Models\ContractTypeL11n; +use Modules\ContractManagement\Models\ContractTypeMapper; +use Modules\Organization\Models\UnitMapper; use phpOMS\Contract\RenderableInterface; use phpOMS\Message\RequestAbstract; use phpOMS\Message\ResponseAbstract; @@ -53,17 +54,21 @@ final class BackendController extends Controller $view->setTemplate('/Modules/ContractManagement/Theme/Backend/contract-list'); $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1007901001, $request, $response)); + $mapper = ContractMapper::getAll() + ->with('account') + ->limit(25); + if ($request->getData('ptype') === 'p') { $view->setData('contracts', - ContractMapper::getAll()->where('id', $request->getDataInt('id') ?? 0, '<')->limit(25)->execute() + $mapper->where('id', $request->getDataInt('id') ?? 0, '<')->execute() ); } elseif ($request->getData('ptype') === 'n') { $view->setData('contracts', - ContractMapper::getAll()->where('id', $request->getDataInt('id') ?? 0, '>')->limit(25)->execute() + $mapper->where('id', $request->getDataInt('id') ?? 0, '>')->execute() ); } else { $view->setData('contracts', - ContractMapper::getAll()->where('id', 0, '>')->limit(25)->execute() + $mapper->where('id', 0, '>')->execute() ); } @@ -89,7 +94,23 @@ final class BackendController extends Controller $view->setTemplate('/Modules/ContractManagement/Theme/Backend/contract-single'); $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1007901001, $request, $response)); - $view->addData('contract', ContractMapper::get()->where('id', (int) $request->getData('id'))->execute()); + $contract = ContractMapper::get() + ->with('account') + ->with('files') + ->where('id', (int) $request->getData('id')) + ->sort('files/id', 'DESC') + ->execute(); + $view->addData('contract', $contract); + + $contractTypes = ContractTypeMapper::getAll() + ->with('l11n') + ->where('l11n/language', $response->getLanguage()) + ->execute(); + $view->setData('contractTypes', $contractTypes); + + $units = UnitMapper::getAll() + ->execute(); + $view->setData('units', $units); $editor = new \Modules\Editor\Theme\Backend\Components\Editor\BaseView($this->app->l11nManager, $request, $response); $view->addData('editor', $editor); diff --git a/Models/Contract.php b/Models/Contract.php index bf2abcd..13938af 100755 --- a/Models/Contract.php +++ b/Models/Contract.php @@ -54,8 +54,13 @@ class Contract public string $description = ''; + // The original start of the contract ignoring renewals + public \DateTime $originalStart; + + // Start of the contract considering renewals public ?\DateTime $start = null; + // End of the contract considering renewals public ?\DateTime $end = null; /** @@ -73,6 +78,7 @@ class Contract public ?int $responsible = null; + // Contract with public Account $account; /** diff --git a/Theme/Backend/Lang/en.lang.php b/Theme/Backend/Lang/en.lang.php index 57e6b07..315a4e9 100755 --- a/Theme/Backend/Lang/en.lang.php +++ b/Theme/Backend/Lang/en.lang.php @@ -20,4 +20,11 @@ return ['ContractManagement' => [ 'Files' => 'Files', 'Overview' => 'Overview', 'Title' => 'Title', + 'With' => 'With', + 'Start' => 'Start', + 'Description' => 'Description', + 'AutoRenewal' => 'Auto Renewal', + 'Termination' => 'Termination', + 'Costs' => 'Costs', + 'Unit' => 'Unit', ]]; diff --git a/Theme/Backend/contract-list.tpl.php b/Theme/Backend/contract-list.tpl.php index cfe04dc..494a83e 100755 --- a/Theme/Backend/contract-list.tpl.php +++ b/Theme/Backend/contract-list.tpl.php @@ -30,7 +30,7 @@ echo $this->getData('nav')->render(); ?>
-
getHtml('Contracts'); ?>
+
getHtml('Contracts'); ?>
@@ -47,7 +47,7 @@ echo $this->getData('nav')->render(); ?> -
getHtml('Account'); ?> + getHtml('With'); ?>