diff --git a/.docs/instalace.md b/.docs/instalace.md index ad6bde6a3..4e73c06d6 100644 --- a/.docs/instalace.md +++ b/.docs/instalace.md @@ -1,7 +1,7 @@ # Instalace pro lokální vývoj Aplikace vyžaduje: -- PHP 8.1 +- PHP 8.2 - MySQL 8 - Apache - Composer diff --git a/.env.local b/.env.local index a6a34a355..ce98220db 100644 --- a/.env.local +++ b/.env.local @@ -3,4 +3,4 @@ DB_USER=hskauting DB_PASSWORD=hskauting DB_NAME=hskauting DEVELOPMENT_MACHINE=true -COMPOSE_FILE=-f docker/docker-compose.yml +COMPOSE_FILE=-f docker/docker-compose.yml -f docker/docker-compose.local.yml diff --git a/.github/workflows/deploy-template.yml b/.github/workflows/deploy-template.yml new file mode 100644 index 000000000..2b1137f2c --- /dev/null +++ b/.github/workflows/deploy-template.yml @@ -0,0 +1,67 @@ +name: Deploy template + +on: + workflow_call: + inputs: + environment: + required: true + type: string + root_dir: + required: true + type: string + ssh_username: + required: true + type: string + host: + required: true + type: string + port: + required: false + type: string + default: "22" + secrets: + DEPLOY_SSH_KEY: + required: true + CONFIG_DATABASE_PASSWORD: + required: true + CONFIG_GOOGLE_CREDENTIALS: + required: true + CONFIG_APPLICATION_ID: + required: false + CONFIG_SENTRY_DSN: + required: false + +jobs: + deploy: + runs-on: ubuntu-22.04 + container: + image: webwingscz/lebeda-deployer-php82 + steps: + - name: Download workdir + uses: actions/download-artifact@v4 + with: + name: workdir + path: . + - name: Extract workdir + run: tar -xzpf workdir.tar.gz + - name: Run deploy + run: | + mkdir -p ~/.ssh && chmod 700 ~/.ssh + eval $(ssh-agent -s) + echo "$PRIVATE_KEY" | tr -d '\r' | ssh-add - + dep deploy:ssh_warmup ${{ inputs.environment }} -f /app/deploy.php -vvv + echo "Waiting for container to initialize..." + sleep 10 + dep deploy ${{ inputs.environment }} -f /app/deploy.php -vvv + env: + PRIVATE_KEY: ${{ secrets.DEPLOY_SSH_KEY }} + ENVIRONMENT: ${{ inputs.environment }} + ROOT_DIR: ${{ inputs.root_dir }} + SSH_USERNAME: ${{ inputs.ssh_username }} + HOST: ${{ inputs.host }} + PORT: ${{ inputs.port }} + CONFIG_APPLICATION_ID: ${{ secrets.CONFIG_APPLICATION_ID }} + CONFIG_DATABASE_PASSWORD: ${{ secrets.CONFIG_DATABASE_PASSWORD }} + CONFIG_GOOGLE_CREDENTIALS: ${{ secrets.CONFIG_GOOGLE_CREDENTIALS }} + CONFIG_SENTRY_DSN: ${{ secrets.CONFIG_SENTRY_DSN }} + GITHUB_SHA: ${{ github.sha }} diff --git a/.github/workflows/known_hosts b/.github/workflows/known_hosts deleted file mode 100644 index 76d6a8881..000000000 --- a/.github/workflows/known_hosts +++ /dev/null @@ -1 +0,0 @@ -[www.skauting.cz]:28,[81.31.46.138]:28 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBAOZOfqGjnKa6YPCKSoYNSKdxrdqmIF7QjAq3ETFl2m9fPjaF5EEfYttblYt45hSBwF7Mj91WlNQo6tQc7cd4LQ= diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 755f284c6..e958533bd 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,380 +1,367 @@ name: main on: - push: - branches: - - master - - beta - pull_request: + push: + branches: + - master + - 'beta/**' + pull_request: jobs: - workdir: - name: "Prepare working directory" - runs-on: ubuntu-22.04 - container: - image: skaut/lebeda:8.1 - steps: - - uses: actions/checkout@v4 - # Copy & paste from https://github.com/actions/cache/blob/master/examples.md#php---composer - - name: Get Composer Cache Directory - id: composer-cache - run: | - echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT - - uses: actions/cache@v4 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} - restore-keys: | - ${{ runner.os }}-composer- - - run: composer install - - name: Fix permissions - run: chown 1000:1000 . -R && chmod 777 . -R - - name: Create tarball - run: tar -czpf /tmp/workdir.tar.gz . && mv /tmp/workdir.tar.gz . - - name: Upload workdir - uses: actions/upload-artifact@v4 - with: - name: workdir - path: workdir.tar.gz + workdir: + name: Prepare working directory + runs-on: ubuntu-22.04 + container: + image: skaut/lebeda:8.2-ci + env: + COMPOSER_ALLOW_SUPERUSER: "1" # composer jako root bez varování + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 1 - tests-unit: - name: "Run unit tests" - runs-on: ubuntu-22.04 - container: - image: skaut/lebeda:8.1 - needs: workdir - steps: - - name: Download workdir - uses: actions/download-artifact@v4 - with: - name: workdir - path: . - - name: Extract workdir - run: tar -xzpf workdir.tar.gz - - run: phing tests-unit + # Composer cache + - name: Get Composer cache dir + id: composer-cache + run: echo "dir=$(composer config cache-files-dir)" >> "$GITHUB_OUTPUT" - tests-integration: - name: "Run integration tests" - runs-on: ubuntu-22.04 - needs: workdir - steps: - - name: Download workdir - uses: actions/download-artifact@v4 - with: - name: workdir - path: . - - name: Extract workdir - run: tar -xzpf workdir.tar.gz - - name: Start application containers - run: docker compose -f docker/docker-compose.yml run -T php-test phing tests-integration + - name: Cache Composer + uses: actions/cache@v4 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }} + restore-keys: | + ${{ runner.os }}-php- - collect-code-coverage: - name: "Collect code coverage" - if: github.ref == 'refs/heads/master' - runs-on: ubuntu-22.04 - needs: workdir - steps: - - name: Download workdir - uses: actions/download-artifact@v4 - with: - name: workdir - path: . - - name: Extract workdir - run: tar -xzpf workdir.tar.gz - - name: Run tests with coverage - run: docker compose -f docker/docker-compose.yml run -T php-test phing tests-with-coverage - - name: Upload code coverage - uses: codecov/codecov-action@v4 - with: - token: ${{ secrets.CODECOV_TOKEN }} - file: tests/_output/coverage.xml - fail_ci_if_error: true + - name: Install Composer deps + run: composer install --no-interaction --prefer-dist --no-progress - tests-acceptance: - name: "Run acceptance tests" - runs-on: self-hosted - needs: workdir - steps: - - name: Download workdir - uses: actions/download-artifact@v4 - with: - name: workdir - path: . - - name: Extract workdir - run: tar -xzpf workdir.tar.gz - - name: Append to .env file - run: echo -e "\nHEADLESS='--headless'" >> .env.test - - name: Init app - run: docker compose -f docker/docker-compose.yml run -T php-test phing app-init - - name: Start selenium container - run: docker compose -f docker/docker-compose.yml up -d selenium nginx - - run: mv app/config/config.ci.local.neon app/config/config.local.neon - - name: Run acceptance tests - run: docker compose -f docker/docker-compose.yml run -T php-test phing tests-acceptance - - uses: actions/upload-artifact@v4 - if: failure() - with: - name: error-output - path: tests/_output + # Node/Yarn + cache (vestavěné v setup-node) + - name: Setup Node.js (+ Yarn cache) + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'yarn' + cache-dependency-path: '**/yarn.lock' - static-analysis: - name: "Run PHPStan analysis" - runs-on: ubuntu-22.04 - env: - DB_HOST: mysql-test - DB_USER: hskauting - DB_PASSWORD: hskauting - DB_NAME: hskauting - DB_TEST: true - container: - image: skaut/lebeda:8.1 - needs: workdir - steps: - - name: Download workdir - uses: actions/download-artifact@v4 - with: - name: workdir - path: . - - name: Extract workdir - run: tar -xzpf workdir.tar.gz - - name: Generate Codeception helper code - run: vendor/bin/codecept build - - run: phing static-analysis + - name: Install JS deps + run: yarn install --frozen-lockfile + - name: Build production assets + run: yarn build-production - coding-standard: - name: "Check coding standard" - runs-on: ubuntu-22.04 - container: - image: skaut/lebeda:8.1 - needs: workdir - steps: - - name: Download workdir - uses: actions/download-artifact@v4 - with: - name: workdir - path: . - - name: Extract workdir - run: tar -xzpf workdir.tar.gz - - run: phing coding-standard-ci - latte-lint: - name: "Lint Latte templates" - runs-on: ubuntu-22.04 - container: - image: skaut/lebeda:8.1 - needs: workdir - env: - DEVELOPMENT_MACHINE: true - steps: - - name: Download workdir - uses: actions/download-artifact@v4 - with: - name: workdir - path: . - - name: Extract workdir - run: tar -xzf workdir.tar.gz - - run: mv app/config/config.ci.local.neon app/config/config.local.neon - - run: vendor/bin/latte-lint app + # menší artefakt (bez .git) + - name: Create tarball + run: | + tar -C $GITHUB_WORKSPACE \ + --exclude-vcs \ + --exclude='.github' \ + --exclude='workdir.tar.gz' \ + --warning=no-file-changed \ + --ignore-failed-read \ + -czpf /tmp/workdir.tar.gz . + mv /tmp/workdir.tar.gz $GITHUB_WORKSPACE/ - validate-mapping: - name: "Validate mapping against migrations" - runs-on: ubuntu-22.04 - container: - image: skaut/lebeda:8.1 - needs: workdir - services: - mysql-test: - image: mysql:5.7 - env: - MYSQL_ROOT_PASSWORD: 'root' - MYSQL_DATABASE: hskauting - options: --health-cmd="mysqladmin ping" --health-interval=5s --health-timeout=2s --health-retries=3 - env: - DEVELOPMENT_MACHINE: true - steps: - - name: Download workdir - uses: actions/download-artifact@v4 - with: - name: workdir - path: . - - name: Extract workdir - run: tar -xzf workdir.tar.gz - - run: mv app/config/config.ci.local.neon app/config/config.local.neon - - run: bin/console migrations:migrate --no-interaction - - run: "! bin/console migrations:diff && bin/console migrations:diff --allow-empty-diff" - - uses: actions/upload-artifact@v4 - if: failure() - with: - name: migrations - path: migrations + - name: Upload workdir + uses: actions/upload-artifact@v4 + with: + name: workdir + path: workdir.tar.gz + if-no-files-found: error + retention-days: 7 + + tests-unit: + name: "Run unit tests" + runs-on: ubuntu-22.04 + container: + image: skaut/lebeda:8.2 + needs: workdir + steps: + - name: Download workdir + uses: actions/download-artifact@v4 + with: + name: workdir + path: . + - name: Extract workdir + run: tar -xzpf workdir.tar.gz + - name: Run unit tests + run: composer tests:unit + + tests-integration: + name: "Run integration tests" + runs-on: ubuntu-22.04 + needs: workdir + steps: + - name: Download workdir + uses: actions/download-artifact@v4 + with: + name: workdir + path: . + - name: Extract workdir + run: tar -xzpf workdir.tar.gz + - name: Start application containers + run: docker compose -f docker/docker-compose.yml run -T php-test composer tests:integration - checks-passed: - name: "Wait for all checks" - needs: - - tests-unit - - tests-integration - - tests-acceptance - - coding-standard - - static-analysis - - latte-lint - - validate-mapping - runs-on: ubuntu-22.04 - container: - image: skaut/lebeda:8.1-ci - steps: - - run: true + collect-code-coverage: + name: "Collect code coverage" + if: github.ref == 'refs/heads/master' + runs-on: ubuntu-22.04 + needs: workdir + steps: + - name: Download workdir + uses: actions/download-artifact@v4 + with: + name: workdir + path: . + - name: Extract workdir + run: tar -xzpf workdir.tar.gz + - name: Run tests with coverage + run: docker compose -f docker/docker-compose.yml run -T php-test composer tests-with-coverage + - name: Upload code coverage + uses: codecov/codecov-action@v4 + with: + token: ${{ secrets.CODECOV_TOKEN }} + file: tests/_output/coverage.xml + fail_ci_if_error: true - deploy-beta: - name: "Deploy to beta-h.skauting.cz" - if: github.ref == 'refs/heads/beta' - needs: [checks-passed] - runs-on: ubuntu-22.04 - container: - image: skaut/lebeda:8.1-ci - steps: - - name: Debug branch - run: | - echo "Current ref: $GITHUB_REF" - - name: Download workdir - uses: actions/download-artifact@v4 - with: - name: workdir - path: . - - name: Extract workdir - run: tar -xzpf workdir.tar.gz - - name: Setup SSH authentication - run: .github/workflows/setup_ssh.sh "$DEPLOY_SSH_KEY" "$SSH_KEY_FILE" - env: - DEPLOY_SSH_KEY: ${{ secrets.DEPLOY_SSH_KEY }} - SSH_KEY_FILE: /root/.ssh/id_key + tests-acceptance: + name: "Run acceptance tests" + runs-on: self-hosted + needs: workdir + timeout-minutes: 45 + env: + COMPOSE_FILE: docker/docker-compose.yml:docker/docker-compose.ci.yml + COMPOSE_PROJECT_NAME: "acc-${{ github.run_id }}-${{ github.run_attempt }}" + steps: + # --- pre-clean (pro jistotu) + - name: Pre-clean compose project + shell: bash + run: | + docker compose down --remove-orphans -v || true - # Copy & paste from https://github.com/actions/cache/blob/master/examples.md#node---yarn - - name: Get yarn cache - id: yarn-cache - run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT + - name: Clean workspace + shell: bash + run: | + shopt -s dotglob + rm -rf -- * || true + shopt -u dotglob - - uses: actions/cache@v4 - with: - path: ${{ steps.yarn-cache.outputs.dir }} - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-yarn- - - name: Install Node.js - uses: actions/setup-node@v4 - with: - node-version: '20' - - - name: Setup git safe dir - run: git config --global --add safe.directory /__w/${GITHUB_REPOSITORY#*/}/${GITHUB_REPOSITORY#*/} + - name: Download workdir + uses: actions/download-artifact@v4 + with: + name: workdir + path: . + - name: Extract workdir + run: tar -xzpf workdir.tar.gz + - name: Append to .env file + run: echo -e "\nHEADLESS='--headless'" >> .env.test + - name: Fix workspace ownership + run: | + sudo chown -R docker:docker . - - name: Deploy to beta-h.skauting.cz - run: phing deploy - env: - ENVIRONMENT: beta - ROOT_DIR: /home/vu011961 - SSH_USERNAME: vu011961 - SSH_KEY_FILE: /root/.ssh/id_key - CONFIG_APPLICATION_ID: ${{ secrets.CONFIG_BETA_SKAUTIS_APPLICATION_ID }} - CONFIG_DATABASE_PASSWORD: ${{ secrets.CONFIG_BETA_DATABASE_PASSWORD }} - CONFIG_GOOGLE_CREDENTIALS: ${{ secrets.CONFIG_BETA_GOOGLE_CREDENTIALS }} + - name: Build php-test image + run: docker compose -f docker/docker-compose.yml build php-test + - name: Init app + run: docker compose -f docker/docker-compose.yml run -T php-test composer app-init + - name: Start selenium container + run: docker compose -f docker/docker-compose.yml up -d php-test selenium nginx + - run: mv app/config/config.ci.local.neon app/config/config.local.neon + - name: Run acceptance tests + run: docker compose -f docker/docker-compose.yml run -T php-test composer tests:acceptance - deploy-test: - name: "Deploy to test-h.skauting.cz" - if: github.ref == 'refs/heads/master' - needs: [checks-passed] - runs-on: ubuntu-22.04 - container: - image: skaut/lebeda:8.1-ci - steps: - - name: Download workdir - uses: actions/download-artifact@v4 - with: - name: workdir - path: . - - name: Extract workdir - run: tar -xzpf workdir.tar.gz - - name: Setup SSH authentication - run: .github/workflows/setup_ssh.sh "$DEPLOY_SSH_KEY" "$SSH_KEY_FILE" - env: - DEPLOY_SSH_KEY: ${{ secrets.DEPLOY_SSH_KEY }} - SSH_KEY_FILE: /root/.ssh/id_key + # --- sběr výstupů a logů (i při failu) + - name: Pack Codeception output (if present) + if: always() + shell: bash + run: | + if [ -d tests/_output ]; then + tar -czf tests-output.tar.gz -C tests _output + fi - # Copy & paste from https://github.com/actions/cache/blob/master/examples.md#node---yarn - - name: Get yarn cache - id: yarn-cache - run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT + - name: Collect compose logs + if: always() + shell: bash + run: | + mkdir -p artifacts/logs + # Uložit ps + logy pro celý projekt + docker compose ps --all > artifacts/logs/compose-ps.txt || true + docker compose logs --no-color > artifacts/logs/compose-logs.txt || true + tar -czf compose-logs.tar.gz -C artifacts logs || true - - uses: actions/cache@v4 - with: - path: ${{ steps.yarn-cache.outputs.dir }} - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-yarn- - - name: Install Node.js - uses: actions/setup-node@v4 - with: - node-version: '20' + - name: Upload test output artifact + if: always() + uses: actions/upload-artifact@v4 + with: + name: tests-output + path: | + tests-output.tar.gz + if-no-files-found: ignore - - name: Setup git safe dir - run: git config --global --add safe.directory /__w/${GITHUB_REPOSITORY#*/}/${GITHUB_REPOSITORY#*/} + - name: Upload compose logs artifact + if: always() + uses: actions/upload-artifact@v4 + with: + name: compose-logs + path: | + compose-logs.tar.gz + if-no-files-found: ignore - - name: Deploy to test-h.skauting.cz - run: phing deploy - env: - ENVIRONMENT: test - ROOT_DIR: /home/vu009010 - SSH_USERNAME: vu009010 - SSH_KEY_FILE: /root/.ssh/id_key - CONFIG_DATABASE_PASSWORD: ${{ secrets.CONFIG_TEST_DATABASE_PASSWORD }} - CONFIG_GOOGLE_CREDENTIALS: ${{ secrets.CONFIG_TEST_GOOGLE_CREDENTIALS }} + # --- finální úklid (vždy) + - name: Stop & remove compose project + if: always() + run: docker compose down --remove-orphans -v - deploy-production: - name: "Deploy to h.skauting.cz" - if: github.ref == 'refs/heads/master' - needs: [checks-passed] - runs-on: ubuntu-22.04 - container: - image: skaut/lebeda:8.1-ci - steps: - - name: Download workdir - uses: actions/download-artifact@v4 - with: - name: workdir - path: . - - name: Extract workdir - run: tar -xzpf workdir.tar.gz - - name: Setup SSH authentication - run: .github/workflows/setup_ssh.sh "$DEPLOY_SSH_KEY" "$SSH_KEY_FILE" - env: - DEPLOY_SSH_KEY: ${{ secrets.DEPLOY_SSH_KEY }} - SSH_KEY_FILE: /root/.ssh/id_key + static-analysis: + name: "Run PHPStan analysis" + runs-on: ubuntu-22.04 + env: + DB_HOST: mysql-test + DB_USER: hskauting + DB_PASSWORD: hskauting + DB_NAME: hskauting + DB_TEST: true + container: + image: skaut/lebeda:8.2 + needs: workdir + steps: + - name: Download workdir + uses: actions/download-artifact@v4 + with: + name: workdir + path: . + - name: Extract workdir + run: tar -xzpf workdir.tar.gz + - name: Generate Codeception helper code + run: vendor/bin/codecept build + - run: composer static-analysis + + coding-standard: + name: "Check coding standard" + runs-on: ubuntu-22.04 + container: + image: skaut/lebeda:8.2 + needs: workdir + steps: + - name: Download workdir + uses: actions/download-artifact@v4 + with: + name: workdir + path: . + - name: Extract workdir + run: tar -xzpf workdir.tar.gz + - run: composer coding-standard-ci + + latte-lint: + name: "Lint Latte templates" + runs-on: ubuntu-22.04 + container: + image: skaut/lebeda:8.2 + needs: workdir + env: + DEVELOPMENT_MACHINE: true + steps: + - name: Download workdir + uses: actions/download-artifact@v4 + with: + name: workdir + path: . + - name: Extract workdir + run: tar -xzf workdir.tar.gz + - run: mv app/config/config.ci.local.neon app/config/config.local.neon + - run: vendor/bin/latte-lint app + + validate-mapping: + name: "Validate mapping against migrations" + runs-on: ubuntu-22.04 + container: + image: skaut/lebeda:8.2 + needs: workdir + services: + mysql-test: + image: mysql:5.7 + env: + MYSQL_ROOT_PASSWORD: 'root' + MYSQL_DATABASE: hskauting + options: --health-cmd="mysqladmin ping" --health-interval=5s --health-timeout=2s --health-retries=3 + env: + DEVELOPMENT_MACHINE: true + steps: + - name: Download workdir + uses: actions/download-artifact@v4 + with: + name: workdir + path: . + - name: Extract workdir + run: tar -xzf workdir.tar.gz + - run: mv app/config/config.ci.local.neon app/config/config.local.neon + - run: bin/console migrations:migrate --no-interaction + - run: "! bin/console migrations:diff && bin/console migrations:diff --allow-empty-diff" + - uses: actions/upload-artifact@v4 + if: failure() + with: + name: migrations + path: migrations - # Copy & paste from https://github.com/actions/cache/blob/master/examples.md#node---yarn - - name: Get yarn cache - id: yarn-cache - run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT + checks-passed: + name: "Wait for all checks" + needs: + - tests-unit + - tests-integration + - tests-acceptance + - coding-standard + - static-analysis + - latte-lint + - validate-mapping + runs-on: ubuntu-22.04 + container: + image: skaut/lebeda:8.2-ci + steps: + - run: true - - uses: actions/cache@v4 - with: - path: ${{ steps.yarn-cache.outputs.dir }} - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-yarn- - - name: Install Node.js - uses: actions/setup-node@v4 - with: - node-version: '20' + deploy-beta: + if: ${{ startsWith(github.ref_name, 'beta') }} + needs: [checks-passed, workdir] + uses: ./.github/workflows/deploy-template.yml + with: + environment: beta + root_dir: /home/vu011961 + ssh_username: vu011961 + host: www.skauting.cz + port: "11961" + secrets: + DEPLOY_SSH_KEY: ${{ secrets.DEPLOY_SSH_KEY }} + CONFIG_APPLICATION_ID: ${{ secrets.CONFIG_BETA_SKAUTIS_APPLICATION_ID }} + CONFIG_DATABASE_PASSWORD: ${{ secrets.CONFIG_BETA_DATABASE_PASSWORD }} + CONFIG_GOOGLE_CREDENTIALS: ${{ secrets.CONFIG_BETA_GOOGLE_CREDENTIALS }} - - name: Setup git safe dir - run: git config --global --add safe.directory /__w/${GITHUB_REPOSITORY#*/}/${GITHUB_REPOSITORY#*/} + deploy-test: + if: github.ref == 'refs/heads/master' + needs: [checks-passed] + uses: ./.github/workflows/deploy-template.yml + with: + environment: test + root_dir: /home/vu009010 + ssh_username: vu009010 + host: www.skauting.cz + port: "9010" + secrets: + DEPLOY_SSH_KEY: ${{ secrets.DEPLOY_SSH_KEY }} + CONFIG_DATABASE_PASSWORD: ${{ secrets.CONFIG_TEST_DATABASE_PASSWORD }} + CONFIG_GOOGLE_CREDENTIALS: ${{ secrets.CONFIG_TEST_GOOGLE_CREDENTIALS }} - - name: Deploy to h.skauting.cz - run: phing deploy - env: - ENVIRONMENT: production - ROOT_DIR: /home/vu008930 - SSH_USERNAME: vu008930 - SSH_KEY_FILE: /root/.ssh/id_key - CONFIG_DATABASE_PASSWORD: ${{ secrets.CONFIG_PRODUCTION_DATABASE_PASSWORD }} - CONFIG_SENTRY_DSN: ${{ secrets.CONFIG_SENTRY_DSN }} - CONFIG_GOOGLE_CREDENTIALS: ${{ secrets.CONFIG_PRODUCTION_GOOGLE_CREDENTIALS }} + deploy-production: + if: github.ref == 'refs/heads/master' + needs: [checks-passed] + uses: ./.github/workflows/deploy-template.yml + with: + environment: production + root_dir: /home/vu008930 + ssh_username: vu008930 + host: www.skauting.cz + port: 8930 + secrets: + DEPLOY_SSH_KEY: ${{ secrets.DEPLOY_SSH_KEY }} + CONFIG_DATABASE_PASSWORD: ${{ secrets.CONFIG_PRODUCTION_DATABASE_PASSWORD }} + CONFIG_GOOGLE_CREDENTIALS: ${{ secrets.CONFIG_PRODUCTION_GOOGLE_CREDENTIALS }} + CONFIG_SENTRY_DSN: ${{ secrets.CONFIG_SENTRY_DSN }} \ No newline at end of file diff --git a/.github/workflows/setup_ssh.sh b/.github/workflows/setup_ssh.sh deleted file mode 100755 index 932561570..000000000 --- a/.github/workflows/setup_ssh.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env bash - -if [ -z "$1" ]; then - echo "SSH file contents was not passed" - exit 1 -fi - -if [ -z "$2" ]; then - echo "SSH file path was not passed" - exit 1 -fi - -mkdir -p /root/.ssh -echo "$1" > "$2" -mv .github/workflows/known_hosts /root/.ssh/known_hosts -chmod 700 /root/.ssh -chmod 644 /root/.ssh/known_hosts -chmod 400 "$2" diff --git a/Makefile b/Makefile index 724073eaa..bcc31c334 100644 --- a/Makefile +++ b/Makefile @@ -19,26 +19,32 @@ enter: init: docker exec -it $(CONTAINER_PHP) composer install - docker exec -it $(CONTAINER_PHP) /app/vendor/bin/phing app-init + docker exec -it $(CONTAINER_PHP) composer run app-init tests-all: - docker exec -it ${CONTAINER_PHP_TEST} /app/vendor/bin/phing tests + docker exec -it ${CONTAINER_PHP_TEST} composer run tests tests-unit: - docker exec -it ${CONTAINER_PHP_TEST} /app/vendor/bin/phing tests-unit + docker exec -it ${CONTAINER_PHP_TEST} composer run tests:unit tests-integration: - docker exec -it ${CONTAINER_PHP_TEST} /app/vendor/bin/phing tests-integration + docker exec -it ${CONTAINER_PHP_TEST} composer run tests:integration tests-acceptance: - docker exec -it ${CONTAINER_PHP_TEST} /app/vendor/bin/phing tests-acceptance + docker exec -it ${CONTAINER_PHP_TEST} composer run tests:acceptance static-analysis: - docker exec -it ${CONTAINER_PHP} /app/vendor/bin/phing static-analysis + docker exec -it ${CONTAINER_PHP} composer run static-analysis coding-standard: - docker exec -it ${CONTAINER_PHP} /app/vendor/bin/phing coding-standard + docker exec -it ${CONTAINER_PHP} composer run coding-standard fix: - docker exec -it ${CONTAINER_PHP} /app/vendor/bin/phing coding-standard - docker exec -it ${CONTAINER_PHP} /app/vendor/bin/phing static-analysis \ No newline at end of file + docker exec -it ${CONTAINER_PHP} composer run coding-standard + docker exec -it ${CONTAINER_PHP} composer run static-analysis + +clean: + docker exec -it ${CONTAINER_PHP} rm -rf temp/* www/webtemp/* node_modules frontend/.cache || true + +build: + docker exec -it ${CONTAINER_PHP} yarn build \ No newline at end of file diff --git a/app/AccountancyModule/AccountancyHelpers.php b/app/AccountancyModule/AccountancyHelpers.php index 3a722b352..4890da14b 100644 --- a/app/AccountancyModule/AccountancyHelpers.php +++ b/app/AccountancyModule/AccountancyHelpers.php @@ -8,6 +8,8 @@ use DateTimeInterface; use InvalidArgumentException; use Model\Common\ShouldNotHappen; +use Model\Event\CampState; +use Model\Event\EventState; use Model\Payment\Payment\State; use Money\Money; use Nette\Utils\Html; @@ -51,17 +53,11 @@ public static function loader(string $filter): callable */ public static function eventStateLabel(string $s): string { - if ($s === 'draft') { - return 'Rozpracováno'; - } - - if ($s === 'closed') { - return 'Uzavřeno'; - } - - return 'Zrušeno'; - - //draft, closed, cancelled + return match ($s) { + EventState::DRAFT->value => 'Rozpracováno', + EventState::CLOSED->value => 'Uzavřeno', + default => 'Zrušeno', + }; } /** @@ -170,22 +166,13 @@ public static function grantStateLabel(string $s): string */ public static function campStateLabel(string $s): string { - switch ($s) { - case 'draft': - return 'Rozpracováno'; - - case 'approvedParent': - return 'Schválený střediskem'; - - case 'approvedLeader': - return 'Schválený vedoucím'; - - case 'real': - return 'Skutečnost odevzdána'; - - default: - return 'Zrušený'; - } + return match ($s) { + CampState::DRAFT->value => 'Rozpracováno', + CampState::APPROVED_PARENT->value => 'Schválený střediskem', + CampState::APPROVED_LEADER->value => 'Schválený vedoucím', + CampState::REAL->value => 'Skutečnost odevzdána', + default => 'Zrušený', + }; } /** @filter */ diff --git a/app/AccountancyModule/CampModule/Components/MissingAutocomputedCategoryControl.php b/app/AccountancyModule/CampModule/Components/MissingAutocomputedCategoryControl.php index 5b504e692..12c86298e 100644 --- a/app/AccountancyModule/CampModule/Components/MissingAutocomputedCategoryControl.php +++ b/app/AccountancyModule/CampModule/Components/MissingAutocomputedCategoryControl.php @@ -9,6 +9,7 @@ use Model\Auth\Resources\Camp; use Model\Common\Services\CommandBus; use Model\Common\Services\QueryBus; +use Model\Event\CampState; use Model\Event\Commands\Camp\ActivateAutocomputedCashbook; use Model\Event\ReadModel\Queries\CampQuery; use Model\Event\SkautisCampId; @@ -39,7 +40,7 @@ public function render(): void $this->template->setFile(__DIR__ . '/templates/MissingAutocomputedCategoryControl.latte'); $this->template->setParameters([ - 'isApproved' => in_array($camp->getState(), [\Model\Event\Camp::STATE_APPROVED_PARENT, \Model\Event\Camp::STATE_REAL]), + 'isApproved' => in_array($camp->getState(), [CampState::APPROVED_PARENT, CampState::REAL->value]), 'isEditable' => $this->authorizator->isAllowed(Camp::UPDATE_REAL, $this->campId->toInt()), 'canActivate' => $this->authorizator->isAllowed(Camp::UPDATE_REAL_COST, $this->campId->toInt()), ]); diff --git a/app/AccountancyModule/Components/BaseButtonControl.php b/app/AccountancyModule/Components/BaseButtonControl.php new file mode 100644 index 000000000..e2dc6e582 --- /dev/null +++ b/app/AccountancyModule/Components/BaseButtonControl.php @@ -0,0 +1,24 @@ + $css */ + public function addCss(array $css): void + { + $this->css = array_merge($this->css, $css); + } + + public function setCss(string $key, string $value): void + { + $this->css[$key] = $value; + } +} diff --git a/app/AccountancyModule/Components/Cashbook/ChitListControl.php b/app/AccountancyModule/Components/Cashbook/ChitListControl.php index f7f823074..f3d952e3f 100644 --- a/app/AccountancyModule/Components/Cashbook/ChitListControl.php +++ b/app/AccountancyModule/Components/Cashbook/ChitListControl.php @@ -194,7 +194,7 @@ protected function createComponentInvertChitDialog(): InvertChitDialog protected function createComponentChitScan(): Multiplier { return new Multiplier( - fn (string $chitId) => $this->chitScanFactory->create($this->cashbookId, (int) $chitId, $this->isEditable) + fn (string $chitId) => $this->chitScanFactory->create($this->cashbookId, (int) $chitId, $this->isEditable), ); } diff --git a/app/AccountancyModule/Components/DataGrid.php b/app/AccountancyModule/Components/DataGrid.php index df81f54e6..dcbfc994f 100644 --- a/app/AccountancyModule/Components/DataGrid.php +++ b/app/AccountancyModule/Components/DataGrid.php @@ -6,6 +6,7 @@ use Ublaboo\DataGrid\Column\Action; use Ublaboo\DataGrid\Filter\FilterSelect; +use Ublaboo\DataGrid\Localization\SimpleTranslator; use function array_map; use function array_reverse; @@ -29,6 +30,38 @@ public function __construct() //disable autocomplete - issue #1443 $this['filter']->getElementPrototype()->setAttribute('autocomplete', 'off'); }; + + $translator = new SimpleTranslator([ + 'ublaboo_datagrid.no_item_found_reset' => 'Nenalezeny žádné záznamy. Můžete zrušit filtr', + 'ublaboo_datagrid.no_item_found' => 'Nenalezeny žádné záznamy.', + 'ublaboo_datagrid.here' => 'zde', + 'ublaboo_datagrid.items' => 'Položky', + 'ublaboo_datagrid.all' => 'vše', + 'ublaboo_datagrid.from' => 'od', + 'ublaboo_datagrid.reset_filter' => 'Zrušit filtr', + 'ublaboo_datagrid.group_actions' => 'Hromadné akce', + 'ublaboo_datagrid.show' => 'Zobrazit', + 'ublaboo_datagrid.add' => 'Přidat', + 'ublaboo_datagrid.edit' => 'Upravit', + 'ublaboo_datagrid.show_all_columns' => 'Zobrazit všechny sloupce', + 'ublaboo_datagrid.show_default_columns' => 'Zobrazit výchozí sloupce', + 'ublaboo_datagrid.hide_column' => 'Skrýt sloupec', + 'ublaboo_datagrid.action' => 'Akce', + 'ublaboo_datagrid.previous' => 'Předchozí', + 'ublaboo_datagrid.next' => 'Další', + 'ublaboo_datagrid.choose' => 'Vybrat', + 'ublaboo_datagrid.choose_input_required' => 'Text hromadné akce nesmí být prázdný', + 'ublaboo_datagrid.execute' => 'Provést', + 'ublaboo_datagrid.save' => 'Uložit', + 'ublaboo_datagrid.cancel' => 'Zrušit', + 'ublaboo_datagrid.multiselect_choose' => 'Vybrat', + 'ublaboo_datagrid.multiselect_selected' => '{0} vybráno', + 'ublaboo_datagrid.filter_submit_button' => 'Filtrovat', + 'ublaboo_datagrid.show_filter' => 'Zobrazit filtr', + 'ublaboo_datagrid.per_page_submit' => 'Změnit', + ]); + + $this->setTranslator($translator); } /** diff --git a/app/AccountancyModule/EducationModule/presenters/BudgetPresenter.php b/app/AccountancyModule/EducationModule/presenters/BudgetPresenter.php index eae530da1..51f1bedbb 100644 --- a/app/AccountancyModule/EducationModule/presenters/BudgetPresenter.php +++ b/app/AccountancyModule/EducationModule/presenters/BudgetPresenter.php @@ -8,6 +8,7 @@ use Model\Auth\Resources\Grant; use Model\Cashbook\Cashbook\CashbookId; use Model\Cashbook\Commands\Cashbook\UpdateEducationCategoryTotals; +use Model\Cashbook\MissingCategory; use Model\Cashbook\ReadModel\Queries\CategoriesSummaryQuery; use Model\Cashbook\ReadModel\Queries\EducationCashbookIdQuery; use Model\Cashbook\ReadModel\Queries\InconsistentEducationCategoryTotalsQuery; @@ -46,15 +47,20 @@ public function renderDefault(int $aid): void $budgetAvailable = $this->event->grantId !== null; $categoriesAvailable = $this->event->startDate !== null; - $budgetEntries = $budgetAvailable - ? $this->queryBus->handle(new EducationBudgetQuery($educationId, $this->event->grantId)) - : []; - $inconsistentTotals = $categoriesAvailable - ? $this->queryBus->handle(new InconsistentEducationCategoryTotalsQuery($educationId, $this->event->startDate->year)) - : []; - $categoriesSummary = $categoriesAvailable - ? $this->queryBus->handle(new CategoriesSummaryQuery($this->getCashbookId($aid, $this->event->startDate->year))) - : []; + try { + $budgetEntries = $budgetAvailable + ? $this->queryBus->handle(new EducationBudgetQuery($educationId, $this->event->grantId)) + : []; + $inconsistentTotals = $categoriesAvailable + ? $this->queryBus->handle(new InconsistentEducationCategoryTotalsQuery($educationId, $this->event->startDate->year)) + : []; + $categoriesSummary = $categoriesAvailable + ? $this->queryBus->handle(new CategoriesSummaryQuery($this->getCashbookId($aid, $this->event->startDate->year))) + : []; + } catch (MissingCategory $e) { + $this->flashMessage($e->getMessage(), 'danger'); + $this->redirect('Education:', ['aid' => $aid]); + } $this->template->setParameters([ 'budgetAvailable' => $budgetAvailable, diff --git a/app/AccountancyModule/PaymentModule/components/CreateButton.php b/app/AccountancyModule/PaymentModule/components/CreateButton.php new file mode 100644 index 000000000..9b2790ddd --- /dev/null +++ b/app/AccountancyModule/PaymentModule/components/CreateButton.php @@ -0,0 +1,19 @@ +template->setParameters([ + 'css' => $this->css, + ]); + $this->template->setFile(__DIR__ . '/templates/CreateButton.latte'); + $this->template->render(); + } +} diff --git a/app/AccountancyModule/PaymentModule/components/EmailButton.php b/app/AccountancyModule/PaymentModule/components/EmailButton.php new file mode 100644 index 000000000..981c60e5a --- /dev/null +++ b/app/AccountancyModule/PaymentModule/components/EmailButton.php @@ -0,0 +1,201 @@ +queryBus->handle(new GroupEmailQuery($this->group->id, EmailType::get(EmailType::PAYMENT_REMINDER))); + $paymentsForSendEmail = $this->paymentsAvailableForGroupInfoSending($this->payments); + + $this->template->setParameters([ + 'canSend' => $this->canSend(), + 'isReminderSendActive' => $email !== null && $email->isEnabled(), + 'isGroupSendActive' => $this->group->getState() === 'open' && ! empty($paymentsForSendEmail), + ]); + $this->template->setFile(__DIR__ . '/templates/EmailButton.latte'); + $this->template->render(); + } + + public function canSend(): bool + { + return ! ($this->group->getOauthId() === null) && ! ($this->group->getBankAccountId() === null); + } + + public function renderLight(): void + { + $this->template->setParameters(['style' => 'light']); + $this->render(); + } + + /** + * rozešle všechny neposlané e-maily + */ + public function handleSendGroup(): void + { + $this->sendPaymentInfoEmails($this->paymentsAvailableForGroupInfoSending($this->payments)); + } + + public function handleSendGroupReminder(): void + { + $this->sendPaymentReminderEmails($this->paymentsAvailableForGroupReminderSending($this->payments)); + } + + public function handleSendTest(): void + { + if (! $this->isEditable) { + $this->presenter->flashMessage('Neplatný požadavek na odeslání testovacího e-mailu!', 'danger'); + $this->presenter->redirect('this'); + } + + try { + $email = $this->mailing->sendTestMail($this->group->id); + $this->presenter->flashMessage('Testovací e-mail byl odeslán na ' . $email . '.'); + } catch (OAuthNotSet) { + $this->presenter->flashMessage(self::NO_MAILER_MESSAGE, 'warning'); + } catch (InvalidOAuth $e) { + $this->oauthError($e); + } catch (InvalidBankAccount) { + $this->presenter->flashMessage(self::NO_BANK_ACCOUNT_MESSAGE, 'warning'); + } catch (EmailNotSet) { + $this->flashMessage('Nemáte nastavený e-mail ve skautisu, na který by se odeslal testovací e-mail!', 'danger'); + } + + $this->redirect('this'); + } + + /** @param Payment[] $payments */ + private function sendPaymentInfoEmails(array $payments): void + { + $sentCount = 0; + + try { + foreach ($payments as $payment) { + $this->commandBus->handle(new SendPaymentInfo($payment->getId())); + $sentCount++; + } + } catch (OAuthNotSet) { + $this->presenter->flashMessage(self::NO_MAILER_MESSAGE, 'warning'); + $this->presenter->redirect('this'); + } catch (InvalidBankAccount) { + $this->presenter->flashMessage(self::NO_BANK_ACCOUNT_MESSAGE, 'warning'); + $this->presenter->redirect('this'); + } catch (InvalidOAuth $e) { + $this->oauthError($e); + $this->presenter->redirect('this'); + } + + if ($sentCount > 0) { + $this->presenter->flashMessage( + $sentCount === 1 + ? 'Informační e-mail byl odeslán' + : 'Informační e-maily (' . $sentCount . ') byly odeslány', + 'success', + ); + } + + $this->presenter->redirect('this'); + } + + /** @param Payment[] $payments */ + private function sendPaymentReminderEmails(array $payments): void + { + $sentCount = 0; + + try { + foreach ($payments as $payment) { + $this->commandBus->handle(new SendPaymentReminder($payment->getId())); + $sentCount++; + } + } catch (OAuthNotSet) { + $this->presenter->flashMessage(self::NO_MAILER_MESSAGE, 'warning'); + $this->presenter->redirect('this'); + } catch (InvalidBankAccount) { + $this->presenter->flashMessage(self::NO_BANK_ACCOUNT_MESSAGE, 'warning'); + $this->presenter->redirect('this'); + } catch (InvalidOAuth $e) { + $this->oauthError($e); + $this->presenter->redirect('this'); + } catch (EmailTemplateNotSet) { + $this->presenter->flashMessage(self::NO_TEMPLATE_ASSIGNED, 'warning'); + $this->presenter->redirect('this'); + } + + if ($sentCount > 0) { + $this->presenter->flashMessage( + $sentCount === 1 + ? 'E-mail s upomínkou byl odeslán' + : 'E-maily s upomínkou byly odeslány (celkem: ' . $sentCount . ')', + 'success', + ); + } + + $this->presenter->redirect('this'); + } + + /** + * @param Payment[] $payments + * + * @return Payment[] + */ + private function paymentsAvailableForGroupInfoSending(array $payments): array + { + return array_filter( + $payments, + function (Payment $p) { + return ! $p->isClosed() && ! empty($p->getEmailRecipients()) && $p->getSentEmails() === []; + }, + ); + } + + /** + * @param Payment[] $payments + * + * @return Payment[] + */ + private function paymentsAvailableForGroupReminderSending(array $payments): array + { + return array_filter( + $payments, + function (Payment $p) { + return $p->isOverdue(); + }, + ); + } + + private function oauthError(InvalidOAuth $e): void + { + $this->presenter->flashMessage($e->getExplainedMessage(), 'danger'); + } +} diff --git a/app/AccountancyModule/PaymentModule/components/GroupForm.php b/app/AccountancyModule/PaymentModule/components/GroupForm.php index d07843c2d..9aa4d070a 100644 --- a/app/AccountancyModule/PaymentModule/components/GroupForm.php +++ b/app/AccountancyModule/PaymentModule/components/GroupForm.php @@ -165,6 +165,7 @@ private function formSucceeded(BaseForm $form): void $emails = [ EmailType::PAYMENT_INFO => $this->buildEmailTemplate($v, EmailType::PAYMENT_INFO), EmailType::PAYMENT_COMPLETED => $this->buildEmailTemplate($v, EmailType::PAYMENT_COMPLETED), + EmailType::PAYMENT_REMINDER => $this->buildEmailTemplate($v, EmailType::PAYMENT_REMINDER), ]; $emails = array_filter($emails); @@ -178,6 +179,7 @@ private function formSucceeded(BaseForm $form): void $emails, $oAuthId, $v->bankAccount, + $v->emails[EmailType::PAYMENT_REMINDER]?->remindersEnabled ?? false, ); $this->flashMessage('Skupina byla upravena'); @@ -190,6 +192,7 @@ private function formSucceeded(BaseForm $form): void $emails, $oAuthId, $v->bankAccount, + $v->emails[EmailType::PAYMENT_REMINDER]?->remindersEnabled ?? false, ); $this->flashMessage('Skupina byla založena'); @@ -218,6 +221,11 @@ private function buildDefaultsFromGroup(): array foreach (EmailType::getAvailableEnums() as $emailType) { $emails[$emailType->toString()] = $this->getEmailDefaults($this->groupId, $emailType); + if ($emailType->toString() !== EmailType::PAYMENT_REMINDER) { + continue; + } + + $emails[$emailType->toString()]['remindersEnabled'] = $group->isRemindersEnabled(); } return [ @@ -240,6 +248,8 @@ private function addEmailsToForm(BaseForm $form): void $emails = [ EmailType::PAYMENT_INFO => 'E-mail s platebními údaji', EmailType::PAYMENT_COMPLETED => 'E-mail při dokončení platby', + // EmailType::PAYMENT_CANCELED => 'E-mail při zrušení platby', + EmailType::PAYMENT_REMINDER => 'E-mail upomínka platby', ]; foreach ($emails as $type => $caption) { @@ -247,8 +257,9 @@ private function addEmailsToForm(BaseForm $form): void $container = $emailsContainer->addContainer($type); $container->setCurrentGroup($group); - $subjectId = $type . '_subject'; - $bodyId = $type . '_body'; + $subjectId = $type . '_subject'; + $bodyId = $type . '_body'; + $remindersId = $type . '_reminders'; // Only payment info email is always saved if ($type !== EmailType::PAYMENT_INFO) { @@ -256,12 +267,18 @@ private function addEmailsToForm(BaseForm $form): void ->setOption('class', 'form-check') ->addCondition($form::FILLED) ->toggle($subjectId) - ->toggle($bodyId); + ->toggle($bodyId) + ->toggle($remindersId); + } + + if ($type === EmailType::PAYMENT_REMINDER) { + $container->addCheckbox('remindersEnabled', 'Automaticky odeslat email po splatnosti') + ->setOption('id', $remindersId); } $container->addText('subject', 'Předmět e-mailu') ->setOption('id', $subjectId); - $container->addTextArea('body', 'Text mailu') + $container->addTextArea('body', 'Text mailu', 10, 20) ->setOption('id', $bodyId) ->setHtmlAttribute('class', 'form-control') ->setDefaultValue($this->getDefaultEmailBody($type)); diff --git a/app/AccountancyModule/PaymentModule/components/PairButton.php b/app/AccountancyModule/PaymentModule/components/PairButton.php index 6c7a7a2c5..f67c18ce5 100644 --- a/app/AccountancyModule/PaymentModule/components/PairButton.php +++ b/app/AccountancyModule/PaymentModule/components/PairButton.php @@ -4,7 +4,7 @@ namespace App\AccountancyModule\PaymentModule\Components; -use App\AccountancyModule\Components\BaseControl; +use App\AccountancyModule\Components\BaseButtonControl; use App\Forms\BaseForm; use Model\BankService; use Model\BankTimeLimit; @@ -19,10 +19,9 @@ use function array_filter; use function array_map; use function assert; -use function bdump; use function count; -class PairButton extends BaseControl +class PairButton extends BaseButtonControl { public const TIMEOUT_MESSAGE = 'Nepodařilo se připojit k bankovnímu serveru. Zkontrolujte svůj API token pro přístup k účtu.'; public const TIME_LIMIT_MESSAGE = 'Mezi dotazy na bankovnictví musí být prodleva 1 minuta!'; @@ -32,6 +31,18 @@ class PairButton extends BaseControl public function __construct(private PaymentService $payments, private BankService $model, private BankAccountService $bankAccounts) { + $style = 'primary'; + // default + $this->addCss([ + 'wrap' => 'd-inline-block', + 'btn' => 'btn btn-' . $style, + 'toggle' => 'btn btn-' . $style . ' dropdown-toggle', + 'menu' => 'dropdown-menu pairForm', + 'icon' => 'fas fa-university', + 'inputGroup' => 'input-group', + 'submit' => 'btn btn-primary', + 'submitCol' => 'col-4', + ]); } public function handlePair(): void @@ -54,6 +65,7 @@ public function render(): void $this->template->setParameters([ 'canPair' => $this->canPair(), 'groupsCount' => count($this->groupIds), + 'css' => $this->css, ]); $this->template->setFile(__DIR__ . '/templates/PairButton.latte'); $this->template->render(); @@ -114,24 +126,26 @@ private function pair(int|null $daysBack = null): void { try { $pairingResults = $this->model->pairAllGroups($this->groupIds, $daysBack); + + if (empty($pairingResults)) { + $this->presenter->flashMessage('Nebyla nalezena žádná platby k párování', 'warning'); + } + foreach ($pairingResults as $p) { assert($p instanceof PairingResult); - $this->flashMessage($p->getMessage(), $p->getCount() > 0 ? 'success' : 'info'); + $this->presenter->flashMessage($p->getMessage(), $p->getCount() > 0 ? 'success' : 'info'); } } catch (BankTimeout) { - $this->flashMessage(self::TIMEOUT_MESSAGE, 'danger'); - bdump(self::TIMEOUT_MESSAGE); + $this->presenter->flashMessage(self::TIMEOUT_MESSAGE, 'danger'); } catch (BankTimeLimit) { - $this->flashMessage(self::TIME_LIMIT_MESSAGE, 'danger'); - bdump(self::TIME_LIMIT_MESSAGE); + $this->presenter->flashMessage(self::TIME_LIMIT_MESSAGE, 'danger'); } catch (BankWrongTokenAccount $e) { - $this->flashMessage($this->wrongTokenAccountMessage($e), 'danger'); - bdump($this->wrongTokenAccountMessage($e)); + $this->presenter->flashMessage($this->wrongTokenAccountMessage($e), 'danger'); } catch (InvalidOAuth $exc) { - $this->flashMessage($exc->getExplainedMessage(), 'danger'); + $this->presenter->flashMessage($exc->getExplainedMessage(), 'danger'); } - $this->redirect('this'); + $this->presenter->redirect('this'); } public static function wrongTokenAccountMessage(BankWrongTokenAccount $exception): string diff --git a/app/AccountancyModule/PaymentModule/components/PaymentList.php b/app/AccountancyModule/PaymentModule/components/PaymentList.php index 1af65f5d1..fe67dcded 100644 --- a/app/AccountancyModule/PaymentModule/components/PaymentList.php +++ b/app/AccountancyModule/PaymentModule/components/PaymentList.php @@ -8,10 +8,23 @@ use App\AccountancyModule\Components\DataGrid; use App\AccountancyModule\Factories\GridFactory; use App\AccountancyModule\Grids\DtoListDataSource; +use Model\Common\Services\CommandBus; use Model\Common\Services\QueryBus; use Model\DTO\Payment\Payment; +use Model\Google\Exception\OAuthNotSet; +use Model\Google\InvalidOAuth; +use Model\Payment\Commands\Mailing\SendPaymentInfo; +use Model\Payment\Commands\Mailing\SendPaymentReminder; +use Model\Payment\EmailTemplateNotSet; +use Model\Payment\EmailType; +use Model\Payment\InvalidBankAccount; use Model\Payment\Payment\State; +use Model\Payment\PaymentClosed; +use Model\Payment\PaymentHasNoEmails; +use Model\Payment\PaymentNotFound; +use Model\Payment\ReadModel\Queries\GroupEmailQuery; use Model\Payment\ReadModel\Queries\PaymentListQuery; +use Model\PaymentService; use function array_flip; use function array_reverse; @@ -26,7 +39,7 @@ final class PaymentList extends BaseControl State::CANCELED, ]; - public function __construct(private int $groupId, private bool $isEditable, private QueryBus $queryBus, private GridFactory $gridFactory) + public function __construct(private PaymentService $model, private CommandBus $commandBus, private int $groupId, private bool $isEditable, private QueryBus $queryBus, private GridFactory $gridFactory) { } @@ -38,13 +51,25 @@ public function render(): void protected function createComponentGrid(): DataGrid { - $grid = $this->gridFactory->createSimpleGrid( + $email = $this->queryBus->handle(new GroupEmailQuery($this->groupId, EmailType::get(EmailType::PAYMENT_REMINDER))); + $grid = $this->gridFactory->createSimpleGrid( __DIR__ . '/templates/PaymentList.grid.latte', - ['isEditable' => $this->isEditable], + [ + 'isEditable' => $this->isEditable, + 'isReminderSendActive' => $email !== null && $email->isEnabled(), + ], ); $grid->setRememberState(false, true); $grid->setColumnsHideable(); + $grid->addGroupButtonAction('Odeslat email')->onClick[] = [$this, 'sendMail']; + if ($email !== null && $email->isEnabled()) { + $grid->addGroupButtonAction('Odeslat upomínku')->onClick[] = [$this, 'sendReminder']; + } + + $grid->addGroupButtonAction('Zaplaceno')->onClick[] = [$this, 'setPay']; + $grid->addGroupButtonAction('Zrušit')->onClick[] = [$this, 'setCancel']; + $grid->addColumnText('name', 'Název/účel') ->setSortable() ->setSortableCallback(function (DtoListDataSource $dataSource, array $sort): DtoListDataSource { @@ -74,6 +99,9 @@ protected function createComponentGrid(): DataGrid $grid->addColumnDateTime('dueDate', 'Splatnost') ->setSortable(); + $grid->addColumnDateTime('closedAt', 'Zaplaceno') + ->setSortable(); + $grid->addColumnDateTime('Note', 'Poznámka') ->setSortable() ->setDefaultHide(); @@ -99,4 +127,151 @@ protected function createComponentGrid(): DataGrid return $grid; } + + public function handleSend(int $pid): void + { + $payment = $this->model->findPayment($pid); + + if ($payment === null) { + $this->presenter->flashMessage('Zadaná platba neexistuje', 'danger'); + $this->presenter->redirect('this'); + } + + if (empty($payment->getEmailRecipients())) { + $this->presenter->flashMessage('Platba nemá vyplněný e-mail', 'danger'); + $this->presenter->redirect('this'); + } + + $this->sendMail([$pid]); + } + + public function handleSendReminder(int $pid): void + { + $payment = $this->model->findPayment($pid); + + if ($payment === null) { + $this->presenter->flashMessage('Zadaná platba neexistuje', 'danger'); + $this->presenter->redirect('this'); + } + + if (empty($payment->getEmailRecipients())) { + $this->presenter->flashMessage('Platba nemá vyplněný e-mail', 'danger'); + $this->presenter->redirect('this'); + } + + $this->sendReminder([$pid]); + } + + public function handleComplete(int $pid): void + { + $this->setPay([$pid]); + } + + public function handleCancel(int $pid): void + { + $this->setCancel([$pid]); + } + + /** @param array $ids */ + public function sendMail(array $ids): void + { + $count = 0; + foreach ($ids as $id) { + try { + $this->commandBus->handle(new SendPaymentInfo($id)); + $count++; + } catch (OAuthNotSet) { + $this->flashMessage(EmailButton::NO_MAILER_MESSAGE, 'warning'); + } catch (InvalidBankAccount) { + $this->flashMessage(EmailButton::NO_BANK_ACCOUNT_MESSAGE, 'warning'); + } catch (InvalidOAuth $e) { + $this->flashMessage($e->getExplainedMessage(), 'danger'); + } catch (PaymentClosed $e) { + $this->flashMessage($e->getMessage(), 'warning'); + } catch (PaymentHasNoEmails $e) { + $this->flashMessage($e->getMessage(), 'warning'); + } + } + + if ($count === 1) { + $this->presenter->flashMessage($count . ' informační e-mail odeslán', 'info'); + } else { + $this->presenter->flashMessage($count . ' Informačních e-mailů odesláno', 'info'); + } + + $this->presenter->redirect('this'); + } + + /** @param array $ids */ + public function sendReminder(array $ids): void + { + $count = 0; + try { + foreach ($ids as $id) { + try { + $this->commandBus->handle(new SendPaymentReminder($id)); + $count++; + } catch (OAuthNotSet) { + $this->flashMessage(EmailButton::NO_MAILER_MESSAGE, 'warning'); + } catch (InvalidBankAccount) { + $this->flashMessage(EmailButton::NO_BANK_ACCOUNT_MESSAGE, 'warning'); + } catch (InvalidOAuth $e) { + $this->flashMessage($e->getExplainedMessage(), 'danger'); + } catch (PaymentClosed $e) { + $this->flashMessage($e->getMessage(), 'warning'); + } catch (PaymentHasNoEmails $e) { + $this->flashMessage($e->getMessage(), 'warning'); + } + } + + if ($count === 1) { + $this->presenter->flashMessage($count . ' upomínkový e-mailů odeslán', 'info'); + } else { + $this->presenter->flashMessage($count . ' upomínkových e-mailů odesláno', 'info'); + } + } catch (EmailTemplateNotSet) { + $this->flashMessage('Platební skupina nemá povolené upomínky', 'warning'); + } + + $this->presenter->redirect('this'); + } + + /** @param array $ids */ + public function setPay(array $ids): void + { + if (! $this->isEditable) { + $this->flashMessage('Nejste oprávněni k uzavření platby!', 'danger'); + $this->redirect('this'); + } + + foreach ($ids as $id) { + try { + $this->model->completePayment($id); + $this->flashMessage('Platba byla zaplacena.'); + } catch (PaymentClosed $e) { + $this->flashMessage($e->getMessage(), 'warning'); + } catch (InvalidOAuth $exc) { + $this->flashMessage($exc->getExplainedMessage(), 'danger'); + } + } + + $this->presenter->redirect('this'); + } + + /** @param array $ids */ + public function setCancel(array $ids): void + { + foreach ($ids as $id) { + try { + $this->model->cancelPayment($id); + $this->flashMessage('Platba byla uzavřena'); + } catch (PaymentNotFound) { + $this->flashMessage('Platba nenalezena!', 'danger'); + } catch (PaymentClosed $e) { + $this->flashMessage($e->getMessage(), 'warning'); + } + } + + $this->presenter->redirect('this'); + } } diff --git a/app/AccountancyModule/PaymentModule/components/templates/CreateButton.latte b/app/AccountancyModule/PaymentModule/components/templates/CreateButton.latte new file mode 100644 index 000000000..b3bc9e2d6 --- /dev/null +++ b/app/AccountancyModule/PaymentModule/components/templates/CreateButton.latte @@ -0,0 +1,39 @@ + \ No newline at end of file diff --git a/app/AccountancyModule/PaymentModule/components/templates/EmailButton.latte b/app/AccountancyModule/PaymentModule/components/templates/EmailButton.latte new file mode 100644 index 000000000..90f1d3fac --- /dev/null +++ b/app/AccountancyModule/PaymentModule/components/templates/EmailButton.latte @@ -0,0 +1,40 @@ +
+ + +
\ No newline at end of file diff --git a/app/AccountancyModule/PaymentModule/components/templates/GroupForm.latte b/app/AccountancyModule/PaymentModule/components/templates/GroupForm.latte index 2c39b8ab1..1a88a5ca2 100644 --- a/app/AccountancyModule/PaymentModule/components/templates/GroupForm.latte +++ b/app/AccountancyModule/PaymentModule/components/templates/GroupForm.latte @@ -1,8 +1,18 @@
+
- {control form}
+ + + +
+
+
+
+ {control form} +
+

E-mail odesílatele
E-mail, ze kterého se budou zasílat informace o platbách.

diff --git a/app/AccountancyModule/PaymentModule/components/templates/PairButton.latte b/app/AccountancyModule/PaymentModule/components/templates/PairButton.latte index ed02888c9..baa5a4e79 100644 --- a/app/AccountancyModule/PaymentModule/components/templates/PairButton.latte +++ b/app/AccountancyModule/PaymentModule/components/templates/PairButton.latte @@ -1,31 +1,48 @@ -{var $errorMessage = $groupsCount === 1 ? 'Skupina nemá nastavený účet pro párování s FIO' : 'Žádná ze skupin plateb nemá nastavený účet pro párování s FIO'} +{* ---- Původní validace/tooltipy ---- *} +{var $errorMessage = $groupsCount === 1 +? 'Skupina nemá nastavený účet pro párování s FIO' +: 'Žádná ze skupin plateb nemá nastavený účet pro párování s FIO'} -{var $style = $style ?? 'primary'} {var $attrs = ! $canPair && $groupsCount === 1 - ? ['data-bs-toggle' => 'tooltip', 'data-placement' => 'bottom', 'title' => 'Skupina nemá nastavený účet'] - : [] +? ['data-bs-toggle' => 'tooltip', 'data-placement' => 'bottom', 'title' => 'Skupina nemá nastavený účet'] +: [] } -
-
- - Párovat platby + +
+
+ + + Párovat platby + + n:class="$css['toggle']" + type="button" + id="pairPayments" + data-bs-toggle="dropdown" + aria-haspopup="true" + aria-expanded="false"> + + Další možnosti párování + - +
\ No newline at end of file diff --git a/app/AccountancyModule/PaymentModule/components/templates/PaymentList.grid.latte b/app/AccountancyModule/PaymentModule/components/templates/PaymentList.grid.latte index 05b5c5740..fab860191 100644 --- a/app/AccountancyModule/PaymentModule/components/templates/PaymentList.grid.latte +++ b/app/AccountancyModule/PaymentModule/components/templates/PaymentList.grid.latte @@ -20,11 +20,15 @@
{var $emailType = $email->getType()->toString()} - {if $emailType === 'payment_info'} + {switch $emailType} + {case \Model\Payment\EmailType::PAYMENT_INFO} Platební údaje - {elseif $emailType === 'payment_completed'} + {case \Model\Payment\EmailType::PAYMENT_COMPLETED} Potvrzení o dokončení platby - {/if} + {case \Model\Payment\EmailType::PAYMENT_REMINDER} + Upomínka platby + {/switch} +
odeslal {$email->getTime()|date:'d.m.Y'} uživatel {$email->getSenderName()} @@ -49,14 +53,19 @@ - - + {/if} + {elseif $item->isClosed()} - {$item->getClosedAt()|date:'j.n.Y'} @@ -84,7 +93,7 @@
{else} {/if} - diff --git a/app/AccountancyModule/PaymentModule/factories/ICreateButtonFactory.php b/app/AccountancyModule/PaymentModule/factories/ICreateButtonFactory.php new file mode 100644 index 000000000..782abf4f0 --- /dev/null +++ b/app/AccountancyModule/PaymentModule/factories/ICreateButtonFactory.php @@ -0,0 +1,12 @@ +pairButtonFactory->create(); + $control = $this->pairButtonFactory->create(); + $control->setCss('button', 'btn btn-success dropdown-toggle ms-2'); + + return $control; + } + + protected function createComponentCreateButton(): CreateButton + { + $control = $this->createButtonFactory->create(); + $control->setCss('button', 'btn btn-success dropdown-toggle ms-2'); + + return $control; } protected function createComponentProgress(): Multiplier diff --git a/app/AccountancyModule/PaymentModule/presenters/PaymentPresenter.php b/app/AccountancyModule/PaymentModule/presenters/PaymentPresenter.php index 43ef190cb..4b2189bd0 100644 --- a/app/AccountancyModule/PaymentModule/presenters/PaymentPresenter.php +++ b/app/AccountancyModule/PaymentModule/presenters/PaymentPresenter.php @@ -5,6 +5,7 @@ namespace App\AccountancyModule\PaymentModule; use App\AccountancyModule\ExcelResponse; +use App\AccountancyModule\PaymentModule\Components\EmailButton; use App\AccountancyModule\PaymentModule\Components\GroupProgress; use App\AccountancyModule\PaymentModule\Components\GroupUnitControl; use App\AccountancyModule\PaymentModule\Components\ImportDialog; @@ -14,6 +15,7 @@ use App\AccountancyModule\PaymentModule\Components\PaymentList; use App\AccountancyModule\PaymentModule\Components\PaymentNoteDialog; use App\AccountancyModule\PaymentModule\Components\RemoveGroupDialog; +use App\AccountancyModule\PaymentModule\Factories\IEmailButtonFactory; use App\AccountancyModule\PaymentModule\Factories\IGroupUnitControlFactory; use App\AccountancyModule\PaymentModule\Factories\IImportDialogFactory; use App\AccountancyModule\PaymentModule\Factories\IMassAddFormFactory; @@ -26,17 +28,9 @@ use Model\DTO\Payment\Payment; use Model\DTO\Payment\Person; use Model\ExcelService; -use Model\Google\Exception\OAuthNotSet; -use Model\Google\InvalidOAuth; -use Model\Payment\Commands\Mailing\SendPaymentInfo; -use Model\Payment\EmailNotSet; use Model\Payment\GroupNotFound; -use Model\Payment\InvalidBankAccount; use Model\Payment\InvalidVariableSymbol; -use Model\Payment\MailingService; use Model\Payment\Payment\State; -use Model\Payment\PaymentClosed; -use Model\Payment\PaymentNotFound; use Model\Payment\ReadModel\Queries\MembersWithoutPaymentInGroupQuery; use Model\Payment\ReadModel\Queries\PaymentListQuery; use Model\PaymentService; @@ -64,16 +58,16 @@ class PaymentPresenter extends BasePresenter /** @var string[] */ protected array $readUnits; - private const NO_MAILER_MESSAGE = 'Nemáte nastavený mail pro odesílání u skupiny'; - private const NO_BANK_ACCOUNT_MESSAGE = 'Skupina nemá nastavený bankovní účet'; + /** @var Payment[] */ + protected array $payments; public function __construct( private PaymentService $model, protected UnitService $unitService, - private MailingService $mailing, private ExcelService $excelService, private IMassAddFormFactory $massAddFormFactory, private IPairButtonFactory $pairButtonFactory, + private IEmailButtonFactory $emailButtonFactory, private IGroupUnitControlFactory $unitControlFactory, private IRemoveGroupDialogFactory $removeGroupDialogFactory, private IPaymentDialogFactory $paymentDialogFactory, @@ -94,6 +88,7 @@ protected function startup(): void public function actionDefault(int $id): void { + $this->assertCanEditGroup(); $group = $this->model->getGroup($id); if ($group === null || ! $this->hasAccessToGroup($group)) { @@ -114,18 +109,15 @@ public function actionDefault(int $id): void $nextVS = null; } - $payments = $this->getPaymentsForGroup($id); - - $paymentsForSendEmail = $this->paymentsAvailableForGroupInfoSending($payments); + $this->payments = $this->getPaymentsForGroup($id); $this->template->setParameters([ 'group' => $group, 'nextVS' => $nextVS, - 'payments' => $payments, + 'payments' => $this->payments, 'summarize' => $this->model->getGroupSummaries([$id])[$id], 'now' => new DateTimeImmutable(), - 'isGroupSendActive' => $group->getState() === 'open' && ! empty($paymentsForSendEmail), - 'notSentPaymentsCount' => $this->countNotSentPayments($payments), + 'notSentPaymentsCount' => $this->countNotSentPayments($this->payments), ]); } @@ -154,21 +146,6 @@ public function actionMassAdd(int $id, int|null $unitId = null, bool $directMemb ]); } - public function handleCancel(int $pid): void - { - $this->assertCanEditGroup(); - - try { - $this->model->cancelPayment($pid); - } catch (PaymentNotFound) { - $this->flashMessage('Platba nenalezena!', 'danger'); - } catch (PaymentClosed) { - $this->flashMessage('Tato platba už je uzavřená', 'danger'); - } - - $this->redirect('this'); - } - private function assertCanEditGroup(): void { $group = $this->model->getGroup($this->id); @@ -181,85 +158,6 @@ private function assertCanEditGroup(): void $this->template->setParameters(['message' => 'Nemáte oprávnění pracovat s touto skupinou.']); } - public function handleSend(int $pid): void - { - $this->assertCanEditGroup(); - - $payment = $this->model->findPayment($pid); - - if ($payment === null) { - $this->flashMessage('Zadaná platba neexistuje', 'danger'); - $this->redirect('this'); - } - - if (empty($payment->getEmailRecipients())) { - $this->flashMessage('Platba nemá vyplněný e-mail', 'danger'); - $this->redirect('this'); - } - - try { - $this->sendEmailsForPayments([$payment]); - } catch (PaymentClosed) { - $this->flashMessage('Nelze odeslat uzavřenou platbu'); - } - } - - /** - * rozešle všechny neposlané e-maily - * - * @param int $gid groupId - */ - public function handleSendGroup(int $gid): void - { - $this->assertCanEditGroup(); - - $payments = $this->getPaymentsForGroup($gid); - - $this->sendEmailsForPayments($this->paymentsAvailableForGroupInfoSending($payments)); - } - - public function handleSendTest(int $gid): void - { - if (! $this->isEditable) { - $this->flashMessage('Neplatný požadavek na odeslání testovacího e-mailu!', 'danger'); - $this->redirect('this'); - } - - try { - $email = $this->mailing->sendTestMail($gid); - $this->flashMessage('Testovací e-mail byl odeslán na ' . $email . '.'); - } catch (OAuthNotSet) { - $this->flashMessage(self::NO_MAILER_MESSAGE, 'warning'); - } catch (InvalidOAuth $e) { - $this->oauthError($e); - } catch (InvalidBankAccount) { - $this->flashMessage(self::NO_BANK_ACCOUNT_MESSAGE, 'warning'); - } catch (EmailNotSet) { - $this->flashMessage('Nemáte nastavený e-mail ve skautisu, na který by se odeslal testovací e-mail!', 'danger'); - } - - $this->redirect('this'); - } - - public function handleComplete(int $pid): void - { - if (! $this->isEditable) { - $this->flashMessage('Nejste oprávněni k uzavření platby!', 'danger'); - $this->redirect('this'); - } - - try { - $this->model->completePayment($pid); - $this->flashMessage('Platba byla zaplacena.'); - } catch (PaymentClosed) { - $this->flashMessage('Tato platba už je uzavřená', 'danger'); - } catch (InvalidOAuth $exc) { - $this->flashMessage($exc->getExplainedMessage(), 'danger'); - } - - $this->redirect('this'); - } - public function handleGenerateVs(): void { $this->assertCanEditGroup(); @@ -386,6 +284,13 @@ protected function createComponentPairButton(): PairButton return $this->pairButtonFactory->create(); } + protected function createComponentEmailButton(): EmailButton + { + $group = $this->model->getGroup($this->id); + + return $this->emailButtonFactory->create($this->isEditable, $this->payments, $group); + } + protected function createComponentMassAddForm(): MassAddForm { return $this->massAddFormFactory->create($this->id); @@ -408,65 +313,12 @@ protected function createComponentProgress(): GroupProgress return new GroupProgress($this->model->getGroupSummaries([$this->id])[$this->id]); } - private function oauthError(InvalidOAuth $e): void - { - $this->flashMessage($e->getExplainedMessage(), 'danger'); - } - - /** @param Payment[] $payments */ - private function sendEmailsForPayments(array $payments): void - { - $sentCount = 0; - - try { - foreach ($payments as $payment) { - $this->commandBus->handle(new SendPaymentInfo($payment->getId())); - $sentCount++; - } - } catch (OAuthNotSet) { - $this->flashMessage(self::NO_MAILER_MESSAGE, 'warning'); - $this->redirect('this'); - } catch (InvalidBankAccount) { - $this->flashMessage(self::NO_BANK_ACCOUNT_MESSAGE, 'warning'); - $this->redirect('this'); - } catch (InvalidOAuth $e) { - $this->oauthError($e); - $this->redirect('this'); - } - - if ($sentCount > 0) { - $this->flashMessage( - $sentCount === 1 - ? 'Informační e-mail byl odeslán' - : 'Informační e-maily (' . $sentCount . ') byly odeslány', - 'success', - ); - } - - $this->redirect('this'); - } - /** @return Payment[] */ private function getPaymentsForGroup(int $groupId): array { return $this->queryBus->handle(new PaymentListQuery($groupId)); } - /** - * @param Payment[] $payments - * - * @return Payment[] - */ - private function paymentsAvailableForGroupInfoSending(array $payments): array - { - return array_filter( - $payments, - function (Payment $p) { - return ! $p->isClosed() && ! empty($p->getEmailRecipients()) && $p->getSentEmails() === []; - }, - ); - } - /** @param Payment[] $payments */ private function countNotSentPayments(array $payments): int { diff --git a/app/AccountancyModule/PaymentModule/templates/GroupList/default.latte b/app/AccountancyModule/PaymentModule/templates/GroupList/default.latte index 2c091e761..778d085ca 100644 --- a/app/AccountancyModule/PaymentModule/templates/GroupList/default.latte +++ b/app/AccountancyModule/PaymentModule/templates/GroupList/default.latte @@ -18,46 +18,7 @@
diff --git a/app/AccountancyModule/PaymentModule/templates/Payment/default.latte b/app/AccountancyModule/PaymentModule/templates/Payment/default.latte index f857cc5c7..6f3512333 100644 --- a/app/AccountancyModule/PaymentModule/templates/Payment/default.latte +++ b/app/AccountancyModule/PaymentModule/templates/Payment/default.latte @@ -50,23 +50,7 @@ Časopisy {/if} -
- - -
+ {control emailButton:light} {control pairButton:light} diff --git a/app/AccountancyModule/PaymentModule/templates/defaultEmails/payment_reminder.html b/app/AccountancyModule/PaymentModule/templates/defaultEmails/payment_reminder.html new file mode 100644 index 000000000..4bec5ff79 --- /dev/null +++ b/app/AccountancyModule/PaymentModule/templates/defaultEmails/payment_reminder.html @@ -0,0 +1,19 @@ +Dobrý den, +evidujeme, že níže uvedená platba je po splatnosti (splatnost: %maturity%). Prosíme o její úhradu. + +Informace k platbě:
+Účel platby: %name%
+Číslo účtu: %account%
+Částka: %amount% Kč
+Datum splatnosti: %maturity%
+VS: %vs%
+KS: %ks% + +Pro zrychlení platby jsme připravili QR kód, který lze použít při placení v mobilních aplikacích bank. Použití QR kódu šetří váš čas a snižuje pravděpodobnost překlepu. +%qrcode% + +Pokud již byla platba uhrazena, děkujeme a tento e-mail prosím považujte za bezpředmětný. + +Děkujeme za rychlou úhradu. + +
Tento e-mail byl vygenerován automaticky systémem Skautského hospodaření online (h.skauting.cz) a odeslán uživatelem %user%. \ No newline at end of file diff --git a/app/AccountancyModule/TravelModule/Components/CommandForm.php b/app/AccountancyModule/TravelModule/Components/CommandForm.php index 775770729..2ba731740 100644 --- a/app/AccountancyModule/TravelModule/Components/CommandForm.php +++ b/app/AccountancyModule/TravelModule/Components/CommandForm.php @@ -233,7 +233,7 @@ private function createCommand(ArrayHash $values): void $values['unit'], ); - $this->flashMessage('Cestovní příkaz byl založen.'); + $this->presenter->flashMessage('Cestovní příkaz byl založen.'); } private function updateCommand(ArrayHash $values): void @@ -253,7 +253,7 @@ private function updateCommand(ArrayHash $values): void $values['unit'], ); - $this->flashMessage('Cestovní příkaz byl upraven.'); + $this->presenter->flashMessage('Cestovní příkaz byl upraven.'); } /** diff --git a/app/AccountancyModule/TravelModule/Components/VehicleGrid.php b/app/AccountancyModule/TravelModule/Components/VehicleGrid.php index c68ce8cd6..ba12ec28d 100644 --- a/app/AccountancyModule/TravelModule/Components/VehicleGrid.php +++ b/app/AccountancyModule/TravelModule/Components/VehicleGrid.php @@ -6,11 +6,12 @@ use App\AccountancyModule\Factories\BaseGridControl; use App\AccountancyModule\Factories\GridFactory; -use Doctrine\Common\Collections\ArrayCollection; +use Model\Travel\VehicleLinkedRecord; +use Model\Travel\VehicleNotFound; use Model\TravelService; use Model\UnitService; +use Ublaboo\DataGrid\Column\Action\Confirmation\StringConfirmation; use Ublaboo\DataGrid\DataGrid; -use Ublaboo\DataGrid\DataSource\DoctrineCollectionDataSource; class VehicleGrid extends BaseGridControl { @@ -27,28 +28,62 @@ protected function createComponentGrid(): DataGrid ['units' => $units], ); - $grid->addColumnLink('type', 'Typ', 'Vehicle:detail') + $grid->addColumnText('type', 'Typ') ->setSortable(); - $grid->addColumnText('registration', 'SPZ'); + $grid->addColumnLink('registration', 'SPZ', 'Vehicle:detail') + ->setFilterText(); $grid->addColumnText('consumption', 'Ø spotřeba (l/100 km)'); $grid->addColumnText('subunit', 'Oddíl') ->setFilterSelect($units, 'subunitId')->setPrompt('Všechny'); - $grid->addColumnDateTime('createdAt', 'Vytvořeno') + $grid->addColumnDateTime('metadata.createdAt', 'Vytvořeno') ->setSortable(); - $grid->addColumnDateTime('authorName', 'Vytvořil') - ->setSortable() - ->setFilterText(); + $grid->addColumnDateTime('metadata.authorName', 'Vytvořil') + ->setSortable(); - $grid->addFilterText('search', '', ['type', 'authorName']) + $grid->addFilterText('search', '', ['type', 'v.metadata.authorName', 'registration']) ->setPlaceholder('Typ vozdila, uživatel...'); - $vehicles = $this->travel->getAllVehicles($this->unitId); - $grid->setDataSource(new DoctrineCollectionDataSource(new ArrayCollection($vehicles), 'id')); + $grid->setDataSource($this->travel->getVehiclesByFilter()); + + $grid->addAction('edit', '', 'Vehicle:detail', ['id' => 'id']) + ->setIcon('far fa-edit') + ->setTitle('Detail vozidla') + ->setClass('btn btn-sm btn-secondary'); + + $grid->addAction('delete', '', 'remove!', ['id' => 'id']) + ->setIcon('far fa-trash-can') + ->setTitle('Smazat vozidlo') + ->setClass('btn btn-sm btn-danger') + ->setConfirmation( + new StringConfirmation('Opravdu chceš smazat řádek %s?', 'registration'), // Second parameter is optional + ); return $grid; } + + public function handleRemove(int $id): void + { + // Check whether vehicle exists and belongs to unit + /*$vehicle = $this->getVehicle($vehicleId); + if (! $this->isVehicleEditable($vehicle)) { + $this->setView('accessDenied'); + + return; + }*/ + + try { + $this->travel->removeVehicle($id); + $this->flashMessage('Vozidlo bylo odebráno.'); + } catch (VehicleLinkedRecord) { + $this->flashMessage('Nelze smazat vozidlo s cestovními příkazy.', 'warning'); + } catch (VehicleNotFound) { + $this->flashMessage('Vozidlo nebylo nalezeno', 'warning'); + } + + $this->redirect('VehicleList:default'); + } } diff --git a/app/AccountancyModule/TravelModule/presenters/VehiclePresenter.php b/app/AccountancyModule/TravelModule/presenters/VehiclePresenter.php index b4ef92e39..74a152f18 100644 --- a/app/AccountancyModule/TravelModule/presenters/VehiclePresenter.php +++ b/app/AccountancyModule/TravelModule/presenters/VehiclePresenter.php @@ -12,6 +12,8 @@ use Model\DTO\Travel\Vehicle as VehicleDTO; use Model\Travel\Commands\Vehicle\CreateVehicle; use Model\Travel\ReadModel\Queries\Vehicle\RoadworthyScansQuery; +use Model\Travel\VehicleLinkedRecord; +use Model\Travel\VehicleNotFound; use Model\TravelService; use Model\Unit\ReadModel\Queries\UnitQuery; use Model\Unit\Unit; @@ -113,10 +115,13 @@ public function handleRemove(int $vehicleId): void return; } - if ($this->travelService->removeVehicle($vehicleId)) { + try { + $this->travelService->removeVehicle($vehicleId); $this->flashMessage('Vozidlo bylo odebráno.'); - } else { + } catch (VehicleLinkedRecord) { $this->flashMessage('Nelze smazat vozidlo s cestovními příkazy.', 'warning'); + } catch (VehicleNotFound) { + $this->flashMessage('Vozidlo nebylo nalezeno', 'warning'); } $this->redirect('VehicleList:default'); diff --git a/app/AccountancyModule/TravelModule/templates/Contract/default.latte b/app/AccountancyModule/TravelModule/templates/Contract/default.latte index 1c62d96f4..694fc463c 100644 --- a/app/AccountancyModule/TravelModule/templates/Contract/default.latte +++ b/app/AccountancyModule/TravelModule/templates/Contract/default.latte @@ -12,21 +12,21 @@
- + - +
  Vykonavatel/Řidič Zástupce jednotky Platná od: Platná do:Akce 
- Vytisknout - Detail - {$c->passenger->name} {$c->unitRepresentative} {$c->since?->toNative()|date:"j. n. Y"} {$c->until?->toNative()|date:"j. n. Y"} + Vytisknout + Detail +
diff --git a/app/AccountancyModule/TravelModule/templates/Contract/detail.latte b/app/AccountancyModule/TravelModule/templates/Contract/detail.latte index b92517115..8e5a660e0 100644 --- a/app/AccountancyModule/TravelModule/templates/Contract/detail.latte +++ b/app/AccountancyModule/TravelModule/templates/Contract/detail.latte @@ -3,12 +3,12 @@
diff --git a/app/AccountancyModule/TravelModule/templates/Vehicle/detail.latte b/app/AccountancyModule/TravelModule/templates/Vehicle/detail.latte index d3222733b..32128d1fd 100644 --- a/app/AccountancyModule/TravelModule/templates/Vehicle/detail.latte +++ b/app/AccountancyModule/TravelModule/templates/Vehicle/detail.latte @@ -5,7 +5,7 @@
Toto vozidlo je archivované.
{else} - + Archivovat {/if} diff --git a/app/config/config.neon b/app/config/config.neon index 990faf0ad..647309fa2 100644 --- a/app/config/config.neon +++ b/app/config/config.neon @@ -29,11 +29,10 @@ console: helperSet: Symfony\Component\Console\Helper\HelperSet([ # Helpery required by Doctrine Migrations commands em: Doctrine\ORM\Tools\Console\Helper\EntityManagerHelper(), - db: Doctrine\DBAL\Tools\Console\Helper\ConnectionHelper(), + # Helpery required by Doctrine DBAL a ORM commands entityManager: Doctrine\ORM\Tools\Console\Helper\EntityManagerHelper(), - connection: Doctrine\DBAL\Tools\Console\Helper\ConnectionHelper(), question: Symfony\Component\Console\Helper\QuestionHelper(), ]) @@ -53,6 +52,7 @@ extensions: messenger: Fmasa\Messenger\DI\MessengerExtension console: Contributte\Console\DI\ConsoleExtension(%consoleMode%) console.cache: Contributte\Console\Extra\DI\CacheConsoleExtension(%consoleMode%) + scheduler: Contributte\Scheduler\DI\SchedulerExtension search: command handlers: @@ -151,6 +151,9 @@ services: - Model\Services\PdfRenderer(%tempDir%) + group: + factory: Model\GroupService + - Model\PaymentService - Model\Payment\BankAccountService(fioCache: @fio.cache) @@ -239,14 +242,21 @@ services: - Model\Infrastructure\Log\Monolog\UserContextProcessor() - Model\Infrastructure\Log\Monolog\FormContextProcessor() +scheduler: + jobs: + # stats must be registered as service and have method calculate + #- { cron: '* * * * *', callback: [ @fio.client, get ] } + - { cron: '* * * * *', callback: [ @group, reminder ] } + + decorator: Monolog\Logger: setup: - pushHandler(Monolog\Handler\RotatingFileHandler(%logDir%/log.log, 90, Monolog\Logger::INFO)) - Doctrine\DBAL\Logging\LoggerChain: + Doctrine\DBAL\Configuration: setup: - - addLogger(Model\Infrastructure\SQLLogger()) + - setMiddlewares([Doctrine\DBAL\Logging\Middleware(@Monolog\Logger)]) includes: - model/doctrine.neon diff --git a/app/config/model/doctrine.neon b/app/config/model/doctrine.neon index 8965a9511..0e5e62906 100644 --- a/app/config/model/doctrine.neon +++ b/app/config/model/doctrine.neon @@ -25,6 +25,10 @@ dbal: serverVersion: 8.0 driver: pdo_mysql + typesMapping: + enum: string_enum + set: string + types: string_enum: class: Consistence\Doctrine\Enum\Type\StringEnumType diff --git a/app/model/Bank/BankService.php b/app/model/Bank/BankService.php index 44b68d357..0099f1203 100644 --- a/app/model/Bank/BankService.php +++ b/app/model/Bank/BankService.php @@ -81,6 +81,7 @@ function (Group $g) { } $payments = $this->payments->findByMultipleGroups(array_keys($groups)); + $payments = array_filter( $payments, function (Payment $p) { diff --git a/app/model/Bank/Fio/FioClient.php b/app/model/Bank/Fio/FioClient.php index 6e5d08e5e..cdc942aa2 100644 --- a/app/model/Bank/Fio/FioClient.php +++ b/app/model/Bank/Fio/FioClient.php @@ -21,12 +21,27 @@ use function array_reverse; use function sprintf; +use const PHP_EOL; + class FioClient implements IFioClient { public function __construct(private IDownloaderFactory $downloaderFactory, private LoggerInterface $logger) { } + public function get(): void + { + //TODO + /* + * Vytvorit tabulku s nastavení účtů a plateb pro automatické párování, nebudou se vždy párovat všechny účtu a všechny platby + * Pokud bude mít uživatel možnost nastavit čas párování, pak je potřeba zadat jej do nastavení a zohlednit při stahování z banky + * Stáhnout platby všech nastavených účtů + * Provést párování a zapsat do dané platby, kolik plateb bylo kdy spárováno. Toto číslo vypsat uživateli + * Přesunout do obecné servisy, aby bylo možné případně napojit i jiné banky. + */ + echo 'GET' . PHP_EOL; + } + /** * {@inheritDoc} */ diff --git a/app/model/Budget/Category.php b/app/model/Budget/Category.php index 425f9a74f..cd8a475cb 100644 --- a/app/model/Budget/Category.php +++ b/app/model/Budget/Category.php @@ -36,7 +36,7 @@ class Category * @ORM\Column(type="string_enum") * * @var Operation - * @EnumAnnotation(class=\Model\Cashbook\Operation::class) + * @EnumAnnotation(class=Operation::class) * @phpcsSuppress SlevomatCodingStandard.TypeHints.PropertyTypeHint.MissingNativeTypeHint */ private $type; @@ -44,7 +44,7 @@ class Category /** * @ORM\OneToMany(targetEntity="Category", mappedBy="parent",cascade={"persist"}) * - * @var Collection + * @var Collection&iterable */ private Collection $children; diff --git a/app/model/Cashbook/Cashbook.php b/app/model/Cashbook/Cashbook.php index a682d9195..344bcba90 100644 --- a/app/model/Cashbook/Cashbook.php +++ b/app/model/Cashbook/Cashbook.php @@ -60,8 +60,7 @@ class Cashbook extends Aggregate /** * @ORM\OneToMany(targetEntity=Chit::class, mappedBy="cashbook", cascade={"persist", "remove"}, orphanRemoval=true) * - * @var Collection|Chit[] - * @phpstan-var Collection + * @var Collection&iterable */ private Collection $chits; diff --git a/app/model/Cashbook/Cashbook/CashbookType.php b/app/model/Cashbook/Cashbook/CashbookType.php index 9db4f2c6d..78ef5f14d 100644 --- a/app/model/Cashbook/Cashbook/CashbookType.php +++ b/app/model/Cashbook/Cashbook/CashbookType.php @@ -62,7 +62,7 @@ public static function getInverseCashbookTypes(int $chitCategoryId): array foreach ([self::TRANSFER_FROM_CATEGORY_IDS, self::TRANSFER_TO_CATEGORY_IDS] as $categoryIdsByType) { $types = array_filter( array_keys($categoryIdsByType), - fn (string $cashbookType) => $categoryIdsByType[$cashbookType] === $chitCategoryId + fn (string $cashbookType) => $categoryIdsByType[$cashbookType] === $chitCategoryId, ); if (count($types) !== 0) { diff --git a/app/model/Cashbook/Cashbook/Chit.php b/app/model/Cashbook/Cashbook/Chit.php index 59436a445..d17b78142 100644 --- a/app/model/Cashbook/Cashbook/Chit.php +++ b/app/model/Cashbook/Cashbook/Chit.php @@ -57,8 +57,7 @@ class Chit * } * ) * - * @var Collection|ChitItem[] - * @phpstan-var Collection + * @var Collection&iterable */ private Collection $items; @@ -86,8 +85,7 @@ class Chit * orphanRemoval=true * ) * - * @phpstan-var Collection - * @var Collection|ChitScan[] + * @var Collection&iterable */ private Collection $scans; diff --git a/app/model/Cashbook/Category.php b/app/model/Cashbook/Category.php index b5f4479e8..70bc38f63 100644 --- a/app/model/Cashbook/Category.php +++ b/app/model/Cashbook/Category.php @@ -49,7 +49,7 @@ class Category implements ICategory /** * @ORM\OneToMany(targetEntity=Category\ObjectType::class, mappedBy="category") * - * @var Collection + * @var Collection&iterable<\Model\Cashbook\Category\ObjectType> */ private Collection $types; diff --git a/app/model/Cashbook/Unit.php b/app/model/Cashbook/Unit.php index ba333f7fc..0aeef5728 100644 --- a/app/model/Cashbook/Unit.php +++ b/app/model/Cashbook/Unit.php @@ -31,7 +31,7 @@ class Unit extends Aggregate /** * @ORM\OneToMany(targetEntity=Cashbook::class, mappedBy="unit", cascade={"persist", "remove"}, orphanRemoval=true) * - * @var ArrayCollection + * @var ArrayCollection&iterable * @phpcsSuppress SlevomatCodingStandard.TypeHints.PropertyTypeHint.MissingNativeTypeHint */ private $cashbooks; diff --git a/app/model/DTO/Payment/Group.php b/app/model/DTO/Payment/Group.php index d42f260cc..06725a9fd 100644 --- a/app/model/DTO/Payment/Group.php +++ b/app/model/DTO/Payment/Group.php @@ -21,6 +21,7 @@ * @property-read int|NULL $constantSymbol * @property-read VariableSymbol|NULL $nextVariableSymbol * @property-read string $state + * @property-read bool $isRemindersEnabled * @property-read OAuthId|NULL $oAuthId * @property-read string $note */ @@ -43,6 +44,7 @@ public function __construct( private OAuthId|null $oAuthId = null, private string $note, private int|null $bankAccountId = null, + private bool $isRemindersEnabled = false, ) { } @@ -116,4 +118,9 @@ public function getBankAccountId(): int|null { return $this->bankAccountId; } + + public function isRemindersEnabled(): bool + { + return $this->isRemindersEnabled; + } } diff --git a/app/model/DTO/Payment/GroupFactory.php b/app/model/DTO/Payment/GroupFactory.php index 197b15ac9..afa56ef53 100644 --- a/app/model/DTO/Payment/GroupFactory.php +++ b/app/model/DTO/Payment/GroupFactory.php @@ -26,6 +26,7 @@ public static function create(GroupEntity $group): Group $group->getOauthId(), $group->getNote(), $group->getBankAccountId(), + $group->isRemindersEnabled(), ); } } diff --git a/app/model/DTO/Payment/Payment.php b/app/model/DTO/Payment/Payment.php index 2546b46c3..4247c09e5 100644 --- a/app/model/DTO/Payment/Payment.php +++ b/app/model/DTO/Payment/Payment.php @@ -113,6 +113,11 @@ public function isClosed(): bool return $this->closed; } + public function isOverdue(): bool + { + return ! $this->closed && $this->dueDate->isPast() && $this->state->equalsValue(State::PREPARING); + } + public function getState(): State { return $this->state; diff --git a/app/model/Event/Camp.php b/app/model/Event/Camp.php index c24dcc71c..c461d4feb 100644 --- a/app/model/Event/Camp.php +++ b/app/model/Event/Camp.php @@ -24,9 +24,6 @@ class Camp implements ISkautisEvent { use SmartObject; - public const STATE_APPROVED_PARENT = 'approvedParent'; - public const STATE_REAL = 'real'; - /** @param UnitId[] $participatingUnits */ public function __construct( private SkautisCampId $id, diff --git a/app/model/Event/CampState.php b/app/model/Event/CampState.php new file mode 100644 index 000000000..7ec625143 --- /dev/null +++ b/app/model/Event/CampState.php @@ -0,0 +1,28 @@ + + */ + public static function toArray(): array + { + return array_column(self::cases(), 'value'); + } +} diff --git a/app/model/Event/Event.php b/app/model/Event/Event.php index 87b58c863..fc2683a96 100644 --- a/app/model/Event/Event.php +++ b/app/model/Event/Event.php @@ -99,7 +99,7 @@ public function getUnitName(): string public function isOpen(): bool { - return $this->state === 'draft'; + return $this->state === EventState::DRAFT->value; } public function getState(): string diff --git a/app/model/Event/EventState.php b/app/model/Event/EventState.php new file mode 100644 index 000000000..f3748da23 --- /dev/null +++ b/app/model/Event/EventState.php @@ -0,0 +1,24 @@ + + */ + public static function toArray(): array + { + return array_column(self::cases(), 'value'); + } +} diff --git a/app/model/Event/ReadModel/Queries/CampStatsQuery.php b/app/model/Event/ReadModel/Queries/CampStatsQuery.php new file mode 100644 index 000000000..e9be171db --- /dev/null +++ b/app/model/Event/ReadModel/Queries/CampStatsQuery.php @@ -0,0 +1,18 @@ +year; + } +} diff --git a/app/model/Event/ReadModel/Queries/EventStatsQuery.php b/app/model/Event/ReadModel/Queries/EventStatsQuery.php new file mode 100644 index 000000000..0d66fc95b --- /dev/null +++ b/app/model/Event/ReadModel/Queries/EventStatsQuery.php @@ -0,0 +1,18 @@ +year; + } +} diff --git a/app/model/Event/ReadModel/QueryHandlers/CampStatsQueryHandler.php b/app/model/Event/ReadModel/QueryHandlers/CampStatsQueryHandler.php new file mode 100644 index 000000000..d5a6bc289 --- /dev/null +++ b/app/model/Event/ReadModel/QueryHandlers/CampStatsQueryHandler.php @@ -0,0 +1,39 @@ + */ + public function __invoke(CampStatsQuery $query): array + { + $camps = $this->skautis->event->EventCampAll(['Year' => $query->getYear()]); + + $counters = []; + foreach (CampState::toArray() as $state) { + $counters[$state] = 0; + } + + foreach ($camps as $camp) { + $state = $camp->ID_EventCampState; + if (! isset($counters[$state])) { + continue; + } + + $counters[$state]++; + } + + return $counters; + } +} diff --git a/app/model/Event/ReadModel/QueryHandlers/EventStatsQueryHandler.php b/app/model/Event/ReadModel/QueryHandlers/EventStatsQueryHandler.php new file mode 100644 index 000000000..d527fe989 --- /dev/null +++ b/app/model/Event/ReadModel/QueryHandlers/EventStatsQueryHandler.php @@ -0,0 +1,48 @@ + */ + public function __invoke(EventStatsQuery $query): array + { + $events = $this->skautis->event->eventGeneralAll([ + 'IsRelation' => true, + 'Year' => $query->getYear(), + ]); + + $counters = []; + foreach (EventState::toArray() as $event) { + $counters[$event] = 0; + } + + if (is_object($events)) { + return $counters; + } + + foreach ($events as $event) { + $state = $event->ID_EventGeneralState; + if (! isset($counters[$state])) { + continue; + } + + $counters[$state]++; + } + + return $counters; + } +} diff --git a/app/model/Infrastructure/Dql/FieldFunction.php b/app/model/Infrastructure/Dql/FieldFunction.php new file mode 100644 index 000000000..d66195027 --- /dev/null +++ b/app/model/Infrastructure/Dql/FieldFunction.php @@ -0,0 +1,55 @@ + */ + private array $vals = []; + + public function parse(Parser $parser): void + { + $lexer = $parser->getLexer(); + + // FIELD( + $parser->match(TokenType::T_IDENTIFIER); + $parser->match(TokenType::T_OPEN_PARENTHESIS); + + // první výraz + $this->expr = $parser->ArithmeticPrimary(); + + // , val1, val2, ... + do { + $parser->match(TokenType::T_COMMA); + $this->vals[] = $parser->ArithmeticPrimary(); + } while (! $lexer->isNextToken(TokenType::T_CLOSE_PARENTHESIS)); + + $parser->match(TokenType::T_CLOSE_PARENTHESIS); + } + + public function getSql(SqlWalker $sqlWalker): string + { + $parts = [$this->expr->dispatch($sqlWalker)]; + foreach ($this->vals as $v) { + $parts[] = $v->dispatch($sqlWalker); + } + + return 'FIELD(' . implode(', ', $parts) . ')'; + } +} diff --git a/app/model/Infrastructure/EntityManagerFactory.php b/app/model/Infrastructure/EntityManagerFactory.php index 57595014b..42b4b1020 100644 --- a/app/model/Infrastructure/EntityManagerFactory.php +++ b/app/model/Infrastructure/EntityManagerFactory.php @@ -7,9 +7,9 @@ use Consistence\Doctrine\Enum\EnumPostLoadEntityListener; use Contributte\Psr6\ICachePoolFactory; use Doctrine\Common\Annotations\AnnotationReader; -use Doctrine\Common\Annotations\AnnotationRegistry; -use Doctrine\Common\Annotations\CachedReader; -use Doctrine\Common\Cache\FilesystemCache; +use Doctrine\Common\Annotations\PsrCachedReader; +use Doctrine\Common\Annotations\Reader; +use Doctrine\Common\Cache\Psr6\DoctrineProvider; use Doctrine\DBAL\Connection; use Doctrine\ORM\Cache\CacheConfiguration; use Doctrine\ORM\Cache\DefaultCacheFactory; @@ -18,36 +18,59 @@ use Doctrine\ORM\Events; use Doctrine\ORM\Mapping\Driver\AnnotationDriver; use Doctrine\ORM\Mapping\UnderscoreNamingStrategy; +use Doctrine\ORM\ORMSetup; use Doctrine\ORM\Tools\Setup; -use DoctrineExtensions\Query\Mysql\Field; use Model\Infrastructure\DoctrineNullableEmbeddables\Subscriber; +use Psr\Cache\CacheItemPoolInterface; + +use function class_exists; use const CASE_LOWER; +// BC wrapper pro lib očekávající Doctrine Cache +// dostupné v novějších ORM + final class EntityManagerFactory { - public function __construct(private bool $debugMode, private string $tempDir, private Connection $connection, private ICachePoolFactory $cachePoolFactory) - { + public function __construct( + private bool $debugMode, + private string $tempDir, + private Connection $connection, + private ICachePoolFactory $cachePoolFactory, + ) { } public function create(): EntityManager { - $configuration = Setup::createConfiguration( - $this->debugMode, - $this->tempDir . '/doctrine/proxies', - $this->cache('cache'), - ); + $proxyDir = $this->tempDir . '/doctrine/proxies'; + + // jednotná defaultní cache pro ORMSetup factory – klidně použij "metadata" pool + $defaultCache = $this->cache('metadata'); // CacheItemPoolInterface + + $configuration = class_exists(ORMSetup::class) + // ✅ tímhle obejdeš Redis/Memcached autodetekci uvnitř ORMSetup + ? ORMSetup::createConfiguration($this->debugMode, $proxyDir, $defaultCache) + : Setup::createConfiguration($this->debugMode, $proxyDir); + + // klidně ponech separátní pooly pro jemnější řízení + $configuration->setMetadataCache($this->cache('metadata')); + $configuration->setQueryCache($this->cache('query')); + // DBAL result cache + $this->connection->getConfiguration()->setResultCache($this->cache('result')); $annotationsReader = $this->annotationsReader(); + $configuration->setMetadataDriverImpl( + new AnnotationDriver($annotationsReader, [__DIR__ . '/../']), + ); - $configuration->setMetadataDriverImpl(new AnnotationDriver($annotationsReader, [__DIR__ . '/../'])); $configuration->setNamingStrategy(new UnderscoreNamingStrategy(CASE_LOWER, true)); - $configuration->addCustomStringFunction('field', Field::class); + //$configuration->addCustomStringFunction('field', Field::class); + $configuration->addCustomStringFunction('field', Dql\FieldFunction::class); $configuration->setSecondLevelCacheEnabled(true); $cacheConfiguration = new CacheConfiguration(); $cacheConfiguration->setCacheFactory( - new DefaultCacheFactory(new RegionsConfiguration(), $this->cachePoolFactory->create('secondLevelCache')), + new DefaultCacheFactory(new RegionsConfiguration(), $this->cache('secondLevel')), ); $configuration->setSecondLevelCacheConfiguration($cacheConfiguration); @@ -55,23 +78,27 @@ public function create(): EntityManager $eventManager = $entityManager->getEventManager(); $eventManager->addEventSubscriber(new Subscriber($annotationsReader)); + // Enum listener typicky očekává Doctrine Cache → zabalíme PSR-6 pool $eventManager->addEventListener( Events::postLoad, - new EnumPostLoadEntityListener($annotationsReader, $this->cache('enums')), + new EnumPostLoadEntityListener($annotationsReader, DoctrineProvider::wrap($this->cache('enums'))), ); return $entityManager; } - private function annotationsReader(): CachedReader + private function annotationsReader(): Reader { - AnnotationRegistry::registerUniqueLoader('class_exists'); - - return new CachedReader(new AnnotationReader(), $this->cache('annotations'), $this->debugMode); + return new PsrCachedReader( + new AnnotationReader(), + $this->cache('annotations'), + $this->debugMode, + ); } - private function cache(string $name): FilesystemCache + private function cache(string $name): CacheItemPoolInterface { - return new FilesystemCache($this->tempDir . '/cache/doctrine/' . $name); + // vytvoří PSR-6 pool (Filesystem/Redis/… podle implementace ICachePoolFactory) + return $this->cachePoolFactory->create('doctrine.' . $name); } } diff --git a/app/model/Infrastructure/Repositories/Payment/GroupRepository.php b/app/model/Infrastructure/Repositories/Payment/GroupRepository.php index 007a3ee56..7925096be 100644 --- a/app/model/Infrastructure/Repositories/Payment/GroupRepository.php +++ b/app/model/Infrastructure/Repositories/Payment/GroupRepository.php @@ -10,6 +10,7 @@ use Model\Common\Services\EventBus; use Model\Google\OAuthId; use Model\Payment\DomainEvents\GroupWasRemoved; +use Model\Payment\EmailType; use Model\Payment\Group; use Model\Payment\Group\Type; use Model\Payment\GroupNotFound; @@ -58,6 +59,23 @@ public function findByIds(array $ids): array return $groups; } + /** + * {@inheritDoc} + */ + public function findByReminder(): array + { + return $this->em->createQueryBuilder() + ->select('g') + ->from(Group::class, 'g', 'g.id') + ->leftJoin(Group\Email::class, 'e', Join::WITH, 'e.group = g') + ->where('g.isRemindersEnabled = 1') + ->andWhere('e.type = :reminder') + ->andWhere('e.enabled = 1') + ->setParameter('reminder', EmailType::PAYMENT_REMINDER) + ->getQuery() + ->getResult(); + } + /** * {@inheritDoc} */ diff --git a/app/model/Infrastructure/Repositories/Payment/PaymentRepository.php b/app/model/Infrastructure/Repositories/Payment/PaymentRepository.php index 9588c8981..ff2010178 100644 --- a/app/model/Infrastructure/Repositories/Payment/PaymentRepository.php +++ b/app/model/Infrastructure/Repositories/Payment/PaymentRepository.php @@ -5,7 +5,9 @@ namespace Model\Infrastructure\Repositories\Payment; use Assert\Assert; +use DateTimeImmutable; use Model\Infrastructure\Repositories\AggregateRepository; +use Model\Payment\EmailType; use Model\Payment\Payment; use Model\Payment\Payment\State; use Model\Payment\PaymentNotFound; @@ -104,6 +106,37 @@ public function findByMultipleGroups(array $groupIds): array ->getResult(); } + /** + * {@inheritDoc} + */ + public function findByReminder(array $groupIds): array + { + Assert::thatAll($groupIds)->integer(); + + if (empty($groupIds)) { + return []; + } + + return $this->getEntityManager()->createQueryBuilder() + ->select('p, e') + ->from(Payment::class, 'p') + ->leftJoin('p.sentEmails', 'e') + ->where('p.groupId IN (:groupIds)') + ->andWhere('p.state = :state') + ->andWhere('p.dueDate <= :dueDate') + ->andWhere( + 'NOT EXISTS ( + SELECT 1 FROM ' . Payment\SentEmail::class . ' se + WHERE se.payment = p AND se.type = :reminderType)', + ) + ->setParameter('groupIds', $groupIds) + ->setParameter('state', State::PREPARING) + ->setParameter('dueDate', (new DateTimeImmutable())->format('Y-m-d')) + ->setParameter('reminderType', EmailType::PAYMENT_REMINDER) + + ->getQuery()->getResult(); + } + public function save(Payment $payment): void { $this->saveAndDispatchEvents($payment); diff --git a/app/model/Infrastructure/Repositories/Travel/VehicleRepository.php b/app/model/Infrastructure/Repositories/Travel/VehicleRepository.php index ba93e5d48..7e7f5f2cf 100644 --- a/app/model/Infrastructure/Repositories/Travel/VehicleRepository.php +++ b/app/model/Infrastructure/Repositories/Travel/VehicleRepository.php @@ -5,6 +5,7 @@ namespace Model\Infrastructure\Repositories\Travel; use Doctrine\ORM\EntityManager; +use Doctrine\ORM\QueryBuilder; use Model\Travel\Repositories\IVehicleRepository; use Model\Travel\Vehicle; use Model\Travel\VehicleNotFound; @@ -64,6 +65,14 @@ public function findByUnit(int $unitId): array return array_values($vehicles); } + public function findByFilter(): QueryBuilder + { + return $this->em->createQueryBuilder() + ->select('v') + ->from(Vehicle::class, 'v', 'v.id') + ->where('v.archived = FALSE'); + } + public function save(Vehicle $vehicle): void { $this->em->persist($vehicle); diff --git a/app/model/Payment/Commands/Mailing/SendPaymentReminder.php b/app/model/Payment/Commands/Mailing/SendPaymentReminder.php new file mode 100644 index 000000000..55431e2b7 --- /dev/null +++ b/app/model/Payment/Commands/Mailing/SendPaymentReminder.php @@ -0,0 +1,25 @@ +paymentId; + } + + public function isCli(): bool + { + return $this->cli; + } +} diff --git a/app/model/Payment/EmailType.php b/app/model/Payment/EmailType.php index b7bcb7812..20fb33cab 100644 --- a/app/model/Payment/EmailType.php +++ b/app/model/Payment/EmailType.php @@ -16,6 +16,10 @@ final class EmailType extends Enum public const PAYMENT_COMPLETED = 'payment_completed'; + public const PAYMENT_CANCELED = 'payment_canceled'; + + public const PAYMENT_REMINDER = 'payment_reminder'; + public function toString(): string { return $this->getValue(); diff --git a/app/model/Payment/Exception/PaymentClosed.php b/app/model/Payment/Exception/PaymentClosed.php index 9a9b9bce9..c00893dc4 100644 --- a/app/model/Payment/Exception/PaymentClosed.php +++ b/app/model/Payment/Exception/PaymentClosed.php @@ -6,6 +6,12 @@ use Exception; +use function sprintf; + class PaymentClosed extends Exception { + public static function withName(string $name): self + { + return new self(sprintf('Platba "%s" je již uzavřena.', $name)); + } } diff --git a/app/model/Payment/Exception/PaymentHasNoEmails.php b/app/model/Payment/Exception/PaymentHasNoEmails.php index 43323d71b..b716ed801 100644 --- a/app/model/Payment/Exception/PaymentHasNoEmails.php +++ b/app/model/Payment/Exception/PaymentHasNoEmails.php @@ -12,6 +12,6 @@ class PaymentHasNoEmails extends Exception { public static function withName(string $name): self { - return new self(sprintf('Payment "%s" does not have any e-mail address filled', $name)); + return new self(sprintf('Platba "%s" nemá vyplněný žádný e-mail', $name)); } } diff --git a/app/model/Payment/Group.php b/app/model/Payment/Group.php index c10d413d1..8a5ce2a6e 100644 --- a/app/model/Payment/Group.php +++ b/app/model/Payment/Group.php @@ -45,7 +45,7 @@ class Group * indexBy="index" * ) * - * @var Collection + * @var Collection&iterable */ private Collection $units; @@ -68,6 +68,9 @@ class Group /** @ORM\Column(type="datetime_immutable", nullable=true) */ private DateTimeImmutable|null $createdAt = null; + /** @ORM\Column(type="boolean", options={"default"=0}) */ + private bool $isRemindersEnabled = false; + /** * @ORM\Embedded(class=Group\BankAccount::class, columnPrefix=false) * @@ -78,7 +81,7 @@ class Group /** * @ORM\OneToMany(targetEntity=Email::class, mappedBy="group", cascade={"persist", "remove"}, orphanRemoval=true) * - * @var Collection + * @var Collection&iterable */ private Collection $emails; @@ -109,6 +112,7 @@ public function __construct( BankAccount|null $bankAccount, IBankAccountAccessChecker $bankAccountAccessChecker, IOAuthAccessChecker $oAuthAccessChecker, + bool $isRemindersEnabled = false, ) { Assertion::notEmpty($unitIds); $this->object = $object; @@ -133,6 +137,7 @@ public function __construct( $this->changeBankAccount($bankAccount, $bankAccountAccessChecker); $this->changeOAuth($oAuthId, $oAuthAccessChecker); + $this->isRemindersEnabled = $isRemindersEnabled; } public function update( @@ -142,13 +147,15 @@ public function update( BankAccount|null $bankAccount, IBankAccountAccessChecker $bankAccountAccessChecker, IOAuthAccessChecker $oAuthAccessChecker, + bool $isRemindersEnabled = false, ): void { $this->changeBankAccount($bankAccount, $bankAccountAccessChecker); $this->changeOAuth($oAuthId, $oAuthAccessChecker); - $this->name = $name; - $this->paymentDefaults = $paymentDefaults; - $this->oauthId = $oAuthId; + $this->name = $name; + $this->paymentDefaults = $paymentDefaults; + $this->oauthId = $oAuthId; + $this->isRemindersEnabled = $isRemindersEnabled; } public function open(string $note): void @@ -250,6 +257,11 @@ public function getState(): string return $this->state; } + public function isRemindersEnabled(): bool + { + return $this->isRemindersEnabled; + } + public function getCreatedAt(): DateTimeImmutable|null { return $this->createdAt; diff --git a/app/model/Payment/GroupService.php b/app/model/Payment/GroupService.php new file mode 100644 index 000000000..f104a8d08 --- /dev/null +++ b/app/model/Payment/GroupService.php @@ -0,0 +1,58 @@ +groups->findByReminder(); + $reminderPayments = $this->payments->findByReminder(array_map(function ($group) { + return (int) $group->getId(); + }, $reminderGroups)); + + foreach ($reminderPayments as $payment) { + try { + $this->commandBus->handle(new SendPaymentReminder($payment->getId(), true)); + $count++; + } catch (OAuthNotSet) { + $this->logger->error('OAuth not set'); + } catch (InvalidBankAccount) { + $this->logger->error(EmailButton::NO_BANK_ACCOUNT_MESSAGE); + } catch (InvalidOAuth) { + $this->logger->error('Invalid OAuth'); + } catch (EmailTemplateNotSet) { + $this->logger->error(EmailButton::NO_TEMPLATE_ASSIGNED); + } catch (PaymentHasNoEmails) { + $this->logger->error('Payment has no emails'); + } + } + + $this->logger->info('Sent reminders for ' . $count . ' payments'); + } +} diff --git a/app/model/Payment/Handlers/Mailing/SendPaymentInfoHandler.php b/app/model/Payment/Handlers/Mailing/SendPaymentInfoHandler.php index a732aedef..51b89e59d 100644 --- a/app/model/Payment/Handlers/Mailing/SendPaymentInfoHandler.php +++ b/app/model/Payment/Handlers/Mailing/SendPaymentInfoHandler.php @@ -23,7 +23,7 @@ public function __invoke(SendPaymentInfo $command): void $payment = $this->payments->find($command->getPaymentId()); if ($payment->isClosed()) { - throw new PaymentClosed(); + throw PaymentClosed::withName($payment->getName()); } $this->mailingService->sendEmail($payment->getId(), EmailType::get(EmailType::PAYMENT_INFO)); diff --git a/app/model/Payment/Handlers/Mailing/SendPaymentReminderHandler.php b/app/model/Payment/Handlers/Mailing/SendPaymentReminderHandler.php new file mode 100644 index 000000000..9d28561b2 --- /dev/null +++ b/app/model/Payment/Handlers/Mailing/SendPaymentReminderHandler.php @@ -0,0 +1,31 @@ +payments->find($command->getPaymentId()); + + if ($payment->isClosed()) { + throw PaymentClosed::withName($payment->getName()); + } + + $this->mailingService->sendEmail($payment->getId(), EmailType::get(EmailType::PAYMENT_REMINDER), $command->isCli()); + } +} diff --git a/app/model/Payment/Handlers/Repayment/CreateRepaymentsHandler.php b/app/model/Payment/Handlers/Repayment/CreateRepaymentsHandler.php index 13cd2adeb..1f6bfb731 100644 --- a/app/model/Payment/Handlers/Repayment/CreateRepaymentsHandler.php +++ b/app/model/Payment/Handlers/Repayment/CreateRepaymentsHandler.php @@ -133,7 +133,7 @@ private function parseResponse(ResponseInterface $response, CreateRepayments $co } if (! empty($errorMessages)) { - throw BankError::fromMessage('API Error: ' . implode(' | ', $errorMessages), $errorCode); + throw BankError::fromMessage('API Error: ' . implode(' | ', $errorMessages), $errorCode); } } } diff --git a/app/model/Payment/MailingService.php b/app/model/Payment/MailingService.php index 8398c8557..a267a41ee 100644 --- a/app/model/Payment/MailingService.php +++ b/app/model/Payment/MailingService.php @@ -44,7 +44,7 @@ public function __construct( * @throws EmailTemplateNotSet * @throws OAuthNotSet */ - public function sendEmail(int $paymentId, EmailType $emailType): void + public function sendEmail(int $paymentId, EmailType $emailType, bool $cli = false): void { $payment = $this->payments->find($paymentId); $group = $this->groups->find($payment->getGroupId()); @@ -57,9 +57,14 @@ public function sendEmail(int $paymentId, EmailType $emailType): void ); } - $this->sendForPayment($payment, $group, $template); + if ($cli) { + $userName = 'AUTOMAT'; + } else { + $userName = $this->users->getCurrentUser()->getName(); + } - $payment->recordSentEmail($emailType, new DateTimeImmutable(), $this->users->getCurrentUser()->getName()); + $this->sendForPayment($payment, $group, $template, $userName); + $payment->recordSentEmail($emailType, new DateTimeImmutable(), $userName); $this->payments->save($payment); } @@ -93,7 +98,7 @@ public function sendTestMail(int $groupId): string 'obsah poznámky', ); - $this->send($group, $payment, $group->getEmailTemplate(EmailType::get(EmailType::PAYMENT_INFO))); + $this->send($group, $payment, $group->getEmailTemplate(EmailType::get(EmailType::PAYMENT_INFO)), $user->getName()); return $user->getEmail(); } @@ -106,9 +111,9 @@ public function sendTestMail(int $groupId): string * @throws UserNotFound * @throws OAuthNotSet */ - private function sendForPayment(Payment $paymentRow, Group $group, EmailTemplate $template): void + private function sendForPayment(Payment $paymentRow, Group $group, EmailTemplate $template, string $userName): void { - $this->send($group, $this->createPayment($paymentRow), $template); + $this->send($group, $this->createPayment($paymentRow), $template, $userName); } /** @@ -118,7 +123,7 @@ private function sendForPayment(Payment $paymentRow, Group $group, EmailTemplate * @throws OAuthNotSet * @throws PaymentHasNoEmails */ - private function send(Group $group, MailPayment $payment, EmailTemplate $emailTemplate): void + private function send(Group $group, MailPayment $payment, EmailTemplate $emailTemplate, string $userName): void { if ($group->getOauthId() === null) { throw new OAuthNotSet(); @@ -128,14 +133,12 @@ private function send(Group $group, MailPayment $payment, EmailTemplate $emailTe throw PaymentHasNoEmails::withName($payment->getName()); } - $user = $this->users->getCurrentUser(); - $bankAccount = $group->getBankAccountId() !== null ? $this->bankAccounts->find($group->getBankAccountId()) : null; $bankAccountNumber = $bankAccount !== null ? (string) $bankAccount->getNumber() : null; - $emailTemplate = $emailTemplate->evaluate($group, $payment, $bankAccountNumber, $user->getName()); + $emailTemplate = $emailTemplate->evaluate($group, $payment, $bankAccountNumber, $userName); $template = $this->templateFactory->create( TemplateFactory::PAYMENT_DETAILS, diff --git a/app/model/Payment/Payment.php b/app/model/Payment/Payment.php index 7c7429090..2f5dbe3c7 100644 --- a/app/model/Payment/Payment.php +++ b/app/model/Payment/Payment.php @@ -49,8 +49,7 @@ class Payment extends Aggregate /** * @ORM\OneToMany(targetEntity=EmailRecipient::class, mappedBy="payment", cascade={"persist", "remove"}, orphanRemoval=true) * - * @phpstan-var Collection - * @var Collection + * @var Collection&iterable */ private Collection $emailRecipients; @@ -97,7 +96,7 @@ class Payment extends Aggregate /** * @ORM\OneToMany(targetEntity=SentEmail::class, mappedBy="payment", cascade={"persist", "remove"}, orphanRemoval=true) * - * @var Collection + * @var Collection&iterable */ private Collection $sentEmails; diff --git a/app/model/Payment/PaymentService.php b/app/model/Payment/PaymentService.php index 6422ac5e1..bc818eda6 100644 --- a/app/model/Payment/PaymentService.php +++ b/app/model/Payment/PaymentService.php @@ -129,6 +129,7 @@ public function createGroup( array $emails, OAuthId|null $oAuthId, int|null $bankAccountId, + bool $remindersEnabled = false, ): int { $now = new DateTimeImmutable(); $bankAccount = $bankAccountId !== null ? $this->bankAccounts->find($bankAccountId) : null; @@ -144,6 +145,7 @@ public function createGroup( $bankAccount, $this->bankAccountAccessChecker, $this->oAuthAccessChecker, + $remindersEnabled, ); $this->groups->save($group); @@ -159,11 +161,12 @@ public function updateGroup( array $emails, OAuthId|null $oAuthId, int|null $bankAccountId, + bool $remindersEnabled = false, ): void { $group = $this->groups->find($id); $bankAccount = $bankAccountId !== null ? $this->bankAccounts->find($bankAccountId) : null; - $group->update($name, $paymentDefaults, $oAuthId, $bankAccount, $this->bankAccountAccessChecker, $this->oAuthAccessChecker); + $group->update($name, $paymentDefaults, $oAuthId, $bankAccount, $this->bankAccountAccessChecker, $this->oAuthAccessChecker, $remindersEnabled); foreach (EmailType::getAvailableValues() as $typeKey) { $type = EmailType::get($typeKey); diff --git a/app/model/Payment/Repositories/IGroupRepository.php b/app/model/Payment/Repositories/IGroupRepository.php index 2101adbd1..aaf6df955 100644 --- a/app/model/Payment/Repositories/IGroupRepository.php +++ b/app/model/Payment/Repositories/IGroupRepository.php @@ -22,6 +22,9 @@ public function find(int $id): Group; */ public function findByIds(array $ids): array; + /** @return Group[] */ + public function findByReminder(): array; + /** * @param int[] $unitIds * diff --git a/app/model/Payment/Repositories/IPaymentRepository.php b/app/model/Payment/Repositories/IPaymentRepository.php index 0cf592f6d..5449e0ada 100644 --- a/app/model/Payment/Repositories/IPaymentRepository.php +++ b/app/model/Payment/Repositories/IPaymentRepository.php @@ -17,6 +17,13 @@ public function find(int $id): Payment; /** @return Payment[] */ public function findByGroup(int $groupId): array; + /** + * @param int[] $groupIds + * + * @return Payment[] + */ + public function findByReminder(array $groupIds): array; + /** * @param int[] $groupIds * diff --git a/app/model/Services/TemplateFactory.php b/app/model/Services/TemplateFactory.php index 0da251e1c..2d41a452c 100644 --- a/app/model/Services/TemplateFactory.php +++ b/app/model/Services/TemplateFactory.php @@ -5,8 +5,8 @@ namespace Model\Services; use Latte\Engine; +use Nette\Bridges\ApplicationLatte\DefaultTemplate; use Nette\Bridges\ApplicationLatte\LatteFactory; -use Nette\Bridges\ApplicationLatte\Template; class TemplateFactory { @@ -31,7 +31,7 @@ private function getEngine(): Engine /** @param mixed[] $parameters */ public function create(string $file, array $parameters): string { - return (new Template($this->getEngine())) + return (new DefaultTemplate($this->getEngine())) ->renderToString($file, $parameters); } } diff --git a/app/model/Skautis/ParticipantRepository.php b/app/model/Skautis/ParticipantRepository.php index 157ebb7c7..4fd1ecdad 100644 --- a/app/model/Skautis/ParticipantRepository.php +++ b/app/model/Skautis/ParticipantRepository.php @@ -226,7 +226,7 @@ private function processParticipants(array $participantsSis, Event $event): arra usort( $participants, - fn (Participant $one, Participant $two) => strcoll($one->getDisplayName(), $two->getDisplayName()) + fn (Participant $one, Participant $two) => strcoll($one->getDisplayName(), $two->getDisplayName()), ); return array_map([ParticipantDTOFactory::class, 'create'], $participants); diff --git a/app/model/Travel/Command.php b/app/model/Travel/Command.php index 183b91f8f..36c52af99 100644 --- a/app/model/Travel/Command.php +++ b/app/model/Travel/Command.php @@ -70,8 +70,7 @@ class Command /** * @ORM\OneToMany(targetEntity=Travel::class, indexBy="id", mappedBy="command", cascade={"persist", "remove"}, orphanRemoval=true) * - * @var Collection|Travel[] - * @phpstan-var Collection + * @var Collection&iterable */ private Collection $travels; diff --git a/app/model/Travel/Exception/VehicleLinkedRecord.php b/app/model/Travel/Exception/VehicleLinkedRecord.php new file mode 100644 index 000000000..3343bf66f --- /dev/null +++ b/app/model/Travel/Exception/VehicleLinkedRecord.php @@ -0,0 +1,11 @@ +vehicles->findByFilter(); + } + + /** @throws VehicleLinkedRecord|VehicleNotFound */ + public function removeVehicle(int $vehicleId): void { if ($this->commands->countByVehicle($vehicleId) > 0) { - return false; //nelze mazat vozidlo s navazanými příkazy + throw new VehicleLinkedRecord('Cannot remove vehicle with linked commands'); } - try { - $vehicle = $this->vehicles->find($vehicleId); - - $this->vehicles->remove($vehicle); - - return true; - } catch (VehicleNotFound) { - return false; - } + $vehicle = $this->vehicles->find($vehicleId); + $this->vehicles->remove($vehicle); } /** diff --git a/app/model/Travel/Vehicle.php b/app/model/Travel/Vehicle.php index db0777516..144f10c7d 100644 --- a/app/model/Travel/Vehicle.php +++ b/app/model/Travel/Vehicle.php @@ -72,8 +72,7 @@ class Vehicle * orphanRemoval=true * ) * - * @var Collection|RoadworthyScan[] - * @phpstan-var Collection + * @var Collection&iterable */ private Collection $roadworthyScans; diff --git a/app/presenters/AuthPresenter.php b/app/presenters/AuthPresenter.php index cca958bd9..1b6e094e2 100644 --- a/app/presenters/AuthPresenter.php +++ b/app/presenters/AuthPresenter.php @@ -83,7 +83,7 @@ public function actionSkautIS(string|null $ReturnUrl = null): void $this->redirect(':Auth:'); } - $this->redirect(':Accountancy:Default:'); + $this->redirect('Dashboard:default'); } public function actionAjax(string|null $backlink = null): void diff --git a/app/presenters/DashboardPresenter.php b/app/presenters/DashboardPresenter.php new file mode 100644 index 000000000..56d6e5b69 --- /dev/null +++ b/app/presenters/DashboardPresenter.php @@ -0,0 +1,68 @@ +template->campsCount = $this->queryBus->handle(new CampStatsQuery((int) (new DateTime())->format('Y'))); + $groups = $this->queryBus->handle( + new GetGroupList(array_keys($this->unitService->getReadUnits($this->user)), true), + ); + + $this->template->groupCount = count($groups); + $this->template->eventsCount = $this->queryBus->handle(new EventStatsQuery((int) (new DateTime())->format('Y'))); + + $groupIds = []; + foreach ($groups as $group) { + $groupIds[] = $group->getId(); + } + + $this['pairButton']->setGroups($groupIds); + } + + protected function createComponentPairButton(): PairButton + { + $control = $this->pairButtonFactory->create(); + $control->addCss([ + 'wrap' => 'section-actions d-inline-flex align-items-center gap-2', + 'btn' => 'btn btn-outline-secondary btn-sm btn-surface', + 'toggle' => 'btn btn-outline-secondary btn-sm dropdown-toggle btn-surface', + 'menu' => 'dropdown-menu pairForm dropdown-menu-end', + 'icon' => 'fa-solid fa-building-columns', + 'inputGroup' => 'input-group input-group-sm', + 'submit' => 'btn btn-primary btn-sm', + 'submitCol' => 'col-4 d-grid', + ]); + + return $control; + } + + protected function createComponentCreateButton(): CreateButton + { + $control = $this->createButtonFactory->create(); + $control->setCss('button', 'btn btn-sm btn-outline-secondary'); + + return $control; + } +} diff --git a/app/router/RouterFactory.php b/app/router/RouterFactory.php index 787495282..5edc0be29 100644 --- a/app/router/RouterFactory.php +++ b/app/router/RouterFactory.php @@ -33,6 +33,7 @@ public function createRouter(): Router ], ); + $router[] = new Route('nastenka', 'Dashboard:default'); $router[] = new Route( 'prirucka/[#]', [ diff --git a/app/templates/@layout.latte b/app/templates/@layout.latte index f853f29be..018c31ac9 100644 --- a/app/templates/@layout.latte +++ b/app/templates/@layout.latte @@ -30,14 +30,18 @@ {block #title|stripHtml|trim}Skautské hospodaření{/block} - +
-
- -
-
-
-
-

O projektu

-

Chceš se dozvědět více o projektu Skautské hospodaření online? Poznat jeho historii nebo vytvářet jeho budoucnoust?

+
+
+
+ Účetnictví +
+
+

Propojení se skautIsem

+

Integrace se skautským informačním systémem. Nepotřebujete žádnou další registraci.

+
+
+
+
+ Majetek +
+
+

Správa dokladů online

+

Jednoduše vložíte skeny všech účtenek a faktur přímo k akci.

+
+
+
+
+ Reporty
-
-
-
-
+
+
+
+ Centralizace +
+
+

Centralizace dat

+

Všechna finanční data na jednom místě

+
+
+
+
+ Bezpečnost +
+
+

Bezpečnost

+

Přístupová práva a zálohování dat

+
+
+
+
+ Integrace +
+
+

Integrace

+

Napojení na skautIs, propojení s FIO bankovním účtem a Gmailem

+
+
+
+
+ Podpora +
+
+

Podpora

+

On-line podpora a školení, nápověda a video návody k systému.

+
+
-
- +
+

O projektu

+

+

+ Projekt Skautské hospodaření online představuje centrální platformu navrženou pro zjednodušení a digitalizaci finanční administrativy skautských jednotek. Jeho cílem je nahradit roztříštěnou evidenci v tabulkách či papírové podobě a nabídnout vedoucím a hospodářům jednotný a bezpečný systém. Klíčovou součástí je například modul pro správu hospodaření akcí, který pokrývá vše od vedení online pokladní knihy, přes digitalizaci dokladů a evidenci plateb účastníků, až po automatické generování závěrečných zpráv. Celý systém tak šetří čas, zvyšuje přehlednost a poskytuje spolehlivé podklady pro řízení jednotky i pro kontrolní orgány. +

+
+

Hlavní přínosy

+
    +
  • jednoduchý a srozumitelný i pro začínající hospodáře,
  • +
  • online dostupný přes internet,
  • +
  • lze spolupracovat ve více lidech,
  • +
  • načítá data se základními informacemi o akcích a členech ze skautISu,
  • +
  • výstupy lze využít do účetnictví,
  • +
  • vytváří historický archiv všech údajů k akcím se snadnou dohledatelností.
  • +
+

+
+ +
+
\ No newline at end of file diff --git a/app/templates/Default/reinforcement.latte b/app/templates/Default/reinforcement.latte index 83318c44e..decf4eb90 100644 --- a/app/templates/Default/reinforcement.latte +++ b/app/templates/Default/reinforcement.latte @@ -1,4 +1,4 @@ -{block title}Posily pro skatského hospodaření{/block} +{block title}Posily pro skautské hospodaření{/block} {block #content} @@ -7,42 +7,43 @@

Posily

- Po 13 letech už mi dochází síly a hledám další posily. Celý kód je pod MIT licencí veřejný, tedy jak si projekt - rozjet najdeš na Githubu - a co je v plánu je v Issues. + Celý kód je pod MIT licencí veřejný, jak rozjet projekt + najdeš na Githubu + a co je v plánu, je v Issues.

Koho hledáme? Zapojit se lze různě. Můžeš programovat backend v Nette či pomoct s TypeScriptem na Frontendu.
- Rozsah práce? Práce je nekonečno, ale tady pomůže i realizace pár menších issues. + Rozsah práce? Práce je nekonečno, ale pomůže i realizace pár menších issues.

Nette vyvojář

- Celý projekt je v Nette a na migrační scripty používá Doctrine migrations. Nasazování je automatizované po merge requestu. + Celý projekt je v Nette a na migrační scripty používá Doctrine migrations. Nasazování je automatizované po merge requestu.
Kromě přidávání nových funkcí by určitě pomohlo aktualizovat knihovny, abychom drželi projekt bezpečný.

Frontend vývojář

- Na projektu jsou různé vychytávky psané v Typescriptu, tedy jejich správa a rozvoj. - Je možné přejít i na novější Bootstrap, ale nevidím v tom přidanou hodnotu nyní. + Na projektu jsou různé vychytávky psané v Typescriptu, tedy jejich správa a rozvoj.
+ Je možné přejít i na novější Bootstrap, ale nevidím v tom nyní přidanou hodnotu.

Uživatelská podpora (+ socialní sítě)

- Občas někdo potřebuje pomoct (1-2 za měsíc) a hodí se když to s ním vyřeší někdo jiný než programátor, - aby mohl svůj čas věnovat rozvoji kódu. Dlouhodobě nikdo nepíše návodu ani posty s vychytávkama a novinkama - na Facebook, což by rozšířilo o projektu povědomí. + Občas někdo potřebuje pomoct (1-2x za měsíc) a hodí se, když to s ním vyřeší někdo jiný než programátor, + aby mohl svůj čas věnovat rozvoji kódu.
+ Dlouhodobě nikdo nepíše návody ani posty s vychytávkami a novinkami + na Facebook, což by rozšířilo povědomí o projektu.

Donátor

Přispěním libovolné částky můžeš někomu zpříjemnit práci na projektu, kde vždy většina času bude dobrovolnická. - Seznam přispěvků najdeš zde + Seznam přispěvků najdeš zde.

Kontakt

- sinacek(zavinac)skaut(tecka)cz
+ hskauting(zavinac)skaut(tecka)cz
Facebook

diff --git a/build.xml b/build.xml deleted file mode 100644 index 29cc91d0d..000000000 --- a/build.xml +++ /dev/null @@ -1,269 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ${env.CONFIG_GOOGLE_CREDENTIALS} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/composer.json b/composer.json index 4acf9a448..03012b713 100644 --- a/composer.json +++ b/composer.json @@ -2,7 +2,7 @@ "name": "skaut/skautske_hospodareni", "type": "project", "require": { - "php": ">= 8.1", + "php": ">= 8.2", "ext-iconv": "*", "ext-simplexml": "*", "beberlei/assert": "^2.9", @@ -13,6 +13,7 @@ "consistence-community/consistence-doctrine": "^2.1", "contributte/console": "^0.9", "contributte/console-extra": "^0.7.2", + "contributte/scheduler": "^0.7.3", "fmasa/messenger": "^2.0", "fmasa/sentry-breadcrumbs-monolog-handler": "^2.3", "google/apiclient": "^2.15.1", @@ -21,7 +22,7 @@ "heureka/bank-account-validator": "1.2.*", "http-interop/http-factory-guzzle": "^1.2", "kdyby/forms-replicator": "^2.0", - "latte/latte": " ~2.11", + "latte/latte": " ~3.0", "league/flysystem": "^3.21", "maennchen/zipstream-php": "^3.1", "mhujer/fio-api-php": "^5.0", @@ -43,14 +44,15 @@ "nettrine/migrations": "^v0.8", "nextras/mail-panel": "^v2.5", "php-http/guzzle7-adapter": "^1.0", - "phpoffice/phpspreadsheet": "^4.1", + "phpoffice/phpspreadsheet": "^5.1", "ramsey/uuid": "^4.2", "sentry/sentry": "^3.4", "skaut/dependent-select-box": "dev-master", "skaut/psr6-caching": "^0.3.0@dev", "skautis/nette": "^2.2", "skautis/skautis": "~2.3", - "thecodingmachine/safe": "^2.4", + "symfony/cache": "^6.4", + "thecodingmachine/safe": "^3.3", "tracy/tracy": "~2.9", "ublaboo/datagrid": "^v6.9", "vlucas/phpdotenv": "^5.5", @@ -63,9 +65,8 @@ "codeception/module-db": "^2.0", "codeception/module-webdriver": "^2.0", "contributte/codeception": "^1.3.1", - "doctrine/coding-standard": "^12.0", + "doctrine/coding-standard": "^13.0", "league/flysystem-memory": "^3.10", - "phing/phing": "^2.17.2", "php-vcr/php-vcr": "^1.4", "phpstan/extension-installer": "^1.1", "phpstan/phpstan": "^1.5", @@ -91,7 +92,69 @@ "prefer-stable": true, "minimum-stability": "dev", "scripts": { - "post-update-cmd": "Google_Task_Composer::cleanup" + "post-update-cmd": "Google_Task_Composer::cleanup", + + + "main": [ + "composer install --no-interaction", + "@static-analysis", + "@coding-standard", + "@schema:validate", + "@tests" + ], + + + "tests:init": [ + "bin/console nette:cache:purge || true", + "bin/console migrations:drop-all-tables-views --no-interaction", + "bin/console migrations:migrate --no-interaction" + ], + "tests:unit": "vendor/bin/codecept run unit", + "tests:integration": "vendor/bin/codecept run integration", + "tests:acceptance": [ + "bin/console nette:cache:purge || true", + "bin/console migrations:drop-all-tables-views --no-interaction", + "bin/console migrations:migrate --no-interaction", + "bin/console orm:generate-proxies --no-interaction", + "vendor/bin/codecept run acceptance -vv" + ], + "tests": [ + "@tests:init", + "@tests:unit", + "@tests:integration", + "@tests:acceptance" + ], + "tests-with-coverage": "php -d zend_extension=xdebug.so -d xdebug.mode=coverage vendor/bin/codecept run unit,integration --coverage-xml", + + + "static-analysis": [ + "bin/console nette:cache:purge || true", + "php -d memory_limit=2G vendor/bin/phpstan analyse -l 6 -c phpstan.neon app tests --no-progress" + ], + "coding-pretty": "vendor/bin/phpcbf app", + "coding-standard": [ + "vendor/bin/phpcbf app tests", + "vendor/bin/phpcs" + ], + "coding-standard-ci": "vendor/bin/phpcs", + + + "schema:validate": "bin/console orm:validate-schema --skip-sync", + "proxies:generate": "bin/console orm:generate-proxies --no-interaction", + + + "fix": [ + "@coding-standard", + "@static-analysis" + ], + "app-init": [ + "composer install --no-interaction", + "cp app/config/config.sample.local.neon app/config/config.local.neon || true", + "bin/console nette:cache:purge || true", + "yarn install", + "yarn build", + "bin/console migrations:migrate --no-interaction" + ] }, "extra": { "google/apiclient-services": [ diff --git a/composer.lock b/composer.lock index 156009a34..52e240c23 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "8b05a75157285681db08dd196f45a339", + "content-hash": "9947d46982d53c862ad4bdc5f9b2a7b2", "packages": [ { "name": "beberlei/assert", @@ -117,16 +117,16 @@ }, { "name": "brick/math", - "version": "0.12.1", + "version": "0.13.1", "source": { "type": "git", "url": "https://github.com/brick/math.git", - "reference": "f510c0a40911935b77b86859eb5223d58d660df1" + "reference": "fc7ed316430118cc7836bf45faff18d5dfc8de04" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/f510c0a40911935b77b86859eb5223d58d660df1", - "reference": "f510c0a40911935b77b86859eb5223d58d660df1", + "url": "https://api.github.com/repos/brick/math/zipball/fc7ed316430118cc7836bf45faff18d5dfc8de04", + "reference": "fc7ed316430118cc7836bf45faff18d5dfc8de04", "shasum": "" }, "require": { @@ -135,7 +135,7 @@ "require-dev": { "php-coveralls/php-coveralls": "^2.2", "phpunit/phpunit": "^10.1", - "vimeo/psalm": "5.16.0" + "vimeo/psalm": "6.8.8" }, "type": "library", "autoload": { @@ -165,7 +165,7 @@ ], "support": { "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.12.1" + "source": "https://github.com/brick/math/tree/0.13.1" }, "funding": [ { @@ -173,20 +173,20 @@ "type": "github" } ], - "time": "2023-11-29T23:19:16+00:00" + "time": "2025-03-29T13:50:30+00:00" }, { "name": "cakephp/chronos", - "version": "3.1.0", + "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/cakephp/chronos.git", - "reference": "786d69e1ee4b735765cbdb5521b9603e9b98d650" + "reference": "6c820947bc1372a250288ab164ec1b3bb7afab39" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cakephp/chronos/zipball/786d69e1ee4b735765cbdb5521b9603e9b98d650", - "reference": "786d69e1ee4b735765cbdb5521b9603e9b98d650", + "url": "https://api.github.com/repos/cakephp/chronos/zipball/6c820947bc1372a250288ab164ec1b3bb7afab39", + "reference": "6c820947bc1372a250288ab164ec1b3bb7afab39", "shasum": "" }, "require": { @@ -232,7 +232,7 @@ "issues": "https://github.com/cakephp/chronos/issues", "source": "https://github.com/cakephp/chronos" }, - "time": "2024-07-18T03:18:04+00:00" + "time": "2025-06-28T11:35:59+00:00" }, { "name": "clue/stream-filter", @@ -302,16 +302,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.5.6", + "version": "1.5.8", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "f65c239c970e7f072f067ab78646e9f0b2935175" + "reference": "719026bb30813accb68271fee7e39552a58e9f65" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/f65c239c970e7f072f067ab78646e9f0b2935175", - "reference": "f65c239c970e7f072f067ab78646e9f0b2935175", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/719026bb30813accb68271fee7e39552a58e9f65", + "reference": "719026bb30813accb68271fee7e39552a58e9f65", "shasum": "" }, "require": { @@ -358,7 +358,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.5.6" + "source": "https://github.com/composer/ca-bundle/tree/1.5.8" }, "funding": [ { @@ -368,13 +368,9 @@ { "url": "https://github.com/composer", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" } ], - "time": "2025-03-06T14:30:56+00:00" + "time": "2025-08-20T18:49:47+00:00" }, { "name": "composer/pcre", @@ -521,21 +517,21 @@ }, { "name": "consistence-community/consistence-doctrine", - "version": "2.1.3", + "version": "2.1.4", "source": { "type": "git", "url": "https://github.com/consistence-community/consistence-doctrine.git", - "reference": "55a356a004107bcb7a513e08457a6c69371796cc" + "reference": "5727c9bb1e5bb21d6bccb9620ee825c87a4216a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/consistence-community/consistence-doctrine/zipball/55a356a004107bcb7a513e08457a6c69371796cc", - "reference": "55a356a004107bcb7a513e08457a6c69371796cc", + "url": "https://api.github.com/repos/consistence-community/consistence-doctrine/zipball/5727c9bb1e5bb21d6bccb9620ee825c87a4216a1", + "reference": "5727c9bb1e5bb21d6bccb9620ee825c87a4216a1", "shasum": "" }, "require": { "consistence-community/consistence": "~2.1", - "doctrine/annotations": "~1.7", + "doctrine/annotations": "~1.7 || ^2.0", "doctrine/orm": "^2.10.0", "php": "~7.4 || ~8.0" }, @@ -575,9 +571,9 @@ "description": "Integration of Consistence library with Doctrine ORM", "support": { "issues": "https://github.com/consistence-community/consistence-doctrine/issues", - "source": "https://github.com/consistence-community/consistence-doctrine/tree/2.1.3" + "source": "https://github.com/consistence-community/consistence-doctrine/tree/2.1.4" }, - "time": "2021-11-30T14:36:06+00:00" + "time": "2023-06-15T17:06:27+00:00" }, { "name": "contributte/application", @@ -886,32 +882,115 @@ ], "time": "2023-09-05T08:23:55+00:00" }, + { + "name": "contributte/scheduler", + "version": "v0.7.3", + "source": { + "type": "git", + "url": "https://github.com/contributte/scheduler.git", + "reference": "eb2c21094fc3563ebbf82c5a280fc59d451af988" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/contributte/scheduler/zipball/eb2c21094fc3563ebbf82c5a280fc59d451af988", + "reference": "eb2c21094fc3563ebbf82c5a280fc59d451af988", + "shasum": "" + }, + "require": { + "contributte/di": "^0.5", + "dragonmantank/cron-expression": "^3.0.1", + "php": ">=7.2", + "symfony/console": "^5.0.0 || ^6.0.0" + }, + "require-dev": { + "mockery/mockery": "^1.2.0", + "ninjify/nunjuck": "^0.4", + "ninjify/qa": "^0.13", + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-nette": "^1.0", + "phpstan/phpstan-strict-rules": "^1.0", + "tracy/tracy": "^2.6.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Contributte\\Scheduler\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Milan Felix Šulc", + "homepage": "https://f3l1x.io" + }, + { + "name": "Josef Benjac", + "homepage": "http://josefbenjac.com" + } + ], + "description": "PHP job scheduler (cron) with locking", + "homepage": "https://github.com/contributte/scheduler", + "keywords": [ + "contributte", + "cron", + "nette", + "scheduler" + ], + "support": { + "issues": "https://github.com/contributte/scheduler/issues", + "source": "https://github.com/contributte/scheduler/tree/v0.7.3" + }, + "funding": [ + { + "url": "https://contributte.org/partners.html", + "type": "custom" + }, + { + "url": "https://github.com/f3l1x", + "type": "github" + } + ], + "time": "2022-02-10T12:08:12+00:00" + }, { "name": "doctrine/annotations", - "version": "1.13.2", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "5b668aef16090008790395c02c893b1ba13f7e08" + "reference": "901c2ee5d26eb64ff43c47976e114bf00843acf7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/5b668aef16090008790395c02c893b1ba13f7e08", - "reference": "5b668aef16090008790395c02c893b1ba13f7e08", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/901c2ee5d26eb64ff43c47976e114bf00843acf7", + "reference": "901c2ee5d26eb64ff43c47976e114bf00843acf7", "shasum": "" }, "require": { - "doctrine/lexer": "1.*", + "doctrine/lexer": "^2 || ^3", "ext-tokenizer": "*", - "php": "^7.1 || ^8.0", + "php": "^7.2 || ^8.0", "psr/cache": "^1 || ^2 || ^3" }, "require-dev": { - "doctrine/cache": "^1.11 || ^2.0", - "doctrine/coding-standard": "^6.0 || ^8.1", - "phpstan/phpstan": "^0.12.20", - "phpunit/phpunit": "^7.5 || ^8.0 || ^9.1.5", - "symfony/cache": "^4.4 || ^5.2" + "doctrine/cache": "^2.0", + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.10.28", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "symfony/cache": "^5.4 || ^6.4 || ^7", + "vimeo/psalm": "^4.30 || ^5.14" + }, + "suggest": { + "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" }, "type": "library", "autoload": { @@ -954,22 +1033,22 @@ ], "support": { "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.13.2" + "source": "https://github.com/doctrine/annotations/tree/2.0.2" }, - "time": "2021-08-05T19:00:23+00:00" + "time": "2024-09-05T10:17:24+00:00" }, { "name": "doctrine/cache", - "version": "1.12.1", + "version": "1.13.0", "source": { "type": "git", "url": "https://github.com/doctrine/cache.git", - "reference": "4cf401d14df219fa6f38b671f5493449151c9ad8" + "reference": "56cd022adb5514472cb144c087393c1821911d09" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/4cf401d14df219fa6f38b671f5493449151c9ad8", - "reference": "4cf401d14df219fa6f38b671f5493449151c9ad8", + "url": "https://api.github.com/repos/doctrine/cache/zipball/56cd022adb5514472cb144c087393c1821911d09", + "reference": "56cd022adb5514472cb144c087393c1821911d09", "shasum": "" }, "require": { @@ -981,13 +1060,13 @@ "require-dev": { "alcaeus/mongo-php-adapter": "^1.1", "cache/integration-tests": "dev-master", - "doctrine/coding-standard": "^8.0", + "doctrine/coding-standard": "^9", "mongodb/mongodb": "^1.1", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", "predis/predis": "~1.0", "psr/cache": "^1.0 || ^2.0 || ^3.0", - "symfony/cache": "^4.4 || ^5.2 || ^6.0@dev", - "symfony/var-exporter": "^4.4 || ^5.2 || ^6.0@dev" + "symfony/cache": "^4.4 || ^5.4 || ^6", + "symfony/var-exporter": "^4.4 || ^5.4 || ^6" }, "suggest": { "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" @@ -1039,7 +1118,7 @@ ], "support": { "issues": "https://github.com/doctrine/cache/issues", - "source": "https://github.com/doctrine/cache/tree/1.12.1" + "source": "https://github.com/doctrine/cache/tree/1.13.0" }, "funding": [ { @@ -1055,30 +1134,31 @@ "type": "tidelift" } ], - "time": "2021-07-17T14:39:21+00:00" + "time": "2022-05-20T20:06:54+00:00" }, { "name": "doctrine/collections", - "version": "1.6.8", + "version": "1.8.0", "source": { "type": "git", "url": "https://github.com/doctrine/collections.git", - "reference": "1958a744696c6bb3bb0d28db2611dc11610e78af" + "reference": "2b44dd4cbca8b5744327de78bafef5945c7e7b5e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/1958a744696c6bb3bb0d28db2611dc11610e78af", - "reference": "1958a744696c6bb3bb0d28db2611dc11610e78af", + "url": "https://api.github.com/repos/doctrine/collections/zipball/2b44dd4cbca8b5744327de78bafef5945c7e7b5e", + "reference": "2b44dd4cbca8b5744327de78bafef5945c7e7b5e", "shasum": "" }, "require": { + "doctrine/deprecations": "^0.5.3 || ^1", "php": "^7.1.3 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^9.0", - "phpstan/phpstan": "^0.12", + "doctrine/coding-standard": "^9.0 || ^10.0", + "phpstan/phpstan": "^1.4.8", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.1.5", - "vimeo/psalm": "^4.2.1" + "vimeo/psalm": "^4.22" }, "type": "library", "autoload": { @@ -1122,41 +1202,42 @@ ], "support": { "issues": "https://github.com/doctrine/collections/issues", - "source": "https://github.com/doctrine/collections/tree/1.6.8" + "source": "https://github.com/doctrine/collections/tree/1.8.0" }, - "time": "2021-08-10T18:51:53+00:00" + "time": "2022-09-01T20:12:10+00:00" }, { "name": "doctrine/common", - "version": "3.3.0", + "version": "3.5.0", "source": { "type": "git", "url": "https://github.com/doctrine/common.git", - "reference": "c824e95d4c83b7102d8bc60595445a6f7d540f96" + "reference": "d9ea4a54ca2586db781f0265d36bea731ac66ec5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/c824e95d4c83b7102d8bc60595445a6f7d540f96", - "reference": "c824e95d4c83b7102d8bc60595445a6f7d540f96", + "url": "https://api.github.com/repos/doctrine/common/zipball/d9ea4a54ca2586db781f0265d36bea731ac66ec5", + "reference": "d9ea4a54ca2586db781f0265d36bea731ac66ec5", "shasum": "" }, "require": { - "doctrine/persistence": "^2.0 || ^3.0", + "doctrine/persistence": "^2.0 || ^3.0 || ^4.0", "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^9.0", + "doctrine/coding-standard": "^9.0 || ^10.0", + "doctrine/collections": "^1", "phpstan/phpstan": "^1.4.1", "phpstan/phpstan-phpunit": "^1", "phpunit/phpunit": "^7.5.20 || ^8.5 || ^9.0", "squizlabs/php_codesniffer": "^3.0", - "symfony/phpunit-bridge": "^4.0.5", + "symfony/phpunit-bridge": "^6.1", "vimeo/psalm": "^4.4" }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Common\\": "lib/Doctrine/Common" + "Doctrine\\Common\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1198,7 +1279,7 @@ ], "support": { "issues": "https://github.com/doctrine/common/issues", - "source": "https://github.com/doctrine/common/tree/3.3.0" + "source": "https://github.com/doctrine/common/tree/3.5.0" }, "funding": [ { @@ -1214,39 +1295,45 @@ "type": "tidelift" } ], - "time": "2022-02-05T18:28:51+00:00" + "time": "2025-01-01T22:12:03+00:00" }, { "name": "doctrine/dbal", - "version": "2.13.8", + "version": "3.10.2", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "dc9b3c3c8592c935a6e590441f9abc0f9eba335b" + "reference": "c6c16cf787eaba3112203dfcd715fa2059c62282" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/dc9b3c3c8592c935a6e590441f9abc0f9eba335b", - "reference": "dc9b3c3c8592c935a6e590441f9abc0f9eba335b", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/c6c16cf787eaba3112203dfcd715fa2059c62282", + "reference": "c6c16cf787eaba3112203dfcd715fa2059c62282", "shasum": "" }, "require": { - "doctrine/cache": "^1.0|^2.0", - "doctrine/deprecations": "^0.5.3", - "doctrine/event-manager": "^1.0", - "ext-pdo": "*", - "php": "^7.1 || ^8" + "composer-runtime-api": "^2", + "doctrine/deprecations": "^0.5.3|^1", + "doctrine/event-manager": "^1|^2", + "php": "^7.4 || ^8.0", + "psr/cache": "^1|^2|^3", + "psr/log": "^1|^2|^3" }, - "require-dev": { - "doctrine/coding-standard": "9.0.0", - "jetbrains/phpstorm-stubs": "2021.1", - "phpstan/phpstan": "1.4.6", - "phpunit/phpunit": "^7.5.20|^8.5|9.5.16", - "psalm/plugin-phpunit": "0.16.1", - "squizlabs/php_codesniffer": "3.6.2", - "symfony/cache": "^4.4", - "symfony/console": "^2.0.5|^3.0|^4.0|^5.0", - "vimeo/psalm": "4.22.0" + "conflict": { + "doctrine/cache": "< 1.11" + }, + "require-dev": { + "doctrine/cache": "^1.11|^2.0", + "doctrine/coding-standard": "13.0.1", + "fig/log-test": "^1", + "jetbrains/phpstorm-stubs": "2023.1", + "phpstan/phpstan": "2.1.22", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "9.6.23", + "slevomat/coding-standard": "8.16.2", + "squizlabs/php_codesniffer": "3.13.1", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/console": "^4.4|^5.4|^6.0|^7.0" }, "suggest": { "symfony/console": "For helpful console commands such as SQL execution and import of files." @@ -1257,7 +1344,7 @@ "type": "library", "autoload": { "psr-4": { - "Doctrine\\DBAL\\": "lib/Doctrine/DBAL" + "Doctrine\\DBAL\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1300,14 +1387,13 @@ "queryobject", "sasql", "sql", - "sqlanywhere", "sqlite", "sqlserver", "sqlsrv" ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/2.13.8" + "source": "https://github.com/doctrine/dbal/tree/3.10.2" }, "funding": [ { @@ -1323,7 +1409,7 @@ "type": "tidelift" } ], - "time": "2022-03-09T15:25:46+00:00" + "time": "2025-09-04T23:51:27+00:00" }, { "name": "doctrine/deprecations", @@ -1370,37 +1456,35 @@ }, { "name": "doctrine/event-manager", - "version": "1.1.1", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/doctrine/event-manager.git", - "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f" + "reference": "95aa4cb529f1e96576f3fda9f5705ada4056a520" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/event-manager/zipball/41370af6a30faa9dc0368c4a6814d596e81aba7f", - "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/95aa4cb529f1e96576f3fda9f5705ada4056a520", + "reference": "95aa4cb529f1e96576f3fda9f5705ada4056a520", "shasum": "" }, "require": { + "doctrine/deprecations": "^0.5.3 || ^1", "php": "^7.1 || ^8.0" }, "conflict": { - "doctrine/common": "<2.9@dev" + "doctrine/common": "<2.9" }, "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpunit/phpunit": "^7.0" + "doctrine/coding-standard": "^9 || ^10", + "phpstan/phpstan": "~1.4.10 || ^1.8.8", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.24" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, "autoload": { "psr-4": { - "Doctrine\\Common\\": "lib/Doctrine/Common" + "Doctrine\\Common\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1444,7 +1528,7 @@ ], "support": { "issues": "https://github.com/doctrine/event-manager/issues", - "source": "https://github.com/doctrine/event-manager/tree/1.1.x" + "source": "https://github.com/doctrine/event-manager/tree/1.2.0" }, "funding": [ { @@ -1460,37 +1544,36 @@ "type": "tidelift" } ], - "time": "2020-05-29T18:28:51+00:00" + "time": "2022-10-12T20:51:15+00:00" }, { "name": "doctrine/inflector", - "version": "2.0.4", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", - "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89" + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", - "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^8.2", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpstan/phpstan-strict-rules": "^0.12", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", - "vimeo/psalm": "^4.10" + "doctrine/coding-standard": "^12.0 || ^13.0", + "phpstan/phpstan": "^1.12 || ^2.0", + "phpstan/phpstan-phpunit": "^1.4 || ^2.0", + "phpstan/phpstan-strict-rules": "^1.6 || ^2.0", + "phpunit/phpunit": "^8.5 || ^12.2" }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + "Doctrine\\Inflector\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1535,7 +1618,7 @@ ], "support": { "issues": "https://github.com/doctrine/inflector/issues", - "source": "https://github.com/doctrine/inflector/tree/2.0.4" + "source": "https://github.com/doctrine/inflector/tree/2.1.0" }, "funding": [ { @@ -1551,7 +1634,7 @@ "type": "tidelift" } ], - "time": "2021-10-22T20:16:43+00:00" + "time": "2025-08-10T19:31:58+00:00" }, { "name": "doctrine/instantiator", @@ -1625,31 +1708,32 @@ }, { "name": "doctrine/lexer", - "version": "1.2.3", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", - "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229" + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/c268e882d4dbdd85e36e4ad69e02dc284f89d229", - "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "php": "^8.1" }, "require-dev": { - "doctrine/coding-standard": "^9.0", - "phpstan/phpstan": "^1.3", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.11" + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.21" }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + "Doctrine\\Common\\Lexer\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1681,7 +1765,7 @@ ], "support": { "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/1.2.3" + "source": "https://github.com/doctrine/lexer/tree/3.0.1" }, "funding": [ { @@ -1697,7 +1781,7 @@ "type": "tidelift" } ], - "time": "2022-02-28T11:07:21+00:00" + "time": "2024-02-05T11:56:58+00:00" }, { "name": "doctrine/migrations", @@ -1807,52 +1891,56 @@ }, { "name": "doctrine/orm", - "version": "2.11.2", + "version": "2.20.6", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "9c351e044478135aec1755e2c0c0493a4b6309db" + "reference": "c322c71cd40da12d255dabd7b6ce0d9cf208a5d5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/9c351e044478135aec1755e2c0c0493a4b6309db", - "reference": "9c351e044478135aec1755e2c0c0493a4b6309db", + "url": "https://api.github.com/repos/doctrine/orm/zipball/c322c71cd40da12d255dabd7b6ce0d9cf208a5d5", + "reference": "c322c71cd40da12d255dabd7b6ce0d9cf208a5d5", "shasum": "" }, "require": { "composer-runtime-api": "^2", "doctrine/cache": "^1.12.1 || ^2.1.1", - "doctrine/collections": "^1.5", + "doctrine/collections": "^1.5 || ^2.1", "doctrine/common": "^3.0.3", "doctrine/dbal": "^2.13.1 || ^3.2", - "doctrine/deprecations": "^0.5.3", - "doctrine/event-manager": "^1.1", + "doctrine/deprecations": "^0.5.3 || ^1", + "doctrine/event-manager": "^1.2 || ^2", "doctrine/inflector": "^1.4 || ^2.0", - "doctrine/instantiator": "^1.3", - "doctrine/lexer": "^1.0", - "doctrine/persistence": "^2.2", + "doctrine/instantiator": "^1.3 || ^2", + "doctrine/lexer": "^2 || ^3", + "doctrine/persistence": "^2.4 || ^3", "ext-ctype": "*", "php": "^7.1 || ^8.0", "psr/cache": "^1 || ^2 || ^3", - "symfony/console": "^3.0 || ^4.0 || ^5.0 || ^6.0", + "symfony/console": "^4.2 || ^5.0 || ^6.0 || ^7.0", "symfony/polyfill-php72": "^1.23", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "conflict": { - "doctrine/annotations": "<1.13 || >= 2.0" + "doctrine/annotations": "<1.13 || >= 3.0" }, "require-dev": { - "doctrine/annotations": "^1.13", - "doctrine/coding-standard": "^9.0", + "doctrine/annotations": "^1.13 || ^2", + "doctrine/coding-standard": "^9.0.2 || ^13.0", "phpbench/phpbench": "^0.16.10 || ^1.0", - "phpstan/phpstan": "1.4.6", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4", - "squizlabs/php_codesniffer": "3.6.2", - "symfony/cache": "^4.4 || ^5.4 || ^6.0", - "symfony/yaml": "^3.4 || ^4.0 || ^5.0 || ^6.0", - "vimeo/psalm": "4.22.0" + "phpstan/extension-installer": "~1.1.0 || ^1.4", + "phpstan/phpstan": "~1.4.10 || 2.0.3", + "phpstan/phpstan-deprecation-rules": "^1 || ^2", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6", + "psr/log": "^1 || ^2 || ^3", + "squizlabs/php_codesniffer": "3.12.0", + "symfony/cache": "^4.4 || ^5.4 || ^6.4 || ^7.0", + "symfony/var-exporter": "^4.4 || ^5.4 || ^6.2 || ^7.0", + "symfony/yaml": "^3.4 || ^4.0 || ^5.0 || ^6.0 || ^7.0" }, "suggest": { + "ext-dom": "Provides support for XSD validation for XML mapping files", "symfony/cache": "Provides cache support for Setup Tool with doctrine/cache 2.0", "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" }, @@ -1862,7 +1950,7 @@ "type": "library", "autoload": { "psr-4": { - "Doctrine\\ORM\\": "lib/Doctrine/ORM" + "Doctrine\\ORM\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1899,50 +1987,44 @@ ], "support": { "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/2.11.2" + "source": "https://github.com/doctrine/orm/tree/2.20.6" }, - "time": "2022-03-09T15:23:58+00:00" + "time": "2025-08-08T06:55:44+00:00" }, { "name": "doctrine/persistence", - "version": "2.5.1", + "version": "3.4.0", "source": { "type": "git", "url": "https://github.com/doctrine/persistence.git", - "reference": "4473480044c88f30e0e8288e7123b60c7eb9efa3" + "reference": "0ea965320cec355dba75031c1b23d4c78362e3ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/4473480044c88f30e0e8288e7123b60c7eb9efa3", - "reference": "4473480044c88f30e0e8288e7123b60c7eb9efa3", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/0ea965320cec355dba75031c1b23d4c78362e3ff", + "reference": "0ea965320cec355dba75031c1b23d4c78362e3ff", "shasum": "" }, "require": { - "doctrine/cache": "^1.11 || ^2.0", - "doctrine/collections": "^1.0", - "doctrine/deprecations": "^0.5.3", - "doctrine/event-manager": "^1.0", - "php": "^7.1 || ^8.0", + "doctrine/event-manager": "^1 || ^2", + "php": "^7.2 || ^8.0", "psr/cache": "^1.0 || ^2.0 || ^3.0" }, "conflict": { - "doctrine/annotations": "<1.0 || >=2.0", "doctrine/common": "<2.10" }, "require-dev": { - "composer/package-versions-deprecated": "^1.11", - "doctrine/annotations": "^1.0", - "doctrine/coding-standard": "^9.0", + "doctrine/coding-standard": "^12", "doctrine/common": "^3.0", - "phpstan/phpstan": "~1.4.10 || 1.5.0", - "phpunit/phpunit": "^7.5.20 || ^8.5 || ^9.5", - "symfony/cache": "^4.4 || ^5.4 || ^6.0", - "vimeo/psalm": "4.22.0" + "phpstan/phpstan": "1.12.7", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "^8.5.38 || ^9.5", + "symfony/cache": "^4.4 || ^5.4 || ^6.0 || ^7.0" }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Common\\": "src/Common", "Doctrine\\Persistence\\": "src/Persistence" } }, @@ -1977,7 +2059,7 @@ } ], "description": "The Doctrine Persistence project is a set of shared interfaces and functionality that the different Doctrine object mappers share.", - "homepage": "https://doctrine-project.org/projects/persistence.html", + "homepage": "https://www.doctrine-project.org/projects/persistence.html", "keywords": [ "mapper", "object", @@ -1987,22 +2069,101 @@ ], "support": { "issues": "https://github.com/doctrine/persistence/issues", - "source": "https://github.com/doctrine/persistence/tree/2.5.1" + "source": "https://github.com/doctrine/persistence/tree/3.4.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fpersistence", + "type": "tidelift" + } + ], + "time": "2024-10-30T19:48:12+00:00" + }, + { + "name": "dragonmantank/cron-expression", + "version": "v3.4.0", + "source": { + "type": "git", + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "8c784d071debd117328803d86b2097615b457500" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/8c784d071debd117328803d86b2097615b457500", + "reference": "8c784d071debd117328803d86b2097615b457500", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0", + "webmozart/assert": "^1.0" + }, + "replace": { + "mtdowling/cron-expression": "^1.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.0", + "phpunit/phpunit": "^7.0|^8.0|^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "support": { + "issues": "https://github.com/dragonmantank/cron-expression/issues", + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.4.0" }, - "time": "2022-04-14T21:47:17+00:00" + "funding": [ + { + "url": "https://github.com/dragonmantank", + "type": "github" + } + ], + "time": "2024-10-09T13:47:03+00:00" }, { "name": "firebase/php-jwt", - "version": "v6.11.0", + "version": "v6.11.1", "source": { "type": "git", "url": "https://github.com/firebase/php-jwt.git", - "reference": "8f718f4dfc9c5d5f0c994cdfd103921b43592712" + "reference": "d1e91ecf8c598d073d0995afa8cd5c75c6e19e66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/8f718f4dfc9c5d5f0c994cdfd103921b43592712", - "reference": "8f718f4dfc9c5d5f0c994cdfd103921b43592712", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/d1e91ecf8c598d073d0995afa8cd5c75c6e19e66", + "reference": "d1e91ecf8c598d073d0995afa8cd5c75c6e19e66", "shasum": "" }, "require": { @@ -2050,9 +2211,9 @@ ], "support": { "issues": "https://github.com/firebase/php-jwt/issues", - "source": "https://github.com/firebase/php-jwt/tree/v6.11.0" + "source": "https://github.com/firebase/php-jwt/tree/v6.11.1" }, - "time": "2025-01-23T05:11:06+00:00" + "time": "2025-04-09T20:32:01+00:00" }, { "name": "fmasa/messenger", @@ -2164,22 +2325,22 @@ }, { "name": "friendsofphp/proxy-manager-lts", - "version": "v1.0.12", + "version": "v1.0.18", "source": { "type": "git", "url": "https://github.com/FriendsOfPHP/proxy-manager-lts.git", - "reference": "8419f0158715b30d4b99a5bd37c6a39671994ad7" + "reference": "2c8a6cffc3220e99352ad958fe7cf06bf6f7690f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/8419f0158715b30d4b99a5bd37c6a39671994ad7", - "reference": "8419f0158715b30d4b99a5bd37c6a39671994ad7", + "url": "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/2c8a6cffc3220e99352ad958fe7cf06bf6f7690f", + "reference": "2c8a6cffc3220e99352ad958fe7cf06bf6f7690f", "shasum": "" }, "require": { "laminas/laminas-code": "~3.4.1|^4.0", "php": ">=7.1", - "symfony/filesystem": "^4.4.17|^5.0|^6.0" + "symfony/filesystem": "^4.4.17|^5.0|^6.0|^7.0" }, "conflict": { "laminas/laminas-stdlib": "<3.2.1", @@ -2190,13 +2351,13 @@ }, "require-dev": { "ext-phar": "*", - "symfony/phpunit-bridge": "^5.4|^6.0" + "symfony/phpunit-bridge": "^5.4|^6.0|^7.0" }, "type": "library", "extra": { "thanks": { - "name": "ocramius/proxy-manager", - "url": "https://github.com/Ocramius/ProxyManager" + "url": "https://github.com/Ocramius/ProxyManager", + "name": "ocramius/proxy-manager" } }, "autoload": { @@ -2230,7 +2391,7 @@ ], "support": { "issues": "https://github.com/FriendsOfPHP/proxy-manager-lts/issues", - "source": "https://github.com/FriendsOfPHP/proxy-manager-lts/tree/v1.0.12" + "source": "https://github.com/FriendsOfPHP/proxy-manager-lts/tree/v1.0.18" }, "funding": [ { @@ -2242,20 +2403,20 @@ "type": "tidelift" } ], - "time": "2022-05-05T09:31:05+00:00" + "time": "2024-03-20T12:50:41+00:00" }, { "name": "google/apiclient", - "version": "v2.18.2", + "version": "v2.18.3", "source": { "type": "git", "url": "https://github.com/googleapis/google-api-php-client.git", - "reference": "d8d201ba8a189a3cd7fb34e4da569f2ed440eee7" + "reference": "4eee42d201eff054428a4836ec132944d271f051" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-api-php-client/zipball/d8d201ba8a189a3cd7fb34e4da569f2ed440eee7", - "reference": "d8d201ba8a189a3cd7fb34e4da569f2ed440eee7", + "url": "https://api.github.com/repos/googleapis/google-api-php-client/zipball/4eee42d201eff054428a4836ec132944d271f051", + "reference": "4eee42d201eff054428a4836ec132944d271f051", "shasum": "" }, "require": { @@ -2309,9 +2470,9 @@ ], "support": { "issues": "https://github.com/googleapis/google-api-php-client/issues", - "source": "https://github.com/googleapis/google-api-php-client/tree/v2.18.2" + "source": "https://github.com/googleapis/google-api-php-client/tree/v2.18.3" }, - "time": "2024-12-16T22:52:40+00:00" + "time": "2025-04-08T21:59:36+00:00" }, { "name": "google/apiclient-services", @@ -2806,16 +2967,16 @@ }, { "name": "heureka/bank-account-validator", - "version": "v1.2.1", + "version": "v1.2.2", "source": { "type": "git", "url": "https://github.com/heureka/bank-account-validator.git", - "reference": "95a88c212aadbf25cffbd5018d4c6cd8f62d8776" + "reference": "959dc0d777baedc6111dc8a5570a7a27fd5cd875" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/heureka/bank-account-validator/zipball/95a88c212aadbf25cffbd5018d4c6cd8f62d8776", - "reference": "95a88c212aadbf25cffbd5018d4c6cd8f62d8776", + "url": "https://api.github.com/repos/heureka/bank-account-validator/zipball/959dc0d777baedc6111dc8a5570a7a27fd5cd875", + "reference": "959dc0d777baedc6111dc8a5570a7a27fd5cd875", "shasum": "" }, "require": { @@ -2845,9 +3006,9 @@ "description": "Simple validator for bank account number - verify only checksum", "support": { "issues": "https://github.com/heureka/bank-account-validator/issues", - "source": "https://github.com/heureka/bank-account-validator/tree/v1.2.1" + "source": "https://github.com/heureka/bank-account-validator/tree/v1.2.2" }, - "time": "2024-10-29T09:29:13+00:00" + "time": "2025-07-10T08:29:20+00:00" }, { "name": "http-interop/http-factory-guzzle", @@ -3041,29 +3202,29 @@ }, { "name": "laminas/laminas-code", - "version": "4.5.1", + "version": "4.16.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-code.git", - "reference": "6fd96d4d913571a2cd056a27b123fa28cb90ac4e" + "reference": "1793e78dad4108b594084d05d1fb818b85b110af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-code/zipball/6fd96d4d913571a2cd056a27b123fa28cb90ac4e", - "reference": "6fd96d4d913571a2cd056a27b123fa28cb90ac4e", + "url": "https://api.github.com/repos/laminas/laminas-code/zipball/1793e78dad4108b594084d05d1fb818b85b110af", + "reference": "1793e78dad4108b594084d05d1fb818b85b110af", "shasum": "" }, "require": { - "php": ">=7.4, <8.2" + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" }, "require-dev": { - "doctrine/annotations": "^1.13.2", + "doctrine/annotations": "^2.0.1", "ext-phar": "*", - "laminas/laminas-coding-standard": "^2.3.0", - "laminas/laminas-stdlib": "^3.6.1", - "phpunit/phpunit": "^9.5.10", - "psalm/plugin-phpunit": "^0.16.1", - "vimeo/psalm": "^4.13.1" + "laminas/laminas-coding-standard": "^3.0.0", + "laminas/laminas-stdlib": "^3.18.0", + "phpunit/phpunit": "^10.5.37", + "psalm/plugin-phpunit": "^0.19.0", + "vimeo/psalm": "^5.15.0" }, "suggest": { "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features", @@ -3071,9 +3232,6 @@ }, "type": "library", "autoload": { - "files": [ - "polyfill/ReflectionEnumPolyfill.php" - ], "psr-4": { "Laminas\\Code\\": "src/" } @@ -3103,40 +3261,42 @@ "type": "community_bridge" } ], - "time": "2021-12-19T18:06:55+00:00" + "time": "2024-11-20T13:15:13+00:00" }, { "name": "latte/latte", - "version": "v2.11.6", + "version": "v3.0.23", "source": { "type": "git", "url": "https://github.com/nette/latte.git", - "reference": "af4dbb23a6044b1cf4904830a9b00246318c93d4" + "reference": "3198a4e336a2a1e535924af11d9a63fbf1650836" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/latte/zipball/af4dbb23a6044b1cf4904830a9b00246318c93d4", - "reference": "af4dbb23a6044b1cf4904830a9b00246318c93d4", + "url": "https://api.github.com/repos/nette/latte/zipball/3198a4e336a2a1e535924af11d9a63fbf1650836", + "reference": "3198a4e336a2a1e535924af11d9a63fbf1650836", "shasum": "" }, "require": { "ext-json": "*", "ext-tokenizer": "*", - "php": ">=7.1 <8.3" + "php": "8.0 - 8.4" }, "conflict": { - "nette/application": "<2.4.1" + "nette/application": "<3.1.7", + "nette/caching": "<3.1.4" }, "require-dev": { - "nette/php-generator": "^3.3.4", - "nette/tester": "^2.0", - "nette/utils": "^3.0", - "phpstan/phpstan": "^1", - "tracy/tracy": "^2.3" + "nette/php-generator": "^4.0", + "nette/tester": "^2.5", + "nette/utils": "^4.0", + "phpstan/phpstan-nette": "^2.0@stable", + "tracy/tracy": "^2.10" }, "suggest": { "ext-fileinfo": "to use filter |datastream", "ext-iconv": "to use filters |reverse, |substring", + "ext-intl": "to use Latte\\Engine::setLocale()", "ext-mbstring": "to use filters like lower, upper, capitalize, ...", "nette/php-generator": "to use tag {templatePrint}", "nette/utils": "to use filter |webalize" @@ -3147,10 +3307,13 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.11-dev" + "dev-master": "3.0-dev" } }, "autoload": { + "psr-4": { + "Latte\\": "src/Latte" + }, "classmap": [ "src/" ] @@ -3185,22 +3348,22 @@ ], "support": { "issues": "https://github.com/nette/latte/issues", - "source": "https://github.com/nette/latte/tree/v2.11.6" + "source": "https://github.com/nette/latte/tree/v3.0.23" }, - "time": "2022-11-04T14:53:52+00:00" + "time": "2025-07-17T01:01:46+00:00" }, { "name": "league/flysystem", - "version": "3.29.1", + "version": "3.30.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "edc1bb7c86fab0776c3287dbd19b5fa278347319" + "reference": "2203e3151755d874bb2943649dae1eb8533ac93e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/edc1bb7c86fab0776c3287dbd19b5fa278347319", - "reference": "edc1bb7c86fab0776c3287dbd19b5fa278347319", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/2203e3151755d874bb2943649dae1eb8533ac93e", + "reference": "2203e3151755d874bb2943649dae1eb8533ac93e", "shasum": "" }, "require": { @@ -3224,13 +3387,13 @@ "composer/semver": "^3.0", "ext-fileinfo": "*", "ext-ftp": "*", - "ext-mongodb": "^1.3", + "ext-mongodb": "^1.3|^2", "ext-zip": "*", "friendsofphp/php-cs-fixer": "^3.5", "google/cloud-storage": "^1.23", "guzzlehttp/psr7": "^2.6", "microsoft/azure-storage-blob": "^1.1", - "mongodb/mongodb": "^1.2", + "mongodb/mongodb": "^1.2|^2", "phpseclib/phpseclib": "^3.0.36", "phpstan/phpstan": "^1.10", "phpunit/phpunit": "^9.5.11|^10.0", @@ -3268,22 +3431,22 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.29.1" + "source": "https://github.com/thephpleague/flysystem/tree/3.30.0" }, - "time": "2024-10-08T08:58:34+00:00" + "time": "2025-06-25T13:29:59+00:00" }, { "name": "league/flysystem-local", - "version": "3.29.0", + "version": "3.30.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-local.git", - "reference": "e0e8d52ce4b2ed154148453d321e97c8e931bd27" + "reference": "6691915f77c7fb69adfb87dcd550052dc184ee10" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/e0e8d52ce4b2ed154148453d321e97c8e931bd27", - "reference": "e0e8d52ce4b2ed154148453d321e97c8e931bd27", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/6691915f77c7fb69adfb87dcd550052dc184ee10", + "reference": "6691915f77c7fb69adfb87dcd550052dc184ee10", "shasum": "" }, "require": { @@ -3317,9 +3480,9 @@ "local" ], "support": { - "source": "https://github.com/thephpleague/flysystem-local/tree/3.29.0" + "source": "https://github.com/thephpleague/flysystem-local/tree/3.30.0" }, - "time": "2024-08-09T21:24:39+00:00" + "time": "2025-05-21T10:34:19+00:00" }, { "name": "league/mime-type-detection", @@ -3618,16 +3781,16 @@ }, { "name": "moneyphp/money", - "version": "v4.6.0", + "version": "v4.7.1", "source": { "type": "git", "url": "https://github.com/moneyphp/money.git", - "reference": "ddf6a86b574808f8844777ed4e8c4f92a10dac9b" + "reference": "1a23f0e1b22e2c59ed5ed70cfbe4cbe696be9348" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/moneyphp/money/zipball/ddf6a86b574808f8844777ed4e8c4f92a10dac9b", - "reference": "ddf6a86b574808f8844777ed4e8c4f92a10dac9b", + "url": "https://api.github.com/repos/moneyphp/money/zipball/1a23f0e1b22e2c59ed5ed70cfbe4cbe696be9348", + "reference": "1a23f0e1b22e2c59ed5ed70cfbe4cbe696be9348", "shasum": "" }, "require": { @@ -3649,10 +3812,12 @@ "php-http/message": "^1.16.0", "php-http/mock-client": "^1.6.0", "phpbench/phpbench": "^1.2.5", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1.9", + "phpstan/phpstan-phpunit": "^2.0", "phpunit/phpunit": "^10.5.9", - "psalm/plugin-phpunit": "^0.18.4", "psr/cache": "^1.0.1 || ^2.0 || ^3.0", - "vimeo/psalm": "~5.20.0" + "ticketswap/phpstan-error-formatter": "^1.1" }, "suggest": { "ext-gmp": "Calculate without integer limits", @@ -3700,9 +3865,9 @@ ], "support": { "issues": "https://github.com/moneyphp/money/issues", - "source": "https://github.com/moneyphp/money/tree/v4.6.0" + "source": "https://github.com/moneyphp/money/tree/v4.7.1" }, - "time": "2024-11-22T10:59:03+00:00" + "time": "2025-06-06T07:12:38+00:00" }, { "name": "monolog/monolog", @@ -4133,16 +4298,16 @@ }, { "name": "nette/bootstrap", - "version": "v3.2.4", + "version": "v3.2.6", "source": { "type": "git", "url": "https://github.com/nette/bootstrap.git", - "reference": "4876d25955b4164d714bc17c265f664f6594685b" + "reference": "287240831efe4936b23a1b643df0d54069a4eda0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/bootstrap/zipball/4876d25955b4164d714bc17c265f664f6594685b", - "reference": "4876d25955b4164d714bc17c265f664f6594685b", + "url": "https://api.github.com/repos/nette/bootstrap/zipball/287240831efe4936b23a1b643df0d54069a4eda0", + "reference": "287240831efe4936b23a1b643df0d54069a4eda0", "shasum": "" }, "require": { @@ -4208,9 +4373,9 @@ ], "support": { "issues": "https://github.com/nette/bootstrap/issues", - "source": "https://github.com/nette/bootstrap/tree/v3.2.4" + "source": "https://github.com/nette/bootstrap/tree/v3.2.6" }, - "time": "2024-06-18T22:13:57+00:00" + "time": "2025-05-22T06:18:42+00:00" }, { "name": "nette/caching", @@ -4718,21 +4883,21 @@ }, { "name": "nette/neon", - "version": "v3.4.3", + "version": "v3.4.4", "source": { "type": "git", "url": "https://github.com/nette/neon.git", - "reference": "c8481c104431c8d94cc88424a1e21f47f8c93280" + "reference": "3411aa86b104e2d5b7e760da4600865ead963c3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/neon/zipball/c8481c104431c8d94cc88424a1e21f47f8c93280", - "reference": "c8481c104431c8d94cc88424a1e21f47f8c93280", + "url": "https://api.github.com/repos/nette/neon/zipball/3411aa86b104e2d5b7e760da4600865ead963c3c", + "reference": "3411aa86b104e2d5b7e760da4600865ead963c3c", "shasum": "" }, "require": { "ext-json": "*", - "php": "8.0 - 8.3" + "php": "8.0 - 8.4" }, "require-dev": { "nette/tester": "^2.4", @@ -4780,27 +4945,27 @@ ], "support": { "issues": "https://github.com/nette/neon/issues", - "source": "https://github.com/nette/neon/tree/v3.4.3" + "source": "https://github.com/nette/neon/tree/v3.4.4" }, - "time": "2024-06-26T14:53:59+00:00" + "time": "2024-10-04T22:00:08+00:00" }, { "name": "nette/php-generator", - "version": "v4.1.5", + "version": "v4.1.8", "source": { "type": "git", "url": "https://github.com/nette/php-generator.git", - "reference": "690b00d81d42d5633e4457c43ef9754573b6f9d6" + "reference": "42806049a7774a2bd316c958f5dcf01c6b5c56fa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/php-generator/zipball/690b00d81d42d5633e4457c43ef9754573b6f9d6", - "reference": "690b00d81d42d5633e4457c43ef9754573b6f9d6", + "url": "https://api.github.com/repos/nette/php-generator/zipball/42806049a7774a2bd316c958f5dcf01c6b5c56fa", + "reference": "42806049a7774a2bd316c958f5dcf01c6b5c56fa", "shasum": "" }, "require": { "nette/utils": "^3.2.9 || ^4.0", - "php": "8.0 - 8.3" + "php": "8.0 - 8.4" }, "require-dev": { "jetbrains/phpstorm-attributes": "dev-master", @@ -4839,7 +5004,7 @@ "homepage": "https://nette.org/contributors" } ], - "description": "🐘 Nette PHP Generator: generates neat PHP code for you. Supports new PHP 8.3 features.", + "description": "🐘 Nette PHP Generator: generates neat PHP code for you. Supports new PHP 8.4 features.", "homepage": "https://nette.org", "keywords": [ "code", @@ -4849,9 +5014,9 @@ ], "support": { "issues": "https://github.com/nette/php-generator/issues", - "source": "https://github.com/nette/php-generator/tree/v4.1.5" + "source": "https://github.com/nette/php-generator/tree/v4.1.8" }, - "time": "2024-05-12T17:31:02+00:00" + "time": "2025-03-31T00:29:29+00:00" }, { "name": "nette/robot-loader", @@ -5206,12 +5371,12 @@ "version": "v0.3.0", "source": { "type": "git", - "url": "https://github.com/nettrine/cache.git", + "url": "https://github.com/contributte/doctrine-cache.git", "reference": "8a58596de24cdd61e45866ef8f35788675f6d2bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nettrine/cache/zipball/8a58596de24cdd61e45866ef8f35788675f6d2bc", + "url": "https://api.github.com/repos/contributte/doctrine-cache/zipball/8a58596de24cdd61e45866ef8f35788675f6d2bc", "reference": "8a58596de24cdd61e45866ef8f35788675f6d2bc", "shasum": "" }, @@ -5259,30 +5424,40 @@ "nettrine" ], "support": { - "issues": "https://github.com/nettrine/cache/issues", - "source": "https://github.com/nettrine/cache/tree/v0.3.0" + "issues": "https://github.com/contributte/doctrine-cache/issues", + "source": "https://github.com/contributte/doctrine-cache/tree/v0.3.0" }, + "funding": [ + { + "url": "https://contributte.org/partners.html", + "type": "custom" + }, + { + "url": "https://github.com/f3l1x", + "type": "github" + } + ], "time": "2020-12-10T17:56:32+00:00" }, { "name": "nettrine/dbal", - "version": "v0.8.0", + "version": "v0.8.2", "source": { "type": "git", - "url": "https://github.com/nettrine/dbal.git", - "reference": "e092aac6561073e802cab948fb913e2043894155" + "url": "https://github.com/contributte/doctrine-dbal.git", + "reference": "e5d38af256c05617c1387ecba8f04ec58c32447a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nettrine/dbal/zipball/e092aac6561073e802cab948fb913e2043894155", - "reference": "e092aac6561073e802cab948fb913e2043894155", + "url": "https://api.github.com/repos/contributte/doctrine-dbal/zipball/e5d38af256c05617c1387ecba8f04ec58c32447a", + "reference": "e5d38af256c05617c1387ecba8f04ec58c32447a", "shasum": "" }, "require": { "contributte/di": "^0.5.0", - "doctrine/dbal": "^2.13 || ^3.2", + "doctrine/dbal": "^3.5.3", "nettrine/cache": "^0.3.0", - "php": ">=7.2 <8.2" + "php": ">=7.4" }, "conflict": { "nette/di": "<3.0.6", @@ -5292,7 +5467,7 @@ "contributte/console": "^0.9.1", "mockery/mockery": "^1.3.5", "ninjify/nunjuck": "^0.4", - "ninjify/qa": "^0.12", + "ninjify/qa": "^0.13", "phpstan/phpstan": "^1.2.0", "phpstan/phpstan-deprecation-rules": "^1.0.0", "phpstan/phpstan-nette": "^1.0.0", @@ -5303,7 +5478,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "0.8.x-dev" + "dev-master": "0.9.x-dev" } }, "autoload": { @@ -5322,7 +5497,7 @@ } ], "description": "Doctrine DBAL for Nette Framework", - "homepage": "https://github.com/nettrine/dbal", + "homepage": "https://github.com/contributte/doctrine-dbal", "keywords": [ "database", "dbal", @@ -5333,10 +5508,20 @@ "sqlite" ], "support": { - "issues": "https://github.com/nettrine/dbal/issues", - "source": "https://github.com/nettrine/dbal/tree/v0.8.0" + "issues": "https://github.com/contributte/doctrine-dbal/issues", + "source": "https://github.com/contributte/doctrine-dbal/tree/v0.8.2" }, - "time": "2022-05-09T08:04:24+00:00" + "funding": [ + { + "url": "https://contributte.org/partners.html", + "type": "custom" + }, + { + "url": "https://github.com/f3l1x", + "type": "github" + } + ], + "time": "2023-01-13T16:26:05+00:00" }, { "name": "nettrine/migrations", @@ -5743,21 +5928,21 @@ }, { "name": "php-http/guzzle7-adapter", - "version": "1.0.0", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/php-http/guzzle7-adapter.git", - "reference": "fb075a71dbfa4847cf0c2938c4e5a9c478ef8b01" + "reference": "03a415fde709c2f25539790fecf4d9a31bc3d0eb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/guzzle7-adapter/zipball/fb075a71dbfa4847cf0c2938c4e5a9c478ef8b01", - "reference": "fb075a71dbfa4847cf0c2938c4e5a9c478ef8b01", + "url": "https://api.github.com/repos/php-http/guzzle7-adapter/zipball/03a415fde709c2f25539790fecf4d9a31bc3d0eb", + "reference": "03a415fde709c2f25539790fecf4d9a31bc3d0eb", "shasum": "" }, "require": { "guzzlehttp/guzzle": "^7.0", - "php": "^7.2 | ^8.0", + "php": "^7.3 | ^8.0", "php-http/httplug": "^2.0", "psr/http-client": "^1.0" }, @@ -5768,14 +5953,11 @@ }, "require-dev": { "php-http/client-integration-tests": "^3.0", + "php-http/message-factory": "^1.1", + "phpspec/prophecy-phpunit": "^2.0", "phpunit/phpunit": "^8.0|^9.3" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.2.x-dev" - } - }, "autoload": { "psr-4": { "Http\\Adapter\\Guzzle7\\": "src/" @@ -5799,22 +5981,22 @@ ], "support": { "issues": "https://github.com/php-http/guzzle7-adapter/issues", - "source": "https://github.com/php-http/guzzle7-adapter/tree/1.0.0" + "source": "https://github.com/php-http/guzzle7-adapter/tree/1.1.0" }, - "time": "2021-03-09T07:35:15+00:00" + "time": "2024-11-26T11:14:36+00:00" }, { "name": "php-http/httplug", - "version": "2.4.0", + "version": "2.4.1", "source": { "type": "git", "url": "https://github.com/php-http/httplug.git", - "reference": "625ad742c360c8ac580fcc647a1541d29e257f67" + "reference": "5cad731844891a4c282f3f3e1b582c46839d22f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/httplug/zipball/625ad742c360c8ac580fcc647a1541d29e257f67", - "reference": "625ad742c360c8ac580fcc647a1541d29e257f67", + "url": "https://api.github.com/repos/php-http/httplug/zipball/5cad731844891a4c282f3f3e1b582c46839d22f4", + "reference": "5cad731844891a4c282f3f3e1b582c46839d22f4", "shasum": "" }, "require": { @@ -5856,9 +6038,9 @@ ], "support": { "issues": "https://github.com/php-http/httplug/issues", - "source": "https://github.com/php-http/httplug/tree/2.4.0" + "source": "https://github.com/php-http/httplug/tree/2.4.1" }, - "time": "2023-04-14T15:10:03+00:00" + "time": "2024-09-23T11:39:58+00:00" }, { "name": "php-http/message", @@ -5986,16 +6168,16 @@ }, { "name": "php-http/promise", - "version": "1.2.1", + "version": "1.3.1", "source": { "type": "git", "url": "https://github.com/php-http/promise.git", - "reference": "44a67cb59f708f826f3bec35f22030b3edb90119" + "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/promise/zipball/44a67cb59f708f826f3bec35f22030b3edb90119", - "reference": "44a67cb59f708f826f3bec35f22030b3edb90119", + "url": "https://api.github.com/repos/php-http/promise/zipball/fc85b1fba37c169a69a07ef0d5a8075770cc1f83", + "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83", "shasum": "" }, "require": { @@ -6032,22 +6214,22 @@ ], "support": { "issues": "https://github.com/php-http/promise/issues", - "source": "https://github.com/php-http/promise/tree/1.2.1" + "source": "https://github.com/php-http/promise/tree/1.3.1" }, - "time": "2023-11-08T12:57:08+00:00" + "time": "2024-03-15T13:55:21+00:00" }, { "name": "phpoffice/phpspreadsheet", - "version": "4.1.0", + "version": "5.1.0", "source": { "type": "git", "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", - "reference": "6ff18c3a8df3a945492f75ce455d77f7ad55dd5c" + "reference": "fd26e45a814e94ae2aad0df757d9d1739c4bf2e0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/6ff18c3a8df3a945492f75ce455d77f7ad55dd5c", - "reference": "6ff18c3a8df3a945492f75ce455d77f7ad55dd5c", + "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/fd26e45a814e94ae2aad0df757d9d1739c4bf2e0", + "reference": "fd26e45a814e94ae2aad0df757d9d1739c4bf2e0", "shasum": "" }, "require": { @@ -6080,8 +6262,9 @@ "mitoteam/jpgraph": "^10.3", "mpdf/mpdf": "^8.1.1", "phpcompatibility/php-compatibility": "^9.3", - "phpstan/phpstan": "^1.1", - "phpstan/phpstan-phpunit": "^1.0", + "phpstan/phpstan": "^1.1 || ^2.0", + "phpstan/phpstan-deprecation-rules": "^1.0 || ^2.0", + "phpstan/phpstan-phpunit": "^1.0 || ^2.0", "phpunit/phpunit": "^10.5", "squizlabs/php_codesniffer": "^3.7", "tecnickcom/tcpdf": "^6.5" @@ -6137,9 +6320,9 @@ ], "support": { "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues", - "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/4.1.0" + "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/5.1.0" }, - "time": "2025-03-02T06:52:24+00:00" + "time": "2025-09-04T05:34:49+00:00" }, { "name": "phpoption/phpoption", @@ -6778,16 +6961,16 @@ }, { "name": "ramsey/collection", - "version": "2.0.0", + "version": "2.1.1", "source": { "type": "git", "url": "https://github.com/ramsey/collection.git", - "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5" + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", - "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "url": "https://api.github.com/repos/ramsey/collection/zipball/344572933ad0181accbf4ba763e85a0306a8c5e2", + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2", "shasum": "" }, "require": { @@ -6795,25 +6978,22 @@ }, "require-dev": { "captainhook/plugin-composer": "^5.3", - "ergebnis/composer-normalize": "^2.28.3", - "fakerphp/faker": "^1.21", + "ergebnis/composer-normalize": "^2.45", + "fakerphp/faker": "^1.24", "hamcrest/hamcrest-php": "^2.0", - "jangregor/phpstan-prophecy": "^1.0", - "mockery/mockery": "^1.5", + "jangregor/phpstan-prophecy": "^2.1", + "mockery/mockery": "^1.6", "php-parallel-lint/php-console-highlighter": "^1.0", - "php-parallel-lint/php-parallel-lint": "^1.3", - "phpcsstandards/phpcsutils": "^1.0.0-rc1", - "phpspec/prophecy-phpunit": "^2.0", - "phpstan/extension-installer": "^1.2", - "phpstan/phpstan": "^1.9", - "phpstan/phpstan-mockery": "^1.1", - "phpstan/phpstan-phpunit": "^1.3", - "phpunit/phpunit": "^9.5", - "psalm/plugin-mockery": "^1.1", - "psalm/plugin-phpunit": "^0.18.4", - "ramsey/coding-standard": "^2.0.3", - "ramsey/conventional-commits": "^1.3", - "vimeo/psalm": "^5.4" + "php-parallel-lint/php-parallel-lint": "^1.4", + "phpspec/prophecy-phpunit": "^2.3", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^10.5", + "ramsey/coding-standard": "^2.3", + "ramsey/conventional-commits": "^1.6", + "roave/security-advisories": "dev-latest" }, "type": "library", "extra": { @@ -6851,37 +7031,26 @@ ], "support": { "issues": "https://github.com/ramsey/collection/issues", - "source": "https://github.com/ramsey/collection/tree/2.0.0" + "source": "https://github.com/ramsey/collection/tree/2.1.1" }, - "funding": [ - { - "url": "https://github.com/ramsey", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", - "type": "tidelift" - } - ], - "time": "2022-12-31T21:50:55+00:00" + "time": "2025-03-22T05:38:12+00:00" }, { "name": "ramsey/uuid", - "version": "4.7.6", + "version": "4.9.1", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "91039bc1faa45ba123c4328958e620d382ec7088" + "reference": "81f941f6f729b1e3ceea61d9d014f8b6c6800440" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088", - "reference": "91039bc1faa45ba123c4328958e620d382ec7088", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/81f941f6f729b1e3ceea61d9d014f8b6c6800440", + "reference": "81f941f6f729b1e3ceea61d9d014f8b6c6800440", "shasum": "" }, "require": { - "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12", - "ext-json": "*", + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13 || ^0.14", "php": "^8.0", "ramsey/collection": "^1.2 || ^2.0" }, @@ -6889,26 +7058,23 @@ "rhumsaa/uuid": "self.version" }, "require-dev": { - "captainhook/captainhook": "^5.10", + "captainhook/captainhook": "^5.25", "captainhook/plugin-composer": "^5.3", - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "doctrine/annotations": "^1.8", - "ergebnis/composer-normalize": "^2.15", - "mockery/mockery": "^1.3", + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "ergebnis/composer-normalize": "^2.47", + "mockery/mockery": "^1.6", "paragonie/random-lib": "^2", - "php-mock/php-mock": "^2.2", - "php-mock/php-mock-mockery": "^1.3", - "php-parallel-lint/php-parallel-lint": "^1.1", - "phpbench/phpbench": "^1.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-mockery": "^1.1", - "phpstan/phpstan-phpunit": "^1.1", - "phpunit/phpunit": "^8.5 || ^9", - "ramsey/composer-repl": "^1.4", - "slevomat/coding-standard": "^8.4", - "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "^4.9" + "php-mock/php-mock": "^2.6", + "php-mock/php-mock-mockery": "^1.5", + "php-parallel-lint/php-parallel-lint": "^1.4.0", + "phpbench/phpbench": "^1.2.14", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^9.6", + "slevomat/coding-standard": "^8.18", + "squizlabs/php_codesniffer": "^3.13" }, "suggest": { "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", @@ -6943,19 +7109,9 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.7.6" + "source": "https://github.com/ramsey/uuid/tree/4.9.1" }, - "funding": [ - { - "url": "https://github.com/ramsey", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", - "type": "tidelift" - } - ], - "time": "2024-04-27T21:32:50+00:00" + "time": "2025-09-04T20:59:21+00:00" }, { "name": "sentry/sentry", @@ -7059,16 +7215,16 @@ }, { "name": "setasign/fpdi", - "version": "v2.6.3", + "version": "v2.6.4", "source": { "type": "git", "url": "https://github.com/Setasign/FPDI.git", - "reference": "67c31f5e50c93c20579ca9e23035d8c540b51941" + "reference": "4b53852fde2734ec6a07e458a085db627c60eada" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Setasign/FPDI/zipball/67c31f5e50c93c20579ca9e23035d8c540b51941", - "reference": "67c31f5e50c93c20579ca9e23035d8c540b51941", + "url": "https://api.github.com/repos/Setasign/FPDI/zipball/4b53852fde2734ec6a07e458a085db627c60eada", + "reference": "4b53852fde2734ec6a07e458a085db627c60eada", "shasum": "" }, "require": { @@ -7083,7 +7239,7 @@ "setasign/fpdf": "~1.8.6", "setasign/tfpdf": "~1.33", "squizlabs/php_codesniffer": "^3.5", - "tecnickcom/tcpdf": "^6.2" + "tecnickcom/tcpdf": "^6.8" }, "suggest": { "setasign/fpdf": "FPDI will extend this class but as it is also possible to use TCPDF or tFPDF as an alternative. There's no fixed dependency configured." @@ -7119,7 +7275,7 @@ ], "support": { "issues": "https://github.com/Setasign/FPDI/issues", - "source": "https://github.com/Setasign/FPDI/tree/v2.6.3" + "source": "https://github.com/Setasign/FPDI/tree/v2.6.4" }, "funding": [ { @@ -7127,7 +7283,7 @@ "type": "tidelift" } ], - "time": "2025-02-05T13:22:35+00:00" + "time": "2025-08-05T09:57:14+00:00" }, { "name": "skaut/dependent-select-box", @@ -7449,26 +7605,202 @@ "time": "2022-02-09T15:49:12+00:00" }, { - "name": "symfony/console", - "version": "v5.4.34", + "name": "symfony/cache", + "version": "v6.4.24", "source": { "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "4b4d8cd118484aa604ec519062113dd87abde18c" + "url": "https://github.com/symfony/cache.git", + "reference": "d038cd3054aeaf1c674022a77048b2ef6376a175" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/4b4d8cd118484aa604ec519062113dd87abde18c", - "reference": "4b4d8cd118484aa604ec519062113dd87abde18c", + "url": "https://api.github.com/repos/symfony/cache/zipball/d038cd3054aeaf1c674022a77048b2ef6376a175", + "reference": "d038cd3054aeaf1c674022a77048b2ef6376a175", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2|^3", + "php": ">=8.1", + "psr/cache": "^2.0|^3.0", + "psr/log": "^1.1|^2|^3", + "symfony/cache-contracts": "^2.5|^3", + "symfony/service-contracts": "^2.5|^3", + "symfony/var-exporter": "^6.3.6|^7.0" + }, + "conflict": { + "doctrine/dbal": "<2.13.1", + "symfony/dependency-injection": "<5.4", + "symfony/http-kernel": "<5.4", + "symfony/var-dumper": "<5.4" + }, + "provide": { + "psr/cache-implementation": "2.0|3.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0", + "symfony/cache-implementation": "1.1|2.0|3.0" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/dbal": "^2.13.1|^3|^4", + "predis/predis": "^1.1|^2.0", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/filesystem": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Cache\\": "" + }, + "classmap": [ + "Traits/ValueWrapper.php" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides extended PSR-6, PSR-16 (and tags) implementations", + "homepage": "https://symfony.com", + "keywords": [ + "caching", + "psr6" + ], + "support": { + "source": "https://github.com/symfony/cache/tree/v6.4.24" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-30T09:32:03+00:00" + }, + { + "name": "symfony/cache-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache-contracts.git", + "reference": "5d68a57d66910405e5c0b63d6f0af941e66fc868" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/5d68a57d66910405e5c0b63d6f0af941e66fc868", + "reference": "5d68a57d66910405e5c0b63d6f0af941e66fc868", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/cache": "^3.0" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Cache\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to caching", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/cache-contracts/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-03-13T15:25:07+00:00" + }, + { + "name": "symfony/console", + "version": "v5.4.47", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed", + "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2|^3", "symfony/string": "^5.1|^6.0" }, "conflict": { @@ -7529,7 +7861,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.34" + "source": "https://github.com/symfony/console/tree/v5.4.47" }, "funding": [ { @@ -7545,20 +7877,20 @@ "type": "tidelift" } ], - "time": "2023-12-08T13:33:03+00:00" + "time": "2024-11-06T11:30:55+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.5.1", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6" + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", - "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", "shasum": "" }, "require": { @@ -7571,7 +7903,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.5-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -7596,7 +7928,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" }, "funding": [ { @@ -7612,7 +7944,7 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/doctrine-messenger", @@ -7794,12 +8126,12 @@ }, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { "dev-main": "1.1-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -7852,23 +8184,25 @@ }, { "name": "symfony/filesystem", - "version": "v5.4.9", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "36a017fa4cce1eff1b8e8129ff53513abcef05ba" + "reference": "edcbb768a186b5c3f25d0643159a787d3e63b7fd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/36a017fa4cce1eff1b8e8129ff53513abcef05ba", - "reference": "36a017fa4cce1eff1b8e8129ff53513abcef05ba", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/edcbb768a186b5c3f25d0643159a787d3e63b7fd", + "reference": "edcbb768a186b5c3f25d0643159a787d3e63b7fd", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.2", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8", - "symfony/polyfill-php80": "^1.16" + "symfony/polyfill-mbstring": "~1.8" + }, + "require-dev": { + "symfony/process": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -7896,7 +8230,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.4.9" + "source": "https://github.com/symfony/filesystem/tree/v7.3.2" }, "funding": [ { @@ -7907,12 +8241,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-05-20T13:55:35+00:00" + "time": "2025-07-07T08:17:47+00:00" }, { "name": "symfony/messenger", @@ -8073,7 +8411,7 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.31.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", @@ -8132,7 +8470,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" }, "funding": [ { @@ -8143,6 +8481,14 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -8152,20 +8498,20 @@ }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.29.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", - "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" @@ -8173,8 +8519,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -8210,7 +8556,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" }, "funding": [ { @@ -8221,29 +8567,33 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2025-06-27T09:58:17+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.29.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" + "reference": "3833d7255cc303546435cb650316bff708a1c75c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", - "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" @@ -8251,8 +8601,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -8291,7 +8641,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" }, "funding": [ { @@ -8302,28 +8652,33 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.31.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", "shasum": "" }, "require": { + "ext-iconv": "*", "php": ">=7.2" }, "provide": { @@ -8371,7 +8726,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" }, "funding": [ { @@ -8382,46 +8737,43 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-12-23T08:48:59+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.28.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179" + "reference": "fa2ae56c44f03bed91a39bfc9822e31e7c5c38ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/70f4aebd92afca2f865444d30a4d2151c13c3179", - "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/fa2ae56c44f03bed91a39bfc9822e31e7c5c38ce", + "reference": "fa2ae56c44f03bed91a39bfc9822e31e7c5c38ce", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, - "type": "library", + "type": "metapackage", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "notification-url": "https://packagist.org/downloads/", @@ -8447,7 +8799,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.31.0" }, "funding": [ { @@ -8463,33 +8815,30 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.28.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5" + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fe2f306d1d9d346a7fee353d0d5012e401e984b5", - "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -8526,7 +8875,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.33.0" }, "funding": [ { @@ -8537,25 +8886,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.31.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", "shasum": "" }, "require": { @@ -8606,7 +8959,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" }, "funding": [ { @@ -8617,12 +8970,20 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2025-01-02T08:10:11+00:00" }, { "name": "symfony/property-access", @@ -8853,33 +9214,34 @@ }, { "name": "symfony/service-contracts", - "version": "v3.4.1", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0" + "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/fe07cbc8d837f60caf7018068e350cc5163681a0", - "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f021b05a130d35510bd6b25fe9053c2a8a15d5d4", + "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4", "shasum": "" }, "require": { "php": ">=8.1", - "psr/container": "^1.1|^2.0" + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { "ext-psr": "<1.1|>=2" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "3.4-dev" - }, "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" } }, "autoload": { @@ -8915,7 +9277,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.4.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.6.0" }, "funding": [ { @@ -8931,7 +9293,7 @@ "type": "tidelift" } ], - "time": "2023-12-26T14:02:43+00:00" + "time": "2025-04-25T09:37:31+00:00" }, { "name": "symfony/stopwatch", @@ -8997,16 +9359,16 @@ }, { "name": "symfony/string", - "version": "v6.4.4", + "version": "v6.4.25", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "4e465a95bdc32f49cf4c7f07f751b843bbd6dcd9" + "reference": "7cdec7edfaf2cdd9c18901e35bcf9653d6209ff1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/4e465a95bdc32f49cf4c7f07f751b843bbd6dcd9", - "reference": "4e465a95bdc32f49cf4c7f07f751b843bbd6dcd9", + "url": "https://api.github.com/repos/symfony/string/zipball/7cdec7edfaf2cdd9c18901e35bcf9653d6209ff1", + "reference": "7cdec7edfaf2cdd9c18901e35bcf9653d6209ff1", "shasum": "" }, "require": { @@ -9063,7 +9425,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.4" + "source": "https://github.com/symfony/string/tree/v6.4.25" }, "funding": [ { @@ -9074,55 +9436,125 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-02-01T13:16:41+00:00" + "time": "2025-08-22T12:33:20+00:00" }, { - "name": "thecodingmachine/safe", - "version": "v2.5.0", + "name": "symfony/var-exporter", + "version": "v7.3.3", "source": { "type": "git", - "url": "https://github.com/thecodingmachine/safe.git", - "reference": "3115ecd6b4391662b4931daac4eba6b07a2ac1f0" + "url": "https://github.com/symfony/var-exporter.git", + "reference": "d4dfcd2a822cbedd7612eb6fbd260e46f87b7137" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/3115ecd6b4391662b4931daac4eba6b07a2ac1f0", - "reference": "3115ecd6b4391662b4931daac4eba6b07a2ac1f0", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/d4dfcd2a822cbedd7612eb6fbd260e46f87b7137", + "reference": "d4dfcd2a822cbedd7612eb6fbd260e46f87b7137", "shasum": "" }, "require": { - "php": "^8.0" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" }, "require-dev": { - "phpstan/phpstan": "^1.5", - "phpunit/phpunit": "^9.5", - "squizlabs/php_codesniffer": "^3.2", - "thecodingmachine/phpstan-strict-rules": "^1.0" + "symfony/property-access": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2.x-dev" + "autoload": { + "psr-4": { + "Symfony\\Component\\VarExporter\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } + ], + "description": "Allows exporting any serializable PHP data structure to plain PHP code", + "homepage": "https://symfony.com", + "keywords": [ + "clone", + "construct", + "export", + "hydrate", + "instantiate", + "lazy-loading", + "proxy", + "serialize" + ], + "support": { + "source": "https://github.com/symfony/var-exporter/tree/v7.3.3" }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-08-18T13:10:53+00:00" + }, + { + "name": "thecodingmachine/safe", + "version": "v3.3.0", + "source": { + "type": "git", + "url": "https://github.com/thecodingmachine/safe.git", + "reference": "2cdd579eeaa2e78e51c7509b50cc9fb89a956236" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/2cdd579eeaa2e78e51c7509b50cc9fb89a956236", + "reference": "2cdd579eeaa2e78e51c7509b50cc9fb89a956236", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "php-parallel-lint/php-parallel-lint": "^1.4", + "phpstan/phpstan": "^2", + "phpunit/phpunit": "^10", + "squizlabs/php_codesniffer": "^3.2" + }, + "type": "library", "autoload": { "files": [ - "deprecated/apc.php", - "deprecated/array.php", - "deprecated/datetime.php", - "deprecated/libevent.php", - "deprecated/misc.php", - "deprecated/password.php", - "deprecated/mssql.php", - "deprecated/stats.php", - "deprecated/strings.php", "lib/special_cases.php", - "deprecated/mysqli.php", "generated/apache.php", "generated/apcu.php", "generated/array.php", @@ -9162,6 +9594,7 @@ "generated/mbstring.php", "generated/misc.php", "generated/mysql.php", + "generated/mysqli.php", "generated/network.php", "generated/oci8.php", "generated/opcache.php", @@ -9174,6 +9607,7 @@ "generated/ps.php", "generated/pspell.php", "generated/readline.php", + "generated/rnp.php", "generated/rpminfo.php", "generated/rrd.php", "generated/sem.php", @@ -9205,7 +9639,6 @@ "lib/DateTime.php", "lib/DateTimeImmutable.php", "lib/Exceptions/", - "deprecated/Exceptions/", "generated/Exceptions/" ] }, @@ -9216,9 +9649,23 @@ "description": "PHP core functions that throw exceptions instead of returning FALSE on error", "support": { "issues": "https://github.com/thecodingmachine/safe/issues", - "source": "https://github.com/thecodingmachine/safe/tree/v2.5.0" + "source": "https://github.com/thecodingmachine/safe/tree/v3.3.0" }, - "time": "2023-04-05T11:54:14+00:00" + "funding": [ + { + "url": "https://github.com/OskarStark", + "type": "github" + }, + { + "url": "https://github.com/shish", + "type": "github" + }, + { + "url": "https://github.com/staabm", + "type": "github" + } + ], + "time": "2025-05-14T06:15:44+00:00" }, { "name": "tracy/tracy", @@ -9386,16 +9833,16 @@ }, { "name": "vlucas/phpdotenv", - "version": "v5.6.1", + "version": "v5.6.2", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2" + "reference": "24ac4c74f91ee2c193fa1aaa5c249cb0822809af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/a59a13791077fe3d44f90e7133eb68e7d22eaff2", - "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/24ac4c74f91ee2c193fa1aaa5c249cb0822809af", + "reference": "24ac4c74f91ee2c193fa1aaa5c249cb0822809af", "shasum": "" }, "require": { @@ -9454,7 +9901,7 @@ ], "support": { "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.1" + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.2" }, "funding": [ { @@ -9466,7 +9913,7 @@ "type": "tidelift" } ], - "time": "2024-07-20T21:52:34+00:00" + "time": "2025-04-30T23:37:27+00:00" }, { "name": "warhuhn/chronos-doctrine", @@ -9513,6 +9960,64 @@ "source": "https://github.com/warhuhn/chronos-php" }, "time": "2023-11-19T23:17:49+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" } ], "packages-dev": [ @@ -10249,22 +10754,22 @@ }, { "name": "doctrine/coding-standard", - "version": "12.0.0", + "version": "13.0.1", "source": { "type": "git", "url": "https://github.com/doctrine/coding-standard.git", - "reference": "1b2b7dc58c68833af481fb9325c25abd40681c79" + "reference": "0affd62169186f32de725ca612e6129e81186a21" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/coding-standard/zipball/1b2b7dc58c68833af481fb9325c25abd40681c79", - "reference": "1b2b7dc58c68833af481fb9325c25abd40681c79", + "url": "https://api.github.com/repos/doctrine/coding-standard/zipball/0affd62169186f32de725ca612e6129e81186a21", + "reference": "0affd62169186f32de725ca612e6129e81186a21", "shasum": "" }, "require": { "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7 || ^1.0.0", - "php": "^7.2 || ^8.0", - "slevomat/coding-standard": "^8.11", + "php": "^7.4 || ^8.0", + "slevomat/coding-standard": "^8.16", "squizlabs/php_codesniffer": "^3.7" }, "type": "phpcodesniffer-standard", @@ -10299,9 +10804,9 @@ ], "support": { "issues": "https://github.com/doctrine/coding-standard/issues", - "source": "https://github.com/doctrine/coding-standard/tree/12.0.0" + "source": "https://github.com/doctrine/coding-standard/tree/13.0.1" }, - "time": "2023-04-24T17:43:28+00:00" + "time": "2025-05-14T10:54:19+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -10641,118 +11146,6 @@ }, "time": "2022-02-21T01:04:05+00:00" }, - { - "name": "phing/phing", - "version": "2.17.4", - "source": { - "type": "git", - "url": "https://github.com/phingofficial/phing.git", - "reference": "9f3bc8c72e65452686dcf64497e02a082f138908" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phingofficial/phing/zipball/9f3bc8c72e65452686dcf64497e02a082f138908", - "reference": "9f3bc8c72e65452686dcf64497e02a082f138908", - "shasum": "" - }, - "require": { - "php": ">=5.2.0" - }, - "require-dev": { - "ext-pdo_sqlite": "*", - "mikey179/vfsstream": "^1.6", - "pdepend/pdepend": "2.x", - "pear/archive_tar": "1.4.x", - "pear/http_request2": "dev-trunk", - "pear/net_growl": "dev-trunk", - "pear/pear-core-minimal": "1.10.1", - "pear/versioncontrol_git": "@dev", - "pear/versioncontrol_svn": "~0.5", - "phpdocumentor/phpdocumentor": "2.x", - "phploc/phploc": "~2.0.6", - "phpmd/phpmd": "~2.2", - "phpunit/phpunit": ">=3.7", - "sebastian/git": "~1.0", - "sebastian/phpcpd": "2.x", - "siad007/versioncontrol_hg": "^1.0", - "simpletest/simpletest": "^1.1", - "squizlabs/php_codesniffer": "~2.2", - "symfony/yaml": "^2.8 || ^3.1 || ^4.0" - }, - "suggest": { - "pdepend/pdepend": "PHP version of JDepend", - "pear/archive_tar": "Tar file management class", - "pear/versioncontrol_git": "A library that provides OO interface to handle Git repository", - "pear/versioncontrol_svn": "A simple OO-style interface for Subversion, the free/open-source version control system", - "phpdocumentor/phpdocumentor": "Documentation Generator for PHP", - "phploc/phploc": "A tool for quickly measuring the size of a PHP project", - "phpmd/phpmd": "PHP version of PMD tool", - "phpunit/php-code-coverage": "Library that provides collection, processing, and rendering functionality for PHP code coverage information", - "phpunit/phpunit": "The PHP Unit Testing Framework", - "sebastian/phpcpd": "Copy/Paste Detector (CPD) for PHP code", - "siad007/versioncontrol_hg": "A library for interfacing with Mercurial repositories.", - "tedivm/jshrink": "Javascript Minifier built in PHP" - }, - "bin": [ - "bin/phing" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.16.x-dev" - } - }, - "autoload": { - "classmap": [ - "classes/phing/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "include-path": [ - "classes" - ], - "license": [ - "LGPL-3.0-only" - ], - "authors": [ - { - "name": "Michiel Rook", - "email": "mrook@php.net" - }, - { - "name": "Phing Community", - "homepage": "https://www.phing.info/trac/wiki/Development/Contributors" - } - ], - "description": "PHing Is Not GNU make; it's a PHP project build system or build tool based on Apache Ant.", - "homepage": "https://www.phing.info/", - "keywords": [ - "build", - "phing", - "task", - "tool" - ], - "support": { - "irc": "irc://irc.freenode.net/phing", - "issues": "https://www.phing.info/trac/report", - "source": "https://github.com/phingofficial/phing/tree/2.17.4" - }, - "funding": [ - { - "url": "https://github.com/mrook", - "type": "github" - }, - { - "url": "https://github.com/siad007", - "type": "github" - }, - { - "url": "https://www.patreon.com/michielrook", - "type": "patreon" - } - ], - "time": "2022-07-08T09:07:07+00:00" - }, { "name": "php-vcr/php-vcr", "version": "1.4.5", @@ -10918,28 +11311,30 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "1.20.4", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "7d568c87a9df9c5f7e8b5f075fc469aa8cb0a4cd" + "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/7d568c87a9df9c5f7e8b5f075fc469aa8cb0a4cd", - "reference": "7d568c87a9df9c5f7e8b5f075fc469aa8cb0a4cd", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/9b30d6fd026b2c132b3985ce6b23bec09ab3aa68", + "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "php": "^7.4 || ^8.0" }, "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^5.3.0", "php-parallel-lint/php-parallel-lint": "^1.2", "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^1.5", - "phpstan/phpstan-phpunit": "^1.1", - "phpstan/phpstan-strict-rules": "^1.0", - "phpunit/phpunit": "^9.5", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^9.6", "symfony/process": "^5.2" }, "type": "library", @@ -10957,9 +11352,9 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.20.4" + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.1.0" }, - "time": "2023-05-02T09:19:37+00:00" + "time": "2025-02-19T13:28:12+00:00" }, { "name": "phpstan/phpstan", @@ -12970,32 +13365,32 @@ }, { "name": "slevomat/coding-standard", - "version": "8.11.1", + "version": "8.18.0", "source": { "type": "git", "url": "https://github.com/slevomat/coding-standard.git", - "reference": "af87461316b257e46e15bb041dca6fca3796d822" + "reference": "f3b23cb9b26301b8c3c7bb03035a1bee23974593" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/af87461316b257e46e15bb041dca6fca3796d822", - "reference": "af87461316b257e46e15bb041dca6fca3796d822", + "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/f3b23cb9b26301b8c3c7bb03035a1bee23974593", + "reference": "f3b23cb9b26301b8c3c7bb03035a1bee23974593", "shasum": "" }, "require": { "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7 || ^1.0", - "php": "^7.2 || ^8.0", - "phpstan/phpdoc-parser": ">=1.20.0 <1.21.0", - "squizlabs/php_codesniffer": "^3.7.1" + "php": "^7.4 || ^8.0", + "phpstan/phpdoc-parser": "^2.1.0", + "squizlabs/php_codesniffer": "^3.12.2" }, "require-dev": { - "phing/phing": "2.17.4", - "php-parallel-lint/php-parallel-lint": "1.3.2", - "phpstan/phpstan": "1.10.14", - "phpstan/phpstan-deprecation-rules": "1.1.3", - "phpstan/phpstan-phpunit": "1.3.11", - "phpstan/phpstan-strict-rules": "1.5.1", - "phpunit/phpunit": "7.5.20|8.5.21|9.6.6|10.1.1" + "phing/phing": "3.0.1", + "php-parallel-lint/php-parallel-lint": "1.4.0", + "phpstan/phpstan": "2.1.13", + "phpstan/phpstan-deprecation-rules": "2.0.2", + "phpstan/phpstan-phpunit": "2.0.6", + "phpstan/phpstan-strict-rules": "2.0.4", + "phpunit/phpunit": "9.6.8|10.5.45|11.4.4|11.5.17|12.1.3" }, "type": "phpcodesniffer-standard", "extra": { @@ -13019,7 +13414,7 @@ ], "support": { "issues": "https://github.com/slevomat/coding-standard/issues", - "source": "https://github.com/slevomat/coding-standard/tree/8.11.1" + "source": "https://github.com/slevomat/coding-standard/tree/8.18.0" }, "funding": [ { @@ -13031,20 +13426,20 @@ "type": "tidelift" } ], - "time": "2023-04-24T08:19:01+00:00" + "time": "2025-05-01T09:40:50+00:00" }, { "name": "squizlabs/php_codesniffer", - "version": "3.10.3", + "version": "3.13.4", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "62d32998e820bddc40f99f8251958aed187a5c9c" + "reference": "ad545ea9c1b7d270ce0fc9cbfb884161cd706119" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/62d32998e820bddc40f99f8251958aed187a5c9c", - "reference": "62d32998e820bddc40f99f8251958aed187a5c9c", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/ad545ea9c1b7d270ce0fc9cbfb884161cd706119", + "reference": "ad545ea9c1b7d270ce0fc9cbfb884161cd706119", "shasum": "" }, "require": { @@ -13109,9 +13504,13 @@ { "url": "https://opencollective.com/php_codesniffer", "type": "open_collective" + }, + { + "url": "https://thanks.dev/u/gh/phpcsstandards", + "type": "thanks_dev" } ], - "time": "2024-09-18T10:38:58+00:00" + "time": "2025-09-05T05:47:09+00:00" }, { "name": "symfony/browser-kit", @@ -13391,21 +13790,20 @@ }, { "name": "symfony/process", - "version": "v5.4.11", + "version": "v6.4.25", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1" + "reference": "6be2f0c9ab3428587c07bed03aa9e3d1b823c6c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/6e75fe6874cbc7e4773d049616ab450eff537bf1", - "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1", + "url": "https://api.github.com/repos/symfony/process/zipball/6be2f0c9ab3428587c07bed03aa9e3d1b823c6c8", + "reference": "6be2f0c9ab3428587c07bed03aa9e3d1b823c6c8", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1" }, "type": "library", "autoload": { @@ -13433,7 +13831,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.11" + "source": "https://github.com/symfony/process/tree/v6.4.25" }, "funding": [ { @@ -13444,12 +13842,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-06-27T16:58:25+00:00" + "time": "2025-08-14T06:23:17+00:00" }, { "name": "symfony/yaml", @@ -13576,19 +13978,19 @@ "aliases": [], "minimum-stability": "dev", "stability-flags": { + "roave/security-advisories": 20, "skaut/dependent-select-box": 20, - "skaut/psr6-caching": 20, - "roave/security-advisories": 20 + "skaut/psr6-caching": 20 }, "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": ">= 8.1", + "php": ">= 8.2", "ext-iconv": "*", "ext-simplexml": "*" }, "platform-dev": { "ext-pdo": "*" }, - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.6.0" } diff --git a/deploy.php b/deploy.php new file mode 100644 index 000000000..3814ccc7e --- /dev/null +++ b/deploy.php @@ -0,0 +1,176 @@ + get('build_hash')); +set('web_root_symlink', '{{deploy_path}}/www'); + +// === SSH === +set('ssh_multiplexing', false); +//set('bin/ssh', 'ssh -o IdentitiesOnly=yes -o PreferredAuthentications=publickey -o PubkeyAuthentication=yes -o StrictHostKeyChecking=yes -o UserKnownHostsFile=/root/.ssh/known_hosts'); + +// === Shared / writable dirs === +set('shared_dirs', []); + +// === Rsync === +set('rsync_src', __DIR__ . '/'); +set('rsync_dest', '{{release_path}}'); +set('rsync', static function () { + $stage = currentHost()->get('stage'); + + return [ + // běžné exclude vzory – BEZ "./" + 'exclude' => [ + '.git', + '.github', + '.idea', + '.docs', + '/tests/', + '/temp/', + 'node_modules/', + 'code-quality/', + 'workdir.tar.gz', + '/log/', + '/uploads/', + ], + + // řešení priority: nejdřív explicitně povol konkrétní soubor, pak zakaž wildcard + 'filter' => [ + '+ app/config/config.' . $stage . '.local.neon', + '- app/config/config.*.local.neon', + ], + + // ostatní volby + 'exclude-file' => false, + 'include' => [], + 'include-file' => false, + 'filter-file' => false, + 'filter-perdir' => false, + 'flags' => 'rz', + 'options' => ['delete'], + 'timeout' => 180, + ]; +}); + + + +task('build:config', function () { + $env = getenv('ENVIRONMENT') ?: 'local'; + $src = sprintf('app/config/config.%s.local.neon', $env); + $dest = 'app/config/config.local.neon'; + + if (!file_exists($src)) { + throw new \RuntimeException("Missing template: $src"); + } + + $content = file_get_contents($src); + + // nahrazení tokenů __TOKEN__ + $replacements = [ + '__CONFIG_DATABASE_PASSWORD__' => getenv('CONFIG_DATABASE_PASSWORD') ?: '', + '__CONFIG_SENTRY_DSN__' => getenv('CONFIG_SENTRY_DSN') ?: '', + '__CONFIG_APPLICATION_ID__' => getenv('CONFIG_APPLICATION_ID') ?: '', + ]; + $content = strtr($content, $replacements); + + file_put_contents($dest, $content); + + writeln("Config generated → $dest"); +})->desc('Generate local config.local.neon'); + + +// --- úkol: vytvoř kořenové sdílené složky a symlinky v release --- +desc('Symlink root-level shared folders (log, uploads) into the release and update /www'); +task('custom:shared_symlinks', function () { + // zajisti existenci kořenových složek + run('mkdir -p {{deploy_path}}/log {{deploy_path}}/uploads'); + + // ukliď v release, ať ln nepadá, a vytvoř symlinky jako ve skriptu + run('rm -rf {{release_path}}/log {{release_path}}/uploads'); + run('ln -s {{deploy_path}}/log {{release_path}}/log || true'); + run('ln -s {{deploy_path}}/uploads {{release_path}}/uploads || true'); + + // symlink web rootu mimo releases (idempotentně, přepíše existující) + run('ln -sfn {{release_path}}/www {{web_root_symlink}}'); +}); + + +// === Helper pro definici hostů z env === +function addEnvHost(string $name, array $defaults): void { + $prefix = strtoupper($name); + + $hostname = getenv("HOST") ?: $defaults['host']; + $user = getenv("SSH_USERNAME") ?: $defaults['user']; + $port = (int) getenv("PORT") ?: $defaults['port']; + $deployPath = getenv("ROOT_DIR") ?: $defaults['path']; + + host($name) + ->setSshArguments(['-o UserKnownHostsFile=/dev/null', '-o StrictHostKeyChecking=no']) + ->setHostname($hostname) + ->set('remote_user', $user) + ->setPort($port) + ->set('deploy_path', $deployPath) + ->set('bin/php', '/usr/bin/php8.3'); +} + +// === Definice prostředí === +$defaults = [ + 'host' => 'www.skauting.cz', + 'user' => 'vu011961', + 'port' => 11961, + 'path' => '/home/vu011961', +]; + +addEnvHost('beta', $defaults); +addEnvHost('test', $defaults); +addEnvHost('production', $defaults); + +// === App příkazy === +desc('Generate Doctrine proxies (remote)'); +task('app:proxies', function () { + run('cd {{release_path}} && {{bin/php}} bin/console orm:generate-proxies'); +}); + +desc('Run DB migrations (remote)'); +task('app:migrate', function () { + run('cd {{release_path}} && {{bin/php}} bin/console migrations:migrate --no-interaction'); +}); + +desc('Run DB migrations (remote)'); +task('deploy:ssh_warmup', function () { + $h = currentHost()->connectionString(); + runLocally("ssh -p 28 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no $h echo"); +}); + + + + +// === Deploy pipeline === +desc('Deploy via tar'); +task('deploy', [ + // 'deploy:ssh_warmup', + 'deploy:info', + 'deploy:setup', + 'build:config', + 'deploy:lock', + 'deploy:release', + 'rsync', + 'custom:shared_symlinks', + 'app:proxies', + //'app:migrate', + 'deploy:publish' +]); + +after('deploy:failed', 'deploy:unlock'); diff --git a/docker/containers/adminer/plugins/dark-switcher.php b/docker/containers/adminer/plugins/dark-switcher.php new file mode 100644 index 000000000..c886c6ad5 --- /dev/null +++ b/docker/containers/adminer/plugins/dark-switcher.php @@ -0,0 +1,57 @@ + + + ☀" + .Adminer\script("adminerDarkSet(); qsl('big').onclick = adminerDarkSwitch;")."\n" + ; + } + + public function screenshot() + { + return 'https://www.adminer.org/static/plugins/dark-switcher.gif'; + } + + protected $translations = [ + 'cs' => ['' => 'Dovoluje přepínání světlého a tmavého vzhledu'], + 'de' => ['' => 'Umschalten zwischen hellem und dunklem Design erlauben'], + 'ja' => ['' => 'ダークモードへの切替え'], + 'pl' => ['' => 'Zezwalaj na przełączanie trybu jasnego i ciemnego'], + ]; +} diff --git a/docker/containers/adminer/plugins/import-directory.php b/docker/containers/adminer/plugins/import-directory.php index f57b90913..146ef578e 100644 --- a/docker/containers/adminer/plugins/import-directory.php +++ b/docker/containers/adminer/plugins/import-directory.php @@ -1,13 +1,14 @@ username = getenv('ADMINER_USERNAME') ?: null; $this->password = getenv('ADMINER_PASSWORD') ?: ''; } - /** @return array */ - public function credentials(): array + /** + * @return array + */ + public function credentials() { - $inputUsername = $_GET['username']; + $server = $_GET['server'] ?? 'localhost'; + $inputUsername = $_GET['username'] ?? ''; if ($this->isPasswordlessUser($inputUsername)) { - return [SERVER, $inputUsername, $this->password]; + return [$server, $inputUsername, $this->password]; } - return [SERVER, $inputUsername, get_password()]; + $inputPassword = $_GET['password'] ?? ''; + + return [$server, $inputUsername, $inputPassword]; } - public function login(string $username, string $password): bool + /** + * @param string $username + * @param string $password + * @return bool + */ + public function login($username, $password) { if ($this->isPasswordlessUser($username)) { return true; diff --git a/docker/containers/adminer/plugins/readable-dates.php b/docker/containers/adminer/plugins/readable-dates.php index ca1656caa..abfda7c09 100644 --- a/docker/containers/adminer/plugins/readable-dates.php +++ b/docker/containers/adminer/plugins/readable-dates.php @@ -1,11 +1,12 @@ prepend); + echo Adminer\script($this->prepend); } } diff --git a/docker/containers/deploy/Dockerfile b/docker/containers/deploy/Dockerfile new file mode 100644 index 000000000..c3abefd0e --- /dev/null +++ b/docker/containers/deploy/Dockerfile @@ -0,0 +1,7 @@ +FROM php:8.2-cli +RUN apt-get update && apt-get install -y --no-install-recommends \ + ca-certificates curl git openssh-client rsync tar gzip \ + && rm -rf /var/lib/apt/lists/* +# optional: přidat dep do image +RUN curl -fsSL https://deployer.org/releases/v7.5.12/deployer.phar -o /usr/local/bin/dep \ + && chmod +x /usr/local/bin/dep \ No newline at end of file diff --git a/docker/containers/php/Dockerfile b/docker/containers/php/Dockerfile index e24e2b064..7f243e638 100644 --- a/docker/containers/php/Dockerfile +++ b/docker/containers/php/Dockerfile @@ -1,4 +1,4 @@ -FROM thecodingmachine/php:8.1-v4-fpm-node20 +FROM thecodingmachine/php:8.2-v4-fpm-node20 USER root USER docker diff --git a/docker/containers/php/docker.conf b/docker/containers/php/docker.conf new file mode 100644 index 000000000..21fc1e762 --- /dev/null +++ b/docker/containers/php/docker.conf @@ -0,0 +1,19 @@ +[global] +daemonize = no +error_log = /proc/self/fd/2 + +[docker] +user = docker +group = docker +listen = 9000 + +access.log = /proc/self/fd/2 +catch_workers_output = yes +decorate_workers_output = no + +pm = dynamic +pm.max_children = 20 +pm.start_servers = 2 +pm.min_spare_servers = 2 +pm.max_spare_servers = 5 +clear_env = no \ No newline at end of file diff --git a/docker/docker-compose.ci.yml b/docker/docker-compose.ci.yml new file mode 100644 index 000000000..113747188 --- /dev/null +++ b/docker/docker-compose.ci.yml @@ -0,0 +1,9 @@ +services: + php: + container_name: "${COMPOSE_PROJECT_NAME}-app" + mysql-test: + container_name: "${COMPOSE_PROJECT_NAME}-mysql-test" + selenium: + container_name: "${COMPOSE_PROJECT_NAME}-selenium" + nginx: + container_name: "${COMPOSE_PROJECT_NAME}-nginx" diff --git a/docker/docker-compose.local.yml b/docker/docker-compose.local.yml new file mode 100644 index 000000000..a91dfdfb9 --- /dev/null +++ b/docker/docker-compose.local.yml @@ -0,0 +1,11 @@ +services: + php: + container_name: hskauting.app #Backward Compatibility + php-test: + container_name: hskauting.app-test + mysql: + container_name: hskauting.mysql #Backward Compatibility + mysql-test: + container_name: hskauting.mysql-test #Backward Compatibility + selenium: + container_name: hskauting.chrome \ No newline at end of file diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 2f2c75ddb..1bcfc1ebe 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -18,8 +18,9 @@ x-php-base: - traefik volumes: - ../:/app - - ./containers/php/ini/php.ini:/etc/php/8.1/fpm/conf.d/php.ini - - ./containers/php/ini/php.ini:/etc/php/8.1/cli/conf.d/php.ini + - ./containers/php/ini/php.ini:/etc/php/8.2/fpm/conf.d/php.ini + - ./containers/php/ini/php.ini:/etc/php/8.2/cli/conf.d/php.ini +# - ./containers/php/docker.conf:/etc/php/8.2/fpm/pool.d/docker.conf x-mysql-base: &mysql-base @@ -53,7 +54,6 @@ services: php: <<: *php-base - container_name: hskauting.app #Backward Compatibility env_file: - containers/php/ini/image.ini - ./../.env.local @@ -76,7 +76,6 @@ services: php-test: <<: *php-base hostname: php-test.localhost - container_name: hskauting.app-test depends_on: - mysql-test env_file: @@ -105,7 +104,6 @@ services: mysql: <<: *mysql-base - container_name: hskauting.mysql #Backward Compatibility ports: - "3306:3306" hostname: mysql.localhost @@ -114,7 +112,6 @@ services: - ./containers/mysql/my.cnf:/etc/mysql/conf.d/my.cnf mysql-test: - container_name: hskauting.mysql-test #Backward Compatibility <<: *mysql-base hostname: mysql-test.localhost volumes: @@ -122,7 +119,6 @@ services: - ./containers/mysql-test/my.cnf:/etc/mysql/conf.d/my.cnf selenium: - container_name: hskauting.chrome hostname: selenium.localhost image: selenium/standalone-chrome shm_size: 2g @@ -130,6 +126,13 @@ services: SE_VNC_NO_PASSWORD: 1 SCREEN_WIDTH: 1920 SCREEN_HEIGHT: 1080 + depends_on: + php-test: + condition: service_started + nginx: + condition: service_started + mysql-test: + condition: service_started networks: - traefik labels: @@ -139,11 +142,12 @@ services: traefik.http.services.selenium.loadbalancer.server.port: 7900 adminer: - image: adminer:4.8.1 + image: adminer:5.4.0 volumes: - ./containers/adminer/plugins/import-directory.php:/var/www/html/plugins/import-directory.php - ./containers/adminer/plugins/login-password-less.php:/var/www/html/plugins/login-password-less.php - ./containers/adminer/plugins/readable-dates.php:/var/www/html/plugins/readable-dates.php + - ./containers/adminer/plugins/readable-dates.php:/var/www/html/plugins/dark-switcher.php - ./containers/adminer/import:/var/www/html/import environment: ADMINER_PLUGINS: import-directory readable-dates diff --git a/frontend/app.scss b/frontend/app.scss index df7842d7c..d53cb1401 100644 --- a/frontend/app.scss +++ b/frontend/app.scss @@ -2,6 +2,9 @@ @import "scss/pikaday"; @import "~nprogress/nprogress"; @import "scss/modals"; +@import "scss/landing"; +@import "scss/dashboard"; +@import "scss/fonts"; .btn-light { @include button-variant($light, darken($light, 30%)); @@ -58,6 +61,9 @@ table.table a:hover { border-bottom: 2px solid $primary; } } + .nav-item a i { + margin-right: 0.5rem; + } } .bg-posily { @@ -88,6 +94,11 @@ table.table a:hover { background-color: #000000; } +.visually-disabled { + opacity: 0.65; + cursor: not-allowed; +} + :root[data-bs-theme="dark"] { .bg-posily { --bs-bg-opacity: 0.2; diff --git a/frontend/app.ts b/frontend/app.ts index cc81b9cf8..afd4337c0 100644 --- a/frontend/app.ts +++ b/frontend/app.ts @@ -7,6 +7,8 @@ import './ts/checkAll'; import initializeAjax from './ts/ajax'; import './app.scss'; +import { HelpPanelModule } from './modules/HelpPanelModule'; + // Use czech language for dates moment.locale('cs'); @@ -15,5 +17,11 @@ document.addEventListener('DOMContentLoaded', () => { new DarkModeToggle('darkModeToggle'); new LogoutTimer('timer', 'timer-minutes'); dom.watch(); -}); + // Naše nová inicializace + if (document.getElementById('toggleHelpButton')) { + // Pokud tlačítko existuje, modul se inicializuje. + const helpPanel = new HelpPanelModule(); + helpPanel.initialize(); + } +}); \ No newline at end of file diff --git a/frontend/icons.ts b/frontend/icons.ts index 7813532e8..bea40a2a1 100644 --- a/frontend/icons.ts +++ b/frontend/icons.ts @@ -63,6 +63,17 @@ library.add( fas.faThList, fas.faEllipsisV, fas.faUserGraduate, + fas.faPaperPlane, + fas.faPenRuler, + fas.faBell, + fas.faTrashCan, + fas.faBoxArchive, + fas.faFileInvoiceDollar, + fas.faCalendarCheck, + fas.faGraduationCap, + fas.faRoad, + fas.faPeopleGroup, + fas.faCoins, // Regular icons far.faCalendar, @@ -84,6 +95,10 @@ library.add( far.faUser, far.faQuestionCircle, far.faArrowAltCircleLeft, + far.faComment, + far.faPaperPlane, + far.faBell, + far.faMoneyBill1, // Brands fab.faGithub, diff --git a/frontend/modules/HelpPanelModule.ts b/frontend/modules/HelpPanelModule.ts new file mode 100644 index 000000000..410989eaa --- /dev/null +++ b/frontend/modules/HelpPanelModule.ts @@ -0,0 +1,54 @@ +export class HelpPanelModule { + // Privátní vlastnosti pro uložení referencí na DOM prvky. + // Budou nastaveny v konstruktoru. + private readonly toggleHelpButton: HTMLButtonElement | null; + private readonly leftPanel: HTMLDivElement | null; + private readonly rightPanel: HTMLDivElement | null; + + /** + * Konstruktor vyhledá všechny potřebné prvky na stránce a uloží si je. + */ + constructor() { + this.toggleHelpButton = document.getElementById('toggleHelpButton') as HTMLButtonElement; + this.leftPanel = document.getElementById('leftPanel') as HTMLDivElement; + this.rightPanel = document.getElementById('rightPanel') as HTMLDivElement; + } + + /** + * Inicializuje funkcionalitu modulu. + * Zkontroluje, zda byly všechny prvky nalezeny, a připojí event listener. + */ + public initialize(): void { + // Bezpečnostní kontrola, zda všechny prvky existují. + if (!this.toggleHelpButton || !this.leftPanel || !this.rightPanel) { + console.error('HelpPanelModule: Nepodařilo se najít všechny potřebné prvky (toggleHelpButton, leftPanel, rightPanel).'); + return; + } + + // Přidá posluchač události na kliknutí, který volá naši privátní metodu. + // Použití arrow funkce `() => ...` zajistí správný kontext `this`. + this.toggleHelpButton.addEventListener('click', () => this.toggleVisibility()); + } + + /** + * Privátní metoda, která se stará o samotnou logiku skrytí/zobrazení panelů. + */ + private toggleVisibility(): void { + // Tato kontrola je zde pro typovou jistotu TypeScriptu, aby věděl, + // že v této metodě nepracujeme s `null` hodnotami. + if (!this.rightPanel || !this.leftPanel || !this.toggleHelpButton) { + return; + } + + // Přepne viditelnost pravého panelu. + this.rightPanel.classList.toggle('d-none'); + + // Přepne šířku levého panelu. + this.leftPanel.classList.toggle('col-sm-6'); + this.leftPanel.classList.toggle('col-sm-12'); + + // Aktualizuje text na tlačítku. + const isHidden = this.rightPanel.classList.contains('d-none'); + this.toggleHelpButton.textContent = isHidden ? 'Zobrazit nápovědu' : 'Skrýt nápovědu'; + } +} \ No newline at end of file diff --git a/frontend/scss/dashboard.scss b/frontend/scss/dashboard.scss new file mode 100644 index 000000000..6c14a673d --- /dev/null +++ b/frontend/scss/dashboard.scss @@ -0,0 +1,183 @@ +/* Základ + odsazení od fixního headeru */ +.dashboard { + --tile-radius: 16px; + --tile-gap: 20px; + --tile-pad: 16px; + --tile-icon-size: 28px; + --top-gap: clamp(16px, 3vw, 40px); + + background: #f9f6ef; + color: #2d4739; + font-family: Arial, sans-serif; + padding-top: calc(var(--header-h, 0px) + var(--top-gap)); + padding-bottom: 80px; +} + +/* GRID */ +.dashboard .tiles { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(333px, 1fr)); + gap: var(--tile-gap); + padding: 20px 0 40px; +} + +/* TILE */ +.dashboard .tile { + background: #fff; + color: inherit; + text-decoration: none; + border-radius: var(--tile-radius); + box-shadow: 0 15px 35px rgba(229, 213, 174, .3); + padding: var(--tile-pad) calc(var(--tile-pad) + 4px); + transition: transform .15s ease, box-shadow .2s ease, background-color .2s ease; + border: 1px solid rgba(0,0,0,.04); + min-height: 160px; +} +.dashboard .tile:hover { + transform: translateY(-3px); + box-shadow: 0 20px 40px rgba(229, 213, 174, .36); +} + +/* HLAVIČKA DLAŽDICE */ +.dashboard .tile-head { display: block; margin-bottom: 8px; } + + +.dashboard .tile-link { + display: flex; + align-items: center; + gap: 10px; + color: inherit; + text-decoration: none; + outline: none; + border-radius: 6px; +} +.dashboard .tile-link:hover .tile-title { text-decoration: underline; } +.dashboard .tile-link:focus-visible { + outline: 2px solid #2d4739; + outline-offset: 2px; +} + +.dashboard .tile:has(.tile-link:focus-visible) { + transform: translateY(-3px); + box-shadow: 0 20px 40px rgba(229, 213, 174, .36); +} + +/* Ikona a nadpis */ +.dashboard .tile-icon { + font-size: var(--tile-icon-size); + line-height: 1; + width: 1em; + height: 1em; + flex: 0 0 auto; +} +.dashboard .tile-title { + font-size: 1.15rem; + margin: 0; + color: #2d4739; + font-family: skautbold, sans-serif; +} + +/* OBSAH */ +.dashboard .tile-body { font-size: .95rem; color: #4e5e51; } +.dashboard .tile-body ul { margin: .25rem 0 0; padding-left: 1rem; } +.dashboard .tile-body li { margin: .1rem 0; } +.dashboard .tile-body .btn { margin-top: .5rem; } + +/* RESPONSIVE */ +@media (max-width: 420px) { + .dashboard .tile { padding: 18px; min-height: 150px; } + .dashboard .tile-title { font-size: 1.1rem; } + .dashboard .tile-icon { font-size: 26px; } +} + +/* ===== Nástěnka – hlavička sekce a akce ===== */ +.dashboard .section-head { + display: flex; + align-items: baseline; + justify-content: space-between; + gap: 12px; + margin: 0 0 10px; +} +.dashboard .section-title { + font-family: skautbold, sans-serif; + font-size: 2.15rem; + line-height: 1.2; + margin: 0; + color: #2d4739; +} +.section-actions { + display: inline-flex; + align-items: center; + gap: 8px; + vertical-align: middle; +} + +/* ===== Párovací ovládací prvky ===== */ + + +.btn.btn-surface{ + --bs-btn-color: var(--bs-secondary); + --bs-btn-bg: transparent; + --bs-btn-border-color: var(--bs-secondary); + + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: var(--bs-secondary); + --bs-btn-hover-border-color: var(--bs-secondary); + + --bs-btn-focus-shadow-rgb: var(--bs-secondary-rgb); + + --bs-btn-active-color: #fff; + --bs-btn-active-bg: var(--bs-secondary); + --bs-btn-active-border-color: var(--bs-secondary); + + --bs-btn-disabled-color: var(--bs-secondary); + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: var(--bs-secondary); + + border-width: 1px; + box-shadow: 0 6px 16px rgba(229,213,174,.25); +} +.btn.btn-surface:hover, +.btn.btn-surface:focus-visible{ + box-shadow: 0 8px 22px rgba(229,213,174,.32); +} + +/* Dropdown menu pro párování */ +.dropdown-menu.pairForm{ + border: 1px solid var(--bs-border-color, rgba(0,0,0,.1)); + border-radius: 12px; +} +.pairForm .input-group-text{ + background: #f9f6ef; + border-color: rgba(0,0,0,.08); +} + + +.shadow-tile { box-shadow: 0 15px 35px rgba(229,213,174,.30); } + +/* ===== Dark mode ===== */ +:root[data-bs-theme="dark"] .dashboard { + background: var(--bs-body-bg); + color: var(--bs-body-color); +} +:root[data-bs-theme="dark"] .dashboard .tile { + background: var(--bs-body-bg); + border: 1px solid var(--bs-border-color); + box-shadow: none; +} +:root[data-bs-theme="dark"] .dashboard .tile-title, +:root[data-bs-theme="dark"] .dashboard .section-title { + color: var(--bs-emphasis-color); +} +:root[data-bs-theme="dark"] .dashboard .tile-body { + color: var(--bs-secondary-color); +} +:root[data-bs-theme="dark"] .dashboard .tile:hover { + transform: translateY(-3px); + background: color-mix(in oklab, var(--bs-body-bg) 92%, var(--bs-emphasis-color)); +} +:root[data-bs-theme="dark"] .btn.btn-surface{ box-shadow: none; } +:root[data-bs-theme="dark"] .dropdown-menu.pairForm{ + background: var(--bs-body-bg); + border: 1px solid var(--bs-border-color); +} diff --git a/frontend/scss/fonts.scss b/frontend/scss/fonts.scss new file mode 100644 index 000000000..39db72ee4 --- /dev/null +++ b/frontend/scss/fonts.scss @@ -0,0 +1,22 @@ +$font-cdn: 'https://cdn.skauting.cz/fonts'; + +@mixin font-face($family, $file, $weight, $style: normal, $svg-id: null) { + @font-face { + font-family: quote($family); + src: url('#{$font-cdn}/#{$file}.eot'); + src: url('#{$font-cdn}/#{$file}.eot?#iefix') format('embedded-opentype'), + url('#{$font-cdn}/#{$file}.woff2') format('woff2'), + url('#{$font-cdn}/#{$file}.woff') format('woff'), + url('#{$font-cdn}/#{$file}.otf') format('opentype'), + url('#{$font-cdn}/#{$file}.svg##{if($svg-id, $svg-id, $family)}') format('svg'); + font-weight: $weight; + font-style: $style; + } +} + +@include font-face('themix', 'TheMix_LT_400', 400, normal, 'themix'); +@include font-face('themix', 'TheMix_LT_400i', 400, italic, 'themix'); +@include font-face('themix', 'TheMix_LT_700', 700, normal, 'themix'); +@include font-face('themix', 'TheMix_LT_700i', 700, italic, 'themix'); + +@include font-face('skautbold', 'skaut-bold-webfont', normal, normal, 'skautbold'); diff --git a/frontend/scss/landing.scss b/frontend/scss/landing.scss new file mode 100644 index 000000000..3c5cdb29a --- /dev/null +++ b/frontend/scss/landing.scss @@ -0,0 +1,294 @@ +/* scss/landing.scss */ +.landing { + padding-bottom: 80px; + background: #f9f6ef; + color: #2d4739; + font-family: Arial, sans-serif; + --icon-size: 64px; + + img { + max-width: 100%; + height: auto; + display: block; + } + + .intro { + max-width: 1000px; + padding: 50px 20px 20px; + display: flex; + flex-direction: column; + text-align: center; + margin: 0 auto 30px; + gap: 16px; + + @media (min-width: 768px) { + flex-direction: row; + gap: 32px; + align-items: center; + } + } + + .intro-left, + .intro-right { + @media (min-width: 768px) { width: 50%; } + } + + .intro-left { + margin: auto 0; + position: relative; + z-index: 1; + } + + .intro-right { + position: relative; + z-index: 0; + + img { + width: 100%; + height: auto; + max-width: 420px; + max-height: 40vh; + object-fit: contain; + display: block; + margin: 0 auto; + } + } + + h1 { + text-align: center; + font-size: 2.2rem; + color: #2d4739; + line-height: 1.2; + text-transform: uppercase; + font-family: skautbold, sans-serif; + + @media (min-width: 768px) { font-size: 3rem; text-align: left; } + @media (min-width: 1000px) { font-size: 4rem; } + } + + .intro-left p { + text-align: center; + font-size: 1.6rem; + color: #4e5e51; + + @media (min-width: 768px) { text-align: left; } + } + + .intro-buttons { + max-width: 1000px; + padding: 20px 0; + display: flex; + flex-direction: column; + gap: 20px; + margin: 20px 0; + + @media (min-width: 768px) { flex-direction: row; } + } + + .features { + max-width: 1100px; + margin: 0 20px; + padding: 10px; + display: flex; + flex-wrap: wrap; + flex-direction: column; + gap: 20px; + background: #fff; + border-radius: 20px; + transform: translateY(-50px); + box-shadow: 0 15px 35px 0 rgba(229, 213, 174, .3) !important; + align-content: center; + + @media (min-width: 768px) { justify-content: space-around; flex-direction: unset; } + @media (min-width: 1150px) { margin: 0 auto; } + } + + .features-item { + padding: 10px; + display: flex; + flex-direction: row; + gap: 20px; + text-align: center; + align-items: center; + @media (min-width: 768px) { flex: 1 1 250px; flex-direction: unset; } + } + + .features-item-left { + margin: auto 0; + width: var(--icon-size); + height: var(--icon-size); + min-width: var(--icon-size); + min-height: var(--icon-size); + flex: 0 0 var(--icon-size); + display: grid; + place-items: center; + + img { + width: 100%; + height: 100%; + object-fit: contain; + display: block; + } + } + + .features-item h3 { + font-size: 1.2rem; + margin-bottom: 10px; + } + + .features-item-right { + text-align: left; + + p { margin: 0; } + } + + .services { + padding: 20px; + background: #e5d5ae; + border-radius: 20px; + max-width: 1100px; + box-shadow: 0 15px 35px 0 rgba(229, 213, 174, .3) !important; + + + margin: 50px 20px; + display: flex; + flex-direction: column; + flex-wrap: wrap; + gap: 40px 20px; + + align-content: center; + + @media (min-width: 768px) { justify-content: space-around; flex-direction: unset; } + @media (min-width: 1150px) { margin: 0 auto; } + } + + .services-item { + text-align: center; + display: flex; + flex-direction: row; + gap: 20px; + align-items: center; + + @media (min-width: 768px) { flex: 1 1 45%; flex-direction: unset; } + } + + .services-item-left { + width: var(--icon-size); + height: var(--icon-size); + min-width: var(--icon-size); + min-height: var(--icon-size); + flex: 0 0 var(--icon-size); + display: grid; + place-items: center; + + img { + width: 100%; + height: 100%; + object-fit: contain; + display: block; + } + } + + .services-item-right { + margin: auto 0; + + h3 { + text-align: left; + font-size: 1.2rem; + margin: 0 0 10px; + color: #2d4739; + } + + p { margin: 0; text-align: left; } + } + + .about { + max-width: 1000px; + margin: auto; + padding: 50px 20px; + + h2 { font-size: 2.5rem; } + } + + .about-button { display: flex; } + + .btn-landing { + display: inline-block; + background-color: #e5d5ae; + color: #2d4739; + padding: 12px 24px; + border: none; + cursor: pointer; + font-size: 1.1rem; + font-weight: 700; + border-radius: 6px; + text-decoration: none; + line-height: 1.5; + box-shadow: 0 15px 35px 0 rgba(229, 213, 174, .3) !important; + transition: background-color .3s, transform .5s ease; + + &:hover { + background-color: #d1c09b; + transform: translateY(-3px); + text-decoration: none; + } + } + + + @media (max-width: 767.98px) { + .features { transform: none; margin-top: 10px; } + } +} + + +@media (max-width: 360px) { + .landing { --icon-size: 56px; } +} + +/* Dark mode pro landing (izolovaně) */ +:root[data-bs-theme="dark"] .landing { + + background: var(--bs-body-bg); + color: var(--bs-body-color); + + h1 { + color: var(--bs-emphasis-color); + } + + .intro-left p { + color: var(--bs-secondary-color); + } + + /* boxy */ + .features { + background: var(--bs-body-bg); + border: 1px solid var(--bs-border-color); + box-shadow: none; + } + + .services { + background: var(--bs-body-bg); + border: 1px solid var(--bs-border-color); + box-shadow: none; + } + + .services-item-right h3 { + color: var(--bs-emphasis-color); + } + + a { + color: var(--bs-link-color); + &:hover { color: var(--bs-link-hover-color); } + } + + .btn-landing { + background-color: var(--bs-warning-bg-subtle); + color: var(--bs-body-color); + box-shadow: none; + + &:hover { + background-color: color-mix(in oklab, var(--bs-warning-bg-subtle) 85%, var(--bs-body-bg)); + transform: translateY(-3px); + } + } +} diff --git a/frontend/ts/DataGridExtension.ts b/frontend/ts/DataGridExtension.ts index ae8aee069..760a2c367 100644 --- a/frontend/ts/DataGridExtension.ts +++ b/frontend/ts/DataGridExtension.ts @@ -1,8 +1,18 @@ import najaInstance, {InteractionEvent} from 'naja'; export class DataGridExtension { + + private static groupHandlersBound = false; + public constructor(naja: typeof najaInstance) { naja.addEventListener('interaction', DataGridExtension.enableSortHistory); + if (!DataGridExtension.groupHandlersBound) { + DataGridExtension.groupHandlersBound = true; + document.addEventListener('change', DataGridExtension.onChange, true); + document.addEventListener('click', DataGridExtension.onShiftClick, true); // volitelné: shift-range + } + + } private static enableSortHistory(event: InteractionEvent): void { @@ -12,5 +22,77 @@ export class DataGridExtension { (event.options as any).history = true; } } + + // === Datagrid group actions === + private static onChange(e: Event): void { + const t = e.target as HTMLElement | null; + if (!t) return; + + // 1) řádkový checkbox → přepnout tlačítka/select + spočítat + const gridKey = t.getAttribute('data-check'); + if (gridKey) { + const checked = document.querySelectorAll(`input[data-check-all-${gridKey}]:checked`); + const select = document.querySelector(`.datagrid-${gridKey} select[name="group_action[group_action]"]`); + const buttons = document.querySelectorAll(`.datagrid-${gridKey} .row-group-actions *[type="submit"]`); + const counter = document.querySelector(`.datagrid-${gridKey} .datagrid-selected-rows-count`); + + const any = checked.length > 0; + buttons.forEach(b => { b.disabled = !any; }); + if (select) { + select.disabled = !any; + if (!any) select.value = ''; + } + if (counter) { + const total = document.querySelectorAll(`input[data-check-all-${gridKey}]`).length; + counter.innerHTML = any ? `${checked.length}/${total}` : ''; + } + + if (select) select.dispatchEvent(new Event('change', { bubbles: true })); + } + + // 2) master checkbox → (od)škrtnout všechny + vyvolat jejich change + const masterKey = t.getAttribute('data-check-all'); + if (masterKey && (t as HTMLInputElement).type === 'checkbox') { + const checked = (t as HTMLInputElement).checked; + const inputs = document.querySelectorAll(`input[type=checkbox][data-check-all-${masterKey}]`); + inputs.forEach(input => { + input.checked = checked; + input.dispatchEvent(new Event('change', { bubbles: true })); + }); + } + } + + // Volitelné: SHIFT výběr rozsahu mezi dvěma kliky + private static lastCheckboxCell: HTMLElement | null = null; + private static onShiftClick(e: MouseEvent): void { + const path = (e.composedPath?.() as HTMLElement[]) ?? []; + const cell = path.find((el: any) => el?.classList?.contains('col-checkbox')) as HTMLElement | undefined; + if (!cell) return; + + if (DataGridExtension.lastCheckboxCell && e.shiftKey) { + const currentRow = cell.closest('tr'); + const lastRow = DataGridExtension.lastCheckboxCell.closest('tr'); + const tbody = lastRow?.closest('tbody'); + if (!currentRow || !lastRow || !tbody) { + DataGridExtension.lastCheckboxCell = cell; + return; + } + + const rows = Array.from(tbody.querySelectorAll('tr')); + const i1 = rows.indexOf(lastRow); + const i2 = rows.indexOf(currentRow); + if (i1 >= 0 && i2 >= 0) { + const [from, to] = i1 < i2 ? [i1, i2] : [i2 + 1, i1]; + rows.slice(from, to).forEach(r => { + const cb = r.querySelector('.col-checkbox input[type=checkbox]'); + if (cb && !cb.checked) { + cb.checked = true; + cb.dispatchEvent(new Event('change', { bubbles: true })); + } + }); + } + } + DataGridExtension.lastCheckboxCell = cell; + } } diff --git a/migrations/2017/Version20170311191048.php b/migrations/2017/Version20170311191048.php deleted file mode 100644 index f199ad651..000000000 --- a/migrations/2017/Version20170311191048.php +++ /dev/null @@ -1,21 +0,0 @@ -addSql('ALTER TABLE `pa_group` ADD `nextVs` int(4) unsigned NULL AFTER `ks`;'); - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE `pa_group` DROP `nextVs`;'); - } -} diff --git a/migrations/2017/Version20170410220106.php b/migrations/2017/Version20170410220106.php deleted file mode 100644 index 121321fc3..000000000 --- a/migrations/2017/Version20170410220106.php +++ /dev/null @@ -1,21 +0,0 @@ -addSql("UPDATE `pa_payment` SET `note` = '' WHERE `note` IS NULL"); - $this->addSql("ALTER TABLE `pa_payment` CHANGE `note` `note` VARCHAR(64) NOT NULL DEFAULT ''"); - } - - public function down(Schema $schema): void - { - } -} diff --git a/migrations/2017/Version20170424092204.php b/migrations/2017/Version20170424092204.php deleted file mode 100644 index b84710c09..000000000 --- a/migrations/2017/Version20170424092204.php +++ /dev/null @@ -1,22 +0,0 @@ -addSql('DELETE FROM tc_commands WHERE deleted = 1'); - $this->addSql('ALTER TABLE tc_commands DROP deleted'); - } - - public function down(Schema $schema): void - { - $this->addSql("ALTER TABLE tc_commands ADD deleted TINYINT(1) DEFAULT '0' NOT NULL"); - } -} diff --git a/migrations/2017/Version20170427210154.php b/migrations/2017/Version20170427210154.php deleted file mode 100644 index 63a138bfd..000000000 --- a/migrations/2017/Version20170427210154.php +++ /dev/null @@ -1,22 +0,0 @@ -addSql('ALTER TABLE pa_group ADD email_template_subject VARCHAR(255) NOT NULL, CHANGE email_info email_template_body LONGTEXT NOT NULL, DROP email_demand'); - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE pa_group DROP email_template_subject, CHANGE email_template_body email_info TEXT DEFAULT NULL COLLATE utf8_czech_ci, ADD email_demand TEXT DEFAULT NULL COLLATE utf8_czech_ci'); - $this->addSql("UPDATE pa_group SET email_template_subject = 'Informace o platbě'"); - } -} diff --git a/migrations/2017/Version20170430153958.php b/migrations/2017/Version20170430153958.php deleted file mode 100644 index bfad8a4bb..000000000 --- a/migrations/2017/Version20170430153958.php +++ /dev/null @@ -1,22 +0,0 @@ -addSql('ALTER TABLE tc_travels ADD has_fuel TINYINT(1) NOT NULL'); - $this->addSql('UPDATE tc_travels INNER JOIN tc_travelTypes AS types ON tc_travels.type = types.type SET tc_travels.has_fuel = types.hasFuel'); - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE tc_travels DROP has_fuel'); - } -} diff --git a/migrations/2017/Version20170501172634.php b/migrations/2017/Version20170501172634.php deleted file mode 100644 index 124156c90..000000000 --- a/migrations/2017/Version20170501172634.php +++ /dev/null @@ -1,28 +0,0 @@ -addSql('ALTER TABLE tc_commands ADD driver_name VARCHAR(255) NOT NULL, ADD driver_contact VARCHAR(255) NOT NULL, ADD driver_address VARCHAR(255) NOT NULL'); - $this->addSql(' - UPDATE tc_commands - INNER JOIN tc_contracts as contract ON tc_commands.contract_id = contract.id - SET - tc_commands.driver_name = contract.driver_name, - tc_commands.driver_contact = contract.driver_contact, - tc_commands.driver_address = contract.driver_address;'); - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE tc_commands DROP driver_name, DROP driver_contact, DROP driver_address'); - } -} diff --git a/migrations/2017/Version20170522203708.php b/migrations/2017/Version20170522203708.php deleted file mode 100644 index 90baa1694..000000000 --- a/migrations/2017/Version20170522203708.php +++ /dev/null @@ -1,21 +0,0 @@ -addSql("ALTER TABLE `ac_chits` CHANGE `purpose` `purpose` varchar(120) COLLATE 'utf8_czech_ci' NOT NULL AFTER `recipient`"); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - } -} diff --git a/migrations/2017/Version20170528161640.php b/migrations/2017/Version20170528161640.php deleted file mode 100644 index 217d990d9..000000000 --- a/migrations/2017/Version20170528161640.php +++ /dev/null @@ -1,21 +0,0 @@ -addSql("INSERT INTO `ac_chitsCategory` (`id`, `label`, `short`, `type`, `orderby`, `deleted`) VALUES (12, 'Neurčeno', 'np', 1, '101', '0')"); - } - - public function down(Schema $schema): void - { - $this->addSql("DELETE FROM `ac_chitsCategory` WHERE (`id` = '12');"); - } -} diff --git a/migrations/2017/Version20170528182347.php b/migrations/2017/Version20170528182347.php deleted file mode 100644 index f34e859f1..000000000 --- a/migrations/2017/Version20170528182347.php +++ /dev/null @@ -1,25 +0,0 @@ -addSql('ALTER TABLE tc_commands ADD next_travel_id INT NOT NULL'); - $this->addSql(' - UPDATE tc_commands - SET tc_commands.next_travel_id = (SELECT COALESCE (max(tc_travels.id) + 1, 0) FROM tc_travels WHERE command_id = tc_commands.id) - '); - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE tc_commands DROP next_travel_id'); - } -} diff --git a/migrations/2017/Version20170531125856.php b/migrations/2017/Version20170531125856.php deleted file mode 100644 index 6cac677b6..000000000 --- a/migrations/2017/Version20170531125856.php +++ /dev/null @@ -1,25 +0,0 @@ -addSql('ALTER TABLE `tc_command_types` ADD UNIQUE `unique_relationship` (`commandId`, `typeId`)'); - $this->addSql(' - INSERT IGNORE INTO `tc_command_types` (`commandId`, `typeId`) - SELECT `command_id`, `type` FROM `tc_travels`; - '); - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE `tc_command_types` DROP INDEX `unique_relationship`'); - } -} diff --git a/migrations/2017/Version20170602122002.php b/migrations/2017/Version20170602122002.php deleted file mode 100644 index 9da2c9f44..000000000 --- a/migrations/2017/Version20170602122002.php +++ /dev/null @@ -1,25 +0,0 @@ -addSql('ALTER TABLE tc_travels MODIFY id BIGINT UNSIGNED NOT NULL'); - $this->addSql('ALTER TABLE tc_travels DROP PRIMARY KEY'); - $this->addSql('ALTER TABLE tc_travels ADD PRIMARY KEY (id, command_id)'); - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE tc_travels DROP PRIMARY KEY'); - $this->addSql('ALTER TABLE tc_travels CHANGE id id BIGINT UNSIGNED AUTO_INCREMENT NOT NULL'); - $this->addSql('ALTER TABLE tc_travels ADD PRIMARY KEY (id)'); - } -} diff --git a/migrations/2017/Version20170603124748.php b/migrations/2017/Version20170603124748.php deleted file mode 100644 index 814c627a1..000000000 --- a/migrations/2017/Version20170603124748.php +++ /dev/null @@ -1,20 +0,0 @@ -addSql("UPDATE `pa_payment` SET email = NULL WHERE email = ''"); - } - - public function down(Schema $schema): void - { - } -} diff --git a/migrations/2017/Version20170623193150.php b/migrations/2017/Version20170623193150.php deleted file mode 100644 index 69b3e84ce..000000000 --- a/migrations/2017/Version20170623193150.php +++ /dev/null @@ -1,95 +0,0 @@ -addSql('CREATE TABLE pa_bank_account (id INT AUTO_INCREMENT NOT NULL, unit_id INT NOT NULL, name VARCHAR(255) NOT NULL, token VARCHAR(255) DEFAULT NULL, created_at DATETIME NOT NULL COMMENT \'(DC2Type:datetime_immutable)\', allowed_for_subunits TINYINT(1) NOT NULL, number_prefix VARCHAR(6) DEFAULT NULL, number_number VARCHAR(10) NOT NULL, number_bank_code VARCHAR(4) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB'); - $this->addSql('ALTER TABLE pa_group ADD bank_account_id INT DEFAULT NULL'); - $this->addSql('ALTER TABLE pa_group ADD CONSTRAINT fk_bank_account_id FOREIGN KEY (bank_account_id) REFERENCES pa_bank_account(id)'); - } - - public function postUp(Schema $schema): void - { - $bankConfigurations = $this->connection->fetchAll('SELECT * FROM pa_bank'); - - $parser = new Czech(); - $now = (new DateTimeImmutable())->format('Y-m-d H:i:s'); - - if (count($bankConfigurations) > 0) { - foreach ($bankConfigurations as $configuration) { - $unitId = (int) $configuration['unitId']; - $accountNumber = $this->getMainAccount($unitId); - - if ($accountNumber === null || ! $configuration['token']) { - continue; - } - - $number = $parser->parseNumber($accountNumber); - - $this->connection->insert('pa_bank_account', [ - 'unit_id' => $unitId, - 'name' => 'Hlavní', - 'token' => $configuration['token'], - 'created_at' => $now, - 'allowed_for_subunits' => 1, - 'number_prefix' => $number[0], - 'number_number' => $number[1], - 'number_bank_code' => $number[2], - ]); - - $bankAccountId = $this->connection->lastInsertId(); - $this->connection->executeStatement('UPDATE pa_group SET bank_account_id = ' . $bankAccountId . ' WHERE unitId = ' . $unitId); - } - } - - $this->connection->executeStatement('DROP TABLE pa_bank'); - } - - public function down(Schema $schema): void - { - $this->addSql('DROP TABLE pa_bank_account'); - $this->addSql('ALTER TABLE pa_group DROP bank_account_id'); - } - - // phpcs:disable Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps - private function getMainAccount(int $unitId): string|null - { - $result = $this->skautis->org->AccountAll(['ID_Unit' => $unitId]); - - if ($result instanceof stdClass) { - return null; - } - - foreach ($result as $account) { - if ($account->IsMain) { - return Strings::endsWith($account->DisplayName, '/2010') - ? $account->DisplayName - : null; // Only FIO is supported - } - } - - return null; - } -} diff --git a/migrations/2017/Version20170707164123.php b/migrations/2017/Version20170707164123.php deleted file mode 100644 index b53683156..000000000 --- a/migrations/2017/Version20170707164123.php +++ /dev/null @@ -1,34 +0,0 @@ -addSql(" -CREATE TABLE `log` ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `unitId` int(11) unsigned NOT NULL, - `date` datetime NOT NULL, - `userId` int(10) unsigned NOT NULL, - `description` text CHARACTER SET utf8 COLLATE utf8_czech_ci NOT NULL, - `type` enum('object','payment') CHARACTER SET utf8 COLLATE utf8_czech_ci NOT NULL, - `typeId` int(10) unsigned DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `unitId` (`unitId`), - KEY `typeId` (`typeId`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - "); - } - - public function down(Schema $schema): void - { - $this->addSql('DROP TABLE IF EXISTS `log`;'); - } -} diff --git a/migrations/2017/Version20170808142047.php b/migrations/2017/Version20170808142047.php deleted file mode 100644 index 16ca430aa..000000000 --- a/migrations/2017/Version20170808142047.php +++ /dev/null @@ -1,22 +0,0 @@ -addSql('ALTER TABLE tc_vehicle ADD subunit_id INT DEFAULT NULL'); - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE tc_vehicle DROP subunit_id'); - $this->addSql('CREATE INDEX unit_id ON tc_vehicle (unit_id)'); - } -} diff --git a/migrations/2017/Version20170917162823.php b/migrations/2017/Version20170917162823.php deleted file mode 100644 index 0c0539b5e..000000000 --- a/migrations/2017/Version20170917162823.php +++ /dev/null @@ -1,36 +0,0 @@ -addSql("INSERT INTO `ac_chitsCategory` (`id`, `label`, `short`, `type`, `orderby`, `deleted`) VALUES (13, 'Převod z odd. pokladny', 'zd', 1, '100', '0');"); - $this->addSql("INSERT INTO `ac_chitsCategory` (`id`, `label`, `short`, `type`, `orderby`, `deleted`) VALUES (14, 'Převod do odd. pokladny', 'dd', 2, '100', '0');"); - $this->addSql("INSERT INTO `ac_chitsCategory` (`id`, `label`, `short`, `type`, `orderby`, `deleted`) VALUES (15, 'Převod z akce', 'za', 1, '100', '0');"); - $this->addSql("INSERT INTO `ac_chitsCategory` (`id`, `label`, `short`, `type`, `orderby`, `deleted`) VALUES (16, 'Převod do akce', 'da', 2, '100', '0');"); - - $this->addSql('CREATE TABLE `ac_chitsCategory_object` (' . - '`categoryId` int(10) unsigned NOT NULL,' . - '`objectTypeId` varchar(20) COLLATE utf8_czech_ci NOT NULL,' . - 'KEY `categoryId` (`categoryId`),' . - 'KEY `objectTypeId` (`objectTypeId`),' . - 'CONSTRAINT `ac_chitsCategory_object_ibfk_1` FOREIGN KEY (`categoryId`) REFERENCES `ac_chitsCategory` (`id`) ON DELETE CASCADE ON UPDATE CASCADE' . - ') ENGINE=InnoDB DEFAULT CHARSET=utf8;'); - - $this->addSql('INSERT INTO `ac_chitsCategory_object` (`categoryId`, `objectTypeId`) VALUES ' . - "(1,'camp'),(2,'camp'), (3,'camp'), (4,'camp'), (5,'camp'), (6,'camp'), (7,'camp'), (8,'camp'), (9,'camp'), (10,'camp'), (11,'camp'), (12,'camp'), (13,'camp'), (14,'camp')," . - "(1,'general'),(2,'general'),(3,'general'),(4,'general'),(5,'general'),(6,'general'),(7,'general'),(8,'general'),(9,'general'),(10,'general'),(11,'general'),(12,'general'),(13,'general'),(14,'general')," . - "(2,'unit'),(3,'unit'),(4,'unit'),(5,'unit'),(6,'unit'),(7,'unit'),(8,'unit'),(9,'unit'),(10,'unit'),(12,'unit'),(13,'unit'),(15,'unit'),(16,'unit');"); - } - - public function down(Schema $schema): void - { - } -} diff --git a/migrations/2017/Version20171016131200.php b/migrations/2017/Version20171016131200.php deleted file mode 100644 index 4320dcac5..000000000 --- a/migrations/2017/Version20171016131200.php +++ /dev/null @@ -1,20 +0,0 @@ -addSql("UPDATE pa_smtp SET secure = 'tls' WHERE secure = 'tsl'"); - } - - public function down(Schema $schema): void - { - } -} diff --git a/migrations/2017/Version20171121192634.php b/migrations/2017/Version20171121192634.php deleted file mode 100644 index dc828c8f2..000000000 --- a/migrations/2017/Version20171121192634.php +++ /dev/null @@ -1,24 +0,0 @@ -addSql('CREATE TABLE ac_cashbook (id INT NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB'); - $this->addSql('INSERT INTO ac_cashbook (id) SELECT id FROM ac_object'); - $this->addSql("UPDATE ac_chits SET num = NULL WHERE num = ''"); - $this->addSql("UPDATE ac_chits SET recipient = NULL WHERE recipient = ''"); - } - - public function down(Schema $schema): void - { - $this->addSql('DROP TABLE ac_cashbook'); - } -} diff --git a/migrations/2017/Version20171212191620.php b/migrations/2017/Version20171212191620.php deleted file mode 100644 index 5f1cf252c..000000000 --- a/migrations/2017/Version20171212191620.php +++ /dev/null @@ -1,21 +0,0 @@ -addSql("INSERT INTO ac_chitsCategory_object (categoryId, objectTypeId) VALUES (14, 'unit')"); - } - - public function down(Schema $schema): void - { - $this->addSql("DELETE FROM ac_chitsCategory_object WHERE categoryId = 14 AND objectTypeId = 'unit'"); - } -} diff --git a/migrations/2017/Version20171214165147.php b/migrations/2017/Version20171214165147.php deleted file mode 100644 index ad484c60b..000000000 --- a/migrations/2017/Version20171214165147.php +++ /dev/null @@ -1,22 +0,0 @@ -addSql("ALTER TABLE tc_vehicle ADD metadata_author_name VARCHAR(255) NOT NULL, ADD metadata_created_at DATETIME NOT NULL COMMENT '(DC2Type:datetime_immutable)'"); - $this->addSql("UPDATE tc_vehicle SET metadata_author_name = 'Hospodaření', metadata_created_at = '2018-01-01'"); - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE tc_vehicle DROP metadata_author_name, DROP metadata_created_at'); - } -} diff --git a/migrations/2017/Version20171227114340.php b/migrations/2017/Version20171227114340.php deleted file mode 100644 index c2689a913..000000000 --- a/migrations/2017/Version20171227114340.php +++ /dev/null @@ -1,22 +0,0 @@ -addSql("ALTER TABLE `pa_smtp` ADD `sender` varchar(255) COLLATE 'utf8_czech_ci' NOT NULL AFTER `secure`;"); - $this->addSql('UPDATE `pa_smtp` SET sender = username'); - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE `pa_smtp` DROP `sender`;'); - } -} diff --git a/migrations/2017/initial_schema.sql b/migrations/2017/initial_schema.sql index b7ac978b7..5dacd8978 100644 --- a/migrations/2017/initial_schema.sql +++ b/migrations/2017/initial_schema.sql @@ -1,310 +1,401 @@ SET NAMES utf8; - SET time_zone = '+00:00'; - SET foreign_key_checks = 0; -SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO'; - -CREATE TABLE `ac_camp_participants` ( - `participantId` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', - `actionId` int(10) unsigned NOT NULL, - `payment` float(9,2) unsigned DEFAULT NULL, - `repayment` float(9,2) unsigned DEFAULT NULL COMMENT 'vratka', - `isAccount` enum('N','Y') COLLATE utf8_czech_ci DEFAULT 'N' COMMENT 'placeno na účet?', - PRIMARY KEY (`participantId`), - KEY `actionId` (`actionId`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; +SET NAMES utf8mb4; + +CREATE TABLE `ac_camp_cashbooks` ( + `id` char(36) COLLATE utf8mb4_czech_ci NOT NULL COMMENT '(DC2Type:skautis_camp_id)', + `cashbook_id` char(36) COLLATE utf8mb4_czech_ci NOT NULL COMMENT '(DC2Type:cashbook_id)', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci; + +CREATE TABLE `ac_cashbook` ( + `id` char(36) COLLATE utf8mb4_czech_ci NOT NULL COMMENT '(DC2Type:cashbook_id)', + `type` varchar(255) COLLATE utf8mb4_czech_ci NOT NULL COMMENT '(DC2Type:string_enum)', + `cash_chit_number_prefix` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_czech_ci DEFAULT NULL, + `bank_chit_number_prefix` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_czech_ci DEFAULT NULL, + `note` longtext COLLATE utf8mb4_czech_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci; + +CREATE TABLE `ac_chit_scan` ( + `id` int NOT NULL AUTO_INCREMENT, + `chit_id` int NOT NULL, + `file_path` varchar(255) COLLATE utf8mb4_czech_ci NOT NULL COMMENT '(DC2Type:file_path)', + PRIMARY KEY (`id`), + KEY `IDX_FEC2BFD22AEA3AE4` (`chit_id`), + CONSTRAINT `FK_FEC2BFD22AEA3AE4` FOREIGN KEY (`chit_id`) REFERENCES `ac_chits` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci; + +CREATE TABLE `ac_chit_to_item` ( + `chit_id` int NOT NULL, + `item_id` int NOT NULL, + PRIMARY KEY (`chit_id`,`item_id`), + UNIQUE KEY `UNIQ_2EA9AB79126F525E` (`item_id`), + KEY `IDX_2EA9AB792AEA3AE4` (`chit_id`), + CONSTRAINT `FK_2EA9AB79126F525E` FOREIGN KEY (`item_id`) REFERENCES `ac_chits_item` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT, + CONSTRAINT `FK_2EA9AB792AEA3AE4` FOREIGN KEY (`chit_id`) REFERENCES `ac_chits` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci; CREATE TABLE `ac_chits` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `eventId` int(11) NOT NULL, - `num` varchar(5) COLLATE utf8_czech_ci DEFAULT NULL, - `date` date NOT NULL, - `recipient` varchar(64) COLLATE utf8_czech_ci DEFAULT NULL, - `purpose` varchar(40) COLLATE utf8_czech_ci NOT NULL, - `price` float(9,2) NOT NULL, - `priceText` varchar(100) COLLATE utf8_czech_ci NOT NULL, - `category` int(10) unsigned NOT NULL, - `budgetCategoryIn` int(10) unsigned DEFAULT NULL, - `budgetCategoryOut` int(10) unsigned DEFAULT NULL, - `lock` int(10) unsigned DEFAULT NULL, - `deleted` tinyint(4) NOT NULL DEFAULT '0', - PRIMARY KEY (`id`), - KEY `category` (`category`), - KEY `deleted` (`deleted`), - KEY `eventId` (`eventId`), - CONSTRAINT `ac_chits_ibfk_1` FOREIGN KEY (`eventId`) REFERENCES `ac_object` (`id`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; + `id` int NOT NULL AUTO_INCREMENT, + `eventId` char(36) COLLATE utf8mb4_czech_ci NOT NULL COMMENT '(DC2Type:cashbook_id)', + `num` varchar(5) COLLATE utf8mb4_czech_ci DEFAULT NULL COMMENT '(DC2Type:chit_number)', + `date` date NOT NULL COMMENT '(DC2Type:chronos_date)', + `recipient` varchar(64) COLLATE utf8mb4_czech_ci DEFAULT NULL COMMENT '(DC2Type:recipient)', + `locked` int DEFAULT NULL, + `payment_method` varchar(13) COLLATE utf8mb4_czech_ci NOT NULL COMMENT '(DC2Type:string_enum)', + PRIMARY KEY (`id`), + KEY `IDX_DBBC2DBC2B2EBB6C` (`eventId`), + CONSTRAINT `FK_DBBC2DBC2B2EBB6C` FOREIGN KEY (`eventId`) REFERENCES `ac_cashbook` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci; CREATE TABLE `ac_chitsCategory` ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `label` varchar(64) COLLATE utf8_czech_ci NOT NULL, - `short` varchar(64) COLLATE utf8_czech_ci NOT NULL, - `type` enum('in','out') COLLATE utf8_czech_ci NOT NULL DEFAULT 'out', - `orderby` tinyint(3) unsigned NOT NULL DEFAULT '100', - `deleted` tinyint(4) NOT NULL DEFAULT '0', - PRIMARY KEY (`id`), - UNIQUE KEY `short` (`short`), - KEY `deleted` (`deleted`), - KEY `orderby` (`orderby`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; - -INSERT INTO `ac_chitsCategory` (`id`, `label`, `short`, `type`, `orderby`, `deleted`) VALUES -(1, 'Přijmy od účastníků', 'pp', 'in', 100, 0), -(2, 'Služby', 's', 'out', 100, 0), -(3, 'Potraviny', 't', 'out', 100, 0), -(4, 'Jízdné', 'j', 'out', 100, 0), -(5, 'Nájemné', 'n', 'out', 100, 0), -(6, 'Materiál', 'm', 'out', 100, 0), -(7, 'Převod do stř. pokladny', 'pr', 'out', 100, 0), -(8, 'Neurčeno', 'un', 'out', 101, 0), -(9, 'Převod z pokladny střediska', 'ps', 'in', 100, 0), -(10, 'Cestovné', 'c', 'out', 100, 0), -(11, 'Hromadný příjem od úč.', 'hpd', 'in', 100, 0); - -CREATE TABLE `ac_chitsView` (`id` bigint(20) unsigned, `eventId` int(11), `date` date, `num` varchar(5), `recipient` varchar(64), `purpose` varchar(40), `price` float(9,2), `priceText` varchar(100), `category` int(10) unsigned, `budgetCategoryIn` int(10) unsigned, `budgetCategoryOut` int(10) unsigned, `lock` int(10) unsigned, `deleted` tinyint(4), `clabel` varchar(64), `cshort` varchar(64), `ctype` enum('in','out')); - -CREATE TABLE `ac_object` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `skautisId` int(10) unsigned NOT NULL, - `type` varchar(20) COLLATE utf8_czech_ci NOT NULL, - `prefix` varchar(6) COLLATE utf8_czech_ci DEFAULT '', - PRIMARY KEY (`id`), - UNIQUE KEY `skautisId_type` (`skautisId`,`type`), - KEY `type` (`type`), - CONSTRAINT `ac_object_ibfk_2` FOREIGN KEY (`type`) REFERENCES `ac_object_type` (`id`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; - -CREATE TABLE `ac_object_type` ( - `id` varchar(20) COLLATE utf8_czech_ci NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; - -INSERT INTO `ac_object_type` (`id`) VALUES -('camp'), -('general'), -('unit'); + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(64) COLLATE utf8mb4_czech_ci NOT NULL, + `shortcut` varchar(64) COLLATE utf8mb4_czech_ci NOT NULL, + `operation_type` varchar(64) COLLATE utf8mb4_czech_ci NOT NULL COMMENT '(DC2Type:string_enum)', + `virtual` tinyint(1) NOT NULL, + `priority` smallint NOT NULL, + `deleted` tinyint NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `UNIQ_43247D652EF83F9C` (`shortcut`), + KEY `deleted` (`deleted`), + KEY `priority` (`priority`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci; + +CREATE TABLE `ac_chitsCategory_object` ( + `category_id` int NOT NULL, + `type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_czech_ci NOT NULL COMMENT '(DC2Type:string_enum)', + PRIMARY KEY (`category_id`,`type`), + KEY `IDX_824C4F2512469DE2` (`category_id`), + KEY `type` (`type`), + CONSTRAINT `FK_824C4F259C370B71` FOREIGN KEY (`category_id`) REFERENCES `ac_chitsCategory` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci; + +CREATE TABLE `ac_chits_item` ( + `id` int NOT NULL AUTO_INCREMENT, + `purpose` varchar(120) COLLATE utf8mb4_czech_ci NOT NULL, + `price` double NOT NULL, + `priceText` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_czech_ci NOT NULL, + `category` int NOT NULL, + `category_operation_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_czech_ci DEFAULT NULL COMMENT '(DC2Type:string_enum)', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci; + +CREATE TABLE `ac_education_cashbooks` ( + `id` char(36) COLLATE utf8mb4_czech_ci NOT NULL COMMENT '(DC2Type:skautis_education_id)', + `year` int NOT NULL, + `cashbook_id` char(36) COLLATE utf8mb4_czech_ci NOT NULL COMMENT '(DC2Type:cashbook_id)', + PRIMARY KEY (`id`,`year`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci; + +CREATE TABLE `ac_event_cashbooks` ( + `id` char(36) COLLATE utf8mb4_czech_ci NOT NULL COMMENT '(DC2Type:skautis_event_id)', + `cashbook_id` char(36) COLLATE utf8mb4_czech_ci NOT NULL COMMENT '(DC2Type:cashbook_id)', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci; + +CREATE TABLE `ac_participants` ( + `id` char(36) COLLATE utf8mb4_czech_ci NOT NULL COMMENT '(DC2Type:payment_id)', + `participant_id` int NOT NULL, + `event_id` int NOT NULL, + `payment` int NOT NULL COMMENT '(DC2Type:money)', + `repayment` int NOT NULL COMMENT '(DC2Type:money)', + `account` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_czech_ci NOT NULL, + `event_type` varchar(9) COLLATE utf8mb4_czech_ci NOT NULL COMMENT '(DC2Type:string_enum)', + PRIMARY KEY (`id`), + KEY `eventId` (`event_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci; CREATE TABLE `ac_unit_budget_category` ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `objectId` int(11) NOT NULL, - `label` varchar(64) COLLATE utf8_czech_ci NOT NULL, - `type` enum('in','out') COLLATE utf8_czech_ci NOT NULL DEFAULT 'out', - `parentId` int(10) unsigned DEFAULT NULL, - `value` float unsigned NOT NULL DEFAULT '0', - `year` smallint(5) unsigned NOT NULL, - `deleted` tinyint(3) unsigned NOT NULL DEFAULT '0', - PRIMARY KEY (`id`), - KEY `objectId_year` (`objectId`,`year`), - KEY `parentId` (`parentId`), - CONSTRAINT `ac_unit_budget_category_ibfk_2` FOREIGN KEY (`objectId`) REFERENCES `ac_object` (`id`) ON UPDATE CASCADE, - CONSTRAINT `ac_unit_budget_category_ibfk_4` FOREIGN KEY (`parentId`) REFERENCES `ac_unit_budget_category` (`id`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; - -CREATE TABLE `pa_bank` ( - `unitId` int(11) unsigned NOT NULL, - `token` varchar(64) COLLATE utf8_czech_ci NOT NULL, - `daysback` int(10) unsigned DEFAULT NULL COMMENT 'počet dní nazpět', - PRIMARY KEY (`unitId`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; + `id` int NOT NULL AUTO_INCREMENT, + `unit_id` int NOT NULL, + `label` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_czech_ci NOT NULL, + `type` varchar(255) COLLATE utf8mb4_czech_ci NOT NULL COMMENT '(DC2Type:string_enum)', + `parentId` int DEFAULT NULL, + `value` double NOT NULL DEFAULT '0', + `year` smallint NOT NULL, + PRIMARY KEY (`id`), + KEY `unitId_year` (`unit_id`,`year`), + KEY `IDX_356BCD1F10EE4CEE` (`parentId`), + CONSTRAINT `FK_356BCD1F10EE4CEE` FOREIGN KEY (`parentId`) REFERENCES `ac_unit_budget_category` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci; + +CREATE TABLE `ac_unit_cashbooks` ( + `id` int NOT NULL, + `unit_id` char(36) COLLATE utf8mb4_czech_ci NOT NULL COMMENT '(DC2Type:unit_id)', + `year` smallint NOT NULL, + `cashbook_id` varchar(36) COLLATE utf8mb4_czech_ci NOT NULL COMMENT '(DC2Type:cashbook_id)', + PRIMARY KEY (`id`,`unit_id`), + KEY `IDX_1243558BF8BD700D` (`unit_id`), + CONSTRAINT `FK_1243558BF8BD700D` FOREIGN KEY (`unit_id`) REFERENCES `ac_units` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci; + +CREATE TABLE `ac_units` ( + `id` char(36) COLLATE utf8mb4_czech_ci NOT NULL COMMENT '(DC2Type:unit_id)', + `active_cashbook_id` int NOT NULL, + `next_cashbook_id` int NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci; + +CREATE TABLE `google_oauth` ( + `id` char(36) COLLATE utf8mb4_czech_ci NOT NULL COMMENT '(DC2Type:oauth_id)', + `unit_id` char(36) COLLATE utf8mb4_czech_ci NOT NULL COMMENT '(DC2Type:unit_id)', + `email` varchar(255) COLLATE utf8mb4_czech_ci NOT NULL, + `token` varchar(255) COLLATE utf8mb4_czech_ci NOT NULL, + `updated_at` datetime NOT NULL COMMENT '(DC2Type:datetime_immutable)', + PRIMARY KEY (`id`), + UNIQUE KEY `unitid_email` (`unit_id`,`email`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci; + +CREATE TABLE `log` ( + `id` int NOT NULL AUTO_INCREMENT, + `unit_id` int NOT NULL, + `date` datetime NOT NULL COMMENT '(DC2Type:datetime_immutable)', + `user_id` int NOT NULL, + `description` longtext COLLATE utf8mb4_czech_ci NOT NULL, + `type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_czech_ci NOT NULL COMMENT '(DC2Type:string_enum)', + `type_id` int DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `unitId` (`unit_id`), + KEY `typeId` (`type_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci; + +CREATE TABLE `pa_bank_account` ( + `id` int NOT NULL AUTO_INCREMENT, + `unit_id` int NOT NULL, + `name` varchar(255) COLLATE utf8mb4_czech_ci NOT NULL, + `token` varchar(255) COLLATE utf8mb4_czech_ci DEFAULT NULL, + `created_at` datetime NOT NULL COMMENT '(DC2Type:datetime_immutable)', + `allowed_for_subunits` tinyint(1) NOT NULL, + `number_prefix` varchar(6) COLLATE utf8mb4_czech_ci DEFAULT NULL, + `number_number` varchar(10) COLLATE utf8mb4_czech_ci NOT NULL, + `number_bank_code` varchar(4) COLLATE utf8mb4_czech_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci; CREATE TABLE `pa_group` ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `groupType` varchar(20) COLLATE utf8_czech_ci DEFAULT NULL COMMENT 'typ entity', - `unitId` int(11) unsigned NOT NULL, - `sisId` int(11) DEFAULT NULL COMMENT 'ID entity ve skautisu', - `label` varchar(64) COLLATE utf8_czech_ci NOT NULL, - `amount` float unsigned DEFAULT NULL, - `maturity` date DEFAULT NULL, - `ks` int(4) unsigned DEFAULT NULL, - `email_info` text COLLATE utf8_czech_ci, - `email_demand` text COLLATE utf8_czech_ci, - `state` varchar(20) COLLATE utf8_czech_ci NOT NULL DEFAULT 'open', - `state_info` varchar(250) COLLATE utf8_czech_ci NOT NULL DEFAULT '', - `created_at` datetime DEFAULT NULL, - `last_pairing` datetime DEFAULT NULL, - `smtp_id` int(10) unsigned DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `objectId` (`sisId`), - KEY `groupType` (`groupType`), - KEY `objectId_2` (`unitId`), - KEY `state` (`state`), - KEY `smtp_id` (`smtp_id`), - CONSTRAINT `pa_group_ibfk_1` FOREIGN KEY (`groupType`) REFERENCES `pa_group_type` (`id`) ON UPDATE CASCADE, - CONSTRAINT `pa_group_ibfk_4` FOREIGN KEY (`state`) REFERENCES `pa_group_state` (`id`) ON UPDATE CASCADE, - CONSTRAINT `pa_group_ibfk_6` FOREIGN KEY (`smtp_id`) REFERENCES `pa_smtp` (`id`) ON DELETE SET NULL ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; - -CREATE TABLE `pa_group_state` ( - `id` varchar(20) COLLATE utf8_czech_ci NOT NULL, - `label` varchar(64) COLLATE utf8_czech_ci NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; - -INSERT INTO `pa_group_state` (`id`, `label`) VALUES -('canceled', 'Zrušená'), -('closed', 'Uzavřená'), -('open', 'Otevřená'); - -CREATE TABLE `pa_group_type` ( - `id` varchar(20) COLLATE utf8_czech_ci NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; - -INSERT INTO `pa_group_type` (`id`) VALUES -('camp'), -('registration'); + `id` int NOT NULL AUTO_INCREMENT, + `groupType` varchar(20) COLLATE utf8mb4_czech_ci DEFAULT NULL COMMENT 'typ entity(DC2Type:string_enum)', + `sisId` int DEFAULT NULL COMMENT 'ID entity ve skautisu', + `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_czech_ci NOT NULL, + `amount` double DEFAULT NULL, + `due_date` date DEFAULT NULL COMMENT '(DC2Type:chronos_date)', + `constant_symbol` int DEFAULT NULL, + `next_variable_symbol` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_czech_ci DEFAULT NULL COMMENT '(DC2Type:variable_symbol)', + `state` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_czech_ci NOT NULL, + `note` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_czech_ci NOT NULL, + `created_at` datetime DEFAULT NULL COMMENT '(DC2Type:datetime_immutable)', + `last_pairing` datetime DEFAULT NULL COMMENT '(DC2Type:datetime_immutable)', + `smtp_id` int DEFAULT NULL, + `bank_account_id` int DEFAULT NULL, + `oauth_id` char(36) COLLATE utf8mb4_czech_ci DEFAULT NULL COMMENT '(DC2Type:oauth_id)', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci; + +CREATE TABLE `pa_group_email` ( + `id` int NOT NULL AUTO_INCREMENT, + `group_id` int NOT NULL, + `type` varchar(255) COLLATE utf8mb4_czech_ci NOT NULL COMMENT '(DC2Type:string_enum)', + `template_subject` varchar(255) COLLATE utf8mb4_czech_ci NOT NULL, + `template_body` longtext COLLATE utf8mb4_czech_ci NOT NULL, + `enabled` tinyint(1) NOT NULL, + PRIMARY KEY (`id`), + KEY `IDX_7A67EADBFE54D947` (`group_id`), + CONSTRAINT `FK_7A67EADBFE54D947` FOREIGN KEY (`group_id`) REFERENCES `pa_group` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci; + +CREATE TABLE `pa_group_unit` ( + `id` int NOT NULL AUTO_INCREMENT, + `unit_id` int NOT NULL, + `group_id` int NOT NULL, + PRIMARY KEY (`id`), + KEY `IDX_FB5A0CD6FE54D947` (`group_id`), + CONSTRAINT `FK_FB5A0CD6FE54D947` FOREIGN KEY (`group_id`) REFERENCES `pa_group` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci; CREATE TABLE `pa_payment` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `groupId` int(10) unsigned NOT NULL, - `name` varchar(64) COLLATE utf8_czech_ci NOT NULL, - `email` text COLLATE utf8_czech_ci, - `personId` int(11) DEFAULT NULL, - `amount` float NOT NULL, - `maturity` date NOT NULL, - `vs` varchar(10) COLLATE utf8_czech_ci DEFAULT NULL, - `ks` varchar(4) COLLATE utf8_czech_ci DEFAULT NULL, - `note` varchar(64) COLLATE utf8_czech_ci DEFAULT NULL, - `transactionId` bigint(11) unsigned DEFAULT NULL, - `dateClosed` datetime DEFAULT NULL, - `paidFrom` varchar(64) COLLATE utf8_czech_ci DEFAULT NULL, - `state` varchar(20) COLLATE utf8_czech_ci NOT NULL DEFAULT 'preparing', - PRIMARY KEY (`id`), - KEY `state` (`state`), - KEY `groupId` (`groupId`), - CONSTRAINT `pa_payment_ibfk_1` FOREIGN KEY (`state`) REFERENCES `pa_payment_state` (`id`) ON UPDATE CASCADE, - CONSTRAINT `pa_payment_ibfk_5` FOREIGN KEY (`groupId`) REFERENCES `pa_group` (`id`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; - -CREATE TABLE `pa_payment_state` ( - `id` varchar(20) COLLATE utf8_czech_ci NOT NULL, - `label` varchar(64) COLLATE utf8_czech_ci NOT NULL, - `orderby` tinyint(4) NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; - -INSERT INTO `pa_payment_state` (`id`, `label`, `orderby`) VALUES -('canceled', 'Zrušena', 10), -('completed', 'Dokončena', 3), -('preparing', 'Připravena', 1), -('send', 'Odeslána', 2); - -CREATE TABLE `pa_smtp` ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `unitId` int(11) unsigned NOT NULL, - `host` varchar(255) COLLATE utf8_czech_ci NOT NULL, - `username` varchar(255) COLLATE utf8_czech_ci NOT NULL, - `password` varchar(255) COLLATE utf8_czech_ci NOT NULL, - `secure` varchar(64) COLLATE utf8_czech_ci NOT NULL DEFAULT 'ssl', - `created` datetime NOT NULL, - PRIMARY KEY (`id`), - KEY `unitId` (`unitId`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; - -CREATE TABLE `report_chitsView` (`category` varchar(64), `sum(price)` double(19,2), `cnt` bigint(21), `rok` int(4)); - -CREATE TABLE `report_eventsView` (`Year` int(4), `Type` varchar(20), `Count` bigint(21)); + `id` int NOT NULL AUTO_INCREMENT, + `group_id` int NOT NULL, + `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_czech_ci NOT NULL, + `person_id` int DEFAULT NULL, + `amount` float NOT NULL, + `due_date` date NOT NULL COMMENT '(DC2Type:chronos_date)', + `variable_symbol` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_czech_ci DEFAULT NULL COMMENT '(DC2Type:variable_symbol)', + `constant_symbol` smallint DEFAULT NULL, + `note` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_czech_ci NOT NULL, + `transactionId` varchar(64) COLLATE utf8mb4_czech_ci DEFAULT NULL, + `closed_at` datetime DEFAULT NULL COMMENT '(DC2Type:datetime_immutable)', + `closed_by_username` varchar(64) COLLATE utf8mb4_czech_ci DEFAULT NULL, + `bank_account` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_czech_ci DEFAULT NULL, + `state` varchar(20) COLLATE utf8mb4_czech_ci NOT NULL COMMENT '(DC2Type:string_enum)', + `transaction_payer` varchar(255) COLLATE utf8mb4_czech_ci DEFAULT NULL, + `transaction_note` varchar(255) COLLATE utf8mb4_czech_ci DEFAULT NULL, + `date` date DEFAULT NULL COMMENT '(DC2Type:chronos_date)', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci; + +CREATE TABLE `pa_payment_email_recipients` ( + `id` int NOT NULL AUTO_INCREMENT, + `payment_id` int NOT NULL, + `email_address` varchar(255) COLLATE utf8mb4_czech_ci NOT NULL COMMENT '(DC2Type:email_address)', + PRIMARY KEY (`id`), + KEY `IDX_A3FBD6514C3A3BB` (`payment_id`), + CONSTRAINT `FK_A3FBD6514C3A3BB` FOREIGN KEY (`payment_id`) REFERENCES `pa_payment` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci; + +CREATE TABLE `pa_payment_sent_emails` ( + `id` int NOT NULL AUTO_INCREMENT, + `payment_id` int NOT NULL, + `type` varchar(255) COLLATE utf8mb4_czech_ci NOT NULL COMMENT '(DC2Type:string_enum)', + `time` datetime NOT NULL COMMENT '(DC2Type:datetime_immutable)', + `sender_name` varchar(255) COLLATE utf8mb4_czech_ci NOT NULL, + PRIMARY KEY (`id`), + KEY `IDX_95359C6C4C3A3BB` (`payment_id`), + CONSTRAINT `FK_95359C6C4C3A3BB` FOREIGN KEY (`payment_id`) REFERENCES `pa_payment` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci; CREATE TABLE `tc_commands` ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `contract_id` int(10) unsigned DEFAULT NULL, - `unit_id` int(10) unsigned NOT NULL, - `purpose` varchar(64) COLLATE utf8_czech_ci NOT NULL, - `place` varchar(64) COLLATE utf8_czech_ci DEFAULT NULL, - `passengers` varchar(64) COLLATE utf8_czech_ci NOT NULL, - `vehicle_id` int(10) unsigned DEFAULT NULL, - `fuel_price` float(9,2) NOT NULL, - `amortization` float(9,2) NOT NULL, - `note` varchar(64) COLLATE utf8_czech_ci NOT NULL, - `closed` datetime DEFAULT NULL, - `deleted` tinyint(3) unsigned NOT NULL DEFAULT '0', - PRIMARY KEY (`id`), - KEY `contract_id` (`contract_id`), - KEY `vehicle_id` (`vehicle_id`), - CONSTRAINT `tc_commands_ibfk_1` FOREIGN KEY (`contract_id`) REFERENCES `tc_contracts` (`id`) ON UPDATE CASCADE, - CONSTRAINT `tc_commands_ibfk_2` FOREIGN KEY (`vehicle_id`) REFERENCES `tc_vehicle` (`id`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; - -CREATE TABLE `tc_command_types` ( - `commandId` int(10) unsigned NOT NULL, - `typeId` varchar(5) COLLATE utf8_czech_ci NOT NULL DEFAULT 'auv', - KEY `commandId` (`commandId`), - KEY `typeId` (`typeId`), - CONSTRAINT `tc_command_types_ibfk_5` FOREIGN KEY (`commandId`) REFERENCES `tc_commands` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `tc_command_types_ibfk_6` FOREIGN KEY (`typeId`) REFERENCES `tc_travelTypes` (`type`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; + `id` int NOT NULL AUTO_INCREMENT, + `contract_id` int DEFAULT NULL, + `unit_id` int NOT NULL, + `purpose` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_czech_ci NOT NULL, + `place` varchar(64) COLLATE utf8mb4_czech_ci NOT NULL, + `fellow_passengers` varchar(256) COLLATE utf8mb4_czech_ci NOT NULL, + `vehicle_id` int DEFAULT NULL, + `fuel_price` int NOT NULL COMMENT '(DC2Type:money)', + `amortization` int NOT NULL COMMENT '(DC2Type:money)', + `note` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_czech_ci NOT NULL, + `closed_at` datetime DEFAULT NULL COMMENT '(DC2Type:datetime_immutable)', + `driver_name` varchar(255) COLLATE utf8mb4_czech_ci NOT NULL, + `driver_contact` varchar(255) COLLATE utf8mb4_czech_ci NOT NULL, + `driver_address` varchar(255) COLLATE utf8mb4_czech_ci NOT NULL, + `next_travel_id` int NOT NULL, + `owner_id` int DEFAULT NULL, + `unit` varchar(64) COLLATE utf8mb4_czech_ci NOT NULL, + `transport_types` json NOT NULL COMMENT '(DC2Type:transport_types)', + PRIMARY KEY (`id`), + KEY `IDX_4D5B6D0C545317D1` (`vehicle_id`), + CONSTRAINT `FK_4D5B6D0C545317D1` FOREIGN KEY (`vehicle_id`) REFERENCES `tc_vehicle` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci; CREATE TABLE `tc_contracts` ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `unit_id` int(10) unsigned NOT NULL COMMENT 'SkautIS ID jednotky', - `unit_person` varchar(64) COLLATE utf8_czech_ci NOT NULL COMMENT 'jméno osoby zastupující jednotku', - `driver_name` varchar(64) COLLATE utf8_czech_ci NOT NULL, - `driver_address` varchar(64) COLLATE utf8_czech_ci NOT NULL, - `driver_birthday` date NOT NULL, - `driver_contact` varchar(64) COLLATE utf8_czech_ci DEFAULT NULL, - `start` date DEFAULT NULL, - `end` date DEFAULT NULL, - `template` int(11) NOT NULL DEFAULT '2' COMMENT '1-old, 2-podle NOZ', - `deleted` tinyint(3) unsigned NOT NULL DEFAULT '0', - PRIMARY KEY (`id`), - KEY `deleted` (`deleted`), - KEY `unit_id` (`unit_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; + `id` int NOT NULL AUTO_INCREMENT, + `unit_id` int NOT NULL, + `unit_representative` varchar(64) COLLATE utf8mb4_czech_ci NOT NULL, + `driver_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_czech_ci NOT NULL, + `driver_address` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_czech_ci NOT NULL, + `driver_birthday` date DEFAULT NULL COMMENT '(DC2Type:chronos_date)', + `driver_contact` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_czech_ci DEFAULT NULL, + `since` date DEFAULT NULL COMMENT '(DC2Type:chronos_date)', + `until` date DEFAULT NULL COMMENT '(DC2Type:chronos_date)', + `template_version` smallint NOT NULL COMMENT '1-old, 2-podle NOZ', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci; CREATE TABLE `tc_travels` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `command_id` int(10) unsigned NOT NULL, - `start_place` varchar(64) COLLATE utf8_czech_ci NOT NULL, - `start_date` date NOT NULL, - `end_place` varchar(64) COLLATE utf8_czech_ci NOT NULL, - `distance` float(9,2) unsigned NOT NULL, - `type` varchar(5) COLLATE utf8_czech_ci NOT NULL, - PRIMARY KEY (`id`), - KEY `tc_id` (`command_id`), - KEY `type` (`type`), - CONSTRAINT `tc_travels_ibfk_1` FOREIGN KEY (`command_id`) REFERENCES `tc_commands` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `tc_travels_ibfk_3` FOREIGN KEY (`type`) REFERENCES `tc_travelTypes` (`type`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; - -CREATE TABLE `tc_travelTypes` ( - `type` varchar(5) COLLATE utf8_czech_ci NOT NULL, - `label` varchar(64) COLLATE utf8_czech_ci NOT NULL, - `hasFuel` tinyint(3) unsigned NOT NULL DEFAULT '0', - `order` tinyint(4) NOT NULL DEFAULT '10', - PRIMARY KEY (`type`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; - -INSERT INTO `tc_travelTypes` (`type`, `label`, `hasFuel`, `order`) VALUES -('a', 'autobus', 0, 45), -('auv', 'auto vlastní', 1, 50), -('l', 'letadlo', 0, 9), -('mov', 'motocykl vlastní', 1, 30), -('o', 'osobní vlak', 0, 40), -('p', 'pěšky', 0, 10), -('r', 'rychlík', 0, 40); + `id` int NOT NULL, + `command_id` int NOT NULL, + `start_place` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_czech_ci NOT NULL, + `start_date` date NOT NULL COMMENT '(DC2Type:chronos_date)', + `end_place` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_czech_ci NOT NULL, + `distance` double DEFAULT NULL, + `transport_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_czech_ci NOT NULL COMMENT '(DC2Type:string_enum)', + `has_fuel` smallint NOT NULL, + `price` int DEFAULT NULL COMMENT '(DC2Type:money)', + PRIMARY KEY (`id`,`command_id`), + KEY `IDX_F53E53633E1689A` (`command_id`), + CONSTRAINT `FK_F53E53633E1689A` FOREIGN KEY (`command_id`) REFERENCES `tc_commands` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci; CREATE TABLE `tc_vehicle` ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `unit_id` int(10) unsigned NOT NULL COMMENT 'ID jednotky ze SkautISu ', - `type` varchar(64) COLLATE utf8_czech_ci NOT NULL COMMENT 'značka auta ', - `registration` varchar(64) COLLATE utf8_czech_ci NOT NULL, - `consumption` float(7,4) unsigned NOT NULL COMMENT 'spotřeba', - `note` varchar(64) COLLATE utf8_czech_ci NOT NULL DEFAULT '' COMMENT 'volitelná poznámka ', - `archived` tinyint(1) unsigned NOT NULL DEFAULT '0', - PRIMARY KEY (`id`), - KEY `unit_id` (`unit_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; - -DROP TABLE IF EXISTS `ac_chitsView`; - -CREATE ALGORITHM=UNDEFINED SQL SECURITY DEFINER VIEW `ac_chitsView` AS select `ch`.`id` AS `id`,`ch`.`eventId` AS `eventId`,`ch`.`date` AS `date`,`ch`.`num` AS `num`,`ch`.`recipient` AS `recipient`,`ch`.`purpose` AS `purpose`,`ch`.`price` AS `price`,`ch`.`priceText` AS `priceText`,`ch`.`category` AS `category`,`ch`.`budgetCategoryIn` AS `budgetCategoryIn`,`ch`.`budgetCategoryOut` AS `budgetCategoryOut`,`ch`.`lock` AS `lock`,`ch`.`deleted` AS `deleted`,`cat`.`label` AS `clabel`,`cat`.`short` AS `cshort`,`cat`.`type` AS `ctype` from (`ac_chits` `ch` left join `ac_chitsCategory` `cat` on((`ch`.`category` = `cat`.`id`))) where (`ch`.`deleted` = 0); - -DROP TABLE IF EXISTS `report_chitsView`; - -CREATE ALGORITHM=UNDEFINED SQL SECURITY DEFINER VIEW `report_chitsView` AS select `c`.`label` AS `category`,sum(`ch`.`price`) AS `sum(price)`,count(0) AS `cnt`,year(`ch`.`date`) AS `rok` from (`ac_chitsView` `ch` left join `ac_chitsCategory` `c` on((`ch`.`category` = `c`.`id`))) where (`ch`.`ctype` = 'out') group by `ch`.`category`,year(`ch`.`date`) order by year(`ch`.`date`) desc; - -DROP TABLE IF EXISTS `report_eventsView`; - -CREATE ALGORITHM=UNDEFINED SQL SECURITY DEFINER VIEW `report_eventsView` AS select year(`c`.`date`) AS `Year`,`o`.`type` AS `Type`,count(distinct `o`.`skautisId`) AS `Count` from (`ac_chits` `c` left join `ac_object` `o` on((`c`.`eventId` = `o`.`id`))) group by `o`.`type`,year(`c`.`date`) order by year(`c`.`date`) desc,`o`.`type`; + `id` int NOT NULL AUTO_INCREMENT, + `unit_id` int NOT NULL, + `type` varchar(64) COLLATE utf8mb4_czech_ci NOT NULL, + `registration` varchar(64) COLLATE utf8mb4_czech_ci NOT NULL, + `consumption` double NOT NULL, + `note` varchar(64) COLLATE utf8mb4_czech_ci NOT NULL, + `archived` tinyint(1) NOT NULL DEFAULT '0', + `subunit_id` int DEFAULT NULL, + `metadata_author_name` varchar(255) COLLATE utf8mb4_czech_ci NOT NULL, + `metadata_created_at` datetime NOT NULL COMMENT '(DC2Type:datetime_immutable)', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci; + +CREATE TABLE `tc_vehicle_roadworthy_scan` ( + `id` int NOT NULL AUTO_INCREMENT, + `vehicle_id` int NOT NULL, + `file_path` varchar(255) COLLATE utf8mb4_czech_ci NOT NULL COMMENT '(DC2Type:file_path)', + PRIMARY KEY (`id`), + KEY `IDX_270D2917545317D1` (`vehicle_id`), + CONSTRAINT `FK_270D2917545317D1` FOREIGN KEY (`vehicle_id`) REFERENCES `tc_vehicle` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci; + +INSERT INTO `ac_chitsCategory` (`id`, `name`, `shortcut`, `operation_type`, `virtual`, `priority`, `deleted`) VALUES + (1, 'Přijmy od účastníků', 'pp', 'in', 0, 100, 0), + (2, 'Služby', 's', 'out', 0, 100, 0), + (3, 'Potraviny', 't', 'out', 0, 100, 0), + (4, 'Jízdné', 'j', 'out', 0, 100, 0), + (5, 'Nájemné', 'n', 'out', 0, 100, 0), + (6, 'Materiál', 'm', 'out', 0, 100, 0), + (7, 'Převod do stř. pokladny', 'pr', 'out', 1, 100, 0), + (8, 'Neurčeno', 'un', 'out', 0, 101, 0), + (9, 'Převod z pokladny střediska', 'ps', 'in', 1, 100, 0), + (10, 'Cestovné', 'c', 'out', 0, 100, 0), + (11, 'Hromadný příjem od úč.', 'hpd', 'in', 0, 100, 0), + (12, 'Neurčeno', 'np', 'in', 0, 101, 0), + (13, 'Převod z odd. pokladny', 'zd', 'in', 1, 100, 0), + (14, 'Převod do odd. pokladny', 'dd', 'out', 1, 100, 0), + (15, 'Převod z akce', 'za', 'in', 1, 100, 0), + (16, 'Převod do akce', 'da', 'out', 1, 100, 0), + (17, 'Příspěvky samosprávy', 'sa', 'in', 0, 100, 0), + (18, 'Ostatní příjmy', 'op', 'in', 0, 100, 0), + (19, 'Vybavení', 'v', 'out', 0, 100, 0), + (20, 'Vratka úč. poplatku', 'vr', 'out', 1, 100, 0), + (21, 'Vratka úč. poplatku - dítě', 'vrc', 'out', 1, 100, 0), + (22, 'Vratka úč. poplatku - dospělý', 'vra', 'out', 1, 100, 0); + +INSERT INTO `ac_chitsCategory_object` (`category_id`, `type`) VALUES + (1, 'general'), + (2, 'general'), + (2, 'unit'), + (3, 'general'), + (3, 'unit'), + (4, 'general'), + (4, 'unit'), + (5, 'general'), + (5, 'unit'), + (6, 'general'), + (6, 'unit'), + (7, 'camp'), + (7, 'general'), + (7, 'unit'), + (8, 'camp'), + (8, 'general'), + (8, 'unit'), + (9, 'camp'), + (9, 'general'), + (9, 'unit'), + (10, 'general'), + (10, 'unit'), + (11, 'general'), + (12, 'camp'), + (12, 'general'), + (12, 'unit'), + (13, 'camp'), + (13, 'general'), + (13, 'unit'), + (14, 'camp'), + (14, 'general'), + (14, 'unit'), + (15, 'unit'), + (16, 'unit'), + (17, 'general'), + (18, 'general'), + (19, 'general'), + (20, 'education'), + (20, 'general'), + (21, 'camp'), + (22, 'camp'); diff --git a/migrations/2018/Version20180112170413.php b/migrations/2018/Version20180112170413.php deleted file mode 100644 index f86cc743e..000000000 --- a/migrations/2018/Version20180112170413.php +++ /dev/null @@ -1,20 +0,0 @@ -addSql("UPDATE pa_payment SET vs = NULL WHERE vs = ''"); - } - - public function down(Schema $schema): void - { - } -} diff --git a/migrations/2018/Version20180115183106.php b/migrations/2018/Version20180115183106.php deleted file mode 100644 index 367fa5a53..000000000 --- a/migrations/2018/Version20180115183106.php +++ /dev/null @@ -1,28 +0,0 @@ -addSql('CREATE TABLE pa_group_email (id INT AUTO_INCREMENT NOT NULL, group_id INT UNSIGNED DEFAULT NULL, type VARCHAR(255) NOT NULL COMMENT \'(DC2Type:string_enum)\', template_subject VARCHAR(255) NOT NULL, template_body LONGTEXT NOT NULL, enabled TINYINT(1) NOT NULL, INDEX IDX_7A67EADBFE54D947 (group_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB'); - $this->addSql('ALTER TABLE pa_group_email ADD CONSTRAINT FK_7A67EADBFE54D947 FOREIGN KEY (group_id) REFERENCES pa_group (id)'); - - $this->addSql(" - INSERT INTO pa_group_email (group_id, template_subject, template_body, type, enabled) - SELECT id, email_template_subject, email_template_body, 'payment_info', 1 FROM pa_group - "); - - $this->addSql('ALTER TABLE pa_group DROP email_template_body, DROP email_template_subject'); - } - - public function down(Schema $schema): void - { - } -} diff --git a/migrations/2018/Version20180122114315.php b/migrations/2018/Version20180122114315.php deleted file mode 100644 index 481fa051a..000000000 --- a/migrations/2018/Version20180122114315.php +++ /dev/null @@ -1,56 +0,0 @@ -addSql('ALTER TABLE ac_cashbook ADD type VARCHAR(255) NOT NULL COMMENT \'(DC2Type:string_enum)\''); - $this->addSql('UPDATE ac_cashbook c JOIN ac_object o ON o.id = c.id SET c.type = o.type'); - $this->addSql('ALTER TABLE ac_chits ADD category_operation_type VARCHAR(255) DEFAULT NULL COMMENT \'(DC2Type:string_enum)\''); - $this->addSql(" - UPDATE ac_chits c - JOIN ac_cashbook cb ON c.eventId = cb.id - JOIN ac_chitsCategory ct ON c.category = ct.id - SET c.category_operation_type = ct.type - WHERE cb.type IN ('troop', 'unit', 'general') # cashbooks with static categories only - OR ct.id IN (12, 8) # static categories for camp (undefined income & undefined expense) - "); - } - - public function postUp(Schema $schema): void - { - $unitCashbooks = $this->connection->fetchAll( - "SELECT c.id as id, o.skautisId as unit_id FROM ac_cashbook c JOIN ac_object o ON o.id = c.id WHERE c.type = 'unit'", - ); - - foreach ($unitCashbooks as $cashbook) { - $cashbook['unit_id'] = (int) $cashbook['unit_id']; - try { - $isOfficialUnit = $this->unitResolver->getOfficialUnitId($cashbook['unit_id']) === $cashbook['unit_id']; - $this->connection->update('ac_cashbook', [ - 'type' => $isOfficialUnit ? CashbookType::OFFICIAL_UNIT : CashbookType::TROOP, - ], ['id' => $cashbook['id']]); - } catch (UnitHasNoParent $exc) { - echo 'ERROR: ' . $exc->getMessage(); - } - } - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE ac_cashbook DROP type'); - } -} diff --git a/migrations/2018/Version20180409115846.php b/migrations/2018/Version20180409115846.php deleted file mode 100644 index 5cd395765..000000000 --- a/migrations/2018/Version20180409115846.php +++ /dev/null @@ -1,26 +0,0 @@ -addSql('ALTER TABLE ac_cashbook ADD chit_number_prefix VARCHAR(255) DEFAULT NULL, CHANGE id id INT NOT NULL COMMENT \'(DC2Type:cashbook_id)\''); - $this->addSql('UPDATE ac_cashbook c JOIN ac_object o ON o.id = c.id SET c.chit_number_prefix = o.prefix'); - $this->addSql('ALTER TABLE ac_object DROP prefix'); - $this->addSql('DELETE FROM ac_chits WHERE deleted = 1'); - $this->addSql('ALTER TABLE ac_chits DROP deleted, DROP budgetCategoryIn, DROP budgetCategoryOut'); - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE ac_cashbook DROP chit_number_prefix, CHANGE id id INT NOT NULL'); - $this->addSql('UPDATE ac_cashbook SET chit_number_prefix = NULL WHERE chit_number_prefix = \'\''); - } -} diff --git a/migrations/2018/Version20180424133816.php b/migrations/2018/Version20180424133816.php deleted file mode 100644 index 821cee6ec..000000000 --- a/migrations/2018/Version20180424133816.php +++ /dev/null @@ -1,23 +0,0 @@ -addSql( - 'ALTER TABLE pa_payment ADD transaction_payer VARCHAR(255) DEFAULT NULL, ADD transaction_note VARCHAR(255) DEFAULT NULL', - ); - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE pa_payment DROP transaction_payer, DROP transaction_note'); - } -} diff --git a/migrations/2018/Version20180611093151.php b/migrations/2018/Version20180611093151.php deleted file mode 100644 index a1560297a..000000000 --- a/migrations/2018/Version20180611093151.php +++ /dev/null @@ -1,21 +0,0 @@ -addSql('ALTER TABLE pa_payment DROP FOREIGN KEY pa_payment_ibfk_5'); - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE pa_payment ADD CONSTRAINT pa_payment_ibfk_5 FOREIGN KEY (groupId) REFERENCES pa_group (id) ON UPDATE CASCADE'); - } -} diff --git a/migrations/2018/Version20180701091058.php b/migrations/2018/Version20180701091058.php deleted file mode 100644 index 048e65f13..000000000 --- a/migrations/2018/Version20180701091058.php +++ /dev/null @@ -1,21 +0,0 @@ -addSql("ALTER TABLE `ac_cashbook` ADD `note` text COLLATE 'utf8_unicode_ci' NOT NULL;"); - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE `ac_cashbook` DROP `note`;'); - } -} diff --git a/migrations/2018/Version20180701123223.php b/migrations/2018/Version20180701123223.php deleted file mode 100644 index 6ae42c5bc..000000000 --- a/migrations/2018/Version20180701123223.php +++ /dev/null @@ -1,22 +0,0 @@ -addSql('ALTER TABLE ac_chits ADD payment_method VARCHAR(13) NOT NULL'); - $this->addSql('UPDATE ac_chits SET payment_method = \'cash\''); - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE ac_chits DROP payment_method'); - } -} diff --git a/migrations/2018/Version20180728124555.php b/migrations/2018/Version20180728124555.php deleted file mode 100644 index cc94974cc..000000000 --- a/migrations/2018/Version20180728124555.php +++ /dev/null @@ -1,34 +0,0 @@ -addSql( - 'DELETE FROM ac_chitsCategory_object WHERE objectTypeId = \'camp\' AND categoryId NOT IN (?)', - [self::VALID_CATEGORIES_FOR_CAMP], - [Connection::PARAM_INT_ARRAY], - ); - } - - public function down(Schema $schema): void - { - } -} diff --git a/migrations/2018/Version20181014120054.php b/migrations/2018/Version20181014120054.php deleted file mode 100644 index eaeb65aa6..000000000 --- a/migrations/2018/Version20181014120054.php +++ /dev/null @@ -1,57 +0,0 @@ -addSql('ALTER TABLE ac_cashbook CONVERT TO CHARACTER SET utf8 COLLATE utf8_czech_ci'); - - $this->addSql(<<<'SQL' - CREATE TABLE ac_unit_cashbooks - ( - id INT NOT NULL, - unit_id CHAR(36) NOT NULL COMMENT '(DC2Type:unit_id)', - year SMALLINT NOT NULL, - cashbook_id VARCHAR(36) NOT NULL COMMENT '(DC2Type:cashbook_id)', - INDEX IDX_1243558BF8BD700D (unit_id), - PRIMARY KEY(id, unit_id) - ) DEFAULT CHARACTER SET UTF8 COLLATE UTF8_czech_ci ENGINE = InnoDB -SQL); - - $this->addSql(<<<'SQL' - CREATE TABLE ac_units - ( - id CHAR(36) NOT NULL COMMENT '(DC2Type:unit_id)', - active_cashbook_id INT NOT NULL, - next_cashbook_id INT NOT NULL, - PRIMARY KEY(id) - ) DEFAULT CHARACTER SET UTF8 COLLATE UTF8_czech_ci ENGINE = InnoDB -SQL); - - $this->addSql(<<<'SQL' - INSERT INTO ac_unit_cashbooks (unit_id, cashbook_id, year, id) - SELECT - o.skautisId, o.id, 2018, 1 - FROM ac_object o - JOIN ac_cashbook c ON o.id = c.id - WHERE o.type = 'unit' -SQL); - $this->addSql('INSERT INTO ac_units (id, active_cashbook_id, next_cashbook_id) SELECT unit_id, 1, 2 FROM ac_unit_cashbooks'); - - $this->addSql('ALTER TABLE ac_unit_cashbooks ADD CONSTRAINT FK_1243558BF8BD700D FOREIGN KEY (unit_id) REFERENCES ac_units (id)'); - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE ac_unit_cashbooks DROP FOREIGN KEY FK_1243558BF8BD700D'); - $this->addSql('DROP TABLE ac_unit_cashbooks'); - $this->addSql('DROP TABLE ac_units'); - } -} diff --git a/migrations/2018/Version20181014182154.php b/migrations/2018/Version20181014182154.php deleted file mode 100644 index dc956a5d4..000000000 --- a/migrations/2018/Version20181014182154.php +++ /dev/null @@ -1,34 +0,0 @@ -addSql('ALTER TABLE ac_unit_budget_category DROP FOREIGN KEY ac_unit_budget_category_ibfk_2'); - $this->addSql('ALTER TABLE ac_unit_budget_category CHANGE objectId unit_id INT(11)'); - $this->addSql('UPDATE ac_unit_budget_category c JOIN ac_object o ON o.id = c.unit_id SET c.unit_id = o.skautisId'); - - $this->addSql('ALTER TABLE ac_chits DROP FOREIGN KEY ac_chits_ibfk_1'); - $this->addSql('ALTER TABLE ac_chits CHANGE eventId eventId VARCHAR(36)'); - $this->addSql('ALTER TABLE ac_object CHANGE id id VARCHAR(36)'); - $this->addSql('ALTER TABLE ac_cashbook CHANGE id id VARCHAR(36)'); - } - - public function down(Schema $schema): void - { - $this->addSql('UPDATE ac_unit_budget_category c JOIN ac_object o ON o.skautisId = c.unit_id SET c.unit_id = o.id'); - $this->addSql('ALTER TABLE ac_unit_budget_category CHANGE unit_id objectId INT(11)'); - $this->addSql('ALTER TABLE ac_unit_budget_category ADD CONSTRAINT ac_unit_budget_category_ibfk_2 FOREIGN KEY (objectId) REFERENCES ac_object (id)'); - - $this->addSql('ALTER TABLE ac_chits CHANGE eventId eventId BIGINT(20) UNSIGNED'); - $this->addSql('ALTER TABLE ac_object CHANGE id id INT(11)'); - $this->addSql('ALTER TABLE ac_cashbook CHANGE id id INT(11)'); - } -} diff --git a/migrations/2018/Version20181031175021.php b/migrations/2018/Version20181031175021.php deleted file mode 100644 index 5d36c9aaa..000000000 --- a/migrations/2018/Version20181031175021.php +++ /dev/null @@ -1,22 +0,0 @@ -addSql("ALTER TABLE `ac_chitsCategory` ADD `virtual` int unsigned NOT NULL DEFAULT '0' AFTER `type`;"); - $this->addSql("UPDATE `ac_chitsCategory` SET `virtual` = '1' WHERE `id` IN (7,9,13,14,15,16);"); - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE `ac_chitsCategory` DROP `virtual`;'); - } -} diff --git a/migrations/2018/Version20181031193155.php b/migrations/2018/Version20181031193155.php deleted file mode 100644 index 5a25924b0..000000000 --- a/migrations/2018/Version20181031193155.php +++ /dev/null @@ -1,29 +0,0 @@ -addSql('INSERT INTO `ac_chitsCategory` (`id`, `label`, `short`, `type`, `virtual`, `orderby`, `deleted`) VALUES ' . - "('17', 'Příspěvky samosprávy', 'sa', 1, '0', '100', '0'), " . - "('18', 'Ostatní příjmy', 'op', 1, '0', '100', '0'), " . - "('19', 'Vybavení', 'v', 2, '0', '100', '0');"); - $this->addSql('INSERT INTO `ac_chitsCategory_object` (`categoryId`, `objectTypeId`) VALUES ' . - "('17', 'general')," . - "('18', 'general')," . - "('19', 'general');"); - } - - public function down(Schema $schema): void - { - $this->addSql('DELETE FROM `ac_chitsCategory_object` WHERE `categoryId` IN (17, 18, 19);'); - $this->addSql('DELETE FROM `ac_chitsCategory` WHERE `id` IN (17, 18, 19);'); - } -} diff --git a/migrations/2018/Version20181215184024.php b/migrations/2018/Version20181215184024.php deleted file mode 100644 index 82b09c941..000000000 --- a/migrations/2018/Version20181215184024.php +++ /dev/null @@ -1,21 +0,0 @@ -addSql('ALTER TABLE `tc_commands` ADD `ownerId` int(11) NULL;'); - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE `tc_commands` DROP `ownerId`;'); - } -} diff --git a/migrations/2018/Version20181219112743.php b/migrations/2018/Version20181219112743.php deleted file mode 100644 index 5fdb6e0e7..000000000 --- a/migrations/2018/Version20181219112743.php +++ /dev/null @@ -1,21 +0,0 @@ -addSql('ALTER TABLE tc_commands CHANGE ownerId owner_id INT DEFAULT NULL'); - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE tc_commands CHANGE owner_id ownerId INT DEFAULT NULL'); - } -} diff --git a/migrations/2018/Version20181228133626.php b/migrations/2018/Version20181228133626.php deleted file mode 100644 index f2aef4807..000000000 --- a/migrations/2018/Version20181228133626.php +++ /dev/null @@ -1,27 +0,0 @@ -addSql('ALTER TABLE tc_contracts DROP deleted;'); //uz se v ORM kodu nepouziva - $this->addSql('ALTER TABLE tc_contracts CHANGE template template SMALLINT NOT NULL;'); - $this->addSql('ALTER TABLE ac_chitsCategory CHANGE `virtual` `virtual` TINYINT(1) NOT NULL;'); - $this->addSql('ALTER TABLE ac_chitsCategory CHANGE orderby orderby SMALLINT unsigned NOT NULL;'); - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE `tc_contracts` ADD `deleted` tinyint(3) unsigned NOT NULL DEFAULT 0;'); - $this->addSql('ALTER TABLE tc_contracts CHANGE template template int(11) NOT NULL DEFAULT 2 COMMENT \'1-old, 2-podle NOZ\';'); - $this->addSql('ALTER TABLE ac_chitsCategory CHANGE `virtual` `virtual` int(10) unsigned DEFAULT 0 NOT NULL;'); - $this->addSql('ALTER TABLE ac_chitsCategory CHANGE orderby orderby tinyint(3) unsigned DEFAULT 100 NOT NULL;'); - } -} diff --git a/migrations/2019/Version20190102200136.php b/migrations/2019/Version20190102200136.php deleted file mode 100644 index e08c2faa3..000000000 --- a/migrations/2019/Version20190102200136.php +++ /dev/null @@ -1,36 +0,0 @@ -addSql('ALTER TABLE `ac_chitsCategory` ' . - "CHANGE `type` `type` enum('in','out') COLLATE 'utf8_czech_ci' NOT NULL AFTER `short`, " . - 'CHANGE `deleted` `deleted` tinyint(4) NOT NULL AFTER `orderby`;'); - - $this->addSql('ALTER TABLE `pa_group` ' . - "CHANGE `state` `state` varchar(20) COLLATE 'utf8_czech_ci' NOT NULL AFTER `nextVs`, " . - "CHANGE `state_info` `state_info` varchar(250) COLLATE 'utf8_czech_ci' NOT NULL AFTER `state`;"); - - $this->addSql("ALTER TABLE `pa_smtp` CHANGE `secure` `secure` varchar(64) COLLATE 'utf8_czech_ci' NOT NULL AFTER `password`;"); - - $this->addSql('ALTER TABLE `pa_payment` ' . - "CHANGE `note` `note` varchar(64) COLLATE 'utf8_czech_ci' NOT NULL AFTER `ks`, " . - "CHANGE `state` `state` varchar(20) COLLATE 'utf8_czech_ci' NOT NULL AFTER `paidFrom`;"); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - } -} diff --git a/migrations/2019/Version20190103180852.php b/migrations/2019/Version20190103180852.php deleted file mode 100644 index 362d91f0b..000000000 --- a/migrations/2019/Version20190103180852.php +++ /dev/null @@ -1,23 +0,0 @@ -addSql('ALTER TABLE pa_payment CHANGE ks ks SMALLINT UNSIGNED DEFAULT NULL;'); - } - - public function down(Schema $schema): void - { - } -} diff --git a/migrations/2019/Version20190304083927.php b/migrations/2019/Version20190304083927.php deleted file mode 100644 index 9cf480d03..000000000 --- a/migrations/2019/Version20190304083927.php +++ /dev/null @@ -1,25 +0,0 @@ -addSql('ALTER TABLE `ac_camp_participants` ' . - 'CHANGE `payment` `payment` float(9,2) unsigned NOT NULL AFTER `actionId`,' . - 'CHANGE `repayment` `repayment` float(9,2) unsigned NOT NULL AFTER `payment`;'); - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE `ac_camp_participants` ' . - 'CHANGE `payment` `payment` float(9,2) unsigned NULL AFTER `actionId`,' . - 'CHANGE `repayment` `repayment` float(9,2) unsigned NULL COMMENT \'vratka\' AFTER `payment`;'); - } -} diff --git a/migrations/2019/Version20190321140458.php b/migrations/2019/Version20190321140458.php deleted file mode 100644 index fe0024ede..000000000 --- a/migrations/2019/Version20190321140458.php +++ /dev/null @@ -1,33 +0,0 @@ -addSql(<<<'SQL' - CREATE TABLE pa_group_unit ( - id INT NOT NULL AUTO_INCREMENT, - unit_id INT NOT NULL, - group_id INT UNSIGNED NOT NULL, - INDEX IDX_FB5A0CD6FE54D947 (group_id), - PRIMARY KEY (id) - ) - DEFAULT CHARACTER SET UTF8 COLLATE UTF8_unicode_ci ENGINE = InnoDB -SQL); - $this->addSql('ALTER TABLE pa_group_unit ADD CONSTRAINT FK_FB5A0CD6FE54D947 FOREIGN KEY (group_id) REFERENCES pa_group (id)'); - $this->addSql('INSERT INTO pa_group_unit (unit_id, group_id) SELECT unitId, id FROM pa_group'); - $this->addSql('ALTER TABLE pa_group DROP unitId'); - } - - public function down(Schema $schema): void - { - // There is no going back! :D - } -} diff --git a/migrations/2019/Version20190401103007.php b/migrations/2019/Version20190401103007.php deleted file mode 100644 index 698d3053b..000000000 --- a/migrations/2019/Version20190401103007.php +++ /dev/null @@ -1,21 +0,0 @@ -addSql('ALTER TABLE `tc_commands` ADD `unit` varchar(64) NOT NULL;'); - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE `tc_commands` DROP `unit`;'); - } -} diff --git a/migrations/2019/Version20190407182157.php b/migrations/2019/Version20190407182157.php deleted file mode 100644 index ab02fd580..000000000 --- a/migrations/2019/Version20190407182157.php +++ /dev/null @@ -1,33 +0,0 @@ -addSql('ALTER TABLE ac_object DROP FOREIGN KEY ac_object_ibfk_2'); - $this->addSql('DROP TABLE ac_object_type'); - } - - public function down(Schema $schema): void - { - $this->addSql( - 'CREATE TABLE `ac_object_type` (' - . '`id` varchar(20) COLLATE utf8_czech_ci NOT NULL,' - . ' PRIMARY KEY (`id`) ' - . ') ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;', - ); - - $this->addSql("INSERT INTO `ac_object_type` (`id`) VALUES ('camp'), ('general'), ('unit')"); - $this->addSql( - 'ALTER TABLE hskauting.ac_object ADD CONSTRAINT `ac_object_ibfk_2` ' - . 'FOREIGN KEY (`type`) REFERENCES `ac_object_type` (`id`) ON UPDATE CASCADE', - ); - } -} diff --git a/migrations/2019/Version20190409104015.php b/migrations/2019/Version20190409104015.php deleted file mode 100644 index 021fe011e..000000000 --- a/migrations/2019/Version20190409104015.php +++ /dev/null @@ -1,58 +0,0 @@ -addSql( - 'CREATE TABLE `ac_chits_item` (' . - '`_id` int(10) unsigned NOT NULL AUTO_INCREMENT,' . - '`id` int(10) unsigned NOT NULL,' . - '`chit_id` bigint(20) unsigned NOT NULL,' . - '`price` float(9,2) NOT NULL,' . - '`priceText` varchar(100) COLLATE utf8_czech_ci NOT NULL,' . - '`category` int(10) unsigned NOT NULL,' . - '`category_operation_type` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL COMMENT \'(DC2Type:string_enum)\',' . - 'PRIMARY KEY (`_id`),' . - 'KEY `chit_id` (`chit_id`),' . - 'CONSTRAINT `ac_chits_item_ibfk_2` FOREIGN KEY (`chit_id`) REFERENCES `ac_chits` (`id`) ON DELETE CASCADE ON UPDATE CASCADE' . - ') ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;', - ); - - // move current data - $this->addSql( - 'INSERT INTO `ac_chits_item` (`id`,`chit_id`, `price`, `priceText`, `category`, `category_operation_type`)' . - 'SELECT 1, `id`, `price`, `priceText`, `category`, `category_operation_type`' . - 'FROM `ac_chits`', - ); - - // temporary rename of origin column and default values - $this->addSql( - 'ALTER TABLE `ac_chits`' . - 'CHANGE `price` `x_price` float(9,2) NULL AFTER `purpose`,' . - 'CHANGE `priceText` `x_priceText` varchar(100) COLLATE \'utf8_czech_ci\' NULL AFTER `x_price`,' . - 'CHANGE `category` `x_category` int(10) unsigned NULL AFTER `x_priceText`,' . - 'CHANGE `category_operation_type` `x_category_operation_type` varchar(255) COLLATE \'utf8_czech_ci\' NULL COMMENT \'(DC2Type:string_enum)\' AFTER `lock`;', - ); - } - - public function down(Schema $schema): void - { - $this->addSql( - 'ALTER TABLE `ac_chits`' . - 'CHANGE `x_price` `price` float(9,2) NOT NULL AFTER `purpose`,' . - 'CHANGE `x_priceText` `priceText` varchar(100) COLLATE \'utf8_czech_ci\' NOT NULL AFTER `price`,' . - 'CHANGE `x_category` `category` int(10) unsigned NOT NULL AFTER `priceText`,' . - 'CHANGE `x_category_operation_type` `category_operation_type` varchar(255) COLLATE \'utf8_czech_ci\' NULL COMMENT \'(DC2Type:string_enum)\' AFTER `lock`;', - ); - - $this->addSql('DROP TABLE IF EXISTS `ac_chits_item`;'); - } -} diff --git a/migrations/2019/Version20190420205527.php b/migrations/2019/Version20190420205527.php deleted file mode 100644 index 7b66d0872..000000000 --- a/migrations/2019/Version20190420205527.php +++ /dev/null @@ -1,35 +0,0 @@ -addSql('ALTER TABLE pa_group DROP FOREIGN KEY pa_group_ibfk_1'); - $this->addSql('DROP TABLE pa_group_type'); - } - - public function down(Schema $schema): void - { - $this->addSql(<<<'SQL' - CREATE TABLE `pa_group_type` ( - `id` varchar(20) COLLATE utf8_czech_ci NOT NULL, - PRIMARY KEY (`id`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci - SQL); - - $this->addSql("INSERT INTO `pa_group_type` (`id`) VALUES ('camp'), ('registration')"); - - $this->addSql(<<<'SQL' - ALTER TABLE pa_group - ADD CONSTRAINT `pa_group_ibfk_1` FOREIGN KEY (`groupType`) - REFERENCES `pa_group_type` (`id`) ON UPDATE CASCADE - SQL); - } -} diff --git a/migrations/2019/Version20190505084443.php b/migrations/2019/Version20190505084443.php deleted file mode 100644 index eb8119fa4..000000000 --- a/migrations/2019/Version20190505084443.php +++ /dev/null @@ -1,32 +0,0 @@ -addSql('INSERT INTO `ac_chitsCategory` (`id`, `label`, `short`, `type`, `virtual`, `orderby`, `deleted`) VALUES ' . - '(20, \'Vratka úč. poplatku\', \'vr\', \'out\', 1, 100, 0);'); - $this->addSql('INSERT INTO `ac_chitsCategory_object` (`categoryId`, `objectTypeId`) VALUES (20, \'general\'), (20, \'camp\');'); - $this->addSql(<<<'EOT' -UPDATE `ac_chits_item` SET -`price` = (-1 * `price`), -`priceText` = REPLACE(priceText, '-', ' '), -`category` = '20', -`category_operation_type` = 'out' -WHERE `category_operation_type` = 'in' and price < 0 -EOT); - } - - public function down(Schema $schema): void - { - $this->addSql('DELETE FROM `ac_chitsCategory_object` WHERE `categoryId` = \'20\''); - $this->addSql('DELETE FROM `ac_chitsCategory` WHERE `id` = \'20\''); - } -} diff --git a/migrations/2019/Version20190505123412.php b/migrations/2019/Version20190505123412.php deleted file mode 100644 index 0acf50a99..000000000 --- a/migrations/2019/Version20190505123412.php +++ /dev/null @@ -1,21 +0,0 @@ -addSql('ALTER TABLE `ac_chits_item` ADD `purpose` varchar(120) NOT NULL AFTER `chit_id`;'); - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE `ac_chits_item` DROP `purpose`;'); - } -} diff --git a/migrations/2019/Version20190505124219.php b/migrations/2019/Version20190505124219.php deleted file mode 100644 index 55b2e00ed..000000000 --- a/migrations/2019/Version20190505124219.php +++ /dev/null @@ -1,26 +0,0 @@ -connection->fetchAll('SELECT id, purpose FROM `ac_chits`'); - foreach ($chits as $chit) { - $this->addSql('UPDATE `ac_chits_item` SET `purpose` = :purpose WHERE `chit_id` = :id;', $chit); - } - - $this->addSql('ALTER TABLE `ac_chits` CHANGE `purpose` `x_purpose` varchar(120) NULL AFTER `recipient`;'); - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE `ac_chits` CHANGE `x_purpose` `purpose` varchar(120) NOT NULL AFTER `recipient`;'); - } -} diff --git a/migrations/2019/Version20190510135230.php b/migrations/2019/Version20190510135230.php deleted file mode 100644 index 01178a114..000000000 --- a/migrations/2019/Version20190510135230.php +++ /dev/null @@ -1,36 +0,0 @@ -addSql(<<<'SQL' - CREATE TABLE tc_vehicle_roadworthy_scan ( - id INT AUTO_INCREMENT NOT NULL, - vehicle_id INT UNSIGNED DEFAULT NULL, - file_path VARCHAR(255) NOT NULL, - INDEX IDX_270D2917545317D1 (vehicle_id), - PRIMARY KEY(id) - ) DEFAULT CHARACTER SET UTF8 COLLATE UTF8_unicode_ci ENGINE = InnoDB - SQL); - - $this->addSql(<<<'SQL' - ALTER TABLE tc_vehicle_roadworthy_scan - ADD CONSTRAINT FK_270D2917545317D1 - FOREIGN KEY (vehicle_id) REFERENCES tc_vehicle (id) - SQL); - $this->addSql('DROP INDEX unit_id ON tc_vehicle'); - } - - public function down(Schema $schema): void - { - $this->addSql('DROP TABLE tc_vehicle_roadworthy_scan'); - } -} diff --git a/migrations/2019/Version20190521135746.php b/migrations/2019/Version20190521135746.php deleted file mode 100644 index 288120903..000000000 --- a/migrations/2019/Version20190521135746.php +++ /dev/null @@ -1,26 +0,0 @@ -addSql('ALTER TABLE ac_chits_item DROP id, CHANGE _id id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT'); - } - - public function down(Schema $schema): void - { - $this->addSql(<<<'SQL' - ALTER TABLE ac_chits_item - CHANGE COLUMN id _id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, - ADD id INT(10) UNSIGNED NOT NULL - SQL); - $this->addSql('UPDATE ac_chits_item SET id = 1'); - } -} diff --git a/migrations/2019/Version20190521142825.php b/migrations/2019/Version20190521142825.php deleted file mode 100644 index 00d74ef61..000000000 --- a/migrations/2019/Version20190521142825.php +++ /dev/null @@ -1,45 +0,0 @@ -addSql(<<<'SQL' - CREATE TABLE ac_chit_to_item ( - chit_id BIGINT(10) UNSIGNED NOT NULL, - item_id INT UNSIGNED NOT NULL, - INDEX IDX_2EA9AB792AEA3AE4 (chit_id), - UNIQUE INDEX UNIQ_2EA9AB79126F525E (item_id), - PRIMARY KEY(chit_id, item_id) - ) DEFAULT CHARACTER SET UTF8 COLLATE UTF8_unicode_ci ENGINE = InnoDB - SQL); - $this->addSql('ALTER TABLE ac_chit_to_item ADD CONSTRAINT FK_2EA9AB792AEA3AE4 FOREIGN KEY (chit_id) REFERENCES ac_chits (id) ON DELETE CASCADE'); - $this->addSql('ALTER TABLE ac_chit_to_item ADD CONSTRAINT FK_2EA9AB79126F525E FOREIGN KEY (item_id) REFERENCES ac_chits_item (id) ON DELETE CASCADE'); - - $this->addSql('INSERT INTO ac_chit_to_item (chit_id, item_id) SELECT chit_id, id FROM ac_chits_item'); - - $this->addSql('ALTER TABLE ac_chits_item DROP FOREIGN KEY ac_chits_item_ibfk_2'); - $this->addSql('DROP INDEX chit_id ON ac_chits_item'); - $this->addSql('ALTER TABLE ac_chits_item DROP chit_id'); - } - - public function down(Schema $schema): void - { - $this->addSql('DROP TABLE ac_chit_to_item'); - $this->addSql('ALTER TABLE ac_chits_item ADD chit_id BIGINT UNSIGNED NOT NULL'); - $this->addSql(<<<'SQL' - UPDATE ac_chits_item i - JOIN ac_chit_to_item jt ON jt.item_id = i.id - SET i.chit_id = jt.chit_id - SQL); - $this->addSql('ALTER TABLE ac_chits_item ADD CONSTRAINT ac_chits_item_ibfk_2 FOREIGN KEY (chit_id) REFERENCES ac_chits (id) ON UPDATE CASCADE ON DELETE CASCADE'); - $this->addSql('CREATE INDEX chit_id ON ac_chits_item (chit_id)'); - } -} diff --git a/migrations/2019/Version20190529204201.php b/migrations/2019/Version20190529204201.php deleted file mode 100644 index 009e65ec5..000000000 --- a/migrations/2019/Version20190529204201.php +++ /dev/null @@ -1,28 +0,0 @@ -addSql(<<<'SQL' - ALTER TABLE ac_camp_participants - CHANGE actionId event_id INT UNSIGNED, - ADD event_type VARCHAR(7) COLLATE utf8_czech_ci NOT NULL COMMENT '(DC2Type:string_enum)' - SQL); - $this->addSql('UPDATE ac_camp_participants SET event_type = \'camp\''); - } - - public function down(Schema $schema): void - { - $this->addSql( - 'ALTER TABLE ac_camp_participants CHANGE event_id actionId INT UNSIGNED NOT NULL, DROP event_type', - ); - } -} diff --git a/migrations/2019/Version20190601191610.php b/migrations/2019/Version20190601191610.php deleted file mode 100644 index e022a6040..000000000 --- a/migrations/2019/Version20190601191610.php +++ /dev/null @@ -1,29 +0,0 @@ -addSql(<<<'SQL' - CREATE OR REPLACE VIEW `ac_chitsView` AS - SELECT `ch`.`id` AS `chit_id`,`ch`.`eventId` AS `eventId`,`ch`.`recipient` AS `recipient`,`ch`.`num` AS `num`,`ch`.`date` AS `date`, - `ch`.`lock` AS `lock`,`ch`.`payment_method` AS `payment_method`,`ci`.`id` AS `id`,`ci`.`purpose` AS `purpose`, - `ci`.`price` AS `price`,`ci`.`priceText` AS `priceText`,`ci`.`category` AS `category`,`ci`.`category_operation_type` AS `category_operation_type` - FROM `ac_chits` `ch` - LEFT JOIN `ac_chit_to_item` `cti` ON `ch`.`id` = `cti`.`chit_id` - LEFT JOIN `ac_chits_item` `ci` ON `cti`.`item_id` = `ci`.`id`; - SQL); - } - - public function down(Schema $schema): void - { - $this->addSql('DROP VIEW `ac_chitsView`'); - } -} diff --git a/migrations/2019/Version20190604193449.php b/migrations/2019/Version20190604193449.php deleted file mode 100644 index 1348c5791..000000000 --- a/migrations/2019/Version20190604193449.php +++ /dev/null @@ -1,24 +0,0 @@ -addSql('ALTER TABLE `ac_camp_participants` RENAME TO `ac_participants`;'); - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE `ac_participants` RENAME TO `ac_camp_participants`;'); - } -} diff --git a/migrations/2019/Version20190604213432.php b/migrations/2019/Version20190604213432.php deleted file mode 100644 index fccc2f419..000000000 --- a/migrations/2019/Version20190604213432.php +++ /dev/null @@ -1,44 +0,0 @@ -addSql(<<<'SQL' - ALTER TABLE `ac_participants` - ADD `id` varchar(36) NOT NULL FIRST, - CHANGE `participantId` `participantId` int(10) unsigned NOT NULL COMMENT 'ID' AFTER `id`; - SQL); - } - - public function postUp(Schema $schema): void - { - parent::postUp($schema); - - $data = $this->connection->fetchAll('SELECT * FROM `ac_participants`'); - foreach ($data as $row) { - $this->connection->update( - 'ac_participants', - ['id' => PaymentId::generate()->toString()], - ['participantId' => $row['participantId'], 'event_type' => $row['event_type'], 'event_id' => $row['event_id']], - ); - } - } - - public function down(Schema $schema): void - { - $this->addSql(<<<'SQL' - ALTER TABLE `ac_participants` - DROP `id`, - CHANGE `participantId` `participantId` int(10) unsigned NOT NULL COMMENT 'ID' AUTO_INCREMENT FIRST; - SQL); - } -} diff --git a/migrations/2019/Version20190606072844.php b/migrations/2019/Version20190606072844.php deleted file mode 100644 index 2d49d5fa2..000000000 --- a/migrations/2019/Version20190606072844.php +++ /dev/null @@ -1,32 +0,0 @@ -addSql(<<<'SQL' - ALTER TABLE `ac_participants` - ADD PRIMARY KEY `id` (`id`), - DROP INDEX `PRIMARY`; - SQL); - - $this->addSql('ALTER TABLE `ac_participants` ADD UNIQUE `participantId_event_type` (`participantId`, `event_type`);'); - } - - public function down(Schema $schema): void - { - $this->addSql(<<<'SQL' - ALTER TABLE `ac_participants` - ADD PRIMARY KEY `participantId` (`participantId`), - DROP INDEX `PRIMARY`; - SQL); - $this->addSql('ALTER TABLE `ac_participants` DROP INDEX `participantId_event_type`;'); - } -} diff --git a/migrations/2019/Version20190617091058.php b/migrations/2019/Version20190617091058.php deleted file mode 100644 index cc3db934e..000000000 --- a/migrations/2019/Version20190617091058.php +++ /dev/null @@ -1,33 +0,0 @@ -addSql('ALTER TABLE ac_chit_to_item DROP FOREIGN KEY FK_2EA9AB79126F525E'); - $this->addSql('ALTER TABLE ac_chit_to_item DROP FOREIGN KEY FK_2EA9AB792AEA3AE4'); - - $this->addSql('DELETE i FROM `ac_chits_item` i LEFT JOIN ac_chit_to_item ci ON i.id = ci.item_id WHERE ci.chit_id IS NULL'); - - $this->addSql('ALTER TABLE ac_chit_to_item CHANGE chit_id chit_id BIGINT UNSIGNED NOT NULL'); - - $this->addSql('ALTER TABLE ac_chit_to_item ADD CONSTRAINT FK_2EA9AB79126F525E FOREIGN KEY (item_id) REFERENCES ac_chits_item (id) ON DELETE CASCADE'); - $this->addSql('ALTER TABLE ac_chit_to_item ADD CONSTRAINT FK_2EA9AB792AEA3AE4 FOREIGN KEY (chit_id) REFERENCES ac_chits (id) ON DELETE CASCADE'); - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE ac_chit_to_item DROP FOREIGN KEY FK_2EA9AB792AEA3AE4'); - $this->addSql('ALTER TABLE ac_chit_to_item DROP FOREIGN KEY FK_2EA9AB79126F525E'); - $this->addSql('ALTER TABLE ac_chit_to_item CHANGE chit_id chit_id BIGINT UNSIGNED NOT NULL'); - $this->addSql('ALTER TABLE ac_chit_to_item ADD CONSTRAINT FK_2EA9AB792AEA3AE4 FOREIGN KEY (chit_id) REFERENCES ac_chits (id)'); - $this->addSql('ALTER TABLE ac_chit_to_item ADD CONSTRAINT FK_2EA9AB79126F525E FOREIGN KEY (item_id) REFERENCES ac_chits_item (id)'); - } -} diff --git a/migrations/2019/Version20190824160013.php b/migrations/2019/Version20190824160013.php deleted file mode 100644 index 15ce8a042..000000000 --- a/migrations/2019/Version20190824160013.php +++ /dev/null @@ -1,37 +0,0 @@ -addSql(<<<'SQL' - ALTER TABLE tc_vehicle - CHANGE unit_id unit_id INT UNSIGNED NOT NULL, - CHANGE type type VARCHAR(64) NOT NULL, - CHANGE registration registration VARCHAR(64) NOT NULL, - CHANGE consumption consumption DOUBLE PRECISION UNSIGNED NOT NULL, - CHANGE note note VARCHAR(64) NOT NULL, - CHANGE archived archived TINYINT(1) DEFAULT '0' NOT NULL - SQL); - } - - public function down(Schema $schema): void - { - $this->addSql(<<<'SQL' - ALTER TABLE tc_vehicle - CHANGE unit_id unit_id INT UNSIGNED NOT NULL COMMENT 'ID jednotky ze SkautISu ', - CHANGE type type VARCHAR(64) NOT NULL COLLATE utf8_czech_ci COMMENT 'značka auta ', - CHANGE registration registration VARCHAR(64) NOT NULL COLLATE utf8_czech_ci, - CHANGE consumption consumption DOUBLE PRECISION UNSIGNED NOT NULL COMMENT 'spotřeba', - CHANGE note note VARCHAR(64) DEFAULT '' NOT NULL COLLATE utf8_czech_ci COMMENT 'volitelná poznámka ', - CHANGE archived archived TINYINT(1) DEFAULT '0' NOT NULL - SQL); - } -} diff --git a/migrations/2019/Version20190824171748.php b/migrations/2019/Version20190824171748.php deleted file mode 100644 index bb2bc3685..000000000 --- a/migrations/2019/Version20190824171748.php +++ /dev/null @@ -1,53 +0,0 @@ -addSql('ALTER TABLE tc_travels DROP FOREIGN KEY tc_travels_ibfk_1'); - $this->addSql('ALTER TABLE tc_travels DROP FOREIGN KEY tc_travels_ibfk_3'); - $this->addSql('DROP INDEX type ON tc_travels'); - $this->addSql(<<<'SQL' - ALTER TABLE tc_travels - CHANGE id id INT UNSIGNED NOT NULL, - CHANGE start_date start_date DATE NOT NULL COMMENT '(DC2Type:chronos_date)', - CHANGE distance distance DOUBLE PRECISION UNSIGNED DEFAULT NULL, - CHANGE has_fuel has_fuel SMALLINT NOT NULL - SQL); - $this->addSql('ALTER TABLE tc_travels ADD CONSTRAINT FK_F53E53633E1689A FOREIGN KEY (command_id) REFERENCES tc_commands (id)'); - $this->addSql('ALTER TABLE tc_travels RENAME INDEX tc_id TO IDX_F53E53633E1689A'); - $this->addSql(<<<'SQL' - ALTER TABLE tc_travelTypes - CHANGE hasFuel hasFuel TINYINT(1) DEFAULT '0' NOT NULL, - CHANGE `order` `order` SMALLINT DEFAULT 10 NOT NULL - SQL); - } - - public function down(Schema $schema): void - { - $this->addSql(<<<'SQL' - ALTER TABLE tc_travelTypes - CHANGE hasFuel hasFuel TINYINT(1) DEFAULT '0' NOT NULL, - CHANGE `order` `order` TINYINT(1) DEFAULT '10' NOT NULL - SQL); - $this->addSql('ALTER TABLE tc_travels DROP FOREIGN KEY FK_F53E53633E1689A'); - $this->addSql(<<<'SQL' - ALTER TABLE tc_travels - CHANGE id id BIGINT UNSIGNED NOT NULL, - CHANGE start_date start_date DATE NOT NULL, - CHANGE has_fuel has_fuel TINYINT(1) NOT NULL, - CHANGE distance distance DOUBLE PRECISION UNSIGNED NOT NULL - SQL); - $this->addSql('ALTER TABLE tc_travels ADD CONSTRAINT tc_travels_ibfk_1 FOREIGN KEY (command_id) REFERENCES tc_commands (id) ON UPDATE CASCADE ON DELETE CASCADE'); - $this->addSql('ALTER TABLE tc_travels ADD CONSTRAINT tc_travels_ibfk_3 FOREIGN KEY (type) REFERENCES tc_travelTypes (type) ON UPDATE CASCADE'); - $this->addSql('CREATE INDEX type ON tc_travels (type)'); - $this->addSql('ALTER TABLE tc_travels RENAME INDEX idx_f53e53633e1689a TO tc_id'); - } -} diff --git a/migrations/2019/Version20190824173018.php b/migrations/2019/Version20190824173018.php deleted file mode 100644 index fe5277894..000000000 --- a/migrations/2019/Version20190824173018.php +++ /dev/null @@ -1,65 +0,0 @@ -addSql('ALTER TABLE tc_commands DROP FOREIGN KEY tc_commands_ibfk_1'); - $this->addSql('ALTER TABLE tc_commands DROP FOREIGN KEY tc_commands_ibfk_2'); - $this->addSql('DROP INDEX contract_id ON tc_commands'); - $this->addSql(<<<'SQL' - ALTER TABLE tc_commands - CHANGE fuel_price fuel_price NUMERIC(8, 2) NOT NULL COMMENT '(DC2Type:money)', - CHANGE amortization amortization NUMERIC(8, 2) NOT NULL COMMENT '(DC2Type:money)', - CHANGE closed closed DATETIME DEFAULT NULL COMMENT '(DC2Type:datetime_immutable)' - SQL); - - $this->addSql('ALTER TABLE tc_commands ADD CONSTRAINT FK_4D5B6D0C545317D1 FOREIGN KEY (vehicle_id) REFERENCES tc_vehicle (id)'); - $this->addSql('ALTER TABLE tc_commands RENAME INDEX vehicle_id TO IDX_4D5B6D0C545317D1'); - $this->addSql('ALTER TABLE tc_command_types DROP FOREIGN KEY tc_command_types_ibfk_5'); - $this->addSql('ALTER TABLE tc_command_types DROP FOREIGN KEY tc_command_types_ibfk_6'); - $this->addSql('DROP INDEX unique_relationship ON tc_command_types'); - $this->addSql(<<<'SQL' - ALTER TABLE tc_command_types - CHANGE typeId typeId VARCHAR(5) NOT NULL, ADD PRIMARY KEY (commandId, typeId) - SQL); - $this->addSql('ALTER TABLE tc_command_types ADD CONSTRAINT FK_DC7EBB8F36C645 FOREIGN KEY (commandId) REFERENCES tc_commands (id)'); - $this->addSql('ALTER TABLE tc_command_types ADD CONSTRAINT FK_DC7EBB9BF49490 FOREIGN KEY (typeId) REFERENCES tc_travelTypes (type)'); - $this->addSql('ALTER TABLE tc_command_types RENAME INDEX commandid TO IDX_DC7EBB8F36C645'); - $this->addSql('ALTER TABLE tc_command_types RENAME INDEX typeid TO IDX_DC7EBB9BF49490'); - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE tc_command_types DROP INDEX `PRIMARY`, ADD UNIQUE INDEX unique_relationship (commandId, typeId)'); - $this->addSql('ALTER TABLE tc_command_types DROP FOREIGN KEY FK_DC7EBB8F36C645'); - $this->addSql('ALTER TABLE tc_command_types DROP FOREIGN KEY FK_DC7EBB9BF49490'); - $this->addSql(<<<'SQL' - ALTER TABLE tc_command_types - CHANGE typeId typeId VARCHAR(5) DEFAULT 'auv' NOT NULL COLLATE utf8_czech_ci - SQL); - $this->addSql('ALTER TABLE tc_command_types ADD CONSTRAINT tc_command_types_ibfk_5 FOREIGN KEY (commandId) REFERENCES tc_commands (id) ON UPDATE CASCADE ON DELETE CASCADE'); - $this->addSql('ALTER TABLE tc_command_types ADD CONSTRAINT tc_command_types_ibfk_6 FOREIGN KEY (typeId) REFERENCES tc_travelTypes (type) ON UPDATE CASCADE ON DELETE CASCADE'); - $this->addSql('ALTER TABLE tc_command_types RENAME INDEX idx_dc7ebb9bf49490 TO typeId'); - $this->addSql('ALTER TABLE tc_command_types RENAME INDEX idx_dc7ebb8f36c645 TO commandId'); - $this->addSql('ALTER TABLE tc_commands DROP FOREIGN KEY FK_4D5B6D0C545317D1'); - $this->addSql(<<<'SQL' - ALTER TABLE tc_commands - CHANGE fuel_price fuel_price DOUBLE PRECISION NOT NULL, - CHANGE amortization amortization DOUBLE PRECISION NOT NULL, - CHANGE closed closed DATETIME DEFAULT NULL, - CHANGE unit unit VARCHAR(64) NOT NULL COLLATE utf8_czech_ci - SQL); - $this->addSql('ALTER TABLE tc_commands ADD CONSTRAINT tc_commands_ibfk_1 FOREIGN KEY (contract_id) REFERENCES tc_contracts (id) ON UPDATE CASCADE'); - $this->addSql('ALTER TABLE tc_commands ADD CONSTRAINT tc_commands_ibfk_2 FOREIGN KEY (vehicle_id) REFERENCES tc_vehicle (id) ON UPDATE CASCADE'); - $this->addSql('CREATE INDEX contract_id ON tc_commands (contract_id)'); - $this->addSql('ALTER TABLE tc_commands RENAME INDEX idx_4d5b6d0c545317d1 TO vehicle_id'); - } -} diff --git a/migrations/2019/Version20190825050311.php b/migrations/2019/Version20190825050311.php deleted file mode 100644 index 6285b20f7..000000000 --- a/migrations/2019/Version20190825050311.php +++ /dev/null @@ -1,33 +0,0 @@ -addSql('DROP INDEX unit_id ON tc_contracts'); - $this->addSql(<<<'SQL' - ALTER TABLE tc_contracts - CHANGE unit_id unit_id INT UNSIGNED NOT NULL, - CHANGE driver_birthday driver_birthday DATE DEFAULT NULL, - CHANGE template template SMALLINT NOT NULL COMMENT '1-old, 2-podle NOZ' - SQL); - } - - public function down(Schema $schema): void - { - $this->addSql(<<<'SQL' - ALTER TABLE tc_contracts - CHANGE unit_id unit_id INT UNSIGNED NOT NULL COMMENT 'SkautIS ID jednotky', - CHANGE template template SMALLINT NOT NULL, - CHANGE driver_birthday driver_birthday DATE NOT NULL - SQL); - $this->addSql('CREATE INDEX unit_id ON tc_contracts (unit_id)'); - } -} diff --git a/migrations/2019/Version20190825051352.php b/migrations/2019/Version20190825051352.php deleted file mode 100644 index d00a1695d..000000000 --- a/migrations/2019/Version20190825051352.php +++ /dev/null @@ -1,49 +0,0 @@ -addSql('ALTER TABLE pa_payment DROP FOREIGN KEY pa_payment_ibfk_1'); - $this->addSql('DROP TABLE pa_payment_state'); - $this->addSql('DROP INDEX groupId ON pa_payment'); - $this->addSql('DROP INDEX state ON pa_payment'); - $this->addSql(<<<'SQL' - ALTER TABLE pa_payment - CHANGE state state VARCHAR(20) NOT NULL COMMENT '(DC2Type:string_enum)', - CHANGE maturity maturity DATE NOT NULL COMMENT '(DC2Type:chronos_date)', - CHANGE vs vs VARCHAR(10) DEFAULT NULL COMMENT '(DC2Type:variable_symbol)', - CHANGE transactionId transactionId INT UNSIGNED DEFAULT NULL, - CHANGE dateClosed dateClosed DATETIME DEFAULT NULL COMMENT '(DC2Type:datetime_immutable)' - SQL); - } - - public function down(Schema $schema): void - { - $this->addSql(<<<'SQL' - CREATE TABLE pa_payment_state ( - id VARCHAR(20) NOT NULL COLLATE utf8_czech_ci, - label VARCHAR(64) NOT NULL COLLATE utf8_czech_ci, - orderby TINYINT(1) NOT NULL, PRIMARY KEY(id) - ) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB COMMENT = '' - SQL); - $this->addSql(<<<'SQL' - ALTER TABLE pa_payment - CHANGE maturity maturity DATE NOT NULL, - CHANGE vs vs VARCHAR(10) DEFAULT NULL COLLATE utf8_czech_ci, - CHANGE dateClosed dateClosed DATETIME DEFAULT NULL, - CHANGE state state VARCHAR(20) NOT NULL COLLATE utf8_czech_ci, - CHANGE transactionId transactionId BIGINT UNSIGNED DEFAULT NULL - SQL); - $this->addSql('ALTER TABLE pa_payment ADD CONSTRAINT pa_payment_ibfk_1 FOREIGN KEY (state) REFERENCES pa_payment_state (id) ON UPDATE CASCADE'); - $this->addSql('CREATE INDEX groupId ON pa_payment (groupId)'); - $this->addSql('CREATE INDEX state ON pa_payment (state)'); - } -} diff --git a/migrations/2019/Version20190825053508.php b/migrations/2019/Version20190825053508.php deleted file mode 100644 index 3a259c689..000000000 --- a/migrations/2019/Version20190825053508.php +++ /dev/null @@ -1,62 +0,0 @@ -addSql('ALTER TABLE pa_group DROP FOREIGN KEY pa_group_ibfk_4'); - $this->addSql('DROP TABLE pa_group_state'); - $this->addSql('ALTER TABLE pa_group DROP FOREIGN KEY fk_bank_account_id'); - $this->addSql('ALTER TABLE pa_group DROP FOREIGN KEY pa_group_ibfk_6'); - $this->addSql('DROP INDEX smtp_id ON pa_group'); - $this->addSql('DROP INDEX groupType ON pa_group'); - $this->addSql('DROP INDEX state ON pa_group'); - $this->addSql('DROP INDEX fk_bank_account_id ON pa_group'); - $this->addSql('DROP INDEX objectId ON pa_group'); - $this->addSql(<<<'SQL' - ALTER TABLE pa_group - CHANGE groupType groupType VARCHAR(20) DEFAULT NULL COMMENT 'typ entity(DC2Type:string_enum)', - CHANGE amount amount DOUBLE PRECISION DEFAULT NULL, - CHANGE maturity maturity DATE DEFAULT NULL COMMENT '(DC2Type:chronos_date)', - CHANGE nextVs nextVs VARCHAR(255) DEFAULT NULL COMMENT '(DC2Type:variable_symbol)', - CHANGE created_at created_at DATETIME DEFAULT NULL COMMENT '(DC2Type:datetime_immutable)', - CHANGE last_pairing last_pairing DATETIME DEFAULT NULL COMMENT '(DC2Type:datetime_immutable)' - SQL); - $this->addSql('ALTER TABLE pa_group_unit CHANGE group_id group_id INT UNSIGNED DEFAULT NULL'); - } - - public function down(Schema $schema): void - { - $this->addSql(<<<'SQL' - CREATE TABLE pa_group_state ( - id VARCHAR(20) NOT NULL COLLATE utf8_czech_ci, - label VARCHAR(64) NOT NULL COLLATE utf8_czech_ci, - PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB COMMENT = '' - SQL); - $this->addSql(<<<'SQL' - ALTER TABLE pa_group - CHANGE groupType groupType VARCHAR(20) DEFAULT NULL COLLATE utf8_czech_ci COMMENT 'typ entity', - CHANGE amount amount DOUBLE PRECISION UNSIGNED DEFAULT NULL, - CHANGE maturity maturity DATE DEFAULT NULL, - CHANGE nextVs nextVs INT UNSIGNED DEFAULT NULL, - CHANGE created_at created_at DATETIME DEFAULT NULL, - CHANGE last_pairing last_pairing DATETIME DEFAULT NULL - SQL); - $this->addSql('ALTER TABLE pa_group ADD CONSTRAINT fk_bank_account_id FOREIGN KEY (bank_account_id) REFERENCES pa_bank_account (id)'); - $this->addSql('ALTER TABLE pa_group ADD CONSTRAINT pa_group_ibfk_4 FOREIGN KEY (state) REFERENCES pa_group_state (id) ON UPDATE CASCADE'); - $this->addSql('ALTER TABLE pa_group ADD CONSTRAINT pa_group_ibfk_6 FOREIGN KEY (smtp_id) REFERENCES pa_smtp (id) ON UPDATE CASCADE ON DELETE SET NULL'); - $this->addSql('CREATE INDEX smtp_id ON pa_group (smtp_id)'); - $this->addSql('CREATE INDEX groupType ON pa_group (groupType)'); - $this->addSql('CREATE INDEX state ON pa_group (state)'); - $this->addSql('CREATE INDEX fk_bank_account_id ON pa_group (bank_account_id)'); - $this->addSql('CREATE INDEX objectId ON pa_group (sisId)'); - $this->addSql('ALTER TABLE pa_group_unit CHANGE group_id group_id INT UNSIGNED NOT NULL'); - } -} diff --git a/migrations/2019/Version20190825063512.php b/migrations/2019/Version20190825063512.php deleted file mode 100644 index d9b3f62fd..000000000 --- a/migrations/2019/Version20190825063512.php +++ /dev/null @@ -1,31 +0,0 @@ -addSql('DROP INDEX unitId ON pa_smtp'); - $this->addSql(<<<'SQL' - ALTER TABLE pa_smtp - CHANGE secure secure VARCHAR(64) NOT NULL COMMENT '(DC2Type:string_enum)', - CHANGE created created DATETIME NOT NULL COMMENT '(DC2Type:datetime_immutable)' - SQL); - } - - public function down(Schema $schema): void - { - $this->addSql(<<<'SQL' - ALTER TABLE pa_smtp - CHANGE secure secure VARCHAR(64) NOT NULL COLLATE utf8_czech_ci, - CHANGE created created DATETIME NOT NULL - SQL); - $this->addSql('CREATE INDEX unitId ON pa_smtp (unitId)'); - } -} diff --git a/migrations/2019/Version20190825132512.php b/migrations/2019/Version20190825132512.php deleted file mode 100644 index 4677e97f2..000000000 --- a/migrations/2019/Version20190825132512.php +++ /dev/null @@ -1,30 +0,0 @@ -addSql(<<<'SQL' - CREATE TABLE ac_chit_scan ( - id INT AUTO_INCREMENT NOT NULL, - chit_id BIGINT(20) UNSIGNED NOT NULL, - file_path VARCHAR(255) NOT NULL COMMENT '(DC2Type:file_path)', - INDEX IDX_FEC2BFD22AEA3AE4 (chit_id), - PRIMARY KEY(id) - ) DEFAULT CHARACTER SET UTF8 COLLATE UTF8_unicode_ci ENGINE = InnoDB - SQL); - $this->addSql('ALTER TABLE ac_chit_scan ADD CONSTRAINT FK_FEC2BFD22AEA3AE4 FOREIGN KEY (chit_id) REFERENCES ac_chits (id)'); - } - - public function down(Schema $schema): void - { - $this->addSql('DROP TABLE ac_chit_scan'); - } -} diff --git a/migrations/2019/Version20191117210220.php b/migrations/2019/Version20191117210220.php deleted file mode 100644 index 740ce39d1..000000000 --- a/migrations/2019/Version20191117210220.php +++ /dev/null @@ -1,21 +0,0 @@ -addSql('ALTER TABLE `pa_payment` CHANGE `transactionId` `transactionId` varchar(64) NULL AFTER `note`;'); - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE `pa_payment` CHANGE `transactionId` `transactionId` int(10) unsigned NULL AFTER `note`;'); - } -} diff --git a/migrations/2020/Version20200101231338.php b/migrations/2020/Version20200101231338.php deleted file mode 100644 index 63fc94581..000000000 --- a/migrations/2020/Version20200101231338.php +++ /dev/null @@ -1,43 +0,0 @@ -addSql(<<<'SQL' - CREATE TABLE pa_payment_sent_emails ( - id INT UNSIGNED AUTO_INCREMENT NOT NULL, - payment_id INT DEFAULT NULL, - type VARCHAR(255) NOT NULL COMMENT '(DC2Type:string_enum)', - time DATETIME NOT NULL COMMENT '(DC2Type:datetime_immutable)', - sender_name VARCHAR(255) NOT NULL, - INDEX IDX_95359C6C4C3A3BB (payment_id), - PRIMARY KEY(id) - ) DEFAULT CHARACTER SET UTF8 COLLATE `UTF8_unicode_ci` ENGINE = InnoDB - SQL); - - $this->addSql('ALTER TABLE pa_payment_sent_emails ADD CONSTRAINT FK_95359C6C4C3A3BB FOREIGN KEY (payment_id) REFERENCES pa_payment (id)'); - $this->addSql(<<<'SQL' - INSERT INTO pa_payment_sent_emails (payment_id, type, time, sender_name) - SELECT id, 'payment_info', NOW(), 'Hospodaření' FROM pa_payment WHERE state = 'send' - SQL); - $this->addSql("UPDATE pa_payment SET state = 'preparing' WHERE state = 'send'"); - } - - public function down(Schema $schema): void - { - $this->addSql('DROP TABLE pa_payment_sent_emails'); - } -} diff --git a/migrations/2020/Version20200112173514.php b/migrations/2020/Version20200112173514.php deleted file mode 100644 index 8abc4cf7c..000000000 --- a/migrations/2020/Version20200112173514.php +++ /dev/null @@ -1,69 +0,0 @@ -addSql(<<<'SQL' - INSERT INTO `ac_chitsCategory` (`id`, `label`, `short`, `type`, `virtual`, `orderby`, `deleted`) VALUES - (21, 'Vratka úč. poplatku - dítě', 'vrc', 'out', 1, 100, 0), - (22, 'Vratka úč. poplatku - dospělý','vra', 'out', 1, 100, 0); - SQL); - $this->addSql('INSERT INTO `ac_chitsCategory_object` (`categoryId`, `objectTypeId`) VALUES (21, \'camp\'), (22, \'camp\');'); - - $ids = $this->connection->fetchAll(<<<'SQL' - SELECT i.id - FROM `ac_chits_item` i - left join ac_chit_to_item ci ON i.id = ci.item_id - left join ac_chits c ON c.id = ci.chit_id - LEFT JOIN ac_object o ON c.eventId = o.id - WHERE `category` = '20' AND type ='camp' - SQL); - - foreach ($ids as $row) { - $this->connection->update( - 'ac_chits_item', - ['category' => 21], - ['id' => $row['id']], - ); - } - - $this->addSql('DELETE FROM `ac_chitsCategory_object` WHERE `categoryId` = \'20\' AND `objectTypeId` = \'camp\';'); - } - - public function down(Schema $schema): void - { - $this->addSql('INSERT INTO `ac_chitsCategory_object` (`categoryId`, `objectTypeId`) VALUES (20, \'camp\');'); - $ids = $this->connection->fetchAll(<<<'SQL' - SELECT i.id - FROM `ac_chits_item` i - left join ac_chit_to_item ci ON i.id = ci.item_id - left join ac_chits c ON c.id = ci.chit_id - LEFT JOIN ac_object o ON c.eventId = o.id - WHERE (`category` = '21' OR `category` = '22') AND type ='camp' - SQL); - - foreach ($ids as $row) { - $this->connection->update( - 'ac_chits_item', - ['category' => 20], - ['id' => $row['id']], - ); - } - - $this->addSql('DELETE FROM `ac_chitsCategory_object` WHERE `categoryId` IN (\'21\', \'22\');'); - $this->addSql('DELETE FROM `ac_chitsCategory` WHERE `id` IN (\'21\', \'22\');'); - } -} diff --git a/migrations/2020/Version20200214111513.php b/migrations/2020/Version20200214111513.php deleted file mode 100644 index 5569608cb..000000000 --- a/migrations/2020/Version20200214111513.php +++ /dev/null @@ -1,40 +0,0 @@ -addSql(<<<'SQL' - ALTER TABLE ac_participants CHANGE isAccount isAccount VARCHAR(255) NOT NULL COMMENT '(DC2Type:string_enum)' - SQL); - $this->addSql(<<<'SQL' - ALTER TABLE ac_chitsCategory CHANGE type type VARCHAR(255) NOT NULL COMMENT '(DC2Type:string_enum)' - SQL); - $this->addSql(<<<'SQL' - ALTER TABLE ac_unit_budget_category CHANGE type type VARCHAR(255) NOT NULL COMMENT '(DC2Type:string_enum)' - SQL); - $this->addSql(<<<'SQL' - ALTER TABLE log CHANGE type type VARCHAR(255) NOT NULL COMMENT '(DC2Type:string_enum)' - SQL); - } - - public function down(Schema $schema): void - { - $this->addSql("ALTER TABLE ac_participants CHANGE isAccount isAccount ENUM('N', 'Y') COLLATE utf8_czech_ci DEFAULT 'N' COMMENT 'placeno na účet?'"); - $this->addSql("ALTER TABLE ac_chitsCategory CHANGE type type ENUM('in', 'out') COLLATE utf8_czech_ci NOT NULL DEFAULT 'out'"); - $this->addSql("ALTER TABLE ac_unit_budget_category CHANGE type type ENUM('in', 'out') COLLATE utf8_czech_ci NOT NULL DEFAULT 'out'"); - $this->addSql("ALTER TABLE log CHANGE type type ENUM('object', 'payment') CHARACTER SET utf8 COLLATE utf8_czech_ci NOT NULL"); - } -} diff --git a/migrations/2020/Version20200214114359.php b/migrations/2020/Version20200214114359.php deleted file mode 100644 index 216c05113..000000000 --- a/migrations/2020/Version20200214114359.php +++ /dev/null @@ -1,123 +0,0 @@ -addSql('DROP INDEX participantId_event_type ON ac_participants'); - $this->addSql(<<<'SQL' - ALTER TABLE ac_participants - CHANGE id id CHAR(36) NOT NULL COMMENT '(DC2Type:payment_id)', - CHANGE participantId participantId INT UNSIGNED NOT NULL, - CHANGE event_id event_id INT NOT NULL, - CHANGE payment payment NUMERIC(8, 2) NOT NULL COMMENT '(DC2Type:money)', - CHANGE repayment repayment NUMERIC(8, 2) NOT NULL COMMENT '(DC2Type:money)', - CHANGE isAccount isAccount VARCHAR(255) NOT NULL - SQL); - $this->addSql('ALTER TABLE ac_chitsCategory_object DROP FOREIGN KEY ac_chitsCategory_object_ibfk_1'); - $this->addSql('ALTER TABLE ac_chitsCategory_object CHANGE objectTypeId objectTypeId VARCHAR(20) NOT NULL COMMENT \'(DC2Type:string_enum)\', ADD PRIMARY KEY (categoryId, objectTypeId)'); - $this->addSql('ALTER TABLE ac_chitsCategory_object ADD CONSTRAINT FK_824C4F259C370B71 FOREIGN KEY (categoryId) REFERENCES ac_chitsCategory (id)'); - $this->addSql('ALTER TABLE ac_chitsCategory_object RENAME INDEX categoryid TO IDX_824C4F259C370B71'); - $this->addSql('ALTER TABLE ac_chits_item CHANGE price price DOUBLE PRECISION UNSIGNED NOT NULL'); - $this->addSql('ALTER TABLE ac_chit_scan DROP FOREIGN KEY FK_FEC2BFD22AEA3AE4'); - $this->addSql('ALTER TABLE ac_chit_scan CHANGE chit_id chit_id INT UNSIGNED DEFAULT NULL'); - - $this->addSql('DROP INDEX category ON ac_chits'); - $this->addSql('ALTER TABLE ac_chit_to_item DROP FOREIGN KEY FK_2EA9AB792AEA3AE4'); - - $this->addSql(<<<'SQL' - ALTER TABLE ac_chits - DROP x_purpose, - DROP x_price, - DROP x_priceText, - DROP x_category, - DROP x_category_operation_type, - CHANGE id id INT UNSIGNED AUTO_INCREMENT NOT NULL, - CHANGE eventId eventId CHAR(36) DEFAULT NULL COMMENT '(DC2Type:cashbook_id)', - CHANGE num num VARCHAR(5) DEFAULT NULL COMMENT '(DC2Type:chit_number)', - CHANGE date date DATE NOT NULL COMMENT '(DC2Type:chronos_date)', - CHANGE recipient recipient VARCHAR(64) DEFAULT NULL COMMENT '(DC2Type:recipient)', - CHANGE payment_method payment_method VARCHAR(13) NOT NULL COMMENT '(DC2Type:string_enum)' - SQL); - - $this->addSql('ALTER TABLE ac_chit_scan ADD CONSTRAINT FK_FEC2BFD22AEA3AE4 FOREIGN KEY (chit_id) REFERENCES ac_chits (id)'); - $this->addSql('ALTER TABLE ac_chits ADD CONSTRAINT FK_DBBC2DBC2B2EBB6C FOREIGN KEY (eventId) REFERENCES ac_cashbook (id)'); - $this->addSql('ALTER TABLE ac_chits RENAME INDEX eventid TO IDX_DBBC2DBC2B2EBB6C'); - $this->addSql('ALTER TABLE ac_chit_to_item DROP FOREIGN KEY FK_2EA9AB79126F525E'); - $this->addSql('ALTER TABLE ac_chit_to_item CHANGE chit_id chit_id INT UNSIGNED NOT NULL'); - $this->addSql('ALTER TABLE ac_chit_to_item ADD CONSTRAINT FK_2EA9AB79126F525E FOREIGN KEY (item_id) REFERENCES ac_chits_item (id) ON DELETE CASCADE'); - $this->addSql('ALTER TABLE ac_chit_to_item ADD CONSTRAINT FK_2EA9AB792AEA3AE4 FOREIGN KEY (chit_id) REFERENCES ac_chits (id) ON DELETE CASCADE'); - $this->addSql('ALTER TABLE ac_chits DROP FOREIGN KEY FK_DBBC2DBC2B2EBB6C'); - $this->addSql('ALTER TABLE ac_cashbook CHANGE id id CHAR(36) NOT NULL COMMENT \'(DC2Type:cashbook_id)\''); - $this->addSql('ALTER TABLE ac_chits ADD CONSTRAINT FK_DBBC2DBC2B2EBB6C FOREIGN KEY (eventId) references ac_cashbook (id)'); - - $this->addSql('ALTER TABLE ac_chitsCategory RENAME INDEX short TO UNIQ_43247D658F2890A2'); - $this->addSql('ALTER TABLE ac_unit_budget_category DROP FOREIGN KEY ac_unit_budget_category_ibfk_4'); - $this->addSql('ALTER TABLE ac_unit_budget_category DROP deleted'); - $this->addSql('ALTER TABLE ac_unit_budget_category ADD CONSTRAINT FK_356BCD1F10EE4CEE FOREIGN KEY (parentId) REFERENCES ac_unit_budget_category (id)'); - $this->addSql('ALTER TABLE ac_unit_budget_category RENAME INDEX parentid TO IDX_356BCD1F10EE4CEE'); - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE ac_cashbook CHANGE id id VARCHAR(36) CHARACTER SET utf8 NOT NULL COLLATE `utf8_czech_ci`'); - $this->addSql('ALTER TABLE ac_chit_scan CHANGE chit_id chit_id BIGINT UNSIGNED NOT NULL'); - $this->addSql('ALTER TABLE ac_chit_to_item DROP FOREIGN KEY FK_2EA9AB792AEA3AE4'); - $this->addSql('ALTER TABLE ac_chit_to_item DROP FOREIGN KEY FK_2EA9AB79126F525E'); - $this->addSql('ALTER TABLE ac_chit_to_item CHANGE chit_id chit_id BIGINT UNSIGNED NOT NULL'); - $this->addSql('ALTER TABLE ac_chit_to_item ADD CONSTRAINT FK_2EA9AB792AEA3AE4 FOREIGN KEY (chit_id) REFERENCES ac_chits (id) ON DELETE CASCADE'); - $this->addSql('ALTER TABLE ac_chit_to_item ADD CONSTRAINT FK_2EA9AB79126F525E FOREIGN KEY (item_id) REFERENCES ac_chits_item (id) ON DELETE CASCADE'); - - $this->addSql('ALTER TABLE ac_chits DROP FOREIGN KEY FK_DBBC2DBC2B2EBB6C'); - $this->addSql(<<<'SQL' - ALTER TABLE ac_chits - ADD x_purpose VARCHAR(120) CHARACTER SET utf8 DEFAULT NULL COLLATE `utf8_czech_ci`, - ADD x_price DOUBLE PRECISION DEFAULT NULL, - ADD x_priceText VARCHAR(100) CHARACTER SET utf8 DEFAULT NULL COLLATE `utf8_czech_ci`, - ADD x_category INT UNSIGNED DEFAULT NULL, - ADD x_category_operation_type VARCHAR(255) CHARACTER SET utf8 DEFAULT NULL COLLATE `utf8_czech_ci` COMMENT '(DC2Type:string_enum)', - CHANGE id id BIGINT UNSIGNED AUTO_INCREMENT NOT NULL, - CHANGE payment_method payment_method VARCHAR(13) CHARACTER SET utf8 NOT NULL COLLATE `utf8_czech_ci`, - CHANGE num num VARCHAR(5) CHARACTER SET utf8 DEFAULT NULL COLLATE `utf8_czech_ci`, - CHANGE date date DATE NOT NULL, - CHANGE recipient recipient VARCHAR(64) CHARACTER SET utf8 DEFAULT NULL COLLATE `utf8_czech_ci`, - CHANGE eventId eventId VARCHAR(36) CHARACTER SET utf8 DEFAULT NULL COLLATE `utf8_czech_ci` - SQL); - - $this->addSql('CREATE INDEX category ON ac_chits (x_category)'); - $this->addSql('ALTER TABLE ac_chits RENAME INDEX idx_dbbc2dbc2b2ebb6c TO eventId'); - $this->addSql('ALTER TABLE ac_chitsCategory RENAME INDEX UNIQ_43247D658F2890A2 TO short'); - $this->addSql('ALTER TABLE ac_chitsCategory_object DROP FOREIGN KEY FK_824C4F259C370B71'); - $this->addSql('ALTER TABLE ac_chitsCategory_object DROP PRIMARY KEY'); - $this->addSql('ALTER TABLE ac_chitsCategory_object CHANGE objectTypeId objectTypeId VARCHAR(20) CHARACTER SET utf8 NOT NULL COLLATE `utf8_czech_ci`'); - $this->addSql('ALTER TABLE ac_chitsCategory_object ADD CONSTRAINT ac_chitsCategory_object_ibfk_1 FOREIGN KEY (categoryId) REFERENCES ac_chitsCategory (id) ON UPDATE CASCADE ON DELETE CASCADE'); - $this->addSql('ALTER TABLE ac_chitsCategory_object RENAME INDEX idx_824c4f259c370b71 TO categoryId'); - $this->addSql('ALTER TABLE ac_chits_item CHANGE price price DOUBLE PRECISION NOT NULL'); - $this->addSql(<<<'SQL' - ALTER TABLE ac_participants - CHANGE id id VARCHAR(36) CHARACTER SET utf8 NOT NULL COLLATE `utf8_czech_ci`, - CHANGE participantId participantId INT UNSIGNED NOT NULL COMMENT 'ID', - CHANGE payment payment DOUBLE PRECISION UNSIGNED NOT NULL, - CHANGE repayment repayment DOUBLE PRECISION UNSIGNED NOT NULL, - CHANGE isAccount isAccount VARCHAR(255) CHARACTER SET utf8 DEFAULT NULL COLLATE `utf8_czech_ci`, - CHANGE event_id event_id INT UNSIGNED DEFAULT NULL - SQL); - $this->addSql('CREATE UNIQUE INDEX participantId_event_type ON ac_participants (participantId, event_type)'); - $this->addSql('ALTER TABLE ac_unit_budget_category DROP FOREIGN KEY FK_356BCD1F10EE4CEE'); - $this->addSql('ALTER TABLE ac_unit_budget_category ADD deleted TINYINT(1) DEFAULT \'0\' NOT NULL'); - $this->addSql('ALTER TABLE ac_unit_budget_category ADD CONSTRAINT ac_unit_budget_category_ibfk_4 FOREIGN KEY (parentId) REFERENCES ac_unit_budget_category (id) ON UPDATE CASCADE'); - $this->addSql('ALTER TABLE ac_unit_budget_category RENAME INDEX idx_356bcd1f10ee4cee TO parentId'); - } -} diff --git a/migrations/2020/Version20200214130535.php b/migrations/2020/Version20200214130535.php deleted file mode 100644 index 9ae63da66..000000000 --- a/migrations/2020/Version20200214130535.php +++ /dev/null @@ -1,40 +0,0 @@ -addSql('ALTER TABLE tc_vehicle_roadworthy_scan CHANGE file_path file_path VARCHAR(255) NOT NULL COMMENT \'(DC2Type:file_path)\''); - $this->addSql(<<<'SQL' - ALTER TABLE tc_contracts - CHANGE driver_birthday driver_birthday DATE DEFAULT NULL COMMENT '(DC2Type:chronos_date)', - CHANGE start start DATE DEFAULT NULL COMMENT '(DC2Type:chronos_date)', - CHANGE end end DATE DEFAULT NULL COMMENT '(DC2Type:chronos_date)' - SQL); - $this->addSql('ALTER TABLE log CHANGE date date DATETIME NOT NULL COMMENT \'(DC2Type:datetime_immutable)\''); - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE log CHANGE date date DATETIME NOT NULL'); - $this->addSql(<<<'SQL' - ALTER TABLE tc_contracts - CHANGE start start DATE DEFAULT NULL, - CHANGE end end DATE DEFAULT NULL, - CHANGE driver_birthday driver_birthday DATE DEFAULT NULL - SQL); - $this->addSql('ALTER TABLE tc_vehicle_roadworthy_scan CHANGE file_path file_path VARCHAR(255) CHARACTER SET utf8 NOT NULL COLLATE `utf8_unicode_ci`'); - } -} diff --git a/migrations/2020/Version20200323131412.php b/migrations/2020/Version20200323131412.php deleted file mode 100644 index c86565efb..000000000 --- a/migrations/2020/Version20200323131412.php +++ /dev/null @@ -1,54 +0,0 @@ - 'airplane', - 'p' => 'on_foot', - 'mov' => 'motorcycle', - 'o' => 'train', - 'r' => 'express_train', - 'a' => 'bus', - 'auv' => 'car', - ]; - - public function getDescription(): string - { - return 'Map transport type as regular types instead of entities'; - } - - public function up(Schema $schema): void - { - $this->addSql('ALTER TABLE tc_command_types DROP FOREIGN KEY FK_DC7EBB9BF49490'); - $this->addSql('ALTER TABLE tc_commands ADD transport_types JSON NOT NULL COMMENT \'(DC2Type:transport_types)\''); - $this->addSql('ALTER TABLE tc_travels CHANGE type type VARCHAR(255) NOT NULL COMMENT \'(DC2Type:string_enum)\''); - - $this->addSql('ALTER TABLE tc_command_types CHANGE typeId typeId VARCHAR(255) NOT NULL'); - - foreach (self::RENAMED_TYPES as $original => $new) { - $this->addSql('UPDATE tc_command_types SET typeId = ? WHERE typeId = ?', [$new, $original]); - $this->addSql('UPDATE tc_travels SET type = ? WHERE type = ?', [$new, $original]); - } - - $this->addSql(<<<'SQL' - UPDATE tc_commands c - SET transport_types = (SELECT JSON_ARRAYAGG(typeId) FROM tc_command_types WHERE commandId = c.id) - SQL); - - $this->addSql('DROP TABLE tc_command_types'); - $this->addSql('DROP TABLE tc_travelTypes'); - } - - public function down(Schema $schema): void - { - // Since MySQL does not support unnest() function or any equivalent, this would be cumbersome to implement. - // Backup was performed instead before deployment - } -} diff --git a/migrations/2020/Version20200330183259.php b/migrations/2020/Version20200330183259.php deleted file mode 100644 index cde206275..000000000 --- a/migrations/2020/Version20200330183259.php +++ /dev/null @@ -1,28 +0,0 @@ -addSql('ALTER TABLE tc_travels ADD price NUMERIC(8, 2) DEFAULT NULL COMMENT \'(DC2Type:money)\''); - $this->addSql('UPDATE tc_travels SET price = distance, distance = NULL WHERE has_fuel = 0'); - } - - public function down(Schema $schema): void - { - $this->addSql('UPDATE tc_travels SET distance = price WHERE price IS NOT NULL'); - $this->addSql('ALTER TABLE tc_travels DROP price'); - } -} diff --git a/migrations/2020/Version20200406114332.php b/migrations/2020/Version20200406114332.php deleted file mode 100644 index 113255e07..000000000 --- a/migrations/2020/Version20200406114332.php +++ /dev/null @@ -1,60 +0,0 @@ -addSql('UPDATE tc_commands SET fuel_price = fuel_price * 100, amortization = amortization * 100'); - $this->addSql(<<<'SQL' - ALTER TABLE tc_commands - CHANGE fuel_price fuel_price INT NOT NULL COMMENT '(DC2Type:money)', - CHANGE amortization amortization INT NOT NULL COMMENT '(DC2Type:money)' - SQL); - - $this->addSql('UPDATE ac_participants SET payment = payment * 100, repayment = repayment * 100'); - $this->addSql(<<<'SQL' - ALTER TABLE ac_participants - CHANGE payment payment INT NOT NULL COMMENT '(DC2Type:money)', - CHANGE repayment repayment INT NOT NULL COMMENT '(DC2Type:money)' - SQL); - - $this->addSql('UPDATE tc_travels SET price = price * 100'); - $this->addSql(<<<'SQL' - ALTER TABLE tc_travels CHANGE price price INT DEFAULT NULL COMMENT '(DC2Type:money)' - SQL); - } - - public function down(Schema $schema): void - { - $this->addSql(<<<'SQL' - ALTER TABLE ac_participants - CHANGE payment payment NUMERIC(8, 2) NOT NULL COMMENT '(DC2Type:money)', - CHANGE repayment repayment NUMERIC(8, 2) NOT NULL COMMENT '(DC2Type:money)' - SQL); - $this->addSql('UPDATE ac_participants SET payment = payment / 100, repayment = repayment / 100'); - - $this->addSql(<<<'SQL' - ALTER TABLE tc_commands - CHANGE fuel_price fuel_price NUMERIC(8, 2) NOT NULL COMMENT '(DC2Type:money)', - CHANGE amortization amortization NUMERIC(8, 2) NOT NULL COMMENT '(DC2Type:money)' - SQL); - $this->addSql('UPDATE tc_commands SET fuel_price = fuel_price / 100, amortization = amortization / 100'); - - $this->addSql(<<<'SQL' - ALTER TABLE tc_travels CHANGE price price NUMERIC(8, 2) DEFAULT NULL COMMENT '(DC2Type:money)' - SQL); - $this->addSql('UPDATE tc_travels SET price = price / 100'); - } -} diff --git a/migrations/2020/Version20200410190351.php b/migrations/2020/Version20200410190351.php deleted file mode 100644 index 9e5edeb94..000000000 --- a/migrations/2020/Version20200410190351.php +++ /dev/null @@ -1,22 +0,0 @@ -addSql('ALTER TABLE `pa_payment` ADD `closed_by_username` varchar(64) NULL AFTER `dateClosed`;'); - $this->addSql('UPDATE `pa_payment` SET closed_by_username = "Hospodaření" WHERE transaction_payer IS NULL AND state = "completed"'); - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE `pa_payment` DROP `closed_by_username`;'); - } -} diff --git a/migrations/2020/Version20200411105206.php b/migrations/2020/Version20200411105206.php deleted file mode 100644 index 61976c475..000000000 --- a/migrations/2020/Version20200411105206.php +++ /dev/null @@ -1,42 +0,0 @@ -connection->fetchAll('SELECT id FROM `ac_object` WHERE length(id) < 36'); - $this->connection->beginTransaction(); - try { - foreach ($cashbookIds as $cashbookId) { - $ids = [Uuid::uuid4()->toString(), $cashbookId['id']]; - - $this->addSql('UPDATE ac_object SET id = ? WHERE id = ?', $ids); - $this->addSql('UPDATE ac_cashbook SET id = ? WHERE id = ?', $ids); - $this->addSql('UPDATE ac_chits SET eventId = ? WHERE eventId = ?', $ids); - $this->addSql('UPDATE ac_unit_cashbooks SET cashbook_id = ? WHERE cashbook_id = ?', $ids); - } - - $this->connection->commit(); - } catch (Throwable) { - $this->connection->rollBack(); - } - } - - public function down(Schema $schema): void - { - } -} diff --git a/migrations/2020/Version20200508102927.php b/migrations/2020/Version20200508102927.php deleted file mode 100644 index 13cedbdef..000000000 --- a/migrations/2020/Version20200508102927.php +++ /dev/null @@ -1,24 +0,0 @@ -addSql('ALTER TABLE `ac_cashbook` ADD `bank_chit_number_prefix` varchar(255) COLLATE \'utf8_czech_ci\' NULL AFTER `chit_number_prefix`;'); - $this->addSql('ALTER TABLE `ac_cashbook` CHANGE `chit_number_prefix` `cash_chit_number_prefix` varchar(255) COLLATE \'utf8_czech_ci\' NULL AFTER `type`;'); - $this->addSql('UPDATE `ac_cashbook` SET `bank_chit_number_prefix`=`cash_chit_number_prefix` '); - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE `ac_cashbook` CHANGE `cash_chit_number_prefix` `chit_number_prefix` varchar(255) COLLATE \'utf8_czech_ci\' NULL AFTER `type`;'); - $this->addSql('ALTER TABLE `ac_cashbook` DROP `bank_chit_number_prefix`;'); - } -} diff --git a/migrations/2020/Version20200724125509.php b/migrations/2020/Version20200724125509.php deleted file mode 100644 index 5e1dd63bc..000000000 --- a/migrations/2020/Version20200724125509.php +++ /dev/null @@ -1,36 +0,0 @@ -addSql(<<<'SQL' - CREATE TABLE google_oauth ( - id CHAR(36) NOT NULL COMMENT '(DC2Type:ouath_id)', - unit_id CHAR(36) NOT NULL COMMENT '(DC2Type:unit_id)', - email VARCHAR(255) NOT NULL, - token VARCHAR(255) NOT NULL, - updated_at DATETIME NOT NULL COMMENT '(DC2Type:datetime_immutable)', - UNIQUE INDEX unitid_email (unit_id, email), - PRIMARY KEY(id) - ) DEFAULT CHARACTER SET UTF8 COLLATE `UTF8_unicode_ci` ENGINE = InnoDB -SQL); - } - - public function down(Schema $schema): void - { - $this->addSql('DROP TABLE oauth'); - } -} diff --git a/migrations/2020/Version20200729121516.php b/migrations/2020/Version20200729121516.php deleted file mode 100644 index 407268261..000000000 --- a/migrations/2020/Version20200729121516.php +++ /dev/null @@ -1,21 +0,0 @@ -addSql('ALTER TABLE pa_group ADD oauth_id CHAR(36) DEFAULT NULL COMMENT \'(DC2Type:ouath_id)\''); - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE pa_group DROP oauth_id'); - } -} diff --git a/migrations/2020/Version20201126130912.php b/migrations/2020/Version20201126130912.php deleted file mode 100644 index 3daa712a8..000000000 --- a/migrations/2020/Version20201126130912.php +++ /dev/null @@ -1,28 +0,0 @@ -addSql("ALTER TABLE google_oauth MODIFY COLUMN id CHAR(36) NOT NULL COMMENT '(DC2Type:oauth_id)'"); - $this->addSql("ALTER TABLE pa_group MODIFY COLUMN oauth_id CHAR(36) DEFAULT NULL COMMENT '(DC2Type:oauth_id)'"); - } - - public function down(Schema $schema): void - { - $this->addSql("ALTER TABLE google_oauth MODIFY COLUMN id CHAR(36) NOT NULL COMMENT '(DC2Type:ouath_id)'"); - $this->addSql("ALTER TABLE pa_group MODIFY COLUMN oauth_id CHAR(36) DEFAULT NULL COMMENT '(DC2Type:ouath_id)'"); - } -} diff --git a/migrations/2020/Version20201128164940.php b/migrations/2020/Version20201128164940.php deleted file mode 100644 index 8daa0e1c8..000000000 --- a/migrations/2020/Version20201128164940.php +++ /dev/null @@ -1,49 +0,0 @@ -addSql(<<<'SQL' - CREATE TABLE pa_payment_email_recipients ( - id INT UNSIGNED AUTO_INCREMENT NOT NULL, - payment_id INT DEFAULT NULL, - email_address VARCHAR(255) NOT NULL COMMENT '(DC2Type:email_address)', - INDEX IDX_A3FBD6514C3A3BB (payment_id), - PRIMARY KEY(id)) DEFAULT CHARACTER SET UTF8 COLLATE `UTF8_unicode_ci` ENGINE = InnoDB -SQL); - $this->addSql('ALTER TABLE pa_payment_email_recipients ADD CONSTRAINT FK_A3FBD6514C3A3BB FOREIGN KEY (payment_id) REFERENCES pa_payment (id)'); - } - - public function postUp(Schema $schema): void - { - $paymentsPairs = $this->connection->fetchAllKeyValue('SELECT id, email FROM pa_payment'); - foreach ($paymentsPairs as $paymentId => $email) { - if ($email === null) { - continue; - } - - $this->connection->insert('pa_payment_email_recipients', [ - 'payment_id' => $paymentId, - 'email_address' => $email, - ]); - } - } - - public function down(Schema $schema): void - { - $this->addSql('DROP TABLE pa_payment_email_recipients'); - } -} diff --git a/migrations/2021/Version20210109123938.php b/migrations/2021/Version20210109123938.php deleted file mode 100644 index 171eaf8cf..000000000 --- a/migrations/2021/Version20210109123938.php +++ /dev/null @@ -1,61 +0,0 @@ -connection->beginTransaction(); - $this->addSql('CREATE TABLE ac_camp_cashbooks (id CHAR(36) NOT NULL COMMENT \'(DC2Type:skautis_camp_id)\', cashbook_id CHAR(36) NOT NULL COMMENT \'(DC2Type:cashbook_id)\', PRIMARY KEY(id)) DEFAULT CHARACTER SET UTF8 COLLATE `UTF8_unicode_ci` ENGINE = InnoDB'); - $this->addSql('CREATE TABLE ac_event_cashbooks (id CHAR(36) NOT NULL COMMENT \'(DC2Type:skautis_event_id)\', cashbook_id CHAR(36) NOT NULL COMMENT \'(DC2Type:cashbook_id)\', PRIMARY KEY(id)) DEFAULT CHARACTER SET UTF8 COLLATE `UTF8_unicode_ci` ENGINE = InnoDB'); - - $this->addSql(<<<'SQL' - INSERT INTO ac_camp_cashbooks (id, cashbook_id) - SELECT skautisId as id, id as cashbook_id FROM ac_object WHERE type = 'camp' - SQL); - - $this->addSql(<<<'SQL' - INSERT INTO ac_event_cashbooks (id, cashbook_id) - SELECT skautisId as id, id as cashbook_id FROM ac_object WHERE type = 'general' - SQL); - - $this->addSql('DROP TABLE ac_object'); - $this->connection->commit(); - } - - public function down(Schema $schema): void - { - $this->connection->beginTransaction(); - $this->addSql(<<<'SQL' - CREATE TABLE `ac_object` ( - `id` varchar(36) COLLATE utf8_czech_ci NOT NULL, - `skautisId` int unsigned NOT NULL, - `type` varchar(20) CHARACTER SET utf8 COLLATE utf8_czech_ci NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `skautisId_type` (`skautisId`,`type`), - KEY `type` (`type`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; - SQL); - - $this->addSql(<<<'SQL' - INSERT INTO ac_object (id, skautisId, `type`) - SELECT cashbook_id, id, 'general' as type FROM `ac_event_cashbooks` - - SQL); - - $this->addSql(<<<'SQL' - INSERT INTO ac_object (id, skautisId, `type`) - SELECT cashbook_id, id, 'camp' as type FROM `ac_camp_cashbooks` - SQL); - - $this->addSql('DROP TABLE ac_camp_cashbooks'); - $this->addSql('DROP TABLE ac_event_cashbooks'); - $this->connection->commit(); - } -} diff --git a/migrations/2021/Version20210109150939.php b/migrations/2021/Version20210109150939.php deleted file mode 100644 index 4113b6bee..000000000 --- a/migrations/2021/Version20210109150939.php +++ /dev/null @@ -1,38 +0,0 @@ -addSql('DROP TABLE pa_smtp'); - } - - public function down(Schema $schema): void - { - $this->addSql(<<<'SQL' - CREATE TABLE pa_smtp ( - id INT UNSIGNED AUTO_INCREMENT NOT NULL, - unitId INT UNSIGNED NOT NULL, - host VARCHAR(255) CHARACTER SET utf8 NOT NULL COLLATE `utf8_czech_ci`, - username VARCHAR(255) CHARACTER SET utf8 NOT NULL COLLATE `utf8_czech_ci`, - password VARCHAR(255) CHARACTER SET utf8 NOT NULL COLLATE `utf8_czech_ci`, - secure VARCHAR(64) CHARACTER SET utf8 NOT NULL COLLATE `utf8_czech_ci` COMMENT '(DC2Type:string_enum)', - sender VARCHAR(255) CHARACTER SET utf8 NOT NULL COLLATE `utf8_czech_ci`, - created DATETIME NOT NULL COMMENT '(DC2Type:datetime_immutable)', - PRIMARY KEY(id) - ) DEFAULT CHARACTER SET utf8 COLLATE `utf8_unicode_ci` ENGINE = InnoDB COMMENT = '' -SQL); - } -} diff --git a/migrations/2021/Version20210205181552.php b/migrations/2021/Version20210205181552.php deleted file mode 100644 index 011f2ed16..000000000 --- a/migrations/2021/Version20210205181552.php +++ /dev/null @@ -1,180 +0,0 @@ -addSql(<<<'SQL' - ALTER TABLE `ac_chitsCategory` - CHANGE `label` `name` varchar(64) NOT NULL, - CHANGE `short` `shortcut` varchar(64) NOT NULL, - CHANGE `type` `operation_type` varchar(64) NOT NULL COMMENT '(DC2Type:string_enum)', - CHANGE `orderby` `priority` smallint NOT NULL - ; - SQL); - - $this->addSql(<<<'SQL' - ALTER TABLE `ac_chits` CHANGE `lock` `locked` int NULL; - SQL); - $this->addSql(<<<'SQL' - ALTER TABLE `tc_commands` - CHANGE `passengers` `fellow_passengers` varchar(64) COLLATE 'utf8_czech_ci' NOT NULL, - CHANGE `closed` `closed_at` datetime NULL COMMENT '(DC2Type:datetime_immutable)'; - SQL); - - $this->addSql(<<<'SQL' - ALTER TABLE `tc_contracts` - CHANGE `unit_person` `unit_representative` varchar(64) COLLATE 'utf8_czech_ci' NOT NULL COMMENT 'jméno osoby zastupující jednotku', - CHANGE `start` `since` date NULL COMMENT '(DC2Type:chronos_date)', - CHANGE `end` `until` date NULL COMMENT '(DC2Type:chronos_date)', - CHANGE `template` `template_version` smallint NOT NULL COMMENT '1-old, 2-podle NOZ'; - SQL); - - $this->addSql(<<<'SQL' - ALTER TABLE `pa_group` - CHANGE `label` `name` varchar(64) COLLATE 'utf8_czech_ci' NOT NULL, - CHANGE `state_info` `note` varchar(250) COLLATE 'utf8_czech_ci' NOT NULL; - SQL); - - $this->addSql(<<<'SQL' - ALTER TABLE `log` - CHANGE `unitId` `unit_id` int NOT NULL, - CHANGE `userId` `user_id` int NOT NULL, - CHANGE `type` `type` varchar(255) COLLATE 'utf8_czech_ci' NOT NULL COMMENT '(DC2Type:string_enum)', - CHANGE `typeId` `type_id` int NULL; - SQL); - - $this->addSql(<<<'SQL' - ALTER TABLE `ac_chitsCategory_object` - CHANGE `categoryId` `category_id` int unsigned NOT NULL, - CHANGE `objectTypeId` `type` varchar(20) COLLATE 'utf8_general_ci' NOT NULL COMMENT '(DC2Type:string_enum)'; - SQL); - - $this->addSql(<<<'SQL' - ALTER TABLE `ac_participants` - CHANGE `participantId` `participant_id` int NOT NULL AFTER `id`, - CHANGE `isAccount` `account` varchar(255) COLLATE 'utf8_czech_ci' NOT NULL AFTER `repayment`; - SQL); - - $this->addSql(<<<'SQL' - ALTER TABLE `pa_payment` - CHANGE `groupId` `group_id` int NOT NULL AFTER `id`, - CHANGE `personId` `person_id` int NULL AFTER `email`, - CHANGE `maturity` `due_date` date NOT NULL COMMENT '(DC2Type:chronos_date)' AFTER `amount`, - CHANGE `vs` `variable_symbol` varchar(10) COLLATE 'utf8_czech_ci' NULL COMMENT '(DC2Type:variable_symbol)' AFTER `due_date`, - CHANGE `ks` `constant_symbol` smallint NULL AFTER `variable_symbol`, - CHANGE `dateClosed` `closed_at` datetime NULL COMMENT '(DC2Type:datetime_immutable)' AFTER `transactionId`, - CHANGE `paidFrom` `bank_account` varchar(64) COLLATE 'utf8_czech_ci' NULL AFTER `closed_by_username`;; - SQL); - - $this->addSql(<<<'SQL' - ALTER TABLE `pa_group` - CHANGE `maturity` `due_date` date NULL COMMENT '(DC2Type:chronos_date)' AFTER `amount`, - CHANGE `ks` `constant_symbol` int NULL AFTER `due_date`, - CHANGE `nextVs` `next_variable_symbol` varchar(255) COLLATE 'utf8_czech_ci' NULL COMMENT '(DC2Type:variable_symbol)' AFTER `constant_symbol`; - SQL); - - $this->addSql(<<<'SQL' - ALTER TABLE `tc_travels` - CHANGE `type` `transport_type` varchar(255) COLLATE 'utf8_czech_ci' NOT NULL COMMENT '(DC2Type:string_enum)' AFTER `distance`; - SQL); - - $this->addSql('ALTER TABLE ac_chitsCategory RENAME INDEX uniq_43247d658f2890a2 TO UNIQ_43247D652EF83F9C'); - $this->addSql('ALTER TABLE ac_chitsCategory RENAME INDEX orderby TO priority'); - $this->addSql('ALTER TABLE ac_chitsCategory_object RENAME INDEX idx_824c4f259c370b71 TO IDX_824C4F2512469DE2'); - $this->addSql('ALTER TABLE ac_chitsCategory_object RENAME INDEX objecttypeid TO type'); - $this->addSql('ALTER TABLE ac_participants RENAME INDEX actionid TO eventId'); - $this->addSql('ALTER TABLE ac_unit_budget_category RENAME INDEX objectid_year TO unitId_year'); - } - - public function down(Schema $schema): void - { - $this->addSql(<<<'SQL' - ALTER TABLE `ac_chitsCategory` - CHANGE `name` `label` varchar(64) NOT NULL, - CHANGE `shortcut` `short` varchar(64) NOT NULL, - CHANGE `operation_type` `type` varchar(255) NOT NULL, - CHANGE `priority` `orderby` smallint unsigned NOT NULL; - SQL); - - $this->addSql(<<<'SQL' - ALTER TABLE `ac_chits` CHANGE `locked` `lock` int unsigned NULL; - SQL); - - $this->addSql(<<<'SQL' - ALTER TABLE `tc_commands` - CHANGE `fellow_passengers` `passengers` varchar(64) COLLATE 'utf8_czech_ci' NOT NULL, - CHANGE `closed_at` `closed` datetime NULL COMMENT '(DC2Type:datetime_immutable)'; - SQL); - - $this->addSql(<<<'SQL' - ALTER TABLE `tc_contracts` - CHANGE `unit_representative` `unit_person` varchar(64) COLLATE 'utf8_czech_ci' NOT NULL COMMENT 'jméno osoby zastupující jednotku', - CHANGE `since` `start` date NULL COMMENT '(DC2Type:chronos_date)', - CHANGE `until` `end` date NULL COMMENT '(DC2Type:chronos_date)', - CHANGE `template_version` `template` smallint NOT NULL COMMENT '1-old, 2-podle NOZ'; - SQL); - - $this->addSql(<<<'SQL' - ALTER TABLE `pa_group` - CHANGE `name` `label` varchar(64) COLLATE 'utf8_czech_ci' NOT NULL, - CHANGE `note` `state_info` varchar(250) COLLATE 'utf8_czech_ci' NOT NULL; - SQL); - - $this->addSql(<<<'SQL' - ALTER TABLE `log` - CHANGE `unit_id` `unitId` int unsigned NOT NULL AFTER `id`, - CHANGE `user_id` `userId` int unsigned NOT NULL AFTER `date`, - CHANGE `type_id` `typeId` int unsigned NULL AFTER `type`; - SQL); - - $this->addSql(<<<'SQL' - ALTER TABLE `ac_chitsCategory_object` - CHANGE `category_id` `categoryId` int unsigned NOT NULL, - CHANGE `type` `objectTypeId` varchar(20) COLLATE 'utf8_general_ci' NOT NULL COMMENT '(DC2Type:string_enum)'; - SQL); - - $this->addSql(<<<'SQL' - ALTER TABLE `ac_participants` - CHANGE `participant_id` `participantId` int unsigned NOT NULL AFTER `id`, - CHANGE `account` `isAccount` varchar(255) COLLATE 'utf8_czech_ci' NOT NULL AFTER `repayment`; - SQL); - - $this->addSql(<<<'SQL' - ALTER TABLE `pa_payment` - CHANGE `group_id` `groupId` int unsigned NOT NULL AFTER `id`, - CHANGE `person_id` `personId` int NULL AFTER `email`, - CHANGE `due_date` `maturity` date NOT NULL COMMENT '(DC2Type:chronos_date)' AFTER `amount`, - CHANGE `variable_symbol` `vs` varchar(10) COLLATE 'utf8_czech_ci' NULL COMMENT '(DC2Type:variable_symbol)' AFTER `maturity`, - CHANGE `constant_symbol` `ks` smallint unsigned NULL AFTER `vs`, - CHANGE `closed_at` `dateClosed` datetime NULL COMMENT '(DC2Type:datetime_immutable)' AFTER `transactionId`, - CHANGE `bank_account` `paidFrom` varchar(64) COLLATE 'utf8_czech_ci' NULL AFTER `closed_by_username`; - SQL); - - $this->addSql(<<<'SQL' - ALTER TABLE `pa_group` - CHANGE `due_date` `maturity` date NULL COMMENT '(DC2Type:chronos_date)' AFTER `amount`, - CHANGE `constant_symbol` `ks` int unsigned NULL AFTER `maturity`, - CHANGE `next_variable_symbol` `nextVs` varchar(255) COLLATE 'utf8_czech_ci' NULL COMMENT '(DC2Type:variable_symbol)' AFTER `ks`; - SQL); - - $this->addSql(<<<'SQL' - ALTER TABLE `tc_travels` - CHANGE `transport_type` `type` varchar(255) COLLATE 'utf8_czech_ci' NOT NULL COMMENT '(DC2Type:string_enum)' AFTER `distance`; - SQL); - - $this->addSql('ALTER TABLE ac_chitsCategory RENAME INDEX priority TO orderby'); - $this->addSql('ALTER TABLE ac_chitsCategory RENAME INDEX uniq_43247d652ef83f9c TO UNIQ_43247D658F2890A2'); - $this->addSql('ALTER TABLE ac_chitsCategory_object RENAME INDEX idx_824c4f2512469de2 TO IDX_824C4F259C370B71'); - $this->addSql('ALTER TABLE ac_chitsCategory_object RENAME INDEX type TO objectTypeId'); - $this->addSql('ALTER TABLE ac_participants RENAME INDEX eventid TO actionId'); - $this->addSql('ALTER TABLE ac_unit_budget_category RENAME INDEX unitid_year TO objectId_year'); - } -} diff --git a/migrations/2021/Version20210206080027.php b/migrations/2021/Version20210206080027.php deleted file mode 100644 index 561fde60e..000000000 --- a/migrations/2021/Version20210206080027.php +++ /dev/null @@ -1,93 +0,0 @@ -dropForeignKeys(); - - $this->addSql('ALTER TABLE ac_chits CHANGE id id INT AUTO_INCREMENT NOT NULL'); - $this->addSql('ALTER TABLE ac_chit_scan CHANGE chit_id chit_id INT DEFAULT NULL'); - $this->addSql('ALTER TABLE ac_chit_to_item CHANGE chit_id chit_id INT NOT NULL, CHANGE item_id item_id INT NOT NULL'); - $this->addSql(<<<'SQL' - ALTER TABLE ac_chits_item - CHANGE id id INT AUTO_INCREMENT NOT NULL, - CHANGE price price DOUBLE PRECISION NOT NULL, - CHANGE category category INT NOT NULL - SQL); - - $this->addSql('ALTER TABLE ac_chitsCategory CHANGE id id INT AUTO_INCREMENT NOT NULL'); - $this->addSql('ALTER TABLE ac_chitsCategory_object CHANGE category_id category_id INT NOT NULL'); - - $this->addSql(<<<'SQL' - ALTER TABLE ac_unit_budget_category - CHANGE id id INT AUTO_INCREMENT NOT NULL, - CHANGE parentId parentId INT DEFAULT NULL, - CHANGE value value DOUBLE PRECISION DEFAULT '0' NOT NULL, - CHANGE year year SMALLINT NOT NULL - SQL); - $this->addForeignKeys(); - } - - public function down(Schema $schema): void - { - $this->dropForeignKeys(); - - $this->addSql('ALTER TABLE ac_chits CHANGE id id INT UNSIGNED AUTO_INCREMENT NOT NULL'); - $this->addSql('ALTER TABLE ac_chit_scan CHANGE chit_id chit_id INT UNSIGNED DEFAULT NULL'); - $this->addSql('ALTER TABLE ac_chit_to_item CHANGE chit_id chit_id INT UNSIGNED NOT NULL, CHANGE item_id item_id INT UNSIGNED NOT NULL'); - $this->addSql(<<<'SQL' - ALTER TABLE ac_chits_item - CHANGE id id INT UNSIGNED AUTO_INCREMENT NOT NULL, - CHANGE price price DOUBLE PRECISION UNSIGNED NOT NULL, - CHANGE category category INT UNSIGNED NOT NULL - SQL); - - $this->addSql('ALTER TABLE ac_chitsCategory CHANGE id id INT UNSIGNED AUTO_INCREMENT NOT NULL'); - $this->addSql('ALTER TABLE ac_chitsCategory_object CHANGE category_id category_id INT UNSIGNED NOT NULL'); - - $this->addSql(<<<'SQL' - ALTER TABLE ac_unit_budget_category - CHANGE id id INT UNSIGNED AUTO_INCREMENT NOT NULL, - CHANGE parentId parentId INT UNSIGNED DEFAULT NULL, - CHANGE value value DOUBLE PRECISION UNSIGNED DEFAULT '0' NOT NULL, - CHANGE year year SMALLINT UNSIGNED NOT NULL - SQL); - - $this->addForeignKeys(); - } - - private function dropForeignKeys(): void - { - $this->addSql('ALTER TABLE ac_chit_scan DROP FOREIGN KEY FK_FEC2BFD22AEA3AE4'); - $this->addSql('ALTER TABLE ac_chit_to_item DROP FOREIGN KEY FK_2EA9AB792AEA3AE4'); - $this->addSql('ALTER TABLE ac_chit_to_item DROP FOREIGN KEY FK_2EA9AB79126F525E'); - - $this->addSql('ALTER TABLE ac_chitsCategory_object DROP FOREIGN KEY FK_824C4F259C370B71'); - - $this->addSql('ALTER TABLE ac_unit_budget_category DROP FOREIGN KEY FK_356BCD1F10EE4CEE'); - } - - private function addForeignKeys(): void - { - $this->addSql('ALTER TABLE ac_chit_scan ADD CONSTRAINT FK_FEC2BFD22AEA3AE4 FOREIGN KEY (chit_id) REFERENCES ac_chits (id)'); - $this->addSql('ALTER TABLE ac_chit_to_item ADD CONSTRAINT FK_2EA9AB792AEA3AE4 FOREIGN KEY (`chit_id`) REFERENCES `ac_chits` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT'); - $this->addSql('ALTER TABLE ac_chit_to_item ADD CONSTRAINT FK_2EA9AB79126F525E FOREIGN KEY (`item_id`) REFERENCES `ac_chits_item` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT'); - - $this->addSql('ALTER TABLE ac_chitsCategory_object ADD CONSTRAINT FK_824C4F259C370B71 FOREIGN KEY (`category_id`) REFERENCES `ac_chitsCategory` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT'); - - $this->addSql('ALTER TABLE `ac_unit_budget_category` ADD CONSTRAINT FK_356BCD1F10EE4CEE FOREIGN KEY (`parentId`) REFERENCES `ac_unit_budget_category` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT'); - } -} diff --git a/migrations/2021/Version20210206085905.php b/migrations/2021/Version20210206085905.php deleted file mode 100644 index 212eaf29c..000000000 --- a/migrations/2021/Version20210206085905.php +++ /dev/null @@ -1,116 +0,0 @@ -dropForeignKeys(); - $this->addSql('ALTER TABLE log CHANGE id id INT AUTO_INCREMENT NOT NULL'); - $this->addSql(<<<'SQL' - ALTER TABLE pa_group - CHANGE id id INT AUTO_INCREMENT NOT NULL, - CHANGE smtp_id smtp_id INT DEFAULT NULL - SQL); - $this->addSql('ALTER TABLE pa_group_email CHANGE group_id group_id INT DEFAULT NULL'); - $this->addSql('ALTER TABLE pa_group_unit CHANGE group_id group_id INT DEFAULT NULL'); - $this->addSql('ALTER TABLE pa_payment_email_recipients CHANGE id id INT AUTO_INCREMENT NOT NULL'); - $this->addSql('ALTER TABLE pa_payment_sent_emails CHANGE id id INT AUTO_INCREMENT NOT NULL'); - $this->addSql(<<<'SQL' - ALTER TABLE tc_commands - CHANGE id id INT AUTO_INCREMENT NOT NULL, - CHANGE vehicle_id vehicle_id INT DEFAULT NULL, - CHANGE contract_id contract_id INT DEFAULT NULL, - CHANGE unit_id unit_id INT NOT NULL - SQL); - $this->addSql(<<<'SQL' - ALTER TABLE tc_contracts - CHANGE id id INT AUTO_INCREMENT NOT NULL, - CHANGE unit_id unit_id INT NOT NULL - SQL); - $this->addSql(<<<'SQL' - ALTER TABLE tc_travels - CHANGE id id INT NOT NULL, - CHANGE command_id command_id INT NOT NULL, - CHANGE distance distance DOUBLE PRECISION DEFAULT NULL - SQL); - $this->addSql(<<<'SQL' - ALTER TABLE tc_vehicle - CHANGE id id INT AUTO_INCREMENT NOT NULL, - CHANGE unit_id unit_id INT NOT NULL, - CHANGE consumption consumption DOUBLE PRECISION NOT NULL - SQL); - $this->addSql('ALTER TABLE tc_vehicle_roadworthy_scan CHANGE vehicle_id vehicle_id INT DEFAULT NULL'); - $this->addForeignKeys(); - } - - public function down(Schema $schema): void - { - $this->dropForeignKeys(); - $this->addSql('ALTER TABLE log CHANGE id id INT UNSIGNED AUTO_INCREMENT NOT NULL'); - $this->addSql(<<<'SQL' - ALTER TABLE pa_group - CHANGE id id INT UNSIGNED AUTO_INCREMENT NOT NULL, - CHANGE smtp_id smtp_id INT UNSIGNED DEFAULT NULL - SQL); - $this->addSql('ALTER TABLE pa_group_email CHANGE group_id group_id INT UNSIGNED DEFAULT NULL'); - $this->addSql('ALTER TABLE pa_group_unit CHANGE group_id group_id INT UNSIGNED DEFAULT NULL'); - $this->addSql('ALTER TABLE pa_payment_email_recipients CHANGE id id INT UNSIGNED AUTO_INCREMENT NOT NULL'); - $this->addSql('ALTER TABLE pa_payment_sent_emails CHANGE id id INT UNSIGNED AUTO_INCREMENT NOT NULL'); - $this->addSql(<<<'SQL' - ALTER TABLE tc_commands - CHANGE id id INT UNSIGNED AUTO_INCREMENT NOT NULL, - CHANGE vehicle_id vehicle_id INT UNSIGNED DEFAULT NULL, - CHANGE unit_id unit_id INT UNSIGNED NOT NULL, - CHANGE contract_id contract_id INT UNSIGNED DEFAULT NULL - SQL); - $this->addSql(<<<'SQL' - ALTER TABLE tc_contracts - CHANGE id id INT UNSIGNED AUTO_INCREMENT NOT NULL, - CHANGE unit_id unit_id INT UNSIGNED NOT NULL - SQL); - $this->addSql(<<<'SQL' - ALTER TABLE tc_travels - CHANGE id id INT UNSIGNED NOT NULL, - CHANGE command_id command_id INT UNSIGNED NOT NULL, - CHANGE distance distance DOUBLE PRECISION UNSIGNED DEFAULT NULL - SQL); - $this->addSql(<<<'SQL' - ALTER TABLE tc_vehicle - CHANGE id id INT UNSIGNED AUTO_INCREMENT NOT NULL, - CHANGE unit_id unit_id INT UNSIGNED NOT NULL, - CHANGE consumption consumption DOUBLE PRECISION UNSIGNED NOT NULL - SQL); - $this->addSql('ALTER TABLE tc_vehicle_roadworthy_scan CHANGE vehicle_id vehicle_id INT UNSIGNED DEFAULT NULL'); - $this->addForeignKeys(); - } - - private function dropForeignKeys(): void - { - $this->addSql('ALTER TABLE pa_group_email DROP FOREIGN KEY FK_7A67EADBFE54D947'); - $this->addSql('ALTER TABLE pa_group_unit DROP FOREIGN KEY FK_FB5A0CD6FE54D947'); - $this->addSql('ALTER TABLE tc_commands DROP FOREIGN KEY FK_4D5B6D0C545317D1'); - $this->addSql('ALTER TABLE tc_travels DROP FOREIGN KEY FK_F53E53633E1689A'); - $this->addSql('ALTER TABLE tc_vehicle_roadworthy_scan DROP FOREIGN KEY FK_270D2917545317D1'); - } - - private function addForeignKeys(): void - { - $this->addSql('ALTER TABLE pa_group_email ADD CONSTRAINT FK_7A67EADBFE54D947 FOREIGN KEY (`group_id`) REFERENCES `pa_group` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT'); - $this->addSql('ALTER TABLE pa_group_unit ADD CONSTRAINT FK_FB5A0CD6FE54D947 FOREIGN KEY (`group_id`) REFERENCES `pa_group` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT'); - $this->addSql('ALTER TABLE tc_commands ADD CONSTRAINT FK_4D5B6D0C545317D1 FOREIGN KEY (`vehicle_id`) REFERENCES `tc_vehicle` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT'); - $this->addSql('ALTER TABLE tc_travels ADD CONSTRAINT FK_F53E53633E1689A FOREIGN KEY (`command_id`) REFERENCES `tc_commands` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT'); - $this->addSql('ALTER TABLE tc_vehicle_roadworthy_scan ADD CONSTRAINT FK_270D2917545317D1 FOREIGN KEY (`vehicle_id`) REFERENCES `tc_vehicle` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT'); - } -} diff --git a/migrations/2021/Version20210711221851.php b/migrations/2021/Version20210711221851.php deleted file mode 100644 index 4a9b48e7d..000000000 --- a/migrations/2021/Version20210711221851.php +++ /dev/null @@ -1,31 +0,0 @@ -addSql('ALTER TABLE tc_contracts CHANGE unit_representative unit_representative VARCHAR(64) NOT NULL'); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql('ALTER TABLE tc_contracts CHANGE unit_representative unit_representative VARCHAR(64) CHARACTER SET utf8 NOT NULL COLLATE `utf8_czech_ci` COMMENT \'jméno osoby zastupující jednotku\''); - } -} diff --git a/migrations/2021/Version20211121182733.php b/migrations/2021/Version20211121182733.php deleted file mode 100644 index 2f446e1af..000000000 --- a/migrations/2021/Version20211121182733.php +++ /dev/null @@ -1,26 +0,0 @@ -addSql('ALTER TABLE pa_payment DROP email'); - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE pa_payment ADD email TEXT CHARACTER SET utf8 DEFAULT NULL COLLATE `utf8_czech_ci`'); - } -} diff --git a/migrations/2021/Version20211121183832.php b/migrations/2021/Version20211121183832.php deleted file mode 100644 index 85fa6f621..000000000 --- a/migrations/2021/Version20211121183832.php +++ /dev/null @@ -1,42 +0,0 @@ -addSql('ALTER TABLE ac_chit_scan CHANGE chit_id chit_id INT NOT NULL'); - $this->addSql('ALTER TABLE ac_chits CHANGE eventId eventId CHAR(36) NOT NULL COMMENT \'(DC2Type:cashbook_id)\''); - $this->addSql('ALTER TABLE ac_unit_budget_category CHANGE unit_id unit_id INT NOT NULL'); - $this->addSql('ALTER TABLE pa_group_email CHANGE group_id group_id INT NOT NULL'); - $this->addSql('ALTER TABLE pa_group_unit CHANGE group_id group_id INT NOT NULL'); - $this->addSql('ALTER TABLE pa_payment_email_recipients CHANGE payment_id payment_id INT NOT NULL'); - $this->addSql('ALTER TABLE pa_payment_sent_emails CHANGE payment_id payment_id INT NOT NULL'); - $this->addSql('ALTER TABLE tc_commands CHANGE place place VARCHAR(64) NOT NULL'); - $this->addSql('ALTER TABLE tc_vehicle_roadworthy_scan CHANGE vehicle_id vehicle_id INT NOT NULL'); - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE ac_chit_scan CHANGE chit_id chit_id INT DEFAULT NULL'); - $this->addSql('ALTER TABLE ac_chits CHANGE eventId eventId CHAR(36) CHARACTER SET utf8 DEFAULT NULL COLLATE `utf8_czech_ci` COMMENT \'(DC2Type:cashbook_id)\''); - $this->addSql('ALTER TABLE ac_unit_budget_category CHANGE unit_id unit_id INT DEFAULT NULL'); - $this->addSql('ALTER TABLE pa_group_email CHANGE group_id group_id INT DEFAULT NULL'); - $this->addSql('ALTER TABLE pa_group_unit CHANGE group_id group_id INT DEFAULT NULL'); - $this->addSql('ALTER TABLE pa_payment_email_recipients CHANGE payment_id payment_id INT DEFAULT NULL'); - $this->addSql('ALTER TABLE pa_payment_sent_emails CHANGE payment_id payment_id INT DEFAULT NULL'); - $this->addSql('ALTER TABLE tc_commands CHANGE place place VARCHAR(64) CHARACTER SET utf8 DEFAULT NULL COLLATE `utf8_czech_ci`'); - $this->addSql('ALTER TABLE tc_vehicle_roadworthy_scan CHANGE vehicle_id vehicle_id INT DEFAULT NULL'); - } -} diff --git a/migrations/2021/Version20211121192425.php b/migrations/2021/Version20211121192425.php deleted file mode 100644 index 06a80007b..000000000 --- a/migrations/2021/Version20211121192425.php +++ /dev/null @@ -1,27 +0,0 @@ -addSql(<<<'SQL' - CREATE TABLE ac_education_cashbooks ( - id CHAR(36) NOT NULL COMMENT '(DC2Type:skautis_education_id)', - cashbook_id CHAR(36) NOT NULL COMMENT '(DC2Type:cashbook_id)', - PRIMARY KEY(id) - ) DEFAULT CHARACTER SET utf8 COLLATE `utf8_unicode_ci` ENGINE = InnoDB -SQL); - } - - public function down(Schema $schema): void - { - $this->addSql('DROP TABLE ac_education_cashbooks'); - } -} diff --git a/migrations/2021/Version20211122211254.php b/migrations/2021/Version20211122211254.php deleted file mode 100644 index 67c96b8cf..000000000 --- a/migrations/2021/Version20211122211254.php +++ /dev/null @@ -1,21 +0,0 @@ -addSql('ALTER TABLE ac_participants CHANGE event_type event_type VARCHAR(9) NOT NULL COMMENT \'(DC2Type:string_enum)\''); - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE ac_participants CHANGE event_type event_type VARCHAR(7) NOT NULL COMMENT \'(DC2Type:string_enum)\''); - } -} diff --git a/migrations/2023/Version20231008115940.php b/migrations/2023/Version20231008115940.php deleted file mode 100644 index 1d666ecbd..000000000 --- a/migrations/2023/Version20231008115940.php +++ /dev/null @@ -1,26 +0,0 @@ -addSql('INSERT INTO `ac_chitsCategory_object` (`category_id`, `type`) VALUES (20, \'education\');'); - } - - public function down(Schema $schema): void - { - $this->addSql('DELETE FROM `ac_chitsCategory_object` WHERE `category_id` = \'20\' AND `type` = \'education\';'); - } -} diff --git a/migrations/2023/Version20231025231859.php b/migrations/2023/Version20231025231859.php deleted file mode 100644 index fae608c43..000000000 --- a/migrations/2023/Version20231025231859.php +++ /dev/null @@ -1,28 +0,0 @@ -addSql('ALTER TABLE `ac_education_cashbooks` ADD COLUMN `year` INT NOT NULL AFTER `id`;'); - $this->addSql('ALTER TABLE `ac_education_cashbooks` DROP PRIMARY KEY, ADD PRIMARY KEY(`id`, `year`);'); - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE `ac_education_cashbooks` DROP PRIMARY KEY, ADD PRIMARY KEY(`id`);'); - $this->addSql('ALTER TABLE `ac_education_cashbooks` DROP COLUMN `year`;'); - } -} diff --git a/migrations/2023/Version20231027085506.php b/migrations/2023/Version20231027085506.php deleted file mode 100644 index 4e8e0e5a3..000000000 --- a/migrations/2023/Version20231027085506.php +++ /dev/null @@ -1,104 +0,0 @@ - */ - private array $tables_utf8mb3_czech_ci = [ - 'ac_cashbook', - 'ac_chits', - 'ac_chitsCategory', - 'ac_chits_item', - 'ac_participants', - 'ac_unit_budget_category', - 'ac_unit_cashbooks', - 'ac_units', - 'pa_group', - 'pa_payment', - 'tc_commands', - 'tc_contracts', - 'tc_travels', - 'tc_vehicle', - ]; - - /** @var array */ - private array $tables_utf8mb3_general_ci = ['ac_chitsCategory_object']; - - /** @var array */ - private array $tables_utf8mb3_unicode_ci = [ - 'ac_camp_cashbooks', - 'ac_chit_scan', - 'ac_chit_to_item', - 'ac_education_cashbooks', - 'ac_event_cashbooks', - 'doctrine_migrations', - 'google_oauth', - 'pa_bank_account', - 'pa_group_email', - 'pa_group_unit', - 'pa_payment_email_recipients', - 'pa_payment_sent_emails', - 'tc_vehicle_roadworthy_scan', - ]; - - /** @var array */ - private array $tables_latin1_swedish_ci = ['log']; - - public function getDescription(): string - { - return 'Sjednocení charsetů a collation celé databáze'; - } - - public function up(Schema $schema): void - { - $this->addSql('ALTER DATABASE CHARACTER SET utf8mb4 COLLATE utf8mb4_czech_ci;'); - - $this->addSql('SET foreign_key_checks = 0;'); - - foreach ( - array_merge( - $this->tables_utf8mb3_czech_ci, - $this->tables_utf8mb3_general_ci, - $this->tables_utf8mb3_unicode_ci, - $this->tables_latin1_swedish_ci, - ) as $table - ) { - $this->addSql('ALTER TABLE `' . $table . '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_czech_ci;'); - } - - $this->addSql('SET foreign_key_checks = 1;'); - } - - public function down(Schema $schema): void - { - $this->addSql('SET foreign_key_checks = 0;'); - - foreach ($this->tables_utf8mb3_czech_ci as $table) { - $this->addSql('ALTER TABLE `' . $table . '` CONVERT TO CHARACTER SET utf8mb3 COLLATE utf8mb3_czech_ci;'); - } - - foreach ($this->tables_utf8mb3_general_ci as $table) { - $this->addSql('ALTER TABLE `' . $table . '` CONVERT TO CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci;'); - } - - foreach ($this->tables_utf8mb3_unicode_ci as $table) { - $this->addSql('ALTER TABLE `' . $table . '` CONVERT TO CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_ci;'); - } - - foreach ($this->tables_latin1_swedish_ci as $table) { - $this->addSql('ALTER TABLE `' . $table . '` CONVERT TO CHARACTER SET latin1 COLLATE latin1_swedish_ci;'); - } - - $this->addSql('SET foreign_key_checks = 1;'); - } -} diff --git a/migrations/2024/Version20240422113851.php b/migrations/2024/Version20240422113851.php deleted file mode 100644 index 6c04c761d..000000000 --- a/migrations/2024/Version20240422113851.php +++ /dev/null @@ -1,26 +0,0 @@ -addSql('ALTER TABLE tc_commands MODIFY fellow_passengers VARCHAR(256) NOT NULL;'); - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE tc_commands MODIFY fellow_passengers VARCHAR(64) NOT NULL;'); - } -} diff --git a/migrations/2023/Version20231127061041.php b/migrations/2025/Version20251019194523.php similarity index 70% rename from migrations/2023/Version20231127061041.php rename to migrations/2025/Version20251019194523.php index f6a26b007..6e594f5ba 100644 --- a/migrations/2023/Version20231127061041.php +++ b/migrations/2025/Version20251019194523.php @@ -10,7 +10,7 @@ /** * Auto-generated Migration: Please modify to your needs! */ -final class Version20231127061041 extends AbstractMigration +final class Version20251019194523 extends AbstractMigration { public function getDescription(): string { @@ -20,12 +20,12 @@ public function getDescription(): string public function up(Schema $schema): void { // this up() migration is auto-generated, please modify it to your needs - $this->addSql('ALTER TABLE pa_payment ADD date DATE DEFAULT NULL COMMENT \'(DC2Type:chronos_date)\''); + $this->addSql('ALTER TABLE pa_group ADD is_reminders_enabled TINYINT(1) DEFAULT 0 NOT NULL'); } public function down(Schema $schema): void { // this down() migration is auto-generated, please modify it to your needs - $this->addSql('ALTER TABLE pa_payment DROP date'); + $this->addSql('ALTER TABLE pa_group DROP is_reminders_enabled'); } } diff --git a/phpcs.xml b/phpcs.xml index 4b49e41e9..e309878e6 100644 --- a/phpcs.xml +++ b/phpcs.xml @@ -30,4 +30,10 @@ /tests/* + + tests/Http/NoOpResponse.php + + + tests/Http/NoOpResponse.php + diff --git a/phpstan.neon b/phpstan.neon index 0e06dd9cb..8e74aa9ef 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -16,6 +16,8 @@ parameters: scanDirectories: - tests/_support + bootstrapFiles: + - tests/Http/NoOpResponse.php # místo autoload_files services: - class: CodeQuality\ObjectIdentityComparisonRule diff --git a/tests/Http/NoOpResponse.php b/tests/Http/NoOpResponse.php new file mode 100644 index 000000000..1cf42dc52 --- /dev/null +++ b/tests/Http/NoOpResponse.php @@ -0,0 +1,87 @@ +code = $code; + + return $this; + } + + public function getCode(): int + { + return $this->code; + } + + public function setHeader(string $name, string $value): static + { + return $this; + } + + public function addHeader(string $name, string $value): static + { + return $this; + } + + public function deleteHeader(string $name): static + { + return $this; + } + + public function getHeader(string $header): string|null + { + return null; + } + + /** @return array */ + public function getHeaders(): array + { + return []; + } + + public function setExpiration(string|null $expire): static + { + return $this; + } + + public function isSent(): bool + { + return false; + } + + public function setContentType(string $type, string|null $charset = null): static + { + return $this; + } + + public function redirect(string $url, int $code = IResponse::S302_Found): void + { + /* no-op */ + } + + /** + * @param string|int|DateTimeInterface $expire time, value null means "until the browser session ends" + * + * @return $this + */ + public function setCookie(string $name, string $value, $expire, string|null $path = null, string|null $domain = null, bool|null $secure = null, bool|null $httpOnly = null, string|null $sameSite = null): static + { + return $this; + } + + public function deleteCookie(string $name, string|null $path = null, string|null $domain = null, bool|null $secure = null): static + { + return $this; + } +} diff --git a/tests/_data/acceptance_init.sql b/tests/_data/acceptance_init.sql index 674a29ea9..41c0c68cd 100644 --- a/tests/_data/acceptance_init.sql +++ b/tests/_data/acceptance_init.sql @@ -1,4 +1,12 @@ +-- google_oauth INSERT INTO google_oauth (id, unit_id, email, token, updated_at) -VALUES ('42288e92-27fb-453c-9904-36a7ebd14fe2', 27266, 'test@hospodareni.loc', '1//02yV7BM31saaQCgYIAPOOREPSNwF-L9Irbcw-iJEHRUnfxt2KULTjXQkPI-jl8LEN-SwVp6OybduZT21RiDf7RZBA4ZoZu86UXC8', '2017-06-15 00:00:00'); +VALUES ('42288e92-27fb-453c-9904-36a7ebd14fe2', 27266, 'test@hospodareni.loc', + '1//02yV7BM31saaQCgYIAPOOREPSNwF-L9Irbcw-iJEHRUnfxt2KULTjXQkPI-jl8LEN-SwVp6OybduZT21RiDf7RZBA4ZoZu86UXC8', + '2017-06-15 00:00:00') + ON DUPLICATE KEY UPDATE + unit_id = VALUES(unit_id), + email = VALUES(email), + token = VALUES(token), + updated_at = VALUES(updated_at); INSERT INTO pa_bank_account (name, unit_id, token, created_at, allowed_for_subunits, number_prefix, number_number, number_bank_code) VALUES ('Acceptance', 27266, NULL, '2017-08-24 00:00:00', 1, NULL, '2000942144', '2010'); diff --git a/tests/_hacks/SoapCodeTransform.php b/tests/_hacks/SoapCodeTransform.php index 5dd44c677..9b61dfed7 100644 --- a/tests/_hacks/SoapCodeTransform.php +++ b/tests/_hacks/SoapCodeTransform.php @@ -1,13 +1,13 @@ loadSessionSnapshot('login')) { $I->amOnPage('/'); - $I->click('Akce'); return; } @@ -49,7 +48,7 @@ public function login(string $role) : void $I->fillField('(//input)[9]', self::LOGIN); $I->fillField('(//input)[10]', self::PASSWORD); $I->click('//button'); - $I->waitForText('Seznam akcí'); + $I->waitForText('Nástěnka'); $roleButtonSelector = "//button[contains(@class, 'ui--current-role')]"; diff --git a/tests/_support/IntegrationTest.php b/tests/_support/IntegrationTest.php index 8063c5197..7d81669d5 100644 --- a/tests/_support/IntegrationTest.php +++ b/tests/_support/IntegrationTest.php @@ -48,7 +48,13 @@ protected function _before() : void $this->entityManager = $this->tester->grabService(EntityManager::class); $this->metadata = array_map([$this->entityManager, 'getClassMetadata'], $this->getTestedEntities()); $this->schemaTool = new SchemaTool($this->entityManager); + // pro MySQL jistota kvůli FK + $conn = $this->entityManager->getConnection(); + $conn->executeStatement('SET FOREIGN_KEY_CHECKS=0'); + $this->schemaTool->dropSchema($this->metadata); + $conn->executeStatement('SET FOREIGN_KEY_CHECKS=1'); + $this->schemaTool->createSchema($this->metadata); } diff --git a/tests/acceptance/CampCest.php b/tests/acceptance/CampCest.php new file mode 100644 index 000000000..1810cac8a --- /dev/null +++ b/tests/acceptance/CampCest.php @@ -0,0 +1,30 @@ +I = $I; + $I->login(AcceptanceTester::UNIT_LEADER_ROLE); + } + + public function createListCamp(): void + { + $I = $this->I; + $I->wantTo('List camps'); + $I->click('Tábory'); + $I->waitForText('Tábory'); + $I->selectOption('Rok', 2024); + } +} diff --git a/tests/acceptance/EventCashbookCest.php b/tests/acceptance/EventCashbookCest.php index 0522d88fe..78b4df267 100644 --- a/tests/acceptance/EventCashbookCest.php +++ b/tests/acceptance/EventCashbookCest.php @@ -35,6 +35,7 @@ public function _before(AcceptanceTester $I): void /** @group cashbook */ public function createEventCashbook(): void { + $this->I->click('Akce'); $this->createEvent(); $this->goToCashbookPage(); $this->createExpenseChit(); diff --git a/tests/acceptance/TravelCest.php b/tests/acceptance/TravelCest.php new file mode 100644 index 000000000..0de801a69 --- /dev/null +++ b/tests/acceptance/TravelCest.php @@ -0,0 +1,270 @@ +I = $I; + $I->login(AcceptanceTester::UNIT_LEADER_ROLE); + $this->licensePlate = 'RZ-' . time(); + } + + public function createTravelOrder(AcceptanceTester $I): void + { + $name = 'Porada s vedoucími'; + $unitRepresentative = 'Pavel Zástupce'; + $licensePlate = 'RZA-' . time(); + $I->wantTo('Create travel order'); + $this->navigateToVehicle($I); + $this->newVehicle($I, $licensePlate); + $this->navigationToContract($I); + $this->newContract($I, $unitRepresentative); + $this->navigateToTravelOrder($I); + $this->newTravelOrder($I, $name, $licensePlate); + $this->navigateToTravelOrder($I); + $this->deleteTravelOrder($I, $name); + $this->navigateToVehicle($I); + $this->deleteVehicle($I, $licensePlate); + $this->navigationToContract($I); + $this->deleteContract($I, $unitRepresentative); + } + + protected function navigateToTravelOrder(AcceptanceTester $I): void + { + $I->amOnPage('/'); + $I->click('Cesťáky'); + $I->seeInCurrentUrl('/cestaky'); + } + + protected function newTravelOrder(AcceptanceTester $I, string $name, string $licensePlate): void + { + $I->click('Založit cestovní příkaz'); + $I->waitForText('Založit cestovní příkaz'); + + $I->waitForElementVisible('#frm-form-form-purpose', 10); + + $I->fillField('#frm-form-form-purpose', $name); + $I->fillField('#frm-form-form-place', 'Praha'); + $I->fillField('#frm-form-form-fellowPassengers', 'Pepa Novák, Alena Malá'); + $I->fillField('#frm-form-form-note', 'Vzít materiál ze skladu'); + + $I->selectOption('#frm-form-form-type', ['car']); + $I->click(['xpath' => '//*[@id="frm-form-form-contract_id"]/option[@value!=""][1]']); + + $I->waitForElementNotVisible('#passengerName', 5); + $I->waitForElementNotVisible('#passengerContact', 5); + $I->waitForElementNotVisible('#passengerAddress', 5); + + // (Alternativa bez smlouvy – odkomentuj a vyplň) + /* + $I->selectOption('#frm-form-form-contract_id', ''); + $I->executeJS('document.getElementById("frm-form-form-contract_id").dispatchEvent(new Event("change",{bubbles:true}));'); + $I->waitForElementVisible('#passengerName', 5); + $I->fillField('#frm-form-form-passenger-name', 'Jan Novák'); + $I->fillField('#frm-form-form-passenger-contact', '777123456'); + $I->fillField('#frm-form-form-passenger-address', 'Ulice 1, Praha'); + */ + + // 5) Vozidlo – po výběru "car" jsou pole povinná + $I->waitForElementVisible('#frm-form-form-vehicle_id', 5); + $I->selectOption('#frm-form-form-vehicle_id', ['text' => 'Osobní (' . $licensePlate . ')']); + $I->fillField('#frm-form-form-fuel_price', '38.50'); + $I->fillField('#frm-form-form-amortization', '1.20'); + + // 6) Odeslání + $I->scrollTo('footer'); + $I->waitForElementVisible('[name=send]', 5); + $I->click('[name=send]'); + + // 7) Ověření (uprav dle app – flash zpráva / redirect / nadpis) + $I->waitForText('Cestovní příkaz byl založen', 10); + $I->seeInCurrentUrl('/cestaky'); + } + + protected function deleteTravelOrder(AcceptanceTester $I, string $name): void + { + $I->click($name); + $I->waitForText('Cestovní příkaz'); + $I->click('Smazat'); + try { + $I->acceptPopup(); + } catch (Throwable) { + } + + $I->waitForText('Cestovní příkaz byl smazán.'); + } + + public function createVehicle(AcceptanceTester $I): void + { + $I->wantTo('Create vehicle'); + $this->navigateToVehicle($I); + $this->newVehicle($I, $this->licensePlate); + $this->navigateToVehicle($I); + $this->checkVehicle($I, $this->licensePlate); + $this->navigateToVehicle($I); + $this->deleteVehicle($I, $this->licensePlate); + } + + protected function navigateToVehicle(AcceptanceTester $I): void + { + $I->amOnPage('/'); + $I->click('Cesťáky'); + $I->seeInCurrentUrl('/cestaky'); + $I->click('Vozidla'); + $I->seeInCurrentUrl('/cestaky/vozidla'); + } + + protected function newVehicle(AcceptanceTester $I, string $licensePlate): void + { + $I->click('Založit nové vozidlo'); + $I->see('Nové vozidlo'); + + $I->fillField(['id' => 'frm-formCreateVehicle-type'], $this->vehicleType); + $I->fillField(['id' => 'frm-formCreateVehicle-registration'], $licensePlate); + $I->fillField(['id' => 'frm-formCreateVehicle-consumption'], $this->harmonizedConsumption); + $I->selectOption(['id' => 'frm-formCreateVehicle-subunitId'], $this->division); + $I->click('Založit'); + $I->click('Založit nové vozidlo'); + $I->see('Nové vozidlo'); + + $I->fillField(['id' => 'frm-formCreateVehicle-type'], $this->vehicleType); + $I->fillField(['id' => 'frm-formCreateVehicle-registration'], $licensePlate); + $I->fillField(['id' => 'frm-formCreateVehicle-consumption'], $this->harmonizedConsumption); + $I->selectOption(['id' => 'frm-formCreateVehicle-subunitId'], $this->division); + $I->click('Založit'); + } + + protected function checkVehicle(AcceptanceTester $I, string $licensePlate): void + { + $I->see('Vozidla'); + $I->see($licensePlate); + $I->see($this->vehicleType); + $I->see($this->division); + $I->click('#frm-grid-grid-filter-filter-search'); + $I->fillField('#frm-grid-grid-filter-filter-search', 'AUV'); + $I->pressKey('#frm-grid-grid-filter-filter-search', [WebDriverKeys::ENTER]); + $I->wait(3); + $I->dontSee($licensePlate, '#snippet-grid-grid-table'); + $I->see('Nenalezeny žádné záznamy.', '#snippet-grid-grid-table'); + $I->click('#frm-grid-grid-filter-filter-search'); + $I->fillField('#frm-grid-grid-filter-filter-search', $licensePlate); + $I->pressKey('#frm-grid-grid-filter-filter-search', [WebDriverKeys::ENTER]); + $I->waitForText($licensePlate, 10, '#snippet-grid-grid-table'); + $I->wait(3); + $I->click($licensePlate, '#snippet-grid-grid-table'); + $I->waitForText('Údaje o vozidle'); + } + + protected function deleteVehicle(AcceptanceTester $I, string $licensePlate): void + { + $I->click($licensePlate, '#snippet-grid-grid-table'); + $I->waitForText('Údaje o vozidle'); + $I->click('Smazat vozidlo'); + try { + $I->acceptPopup(); + } catch (Throwable) { + } + + $I->waitForText('Vozidlo bylo odebráno.'); + } + + public function createContact(AcceptanceTester $I): void + { + $I->wantTo('Create contract'); + $this->navigationToContract($I); + $this->newContract($I, $this->unitRepresentative); + $this->navigationToContract($I); + $this->detailContract($I, $this->unitRepresentative); + $this->navigationToContract($I); + $this->deleteContract($I, $this->unitRepresentative); + } + + protected function navigationToContract(AcceptanceTester $I): void + { + $I->amOnPage('/'); + $I->click('Cesťáky'); + $I->seeInCurrentUrl('/cestaky'); + $I->click('Smlouvy'); + $I->seeInCurrentUrl('/cestaky/smlouvy'); + $I->waitForText('Smlouvy'); + } + + protected function newContract(AcceptanceTester $I, string $unitRepresentative): void + { + $I->click('Založit smlouvu'); + $I->waitForText('Nová smlouva o proplácení cestovních náhrad'); + $I->waitForElementVisible('#frm-formCreateContract', 10); + $I->fillField('#frm-formCreateContract-passengerName', 'Jan Novák'); + $I->fillField('#frm-formCreateContract-passengerAddress', 'Ulice 1, 100 00 Praha'); + $I->fillField('#frm-formCreateContract-passengerContact', '777123456'); + $I->fillField('#frm-formCreateContract-unitRepresentative', $unitRepresentative); + $I->fillField('#frm-formCreateContract-start', '18.10.2025'); + $I->click('#frm-formCreateContract-passengerBirthday'); + $I->fillField('#frm-formCreateContract-passengerBirthday', '01.01.1990'); + $I->pressKey('#frm-formCreateContract-passengerBirthday', [WebDriverKeys::TAB]); + $I->scrollTo('footer'); + $I->click('#frm-formCreateContract [name=send]'); + $I->waitForText('Smlouva byla založena.'); + $I->see($unitRepresentative); + } + + protected function detailContract(AcceptanceTester $I, string $unitRepresentative): void + { + $I->click(sprintf('[data-test="%s"]', $unitRepresentative)); + $I->waitForElementVisible('body', 10); + $I->see('Smlouva o proplácení cestovních náhrad'); + + // --- Vytisknout -> PDF ve stejném tabu --- + $I->waitForElementVisible('[data-test="contract-print"]', 10); + $urlBefore = $I->grabFromCurrentUrl(); + $I->click('[data-test="contract-print"]'); + + $I->waitForJS('return window.location.href !== ' . json_encode($urlBefore) . ';', 10); + $I->seeInCurrentUrl('/print'); + + $I->moveBack(); + + $I->waitForText('Údaje smlouvy', 10); + } + + protected function deleteContract(AcceptanceTester $I, string $unitRepresentative): void + { + $I->click(sprintf('[data-test="%s"]', $unitRepresentative)); + $I->waitForElementVisible('body', 10); + $I->see('Smlouva o proplácení cestovních náhrad'); + $I->waitForElementVisible('[data-test="contract-delete"]', 10); + // --- Smazat --- + $I->click('[data-test="contract-delete"]'); + try { + $I->acceptPopup(); + } catch (Throwable) { + } + + $I->waitForText('Smlouva byla smazána', 10); + $I->seeInCurrentUrl('/smlouvy'); + } +} diff --git a/tests/integration/Cashbook/CashbookIntegrationTest.php b/tests/integration/Cashbook/CashbookIntegrationTest.php index d3928d44b..673dff321 100644 --- a/tests/integration/Cashbook/CashbookIntegrationTest.php +++ b/tests/integration/Cashbook/CashbookIntegrationTest.php @@ -216,7 +216,7 @@ public function testAddInverseTransferAddsChitToCalledCashbook( $this->assertTrue($event->getCashbookId()->equals($cashbookId)); } - /** @return list>> */ + /** @return list> */ public function getValidTransfers(): array { return [ // expense -> income diff --git a/tests/integration/config/doctrine.neon b/tests/integration/config/doctrine.neon index 7296aab66..8df06db3d 100644 --- a/tests/integration/config/doctrine.neon +++ b/tests/integration/config/doctrine.neon @@ -10,11 +10,16 @@ services: - Model\Common\Services\MessengerCommandBus(@messenger.commandBus.bus) - Model\Common\Services\MessengerQueryBus(@messenger.queryBus.bus) - Model\Common\Services\MessengerEventBus(@messenger.eventBus.bus) + http.response: + factory: Tests\Http\NoOpResponse + type: Nette\Http\IResponse + extensions: console: Contributte\Console\DI\ConsoleExtension(%consoleMode%) decorator: Nette\DI\Extensions\DecoratorExtension # default extension in Nette DI messenger: Fmasa\Messenger\DI\MessengerExtension + http: Nette\Bridges\HttpDI\HttpExtension messenger: buses: diff --git a/tests/object-manager.php b/tests/object-manager.php index d2d92ba01..fd2179666 100644 --- a/tests/object-manager.php +++ b/tests/object-manager.php @@ -10,6 +10,7 @@ use Doctrine\Persistence\ObjectManager; use Nette\Bootstrap\Configurator; use Nette\DI\Extensions\ExtensionsExtension; +use Tracy\Bridges\Nette\TracyExtension; require __DIR__ . '/../vendor/autoload.php'; @@ -29,7 +30,7 @@ $configurator->defaultExtensions = [ 'extensions' => ExtensionsExtension::class, - 'tracy' => [Tracy\Bridges\Nette\TracyExtension::class, ['%debugMode%', '%consoleMode%']], + 'tracy' => [TracyExtension::class, ['%debugMode%', '%consoleMode%']], ]; $configurator->addStaticParameters(['env' => getenv()]); diff --git a/tests/unit/BankServiceTest.php b/tests/unit/BankServiceTest.php index 7148ca976..e11cc29da 100644 --- a/tests/unit/BankServiceTest.php +++ b/tests/unit/BankServiceTest.php @@ -200,7 +200,7 @@ public function testDefaultIntervalIsUsedForGroupThatIsNotPairedYetWhenPairingMu ->once() ->withArgs( fn (ChronosDate $since, ChronosDate $until) => $since->equals(ChronosDate::today()->subDays(60)) - && $until->equals(ChronosDate::today()) + && $until->equals(ChronosDate::today()), ) ->andReturn($transactions1); diff --git a/webpack.config.js b/webpack.config.js index 8ee089251..a4abf240c 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -33,7 +33,17 @@ export default { MiniCssExtractPlugin.loader, 'css-loader', 'postcss-loader', - 'sass-loader', + { + loader: 'sass-loader', + options: { + sassOptions: { + // umlčí warnings z node_modules (Bootstrap apod.) + quietDeps: true, + // volitelné – potlačí konkrétní typy hlášek (Sass >=1.77) + silenceDeprecations: ['mixed-decls', 'color-functions', 'import'], + }, + }, + }, ], } ] diff --git a/www/images/front/ChatIcons/badge.png b/www/images/front/ChatIcons/badge.png new file mode 100644 index 000000000..ce70a1480 Binary files /dev/null and b/www/images/front/ChatIcons/badge.png differ diff --git a/www/images/front/ChatIcons/calculate.png b/www/images/front/ChatIcons/calculate.png new file mode 100644 index 000000000..5d45f53cf Binary files /dev/null and b/www/images/front/ChatIcons/calculate.png differ diff --git a/www/images/front/ChatIcons/database.png b/www/images/front/ChatIcons/database.png new file mode 100644 index 000000000..3a80b3dd6 Binary files /dev/null and b/www/images/front/ChatIcons/database.png differ diff --git a/www/images/front/ChatIcons/file.png b/www/images/front/ChatIcons/file.png new file mode 100644 index 000000000..8af8b6361 Binary files /dev/null and b/www/images/front/ChatIcons/file.png differ diff --git a/www/images/front/ChatIcons/house.png b/www/images/front/ChatIcons/house.png new file mode 100644 index 000000000..3556ebca5 Binary files /dev/null and b/www/images/front/ChatIcons/house.png differ diff --git a/www/images/front/ChatIcons/intro1.png b/www/images/front/ChatIcons/intro1.png new file mode 100644 index 000000000..584acda31 Binary files /dev/null and b/www/images/front/ChatIcons/intro1.png differ diff --git a/www/images/front/badge.png b/www/images/front/badge.png new file mode 100644 index 000000000..606396dd3 Binary files /dev/null and b/www/images/front/badge.png differ diff --git a/www/images/front/calculate.png b/www/images/front/calculate.png new file mode 100644 index 000000000..4774cc43c Binary files /dev/null and b/www/images/front/calculate.png differ diff --git a/www/images/front/database.png b/www/images/front/database.png new file mode 100644 index 000000000..d41d8fa6a Binary files /dev/null and b/www/images/front/database.png differ diff --git a/www/images/front/file.png b/www/images/front/file.png new file mode 100644 index 000000000..707eb9f23 Binary files /dev/null and b/www/images/front/file.png differ diff --git a/www/images/front/house.png b/www/images/front/house.png new file mode 100644 index 000000000..8cbb83f33 Binary files /dev/null and b/www/images/front/house.png differ diff --git a/www/images/front/integration.png b/www/images/front/integration.png new file mode 100644 index 000000000..141b16c9b Binary files /dev/null and b/www/images/front/integration.png differ diff --git a/www/images/front/intro1.png b/www/images/front/intro1.png new file mode 100644 index 000000000..0abd2efc2 Binary files /dev/null and b/www/images/front/intro1.png differ diff --git a/www/images/front/old/1/pokladni-kniha.png b/www/images/front/old/1/pokladni-kniha.png deleted file mode 100755 index c86426cec..000000000 Binary files a/www/images/front/old/1/pokladni-kniha.png and /dev/null differ diff --git a/www/images/front/old/1/prehled-akci.png b/www/images/front/old/1/prehled-akci.png deleted file mode 100755 index d2223dcfa..000000000 Binary files a/www/images/front/old/1/prehled-akci.png and /dev/null differ diff --git a/www/images/front/old/1/seznam-ucastniku-akce.png b/www/images/front/old/1/seznam-ucastniku-akce.png deleted file mode 100644 index 5b1f4e8d6..000000000 Binary files a/www/images/front/old/1/seznam-ucastniku-akce.png and /dev/null differ diff --git a/www/images/front/old/1/zakladni-udaje-akce.png b/www/images/front/old/1/zakladni-udaje-akce.png deleted file mode 100755 index 09f79bb93..000000000 Binary files a/www/images/front/old/1/zakladni-udaje-akce.png and /dev/null differ diff --git a/www/images/front/old/2/pokladni-kniha.png b/www/images/front/old/2/pokladni-kniha.png deleted file mode 100644 index 5104b609f..000000000 Binary files a/www/images/front/old/2/pokladni-kniha.png and /dev/null differ diff --git a/www/images/front/old/2/prehled-akci.png b/www/images/front/old/2/prehled-akci.png deleted file mode 100644 index 2f0e14cd8..000000000 Binary files a/www/images/front/old/2/prehled-akci.png and /dev/null differ diff --git a/www/images/front/old/2/seznam-ucastniku-akce.png b/www/images/front/old/2/seznam-ucastniku-akce.png deleted file mode 100644 index 986b3f146..000000000 Binary files a/www/images/front/old/2/seznam-ucastniku-akce.png and /dev/null differ diff --git a/www/images/front/old/2/zakladni-udaje-akce.png b/www/images/front/old/2/zakladni-udaje-akce.png deleted file mode 100644 index 5833a6b46..000000000 Binary files a/www/images/front/old/2/zakladni-udaje-akce.png and /dev/null differ diff --git a/www/images/front/old/3/pokladni-kniha.png b/www/images/front/old/3/pokladni-kniha.png deleted file mode 100644 index 040bfcce3..000000000 Binary files a/www/images/front/old/3/pokladni-kniha.png and /dev/null differ diff --git a/www/images/front/old/3/prehled-akci.png b/www/images/front/old/3/prehled-akci.png deleted file mode 100644 index 7ecfce008..000000000 Binary files a/www/images/front/old/3/prehled-akci.png and /dev/null differ diff --git a/www/images/front/old/3/seznam-ucastniku-akce.png b/www/images/front/old/3/seznam-ucastniku-akce.png deleted file mode 100644 index 986b3f146..000000000 Binary files a/www/images/front/old/3/seznam-ucastniku-akce.png and /dev/null differ diff --git a/www/images/front/old/3/zakladni-udaje-akce.png b/www/images/front/old/3/zakladni-udaje-akce.png deleted file mode 100644 index 97525d38e..000000000 Binary files a/www/images/front/old/3/zakladni-udaje-akce.png and /dev/null differ diff --git a/www/images/front/pokladni-kniha.png b/www/images/front/pokladni-kniha.png deleted file mode 100644 index 46836d789..000000000 Binary files a/www/images/front/pokladni-kniha.png and /dev/null differ diff --git a/www/images/front/prehled-akci.png b/www/images/front/prehled-akci.png deleted file mode 100644 index 11f4d2ee6..000000000 Binary files a/www/images/front/prehled-akci.png and /dev/null differ diff --git a/www/images/front/seznam-ucastniku-akce.png b/www/images/front/seznam-ucastniku-akce.png deleted file mode 100644 index 367554a58..000000000 Binary files a/www/images/front/seznam-ucastniku-akce.png and /dev/null differ diff --git a/www/images/front/support.png b/www/images/front/support.png new file mode 100644 index 000000000..73938a50e Binary files /dev/null and b/www/images/front/support.png differ diff --git a/www/images/front/zakladni-udaje-akce.png b/www/images/front/zakladni-udaje-akce.png deleted file mode 100644 index 03df3d5bb..000000000 Binary files a/www/images/front/zakladni-udaje-akce.png and /dev/null differ