mirror of
https://github.com/Deutscher-Tischfussballbund/com_sportsmanager.git
synced 2026-06-10 14:37:52 +00:00
Compare commits
470 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6b68d8a5ed | |||
| 5843fda2d6 | |||
| 511c17468c | |||
| 6f33599fd9 | |||
| aac4c1458f | |||
| f39ade0e9d | |||
| 2a307b0987 | |||
| e8e6f7046d | |||
| 20ab5a44a9 | |||
| a5357e4a51 | |||
| 68e16a3adb | |||
| cfc821f8ff | |||
| 582829331c | |||
| d8ccd08843 | |||
| 57e92da771 | |||
| 7f85888a26 | |||
| 13ad52f221 | |||
| a44564a40e | |||
| ee4e817ad4 | |||
| 8a7ff6c234 | |||
| 8fb4ed1cdd | |||
| a2243d9ccf | |||
| 308fbae4e5 | |||
| d6d2a04ceb | |||
| d7d6751b70 | |||
| b112b4dc31 | |||
| ac416c1822 | |||
| c92774b27d | |||
| b33a7e6a25 | |||
| f86815dae5 | |||
| 43a03bbb09 | |||
| f430c7d35d | |||
| 73c352f6cf | |||
| c8c19ef8e0 | |||
| cb0db3833c | |||
| 29e7ea7ffa | |||
| 426a582844 | |||
| c1763536c9 | |||
| 507861fd56 | |||
| 168ad7dab4 | |||
| c8483b077e | |||
| c23ed24962 | |||
| f70048f90f | |||
| 572ccee6fd | |||
| fa03965b17 | |||
| 0376b46470 | |||
| c8f419e00a | |||
| 116e4929b2 | |||
| aed4d19c47 | |||
| 2faa38e2b8 | |||
| dc0fcea945 | |||
| e139ac4fc2 | |||
| 5919994a3e | |||
| eccecedf95 | |||
| 9ed58f2916 | |||
| 1a9188c07b | |||
| 9435515088 | |||
| 4ada3a3b77 | |||
| 8391bf9df1 | |||
| bac4c0ada4 | |||
| ba50b0d6a4 | |||
| e4c4694dcb | |||
| e5de0030f2 | |||
| 8d364e0bfd | |||
| eed02e396d | |||
| 40be14ad75 | |||
| 54965f9ef2 | |||
| 8780229435 | |||
| a856a979aa | |||
| 578fb76ead | |||
| b199b73d6f | |||
| 0d61e9a823 | |||
| 299b0bef4e | |||
| 57c158a770 | |||
| 84d07aecb1 | |||
| 5bd0735708 | |||
| 69e2032916 | |||
| e5aede7cac | |||
| 7f8f842796 | |||
| 112511aa12 | |||
| eacb0dc165 | |||
| 67f5f38d1a | |||
| f65ec6be88 | |||
| 427bd545af | |||
| 986cd6d99e | |||
| 66baeb0f77 | |||
| 46474c6c40 | |||
| a583131162 | |||
| cb8b6ebe06 | |||
| d41376494f | |||
| d462137424 | |||
| 3cb3fa2b28 | |||
| 10807c7ea8 | |||
| e469e70b97 | |||
| 522369bb14 | |||
| 91caf76a71 | |||
| 12037f9bac | |||
| b1af98df54 | |||
| fe885160d9 | |||
| 308bbd4d76 | |||
| 89bbba9c1c | |||
| aa07d51cd3 | |||
| 5ca5015eb4 | |||
| a0ef2bda54 | |||
| 3300a66c19 | |||
| cd60c9f42a | |||
| 692fd0a676 | |||
| b8e21aa8ee | |||
| 1d66905488 | |||
| 991d0501df | |||
| c5ffbed4da | |||
| 33c94ae907 | |||
| 8890ca35d2 | |||
| 50d332cd45 | |||
| 90cf2cc4ca | |||
| ea0515e827 | |||
| a868d56450 | |||
| eaaa75d584 | |||
| 1479fc7e20 | |||
| 70563bc8e4 | |||
| 218436c065 | |||
| c21d20e532 | |||
| 8b22eb886d | |||
| ae05c42209 | |||
| 3bc1324b4b | |||
| 23ceb2e272 | |||
| 5b26295ebf | |||
| 9d3cd6b959 | |||
| 6b7c5e7a3b | |||
| ab6f776b96 | |||
| 8fed3c217f | |||
| 633ec1f1cb | |||
| 41e229340d | |||
| 379427d4c4 | |||
| a2808b7db0 | |||
| c3cec6c93c | |||
| 9913279519 | |||
| 0c78ed8b63 | |||
| 4a448cb61d | |||
| 825ff04a89 | |||
| 8b7ca05fc1 | |||
| 76f0ef5f55 | |||
| f76f1185f5 | |||
| 7253426b51 | |||
| 4686f5d8db | |||
| db80f584cd | |||
| 275693ecb3 | |||
| fb3c088835 | |||
| ddca0066bf | |||
| bc56e30682 | |||
| 2fe9acb01c | |||
| de3705ca65 | |||
| 947a150b06 | |||
| c8199abee1 | |||
| 6c1a6aa0de | |||
| 626b9c503a | |||
| 964ab1ca8b | |||
| 783cffaf2b | |||
| 12cb9a0e67 | |||
| 49c8037dbf | |||
| e7dbfa6402 | |||
| b21e11be59 | |||
| f119316561 | |||
| 06070a1d47 | |||
| 5bf3fa3501 | |||
| a2cdc68578 | |||
| b34aa63872 | |||
| ddb7e3a1bd | |||
| e3fb99000c | |||
| 9cd84108e4 | |||
| 3b721e3c82 | |||
| fec866fa5d | |||
| d17280edb1 | |||
| 287dcb0074 | |||
| 2e596dfcaa | |||
| 6c96125da4 | |||
| 01c7e5bb63 | |||
| 0116fd0860 | |||
| ec61daa5c7 | |||
| e692edcb99 | |||
| c1196c9fd9 | |||
| 4cc403536e | |||
| 1032af51f5 | |||
| 33d748303d | |||
| 331d4cfd85 | |||
| 6b1aa25c1b | |||
| 6b9f81f1c7 | |||
| e498981bc4 | |||
| 54d73a61e0 | |||
| bd491add2e | |||
| 30c8ba9bfa | |||
| 555f1de1b5 | |||
| a823e029d0 | |||
| 5627282a53 | |||
| d73d081780 | |||
| e3bd06257d | |||
| 2a87c93c17 | |||
| 5fafcace6b | |||
| 12fd3a3ff0 | |||
| 885d6a3191 | |||
| c50833ebe4 | |||
| 8242bd09cc | |||
| 3886cc88d3 | |||
| 96eff9f189 | |||
| 1c2a0abcc2 | |||
| 24f4195403 | |||
| c1b7cb1e8c | |||
| 878cacd8cd | |||
| 5f830602ef | |||
| eef105895b | |||
| c0bdbb4bde | |||
| d05f3c5d7f | |||
| 0c334d897d | |||
| 79efed156b | |||
| 7984ea73aa | |||
| 7d07aee916 | |||
| 43acc01861 | |||
| fa374986ca | |||
| aa68992d45 | |||
| 0d4381fc7f | |||
| 9b4eb13d52 | |||
| cfe4f871f7 | |||
| bbe786a075 | |||
| 64ce39a59f | |||
| d0258d967d | |||
| bf99d459fb | |||
| bc91be9382 | |||
| 5c09a35485 | |||
| f14d5a1e8c | |||
| 26fd06afef | |||
| 1f147081e1 | |||
| 4f89abc630 | |||
| d84c2eefcf | |||
| ba73036b02 | |||
| 29a108d88c | |||
| 11e42c2374 | |||
| 56776c01f0 | |||
| 6187456e31 | |||
| 49e3bde816 | |||
| 15347b3ab7 | |||
| 3363ec1a77 | |||
| 751c1919d4 | |||
| 9babcec39e | |||
| e8c4ab2d1d | |||
| 53ff7ab566 | |||
| ac8bafaa9e | |||
| 4f6edb0acb | |||
| 822708356b | |||
| 7c302d4ded | |||
| 1e63f2b542 | |||
| 1d9aa13300 | |||
| ea85f102a5 | |||
| ebfd6ee4e9 | |||
| a503325ca4 | |||
| 218dc138fb | |||
| eed53841cf | |||
| dbc79096d4 | |||
| 3e93e27f72 | |||
| 8c022f831a | |||
| 2ab429f949 | |||
| 6e53017158 | |||
| 8764b0a337 | |||
| 07611a0087 | |||
| bc57da1eff | |||
| 1c380928f0 | |||
| 1ddcfd87db | |||
| cb1493954f | |||
| 9637f2a92a | |||
| a977343544 | |||
| 1f5593d3e8 | |||
| fff5f97971 | |||
| 546b9c3af9 | |||
| 4ad93a8cf6 | |||
| 1b5e070026 | |||
| 114eba3a9c | |||
| 9fb592ccbc | |||
| f76ab18d4b | |||
| 02e27d7747 | |||
| 5375950049 | |||
| 050b246fef | |||
| 55b8cc52c7 | |||
| aad70e5ab2 | |||
| 37a98edbad | |||
| 228f68f90c | |||
| 4f9df2ce89 | |||
| 1a364a4e30 | |||
| f3bf69c9ca | |||
| cc81b97569 | |||
| aaa5aaac1d | |||
| f9f9e58881 | |||
| 671dfb7e8d | |||
| 3ae15e2e70 | |||
| ee0c19efe3 | |||
| 87c9ec82fd | |||
| 71d8460cd6 | |||
| d97713e73d | |||
| b16638ed47 | |||
| b511badad2 | |||
| 42ff1155f3 | |||
| 17a9bfdd2e | |||
| 3aa20036dc | |||
| fc1ce3bdd6 | |||
| cf52c718e8 | |||
| 8b29c8eba6 | |||
| e9460ef8cc | |||
| 3ac38abb92 | |||
| 19ff8ebd08 | |||
| 3ab2ae9206 | |||
| 4820f82253 | |||
| 0a06321a72 | |||
| 60232d95b3 | |||
| f27b87a0d8 | |||
| bc6c44e82a | |||
| 01ac642de5 | |||
| 825a072ace | |||
| 1aa9b924d7 | |||
| 4a96d9f0a9 | |||
| 7a59020e64 | |||
| 3f816235c8 | |||
| 4f264ed72d | |||
| a6f302cb63 | |||
| 22c50e688a | |||
| fbd7e05abb | |||
| a36edeedca | |||
| ea9fd038f3 | |||
| e55d925034 | |||
| 48d0bca1c6 | |||
| ba9c84dfe7 | |||
| f424dfe024 | |||
| f382c3a208 | |||
| 2d7fb27ee1 | |||
| 93769df3ac | |||
| ee6d559a7f | |||
| 6e9b2c4f5e | |||
| f713362c3e | |||
| 71dd59c3d8 | |||
| 9594ec84e2 | |||
| 79adb9efd2 | |||
| 7d7f162dde | |||
| 1538738722 | |||
| eb4bcf38d9 | |||
| 0d8e61b3ca | |||
| 3f26a340dc | |||
| 87d9449417 | |||
| e0575dc125 | |||
| b1f67d1d13 | |||
| f119cae584 | |||
| 18d346a4e9 | |||
| e81600dd86 | |||
| ff7314cf3f | |||
| 1fe9d4bc5f | |||
| 5e3996dd5e | |||
| 9861f59662 | |||
| 9f6c026b2b | |||
| 850fd2c079 | |||
| 762bf50f62 | |||
| 19fc2c8800 | |||
| be1b66eb8e | |||
| cf14997acb | |||
| 0d3e54a544 | |||
| 7b1cc50943 | |||
| 133a983685 | |||
| 20b956b239 | |||
| fedb300d8f | |||
| 07121c2233 | |||
| 8dab7fa74f | |||
| 3e577f6be1 | |||
| 2b6563dae0 | |||
| 1bd53893a8 | |||
| acfcbb1010 | |||
| a6aee26211 | |||
| b24203ccb9 | |||
| 2ff39cf086 | |||
| 8479691824 | |||
| ca4ce6060e | |||
| 0729291afc | |||
| b57c7c148d | |||
| b17fcffdd5 | |||
| 97c6d9ee03 | |||
| f3c2040632 | |||
| 1235edde82 | |||
| 763fd7d386 | |||
| 77e2c6e910 | |||
| a2aee3b135 | |||
| 9a7f8acc3b | |||
| 9091b22859 | |||
| 839b27756a | |||
| 0d0ee08199 | |||
| 6609a4ca78 | |||
| 4ecf48d02e | |||
| 40633f864a | |||
| 8e6aa127c6 | |||
| 9289843cb1 | |||
| 7a70500175 | |||
| 31b8e5251e | |||
| 455f845ab0 | |||
| f55d89827a | |||
| 874e06e061 | |||
| 83b8e1c25f | |||
| 3c9fac7e1a | |||
| 4ec02e5f02 | |||
| 4d1573729d | |||
| 6da371569a | |||
| fdede4a4a7 | |||
| 7ced30cf5b | |||
| 934b5b4971 | |||
| 085e5a8aeb | |||
| 53ada7c6b0 | |||
| 29dbfaeea4 | |||
| 95e02435fd | |||
| 32eacde07d | |||
| 2b19aee00f | |||
| 8b6ad5103c | |||
| 743f2b4013 | |||
| 2d2a124239 | |||
| d1e0dec74a | |||
| c4c3ea88fc | |||
| 761e04b6f2 | |||
| 089796d201 | |||
| e2b6f48498 | |||
| 3422813152 | |||
| 67b46f121a | |||
| 6c3c9badfd | |||
| e05d107af3 | |||
| 2f94c29c7e | |||
| b656cb5df3 | |||
| af97c59960 | |||
| ebb3580fad | |||
| 4a313d5914 | |||
| 771856b842 | |||
| 0c4d0820d1 | |||
| 8a0ad8d8e9 | |||
| 03a448f4cc | |||
| 9d75619c2c | |||
| a1890c51c0 | |||
| 51ee656f66 | |||
| 6d9df0e769 | |||
| a74bcb0ee8 | |||
| 6399eab0af | |||
| 9cde84a1d0 | |||
| 76738ec307 | |||
| 59e1a4571b | |||
| 7952c95217 | |||
| 56679669c0 | |||
| 1e8a7a3ae0 | |||
| 269af499c8 | |||
| 56d8be9a55 | |||
| 29f0e6842b | |||
| 22e96bf49d | |||
| 1e4e34ef71 | |||
| d98f7da7b9 | |||
| 94e768ef51 | |||
| 36dbfdb7c4 | |||
| 5cfd8f3c1a | |||
| 1d7369e456 | |||
| de467c0d4a | |||
| 0225e49beb | |||
| e1ecec502b | |||
| 000731a289 | |||
| 385bef0752 | |||
| 902ae55a9a | |||
| feb08ff903 | |||
| a922b11b6d | |||
| 254d556899 | |||
| 984156ca95 | |||
| 6ae7388a44 | |||
| 4f78e31277 | |||
| 2dddfa473a | |||
| 82c0f3a58b | |||
| a6fe497cad |
@@ -0,0 +1,25 @@
|
||||
name-template: "Release $COMPLETE"
|
||||
tag-template: "v$COMPLETE"
|
||||
draft: false
|
||||
|
||||
exclude:
|
||||
pulls: true
|
||||
exclude-labels:
|
||||
- changelog-ignore
|
||||
|
||||
categories:
|
||||
- title: "Features"
|
||||
labels: ["feature", "enhancement"]
|
||||
- title: "Fixes"
|
||||
labels: ["bug"]
|
||||
- title: "Maintenance"
|
||||
labels: ["chore", "refactor"]
|
||||
|
||||
change-template: "- $TITLE [#$NUMBER]"
|
||||
|
||||
template: |
|
||||
# Release $RESOLVED_VERSION
|
||||
|
||||
## Changes
|
||||
|
||||
$CHANGES
|
||||
@@ -0,0 +1,23 @@
|
||||
name-template: "Release $COMPLETE"
|
||||
tag-template: "v$COMPLETE"
|
||||
draft: false
|
||||
|
||||
exclude:
|
||||
pulls: true
|
||||
exclude-labels:
|
||||
- changelog-ignore
|
||||
|
||||
categories:
|
||||
- title: "Features"
|
||||
labels: ["feature", "enhancement"]
|
||||
- title: "Fixes"
|
||||
labels: ["bug"]
|
||||
- title: "Maintenance"
|
||||
labels: ["chore", "refactor"]
|
||||
|
||||
change-template: "- $TITLE [#$NUMBER]"
|
||||
|
||||
template: |
|
||||
## Changes
|
||||
|
||||
$CHANGES
|
||||
@@ -0,0 +1,25 @@
|
||||
name: Auto-label PRs
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
types: [opened, reopened, synchronize, edited]
|
||||
|
||||
jobs:
|
||||
label-changelog-ignore:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Label PRs
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
script: |
|
||||
const base = context.payload.pull_request.base.ref;
|
||||
const head = context.payload.pull_request.head.ref;
|
||||
|
||||
if ((base === 'sportsmanager2-prod' && head === 'sportsmanager2-stage') || (base === 'sportsmanager2-stage' && head === 'sportsmanager2-dev')) {
|
||||
await github.rest.issues.addLabels({
|
||||
...context.repo,
|
||||
issue_number: context.payload.pull_request.number,
|
||||
labels: ['changelog-ignore']
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,100 @@
|
||||
# This workflow will run release using node and then publish a package to GitHub Packages when a release is created
|
||||
# For more information see: https://docs.github.com/en/actions/publishing-packages/publishing-nodejs-packages
|
||||
|
||||
name: Sportsmanager Release
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- 'v[0-9]+.[0-9]+.[0-9]+' # run only on version tags like v1.0.0
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: sportsmanager2-prod
|
||||
|
||||
- name: Set up Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 20
|
||||
|
||||
- name: Install npm dependencies
|
||||
run: npm ci
|
||||
|
||||
- name: Get version from git tag
|
||||
run: echo "VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV
|
||||
|
||||
- name: Set DATE
|
||||
run: echo "DATE=$(date +'%Y-%m-%d')" >> $GITHUB_ENV
|
||||
|
||||
- name: Update version.php
|
||||
run: |
|
||||
echo "<?php" > src/structure/components/com_sportsmanager/util/version.php
|
||||
echo "defined('_JEXEC') or die;" >> src/structure/components/com_sportsmanager/util/version.php
|
||||
echo "return [" >> src/structure/components/com_sportsmanager/util/version.php
|
||||
echo " 'version' => '${{ env.VERSION }}'," >> src/structure/components/com_sportsmanager/util/version.php
|
||||
echo " 'date' => '$(date +%F)'," >> src/structure/components/com_sportsmanager/util/version.php
|
||||
echo "];" >> src/structure/components/com_sportsmanager/util/version.php
|
||||
echo "Updating version to $VERSION in sportsmanager.xml"
|
||||
sed -i "s#<version>.*</version>#<version>$VERSION</version>#" src/structure/sportsmanager.xml
|
||||
echo "Updating Date to $DATE in sportsmanager.xml"
|
||||
sed -i "s#<creationDate>.*</creationDate>#<creationDate>$DATE</creationDate>#" src/structure/sportsmanager.xml
|
||||
|
||||
- name: Generate release notes
|
||||
id: release_notes_extension
|
||||
uses: release-drafter/release-drafter@v6
|
||||
with:
|
||||
config-name: release-drafter_extension.yml
|
||||
version: ${{ github.ref_name }}
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Save release notes to file
|
||||
run: |
|
||||
echo "${{ steps.release_notes_extension.outputs.body }}" > RELEASE_NOTES.md
|
||||
|
||||
- name: Run build script
|
||||
run: npm run release
|
||||
|
||||
- name: Generate release notes
|
||||
id: release_notes_github
|
||||
uses: release-drafter/release-drafter@v6
|
||||
with:
|
||||
config-name: release-drafter_github.yml
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Save release notes to file
|
||||
run: |
|
||||
echo "${{ steps.release_notes_github.outputs.body }}" > RELEASE_NOTES.md
|
||||
|
||||
- name: Create GitHub Release
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
tag_name: "${{ github.ref_name }}"
|
||||
name: "Release ${{ github.ref_name }}"
|
||||
files: package/packages/com_sportsmanager.zip
|
||||
body_path: "RELEASE_NOTES.md"
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Delete draft release via API # workaround: remove leftover draft by release-drafter
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
REPO: ${{ github.repository }}
|
||||
run: |
|
||||
drafts=$(curl -s -H "Authorization: token $GITHUB_TOKEN" \
|
||||
https://api.github.com/repos/$REPO/releases | jq '.[] | select(.draft == true)')
|
||||
|
||||
if [ -n "$drafts" ]; then
|
||||
id=$(echo "$drafts" | jq -r '.id')
|
||||
curl -s -X DELETE -H "Authorization: token $GITHUB_TOKEN" \
|
||||
https://api.github.com/repos/$REPO/releases/$id
|
||||
echo "Deleted draft release with ID: $id"
|
||||
else
|
||||
echo "No draft releases found"
|
||||
fi
|
||||
@@ -6,7 +6,7 @@ name: Snapshot Release
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- 'v*-snapshot' # run only on version tags like v1.0.0-snapshot
|
||||
- 'v[0-9]+.[0-9]+.[0-9]+-snapshot' # run only on version tags like v1.0.0-snapshot
|
||||
# - 'v*' # Run only on version tags like v1.0.0
|
||||
jobs:
|
||||
build:
|
||||
@@ -33,7 +33,7 @@ jobs:
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
prerelease: true
|
||||
name: SNAPSHOT
|
||||
name: "Snapshot ${{ github.ref_name }}"
|
||||
files: package/packages/com_sportsmanager.zip
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
name: Nightly DTFB Player Sync
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 2 * * *' # Every night at 2:00 AM UTC
|
||||
workflow_dispatch: # Allow manual trigger from GitHub
|
||||
|
||||
jobs:
|
||||
sync:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Trigger DTFB Sync
|
||||
run: |
|
||||
response=$(curl -s -o /dev/null -w "%{http_code}" \
|
||||
-X POST \
|
||||
-H "Authorization: Bearer ${{ secrets.DTFB_SYNC_KEY }}" \
|
||||
-H "Content-Type: application/json" \
|
||||
"${{ secrets.DTFB_SYNC_TRIGGER_URL }}")
|
||||
if [ "$response" != "200" ]; then
|
||||
echo "Sync failed with HTTP $response"
|
||||
exit 1
|
||||
fi
|
||||
echo "Sync triggered successfully"
|
||||
@@ -1,16 +1,25 @@
|
||||
# SportsManager
|
||||
|
||||
## Deploy status
|
||||
## DEV/STAGE environments
|
||||
|
||||
### DEV environment
|
||||
[](https://buddy.kicktemp.com/kicktemp/com-sportsmanager/pipelines/pipeline/173) [Preview: sportsmanager.s10.kicktemp.dev](https://sportsmanager.s10.kicktemp.dev)
|
||||
| LV | HOSTER | DOMAIN | BRANCH |
|
||||
| ------ | -------- | ------------------------------------------------------------ | -------------------- |
|
||||
| DTFB | Kicktemp | [stage.dtfb.de](https://stage.dtfb.de) | dev |
|
||||
| TFVHH | Kicktemp | [stage.kickern-hamburg.de](https://stage.kickern-hamburg.de) | dev |
|
||||
| STFVH | DTFB | [stage.stfv.de](https://stage.stfv.de/) | sportsmanager2-stage |
|
||||
| MTFV | DTFB | [stage.mtfv.de](https://stage.mtfv.de/) | ? |
|
||||
| TFVSH | DTFB | [relaunch.tfvsh.de](https://relaunch.tfvsh.de) | ? |
|
||||
|
||||
[](https://buddy.kicktemp.com/kicktemp/com-sportsmanager/pipelines/pipeline/204) [Preview: stage.kickern-hamburg.de](https://stage.kickern-hamburg.de)
|
||||
|
||||
### PROD environment
|
||||
[](https://buddy.kicktemp.com/kicktemp/com-sportsmanager/pipelines/pipeline/218) [Preview: dtfb.de](https://dtfb.de)
|
||||
## PROD environments
|
||||
|
||||
[](https://buddy.kicktemp.com/kicktemp/com-sportsmanager/pipelines/pipeline/219) [Preview: kickern-hamburg.de](https://kickern-hamburg.de)
|
||||
| LV | HOSTER | DOMAIN | BRANCH |
|
||||
| ------ | -------- | ------------------------------------------------ | ------------------- |
|
||||
| DTFB | Kicktemp | [dtfb.de](https://dtfb.de) | production |
|
||||
| TFVHH | Kicktemp | [kickern-hamburg.de](https://kickern-hamburg.de) | production |
|
||||
| MTFV | DTFB | [mtfv.de](https://mtfv.de/) | sportsmanager2-prod |
|
||||
| TFVSH | DTFB | [tfvsh.de](https://tfvsh.de/) | sportsmanager2-prod |
|
||||
| STFVH | DTFB | [stfv.de](https://stfv.de/) | sportsmanager2-prod |
|
||||
|
||||
|
||||
## Test setup
|
||||
@@ -40,5 +49,59 @@ joomla specific database prefixes like #__
|
||||
To set it up, insert into the configuration popup which follows after you enable the framework support:
|
||||
Joomla install path: `./data/joomla_data`
|
||||
JConfig: `./data/joomla_data/configuration.php`
|
||||
> This works only with mounted volumes. However, mounted volumes will slow down the joomla instance significantly.
|
||||
> The current setup does not use mounted volumes.
|
||||
> An alternative would be to download joomla and use that installation
|
||||
|
||||
### Debugging (with Docker/Intellij)
|
||||
1. Start Docker Container (see above)
|
||||
2. Create a terminal for that container
|
||||
```shell
|
||||
docker exec -it <container_name> bash
|
||||
```
|
||||
3. install xdebug within the container since joomla does not come with xdebug preinstalled
|
||||
```shell
|
||||
pecl install xdebug
|
||||
```
|
||||
4. restart the container
|
||||
5. In Intellij Go to [File | Settings | Languages & Frameworks | PHP | Servers](jetbrains://idea/settings?name=Languages+%26+Frameworks--PHP--Servers) and setup your server
|
||||
|
||||
| | |
|
||||
|----------|-----------|
|
||||
| name | anything |
|
||||
| host | localhost |
|
||||
| port | 8080 |
|
||||
| debugger | xdebug |
|
||||
|
||||
use the path mapping and map the repo structure to the container content
|
||||
|
||||
| File/Directory | path on server |
|
||||
|------------------------------------------------------------------|----------------------------------------|
|
||||
| \<path>/com_sportsmanager/src/structure/administrator/components | /var/www/html/administrator/components |
|
||||
| \<path>/com_sportsmanager/src/structure/components | /var/www/html/components |
|
||||
|
||||
7. Click on "Start Listening for PHP Debug Connections" in the top row of intellij
|
||||
8. (Not sure if optional) Install a browser extension by Jetbrains
|
||||
https://chromewebstore.google.com/detail/xdebug-helper-by-jetbrain/aoelhdemabeimdhedkidlnbkfhnhgnhm
|
||||
|
||||
|
||||
### How to release
|
||||
Hint: for technical details regarding the release process have a look into .github/...
|
||||
To create a release these steps need to be followed
|
||||
1. make sure all needed code changes are merged from dev -> stage -> prod, since releases may only be build on prod branch
|
||||
2. give pull requests meaningful names and label them enhancement/bug/chore since labels and names are used for release note generation
|
||||
Hint: if a specific pull request should be ignored, add the label changelog-ignore
|
||||
3. tag a commit (recommended is the latest merge on prod). The pipeline is listening for any tag fitting `v[0-9]+.[0-9]+.[0-9]+`
|
||||
```shell
|
||||
git tag -a v1.2.3 1a2b3c4 -m "Release version 1.2.3"
|
||||
```
|
||||
4. push the tag
|
||||
```shell
|
||||
git push origin --tags
|
||||
```
|
||||
5. the tag push will trigger the pipeline, and it will create the release and store in GitHub
|
||||
|
||||
A release can be created again anytime by deleting the release from GitHub, deleting the tag (from GitHub and additionally from git)
|
||||
and repeating step 3 and 4
|
||||
|
||||
Further: merges from dev to stage and from stage to prod can only be done by creating pull requests. These pull requests will be automatically labeled as changelog-ignore
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
This is no official release!
|
||||
The Release and the release notes will be generated by github actions
|
||||
@@ -30,6 +30,7 @@ services:
|
||||
MYSQL_USER: joomla
|
||||
MYSQL_PASSWORD: examplepass
|
||||
MYSQL_RANDOM_ROOT_PASSWORD: '1'
|
||||
TZ: Europe/Berlin
|
||||
volumes:
|
||||
- joomla_database:/var/lib/mysql
|
||||
networks:
|
||||
|
||||
@@ -1924,3 +1924,12 @@ opcache.file_cache = /tmp/opcache_file
|
||||
|
||||
; List of headers files to preload, wildcard patterns allowed.
|
||||
;ffi.preload=
|
||||
|
||||
zend_extension=xdebug.so
|
||||
xdebug.mode=debug
|
||||
xdebug.start_with_request=yes
|
||||
xdebug.client_host=host.docker.internal
|
||||
xdebug.client_port=9003
|
||||
xdebug.log=/tmp/xdebug.log
|
||||
xdebug.discover_client_host=false
|
||||
xdebug.log_level=7
|
||||
|
||||
@@ -43,7 +43,7 @@ export const config = {
|
||||
watch: ['src/structure/**/*.{php,html,xml,ini,less,json,js,css}'],
|
||||
},
|
||||
copyrelease: {
|
||||
src: ['src/structure/**/**', 'src/structure/**/.*', '!src/structure/**/*.{php,html,xml,ini,less,json,js,css}', '!src/structure/**/.*.{php,html,xml,ini,less,json,js,css}'],
|
||||
src: ['RELEASE_NOTES.md','src/structure/**/**', 'src/structure/**/.*', '!src/structure/**/*.{php,html,xml,ini,less,json,js,css}', '!src/structure/**/.*.{php,html,xml,ini,less,json,js,css}'],
|
||||
replacesrc: ['src/structure/**/**.{php,html,xml,ini,less,json,js,css}', 'src/structure/**/.*.{php,html,xml,ini,less,json,js,css}'],
|
||||
dest: 'releasefiles/'
|
||||
},
|
||||
@@ -90,6 +90,10 @@ export const config = {
|
||||
{
|
||||
src: './releasefiles/plugins/system/kickyootheme/**/**',
|
||||
dest: 'sourcefiles/plg_system_kickyootheme'
|
||||
},
|
||||
{
|
||||
src: './releasefiles/RELEASE_NOTES.md',
|
||||
dest: 'sourcefiles/com_sportsmanager/admin/'
|
||||
}
|
||||
],
|
||||
package: [
|
||||
|
||||
Generated
+4616
-2992
File diff suppressed because it is too large
Load Diff
+2
-3
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "sportsmanager",
|
||||
"description": "",
|
||||
"version": "0.0.1",
|
||||
"version": "2.0.0",
|
||||
"scripts": {
|
||||
"boilerplate": "cross-env NODE_ENV=development gulp boilerplate",
|
||||
"build": "cross-env NODE_ENV=production gulp build",
|
||||
@@ -16,7 +16,7 @@
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/nielsnuebel/com_sportsmanager.git"
|
||||
"url": "https://github.com/Deutscher-Tischfussballbund/com_sportsmanager.git"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": {
|
||||
@@ -122,7 +122,6 @@
|
||||
"browser-sync": "^2.26.12",
|
||||
"core-js": "^3.6.5",
|
||||
"cross-env": "^7.0.2",
|
||||
"fs": "0.0.1-security",
|
||||
"gulp": "^4.0.2",
|
||||
"gulp-changed": "^4.0.2",
|
||||
"gulp-clean": "^0.4.0",
|
||||
|
||||
+9
@@ -24,6 +24,15 @@ class HtmlView extends BaseHtmlView
|
||||
?>
|
||||
<h3><?php echo Text::_('COM_SPORTSMANAGER'); ?> – Created by Sven Nickel | Maintained by DTFB</h3>
|
||||
<?php
|
||||
|
||||
$notesPath = JPATH_COMPONENT_ADMINISTRATOR . '/RELEASE_NOTES.md';
|
||||
if (file_exists($notesPath)) {
|
||||
$notes = file_get_contents($notesPath);
|
||||
echo '<div style="padding:1em;"><h3>Release Notes</h3><pre>' .
|
||||
htmlspecialchars($notes) . '</pre></div>';
|
||||
}
|
||||
|
||||
|
||||
// Display the template
|
||||
parent::display($tpl);
|
||||
}
|
||||
|
||||
@@ -21,12 +21,15 @@ COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_TEAMS_JOINT="Mannschaften in gem
|
||||
COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_CLUBS="Vereine"
|
||||
COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_VENUES="Spielorte"
|
||||
COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_APPOINTMENTS="Termine"
|
||||
COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_MATCH_RESCHEDULING="Spielverlegungen"
|
||||
COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_ASSOCIATION_BODIES="Verbandsorgane"
|
||||
COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_HALL_OF_FAME="Hall Of Fame"
|
||||
COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_TITLE="Titel"
|
||||
COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_TITLE_DESC="Titel, der im Fenster oben angezeigt wird"
|
||||
COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_DESCRIPTION="Beschreibung"
|
||||
COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_DESCRIPTION_DESC="Beschreibung, die unterhalb des Titels angezeigt wird (WICHTIG: Werden HTML-Tags verwendet, müssen auch Umlaute in HTML-Code angeben werden)"
|
||||
COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_CATEGORIES="Kategorien"
|
||||
COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_CATEGORIES_DESC="Eine optionale Auswahl an durch Kommata getrennte Kategorienummern"
|
||||
COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_CATEGORIES_DESC="Eine optionale Auswahl von Kategorienummern durch Kommata oder Spiegelstrich getrennt"
|
||||
COM_SPORTSMANAGER_LAYOUT_ELO_RANKING_TITLE="Layout: Elo-Rangliste"
|
||||
COM_SPORTSMANAGER_LAYOUT_ELO_RANKING_DESC="Auflistung der Spieler sortiert nach Elo-Wertung"
|
||||
COM_SPORTSMANAGER_LAYOUT_ELO_RANKING_OPTION_ELO_RANKING="Elo-Rangliste"
|
||||
|
||||
@@ -21,12 +21,15 @@ COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_TEAMS_JOINT="Teams in joint list
|
||||
COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_CLUBS="Clubs"
|
||||
COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_VENUES="Venues"
|
||||
COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_APPOINTMENTS="Appointments"
|
||||
COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_MATCH_RESCHEDULING="Match reschedulings"
|
||||
COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_ASSOCIATION_BODIES="Association bodies"
|
||||
COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_HALL_OF_FAME="Hall of fame"
|
||||
COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_TITLE="Title"
|
||||
COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_TITLE_DESC="Title which will be shows on top"
|
||||
COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_DESCRIPTION="Description"
|
||||
COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_DESCRIPTION_DESC="Description that will be shows below the titel (IMPORTANT: if html tags are used, special characters must be maskeraded)"
|
||||
COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_CATEGORIES="Categories"
|
||||
COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_CATEGORIES_DESC="An optional selection of category numbers seperated by commas"
|
||||
COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_CATEGORIES_DESC="An optional selection of category numbers seperated by commas or bullet point"
|
||||
COM_SPORTSMANAGER_LAYOUT_ELO_RANKING_TITLE="Layout: elo ranking"
|
||||
COM_SPORTSMANAGER_LAYOUT_ELO_RANKING_DESC="Listing of players sorted by elo rating"
|
||||
COM_SPORTSMANAGER_LAYOUT_ELO_RANKING_OPTION_ELO_RANKING="Elo ranking"
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -4,10 +4,8 @@
|
||||
*/
|
||||
|
||||
use JetBrains\PhpStorm\NoReturn;
|
||||
use Joomla\CMS\Application\AdministratorApplication;
|
||||
use Joomla\CMS\Application\SiteApplication;
|
||||
use Joomla\CMS\Factory;
|
||||
use Joomla\CMS\User\UserFactory;
|
||||
use Joomla\CMS\User\UserFactoryInterface;
|
||||
use Joomla\Registry\Registry;
|
||||
|
||||
@@ -43,8 +41,7 @@ function notifyChange($data): void
|
||||
try {
|
||||
$db = getDatabase();
|
||||
$query = "SELECT wert from #__sportsmanager_einstellungen WHERE name='api_push_key'";
|
||||
$db->setQuery($query);
|
||||
$push_key = $db->loadResult();
|
||||
$push_key = loadResult($db, $query);
|
||||
$push_server = !empty($push_key) && isset(_payload($push_key)->aud) ? _payload($push_key)->aud : '';
|
||||
if ($push_server != '' && $push_key != '') {
|
||||
$url = $push_server . (str_ends_with($push_server, '/') ? '' : '/') . 'v1/notifications/send';
|
||||
@@ -137,11 +134,8 @@ function begegnungVerlegenNotify($begegnung, $users, $vorschlagendes_team_id, $h
|
||||
$expires->modify('+16 hours');
|
||||
$db = getDatabase();
|
||||
$query = "SELECT berechtigt_team_id from #__sportsmanager_berechtigt_fuer_team where berechtigt_user_id = $user_id";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
abortWithError($db->stderr(true));
|
||||
}
|
||||
$team_id = $db->loadObjectList();
|
||||
$team_id = loadObjectList($db, $query);
|
||||
|
||||
JSON_sportsmanager::JSON([
|
||||
'token' => jwt_token([
|
||||
'sub' => $user_id,
|
||||
@@ -180,8 +174,7 @@ function begegnungVerlegenNotify($begegnung, $users, $vorschlagendes_team_id, $h
|
||||
$db = getDatabase();
|
||||
$query = $db->getQuery(true);
|
||||
$query->select('id')->from('#__users')->where('username = "' . $username . '"')->setLimit(1);
|
||||
$db->setQuery($query);
|
||||
$user_id = $db->loadResult();
|
||||
$user_id = loadResult($db, $query);
|
||||
$user = $container->get(UserFactoryInterface::class)->loadUserById($user_id);
|
||||
|
||||
//TODO: pw verification modernising: use php native methods, however this also needs new pw hashing. maybe force a pw reset on all accounts
|
||||
|
||||
@@ -7,6 +7,8 @@ use Joomla\Database\DatabaseInterface;
|
||||
use Joomla\Database\Mysql\MysqlDriver;
|
||||
use Joomla\Database\Mysqli\MysqliDriver;
|
||||
|
||||
require_once JPATH_SITE . '/components/com_sportsmanager/database/util.php';
|
||||
|
||||
function initDatabase(): void
|
||||
{
|
||||
global $sportsmanager_database_local;
|
||||
@@ -22,11 +24,7 @@ function initDatabase(): void
|
||||
$sportsmanager_database_local = Factory::getContainer()->get(DatabaseInterface::class);
|
||||
|
||||
$query = "SELECT * FROM #__sportsmanager_einstellungen";
|
||||
$sportsmanager_database_local->setQuery($query);
|
||||
if (!$sportsmanager_database_local->execute()) {
|
||||
die($sportsmanager_database_local->stderr(true));
|
||||
}
|
||||
$rows = $sportsmanager_database_local->loadObjectList();
|
||||
$rows = loadObjectList($sportsmanager_database_local, $query);
|
||||
|
||||
$database_driver = "mysql";
|
||||
$database_host = "";
|
||||
@@ -75,14 +73,13 @@ function initDatabase(): void
|
||||
if ($sportsmanager_database_external === NULL) {
|
||||
echo "<strong>" . Text::_('COM_SPORTSMANAGER_CONNECTION_EXTERNAL_DB_FAILURE') . "</strong><br><br>";
|
||||
} else {
|
||||
$query = "SELECT wert FROM #__sportsmanager_einstellungen WHERE name = 'datenbank_version'";
|
||||
$sportsmanager_database_external->setQuery($query);
|
||||
try {
|
||||
if (!$sportsmanager_database_external->execute()) {
|
||||
echo "<strong>" . Text::_('COM_SPORTSMANAGER_EXTERNAL_DB_NO_SM_TABLES') . "</strong><br><br>";
|
||||
$sportsmanager_database_external = NULL;
|
||||
} else {
|
||||
$db_version = $sportsmanager_database_external->loadResult();
|
||||
$query = "SELECT wert FROM #__sportsmanager_einstellungen WHERE name = 'datenbank_version'";
|
||||
$db_version = loadResult($sportsmanager_database_external, $query);
|
||||
if ($db_version < 38) {
|
||||
echo "<strong>" . Text::_('COM_SPORTSMANAGER_EXTERNAL_DB_NO_SM_VERSION') . "</strong><br><br>";
|
||||
$sportsmanager_database_external = NULL;
|
||||
|
||||
@@ -20,27 +20,15 @@ function updateDatabase(): void
|
||||
$termin_aktionen_email_setzen = false;
|
||||
|
||||
$query = "SHOW TABLE STATUS WHERE name = '" . $db->getPrefix() . "tsleague_basis' || name = '" . $db->getPrefix() . "tsleague_einstellungen'";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
$rows = $db->loadObjectList();
|
||||
$rows = loadObjectList($db, $query);
|
||||
|
||||
if (count($rows) > 0) {
|
||||
$query = "SHOW TABLE STATUS WHERE name = '" . $db->getPrefix() . "tsleague_basis'";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
$rows = $db->loadObjectList();
|
||||
$rows = loadObjectList($db, $query);
|
||||
|
||||
if (count($rows) > 0) {
|
||||
$query = "SELECT * FROM #__tsleague_basis";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
$rows = $db->loadObjectList();
|
||||
$rows = loadObjectList($db, $query);
|
||||
if (count($rows) == 0)
|
||||
die(Text::_('COM_SPORTSMANAGER_EXTERNAL_DB_INCONSISTENCY'));
|
||||
|
||||
@@ -337,11 +325,7 @@ function updateDatabase(): void
|
||||
if ($datenbank_version < 9) {
|
||||
$query = "SELECT spieler_id, geschlecht"
|
||||
. "\n FROM #__tsleague_spieler";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
$spieler = $db->loadObjectList();
|
||||
$spieler = loadObjectList($db, $query);
|
||||
|
||||
$query = "ALTER TABLE #__tsleague_spieler CHANGE geschlecht geschlecht char(1)";
|
||||
$db->setQuery($query);
|
||||
@@ -855,11 +839,7 @@ function updateDatabase(): void
|
||||
}
|
||||
|
||||
$query = "SELECT * FROM #__tsleague_einstellungen WHERE name = 'datenbank_version'";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
$rows = $db->loadObjectList();
|
||||
$rows = loadObjectList($db, $query);
|
||||
if (count($rows) == 0)
|
||||
die(Text::_('COM_SPORTSMANAGER_EXTERNAL_DB_INCONSISTENCY'));
|
||||
|
||||
@@ -1728,11 +1708,7 @@ function updateDatabase(): void
|
||||
}
|
||||
|
||||
$query = "SELECT * FROM #__sportsmanager_einstellungen WHERE name = 'datenbank_version'";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
$rows = $db->loadObjectList();
|
||||
$rows = loadObjectList($db, $query);
|
||||
if (count($rows) == 0)
|
||||
die(Text::_('COM_SPORTSMANAGER_EXTERNAL_DB_INCONSISTENCY'));
|
||||
|
||||
@@ -2174,11 +2150,7 @@ function updateDatabase(): void
|
||||
. "\n SELECT YEAR(erster_tag) AS jahr FROM #__sportsmanager_bestenliste WHERE NOT ISNULL(erster_tag)"
|
||||
. "\n GROUP BY jahr"
|
||||
. "\n ORDER BY jahr";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
$jahre = $db->loadObjectList();
|
||||
$jahre = loadObjectList($db, $query);
|
||||
|
||||
if (count($jahre) > 0) {
|
||||
foreach ($jahre as $jahr) {
|
||||
@@ -2199,11 +2171,7 @@ function updateDatabase(): void
|
||||
}
|
||||
|
||||
$query = "SELECT * FROM #__sportsmanager_saison ORDER BY saisonbezeichnung DESC LIMIT 1";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
$saisons = $db->loadObjectList();
|
||||
$saisons = loadObjectList($db, $query);
|
||||
|
||||
$aktuelle_saison_id = $saisons[0]->saison_id;
|
||||
// Saisons den Veranstaltungen zuordnen
|
||||
@@ -2644,11 +2612,7 @@ function updateDatabase(): void
|
||||
. "\n INNER JOIN #__sportsmanager_veranstaltung USING (veranstaltung_id)"
|
||||
. "\n LEFT JOIN #__sportsmanager_saison USING (saison_id)"
|
||||
. "\n ORDER BY heimspielort_name, heimspielort_anschrift";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
$teams = $db->loadObjectList();
|
||||
$teams = loadObjectList($db, $query);
|
||||
|
||||
$heimspielort_name = "";
|
||||
$heimspielort_strasse = "";
|
||||
@@ -3020,11 +2984,7 @@ function updateDatabase(): void
|
||||
|
||||
$query = "SELECT * FROM #__sportsmanager_turniervoranmeldung"
|
||||
. "\n ORDER BY turnierdisziplin_id";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
$rows = $db->loadObjectList();
|
||||
$rows = loadObjectList($db, $query);
|
||||
|
||||
foreach ($rows as $row) {
|
||||
$query = "INSERT INTO #__sportsmanager_turniermeldung (turnierdisziplin_id, rundenstufe, platz)"
|
||||
@@ -3215,11 +3175,7 @@ function updateDatabase(): void
|
||||
|
||||
if ($datenbank_version < 40) {
|
||||
$query = "SELECT * FROM #__sportsmanager_kategorie ORDER BY typ, nummer, kategorie_id DESC";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
$rows = $db->loadObjectList();
|
||||
$rows = loadObjectList($db, $query);
|
||||
|
||||
$typ = -1;
|
||||
$nummer = -1;
|
||||
@@ -4053,11 +4009,7 @@ function updateDatabase(): void
|
||||
}
|
||||
|
||||
$query = "SELECT * FROM #__sportsmanager_moderator";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
$rows = $db->loadObjectList();
|
||||
$rows = loadObjectList($db, $query);
|
||||
|
||||
foreach ($rows as $row) {
|
||||
$moderator_id = $row->moderator_id;
|
||||
@@ -5214,8 +5166,7 @@ function updateDatabase(): void
|
||||
->from('INFORMATION_SCHEMA.COLUMNS')
|
||||
->where('TABLE_NAME = ' . $db->quote($db->replacePrefix('#__sportsmanager_rangliste')))
|
||||
->where('COLUMN_NAME = ' . $db->quote('lizenzen'));
|
||||
$db->setQuery($query);
|
||||
$exists = (bool)$db->loadResult();
|
||||
$exists = (bool)loadResult($db, $query);
|
||||
|
||||
if (!$exists) {
|
||||
$query = "ALTER TABLE #__sportsmanager_rangliste ADD lizenzen varchar(30) DEFAULT NULL AFTER streichergebnisse";
|
||||
@@ -5230,8 +5181,7 @@ function updateDatabase(): void
|
||||
->from('INFORMATION_SCHEMA.COLUMNS')
|
||||
->where('TABLE_NAME = ' . $db->quote($db->replacePrefix('#__sportsmanager_spieler')))
|
||||
->where('COLUMN_NAME = ' . $db->quote('lizenz'));
|
||||
$db->setQuery($query);
|
||||
$exists = (bool)$db->loadResult();
|
||||
$exists = (bool)loadResult($db, $query);
|
||||
|
||||
if (!$exists) {
|
||||
$query = "ALTER TABLE #__sportsmanager_spieler ADD lizenz varchar(30) DEFAULT NULL AFTER lizenznr";
|
||||
@@ -5266,14 +5216,569 @@ function updateDatabase(): void
|
||||
}
|
||||
}
|
||||
|
||||
if ($termin_aktionen_email_setzen) {
|
||||
$query = "SELECT aktion_user_id, termin_aktion_id"
|
||||
. "\n FROM #__sportsmanager_termin_aktion";
|
||||
if ($datenbank_version < 104) {
|
||||
|
||||
$query = "ALTER TABLE #__sportsmanager_veranstaltung ADD direktervergleich INT(4) NOT NULL DEFAULT '0' AFTER tabellenwertung;";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
|
||||
$query = "ALTER TABLE #__sportsmanager_team ADD setzliste_nr INT(4) NULL DEFAULT NULL AFTER veranstaltung_id;";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
|
||||
$query = "ALTER TABLE #__sportsmanager_begegnung ADD spiel_nr INT(4) NULL DEFAULT NULL AFTER spieltag;";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
|
||||
$query = "UPDATE #__sportsmanager_einstellungen"
|
||||
. "\n SET wert = '104'"
|
||||
. "\n WHERE name = 'datenbank_version'";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
$rows = $db->loadObjectList();
|
||||
}
|
||||
|
||||
if ($datenbank_version < 105) {
|
||||
|
||||
$query = "ALTER TABLE `#__sportsmanager_begegnung` ADD `spieltag_titel` VARCHAR(32) NOT NULL DEFAULT '' AFTER `spieltag`;";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
|
||||
$query = "ALTER TABLE `#__sportsmanager_veranstaltung` ADD `spieltag_titel_zeigen` INT(4) NOT NULL DEFAULT '0' AFTER `unterteilung`;";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
|
||||
$query = "ALTER TABLE `#__sportsmanager_team` ADD `teamname_kurz` VARCHAR(24) NOT NULL DEFAULT '' AFTER `teamname`;";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
|
||||
$query = "UPDATE #__sportsmanager_einstellungen"
|
||||
. "\n SET wert = '105'"
|
||||
. "\n WHERE name = 'datenbank_version'";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
}
|
||||
|
||||
if ($datenbank_version < 106) {
|
||||
|
||||
$query = "ALTER TABLE `#__sportsmanager_verein` ADD `verstecken` INT(4) NOT NULL DEFAULT '0' AFTER `ausgetreten`;";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
|
||||
$query = "UPDATE #__sportsmanager_einstellungen"
|
||||
. "\n SET wert = '106'"
|
||||
. "\n WHERE name = 'datenbank_version'";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
}
|
||||
|
||||
if ($datenbank_version < 107) {
|
||||
|
||||
$query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'anzahl_mitglieder_zeigen', wert = '0';";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'verband_anzeigen', wert = '1';";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'turnierbaum_zeigen', wert = '0';";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'spalte_mitglieder_zeigen', wert = '1';";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "UPDATE #__sportsmanager_einstellungen"
|
||||
. "\n SET wert = '107'"
|
||||
. "\n WHERE name = 'datenbank_version'";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
}
|
||||
|
||||
if ($datenbank_version < 108) {
|
||||
|
||||
$query = "DELETE t1 FROM #__sportsmanager_unbestaetigtes_ergebnis t1"
|
||||
. "\n INNER JOIN #__sportsmanager_unbestaetigtes_ergebnis t2"
|
||||
. "\n ON t1.begegnung_id = t2.begegnung_id"
|
||||
. "\n AND t1.unbestaetigtes_ergebnis_id < t2.unbestaetigtes_ergebnis_id;";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = " ALTER TABLE `#__sportsmanager_unbestaetigtes_ergebnis`"
|
||||
. "\n DROP INDEX `begegnung_id`, ADD UNIQUE `begegnung_id` (`begegnung_id`) USING BTREE;";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "UPDATE #__sportsmanager_einstellungen"
|
||||
. "\n SET wert = '108'"
|
||||
. "\n WHERE name = 'datenbank_version'";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
}
|
||||
|
||||
if ($datenbank_version < 109) {
|
||||
$query = "ALTER TABLE #__sportsmanager_turnier ADD COLUMN `reminder_count` TINYINT DEFAULT '0'";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
// set all existing tournaments to 3 to prevent email flooding
|
||||
$query = "UPDATE #__sportsmanager_turnier SET `reminder_count` = '3'";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
// 3: prevent email flood for past tournaments
|
||||
$query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'enable_email_reminders', wert = '0';";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "UPDATE #__sportsmanager_einstellungen"
|
||||
. "\n SET wert = '109'"
|
||||
. "\n WHERE name = 'datenbank_version'";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
}
|
||||
|
||||
if ($datenbank_version < 110) {
|
||||
|
||||
$aktueller_verein_aktualisieren = true;
|
||||
|
||||
$query = "UPDATE #__sportsmanager_einstellungen"
|
||||
. "\n SET wert = '110'"
|
||||
. "\n WHERE name = 'datenbank_version'";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
}
|
||||
|
||||
if ($datenbank_version < 111) {
|
||||
|
||||
$query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'verbands_kuerzel', wert = 'tbe.';";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "UPDATE #__sportsmanager_einstellungen"
|
||||
. "\n SET wert = '111'"
|
||||
. "\n WHERE name = 'datenbank_version'";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
}
|
||||
|
||||
if ($datenbank_version < 112) {
|
||||
|
||||
// Korrektur Startuhrzeit in sportsmanager_turnierdisziplin bei eintägigen Veranstaltungen
|
||||
$query = "UPDATE #__sportsmanager_turnierdisziplin td"
|
||||
. "\n JOIN #__sportsmanager_turnier t ON td.turnier_id = t.turnier_id"
|
||||
. "\n SET td.beginn = CONCAT(t.erster_tag, ' ', TIME(td.beginn))"
|
||||
. "\n WHERE t.erster_tag = t.letzter_tag;";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
|
||||
$query = "UPDATE #__sportsmanager_einstellungen"
|
||||
. "\n SET wert = '112'"
|
||||
. "\n WHERE name = 'datenbank_version'";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
}
|
||||
|
||||
if ($datenbank_version < 113) {
|
||||
|
||||
// Korrektur Startuhrzeit in sportsmanager_turnierdisziplin bei eintägigen Veranstaltungen
|
||||
$query = "UPDATE #__sportsmanager_turnierdisziplin td"
|
||||
. "\n JOIN #__sportsmanager_turnier t ON td.turnier_id = t.turnier_id"
|
||||
. "\n SET td.beginn = CONCAT(t.erster_tag, ' ', TIME(td.beginn))"
|
||||
. "\n WHERE t.erster_tag = t.letzter_tag;";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
|
||||
$query = "UPDATE #__sportsmanager_einstellungen"
|
||||
. "\n SET wert = '113'"
|
||||
. "\n WHERE name = 'datenbank_version'";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
}
|
||||
|
||||
if ($datenbank_version < 114) {
|
||||
|
||||
$query = "CREATE TABLE IF NOT EXISTS `#__sportsmanager_regelwerke` ("
|
||||
. "\n `regelwerke_id` int(11) NOT NULL AUTO_INCREMENT,"
|
||||
. "\n `regelwerk` varchar(32) NOT NULL,"
|
||||
. "\n PRIMARY KEY (`regelwerke_id`),"
|
||||
. "\n UNIQUE KEY `regelwerk` (`regelwerk`)"
|
||||
. "\n ) ENGINE=MyISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "CREATE TABLE IF NOT EXISTS `#__sportsmanager_verstoesse` ("
|
||||
. "\n `verstoesse_id` int(11) NOT NULL AUTO_INCREMENT,"
|
||||
. "\n `regelwerke_id` int(11) NOT NULL DEFAULT 0,"
|
||||
. "\n `paragraph_spo` varchar(32) NOT NULL DEFAULT '',"
|
||||
. "\n `paragraph_go` varchar(32) NOT NULL DEFAULT '',"
|
||||
. "\n `verstoss` varchar(64) NOT NULL DEFAULT '',"
|
||||
. "\n `haupttext` text NOT NULL,"
|
||||
. "\n `zusatztext` text NOT NULL,"
|
||||
. "\n `gebuehr` smallint(3) NOT NULL DEFAULT 0,"
|
||||
. "\n `zusatzgebuehr` smallint(2) NOT NULL DEFAULT 0,"
|
||||
. "\n `zur_auswahl` tinyint(1) NOT NULL DEFAULT 1,"
|
||||
. "\n PRIMARY KEY (`verstoesse_id`)"
|
||||
. "\n ) ENGINE=MyISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "CREATE TABLE IF NOT EXISTS `#__sportsmanager_ordnungsstrafen` ("
|
||||
. "\n `ordnungsstrafen_id` int(11) NOT NULL AUTO_INCREMENT,"
|
||||
. "\n `verstoesse_id` int(11) NOT NULL DEFAULT 0,"
|
||||
. "\n `begegnung_id` int(11) NOT NULL DEFAULT 0,"
|
||||
. "\n `team_id` int(11) NOT NULL DEFAULT 0,"
|
||||
. "\n `aussteller_id` int(11) NOT NULL DEFAULT 0,"
|
||||
. "\n `ausstelldatum` datetime NOT NULL DEFAULT current_timestamp(),"
|
||||
. "\n `versender_id` int(11) DEFAULT NULL,"
|
||||
. "\n `versendedatum` datetime DEFAULT NULL,"
|
||||
. "\n `rechnungssteller_id` int(11) DEFAULT NULL,"
|
||||
. "\n `rechnungsdatum` datetime DEFAULT NULL,"
|
||||
. "\n `multiplikator` tinyint(1) NOT NULL DEFAULT 1,"
|
||||
. "\n `weitere_angaben` text NOT NULL,"
|
||||
. "\n PRIMARY KEY (`ordnungsstrafen_id`)"
|
||||
. "\n ) ENGINE=MyISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "CREATE TABLE IF NOT EXISTS `#__sportsmanager_email_vorlagen` ("
|
||||
. "\n `email_vorlagen_id` int(11) NOT NULL AUTO_INCREMENT,"
|
||||
. "\n `vorlage` varchar(64) NOT NULL,"
|
||||
. "\n `betreff` varchar(256) NOT NULL DEFAULT '',"
|
||||
. "\n `von` varchar(64) NOT NULL DEFAULT '',"
|
||||
. "\n `an` varchar(256) NOT NULL DEFAULT '',"
|
||||
. "\n `cc` varchar(256) NOT NULL DEFAULT '',"
|
||||
. "\n `bcc` varchar(256) NOT NULL DEFAULT '',"
|
||||
. "\n `email_text` text NOT NULL,"
|
||||
. "\n PRIMARY KEY (`email_vorlagen_id`),"
|
||||
. "\n UNIQUE KEY `vorlage` (`vorlage`)"
|
||||
. "\n ) ENGINE=MyISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'ordnungsstrafen_verwenden', wert = '0';";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "INSERT IGNORE INTO `#__sportsmanager_email_vorlagen` (`email_vorlagen_id`, `vorlage`) VALUES (NULL, 'Ordnungsstrafe');";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$columns = $db->getTableColumns('#__sportsmanager_veranstaltung');
|
||||
if (!array_key_exists('regelwerke_id', $columns)) {
|
||||
$query = "ALTER TABLE `#__sportsmanager_veranstaltung` ADD COLUMN `regelwerke_id` INT(11) NOT NULL DEFAULT '0' AFTER `bezeichnung`;";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
}
|
||||
$query = "UPDATE #__sportsmanager_einstellungen"
|
||||
. "\n SET wert = '114'"
|
||||
. "\n WHERE name = 'datenbank_version'";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
}
|
||||
|
||||
if ($datenbank_version < 115) {
|
||||
|
||||
// Erweiterung Tabelle #__sportsmanager_verschieberegel
|
||||
$columns = $db->getTableColumns('#__sportsmanager_verschieberegel');
|
||||
if (!array_key_exists('begruendung_erforderlich', $columns)
|
||||
|| !array_key_exists('vereine_berechtigt', $columns)
|
||||
|| !array_key_exists('verband_berechtigt', $columns)) {
|
||||
$query = "ALTER TABLE `#__sportsmanager_verschieberegel`"
|
||||
. "\n ADD COLUMN `begruendung_erforderlich` INT(1) NOT NULL DEFAULT 0 AFTER `ablehnen`,"
|
||||
. "\n ADD COLUMN `vereine_berechtigt` INT(1) NOT NULL DEFAULT 1 AFTER `begruendung_erforderlich`,"
|
||||
. "\n ADD COLUMN `verband_berechtigt` INT(1) NOT NULL DEFAULT 0 AFTER `vereine_berechtigt`;";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
}
|
||||
|
||||
$query = "INSERT IGNORE INTO `#__sportsmanager_email_vorlagen` (`email_vorlagen_id`, `vorlage`) VALUES (NULL, 'Spielverlegung');";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "UPDATE #__sportsmanager_einstellungen"
|
||||
. "\n SET wert = '115'"
|
||||
. "\n WHERE name = 'datenbank_version'";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
}
|
||||
|
||||
if ($datenbank_version < 116) {
|
||||
|
||||
$columns = $db->getTableColumns('#__sportsmanager_spielort');
|
||||
if (!array_key_exists('telefon', $columns)
|
||||
|| !array_key_exists('email', $columns)
|
||||
|| !array_key_exists('ruhetage', $columns)) {
|
||||
$query = "ALTER TABLE `#__sportsmanager_spielort`"
|
||||
. "\n ADD `telefon` VARCHAR(64) NULL DEFAULT NULL AFTER `url`,"
|
||||
. "\n ADD `email` VARCHAR(64) NULL DEFAULT NULL AFTER `telefon`,"
|
||||
. "\n ADD `ruhetage` VARCHAR(64) NULL DEFAULT NULL AFTER `email`;";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
}
|
||||
|
||||
$columns = $db->getTableColumns('#__sportsmanager_team');
|
||||
if (!array_key_exists('trainingstage', $columns)){
|
||||
$query = "ALTER TABLE `#__sportsmanager_team`"
|
||||
. "\n ADD `trainingstage` VARCHAR(64) NULL DEFAULT NULL AFTER `heimspielort_id`;";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
}
|
||||
|
||||
$query = "UPDATE #__sportsmanager_einstellungen"
|
||||
. "\n SET wert = '116'"
|
||||
. "\n WHERE name = 'datenbank_version'";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
}
|
||||
|
||||
if ($datenbank_version < 117) {
|
||||
$query = "CREATE TABLE IF NOT EXISTS `#__sportsmanager_team_strafen` ("
|
||||
. "\n `team_strafen_id` int(11) NOT NULL AUTO_INCREMENT,"
|
||||
. "\n `zeitpunkt` datetime NOT NULL,"
|
||||
. "\n `moderator_user_id` int(11) DEFAULT NULL,"
|
||||
. "\n `team_id` int(11) NOT NULL DEFAULT '0',"
|
||||
. "\n `strafe` float(6,2) NOT NULL DEFAULT '0',"
|
||||
. "\n `beschreibung` text NOT NULL,"
|
||||
. "\n PRIMARY KEY (`team_strafen_id`)"
|
||||
. "\n) ENGINE=MyISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$columns = $db->getTableColumns('#__sportsmanager_veranstaltung');
|
||||
if (!array_key_exists('explizite_strafen', $columns)) {
|
||||
$query = "ALTER TABLE #__sportsmanager_veranstaltung"
|
||||
. "\n ADD explizite_strafen tinyint(4) DEFAULT '0' AFTER elo_wertung";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
}
|
||||
|
||||
$query = "UPDATE #__sportsmanager_einstellungen SET wert = '117' WHERE name = 'datenbank_version'";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
}
|
||||
|
||||
if ($datenbank_version < 118) {
|
||||
|
||||
$query = "CREATE TABLE IF NOT EXISTS `#__sportsmanager_verbandsorgane` ("
|
||||
. "\n `verbandsorgane_id` int(11) NOT NULL AUTO_INCREMENT,"
|
||||
. "\n `veranstalter_id` int(11) DEFAULT NULL,"
|
||||
. "\n `verbandsorgan` varchar(32) DEFAULT NULL,"
|
||||
. "\n `kategorie` int(4) DEFAULT NULL,"
|
||||
. "\n `reihenfolge` int(4) DEFAULT NULL,"
|
||||
. "\n `email` varchar(64) DEFAULT NULL,"
|
||||
. "\n `beschreibung` text NOT NULL,"
|
||||
. "\n PRIMARY KEY (`verbandsorgane_id`),"
|
||||
. "\n KEY (`veranstalter_id`)"
|
||||
. "\n ) ENGINE=MyISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
|
||||
$query = "CREATE TABLE IF NOT EXISTS `#__sportsmanager_mitglied_von_verbandsorgan` ("
|
||||
. "\n `mitglied_von_verbandsorgan_id` int(11) NOT NULL AUTO_INCREMENT,"
|
||||
. "\n `verbandsorgane_id` int(11) DEFAULT NULL,"
|
||||
. "\n `funktion` varchar(32) DEFAULT NULL,"
|
||||
. "\n `zusatzinfo` varchar(64) DEFAULT NULL,"
|
||||
. "\n `spieler_id` int(11) DEFAULT NULL,"
|
||||
. "\n `nachname` varchar(32) DEFAULT NULL,"
|
||||
. "\n `vorname` varchar(32) DEFAULT NULL,"
|
||||
. "\n `email` varchar(64) DEFAULT NULL,"
|
||||
. "\n `telefon` varchar(32) DEFAULT NULL,"
|
||||
. "\n `mobil` varchar(32) DEFAULT NULL,"
|
||||
. "\n `reihenfolge` int(11) DEFAULT NULL,"
|
||||
. "\n PRIMARY KEY (`mitglied_von_verbandsorgan_id`),"
|
||||
. "\n KEY (`verbandsorgane_id`),"
|
||||
. "\n KEY (`spieler_id`)"
|
||||
. "\n ) ENGINE=MyISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
|
||||
$query = "UPDATE #__sportsmanager_einstellungen"
|
||||
. "\n SET wert = '118'"
|
||||
. "\n WHERE name = 'datenbank_version'";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
}
|
||||
|
||||
if ($datenbank_version < 119) {
|
||||
|
||||
$query = "CREATE TABLE IF NOT EXISTS `#__sportsmanager_halloffame` ("
|
||||
. "\n `halloffame_id` int(11) NOT NULL AUTO_INCREMENT,"
|
||||
. "\n `veranstalter_id` int(11) DEFAULT NULL,"
|
||||
. "\n `halloffame` varchar(64) DEFAULT NULL,"
|
||||
. "\n `kategorie` int(4) DEFAULT NULL,"
|
||||
. "\n `spielform` int(11) DEFAULT NULL,"
|
||||
. "\n `reihenfolge` int(4) DEFAULT NULL,"
|
||||
. "\n PRIMARY KEY (`halloffame_id`),"
|
||||
. "\n KEY `veranstalter_id` (`veranstalter_id`)"
|
||||
. "\n ) ENGINE=MyISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
|
||||
$query = "CREATE TABLE IF NOT EXISTS `#__sportsmanager_mitglied_von_halloffame` ("
|
||||
. "\n `mitglied_halloffame_id` int(11) NOT NULL AUTO_INCREMENT,"
|
||||
. "\n `halloffame_id` int(11) NOT NULL,"
|
||||
. "\n `jahr` int(4) DEFAULT NULL,"
|
||||
. "\n `platz` int(11) DEFAULT NULL,"
|
||||
. "\n `verein_id` int(11) DEFAULT NULL,"
|
||||
. "\n `teamname` varchar(64) DEFAULT NULL,"
|
||||
. "\n `spieler1_id` int(11) DEFAULT NULL,"
|
||||
. "\n `spieler1` varchar(64) DEFAULT NULL,"
|
||||
. "\n `spieler2_id` int(11) DEFAULT NULL,"
|
||||
. "\n `spieler2` varchar(64) DEFAULT NULL,"
|
||||
. "\n PRIMARY KEY (`mitglied_halloffame_id`),"
|
||||
. "\n UNIQUE KEY `halloffame_jahr_platz` (`halloffame_id`,`jahr`,`platz`),"
|
||||
. "\n KEY `halloffame_id` (`halloffame_id`),"
|
||||
. "\n KEY `verein_id` (`verein_id`),"
|
||||
. "\n KEY `spieler1_id` (`spieler1_id`),"
|
||||
. "\n KEY `spieler2_id` (`spieler2_id`)"
|
||||
. "\n ) ENGINE=MyISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
|
||||
$query = "UPDATE #__sportsmanager_einstellungen"
|
||||
. "\n SET wert = '119'"
|
||||
. "\n WHERE name = 'datenbank_version'";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
}
|
||||
|
||||
if ($datenbank_version < 120) {
|
||||
$columns = $db->getTableColumns('#__sportsmanager_teamspiel_modus');
|
||||
if (!array_key_exists('spiele_in_spielerstatistik', $columns)){
|
||||
$query = "ALTER TABLE `#__sportsmanager_teamspiel_modus`"
|
||||
. "\n ADD `spiele_in_spielerstatistik` INT(4) NOT NULL DEFAULT '0' AFTER `heimtausch`;";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
}
|
||||
|
||||
$columns = $db->getTableColumns('#__sportsmanager_bestenliste_punkte');
|
||||
if (!array_key_exists('team_id', $columns)){
|
||||
$query = "ALTER TABLE `#__sportsmanager_bestenliste_punkte`"
|
||||
. "\n ADD `team_id` INT(11) NULL DEFAULT NULL AFTER `spieler_2_id`;";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
}
|
||||
|
||||
$spielerstatistik_aktualisieren = true;
|
||||
|
||||
$query = "UPDATE #__sportsmanager_einstellungen"
|
||||
. "\n SET wert = '120'"
|
||||
. "\n WHERE name = 'datenbank_version'";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
}
|
||||
|
||||
if ($datenbank_version < 121) {
|
||||
$query = "CREATE TABLE IF NOT EXISTS `#__sportsmanager_sync_log` ("
|
||||
. "\n `sync_id` INT(11) NOT NULL AUTO_INCREMENT,"
|
||||
. "\n `sync_timestamp` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,"
|
||||
. "\n `sync_direction` ENUM('push', 'receive') NOT NULL,"
|
||||
. "\n `sync_trigger` ENUM('manual', 'cron', 'api') NOT NULL,"
|
||||
. "\n `sync_status` ENUM('success', 'error') NOT NULL,"
|
||||
. "\n `spieler_count` INT(11) DEFAULT 0,"
|
||||
. "\n `spieler_updated` INT(11) DEFAULT 0,"
|
||||
. "\n `spieler_added` INT(11) DEFAULT 0,"
|
||||
. "\n `message` TEXT,"
|
||||
. "\n `details` TEXT,"
|
||||
. "\n PRIMARY KEY (`sync_id`),"
|
||||
. "\n INDEX `idx_timestamp` (`sync_timestamp`)"
|
||||
. "\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
|
||||
$query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'dtfb_sync_url', wert = '';";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
|
||||
$query = "UPDATE #__sportsmanager_einstellungen"
|
||||
. "\n SET wert = '121'"
|
||||
. "\n WHERE name = 'datenbank_version'";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
}
|
||||
|
||||
if ($termin_aktionen_email_setzen) {
|
||||
$query = "SELECT aktion_user_id, termin_aktion_id"
|
||||
. "\n FROM #__sportsmanager_termin_aktion";
|
||||
$rows = loadObjectList($db, $query);
|
||||
|
||||
foreach ($rows as $row) {
|
||||
$container = Factory::getContainer();
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
|
||||
use Joomla\CMS\Log\Log;
|
||||
|
||||
/**
|
||||
* @param $db
|
||||
* @param $query
|
||||
* @return mixed
|
||||
* @since 2.0.5
|
||||
*/
|
||||
function loadObjectList($db, $query): mixed
|
||||
{
|
||||
try {
|
||||
$db->setQuery($query);
|
||||
$objList = $db->loadObjectList();
|
||||
} catch (RuntimeException $e) {
|
||||
Log::add("Database error: " . $e->getMessage(), Log::ERROR, "com_sportsmanager");
|
||||
if(isJson()) {
|
||||
abortWithError($e->getMessage());
|
||||
} else {
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
return $objList;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $db
|
||||
* @param $query
|
||||
* @return mixed
|
||||
* @since 2.0.5
|
||||
*/
|
||||
function loadResult($db, $query): mixed
|
||||
{
|
||||
try {
|
||||
$db->setQuery($query);
|
||||
$result = $db->loadResult();
|
||||
} catch (RuntimeException $e) {
|
||||
Log::add("Database error: " . $e->getMessage(), Log::ERROR, "com_sportsmanager");
|
||||
if(isJson()) {
|
||||
abortWithError($e->getMessage());
|
||||
} else {
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
@@ -2323,6 +2323,10 @@ function mp_mult_($p1, $p2): float|int
|
||||
*/
|
||||
function mp_div_($p1, $p2): float|int
|
||||
{
|
||||
if ($p2 == 0) {
|
||||
Log::add("Division by zero detected in mp_div_: divisor was 0. Returning 0 as fallback.", Log::WARNING, "com_sportsmanager");
|
||||
return 0;
|
||||
}
|
||||
return $p1 / $p2;
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,899 @@
|
||||
<?php
|
||||
/**
|
||||
* Sports Manager Sync Extension
|
||||
*/
|
||||
|
||||
use Joomla\CMS\Application\SiteApplication;
|
||||
use Joomla\CMS\Factory;
|
||||
use Joomla\CMS\Language\Text;
|
||||
|
||||
defined("_JEXEC") or die();
|
||||
|
||||
/**
|
||||
* Gets the Bearer token from the Authorization header.
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
function syncGetBearerToken(): ?string
|
||||
{
|
||||
$headers = null;
|
||||
if (isset($_SERVER['Authorization'])) {
|
||||
$headers = trim($_SERVER["Authorization"]);
|
||||
} elseif (isset($_SERVER['HTTP_AUTHORIZATION'])) {
|
||||
$headers = trim($_SERVER["HTTP_AUTHORIZATION"]);
|
||||
} elseif (isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION'])) {
|
||||
$headers = trim($_SERVER["REDIRECT_HTTP_AUTHORIZATION"]);
|
||||
} elseif (function_exists('apache_request_headers')) {
|
||||
$requestHeaders = apache_request_headers();
|
||||
$requestHeaders = array_combine(array_map('ucwords', array_keys($requestHeaders)), array_values($requestHeaders));
|
||||
if (isset($requestHeaders['Authorization'])) {
|
||||
$headers = trim($requestHeaders['Authorization']);
|
||||
}
|
||||
}
|
||||
|
||||
if (!empty($headers)) {
|
||||
if (preg_match('/Bearer\s(\S+)/i', $headers, $matches)) {
|
||||
return $matches[1];
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Logs a sync event in the database.
|
||||
*
|
||||
* @param string $direction ('push' or 'receive')
|
||||
* @param string $trigger ('manual', 'cron', or 'api')
|
||||
* @param string $status ('success' or 'error')
|
||||
* @param int $spieler_count
|
||||
* @param int $spieler_updated
|
||||
* @param int $spieler_added
|
||||
* @param string $message
|
||||
* @param string $details
|
||||
*/
|
||||
function syncLogEntry(string $direction, string $trigger, string $status, int $spieler_count, int $spieler_updated, int $spieler_added, string $message, string $details = ''): void
|
||||
{
|
||||
try {
|
||||
$db = getDatabase();
|
||||
$query = "INSERT INTO #__sportsmanager_sync_log"
|
||||
. "\n SET sync_timestamp = NOW(),"
|
||||
. "\n sync_direction = '" . $db->escape($direction) . "',"
|
||||
. "\n sync_trigger = '" . $db->escape($trigger) . "',"
|
||||
. "\n sync_status = '" . $db->escape($status) . "',"
|
||||
. "\n spieler_count = " . intval($spieler_count) . ","
|
||||
. "\n spieler_updated = " . intval($spieler_updated) . ","
|
||||
. "\n spieler_added = " . intval($spieler_added) . ","
|
||||
. "\n message = '" . $db->escape($message) . "',"
|
||||
. "\n details = '" . $db->escape($details) . "'";
|
||||
$db->setQuery($query);
|
||||
$db->execute();
|
||||
} catch (Exception $e) {
|
||||
error_log("Failed to write sync log: " . $e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns HTML displaying the status of the last sync operation.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function syncGetLastStatus(): string
|
||||
{
|
||||
try {
|
||||
$db = getDatabase();
|
||||
$query = "SELECT * FROM #__sportsmanager_sync_log ORDER BY sync_id DESC LIMIT 1";
|
||||
$rows = loadObjectList($db, $query);
|
||||
if (count($rows) === 0) {
|
||||
return "Noch nie synchronisiert";
|
||||
}
|
||||
$row = $rows[0];
|
||||
|
||||
$statusClass = $row->sync_status === 'success' ? 'uk-text-success' : 'uk-text-danger';
|
||||
$statusText = $row->sync_status === 'success' ? 'Erfolgreich' : 'Fehlgeschlagen';
|
||||
$directionText = $row->sync_direction === 'push' ? 'Export (Push)' : 'Import (Receive)';
|
||||
$triggerText = $row->sync_trigger === 'manual' ? 'Manuell' : ($row->sync_trigger === 'cron' ? 'Cron' : 'API');
|
||||
|
||||
$stats = "";
|
||||
if ($row->sync_status === 'success') {
|
||||
$stats = sprintf(
|
||||
" (Spieler gesamt: %d, Aktualisiert: %d, Hinzugefügt: %d)",
|
||||
$row->spieler_count,
|
||||
$row->spieler_updated,
|
||||
$row->spieler_added
|
||||
);
|
||||
} else {
|
||||
$stats = " (Fehler: " . htmlspecialchars($row->message) . ")";
|
||||
}
|
||||
|
||||
return sprintf(
|
||||
"<span class='%s'><strong>%s</strong></span> am %s via %s / %s%s",
|
||||
$statusClass,
|
||||
$statusText,
|
||||
date('d.m.Y H:i:s', strtotime($row->sync_timestamp)),
|
||||
$directionText,
|
||||
$triggerText,
|
||||
$stats
|
||||
);
|
||||
} catch (Exception $e) {
|
||||
return "Noch nie synchronisiert";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Exports player data to a tab-separated CSV string.
|
||||
* Excludes personal contact details and images.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function syncExportSpielerCSV(): string
|
||||
{
|
||||
$db = getDatabase();
|
||||
$jahr = date("Y");
|
||||
$query = "SELECT nachname, vorname, spielernr, lizenznr, lizenz, geschlecht";
|
||||
$query .= ",\n IF(ISNULL(geburtsjahr), IF(geschlecht = 'M', 'H', 'D'), IF(" . ($jahr - 18) . " <= geburtsjahr, 'J', IF(" . ($jahr - 50) . " > geburtsjahr, 'S', IF(geschlecht = 'M', 'H', 'D')))) AS kategorie";
|
||||
$query .= ",\n vereinsname as verein, vereinssitz, veranstalterbezeichnung as organisation, IF(mitgliedsstatus = 1, 'Aktiv', IF(mitgliedsstatus = 0, 'Ausgetreten', IF(mitgliedsstatus = 2, 'Eingeschränkt', 'Passiv'))) AS mitgliedsstatus";
|
||||
$query .= ",\n geburtsjahr";
|
||||
$query .= "\n FROM #__sportsmanager_spieler";
|
||||
$query .= "\n LEFT JOIN #__sportsmanager_mitglied_von_verein ON #__sportsmanager_spieler.spieler_id = #__sportsmanager_mitglied_von_verein.spieler_id AND #__sportsmanager_mitglied_von_verein.verein_id = #__sportsmanager_spieler.aktueller_verein_id"
|
||||
. "\n LEFT JOIN #__sportsmanager_verein ON #__sportsmanager_verein.verein_id = #__sportsmanager_spieler.aktueller_verein_id"
|
||||
. "\n LEFT JOIN #__sportsmanager_veranstalter ON #__sportsmanager_veranstalter.veranstalter_id = #__sportsmanager_verein.veranstalter_id";
|
||||
$query .= "\n WHERE NOT ISNULL(aktueller_verein_id) AND NOT ISNULL(spielernr) AND spielernr != ''";
|
||||
$query .= "\n ORDER BY nachname, vorname";
|
||||
|
||||
$rows = loadObjectList($db, $query);
|
||||
if (count($rows) === 0) {
|
||||
return "";
|
||||
}
|
||||
|
||||
$trennzeichen = "\t";
|
||||
$header = "";
|
||||
foreach ($rows[0] as $field => $value) {
|
||||
$header .= $field . $trennzeichen;
|
||||
}
|
||||
$header = rtrim($header, $trennzeichen);
|
||||
|
||||
$data = "";
|
||||
foreach ($rows as $row) {
|
||||
$line = '';
|
||||
foreach ($row as $value) {
|
||||
if ((!isset($value)) or ($value === "")) {
|
||||
$value = $trennzeichen;
|
||||
} else {
|
||||
$value = str_replace('"', '""', $value);
|
||||
$value = str_replace("\t", ' ', $value);
|
||||
$value = str_replace("\r", '', $value);
|
||||
$value = str_replace("\n", ' ', $value);
|
||||
$value = '="' . $value . '"' . $trennzeichen;
|
||||
}
|
||||
$line .= $value;
|
||||
}
|
||||
$data .= rtrim($line, $trennzeichen) . "\n";
|
||||
}
|
||||
$data = str_replace("\r", "", $data);
|
||||
|
||||
return "sep=" . $trennzeichen . "\n" . $header . "\n" . $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Pushes the exported CSV data to DTFB (dtfb_sync_url) via cURL.
|
||||
*
|
||||
* @param string $csvData
|
||||
* @return array
|
||||
*/
|
||||
function syncPushToDtfb(string $csvData): array
|
||||
{
|
||||
$push_key = einstellungswert("api_push_key");
|
||||
$sync_url = einstellungswert("dtfb_sync_url");
|
||||
|
||||
if (empty($sync_url)) {
|
||||
return [
|
||||
'success' => false,
|
||||
'message' => 'Sync-URL nicht konfiguriert.'
|
||||
];
|
||||
}
|
||||
if (empty($push_key)) {
|
||||
return [
|
||||
'success' => false,
|
||||
'message' => 'API Push Key nicht konfiguriert.'
|
||||
];
|
||||
}
|
||||
|
||||
$ch = curl_init($sync_url);
|
||||
if (!$ch) {
|
||||
return [
|
||||
'success' => false,
|
||||
'message' => 'Initialisierung von cURL fehlgeschlagen.'
|
||||
];
|
||||
}
|
||||
|
||||
curl_setopt_array($ch, array(
|
||||
CURLOPT_POST => TRUE,
|
||||
CURLOPT_RETURNTRANSFER => TRUE,
|
||||
CURLOPT_HTTPHEADER => array(
|
||||
'Authorization: Bearer ' . $push_key,
|
||||
'Content-Type: text/csv; charset=utf-8',
|
||||
),
|
||||
CURLOPT_TIMEOUT => 60,
|
||||
CURLOPT_POSTFIELDS => $csvData,
|
||||
));
|
||||
|
||||
$resp = curl_exec($ch);
|
||||
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
|
||||
if (curl_errno($ch)) {
|
||||
$error_msg = curl_error($ch);
|
||||
curl_close($ch);
|
||||
return [
|
||||
'success' => false,
|
||||
'message' => 'cURL-Fehler: ' . $error_msg
|
||||
];
|
||||
}
|
||||
curl_close($ch);
|
||||
|
||||
if ($http_code !== 200) {
|
||||
return [
|
||||
'success' => false,
|
||||
'message' => 'HTTP-Status ' . $http_code . ': ' . $resp
|
||||
];
|
||||
}
|
||||
|
||||
$result = json_decode($resp, true);
|
||||
if (json_last_error() === JSON_ERROR_NONE) {
|
||||
if (isset($result['success']) && $result['success']) {
|
||||
return [
|
||||
'success' => true,
|
||||
'message' => $result['message'] ?? 'Erfolgreich synchronisiert.',
|
||||
'spieler_count' => $result['spieler_count'] ?? 0,
|
||||
'spieler_updated' => $result['spieler_updated'] ?? 0,
|
||||
'spieler_added' => $result['spieler_added'] ?? 0
|
||||
];
|
||||
} else {
|
||||
return [
|
||||
'success' => false,
|
||||
'message' => $result['error'] ?? $result['message'] ?? 'Import auf Empfängerseite fehlgeschlagen.'
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
if (str_contains(strtolower($resp), 'success')) {
|
||||
return [
|
||||
'success' => true,
|
||||
'message' => 'Erfolgreich synchronisiert (Klartext-Antwort).'
|
||||
];
|
||||
}
|
||||
|
||||
return [
|
||||
'success' => false,
|
||||
'message' => 'Unerwartete Antwort vom Server: ' . substr($resp, 0, 200)
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Processes incoming CSV data and imports it into the local database.
|
||||
* Aborts and returns an error if any organization name in the CSV cannot
|
||||
* be matched with an existing local organization.
|
||||
*
|
||||
* @param string $csvData
|
||||
* @return array
|
||||
*/
|
||||
function syncReceiveSpielerImport(string $csvData): array
|
||||
{
|
||||
if (!ini_get('safe_mode'))
|
||||
set_time_limit(300);
|
||||
|
||||
$db = getDatabase();
|
||||
|
||||
// Normalise the payload to UTF-8. The automatic/semi-automatic sync path is
|
||||
// UTF-8 end to end, but a legacy/manual export (e.g. from TFVHH) can be
|
||||
// latin1/Windows-1252 encoded. Without this, non-ASCII bytes (e.g. "ß" in an
|
||||
// organisation name) get truncated when staged into the utf8mb4 import table,
|
||||
// causing the organisation match to fail and every row to be skipped silently.
|
||||
if (!mb_check_encoding($csvData, 'UTF-8')) {
|
||||
$csvData = mb_convert_encoding($csvData, 'UTF-8', 'Windows-1252');
|
||||
}
|
||||
|
||||
$lines = explode("\n", str_replace("\r", "", $csvData));
|
||||
if (count($lines) < 2) {
|
||||
return [
|
||||
'success' => false,
|
||||
'message' => 'Keine Daten in der CSV-Datei gefunden.'
|
||||
];
|
||||
}
|
||||
|
||||
$lineIdx = 0;
|
||||
$titelzeile = trim($lines[$lineIdx]);
|
||||
|
||||
if (str_starts_with($titelzeile, "sep=")) {
|
||||
$trennzeichen = substr($titelzeile, 4);
|
||||
if ($trennzeichen === "") {
|
||||
$trennzeichen = "\t";
|
||||
}
|
||||
$lineIdx++;
|
||||
if (isset($lines[$lineIdx])) {
|
||||
$titelzeile = trim($lines[$lineIdx]);
|
||||
} else {
|
||||
return [
|
||||
'success' => false,
|
||||
'message' => 'CSV-Datei enthält nach sep= keine Titelzeile.'
|
||||
];
|
||||
}
|
||||
} else {
|
||||
$trennzeichen = "\t";
|
||||
}
|
||||
|
||||
$titel = explode($trennzeichen, strtolower($titelzeile));
|
||||
$spalte = array();
|
||||
foreach ($titel as $index => $bezeichnung) {
|
||||
$bezeichnung = trim($bezeichnung);
|
||||
$len = strlen($bezeichnung);
|
||||
if ($len >= 2 && $bezeichnung[0] === '"' && $bezeichnung[$len - 1] === '"') {
|
||||
$bezeichnung = trim(str_replace('""', '"', substr($bezeichnung, 1, $len - 2)));
|
||||
}
|
||||
|
||||
if ($bezeichnung === "name" || $bezeichnung === "nachname") {
|
||||
$spalte["nachname"] = $index;
|
||||
} else if ($bezeichnung === "vorname") {
|
||||
$spalte["vorname"] = $index;
|
||||
} else if ($bezeichnung === "name, vorname" || $bezeichnung === "name,vorname") {
|
||||
$spalte["name,vorname"] = $index;
|
||||
} else if ($bezeichnung === "pseudonym") {
|
||||
$spalte["pseudonym"] = $index;
|
||||
} else if ($bezeichnung === "geschlecht" || $bezeichnung === "anrede") {
|
||||
$spalte["geschlecht"] = $index;
|
||||
} else if ($bezeichnung === "spielernr" || $bezeichnung === "spielernr." || $bezeichnung === "spielerpass") {
|
||||
$spalte["spielernr"] = $index;
|
||||
} else if ($bezeichnung === "spielernr alt" || $bezeichnung === "spielernr. alt" || $bezeichnung === "spielernr_alt") {
|
||||
$spalte["spielernr_alt"] = $index;
|
||||
} else if ($bezeichnung === "lizenznr" || $bezeichnung === "lizenznr.") {
|
||||
$spalte["lizenznr"] = $index;
|
||||
} else if ($bezeichnung === "organisation") {
|
||||
$spalte["organisation"] = $index;
|
||||
} else if ($bezeichnung === "vereinssitz") {
|
||||
$spalte["vereinssitz"] = $index;
|
||||
} else if ($bezeichnung === "vereinsname" || $bezeichnung === "verein") {
|
||||
$spalte["vereinsname"] = $index;
|
||||
} else if ($bezeichnung === "geburtsdatum") {
|
||||
$spalte["geburtsdatum"] = $index;
|
||||
} else if ($bezeichnung === "geburtsjahr") {
|
||||
$spalte["geburtsjahr"] = $index;
|
||||
} else if ($bezeichnung === "email" || $bezeichnung === "e-mail") {
|
||||
$spalte["email"] = $index;
|
||||
} else if (str_starts_with($bezeichnung, "stra")) {
|
||||
$spalte["strasse"] = $index;
|
||||
} else if ($bezeichnung === "plz/ort") {
|
||||
$spalte["plz/ort"] = $index;
|
||||
} else if ($bezeichnung === "plz") {
|
||||
$spalte["plz"] = $index;
|
||||
} else if ($bezeichnung === "ort") {
|
||||
$spalte["ort"] = $index;
|
||||
} else if ($bezeichnung === "landeskennung") {
|
||||
$spalte["landeskennung"] = $index;
|
||||
} else if ($bezeichnung === "telefon") {
|
||||
$spalte["telefon"] = $index;
|
||||
} else if ($bezeichnung === "mobil") {
|
||||
$spalte["mobil"] = $index;
|
||||
} else if ($bezeichnung === "austritt" || $bezeichnung === "ausgetreten") {
|
||||
$spalte["ausgetreten"] = $index;
|
||||
} else if ($bezeichnung === "mitgliedsstatus") {
|
||||
$spalte["mitgliedsstatus"] = $index;
|
||||
}
|
||||
}
|
||||
|
||||
if (((!isset($spalte["nachname"]) || !isset($spalte["vorname"])) && !isset($spalte["name,vorname"])) || !isset($spalte["spielernr"])) {
|
||||
return [
|
||||
'success' => false,
|
||||
'message' => 'Die übergebene Datei ist keine gültige Spielerdatei (erforderliche Spalten fehlen).'
|
||||
];
|
||||
}
|
||||
|
||||
$lineIdx++;
|
||||
// Source the staging session id from the database clock, not PHP's. The
|
||||
// stale-row cleanup below compares session_id against the database NOW(); if
|
||||
// PHP and the database run in different timezones, a PHP-generated timestamp
|
||||
// can fall outside the window and the just-inserted rows get deleted mid-import.
|
||||
$session_id = loadResult($db, "SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s')");
|
||||
if (empty($session_id)) {
|
||||
$session_id = date('Y-m-d H:i:s');
|
||||
}
|
||||
|
||||
$organisations = [];
|
||||
$rows_to_insert = [];
|
||||
|
||||
for ($i = $lineIdx; $i < count($lines); $i++) {
|
||||
$buffer = trim($lines[$i]);
|
||||
if ($buffer === "") {
|
||||
continue;
|
||||
}
|
||||
|
||||
$daten = explode($trennzeichen, $buffer);
|
||||
foreach ($daten as $index => $wert) {
|
||||
$wert = trim($wert);
|
||||
$len = strlen($wert);
|
||||
if ($len < 2 || $wert[$len - 1] !== '"' || !($wert[0] === '"' || ($wert[0] === '=' && $wert[1] === '"'))) {
|
||||
$daten[$index] = $wert;
|
||||
} else if ($wert[0] === '"') {
|
||||
$daten[$index] = trim(str_replace('""', '"', substr($wert, 1, $len - 2)));
|
||||
} else {
|
||||
$daten[$index] = trim(str_replace('""', '"', substr($wert, 2, $len - 3)));
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($spalte["vorname"]) && isset($spalte["nachname"]) && isset($daten[$spalte["vorname"]]) && isset($daten[$spalte["nachname"]])) {
|
||||
$nachname = $daten[$spalte["nachname"]];
|
||||
$vorname = $daten[$spalte["vorname"]];
|
||||
} else if (isset($spalte["name,vorname"]) && isset($daten[$spalte["name,vorname"]])) {
|
||||
$pos = strpos($daten[$spalte["name,vorname"]], ",");
|
||||
if ($pos === false) {
|
||||
continue;
|
||||
}
|
||||
$nachname = trim(substr($daten[$spalte["name,vorname"]], 0, $pos));
|
||||
$vorname = trim(substr($daten[$spalte["name,vorname"]], $pos + 1));
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($vorname === "" || $nachname === "") {
|
||||
continue;
|
||||
}
|
||||
|
||||
$mitgliedsstatus = 1;
|
||||
if (isset($spalte["mitgliedsstatus"]) && !empty($daten[$spalte["mitgliedsstatus"]])) {
|
||||
$s = strtolower($daten[$spalte["mitgliedsstatus"]]);
|
||||
if ($s === "ausgetreten") {
|
||||
$mitgliedsstatus = 0;
|
||||
} else if ($s === "passiv") {
|
||||
$mitgliedsstatus = 3;
|
||||
} else if (str_starts_with($s, "eingeschr")) {
|
||||
$mitgliedsstatus = 2;
|
||||
}
|
||||
} else if (isset($spalte["ausgetreten"]) && !empty($daten[$spalte["ausgetreten"]])) {
|
||||
if (strtolower($daten[$spalte["ausgetreten"]]) === "ja") {
|
||||
$mitgliedsstatus = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if ($mitgliedsstatus == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$geschlecht = isset($spalte["geschlecht"]) && !empty($daten[$spalte["geschlecht"]]) ? (($daten[$spalte["geschlecht"]][0] === "M" || $daten[$spalte["geschlecht"]][0] === "m" || $daten[$spalte["geschlecht"]][0] === "H" || $daten[$spalte["geschlecht"]][0] === "h") ? "M" : "W") : "M";
|
||||
$spielernr = isset($daten[$spalte["spielernr"]]) ? trim($daten[$spalte["spielernr"]]) : "";
|
||||
// Validate the Passnummer with the same format the manual import enforces
|
||||
// (NN-NNNN[NN]). Invalid values are dropped rather than aborting the whole
|
||||
// automated feed, keeping the player but treating them as having no pass.
|
||||
if (!empty($spielernr) && !preg_match('/^[0-9]{2}-[0-9]{4,6}$/', $spielernr)) {
|
||||
$spielernr = "";
|
||||
}
|
||||
|
||||
$spielernr_alt = isset($spalte["spielernr_alt"]) && isset($daten[$spalte["spielernr_alt"]]) ? trim($daten[$spalte["spielernr_alt"]]) : "";
|
||||
if (!empty($spielernr_alt) && !preg_match('/^[0-9]{2}-[0-9]{4,6}$/', $spielernr_alt)) {
|
||||
$spielernr_alt = "";
|
||||
}
|
||||
$lizenznr = isset($spalte["lizenznr"]) && isset($daten[$spalte["lizenznr"]]) ? $daten[$spalte["lizenznr"]] : "";
|
||||
if (!empty($lizenznr) && !ctype_digit(substr($lizenznr, strlen($lizenznr) - 1, 1))) {
|
||||
$lizenznr = "";
|
||||
}
|
||||
|
||||
$pseudonym = isset($spalte["pseudonym"]) && isset($daten[$spalte["pseudonym"]]) ? $daten[$spalte["pseudonym"]] : "";
|
||||
$organisation = isset($spalte["organisation"]) && isset($daten[$spalte["organisation"]]) ? $daten[$spalte["organisation"]] : "";
|
||||
$vereinssitz = isset($spalte["vereinssitz"]) && isset($daten[$spalte["vereinssitz"]]) ? $daten[$spalte["vereinssitz"]] : "";
|
||||
$vereinsname = isset($spalte["vereinsname"]) && isset($daten[$spalte["vereinsname"]]) ? $daten[$spalte["vereinsname"]] : "";
|
||||
|
||||
$geburtsjahr = isset($spalte["geburtsjahr"]) && isset($daten[$spalte["geburtsjahr"]]) ? $daten[$spalte["geburtsjahr"]] : null;
|
||||
if (empty($geburtsjahr) || !ctype_digit($geburtsjahr) || $geburtsjahr < 1800) {
|
||||
$geburtsjahr = null;
|
||||
}
|
||||
|
||||
if (!empty($organisation)) {
|
||||
$organisations[trim($organisation)] = true;
|
||||
}
|
||||
|
||||
$rows_to_insert[] = [
|
||||
'vorname' => $vorname,
|
||||
'nachname' => $nachname,
|
||||
'spielernr' => $spielernr,
|
||||
'spielernr_alt' => $spielernr_alt,
|
||||
'lizenznr' => $lizenznr,
|
||||
'pseudonym' => $pseudonym,
|
||||
'organisation' => $organisation,
|
||||
'vereinssitz' => $vereinssitz,
|
||||
'vereinsname' => $vereinsname,
|
||||
'geburtsjahr' => $geburtsjahr,
|
||||
'mitgliedsstatus' => $mitgliedsstatus,
|
||||
'geschlecht' => $geschlecht
|
||||
];
|
||||
}
|
||||
|
||||
if (empty($rows_to_insert)) {
|
||||
return [
|
||||
'success' => false,
|
||||
'message' => 'Keine gültigen Spielerzeilen zum Importieren gefunden.'
|
||||
];
|
||||
}
|
||||
|
||||
// Auto-match Veranstalter by name. If it does not match, abort.
|
||||
$org_map = [];
|
||||
foreach (array_keys($organisations) as $orgName) {
|
||||
$query = "SELECT veranstalter_id FROM #__sportsmanager_veranstalter WHERE veranstalterbezeichnung = '" . $db->escape($orgName) . "'";
|
||||
$res = loadObjectList($db, $query);
|
||||
if (count($res) === 0) {
|
||||
return [
|
||||
'success' => false,
|
||||
'message' => 'Veranstalter "' . $orgName . '" existiert nicht auf diesem Empfänger-System. Import abgebrochen.'
|
||||
];
|
||||
}
|
||||
$org_map[$orgName] = intval($res[0]->veranstalter_id);
|
||||
}
|
||||
|
||||
// Insert into staging table
|
||||
foreach ($rows_to_insert as $row) {
|
||||
$query = "INSERT INTO #__sportsmanager_spieler_import"
|
||||
. "\n SET session_id = '" . $db->escape($session_id) . "',"
|
||||
. "\n vorname = '" . $db->escape($row['vorname']) . "',"
|
||||
. "\n nachname = '" . $db->escape($row['nachname']) . "',"
|
||||
. "\n spielernr = '" . $db->escape($row['spielernr']) . "',"
|
||||
. "\n spielernr_alt = '" . $db->escape($row['spielernr_alt']) . "',"
|
||||
. "\n lizenznr = '" . $db->escape($row['lizenznr']) . "',"
|
||||
. "\n pseudonym = '" . $db->escape($row['pseudonym']) . "',"
|
||||
. "\n geschlecht = '" . $db->escape($row['geschlecht']) . "',"
|
||||
. "\n geburtsjahr = " . ($row['geburtsjahr'] === null ? "NULL" : "'" . $db->escape($row['geburtsjahr']) . "'") . ","
|
||||
. "\n vereinsname = '" . $db->escape($row['vereinsname']) . "',"
|
||||
. "\n vereinssitz = '" . $db->escape($row['vereinssitz']) . "',"
|
||||
. "\n veranstalterbezeichnung = '" . $db->escape($row['organisation']) . "',"
|
||||
. "\n mitgliedsstatus = '" . $row['mitgliedsstatus'] . "'";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
return [
|
||||
'success' => false,
|
||||
'message' => 'Fehler beim Schreiben in die Staging-Tabelle: ' . $db->stderr()
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
// Clean up older staging data (older than 5 minutes)
|
||||
$query = "SELECT DISTINCT session_id"
|
||||
. "\n FROM #__sportsmanager_spieler_import"
|
||||
. "\n WHERE session_id < SUBTIME(NOW(), '00:05:00')";
|
||||
$old_sessions = loadObjectList($db, $query);
|
||||
foreach ($old_sessions as $old_session) {
|
||||
$query = "DELETE FROM #__sportsmanager_spieler_import WHERE session_id = '" . $db->escape($old_session->session_id) . "'";
|
||||
$db->setQuery($query);
|
||||
$db->execute();
|
||||
}
|
||||
|
||||
// Fetch staging players with matching ID
|
||||
$query = "SELECT #__sportsmanager_spieler_import.*, #__sportsmanager_spieler.spieler_id"
|
||||
. "\n FROM #__sportsmanager_spieler_import"
|
||||
. "\n LEFT JOIN #__sportsmanager_spieler ON #__sportsmanager_spieler_import.spielernr != '' AND #__sportsmanager_spieler_import.spielernr = #__sportsmanager_spieler.spielernr"
|
||||
. "\n WHERE session_id = '" . $db->escape($session_id) . "'";
|
||||
$spieler_import = loadObjectList($db, $query);
|
||||
|
||||
// Count how many active players the incoming payload provides per organisation.
|
||||
// The mass-deactivation below is only safe when the payload is a *full* roster;
|
||||
// a partial CSV would otherwise silently deactivate every member not listed.
|
||||
$incoming_per_org = [];
|
||||
foreach ($rows_to_insert as $row) {
|
||||
$o = trim($row['organisation']);
|
||||
if ($o !== "") {
|
||||
$incoming_per_org[$o] = ($incoming_per_org[$o] ?? 0) + 1;
|
||||
}
|
||||
}
|
||||
// Minimum fraction of the currently-active roster the payload must contain
|
||||
// before the sweep is allowed to run. Configurable; defaults to 0.5.
|
||||
$deactivation_min_ratio = (float) (einstellungswert("sync_deactivation_min_ratio") ?? 0.5);
|
||||
if ($deactivation_min_ratio <= 0 || $deactivation_min_ratio > 1) {
|
||||
$deactivation_min_ratio = 0.5;
|
||||
}
|
||||
|
||||
$warnings = [];
|
||||
$deactivated_total = 0;
|
||||
|
||||
// Deactivate all memberships for involved organisations temporarily. The
|
||||
// players present in the payload are reactivated further below; anyone not
|
||||
// listed stays deactivated (i.e. is treated as having left the organisation).
|
||||
foreach ($org_map as $orgName => $veranstalterId) {
|
||||
$aktiv_vorher = (int) loadResult(
|
||||
$db,
|
||||
"SELECT COUNT(*) FROM #__sportsmanager_mitglied_von_verein"
|
||||
. " INNER JOIN #__sportsmanager_verein USING (verein_id)"
|
||||
. " WHERE veranstalter_id = " . $veranstalterId
|
||||
. " AND NOT #__sportsmanager_mitglied_von_verein.ausgetreten"
|
||||
);
|
||||
$eingehend = $incoming_per_org[$orgName] ?? 0;
|
||||
|
||||
// Guard: skip the sweep when the payload looks like a partial roster
|
||||
// (far fewer players than are currently active). This prevents a partial
|
||||
// export from wiping an entire organisation's memberships.
|
||||
if ($aktiv_vorher > 0 && $eingehend < $aktiv_vorher * $deactivation_min_ratio) {
|
||||
$warnings[] = sprintf(
|
||||
'Massen-Deaktivierung für "%s" übersprungen: nur %d von %d aktiven Mitgliedern in den Daten (mögliche Teil-Liste).',
|
||||
$orgName,
|
||||
$eingehend,
|
||||
$aktiv_vorher
|
||||
);
|
||||
continue;
|
||||
}
|
||||
|
||||
$query = "UPDATE #__sportsmanager_mitglied_von_verein INNER JOIN #__sportsmanager_verein USING (verein_id)"
|
||||
. "\n SET mitgliedsstatus = 0,"
|
||||
. "\n #__sportsmanager_mitglied_von_verein.ausgetreten = TRUE"
|
||||
. "\n WHERE veranstalter_id = " . $veranstalterId;
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
return [
|
||||
'success' => false,
|
||||
'message' => 'Fehler beim Deaktivieren der alten Vereinsmitgliedschaften.'
|
||||
];
|
||||
}
|
||||
$deactivated_total += $aktiv_vorher;
|
||||
}
|
||||
|
||||
$spieler_updated = 0;
|
||||
$spieler_added = 0;
|
||||
$spielerIdsHinzugefuegt = array();
|
||||
|
||||
foreach ($spieler_import as $t) {
|
||||
$orgName = $t->veranstalterbezeichnung;
|
||||
$veranstalterId = $org_map[$orgName] ?? -1;
|
||||
|
||||
if ($veranstalterId === -1 && !empty($orgName)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$spieler_id = $t->spieler_id;
|
||||
$nachname = $t->nachname;
|
||||
$vorname = $t->vorname;
|
||||
$geschlecht = $t->geschlecht;
|
||||
$lizenznr = $t->lizenznr;
|
||||
$pseudonym = $t->pseudonym;
|
||||
$vereinsname = $t->vereinsname;
|
||||
$vereinssitz = $t->vereinssitz;
|
||||
$geburtsjahr = $t->geburtsjahr;
|
||||
$spielernr = $t->spielernr;
|
||||
$mitgliedsstatus = $t->mitgliedsstatus;
|
||||
|
||||
if ($spieler_id === null && !empty($spielernr) && isset($spielerIdsHinzugefuegt[$spielernr])) {
|
||||
$spieler_id = $spielerIdsHinzugefuegt[$spielernr];
|
||||
}
|
||||
|
||||
if ($spieler_id === null && empty($spielernr)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($spieler_id === null && empty($vereinsname)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($spieler_id !== null) {
|
||||
$query = "UPDATE #__sportsmanager_spieler"
|
||||
. "\n SET vorname = '" . $db->escape($vorname) . "',"
|
||||
. "\n nachname = '" . $db->escape($nachname) . "',"
|
||||
. "\n geschlecht = '" . $db->escape($geschlecht) . "'"
|
||||
. "\n WHERE spieler_id = " . intval($spieler_id);
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
return [
|
||||
'success' => false,
|
||||
'message' => 'Fehler beim Aktualisieren des Spielers ID ' . $spieler_id
|
||||
];
|
||||
}
|
||||
$spieler_updated++;
|
||||
} else {
|
||||
$query = "INSERT INTO #__sportsmanager_spieler"
|
||||
. "\n SET vorname = '" . $db->escape($vorname) . "',"
|
||||
. "\n nachname = '" . $db->escape($nachname) . "',"
|
||||
. "\n spielernr = '" . $db->escape($spielernr) . "',"
|
||||
. "\n lizenznr = '" . $db->escape($lizenznr) . "',"
|
||||
. "\n geschlecht = '" . $db->escape($geschlecht) . "',"
|
||||
. "\n geburtsjahr = " . ($geburtsjahr === null ? "NULL" : "'" . $db->escape($geburtsjahr) . "'");
|
||||
if (!empty($pseudonym)) {
|
||||
$query .= ",\n pseudonym = '" . $db->escape($pseudonym) . "'";
|
||||
}
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
return [
|
||||
'success' => false,
|
||||
'message' => 'Fehler beim Anlegen des neuen Spielers ' . $vorname . ' ' . $nachname
|
||||
];
|
||||
}
|
||||
$spieler_id = $db->insertid();
|
||||
$spielerIdsHinzugefuegt[$spielernr] = $spieler_id;
|
||||
|
||||
$spieler_added++;
|
||||
}
|
||||
|
||||
if (!empty($vereinsname) && $veranstalterId !== -1) {
|
||||
$query = "SELECT spieler_id FROM #__sportsmanager_mitglied_von_verein"
|
||||
. "\n WHERE spieler_id = $spieler_id AND verein_id = "
|
||||
. " (SELECT verein_id FROM #__sportsmanager_verein WHERE vereinsname = '" . $db->escape($vereinsname) . "' AND veranstalter_id = $veranstalterId LIMIT 1)";
|
||||
$memb_check = loadObjectList($db, $query);
|
||||
|
||||
if (count($memb_check) > 0) {
|
||||
$query = "UPDATE #__sportsmanager_mitglied_von_verein, #__sportsmanager_verein"
|
||||
. "\n SET mitgliedsstatus = '$mitgliedsstatus', #__sportsmanager_mitglied_von_verein.ausgetreten = FALSE"
|
||||
. "\n WHERE spieler_id = $spieler_id AND vereinsname = '" . $db->escape($vereinsname) . "' AND #__sportsmanager_verein.verein_id = #__sportsmanager_mitglied_von_verein.verein_id"
|
||||
. " AND veranstalter_id = $veranstalterId";
|
||||
$db->setQuery($query);
|
||||
$db->execute();
|
||||
} else {
|
||||
$query = "SELECT verein_id FROM #__sportsmanager_verein"
|
||||
. "\n WHERE vereinsname = '" . $db->escape($vereinsname) . "' AND veranstalter_id = $veranstalterId";
|
||||
$club_rows = loadObjectList($db, $query);
|
||||
|
||||
if (count($club_rows) > 0) {
|
||||
$verein_id = intval($club_rows[0]->verein_id);
|
||||
} else {
|
||||
$query = "INSERT INTO #__sportsmanager_verein"
|
||||
. "\n SET vereinsname = '" . $db->escape($vereinsname) . "',"
|
||||
. "\n veranstalter_id = $veranstalterId";
|
||||
if (!empty($vereinssitz)) {
|
||||
$query .= ",\n vereinssitz = '" . $db->escape($vereinssitz) . "'";
|
||||
}
|
||||
$db->setQuery($query);
|
||||
$db->execute();
|
||||
$verein_id = $db->insertid();
|
||||
}
|
||||
|
||||
$query = "INSERT INTO #__sportsmanager_mitglied_von_verein"
|
||||
. "\n SET spieler_id = $spieler_id, verein_id = $verein_id, mitgliedsstatus = '$mitgliedsstatus', ausgetreten = FALSE";
|
||||
$db->setQuery($query);
|
||||
$db->execute();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($org_map as $orgName => $veranstalterId) {
|
||||
$query = "UPDATE #__sportsmanager_verein"
|
||||
. "\n SET ausgetreten = TRUE"
|
||||
. "\n WHERE NOT EXISTS(SELECT * FROM #__sportsmanager_mitglied_von_verein WHERE #__sportsmanager_verein.verein_id = #__sportsmanager_mitglied_von_verein.verein_id AND NOT #__sportsmanager_mitglied_von_verein.ausgetreten) AND NOT ausgetreten AND veranstalter_id = " . $veranstalterId;
|
||||
$db->setQuery($query);
|
||||
$db->execute();
|
||||
|
||||
$query = "UPDATE #__sportsmanager_verein"
|
||||
. "\n SET ausgetreten = FALSE"
|
||||
. "\n WHERE EXISTS(SELECT * FROM #__sportsmanager_mitglied_von_verein WHERE #__sportsmanager_verein.verein_id = #__sportsmanager_mitglied_von_verein.verein_id AND NOT #__sportsmanager_mitglied_von_verein.ausgetreten) AND ausgetreten AND veranstalter_id = " . $veranstalterId;
|
||||
$db->setQuery($query);
|
||||
$db->execute();
|
||||
|
||||
$query = "SELECT DISTINCT verein_id, #__sportsmanager_spieler_import.vereinsname, #__sportsmanager_spieler_import.vereinssitz"
|
||||
. "\n FROM #__sportsmanager_spieler_import"
|
||||
. "\n INNER JOIN #__sportsmanager_verein ON #__sportsmanager_verein.vereinsname = #__sportsmanager_spieler_import.vereinsname"
|
||||
. "\n WHERE session_id = '" . $db->escape($session_id) . "' AND #__sportsmanager_spieler_import.veranstalterbezeichnung = '" . $db->escape($orgName) . "' AND #__sportsmanager_spieler_import.vereinsname != '' AND #__sportsmanager_spieler_import.vereinssitz != '' AND (ISNULL(#__sportsmanager_verein.vereinssitz) OR #__sportsmanager_verein.vereinssitz != #__sportsmanager_spieler_import.vereinssitz) AND NOT #__sportsmanager_verein.ausgetreten AND veranstalter_id = " . $veranstalterId;
|
||||
$rows_headquarters = loadObjectList($db, $query);
|
||||
foreach ($rows_headquarters as $row) {
|
||||
$query = "UPDATE #__sportsmanager_verein"
|
||||
. "\n SET vereinssitz = '" . $db->escape($row->vereinssitz) . "'"
|
||||
. "\n WHERE verein_id = $row->verein_id";
|
||||
$db->setQuery($query);
|
||||
$db->execute();
|
||||
}
|
||||
}
|
||||
|
||||
$query = "DELETE FROM #__sportsmanager_spieler_import WHERE session_id = '" . $db->escape($session_id) . "'";
|
||||
$db->setQuery($query);
|
||||
$db->execute();
|
||||
|
||||
// Fail loudly on a zero-effect import: if valid rows were parsed but nothing
|
||||
// was added or updated, the data almost certainly failed to map (e.g. an
|
||||
// encoding mismatch corrupting organisation names). Reporting success here
|
||||
// would silently hide data loss.
|
||||
if (count($rows_to_insert) > 0 && $spieler_added === 0 && $spieler_updated === 0) {
|
||||
return [
|
||||
'success' => false,
|
||||
'message' => 'Import ergab keine Änderungen trotz ' . count($rows_to_insert)
|
||||
. ' gültiger Zeilen – mögliche Encoding- oder Zuordnungsfehler.',
|
||||
'spieler_count' => count($rows_to_insert),
|
||||
'spieler_updated' => 0,
|
||||
'spieler_added' => 0,
|
||||
'warnings' => $warnings
|
||||
];
|
||||
}
|
||||
|
||||
aktuellerVereinAktualisieren();
|
||||
ranglisteAktualisieren();
|
||||
einstufungAktualisieren();
|
||||
|
||||
return [
|
||||
'success' => true,
|
||||
'spieler_count' => count($rows_to_insert),
|
||||
'spieler_updated' => $spieler_updated,
|
||||
'spieler_added' => $spieler_added,
|
||||
'deactivated' => $deactivated_total,
|
||||
'warnings' => $warnings
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Endpoint task: triggered by GitHub Actions or other schedule.
|
||||
* Authenticates with local api_push_key, exports player data, pushes to DTFB, and returns JSON.
|
||||
*/
|
||||
function apiSyncSpielerTrigger(): void
|
||||
{
|
||||
$token = syncGetBearerToken();
|
||||
$expected_key = einstellungswert("api_push_key");
|
||||
|
||||
if (empty($expected_key) || $token !== $expected_key) {
|
||||
header('HTTP/1.1 401 Unauthorized');
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
echo json_encode(['success' => false, 'error' => 'Ungültiges Authentifizierungs-Token.']);
|
||||
exit;
|
||||
}
|
||||
|
||||
$csvData = syncExportSpielerCSV();
|
||||
if (empty($csvData)) {
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
echo json_encode(['success' => false, 'error' => 'Keine Spieler zum Synchronisieren gefunden.']);
|
||||
exit;
|
||||
}
|
||||
|
||||
$res = syncPushToDtfb($csvData);
|
||||
|
||||
// Log sync status
|
||||
syncLogEntry(
|
||||
'push',
|
||||
'api',
|
||||
$res['success'] ? 'success' : 'error',
|
||||
$res['spieler_count'] ?? 0,
|
||||
$res['spieler_updated'] ?? 0,
|
||||
$res['spieler_added'] ?? 0,
|
||||
$res['message'] ?? '',
|
||||
''
|
||||
);
|
||||
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
if ($res['success']) {
|
||||
echo json_encode($res);
|
||||
} else {
|
||||
header('HTTP/1.1 500 Internal Server Error');
|
||||
echo json_encode($res);
|
||||
}
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Endpoint task: receives CSV data from another Sportsmanager instance, imports it.
|
||||
* Authenticates with local api_push_key.
|
||||
*/
|
||||
function apiSyncSpielerReceive(): void
|
||||
{
|
||||
$token = syncGetBearerToken();
|
||||
$expected_key = einstellungswert("api_push_key");
|
||||
|
||||
if (empty($expected_key) || $token !== $expected_key) {
|
||||
header('HTTP/1.1 401 Unauthorized');
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
echo json_encode(['success' => false, 'error' => 'Ungültiges Authentifizierungs-Token.']);
|
||||
exit;
|
||||
}
|
||||
|
||||
$csvData = file_get_contents('php://input');
|
||||
if (empty($csvData)) {
|
||||
header('HTTP/1.1 400 Bad Request');
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
echo json_encode(['success' => false, 'error' => 'Keine Formulardaten empfangen.']);
|
||||
exit;
|
||||
}
|
||||
|
||||
$res = syncReceiveSpielerImport($csvData);
|
||||
|
||||
// Log sync status
|
||||
syncLogEntry(
|
||||
'receive',
|
||||
'api',
|
||||
$res['success'] ? 'success' : 'error',
|
||||
$res['spieler_count'] ?? 0,
|
||||
$res['spieler_updated'] ?? 0,
|
||||
$res['spieler_added'] ?? 0,
|
||||
$res['message'] ?? '',
|
||||
''
|
||||
);
|
||||
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
if ($res['success']) {
|
||||
echo json_encode($res);
|
||||
} else {
|
||||
header('HTTP/1.1 500 Internal Server Error');
|
||||
echo json_encode($res);
|
||||
}
|
||||
exit;
|
||||
}
|
||||
@@ -10,7 +10,6 @@ use Joomla\CMS\Factory;
|
||||
use Joomla\CMS\Log\Log;
|
||||
use Joomla\CMS\Router\Route;
|
||||
use Joomla\CMS\Uri\Uri;
|
||||
use Joomla\CMS\User\User;
|
||||
use Joomla\CMS\Version;
|
||||
|
||||
defined('_JEXEC') or die('Restricted access');
|
||||
@@ -186,23 +185,51 @@ function individualwettbewerbFilter($prefix): string
|
||||
function kategorieFilter($prefix, $suffix = ""): string
|
||||
{
|
||||
global $params;
|
||||
|
||||
$kategorien = explode(",", $params->get('kategorien'));
|
||||
$filter = "";
|
||||
foreach ($kategorien as $s) {
|
||||
$kategorie = intval(trim($s));
|
||||
if ($kategorie == 0)
|
||||
continue;
|
||||
if (!empty($filter))
|
||||
$filter .= ", ";
|
||||
$filter .= $kategorie;
|
||||
$result = [];
|
||||
|
||||
foreach ($kategorien as $item) {
|
||||
$item = trim($item);
|
||||
if ($item === '') continue;
|
||||
|
||||
// Prüfen, ob es ein Bereich ist
|
||||
if (strpos($item, '-') !== false) {
|
||||
$rangeParts = explode('-', $item);
|
||||
|
||||
// genau 2 Teile für einen gültigen Bereich
|
||||
if (count($rangeParts) !== 2) continue;
|
||||
|
||||
$start = intval(trim($rangeParts[0]));
|
||||
$end = intval(trim($rangeParts[1]));
|
||||
|
||||
if ($start <= 0 || $end <= 0 || $start > $end) continue;
|
||||
|
||||
for ($i = $start; $i <= $end; $i++) {
|
||||
$result[$i] = true; // Duplikate vermeiden
|
||||
}
|
||||
} else {
|
||||
$num = intval($item);
|
||||
if ($num > 0) {
|
||||
$result[$num] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return empty($filter) ? "" : (" " . $prefix . " (" . $filter . ") " . $suffix);
|
||||
|
||||
if (empty($result)) {
|
||||
return "";
|
||||
}
|
||||
|
||||
$filter = array_keys($result);
|
||||
sort($filter, SORT_NUMERIC);
|
||||
|
||||
return " $prefix (" . implode(", ", $filter) . ") $suffix";
|
||||
}
|
||||
|
||||
function turnierFilter($prefix): string
|
||||
{
|
||||
$user_id = isExternalDatabase() ? 0 : Factory::getContainer()->get(SiteApplication::class)->getIdentity()->id;
|
||||
return " " . $prefix . " (SELECT berechtigt_turnier_id FROM #__sportsmanager_berechtigt_fuer_turnier WHERE berechtigt_user_id = $user_id AND DATEDIFF(letzter_tag, NOW()) >= -14) ";
|
||||
return " " . $prefix . " (SELECT berechtigt_turnier_id FROM #__sportsmanager_berechtigt_fuer_turnier WHERE berechtigt_user_id = $user_id AND DATEDIFF(letzter_tag, NOW()) >= -21) ";
|
||||
}
|
||||
|
||||
function vereinFilter($prefix): string
|
||||
@@ -220,7 +247,7 @@ function veranstalterFilter($prefix): string
|
||||
function veranstaltungFilter($prefix): string
|
||||
{
|
||||
$user_id = isExternalDatabase() ? 0 : Factory::getContainer()->get(SiteApplication::class)->getIdentity()->id;
|
||||
return " " . $prefix . " (SELECT berechtigt_veranstaltung_id FROM #__sportsmanager_berechtigt_fuer_veranstaltung INNER JOIN #__sportsmanager_veranstaltung ON veranstaltung_id = berechtigt_veranstaltung_id WHERE berechtigt_user_id = $user_id AND DATEDIFF(letzter_tag, NOW()) >= -14) ";
|
||||
return " " . $prefix . " (SELECT berechtigt_veranstaltung_id FROM #__sportsmanager_berechtigt_fuer_veranstaltung INNER JOIN #__sportsmanager_veranstaltung ON veranstaltung_id = berechtigt_veranstaltung_id WHERE berechtigt_user_id = $user_id AND DATEDIFF(letzter_tag, NOW()) >= -21) ";
|
||||
}
|
||||
|
||||
// Berechnet Datum zum Montag der ersten Kalenderwoche eines Jahres
|
||||
|
||||
@@ -0,0 +1,125 @@
|
||||
<?php
|
||||
|
||||
use Joomla\CMS\Factory;
|
||||
use Joomla\CMS\Log\Log;
|
||||
use Joomla\CMS\Mail\MailerFactoryInterface;
|
||||
use Joomla\CMS\Application\SiteApplication;
|
||||
|
||||
/**
|
||||
* @since 2.2
|
||||
* @throws Exception
|
||||
*/
|
||||
function sentEmailReminders(): void
|
||||
{
|
||||
$app = Factory::getContainer()->get(SiteApplication::class);
|
||||
$db = getDatabase();
|
||||
|
||||
$query = $db->getQuery(true)
|
||||
->select('wert')
|
||||
->from('#__sportsmanager_einstellungen')
|
||||
->where('name = ' . $db->quote('enable_email_reminders'));
|
||||
$row = loadResult($db, $query);
|
||||
|
||||
if (!$row) {
|
||||
return; // quit when email reminders are disabled
|
||||
}
|
||||
|
||||
$query = $db->getQuery(true)
|
||||
->select('tournament.turnier_id, tournament.turnierbezeichnung, tournament.letzter_tag, tournament.reminder_count, GROUP_CONCAT(user.email SEPARATOR ", ") as emails')
|
||||
->from($db->quoteName('#__sportsmanager_turnier', 'tournament'))
|
||||
->join('INNER', $db->quoteName('#__sportsmanager_berechtigt_fuer_turnier', 'entitled') . ' ON tournament.turnier_id = entitled.berechtigt_turnier_id')
|
||||
->join('INNER', $db->quoteName('#__users', 'user') . ' ON entitled.berechtigt_user_id = user.id')
|
||||
->where('tournament.reminder_count < 3')
|
||||
->group('tournament.turnier_id, tournament.turnierbezeichnung');
|
||||
$rows = loadObjectList($db, $query);
|
||||
|
||||
if(!empty($rows)) {
|
||||
$mailFrom = $app->getCfg('mailfrom');
|
||||
$fromName = $app->getCfg('fromname');
|
||||
|
||||
$mailer = Factory::getContainer()->get(MailerFactoryInterface::class)->createMailer();
|
||||
$mailer->setSender($mailFrom, $fromName);
|
||||
foreach ($rows as $row) {
|
||||
$currentReminder = $row->reminder_count + 1;
|
||||
|
||||
if (hasResultsAlready($db, $row)) {
|
||||
updateDBReminders($db, $row, 3); // do not sent any more reminders
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!isset($row->emails) || $row->emails == "" || $row->emails == NULL) {
|
||||
Log::add('can\'t sent ' . $currentReminder .'. email reminder for tournament ' . $row->turnierbezeichnung . ': no recipient set', Log::WARNING, 'com_sportsmanager');
|
||||
continue;
|
||||
}
|
||||
|
||||
$now = new DateTime();
|
||||
$last_day = new DateTime($row->letzter_tag);
|
||||
$last_day->modify('+1 day'); // start to count at the end of the day, not at the beginning
|
||||
$diff = $now->getTimestamp() - $last_day->getTimestamp();
|
||||
|
||||
$reminderDelays = [
|
||||
1 => 24*60*60, // 24h
|
||||
2 => 3*24*60*60, // 3d
|
||||
3 => 13*24*60*60 // 13d
|
||||
];
|
||||
|
||||
foreach ($reminderDelays as $count => $delay) {
|
||||
if ($diff >= $delay && $row->reminder_count < $count) {
|
||||
$subject = ($row->reminder_count == 2 ? "Letzte " : "") . "Erinnerung: " . $row->turnierbezeichnung . " Ergebnisse einreichen!";
|
||||
$body = "Hi,"
|
||||
. "\n\nDies ist die " . $currentReminder . ". " . ($row->reminder_count == 2 ? "*und damit letzte* " : "") . "Erinnerung die Turnierergebnisse einzureichen."
|
||||
. "\n\nTurnier: " . $row->turnierbezeichnung
|
||||
. "\nTurnierende: " . FormatiertesDatum($row->letzter_tag, false, false)
|
||||
. "\n\nLaut Turnierordnung müssen die Ergebnisse spätestens 24 Stunden nach Turnierende eingetragen werden. Bitte reich die Ergebnisse umgehend nach."
|
||||
. "\n\nDu erhältst diese Mail, weil du als Berechtigter für das Turnier eingetragen wurdest. Falls du nicht der Veranstalter bist, leite diese Email bitte entsprechend weiter."
|
||||
. "\n\nHochladen der Ergebnisse über " . SportsManagerURL('&task=admin_turnierdisziplinen&turnierid=' . $row->turnier_id, -1) . ".";
|
||||
|
||||
$mailer->setSubject($subject);
|
||||
$mailer->setBody($body);
|
||||
|
||||
$emailArray = explode(", ", $row->emails);
|
||||
foreach ($emailArray as $email) {
|
||||
$mailer->addBcc($email);
|
||||
}
|
||||
$mailer->send();
|
||||
|
||||
updateDBReminders($db, $currentReminder, $row->turnier_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function updateDBReminders($db, $reminder, $tournamentId): void
|
||||
{
|
||||
$query = $db->getQuery(true)
|
||||
->update($db->quoteName('#__sportsmanager_turnier'))
|
||||
->set($db->quoteName('reminder_count') . ' = ' . $db->quote($reminder))
|
||||
->where($db->quoteName('turnier_id') . ' = ' . $db->quote($tournamentId));
|
||||
|
||||
$db->setQuery($query);
|
||||
$db->execute();
|
||||
}
|
||||
|
||||
/**
|
||||
* checks if a tournament has at least one result entry for a discipline
|
||||
* @param $db
|
||||
* @param $row mixed tournament entry
|
||||
* @return bool true if at least one result is given, else false
|
||||
* @since 2.2
|
||||
*/
|
||||
function hasResultsAlready($db, mixed $row): bool
|
||||
{
|
||||
$subQuery = $db->getQuery(true)
|
||||
->select($db->quoteName('turnierdisziplin_id'))
|
||||
->from($db->quoteName('#__sportsmanager_turnierdisziplin'))
|
||||
->where($db->quoteName('turnier_id') . ' = ' . $db->quote($row->turnier_id));
|
||||
|
||||
$query = $db->getQuery(true)
|
||||
->select('COUNT(*) AS count')
|
||||
->from($db->quoteName('#__sportsmanager_turniermeldung', 'tm'))
|
||||
->where($db->quoteName('tm.turnierdisziplin_id') . ' IN (' . $subQuery . ')');
|
||||
|
||||
$result = loadResult($db, $query);
|
||||
return $result && $result[0]->count > 0;
|
||||
}
|
||||
@@ -7,6 +7,8 @@ use Joomla\CMS\Uri\Uri;
|
||||
use Joomla\Filesystem\File;
|
||||
use Joomla\Filesystem\Folder;
|
||||
|
||||
require_once JPATH_SITE . '/components/com_sportsmanager/database/util.php';
|
||||
|
||||
const SPORTSMANAGER_JOOMLA_PATH = JPATH_ROOT;
|
||||
define("SPORTSMANAGER_JOOMLA_URL", Uri::base());
|
||||
|
||||
@@ -241,11 +243,7 @@ function playerImage($playerId, $gender, $width = 180, $height = 240): ?string
|
||||
. "\n FROM #__sportsmanager_spieler"
|
||||
. "\n WHERE NOT ISNULL(aktueller_verein_id) AND NOT bild_ausblenden" . (!empty($spielernr) ? " AND spielernr = '$spielernr'" : " AND lizenznr = '$lizenznr'")
|
||||
. "\n ORDER BY spieler_id DESC";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
$rows = $db->loadObjectList();
|
||||
$rows = loadObjectList($db, $query);
|
||||
if (count($rows) < 1) {
|
||||
ob_end_clean(); // Wegen UTF-8-Zeichen, die in der ausgabe vorhanden sind
|
||||
header('HTTP/1.1 404 Not Found');
|
||||
@@ -358,7 +356,7 @@ function bildURL($typ, $id, $fixed_width = 0, $fixed_height = 0, $max_width = 0,
|
||||
#crop=250,250,left
|
||||
#crop=250,250,right
|
||||
*/
|
||||
function yoothemeBild($typ, $id, $alternativ, $resize = '', $zusatz = ""): ?string
|
||||
function yoothemeBild($typ, $id, $alternativ, $zusatz = ""): ?string
|
||||
{
|
||||
$typ_exploded = explode("/", $typ);
|
||||
$typ = $typ_exploded[0];
|
||||
@@ -382,9 +380,9 @@ function yoothemeBild($typ, $id, $alternativ, $resize = '', $zusatz = ""): ?stri
|
||||
else
|
||||
return null;
|
||||
|
||||
$bildpfad = "/images/sportsmanager/" . $typ . "/" . $typ_prefix . $id . "." . $ext;
|
||||
$bildpfad = SPORTSMANAGER_JOOMLA_URL . "images/sportsmanager/" . $typ . "/" . $typ_prefix . $id . "." . $ext;
|
||||
|
||||
return '<img class="el-image" data-src="' . $bildpfad . $resize . '" ' . $zusatz . ' uk-img />';
|
||||
return '<img class="el-image" data-src="' . $bildpfad . '" ' . $zusatz . ' uk-img />';
|
||||
}
|
||||
|
||||
function bildHTML($typ, $id, $fixed_width = 0, $fixed_height = 0, $max_width = 0, $max_height = 0, $zusatz = "", $alternativ = ""): ?string
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
<?php // do not change this file, this is automatically updated while building releases, see .github/workflows/build_release.yml
|
||||
defined('_JEXEC') or die;
|
||||
return [
|
||||
'version' => 'DEV',
|
||||
'date' => '2025-08-05',
|
||||
];
|
||||
@@ -24,6 +24,9 @@
|
||||
<option value="vereine"><![CDATA[COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_CLUBS]]></option>
|
||||
<option value="spielorte"><![CDATA[COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_VENUES]]></option>
|
||||
<option value="termine"><![CDATA[COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_APPOINTMENTS]]></option>
|
||||
<option value="spielverlegungen"><![CDATA[COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_MATCH_RESCHEDULING]]></option>
|
||||
<option value="verbandsorgane"><![CDATA[COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_ASSOCIATION_BODIES]]></option>
|
||||
<option value="hall_of_fame"><![CDATA[COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_HALL_OF_FAME]]></option>
|
||||
</field>
|
||||
<field name="titel"
|
||||
type="text"
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -197,6 +197,7 @@ class JSON_sportsmanager
|
||||
|
||||
#[NoReturn] static function spielerDetails($spieler, $vereine, $veranstalter, $spieler_elo_verlauf_einzel, $spieler_elo_verlauf_doppel, $spielerNamen, $teamNamen, $veranstaltungBezeichnungen, $turnierdisziplinBezeichnungen, $individualwettbewerbBezeichnungen, $ranglistenplatzierungen, $turnierplatzierungen, $teams, $elo_detailliert, $statistik, $einstufungen): void
|
||||
{
|
||||
if (count($vereine) == 0){die;}
|
||||
$letzte_einzel = [];
|
||||
$spieler->bild = playerImage($spieler->spieler_id, $spieler->geschlecht);
|
||||
for ($i = sizeof($spieler_elo_verlauf_einzel) - 1; $i >= max(sizeof($spieler_elo_verlauf_einzel) - 10, 0); $i--) {
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -40,8 +40,11 @@ class HTML_sportsmanager_ticker
|
||||
continue;
|
||||
else
|
||||
$status = 'upcoming';
|
||||
$spieltag = Rundenbezeichnung($begegnung->spieltag, $begegnung->unterteilung == 0, false, true);
|
||||
$gewinner = $begegnung->heim_spielpunkte > $begegnung->gast_spielpunkte ? 1 : ($begegnung->heim_spielpunkte < $begegnung->gast_spielpunkte ? 2 : 0);
|
||||
if ($begegnung->spieltag_titel)
|
||||
$spieltag = $begegnung->spieltag_titel;
|
||||
else
|
||||
$spieltag = Rundenbezeichnung($begegnung->spieltag, $begegnung->unterteilung == 0, false, true);
|
||||
$gewinner = $begegnung->heim_spielpunkte > $begegnung->gast_spielpunkte ? 1 : ($begegnung->heim_spielpunkte < $begegnung->gast_spielpunkte ? 2 : 0);
|
||||
$heim_name = $begegnung->heim_name;
|
||||
$gast_name = $begegnung->gast_name;
|
||||
$heim_spielpunkte = $begegnung->heim_spielpunkte;
|
||||
@@ -291,8 +294,6 @@ class HTML_sportsmanager_ticker
|
||||
type="text/css"/>
|
||||
<script src="<?php echo Route::_(Uri::root(TRUE) . '/components/com_sportsmanager/js/jquery.min.js'); ?>"
|
||||
type="text/javascript"></script>
|
||||
<script type="text/javascript"
|
||||
src="<?php echo Route::_(Uri::root(TRUE) . '/components/com_sportsmanager/js/css3.js'); ?>"></script>
|
||||
<script>
|
||||
let globalresize = 0;
|
||||
|
||||
@@ -410,6 +411,51 @@ class HTML_sportsmanager_ticker
|
||||
moreResults(matches, groups, day, page, 0);
|
||||
});
|
||||
</script>
|
||||
<style>
|
||||
#theme-toggle {
|
||||
float: right;
|
||||
margin-top: 15px;
|
||||
margin-right: 20px;
|
||||
}
|
||||
.theme-btn {
|
||||
cursor: pointer;
|
||||
margin-left: 10px;
|
||||
font-size: 18px;
|
||||
opacity: 0.5;
|
||||
transition: opacity 0.2s;
|
||||
}
|
||||
.theme-btn:hover, .theme-btn.active {
|
||||
opacity: 1;
|
||||
}
|
||||
</style>
|
||||
<script>
|
||||
function applyTheme(theme) {
|
||||
if (theme === 'dark' || (theme === 'auto' && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
|
||||
document.body.classList.add('dark-mode');
|
||||
} else {
|
||||
document.body.classList.remove('dark-mode');
|
||||
}
|
||||
if (document.getElementById('theme-' + theme)) {
|
||||
document.querySelectorAll('.theme-btn').forEach(function(btn) { btn.classList.remove('active'); });
|
||||
document.getElementById('theme-' + theme).classList.add('active');
|
||||
}
|
||||
}
|
||||
var savedTheme = localStorage.getItem('livescore-theme') || 'auto';
|
||||
|
||||
function setTheme(theme) {
|
||||
localStorage.setItem('livescore-theme', theme);
|
||||
applyTheme(theme);
|
||||
}
|
||||
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', function(e) {
|
||||
if (localStorage.getItem('livescore-theme') === 'auto' || !localStorage.getItem('livescore-theme')) {
|
||||
applyTheme('auto');
|
||||
}
|
||||
});
|
||||
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
applyTheme(localStorage.getItem('livescore-theme') || 'auto');
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<body onResize="resizee()">
|
||||
@@ -432,6 +478,11 @@ class HTML_sportsmanager_ticker
|
||||
<div id="left_page_header">
|
||||
<h1 id="pagetitle_text">LIVE-TICKER</h1>
|
||||
</div>
|
||||
<div id="theme-toggle">
|
||||
<span id="theme-auto" class="theme-btn" onclick="setTheme('auto')" title="Auto Theme">💻</span>
|
||||
<span id="theme-light" class="theme-btn" onclick="setTheme('light')" title="Light Theme">☀️</span>
|
||||
<span id="theme-dark" class="theme-btn" onclick="setTheme('dark')" title="Dark Theme">🌙</span>
|
||||
</div>
|
||||
<a href="<?php echo SportsManagerURL(); ?>" id="homeicon">Home</a>
|
||||
<div style="clear:both;"></div>
|
||||
<div id="left_menu">
|
||||
@@ -1837,6 +1888,99 @@ class HTML_sportsmanager_ticker
|
||||
height: 39px;
|
||||
}
|
||||
}
|
||||
|
||||
body.dark-mode {
|
||||
background: #121212;
|
||||
}
|
||||
body.dark-mode #right_page {
|
||||
background: #1e1e1e;
|
||||
}
|
||||
body.dark-mode h1#pagetitle_text {
|
||||
color: #ffffff;
|
||||
}
|
||||
body.dark-mode a#homeicon {
|
||||
color: #cccccc;
|
||||
}
|
||||
body.dark-mode #left_menu ul li a {
|
||||
color: #ffffff;
|
||||
}
|
||||
body.dark-mode #tbl th {
|
||||
color: #eeeeee;
|
||||
background-color: #333333;
|
||||
}
|
||||
body.dark-mode #tbl tr td {
|
||||
color: #dddddd;
|
||||
}
|
||||
body.dark-mode #detailedresults #tbl tr.odd td {
|
||||
background-color: #242424;
|
||||
}
|
||||
body.dark-mode #detailedresults #tbl tr.even td {
|
||||
background-color: #2a2a2a;
|
||||
}
|
||||
body.dark-mode #tbl tr.tablehead td {
|
||||
background-color: #333333;
|
||||
}
|
||||
body.dark-mode tr.finished.odd {
|
||||
background-color: #2a2a2a;
|
||||
}
|
||||
body.dark-mode tr.finished.even {
|
||||
background-color: #2e2e2e;
|
||||
}
|
||||
body.dark-mode tr.updated {
|
||||
background-color: #2d2616;
|
||||
}
|
||||
body.dark-mode tr.livenow {
|
||||
background-color: #173824;
|
||||
}
|
||||
body.dark-mode tr.upcoming.odd {
|
||||
background-color: #1a222f;
|
||||
}
|
||||
body.dark-mode tr.upcoming.even {
|
||||
background-color: #1e2a3b;
|
||||
}
|
||||
body.dark-mode #tbl tr td.finished_winner {
|
||||
color: #ffffff;
|
||||
}
|
||||
body.dark-mode tr.last_row {
|
||||
background-color: #333333;
|
||||
}
|
||||
body.dark-mode #tbl tr td#last_row {
|
||||
background-color: #333333;
|
||||
}
|
||||
body.dark-mode tr.upcoming.odd #resultat_holder,
|
||||
body.dark-mode tr.upcoming.even #resultat_holder {
|
||||
color: #eeeeee;
|
||||
}
|
||||
body.dark-mode #sponsorz {
|
||||
background: #333333;
|
||||
}
|
||||
body.dark-mode .grey_button {
|
||||
background: #333333;
|
||||
}
|
||||
body.dark-mode .grey_button a {
|
||||
color: #eeeeee;
|
||||
}
|
||||
body.dark-mode .place_final {
|
||||
color: #ffffff;
|
||||
}
|
||||
body.dark-mode .field_score {
|
||||
color: #ffffff;
|
||||
}
|
||||
body.dark-mode .field_team {
|
||||
color: #dddddd;
|
||||
}
|
||||
body.dark-mode .field_team.winner_bold {
|
||||
color: #ffffff;
|
||||
}
|
||||
body.dark-mode #winner_area_positions span {
|
||||
color: #dddddd;
|
||||
}
|
||||
body.dark-mode #winner_area_positions span#winner {
|
||||
color: #ffffff;
|
||||
}
|
||||
body.dark-mode #winner_area_positions span#winner_name {
|
||||
color: #ffffff;
|
||||
}
|
||||
<?php
|
||||
}
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ function addOnLoad($function): void
|
||||
<?php
|
||||
}
|
||||
|
||||
function SportsManagerURL($weitereParameter = null, $ssl = 0): ?string
|
||||
function SportsManagerURL($weitereParameter = "", $ssl = 0): ?string
|
||||
{
|
||||
$urlPath = handleFilter($weitereParameter);
|
||||
$joomlaBaseUrl = Uri::getInstance()->toString([
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
; Sports Manager (C) 2006-2020, Sven Nickel (Test)
|
||||
; Sports Manager (C) 2006-2020, Sven Nickel (Test)
|
||||
COM_SPORTSMANAGER="Sports Manager"
|
||||
COM_SPORTSMANAGER_PLAYERS="Spieler"
|
||||
COM_SPORTSMANAGER_CLUBS="Vereine"
|
||||
@@ -21,6 +21,7 @@ COM_SPORTSMANAGER_LOCATIONS="Spielorte"
|
||||
COM_SPORTSMANAGER_SEASONS="Saisons"
|
||||
COM_SPORTSMANAGER_TEAM_PLANS="Mannschaftsspielpläne"
|
||||
COM_SPORTSMANAGER_TEAM_NAME="Mannschaftsname"
|
||||
COM_SPORTSMANAGER_TEAM_NAME_SHORT="Mannschaftsname kurz (max 24)"
|
||||
COM_SPORTSMANAGER_TEAM_NAME2="Vereinsname"
|
||||
COM_SPORTSMANAGER_TEAM_SEAT="Vereinssitz"
|
||||
COM_SPORTSMANAGER_POSTPONE_RULES="Verschieberegeln"
|
||||
@@ -38,6 +39,8 @@ COM_SPORTSMANAGER_ORGANISATION="Organisation"
|
||||
COM_SPORTSMANAGER_TEAM_MEMBERS="Mannschaftsmitglieder"
|
||||
COM_SPORTSMANAGER_TEAM_MEMBERS2=Vereinsmitglieder
|
||||
COM_SPORTSMANAGER_MEMBERS="Mitglieder"
|
||||
COM_SPORTSMANAGER_MEMBER="Mitglied"
|
||||
COM_SPORTSMANAGER_ACTIVE_MEMBERS="Aktive Mitglieder"
|
||||
COM_SPORTSMANAGER_TEAMS="Mannschaften"
|
||||
COM_SPORTSMANAGER_CURRENT_TEAMS="Aktuelle Mannschaften"
|
||||
COM_SPORTSMANAGER_PREVIOUS_TEAMS="Frühere Mannschaften"
|
||||
@@ -129,10 +132,13 @@ COM_SPORTSMANAGER_QUARTER_FINAL_SHORTCUT="1/4"
|
||||
COM_SPORTSMANAGER_ROUND_OF_16="Achtelfinale"
|
||||
COM_SPORTSMANAGER_ROUND_OF_16_SHORTCUT="1/8"
|
||||
COM_SPORTSMANAGER_ROUND_OF_32="Sechzehntelfinale"
|
||||
COM_SPORTSMANAGER_ROUND_OF_32_ALT="16-tel-Finale"
|
||||
COM_SPORTSMANAGER_ROUND_OF_32_SHORTCUT="1/16"
|
||||
COM_SPORTSMANAGER_ROUND_OF_64="Zweiunddreißigstelfinale"
|
||||
COM_SPORTSMANAGER_ROUND_OF_64_ALT="32-tel-Finale"
|
||||
COM_SPORTSMANAGER_ROUND_OF_64_SHORTCUT="1/32"
|
||||
COM_SPORTSMANAGER_ROUND_OF_128="Vierundsechzigstelfinale"
|
||||
COM_SPORTSMANAGER_ROUND_OF_128_ALT="64-tel-Finale"
|
||||
COM_SPORTSMANAGER_ROUND_OF_128_SHORTCUT="1/64"
|
||||
COM_SPORTSMANAGER_DAY_0_SHORTCUT="So."
|
||||
COM_SPORTSMANAGER_DAY_1_SHORTCUT="Mo."
|
||||
@@ -151,6 +157,7 @@ COM_SPORTSMANAGER_DEFEAT="Niederlage"
|
||||
COM_SPORTSMANAGER_DEFEATS="Niederlagen"
|
||||
COM_SPORTSMANAGER_DEFEATS_SHORTCUT="N"
|
||||
COM_SPORTSMANAGER_GOALS="Tore"
|
||||
COM_SPORTSMANAGER_GOALS_SHORTCUT="T"
|
||||
COM_SPORTSMANAGER_SETS="Sätze"
|
||||
COM_SPORTSMANAGER_POINT="Punkt"
|
||||
COM_SPORTSMANAGER_POINTS="Punkte"
|
||||
@@ -163,9 +170,9 @@ COM_SPORTSMANAGER_GAME_POINTS="Spielpunkte"
|
||||
COM_SPORTSMANAGER_GAME_POINTS_SHORTCUT="SP"
|
||||
COM_SPORTSMANAGER_SUFFIX_ONE_TEAM=" (eine Mannschaft)"
|
||||
COM_SPORTSMANAGER_SUFFIX_TEAMS_TOGETHER=" (Mannschaften zusammen)"
|
||||
COM_SPORTSMANAGER_DIFFERENCE="Differenz"
|
||||
COM_SPORTSMANAGER_DIFFERENCE_IN_POINTS="Punktedifferenz"
|
||||
COM_SPORTSMANAGER_POINTS_RATIO="Punkteverhältnis"
|
||||
COM_SPORTSMANAGER_DIFFERENCE="Differenz Tore"
|
||||
COM_SPORTSMANAGER_DIFFERENCE_IN_POINTS="Differenz Spielpunkte"
|
||||
COM_SPORTSMANAGER_POINTS_RATIO="Verhältnis Spielpunkte"
|
||||
COM_SPORTSMANAGER_SCHEDULE_DATE="Zeitpunkt"
|
||||
COM_SPORTSMANAGER_TEAM_HOME="Heim"
|
||||
COM_SPORTSMANAGER_TEAM_VISITOR="Gast"
|
||||
@@ -259,6 +266,7 @@ COM_SPORTSMANAGER_IN="in"
|
||||
COM_SPORTSMANAGER_NATIONAL="Nationale"
|
||||
COM_SPORTSMANAGER_INTERNATIONAL="Internationale"
|
||||
COM_SPORTSMANAGER_PLAYER_NUMBER_SHORT="Spielernr."
|
||||
COM_SPORTSMANAGER_ASSOCIATION_SHORT_NAME="Verbands-Kürzel"
|
||||
COM_SPORTSMANAGER_BASIC_PLAYER_NUMBER_SHORT="Basis-Spielernr."
|
||||
COM_SPORTSMANAGER_MESSAGES="Meldungen"
|
||||
COM_SPORTSMANAGER_TOURNAMENT_PLACEMENT="Turnierplatzierungen"
|
||||
@@ -289,10 +297,9 @@ COM_SPORTSMANAGER_REQUEST_MESSAGE_PLURAL="Es müssen mindestens %d Termine v
|
||||
COM_SPORTSMANAGER_REJECT_SHIFT="Verschiebung ablehnen"
|
||||
COM_SPORTSMANAGER_TO="bis"
|
||||
COM_SPORTSMANAGER_PLAYER_STATISTICS="Spielerstatistiken"
|
||||
COM_SPORTSMANAGER_PERFORMANCE_INDEX_SHORTCUT="LI"
|
||||
COM_SPORTSMANAGER_WON="gewonnen"
|
||||
COM_SPORTSMANAGER_LOST="verloren"
|
||||
COM_SPORTSMANAGER_RATE="Quote"
|
||||
COM_SPORTSMANAGER_RATE="Siegquote"
|
||||
COM_SPORTSMANAGER_RATE_SHORTCUT="Q"
|
||||
COM_SPORTSMANAGER_NO_CLUB="Kein Verein"
|
||||
COM_SPORTSMANAGER_RATING="Wertung"
|
||||
@@ -310,6 +317,11 @@ COM_SPORTSMANAGER_FOR_OTHER_CONTACT="Für andere Ansprechpartner"
|
||||
COM_SPORTSMANAGER_DATES_REGISTERED_USERS="Termine beantragten durch angemeldete Benutzer"
|
||||
COM_SPORTSMANAGER_VIEW_ELO_RATING="Elo-Wertung anzeigen"
|
||||
COM_SPORTSMANAGER_VIEW_SPORTSMANAGER_LIZENZ="Lizenz anzeigen"
|
||||
COM_SPORTSMANAGER_VIEW_LEAST_MEMBER_COUNT="Mindest Mitgliederzahl zeigen (Vereine)"
|
||||
COM_SPORTSMANAGER_SHOW_ORGANISATION="Spalte Verband zeigen (Vereine)"
|
||||
COM_SPORTSMANAGER_SHOW_MEMBER_COUNT="Spalte Mitglieder Zeigen (Vereine)"
|
||||
COM_SPORTSMANAGER_SHOW_TOURNAMENT_BRACKET="Turnierbaum anzeigen"
|
||||
COM_SPORTSMANAGER_USE_DISCIPLINARY_FINE="Ordnungsstrafen verwenden"
|
||||
COM_SPORTSMANAGER_PLAYER_DETAILS="Spielerdetails"
|
||||
COM_SPORTSMANAGER_PLAYER_LIST_DETAILS="Spielerliste/-details"
|
||||
COM_SPORTSMANAGER_PLAYER_EDIT="Spielerdaten durch Organisations-/Vereinsansprechpartner bearbeiten"
|
||||
@@ -352,6 +364,7 @@ COM_SPORTSMANAGER_STATISTIK="Statistik"
|
||||
COM_SPORTSMANAGER_PLAYERS_ACTIVE="Spieler aktiv"
|
||||
COM_SPORTSMANAGER_RESTRICTED_PLAYERS="Spieler eingeschränkt"
|
||||
COM_SPORTSMANAGER_PLAYER_PASSIV="Spieler passiv"
|
||||
COM_SPORTSMANAGER_PLAYER_UNATTACHED="Spieler vereinslos"
|
||||
COM_SPORTSMANAGER_MEN_ACTIVE="Herren aktiv"
|
||||
COM_SPORTSMANAGER_WOMEN_ACTIVE="Damen aktiv"
|
||||
COM_SPORTSMANAGER_JUNIOR_ACTIVE="Junioren aktiv"
|
||||
@@ -379,6 +392,7 @@ COM_SPORTSMANAGER_MEMBER_STATUS="Mitgliedsstatus"
|
||||
COM_SPORTSMANAGER_ACTIVE="Aktiv"
|
||||
COM_SPORTSMANAGER_RESTRICTED="Eingeschränkt"
|
||||
COM_SPORTSMANAGER_BEATEN="Ausgetreten"
|
||||
COM_SPORTSMANAGER_HIDE="Verstecken"
|
||||
COM_SPORTSMANAGER_PASSIVE="Passiv"
|
||||
COM_SPORTSMANAGER_BEATEN_CLUB="Verein ausgetreten"
|
||||
COM_SPORTSMANAGER_SINGLE_SEED="Elo-Startwert Einzel"
|
||||
@@ -401,10 +415,11 @@ COM_SPORTSMANAGER_EXPORT="Exportieren"
|
||||
COM_SPORTSMANAGER_INTERNATIONAL_PLAYERS="Spieler (international)"
|
||||
COM_SPORTSMANAGER_COUNTRY_CODE="Landeskennung"
|
||||
COM_SPORTSMANAGER_IMPORT="Importieren"
|
||||
COM_SPORTSMANAGER_IMPORT_MESSAGE="Im Import sind ausschließlich Spielerdaten zum Verein %s enthalten. Soll ausschließlich der Spielerbestand des einen Vereins aktualisiert werden, muss der zugehörige Verein unten ausgewählt werden. Beinhaltet der Import den gesamten Spielerbestand einer Organisation, muss die zugehörige Organisation gewählt werden."
|
||||
COM_SPORTSMANAGER_IMPORT_MESSAGE="Im Import sind ausschließlich Spielerdaten zum Verein %s enthalten. Soll ausschließlich der Spielerbestand des einen Vereins aktualisiert werden, muss der zugehörige Verein unten ausgewählt werden. Beinhaltet der Import den gesamten Spielerbestand einer Organisation, muss die zugehörige Organisation gewählt werden.<br />Bei schon vorhandener Lizenznummer wird die Lizenznummer und das Geburtsjahr nicht überschrieben!"
|
||||
COM_SPORTSMANAGER_CHECK="Prüfen"
|
||||
COM_SPORTSMANAGER_IMPORT_CONFLICTS_MESSAGE="Im Import sind Konflikte enthalten, die im Vorfeld manuell beseitigt werden müssen."
|
||||
COM_SPORTSMANAGER_IMPORT_CONFLICTS_MESSAGE="Im Import sind Fehler oder Konflikte enthalten, die im Vorfeld manuell beseitigt werden müssen."
|
||||
COM_SPORTSMANAGER_IMPORT_DUPLICATE_MESSAGE="Versuch, Spielernr. auf eine bereits für einen anderen Spieler vergebene Spielernr. zu ändern"
|
||||
COM_SPORTSMANAGER_IMPORT_WRONG_FORMAT_PLAYERNUMBER="Eine oder mehrere Spielernummer enthalten ein ungültiges Format"
|
||||
COM_SPORTSMANAGER_NAME2="Name"
|
||||
COM_SPORTSMANAGER_DATA_IMPORT_ABORT_MESSAGE="Der Import wird abgebrochen, da Konflikte bei den zu importierenden Spielerdaten bestehen. Bitte kontaktiere einen Moderator und sende dabei die Importdatei mit!"
|
||||
COM_SPORTSMANAGER_DATA_IMPORT_NO_CONFLICTS="Es bestehen keine Konflikte bei den zu importierenden Spielerdaten."
|
||||
@@ -485,6 +500,8 @@ COM_SPORTSMANAGER_WIN_1_POINT="Sieg: 1 Punkt"
|
||||
COM_SPORTSMANAGER_WIN_2_POINTS="Sieg: 2 Punkte, Unentschieden: 1 Punkt"
|
||||
COM_SPORTSMANAGER_WIN_3_POINTS="Sieg: 3 Punkte, Unentschieden: 1 Punkt"
|
||||
COM_SPORTSMANAGER_MEETING_CONCLUDED_AT="Begegnung abgeschlossen bei"
|
||||
COM_SPORTSMANAGER_GAMES_IN_STATISTIK="Spiele in Spielerstatistik"
|
||||
COM_SPORTSMANAGER_GAMES_IN_STATISTIK_ALL="Alle Spiele"
|
||||
COM_SPORTSMANAGER_GENERALLY="Allgemein"
|
||||
COM_SPORTSMANAGER_TYPE="Typ"
|
||||
COM_SPORTSMANAGER_ELO_MIN="Elo min."
|
||||
@@ -501,7 +518,6 @@ COM_SPORTSMANAGER_ADD_POINTS_TABLE="Punktetabelle hinzufügen"
|
||||
COM_SPORTSMANAGER_ADD_FUNCTION="Funktion hinzufügen"
|
||||
COM_SPORTSMANAGER_PARTICIPANT="Teilnehmer"
|
||||
COM_SPORTSMANAGER_FUNCTION="Funktion"
|
||||
COM_SPORTSMANAGER_MULTIPLIER="Multiplikator"
|
||||
COM_SPORTSMANAGER_MAXIMUM="maximal"
|
||||
COM_SPORTSMANAGER_CONTRACTION="Kürzel"
|
||||
COM_SPORTSMANAGER_ELIGIBLE_ORGANIZERS="Berechtigte für Veranstalter"
|
||||
@@ -535,9 +551,23 @@ COM_SPORTSMANAGER_FULL_RATING="Volle Wertung"
|
||||
COM_SPORTSMANAGER_NO_RATING="Keine Wertung"
|
||||
COM_SPORTSMANAGER_TEAM_COMPETITIONS="Mannschaftswettbewerbe"
|
||||
COM_SPORTSMANAGER_TABLE_SUMMARY="Tabellenwertung"
|
||||
COM_SPORTSMANAGER_HEAD_TO_HEAD_RECORD="Direkter Vergleich"
|
||||
COM_SPORTSMANAGER_HEAD_TO_HEAD_OPT_NOT="deaktiviert"
|
||||
COM_SPORTSMANAGER_HEAD_TO_HEAD_OPT_POINTS="bei gleicher Punktzahl"
|
||||
COM_SPORTSMANAGER_HEAD_TO_HEAD_OPT_SETS="bei gleicher Punktzahl, Satzpunkte"
|
||||
COM_SPORTSMANAGER_HEAD_TO_HEAD_OPT_GOALS="bei gleicher Punktzahl, Satzpunkte, Tore"
|
||||
COM_SPORTSMANAGER_POINTS_WON_LOST_DIFFERENCE="Spielpunkte gewonnen, Spielpunkte verloren, Punktedifferenz"
|
||||
COM_SPORTSMANAGER_PERFORMANCE_INDEX="Leistungsindex (SP+ * SP+ * 100) / (SP+ + SP-), Spielpunkte gewonnen, ..."
|
||||
COM_SPORTSMANAGER_PERFORMANCE_INDEX0="Spielpunkte gewonnen, Spielpunkte verloren, Punktedifferenz"
|
||||
COM_SPORTSMANAGER_PERFORMANCE_INDEX1="Leistungsindex (SP+ * SP+ * 100) / (SP+ + SP-), Spielpunkte gewonnen, ..."
|
||||
COM_SPORTSMANAGER_PERFORMANCE_INDEX2="Leistungsindex (S * P+ * 10) / (P+ + P-), Spielpunkte gewonnen, ..."
|
||||
COM_SPORTSMANAGER_PERFORMANCE_INDEX3="Race Performance Index (Siege*2 + Unentschieden + Tordifferenz)"
|
||||
COM_SPORTSMANAGER_PERFORMANCE_INDEX4="Effizienzindex (T+ / (T+ + T-))"
|
||||
COM_SPORTSMANAGER_PERFORMANCE_INDEX5="Punkteschnitt (P+ / Anzahl Sätze)"
|
||||
COM_SPORTSMANAGER_PERFORMANCE_SHORT1="LI"
|
||||
COM_SPORTSMANAGER_PERFORMANCE_SHORT2="LI"
|
||||
COM_SPORTSMANAGER_PERFORMANCE_SHORT3="RPI"
|
||||
COM_SPORTSMANAGER_PERFORMANCE_SHORT4="EI"
|
||||
COM_SPORTSMANAGER_PERFORMANCE_SHORT5="AVG"
|
||||
COM_SPORTSMANAGER_INDIVIDUAL_STATISTICS="Einzelstatistik aus allen Spielen"
|
||||
COM_SPORTSMANAGER_INDIVIDUAL_STATISTICS_SINGLES="Einzelstatistik aus Einzel-Spielen"
|
||||
COM_SPORTSMANAGER_INDIVIDUAL_STATISTICS_DOUBLES="Einzelstatistik aus Doppel-Spielen"
|
||||
@@ -561,7 +591,7 @@ COM_SPORTSMANAGER_PRIVATE_PLAYER_DATA="Private Spielerdaten in Vereins- und Mann
|
||||
COM_SPORTSMANAGER_ASSOCIATIONS_MEMBERSHIPS_MANAGE="Vereine und Mitgliedschaften verwalten"
|
||||
COM_SPORTSMANAGER_MANAGE_CLASSIFICATIONS="Einstufungen verwalten"
|
||||
COM_SPORTSMANAGER_MANAGE_TEAM_PLANS="Mannschaftsspielpläne verwalten"
|
||||
COM_SPORTSMANAGER_MANAGE_RULES_POSTPONEMENT="Verschieberegeln verwalten"
|
||||
COM_SPORTSMANAGER_MANAGE_RULES_POSTPONEMENT="Spielverlegungen/Verschieberegeln verwalten"
|
||||
COM_SPORTSMANAGER_MANAGE_VENUES="Spielorte verwalten"
|
||||
COM_SPORTSMANAGER_MANAGE_TEAM_COMPETITIONS="Mannschaftswettbewerbe verwalten"
|
||||
COM_SPORTSMANAGER_MANAGE_PLAYER_STATISTICS="Spielerstastistiken verwalten"
|
||||
@@ -603,7 +633,10 @@ COM_SPORTSMANAGER_ONLY_DETAILED_RATING_POINT_DIFFERENCE="Nur Detailwertung nach
|
||||
COM_SPORTSMANAGER_ONLY_DETAILED_POINTS_AFTER_POINTSRATE="Nur Detailwertung nach Punktequote"
|
||||
COM_SPORTSMANAGER_KO_SIMPLE_FULL="K.O. (einfach oder vollstaendige Ausspielung aller Plaetze)"
|
||||
COM_SPORTSMANAGER_MANUAL_PRO_TEAMS="Manuell (pro Mannschaft)"
|
||||
COM_SPORTSMANAGER_CUP_DRAW_EVERY_ROUND="Pokal: Jede Runde wird neu gelost"
|
||||
COM_SPORTSMANAGER_CUP_USING_SEEDING_LIST="Pokal: Losen einer Setzliste"
|
||||
COM_SPORTSMANAGER_SUBDIVISION="Unterteilung"
|
||||
COM_SPORTSMANAGER_SHOW_MATCHDAY_TITLE="Titel von Spieltag zeigen"
|
||||
COM_SPORTSMANAGER_ELO_RATING="ELO-Wertung"
|
||||
COM_SPORTSMANAGER_ELIGIBLE_FOR_EVENT="Berechtigte für Veranstaltung"
|
||||
COM_SPORTSMANAGER_TITLE_LOGO="Titel-Logo"
|
||||
@@ -631,6 +664,9 @@ COM_SPORTSMANAGER_GAMEDAY="Spieltag"
|
||||
COM_SPORTSMANAGER_GAMEDAYS="Spieltage"
|
||||
COM_SPORTSMANAGER_ROUND="Runde"
|
||||
COM_SPORTSMANAGER_ROUNDS="Runden"
|
||||
COM_SPORTSMANAGER_ROUND_TITLE="Runde Bezeichnung"
|
||||
COM_SPORTSMANAGER_DRAW_FOR_HOME="Heimrecht auslosen"
|
||||
COM_SPORTSMANAGER_MATCH_PLACE3="Spiel um Platz 3"
|
||||
COM_SPORTSMANAGER_MONTH="Monat"
|
||||
COM_SPORTSMANAGER_MONTHS="Monate"
|
||||
COM_SPORTSMANAGER_PLAYER_FROM_TEAM="Spieler von Mannschaft"
|
||||
@@ -646,7 +682,9 @@ COM_SPORTSMANAGER_SO_FAR="bisher"
|
||||
COM_SPORTSMANAGER_PLACEMENT_AREA="Platzierungsbereich"
|
||||
COM_SPORTSMANAGER_IMAGE_WITHIN_TEAM="Bild innerhalb Mannschaft"
|
||||
COM_SPORTSMANAGER_ADD_MEETING="Begegnung hinzufügen"
|
||||
COM_SPORTSMANAGER_GAMEDAY_GENERATION="Spieltag erzeugen"
|
||||
COM_SPORTSMANAGER_ROUND_GENERATION="Runde erzeugen"
|
||||
COM_SPORTSMANAGER_CUP_ROUND_GENERATION="Pokalrunde auslosen"
|
||||
COM_SPORTSMANAGER_GENERATE_GROUP_GAME="Gruppenspiele erzeugen"
|
||||
COM_SPORTSMANAGER_IMPORT_GROUP_GAME="Gruppenspiele importieren"
|
||||
COM_SPORTSMANAGER_IMPORT_GROUP_GAME2="Gruppenspiele: Importieren"
|
||||
@@ -774,6 +812,7 @@ COM_SPORTSMANAGER_FEDERAL_STATES="Bundesländer"
|
||||
COM_SPORTSMANAGER_STATES="Länder"
|
||||
COM_SPORTSMANAGER_YEAR="Jahr"
|
||||
COM_SPORTSMANAGER_ADDITION="Zusatz"
|
||||
COM_SPORTSMANAGER_LOCATION="Ort"
|
||||
COM_SPORTSMANAGER_STATE="Land"
|
||||
COM_SPORTSMANAGER_FEDERAL_="Bundes-"
|
||||
COM_SPORTSMANAGER_INFO="Info"
|
||||
@@ -787,7 +826,6 @@ COM_SPORTSMANAGER_APPLIED_FOR="Beantragt"
|
||||
COM_SPORTSMANAGER_DECLINED="Abgelehnt"
|
||||
COM_SPORTSMANAGER_DATE_DETAILS="Termin: Details"
|
||||
COM_SPORTSMANAGER_ADDITIONS="Zusätze"
|
||||
COM_SPORTSMANAGER_ADDITIONAL_INFORMATION="Weitere Informationen"
|
||||
COM_SPORTSMANAGER_PUBLIC_EMAIL="E-Mail öffentlich"
|
||||
COM_SPORTSMANAGER_EMAIL_WITH_CHANGES="E-Mail bei Änderungen"
|
||||
COM_SPORTSMANAGER_ACTION_TYPE="Aktionstyp"
|
||||
@@ -863,6 +901,9 @@ COM_SPORTSMANAGER_INITIAL_APPOINTMENT_SUGGESTIONS="Initiale Terminvorschläg
|
||||
COM_SPORTSMANAGER_REQUESTING_TEAM="Beantragende Mannschaft"
|
||||
COM_SPORTSMANAGER_OPPONENT_TEAM="Gegnerische Mannschaft"
|
||||
COM_SPORTSMANAGER_AGAINST_PROPOSALS_ALLOWED="Gegensvorschläge zulässig"
|
||||
COM_SPORTSMANAGER_REASON_REQUIRED="Begründung erforderlich"
|
||||
COM_SPORTSMANAGER_CLUB_ENTITLEMENT="Berechtigung Vereine"
|
||||
COM_SPORTSMANAGER_ASSOCIATION_ENTITLEMENT="Berechtigung Verband"
|
||||
COM_SPORTSMANAGER_LEAD_TIME="Vorlaufzeit"
|
||||
COM_SPORTSMANAGER_APPOINTMENT_PROPOSALS_MINIMAL="Terminvorschläge minimal"
|
||||
COM_SPORTSMANAGER_APPOINTMENT_PROPOSALS_MAXIMUM="Terminvorschläge maximal"
|
||||
@@ -872,6 +913,11 @@ COM_SPORTSMANAGER_OPTIONAL_BUT_SAME_IN_DOUBLES="Optional, aber im Doppel keiner
|
||||
COM_SPORTSMANAGER_REQUIRED="Erforderlich"
|
||||
COM_SPORTSMANAGER_RESULT_ONLY="Nur Ergebnis"
|
||||
COM_SPORTSMANAGER_GAME_NUMBER="Spiel %d"
|
||||
COM_SPORTSMANAGER_LABEL_GAME_NUMBER="Spiel Nr"
|
||||
COM_SPORTSMANAGER_LABEL_GAME_TITLE="Spieltag Titel"
|
||||
COM_SPORTSMANAGER_EXPLICIT_PENALTIES="Explizite Strafen"
|
||||
COM_SPORTSMANAGER_EXPLICIT_PENALTIES_EMAIL_SUBJECT="%s: Strafpunkte erhalten"
|
||||
COM_SPORTSMANAGER_EXPLICIT_PENALTIES_EMAIL_BODY="%s wurden %f Strafpunkte zugeteilt mit der Begründung: %s"
|
||||
COM_SPORTSMANAGER_EMAIL_SHIFT_GAME_APPOINTMENT_SUBJECT="%s vs %s: Spieltermin verlegen"
|
||||
COM_SPORTSMANAGER_EMAIL_SHIFT_GAME_APPOINTMENT_BODY="Zur Begegnung %s gegen %s am %s in %s wird von %s der Spieltermin verschoben.\n\nAlternative Termine:\n\n"
|
||||
COM_SPORTSMANAGER_EMAIL_SHIFT_GAME_APPOINTMENT_REQUESTED_BODY="Zur Begegnung %s gegen %s am %s in %s wird von %s der Spieltermin verschoben.\n\nBitte alternative Termine vorschlagen unter %s"
|
||||
@@ -989,3 +1035,84 @@ COM_SPORTSMANAGER_ARIA_LABEL_RANKING_EVALUATION="Ranking Wertung"
|
||||
COM_SPORTSMANAGER_ARIA_LABEL_LASTNAME="Nachname"
|
||||
COM_SPORTSMANAGER_ARIA_LABEL_FIRSTNAME="Vorname"
|
||||
COM_SPORTSMANAGER_ARIA_LABEL_CLUB="Verein"
|
||||
COM_SPORTSMANAGER_NUM_REQUESTED_SHIFTS="Verschiebungen"
|
||||
COM_SPORTSMANAGER_NUM_REQUESTED_SHFITS_TOOLTIP="Spielverschiebungen durch diese Mannschaft"
|
||||
COM_SPORTSMANAGER_GAME_RESULT_DELAYS="Verzögerung"
|
||||
COM_SPORTSMANAGER_USE_EMAIL_REMINDERS="Verwende Email Erinnerungen"
|
||||
COM_SPORTSMANAGER_RULEBOOKS="Regelwerke"
|
||||
COM_SPORTSMANAGER_RULEBOOK="Regelwerk"
|
||||
COM_SPORTSMANAGER_RULE_SHORT="SPO"
|
||||
COM_SPORTSMANAGER_FEE_SHORT="GO"
|
||||
COM_SPORTSMANAGER_RULE_LONG="Paragraph SPO"
|
||||
COM_SPORTSMANAGER_FEE_LONG="Paragraph GO"
|
||||
COM_SPORTSMANAGER_SELECT="Auswahl"
|
||||
COM_SPORTSMANAGER_NO_SELECT="keine Auswahl"
|
||||
COM_SPORTSMANAGER_REALLY_REMOVE_RULEBOOK="Willst Du dieses Regelwerk wirklich entfernen?"
|
||||
COM_SPORTSMANAGER_ADD_RULEBOOK="Regelwerk hinzufügen"
|
||||
COM_SPORTSMANAGER_DISCIPLINARY_FINES="Ordnungsstrafen"
|
||||
COM_SPORTSMANAGER_DISCIPLINARY_FINE="Ordnungsstrafe"
|
||||
COM_SPORTSMANAGER_ISSUE_DISCIPLINARY_FINES="Ordnungsstrafe ausstellen"
|
||||
COM_SPORTSMANAGER_EDIT_DISCIPLINARY_FINE="Ordnungsstrafe bearbeiten"
|
||||
COM_SPORTSMANAGER_SEND_DISCIPLINARY_FINE="Ordnungsstrafe versenden"
|
||||
COM_SPORTSMANAGER_REALLY_REMOVE_DISCIPLINARY_FINES="Willst Du diese Ordnungsstrafe wirklich entfernen?"
|
||||
COM_SPORTSMANAGER_VIOLATIONS="Verstöße"
|
||||
COM_SPORTSMANAGER_VIOLATION="Verstoß"
|
||||
COM_SPORTSMANAGER_ADD_VIOLATION="Verstoß hinzufügen"
|
||||
COM_SPORTSMANAGER_REALLY_REMOVE_VIOLATION="Willst Du diesen Verstoß wirklich entfernen?"
|
||||
COM_SPORTSMANAGER_VIOLATION_TEXT="Text"
|
||||
COM_SPORTSMANAGER_VIOLATION_ADD_TEXT="Zusatztext"
|
||||
COM_SPORTSMANAGER_FEE="Gebühr"
|
||||
COM_SPORTSMANAGER_ADD_FEE="Zusatzgebühr"
|
||||
COM_SPORTSMANAGER_SELECTABLE="Auswählbar"
|
||||
COM_SPORTSMANAGER_TEMPLATE="Vorlage"
|
||||
COM_SPORTSMANAGER_EMAIL_SUBJECT="Betreff"
|
||||
COM_SPORTSMANAGER_EMAIL_MESSAGE="Nachricht"
|
||||
COM_SPORTSMANAGER_EMAIL_TO="An"
|
||||
COM_SPORTSMANAGER_EMAIL_SEND="E-Mail senden"
|
||||
COM_SPORTSMANAGER_EMAIL_TEXT_TEMPLATE="Textvorlage"
|
||||
COM_SPORTSMANAGER_ISSUER="Aussteller"
|
||||
COM_SPORTSMANAGER_ISSUE_DATE="Ausstelldatum"
|
||||
COM_SPORTSMANAGER_SENDER="Sender"
|
||||
COM_SPORTSMANAGER_BILL_ISSUER="Rechnung erstellt"
|
||||
COM_SPORTSMANAGER_MULTIPLIER="Multiplikator"
|
||||
COM_SPORTSMANAGER_ADDITIONAL_INFORMATION="Weitere Angaben"
|
||||
COM_SPORTSMANAGER_EMAIL_WAS_SEND="Die E-Mail wurde erfolgreich versendet"
|
||||
COM_SPORTSMANAGER_EMAIL_WAS_NOT_SEND="Die E-Mail wurde nicht versendet"
|
||||
COM_SPORTSMANAGER_OLD_DATE="Alter Termin"
|
||||
COM_SPORTSMANAGER_NEW_DATE="Neuer Termin"
|
||||
COM_SPORTSMANAGER_REASON_GAME_APPOINTMENT="Verlegungsgrund"
|
||||
COM_SPORTSMANAGER_MATCH_RESCHEDULINGS="Spielverlegungen"
|
||||
COM_SPORTSMANAGER_MATCH_RESCHEDULING="Spielverlegung"
|
||||
COM_SPORTSMANAGER_MATCH_SWAPPING_HELP="Bei Heimrechttausch gleichen Termin eintragen"
|
||||
COM_SPORTSMANAGER_NOT_VALID_TIME="Ungültige Uhrzeit"
|
||||
COM_SPORTSMANAGER_REALLY_MATCH_RESCHEDULING="Willst Du diesen Spielverlegung wirklich entfernen?"
|
||||
COM_SPORTSMANAGER_REST_DAYS="Ruhetage"
|
||||
COM_SPORTSMANAGER_TRAINING_DAYS="Trainingstage"
|
||||
COM_SPORTSMANAGER_NOT_ACTUALIZED_DATA="Nicht aktualisierte Daten"
|
||||
COM_SPORTSMANAGER_ASSOCIATION_BODIES="Verbandsorgane"
|
||||
COM_SPORTSMANAGER_ASSOCIATION_BODY="Verbandsorgan"
|
||||
COM_SPORTSMANAGER_ADD_ASSOCIATION_BODY="Verbandsorgan hinzufügen"
|
||||
COM_SPORTSMANAGER_REALLY_REMOVE_ASSOCIATION_BODY="Willst Du dieses Verbandsorgan wirklich entfernen?"
|
||||
COM_SPORTSMANAGER_INVALID_ASSOCIATION_BODY_NAME="Ungültiger Name für Verbandsorgan!"
|
||||
COM_SPORTSMANAGER_NAME_NOT_COMPLETE="Der Name ist nicht komplett ausgefüllt"
|
||||
COM_SPORTSMANAGER_ADDITIONAL_INFO="Zusatzinfo"
|
||||
COM_SPORTSMANAGER_USE_HTML="Hier sollte HTML-formatierter Text verwendet werden"
|
||||
COM_SPORTSMANAGER_REALLY_REMOVE_ASSOCIATION_BODY_MEMBER="Möchtest du dieses Mitglied des Verbandsorgans wirklich entfernen?"
|
||||
COM_SPORTSMANAGER_HELP_EDIT_ASSOCIATION_BODY_MEMBER="Wird ein Name aus der Spielerliste ausgewählt, werden Nachname und Vorname übernommen.<br>Telefon, Mobil, E-Mail werden aus der Spielerliste übernommen, wenn sie hier nicht ausgefüllt sind."
|
||||
COM_SPORTSMANAGER_HALL_OF_FAME="Hall of Fame"
|
||||
COM_SPORTSMANAGER_ADD_HALL_OF_FAME="Hall of Fame hinzufügen"
|
||||
COM_SPORTSMANAGER_INVALID_HALL_OF_FAME_NAME="Invalider Name für Hall of Fame"
|
||||
COM_SPORTSMANAGER_REALLY_REMOVE_HALL_OF_FAME="Willst Du wirklich diese Hall of Fame mit allen Mitgliedern löschen?"
|
||||
COM_SPORTSMANAGER_MATCH_TYPE="Spielform"
|
||||
COM_SPORTSMANAGER_REALLY_REMOVE_HALL_OF_FAME_YEAR="Willst Du wirklich dieses Hall of Fame Jahr löschen?"
|
||||
COM_SPORTSMANAGER_YEARS="Jahre"
|
||||
COM_SPORTSMANAGER_ADD_HALL_OF_FAME_YEAR="Hall of Fame Jahr hinzufügen"
|
||||
COM_SPORTSMANAGER_NO_ENTRY="kein Eintrag"
|
||||
COM_SPORTSMANAGER_REALLY_SWAP_MATCH="Willst Du wirklich das Heimrecht tauschen?"
|
||||
COM_SPORTSMANAGER_SWAP_MATCH="Heimrechttausch"
|
||||
COM_SPORTSMANAGER_REALLY_DELETE_MATCH_REPORT="Der Spielbericht wird zusammen mit allen historischen Einträgen gelöscht. Willst du den Spielbericht wirklich löschen?"
|
||||
COM_SPORTSMANAGER_MATCH_REPORT_DELETED="Spielbericht gelöscht"
|
||||
COM_SPORTSMANAGER_MATCH_REPORT_WAS_DELETED="Der Spielbericht wurde erfolgreich gelöscht!"
|
||||
COM_SPORTSMANAGER_MATCH_REPORT_CORRECTED="Spielberichtskorrektur"
|
||||
COM_SPORTSMANAGER_MIN_MATCHES="Mindestzahl Spiele"
|
||||
COM_SPORTSMANAGER_SELECT_ALL="Alle"
|
||||
@@ -1,4 +1,4 @@
|
||||
; Sports Manager (C) 2006-2020, Sven Nickel
|
||||
; Sports Manager (C) 2006-2020, Sven Nickel
|
||||
COM_SPORTSMANAGER="Sports Manager"
|
||||
COM_SPORTSMANAGER_PLAYERS="Players"
|
||||
COM_SPORTSMANAGER_CLUBS="Clubs"
|
||||
@@ -21,6 +21,7 @@ COM_SPORTSMANAGER_LOCATIONS="Locations"
|
||||
COM_SPORTSMANAGER_SEASONS="Seasons"
|
||||
COM_SPORTSMANAGER_TEAM_PLANS="Team plans"
|
||||
COM_SPORTSMANAGER_TEAM_NAME="Team name"
|
||||
COM_SPORTSMANAGER_TEAM_NAME_SHORT="Team name short (max 24)"
|
||||
COM_SPORTSMANAGER_TEAM_NAME2="Club name"
|
||||
COM_SPORTSMANAGER_TEAM_SEAT="Club location"
|
||||
COM_SPORTSMANAGER_POSTPONE_RULES="Postpone rules"
|
||||
@@ -38,6 +39,8 @@ COM_SPORTSMANAGER_ORGANISATION="Organisation"
|
||||
COM_SPORTSMANAGER_TEAM_MEMBERS="Team members"
|
||||
COM_SPORTSMANAGER_TEAM_MEMBERS2="Club members"
|
||||
COM_SPORTSMANAGER_MEMBERS="Members"
|
||||
COM_SPORTSMANAGER_MEMBER="Member"
|
||||
COM_SPORTSMANAGER_ACTIVE_MEMBERS="Active members"
|
||||
COM_SPORTSMANAGER_TEAMS="Teams"
|
||||
COM_SPORTSMANAGER_CURRENT_TEAMS="Current teams"
|
||||
COM_SPORTSMANAGER_PREVIOUS_TEAMS="Previous teams"
|
||||
@@ -128,11 +131,14 @@ COM_SPORTSMANAGER_QUARTER_FINAL="Quarter final"
|
||||
COM_SPORTSMANAGER_QUARTER_FINAL_SHORTCUT="1/4"
|
||||
COM_SPORTSMANAGER_ROUND_OF_16="Round of sixteen"
|
||||
COM_SPORTSMANAGER_ROUND_OF_16_SHORTCUT="1/8"
|
||||
COM_SPORTSMANAGER_ROUND_OF_32="Round of thiry-two"
|
||||
COM_SPORTSMANAGER_ROUND_OF_32="Round of thirty-two"
|
||||
COM_SPORTSMANAGER_ROUND_OF_32_ALT="Round of thirty-two"
|
||||
COM_SPORTSMANAGER_ROUND_OF_32_SHORTCUT="1/16"
|
||||
COM_SPORTSMANAGER_ROUND_OF_64="Round of sixty-four"
|
||||
COM_SPORTSMANAGER_ROUND_OF_64_ALT="Round of sixty-four"
|
||||
COM_SPORTSMANAGER_ROUND_OF_64_SHORTCUT="1/32"
|
||||
COM_SPORTSMANAGER_ROUND_OF_128="Round of 128"
|
||||
COM_SPORTSMANAGER_ROUND_OF_128_ALT="Round of 128"
|
||||
COM_SPORTSMANAGER_ROUND_OF_128_SHORTCUT="1/64"
|
||||
COM_SPORTSMANAGER_DAY_0_SHORTCUT="Su."
|
||||
COM_SPORTSMANAGER_DAY_1_SHORTCUT="Mo."
|
||||
@@ -151,6 +157,7 @@ COM_SPORTSMANAGER_DEFEAT="Defeat"
|
||||
COM_SPORTSMANAGER_DEFEATS="Defeats"
|
||||
COM_SPORTSMANAGER_DEFEATS_SHORTCUT="F"
|
||||
COM_SPORTSMANAGER_GOALS="Goals"
|
||||
COM_SPORTSMANAGER_GOALS_SHORTCUT="G"
|
||||
COM_SPORTSMANAGER_SETS="Sets"
|
||||
COM_SPORTSMANAGER_POINT="Point"
|
||||
COM_SPORTSMANAGER_POINTS="Points"
|
||||
@@ -163,9 +170,9 @@ COM_SPORTSMANAGER_GAME_POINTS="Game points"
|
||||
COM_SPORTSMANAGER_GAME_POINTS_SHORTCUT="GP"
|
||||
COM_SPORTSMANAGER_SUFFIX_ONE_TEAM=" (one team)"
|
||||
COM_SPORTSMANAGER_SUFFIX_TEAMS_TOGETHER=" (teams together)"
|
||||
COM_SPORTSMANAGER_DIFFERENCE="Difference"
|
||||
COM_SPORTSMANAGER_DIFFERENCE_IN_POINTS="Difference in points"
|
||||
COM_SPORTSMANAGER_POINTS_RATIO="Points ratio"
|
||||
COM_SPORTSMANAGER_DIFFERENCE="Goal difference"
|
||||
COM_SPORTSMANAGER_DIFFERENCE_IN_POINTS="Difference in game points"
|
||||
COM_SPORTSMANAGER_POINTS_RATIO="Game points ratio"
|
||||
COM_SPORTSMANAGER_SCHEDULE_DATE="Appointment date"
|
||||
COM_SPORTSMANAGER_TEAM_HOME="Home"
|
||||
COM_SPORTSMANAGER_TEAM_VISITOR="Visitor"
|
||||
@@ -259,6 +266,7 @@ COM_SPORTSMANAGER_IN="in"
|
||||
COM_SPORTSMANAGER_NATIONAL="National"
|
||||
COM_SPORTSMANAGER_INTERNATIONAL="International"
|
||||
COM_SPORTSMANAGER_PLAYER_NUMBER_SHORT="Player number"
|
||||
COM_SPORTSMANAGER_ASSOCIATION_SHORT_NAME="Association short name"
|
||||
COM_SPORTSMANAGER_BASIC_PLAYER_NUMBER_SHORT="Player number base"
|
||||
COM_SPORTSMANAGER_MESSAGES="Registrations"
|
||||
COM_SPORTSMANAGER_TOURNAMENT_PLACEMENT="Tournament placements"
|
||||
@@ -289,10 +297,9 @@ COM_SPORTSMANAGER_REQUEST_MESSAGE_PLURAL="At least %d dates must be given comple
|
||||
COM_SPORTSMANAGER_REJECT_SHIFT="Reject shift"
|
||||
COM_SPORTSMANAGER_TO="until"
|
||||
COM_SPORTSMANAGER_PLAYER_STATISTICS="Player statistics"
|
||||
COM_SPORTSMANAGER_PERFORMANCE_INDEX_SHORTCUT="PI"
|
||||
COM_SPORTSMANAGER_WON="won"
|
||||
COM_SPORTSMANAGER_LOST="lost"
|
||||
COM_SPORTSMANAGER_RATE="Rate"
|
||||
COM_SPORTSMANAGER_RATE="Winning rate"
|
||||
COM_SPORTSMANAGER_RATE_SHORTCUT="R"
|
||||
COM_SPORTSMANAGER_NO_CLUB="No club"
|
||||
COM_SPORTSMANAGER_RATING="Rating"
|
||||
@@ -310,6 +317,11 @@ COM_SPORTSMANAGER_FOR_OTHER_CONTACT="For other contact"
|
||||
COM_SPORTSMANAGER_DATES_REGISTERED_USERS="Apply dates by registered users"
|
||||
COM_SPORTSMANAGER_VIEW_ELO_RATING="View Elo rating"
|
||||
COM_SPORTSMANAGER_VIEW_SPORTSMANAGER_LIZENZ="Show License"
|
||||
COM_SPORTSMANAGER_VIEW_LEAST_MEMBER_COUNT="Show least member count (teams)"
|
||||
COM_SPORTSMANAGER_SHOW_ORGANISATION="Show organisation (teams)"
|
||||
COM_SPORTSMANAGER_SHOW_MEMBER_COUNT="Show member column (teams)"
|
||||
COM_SPORTSMANAGER_SHOW_TOURNAMENT_BRACKET="Show Tournament Bracket"
|
||||
COM_SPORTSMANAGER_USE_DISCIPLINARY_FINE="Use disciplinary fine"
|
||||
COM_SPORTSMANAGER_PLAYER_DETAILS="Player details"
|
||||
COM_SPORTSMANAGER_PLAYER_LIST_DETAILS="Player list details"
|
||||
COM_SPORTSMANAGER_PLAYER_EDIT="Edit player data by organisation/club contacts"
|
||||
@@ -350,8 +362,9 @@ COM_SPORTSMANAGER_PLAYERS_EXPORT_SPORT_SOFTWARE="Export players (Sport Software)
|
||||
COM_SPORTSMANAGER_CLEANUP_INACTIVE_PLAYERS="Cleanup inactive players"
|
||||
COM_SPORTSMANAGER_STATISTIK="Statistics"
|
||||
COM_SPORTSMANAGER_PLAYERS_ACTIVE="Players active"
|
||||
COM_SPORTSMANAGER_RESTRICTED_PLAYERS="Players restrited"
|
||||
COM_SPORTSMANAGER_RESTRICTED_PLAYERS="Players restricted"
|
||||
COM_SPORTSMANAGER_PLAYER_PASSIV="Players passive"
|
||||
COM_SPORTSMANAGER_PLAYER_UNATTACHED="Players unattached"
|
||||
COM_SPORTSMANAGER_MEN_ACTIVE="Male active"
|
||||
COM_SPORTSMANAGER_WOMEN_ACTIVE="Female active"
|
||||
COM_SPORTSMANAGER_JUNIOR_ACTIVE="Juniors active"
|
||||
@@ -379,6 +392,7 @@ COM_SPORTSMANAGER_MEMBER_STATUS="Member status"
|
||||
COM_SPORTSMANAGER_ACTIVE="Active"
|
||||
COM_SPORTSMANAGER_RESTRICTED="Restricted"
|
||||
COM_SPORTSMANAGER_BEATEN="Excreted"
|
||||
COM_SPORTSMANAGER_HIDE="Hide"
|
||||
COM_SPORTSMANAGER_PASSIVE="Passive"
|
||||
COM_SPORTSMANAGER_BEATEN_CLUB="Club excreted"
|
||||
COM_SPORTSMANAGER_SINGLE_SEED="Elo starting value singles"
|
||||
@@ -401,10 +415,11 @@ COM_SPORTSMANAGER_EXPORT="Export"
|
||||
COM_SPORTSMANAGER_INTERNATIONAL_PLAYERS="Players (international)"
|
||||
COM_SPORTSMANAGER_COUNTRY_CODE="Country code"
|
||||
COM_SPORTSMANAGER_IMPORT="Import"
|
||||
COM_SPORTSMANAGER_IMPORT_MESSAGE="In the import there are only player information about club %s present. Shall only the members of that one club be updated, the associated club has to be selected down here. If the import contains all members of the organisation then the organisation must be selected."
|
||||
COM_SPORTSMANAGER_IMPORT_MESSAGE="In the import there are only player information about club %s present. Shall only the members of that one club be updated, the associated club has to be selected down here. If the import contains all members of the organisation then the organisation must be selected.<br />If a license number already exists, the license number and the year of birth will not be overwritten."
|
||||
COM_SPORTSMANAGER_CHECK="Check"
|
||||
COM_SPORTSMANAGER_IMPORT_CONFLICTS_MESSAGE="There are conflicts in the import which have to be fixed manually first."
|
||||
COM_SPORTSMANAGER_IMPORT_CONFLICTS_MESSAGE="There are faults or conflicts in the import which have to be fixed manually first."
|
||||
COM_SPORTSMANAGER_IMPORT_DUPLICATE_MESSAGE="Attempt to change player number into one that is already assigned to another player."
|
||||
COM_SPORTSMANAGER_IMPORT_WRONG_FORMAT_PLAYERNUMBER="One or more player numbers contain an invalid format"
|
||||
COM_SPORTSMANAGER_NAME2="Name"
|
||||
COM_SPORTSMANAGER_DATA_IMPORT_ABORT_MESSAGE="The import has been aborted because there are conflicts in the containing player information. Please contact a moderator and attach the import!"
|
||||
COM_SPORTSMANAGER_DATA_IMPORT_NO_CONFLICTS="There are conflicts in the containing player information."
|
||||
@@ -485,6 +500,8 @@ COM_SPORTSMANAGER_WIN_1_POINT="Win: 1 point"
|
||||
COM_SPORTSMANAGER_WIN_2_POINTS="Win: 2 points, draw: 1 point"
|
||||
COM_SPORTSMANAGER_WIN_3_POINTS="Win: 3 points, draw: 1 point"
|
||||
COM_SPORTSMANAGER_MEETING_CONCLUDED_AT="Match won at"
|
||||
COM_SPORTSMANAGER_GAMES_IN_STATISTIK="Games in player statistics"
|
||||
COM_SPORTSMANAGER_GAMES_IN_STATISTIK_ALL="All games"
|
||||
COM_SPORTSMANAGER_GENERALLY="Generally"
|
||||
COM_SPORTSMANAGER_TYPE="Type"
|
||||
COM_SPORTSMANAGER_ELO_MIN="Elo min."
|
||||
@@ -501,7 +518,6 @@ COM_SPORTSMANAGER_ADD_POINTS_TABLE="Add points table"
|
||||
COM_SPORTSMANAGER_ADD_FUNCTION="Add function"
|
||||
COM_SPORTSMANAGER_PARTICIPANT="Participants"
|
||||
COM_SPORTSMANAGER_FUNCTION="Function"
|
||||
COM_SPORTSMANAGER_MULTIPLIER="Multiplier"
|
||||
COM_SPORTSMANAGER_MAXIMUM="maximum"
|
||||
COM_SPORTSMANAGER_CONTRACTION="Contraction"
|
||||
COM_SPORTSMANAGER_ELIGIBLE_ORGANIZERS="Eligible for organisation"
|
||||
@@ -535,9 +551,23 @@ COM_SPORTSMANAGER_FULL_RATING="Full rating"
|
||||
COM_SPORTSMANAGER_NO_RATING="No rating"
|
||||
COM_SPORTSMANAGER_TEAM_COMPETITIONS="Team competitions"
|
||||
COM_SPORTSMANAGER_TABLE_SUMMARY="Table rating"
|
||||
COM_SPORTSMANAGER_HEAD_TO_HEAD_RECORD="Head-to-head record"
|
||||
COM_SPORTSMANAGER_HEAD_TO_HEAD_OPT_NOT="Off"
|
||||
COM_SPORTSMANAGER_HEAD_TO_HEAD_OPT_POINTS="Tie: pts"
|
||||
COM_SPORTSMANAGER_HEAD_TO_HEAD_OPT_SETS="Tie: pts, set points"
|
||||
COM_SPORTSMANAGER_HEAD_TO_HEAD_OPT_GOALS="Tie: pts, set points, goals"
|
||||
COM_SPORTSMANAGER_POINTS_WON_LOST_DIFFERENCE="Game points won, game points lost, point difference"
|
||||
COM_SPORTSMANAGER_PERFORMANCE_INDEX="Performance index (GP+ * GP+ * 100) / (GP+ + GP-), game points won, ..."
|
||||
COM_SPORTSMANAGER_PERFORMANCE_INDEX0="Game points won, game points lost, point difference"
|
||||
COM_SPORTSMANAGER_PERFORMANCE_INDEX1="Performance index (GP+ * GP+ * 100) / (GP+ + GP-), game points won, ..."
|
||||
COM_SPORTSMANAGER_PERFORMANCE_INDEX2="Performance index (games * P+ * 10) / (P+ + P-), game points won, ..."
|
||||
COM_SPORTSMANAGER_PERFORMANCE_INDEX3="Race Performance Index (victories*2 + draws + goal difference)"
|
||||
COM_SPORTSMANAGER_PERFORMANCE_INDEX4="Efficency index (G+ / (G+ + G-))"
|
||||
COM_SPORTSMANAGER_PERFORMANCE_INDEX5="Set point average (P+ / count sets)"
|
||||
COM_SPORTSMANAGER_PERFORMANCE_SHORT1="LI"
|
||||
COM_SPORTSMANAGER_PERFORMANCE_SHORT2="LI"
|
||||
COM_SPORTSMANAGER_PERFORMANCE_SHORT3="RPI"
|
||||
COM_SPORTSMANAGER_PERFORMANCE_SHORT4="EI"
|
||||
COM_SPORTSMANAGER_PERFORMANCE_SHORT5="AVG"
|
||||
COM_SPORTSMANAGER_INDIVIDUAL_STATISTICS="Individual statistics of all games"
|
||||
COM_SPORTSMANAGER_INDIVIDUAL_STATISTICS_SINGLES="Individual statistics of singles games"
|
||||
COM_SPORTSMANAGER_INDIVIDUAL_STATISTICS_DOUBLES="Individual statistics of doubles games"
|
||||
@@ -561,7 +591,7 @@ COM_SPORTSMANAGER_PRIVATE_PLAYER_DATA="View privat player information in club an
|
||||
COM_SPORTSMANAGER_ASSOCIATIONS_MEMBERSHIPS_MANAGE="Manage clubs and memberships"
|
||||
COM_SPORTSMANAGER_MANAGE_CLASSIFICATIONS="Manage classifications"
|
||||
COM_SPORTSMANAGER_MANAGE_TEAM_PLANS="Manage team plans"
|
||||
COM_SPORTSMANAGER_MANAGE_RULES_POSTPONEMENT="Manage postpone rules"
|
||||
COM_SPORTSMANAGER_MANAGE_RULES_POSTPONEMENT="Manage match rescheduling/postpone rules"
|
||||
COM_SPORTSMANAGER_MANAGE_VENUES="Manage venues"
|
||||
COM_SPORTSMANAGER_MANAGE_TEAM_COMPETITIONS="Manage team competitions"
|
||||
COM_SPORTSMANAGER_MANAGE_PLAYER_STATISTICS="Manage player statitics"
|
||||
@@ -603,7 +633,10 @@ COM_SPORTSMANAGER_ONLY_DETAILED_RATING_POINT_DIFFERENCE="Only detailed ranking b
|
||||
COM_SPORTSMANAGER_ONLY_DETAILED_POINTS_AFTER_POINTSRATE="Only detailed ranking by points rate"
|
||||
COM_SPORTSMANAGER_KO_SIMPLE_FULL="K.O. (singles or full playout of all places)"
|
||||
COM_SPORTSMANAGER_MANUAL_PRO_TEAMS="Manual (per team)"
|
||||
COM_SPORTSMANAGER_CUP_DRAW_EVERY_ROUND="Cup: draw every round"
|
||||
COM_SPORTSMANAGER_CUP_USING_SEEDING_LIST="Cup: draw seeding list"
|
||||
COM_SPORTSMANAGER_SUBDIVISION="Subdivision"
|
||||
COM_SPORTSMANAGER_SHOW_MATCHDAY_TITLE="Show title matchday"
|
||||
COM_SPORTSMANAGER_ELO_RATING="Elo rating"
|
||||
COM_SPORTSMANAGER_ELIGIBLE_FOR_EVENT="Eligibles for competition"
|
||||
COM_SPORTSMANAGER_TITLE_LOGO="Title logo"
|
||||
@@ -631,6 +664,9 @@ COM_SPORTSMANAGER_GAMEDAY="Gameday"
|
||||
COM_SPORTSMANAGER_GAMEDAYS="Gamedays"
|
||||
COM_SPORTSMANAGER_ROUND="Round"
|
||||
COM_SPORTSMANAGER_ROUNDS="Rounds"
|
||||
COM_SPORTSMANAGER_ROUND_TITLE="Round Title"
|
||||
COM_SPORTSMANAGER_DRAW_FOR_HOME="Draw for home"
|
||||
COM_SPORTSMANAGER_MATCH_PLACE3="Match for place 3"
|
||||
COM_SPORTSMANAGER_MONTH="Month"
|
||||
COM_SPORTSMANAGER_MONTHS="Months"
|
||||
COM_SPORTSMANAGER_PLAYER_FROM_TEAM="Player of team"
|
||||
@@ -646,7 +682,9 @@ COM_SPORTSMANAGER_SO_FAR="so far"
|
||||
COM_SPORTSMANAGER_PLACEMENT_AREA="Placement area"
|
||||
COM_SPORTSMANAGER_IMAGE_WITHIN_TEAM="Image within team"
|
||||
COM_SPORTSMANAGER_ADD_MEETING="Add match"
|
||||
COM_SPORTSMANAGER_GAMEDAY_GENERATION="Generate gameday"
|
||||
COM_SPORTSMANAGER_ROUND_GENERATION="Generate round"
|
||||
COM_SPORTSMANAGER_CUP_ROUND_GENERATION="Generate cup round"
|
||||
COM_SPORTSMANAGER_GENERATE_GROUP_GAME="Generate group games"
|
||||
COM_SPORTSMANAGER_Import_GROUP_GAME="Import group games"
|
||||
COM_SPORTSMANAGER_Import_GROUP_GAME2="Group games: Import"
|
||||
@@ -774,6 +812,7 @@ COM_SPORTSMANAGER_FEDERAL_STATES="State"
|
||||
COM_SPORTSMANAGER_STATES="Countries"
|
||||
COM_SPORTSMANAGER_YEAR="Year"
|
||||
COM_SPORTSMANAGER_ADDITION="Addition"
|
||||
COM_SPORTSMANAGER_LOCATION="Location"
|
||||
COM_SPORTSMANAGER_STATE="Germany"
|
||||
COM_SPORTSMANAGER_FEDERAL_="Federal "
|
||||
COM_SPORTSMANAGER_INFO="Info"
|
||||
@@ -787,7 +826,6 @@ COM_SPORTSMANAGER_APPLIED_FOR="Applied"
|
||||
COM_SPORTSMANAGER_DECLINED="Declined"
|
||||
COM_SPORTSMANAGER_DATE_DETAILS="Event: Details"
|
||||
COM_SPORTSMANAGER_ADDITIONS="Additions"
|
||||
COM_SPORTSMANAGER_ADDITIONAL_INFORMATION="Additional information"
|
||||
COM_SPORTSMANAGER_PUBLIC_EMAIL="E-mail public"
|
||||
COM_SPORTSMANAGER_EMAIL_WITH_CHANGES="E-mail for changes"
|
||||
COM_SPORTSMANAGER_ACTION_TYPE="Action type"
|
||||
@@ -863,6 +901,9 @@ COM_SPORTSMANAGER_INITIAL_APPOINTMENT_SUGGESTIONS="Initial appointment suggestio
|
||||
COM_SPORTSMANAGER_REQUESTING_TEAM="Requesting team"
|
||||
COM_SPORTSMANAGER_OPPONENT_TEAM="Opponent team"
|
||||
COM_SPORTSMANAGER_AGAINST_PROPOSALS_ALLOWED="Against proposals allowed"
|
||||
COM_SPORTSMANAGER_REASON_REQUIRED="Reason required"
|
||||
COM_SPORTSMANAGER_CLUB_ENTITLEMENT="Club entitlement"
|
||||
COM_SPORTSMANAGER_ASSOCIATION_ENTITLEMENT="Association_entitlement"
|
||||
COM_SPORTSMANAGER_LEAD_TIME="Lead time"
|
||||
COM_SPORTSMANAGER_APPOINTMENT_PROPOSALS_MINIMAL="Appointment proposals minimal"
|
||||
COM_SPORTSMANAGER_APPOINTMENT_PROPOSALS_MAXIMUM="Appointment proposals maximum"
|
||||
@@ -872,6 +913,11 @@ COM_SPORTSMANAGER_OPTIONAL_BUT_SAME_IN_DOUBLES="Optional but both or none in dou
|
||||
COM_SPORTSMANAGER_REQUIRED="Required"
|
||||
COM_SPORTSMANAGER_RESULT_ONLY="Result only"
|
||||
COM_SPORTSMANAGER_GAME_NUMBER="Game %d"
|
||||
COM_SPORTSMANAGER_LABEL_GAME_NUMBER="Game nr"
|
||||
COM_SPORTSMANAGER_LABEL_GAME_TITLE="Gameday title"
|
||||
COM_SPORTSMANAGER_EXPLICIT_PENALTIES="Explicit Penalties"
|
||||
COM_SPORTSMANAGER_EXPLICIT_PENALTIES_EMAIL_SUBJECT="%s: received penalty"
|
||||
COM_SPORTSMANAGER_EXPLICIT_PENALTIES_EMAIL_BODY="%s received a penalty of %f points based on the following justification: %s"
|
||||
COM_SPORTSMANAGER_EMAIL_SHIFT_GAME_APPOINTMENT_SUBJECT="%s vs %s: Shift game appointment"
|
||||
COM_SPORTSMANAGER_EMAIL_SHIFT_GAME_APPOINTMENT_BODY="For match %s versus %s on %s in %s the game appointment is shifted by %s.\n\nAlternative appointments:\n\n"
|
||||
COM_SPORTSMANAGER_EMAIL_SHIFT_GAME_APPOINTMENT_REQUESTED_BODY="For match %s on %s in %s the game appointment is shifted by %s.\n\nPlease propose alternative appointments under %s"
|
||||
@@ -924,8 +970,10 @@ COM_SPORTSMANAGER_NON_SMOKING_PROTECTION_MARK_NO=" (Kein Nichtraucherschutz)"
|
||||
COM_SPORTSMANAGER_POINTS_TABLE="Points table"
|
||||
COM_SPORTSMANAGER_EVALUATION="Auswertung"
|
||||
COM_SPORTSMANAGER_FUNCTION_DESCRIPTION="Variables: n = number of participants, p = place, m = multiplier of rating and in doubles possibly additionally reduced rating<br />Functions: +, -, *, /, round(x), pow(x), if(a > b, x, y), min(x, y), max(x, y), log(x), ln(x), logn(b, x)<br />VerteilungR(r, p, n, m) := max(round((((m * r - 1) * (-log(p / n) * (1 - (p / n)))) / (-log(1 / n) * (1 - (1 / n)))) + 1), 1)<br />Verteilung(r, p, n, m) := max(round(m * round((((r - 1) * (-log(p / n) * (1 - (p / n)))) / (-log(1 / n) * (1 - (1 / n)))) + 1)), 1)<br /><br />The functions VerteilungR() and Verteilung() distribute points for place 1 (r) descending to the individual places (p) of the number of participants (n).<br />VerteilungR() applies the multiplier (m) to the points for 1st place and then distributes down to 1 point for the last place.<br />Verteilung() applies the multiplier (m) to the points after the calculation, i.e. the last place receives 1 * m points."
|
||||
COM_SPORTSMANAGER_LIZENZ="License"
|
||||
COM_SPORTSMANAGER_RANK="Rank"
|
||||
|
||||
; Edit Player
|
||||
COM_SPORTSMANAGER_LIZENZ="License"
|
||||
COM_SPORTSMANAGER_ARIA_LABEL_MATCHDAY_SELECT="Choose a match day"
|
||||
COM_SPORTSMANAGER_ARIA_LABEL_PROPOSAL_DAY="Choose the day of the match proposal"
|
||||
COM_SPORTSMANAGER_ARIA_LABEL_PROPOSAL_MONTH="Choose the month of the match proposal"
|
||||
@@ -987,3 +1035,84 @@ COM_SPORTSMANAGER_ARIA_LABEL_RANKING_EVALUATION="Ranking evaluation"
|
||||
COM_SPORTSMANAGER_ARIA_LABEL_LASTNAME="Lastname"
|
||||
COM_SPORTSMANAGER_ARIA_LABEL_FIRSTNAME="Firstname"
|
||||
COM_SPORTSMANAGER_ARIA_LABEL_CLUB="Club"
|
||||
COM_SPORTSMANAGER_NUM_REQUESTED_SHIFTS="Shifts"
|
||||
COM_SPORTSMANAGER_NUM_REQUESTED_SHFITS_TOOLTIP="Game shifts caused by this team"
|
||||
COM_SPORTSMANAGER_GAME_RESULT_DELAYS="Delay"
|
||||
COM_SPORTSMANAGER_USE_EMAIL_REMINDERS="Use email reminders"
|
||||
COM_SPORTSMANAGER_RULEBOOKS="Rulebooks"
|
||||
COM_SPORTSMANAGER_RULEBOOK="Rulebook"
|
||||
COM_SPORTSMANAGER_RULE_SHORT="Rule"
|
||||
COM_SPORTSMANAGER_FEE_SHORT="Section fees"
|
||||
COM_SPORTSMANAGER_RULE_LONG="Section rules"
|
||||
COM_SPORTSMANAGER_FEE_LONG="Fee"
|
||||
COM_SPORTSMANAGER_SELECT="Select"
|
||||
COM_SPORTSMANAGER_NO_SELECT="No selection"
|
||||
COM_SPORTSMANAGER_REALLY_REMOVE_RULEBOOK="Do you really want to remove this rulebook?"
|
||||
COM_SPORTSMANAGER_ADD_RULEBOOK="Add rulebook"
|
||||
COM_SPORTSMANAGER_DISCIPLINARY_FINES="Disciplinary fines"
|
||||
COM_SPORTSMANAGER_ISSUE_DISCIPLINARY_FINES="Issue disciplinary fines"
|
||||
COM_SPORTSMANAGER_ISSUE_DISCIPLINARY_FINE="Issue disciplinary fine"
|
||||
COM_SPORTSMANAGER_EDIT_DISCIPLINARY_FINE="Edit issue disciplinary fine"
|
||||
COM_SPORTSMANAGER_SEND_DISCIPLINARY_FINE="Send issue disciplinary fine"
|
||||
COM_SPORTSMANAGER_REALLY_REMOVE_DISCIPLINARY_FINES="Do you really want to remove this Issue disciplinary fine?"
|
||||
COM_SPORTSMANAGER_VIOLATIONS="Violations"
|
||||
COM_SPORTSMANAGER_VIOLATION="Violation"
|
||||
COM_SPORTSMANAGER_ADD_VIOLATION="Add violation"
|
||||
COM_SPORTSMANAGER_REALLY_REMOVE_VIOLATION="Do you really want to remove this violation?"
|
||||
COM_SPORTSMANAGER_VIOLATION_TEXT="Text"
|
||||
COM_SPORTSMANAGER_VIOLATION_ADD_TEXT="Additional text"
|
||||
COM_SPORTSMANAGER_FEE="Fee"
|
||||
COM_SPORTSMANAGER_ADD_FEE="Additional Fee"
|
||||
COM_SPORTSMANAGER_SELECTABLE="Selectable"
|
||||
COM_SPORTSMANAGER_TEMPLATE="Template"
|
||||
COM_SPORTSMANAGER_EMAIL_SUBJECT="Subject"
|
||||
COM_SPORTSMANAGER_EMAIL_MESSAGE="Message"
|
||||
COM_SPORTSMANAGER_EMAIL_TO="to"
|
||||
COM_SPORTSMANAGER_EMAIL_SEND="Send E-Mail"
|
||||
COM_SPORTSMANAGER_EMAIL_TEXT_TEMPLATE="Text template"
|
||||
COM_SPORTSMANAGER_ISSUER="Issuer"
|
||||
COM_SPORTSMANAGER_SENDER="Sender"
|
||||
COM_SPORTSMANAGER_ISSUE_DATE="Issue date"
|
||||
COM_SPORTSMANAGER_BILL_ISSUER="Bill issuer"
|
||||
COM_SPORTSMANAGER_MULTIPLIER="Multiplier"
|
||||
COM_SPORTSMANAGER_ADDITIONAL_INFORMATION="Additional information"
|
||||
COM_SPORTSMANAGER_EMAIL_WAS_SEND="E-Mail was succesfully sent"
|
||||
COM_SPORTSMANAGER_EMAIL_WAS_NOT_SEND="E-Mail was not sent"
|
||||
COM_SPORTSMANAGER_OLD_DATE="Old Date"
|
||||
COM_SPORTSMANAGER_NEW_DATE="New Date"
|
||||
COM_SPORTSMANAGER_REASON_GAME_APPOINTMENT="Appointment reason"
|
||||
COM_SPORTSMANAGER_MATCH_RESCHEDULINGS="Match reschedulings"
|
||||
COM_SPORTSMANAGER_MATCH_RESCHEDULING="Match rescheduling"
|
||||
COM_SPORTSMANAGER_MATCH_SWAPPING_HELP="If home advantage is swapped, enter the same date"
|
||||
COM_SPORTSMANAGER_NOT_VALID_TIME="Not valid time"
|
||||
COM_SPORTSMANAGER_REALLY_MATCH_RESCHEDULING="Do you really want to remove this match rescheduling?"
|
||||
COM_SPORTSMANAGER_REST_DAYS="Rest days"
|
||||
COM_SPORTSMANAGER_TRAINING_DAYS="Training days"
|
||||
COM_SPORTSMANAGER_NOT_ACTUALIZED_DATA="Data not updated"
|
||||
COM_SPORTSMANAGER_ASSOCIATION_BODIES="Association bodies"
|
||||
COM_SPORTSMANAGER_ASSOCIATION_BODY="Association body"
|
||||
COM_SPORTSMANAGER_ADD_ASSOCIATION_BODY="Add association body"
|
||||
COM_SPORTSMANAGER_REALLY_REMOVE_ASSOCIATION_BODY="Do you really want to remove this association body?"
|
||||
COM_SPORTSMANAGER_INVALID_ASSOCIATION_BODY_NAME="Invalid association body name"
|
||||
COM_SPORTSMANAGER_NAME_NOT_COMPLETE="The name is not completely filled in"
|
||||
COM_SPORTSMANAGER_ADDITIONAL_INFO="Additional information"
|
||||
COM_SPORTSMANAGER_USE_HTML="HTML-formatted text should be used here."
|
||||
COM_SPORTSMANAGER_REALLY_REMOVE_ASSOCIATION_BODY_MEMBER="Do you really want to remove this association body member?"
|
||||
COM_SPORTSMANAGER_HELP_EDIT_ASSOCIATION_BODY_MEMBER="Selecting a name from the player list will fill in the first and last name.<br>Phone, mobile, and email are filled from the player list if left blank here."
|
||||
COM_SPORTSMANAGER_HALL_OF_FAME="Hall of Fame"
|
||||
COM_SPORTSMANAGER_ADD_HALL_OF_FAME="Add Hall of Fame"
|
||||
COM_SPORTSMANAGER_INVALID_HALL_OF_FAME_NAME="Invalid Hall of Fame name"
|
||||
COM_SPORTSMANAGER_REALLY_REMOVE_HALL_OF_FAME="Are you sure you want to delete this Hall of Fame including all its members?"
|
||||
COM_SPORTSMANAGER_MATCH_TYPE="Game Type"
|
||||
COM_SPORTSMANAGER_REALLY_REMOVE_HALL_OF_FAME_YEAR="Are you sure you want to delete this Hall of Fame year?"
|
||||
COM_SPORTSMANAGER_YEARS="Years"
|
||||
COM_SPORTSMANAGER_ADD_HALL_OF_FAME_YEAR="Add Hall of Fame Year"
|
||||
COM_SPORTSMANAGER_NO_ENTRY="no entry"
|
||||
COM_SPORTSMANAGER_REALLY_SWAP_MATCH="Do you really want to swap the home advantage?"
|
||||
COM_SPORTSMANAGER_SWAP_MATCH="Swap home advantage"
|
||||
COM_SPORTSMANAGER_REALLY_DELETE_MATCH_REPORT="The match report and all its history will be deleted. Are you sure you want to delete the match report?"
|
||||
COM_SPORTSMANAGER_MATCH_REPORT_DELETED="Match report deleted"
|
||||
COM_SPORTSMANAGER_MATCH_REPORT_WAS_DELETED="The match report has been successfully deleted!"
|
||||
COM_SPORTSMANAGER_MATCH_REPORT_CORRECTED="Match report corrected"
|
||||
COM_SPORTSMANAGER_MIN_MATCHES="Min count matches"
|
||||
COM_SPORTSMANAGER_SELECT_ALL="All"
|
||||
+267
-14
@@ -137,6 +137,8 @@ return new class () implements InstallerScriptInterface
|
||||
. "\n `tisch` tinytext DEFAULT NULL,"
|
||||
. "\n `zeitpunkt` datetime DEFAULT NULL,"
|
||||
. "\n `spieltag` smallint(6) DEFAULT NULL,"
|
||||
. "\n `spieltag_titel` VARCHAR(32) NOT NULL DEFAULT '',"
|
||||
. "\n `spiel_nr` tinyint(4) DEFAULT NULL,"
|
||||
. "\n `heim_punkte` smallint(6) DEFAULT NULL,"
|
||||
. "\n `gast_punkte` smallint(6) DEFAULT NULL,"
|
||||
. "\n `heim_spielpunkte` smallint(6) DEFAULT NULL,"
|
||||
@@ -524,6 +526,7 @@ return new class () implements InstallerScriptInterface
|
||||
. "\n `bestenliste_id` int(11) NOT NULL DEFAULT '0',"
|
||||
. "\n `spieler_id` int(11) NOT NULL DEFAULT '0',"
|
||||
. "\n `spieler_2_id` int(11) DEFAULT NULL,"
|
||||
. "\n `team_id` INT(11) DEFAULT NULL,"
|
||||
. "\n `siege` smallint(6) DEFAULT NULL,"
|
||||
. "\n `unentschieden` smallint(6) DEFAULT NULL,"
|
||||
. "\n `niederlagen` smallint(6) DEFAULT NULL,"
|
||||
@@ -668,6 +671,9 @@ return new class () implements InstallerScriptInterface
|
||||
. "\n `ortsname` varchar(30) DEFAULT NULL,"
|
||||
. "\n `ortsteil` varchar(30) DEFAULT NULL,"
|
||||
. "\n `url` varchar(150) DEFAULT NULL,"
|
||||
. "\n `telefon` varchar(64) DEFAULT NULL,"
|
||||
. "\n `email` varchar(64) DEFAULT NULL,"
|
||||
. "\n `ruhetage` varchar(64) DEFAULT NULL,"
|
||||
. "\n `beschreibung` varchar(500) DEFAULT NULL,"
|
||||
. "\n `status` tinyint(1) NOT NULL DEFAULT '0',"
|
||||
. "\n PRIMARY KEY (`spielort_id`)"
|
||||
@@ -680,7 +686,9 @@ return new class () implements InstallerScriptInterface
|
||||
. "\n `teamgruppe_id` int(11) DEFAULT NULL,"
|
||||
. "\n `verein_id` int(11) DEFAULT NULL,"
|
||||
. "\n `veranstaltung_id` int(11) NOT NULL DEFAULT '0',"
|
||||
. "\n `teamname` varchar(50) NOT NULL,"
|
||||
. "\n `setzliste_nr` tinyint(4) DEFAULT NULL,"
|
||||
. "\n `teamname` varchar(50) NOT NULL DEFAULT '',"
|
||||
. "\n `teamname_kurz` VARCHAR(24) NOT NULL DEFAULT '',"
|
||||
. "\n `tischtyp` varchar(200) DEFAULT NULL,"
|
||||
. "\n `tischeigenschaften` varchar(200) DEFAULT NULL,"
|
||||
. "\n `zusatzpunkte` float(6,2) DEFAULT NULL,"
|
||||
@@ -688,6 +696,7 @@ return new class () implements InstallerScriptInterface
|
||||
. "\n `heimspiel_wochentag` tinyint(4) DEFAULT NULL,"
|
||||
. "\n `heimspiel_uhrzeit` smallint(6) DEFAULT NULL,"
|
||||
. "\n `heimspielort_id` int(11) DEFAULT NULL,"
|
||||
. "\n `trainingstage` varchar(64) DEFAULT NULL,"
|
||||
. "\n `nichtraucherschutz` tinyint(4) DEFAULT '0',"
|
||||
. "\n `platz` smallint(6) DEFAULT NULL,"
|
||||
. "\n `gesamtpunkte` float(6,2) DEFAULT NULL,"
|
||||
@@ -714,6 +723,18 @@ return new class () implements InstallerScriptInterface
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "CREATE TABLE IF NOT EXISTS `#__sportsmanager_team_strafen` ("
|
||||
. "\n `team_strafen_id` int(11) NOT NULL AUTO_INCREMENT,"
|
||||
. "\n `zeitpunkt` datetime NOT NULL,"
|
||||
. "\n `moderator_user_id` int(11) DEFAULT NULL,"
|
||||
. "\n `team_id` int(11) NOT NULL DEFAULT '0',"
|
||||
. "\n `strafe` float(6,2) NOT NULL DEFAULT '0',"
|
||||
. "\n `beschreibung` text NOT NULL,"
|
||||
. "\n PRIMARY KEY (`team_strafen_id`)"
|
||||
. "\n) ENGINE=MyISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "CREATE TABLE IF NOT EXISTS `#__sportsmanager_teamansprechpartner` ("
|
||||
. "\n `kontaktperson_id` int(11) NOT NULL AUTO_INCREMENT,"
|
||||
. "\n `team_id` int(11) NOT NULL DEFAULT '0',"
|
||||
@@ -769,6 +790,7 @@ return new class () implements InstallerScriptInterface
|
||||
. "\n `spielpunkte_bedingung` tinyint(4) NOT NULL DEFAULT '0',"
|
||||
. "\n `spielernamen` tinyint(4) NOT NULL DEFAULT '0',"
|
||||
. "\n `heimtausch` tinyint(4) NOT NULL DEFAULT '0',"
|
||||
. "\n `spiele_in_spielerstatistik` tinyint(4) NOT NULL DEFAULT '0',"
|
||||
. "\n `modus` varchar(200) NOT NULL DEFAULT '',"
|
||||
. "\n `status` tinyint(4) NOT NULL DEFAULT '0',"
|
||||
. "\n PRIMARY KEY (`teamspiel_modus_id`)"
|
||||
@@ -901,6 +923,7 @@ return new class () implements InstallerScriptInterface
|
||||
. "\n `erster_tag` date NOT NULL DEFAULT '0000-00-00',"
|
||||
. "\n `letzter_tag` date DEFAULT NULL,"
|
||||
. "\n `kategorie` tinyint(4) DEFAULT '1',"
|
||||
. "\n `reminder_count` tinyint DEFAULT '0',"
|
||||
. "\n PRIMARY KEY (`turnier_id`),"
|
||||
. "\n KEY `saison_id` (`saison_id`),"
|
||||
. "\n KEY `veranstalter_id` (`veranstalter_id`)"
|
||||
@@ -1001,7 +1024,7 @@ return new class () implements InstallerScriptInterface
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "CREATE TABLE IF NOT EXISTS `#__sportsmanager_unbestaetigtes_ergebnis` ("
|
||||
$query = "CREATE TABLE IF NOT EXISTS `#__sportsmanager_unbestaetigtes_ergebnis` ("
|
||||
. "\n `unbestaetigtes_ergebnis_id` int(11) NOT NULL AUTO_INCREMENT,"
|
||||
. "\n `begegnung_id` int(11) NOT NULL DEFAULT '0',"
|
||||
. "\n `vorschlagendes_team_id` int(11) NOT NULL DEFAULT '0',"
|
||||
@@ -1009,7 +1032,7 @@ return new class () implements InstallerScriptInterface
|
||||
. "\n `kommentar` varchar(255) DEFAULT NULL,"
|
||||
. "\n `vorgeschlagen` datetime DEFAULT NULL,"
|
||||
. "\n PRIMARY KEY (`unbestaetigtes_ergebnis_id`),"
|
||||
. "\n KEY `begegnung_id` (`begegnung_id`),"
|
||||
. "\n UNIQUE KEY `begegnung_id` (`begegnung_id`),"
|
||||
. "\n KEY `vorschlagendes_team_id` (`vorschlagendes_team_id`)"
|
||||
. "\n) ENGINE=MyISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;";
|
||||
$db->setQuery( $query );
|
||||
@@ -1030,15 +1053,19 @@ return new class () implements InstallerScriptInterface
|
||||
. "\n `saison_id` int(11) NOT NULL DEFAULT '0',"
|
||||
. "\n `veranstalter_id` int(11) NOT NULL DEFAULT '0',"
|
||||
. "\n `bezeichnung` varchar(50) DEFAULT NULL,"
|
||||
. "\n `regelwerke_id` INT(11) NOT NULL DEFAULT '0',"
|
||||
. "\n `modus_id` int(11) NOT NULL DEFAULT '0',"
|
||||
. "\n `verschieberegel_id` int(11) NOT NULL DEFAULT '0',"
|
||||
. "\n `tabellenwertung` tinyint(4) NOT NULL DEFAULT '0',"
|
||||
. "\n `direktervergleich` tinyint(4) NOT NULL DEFAULT '0',"
|
||||
. "\n `unterteilung` tinyint(4) NOT NULL DEFAULT '0',"
|
||||
. "\n `spieltag_titel_zeigen` INT(4) NOT NULL DEFAULT '0',"
|
||||
. "\n `erster_tag` date NOT NULL DEFAULT '0000-00-00',"
|
||||
. "\n `letzter_tag` date DEFAULT NULL,"
|
||||
. "\n `elo_wertung` tinyint(4) DEFAULT NULL,"
|
||||
. "\n `logo_url` TINYTEXT NOT NULL,"
|
||||
. "\n `ticker_logo_url` TINYTEXT NOT NULL,"
|
||||
. "\n `explizite_strafen` tinyint(4) DEFAULT '0',"
|
||||
. "\n `logo_url` TINYTEXT NOT NULL,"
|
||||
. "\n `ticker_logo_url` TINYTEXT NOT NULL,"
|
||||
. "\n `status` tinyint(4) NOT NULL DEFAULT '0',"
|
||||
. "\n `reihenfolge` tinyint(4) DEFAULT '1',"
|
||||
. "\n `kategorie` tinyint(4) DEFAULT '1',"
|
||||
@@ -1060,6 +1087,7 @@ return new class () implements InstallerScriptInterface
|
||||
. "\n `url` varchar(150) DEFAULT NULL,"
|
||||
. "\n `beschreibung` varchar(500) DEFAULT NULL,"
|
||||
. "\n `ausgetreten` tinyint(1) DEFAULT '0',"
|
||||
. "\n `verstecken` INT(4) NOT NULL DEFAULT '0',"
|
||||
. "\n PRIMARY KEY (`verein_id`),"
|
||||
. "\n KEY `veranstalter_id` (`veranstalter_id`)"
|
||||
. "\n) ENGINE=MyISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;";
|
||||
@@ -1088,16 +1116,19 @@ return new class () implements InstallerScriptInterface
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "CREATE TABLE IF NOT EXISTS `#__sportsmanager_verschieberegel` ("
|
||||
. "\n `verschieberegel_id` int(11) NOT NULL AUTO_INCREMENT,"
|
||||
. "\n `verschieberegel_id` int(11) NOT NULL AUTO_INCREMENT,"
|
||||
. "\n `bezeichnung` varchar(50) NOT NULL DEFAULT '',"
|
||||
. "\n `initial_ohne_termin` tinyint(1) NOT NULL DEFAULT '0',"
|
||||
. "\n `keine_gegenvorschlaege` tinyint(1) NOT NULL DEFAULT '0',"
|
||||
. "\n `initial_ohne_termin` tinyint(1) NOT NULL DEFAULT '0',"
|
||||
. "\n `keine_gegenvorschlaege` tinyint(1) NOT NULL DEFAULT '0',"
|
||||
. "\n `vorlaufzeit_tage` tinyint(4) NOT NULL DEFAULT '0',"
|
||||
. "\n `termine_minimal` tinyint(4) NOT NULL DEFAULT '0',"
|
||||
. "\n `termine_maximal` tinyint(4) NOT NULL DEFAULT '0',"
|
||||
. "\n `ablehnen` tinyint(1) NOT NULL DEFAULT '0',"
|
||||
. "\n PRIMARY KEY (`verschieberegel_id`)"
|
||||
. "\n) ENGINE=MyISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;";
|
||||
. "\n `ablehnen` tinyint(1) NOT NULL DEFAULT '0',"
|
||||
. "\n `begruendung_erforderlich` int(1) NOT NULL DEFAULT 0,"
|
||||
. "\n `vereine_berechtigt` int(1) NOT NULL DEFAULT 1,"
|
||||
. "\n `verband_berechtigt` int(1) NOT NULL DEFAULT 0,"
|
||||
. "\n PRIMARY KEY (`verschieberegel_id`)"
|
||||
. "\n) ENGINE=MyISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
@@ -1110,7 +1141,161 @@ return new class () implements InstallerScriptInterface
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'datenbank_version', wert = '102';";
|
||||
$query = "CREATE TABLE IF NOT EXISTS `#__sportsmanager_regelwerke` ("
|
||||
. "\n `regelwerke_id` int(11) NOT NULL AUTO_INCREMENT,"
|
||||
. "\n `regelwerk` varchar(32) NOT NULL,"
|
||||
. "\n PRIMARY KEY (`regelwerke_id`),"
|
||||
. "\n UNIQUE KEY `regelwerk` (`regelwerk`)"
|
||||
. "\n ) ENGINE=MyISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "CREATE TABLE IF NOT EXISTS `#__sportsmanager_verstoesse` ("
|
||||
. "\n `verstoesse_id` int(11) NOT NULL AUTO_INCREMENT,"
|
||||
. "\n `regelwerke_id` int(11) NOT NULL DEFAULT 0,"
|
||||
. "\n `paragraph_spo` varchar(32) NOT NULL DEFAULT '',"
|
||||
. "\n `paragraph_go` varchar(32) NOT NULL DEFAULT '',"
|
||||
. "\n `verstoss` varchar(64) NOT NULL DEFAULT '',"
|
||||
. "\n `haupttext` text NOT NULL,"
|
||||
. "\n `zusatztext` text NOT NULL,"
|
||||
. "\n `gebuehr` smallint(3) NOT NULL DEFAULT 0,"
|
||||
. "\n `zusatzgebuehr` smallint(2) NOT NULL DEFAULT 0,"
|
||||
. "\n `zur_auswahl` tinyint(1) NOT NULL DEFAULT 1,"
|
||||
. "\n PRIMARY KEY (`verstoesse_id`)"
|
||||
. "\n ) ENGINE=MyISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "CREATE TABLE IF NOT EXISTS `#__sportsmanager_ordnungsstrafen` ("
|
||||
. "\n `ordnungsstrafen_id` int(11) NOT NULL AUTO_INCREMENT,"
|
||||
. "\n `verstoesse_id` int(11) NOT NULL DEFAULT 0,"
|
||||
. "\n `begegnung_id` int(11) NOT NULL DEFAULT 0,"
|
||||
. "\n `team_id` int(11) NOT NULL DEFAULT 0,"
|
||||
. "\n `aussteller_id` int(11) NOT NULL DEFAULT 0,"
|
||||
. "\n `ausstelldatum` datetime NOT NULL DEFAULT current_timestamp(),"
|
||||
. "\n `versender_id` int(11) DEFAULT NULL,"
|
||||
. "\n `versendedatum` datetime DEFAULT NULL,"
|
||||
. "\n `rechnungssteller_id` int(11) DEFAULT NULL,"
|
||||
. "\n `rechnungsdatum` datetime DEFAULT NULL,"
|
||||
. "\n `multiplikator` tinyint(1) NOT NULL DEFAULT 1,"
|
||||
. "\n `weitere_angaben` text NOT NULL,"
|
||||
. "\n PRIMARY KEY (`ordnungsstrafen_id`)"
|
||||
. "\n ) ENGINE=MyISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "CREATE TABLE IF NOT EXISTS `#__sportsmanager_email_vorlagen` ("
|
||||
. "\n `email_vorlagen_id` int(11) NOT NULL AUTO_INCREMENT,"
|
||||
. "\n `vorlage` varchar(64) NOT NULL,"
|
||||
. "\n `betreff` varchar(256) NOT NULL DEFAULT '',"
|
||||
. "\n `von` varchar(64) NOT NULL DEFAULT '',"
|
||||
. "\n `an` varchar(256) NOT NULL DEFAULT '',"
|
||||
. "\n `cc` varchar(256) NOT NULL DEFAULT '',"
|
||||
. "\n `bcc` varchar(256) NOT NULL DEFAULT '',"
|
||||
. "\n `email_text` text NOT NULL,"
|
||||
. "\n PRIMARY KEY (`email_vorlagen_id`),"
|
||||
. "\n UNIQUE KEY `vorlage` (`vorlage`)"
|
||||
. "\n ) ENGINE=MyISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "CREATE TABLE IF NOT EXISTS `#__sportsmanager_verbandsorgane` ("
|
||||
. "\n `verbandsorgane_id` int(11) NOT NULL AUTO_INCREMENT,"
|
||||
. "\n `veranstalter_id` int(11) DEFAULT NULL,"
|
||||
. "\n `verbandsorgan` varchar(32) DEFAULT NULL,"
|
||||
. "\n `kategorie` int(4) DEFAULT NULL,"
|
||||
. "\n `reihenfolge` int(4) DEFAULT NULL,"
|
||||
. "\n `email` varchar(64) DEFAULT NULL,"
|
||||
. "\n `beschreibung` text NOT NULL,"
|
||||
. "\n PRIMARY KEY (`verbandsorgane_id`),"
|
||||
. "\n KEY (`veranstalter_id`)"
|
||||
. "\n ) ENGINE=MyISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "CREATE TABLE IF NOT EXISTS `#__sportsmanager_mitglied_von_verbandsorgan` ("
|
||||
. "\n `mitglied_von_verbandsorgan_id` int(11) NOT NULL AUTO_INCREMENT,"
|
||||
. "\n `verbandsorgane_id` int(11) DEFAULT NULL,"
|
||||
. "\n `funktion` varchar(32) DEFAULT NULL,"
|
||||
. "\n `zusatzinfo` varchar(64) DEFAULT NULL,"
|
||||
. "\n `spieler_id` int(11) DEFAULT NULL,"
|
||||
. "\n `nachname` varchar(32) DEFAULT NULL,"
|
||||
. "\n `vorname` varchar(32) DEFAULT NULL,"
|
||||
. "\n `email` varchar(64) DEFAULT NULL,"
|
||||
. "\n `telefon` varchar(32) DEFAULT NULL,"
|
||||
. "\n `mobil` varchar(32) DEFAULT NULL,"
|
||||
. "\n `reihenfolge` int(11) DEFAULT NULL,"
|
||||
. "\n PRIMARY KEY (`mitglied_von_verbandsorgan_id`),"
|
||||
. "\n KEY (`verbandsorgane_id`),"
|
||||
. "\n KEY (`spieler_id`)"
|
||||
. "\n ) ENGINE=MyISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "CREATE TABLE IF NOT EXISTS `#__sportsmanager_halloffame` ("
|
||||
. "\n `halloffame_id` int(11) NOT NULL AUTO_INCREMENT,"
|
||||
. "\n `veranstalter_id` int(11) DEFAULT NULL,"
|
||||
. "\n `halloffame` varchar(64) DEFAULT NULL,"
|
||||
. "\n `kategorie` int(4) DEFAULT NULL,"
|
||||
. "\n `spielform` int(11) DEFAULT NULL,"
|
||||
. "\n `reihenfolge` int(4) DEFAULT NULL,"
|
||||
. "\n PRIMARY KEY (`halloffame_id`),"
|
||||
. "\n KEY `veranstalter_id` (`veranstalter_id`)"
|
||||
. "\n ) ENGINE=MyISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
|
||||
$query = "CREATE TABLE IF NOT EXISTS `#__sportsmanager_mitglied_von_halloffame` ("
|
||||
. "\n `mitglied_halloffame_id` int(11) NOT NULL AUTO_INCREMENT,"
|
||||
. "\n `halloffame_id` int(11) NOT NULL,"
|
||||
. "\n `jahr` int(4) DEFAULT NULL,"
|
||||
. "\n `platz` int(11) DEFAULT NULL,"
|
||||
. "\n `verein_id` int(11) DEFAULT NULL,"
|
||||
. "\n `teamname` varchar(64) DEFAULT NULL,"
|
||||
. "\n `spieler1_id` int(11) DEFAULT NULL,"
|
||||
. "\n `spieler1` varchar(64) DEFAULT NULL,"
|
||||
. "\n `spieler2_id` int(11) DEFAULT NULL,"
|
||||
. "\n `spieler2` varchar(64) DEFAULT NULL,"
|
||||
. "\n PRIMARY KEY (`mitglied_halloffame_id`),"
|
||||
. "\n UNIQUE KEY `halloffame_jahr_platz` (`halloffame_id`,`jahr`,`platz`),"
|
||||
. "\n KEY `halloffame_id` (`halloffame_id`),"
|
||||
. "\n KEY `verein_id` (`verein_id`),"
|
||||
. "\n KEY `spieler1_id` (`spieler1_id`),"
|
||||
. "\n KEY `spieler2_id` (`spieler2_id`)"
|
||||
. "\n ) ENGINE=MyISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) {
|
||||
die($db->stderr(true));
|
||||
}
|
||||
|
||||
$query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'verbands_kuerzel', wert = 'tbe.';";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'datenbank_version', wert = '121';";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "CREATE TABLE IF NOT EXISTS `#__sportsmanager_sync_log` ("
|
||||
. "\n `sync_id` INT(11) NOT NULL AUTO_INCREMENT,"
|
||||
. "\n `sync_timestamp` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,"
|
||||
. "\n `sync_direction` ENUM('push', 'receive') NOT NULL,"
|
||||
. "\n `sync_trigger` ENUM('manual', 'cron', 'api') NOT NULL,"
|
||||
. "\n `sync_status` ENUM('success', 'error') NOT NULL,"
|
||||
. "\n `spieler_count` INT(11) DEFAULT 0,"
|
||||
. "\n `spieler_updated` INT(11) DEFAULT 0,"
|
||||
. "\n `spieler_added` INT(11) DEFAULT 0,"
|
||||
. "\n `message` TEXT,"
|
||||
. "\n `details` TEXT,"
|
||||
. "\n PRIMARY KEY (`sync_id`),"
|
||||
. "\n INDEX `idx_timestamp` (`sync_timestamp`)"
|
||||
. "\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'dtfb_sync_url', wert = '';";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
@@ -1118,11 +1303,11 @@ return new class () implements InstallerScriptInterface
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'spielerliste_elo', wert = '0';";
|
||||
$query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'spielerliste_elo', wert = '0';";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'ansprechpartner_ausblenden', wert = '0';";
|
||||
$query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'ansprechpartner_ausblenden', wert = '0';";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
@@ -1130,11 +1315,43 @@ return new class () implements InstallerScriptInterface
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'anzahl_mitglieder_zeigen', wert = '0';";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'verband_anzeigen', wert = '1';";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'turnierbaum_zeigen', wert = '0';";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'ordnungsstrafen_verwenden', wert = '0';";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'spalte_mitglieder_zeigen', wert = '1';";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'enable_email_reminders', wert = '0';";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "INSERT INTO #__sportsmanager_verschieberegel (bezeichnung, initial_ohne_termin, keine_gegenvorschlaege, vorlaufzeit_tage, termine_minimal, termine_maximal, ablehnen)"
|
||||
. "\n VALUES ('Beliebig', '0', '0', '0', '1', '3', '0');";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "INSERT IGNORE INTO `#__sportsmanager_email_vorlagen` (`email_vorlagen_id`, `vorlage`) VALUES (NULL, 'Ordnungsstrafe');";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "INSERT IGNORE INTO `#__sportsmanager_email_vorlagen` (`email_vorlagen_id`, `vorlage`) VALUES (NULL, 'Spielverlegung');";
|
||||
$db->setQuery($query);
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "INSERT #__sportsmanager_rangliste_system"
|
||||
. "\n SET systembezeichnung = 'Klostermann/Wahle (1 Punkt für letzten Platz)',"
|
||||
. "\n status = '1',"
|
||||
@@ -1567,6 +1784,10 @@ return new class () implements InstallerScriptInterface
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "DROP TABLE IF EXISTS `#__sportsmanager_team_strafen`;";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "DROP TABLE IF EXISTS `#__sportsmanager_turnier`;";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
@@ -1622,5 +1843,37 @@ return new class () implements InstallerScriptInterface
|
||||
$query = "DROP TABLE IF EXISTS `#__sportsmanager_verteiler`;";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "DROP TABLE IF EXISTS `#__sportsmanager_regelwerke`;";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "DROP TABLE IF EXISTS `#__sportsmanager_verstoesse`;";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "DROP TABLE IF EXISTS `#__sportsmanager_ordnungsstrafen`;";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "DROP TABLE IF EXISTS `#__sportsmanager_email_vorlagen`;";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "DROP TABLE IF EXISTS `#__sportsmanager_verbandsorgane`;";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "DROP TABLE IF EXISTS `#__sportsmanager_mitglied_von_verbandsorgan`;";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "DROP TABLE IF EXISTS `#__sportsmanager_halloffame`;";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
|
||||
$query = "DROP TABLE IF EXISTS `#__sportsmanager_mitglied_von_halloffame`;";
|
||||
$db->setQuery( $query );
|
||||
if (!$db->execute()) { die($db->stderr(true)); }
|
||||
}
|
||||
};
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<authorEmail>it@dtfb.de</authorEmail>
|
||||
<copyright>All rights reserved</copyright>
|
||||
<license>GNU/GPL</license>
|
||||
<version>2.0.0</version>
|
||||
<version>DEV</version>
|
||||
<description>Verwaltung von Spielern und Vereinen in Mannschafts- und Individualwettbewerben</description>
|
||||
<namespace path="src">Dtfb\Component\com_sportsmanager</namespace>
|
||||
<files folder="site">
|
||||
@@ -37,6 +37,7 @@
|
||||
<files folder="admin">
|
||||
<filename>access.xml</filename>
|
||||
<filename>index.html</filename>
|
||||
<filename>RELEASE_NOTES.md</filename>
|
||||
<folder>services</folder>
|
||||
<folder>src</folder>
|
||||
<folder>tmpl</folder>
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
# DTFB Player Sync — QA findings & applied fixes
|
||||
|
||||
Concise record of the defects found while reviewing the player-sync receiver
|
||||
(`syncReceiveSpielerImport()` in `sync.php`) and the six fixes applied in this PR.
|
||||
The exploratory test harness used to find these has been removed — the
|
||||
authoritative next test is the **staging end-to-end sync** (see the PR description).
|
||||
|
||||
## The six issues fixed
|
||||
|
||||
| # | Issue | Impact | Fix in `sync.php` |
|
||||
|---|-------|--------|-------------------|
|
||||
| 1 | **Receiver did not normalise input encoding.** A latin1 / Windows-1252 CSV (the legacy manual export) has `ß` as the single byte `0xDF`. Staging the org name into the utf8mb4 table truncated it at that byte, so the org lookup missed and **every row was skipped**. | Critical — silent data loss (e.g. 2964 rows parsed, 0 imported, `success=true`). | Transcode the payload to UTF-8 when it is not already valid UTF-8, before staging. |
|
||||
| 2 | **A zero-effect import reported success.** When N rows parsed but nothing was added or updated, the function returned `success=true`. | Critical — masks encoding/mapping failures. | Return `success=false` with a diagnostic message when `rows>0` but `added==0 && updated==0`. |
|
||||
| 3 | **Dead `$naechste_spielernr` block** referenced an undefined variable in the insert branch. | Runtime notice; incoming rows already carry their Passnummer. | Removed the block. |
|
||||
| 4 | **Unconditional mass-deactivation.** A partial CSV deactivated every member not listed. | High — a broken/partial export could wipe an org's roster. | Per organisation, skip the deactivation sweep when the incoming count is below `sync_deactivation_min_ratio` (default 0.5) of the org's currently-active members; adds/updates still proceed and a warning is returned. |
|
||||
| 5 | **Split clock for staging.** `session_id` came from PHP `date()` while stale-row cleanup used MySQL `NOW()`; a PHP/MySQL timezone gap could delete in-flight staging rows. | Medium — another silent 0-row path. | Derive `session_id` from the DB clock (`NOW()`), with `date()` fallback. |
|
||||
| 6 | **No Passnummer format check.** The manual import UI enforces `^[0-9]{2}-[0-9]{4,6}$`; the sync receiver did not. | Medium — inconsistent data quality vs the manual flow. | Apply the same regex to `spielernr` / `spielernr_alt` (blank/reject on mismatch). |
|
||||
|
||||
## Confirmed by design (not bugs)
|
||||
- **No contact / personal data** (email, phone, address) is ever exported or imported.
|
||||
- Existing players keep their `lizenznr` and `geburtsjahr` on update; only name / sex / Passnummer-driven fields change.
|
||||
- An unknown organisation aborts the whole import with no mutation.
|
||||
- The sync path itself (export → cURL push → receive) is UTF-8 end-to-end; the encoding defect (#1) only affected ingesting a legacy latin1 *manual* file.
|
||||
Reference in New Issue
Block a user