mirror of
				https://gitlab.com/Chill-Projet/chill-bundles.git
				synced 2025-11-03 18:58:24 +00:00 
			
		
		
		
	Compare commits
	
		
			5 Commits
		
	
	
		
			fix-test-a
			...
			feature-ad
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					06aa672133 | ||
| 77943a69fb | |||
| 
						 | 
					7fbb8a9fb0 | ||
| 
						 | 
					535f57bb68 | ||
| 
						 | 
					d53caf1f37 | 
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -19,4 +19,3 @@ docs/build/
 | 
			
		||||
/phpunit.xml
 | 
			
		||||
.phpunit.result.cache
 | 
			
		||||
###< phpunit/phpunit ###
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -11,15 +11,14 @@ before_script:
 | 
			
		||||
  - PGPASSWORD=$POSTGRES_PASSWORD psql -U $POSTGRES_USER -h db -c "CREATE EXTENSION IF NOT EXISTS unaccent; CREATE EXTENSION IF NOT EXISTS pg_trgm;"
 | 
			
		||||
  # Install and run Composer
 | 
			
		||||
  - curl -sS https://getcomposer.org/installer | php
 | 
			
		||||
  - php -d memory_limit=2G composer.phar install
 | 
			
		||||
  - php composer.phar install
 | 
			
		||||
  - php tests/app/bin/console doctrine:migrations:migrate -n
 | 
			
		||||
  - php -d memory_limit=2G tests/app/bin/console doctrine:fixtures:load -n
 | 
			
		||||
  - echo "before_script finished"
 | 
			
		||||
  - php tests/app/bin/console doctrine:fixtures:load -n
 | 
			
		||||
 | 
			
		||||
# Bring in any services we need http://docs.gitlab.com/ee/ci/docker/using_docker_images.html#what-is-a-service
 | 
			
		||||
# See http://docs.gitlab.com/ee/ci/services/README.html for examples.
 | 
			
		||||
services:
 | 
			
		||||
  - name: postgis/postgis:12-3.1-alpine
 | 
			
		||||
  - name: postgres:12
 | 
			
		||||
    alias: db
 | 
			
		||||
  - name: redis
 | 
			
		||||
    alias: redis
 | 
			
		||||
@@ -31,12 +30,8 @@ variables:
 | 
			
		||||
  POSTGRES_PASSWORD: postgres
 | 
			
		||||
  # fetch the chill-app using git submodules
 | 
			
		||||
  GIT_SUBMODULE_STRATEGY: recursive
 | 
			
		||||
  REDIS_HOST: redis
 | 
			
		||||
  REDIS_PORT: 6379
 | 
			
		||||
  REDIS_URL: redis://redis:6379
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Run our tests
 | 
			
		||||
test:
 | 
			
		||||
  script:
 | 
			
		||||
    - php -d memory_limit=3G bin/phpunit --colors=never
 | 
			
		||||
    - bin/phpunit --colors=never
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										25
									
								
								.php_cs.dist
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								.php_cs.dist
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,25 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
$config = require __DIR__ . '/vendor/drupol/php-conventions/config/php73/php_cs_fixer.config.php';
 | 
			
		||||
 | 
			
		||||
$config
 | 
			
		||||
    ->getFinder()
 | 
			
		||||
    ->ignoreDotFiles(false)
 | 
			
		||||
    ->name(['.php_cs.dist']);
 | 
			
		||||
 | 
			
		||||
$rules = $config->getRules();
 | 
			
		||||
 | 
			
		||||
$rules['header_comment']['header'] = trim(file_get_contents(__DIR__ . '/resource/header.txt'));
 | 
			
		||||
 | 
			
		||||
return $config->setRules($rules);
 | 
			
		||||
							
								
								
									
										8
									
								
								LICENSE
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								LICENSE
									
									
									
									
									
								
							@@ -629,12 +629,12 @@ to attach them to the start of each source file to most effectively
 | 
			
		||||
state the exclusion of warranty; and each file should have at least
 | 
			
		||||
the "copyright" line and a pointer to where the full notice is found.
 | 
			
		||||
 | 
			
		||||
    chill-bundles
 | 
			
		||||
    Copyright (C) 2021  Chill Project
 | 
			
		||||
    <one line to give the program's name and a brief idea of what it does.>
 | 
			
		||||
    Copyright (C) <year>  <name of author>
 | 
			
		||||
 | 
			
		||||
    This program is free software: you can redistribute it and/or modify
 | 
			
		||||
    it under the terms of the GNU Affero General Public License as published
 | 
			
		||||
    by the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
    it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
    the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
    (at your option) any later version.
 | 
			
		||||
 | 
			
		||||
    This program is distributed in the hope that it will be useful,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +0,0 @@
 | 
			
		||||
# Chill framework
 | 
			
		||||
 | 
			
		||||
Documentation of the Chill software.
 | 
			
		||||
 | 
			
		||||
The online documentation can be found at http://docs.chill.social
 | 
			
		||||
 | 
			
		||||
See the [`docs`][1] directory for more.
 | 
			
		||||
 | 
			
		||||
[1]: docs/README.md
 | 
			
		||||
@@ -58,13 +58,13 @@
 | 
			
		||||
        "symfony/css-selector": "^5.2",
 | 
			
		||||
        "twig/markdown-extra": "^3.3",
 | 
			
		||||
        "erusev/parsedown": "^1.7",
 | 
			
		||||
        "symfony/serializer": "^5.2",
 | 
			
		||||
        "symfony/webpack-encore-bundle": "^1.11"
 | 
			
		||||
        "symfony/serializer": "^5.2"
 | 
			
		||||
    },
 | 
			
		||||
    "conflict": {
 | 
			
		||||
        "symfony/symfony": "*"
 | 
			
		||||
    },
 | 
			
		||||
    "require-dev": {
 | 
			
		||||
        "drupol/php-conventions": "4.*",
 | 
			
		||||
        "fakerphp/faker": "^1.13",
 | 
			
		||||
        "phpunit/phpunit": "^7.0",
 | 
			
		||||
        "symfony/dotenv": "^5.1",
 | 
			
		||||
@@ -74,8 +74,7 @@
 | 
			
		||||
        "symfony/web-profiler-bundle": "^5.0",
 | 
			
		||||
        "symfony/var-dumper": "4.*",
 | 
			
		||||
        "symfony/debug-bundle": "^5.1",
 | 
			
		||||
        "symfony/phpunit-bridge": "^5.2",
 | 
			
		||||
        "nelmio/alice": "^3.8"
 | 
			
		||||
        "symfony/phpunit-bridge": "^5.2"
 | 
			
		||||
    },
 | 
			
		||||
    "scripts": {
 | 
			
		||||
        "auto-scripts": {
 | 
			
		||||
@@ -84,7 +83,6 @@
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "config": {
 | 
			
		||||
      "vendor-dir": "tests/app/vendor",
 | 
			
		||||
      "bin-dir": "bin"
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,123 +1,128 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\PersonBundle\Export\Filter;
 | 
			
		||||
 | 
			
		||||
use Chill\MainBundle\Export\ExportElementValidatedInterface;
 | 
			
		||||
use Chill\MainBundle\Export\FilterInterface;
 | 
			
		||||
use DateTime;
 | 
			
		||||
use Doctrine\ORM\Query\Expr;
 | 
			
		||||
use Symfony\Component\Form\Extension\Core\Type\DateType;
 | 
			
		||||
use Symfony\Component\Validator\Context\ExecutionContextInterface;
 | 
			
		||||
use Symfony\Component\Validator\Constraints;
 | 
			
		||||
use Symfony\Component\Form\FormEvent;
 | 
			
		||||
use Symfony\Component\Form\FormEvents;
 | 
			
		||||
use Doctrine\ORM\Query\Expr;
 | 
			
		||||
use Chill\MainBundle\Form\Type\Export\FilterType;
 | 
			
		||||
use Symfony\Component\Form\FormError;
 | 
			
		||||
use Chill\MainBundle\Export\ExportElementValidatedInterface;
 | 
			
		||||
 | 
			
		||||
class BirthdateFilter implements FilterInterface, ExportElementValidatedInterface
 | 
			
		||||
class BirthdateFilter implements ExportElementValidatedInterface, FilterInterface
 | 
			
		||||
{
 | 
			
		||||
    // add specific role for this filter    
 | 
			
		||||
    // add specific role for this filter
 | 
			
		||||
    public function addRole()
 | 
			
		||||
    {
 | 
			
		||||
        // we do not need any new role for this filter, so we return null
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // here, we alter the query created by Export
 | 
			
		||||
    public function alterQuery(\Doctrine\ORM\QueryBuilder $qb, $data)
 | 
			
		||||
    {
 | 
			
		||||
        $where = $qb->getDQLPart('where');
 | 
			
		||||
        // we create the clause here
 | 
			
		||||
        $clause = $qb->expr()->between(
 | 
			
		||||
            'person.birthdate',
 | 
			
		||||
            ':date_from',
 | 
			
		||||
            ':date_to'
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        // we have to take care **not to** remove previous clauses...
 | 
			
		||||
        if ($where instanceof Expr\Andx) {
 | 
			
		||||
            $where->add($clause);
 | 
			
		||||
        } else {
 | 
			
		||||
            $where = $qb->expr()->andX($clause);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $qb->add('where', $where);
 | 
			
		||||
        // we add parameters from $data. $data contains the parameters from the form
 | 
			
		||||
        $qb->setParameter('date_from', $data['date_from']);
 | 
			
		||||
        $qb->setParameter('date_to', $data['date_to']);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // we give information on which type of export this filter applies
 | 
			
		||||
    public function applyOn()
 | 
			
		||||
    {
 | 
			
		||||
        return 'person';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getTitle()
 | 
			
		||||
    {
 | 
			
		||||
        return 'Filter by person\'s birthdate';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // we build a form to collect some parameters from the users
 | 
			
		||||
    public function buildForm(\Symfony\Component\Form\FormBuilderInterface $builder)
 | 
			
		||||
    {
 | 
			
		||||
        $builder->add('date_from', DateType::class, array(
 | 
			
		||||
            'label' => "Born after this date",
 | 
			
		||||
            'data'  => new \DateTime(),
 | 
			
		||||
            'attr'  => array('class' => 'datepicker'),
 | 
			
		||||
            'widget'=> 'single_text',
 | 
			
		||||
        $builder->add('date_from', DateType::class, [
 | 
			
		||||
            'label' => 'Born after this date',
 | 
			
		||||
            'data' => new DateTime(),
 | 
			
		||||
            'attr' => ['class' => 'datepicker'],
 | 
			
		||||
            'widget' => 'single_text',
 | 
			
		||||
            'format' => 'dd-MM-yyyy',
 | 
			
		||||
        ));
 | 
			
		||||
        
 | 
			
		||||
        $builder->add('date_to', DateType::class, array(
 | 
			
		||||
            'label' => "Born before this date",
 | 
			
		||||
            'data'  => new \DateTime(),
 | 
			
		||||
            'attr'  => array('class' => 'datepicker'),
 | 
			
		||||
            'widget'=> 'single_text',
 | 
			
		||||
        ]);
 | 
			
		||||
 | 
			
		||||
        $builder->add('date_to', DateType::class, [
 | 
			
		||||
            'label' => 'Born before this date',
 | 
			
		||||
            'data' => new DateTime(),
 | 
			
		||||
            'attr' => ['class' => 'datepicker'],
 | 
			
		||||
            'widget' => 'single_text',
 | 
			
		||||
            'format' => 'dd-MM-yyyy',
 | 
			
		||||
        ));
 | 
			
		||||
        
 | 
			
		||||
    }
 | 
			
		||||
   
 | 
			
		||||
    // the form created above must be validated. The process of validation
 | 
			
		||||
    // is executed here. This function is added by the interface 
 | 
			
		||||
    // `ExportElementValidatedInterface`, and can be ignore if there is 
 | 
			
		||||
    // no need for a validation
 | 
			
		||||
    public function validateForm($data, ExecutionContextInterface $context)
 | 
			
		||||
    { 
 | 
			
		||||
        $date_from = $data['date_from'];
 | 
			
		||||
        $date_to   = $data['date_to'];
 | 
			
		||||
        
 | 
			
		||||
        if ($date_from === null) {
 | 
			
		||||
            $context->buildViolation('The "date from" should not be empty')
 | 
			
		||||
                //->atPath('date_from')
 | 
			
		||||
                ->addViolation();
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        if ($date_to === null) {
 | 
			
		||||
            $context->buildViolation('The "date to" should not be empty')
 | 
			
		||||
                //->atPath('date_to')
 | 
			
		||||
                ->addViolation();
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        if (
 | 
			
		||||
            ($date_from !== null && $date_to !== null)
 | 
			
		||||
            &&
 | 
			
		||||
            $date_from >= $date_to
 | 
			
		||||
        ) {
 | 
			
		||||
            $context->buildViolation('The date "date to" should be after the '
 | 
			
		||||
                . 'date given in "date from" field')
 | 
			
		||||
                ->addViolation();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    // here, we alter the query created by Export
 | 
			
		||||
    public function alterQuery(\Doctrine\ORM\QueryBuilder $qb, $data)
 | 
			
		||||
    {
 | 
			
		||||
        $where = $qb->getDQLPart('where');
 | 
			
		||||
        // we create the clause here
 | 
			
		||||
        $clause = $qb->expr()->between('person.birthdate', ':date_from', 
 | 
			
		||||
            ':date_to');
 | 
			
		||||
 | 
			
		||||
        // we have to take care **not to** remove previous clauses...
 | 
			
		||||
        if ($where instanceof Expr\Andx) {
 | 
			
		||||
            $where->add($clause);
 | 
			
		||||
        } else {
 | 
			
		||||
            $where = $qb->expr()->andX($clause);
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        $qb->add('where', $where);
 | 
			
		||||
        // we add parameters from $data. $data contains the parameters from the form
 | 
			
		||||
        $qb->setParameter('date_from', $data['date_from']);
 | 
			
		||||
        $qb->setParameter('date_to', $data['date_to']);
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // here, we create a simple string which will describe the action of
 | 
			
		||||
    // the filter in the Response
 | 
			
		||||
    public function describeAction($data, $format = 'string')
 | 
			
		||||
    {
 | 
			
		||||
        return array('Filtered by person\'s birtdate: '
 | 
			
		||||
            . 'between %date_from% and %date_to%', array(
 | 
			
		||||
        return ['Filtered by person\'s birtdate: '
 | 
			
		||||
            . 'between %date_from% and %date_to%', [
 | 
			
		||||
                '%date_from%' => $data['date_from']->format('d-m-Y'),
 | 
			
		||||
                '%date_to%'   => $data['date_to']->format('d-m-Y')
 | 
			
		||||
            ));
 | 
			
		||||
                '%date_to%' => $data['date_to']->format('d-m-Y'),
 | 
			
		||||
            ], ];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getTitle()
 | 
			
		||||
    {
 | 
			
		||||
        return 'Filter by person\'s birthdate';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // the form created above must be validated. The process of validation
 | 
			
		||||
    // is executed here. This function is added by the interface
 | 
			
		||||
    // `ExportElementValidatedInterface`, and can be ignore if there is
 | 
			
		||||
    // no need for a validation
 | 
			
		||||
    public function validateForm($data, ExecutionContextInterface $context)
 | 
			
		||||
    {
 | 
			
		||||
        $date_from = $data['date_from'];
 | 
			
		||||
        $date_to = $data['date_to'];
 | 
			
		||||
 | 
			
		||||
        if (null === $date_from) {
 | 
			
		||||
            $context->buildViolation('The "date from" should not be empty')
 | 
			
		||||
                //->atPath('date_from')
 | 
			
		||||
                ->addViolation();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (null === $date_to) {
 | 
			
		||||
            $context->buildViolation('The "date to" should not be empty')
 | 
			
		||||
                //->atPath('date_to')
 | 
			
		||||
                ->addViolation();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (
 | 
			
		||||
            (null !== $date_from && null !== $date_to)
 | 
			
		||||
            && $date_from >= $date_to
 | 
			
		||||
        ) {
 | 
			
		||||
            $context->buildViolation('The date "date to" should be after the '
 | 
			
		||||
                . 'date given in "date from" field')
 | 
			
		||||
                ->addViolation();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,118 +1,121 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\PersonBundle\Export\Export;
 | 
			
		||||
 | 
			
		||||
use Chill\MainBundle\Export\ExportInterface;
 | 
			
		||||
use Doctrine\ORM\QueryBuilder;
 | 
			
		||||
use Symfony\Component\Form\FormBuilderInterface;
 | 
			
		||||
use Doctrine\ORM\Query;
 | 
			
		||||
use Chill\PersonBundle\Security\Authorization\PersonVoter;
 | 
			
		||||
use Symfony\Component\Security\Core\Role\Role;
 | 
			
		||||
use Chill\PersonBundle\Export\Declarations;
 | 
			
		||||
use Chill\MainBundle\Export\FormatterInterface;
 | 
			
		||||
use Chill\PersonBundle\Export\Declarations;
 | 
			
		||||
use Chill\PersonBundle\Security\Authorization\PersonVoter;
 | 
			
		||||
use Doctrine\ORM\EntityManagerInterface;
 | 
			
		||||
use Doctrine\ORM\Query;
 | 
			
		||||
use Symfony\Component\Form\FormBuilderInterface;
 | 
			
		||||
use Symfony\Component\Security\Core\Role\Role;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 
 | 
			
		||||
 *
 | 
			
		||||
 * @author Julien Fastré <julien.fastre@champs-libres.coop>
 | 
			
		||||
 */
 | 
			
		||||
class CountPerson implements ExportInterface
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     *
 | 
			
		||||
     * @var EntityManagerInterface
 | 
			
		||||
     */
 | 
			
		||||
    protected $entityManager;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    public function __construct(
 | 
			
		||||
            EntityManagerInterface $em
 | 
			
		||||
            )
 | 
			
		||||
    {
 | 
			
		||||
        EntityManagerInterface $em
 | 
			
		||||
    ) {
 | 
			
		||||
        $this->entityManager = $em;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public function getType()
 | 
			
		||||
 | 
			
		||||
    public function buildForm(FormBuilderInterface $builder)
 | 
			
		||||
    {
 | 
			
		||||
        return Declarations::PERSON_TYPE;
 | 
			
		||||
        // this export does not add any form
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    public function getAllowedFormattersTypes()
 | 
			
		||||
    {
 | 
			
		||||
        return [FormatterInterface::TYPE_TABULAR];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getDescription()
 | 
			
		||||
    {
 | 
			
		||||
        return "Count peoples by various parameters.";
 | 
			
		||||
        return 'Count peoples by various parameters.';
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public function getTitle()
 | 
			
		||||
 | 
			
		||||
    public function getLabels($key, array $values, $data)
 | 
			
		||||
    {
 | 
			
		||||
        return "Count peoples";
 | 
			
		||||
        // the Closure which will be executed by the formatter.
 | 
			
		||||
        return function ($value) {
 | 
			
		||||
            switch ($value) {
 | 
			
		||||
                case '_header':
 | 
			
		||||
                  // we have to process specifically the '_header' string,
 | 
			
		||||
                  // which will be used by the formatter to show a column title
 | 
			
		||||
                    return $this->getTitle();
 | 
			
		||||
 | 
			
		||||
                default:
 | 
			
		||||
                  // for all value, we do not process them and return them
 | 
			
		||||
                  // immediatly
 | 
			
		||||
                    return $value;
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public function requiredRole()
 | 
			
		||||
    {
 | 
			
		||||
        return new Role(PersonVoter::STATS);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public function initiateQuery(array $requiredModifiers,  array $acl, array $data = array())
 | 
			
		||||
    {
 | 
			
		||||
        // we gather all center the user choose.
 | 
			
		||||
        $centers = array_map(function($el) { return $el['center']; }, $acl);
 | 
			
		||||
        
 | 
			
		||||
        $qb = $this->entityManager->createQueryBuilder();
 | 
			
		||||
        
 | 
			
		||||
        $qb->select('COUNT(person.id) AS export_result')
 | 
			
		||||
                ->from('ChillPersonBundle:Person', 'person')
 | 
			
		||||
                ->join('person.center', 'center')
 | 
			
		||||
                ->andWhere('center IN (:authorized_centers)')
 | 
			
		||||
                ->setParameter('authorized_centers', $centers);
 | 
			
		||||
                ;
 | 
			
		||||
        
 | 
			
		||||
        
 | 
			
		||||
        return $qb;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public function getResult($qb, $data)
 | 
			
		||||
    {
 | 
			
		||||
        return $qb->getQuery()->getResult(Query::HYDRATE_SCALAR);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    public function getQueryKeys($data)
 | 
			
		||||
    {
 | 
			
		||||
        // this array match the result keys in the query. We have only
 | 
			
		||||
        // one column.
 | 
			
		||||
        return array('export_result');
 | 
			
		||||
        return ['export_result'];
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public function getLabels($key, array $values, $data)
 | 
			
		||||
 | 
			
		||||
    public function getResult($qb, $data)
 | 
			
		||||
    {
 | 
			
		||||
        
 | 
			
		||||
        // the Closure which will be executed by the formatter. 
 | 
			
		||||
        return function($value) {
 | 
			
		||||
            switch($value) {
 | 
			
		||||
                case '_header':
 | 
			
		||||
                  // we have to process specifically the '_header' string, 
 | 
			
		||||
                  // which will be used by the formatter to show a column title
 | 
			
		||||
                  return $this->getTitle();
 | 
			
		||||
                default:
 | 
			
		||||
                  // for all value, we do not process them and return them
 | 
			
		||||
                  // immediatly
 | 
			
		||||
                  return $value;
 | 
			
		||||
        };
 | 
			
		||||
        return $qb->getQuery()->getResult(Query::HYDRATE_SCALAR);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public function getAllowedFormattersTypes()
 | 
			
		||||
 | 
			
		||||
    public function getTitle()
 | 
			
		||||
    {
 | 
			
		||||
        return array(FormatterInterface::TYPE_TABULAR);
 | 
			
		||||
        return 'Count peoples';
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public function buildForm(FormBuilderInterface $builder) {
 | 
			
		||||
        // this export does not add any form
 | 
			
		||||
 | 
			
		||||
    public function getType()
 | 
			
		||||
    {
 | 
			
		||||
        return Declarations::PERSON_TYPE;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    public function initiateQuery(array $requiredModifiers, array $acl, array $data = [])
 | 
			
		||||
    {
 | 
			
		||||
        // we gather all center the user choose.
 | 
			
		||||
        $centers = array_map(static function ($el) {
 | 
			
		||||
            return $el['center'];
 | 
			
		||||
        }, $acl);
 | 
			
		||||
 | 
			
		||||
        $qb = $this->entityManager->createQueryBuilder();
 | 
			
		||||
 | 
			
		||||
        $qb->select('COUNT(person.id) AS export_result')
 | 
			
		||||
            ->from('ChillPersonBundle:Person', 'person')
 | 
			
		||||
            ->join('person.center', 'center')
 | 
			
		||||
            ->andWhere('center IN (:authorized_centers)')
 | 
			
		||||
            ->setParameter('authorized_centers', $centers);
 | 
			
		||||
 | 
			
		||||
        return $qb;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function requiredRole()
 | 
			
		||||
    {
 | 
			
		||||
        return new Role(PersonVoter::STATS);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function supportsModifiers()
 | 
			
		||||
    {
 | 
			
		||||
        // explain the export manager which formatters and filters are allowed
 | 
			
		||||
        return array(Declarations::PERSON_TYPE, Declarations::PERSON_IMPLIED_IN);
 | 
			
		||||
        return [Declarations::PERSON_TYPE, Declarations::PERSON_IMPLIED_IN];
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,747 +0,0 @@
 | 
			
		||||
.. Copyright (C)  2014 Champs Libres Cooperative SCRLFS
 | 
			
		||||
   Permission is granted to copy, distribute and/or modify this document
 | 
			
		||||
   under the terms of the GNU Free Documentation License, Version 1.3
 | 
			
		||||
   or any later version published by the Free Software Foundation;
 | 
			
		||||
   with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
 | 
			
		||||
   A copy of the license is included in the section entitled "GNU
 | 
			
		||||
   Free Documentation License".
 | 
			
		||||
 | 
			
		||||
.. _api:
 | 
			
		||||
 | 
			
		||||
API
 | 
			
		||||
###
 | 
			
		||||
 | 
			
		||||
Chill provides a basic framework to build REST api.
 | 
			
		||||
 | 
			
		||||
Basic configuration
 | 
			
		||||
*******************
 | 
			
		||||
 | 
			
		||||
Configure a route
 | 
			
		||||
=================
 | 
			
		||||
 | 
			
		||||
Follow those steps to build a REST api:
 | 
			
		||||
 | 
			
		||||
1. Create your model;
 | 
			
		||||
2. Configure the API;
 | 
			
		||||
 | 
			
		||||
You can also:
 | 
			
		||||
 | 
			
		||||
* hook into the controller to customize some steps;
 | 
			
		||||
* add more route and steps
 | 
			
		||||
 | 
			
		||||
.. note::
 | 
			
		||||
 | 
			
		||||
    Useful links:
 | 
			
		||||
 | 
			
		||||
    * `How to use annotation to configure serialization <https://symfony.com/doc/current/serializer.html>`_
 | 
			
		||||
    * `How to create your custom normalizer <https://symfony.com/doc/current/serializer/custom_normalizer.html>`_
 | 
			
		||||
 | 
			
		||||
Auto-loading the routes
 | 
			
		||||
=======================
 | 
			
		||||
 | 
			
		||||
Ensure that those lines are present in your file `app/config/routing.yml`:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.. code-block:: yaml
 | 
			
		||||
 | 
			
		||||
   chill_cruds:
 | 
			
		||||
       resource: 'chill_main_crud_route_loader:load'
 | 
			
		||||
       type: service
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Create your model
 | 
			
		||||
=================
 | 
			
		||||
 | 
			
		||||
Create your model on the usual way:
 | 
			
		||||
 | 
			
		||||
.. code-block:: php
 | 
			
		||||
 | 
			
		||||
   namespace Chill\PersonBundle\Entity\AccompanyingPeriod;
 | 
			
		||||
 | 
			
		||||
   use Chill\PersonBundle\Entity\AccompanyingPeriod\OriginRepository;
 | 
			
		||||
   use Doctrine\ORM\Mapping as ORM;
 | 
			
		||||
 | 
			
		||||
   /**
 | 
			
		||||
    * @ORM\Entity(repositoryClass=OriginRepository::class)
 | 
			
		||||
    * @ORM\Table(name="chill_person_accompanying_period_origin")
 | 
			
		||||
    */
 | 
			
		||||
   class Origin
 | 
			
		||||
   {
 | 
			
		||||
       /**
 | 
			
		||||
        * @ORM\Id
 | 
			
		||||
        * @ORM\GeneratedValue
 | 
			
		||||
        * @ORM\Column(type="integer")
 | 
			
		||||
        */
 | 
			
		||||
       private $id;
 | 
			
		||||
 | 
			
		||||
       /**
 | 
			
		||||
        * @ORM\Column(type="json")
 | 
			
		||||
        */
 | 
			
		||||
       private $label;
 | 
			
		||||
 | 
			
		||||
       /**
 | 
			
		||||
        * @ORM\Column(type="date_immutable", nullable=true)
 | 
			
		||||
        */
 | 
			
		||||
       private $noActiveAfter;
 | 
			
		||||
 | 
			
		||||
       // .. getters and setters
 | 
			
		||||
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Configure api
 | 
			
		||||
=============
 | 
			
		||||
 | 
			
		||||
Configure the api using Yaml (see the full configuration: :ref:`api_full_configuration`):
 | 
			
		||||
 | 
			
		||||
.. code-block:: yaml
 | 
			
		||||
 | 
			
		||||
   # config/packages/chill_main.yaml
 | 
			
		||||
   chill_main:
 | 
			
		||||
       apis:
 | 
			
		||||
           accompanying_period_origin:
 | 
			
		||||
               base_path: '/api/1.0/person/accompanying-period/origin'
 | 
			
		||||
               class: 'Chill\PersonBundle\Entity\AccompanyingPeriod\Origin'
 | 
			
		||||
               name: accompanying_period_origin
 | 
			
		||||
               base_role: 'ROLE_USER'
 | 
			
		||||
               actions:
 | 
			
		||||
                   _index:
 | 
			
		||||
                       methods:
 | 
			
		||||
                           GET: true
 | 
			
		||||
                           HEAD: true
 | 
			
		||||
                   _entity:
 | 
			
		||||
                       methods:
 | 
			
		||||
                           GET: true
 | 
			
		||||
                           HEAD: true
 | 
			
		||||
 | 
			
		||||
.. note::
 | 
			
		||||
 | 
			
		||||
   If you are working on a shared bundle (aka "The chill bundles"), you should define your configuration inside the class :code:`ChillXXXXBundleExtension`, using the "prependConfig" feature:
 | 
			
		||||
 | 
			
		||||
   .. code-block:: php
 | 
			
		||||
 | 
			
		||||
      namespace Chill\PersonBundle\DependencyInjection;
 | 
			
		||||
 | 
			
		||||
      use Symfony\Component\DependencyInjection\ContainerBuilder;
 | 
			
		||||
      use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
 | 
			
		||||
      use Symfony\Component\HttpFoundation\Request;
 | 
			
		||||
 | 
			
		||||
      /**
 | 
			
		||||
       * Class ChillPersonExtension
 | 
			
		||||
       * Loads and manages your bundle configuration
 | 
			
		||||
       *
 | 
			
		||||
       * To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html}
 | 
			
		||||
       * @package Chill\PersonBundle\DependencyInjection
 | 
			
		||||
       */
 | 
			
		||||
      class ChillPersonExtension extends Extension implements PrependExtensionInterface
 | 
			
		||||
      {
 | 
			
		||||
          public function prepend(ContainerBuilder $container)
 | 
			
		||||
          {
 | 
			
		||||
              $this->prependCruds($container);
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          /**
 | 
			
		||||
           * @param ContainerBuilder $container
 | 
			
		||||
           */
 | 
			
		||||
          protected function prependCruds(ContainerBuilder $container)
 | 
			
		||||
          {
 | 
			
		||||
              $container->prependExtensionConfig('chill_main', [
 | 
			
		||||
                  'apis' => [
 | 
			
		||||
                      [
 | 
			
		||||
                          'class' => \Chill\PersonBundle\Entity\AccompanyingPeriod\Origin::class,
 | 
			
		||||
                          'name' => 'accompanying_period_origin',
 | 
			
		||||
                          'base_path' => '/api/1.0/person/accompanying-period/origin',
 | 
			
		||||
                          'controller' => \Chill\PersonBundle\Controller\OpeningApiController::class,
 | 
			
		||||
                          'base_role' => 'ROLE_USER',
 | 
			
		||||
                          'actions' => [
 | 
			
		||||
                              '_index' => [
 | 
			
		||||
                                  'methods' => [ 
 | 
			
		||||
                                      Request::METHOD_GET => true,
 | 
			
		||||
                                      Request::METHOD_HEAD => true
 | 
			
		||||
                                  ],
 | 
			
		||||
                              ],
 | 
			
		||||
                              '_entity' => [
 | 
			
		||||
                                  'methods' => [ 
 | 
			
		||||
                                      Request::METHOD_GET => true,
 | 
			
		||||
                                      Request::METHOD_HEAD => true
 | 
			
		||||
                                  ]
 | 
			
		||||
                              ],
 | 
			
		||||
                          ]
 | 
			
		||||
                      ]
 | 
			
		||||
                  ]
 | 
			
		||||
              ]);
 | 
			
		||||
          }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
The :code:`_index` and :code:`_entity` action
 | 
			
		||||
*********************************************
 | 
			
		||||
 | 
			
		||||
The :code:`_index` and :code:`_entity` action are default actions:
 | 
			
		||||
 | 
			
		||||
* they will call a specific method in the default controller;
 | 
			
		||||
* they will generate defined routes:
 | 
			
		||||
 | 
			
		||||
Index:
 | 
			
		||||
   Name: :code:`chill_api_single_accompanying_period_origin__index`
 | 
			
		||||
 | 
			
		||||
   Path: :code:`/api/1.0/person/accompanying-period/origin.{_format}`
 | 
			
		||||
 | 
			
		||||
Entity:
 | 
			
		||||
   Name: :code:`chill_api_single_accompanying_period_origin__entity`
 | 
			
		||||
 | 
			
		||||
   Path: :code:`/api/1.0/person/accompanying-period/origin/{id}.{_format}`
 | 
			
		||||
 | 
			
		||||
Role
 | 
			
		||||
****
 | 
			
		||||
 | 
			
		||||
By default, the key `base_role` is used to check ACL. Take care of creating the :code:`Voter` required to take that into account.
 | 
			
		||||
 | 
			
		||||
For index action, the role will be called with :code:`NULL` as :code:`$subject`. The retrieved entity will be the subject for single queries.
 | 
			
		||||
 | 
			
		||||
You can also define a role for each method. In this case, this role is used for the given method, and, if any, the base role is taken into account.
 | 
			
		||||
 | 
			
		||||
.. code-block:: yaml
 | 
			
		||||
 | 
			
		||||
   # config/packages/chill_main.yaml
 | 
			
		||||
   chill_main:
 | 
			
		||||
       apis:
 | 
			
		||||
           accompanying_period_origin:
 | 
			
		||||
               base_path: '/api/1.0/person/bla/bla'
 | 
			
		||||
               class: 'Chill\PersonBundle\Entity\Blah'
 | 
			
		||||
               name: bla
 | 
			
		||||
               actions:
 | 
			
		||||
                   _entity:
 | 
			
		||||
                       methods:
 | 
			
		||||
                           GET: true
 | 
			
		||||
                           HEAD: true
 | 
			
		||||
                       roles:
 | 
			
		||||
                           GET: MY_ROLE_SEE
 | 
			
		||||
                           HEAD: MY ROLE_SEE
 | 
			
		||||
 | 
			
		||||
Customize the controller
 | 
			
		||||
************************
 | 
			
		||||
 | 
			
		||||
You can customize the controller by hooking into the default actions. Take care of extending :code:`Chill\MainBundle\CRUD\Controller\ApiController`.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.. code-block:: php
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
   namespace Chill\PersonBundle\Controller;
 | 
			
		||||
 | 
			
		||||
   use Chill\MainBundle\CRUD\Controller\ApiController;
 | 
			
		||||
   use Symfony\Component\HttpFoundation\Request;
 | 
			
		||||
   use Symfony\Component\HttpFoundation\Response;
 | 
			
		||||
 | 
			
		||||
   class OpeningApiController extends ApiController
 | 
			
		||||
   {
 | 
			
		||||
       protected function customizeQuery(string $action, Request $request, $qb): void
 | 
			
		||||
       {
 | 
			
		||||
           $qb->where($qb->expr()->gt('e.noActiveAfter', ':now'))
 | 
			
		||||
               ->orWhere($qb->expr()->isNull('e.noActiveAfter'));
 | 
			
		||||
           $qb->setParameter('now', new \DateTime('now'));
 | 
			
		||||
       }     
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
And set your controller in configuration:
 | 
			
		||||
 | 
			
		||||
.. code-block:: yaml
 | 
			
		||||
 | 
			
		||||
   chill_main:
 | 
			
		||||
       apis:
 | 
			
		||||
           accompanying_period_origin:
 | 
			
		||||
               base_path: '/api/1.0/person/accompanying-period/origin'
 | 
			
		||||
               class: 'Chill\PersonBundle\Entity\AccompanyingPeriod\Origin'
 | 
			
		||||
               name: accompanying_period_origin
 | 
			
		||||
               # add a controller
 | 
			
		||||
               controller: 'Chill\PersonBundle\Controller\OpeningApiController'
 | 
			
		||||
               base_role: 'ROLE_USER'
 | 
			
		||||
               actions:
 | 
			
		||||
                   _index:
 | 
			
		||||
                       methods:
 | 
			
		||||
                           GET: true
 | 
			
		||||
                           HEAD: true
 | 
			
		||||
                   _entity:
 | 
			
		||||
                       methods:
 | 
			
		||||
                           GET: true
 | 
			
		||||
                           HEAD: true
 | 
			
		||||
 | 
			
		||||
Create your own actions
 | 
			
		||||
***********************
 | 
			
		||||
 | 
			
		||||
You can add your own actions:
 | 
			
		||||
 | 
			
		||||
.. code-block:: yaml
 | 
			
		||||
 | 
			
		||||
   chill_main:
 | 
			
		||||
       apis:
 | 
			
		||||
           -
 | 
			
		||||
               class: Chill\PersonBundle\Entity\AccompanyingPeriod
 | 
			
		||||
               name: accompanying_course
 | 
			
		||||
               base_path: /api/1.0/person/accompanying-course
 | 
			
		||||
               controller: Chill\PersonBundle\Controller\AccompanyingCourseApiController
 | 
			
		||||
               actions:
 | 
			
		||||
                   # add a custom participation:
 | 
			
		||||
                   participation:
 | 
			
		||||
                       methods:
 | 
			
		||||
                           POST: true
 | 
			
		||||
                           DELETE: true
 | 
			
		||||
                           GET: false
 | 
			
		||||
                           HEAD: false
 | 
			
		||||
                           PUT: false
 | 
			
		||||
                       roles:
 | 
			
		||||
                           POST: CHILL_PERSON_ACCOMPANYING_PERIOD_SEE
 | 
			
		||||
                           DELETE: CHILL_PERSON_ACCOMPANYING_PERIOD_SEE
 | 
			
		||||
                           GET: null
 | 
			
		||||
                           HEAD: null
 | 
			
		||||
                           PUT: null
 | 
			
		||||
                       single-collection: single
 | 
			
		||||
 | 
			
		||||
The key :code:`single-collection` with value :code:`single` will add a :code:`/{id}/ + "action name"` (in this example, :code:`/{id}/participation`) into the path, after the base path. If the value is :code:`collection`, no id will be set, but the action name will be append to the path.
 | 
			
		||||
 | 
			
		||||
Then, create the corresponding action into your controller:
 | 
			
		||||
 | 
			
		||||
.. code-block:: php
 | 
			
		||||
 | 
			
		||||
   namespace Chill\PersonBundle\Controller;
 | 
			
		||||
 | 
			
		||||
   use Chill\MainBundle\CRUD\Controller\ApiController;
 | 
			
		||||
   use Symfony\Component\HttpFoundation\Request;
 | 
			
		||||
   use Symfony\Component\HttpFoundation\Response;
 | 
			
		||||
   use Chill\PersonBundle\Entity\AccompanyingPeriod;
 | 
			
		||||
   use Symfony\Component\HttpFoundation\Exception\BadRequestException;
 | 
			
		||||
   use Symfony\Component\EventDispatcher\EventDispatcherInterface;
 | 
			
		||||
   use Symfony\Component\Validator\Validator\ValidatorInterface;
 | 
			
		||||
   use Chill\PersonBundle\Privacy\AccompanyingPeriodPrivacyEvent;
 | 
			
		||||
   use Chill\PersonBundle\Entity\Person;
 | 
			
		||||
 | 
			
		||||
   class AccompanyingCourseApiController extends ApiController
 | 
			
		||||
   {
 | 
			
		||||
       protected EventDispatcherInterface $eventDispatcher;
 | 
			
		||||
 | 
			
		||||
       protected ValidatorInterface $validator;
 | 
			
		||||
 | 
			
		||||
       public function __construct(EventDispatcherInterface $eventDispatcher, $validator)
 | 
			
		||||
       {
 | 
			
		||||
           $this->eventDispatcher = $eventDispatcher;
 | 
			
		||||
           $this->validator = $validator;
 | 
			
		||||
       }
 | 
			
		||||
       
 | 
			
		||||
       public function participationApi($id, Request $request, $_format)
 | 
			
		||||
       {
 | 
			
		||||
           /** @var AccompanyingPeriod $accompanyingPeriod */ 
 | 
			
		||||
           $accompanyingPeriod = $this->getEntity('participation', $id, $request);
 | 
			
		||||
           $person = $this->getSerializer()
 | 
			
		||||
               ->deserialize($request->getContent(), Person::class, $_format, []);
 | 
			
		||||
 | 
			
		||||
           if (NULL === $person) {
 | 
			
		||||
               throw new BadRequestException('person id not found');
 | 
			
		||||
           }
 | 
			
		||||
 | 
			
		||||
           $this->onPostCheckACL('participation', $request, $accompanyingPeriod, $_format);
 | 
			
		||||
 | 
			
		||||
           switch ($request->getMethod()) {
 | 
			
		||||
               case Request::METHOD_POST:
 | 
			
		||||
                   $participation = $accompanyingPeriod->addPerson($person);
 | 
			
		||||
                   break;
 | 
			
		||||
               case Request::METHOD_DELETE:
 | 
			
		||||
                   $participation = $accompanyingPeriod->removePerson($person);
 | 
			
		||||
                   break;
 | 
			
		||||
               default:
 | 
			
		||||
                   throw new BadRequestException("This method is not supported");
 | 
			
		||||
           }
 | 
			
		||||
 | 
			
		||||
           $errors = $this->validator->validate($accompanyingPeriod);
 | 
			
		||||
 | 
			
		||||
           if ($errors->count() > 0) {
 | 
			
		||||
               // only format accepted
 | 
			
		||||
               return $this->json($errors);
 | 
			
		||||
           }
 | 
			
		||||
 | 
			
		||||
           $this->getDoctrine()->getManager()->flush();
 | 
			
		||||
 | 
			
		||||
           return $this->json($participation);
 | 
			
		||||
       }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
Managing association
 | 
			
		||||
********************
 | 
			
		||||
 | 
			
		||||
ManyToOne association
 | 
			
		||||
=====================
 | 
			
		||||
 | 
			
		||||
In ManyToOne association, you can add associated entities using the :code:`PATCH` request. By default, the serializer deserialize entities only with their id and discriminator type, if any.
 | 
			
		||||
 | 
			
		||||
Example:
 | 
			
		||||
 | 
			
		||||
.. code-block:: bash
 | 
			
		||||
 | 
			
		||||
   curl -X 'PATCH' \
 | 
			
		||||
     'http://localhost:8001/api/1.0/person/accompanying-course/2668.json' \
 | 
			
		||||
     -H 'accept: */*' \
 | 
			
		||||
     -H 'Content-Type: application/json' \
 | 
			
		||||
      # see the data sent to the server: \
 | 
			
		||||
     -d '{
 | 
			
		||||
     "type": "accompanying_period",
 | 
			
		||||
     "id": 2668,
 | 
			
		||||
     "origin": { "id": 11 }
 | 
			
		||||
   }'
 | 
			
		||||
 | 
			
		||||
ManyToMany associations
 | 
			
		||||
=======================
 | 
			
		||||
 | 
			
		||||
In OneToMany association, you can easily create route for adding and removing entities, using :code:`POST` and :code:`DELETE` requests.
 | 
			
		||||
 | 
			
		||||
Prepare your entity, creating the methods :code:`addYourEntity` and :code:`removeYourEntity`:
 | 
			
		||||
 | 
			
		||||
.. code-block:: php
 | 
			
		||||
 | 
			
		||||
   namespace Chill\PersonBundle\Entity;
 | 
			
		||||
 | 
			
		||||
   use Chill\MainBundle\Entity\Scope;
 | 
			
		||||
   use Doctrine\Common\Collections\ArrayCollection;
 | 
			
		||||
   use Doctrine\Common\Collections\Collection;
 | 
			
		||||
   use Doctrine\ORM\Mapping as ORM;
 | 
			
		||||
   use Symfony\Component\Serializer\Annotation\Groups;
 | 
			
		||||
   use Symfony\Component\Serializer\Annotation\DiscriminatorMap;
 | 
			
		||||
 | 
			
		||||
   /**
 | 
			
		||||
    * AccompanyingPeriod Class
 | 
			
		||||
    *
 | 
			
		||||
    * @ORM\Entity
 | 
			
		||||
    * @ORM\Table(name="chill_person_accompanying_period")
 | 
			
		||||
    * @DiscriminatorMap(typeProperty="type", mapping={
 | 
			
		||||
    *  "accompanying_period"=AccompanyingPeriod::class
 | 
			
		||||
    *  })
 | 
			
		||||
    */
 | 
			
		||||
   class AccompanyingPeriod
 | 
			
		||||
   {
 | 
			
		||||
       /**
 | 
			
		||||
        * @var Collection
 | 
			
		||||
        * @ORM\ManyToMany(
 | 
			
		||||
        *     targetEntity=Scope::class,
 | 
			
		||||
        *     cascade={}
 | 
			
		||||
        *     )
 | 
			
		||||
        * @Groups({"read"})
 | 
			
		||||
        */
 | 
			
		||||
       private $scopes;
 | 
			
		||||
 | 
			
		||||
       public function addScope(Scope $scope): self
 | 
			
		||||
       {
 | 
			
		||||
           $this->scopes[] = $scope;
 | 
			
		||||
 | 
			
		||||
           return $this;
 | 
			
		||||
       }
 | 
			
		||||
 | 
			
		||||
       public function removeScope(Scope $scope): void
 | 
			
		||||
       {
 | 
			
		||||
           $this->scopes->removeElement($scope);
 | 
			
		||||
       }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Create your route into the configuration:
 | 
			
		||||
 | 
			
		||||
.. code-block:: yaml
 | 
			
		||||
 | 
			
		||||
   chill_main:
 | 
			
		||||
       apis:
 | 
			
		||||
           -
 | 
			
		||||
               class: Chill\PersonBundle\Entity\AccompanyingPeriod
 | 
			
		||||
               name: accompanying_course
 | 
			
		||||
               base_path: /api/1.0/person/accompanying-course
 | 
			
		||||
               controller: Chill\PersonBundle\Controller\AccompanyingCourseApiController
 | 
			
		||||
               actions:
 | 
			
		||||
                   scope:
 | 
			
		||||
                       methods:
 | 
			
		||||
                           POST: true
 | 
			
		||||
                           DELETE: true
 | 
			
		||||
                           GET: false
 | 
			
		||||
                           HEAD: false
 | 
			
		||||
                           PUT: false
 | 
			
		||||
                           PATCH: false
 | 
			
		||||
                       roles:
 | 
			
		||||
                           POST: CHILL_PERSON_ACCOMPANYING_PERIOD_SEE
 | 
			
		||||
                           DELETE: CHILL_PERSON_ACCOMPANYING_PERIOD_SEE
 | 
			
		||||
                           GET: null
 | 
			
		||||
                           HEAD: null
 | 
			
		||||
                           PUT: null
 | 
			
		||||
                           PATCH: null
 | 
			
		||||
                       controller_action: null
 | 
			
		||||
                       path: null
 | 
			
		||||
                       single-collection: single
 | 
			
		||||
 | 
			
		||||
This will create a new route, which will accept two methods: DELETE and POST:
 | 
			
		||||
 | 
			
		||||
.. code-block:: raw
 | 
			
		||||
 | 
			
		||||
   +--------------+---------------------------------------------------------------------------------------+
 | 
			
		||||
   | Property     | Value                                                                                 |
 | 
			
		||||
   +--------------+---------------------------------------------------------------------------------------+
 | 
			
		||||
   | Route Name   | chill_api_single_accompanying_course_scope                                            |
 | 
			
		||||
   | Path         | /api/1.0/person/accompanying-course/{id}/scope.{_format}                              |
 | 
			
		||||
   | Path Regex   | {^/api/1\.0/person/accompanying\-course/(?P<id>[^/]++)/scope\.(?P<_format>[^/]++)$}sD |
 | 
			
		||||
   | Host         | ANY                                                                                   |
 | 
			
		||||
   | Host Regex   |                                                                                       |
 | 
			
		||||
   | Scheme       | ANY                                                                                   |
 | 
			
		||||
   | Method       | POST|DELETE                                                                           |
 | 
			
		||||
   | Requirements | {id}: \d+                                                                             |
 | 
			
		||||
   | Class        | Symfony\Component\Routing\Route                                                       |
 | 
			
		||||
   | Defaults     | _controller: csapi_accompanying_course_controller:scopeApi                            |
 | 
			
		||||
   | Options      | compiler_class: Symfony\Component\Routing\RouteCompiler                               |
 | 
			
		||||
   +--------------+---------------------------------------------------------------------------------------+
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Then, create the controller action. Call the method:
 | 
			
		||||
 | 
			
		||||
.. code-block:: php
 | 
			
		||||
 | 
			
		||||
   namespace Chill\PersonBundle\Controller;
 | 
			
		||||
 | 
			
		||||
   use Chill\MainBundle\CRUD\Controller\ApiController;
 | 
			
		||||
   use Symfony\Component\HttpFoundation\Request;
 | 
			
		||||
   use Symfony\Component\HttpFoundation\Response;
 | 
			
		||||
   use Chill\MainBundle\Entity\Scope;
 | 
			
		||||
 | 
			
		||||
   class MyController extends ApiController
 | 
			
		||||
   {
 | 
			
		||||
       public function scopeApi($id, Request $request, string $_format): Response
 | 
			
		||||
       {
 | 
			
		||||
           return $this->addRemoveSomething('scope', $id, $request, $_format, 'scope', Scope::class, [ 'groups' => [ 'read' ] ]);
 | 
			
		||||
       }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
This will allow to add a scope by his id, and delete them.
 | 
			
		||||
 | 
			
		||||
Curl requests:
 | 
			
		||||
 | 
			
		||||
.. code-block:: bash
 | 
			
		||||
 | 
			
		||||
   # add a scope with id 5
 | 
			
		||||
   curl -X 'POST' \
 | 
			
		||||
     'http://localhost:8001/api/1.0/person/accompanying-course/2868/scope.json' \
 | 
			
		||||
     -H 'accept: */*' \
 | 
			
		||||
     -H 'Content-Type: application/json' \
 | 
			
		||||
     -d '{
 | 
			
		||||
     "type": "scope",
 | 
			
		||||
     "id": 5
 | 
			
		||||
   }'
 | 
			
		||||
 | 
			
		||||
   # remove a scope with id 5
 | 
			
		||||
   curl -X 'DELETE' \
 | 
			
		||||
     'http://localhost:8001/api/1.0/person/accompanying-course/2868/scope.json' \
 | 
			
		||||
     -H 'accept: */*' \
 | 
			
		||||
     -H 'Content-Type: application/json' \
 | 
			
		||||
     -d '{
 | 
			
		||||
     "id": 5,
 | 
			
		||||
     "type": "scope"
 | 
			
		||||
   }'
 | 
			
		||||
 | 
			
		||||
Deserializing an association where multiple types are allowed
 | 
			
		||||
=============================================================
 | 
			
		||||
 | 
			
		||||
Sometimes, multiples types are allowed as association to one entity:
 | 
			
		||||
 | 
			
		||||
.. code-block:: php
 | 
			
		||||
 | 
			
		||||
   namespace Chill\PersonBundle\Entity\AccompanyingPeriod;
 | 
			
		||||
 | 
			
		||||
   use Chill\PersonBundle\Entity\Person;
 | 
			
		||||
   use Chill\ThirdPartyBundle\Entity\ThirdParty;
 | 
			
		||||
   use Doctrine\ORM\Mapping as ORM;
 | 
			
		||||
 | 
			
		||||
   class Resource
 | 
			
		||||
   {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
       /**
 | 
			
		||||
        * @ORM\ManyToOne(targetEntity=ThirdParty::class)
 | 
			
		||||
        * @ORM\JoinColumn(nullable=true)
 | 
			
		||||
        */
 | 
			
		||||
       private $thirdParty;
 | 
			
		||||
 | 
			
		||||
       /**
 | 
			
		||||
        * @ORM\ManyToOne(targetEntity=Person::class)
 | 
			
		||||
        * @ORM\JoinColumn(nullable=true)
 | 
			
		||||
        */
 | 
			
		||||
       private $person;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
       /**
 | 
			
		||||
        *
 | 
			
		||||
        * @param $resource Person|ThirdParty
 | 
			
		||||
        */
 | 
			
		||||
       public function setResource($resource): self
 | 
			
		||||
       {
 | 
			
		||||
          // ...
 | 
			
		||||
       }
 | 
			
		||||
       
 | 
			
		||||
       
 | 
			
		||||
       /**
 | 
			
		||||
        * @return ThirdParty|Person
 | 
			
		||||
        * @Groups({"read", "write"})
 | 
			
		||||
        */
 | 
			
		||||
       public function getResource()
 | 
			
		||||
       {
 | 
			
		||||
           return $this->person ?? $this->thirdParty;
 | 
			
		||||
       }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
This is not well taken into account by the Symfony serializer natively.
 | 
			
		||||
 | 
			
		||||
You must, then, create your own CustomNormalizer. You can help yourself using this:
 | 
			
		||||
 | 
			
		||||
.. code-block:: php
 | 
			
		||||
 | 
			
		||||
   namespace Chill\PersonBundle\Serializer\Normalizer;
 | 
			
		||||
 | 
			
		||||
   use Chill\PersonBundle\Entity\Person;
 | 
			
		||||
   use Chill\ThirdPartyBundle\Entity\ThirdParty;
 | 
			
		||||
   use Chill\PersonBundle\Entity\AccompanyingPeriod\Resource;
 | 
			
		||||
   use Chill\PersonBundle\Repository\AccompanyingPeriod\ResourceRepository;
 | 
			
		||||
   use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
 | 
			
		||||
   use Symfony\Component\Serializer\Normalizer\DenormalizerAwareInterface;
 | 
			
		||||
   use Symfony\Component\Serializer\Normalizer\DenormalizerAwareTrait;
 | 
			
		||||
   use Symfony\Component\Serializer\Normalizer\ObjectToPopulateTrait;
 | 
			
		||||
   use Symfony\Component\Serializer\Exception;
 | 
			
		||||
   use Chill\MainBundle\Serializer\Normalizer\DiscriminatedObjectDenormalizer;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
   class AccompanyingPeriodResourceNormalizer implements DenormalizerInterface, DenormalizerAwareInterface
 | 
			
		||||
   {
 | 
			
		||||
       use DenormalizerAwareTrait;
 | 
			
		||||
       use ObjectToPopulateTrait;
 | 
			
		||||
 | 
			
		||||
       public function __construct(ResourceRepository $repository)
 | 
			
		||||
       {
 | 
			
		||||
           $this->repository = $repository;
 | 
			
		||||
       }
 | 
			
		||||
 | 
			
		||||
       public function denormalize($data, string $type, string $format = null, array $context = [])
 | 
			
		||||
       {
 | 
			
		||||
           // .. snipped for brevity
 | 
			
		||||
 | 
			
		||||
           if ($resource === NULL) {
 | 
			
		||||
               $resource = new Resource();
 | 
			
		||||
           }
 | 
			
		||||
 | 
			
		||||
           if (\array_key_exists('resource', $data)) {
 | 
			
		||||
               $res = $this->denormalizer->denormalize(
 | 
			
		||||
                   $data['resource'],
 | 
			
		||||
                   // call for a "multiple type"
 | 
			
		||||
                   DiscriminatedObjectDenormalizer::TYPE,
 | 
			
		||||
                   $format,
 | 
			
		||||
                   // into the context, we add the list of allowed types:
 | 
			
		||||
                   [ 
 | 
			
		||||
                       DiscriminatedObjectDenormalizer::ALLOWED_TYPES => 
 | 
			
		||||
                       [ 
 | 
			
		||||
                           Person::class, ThirdParty::class
 | 
			
		||||
                       ]
 | 
			
		||||
                   ]
 | 
			
		||||
               );
 | 
			
		||||
 | 
			
		||||
               $resource->setResource($res);
 | 
			
		||||
           } 
 | 
			
		||||
 | 
			
		||||
           return $resource;
 | 
			
		||||
       }
 | 
			
		||||
       
 | 
			
		||||
 | 
			
		||||
       public function supportsDenormalization($data, string $type, string $format = null)
 | 
			
		||||
       {
 | 
			
		||||
           return $type === Resource::class;
 | 
			
		||||
       }  
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
Serialization for collection
 | 
			
		||||
****************************
 | 
			
		||||
 | 
			
		||||
A specific model has been defined for returning collection:
 | 
			
		||||
 | 
			
		||||
.. code-block:: json
 | 
			
		||||
 | 
			
		||||
   {
 | 
			
		||||
       "count": 49,
 | 
			
		||||
       "results": [
 | 
			
		||||
       ],
 | 
			
		||||
       "pagination": {
 | 
			
		||||
           "more": true,
 | 
			
		||||
           "next": "/api/1.0/search.json&q=xxxx......&page=2",
 | 
			
		||||
           "previous": null,
 | 
			
		||||
           "first": 0,
 | 
			
		||||
           "items_per_page": 1
 | 
			
		||||
       }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
Where this is relevant, this model should be re-used in custom controller actions.
 | 
			
		||||
 | 
			
		||||
In custom actions, this can be achieved quickly by assembling results into a :code:`Chill\MainBundle\Serializer\Model\Collection`. The pagination information is given by using :code:`Paginator` (see :ref:`Pagination <pagination-ref>`).
 | 
			
		||||
 | 
			
		||||
.. code-block:: php
 | 
			
		||||
 | 
			
		||||
   use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
 | 
			
		||||
   use Chill\MainBundle\Pagination\PaginatorInterface;
 | 
			
		||||
 | 
			
		||||
   class MyController extends AbstractController
 | 
			
		||||
   {
 | 
			
		||||
 | 
			
		||||
       protected function serializeCollection(PaginatorInterface $paginator, $entities): Response
 | 
			
		||||
       {
 | 
			
		||||
           $model = new Collection($entities, $paginator);
 | 
			
		||||
 | 
			
		||||
           return $this->json($model, Response::HTTP_OK, [], $context);
 | 
			
		||||
       }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.. _api_full_configuration:
 | 
			
		||||
 | 
			
		||||
Full configuration example
 | 
			
		||||
**************************
 | 
			
		||||
 | 
			
		||||
.. code-block:: yaml
 | 
			
		||||
 | 
			
		||||
       apis:
 | 
			
		||||
           -
 | 
			
		||||
               class: Chill\PersonBundle\Entity\AccompanyingPeriod
 | 
			
		||||
               name: accompanying_course
 | 
			
		||||
               base_path: /api/1.0/person/accompanying-course
 | 
			
		||||
               controller: Chill\PersonBundle\Controller\AccompanyingCourseApiController
 | 
			
		||||
               actions:
 | 
			
		||||
                   _entity:
 | 
			
		||||
                       roles:
 | 
			
		||||
                           GET: CHILL_PERSON_ACCOMPANYING_PERIOD_SEE
 | 
			
		||||
                           HEAD: null
 | 
			
		||||
                           POST: null
 | 
			
		||||
                           DELETE: null
 | 
			
		||||
                           PUT: null
 | 
			
		||||
                       controller_action: null
 | 
			
		||||
                       path: null
 | 
			
		||||
                       single-collection: single
 | 
			
		||||
                       methods:
 | 
			
		||||
                           GET: true
 | 
			
		||||
                           HEAD: true
 | 
			
		||||
                           POST: false
 | 
			
		||||
                           DELETE: false
 | 
			
		||||
                           PUT: false
 | 
			
		||||
                   participation:
 | 
			
		||||
                       methods:
 | 
			
		||||
                           POST: true
 | 
			
		||||
                           DELETE: true
 | 
			
		||||
                           GET: false
 | 
			
		||||
                           HEAD: false
 | 
			
		||||
                           PUT: false
 | 
			
		||||
                       roles:
 | 
			
		||||
                           POST: CHILL_PERSON_ACCOMPANYING_PERIOD_SEE
 | 
			
		||||
                           DELETE: CHILL_PERSON_ACCOMPANYING_PERIOD_SEE
 | 
			
		||||
                           GET: null
 | 
			
		||||
                           HEAD: null
 | 
			
		||||
                           PUT: null
 | 
			
		||||
                       controller_action: null
 | 
			
		||||
                       # the requirements for the route. Will be set to `[ 'id' => '\d+' ]` if left empty.
 | 
			
		||||
                       requirements:         []
 | 
			
		||||
                       path: null
 | 
			
		||||
                       single-collection: single
 | 
			
		||||
               base_role: null
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -16,7 +16,6 @@ As Chill rely on the `symfony <http://symfony.com>`_ framework, reading the fram
 | 
			
		||||
 | 
			
		||||
    Instructions to create a new bundle <create-a-new-bundle.rst>
 | 
			
		||||
    CRUD (Create - Update - Delete) for one entity <crud.rst>
 | 
			
		||||
    Helpers for building a REST API <api.rst>
 | 
			
		||||
    Routing <routing.rst>
 | 
			
		||||
    Menus <menus.rst>
 | 
			
		||||
    Forms <forms.rst>
 | 
			
		||||
 
 | 
			
		||||
@@ -7,8 +7,6 @@
 | 
			
		||||
   Free Documentation License".
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.. _pagination-ref:
 | 
			
		||||
 | 
			
		||||
Pagination
 | 
			
		||||
##########
 | 
			
		||||
 | 
			
		||||
@@ -17,7 +15,7 @@ The Bundle :code:`Chill\MainBundle` provides a **Pagination** api which allow yo
 | 
			
		||||
A simple example
 | 
			
		||||
****************
 | 
			
		||||
 | 
			
		||||
In the controller, get the :code:`Chill\Main\Pagination\PaginatorFactory` from the `Container` and use this :code:`PaginatorFactory` to create a :code:`Paginator` instance.
 | 
			
		||||
In the controller, get the :class:`Chill\Main\Pagination\PaginatorFactory` from the `Container` and use this :code:`PaginatorFactory` to create a :code:`Paginator` instance.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.. literalinclude:: pagination/example.php
 | 
			
		||||
 
 | 
			
		||||
@@ -1,42 +1,51 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\MyBundle\Controller;
 | 
			
		||||
 | 
			
		||||
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
 | 
			
		||||
use Symfony\Component\HttpFoundation\Request;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ItemController extends Controller {
 | 
			
		||||
 | 
			
		||||
    public function yourAction() 
 | 
			
		||||
class example extends Controller
 | 
			
		||||
{
 | 
			
		||||
    public function yourAction()
 | 
			
		||||
    {
 | 
			
		||||
        $em = $this->getDoctrine()->getManager();
 | 
			
		||||
        // first, get the number of total item are available
 | 
			
		||||
        $total = $em
 | 
			
		||||
             ->createQuery("SELECT COUNT (item.id) FROM ChillMyBundle:Item item")
 | 
			
		||||
             ->getSingleScalarResult();
 | 
			
		||||
       
 | 
			
		||||
            ->createQuery('SELECT COUNT (item.id) FROM ChillMyBundle:Item item')
 | 
			
		||||
            ->getSingleScalarResult();
 | 
			
		||||
 | 
			
		||||
        // get the PaginatorFactory
 | 
			
		||||
        $paginatorFactory = $this->get('chill_main.paginator_factory');
 | 
			
		||||
        
 | 
			
		||||
        // create a pagination instance. This instance is only valid for 
 | 
			
		||||
 | 
			
		||||
        // create a pagination instance. This instance is only valid for
 | 
			
		||||
        // the current route and parameters
 | 
			
		||||
        $paginator = $paginatorFactory->create($total);
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        // launch your query on item. Limit the query to the results
 | 
			
		||||
        // for the current page using the paginator
 | 
			
		||||
        $items = $em->createQuery("SELECT item FROM ChillMyBundle:Item item WHERE <your clause>")
 | 
			
		||||
        $items = $em->createQuery('SELECT item FROM ChillMyBundle:Item item WHERE <your clause>')
 | 
			
		||||
            // use the paginator to get the first item number
 | 
			
		||||
            ->setFirstResult($paginator->getCurrentPage()->getFirstItemNumber())
 | 
			
		||||
            // use the paginator to get the number of items to display
 | 
			
		||||
            ->setMaxResults($paginator->getItemsPerPage());
 | 
			
		||||
            
 | 
			
		||||
        return $this->render('ChillMyBundle:Item:list.html.twig', array(
 | 
			
		||||
 | 
			
		||||
        return $this->render(
 | 
			
		||||
            'ChillMyBundle:Item:list.html.twig',
 | 
			
		||||
            [
 | 
			
		||||
                'items' => $items,
 | 
			
		||||
                'paginator' => $paginator
 | 
			
		||||
                );
 | 
			
		||||
            
 | 
			
		||||
                'paginator' => $paginator,
 | 
			
		||||
            ]
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -97,7 +97,7 @@ The has the following signature :
 | 
			
		||||
         * 
 | 
			
		||||
         * @param string $context
 | 
			
		||||
         * @param mixed[] $args the argument to the context.
 | 
			
		||||
         * @return TimelineSingleQuery
 | 
			
		||||
         * @return string[]
 | 
			
		||||
         * @throw  \LogicException if the context is not supported
 | 
			
		||||
         */
 | 
			
		||||
        public function fetchQuery($context, array $args);
 | 
			
		||||
@@ -163,16 +163,18 @@ The has the following signature :
 | 
			
		||||
The `fetchQuery` function
 | 
			
		||||
^^^^^^^^^^^^^^^^^^^^^^^^^
 | 
			
		||||
 | 
			
		||||
The fetchQuery function help to build the UNION query to gather events. This function should return an instance of :code:`TimelineSingleQuery`. For you convenience, this object may be build using an associative array with the following keys:
 | 
			
		||||
The fetchQuery function help to build the UNION query to gather events. This function should return an associative array MUST have the following key :
 | 
			
		||||
 | 
			
		||||
* `id` : the name of the id column
 | 
			
		||||
* `type`: a string to indicate the type
 | 
			
		||||
* `date`: the name of the datetime column, used to order entities by date
 | 
			
		||||
* `FROM`: the FROM clause. May contains JOIN instructions
 | 
			
		||||
* `WHERE`: the WHERE clause;
 | 
			
		||||
* `parameters`: the parameters to pass to the query
 | 
			
		||||
* `FROM` (in capital) : the FROM clause. May contains JOIN instructions
 | 
			
		||||
 | 
			
		||||
The parameters should be replaced into the query by :code:`?`. They will be replaced into the query using prepared statements.
 | 
			
		||||
Those key are optional:
 | 
			
		||||
 | 
			
		||||
* `WHERE` (in capital) : the WHERE clause. 
 | 
			
		||||
 | 
			
		||||
 Where relevant, the data must be quoted to avoid SQL injection.
 | 
			
		||||
 | 
			
		||||
`$context` and `$args` are defined by the bundle which will call the timeline rendering. You may use them to build a different query depending on this context.
 | 
			
		||||
 | 
			
		||||
@@ -184,15 +186,6 @@ For instance, if the context is `'person'`, the args will be this array :
 | 
			
		||||
        'person' => $person //a \Chill\PersonBundle\Entity\Person entity
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
For the context :code:`center`, the args will be:
 | 
			
		||||
 | 
			
		||||
.. code-block:: php
 | 
			
		||||
 | 
			
		||||
    array(
 | 
			
		||||
        'centers' => [ ]  // an array of \Chill\MainBundle\Entity\Center entities
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
You should find in the bundle documentation which contexts are arguments the bundle defines.
 | 
			
		||||
 | 
			
		||||
.. note::
 | 
			
		||||
@@ -206,12 +199,13 @@ Example of an implementation :
 | 
			
		||||
    namespace Chill\ReportBundle\Timeline;
 | 
			
		||||
 | 
			
		||||
    use Chill\MainBundle\Timeline\TimelineProviderInterface;
 | 
			
		||||
    use Chill\MainBundle\Timeline\TimelineSingleQuery;
 | 
			
		||||
    use Doctrine\ORM\EntityManager;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Provide report for inclusion in timeline
 | 
			
		||||
     *
 | 
			
		||||
     * @author Julien Fastré <julien.fastre@champs-libres.coop>
 | 
			
		||||
     * @author Champs Libres <info@champs-libres.coop>
 | 
			
		||||
     */
 | 
			
		||||
    class TimelineReportProvider implements TimelineProviderInterface
 | 
			
		||||
    {
 | 
			
		||||
@@ -233,17 +227,16 @@ Example of an implementation :
 | 
			
		||||
                
 | 
			
		||||
                $metadata = $this->em->getClassMetadata('ChillReportBundle:Report');
 | 
			
		||||
                
 | 
			
		||||
                return TimelineSingleQuery::fromArray([
 | 
			
		||||
                return array(
 | 
			
		||||
                   'id' => $metadata->getColumnName('id'),
 | 
			
		||||
                   'type' => 'report',
 | 
			
		||||
                   'date' => $metadata->getColumnName('date'),
 | 
			
		||||
                   'FROM' => $metadata->getTableName(),
 | 
			
		||||
                   'WHERE' => sprintf('%s = ?',
 | 
			
		||||
                   'WHERE' => sprintf('%s = %d',
 | 
			
		||||
                         $metadata
 | 
			
		||||
                            ->getAssociationMapping('person')['joinColumns'][0]['name'])
 | 
			
		||||
                         )
 | 
			
		||||
                   'parameters' => [ $args['person']->getId() ]
 | 
			
		||||
                ]);
 | 
			
		||||
                            ->getAssociationMapping('person')['joinColumns'][0]['name'],
 | 
			
		||||
                         $args['person']->getId())
 | 
			
		||||
                );
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        //....
 | 
			
		||||
 
 | 
			
		||||
@@ -1,43 +1,55 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\HealthBundle\Controller;
 | 
			
		||||
 | 
			
		||||
use Chill\HealthBundle\Security\Authorization\ConsultationVoter;
 | 
			
		||||
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
 | 
			
		||||
use Chill\PersonBundle\Security\Authorization\PersonVoter;
 | 
			
		||||
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
 | 
			
		||||
use Symfony\Component\Security\Core\Role\Role;
 | 
			
		||||
 | 
			
		||||
class ConsultationController extends Controller
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * 
 | 
			
		||||
     * @param int $id personId
 | 
			
		||||
     * @return \Symfony\Component\HttpFoundation\Response
 | 
			
		||||
     *
 | 
			
		||||
     * @throws type
 | 
			
		||||
     *
 | 
			
		||||
     * @return \Symfony\Component\HttpFoundation\Response
 | 
			
		||||
     */
 | 
			
		||||
    public function listAction($id)
 | 
			
		||||
    {
 | 
			
		||||
        /* @var $person \Chill\PersonBundle\Entity\Person */
 | 
			
		||||
        /** @var \Chill\PersonBundle\Entity\Person $person */
 | 
			
		||||
        $person = $this->get('chill.person.repository.person')
 | 
			
		||||
            ->find($id);
 | 
			
		||||
        
 | 
			
		||||
        if ($person === null) {
 | 
			
		||||
            throw $this->createNotFoundException("The person is not found");
 | 
			
		||||
 | 
			
		||||
        if (null === $person) {
 | 
			
		||||
            throw $this->createNotFoundException('The person is not found');
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        $this->denyAccessUnlessGranted(PersonVoter::SEE, $person);
 | 
			
		||||
        
 | 
			
		||||
        /* @var $authorizationHelper \Chill\MainBundle\Security\Authorization\AuthorizationHelper */
 | 
			
		||||
 | 
			
		||||
        /** @var \Chill\MainBundle\Security\Authorization\AuthorizationHelper $authorizationHelper */
 | 
			
		||||
        $authorizationHelper = $this->get('chill.main.security.'
 | 
			
		||||
            . 'authorization.helper');
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        $circles = $authorizationHelper->getReachableCircles(
 | 
			
		||||
            $this->getUser(), 
 | 
			
		||||
            new Role(ConsultationVoter::SEE), 
 | 
			
		||||
            $this->getUser(),
 | 
			
		||||
            new Role(ConsultationVoter::SEE),
 | 
			
		||||
            $person->getCenter()
 | 
			
		||||
            );
 | 
			
		||||
        
 | 
			
		||||
        // create a query which take circles into account        
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        // create a query which take circles into account
 | 
			
		||||
        $consultations = $this->getDoctrine()->getManager()
 | 
			
		||||
            ->createQuery('SELECT c FROM ChillHealthBundle:Consultation c '
 | 
			
		||||
                . 'WHERE c.patient = :person AND c.circle IN(:circles) '
 | 
			
		||||
@@ -45,11 +57,10 @@ class ConsultationController extends Controller
 | 
			
		||||
            ->setParameter('person', $person)
 | 
			
		||||
            ->setParameter('circles', $circles)
 | 
			
		||||
            ->getResult();
 | 
			
		||||
        
 | 
			
		||||
        return $this->render('ChillHealthBundle:Consultation:list.html.twig', array(
 | 
			
		||||
                'person' => $person,
 | 
			
		||||
                'consultations' => $consultations
 | 
			
		||||
            ));    
 | 
			
		||||
 | 
			
		||||
        return $this->render('ChillHealthBundle:Consultation:list.html.twig', [
 | 
			
		||||
            'person' => $person,
 | 
			
		||||
            'consultations' => $consultations,
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,64 +1,70 @@
 | 
			
		||||
<?php
 | 
			
		||||
   # Chill\MainBundle\DependencyInjection\Configuration.php
 | 
			
		||||
  
 | 
			
		||||
   namespace Chill\MainBundle\DependencyInjection;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
// Chill\MainBundle\DependencyInjection\Configuration.php
 | 
			
		||||
 | 
			
		||||
namespace Chill\MainBundle\DependencyInjection;
 | 
			
		||||
 | 
			
		||||
   use Chill\MainBundle\DependencyInjection\Widget\AddWidgetConfigurationTrait;
 | 
			
		||||
   use Symfony\Component\Config\Definition\Builder\TreeBuilder;
 | 
			
		||||
   use Symfony\Component\Config\Definition\ConfigurationInterface;
 | 
			
		||||
   use Chill\MainBundle\DependencyInjection\Widget\AddWidgetConfigurationTrait;
 | 
			
		||||
   use Symfony\Component\DependencyInjection\ContainerBuilder;
 | 
			
		||||
 | 
			
		||||
   /**
 | 
			
		||||
    * Configure the main bundle
 | 
			
		||||
    */
 | 
			
		||||
   class Configuration implements ConfigurationInterface
 | 
			
		||||
   {
 | 
			
		||||
       
 | 
			
		||||
       use AddWidgetConfigurationTrait;
 | 
			
		||||
       
 | 
			
		||||
       /**
 | 
			
		||||
	*
 | 
			
		||||
	* @var ContainerBuilder
 | 
			
		||||
	*/
 | 
			
		||||
       private $containerBuilder;
 | 
			
		||||
/**
 | 
			
		||||
 * Configure the main bundle.
 | 
			
		||||
 */
 | 
			
		||||
class ChillMainConfiguration implements ConfigurationInterface
 | 
			
		||||
{
 | 
			
		||||
    use AddWidgetConfigurationTrait;
 | 
			
		||||
 | 
			
		||||
       
 | 
			
		||||
       public function __construct(array $widgetFactories = array(), 
 | 
			
		||||
	       ContainerBuilder $containerBuilder)
 | 
			
		||||
       {
 | 
			
		||||
           // we register here widget factories (see below)
 | 
			
		||||
	   $this->setWidgetFactories($widgetFactories);
 | 
			
		||||
           // we will need the container builder later...
 | 
			
		||||
	   $this->containerBuilder = $containerBuilder;
 | 
			
		||||
       }
 | 
			
		||||
       
 | 
			
		||||
       /**
 | 
			
		||||
	* {@inheritDoc}
 | 
			
		||||
	*/
 | 
			
		||||
       public function getConfigTreeBuilder()
 | 
			
		||||
       {
 | 
			
		||||
	   $treeBuilder = new TreeBuilder();
 | 
			
		||||
	   $rootNode = $treeBuilder->root('chill_main');
 | 
			
		||||
    /**
 | 
			
		||||
     * @var ContainerBuilder
 | 
			
		||||
     */
 | 
			
		||||
    private $containerBuilder;
 | 
			
		||||
 | 
			
		||||
	   $rootNode
 | 
			
		||||
	       ->children()
 | 
			
		||||
    public function __construct(
 | 
			
		||||
        array $widgetFactories,
 | 
			
		||||
        ContainerBuilder $containerBuilder
 | 
			
		||||
    ) {
 | 
			
		||||
        // we register here widget factories (see below)
 | 
			
		||||
        $this->setWidgetFactories($widgetFactories);
 | 
			
		||||
        // we will need the container builder later...
 | 
			
		||||
        $this->containerBuilder = $containerBuilder;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
                   // ...
 | 
			
		||||
    /**
 | 
			
		||||
     * {@inheritdoc}
 | 
			
		||||
     */
 | 
			
		||||
    public function getConfigTreeBuilder()
 | 
			
		||||
    {
 | 
			
		||||
        $treeBuilder = new TreeBuilder();
 | 
			
		||||
        $rootNode = $treeBuilder->root('chill_main');
 | 
			
		||||
 | 
			
		||||
		   ->arrayNode('widgets')
 | 
			
		||||
		       ->canBeDisabled()
 | 
			
		||||
		       ->children()
 | 
			
		||||
                            // we declare here all configuration for homepage place
 | 
			
		||||
			    ->append($this->addWidgetsConfiguration('homepage', $this->containerBuilder))
 | 
			
		||||
		       ->end() // end of widgets/children
 | 
			
		||||
		   ->end() // end of widgets
 | 
			
		||||
		  ->end() // end of root/children
 | 
			
		||||
	       ->end() // end of root
 | 
			
		||||
	   ;
 | 
			
		||||
 | 
			
		||||
	   
 | 
			
		||||
	   return $treeBuilder;
 | 
			
		||||
       }
 | 
			
		||||
   }
 | 
			
		||||
        $rootNode
 | 
			
		||||
            ->children()
 | 
			
		||||
 | 
			
		||||
                // ...
 | 
			
		||||
            ->arrayNode('widgets')
 | 
			
		||||
            ->canBeDisabled()
 | 
			
		||||
            ->children()
 | 
			
		||||
                         // we declare here all configuration for homepage place
 | 
			
		||||
            ->append($this->addWidgetsConfiguration('homepage', $this->containerBuilder))
 | 
			
		||||
            ->end() // end of widgets/children
 | 
			
		||||
            ->end() // end of widgets
 | 
			
		||||
            ->end() // end of root/children
 | 
			
		||||
            ->end() // end of root
 | 
			
		||||
;
 | 
			
		||||
 | 
			
		||||
        return $treeBuilder;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,16 +1,23 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
#Chill\MainBundle\DependencyInjection\ChillMainExtension.php
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
//Chill\MainBundle\DependencyInjection\ChillMainExtension.php
 | 
			
		||||
 | 
			
		||||
namespace Chill\MainBundle\DependencyInjection;
 | 
			
		||||
 | 
			
		||||
use Symfony\Component\DependencyInjection\ContainerBuilder;
 | 
			
		||||
use Symfony\Component\Config\FileLocator;
 | 
			
		||||
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
 | 
			
		||||
use Symfony\Component\DependencyInjection\Loader;
 | 
			
		||||
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
 | 
			
		||||
use Chill\MainBundle\DependencyInjection\Widget\Factory\WidgetFactoryInterface;
 | 
			
		||||
use Chill\MainBundle\DependencyInjection\Configuration;
 | 
			
		||||
use Symfony\Component\DependencyInjection\ContainerBuilder;
 | 
			
		||||
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This class load config for chillMainExtension.
 | 
			
		||||
@@ -18,42 +25,42 @@ use Chill\MainBundle\DependencyInjection\Configuration;
 | 
			
		||||
class ChillMainExtension extends Extension implements Widget\HasWidgetFactoriesExtensionInterface
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * widget factory
 | 
			
		||||
     * 
 | 
			
		||||
     * widget factory.
 | 
			
		||||
     *
 | 
			
		||||
     * @var WidgetFactoryInterface[]
 | 
			
		||||
     */
 | 
			
		||||
    protected $widgetFactories = array();
 | 
			
		||||
    
 | 
			
		||||
    protected $widgetFactories = [];
 | 
			
		||||
 | 
			
		||||
    public function addWidgetFactory(WidgetFactoryInterface $factory)
 | 
			
		||||
    {
 | 
			
		||||
        $this->widgetFactories[] = $factory;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    public function getConfiguration(array $config, ContainerBuilder $container)
 | 
			
		||||
    {
 | 
			
		||||
        return new Configuration($this->widgetFactories, $container);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 
 | 
			
		||||
     * @return WidgetFactoryInterface[]
 | 
			
		||||
     */
 | 
			
		||||
    public function getWidgetFactories()
 | 
			
		||||
    {
 | 
			
		||||
        return $this->widgetFactories;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    public function load(array $configs, ContainerBuilder $container)
 | 
			
		||||
    {
 | 
			
		||||
        // configuration for main bundle
 | 
			
		||||
        $configuration = $this->getConfiguration($configs, $container);
 | 
			
		||||
        $config = $this->processConfiguration($configuration, $configs);
 | 
			
		||||
        
 | 
			
		||||
        // add the key 'widget' without the key 'enable'
 | 
			
		||||
        $container->setParameter('chill_main.widgets', 
 | 
			
		||||
            array('homepage' => $config['widgets']['homepage']));
 | 
			
		||||
 | 
			
		||||
        // ... 
 | 
			
		||||
        // add the key 'widget' without the key 'enable'
 | 
			
		||||
        $container->setParameter(
 | 
			
		||||
            'chill_main.widgets',
 | 
			
		||||
            ['homepage' => $config['widgets']['homepage']]
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        // ...
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public function getConfiguration(array $config, ContainerBuilder $container)
 | 
			
		||||
    {
 | 
			
		||||
        return new Configuration($this->widgetFactories, $container);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,69 +1,77 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
# Chill/PersonBundle/Widget/PersonListWidgetFactory
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
// Chill/PersonBundle/Widget/PersonListWidgetFactory
 | 
			
		||||
 | 
			
		||||
namespace Chill\PersonBundle\Widget;
 | 
			
		||||
 | 
			
		||||
use Chill\MainBundle\DependencyInjection\Widget\Factory\AbstractWidgetFactory;
 | 
			
		||||
use Symfony\Component\DependencyInjection\ContainerBuilder;
 | 
			
		||||
use Symfony\Component\Config\Definition\Builder\NodeBuilder;
 | 
			
		||||
use Symfony\Component\DependencyInjection\ContainerBuilder;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * add configuration for the person_list widget.
 | 
			
		||||
 */
 | 
			
		||||
class PersonListWidgetFactory extends AbstractWidgetFactory
 | 
			
		||||
class ChillPersonAddAPersonListWidgetFactory extends AbstractWidgetFactory
 | 
			
		||||
{
 | 
			
		||||
   /*
 | 
			
		||||
    * append the option to the configuration
 | 
			
		||||
    * see http://symfony.com/doc/current/components/config/definition.html
 | 
			
		||||
    *
 | 
			
		||||
    */
 | 
			
		||||
    /*
 | 
			
		||||
     * append the option to the configuration
 | 
			
		||||
     * see http://symfony.com/doc/current/components/config/definition.html
 | 
			
		||||
     *
 | 
			
		||||
     */
 | 
			
		||||
    public function configureOptions($place, NodeBuilder $node)
 | 
			
		||||
    {
 | 
			
		||||
        $node->booleanNode('only_active')
 | 
			
		||||
                ->defaultTrue()
 | 
			
		||||
                ->end();
 | 
			
		||||
            ->defaultTrue()
 | 
			
		||||
            ->end();
 | 
			
		||||
        $node->integerNode('number_of_items')
 | 
			
		||||
            ->defaultValue(50)
 | 
			
		||||
            ->end();
 | 
			
		||||
        $node->scalarNode('filtering_class')
 | 
			
		||||
                ->defaultNull()
 | 
			
		||||
                ->end();
 | 
			
		||||
            
 | 
			
		||||
            ->defaultNull()
 | 
			
		||||
            ->end();
 | 
			
		||||
    }
 | 
			
		||||
     
 | 
			
		||||
   /*
 | 
			
		||||
    * return an array with the allowed places where the widget can be rendered
 | 
			
		||||
    *
 | 
			
		||||
    * @return string[]
 | 
			
		||||
    */   
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * return an array with the allowed places where the widget can be rendered.
 | 
			
		||||
     *
 | 
			
		||||
     * @return string[]
 | 
			
		||||
     */
 | 
			
		||||
    public function getAllowedPlaces()
 | 
			
		||||
    {
 | 
			
		||||
        return array('homepage');
 | 
			
		||||
        return ['homepage'];
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
   /* 
 | 
			
		||||
    * return the widget alias
 | 
			
		||||
    *
 | 
			
		||||
    * @return string
 | 
			
		||||
    */
 | 
			
		||||
    public function getWidgetAlias()
 | 
			
		||||
    {
 | 
			
		||||
        return 'person_list';
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
     * return the service id for the service which will render the widget.
 | 
			
		||||
     *
 | 
			
		||||
     * this service must implements `Chill\MainBundle\Templating\Widget\WidgetInterface`
 | 
			
		||||
     * 
 | 
			
		||||
     * the service must exists in the container, and it is not required that the service 
 | 
			
		||||
     *
 | 
			
		||||
     * the service must exists in the container, and it is not required that the service
 | 
			
		||||
     * has the `chill_main` tag.
 | 
			
		||||
     */
 | 
			
		||||
    public function getServiceId(ContainerBuilder $containerBuilder, $place, $order, array $config)
 | 
			
		||||
    {
 | 
			
		||||
        return 'chill_person.widget.person_list';
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * return the widget alias.
 | 
			
		||||
     *
 | 
			
		||||
     * @return string
 | 
			
		||||
     */
 | 
			
		||||
    public function getWidgetAlias()
 | 
			
		||||
    {
 | 
			
		||||
        return 'person_list';
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,66 +1,77 @@
 | 
			
		||||
<?php
 | 
			
		||||
# Chill/PersonBundle/Widget/PersonListWidget.php
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
// Chill/PersonBundle/Widget/PersonListWidget.php
 | 
			
		||||
 | 
			
		||||
namespace Chill\PersonBundle\Widget;
 | 
			
		||||
 | 
			
		||||
use Chill\MainBundle\Security\Authorization\AuthorizationHelper;
 | 
			
		||||
use Chill\MainBundle\Templating\Widget\WidgetInterface;
 | 
			
		||||
use Chill\PersonBundle\Security\Authorization\PersonVoter;
 | 
			
		||||
use DateTime;
 | 
			
		||||
use Doctrine\DBAL\Types\Type;
 | 
			
		||||
use Doctrine\ORM\EntityManager;
 | 
			
		||||
use Doctrine\ORM\EntityRepository;
 | 
			
		||||
use Doctrine\ORM\Query\Expr;
 | 
			
		||||
use Doctrine\DBAL\Types\Type;
 | 
			
		||||
use Chill\MainBundle\Security\Authorization\AuthorizationHelper;
 | 
			
		||||
use Symfony\Component\Security\Core\User\UserInterface;
 | 
			
		||||
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;
 | 
			
		||||
use Chill\PersonBundle\Security\Authorization\PersonVoter;
 | 
			
		||||
use Symfony\Component\Security\Core\Role\Role;
 | 
			
		||||
use Doctrine\ORM\EntityManager;
 | 
			
		||||
use Symfony\Component\Security\Core\User\UserInterface;
 | 
			
		||||
use Twig_Environment;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * add a widget with person list. 
 | 
			
		||||
 * 
 | 
			
		||||
 * add a widget with person list.
 | 
			
		||||
 *
 | 
			
		||||
 * The configuration is defined by `PersonListWidgetFactory`
 | 
			
		||||
 */
 | 
			
		||||
class PersonListWidget implements WidgetInterface
 | 
			
		||||
class ChillPersonAddAPersonWidget implements WidgetInterface
 | 
			
		||||
{
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * Repository for persons
 | 
			
		||||
     * 
 | 
			
		||||
     * @var EntityRepository
 | 
			
		||||
     * the authorization helper.
 | 
			
		||||
     *
 | 
			
		||||
     * @var AuthorizationHelper;
 | 
			
		||||
     */
 | 
			
		||||
    protected $personRepository;
 | 
			
		||||
    
 | 
			
		||||
    protected $authorizationHelper;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The entity manager
 | 
			
		||||
     * The entity manager.
 | 
			
		||||
     *
 | 
			
		||||
     * @var EntityManager
 | 
			
		||||
     */
 | 
			
		||||
    protected $entityManager;
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * the authorization helper
 | 
			
		||||
     * 
 | 
			
		||||
     * @var AuthorizationHelper;
 | 
			
		||||
     */
 | 
			
		||||
    protected $authorizationHelper;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Repository for persons.
 | 
			
		||||
     *
 | 
			
		||||
     * @var EntityRepository
 | 
			
		||||
     */
 | 
			
		||||
    protected $personRepository;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @var TokenStorage
 | 
			
		||||
     */
 | 
			
		||||
    protected $tokenStorage;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     *
 | 
			
		||||
     * @var UserInterface
 | 
			
		||||
     */
 | 
			
		||||
    protected $user;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    public function __construct(
 | 
			
		||||
            EntityRepository $personRepostory,
 | 
			
		||||
            EntityManager $em,
 | 
			
		||||
            AuthorizationHelper $authorizationHelper,
 | 
			
		||||
            TokenStorage $tokenStorage
 | 
			
		||||
            ) {
 | 
			
		||||
        EntityRepository $personRepostory,
 | 
			
		||||
        EntityManager $em,
 | 
			
		||||
        AuthorizationHelper $authorizationHelper,
 | 
			
		||||
        TokenStorage $tokenStorage
 | 
			
		||||
    ) {
 | 
			
		||||
        $this->personRepository = $personRepostory;
 | 
			
		||||
        $this->authorizationHelper = $authorizationHelper;
 | 
			
		||||
        $this->tokenStorage = $tokenStorage;
 | 
			
		||||
@@ -68,27 +79,24 @@ class PersonListWidget implements WidgetInterface
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 
 | 
			
		||||
     * @param type $place
 | 
			
		||||
     * @param array $context
 | 
			
		||||
     * @param array $config
 | 
			
		||||
     *
 | 
			
		||||
     * @return string
 | 
			
		||||
     */
 | 
			
		||||
    public function render(\Twig_Environment $env, $place, array $context, array $config)
 | 
			
		||||
    { 
 | 
			
		||||
    public function render(Twig_Environment $env, $place, array $context, array $config)
 | 
			
		||||
    {
 | 
			
		||||
        $qb = $this->personRepository
 | 
			
		||||
                ->createQueryBuilder('person');
 | 
			
		||||
        
 | 
			
		||||
            ->createQueryBuilder('person');
 | 
			
		||||
 | 
			
		||||
        // show only the person from the authorized centers
 | 
			
		||||
        $and = $qb->expr()->andX();
 | 
			
		||||
        $centers = $this->authorizationHelper
 | 
			
		||||
                ->getReachableCenters($this->getUser(), new Role(PersonVoter::SEE));
 | 
			
		||||
            ->getReachableCenters($this->getUser(), new Role(PersonVoter::SEE));
 | 
			
		||||
        $and->add($qb->expr()->in('person.center', ':centers'));
 | 
			
		||||
        $qb->setParameter('centers', $centers);
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        // add the "only active" where clause
 | 
			
		||||
        if ($config['only_active'] === true) {
 | 
			
		||||
        if (true === $config['only_active']) {
 | 
			
		||||
            $qb->join('person.accompanyingPeriods', 'ap');
 | 
			
		||||
            $or = new Expr\Orx();
 | 
			
		||||
            // add the case where closingDate IS NULL
 | 
			
		||||
@@ -98,32 +106,30 @@ class PersonListWidget implements WidgetInterface
 | 
			
		||||
            $or->add($andWhenClosingDateIsNull);
 | 
			
		||||
            // add the case when now is between opening date and closing date
 | 
			
		||||
            $or->add(
 | 
			
		||||
                    (new Expr())->between(':now', 'ap.openingDate', 'ap.closingDate')
 | 
			
		||||
                );
 | 
			
		||||
                (new Expr())->between(':now', 'ap.openingDate', 'ap.closingDate')
 | 
			
		||||
            );
 | 
			
		||||
            $and->add($or);
 | 
			
		||||
            $qb->setParameter('now', new \DateTime(), Type::DATE);
 | 
			
		||||
            $qb->setParameter('now', new DateTime(), Type::DATE);
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        // adding the where clause to the query
 | 
			
		||||
        $qb->where($and);
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        $qb->setFirstResult(0)->setMaxResults($config['number_of_items']);
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        $persons = $qb->getQuery()->getResult();
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        return $env->render(
 | 
			
		||||
            'ChillPersonBundle:Widget:homepage_person_list.html.twig',
 | 
			
		||||
            array('persons' => $persons)
 | 
			
		||||
            );
 | 
			
		||||
            ['persons' => $persons]
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 
 | 
			
		||||
     * @return UserInterface
 | 
			
		||||
     */
 | 
			
		||||
    private function getUser()
 | 
			
		||||
    {
 | 
			
		||||
        // return a user
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,51 +1,55 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
# Chill/PersonBundle/DependencyInjection/ChillPersonExtension.php
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
// Chill/PersonBundle/DependencyInjection/ChillPersonExtension.php
 | 
			
		||||
 | 
			
		||||
namespace Chill\PersonBundle\DependencyInjection;
 | 
			
		||||
 | 
			
		||||
use Symfony\Component\DependencyInjection\ContainerBuilder;
 | 
			
		||||
use Symfony\Component\Config\FileLocator;
 | 
			
		||||
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
 | 
			
		||||
use Symfony\Component\DependencyInjection\Loader;
 | 
			
		||||
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
 | 
			
		||||
use Chill\MainBundle\DependencyInjection\MissingBundleException;
 | 
			
		||||
use Chill\PersonBundle\Security\Authorization\PersonVoter;
 | 
			
		||||
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This is the class that loads and manages your bundle configuration
 | 
			
		||||
 * This is the class that loads and manages your bundle configuration.
 | 
			
		||||
 *
 | 
			
		||||
 * To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html}
 | 
			
		||||
 */
 | 
			
		||||
class ChillPersonExtension extends Extension implements PrependExtensionInterface
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * {@inheritDoc}
 | 
			
		||||
     * {@inheritdoc}
 | 
			
		||||
     */
 | 
			
		||||
    public function load(array $configs, ContainerBuilder $container)
 | 
			
		||||
    {
 | 
			
		||||
      // ...
 | 
			
		||||
        // ...
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 
 | 
			
		||||
     * Add a widget "add a person" on the homepage, automatically
 | 
			
		||||
     * 
 | 
			
		||||
     * Add a widget "add a person" on the homepage, automatically.
 | 
			
		||||
     *
 | 
			
		||||
     * @param \Chill\PersonBundle\DependencyInjection\containerBuilder $container
 | 
			
		||||
     */
 | 
			
		||||
    public function prepend(ContainerBuilder $container) 
 | 
			
		||||
    public function prepend(ContainerBuilder $container)
 | 
			
		||||
    {
 | 
			
		||||
        $container->prependExtensionConfig('chill_main', array(
 | 
			
		||||
            'widgets' => array(
 | 
			
		||||
                'homepage' => array(
 | 
			
		||||
                    array(
 | 
			
		||||
        $container->prependExtensionConfig('chill_main', [
 | 
			
		||||
            'widgets' => [
 | 
			
		||||
                'homepage' => [
 | 
			
		||||
                    [
 | 
			
		||||
                        'widget_alias' => 'add_person',
 | 
			
		||||
                        'order' => 2
 | 
			
		||||
                    )
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
        ));
 | 
			
		||||
                        'order' => 2,
 | 
			
		||||
                    ],
 | 
			
		||||
                ],
 | 
			
		||||
            ],
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -82,7 +82,7 @@ Chill will be available at ``http://localhost:8001.`` Currently, there isn't any
 | 
			
		||||
 | 
			
		||||
.. code-block:: bash
 | 
			
		||||
 | 
			
		||||
   docker-compose exec --user $(id -u) php bin/console doctrine:fixtures:load --purge-with-truncate
 | 
			
		||||
   docker-compose exec --user $(id -u) php bin/console doctrine:fixtures:load
 | 
			
		||||
 | 
			
		||||
There are several users available:
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										8
									
								
								grumphp.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								grumphp.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
			
		||||
imports:
 | 
			
		||||
  - { resource: vendor/drupol/php-conventions/config/php73/grumphp.yml }
 | 
			
		||||
 | 
			
		||||
parameters:
 | 
			
		||||
  tasks.phpcsfixer.config: .php_cs.dist
 | 
			
		||||
  tasks.license.name: AGPL-3.0
 | 
			
		||||
  tasks.license.holder: Champs-Libres
 | 
			
		||||
  tasks.license.date_from: 2001
 | 
			
		||||
@@ -18,20 +18,12 @@
 | 
			
		||||
       <testsuite name="MainBundle">
 | 
			
		||||
         <directory suffix="Test.php">src/Bundle/ChillMainBundle/Tests/</directory>
 | 
			
		||||
       </testsuite>
 | 
			
		||||
 | 
			
		||||
       <testsuite name="PersonBundle">
 | 
			
		||||
         <directory suffix="Test.php">src/Bundle/ChillPersonBundle/Tests/</directory>
 | 
			
		||||
         <!-- test for export will be runned later -->
 | 
			
		||||
         <exclude>src/Bundle/ChillPersonBundle/Tests/Export/*</exclude>
 | 
			
		||||
         <!-- we are rewriting accompanying periods... Work in progress -->
 | 
			
		||||
         <exclude>src/Bundle/ChillPersonBundle/Tests/Controller/AccompanyingPeriodControllerTest.php</exclude>
 | 
			
		||||
         <!-- we are rewriting address, Work in progress -->
 | 
			
		||||
         <exclude>src/Bundle/ChillPersonBundle/Tests/Controller/PersonAddressControllerTest.php</exclude>
 | 
			
		||||
         <!-- find a solution to create multiple configs -->
 | 
			
		||||
         <exclude>src/Bundle/ChillPersonBundle/Tests/Controller/PersonControllerUpdateWithHiddenFieldsTest.php</exclude>
 | 
			
		||||
         <!-- temporarily removed, the time to find a fix -->
 | 
			
		||||
         <exclude>src/Bundle/ChillPersonBundle/Tests/Controller/PersonDuplicateControllerViewTest.php</exclude>
 | 
			
		||||
        </testsuite>
 | 
			
		||||
    </testsuites>
 | 
			
		||||
 | 
			
		||||
      </testsuites>
 | 
			
		||||
 | 
			
		||||
    <listeners>
 | 
			
		||||
        <listener class="Symfony\Bridge\PhpUnit\SymfonyTestsListener" />
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								resource/header.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								resource/header.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
Chill is a software for social workers.
 | 
			
		||||
 | 
			
		||||
For the full copyright and license information, please view
 | 
			
		||||
the LICENSE file that was distributed with this source code.
 | 
			
		||||
 | 
			
		||||
@see https://www.champs-libres.coop/
 | 
			
		||||
@@ -1,5 +1,16 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle;
 | 
			
		||||
 | 
			
		||||
use Symfony\Component\HttpKernel\Bundle\Bundle;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,481 +1,468 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Chill is a software for social workers
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2014-2015, Champs Libres Cooperative SCRLFS,
 | 
			
		||||
 * <http://www.champs-libres.coop>, <info@champs-libres.coop>
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as
 | 
			
		||||
 * published by the Free Software Foundation, either version 3 of the
 | 
			
		||||
 * License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Controller;
 | 
			
		||||
 | 
			
		||||
use Chill\MainBundle\Security\Authorization\AuthorizationHelper;
 | 
			
		||||
use Chill\PersonBundle\Entity\AccompanyingPeriod;
 | 
			
		||||
use Chill\PersonBundle\Entity\Person;
 | 
			
		||||
use Chill\PersonBundle\Privacy\PrivacyEvent;
 | 
			
		||||
use Psr\Log\LoggerInterface;
 | 
			
		||||
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
 | 
			
		||||
use Symfony\Component\Form\Form;
 | 
			
		||||
use Symfony\Component\HttpFoundation\Request;
 | 
			
		||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
 | 
			
		||||
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
 | 
			
		||||
use Symfony\Component\HttpFoundation\Response;
 | 
			
		||||
use Symfony\Component\Security\Core\Role\Role;
 | 
			
		||||
use Chill\ActivityBundle\Entity\Activity;
 | 
			
		||||
use Chill\ActivityBundle\Form\ActivityType;
 | 
			
		||||
use Symfony\Component\Serializer\SerializerInterface;
 | 
			
		||||
use Chill\MainBundle\Security\Authorization\AuthorizationHelper;
 | 
			
		||||
use Chill\PersonBundle\Privacy\PrivacyEvent;
 | 
			
		||||
use DateTime;
 | 
			
		||||
use Psr\Log\LoggerInterface;
 | 
			
		||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
 | 
			
		||||
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
 | 
			
		||||
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
 | 
			
		||||
use Symfony\Component\HttpFoundation\Request;
 | 
			
		||||
use Symfony\Component\Security\Core\Role\Role;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class ActivityController
 | 
			
		||||
 *
 | 
			
		||||
 * @package Chill\ActivityBundle\Controller
 | 
			
		||||
 */
 | 
			
		||||
class ActivityController extends AbstractController
 | 
			
		||||
{
 | 
			
		||||
    protected EventDispatcherInterface $eventDispatcher;
 | 
			
		||||
    /**
 | 
			
		||||
     * @var AuthorizationHelper
 | 
			
		||||
     */
 | 
			
		||||
    protected $authorizationHelper;
 | 
			
		||||
 | 
			
		||||
    protected AuthorizationHelper $authorizationHelper;
 | 
			
		||||
    /**
 | 
			
		||||
     * @var EventDispatcherInterface
 | 
			
		||||
     */
 | 
			
		||||
    protected $eventDispatcher;
 | 
			
		||||
 | 
			
		||||
    protected LoggerInterface $logger;
 | 
			
		||||
 | 
			
		||||
    protected SerializerInterface $serializer;
 | 
			
		||||
    /**
 | 
			
		||||
     * @var LoggerInterface
 | 
			
		||||
     */
 | 
			
		||||
    protected $logger;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * ActivityController constructor.
 | 
			
		||||
     */
 | 
			
		||||
    public function __construct(
 | 
			
		||||
        EventDispatcherInterface $eventDispatcher,
 | 
			
		||||
        AuthorizationHelper $authorizationHelper,
 | 
			
		||||
        LoggerInterface $logger,
 | 
			
		||||
        SerializerInterface $serializer
 | 
			
		||||
        LoggerInterface $logger
 | 
			
		||||
    ) {
 | 
			
		||||
        $this->eventDispatcher = $eventDispatcher;
 | 
			
		||||
        $this->authorizationHelper = $authorizationHelper;
 | 
			
		||||
        $this->logger = $logger;
 | 
			
		||||
        $this->serializer = $serializer;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Lists all Activity entities.
 | 
			
		||||
     * Creates a new Activity entity.
 | 
			
		||||
     *
 | 
			
		||||
     * @param mixed $person_id
 | 
			
		||||
     */
 | 
			
		||||
    public function listAction(Request $request): Response
 | 
			
		||||
    public function createAction($person_id, Request $request)
 | 
			
		||||
    {
 | 
			
		||||
        $em = $this->getDoctrine()->getManager();
 | 
			
		||||
        $view = null;
 | 
			
		||||
        $person = $em->getRepository('ChillPersonBundle:Person')->find($person_id);
 | 
			
		||||
 | 
			
		||||
        [$person, $accompanyingPeriod] = $this->getEntity($request);
 | 
			
		||||
 | 
			
		||||
        if ($person instanceof Person) {
 | 
			
		||||
            $reachableScopes = $this->authorizationHelper
 | 
			
		||||
                ->getReachableCircles($this->getUser(), new Role('CHILL_ACTIVITY_SEE'),
 | 
			
		||||
                    $person->getCenter());
 | 
			
		||||
 | 
			
		||||
            $activities = $em->getRepository('ChillActivityBundle:Activity')->findBy(
 | 
			
		||||
                ['person' => $person, 'scope' => $reachableScopes],
 | 
			
		||||
                ['date' => 'DESC'],
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
            $event = new PrivacyEvent($person, array(
 | 
			
		||||
                'element_class' => Activity::class,
 | 
			
		||||
                'action' => 'list'
 | 
			
		||||
            ));
 | 
			
		||||
            $this->eventDispatcher->dispatch(PrivacyEvent::PERSON_PRIVACY_EVENT, $event);
 | 
			
		||||
 | 
			
		||||
            $view = 'ChillActivityBundle:Activity:listPerson.html.twig';
 | 
			
		||||
        } elseif ($accompanyingPeriod instanceof AccompanyingPeriod) {
 | 
			
		||||
            $activities = $em->getRepository('ChillActivityBundle:Activity')->findBy(
 | 
			
		||||
                ['accompanyingPeriod' => $accompanyingPeriod],
 | 
			
		||||
                ['date' => 'DESC'],
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
            $view = 'ChillActivityBundle:Activity:listAccompanyingCourse.html.twig';
 | 
			
		||||
        if (null === $person) {
 | 
			
		||||
            throw $this->createNotFoundException('person not found');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $this->render($view, array(
 | 
			
		||||
            'activities' => $activities,
 | 
			
		||||
            'person'   => $person,
 | 
			
		||||
            'accompanyingCourse' => $accompanyingPeriod,
 | 
			
		||||
        ));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function selectTypeAction(Request $request): Response
 | 
			
		||||
    {
 | 
			
		||||
        $em = $this->getDoctrine()->getManager();
 | 
			
		||||
        $view = null;
 | 
			
		||||
 | 
			
		||||
        [$person, $accompanyingPeriod] = $this->getEntity($request);
 | 
			
		||||
 | 
			
		||||
        if ($accompanyingPeriod instanceof AccompanyingPeriod) {
 | 
			
		||||
            $view = 'ChillActivityBundle:Activity:selectTypeAccompanyingCourse.html.twig';
 | 
			
		||||
        } elseif ($person instanceof Person) {
 | 
			
		||||
            $view = 'ChillActivityBundle:Activity:selectTypePerson.html.twig';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $data = [];
 | 
			
		||||
 | 
			
		||||
        $activityTypeCategories = $em->getRepository(\Chill\ActivityBundle\Entity\ActivityTypeCategory::class)
 | 
			
		||||
            ->findBy(['active' => true], ['ordering' => 'ASC']);
 | 
			
		||||
 | 
			
		||||
        foreach ($activityTypeCategories as $activityTypeCategory) {
 | 
			
		||||
            $activityTypes = $em->getRepository(\Chill\ActivityBundle\Entity\ActivityType::class)
 | 
			
		||||
                ->findBy(['active' => true, 'category' => $activityTypeCategory], ['ordering' => 'ASC']);
 | 
			
		||||
 | 
			
		||||
            $data[] = [
 | 
			
		||||
                'activityTypeCategory' => $activityTypeCategory,
 | 
			
		||||
                'activityTypes' => $activityTypes,
 | 
			
		||||
            ];
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ($view === null) {
 | 
			
		||||
            throw $this->createNotFoundException('Template not found');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $this->render($view, [
 | 
			
		||||
            'person' => $person,
 | 
			
		||||
            'accompanyingCourse' => $accompanyingPeriod,
 | 
			
		||||
            'data' => $data,
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function newAction(Request $request): Response
 | 
			
		||||
    {
 | 
			
		||||
        $em = $this->getDoctrine()->getManager();
 | 
			
		||||
 | 
			
		||||
        [$person, $accompanyingPeriod] = $this->getEntity($request);
 | 
			
		||||
 | 
			
		||||
        if ($accompanyingPeriod instanceof AccompanyingPeriod) {
 | 
			
		||||
            $view = 'ChillActivityBundle:Activity:newAccompanyingCourse.html.twig';
 | 
			
		||||
        } elseif ($person instanceof Person) {
 | 
			
		||||
            $view = 'ChillActivityBundle:Activity:newPerson.html.twig';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $activityType_id = $request->get('activityType_id', 0);
 | 
			
		||||
        $activityType = $em->getRepository(\Chill\ActivityBundle\Entity\ActivityType::class)
 | 
			
		||||
            ->find($activityType_id);
 | 
			
		||||
 | 
			
		||||
        if (!$activityType instanceof \Chill\ActivityBundle\Entity\ActivityType ||
 | 
			
		||||
            !$activityType->isActive()) {
 | 
			
		||||
 | 
			
		||||
            $params = $this->buildParamsToUrl($person, $accompanyingPeriod);
 | 
			
		||||
            return $this->redirectToRoute('chill_activity_activity_select_type', $params);
 | 
			
		||||
        }
 | 
			
		||||
        $this->denyAccessUnlessGranted('CHILL_PERSON_SEE', $person);
 | 
			
		||||
 | 
			
		||||
        $entity = new Activity();
 | 
			
		||||
        $entity->setUser($this->getUser());
 | 
			
		||||
        $entity->setPerson($person);
 | 
			
		||||
        $form = $this->createCreateForm($entity, $person);
 | 
			
		||||
        $form->handleRequest($request);
 | 
			
		||||
 | 
			
		||||
        if ($person instanceof Person) {
 | 
			
		||||
            $entity->setPerson($person);
 | 
			
		||||
        }
 | 
			
		||||
        if ($form->isValid()) {
 | 
			
		||||
            $em = $this->getDoctrine()->getManager();
 | 
			
		||||
 | 
			
		||||
        if ($accompanyingPeriod instanceof AccompanyingPeriod) {
 | 
			
		||||
            $entity->setAccompanyingPeriod($accompanyingPeriod);
 | 
			
		||||
        }
 | 
			
		||||
            $this->denyAccessUnlessGranted(
 | 
			
		||||
                'CHILL_ACTIVITY_CREATE',
 | 
			
		||||
                $entity,
 | 
			
		||||
                'creation of this activity not allowed'
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
        $entity->setType($activityType);
 | 
			
		||||
        $entity->setDate(new \DateTime('now'));
 | 
			
		||||
 | 
			
		||||
        // TODO revoir le Voter de Activity pour tenir compte qu'une activité peut appartenir a une période
 | 
			
		||||
        // $this->denyAccessUnlessGranted('CHILL_ACTIVITY_CREATE', $entity);
 | 
			
		||||
 | 
			
		||||
        $form = $this->createForm(ActivityType::class, $entity, [
 | 
			
		||||
            'center' => $entity->getCenter(),
 | 
			
		||||
            'role'   => new Role('CHILL_ACTIVITY_CREATE'),
 | 
			
		||||
            'activityType' => $entity->getType(),
 | 
			
		||||
            'accompanyingPeriod' => $accompanyingPeriod,
 | 
			
		||||
        ])->handleRequest($request);
 | 
			
		||||
 | 
			
		||||
        if ($form->isSubmitted() && $form->isValid()) {
 | 
			
		||||
            $em->persist($entity);
 | 
			
		||||
            $em->flush();
 | 
			
		||||
 | 
			
		||||
            $this->addFlash('success', $this->get('translator')->trans('Success : activity created!'));
 | 
			
		||||
            $this->get('session')
 | 
			
		||||
                ->getFlashBag()
 | 
			
		||||
                ->add(
 | 
			
		||||
                    'success',
 | 
			
		||||
                    $this->get('translator')
 | 
			
		||||
                        ->trans('Success : activity created!')
 | 
			
		||||
                );
 | 
			
		||||
 | 
			
		||||
            $params = $this->buildParamsToUrl($person, $accompanyingPeriod);
 | 
			
		||||
            $params['id'] = $entity->getId();
 | 
			
		||||
 | 
			
		||||
            return $this->redirectToRoute('chill_activity_activity_show', $params);
 | 
			
		||||
            return $this->redirect(
 | 
			
		||||
                $this->generateUrl(
 | 
			
		||||
                    'chill_activity_activity_show',
 | 
			
		||||
                    ['id' => $entity->getId(), 'person_id' => $person_id]
 | 
			
		||||
                )
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ($view === null) {
 | 
			
		||||
            throw $this->createNotFoundException('Template not found');
 | 
			
		||||
        }
 | 
			
		||||
        $this->get('session')
 | 
			
		||||
            ->getFlashBag()->add(
 | 
			
		||||
                'danger',
 | 
			
		||||
                $this->get('translator')
 | 
			
		||||
                    ->trans('The form is not valid. The activity has not been created !')
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
        $activity_array = $this->serializer->normalize($entity, 'json', ['groups' => 'read']);
 | 
			
		||||
 | 
			
		||||
        return $this->render($view, [
 | 
			
		||||
            'person'   => $person,
 | 
			
		||||
            'accompanyingCourse' => $accompanyingPeriod,
 | 
			
		||||
        return $this->render('ChillActivityBundle:Activity:new.html.twig', [
 | 
			
		||||
            'entity' => $entity,
 | 
			
		||||
            'form' => $form->createView(),
 | 
			
		||||
            'activity_json' => $activity_array
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function showAction(Request $request, $id): Response
 | 
			
		||||
    {
 | 
			
		||||
        $em = $this->getDoctrine()->getManager();
 | 
			
		||||
 | 
			
		||||
        [$person, $accompanyingPeriod] = $this->getEntity($request);
 | 
			
		||||
 | 
			
		||||
        if ($accompanyingPeriod instanceof AccompanyingPeriod) {
 | 
			
		||||
            $view = 'ChillActivityBundle:Activity:showAccompanyingCourse.html.twig';
 | 
			
		||||
        } elseif ($person instanceof Person) {
 | 
			
		||||
            $view = 'ChillActivityBundle:Activity:showPerson.html.twig';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $entity = $em->getRepository('ChillActivityBundle:Activity')->find($id);
 | 
			
		||||
 | 
			
		||||
        if (!$entity) {
 | 
			
		||||
            throw $this->createNotFoundException('Unable to find Activity entity.');
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        if (null !== $accompanyingPeriod) {
 | 
			
		||||
           $entity->personsAssociated = $entity->getPersonsAssociated();
 | 
			
		||||
           $entity->personsNotAssociated = $entity->getPersonsNotAssociated();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // TODO revoir le Voter de Activity pour tenir compte qu'une activité peut appartenir a une période
 | 
			
		||||
        // $this->denyAccessUnlessGranted('CHILL_ACTIVITY_SEE', $entity);
 | 
			
		||||
 | 
			
		||||
        $deleteForm = $this->createDeleteForm($id, $person, $accompanyingPeriod);
 | 
			
		||||
 | 
			
		||||
        // TODO
 | 
			
		||||
        /*
 | 
			
		||||
        $event = new PrivacyEvent($person, array(
 | 
			
		||||
            'element_class' => Activity::class,
 | 
			
		||||
            'element_id' => $entity->getId(),
 | 
			
		||||
            'action' => 'show'
 | 
			
		||||
        ));
 | 
			
		||||
        $this->eventDispatcher->dispatch(PrivacyEvent::PERSON_PRIVACY_EVENT, $event);
 | 
			
		||||
        */
 | 
			
		||||
 | 
			
		||||
        if ($view === null) {
 | 
			
		||||
            throw $this->createNotFoundException('Template not found');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $this->render($view, array(
 | 
			
		||||
            'person'      => $person,
 | 
			
		||||
            'accompanyingCourse' => $accompanyingPeriod,
 | 
			
		||||
            'entity'      => $entity,
 | 
			
		||||
            'delete_form' => $deleteForm->createView(),
 | 
			
		||||
        ));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Displays a form to edit an existing Activity entity.
 | 
			
		||||
     *
 | 
			
		||||
     */
 | 
			
		||||
    public function editAction($id, Request $request): Response
 | 
			
		||||
    {
 | 
			
		||||
        $em = $this->getDoctrine()->getManager();
 | 
			
		||||
 | 
			
		||||
        [$person, $accompanyingPeriod] = $this->getEntity($request);
 | 
			
		||||
 | 
			
		||||
        if ($accompanyingPeriod instanceof AccompanyingPeriod) {
 | 
			
		||||
            $view = 'ChillActivityBundle:Activity:editAccompanyingCourse.html.twig';
 | 
			
		||||
        } elseif ($person instanceof Person) {
 | 
			
		||||
            $view = 'ChillActivityBundle:Activity:editPerson.html.twig';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $entity = $em->getRepository('ChillActivityBundle:Activity')->find($id);
 | 
			
		||||
 | 
			
		||||
        if (!$entity) {
 | 
			
		||||
            throw $this->createNotFoundException('Unable to find Activity entity.');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // TODO
 | 
			
		||||
        // $this->denyAccessUnlessGranted('CHILL_ACTIVITY_UPDATE', $entity);
 | 
			
		||||
 | 
			
		||||
        $form = $this->createForm(ActivityType::class, $entity, [
 | 
			
		||||
            'center' => $entity->getCenter(),
 | 
			
		||||
            'role'   => new Role('CHILL_ACTIVITY_UPDATE'),
 | 
			
		||||
            'activityType' => $entity->getType(),
 | 
			
		||||
            'accompanyingPeriod' => $accompanyingPeriod,
 | 
			
		||||
        ])->handleRequest($request);
 | 
			
		||||
 | 
			
		||||
        if ($form->isSubmitted() && $form->isValid()) {
 | 
			
		||||
            $em->persist($entity);
 | 
			
		||||
            $em->flush();
 | 
			
		||||
 | 
			
		||||
            $this->addFlash('success', $this->get('translator')->trans('Success : activity updated!'));
 | 
			
		||||
 | 
			
		||||
            $params = $this->buildParamsToUrl($person, $accompanyingPeriod);
 | 
			
		||||
            $params['id'] = $id;
 | 
			
		||||
            return $this->redirectToRoute('chill_activity_activity_show', $params);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $deleteForm = $this->createDeleteForm($id, $person, $accompanyingPeriod);
 | 
			
		||||
 | 
			
		||||
        /*
 | 
			
		||||
         * TODO
 | 
			
		||||
        $event = new PrivacyEvent($person, array(
 | 
			
		||||
            'element_class' => Activity::class,
 | 
			
		||||
            'element_id' => $entity->getId(),
 | 
			
		||||
            'action' => 'edit'
 | 
			
		||||
        ));
 | 
			
		||||
        $this->eventDispatcher->dispatch(PrivacyEvent::PERSON_PRIVACY_EVENT, $event);
 | 
			
		||||
        */
 | 
			
		||||
 | 
			
		||||
        if ($view === null) {
 | 
			
		||||
            throw $this->createNotFoundException('Template not found');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $activity_array = $this->serializer->normalize($entity, 'json', ['groups' => 'read']);
 | 
			
		||||
 | 
			
		||||
        return $this->render($view, array(
 | 
			
		||||
            'entity'      => $entity,
 | 
			
		||||
            'edit_form'   => $form->createView(),
 | 
			
		||||
            'delete_form' => $deleteForm->createView(),
 | 
			
		||||
            'person' => $person,
 | 
			
		||||
            'accompanyingCourse' => $accompanyingPeriod,
 | 
			
		||||
            'activity_json' => $activity_array
 | 
			
		||||
        ));
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Deletes a Activity entity.
 | 
			
		||||
     *
 | 
			
		||||
     * @param mixed $id
 | 
			
		||||
     * @param mixed $person_id
 | 
			
		||||
     */
 | 
			
		||||
    public function deleteAction(Request $request, $id)
 | 
			
		||||
    public function deleteAction(Request $request, $id, $person_id)
 | 
			
		||||
    {
 | 
			
		||||
        $em = $this->getDoctrine()->getManager();
 | 
			
		||||
 | 
			
		||||
        [$person, $accompanyingPeriod] = $this->getEntity($request);
 | 
			
		||||
 | 
			
		||||
        if ($accompanyingPeriod instanceof AccompanyingPeriod) {
 | 
			
		||||
            $view = 'ChillActivityBundle:Activity:confirm_deleteAccompanyingCourse.html.twig';
 | 
			
		||||
        } elseif ($person instanceof Person) {
 | 
			
		||||
            $view = 'ChillActivityBundle:Activity:confirm_deletePerson.html.twig';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* @var $activity Activity */
 | 
			
		||||
        $activity = $em->getRepository('ChillActivityBundle:Activity')->find($id);
 | 
			
		||||
        /** @var Activity $activity */
 | 
			
		||||
        $activity = $em->getRepository('ChillActivityBundle:Activity')
 | 
			
		||||
            ->find($id);
 | 
			
		||||
        $person = $activity->getPerson();
 | 
			
		||||
 | 
			
		||||
        if (!$activity) {
 | 
			
		||||
            throw $this->createNotFoundException('Unable to find Activity entity.');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // TODO
 | 
			
		||||
        // $this->denyAccessUnlessGranted('CHILL_ACTIVITY_DELETE', $activity);
 | 
			
		||||
        $this->denyAccessUnlessGranted('CHILL_ACTIVITY_DELETE', $activity);
 | 
			
		||||
 | 
			
		||||
        $form = $this->createDeleteForm($id, $person, $accompanyingPeriod);
 | 
			
		||||
        $form = $this->createDeleteForm($id, $person);
 | 
			
		||||
 | 
			
		||||
        if ($request->getMethod() === Request::METHOD_DELETE) {
 | 
			
		||||
            $form->handleRequest($request);
 | 
			
		||||
 | 
			
		||||
            if ($form->isValid()) {
 | 
			
		||||
 | 
			
		||||
                $this->logger->notice("An activity has been removed", array(
 | 
			
		||||
                   'by_user' => $this->getUser()->getUsername(),
 | 
			
		||||
                   'activity_id' => $activity->getId(),
 | 
			
		||||
                   'person_id' => $activity->getPerson() ? $activity->getPerson()->getId() : null,
 | 
			
		||||
                   'comment' => $activity->getComment()->getComment(),
 | 
			
		||||
                   'scope_id' => $activity->getScope() ? $activity->getScope()->getId() : null,
 | 
			
		||||
                   'reasons_ids' => $activity->getReasons()
 | 
			
		||||
                      ->map(function ($ar) { return $ar->getId(); })
 | 
			
		||||
                      ->toArray(),
 | 
			
		||||
                   'type_id' => $activity->getType()->getId(),
 | 
			
		||||
                   'duration' => $activity->getDurationTime() ? $activity->getDurationTime()->format('U') : null,
 | 
			
		||||
                   'date' => $activity->getDate()->format('Y-m-d'),
 | 
			
		||||
                   'attendee' => $activity->getAttendee()
 | 
			
		||||
                ));
 | 
			
		||||
                $this->logger->notice('An activity has been removed', [
 | 
			
		||||
                    'by_user' => $this->getUser()->getUsername(),
 | 
			
		||||
                    'activity_id' => $activity->getId(),
 | 
			
		||||
                    'person_id' => $activity->getPerson()->getId(),
 | 
			
		||||
                    'comment' => $activity->getComment()->getComment(),
 | 
			
		||||
                    'scope_id' => $activity->getScope()->getId(),
 | 
			
		||||
                    'reasons_ids' => $activity->getReasons()
 | 
			
		||||
                        ->map(static function ($ar) {
 | 
			
		||||
                            return $ar->getId();
 | 
			
		||||
                        })
 | 
			
		||||
                        ->toArray(),
 | 
			
		||||
                    'type_id' => $activity->getType()->getId(),
 | 
			
		||||
                    'duration' => $activity->getDurationTime()->format('U'),
 | 
			
		||||
                    'date' => $activity->getDate()->format('Y-m-d'),
 | 
			
		||||
                    'attendee' => $activity->getAttendee(),
 | 
			
		||||
                ]);
 | 
			
		||||
 | 
			
		||||
                $em->remove($activity);
 | 
			
		||||
                $em->flush();
 | 
			
		||||
 | 
			
		||||
                $this->addFlash('success', $this->get('translator')
 | 
			
		||||
                      ->trans("The activity has been successfully removed."));
 | 
			
		||||
                    ->trans('The activity has been successfully removed.'));
 | 
			
		||||
 | 
			
		||||
                $params = $this->buildParamsToUrl($person, $accompanyingPeriod);
 | 
			
		||||
                return $this->redirectToRoute('chill_activity_activity_list', $params);
 | 
			
		||||
                return $this->redirect($this->generateUrl(
 | 
			
		||||
                    'chill_activity_activity_list',
 | 
			
		||||
                    [
 | 
			
		||||
                        'person_id' => $person_id,
 | 
			
		||||
                    ]
 | 
			
		||||
                ));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ($view === null) {
 | 
			
		||||
            throw $this->createNotFoundException('Template not found');
 | 
			
		||||
        return $this->render('ChillActivityBundle:Activity:confirm_delete.html.twig', [
 | 
			
		||||
            'activity' => $activity,
 | 
			
		||||
            'delete_form' => $form->createView(),
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Displays a form to edit an existing Activity entity.
 | 
			
		||||
     *
 | 
			
		||||
     * @param mixed $person_id
 | 
			
		||||
     * @param mixed $id
 | 
			
		||||
     */
 | 
			
		||||
    public function editAction($person_id, $id)
 | 
			
		||||
    {
 | 
			
		||||
        $em = $this->getDoctrine()->getManager();
 | 
			
		||||
        $person = $em->getRepository('ChillPersonBundle:Person')->find($person_id);
 | 
			
		||||
 | 
			
		||||
        if (!$person) {
 | 
			
		||||
            throw $this->createNotFoundException('person not found');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $this->render($view, array(
 | 
			
		||||
           'activity' => $activity,
 | 
			
		||||
           'delete_form' => $form->createView(),
 | 
			
		||||
           'person' => $person,
 | 
			
		||||
           'accompanyingCourse' => $accompanyingPeriod,
 | 
			
		||||
        ));
 | 
			
		||||
        $this->denyAccessUnlessGranted('CHILL_PERSON_SEE', $person);
 | 
			
		||||
 | 
			
		||||
        $entity = $em->getRepository('ChillActivityBundle:Activity')->find($id);
 | 
			
		||||
 | 
			
		||||
        if (!$entity) {
 | 
			
		||||
            throw $this->createNotFoundException('Unable to find Activity entity.');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $this->denyAccessUnlessGranted('CHILL_ACTIVITY_UPDATE', $entity);
 | 
			
		||||
 | 
			
		||||
        $editForm = $this->createEditForm($entity);
 | 
			
		||||
        $deleteForm = $this->createDeleteForm($id, $person);
 | 
			
		||||
 | 
			
		||||
        $event = new PrivacyEvent($person, [
 | 
			
		||||
            'element_class' => Activity::class,
 | 
			
		||||
            'element_id' => $entity->getId(),
 | 
			
		||||
            'action' => 'edit',
 | 
			
		||||
        ]);
 | 
			
		||||
        $this->eventDispatcher->dispatch(PrivacyEvent::PERSON_PRIVACY_EVENT, $event);
 | 
			
		||||
 | 
			
		||||
        return $this->render('ChillActivityBundle:Activity:edit.html.twig', [
 | 
			
		||||
            'entity' => $entity,
 | 
			
		||||
            'edit_form' => $editForm->createView(),
 | 
			
		||||
            'delete_form' => $deleteForm->createView(),
 | 
			
		||||
            'person' => $person,
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Lists all Activity entities.
 | 
			
		||||
     *
 | 
			
		||||
     * @param mixed $person_id
 | 
			
		||||
     */
 | 
			
		||||
    public function listAction($person_id, Request $request)
 | 
			
		||||
    {
 | 
			
		||||
        $em = $this->getDoctrine()->getManager();
 | 
			
		||||
        $person = $em->getRepository('ChillPersonBundle:Person')->find($person_id);
 | 
			
		||||
 | 
			
		||||
        if (null === $person) {
 | 
			
		||||
            throw $this->createNotFoundException('Person not found');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $this->denyAccessUnlessGranted('CHILL_PERSON_SEE', $person);
 | 
			
		||||
 | 
			
		||||
        $reachableScopes = $this->authorizationHelper
 | 
			
		||||
            ->getReachableScopes(
 | 
			
		||||
                $this->getUser(),
 | 
			
		||||
                new Role('CHILL_ACTIVITY_SEE'),
 | 
			
		||||
                $person->getCenter()
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
        $activities = $em->getRepository('ChillActivityBundle:Activity')
 | 
			
		||||
            ->findBy(
 | 
			
		||||
                ['person' => $person, 'scope' => $reachableScopes],
 | 
			
		||||
                ['date' => 'DESC']
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
        $event = new PrivacyEvent($person, [
 | 
			
		||||
            'element_class' => Activity::class,
 | 
			
		||||
            'action' => 'list',
 | 
			
		||||
        ]);
 | 
			
		||||
        $this->eventDispatcher->dispatch(PrivacyEvent::PERSON_PRIVACY_EVENT, $event);
 | 
			
		||||
 | 
			
		||||
        return $this->render('ChillActivityBundle:Activity:list.html.twig', [
 | 
			
		||||
            'activities' => $activities,
 | 
			
		||||
            'person' => $person,
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Displays a form to create a new Activity entity.
 | 
			
		||||
     *
 | 
			
		||||
     * @param mixed $person_id
 | 
			
		||||
     */
 | 
			
		||||
    public function newAction($person_id)
 | 
			
		||||
    {
 | 
			
		||||
        $em = $this->getDoctrine()->getManager();
 | 
			
		||||
        $person = $em->getRepository('ChillPersonBundle:Person')->find($person_id);
 | 
			
		||||
 | 
			
		||||
        if (null === $person) {
 | 
			
		||||
            throw $this->createNotFoundException('Person not found');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $this->denyAccessUnlessGranted('CHILL_PERSON_SEE', $person);
 | 
			
		||||
 | 
			
		||||
        $entity = new Activity();
 | 
			
		||||
        $entity->setUser($this->get('security.token_storage')->getToken()->getUser());
 | 
			
		||||
        $entity->setPerson($person);
 | 
			
		||||
        $entity->setDate(new DateTime('now'));
 | 
			
		||||
 | 
			
		||||
        $this->denyAccessUnlessGranted('CHILL_ACTIVITY_CREATE', $entity);
 | 
			
		||||
 | 
			
		||||
        $form = $this->createCreateForm($entity, $person);
 | 
			
		||||
 | 
			
		||||
        return $this->render('ChillActivityBundle:Activity:new.html.twig', [
 | 
			
		||||
            'person' => $person,
 | 
			
		||||
            'entity' => $entity,
 | 
			
		||||
            'form' => $form->createView(),
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Finds and displays a Activity entity.
 | 
			
		||||
     *
 | 
			
		||||
     * @param mixed $person_id
 | 
			
		||||
     * @param mixed $id
 | 
			
		||||
     */
 | 
			
		||||
    public function showAction($person_id, $id)
 | 
			
		||||
    {
 | 
			
		||||
        $em = $this->getDoctrine()->getManager();
 | 
			
		||||
        $person = $em->getRepository('ChillPersonBundle:Person')->find($person_id);
 | 
			
		||||
 | 
			
		||||
        if (!$person) {
 | 
			
		||||
            throw $this->createNotFoundException('person not found');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $this->denyAccessUnlessGranted('CHILL_PERSON_SEE', $person);
 | 
			
		||||
 | 
			
		||||
        $entity = $em->getRepository('ChillActivityBundle:Activity')->find($id);
 | 
			
		||||
 | 
			
		||||
        if (!$entity) {
 | 
			
		||||
            throw $this->createNotFoundException('Unable to find Activity entity.');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $this->denyAccessUnlessGranted('CHILL_ACTIVITY_SEE', $entity);
 | 
			
		||||
 | 
			
		||||
        $deleteForm = $this->createDeleteForm($id, $person);
 | 
			
		||||
 | 
			
		||||
        $event = new PrivacyEvent($person, [
 | 
			
		||||
            'element_class' => Activity::class,
 | 
			
		||||
            'element_id' => $entity->getId(),
 | 
			
		||||
            'action' => 'show',
 | 
			
		||||
        ]);
 | 
			
		||||
        $this->eventDispatcher->dispatch(PrivacyEvent::PERSON_PRIVACY_EVENT, $event);
 | 
			
		||||
 | 
			
		||||
        return $this->render('ChillActivityBundle:Activity:show.html.twig', [
 | 
			
		||||
            'person' => $person,
 | 
			
		||||
            'entity' => $entity,
 | 
			
		||||
            'delete_form' => $deleteForm->createView(),
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Edits an existing Activity entity.
 | 
			
		||||
     *
 | 
			
		||||
     * @param mixed $person_id
 | 
			
		||||
     * @param mixed $id
 | 
			
		||||
     */
 | 
			
		||||
    public function updateAction(Request $request, $person_id, $id)
 | 
			
		||||
    {
 | 
			
		||||
        $em = $this->getDoctrine()->getManager();
 | 
			
		||||
 | 
			
		||||
        $person = $em->getRepository('ChillPersonBundle:Person')->find($person_id);
 | 
			
		||||
        $entity = $em->getRepository('ChillActivityBundle:Activity')->find($id);
 | 
			
		||||
 | 
			
		||||
        if (!$entity) {
 | 
			
		||||
            throw $this->createNotFoundException('Unable to find Activity entity.');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $this->denyAccessUnlessGranted('CHILL_ACTIVITY_UPDATE', $entity);
 | 
			
		||||
 | 
			
		||||
        $deleteForm = $this->createDeleteForm($id, $person);
 | 
			
		||||
        $editForm = $this->createEditForm($entity);
 | 
			
		||||
        $editForm->handleRequest($request);
 | 
			
		||||
 | 
			
		||||
        $event = new PrivacyEvent($person, [
 | 
			
		||||
            'element_class' => Activity::class,
 | 
			
		||||
            'element_id' => $entity->getId(),
 | 
			
		||||
            'action' => 'update',
 | 
			
		||||
        ]);
 | 
			
		||||
        $this->eventDispatcher->dispatch(PrivacyEvent::PERSON_PRIVACY_EVENT, $event);
 | 
			
		||||
 | 
			
		||||
        if ($editForm->isValid()) {
 | 
			
		||||
            $em->flush();
 | 
			
		||||
 | 
			
		||||
            $this->get('session')
 | 
			
		||||
                ->getFlashBag()
 | 
			
		||||
                ->add(
 | 
			
		||||
                    'success',
 | 
			
		||||
                    $this->get('translator')
 | 
			
		||||
                        ->trans('Success : activity updated!')
 | 
			
		||||
                );
 | 
			
		||||
 | 
			
		||||
            return $this->redirect($this->generateUrl('chill_activity_activity_show', ['id' => $id, 'person_id' => $person_id]));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $this->get('session')
 | 
			
		||||
            ->getFlashBag()
 | 
			
		||||
            ->add(
 | 
			
		||||
                'error',
 | 
			
		||||
                $this->get('translator')
 | 
			
		||||
                    ->trans('This form contains errors')
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
        return $this->render('ChillActivityBundle:Activity:edit.html.twig', [
 | 
			
		||||
            'person' => $entity->getPerson(),
 | 
			
		||||
            'entity' => $entity,
 | 
			
		||||
            'edit_form' => $editForm->createView(),
 | 
			
		||||
            'delete_form' => $deleteForm->createView(),
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a form to create a Activity entity.
 | 
			
		||||
     *
 | 
			
		||||
     * @param Activity $entity The entity
 | 
			
		||||
     *
 | 
			
		||||
     * @return \Symfony\Component\Form\Form The form
 | 
			
		||||
     */
 | 
			
		||||
    private function createCreateForm(Activity $entity)
 | 
			
		||||
    {
 | 
			
		||||
        return $this->createForm(
 | 
			
		||||
            ActivityType::class,
 | 
			
		||||
            $entity,
 | 
			
		||||
            [
 | 
			
		||||
                'action' => $this->generateUrl('chill_activity_activity_create', [
 | 
			
		||||
                    'person_id' => $entity->getPerson()->getId(),
 | 
			
		||||
                ]),
 | 
			
		||||
                'method' => 'POST',
 | 
			
		||||
                'center' => $entity->getCenter(),
 | 
			
		||||
                'role' => new Role('CHILL_ACTIVITY_CREATE'),
 | 
			
		||||
            ]
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a form to delete a Activity entity by id.
 | 
			
		||||
     *
 | 
			
		||||
     * @param mixed $id The entity id
 | 
			
		||||
     * @param mixed $person
 | 
			
		||||
     *
 | 
			
		||||
     * @return \Symfony\Component\Form\Form The form
 | 
			
		||||
     */
 | 
			
		||||
    private function createDeleteForm(int $id, ?Person $person, ?AccompanyingPeriod $accompanyingPeriod): Form
 | 
			
		||||
    private function createDeleteForm($id, $person)
 | 
			
		||||
    {
 | 
			
		||||
        $params = $this->buildParamsToUrl($person, $accompanyingPeriod);
 | 
			
		||||
        $params['id'] = $id;
 | 
			
		||||
 | 
			
		||||
        return $this->createFormBuilder()
 | 
			
		||||
            ->setAction($this->generateUrl('chill_activity_activity_delete', $params))
 | 
			
		||||
            ->setAction($this->generateUrl(
 | 
			
		||||
                'chill_activity_activity_delete',
 | 
			
		||||
                ['id' => $id, 'person_id' => $person->getId()]
 | 
			
		||||
            ))
 | 
			
		||||
            ->setMethod('DELETE')
 | 
			
		||||
            ->add('submit', SubmitType::class, array('label' => 'Delete'))
 | 
			
		||||
            ->getForm()
 | 
			
		||||
        ;
 | 
			
		||||
            ->add('submit', SubmitType::class, ['label' => 'Delete'])
 | 
			
		||||
            ->getForm();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private function getEntity(Request $request): array
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a form to edit a Activity entity.
 | 
			
		||||
     *
 | 
			
		||||
     * @param Activity $entity The entity
 | 
			
		||||
     *
 | 
			
		||||
     * @return \Symfony\Component\Form\Form The form
 | 
			
		||||
     */
 | 
			
		||||
    private function createEditForm(Activity $entity)
 | 
			
		||||
    {
 | 
			
		||||
        $em = $this->getDoctrine()->getManager();
 | 
			
		||||
        $person = $accompanyingPeriod  = null;
 | 
			
		||||
 | 
			
		||||
        if ($request->query->has('person_id')) {
 | 
			
		||||
            $person_id = $request->get('person_id');
 | 
			
		||||
            $person = $em->getRepository(Person::class)->find($person_id);
 | 
			
		||||
 | 
			
		||||
            if ($person === null) {
 | 
			
		||||
                throw $this->createNotFoundException('Person not found');
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            $this->denyAccessUnlessGranted('CHILL_PERSON_SEE', $person);
 | 
			
		||||
        } elseif ($request->query->has('accompanying_period_id')) {
 | 
			
		||||
            $accompanying_period_id = $request->get('accompanying_period_id');
 | 
			
		||||
            $accompanyingPeriod = $em->getRepository(AccompanyingPeriod::class)->find($accompanying_period_id);
 | 
			
		||||
 | 
			
		||||
            if ($accompanyingPeriod === null) {
 | 
			
		||||
                throw $this->createNotFoundException('Accompanying Period not found');
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // TODO Add permission
 | 
			
		||||
            // $this->denyAccessUnlessGranted('CHILL_PERSON_SEE', $person);
 | 
			
		||||
        } else {
 | 
			
		||||
            throw $this->createNotFoundException("Person or Accompanying Period not found");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return [
 | 
			
		||||
            $person, $accompanyingPeriod
 | 
			
		||||
        ];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private function buildParamsToUrl(
 | 
			
		||||
        ?Person $person,
 | 
			
		||||
        ?AccompanyingPeriod $accompanyingPeriod
 | 
			
		||||
    ): array {
 | 
			
		||||
        $params = [];
 | 
			
		||||
 | 
			
		||||
        if ($person) {
 | 
			
		||||
            $params['person_id'] = $person->getId();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ($accompanyingPeriod) {
 | 
			
		||||
            $params['accompanying_period_id'] = $accompanyingPeriod->getId();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $params;
 | 
			
		||||
        return $this->createForm(ActivityType::class, $entity, [
 | 
			
		||||
            'action' => $this->generateUrl(
 | 
			
		||||
                'chill_activity_activity_update',
 | 
			
		||||
                [
 | 
			
		||||
                    'id' => $entity->getId(),
 | 
			
		||||
                    'person_id' => $entity->getPerson()->getId(),
 | 
			
		||||
                ]
 | 
			
		||||
            ),
 | 
			
		||||
            'method' => 'PUT',
 | 
			
		||||
            'center' => $entity->getCenter(),
 | 
			
		||||
            'role' => new Role('CHILL_ACTIVITY_UPDATE'),
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,38 +1,28 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Controller;
 | 
			
		||||
 | 
			
		||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
 | 
			
		||||
use Symfony\Component\HttpFoundation\Request;
 | 
			
		||||
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
 | 
			
		||||
 | 
			
		||||
use Chill\ActivityBundle\Entity\ActivityReasonCategory;
 | 
			
		||||
use Chill\ActivityBundle\Form\ActivityReasonCategoryType;
 | 
			
		||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
 | 
			
		||||
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
 | 
			
		||||
use Symfony\Component\HttpFoundation\Request;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ActivityReasonCategory controller.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
class ActivityReasonCategoryController extends AbstractController
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Lists all ActivityReasonCategory entities.
 | 
			
		||||
     *
 | 
			
		||||
     */
 | 
			
		||||
    public function indexAction()
 | 
			
		||||
    {
 | 
			
		||||
        $em = $this->getDoctrine()->getManager();
 | 
			
		||||
 | 
			
		||||
        $entities = $em->getRepository('ChillActivityBundle:ActivityReasonCategory')->findAll();
 | 
			
		||||
 | 
			
		||||
        return $this->render('ChillActivityBundle:ActivityReasonCategory:index.html.twig', array(
 | 
			
		||||
            'entities' => $entities,
 | 
			
		||||
        ));
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a new ActivityReasonCategory entity.
 | 
			
		||||
     *
 | 
			
		||||
     */
 | 
			
		||||
    public function createAction(Request $request)
 | 
			
		||||
    {
 | 
			
		||||
@@ -45,71 +35,19 @@ class ActivityReasonCategoryController extends AbstractController
 | 
			
		||||
            $em->persist($entity);
 | 
			
		||||
            $em->flush();
 | 
			
		||||
 | 
			
		||||
            return $this->redirect($this->generateUrl('chill_activity_activityreasoncategory_show', array('id' => $entity->getId())));
 | 
			
		||||
            return $this->redirect($this->generateUrl('chill_activity_activityreasoncategory_show', ['id' => $entity->getId()]));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $this->render('ChillActivityBundle:ActivityReasonCategory:new.html.twig', array(
 | 
			
		||||
        return $this->render('ChillActivityBundle:ActivityReasonCategory:new.html.twig', [
 | 
			
		||||
            'entity' => $entity,
 | 
			
		||||
            'form'   => $form->createView(),
 | 
			
		||||
        ));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a form to create a ActivityReasonCategory entity.
 | 
			
		||||
     *
 | 
			
		||||
     * @param ActivityReasonCategory $entity The entity
 | 
			
		||||
     *
 | 
			
		||||
     * @return \Symfony\Component\Form\Form The form
 | 
			
		||||
     */
 | 
			
		||||
    private function createCreateForm(ActivityReasonCategory $entity)
 | 
			
		||||
    {
 | 
			
		||||
        $form = $this->createForm(ActivityReasonCategoryType::class, $entity, array(
 | 
			
		||||
            'action' => $this->generateUrl('chill_activity_activityreasoncategory_create'),
 | 
			
		||||
            'method' => 'POST',
 | 
			
		||||
        ));
 | 
			
		||||
 | 
			
		||||
        $form->add('submit', SubmitType::class, array('label' => 'Create'));
 | 
			
		||||
 | 
			
		||||
        return $form;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Displays a form to create a new ActivityReasonCategory entity.
 | 
			
		||||
     *
 | 
			
		||||
     */
 | 
			
		||||
    public function newAction()
 | 
			
		||||
    {
 | 
			
		||||
        $entity = new ActivityReasonCategory();
 | 
			
		||||
        $form   = $this->createCreateForm($entity);
 | 
			
		||||
 | 
			
		||||
        return $this->render('ChillActivityBundle:ActivityReasonCategory:new.html.twig', array(
 | 
			
		||||
            'entity' => $entity,
 | 
			
		||||
            'form'   => $form->createView(),
 | 
			
		||||
        ));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Finds and displays a ActivityReasonCategory entity.
 | 
			
		||||
     *
 | 
			
		||||
     */
 | 
			
		||||
    public function showAction($id)
 | 
			
		||||
    {
 | 
			
		||||
        $em = $this->getDoctrine()->getManager();
 | 
			
		||||
 | 
			
		||||
        $entity = $em->getRepository('ChillActivityBundle:ActivityReasonCategory')->find($id);
 | 
			
		||||
 | 
			
		||||
        if (!$entity) {
 | 
			
		||||
            throw $this->createNotFoundException('Unable to find ActivityReasonCategory entity.');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $this->render('ChillActivityBundle:ActivityReasonCategory:show.html.twig', array(
 | 
			
		||||
            'entity'      => $entity,
 | 
			
		||||
        ));
 | 
			
		||||
            'form' => $form->createView(),
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Displays a form to edit an existing ActivityReasonCategory entity.
 | 
			
		||||
     *
 | 
			
		||||
     * @param mixed $id
 | 
			
		||||
     */
 | 
			
		||||
    public function editAction($id)
 | 
			
		||||
    {
 | 
			
		||||
@@ -123,33 +61,64 @@ class ActivityReasonCategoryController extends AbstractController
 | 
			
		||||
 | 
			
		||||
        $editForm = $this->createEditForm($entity);
 | 
			
		||||
 | 
			
		||||
        return $this->render('ChillActivityBundle:ActivityReasonCategory:edit.html.twig', array(
 | 
			
		||||
            'entity'      => $entity,
 | 
			
		||||
            'edit_form'   => $editForm->createView(),
 | 
			
		||||
        ));
 | 
			
		||||
        return $this->render('ChillActivityBundle:ActivityReasonCategory:edit.html.twig', [
 | 
			
		||||
            'entity' => $entity,
 | 
			
		||||
            'edit_form' => $editForm->createView(),
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
    * Creates a form to edit a ActivityReasonCategory entity.
 | 
			
		||||
    *
 | 
			
		||||
    * @param ActivityReasonCategory $entity The entity
 | 
			
		||||
    *
 | 
			
		||||
    * @return \Symfony\Component\Form\Form The form
 | 
			
		||||
    */
 | 
			
		||||
    private function createEditForm(ActivityReasonCategory $entity)
 | 
			
		||||
     * Lists all ActivityReasonCategory entities.
 | 
			
		||||
     */
 | 
			
		||||
    public function indexAction()
 | 
			
		||||
    {
 | 
			
		||||
        $form = $this->createForm(ActivityReasonCategoryType::class, $entity, array(
 | 
			
		||||
            'action' => $this->generateUrl('chill_activity_activityreasoncategory_update', array('id' => $entity->getId())),
 | 
			
		||||
            'method' => 'PUT',
 | 
			
		||||
        ));
 | 
			
		||||
        $em = $this->getDoctrine()->getManager();
 | 
			
		||||
 | 
			
		||||
        $form->add('submit', SubmitType::class, array('label' => 'Update'));
 | 
			
		||||
        $entities = $em->getRepository('ChillActivityBundle:ActivityReasonCategory')->findAll();
 | 
			
		||||
 | 
			
		||||
        return $form;
 | 
			
		||||
        return $this->render('ChillActivityBundle:ActivityReasonCategory:index.html.twig', [
 | 
			
		||||
            'entities' => $entities,
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Displays a form to create a new ActivityReasonCategory entity.
 | 
			
		||||
     */
 | 
			
		||||
    public function newAction()
 | 
			
		||||
    {
 | 
			
		||||
        $entity = new ActivityReasonCategory();
 | 
			
		||||
        $form = $this->createCreateForm($entity);
 | 
			
		||||
 | 
			
		||||
        return $this->render('ChillActivityBundle:ActivityReasonCategory:new.html.twig', [
 | 
			
		||||
            'entity' => $entity,
 | 
			
		||||
            'form' => $form->createView(),
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Finds and displays a ActivityReasonCategory entity.
 | 
			
		||||
     *
 | 
			
		||||
     * @param mixed $id
 | 
			
		||||
     */
 | 
			
		||||
    public function showAction($id)
 | 
			
		||||
    {
 | 
			
		||||
        $em = $this->getDoctrine()->getManager();
 | 
			
		||||
 | 
			
		||||
        $entity = $em->getRepository('ChillActivityBundle:ActivityReasonCategory')->find($id);
 | 
			
		||||
 | 
			
		||||
        if (!$entity) {
 | 
			
		||||
            throw $this->createNotFoundException('Unable to find ActivityReasonCategory entity.');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $this->render('ChillActivityBundle:ActivityReasonCategory:show.html.twig', [
 | 
			
		||||
            'entity' => $entity,
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Edits an existing ActivityReasonCategory entity.
 | 
			
		||||
     *
 | 
			
		||||
     * @param mixed $id
 | 
			
		||||
     */
 | 
			
		||||
    public function updateAction(Request $request, $id)
 | 
			
		||||
    {
 | 
			
		||||
@@ -167,12 +136,50 @@ class ActivityReasonCategoryController extends AbstractController
 | 
			
		||||
        if ($editForm->isValid()) {
 | 
			
		||||
            $em->flush();
 | 
			
		||||
 | 
			
		||||
            return $this->redirect($this->generateUrl('chill_activity_activityreasoncategory_edit', array('id' => $id)));
 | 
			
		||||
            return $this->redirect($this->generateUrl('chill_activity_activityreasoncategory_edit', ['id' => $id]));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $this->render('ChillActivityBundle:ActivityReasonCategory:edit.html.twig', array(
 | 
			
		||||
            'entity'      => $entity,
 | 
			
		||||
            'edit_form'   => $editForm->createView(),
 | 
			
		||||
        ));
 | 
			
		||||
        return $this->render('ChillActivityBundle:ActivityReasonCategory:edit.html.twig', [
 | 
			
		||||
            'entity' => $entity,
 | 
			
		||||
            'edit_form' => $editForm->createView(),
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a form to create a ActivityReasonCategory entity.
 | 
			
		||||
     *
 | 
			
		||||
     * @param ActivityReasonCategory $entity The entity
 | 
			
		||||
     *
 | 
			
		||||
     * @return \Symfony\Component\Form\Form The form
 | 
			
		||||
     */
 | 
			
		||||
    private function createCreateForm(ActivityReasonCategory $entity)
 | 
			
		||||
    {
 | 
			
		||||
        $form = $this->createForm(ActivityReasonCategoryType::class, $entity, [
 | 
			
		||||
            'action' => $this->generateUrl('chill_activity_activityreasoncategory_create'),
 | 
			
		||||
            'method' => 'POST',
 | 
			
		||||
        ]);
 | 
			
		||||
 | 
			
		||||
        $form->add('submit', SubmitType::class, ['label' => 'Create']);
 | 
			
		||||
 | 
			
		||||
        return $form;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a form to edit a ActivityReasonCategory entity.
 | 
			
		||||
     *
 | 
			
		||||
     * @param ActivityReasonCategory $entity The entity
 | 
			
		||||
     *
 | 
			
		||||
     * @return \Symfony\Component\Form\Form The form
 | 
			
		||||
     */
 | 
			
		||||
    private function createEditForm(ActivityReasonCategory $entity)
 | 
			
		||||
    {
 | 
			
		||||
        $form = $this->createForm(ActivityReasonCategoryType::class, $entity, [
 | 
			
		||||
            'action' => $this->generateUrl('chill_activity_activityreasoncategory_update', ['id' => $entity->getId()]),
 | 
			
		||||
            'method' => 'PUT',
 | 
			
		||||
        ]);
 | 
			
		||||
 | 
			
		||||
        $form->add('submit', SubmitType::class, ['label' => 'Update']);
 | 
			
		||||
 | 
			
		||||
        return $form;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,38 +1,28 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Controller;
 | 
			
		||||
 | 
			
		||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
 | 
			
		||||
use Symfony\Component\HttpFoundation\Request;
 | 
			
		||||
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
 | 
			
		||||
 | 
			
		||||
use Chill\ActivityBundle\Entity\ActivityReason;
 | 
			
		||||
use Chill\ActivityBundle\Form\ActivityReasonType;
 | 
			
		||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
 | 
			
		||||
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
 | 
			
		||||
use Symfony\Component\HttpFoundation\Request;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ActivityReason controller.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
class ActivityReasonController extends AbstractController
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Lists all ActivityReason entities.
 | 
			
		||||
     *
 | 
			
		||||
     */
 | 
			
		||||
    public function indexAction()
 | 
			
		||||
    {
 | 
			
		||||
        $em = $this->getDoctrine()->getManager();
 | 
			
		||||
 | 
			
		||||
        $entities = $em->getRepository('ChillActivityBundle:ActivityReason')->findAll();
 | 
			
		||||
 | 
			
		||||
        return $this->render('ChillActivityBundle:ActivityReason:index.html.twig', array(
 | 
			
		||||
            'entities' => $entities,
 | 
			
		||||
        ));
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a new ActivityReason entity.
 | 
			
		||||
     *
 | 
			
		||||
     */
 | 
			
		||||
    public function createAction(Request $request)
 | 
			
		||||
    {
 | 
			
		||||
@@ -45,71 +35,19 @@ class ActivityReasonController extends AbstractController
 | 
			
		||||
            $em->persist($entity);
 | 
			
		||||
            $em->flush();
 | 
			
		||||
 | 
			
		||||
            return $this->redirect($this->generateUrl('chill_activity_activityreason', array('id' => $entity->getId())));
 | 
			
		||||
            return $this->redirect($this->generateUrl('chill_activity_activityreason', ['id' => $entity->getId()]));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $this->render('ChillActivityBundle:ActivityReason:new.html.twig', array(
 | 
			
		||||
        return $this->render('ChillActivityBundle:ActivityReason:new.html.twig', [
 | 
			
		||||
            'entity' => $entity,
 | 
			
		||||
            'form'   => $form->createView(),
 | 
			
		||||
        ));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a form to create a ActivityReason entity.
 | 
			
		||||
     *
 | 
			
		||||
     * @param ActivityReason $entity The entity
 | 
			
		||||
     *
 | 
			
		||||
     * @return \Symfony\Component\Form\Form The form
 | 
			
		||||
     */
 | 
			
		||||
    private function createCreateForm(ActivityReason $entity)
 | 
			
		||||
    {
 | 
			
		||||
        $form = $this->createForm(ActivityReasonType::class, $entity, array(
 | 
			
		||||
            'action' => $this->generateUrl('chill_activity_activityreason_create'),
 | 
			
		||||
            'method' => 'POST',
 | 
			
		||||
        ));
 | 
			
		||||
 | 
			
		||||
        $form->add('submit', SubmitType::class, array('label' => 'Create'));
 | 
			
		||||
 | 
			
		||||
        return $form;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Displays a form to create a new ActivityReason entity.
 | 
			
		||||
     *
 | 
			
		||||
     */
 | 
			
		||||
    public function newAction()
 | 
			
		||||
    {
 | 
			
		||||
        $entity = new ActivityReason();
 | 
			
		||||
        $form   = $this->createCreateForm($entity);
 | 
			
		||||
 | 
			
		||||
        return $this->render('ChillActivityBundle:ActivityReason:new.html.twig', array(
 | 
			
		||||
            'entity' => $entity,
 | 
			
		||||
            'form'   => $form->createView(),
 | 
			
		||||
        ));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Finds and displays a ActivityReason entity.
 | 
			
		||||
     *
 | 
			
		||||
     */
 | 
			
		||||
    public function showAction($id)
 | 
			
		||||
    {
 | 
			
		||||
        $em = $this->getDoctrine()->getManager();
 | 
			
		||||
 | 
			
		||||
        $entity = $em->getRepository('ChillActivityBundle:ActivityReason')->find($id);
 | 
			
		||||
 | 
			
		||||
        if (!$entity) {
 | 
			
		||||
            throw $this->createNotFoundException('Unable to find ActivityReason entity.');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $this->render('ChillActivityBundle:ActivityReason:show.html.twig', array(
 | 
			
		||||
            'entity'      => $entity,
 | 
			
		||||
        ));
 | 
			
		||||
            'form' => $form->createView(),
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Displays a form to edit an existing ActivityReason entity.
 | 
			
		||||
     *
 | 
			
		||||
     * @param mixed $id
 | 
			
		||||
     */
 | 
			
		||||
    public function editAction($id)
 | 
			
		||||
    {
 | 
			
		||||
@@ -123,33 +61,64 @@ class ActivityReasonController extends AbstractController
 | 
			
		||||
 | 
			
		||||
        $editForm = $this->createEditForm($entity);
 | 
			
		||||
 | 
			
		||||
        return $this->render('ChillActivityBundle:ActivityReason:edit.html.twig', array(
 | 
			
		||||
            'entity'      => $entity,
 | 
			
		||||
            'edit_form'   => $editForm->createView()
 | 
			
		||||
        ));
 | 
			
		||||
        return $this->render('ChillActivityBundle:ActivityReason:edit.html.twig', [
 | 
			
		||||
            'entity' => $entity,
 | 
			
		||||
            'edit_form' => $editForm->createView(),
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
    * Creates a form to edit a ActivityReason entity.
 | 
			
		||||
    *
 | 
			
		||||
    * @param ActivityReason $entity The entity
 | 
			
		||||
    *
 | 
			
		||||
    * @return \Symfony\Component\Form\Form The form
 | 
			
		||||
    */
 | 
			
		||||
    private function createEditForm(ActivityReason $entity)
 | 
			
		||||
     * Lists all ActivityReason entities.
 | 
			
		||||
     */
 | 
			
		||||
    public function indexAction()
 | 
			
		||||
    {
 | 
			
		||||
        $form = $this->createForm(ActivityReasonType::class, $entity, array(
 | 
			
		||||
            'action' => $this->generateUrl('chill_activity_activityreason_update', array('id' => $entity->getId())),
 | 
			
		||||
            'method' => 'PUT',
 | 
			
		||||
        ));
 | 
			
		||||
        $em = $this->getDoctrine()->getManager();
 | 
			
		||||
 | 
			
		||||
        $form->add('submit', SubmitType::class, array('label' => 'Update'));
 | 
			
		||||
        $entities = $em->getRepository('ChillActivityBundle:ActivityReason')->findAll();
 | 
			
		||||
 | 
			
		||||
        return $form;
 | 
			
		||||
        return $this->render('ChillActivityBundle:ActivityReason:index.html.twig', [
 | 
			
		||||
            'entities' => $entities,
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Displays a form to create a new ActivityReason entity.
 | 
			
		||||
     */
 | 
			
		||||
    public function newAction()
 | 
			
		||||
    {
 | 
			
		||||
        $entity = new ActivityReason();
 | 
			
		||||
        $form = $this->createCreateForm($entity);
 | 
			
		||||
 | 
			
		||||
        return $this->render('ChillActivityBundle:ActivityReason:new.html.twig', [
 | 
			
		||||
            'entity' => $entity,
 | 
			
		||||
            'form' => $form->createView(),
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Finds and displays a ActivityReason entity.
 | 
			
		||||
     *
 | 
			
		||||
     * @param mixed $id
 | 
			
		||||
     */
 | 
			
		||||
    public function showAction($id)
 | 
			
		||||
    {
 | 
			
		||||
        $em = $this->getDoctrine()->getManager();
 | 
			
		||||
 | 
			
		||||
        $entity = $em->getRepository('ChillActivityBundle:ActivityReason')->find($id);
 | 
			
		||||
 | 
			
		||||
        if (!$entity) {
 | 
			
		||||
            throw $this->createNotFoundException('Unable to find ActivityReason entity.');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $this->render('ChillActivityBundle:ActivityReason:show.html.twig', [
 | 
			
		||||
            'entity' => $entity,
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Edits an existing ActivityReason entity.
 | 
			
		||||
     *
 | 
			
		||||
     * @param mixed $id
 | 
			
		||||
     */
 | 
			
		||||
    public function updateAction(Request $request, $id)
 | 
			
		||||
    {
 | 
			
		||||
@@ -167,12 +136,50 @@ class ActivityReasonController extends AbstractController
 | 
			
		||||
        if ($editForm->isValid()) {
 | 
			
		||||
            $em->flush();
 | 
			
		||||
 | 
			
		||||
            return $this->redirect($this->generateUrl('chill_activity_activityreason', array('id' => $id)));
 | 
			
		||||
            return $this->redirect($this->generateUrl('chill_activity_activityreason', ['id' => $id]));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $this->render('ChillActivityBundle:ActivityReason:edit.html.twig', array(
 | 
			
		||||
            'entity'      => $entity,
 | 
			
		||||
            'edit_form'   => $editForm->createView()
 | 
			
		||||
        ));
 | 
			
		||||
        return $this->render('ChillActivityBundle:ActivityReason:edit.html.twig', [
 | 
			
		||||
            'entity' => $entity,
 | 
			
		||||
            'edit_form' => $editForm->createView(),
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a form to create a ActivityReason entity.
 | 
			
		||||
     *
 | 
			
		||||
     * @param ActivityReason $entity The entity
 | 
			
		||||
     *
 | 
			
		||||
     * @return \Symfony\Component\Form\Form The form
 | 
			
		||||
     */
 | 
			
		||||
    private function createCreateForm(ActivityReason $entity)
 | 
			
		||||
    {
 | 
			
		||||
        $form = $this->createForm(ActivityReasonType::class, $entity, [
 | 
			
		||||
            'action' => $this->generateUrl('chill_activity_activityreason_create'),
 | 
			
		||||
            'method' => 'POST',
 | 
			
		||||
        ]);
 | 
			
		||||
 | 
			
		||||
        $form->add('submit', SubmitType::class, ['label' => 'Create']);
 | 
			
		||||
 | 
			
		||||
        return $form;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a form to edit a ActivityReason entity.
 | 
			
		||||
     *
 | 
			
		||||
     * @param ActivityReason $entity The entity
 | 
			
		||||
     *
 | 
			
		||||
     * @return \Symfony\Component\Form\Form The form
 | 
			
		||||
     */
 | 
			
		||||
    private function createEditForm(ActivityReason $entity)
 | 
			
		||||
    {
 | 
			
		||||
        $form = $this->createForm(ActivityReasonType::class, $entity, [
 | 
			
		||||
            'action' => $this->generateUrl('chill_activity_activityreason_update', ['id' => $entity->getId()]),
 | 
			
		||||
            'method' => 'PUT',
 | 
			
		||||
        ]);
 | 
			
		||||
 | 
			
		||||
        $form->add('submit', SubmitType::class, ['label' => 'Update']);
 | 
			
		||||
 | 
			
		||||
        return $form;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,185 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Controller;
 | 
			
		||||
 | 
			
		||||
use Chill\ActivityBundle\Entity\ActivityType;
 | 
			
		||||
use Chill\ActivityBundle\Form\ActivityTypeType;
 | 
			
		||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
 | 
			
		||||
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
 | 
			
		||||
use Symfony\Component\HttpFoundation\Request;
 | 
			
		||||
 | 
			
		||||
class ActivityTypeController extends AbstractController
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a new ActivityType entity.
 | 
			
		||||
     */
 | 
			
		||||
    public function createAction(Request $request)
 | 
			
		||||
    {
 | 
			
		||||
        $entity = new ActivityType();
 | 
			
		||||
        $form = $this->createCreateForm($entity);
 | 
			
		||||
        $form->handleRequest($request);
 | 
			
		||||
 | 
			
		||||
        if ($form->isValid()) {
 | 
			
		||||
            $em = $this->getDoctrine()->getManager();
 | 
			
		||||
            $em->persist($entity);
 | 
			
		||||
            $em->flush();
 | 
			
		||||
 | 
			
		||||
            return $this->redirect($this->generateUrl('chill_activity_activitytype_show', ['id' => $entity->getId()]));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $this->render('ChillActivityBundle:ActivityType:new.html.twig', [
 | 
			
		||||
            'entity' => $entity,
 | 
			
		||||
            'form' => $form->createView(),
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Displays a form to edit an existing ActivityType entity.
 | 
			
		||||
     *
 | 
			
		||||
     * @param mixed $id
 | 
			
		||||
     */
 | 
			
		||||
    public function editAction($id)
 | 
			
		||||
    {
 | 
			
		||||
        $em = $this->getDoctrine()->getManager();
 | 
			
		||||
 | 
			
		||||
        $entity = $em->getRepository('ChillActivityBundle:ActivityType')->find($id);
 | 
			
		||||
 | 
			
		||||
        if (!$entity) {
 | 
			
		||||
            throw $this->createNotFoundException('Unable to find ActivityType entity.');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $editForm = $this->createEditForm($entity);
 | 
			
		||||
 | 
			
		||||
        return $this->render('ChillActivityBundle:ActivityType:edit.html.twig', [
 | 
			
		||||
            'entity' => $entity,
 | 
			
		||||
            'edit_form' => $editForm->createView(),
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Lists all ActivityType entities.
 | 
			
		||||
     */
 | 
			
		||||
    public function indexAction()
 | 
			
		||||
    {
 | 
			
		||||
        $em = $this->getDoctrine()->getManager();
 | 
			
		||||
 | 
			
		||||
        $entities = $em->getRepository('ChillActivityBundle:ActivityType')->findAll();
 | 
			
		||||
 | 
			
		||||
        return $this->render('ChillActivityBundle:ActivityType:index.html.twig', [
 | 
			
		||||
            'entities' => $entities,
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Displays a form to create a new ActivityType entity.
 | 
			
		||||
     */
 | 
			
		||||
    public function newAction()
 | 
			
		||||
    {
 | 
			
		||||
        $entity = new ActivityType();
 | 
			
		||||
        $form = $this->createCreateForm($entity);
 | 
			
		||||
 | 
			
		||||
        return $this->render('ChillActivityBundle:ActivityType:new.html.twig', [
 | 
			
		||||
            'entity' => $entity,
 | 
			
		||||
            'form' => $form->createView(),
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Finds and displays a ActivityType entity.
 | 
			
		||||
     *
 | 
			
		||||
     * @param mixed $id
 | 
			
		||||
     */
 | 
			
		||||
    public function showAction($id)
 | 
			
		||||
    {
 | 
			
		||||
        $em = $this->getDoctrine()->getManager();
 | 
			
		||||
 | 
			
		||||
        $entity = $em->getRepository('ChillActivityBundle:ActivityType')->find($id);
 | 
			
		||||
 | 
			
		||||
        if (!$entity) {
 | 
			
		||||
            throw $this->createNotFoundException('Unable to find ActivityType entity.');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $this->render('ChillActivityBundle:ActivityType:show.html.twig', [
 | 
			
		||||
            'entity' => $entity,
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Edits an existing ActivityType entity.
 | 
			
		||||
     *
 | 
			
		||||
     * @param mixed $id
 | 
			
		||||
     */
 | 
			
		||||
    public function updateAction(Request $request, $id)
 | 
			
		||||
    {
 | 
			
		||||
        $em = $this->getDoctrine()->getManager();
 | 
			
		||||
 | 
			
		||||
        $entity = $em->getRepository('ChillActivityBundle:ActivityType')->find($id);
 | 
			
		||||
 | 
			
		||||
        if (!$entity) {
 | 
			
		||||
            throw $this->createNotFoundException('Unable to find ActivityType entity.');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $editForm = $this->createEditForm($entity);
 | 
			
		||||
        $editForm->handleRequest($request);
 | 
			
		||||
 | 
			
		||||
        if ($editForm->isValid()) {
 | 
			
		||||
            $em->flush();
 | 
			
		||||
 | 
			
		||||
            return $this->redirect($this->generateUrl('chill_activity_activitytype_edit', ['id' => $id]));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $this->render('ChillActivityBundle:ActivityType:edit.html.twig', [
 | 
			
		||||
            'entity' => $entity,
 | 
			
		||||
            'edit_form' => $editForm->createView(),
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a form to create a ActivityType entity.
 | 
			
		||||
     *
 | 
			
		||||
     * @param ActivityType $entity The entity
 | 
			
		||||
     *
 | 
			
		||||
     * @return \Symfony\Component\Form\Form The form
 | 
			
		||||
     */
 | 
			
		||||
    private function createCreateForm(ActivityType $entity)
 | 
			
		||||
    {
 | 
			
		||||
        $form = $this->createForm(ActivityTypeType::class, $entity, [
 | 
			
		||||
            'action' => $this->generateUrl('chill_activity_activitytype_create'),
 | 
			
		||||
            'method' => 'POST',
 | 
			
		||||
        ]);
 | 
			
		||||
 | 
			
		||||
        $form->add('submit', SubmitType::class, ['label' => 'Create']);
 | 
			
		||||
 | 
			
		||||
        return $form;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a form to edit a ActivityType entity.
 | 
			
		||||
     *
 | 
			
		||||
     * @param ActivityType $entity The entity
 | 
			
		||||
     *
 | 
			
		||||
     * @return \Symfony\Component\Form\Form The form
 | 
			
		||||
     */
 | 
			
		||||
    private function createEditForm(ActivityType $entity)
 | 
			
		||||
    {
 | 
			
		||||
        $form = $this->createForm(ActivityTypeType::class, $entity, [
 | 
			
		||||
            'action' => $this->generateUrl('chill_activity_activitytype_update', ['id' => $entity->getId()]),
 | 
			
		||||
            'method' => 'PUT',
 | 
			
		||||
        ]);
 | 
			
		||||
 | 
			
		||||
        $form->add('submit', SubmitType::class, ['label' => 'Update']);
 | 
			
		||||
 | 
			
		||||
        return $form;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,23 +0,0 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Controller;
 | 
			
		||||
 | 
			
		||||
use Chill\MainBundle\CRUD\Controller\CRUDController;
 | 
			
		||||
use Chill\MainBundle\Pagination\PaginatorInterface;
 | 
			
		||||
use Symfony\Component\HttpFoundation\Request;
 | 
			
		||||
 | 
			
		||||
class AdminActivityPresenceController extends CRUDController
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * @param string $action
 | 
			
		||||
     * @param \Doctrine\ORM\QueryBuilder|mixed $query
 | 
			
		||||
     * @param Request $request
 | 
			
		||||
     * @param PaginatorInterface $paginator
 | 
			
		||||
     * @return \Doctrine\ORM\QueryBuilder|mixed
 | 
			
		||||
     */
 | 
			
		||||
    protected function orderQuery(string $action, $query, Request $request, PaginatorInterface $paginator)
 | 
			
		||||
    {
 | 
			
		||||
        /** @var \Doctrine\ORM\QueryBuilder $query */
 | 
			
		||||
        return $query->orderBy('e.id', 'ASC');
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,23 +0,0 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Controller;
 | 
			
		||||
 | 
			
		||||
use Chill\MainBundle\CRUD\Controller\CRUDController;
 | 
			
		||||
use Chill\MainBundle\Pagination\PaginatorInterface;
 | 
			
		||||
use Symfony\Component\HttpFoundation\Request;
 | 
			
		||||
 | 
			
		||||
class AdminActivityTypeCategoryController extends CRUDController
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * @param string $action
 | 
			
		||||
     * @param \Doctrine\ORM\QueryBuilder|mixed $query
 | 
			
		||||
     * @param Request $request
 | 
			
		||||
     * @param PaginatorInterface $paginator
 | 
			
		||||
     * @return \Doctrine\ORM\QueryBuilder|mixed
 | 
			
		||||
     */
 | 
			
		||||
    protected function orderQuery(string $action, $query, Request $request, PaginatorInterface $paginator)
 | 
			
		||||
    {
 | 
			
		||||
        /** @var \Doctrine\ORM\QueryBuilder $query */
 | 
			
		||||
        return $query->orderBy('e.ordering', 'ASC');
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,23 +0,0 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Controller;
 | 
			
		||||
 | 
			
		||||
use Chill\MainBundle\CRUD\Controller\CRUDController;
 | 
			
		||||
use Chill\MainBundle\Pagination\PaginatorInterface;
 | 
			
		||||
use Symfony\Component\HttpFoundation\Request;
 | 
			
		||||
 | 
			
		||||
class AdminActivityTypeController extends CRUDController
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * @param string $action
 | 
			
		||||
     * @param \Doctrine\ORM\QueryBuilder|mixed $query
 | 
			
		||||
     * @param Request $request
 | 
			
		||||
     * @param PaginatorInterface $paginator
 | 
			
		||||
     * @return \Doctrine\ORM\QueryBuilder|mixed
 | 
			
		||||
     */
 | 
			
		||||
    protected function orderQuery(string $action, $query, Request $request, PaginatorInterface $paginator)
 | 
			
		||||
    {
 | 
			
		||||
        /** @var \Doctrine\ORM\QueryBuilder $query */
 | 
			
		||||
        return $query->orderBy('e.ordering', 'ASC');
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,33 +1,22 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Chill is a software for social workers
 | 
			
		||||
 * Copyright (C) 2015 Champs Libres <info@champs-libres.coop>
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
 * the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Controller;
 | 
			
		||||
 | 
			
		||||
use Symfony\Component\HttpFoundation\Request;
 | 
			
		||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Controller for activity configuration
 | 
			
		||||
 *
 | 
			
		||||
 * @author Julien Fastré <julien.fastre@champs-libres.coop>
 | 
			
		||||
 * @author Champs Libres <info@champs-libres.coop>
 | 
			
		||||
 * Controller for activity configuration.
 | 
			
		||||
 */
 | 
			
		||||
class AdminController extends AbstractController
 | 
			
		||||
{
 | 
			
		||||
@@ -35,7 +24,7 @@ class AdminController extends AbstractController
 | 
			
		||||
    {
 | 
			
		||||
        return $this->render('ChillActivityBundle:Admin:layout_activity.html.twig');
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    public function redirectToAdminIndexAction()
 | 
			
		||||
    {
 | 
			
		||||
        return $this->redirectToRoute('chill_main_admin_central');
 | 
			
		||||
 
 | 
			
		||||
@@ -1,44 +1,33 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Chill is a software for social workers
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2014-2015, Champs Libres Cooperative SCRLFS,
 | 
			
		||||
 * <http://www.champs-libres.coop>, <info@champs-libres.coop>
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as
 | 
			
		||||
 * published by the Free Software Foundation, either version 3 of the
 | 
			
		||||
 * License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\DataFixtures\ORM;
 | 
			
		||||
 | 
			
		||||
use Chill\ActivityBundle\Entity\Activity;
 | 
			
		||||
use Chill\MainBundle\DataFixtures\ORM\LoadScopes;
 | 
			
		||||
use Chill\MainBundle\DataFixtures\ORM\LoadUsers;
 | 
			
		||||
use Doctrine\Common\DataFixtures\AbstractFixture;
 | 
			
		||||
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
 | 
			
		||||
use Doctrine\Persistence\ObjectManager;
 | 
			
		||||
use Faker\Factory as FakerFactory;
 | 
			
		||||
use Chill\ActivityBundle\Entity\Activity;
 | 
			
		||||
use Chill\MainBundle\DataFixtures\ORM\LoadUsers;
 | 
			
		||||
use Chill\ActivityBundle\DataFixtures\ORM\LoadActivityReason;
 | 
			
		||||
use Chill\ActivityBundle\DataFixtures\ORM\LoadActivityType;
 | 
			
		||||
use Chill\MainBundle\DataFixtures\ORM\LoadScopes;
 | 
			
		||||
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
 | 
			
		||||
 | 
			
		||||
use function in_array;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Load reports into DB
 | 
			
		||||
 *
 | 
			
		||||
 * @author Champs-Libres Coop
 | 
			
		||||
 * Load reports into DB.
 | 
			
		||||
 */
 | 
			
		||||
class LoadActivity extends AbstractFixture implements OrderedFixtureInterface, ContainerAwareInterface
 | 
			
		||||
class LoadActivity extends AbstractFixture implements ContainerAwareInterface, OrderedFixtureInterface
 | 
			
		||||
{
 | 
			
		||||
    use \Symfony\Component\DependencyInjection\ContainerAwareTrait;
 | 
			
		||||
 | 
			
		||||
@@ -57,54 +46,22 @@ class LoadActivity extends AbstractFixture implements OrderedFixtureInterface, C
 | 
			
		||||
        return 16400;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Return a random scope
 | 
			
		||||
     *
 | 
			
		||||
     * @return \Chill\MainBundle\Entity\Scope
 | 
			
		||||
     */
 | 
			
		||||
    private function getRandomScope()
 | 
			
		||||
    public function load(ObjectManager $manager)
 | 
			
		||||
    {
 | 
			
		||||
        $scopeRef = LoadScopes::$references[array_rand(LoadScopes::$references)];
 | 
			
		||||
        return $this->getReference($scopeRef);
 | 
			
		||||
    }
 | 
			
		||||
        $persons = $this->container->get('doctrine.orm.entity_manager')
 | 
			
		||||
            ->getRepository('ChillPersonBundle:Person')
 | 
			
		||||
            ->findAll();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Return a random activityType
 | 
			
		||||
     *
 | 
			
		||||
     * @return \Chill\ActivityBundle\Entity\ActivityType
 | 
			
		||||
     */
 | 
			
		||||
    private function getRandomActivityType()
 | 
			
		||||
    {
 | 
			
		||||
        $typeRef = LoadActivityType::$references[array_rand(LoadActivityType::$references)];
 | 
			
		||||
        return $this->getReference($typeRef);
 | 
			
		||||
    }
 | 
			
		||||
        foreach ($persons as $person) {
 | 
			
		||||
            $activityNbr = mt_rand(0, 3);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Return a random activityReason
 | 
			
		||||
     *
 | 
			
		||||
     * @return \Chill\ActivityBundle\Entity\ActivityReason
 | 
			
		||||
     */
 | 
			
		||||
    private function getRandomActivityReason(array $excludingIds)
 | 
			
		||||
    {
 | 
			
		||||
        $reasonRef = LoadActivityReason::$references[array_rand(LoadActivityReason::$references)];
 | 
			
		||||
 | 
			
		||||
        if (in_array($this->getReference($reasonRef)->getId(), $excludingIds)) {
 | 
			
		||||
            // we have a reason which should be excluded. Find another...
 | 
			
		||||
            return $this->getRandomActivityReason($excludingIds);
 | 
			
		||||
            for ($i = 0; $i < $activityNbr; ++$i) {
 | 
			
		||||
                echo 'Creating an activity type for  : ' . $person . "\n";
 | 
			
		||||
                $activity = $this->newRandomActivity($person);
 | 
			
		||||
                $manager->persist($activity);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $this->getReference($reasonRef);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Return a random user
 | 
			
		||||
     *
 | 
			
		||||
     * @return \Chill\MainBundle\Entity\User
 | 
			
		||||
     */
 | 
			
		||||
    private function getRandomUser()
 | 
			
		||||
    {
 | 
			
		||||
        $userRef = array_rand(LoadUsers::$refs);
 | 
			
		||||
        return $this->getReference($userRef);
 | 
			
		||||
        $manager->flush();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function newRandomActivity($person)
 | 
			
		||||
@@ -116,12 +73,11 @@ class LoadActivity extends AbstractFixture implements OrderedFixtureInterface, C
 | 
			
		||||
            ->setDurationTime($this->faker->dateTime(36000))
 | 
			
		||||
            ->setType($this->getRandomActivityType())
 | 
			
		||||
            ->setScope($this->getRandomScope())
 | 
			
		||||
            ;
 | 
			
		||||
            ->setAttendee($this->faker->boolean());
 | 
			
		||||
 | 
			
		||||
        //      ->setAttendee($this->faker->boolean())
 | 
			
		||||
        $usedId = [];
 | 
			
		||||
 | 
			
		||||
        $usedId = array();
 | 
			
		||||
        for ($i = 0; $i < rand(0, 4); $i++) {
 | 
			
		||||
        for ($i = 0; mt_rand(0, 4) > $i; ++$i) {
 | 
			
		||||
            $reason = $this->getRandomActivityReason($usedId);
 | 
			
		||||
            $usedId[] = $reason->getId();
 | 
			
		||||
            $activity->addReason($reason);
 | 
			
		||||
@@ -130,24 +86,56 @@ class LoadActivity extends AbstractFixture implements OrderedFixtureInterface, C
 | 
			
		||||
        return $activity;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function load(ObjectManager $manager)
 | 
			
		||||
    /**
 | 
			
		||||
     * Return a random activityReason.
 | 
			
		||||
     *
 | 
			
		||||
     * @return \Chill\ActivityBundle\Entity\ActivityReason
 | 
			
		||||
     */
 | 
			
		||||
    private function getRandomActivityReason(array $excludingIds)
 | 
			
		||||
    {
 | 
			
		||||
        $persons = $this->container->get('doctrine.orm.entity_manager')
 | 
			
		||||
            ->getRepository('ChillPersonBundle:Person')
 | 
			
		||||
            ->findAll();
 | 
			
		||||
        $reasonRef = LoadActivityReason::$references[array_rand(LoadActivityReason::$references)];
 | 
			
		||||
 | 
			
		||||
        foreach($persons as $person) {
 | 
			
		||||
            $activityNbr = rand(0,3);
 | 
			
		||||
            $ref = 'activity_'.$person->getFullnameCanonical();
 | 
			
		||||
 | 
			
		||||
            for($i = 0; $i < $activityNbr; $i ++) {
 | 
			
		||||
                print "Creating an activity type for  : ".$person." (ref: ".$ref.")  \n";
 | 
			
		||||
                $activity = $this->newRandomActivity($person);
 | 
			
		||||
                $manager->persist($activity);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            $this->setReference($ref, $activity);
 | 
			
		||||
        if (in_array($this->getReference($reasonRef)->getId(), $excludingIds, true)) {
 | 
			
		||||
            // we have a reason which should be excluded. Find another...
 | 
			
		||||
            return $this->getRandomActivityReason($excludingIds);
 | 
			
		||||
        }
 | 
			
		||||
        $manager->flush();
 | 
			
		||||
 | 
			
		||||
        return $this->getReference($reasonRef);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Return a random activityType.
 | 
			
		||||
     *
 | 
			
		||||
     * @return \Chill\ActivityBundle\Entity\ActivityType
 | 
			
		||||
     */
 | 
			
		||||
    private function getRandomActivityType()
 | 
			
		||||
    {
 | 
			
		||||
        $typeRef = LoadActivityType::$references[array_rand(LoadActivityType::$references)];
 | 
			
		||||
 | 
			
		||||
        return $this->getReference($typeRef);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Return a random scope.
 | 
			
		||||
     *
 | 
			
		||||
     * @return \Chill\MainBundle\Entity\Scope
 | 
			
		||||
     */
 | 
			
		||||
    private function getRandomScope()
 | 
			
		||||
    {
 | 
			
		||||
        $scopeRef = LoadScopes::$references[array_rand(LoadScopes::$references)];
 | 
			
		||||
 | 
			
		||||
        return $this->getReference($scopeRef);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Return a random user.
 | 
			
		||||
     *
 | 
			
		||||
     * @return \Chill\MainBundle\Entity\User
 | 
			
		||||
     */
 | 
			
		||||
    private function getRandomUser()
 | 
			
		||||
    {
 | 
			
		||||
        $userRef = array_rand(LoadUsers::$refs);
 | 
			
		||||
 | 
			
		||||
        return $this->getReference($userRef);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,38 +0,0 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\DataFixtures\ORM;
 | 
			
		||||
 | 
			
		||||
use Doctrine\Common\DataFixtures\AbstractFixture;
 | 
			
		||||
use Doctrine\Common\DataFixtures\DependentFixtureInterface;
 | 
			
		||||
use Chill\ActivityBundle\Entity\Activity;
 | 
			
		||||
use Chill\MainBundle\DataFixtures\ORM\LoadAbstractNotificationsTrait;
 | 
			
		||||
use Chill\ActivityBundle\DataFixtures\ORM\LoadActivity;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Load notififications into database
 | 
			
		||||
 */
 | 
			
		||||
class LoadActivityNotifications extends AbstractFixture implements DependentFixtureInterface
 | 
			
		||||
{
 | 
			
		||||
    use LoadAbstractNotificationsTrait;
 | 
			
		||||
 | 
			
		||||
    public $notifs = [
 | 
			
		||||
        [
 | 
			
		||||
            'message' => 'Hello !',
 | 
			
		||||
            'entityClass' => Activity::class,
 | 
			
		||||
            'entityRef' => 'activity_gerard depardieu',
 | 
			
		||||
            'sender' => 'center a_social',
 | 
			
		||||
            'addressees' => [
 | 
			
		||||
                'center a_administrative',
 | 
			
		||||
                'center a_direction',
 | 
			
		||||
                'multi_center'
 | 
			
		||||
            ],
 | 
			
		||||
        ]
 | 
			
		||||
    ];
 | 
			
		||||
 | 
			
		||||
    public function getDependencies()
 | 
			
		||||
    {
 | 
			
		||||
        return [
 | 
			
		||||
            LoadActivity::class,
 | 
			
		||||
        ];
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,81 +1,70 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Chill is a software for social workers
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (C) 2014-2015, Champs Libres Cooperative SCRLFS, 
 | 
			
		||||
 * <http://www.champs-libres.coop>, <info@champs-libres.coop>
 | 
			
		||||
 * 
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as
 | 
			
		||||
 * published by the Free Software Foundation, either version 3 of the
 | 
			
		||||
 * License, or (at your option) any later version.
 | 
			
		||||
 * 
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 * 
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\DataFixtures\ORM;
 | 
			
		||||
 | 
			
		||||
use Chill\ActivityBundle\Entity\ActivityReason;
 | 
			
		||||
use Doctrine\Common\DataFixtures\AbstractFixture;
 | 
			
		||||
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
 | 
			
		||||
use Doctrine\Persistence\ObjectManager;
 | 
			
		||||
use Chill\ActivityBundle\Entity\ActivityReason;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Description of LoadActivityReason
 | 
			
		||||
 *
 | 
			
		||||
 * @author Champs-Libres Coop
 | 
			
		||||
 * Description of LoadActivityReason.
 | 
			
		||||
 */
 | 
			
		||||
class LoadActivityReason extends AbstractFixture implements OrderedFixtureInterface
 | 
			
		||||
{
 | 
			
		||||
    public static $references = [];
 | 
			
		||||
 | 
			
		||||
    public function getOrder()
 | 
			
		||||
    {
 | 
			
		||||
        return 16300;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public static $references = array();
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    public function load(ObjectManager $manager)
 | 
			
		||||
    {
 | 
			
		||||
        $reasons = [
 | 
			
		||||
            [
 | 
			
		||||
                'name' => ['fr' => 'Recherche logement', 'en' => 'Housing research', 'nl' => 'Woning zoektoch'],
 | 
			
		||||
                'category' => 'cat_Housing'],
 | 
			
		||||
                'category' => 'cat_Housing', ],
 | 
			
		||||
            [
 | 
			
		||||
                'name' => ['fr' => 'Problème avec propriétaire', 'en' => 'Landlord problems', 'nl' => 'Huisbaas problemen'],
 | 
			
		||||
                'category' => 'cat_Housing'],
 | 
			
		||||
                'category' => 'cat_Housing', ],
 | 
			
		||||
            [
 | 
			
		||||
                'name' => ['fr' => 'Retard de payement', 'en' => 'Payement problems', 'nl' => 'Betalings vertragingen'],
 | 
			
		||||
                'category' => 'cat_Housing'],
 | 
			
		||||
                'category' => 'cat_Housing', ],
 | 
			
		||||
            [
 | 
			
		||||
                'name' => ['fr' => 'Explication législation', 'en' => 'Legislation explanation', 'nl' => 'Legislative uitleg'],
 | 
			
		||||
                'category' => 'cat_Unemployment procedure'],
 | 
			
		||||
                'category' => 'cat_Unemployment procedure', ],
 | 
			
		||||
            [
 | 
			
		||||
                'name' => ['fr' => 'Coaching entretien d\'activation', 'en' => 'Interview coaching', 'nl' => 'Interview coaching'],
 | 
			
		||||
                'category' => 'cat_Unemployment procedure'],
 | 
			
		||||
                'category' => 'cat_Unemployment procedure', ],
 | 
			
		||||
            [
 | 
			
		||||
                'name' => ['fr' => 'Récupération des allocations', 'en' => 'Allowance recovery', 'nl' => 'Terugwinning van de uitkeringen'],
 | 
			
		||||
                'category' => 'cat_Unemployment procedure']
 | 
			
		||||
                'category' => 'cat_Unemployment procedure', ],
 | 
			
		||||
        ];
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        foreach ($reasons as $r) {
 | 
			
		||||
            print "Creating activity reason : " . $r['name']['en'] . "\n";
 | 
			
		||||
            echo 'Creating activity reason : ' . $r['name']['en'] . "\n";
 | 
			
		||||
            $activityReason = (new ActivityReason())
 | 
			
		||||
                ->setName(($r['name']))
 | 
			
		||||
                ->setActive(true)
 | 
			
		||||
                ->setCategory($this->getReference($r['category']));
 | 
			
		||||
            $manager->persist($activityReason);
 | 
			
		||||
            $reference = 'activity_reason_'.$r['name']['en'];
 | 
			
		||||
            $reference = 'activity_reason_' . $r['name']['en'];
 | 
			
		||||
            $this->addReference($reference, $activityReason);
 | 
			
		||||
            static::$references[] = $reference;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        $manager->flush();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,35 +1,25 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Chill is a software for social workers
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (C) 2014-2015, Champs Libres Cooperative SCRLFS, 
 | 
			
		||||
 * <http://www.champs-libres.coop>, <info@champs-libres.coop>
 | 
			
		||||
 * 
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as
 | 
			
		||||
 * published by the Free Software Foundation, either version 3 of the
 | 
			
		||||
 * License, or (at your option) any later version.
 | 
			
		||||
 * 
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 * 
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\DataFixtures\ORM;
 | 
			
		||||
 | 
			
		||||
use Chill\ActivityBundle\Entity\ActivityReasonCategory;
 | 
			
		||||
use Doctrine\Common\DataFixtures\AbstractFixture;
 | 
			
		||||
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
 | 
			
		||||
use Doctrine\Persistence\ObjectManager;
 | 
			
		||||
use Chill\ActivityBundle\Entity\ActivityReasonCategory;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Description of LoadActivityReasonCategory
 | 
			
		||||
 *
 | 
			
		||||
 * @author Champs-Libres Coop
 | 
			
		||||
 * Description of LoadActivityReasonCategory.
 | 
			
		||||
 */
 | 
			
		||||
class LoadActivityReasonCategory extends AbstractFixture implements OrderedFixtureInterface
 | 
			
		||||
{
 | 
			
		||||
@@ -37,27 +27,26 @@ class LoadActivityReasonCategory extends AbstractFixture implements OrderedFixtu
 | 
			
		||||
    {
 | 
			
		||||
        return 16200;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    public function load(ObjectManager $manager)
 | 
			
		||||
    {
 | 
			
		||||
        $categs = [
 | 
			
		||||
            ['name' =>
 | 
			
		||||
                ['fr' => 'Logement', 'en' => 'Housing', 'nl' => 'Woning']],
 | 
			
		||||
            ['name' =>
 | 
			
		||||
                ['fr' => 'Démarches chômage', 'en' => 'Unemployment procedure', 'nl' => 'Werkloosheid werkwijze']],
 | 
			
		||||
            ['name' => ['fr' => 'Logement', 'en' => 'Housing', 'nl' => 'Woning']],
 | 
			
		||||
            ['name' => ['fr' => 'Démarches chômage', 'en' => 'Unemployment procedure', 'nl' => 'Werkloosheid werkwijze']],
 | 
			
		||||
        ];
 | 
			
		||||
            
 | 
			
		||||
 | 
			
		||||
        foreach ($categs as $c) {
 | 
			
		||||
            print "Creating activity reason category : " . $c['name']['en'] . "\n";
 | 
			
		||||
            echo 'Creating activity reason category : ' . $c['name']['en'] . "\n";
 | 
			
		||||
            $activityReasonCategory = (new ActivityReasonCategory())
 | 
			
		||||
                ->setName(($c['name']))
 | 
			
		||||
                ->setActive(true);
 | 
			
		||||
            $manager->persist($activityReasonCategory);
 | 
			
		||||
            $this->addReference(
 | 
			
		||||
              'cat_'.$c['name']['en'],
 | 
			
		||||
              $activityReasonCategory);
 | 
			
		||||
                'cat_' . $c['name']['en'],
 | 
			
		||||
                $activityReasonCategory
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        $manager->flush();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,86 +1,49 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Chill is a software for social workers
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2014-2015, Champs Libres Cooperative SCRLFS,
 | 
			
		||||
 * <http://www.champs-libres.coop>, <info@champs-libres.coop>
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as
 | 
			
		||||
 * published by the Free Software Foundation, either version 3 of the
 | 
			
		||||
 * License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\DataFixtures\ORM;
 | 
			
		||||
 | 
			
		||||
use Doctrine\Bundle\FixturesBundle\Fixture;
 | 
			
		||||
use Chill\ActivityBundle\Entity\ActivityType;
 | 
			
		||||
use Doctrine\Common\DataFixtures\AbstractFixture;
 | 
			
		||||
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
 | 
			
		||||
use Doctrine\Persistence\ObjectManager;
 | 
			
		||||
use Chill\ActivityBundle\Entity\ActivityType;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Description of LoadActivityType
 | 
			
		||||
 *
 | 
			
		||||
 * @author Champs-Libres Coop
 | 
			
		||||
 * Description of LoadActivityType.
 | 
			
		||||
 */
 | 
			
		||||
class LoadActivityType extends Fixture implements OrderedFixtureInterface
 | 
			
		||||
class LoadActivityType extends AbstractFixture implements OrderedFixtureInterface
 | 
			
		||||
{
 | 
			
		||||
    public static $references = [];
 | 
			
		||||
 | 
			
		||||
    public function getOrder()
 | 
			
		||||
    {
 | 
			
		||||
        return 16100;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static $references = array();
 | 
			
		||||
 | 
			
		||||
    public function load(ObjectManager $manager)
 | 
			
		||||
    {
 | 
			
		||||
        $types = [
 | 
			
		||||
            # Exange
 | 
			
		||||
            [
 | 
			
		||||
                'name' =>
 | 
			
		||||
                    ['fr' => 'Entretien physique avec l\'usager'],
 | 
			
		||||
                'category' => 'exchange' ],
 | 
			
		||||
            [
 | 
			
		||||
                'name' =>
 | 
			
		||||
                    ['fr' => 'Appel téléphonique', 'en' => 'Telephone call', 'nl' => 'Telefoon appel'],
 | 
			
		||||
                'category' => 'exchange' ],
 | 
			
		||||
            [
 | 
			
		||||
                'name' =>
 | 
			
		||||
                    ['fr' => 'Courriel', 'en' => 'Email', 'nl' => 'Email'],
 | 
			
		||||
                'category' => 'exchange' ],
 | 
			
		||||
            # Meeting
 | 
			
		||||
            [
 | 
			
		||||
                'name' =>
 | 
			
		||||
                    ['fr' => 'Point technique encadrant'],
 | 
			
		||||
                'category' => 'meeting' ],
 | 
			
		||||
            [
 | 
			
		||||
                'name' =>
 | 
			
		||||
                    ['fr' => 'Réunion avec des partenaires'],
 | 
			
		||||
                'category' => 'meeting' ],
 | 
			
		||||
            [
 | 
			
		||||
                'name' =>
 | 
			
		||||
                    ['fr' => 'Commission pluridisciplinaire et pluri-institutionnelle'],
 | 
			
		||||
                'category' => 'meeting' ],
 | 
			
		||||
            ['name' => ['fr' => 'Appel téléphonique', 'en' => 'Telephone call', 'nl' => 'Telefoon appel']],
 | 
			
		||||
            ['name' => ['fr' => 'Entretien', 'en' => 'Interview', 'nl' => 'Vraaggesprek']],
 | 
			
		||||
            ['name' => ['fr' => 'Inspection', 'en' => 'Inspection', 'nl' => 'Inspectie']],
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        foreach ($types as $t) {
 | 
			
		||||
            print "Creating activity type : " . $t['name']['fr'] . " (cat:". $t['category']  . " \n";
 | 
			
		||||
            echo 'Creating activity type : ' . $t['name']['en'] . "\n";
 | 
			
		||||
            $activityType = (new ActivityType())
 | 
			
		||||
                ->setName(($t['name']))
 | 
			
		||||
                ->setCategory($this->getReference('activity_type_cat_'.$t['category']))
 | 
			
		||||
                ->setSocialIssuesVisible(1)
 | 
			
		||||
                ->setSocialActionsVisible(1);
 | 
			
		||||
                ->setName(($t['name']));
 | 
			
		||||
            $manager->persist($activityType);
 | 
			
		||||
            $reference = 'activity_type_'.$t['name']['fr'];
 | 
			
		||||
            $reference = 'activity_type_' . $t['name']['en'];
 | 
			
		||||
            $this->addReference($reference, $activityType);
 | 
			
		||||
            static::$references[] = $reference;
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,72 +0,0 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Chill is a software for social workers
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2014-2021, Champs Libres Cooperative SCRLFS,
 | 
			
		||||
 * <http://www.champs-libres.coop>, <info@champs-libres.coop>
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as
 | 
			
		||||
 * published by the Free Software Foundation, either version 3 of the
 | 
			
		||||
 * License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\DataFixtures\ORM;
 | 
			
		||||
 | 
			
		||||
use Doctrine\Bundle\FixturesBundle\Fixture;
 | 
			
		||||
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
 | 
			
		||||
use Doctrine\Persistence\ObjectManager;
 | 
			
		||||
use Chill\ActivityBundle\Entity\ActivityTypeCategory;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Fixtures for ActivityTypeCategory
 | 
			
		||||
 *
 | 
			
		||||
 * @author Champs-Libres Coop
 | 
			
		||||
 */
 | 
			
		||||
class LoadActivityTypeCategory extends Fixture implements OrderedFixtureInterface
 | 
			
		||||
{
 | 
			
		||||
    public static $references = array();
 | 
			
		||||
 | 
			
		||||
    public function getOrder()
 | 
			
		||||
    {
 | 
			
		||||
        return 16050;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function load(ObjectManager $manager)
 | 
			
		||||
    {
 | 
			
		||||
        $categories = [
 | 
			
		||||
            [
 | 
			
		||||
                'name' => ['fr' => 'Échange avec usager', 'en' => 'Exchange with user'],
 | 
			
		||||
                'ref' => 'exchange',
 | 
			
		||||
            ],
 | 
			
		||||
            [
 | 
			
		||||
                'name' => ['fr' => 'Réunion', 'en' => 'Meeting'],
 | 
			
		||||
                'ref' => 'meeting',
 | 
			
		||||
            ],
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        foreach ($categories as $cat) {
 | 
			
		||||
            print "Creating activity type category : " . $cat['ref'] . "\n";
 | 
			
		||||
 | 
			
		||||
            $newCat = (new ActivityTypeCategory())
 | 
			
		||||
                ->setName(($cat['name']));
 | 
			
		||||
 | 
			
		||||
            $manager->persist($newCat);
 | 
			
		||||
            $reference = 'activity_type_cat_'.$cat['ref'];
 | 
			
		||||
 | 
			
		||||
            $this->addReference($reference, $newCat);
 | 
			
		||||
            static::$references[] = $reference;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $manager->flush();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,38 +1,28 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2015 Julien Fastré <julien.fastre@champs-libres.coop>
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
 * the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\DataFixtures\ORM;
 | 
			
		||||
 | 
			
		||||
use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter;
 | 
			
		||||
use Chill\MainBundle\DataFixtures\ORM\LoadPermissionsGroup;
 | 
			
		||||
use Chill\MainBundle\DataFixtures\ORM\LoadScopes;
 | 
			
		||||
use Chill\MainBundle\Entity\RoleScope;
 | 
			
		||||
use Doctrine\Common\DataFixtures\AbstractFixture;
 | 
			
		||||
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
 | 
			
		||||
use Doctrine\Persistence\ObjectManager;
 | 
			
		||||
use Chill\MainBundle\DataFixtures\ORM\LoadPermissionsGroup;
 | 
			
		||||
use Chill\MainBundle\Entity\RoleScope;
 | 
			
		||||
use Chill\MainBundle\DataFixtures\ORM\LoadScopes;
 | 
			
		||||
use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Add a role CHILL_ACTIVITY_UPDATE & CHILL_ACTIVITY_CREATE for all groups except administrative,
 | 
			
		||||
 * and a role CHILL_ACTIVITY_SEE for administrative
 | 
			
		||||
 *
 | 
			
		||||
 * @author Julien Fastré <julien.fastre@champs-libres.coop>
 | 
			
		||||
 */
 | 
			
		||||
use function in_array;
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
class LoadActivitytACL extends AbstractFixture implements OrderedFixtureInterface
 | 
			
		||||
{
 | 
			
		||||
    public function getOrder()
 | 
			
		||||
@@ -40,12 +30,12 @@ class LoadActivitytACL extends AbstractFixture implements OrderedFixtureInterfac
 | 
			
		||||
        return 16000;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
    public function load(ObjectManager $manager)
 | 
			
		||||
    {
 | 
			
		||||
        foreach (LoadPermissionsGroup::$refs as $permissionsGroupRef) {
 | 
			
		||||
            $permissionsGroup = $this->getReference($permissionsGroupRef);
 | 
			
		||||
            foreach (LoadScopes::$references as $scopeRef){
 | 
			
		||||
 | 
			
		||||
            foreach (LoadScopes::$references as $scopeRef) {
 | 
			
		||||
                $scope = $this->getReference($scopeRef);
 | 
			
		||||
                //create permission group
 | 
			
		||||
                switch ($permissionsGroup->getName()) {
 | 
			
		||||
@@ -53,47 +43,48 @@ class LoadActivitytACL extends AbstractFixture implements OrderedFixtureInterfac
 | 
			
		||||
                        if ($scope->getName()['en'] === 'administrative') {
 | 
			
		||||
                            break 2; // we do not want any power on administrative
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        break;
 | 
			
		||||
                    case 'administrative':
 | 
			
		||||
                    case 'direction':
 | 
			
		||||
                        if (in_array($scope->getName()['en'], array('administrative', 'social'))) {
 | 
			
		||||
                        if (in_array($scope->getName()['en'], ['administrative', 'social'], true)) {
 | 
			
		||||
                            break 2; // we do not want any power on social or administrative
 | 
			
		||||
                        }  
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        break;
 | 
			
		||||
                }
 | 
			
		||||
                
 | 
			
		||||
                printf("Adding CHILL_ACTIVITY_UPDATE & CHILL_ACTIVITY_CREATE & CHILL_ACTIVITY_DELETE, and stats and list permissions to %s "
 | 
			
		||||
                        . "permission group, scope '%s' \n", 
 | 
			
		||||
                        $permissionsGroup->getName(), $scope->getName()['en']);
 | 
			
		||||
 | 
			
		||||
                printf(
 | 
			
		||||
                    'Adding CHILL_ACTIVITY_UPDATE & CHILL_ACTIVITY_CREATE & CHILL_ACTIVITY_DELETE, and stats and list permissions to %s '
 | 
			
		||||
                        . "permission group, scope '%s' \n",
 | 
			
		||||
                    $permissionsGroup->getName(),
 | 
			
		||||
                    $scope->getName()['en']
 | 
			
		||||
                );
 | 
			
		||||
                $roleScopeUpdate = (new RoleScope())
 | 
			
		||||
                            ->setRole('CHILL_ACTIVITY_UPDATE')
 | 
			
		||||
                            ->setScope($scope);
 | 
			
		||||
                    ->setRole('CHILL_ACTIVITY_UPDATE')
 | 
			
		||||
                    ->setScope($scope);
 | 
			
		||||
                $permissionsGroup->addRoleScope($roleScopeUpdate);
 | 
			
		||||
                $roleScopeCreate = (new RoleScope())
 | 
			
		||||
                            ->setRole('CHILL_ACTIVITY_CREATE')
 | 
			
		||||
                            ->setScope($scope);
 | 
			
		||||
                    ->setRole('CHILL_ACTIVITY_CREATE')
 | 
			
		||||
                    ->setScope($scope);
 | 
			
		||||
                $permissionsGroup->addRoleScope($roleScopeCreate);
 | 
			
		||||
                $roleScopeDelete = (new RoleScope())
 | 
			
		||||
                            ->setRole('CHILL_ACTIVITY_DELETE')
 | 
			
		||||
                            ->setScope($scope);
 | 
			
		||||
                    ->setRole('CHILL_ACTIVITY_DELETE')
 | 
			
		||||
                    ->setScope($scope);
 | 
			
		||||
                $permissionsGroup->addRoleScope($roleScopeDelete);
 | 
			
		||||
                $roleScopeList = (new RoleScope())
 | 
			
		||||
                            ->setRole(ActivityStatsVoter::LISTS)
 | 
			
		||||
                            ;
 | 
			
		||||
                    ->setRole(ActivityStatsVoter::LISTS);
 | 
			
		||||
                $permissionsGroup->addRoleScope($roleScopeList);
 | 
			
		||||
                $roleScopeStat = (new RoleScope())
 | 
			
		||||
                            ->setRole(ActivityStatsVoter::STATS)
 | 
			
		||||
                            ;
 | 
			
		||||
                    ->setRole(ActivityStatsVoter::STATS);
 | 
			
		||||
                $permissionsGroup->addRoleScope($roleScopeStat);
 | 
			
		||||
                
 | 
			
		||||
 | 
			
		||||
                $manager->persist($roleScopeUpdate);
 | 
			
		||||
                $manager->persist($roleScopeCreate);
 | 
			
		||||
                $manager->persist($roleScopeDelete);
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        $manager->flush();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,37 +1,27 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Chill is a software for social workers
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2014-2015, Champs Libres Cooperative SCRLFS,
 | 
			
		||||
 * <http://www.champs-libres.coop>, <info@champs-libres.coop>
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as
 | 
			
		||||
 * published by the Free Software Foundation, either version 3 of the
 | 
			
		||||
 * License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\DependencyInjection;
 | 
			
		||||
 | 
			
		||||
use Symfony\Component\DependencyInjection\ContainerBuilder;
 | 
			
		||||
use Symfony\Component\Config\FileLocator;
 | 
			
		||||
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
 | 
			
		||||
use Symfony\Component\DependencyInjection\Loader;
 | 
			
		||||
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
 | 
			
		||||
use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter;
 | 
			
		||||
use Chill\ActivityBundle\Security\Authorization\ActivityVoter;
 | 
			
		||||
use Symfony\Component\Config\FileLocator;
 | 
			
		||||
use Symfony\Component\DependencyInjection\ContainerBuilder;
 | 
			
		||||
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
 | 
			
		||||
use Symfony\Component\DependencyInjection\Loader;
 | 
			
		||||
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This is the class that loads and manages your bundle configuration
 | 
			
		||||
 * This is the class that loads and manages your bundle configuration.
 | 
			
		||||
 *
 | 
			
		||||
 * To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html}
 | 
			
		||||
 */
 | 
			
		||||
@@ -47,11 +37,12 @@ class ChillActivityExtension extends Extension implements PrependExtensionInterf
 | 
			
		||||
 | 
			
		||||
        $container->setParameter('chill_activity.form.time_duration', $config['form']['time_duration']);
 | 
			
		||||
 | 
			
		||||
        $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../config'));
 | 
			
		||||
        $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__ . '/../config'));
 | 
			
		||||
        $loader->load('services.yaml');
 | 
			
		||||
        $loader->load('services/export.yaml');
 | 
			
		||||
        $loader->load('services/repositories.yaml');
 | 
			
		||||
        $loader->load('services/fixtures.yaml');
 | 
			
		||||
        $loader->load('services/menu.yaml');
 | 
			
		||||
        $loader->load('services/controller.yaml');
 | 
			
		||||
        $loader->load('services/form.yaml');
 | 
			
		||||
        $loader->load('services/templating.yaml');
 | 
			
		||||
@@ -61,104 +52,32 @@ class ChillActivityExtension extends Extension implements PrependExtensionInterf
 | 
			
		||||
    {
 | 
			
		||||
        $this->prependRoutes($container);
 | 
			
		||||
        $this->prependAuthorization($container);
 | 
			
		||||
        $this->prependCruds($container);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* (non-PHPdoc)
 | 
			
		||||
    public function prependAuthorization(ContainerBuilder $container)
 | 
			
		||||
    {
 | 
			
		||||
        $container->prependExtensionConfig('security', [
 | 
			
		||||
            'role_hierarchy' => [
 | 
			
		||||
                ActivityVoter::UPDATE => [ActivityVoter::SEE_DETAILS],
 | 
			
		||||
                ActivityVoter::CREATE => [ActivityVoter::SEE_DETAILS],
 | 
			
		||||
                ActivityVoter::DELETE => [ActivityVoter::SEE_DETAILS],
 | 
			
		||||
                ActivityVoter::SEE_DETAILS => [ActivityVoter::SEE],
 | 
			
		||||
            ],
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** (non-PHPdoc).
 | 
			
		||||
     * @see \Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface::prepend()
 | 
			
		||||
     */
 | 
			
		||||
    public function prependRoutes(ContainerBuilder $container)
 | 
			
		||||
    {
 | 
			
		||||
        //add routes for custom bundle
 | 
			
		||||
         $container->prependExtensionConfig('chill_main', array(
 | 
			
		||||
           'routing' => array(
 | 
			
		||||
              'resources' => array(
 | 
			
		||||
                 '@ChillActivityBundle/config/routes.yaml'
 | 
			
		||||
              )
 | 
			
		||||
           )
 | 
			
		||||
        ));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function prependAuthorization(ContainerBuilder $container)
 | 
			
		||||
    {
 | 
			
		||||
        $container->prependExtensionConfig('security', array(
 | 
			
		||||
           'role_hierarchy' => array(
 | 
			
		||||
              ActivityVoter::UPDATE => array(ActivityVoter::SEE_DETAILS),
 | 
			
		||||
              ActivityVoter::CREATE => array(ActivityVoter::SEE_DETAILS),
 | 
			
		||||
              ActivityVoter::DELETE => array(ActivityVoter::SEE_DETAILS),
 | 
			
		||||
              ActivityVoter::SEE_DETAILS => array(ActivityVoter::SEE)
 | 
			
		||||
           )
 | 
			
		||||
        ));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected function prependCruds(ContainerBuilder $container)
 | 
			
		||||
    {
 | 
			
		||||
        $container->prependExtensionConfig('chill_main', [
 | 
			
		||||
            'cruds' => [
 | 
			
		||||
                [
 | 
			
		||||
                    'class' => \Chill\ActivityBundle\Entity\ActivityType::class,
 | 
			
		||||
                    'name' => 'activity_type',
 | 
			
		||||
                    'base_path' => '/admin/activity/type',
 | 
			
		||||
                    'form_class' => \Chill\ActivityBundle\Form\ActivityTypeType::class,
 | 
			
		||||
                    'controller' => \Chill\ActivityBundle\Controller\AdminActivityTypeController::class,
 | 
			
		||||
                    'actions' => [
 | 
			
		||||
                        'index' => [
 | 
			
		||||
                            'template' => '@ChillActivity/ActivityType/index.html.twig',
 | 
			
		||||
                            'role' => 'ROLE_ADMIN'
 | 
			
		||||
                        ],
 | 
			
		||||
                        'new'   => [
 | 
			
		||||
                            'role' => 'ROLE_ADMIN',
 | 
			
		||||
                            'template' => '@ChillActivity/ActivityType/new.html.twig',
 | 
			
		||||
                        ],
 | 
			
		||||
                        'edit'  => [
 | 
			
		||||
                            'role' => 'ROLE_ADMIN',
 | 
			
		||||
                            'template' => '@ChillActivity/ActivityType/edit.html.twig',
 | 
			
		||||
                        ]
 | 
			
		||||
                    ]
 | 
			
		||||
            'routing' => [
 | 
			
		||||
                'resources' => [
 | 
			
		||||
                    '@ChillActivityBundle/config/routes.yaml',
 | 
			
		||||
                ],
 | 
			
		||||
                [
 | 
			
		||||
                    'class' => \Chill\ActivityBundle\Entity\ActivityTypeCategory::class,
 | 
			
		||||
                    'name' => 'activity_type_category',
 | 
			
		||||
                    'base_path' => '/admin/activity/type_category',
 | 
			
		||||
                    'form_class' => \Chill\ActivityBundle\Form\ActivityTypeCategoryType::class,
 | 
			
		||||
                    'controller' => \Chill\ActivityBundle\Controller\AdminActivityTypeCategoryController::class,
 | 
			
		||||
                    'actions' => [
 | 
			
		||||
                        'index' => [
 | 
			
		||||
                            'template' => '@ChillActivity/ActivityTypeCategory/index.html.twig',
 | 
			
		||||
                            'role' => 'ROLE_ADMIN'
 | 
			
		||||
                        ],
 | 
			
		||||
                        'new'   => [
 | 
			
		||||
                            'role' => 'ROLE_ADMIN',
 | 
			
		||||
                            'template' => '@ChillActivity/ActivityTypeCategory/new.html.twig',
 | 
			
		||||
                        ],
 | 
			
		||||
                        'edit'  => [
 | 
			
		||||
                            'role' => 'ROLE_ADMIN',
 | 
			
		||||
                            'template' => '@ChillActivity/ActivityTypeCategory/edit.html.twig',
 | 
			
		||||
                        ]
 | 
			
		||||
                    ]
 | 
			
		||||
                ],
 | 
			
		||||
                [
 | 
			
		||||
                    'class' => \Chill\ActivityBundle\Entity\ActivityPresence::class,
 | 
			
		||||
                    'name' => 'activity_presence',
 | 
			
		||||
                    'base_path' => '/admin/activity/presence',
 | 
			
		||||
                    'form_class' => \Chill\ActivityBundle\Form\ActivityPresenceType::class,
 | 
			
		||||
                    'controller' => \Chill\ActivityBundle\Controller\AdminActivityPresenceController::class,
 | 
			
		||||
                    'actions' => [
 | 
			
		||||
                        'index' => [
 | 
			
		||||
                            'template' => '@ChillActivity/ActivityPresence/index.html.twig',
 | 
			
		||||
                            'role' => 'ROLE_ADMIN'
 | 
			
		||||
                        ],
 | 
			
		||||
                        'new'   => [
 | 
			
		||||
                            'role' => 'ROLE_ADMIN',
 | 
			
		||||
                            'template' => '@ChillActivity/ActivityPresence/new.html.twig',
 | 
			
		||||
                        ],
 | 
			
		||||
                        'edit'  => [
 | 
			
		||||
                            'role' => 'ROLE_ADMIN',
 | 
			
		||||
                            'template' => '@ChillActivity/ActivityPresence/edit.html.twig',
 | 
			
		||||
                        ]
 | 
			
		||||
                    ]
 | 
			
		||||
                ],
 | 
			
		||||
            ]
 | 
			
		||||
            ],
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,25 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\DependencyInjection;
 | 
			
		||||
 | 
			
		||||
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
 | 
			
		||||
use Symfony\Component\Config\Definition\ConfigurationInterface;
 | 
			
		||||
 | 
			
		||||
use function is_int;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This is the class that validates and merges configuration from your app/config files
 | 
			
		||||
 * This is the class that validates and merges configuration from your app/config files.
 | 
			
		||||
 *
 | 
			
		||||
 * To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html#cookbook-bundles-extension-config-class}
 | 
			
		||||
 */
 | 
			
		||||
@@ -19,53 +32,51 @@ class Configuration implements ConfigurationInterface
 | 
			
		||||
    {
 | 
			
		||||
        $treeBuilder = new TreeBuilder('chill_activity');
 | 
			
		||||
        $rootNode = $treeBuilder->getRootNode('chill_activity');
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        $rootNode
 | 
			
		||||
                ->children()
 | 
			
		||||
                    ->arrayNode('form')
 | 
			
		||||
                        ->canBeEnabled()
 | 
			
		||||
                        ->children()
 | 
			
		||||
                            ->arrayNode('time_duration')
 | 
			
		||||
                            ->isRequired()
 | 
			
		||||
                            ->requiresAtLeastOneElement()
 | 
			
		||||
                            ->defaultValue(
 | 
			
		||||
                                    array(
 | 
			
		||||
                                        [ 'label' => '5 minutes',  'seconds' => 300], 
 | 
			
		||||
                                        [ 'label' => '10 minutes', 'seconds' => 600],
 | 
			
		||||
                                        [ 'label' => '15 minutes', 'seconds' => 900],
 | 
			
		||||
                                        [ 'label' => '20 minutes', 'seconds' => 1200],
 | 
			
		||||
                                        [ 'label' => '25 minutes', 'seconds' => 1500],
 | 
			
		||||
                                        [ 'label' => '30 minutes', 'seconds' => 1800],
 | 
			
		||||
                                        [ 'label' => '45 minutes', 'seconds' => 2700],
 | 
			
		||||
                                        [ 'label' => '1 hour',     'seconds' => 3600],
 | 
			
		||||
                                        [ 'label' => '1 hour 15',  'seconds' => 4500],
 | 
			
		||||
                                        [ 'label' => '1 hour 30',  'seconds' => 5400],
 | 
			
		||||
                                        [ 'label' => '1 hour 45',  'seconds' => 6300],
 | 
			
		||||
                                        [ 'label' => '2 hours',    'seconds' => 7200],
 | 
			
		||||
                                        )
 | 
			
		||||
                                    )
 | 
			
		||||
                            ->info('The intervals of time to show in activity form')
 | 
			
		||||
 | 
			
		||||
                            ->prototype('array')
 | 
			
		||||
                                ->children()
 | 
			
		||||
                                    ->scalarNode('seconds')
 | 
			
		||||
                                        ->info("The number of seconds of this duration. Must be an integer.")
 | 
			
		||||
                                        ->cannotBeEmpty()
 | 
			
		||||
                                        ->validate()
 | 
			
		||||
                                            ->ifTrue(function($data) {
 | 
			
		||||
                                                return !is_int($data);
 | 
			
		||||
                                            })->thenInvalid("The value %s is not a valid integer")
 | 
			
		||||
                                        ->end()
 | 
			
		||||
                                    ->end()
 | 
			
		||||
                                    ->scalarNode('label')
 | 
			
		||||
                                        ->cannotBeEmpty()
 | 
			
		||||
                                        ->info("The label to show into fields")
 | 
			
		||||
                                    ->end()
 | 
			
		||||
                                ->end()
 | 
			
		||||
 | 
			
		||||
                            ->end()
 | 
			
		||||
            ->children()
 | 
			
		||||
            ->arrayNode('form')
 | 
			
		||||
            ->canBeEnabled()
 | 
			
		||||
            ->children()
 | 
			
		||||
            ->arrayNode('time_duration')
 | 
			
		||||
            ->isRequired()
 | 
			
		||||
            ->requiresAtLeastOneElement()
 | 
			
		||||
            ->defaultValue(
 | 
			
		||||
                [
 | 
			
		||||
                    ['label' => '5 minutes',  'seconds' => 300],
 | 
			
		||||
                    ['label' => '10 minutes', 'seconds' => 600],
 | 
			
		||||
                    ['label' => '15 minutes', 'seconds' => 900],
 | 
			
		||||
                    ['label' => '20 minutes', 'seconds' => 1200],
 | 
			
		||||
                    ['label' => '25 minutes', 'seconds' => 1500],
 | 
			
		||||
                    ['label' => '30 minutes', 'seconds' => 1800],
 | 
			
		||||
                    ['label' => '45 minutes', 'seconds' => 2700],
 | 
			
		||||
                    ['label' => '1 hour',     'seconds' => 3600],
 | 
			
		||||
                    ['label' => '1 hour 15',  'seconds' => 4500],
 | 
			
		||||
                    ['label' => '1 hour 30',  'seconds' => 5400],
 | 
			
		||||
                    ['label' => '1 hour 45',  'seconds' => 6300],
 | 
			
		||||
                    ['label' => '2 hours',    'seconds' => 7200],
 | 
			
		||||
                ]
 | 
			
		||||
            )
 | 
			
		||||
            ->info('The intervals of time to show in activity form')
 | 
			
		||||
            ->prototype('array')
 | 
			
		||||
            ->children()
 | 
			
		||||
            ->scalarNode('seconds')
 | 
			
		||||
            ->info('The number of seconds of this duration. Must be an integer.')
 | 
			
		||||
            ->cannotBeEmpty()
 | 
			
		||||
            ->validate()
 | 
			
		||||
            ->ifTrue(static function ($data) {
 | 
			
		||||
                return !is_int($data);
 | 
			
		||||
            })->thenInvalid('The value %s is not a valid integer')
 | 
			
		||||
            ->end()
 | 
			
		||||
            ->end()
 | 
			
		||||
            ->scalarNode('label')
 | 
			
		||||
            ->cannotBeEmpty()
 | 
			
		||||
            ->info('The label to show into fields')
 | 
			
		||||
            ->end()
 | 
			
		||||
            ->end()
 | 
			
		||||
            ->end()
 | 
			
		||||
//                            ->validate()
 | 
			
		||||
//                            
 | 
			
		||||
//
 | 
			
		||||
//                                ->ifTrue(function ($data) {
 | 
			
		||||
//                                    // test this is an array
 | 
			
		||||
//                                    if (!is_array($data)) {
 | 
			
		||||
@@ -84,11 +95,10 @@ class Configuration implements ConfigurationInterface
 | 
			
		||||
//                                    })
 | 
			
		||||
//                                    ->thenInvalid("The data are invalid. The keys must be a string and the value integers")
 | 
			
		||||
//                            ->end()
 | 
			
		||||
                            ->end()
 | 
			
		||||
                        ->end()
 | 
			
		||||
                
 | 
			
		||||
                    ->end()
 | 
			
		||||
                ->end();
 | 
			
		||||
            ->end()
 | 
			
		||||
            ->end()
 | 
			
		||||
            ->end()
 | 
			
		||||
            ->end();
 | 
			
		||||
 | 
			
		||||
        return $treeBuilder;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,558 +1,333 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2015, Champs Libres Cooperative SCRLFS, <http://www.champs-libres.coop>
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 *  it under the terms of the GNU Affero General Public License as
 | 
			
		||||
 * published by the Free Software Foundation, either version 3 of the
 | 
			
		||||
 *  License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Entity;
 | 
			
		||||
 | 
			
		||||
use Chill\DocStoreBundle\Entity\Document;
 | 
			
		||||
use Chill\DocStoreBundle\Entity\StoredObject;
 | 
			
		||||
use Chill\MainBundle\Entity\Embeddable\CommentEmbeddable;
 | 
			
		||||
use Chill\PersonBundle\Entity\AccompanyingPeriod;
 | 
			
		||||
use Chill\PersonBundle\Entity\SocialWork\SocialAction;
 | 
			
		||||
use Chill\PersonBundle\Entity\SocialWork\SocialIssue;
 | 
			
		||||
use Chill\ThirdPartyBundle\Entity\ThirdParty;
 | 
			
		||||
use Doctrine\ORM\Mapping as ORM;
 | 
			
		||||
use Chill\MainBundle\Entity\Scope;
 | 
			
		||||
use Chill\MainBundle\Entity\User;
 | 
			
		||||
use Chill\MainBundle\Entity\Center;
 | 
			
		||||
use Chill\PersonBundle\Entity\Person;
 | 
			
		||||
use Chill\MainBundle\Entity\Embeddable\CommentEmbeddable;
 | 
			
		||||
use Chill\MainBundle\Entity\HasCenterInterface;
 | 
			
		||||
use Chill\MainBundle\Entity\HasScopeInterface;
 | 
			
		||||
use Doctrine\Common\Collections\Collection;
 | 
			
		||||
use Doctrine\Common\Collections\ArrayCollection;
 | 
			
		||||
use Chill\MainBundle\Entity\Scope;
 | 
			
		||||
use Chill\MainBundle\Entity\User;
 | 
			
		||||
use Chill\MainBundle\Validator\Constraints\Entity\UserCircleConsistency;
 | 
			
		||||
use Symfony\Component\Serializer\Annotation\Groups;
 | 
			
		||||
use Symfony\Component\Serializer\Annotation\DiscriminatorMap;
 | 
			
		||||
use Chill\PersonBundle\Entity\Person;
 | 
			
		||||
use DateTime;
 | 
			
		||||
use Doctrine\Common\Collections\ArrayCollection;
 | 
			
		||||
use Doctrine\Common\Collections\Collection;
 | 
			
		||||
use Doctrine\ORM\Mapping as ORM;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class Activity
 | 
			
		||||
 *
 | 
			
		||||
 * @package Chill\ActivityBundle\Entity
 | 
			
		||||
 * @ORM\Entity(repositoryClass="Chill\ActivityBundle\Repository\ActivityRepository")
 | 
			
		||||
 * @ORM\Entity
 | 
			
		||||
 * @ORM\Table(name="activity")
 | 
			
		||||
 * @ORM\HasLifecycleCallbacks()
 | 
			
		||||
 * @DiscriminatorMap(typeProperty="type", mapping={
 | 
			
		||||
 *  "activity"=Activity::class
 | 
			
		||||
 *  })
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * TODO : revoir
 | 
			
		||||
 * @ORM\HasLifecycleCallbacks
 | 
			
		||||
 * @UserCircleConsistency(
 | 
			
		||||
 *      "CHILL_ACTIVITY_SEE_DETAILS",
 | 
			
		||||
 *      getUserFunction="getUser",
 | 
			
		||||
 *      path="scope")
 | 
			
		||||
 *     "CHILL_ACTIVITY_SEE_DETAILS",
 | 
			
		||||
 *     getUserFunction="getUser",
 | 
			
		||||
 * path="scope")
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
class Activity implements HasCenterInterface, HasScopeInterface
 | 
			
		||||
{
 | 
			
		||||
    const SENTRECEIVED_SENT = 'sent';
 | 
			
		||||
    const SENTRECEIVED_RECEIVED = 'received';
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Id
 | 
			
		||||
     * @ORM\Column(name="id", type="integer")
 | 
			
		||||
     * @ORM\GeneratedValue(strategy="AUTO")
 | 
			
		||||
     * @Groups({"read"})
 | 
			
		||||
     * @var bool
 | 
			
		||||
     * @ORM\Column(type="boolean")
 | 
			
		||||
     */
 | 
			
		||||
    private ?int $id = null;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\ManyToOne(targetEntity="Chill\MainBundle\Entity\User")
 | 
			
		||||
     */
 | 
			
		||||
    private User $user;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="datetime")
 | 
			
		||||
     */
 | 
			
		||||
    private \DateTime $date;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="time", nullable=true)
 | 
			
		||||
     */
 | 
			
		||||
    private ?\DateTime $durationTime = null;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="time", nullable=true)
 | 
			
		||||
     */
 | 
			
		||||
    private ?\DateTime $travelTime = null;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\ManyToOne(targetEntity="Chill\ActivityBundle\Entity\ActivityPresence")
 | 
			
		||||
     */
 | 
			
		||||
    private ?ActivityPresence $attendee = null;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\ManyToMany(targetEntity="Chill\ActivityBundle\Entity\ActivityReason")
 | 
			
		||||
     */
 | 
			
		||||
    private Collection $reasons;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\ManyToMany(targetEntity="Chill\PersonBundle\Entity\SocialWork\SocialIssue")
 | 
			
		||||
     * @ORM\JoinTable(name="chill_activity_activity_chill_person_socialissue")
 | 
			
		||||
     */
 | 
			
		||||
    private $socialIssues;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\ManyToMany(targetEntity="Chill\PersonBundle\Entity\SocialWork\SocialAction")
 | 
			
		||||
     * @ORM\JoinTable(name="chill_activity_activity_chill_person_socialaction")
 | 
			
		||||
     */
 | 
			
		||||
    private $socialActions;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\ManyToOne(targetEntity="Chill\ActivityBundle\Entity\ActivityType")
 | 
			
		||||
     */
 | 
			
		||||
    private ActivityType $type;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\ManyToOne(targetEntity="Chill\MainBundle\Entity\Scope")
 | 
			
		||||
     */
 | 
			
		||||
    private ?Scope $scope = null;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\ManyToOne(targetEntity="Chill\PersonBundle\Entity\Person")
 | 
			
		||||
     */
 | 
			
		||||
    private ?Person $person = null;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\ManyToOne(targetEntity="Chill\PersonBundle\Entity\AccompanyingPeriod")
 | 
			
		||||
     * @Groups({"read"})
 | 
			
		||||
     */
 | 
			
		||||
    private ?AccompanyingPeriod $accompanyingPeriod = null;
 | 
			
		||||
    private $attendee;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Embedded(class="Chill\MainBundle\Entity\Embeddable\CommentEmbeddable", columnPrefix="comment_")
 | 
			
		||||
     */
 | 
			
		||||
    private CommentEmbeddable $comment;
 | 
			
		||||
    private $comment;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\ManyToMany(targetEntity="Chill\PersonBundle\Entity\Person")
 | 
			
		||||
     * @Groups({"read"})
 | 
			
		||||
     * @var DateTime
 | 
			
		||||
     * @ORM\Column(type="datetime")
 | 
			
		||||
     */
 | 
			
		||||
    private ?Collection $persons = null;
 | 
			
		||||
    private $date;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\ManyToMany(targetEntity="Chill\ThirdPartyBundle\Entity\ThirdParty")
 | 
			
		||||
     * @Groups({"read"})
 | 
			
		||||
     * @var DateTime
 | 
			
		||||
     * @ORM\Column(type="time")
 | 
			
		||||
     */
 | 
			
		||||
    private ?Collection $thirdParties = null;
 | 
			
		||||
    private $durationTime;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\ManyToMany(targetEntity="Chill\DocStoreBundle\Entity\StoredObject")
 | 
			
		||||
     * @var int
 | 
			
		||||
     *
 | 
			
		||||
     * @ORM\Id
 | 
			
		||||
     * @ORM\Column(name="id", type="integer")
 | 
			
		||||
     * @ORM\GeneratedValue(strategy="AUTO")
 | 
			
		||||
     */
 | 
			
		||||
    private Collection $documents;
 | 
			
		||||
    private $id;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\ManyToMany(targetEntity="Chill\MainBundle\Entity\User")
 | 
			
		||||
     * @Groups({"read"})
 | 
			
		||||
     * @var Person
 | 
			
		||||
     * @ORM\ManyToOne(targetEntity="Chill\PersonBundle\Entity\Person")
 | 
			
		||||
     */
 | 
			
		||||
    private ?Collection $users = null;
 | 
			
		||||
    private $person;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="boolean", options={"default"=false})
 | 
			
		||||
     * @var ActivityReason
 | 
			
		||||
     * @ORM\ManyToMany(targetEntity="Chill\ActivityBundle\Entity\ActivityReason")
 | 
			
		||||
     */
 | 
			
		||||
    private bool $emergency = false;
 | 
			
		||||
    private $reasons;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="string", options={"default"=""})
 | 
			
		||||
     * @var Scope
 | 
			
		||||
     * @ORM\ManyToOne(targetEntity="Chill\MainBundle\Entity\Scope")
 | 
			
		||||
     */
 | 
			
		||||
    private string $sentReceived = '';
 | 
			
		||||
    private $scope;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @var ActivityType
 | 
			
		||||
     * @ORM\ManyToOne(targetEntity="Chill\ActivityBundle\Entity\ActivityType")
 | 
			
		||||
     */
 | 
			
		||||
    private $type;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @var User
 | 
			
		||||
     * @ORM\ManyToOne(targetEntity="Chill\MainBundle\Entity\User")
 | 
			
		||||
     */
 | 
			
		||||
    private $user;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Activity constructor.
 | 
			
		||||
     */
 | 
			
		||||
    public function __construct()
 | 
			
		||||
    {
 | 
			
		||||
        $this->reasons = new ArrayCollection();
 | 
			
		||||
        $this->comment = new CommentEmbeddable();
 | 
			
		||||
        $this->persons = new ArrayCollection();
 | 
			
		||||
        $this->thirdParties = new ArrayCollection();
 | 
			
		||||
        $this->documents = new ArrayCollection();
 | 
			
		||||
        $this->users = new ArrayCollection();
 | 
			
		||||
        $this->socialIssues = new ArrayCollection();
 | 
			
		||||
        $this->socialActions = new ArrayCollection();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getId(): ?int
 | 
			
		||||
    /**
 | 
			
		||||
     * Add a reason.
 | 
			
		||||
     *
 | 
			
		||||
     * @return Activity
 | 
			
		||||
     */
 | 
			
		||||
    public function addReason(ActivityReason $reason)
 | 
			
		||||
    {
 | 
			
		||||
        return $this->id;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setUser(User $user): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->user = $user;
 | 
			
		||||
        $this->reasons[] = $reason;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getUser(): User
 | 
			
		||||
    /**
 | 
			
		||||
     * Get attendee.
 | 
			
		||||
     *
 | 
			
		||||
     * @return bool
 | 
			
		||||
     */
 | 
			
		||||
    public function getAttendee()
 | 
			
		||||
    {
 | 
			
		||||
        return $this->user;
 | 
			
		||||
        return $this->attendee;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setDate(\DateTime $date): self
 | 
			
		||||
    /**
 | 
			
		||||
     * get the center
 | 
			
		||||
     * center is extracted from person.
 | 
			
		||||
     *
 | 
			
		||||
     * @return Center
 | 
			
		||||
     */
 | 
			
		||||
    public function getCenter()
 | 
			
		||||
    {
 | 
			
		||||
        $this->date = $date;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
        return $this->person->getCenter();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getDate(): \DateTime
 | 
			
		||||
    /**
 | 
			
		||||
     * @return \Chill\MainBundle\Entity\Embeddalbe\CommentEmbeddable
 | 
			
		||||
     */
 | 
			
		||||
    public function getComment()
 | 
			
		||||
    {
 | 
			
		||||
        return $this->comment;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get date.
 | 
			
		||||
     *
 | 
			
		||||
     * @return DateTime
 | 
			
		||||
     */
 | 
			
		||||
    public function getDate()
 | 
			
		||||
    {
 | 
			
		||||
        return $this->date;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setDurationTime(?\DateTime $durationTime): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->durationTime = $durationTime;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getDurationTime(): ?\DateTime
 | 
			
		||||
    /**
 | 
			
		||||
     * Get durationTime.
 | 
			
		||||
     *
 | 
			
		||||
     * @return DateTime
 | 
			
		||||
     */
 | 
			
		||||
    public function getDurationTime()
 | 
			
		||||
    {
 | 
			
		||||
        return $this->durationTime;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setTravelTime(\DateTime $travelTime): self
 | 
			
		||||
    /**
 | 
			
		||||
     * Get id.
 | 
			
		||||
     *
 | 
			
		||||
     * @return int
 | 
			
		||||
     */
 | 
			
		||||
    public function getId()
 | 
			
		||||
    {
 | 
			
		||||
        $this->travelTime = $travelTime;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
        return $this->id;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getTravelTime(): ?\DateTime
 | 
			
		||||
    /**
 | 
			
		||||
     * Get person.
 | 
			
		||||
     *
 | 
			
		||||
     * @return Person
 | 
			
		||||
     */
 | 
			
		||||
    public function getPerson()
 | 
			
		||||
    {
 | 
			
		||||
        return $this->travelTime;
 | 
			
		||||
        return $this->person;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setAttendee(ActivityPresence $attendee): self
 | 
			
		||||
    /**
 | 
			
		||||
     * Get reasons.
 | 
			
		||||
     *
 | 
			
		||||
     * @return Collection
 | 
			
		||||
     */
 | 
			
		||||
    public function getReasons()
 | 
			
		||||
    {
 | 
			
		||||
        return $this->reasons;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get scope.
 | 
			
		||||
     *
 | 
			
		||||
     * @return Scope
 | 
			
		||||
     */
 | 
			
		||||
    public function getScope()
 | 
			
		||||
    {
 | 
			
		||||
        return $this->scope;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get type.
 | 
			
		||||
     *
 | 
			
		||||
     * @return ActivityType
 | 
			
		||||
     */
 | 
			
		||||
    public function getType()
 | 
			
		||||
    {
 | 
			
		||||
        return $this->type;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get user.
 | 
			
		||||
     *
 | 
			
		||||
     * @return User
 | 
			
		||||
     */
 | 
			
		||||
    public function getUser()
 | 
			
		||||
    {
 | 
			
		||||
        return $this->user;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function removeReason(ActivityReason $reason)
 | 
			
		||||
    {
 | 
			
		||||
        $this->reasons->removeElement($reason);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Set attendee.
 | 
			
		||||
     *
 | 
			
		||||
     * @param bool $attendee
 | 
			
		||||
     *
 | 
			
		||||
     * @return Activity
 | 
			
		||||
     */
 | 
			
		||||
    public function setAttendee($attendee)
 | 
			
		||||
    {
 | 
			
		||||
        $this->attendee = $attendee;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getAttendee(): ?ActivityPresence
 | 
			
		||||
    /**
 | 
			
		||||
     * @param \Chill\MainBundle\Entity\Embeddalbe\CommentEmbeddable $comment
 | 
			
		||||
     */
 | 
			
		||||
    public function setComment($comment)
 | 
			
		||||
    {
 | 
			
		||||
        return $this->attendee;
 | 
			
		||||
        $this->comment = $comment;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function addReason(ActivityReason $reason): self
 | 
			
		||||
    /**
 | 
			
		||||
     * Set date.
 | 
			
		||||
     *
 | 
			
		||||
     * @param DateTime $date
 | 
			
		||||
     *
 | 
			
		||||
     * @return Activity
 | 
			
		||||
     */
 | 
			
		||||
    public function setDate($date)
 | 
			
		||||
    {
 | 
			
		||||
        $this->reasons->add($reason);
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function removeReason(ActivityReason $reason): void
 | 
			
		||||
    {
 | 
			
		||||
        $this->reasons->removeElement($reason);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getReasons(): Collection
 | 
			
		||||
    {
 | 
			
		||||
        return $this->reasons;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setReasons(?ArrayCollection $reasons): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->reasons = $reasons;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getSocialIssues(): Collection
 | 
			
		||||
    {
 | 
			
		||||
        return $this->socialIssues;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function addSocialIssue(SocialIssue $socialIssue): self
 | 
			
		||||
    {
 | 
			
		||||
        if (!$this->socialIssues->contains($socialIssue)) {
 | 
			
		||||
            $this->socialIssues[] = $socialIssue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function removeSocialIssue(SocialIssue $socialIssue): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->socialIssues->removeElement($socialIssue);
 | 
			
		||||
        $this->date = $date;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return Collection|SocialAction[]
 | 
			
		||||
     * Set durationTime.
 | 
			
		||||
     *
 | 
			
		||||
     * @param DateTime $durationTime
 | 
			
		||||
     *
 | 
			
		||||
     * @return Activity
 | 
			
		||||
     */
 | 
			
		||||
    public function getSocialActions(): Collection
 | 
			
		||||
    public function setDurationTime($durationTime)
 | 
			
		||||
    {
 | 
			
		||||
        return $this->socialActions;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function addSocialAction(SocialAction $socialAction): self
 | 
			
		||||
    {
 | 
			
		||||
        if (!$this->socialActions->contains($socialAction)) {
 | 
			
		||||
            $this->socialActions[] = $socialAction;
 | 
			
		||||
        }
 | 
			
		||||
        $this->durationTime = $durationTime;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function removeSocialAction(SocialAction $socialAction): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->socialActions->removeElement($socialAction);
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    public function setType(ActivityType $type): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->type = $type;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getType(): ActivityType
 | 
			
		||||
    {
 | 
			
		||||
        return $this->type;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setScope(Scope $scope): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->scope = $scope;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getScope(): ?Scope
 | 
			
		||||
    {
 | 
			
		||||
        return $this->scope;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setPerson(?Person $person): self
 | 
			
		||||
    /**
 | 
			
		||||
     * Set person.
 | 
			
		||||
     *
 | 
			
		||||
     * @return Activity
 | 
			
		||||
     */
 | 
			
		||||
    public function setPerson(Person $person)
 | 
			
		||||
    {
 | 
			
		||||
        $this->person = $person;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getPerson(): ?Person
 | 
			
		||||
    /**
 | 
			
		||||
     * Set scope.
 | 
			
		||||
     *
 | 
			
		||||
     * @return Activity
 | 
			
		||||
     */
 | 
			
		||||
    public function setScope(Scope $scope)
 | 
			
		||||
    {
 | 
			
		||||
        return $this->person;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getAccompanyingPeriod(): ?AccompanyingPeriod
 | 
			
		||||
    {
 | 
			
		||||
        return $this->accompanyingPeriod;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setAccompanyingPeriod(?AccompanyingPeriod $accompanyingPeriod): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->accompanyingPeriod = $accompanyingPeriod;
 | 
			
		||||
        $this->scope = $scope;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * get the center
 | 
			
		||||
     * center is extracted from person
 | 
			
		||||
     * Set type.
 | 
			
		||||
     *
 | 
			
		||||
     * @return Activity
 | 
			
		||||
     */
 | 
			
		||||
    public function getCenter(): ?Center
 | 
			
		||||
    public function setType(ActivityType $type)
 | 
			
		||||
    {
 | 
			
		||||
        if ($this->person instanceof Person) {
 | 
			
		||||
            return $this->person->getCenter();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getComment(): CommentEmbeddable
 | 
			
		||||
    {
 | 
			
		||||
        return $this->comment;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setComment(CommentEmbeddable $comment): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->comment = $comment;
 | 
			
		||||
        $this->type = $type;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Add a person to the person list
 | 
			
		||||
     * Set user.
 | 
			
		||||
     *
 | 
			
		||||
     * @return Activity
 | 
			
		||||
     */
 | 
			
		||||
    public function addPerson(?Person $person): self
 | 
			
		||||
    public function setUser(User $user)
 | 
			
		||||
    {
 | 
			
		||||
        if (null !== $person) {
 | 
			
		||||
            $this->persons[] = $person;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function removePerson(Person $person): void
 | 
			
		||||
    {
 | 
			
		||||
        $this->persons->removeElement($person);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getPersons(): Collection
 | 
			
		||||
    {
 | 
			
		||||
        return $this->persons;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getPersonsAssociated(): array 
 | 
			
		||||
    {
 | 
			
		||||
        if (null !== $this->accompanyingPeriod) {
 | 
			
		||||
            $personsAssociated = [];
 | 
			
		||||
            foreach ($this->accompanyingPeriod->getParticipations() as $participation) {
 | 
			
		||||
                if ($this->persons->contains($participation->getPerson())) {
 | 
			
		||||
                    $personsAssociated[] = $participation->getPerson();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            return $personsAssociated; 
 | 
			
		||||
        }
 | 
			
		||||
        return [];
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public function getPersonsNotAssociated(): array
 | 
			
		||||
    {
 | 
			
		||||
        if (null !== $this->accompanyingPeriod) {
 | 
			
		||||
            $personsNotAssociated = [];
 | 
			
		||||
            foreach ($this->persons as $person) {
 | 
			
		||||
                if (!in_array($person, $this->getPersonsAssociated())) {
 | 
			
		||||
                     $personsNotAssociated[] = $person;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            return $personsNotAssociated;
 | 
			
		||||
        }
 | 
			
		||||
        return [];
 | 
			
		||||
    }    
 | 
			
		||||
 | 
			
		||||
    public function setPersons(?Collection $persons): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->persons = $persons;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function addThirdParty(?ThirdParty $thirdParty): self
 | 
			
		||||
    {
 | 
			
		||||
        if (null !== $thirdParty) {
 | 
			
		||||
           $this->thirdParties[] = $thirdParty;
 | 
			
		||||
        }
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function removeThirdParty(ThirdParty $thirdParty): void
 | 
			
		||||
    {
 | 
			
		||||
        $this->thirdParties->removeElement($thirdParty);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getThirdParties(): Collection
 | 
			
		||||
    {
 | 
			
		||||
        return $this->thirdParties;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setThirdParties(?Collection $thirdParties): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->thirdParties = $thirdParties;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function addDocument(Document $document): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->documents[] = $document;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function removeDocument(Document $document): void
 | 
			
		||||
    {
 | 
			
		||||
        $this->documents->removeElement($document);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getDocuments(): Collection
 | 
			
		||||
    {
 | 
			
		||||
        return $this->documents;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setDocuments(Collection $documents): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->documents = $documents;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function addUser(?User $user): self
 | 
			
		||||
    {
 | 
			
		||||
        if (null !== $user) {
 | 
			
		||||
            $this->users[] = $user;
 | 
			
		||||
        }
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function removeUser(User $user): void
 | 
			
		||||
    {
 | 
			
		||||
        $this->users->removeElement($user);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getUsers(): Collection
 | 
			
		||||
    {
 | 
			
		||||
        return $this->users;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setUsers(?Collection $users): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->users = $users;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function isEmergency(): bool
 | 
			
		||||
    {
 | 
			
		||||
        return $this->getEmergency();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getEmergency(): bool
 | 
			
		||||
    {
 | 
			
		||||
        return $this->emergency;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setEmergency(bool $emergency): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->emergency = $emergency;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getSentReceived(): string
 | 
			
		||||
    {
 | 
			
		||||
        return $this->sentReceived;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setSentReceived(?string $sentReceived): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->sentReceived = (string) $sentReceived;
 | 
			
		||||
        $this->user = $user;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,97 +0,0 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2015, Champs Libres Cooperative SCRLFS, <http://www.champs-libres.coop>
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 *  it under the terms of the GNU Affero General Public License as
 | 
			
		||||
 * published by the Free Software Foundation, either version 3 of the
 | 
			
		||||
 *  License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Entity;
 | 
			
		||||
 | 
			
		||||
use Doctrine\ORM\Mapping as ORM;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class ActivityPresence
 | 
			
		||||
 *
 | 
			
		||||
 * @package Chill\ActivityBundle\Entity
 | 
			
		||||
 * @ORM\Entity()
 | 
			
		||||
 * @ORM\Table(name="activitytpresence")
 | 
			
		||||
 * @ORM\HasLifecycleCallbacks()
 | 
			
		||||
 */
 | 
			
		||||
class ActivityPresence
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Id
 | 
			
		||||
     * @ORM\Column(name="id", type="integer")
 | 
			
		||||
     * @ORM\GeneratedValue(strategy="AUTO")
 | 
			
		||||
     */
 | 
			
		||||
    private ?int $id;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="json")
 | 
			
		||||
     */
 | 
			
		||||
    private array $name = [];
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="boolean")
 | 
			
		||||
     */
 | 
			
		||||
    private bool $active = true;
 | 
			
		||||
 | 
			
		||||
    public function getId(): int
 | 
			
		||||
    {
 | 
			
		||||
        return $this->id;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setName(array $name): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->name = $name;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getName(): array
 | 
			
		||||
    {
 | 
			
		||||
        return $this->name;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get active
 | 
			
		||||
     * return true if the category type is active.
 | 
			
		||||
     */
 | 
			
		||||
    public function getActive(): bool
 | 
			
		||||
    {
 | 
			
		||||
        return $this->active;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Is active
 | 
			
		||||
     * return true if the category type is active
 | 
			
		||||
     */
 | 
			
		||||
    public function isActive(): bool
 | 
			
		||||
    {
 | 
			
		||||
        return $this->getActive();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Set active
 | 
			
		||||
     * set to true if the category type is active
 | 
			
		||||
     */
 | 
			
		||||
    public function setActive(bool $active): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->active = $active;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,40 +1,43 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (C) 2015, Champs Libres Cooperative SCRLFS, <http://www.champs-libres.coop>
 | 
			
		||||
 * 
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 *  it under the terms of the GNU Affero General Public License as
 | 
			
		||||
 * published by the Free Software Foundation, either version 3 of the
 | 
			
		||||
 *  License, or (at your option) any later version.
 | 
			
		||||
 * 
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 * 
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Entity;
 | 
			
		||||
 | 
			
		||||
use Doctrine\ORM\Mapping as ORM;
 | 
			
		||||
use Chill\ActivityBundle\Entity\ActivityReasonCategory;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class ActivityReason
 | 
			
		||||
 *
 | 
			
		||||
 * @package Chill\ActivityBundle\Entity
 | 
			
		||||
 * @ORM\Entity()
 | 
			
		||||
 * @ORM\Entity
 | 
			
		||||
 * @ORM\Table(name="activityreason")
 | 
			
		||||
 * @ORM\HasLifecycleCallbacks()
 | 
			
		||||
 * @ORM\HasLifecycleCallbacks
 | 
			
		||||
 */
 | 
			
		||||
class ActivityReason
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * @var integer
 | 
			
		||||
     * @var bool
 | 
			
		||||
     * @ORM\Column(type="boolean")
 | 
			
		||||
     */
 | 
			
		||||
    private $active = true;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @var ActivityReasonCategory
 | 
			
		||||
     * @ORM\ManyToOne(
 | 
			
		||||
     *     targetEntity="Chill\ActivityBundle\Entity\ActivityReasonCategory",
 | 
			
		||||
     * inversedBy="reasons")
 | 
			
		||||
     */
 | 
			
		||||
    private $category;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @var int
 | 
			
		||||
     *
 | 
			
		||||
     * @ORM\Id
 | 
			
		||||
     * @ORM\Column(name="id", type="integer")
 | 
			
		||||
@@ -49,86 +52,17 @@ class ActivityReason
 | 
			
		||||
    private $name;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @var ActivityReasonCategory
 | 
			
		||||
     * @ORM\ManyToOne(
 | 
			
		||||
     *     targetEntity="Chill\ActivityBundle\Entity\ActivityReasonCategory",
 | 
			
		||||
     *     inversedBy="reasons")
 | 
			
		||||
     */
 | 
			
		||||
    private $category;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @var boolean
 | 
			
		||||
     * @ORM\Column(type="boolean")
 | 
			
		||||
     */
 | 
			
		||||
    private $active = true;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get id
 | 
			
		||||
     * Get active.
 | 
			
		||||
     *
 | 
			
		||||
     * @return integer
 | 
			
		||||
     * @return bool
 | 
			
		||||
     */
 | 
			
		||||
    public function getId()
 | 
			
		||||
    public function getActive()
 | 
			
		||||
    {
 | 
			
		||||
        return $this->id;
 | 
			
		||||
        return $this->active;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Set name
 | 
			
		||||
     *
 | 
			
		||||
     * @param array $name
 | 
			
		||||
     * @return ActivityReason
 | 
			
		||||
     */
 | 
			
		||||
    public function setName($name)
 | 
			
		||||
    {
 | 
			
		||||
        $this->name = $name;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get name
 | 
			
		||||
     *
 | 
			
		||||
     * @return array | string
 | 
			
		||||
     */
 | 
			
		||||
    public function getName($locale = null)
 | 
			
		||||
    {
 | 
			
		||||
        if ($locale) {
 | 
			
		||||
            if (isset($this->name[$locale])) {
 | 
			
		||||
                return $this->name[$locale];
 | 
			
		||||
            } else {
 | 
			
		||||
                foreach ($this->name as $name) {
 | 
			
		||||
                    if (!empty($name)) {
 | 
			
		||||
                        return $name;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            return '';
 | 
			
		||||
        } else {
 | 
			
		||||
            return $this->name;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * Set category of the reason. If you set to the reason an inactive
 | 
			
		||||
     * category, the reason will become inactive
 | 
			
		||||
     *
 | 
			
		||||
     * @param ActivityReasonCategory $category
 | 
			
		||||
     * @return ActivityReason
 | 
			
		||||
     */
 | 
			
		||||
    public function setCategory(ActivityReasonCategory $category)
 | 
			
		||||
    {
 | 
			
		||||
        if($this->category !== $category && ! $category->getActive()) {
 | 
			
		||||
            $this->setActive(False);
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        $this->category = $category;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get category
 | 
			
		||||
     * Get category.
 | 
			
		||||
     *
 | 
			
		||||
     * @return ActivityReasonCategory
 | 
			
		||||
     */
 | 
			
		||||
@@ -138,9 +72,46 @@ class ActivityReason
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Set active
 | 
			
		||||
     * Get id.
 | 
			
		||||
     *
 | 
			
		||||
     * @return int
 | 
			
		||||
     */
 | 
			
		||||
    public function getId()
 | 
			
		||||
    {
 | 
			
		||||
        return $this->id;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get name.
 | 
			
		||||
     *
 | 
			
		||||
     * @param mixed|null $locale
 | 
			
		||||
     *
 | 
			
		||||
     * @return array | string
 | 
			
		||||
     */
 | 
			
		||||
    public function getName($locale = null)
 | 
			
		||||
    {
 | 
			
		||||
        if ($locale) {
 | 
			
		||||
            if (isset($this->name[$locale])) {
 | 
			
		||||
                return $this->name[$locale];
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            foreach ($this->name as $name) {
 | 
			
		||||
                if (!empty($name)) {
 | 
			
		||||
                    return $name;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return '';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $this->name;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Set active.
 | 
			
		||||
     *
 | 
			
		||||
     * @param bool $active
 | 
			
		||||
     *
 | 
			
		||||
     * @param boolean $active
 | 
			
		||||
     * @return ActivityReason
 | 
			
		||||
     */
 | 
			
		||||
    public function setActive($active)
 | 
			
		||||
@@ -151,13 +122,33 @@ class ActivityReason
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get active
 | 
			
		||||
     * Set category of the reason. If you set to the reason an inactive
 | 
			
		||||
     * category, the reason will become inactive.
 | 
			
		||||
     *
 | 
			
		||||
     * @return boolean
 | 
			
		||||
     * @return ActivityReason
 | 
			
		||||
     */
 | 
			
		||||
    public function getActive()
 | 
			
		||||
    public function setCategory(ActivityReasonCategory $category)
 | 
			
		||||
    {
 | 
			
		||||
        return $this->active;
 | 
			
		||||
        if ($this->category !== $category && !$category->getActive()) {
 | 
			
		||||
            $this->setActive(false);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $this->category = $category;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Set name.
 | 
			
		||||
     *
 | 
			
		||||
     * @param array $name
 | 
			
		||||
     *
 | 
			
		||||
     * @return ActivityReason
 | 
			
		||||
     */
 | 
			
		||||
    public function setName($name)
 | 
			
		||||
    {
 | 
			
		||||
        $this->name = $name;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,39 +1,36 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2015, Champs Libres Cooperative SCRLFS, <http://www.champs-libres.coop>
 | 
			
		||||
 * 
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 *  it under the terms of the GNU Affero General Public License as
 | 
			
		||||
 * published by the Free Software Foundation, either version 3 of the
 | 
			
		||||
 *  License, or (at your option) any later version.
 | 
			
		||||
 * 
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 * 
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Entity;
 | 
			
		||||
 | 
			
		||||
use Doctrine\ORM\Mapping as ORM;
 | 
			
		||||
use Doctrine\Common\Collections\ArrayCollection;
 | 
			
		||||
use Doctrine\ORM\Mapping as ORM;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class ActivityReasonCategory
 | 
			
		||||
 *
 | 
			
		||||
 * @package Chill\ActivityBundle\Entity
 | 
			
		||||
 * @ORM\Entity()
 | 
			
		||||
 * @ORM\Entity
 | 
			
		||||
 * @ORM\Table(name="activityreasoncategory")
 | 
			
		||||
 * @ORM\HasLifecycleCallbacks()
 | 
			
		||||
 * @ORM\HasLifecycleCallbacks
 | 
			
		||||
 */
 | 
			
		||||
class ActivityReasonCategory
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * @var integer
 | 
			
		||||
     * @var bool
 | 
			
		||||
     * @ORM\Column(type="boolean")
 | 
			
		||||
     */
 | 
			
		||||
    private $active = true;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @var int
 | 
			
		||||
     *
 | 
			
		||||
     * @ORM\Id
 | 
			
		||||
     * @ORM\Column(name="id", type="integer")
 | 
			
		||||
@@ -48,20 +45,15 @@ class ActivityReasonCategory
 | 
			
		||||
    private $name;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @var boolean
 | 
			
		||||
     * @ORM\Column(type="boolean")
 | 
			
		||||
     */
 | 
			
		||||
    private $active = true;
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * Array of ActivityReason
 | 
			
		||||
     * Array of ActivityReason.
 | 
			
		||||
     *
 | 
			
		||||
     * @var ArrayCollection
 | 
			
		||||
     * @ORM\OneToMany(
 | 
			
		||||
     *     targetEntity="Chill\ActivityBundle\Entity\ActivityReason",
 | 
			
		||||
     *     mappedBy="category")
 | 
			
		||||
     * mappedBy="category")
 | 
			
		||||
     */
 | 
			
		||||
    private $reasons;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * ActivityReasonCategory constructor.
 | 
			
		||||
     */
 | 
			
		||||
@@ -69,19 +61,29 @@ class ActivityReasonCategory
 | 
			
		||||
    {
 | 
			
		||||
        $this->reasons = new ArrayCollection();
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return string
 | 
			
		||||
     */
 | 
			
		||||
    public function __toString()
 | 
			
		||||
    {
 | 
			
		||||
        return 'ActivityReasonCategory('.$this->getName('x').')';
 | 
			
		||||
        return 'ActivityReasonCategory(' . $this->getName('x') . ')';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get id
 | 
			
		||||
     * Get active.
 | 
			
		||||
     *
 | 
			
		||||
     * @return integer
 | 
			
		||||
     * @return bool
 | 
			
		||||
     */
 | 
			
		||||
    public function getActive()
 | 
			
		||||
    {
 | 
			
		||||
        return $this->active;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get id.
 | 
			
		||||
     *
 | 
			
		||||
     * @return int
 | 
			
		||||
     */
 | 
			
		||||
    public function getId()
 | 
			
		||||
    {
 | 
			
		||||
@@ -89,20 +91,9 @@ class ActivityReasonCategory
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Set name
 | 
			
		||||
     * Get name.
 | 
			
		||||
     *
 | 
			
		||||
     * @param array $name
 | 
			
		||||
     * @return ActivityReasonCategory
 | 
			
		||||
     */
 | 
			
		||||
    public function setName($name)
 | 
			
		||||
    {
 | 
			
		||||
        $this->name = $name;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get name
 | 
			
		||||
     * @param mixed|null $locale
 | 
			
		||||
     *
 | 
			
		||||
     * @return array
 | 
			
		||||
     */
 | 
			
		||||
@@ -111,48 +102,53 @@ class ActivityReasonCategory
 | 
			
		||||
        if ($locale) {
 | 
			
		||||
            if (isset($this->name[$locale])) {
 | 
			
		||||
                return $this->name[$locale];
 | 
			
		||||
            } else {
 | 
			
		||||
                foreach ($this->name as $name) {
 | 
			
		||||
                    if (!empty($name)) {
 | 
			
		||||
                        return $name;
 | 
			
		||||
                    }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            foreach ($this->name as $name) {
 | 
			
		||||
                if (!empty($name)) {
 | 
			
		||||
                    return $name;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return '';
 | 
			
		||||
        } else {
 | 
			
		||||
            return $this->name;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $this->name;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Declare a category as active (or not). When a category is set
 | 
			
		||||
     * as unactive, all the reason have this entity as category is also
 | 
			
		||||
     * set as unactive
 | 
			
		||||
     * set as unactive.
 | 
			
		||||
     *
 | 
			
		||||
     * @param bool $active
 | 
			
		||||
     *
 | 
			
		||||
     * @param boolean $active
 | 
			
		||||
     * @return ActivityReasonCategory
 | 
			
		||||
     */
 | 
			
		||||
    public function setActive($active)
 | 
			
		||||
    {
 | 
			
		||||
        if($this->active !== $active && !$active) {
 | 
			
		||||
        if ($this->active !== $active && !$active) {
 | 
			
		||||
            foreach ($this->reasons as $reason) {
 | 
			
		||||
                $reason->setActive($active);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        $this->active = $active;
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get active
 | 
			
		||||
     * Set name.
 | 
			
		||||
     *
 | 
			
		||||
     * @return boolean
 | 
			
		||||
     * @param array $name
 | 
			
		||||
     *
 | 
			
		||||
     * @return ActivityReasonCategory
 | 
			
		||||
     */
 | 
			
		||||
    public function getActive()
 | 
			
		||||
    public function setName($name)
 | 
			
		||||
    {
 | 
			
		||||
        return $this->active;
 | 
			
		||||
        $this->name = $name;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,822 +1,131 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2015, Champs Libres Cooperative SCRLFS, <http://www.champs-libres.coop>
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 *  it under the terms of the GNU Affero General Public License as
 | 
			
		||||
 * published by the Free Software Foundation, either version 3 of the
 | 
			
		||||
 *  License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Entity;
 | 
			
		||||
 | 
			
		||||
use Doctrine\ORM\Mapping as ORM;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class ActivityType
 | 
			
		||||
 *
 | 
			
		||||
 * @package Chill\ActivityBundle\Entity
 | 
			
		||||
 * @ORM\Entity()
 | 
			
		||||
 * @ORM\Entity
 | 
			
		||||
 * @ORM\Table(name="activitytype")
 | 
			
		||||
 * @ORM\HasLifecycleCallbacks()
 | 
			
		||||
 * @ORM\HasLifecycleCallbacks
 | 
			
		||||
 */
 | 
			
		||||
class ActivityType
 | 
			
		||||
{
 | 
			
		||||
    const FIELD_INVISIBLE = 0;
 | 
			
		||||
    const FIELD_OPTIONAL = 1;
 | 
			
		||||
    const FIELD_REQUIRED = 2;
 | 
			
		||||
    /**
 | 
			
		||||
     * @var bool
 | 
			
		||||
     * @ORM\Column(type="boolean")
 | 
			
		||||
     */
 | 
			
		||||
    private $active = true;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @var int
 | 
			
		||||
     *
 | 
			
		||||
     * @ORM\Id
 | 
			
		||||
     * @ORM\Column(name="id", type="integer")
 | 
			
		||||
     * @ORM\GeneratedValue(strategy="AUTO")
 | 
			
		||||
     */
 | 
			
		||||
    private ?int $id;
 | 
			
		||||
    private $id;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @var array
 | 
			
		||||
     * @ORM\Column(type="json_array")
 | 
			
		||||
     */
 | 
			
		||||
    private array $name = [];
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="boolean")
 | 
			
		||||
     */
 | 
			
		||||
    private bool $active = true;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\ManyToOne(targetEntity="Chill\ActivityBundle\Entity\ActivityTypeCategory")
 | 
			
		||||
     */
 | 
			
		||||
    private ?ActivityTypeCategory $category = null;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="smallint", nullable=false, options={"default"=2})
 | 
			
		||||
     */
 | 
			
		||||
    private int $personVisible = self::FIELD_REQUIRED;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="string", nullable=false, options={"default"=""})
 | 
			
		||||
     */
 | 
			
		||||
    private string $personLabel = '';
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="smallint", nullable=false, options={"default"=2})
 | 
			
		||||
     */
 | 
			
		||||
    private int $userVisible = self::FIELD_REQUIRED;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="string", nullable=false, options={"default"=""})
 | 
			
		||||
     */
 | 
			
		||||
    private string $userLabel = '';
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="smallint", nullable=false, options={"default"=2})
 | 
			
		||||
     */
 | 
			
		||||
    private int $dateVisible = self::FIELD_REQUIRED;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="string", nullable=false, options={"default"=""})
 | 
			
		||||
     */
 | 
			
		||||
    private string $dateLabel = '';
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="smallint", nullable=false, options={"default"=1})
 | 
			
		||||
     */
 | 
			
		||||
    private int $placeVisible = self::FIELD_OPTIONAL;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="string", nullable=false, options={"default"=""})
 | 
			
		||||
     */
 | 
			
		||||
    private string $placeLabel = '';
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="smallint", nullable=false, options={"default"=1})
 | 
			
		||||
     */
 | 
			
		||||
    private int $personsVisible = self::FIELD_OPTIONAL;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="string", nullable=false, options={"default"=""})
 | 
			
		||||
     */
 | 
			
		||||
    private string $personsLabel = '';
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="smallint", nullable=false, options={"default"=1})
 | 
			
		||||
     */
 | 
			
		||||
    private int $thirdPartiesVisible = self::FIELD_INVISIBLE;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="string", nullable=false, options={"default"=""})
 | 
			
		||||
     */
 | 
			
		||||
    private string $thirdPartiesLabel = '';
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="smallint", nullable=false, options={"default"=1})
 | 
			
		||||
     */
 | 
			
		||||
    private int $durationTimeVisible = self::FIELD_OPTIONAL;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="string", nullable=false, options={"default"=""})
 | 
			
		||||
     */
 | 
			
		||||
    private string $durationTimeLabel = '';
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="smallint", nullable=false, options={"default"=1})
 | 
			
		||||
     */
 | 
			
		||||
    private int $travelTimeVisible = self::FIELD_OPTIONAL;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="string", nullable=false, options={"default"=""})
 | 
			
		||||
     */
 | 
			
		||||
    private string $travelTimeLabel = '';
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="smallint", nullable=false, options={"default"=1})
 | 
			
		||||
     */
 | 
			
		||||
    private int $attendeeVisible = self::FIELD_OPTIONAL;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="string", nullable=false, options={"default"=""})
 | 
			
		||||
     */
 | 
			
		||||
    private string $attendeeLabel = '';
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="smallint", nullable=false, options={"default"=1})
 | 
			
		||||
     */
 | 
			
		||||
    private int $reasonsVisible = self::FIELD_OPTIONAL;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="string", nullable=false, options={"default"=""})
 | 
			
		||||
     */
 | 
			
		||||
    private string $reasonsLabel = '';
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="smallint", nullable=false, options={"default"=1})
 | 
			
		||||
     */
 | 
			
		||||
    private int $commentVisible = self::FIELD_OPTIONAL;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="string", nullable=false, options={"default"=""})
 | 
			
		||||
     */
 | 
			
		||||
    private string $commentLabel = '';
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="smallint", nullable=false, options={"default"=1})
 | 
			
		||||
     */
 | 
			
		||||
    private int $sentReceivedVisible = self::FIELD_OPTIONAL;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="string", nullable=false, options={"default"=""})
 | 
			
		||||
     */
 | 
			
		||||
    private string $sentReceivedLabel = '';
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="smallint", nullable=false, options={"default"=1})
 | 
			
		||||
     */
 | 
			
		||||
    private int $documentsVisible = self::FIELD_OPTIONAL;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="string", nullable=false, options={"default"=""})
 | 
			
		||||
     */
 | 
			
		||||
    private string $documentsLabel = '';
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="smallint", nullable=false, options={"default"=1})
 | 
			
		||||
     */
 | 
			
		||||
    private int $usersVisible = self::FIELD_OPTIONAL;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="string", nullable=false, options={"default"=""})
 | 
			
		||||
     */
 | 
			
		||||
    private string $usersLabel = '';
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="smallint", nullable=false, options={"default"=1})
 | 
			
		||||
     */
 | 
			
		||||
    private int $emergencyVisible = self::FIELD_INVISIBLE;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="string", nullable=false, options={"default"=""})
 | 
			
		||||
     */
 | 
			
		||||
    private string $emergencyLabel = '';
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="smallint", nullable=false, options={"default"=1})
 | 
			
		||||
     */
 | 
			
		||||
    private int $accompanyingPeriodVisible = self::FIELD_INVISIBLE;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="string", nullable=false, options={"default"=""})
 | 
			
		||||
     */
 | 
			
		||||
    private string $accompanyingPeriodLabel = '';
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="smallint", nullable=false, options={"default"=1})
 | 
			
		||||
     */
 | 
			
		||||
    private int $socialDataVisible = self::FIELD_INVISIBLE;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="string", nullable=false, options={"default"=""})
 | 
			
		||||
     */
 | 
			
		||||
    private string $socialDataLabel = '';
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="smallint", nullable=false, options={"default"=1})
 | 
			
		||||
     */
 | 
			
		||||
    private int $socialIssuesVisible = self::FIELD_INVISIBLE;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="string", nullable=false, options={"default"=""})
 | 
			
		||||
     */
 | 
			
		||||
    private string $socialIssuesLabel = '';
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="smallint", nullable=false, options={"default"=1})
 | 
			
		||||
     */
 | 
			
		||||
    private int $socialActionsVisible = self::FIELD_INVISIBLE;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="string", nullable=false, options={"default"=""})
 | 
			
		||||
     */
 | 
			
		||||
    private string $socialActionsLabel = '';
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="float", options={"default"="0.0"})
 | 
			
		||||
     */
 | 
			
		||||
    private float $ordering = 0.0;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get id
 | 
			
		||||
     */
 | 
			
		||||
    public function getId(): int
 | 
			
		||||
    {
 | 
			
		||||
        return $this->id;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Set name
 | 
			
		||||
     */
 | 
			
		||||
    public function setName(array $name): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->name = $name;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get name
 | 
			
		||||
     */
 | 
			
		||||
    public function getName(): array
 | 
			
		||||
    {
 | 
			
		||||
        return $this->name;
 | 
			
		||||
    }
 | 
			
		||||
    private $name;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get active
 | 
			
		||||
     * return true if the type is active.
 | 
			
		||||
     *
 | 
			
		||||
     * @return bool
 | 
			
		||||
     */
 | 
			
		||||
    public function getActive(): bool
 | 
			
		||||
    public function getActive()
 | 
			
		||||
    {
 | 
			
		||||
        return $this->active;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Is active
 | 
			
		||||
     * return true if the type is active
 | 
			
		||||
     * Get id.
 | 
			
		||||
     *
 | 
			
		||||
     * @return int
 | 
			
		||||
     */
 | 
			
		||||
    public function isActive(): bool
 | 
			
		||||
    public function getId()
 | 
			
		||||
    {
 | 
			
		||||
        return $this->id;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get name.
 | 
			
		||||
     *
 | 
			
		||||
     * @param mixed|null $locale
 | 
			
		||||
     *
 | 
			
		||||
     * @return array | string
 | 
			
		||||
     */
 | 
			
		||||
    public function getName($locale = null)
 | 
			
		||||
    {
 | 
			
		||||
        if ($locale) {
 | 
			
		||||
            if (isset($this->name[$locale])) {
 | 
			
		||||
                return $this->name[$locale];
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            foreach ($this->name as $name) {
 | 
			
		||||
                if (!empty($name)) {
 | 
			
		||||
                    return $name;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return '';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $this->name;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Is active
 | 
			
		||||
     * return true if the type is active.
 | 
			
		||||
     *
 | 
			
		||||
     * @return bool
 | 
			
		||||
     */
 | 
			
		||||
    public function isActive()
 | 
			
		||||
    {
 | 
			
		||||
        return $this->getActive();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Set active
 | 
			
		||||
     * set to true if the type is active
 | 
			
		||||
     * set to true if the type is active.
 | 
			
		||||
     *
 | 
			
		||||
     * @param bool $active
 | 
			
		||||
     *
 | 
			
		||||
     * @return ActivityType
 | 
			
		||||
     */
 | 
			
		||||
    public function setActive(bool $active): self
 | 
			
		||||
    public function setActive($active)
 | 
			
		||||
    {
 | 
			
		||||
        $this->active = $active;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getCategory(): ?ActivityTypeCategory
 | 
			
		||||
    {
 | 
			
		||||
        return $this->category;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setCategory(?ActivityTypeCategory $category): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->category = $category;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getPersonVisible(): int
 | 
			
		||||
    {
 | 
			
		||||
        return $this->personVisible;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setPersonVisible(int $personVisible): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->personVisible = $personVisible;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getPersonLabel(): string
 | 
			
		||||
    {
 | 
			
		||||
        return $this->personLabel;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setPersonLabel(string $personLabel): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->personLabel = $personLabel;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getUserVisible(): int
 | 
			
		||||
    {
 | 
			
		||||
        return $this->userVisible;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setUserVisible(int $userVisible): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->userVisible = $userVisible;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getUserLabel(): string
 | 
			
		||||
    {
 | 
			
		||||
        return $this->userLabel;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setUserLabel(string $userLabel): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->userLabel = $userLabel;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getDateVisible(): int
 | 
			
		||||
    {
 | 
			
		||||
        return $this->dateVisible;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setDateVisible(int $dateVisible): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->dateVisible = $dateVisible;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getDateLabel(): string
 | 
			
		||||
    {
 | 
			
		||||
        return $this->dateLabel;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setDateLabel(string $dateLabel): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->dateLabel = $dateLabel;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getPlaceVisible(): int
 | 
			
		||||
    {
 | 
			
		||||
        return $this->placeVisible;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setPlaceVisible(int $placeVisible): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->placeVisible = $placeVisible;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getPlaceLabel(): string
 | 
			
		||||
    {
 | 
			
		||||
        return $this->placeLabel;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setPlaceLabel(string $placeLabel): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->placeLabel = $placeLabel;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getPersonsVisible(): int
 | 
			
		||||
    {
 | 
			
		||||
        return $this->personsVisible;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setPersonsVisible(int $personsVisible): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->personsVisible = $personsVisible;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getPersonsLabel(): string
 | 
			
		||||
    {
 | 
			
		||||
        return $this->personsLabel;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setPersonsLabel(string $personsLabel): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->personsLabel = $personsLabel;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getThirdPartiesVisible(): int
 | 
			
		||||
    {
 | 
			
		||||
        return $this->thirdPartiesVisible;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setThirdPartiesVisible(int $thirdPartiesVisible): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->thirdPartiesVisible = $thirdPartiesVisible;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getThirdPartiesLabel(): string
 | 
			
		||||
    {
 | 
			
		||||
        return $this->thirdPartiesLabel;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setThirdPartiesLabel(string $thirdPartiesLabel): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->thirdPartiesLabel = $thirdPartiesLabel;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getDurationTimeVisible(): int
 | 
			
		||||
    {
 | 
			
		||||
        return $this->durationTimeVisible;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setDurationTimeVisible(int $durationTimeVisible): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->durationTimeVisible = $durationTimeVisible;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getDurationTimeLabel(): string
 | 
			
		||||
    {
 | 
			
		||||
        return $this->durationTimeLabel;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setDurationTimeLabel(string $durationTimeLabel): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->durationTimeLabel = $durationTimeLabel;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getTravelTimeVisible(): int
 | 
			
		||||
    {
 | 
			
		||||
        return $this->travelTimeVisible;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setTravelTimeVisible(int $TravelTimeVisible): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->travelTimeVisible = $TravelTimeVisible;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getTravelTimeLabel(): string
 | 
			
		||||
    {
 | 
			
		||||
        return $this->travelTimeLabel;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setTravelTimeLabel(string $TravelTimeLabel): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->travelTimeLabel = $TravelTimeLabel;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getAttendeeVisible(): int
 | 
			
		||||
    {
 | 
			
		||||
        return $this->attendeeVisible;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setAttendeeVisible(int $attendeeVisible): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->attendeeVisible = $attendeeVisible;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getAttendeeLabel(): string
 | 
			
		||||
    {
 | 
			
		||||
        return $this->attendeeLabel;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setAttendeeLabel(string $attendeeLabel): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->attendeeLabel = $attendeeLabel;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getReasonsVisible(): int
 | 
			
		||||
    {
 | 
			
		||||
        return $this->reasonsVisible;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setReasonsVisible(int $reasonsVisible): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->reasonsVisible = $reasonsVisible;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getReasonsLabel(): string
 | 
			
		||||
    {
 | 
			
		||||
        return $this->reasonsLabel;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setReasonsLabel(string $reasonsLabel): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->reasonsLabel = $reasonsLabel;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getCommentVisible(): int
 | 
			
		||||
    {
 | 
			
		||||
        return $this->commentVisible;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setCommentVisible(int $commentVisible): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->commentVisible = $commentVisible;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getCommentLabel(): string
 | 
			
		||||
    {
 | 
			
		||||
        return $this->commentLabel;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setCommentLabel(string $commentLabel): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->commentLabel = $commentLabel;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getSentReceivedVisible(): int
 | 
			
		||||
    {
 | 
			
		||||
        return $this->sentReceivedVisible;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setSentReceivedVisible(int $sentReceivedVisible): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->sentReceivedVisible = $sentReceivedVisible;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getSentReceivedLabel(): string
 | 
			
		||||
    {
 | 
			
		||||
        return $this->sentReceivedLabel;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setSentReceivedLabel(string $sentReceivedLabel): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->sentReceivedLabel = $sentReceivedLabel;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getDocumentsVisible(): int
 | 
			
		||||
    {
 | 
			
		||||
        return $this->documentsVisible;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setDocumentsVisible(int $documentsVisible): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->documentsVisible = $documentsVisible;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getDocumentsLabel(): string
 | 
			
		||||
    {
 | 
			
		||||
        return $this->documentsLabel;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setDocumentsLabel(string $documentsLabel): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->documentsLabel = $documentsLabel;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getUsersVisible(): int
 | 
			
		||||
    {
 | 
			
		||||
        return $this->usersVisible;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setUsersVisible(int $usersVisible): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->usersVisible = $usersVisible;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getUsersLabel(): string
 | 
			
		||||
    {
 | 
			
		||||
        return $this->usersLabel;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setUsersLabel(string $usersLabel): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->usersLabel = $usersLabel;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getEmergencyVisible(): int
 | 
			
		||||
    {
 | 
			
		||||
        return $this->emergencyVisible;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setEmergencyVisible(int $emergencyVisible): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->emergencyVisible = $emergencyVisible;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getEmergencyLabel(): string
 | 
			
		||||
    {
 | 
			
		||||
        return $this->emergencyLabel;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setEmergencyLabel(string $emergencyLabel): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->emergencyLabel = $emergencyLabel;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getAccompanyingPeriodVisible(): int
 | 
			
		||||
    {
 | 
			
		||||
        return $this->accompanyingPeriodVisible;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setAccompanyingPeriodVisible(int $accompanyingPeriodVisible): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->accompanyingPeriodVisible = $accompanyingPeriodVisible;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getAccompanyingPeriodLabel(): string
 | 
			
		||||
    {
 | 
			
		||||
        return $this->accompanyingPeriodLabel;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setAccompanyingPeriodLabel(string $accompanyingPeriodLabel): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->accompanyingPeriodLabel = $accompanyingPeriodLabel;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getSocialDataVisible(): int
 | 
			
		||||
    {
 | 
			
		||||
        return $this->socialDataVisible;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setSocialDataVisible(int $socialDataVisible): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->socialDataVisible = $socialDataVisible;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getSocialDataLabel(): string
 | 
			
		||||
    {
 | 
			
		||||
        return $this->socialDataLabel;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setSocialDataLabel(string $socialDataLabel): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->socialDataLabel = $socialDataLabel;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function isVisible(string $field): bool
 | 
			
		||||
    {
 | 
			
		||||
        $property = $field.'Visible';
 | 
			
		||||
 | 
			
		||||
        if (!property_exists($this, $property)) {
 | 
			
		||||
            throw new \InvalidArgumentException('Field "'.$field.'" not found');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return self::FIELD_INVISIBLE !== $this->$property;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function isRequired(string $field): bool
 | 
			
		||||
    {
 | 
			
		||||
        $property = $field.'Visible';
 | 
			
		||||
 | 
			
		||||
        if (!property_exists($this, $property)) {
 | 
			
		||||
            throw new \InvalidArgumentException('Field "'.$field.'" not found');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return self::FIELD_REQUIRED === $this->$property;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getLabel(string $field): ?string
 | 
			
		||||
    {
 | 
			
		||||
        $property = $field.'Label';
 | 
			
		||||
 | 
			
		||||
        if (!property_exists($this, $property)) {
 | 
			
		||||
            throw new \InvalidArgumentException('Field "'.$field.'" not found');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $this->$property;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getOrdering(): float
 | 
			
		||||
    {
 | 
			
		||||
        return $this->ordering;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setOrdering(float $ordering): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->ordering = $ordering;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getSocialIssuesVisible(): ?int
 | 
			
		||||
    {
 | 
			
		||||
        return $this->socialIssuesVisible;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setSocialIssuesVisible(int $socialIssuesVisible): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->socialIssuesVisible = $socialIssuesVisible;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getSocialIssuesLabel(): ?string
 | 
			
		||||
    {
 | 
			
		||||
        return $this->socialIssuesLabel;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setSocialIssuesLabel(string $socialIssuesLabel): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->socialIssuesLabel = $socialIssuesLabel;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getSocialActionsVisible(): ?int
 | 
			
		||||
    {
 | 
			
		||||
        return $this->socialActionsVisible;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setSocialActionsVisible(int $socialActionsVisible): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->socialActionsVisible = $socialActionsVisible;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getSocialActionsLabel(): ?string
 | 
			
		||||
    {
 | 
			
		||||
        return $this->socialActionsLabel;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setSocialActionsLabel(string $socialActionsLabel): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->socialActionsLabel = $socialActionsLabel;
 | 
			
		||||
    /**
 | 
			
		||||
     * Set name.
 | 
			
		||||
     *
 | 
			
		||||
     * @param array $name
 | 
			
		||||
     *
 | 
			
		||||
     * @return ActivityType
 | 
			
		||||
     */
 | 
			
		||||
    public function setName($name)
 | 
			
		||||
    {
 | 
			
		||||
        $this->name = $name;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,123 +0,0 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2015, Champs Libres Cooperative SCRLFS, <http://www.champs-libres.coop>
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 *  it under the terms of the GNU Affero General Public License as
 | 
			
		||||
 * published by the Free Software Foundation, either version 3 of the
 | 
			
		||||
 *  License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Entity;
 | 
			
		||||
 | 
			
		||||
use Doctrine\ORM\Mapping as ORM;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class ActivityTypeCateogry
 | 
			
		||||
 *
 | 
			
		||||
 * @package Chill\ActivityBundle\Entity
 | 
			
		||||
 * @ORM\Entity()
 | 
			
		||||
 * @ORM\Table(name="activitytypecategory")
 | 
			
		||||
 * @ORM\HasLifecycleCallbacks()
 | 
			
		||||
 */
 | 
			
		||||
class ActivityTypeCategory
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Id
 | 
			
		||||
     * @ORM\Column(name="id", type="integer")
 | 
			
		||||
     * @ORM\GeneratedValue(strategy="AUTO")
 | 
			
		||||
     */
 | 
			
		||||
    private ?int $id;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="json_array")
 | 
			
		||||
     */
 | 
			
		||||
    private array $name = [];
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="boolean")
 | 
			
		||||
     */
 | 
			
		||||
    private bool $active = true;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\Column(type="float", options={"default"="0.0"})
 | 
			
		||||
     */
 | 
			
		||||
    private float $ordering = 0.0;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get id
 | 
			
		||||
     */
 | 
			
		||||
    public function getId(): int
 | 
			
		||||
    {
 | 
			
		||||
        return $this->id;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Set name
 | 
			
		||||
     */
 | 
			
		||||
    public function setName(array $name): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->name = $name;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get name
 | 
			
		||||
     */
 | 
			
		||||
    public function getName(): array
 | 
			
		||||
    {
 | 
			
		||||
        return $this->name;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get active
 | 
			
		||||
     * return true if the category type is active.
 | 
			
		||||
     */
 | 
			
		||||
    public function getActive(): bool
 | 
			
		||||
    {
 | 
			
		||||
        return $this->active;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Is active
 | 
			
		||||
     * return true if the category type is active
 | 
			
		||||
     */
 | 
			
		||||
    public function isActive(): bool
 | 
			
		||||
    {
 | 
			
		||||
        return $this->getActive();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Set active
 | 
			
		||||
     * set to true if the category type is active
 | 
			
		||||
     */
 | 
			
		||||
    public function setActive(bool $active): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->active = $active;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getOrdering(): float
 | 
			
		||||
    {
 | 
			
		||||
        return $this->ordering;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setOrdering(float $ordering): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->ordering = $ordering;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,107 +1,103 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2016 Champs-Libres <info@champs-libres.coop>
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
 * the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Export\Aggregator;
 | 
			
		||||
 | 
			
		||||
use Symfony\Component\Form\FormBuilderInterface;
 | 
			
		||||
use Doctrine\ORM\QueryBuilder;
 | 
			
		||||
use Chill\MainBundle\Export\AggregatorInterface;
 | 
			
		||||
use Symfony\Component\Security\Core\Role\Role;
 | 
			
		||||
use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter;
 | 
			
		||||
use Doctrine\ORM\EntityRepository;
 | 
			
		||||
use Chill\MainBundle\Templating\TranslatableStringHelper;
 | 
			
		||||
use Doctrine\ORM\Query\Expr\Join;
 | 
			
		||||
use Chill\MainBundle\Export\AggregatorInterface;
 | 
			
		||||
use Chill\MainBundle\Export\ExportElementValidatedInterface;
 | 
			
		||||
use Symfony\Component\Validator\Context\ExecutionContextInterface;
 | 
			
		||||
use Chill\MainBundle\Templating\TranslatableStringHelper;
 | 
			
		||||
use Doctrine\ORM\EntityRepository;
 | 
			
		||||
use Doctrine\ORM\Query\Expr\Join;
 | 
			
		||||
use Doctrine\ORM\QueryBuilder;
 | 
			
		||||
use RuntimeException;
 | 
			
		||||
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
 | 
			
		||||
use Symfony\Component\Form\FormBuilderInterface;
 | 
			
		||||
use Symfony\Component\Security\Core\Role\Role;
 | 
			
		||||
use Symfony\Component\Validator\Context\ExecutionContextInterface;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 * @author Julien Fastré <julien.fastre@champs-libres.coop>
 | 
			
		||||
 */
 | 
			
		||||
class ActivityReasonAggregator implements AggregatorInterface,
 | 
			
		||||
use function array_key_exists;
 | 
			
		||||
use function count;
 | 
			
		||||
 | 
			
		||||
class ActivityReasonAggregator implements
 | 
			
		||||
    AggregatorInterface,
 | 
			
		||||
    ExportElementValidatedInterface
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     *
 | 
			
		||||
     * @var EntityRepository
 | 
			
		||||
     */
 | 
			
		||||
    protected $categoryRepository;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     *
 | 
			
		||||
     * @var EntityRepository
 | 
			
		||||
     */
 | 
			
		||||
    protected $reasonRepository;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     *
 | 
			
		||||
     * @var TranslatableStringHelper
 | 
			
		||||
     */
 | 
			
		||||
    protected $stringHelper;
 | 
			
		||||
 | 
			
		||||
    public function __construct(
 | 
			
		||||
            EntityRepository $categoryRepository,
 | 
			
		||||
            EntityRepository $reasonRepository,
 | 
			
		||||
            TranslatableStringHelper $stringHelper
 | 
			
		||||
        EntityRepository $categoryRepository,
 | 
			
		||||
        EntityRepository $reasonRepository,
 | 
			
		||||
        TranslatableStringHelper $stringHelper
 | 
			
		||||
    ) {
 | 
			
		||||
        $this->categoryRepository = $categoryRepository;
 | 
			
		||||
        $this->reasonRepository   = $reasonRepository;
 | 
			
		||||
        $this->stringHelper       = $stringHelper;
 | 
			
		||||
        $this->reasonRepository = $reasonRepository;
 | 
			
		||||
        $this->stringHelper = $stringHelper;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function addRole()
 | 
			
		||||
    {
 | 
			
		||||
        return new Role(ActivityStatsVoter::STATS);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function alterQuery(QueryBuilder $qb, $data)
 | 
			
		||||
    {
 | 
			
		||||
        // add select element
 | 
			
		||||
        if ($data['level'] === 'reasons') {
 | 
			
		||||
        if ('reasons' === $data['level']) {
 | 
			
		||||
            $elem = 'reasons.id';
 | 
			
		||||
            $alias = 'activity_reasons_id';
 | 
			
		||||
        } elseif ($data['level'] === 'categories') {
 | 
			
		||||
        } elseif ('categories' === $data['level']) {
 | 
			
		||||
            $elem = 'category.id';
 | 
			
		||||
            $alias = 'activity_categories_id';
 | 
			
		||||
        } else {
 | 
			
		||||
            throw new \RuntimeException('the data provided are not recognized');
 | 
			
		||||
            throw new RuntimeException('the data provided are not recognized');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $qb->addSelect($elem.' as '.$alias);
 | 
			
		||||
        $qb->addSelect($elem . ' as ' . $alias);
 | 
			
		||||
 | 
			
		||||
        // make a jointure only if needed
 | 
			
		||||
        $join = $qb->getDQLPart('join');
 | 
			
		||||
 | 
			
		||||
        if (
 | 
			
		||||
            (array_key_exists('activity', $join)
 | 
			
		||||
            &&
 | 
			
		||||
            !$this->checkJoinAlreadyDefined($join['activity'], 'reasons')
 | 
			
		||||
            (
 | 
			
		||||
                array_key_exists('activity', $join)
 | 
			
		||||
            && !$this->checkJoinAlreadyDefined($join['activity'], 'reasons')
 | 
			
		||||
            )
 | 
			
		||||
            OR
 | 
			
		||||
            (! array_key_exists('activity', $join))
 | 
			
		||||
            || (!array_key_exists('activity', $join))
 | 
			
		||||
        ) {
 | 
			
		||||
            $qb->add(
 | 
			
		||||
                    'join',
 | 
			
		||||
                    array('activity' =>
 | 
			
		||||
                        new Join(Join::INNER_JOIN, 'activity.reasons', 'reasons')
 | 
			
		||||
                        ),
 | 
			
		||||
                    true);
 | 
			
		||||
                'join',
 | 
			
		||||
                ['activity' => new Join(Join::INNER_JOIN, 'activity.reasons', 'reasons'),
 | 
			
		||||
                ],
 | 
			
		||||
                true
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // join category if necessary
 | 
			
		||||
        if ($alias === 'activity_categories_id') {
 | 
			
		||||
        if ('activity_categories_id' === $alias) {
 | 
			
		||||
            // add join only if needed
 | 
			
		||||
            if (!$this->checkJoinAlreadyDefined($qb->getDQLPart('join')['activity'], 'category')) {
 | 
			
		||||
                $qb->join('reasons.category', 'category');
 | 
			
		||||
@@ -118,12 +114,107 @@ class ActivityReasonAggregator implements AggregatorInterface,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function applyOn()
 | 
			
		||||
    {
 | 
			
		||||
        return 'activity';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function buildForm(FormBuilderInterface $builder)
 | 
			
		||||
    {
 | 
			
		||||
        $builder->add('level', ChoiceType::class, [
 | 
			
		||||
            'choices' => [
 | 
			
		||||
                'By reason' => 'reasons',
 | 
			
		||||
                'By category of reason' => 'categories',
 | 
			
		||||
            ],
 | 
			
		||||
            'multiple' => false,
 | 
			
		||||
            'expanded' => true,
 | 
			
		||||
            'label' => 'Reason\'s level',
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getLabels($key, array $values, $data)
 | 
			
		||||
    {
 | 
			
		||||
        // for performance reason, we load data from db only once
 | 
			
		||||
        switch ($data['level']) {
 | 
			
		||||
            case 'reasons':
 | 
			
		||||
                $this->reasonRepository->findBy(['id' => $values]);
 | 
			
		||||
 | 
			
		||||
                break;
 | 
			
		||||
            case 'categories':
 | 
			
		||||
                $this->categoryRepository->findBy(['id' => $values]);
 | 
			
		||||
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            default:
 | 
			
		||||
                throw new RuntimeException(sprintf(
 | 
			
		||||
                    "the level data '%s' is invalid",
 | 
			
		||||
                    $data['level']
 | 
			
		||||
                ));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return function ($value) use ($data) {
 | 
			
		||||
            if ('_header' === $value) {
 | 
			
		||||
                return 'reasons' === $data['level'] ?
 | 
			
		||||
                        'Group by reasons'
 | 
			
		||||
                        :
 | 
			
		||||
                        'Group by categories of reason';
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            switch ($data['level']) {
 | 
			
		||||
                case 'reasons':
 | 
			
		||||
                    /** @var \Chill\ActivityBundle\Entity\ActivityReason $r */
 | 
			
		||||
                    $r = $this->reasonRepository->find($value);
 | 
			
		||||
 | 
			
		||||
                    return $this->stringHelper->localize($r->getCategory()->getName())
 | 
			
		||||
                            . ' > '
 | 
			
		||||
                            . $this->stringHelper->localize($r->getName());
 | 
			
		||||
 | 
			
		||||
                    break;
 | 
			
		||||
                case 'categories':
 | 
			
		||||
                    $c = $this->categoryRepository->find($value);
 | 
			
		||||
 | 
			
		||||
                    return $this->stringHelper->localize($c->getName());
 | 
			
		||||
 | 
			
		||||
                    break;
 | 
			
		||||
                // no need for a default : the default was already set above
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getQueryKeys($data)
 | 
			
		||||
    {
 | 
			
		||||
        // add select element
 | 
			
		||||
        if ('reasons' === $data['level']) {
 | 
			
		||||
            return ['activity_reasons_id'];
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ('categories' === $data['level']) {
 | 
			
		||||
            return ['activity_categories_id'];
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        throw new RuntimeException('the data provided are not recognised');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getTitle()
 | 
			
		||||
    {
 | 
			
		||||
        return 'Aggregate by activity reason';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function validateForm($data, ExecutionContextInterface $context)
 | 
			
		||||
    {
 | 
			
		||||
        if (null === $data['level']) {
 | 
			
		||||
            $context->buildViolation("The reasons's level should not be empty")
 | 
			
		||||
                ->addViolation();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Check if a join between Activity and another alias
 | 
			
		||||
     * Check if a join between Activity and another alias.
 | 
			
		||||
     *
 | 
			
		||||
     * @param Join[] $joins
 | 
			
		||||
     * @param string $alias the alias to search for
 | 
			
		||||
     * @return boolean
 | 
			
		||||
     *
 | 
			
		||||
     * @return bool
 | 
			
		||||
     */
 | 
			
		||||
    private function checkJoinAlreadyDefined(array $joins, $alias)
 | 
			
		||||
    {
 | 
			
		||||
@@ -135,99 +226,4 @@ class ActivityReasonAggregator implements AggregatorInterface,
 | 
			
		||||
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function applyOn()
 | 
			
		||||
    {
 | 
			
		||||
        return 'activity';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function buildForm(FormBuilderInterface $builder)
 | 
			
		||||
    {
 | 
			
		||||
        $builder->add('level', ChoiceType::class, array(
 | 
			
		||||
            'choices' => array(
 | 
			
		||||
                'By reason'             => 'reasons',
 | 
			
		||||
                'By category of reason' => 'categories'
 | 
			
		||||
            ),
 | 
			
		||||
            'multiple' => false,
 | 
			
		||||
            'expanded' => true,
 | 
			
		||||
            'label' => 'Reason\'s level'
 | 
			
		||||
        ));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function validateForm($data, ExecutionContextInterface $context)
 | 
			
		||||
    {
 | 
			
		||||
        if ($data['level'] === null) {
 | 
			
		||||
            $context->buildViolation("The reasons's level should not be empty")
 | 
			
		||||
                ->addViolation();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        public function getTitle()
 | 
			
		||||
    {
 | 
			
		||||
        return "Aggregate by activity reason";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function addRole()
 | 
			
		||||
    {
 | 
			
		||||
        return new Role(ActivityStatsVoter::STATS);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getLabels($key, array $values, $data)
 | 
			
		||||
    {
 | 
			
		||||
        // for performance reason, we load data from db only once
 | 
			
		||||
        switch ($data['level']) {
 | 
			
		||||
            case 'reasons':
 | 
			
		||||
                $this->reasonRepository->findBy(array('id' => $values));
 | 
			
		||||
                break;
 | 
			
		||||
            case 'categories':
 | 
			
		||||
                $this->categoryRepository->findBy(array('id' => $values));
 | 
			
		||||
                break;
 | 
			
		||||
            default:
 | 
			
		||||
                throw new \RuntimeException(sprintf("the level data '%s' is invalid",
 | 
			
		||||
                            $data['level']));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return function($value) use ($data) {
 | 
			
		||||
            if ($value === '_header') {
 | 
			
		||||
                return $data['level'] === 'reasons' ?
 | 
			
		||||
                        'Group by reasons'
 | 
			
		||||
                        :
 | 
			
		||||
                        'Group by categories of reason'
 | 
			
		||||
                        ;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            switch ($data['level']) {
 | 
			
		||||
                case 'reasons':
 | 
			
		||||
                    /* @var $r \Chill\ActivityBundle\Entity\ActivityReason */
 | 
			
		||||
                    $r = $this->reasonRepository->find($value);
 | 
			
		||||
 | 
			
		||||
                    return $this->stringHelper->localize($r->getCategory()->getName())
 | 
			
		||||
                            ." > "
 | 
			
		||||
                            . $this->stringHelper->localize($r->getName());
 | 
			
		||||
                        ;
 | 
			
		||||
                    break;
 | 
			
		||||
                case 'categories':
 | 
			
		||||
                    $c = $this->categoryRepository->find($value);
 | 
			
		||||
 | 
			
		||||
                    return $this->stringHelper->localize($c->getName());
 | 
			
		||||
                    break;
 | 
			
		||||
                // no need for a default : the default was already set above
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getQueryKeys($data)
 | 
			
		||||
    {
 | 
			
		||||
        // add select element
 | 
			
		||||
        if ($data['level'] === 'reasons') {
 | 
			
		||||
            return array('activity_reasons_id');
 | 
			
		||||
        } elseif ($data['level'] === 'categories') {
 | 
			
		||||
            return array ('activity_categories_id');
 | 
			
		||||
        } else {
 | 
			
		||||
            throw new \RuntimeException('the data provided are not recognised');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,89 +1,62 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2016 Champs-Libres <info@champs-libres.coop>
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
 * the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Export\Aggregator;
 | 
			
		||||
 | 
			
		||||
use Symfony\Component\Form\FormBuilderInterface;
 | 
			
		||||
use Doctrine\ORM\QueryBuilder;
 | 
			
		||||
use Chill\MainBundle\Export\AggregatorInterface;
 | 
			
		||||
use Symfony\Component\Security\Core\Role\Role;
 | 
			
		||||
use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter;
 | 
			
		||||
use Doctrine\ORM\EntityRepository;
 | 
			
		||||
use Chill\MainBundle\Export\AggregatorInterface;
 | 
			
		||||
use Chill\MainBundle\Templating\TranslatableStringHelper;
 | 
			
		||||
use Doctrine\ORM\EntityRepository;
 | 
			
		||||
use Doctrine\ORM\Query\Expr\Join;
 | 
			
		||||
use Doctrine\ORM\QueryBuilder;
 | 
			
		||||
use Symfony\Component\Form\FormBuilderInterface;
 | 
			
		||||
use Symfony\Component\Security\Core\Role\Role;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 
 | 
			
		||||
 *
 | 
			
		||||
 * @author Julien Fastré <julien.fastre@champs-libres.coop>
 | 
			
		||||
 */
 | 
			
		||||
class ActivityTypeAggregator implements AggregatorInterface
 | 
			
		||||
{
 | 
			
		||||
    
 | 
			
		||||
    public const KEY = 'activity_type_aggregator';
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     *
 | 
			
		||||
     * @var EntityRepository
 | 
			
		||||
     */
 | 
			
		||||
    protected $typeRepository;
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     *
 | 
			
		||||
     * @var TranslatableStringHelper
 | 
			
		||||
     */
 | 
			
		||||
    protected $stringHelper;
 | 
			
		||||
    
 | 
			
		||||
    const KEY = 'activity_type_aggregator';
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @var EntityRepository
 | 
			
		||||
     */
 | 
			
		||||
    protected $typeRepository;
 | 
			
		||||
 | 
			
		||||
    public function __construct(
 | 
			
		||||
            EntityRepository $typeRepository,
 | 
			
		||||
            TranslatableStringHelper $stringHelper
 | 
			
		||||
        EntityRepository $typeRepository,
 | 
			
		||||
        TranslatableStringHelper $stringHelper
 | 
			
		||||
    ) {
 | 
			
		||||
        $this->typeRepository     = $typeRepository;
 | 
			
		||||
        $this->stringHelper       = $stringHelper;
 | 
			
		||||
        $this->typeRepository = $typeRepository;
 | 
			
		||||
        $this->stringHelper = $stringHelper;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    public function addRole()
 | 
			
		||||
    {
 | 
			
		||||
        return new Role(ActivityStatsVoter::STATS);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function alterQuery(QueryBuilder $qb, $data)
 | 
			
		||||
    {
 | 
			
		||||
        // add select element    
 | 
			
		||||
        // add select element
 | 
			
		||||
        $qb->addSelect(sprintf('IDENTITY(activity.type) AS %s', self::KEY));
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        // add the "group by" part
 | 
			
		||||
        $groupBy = $qb->addGroupBy(self::KEY);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * Check if a join between Activity and another alias
 | 
			
		||||
     * 
 | 
			
		||||
     * @param Join[] $joins
 | 
			
		||||
     * @param string $alias the alias to search for
 | 
			
		||||
     * @return boolean
 | 
			
		||||
     */
 | 
			
		||||
    private function checkJoinAlreadyDefined(array $joins, $alias)
 | 
			
		||||
    {
 | 
			
		||||
        foreach ($joins as $join) {
 | 
			
		||||
            if ($join->getAlias() === $alias) {
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function applyOn()
 | 
			
		||||
    {
 | 
			
		||||
@@ -95,37 +68,49 @@ class ActivityTypeAggregator implements AggregatorInterface
 | 
			
		||||
        // no form required for this aggregator
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getTitle()
 | 
			
		||||
    {
 | 
			
		||||
        return "Aggregate by activity type";
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public function addRole()
 | 
			
		||||
    {
 | 
			
		||||
        return new Role(ActivityStatsVoter::STATS);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getLabels($key, array $values, $data)
 | 
			
		||||
    {
 | 
			
		||||
        // for performance reason, we load data from db only once
 | 
			
		||||
        $this->typeRepository->findBy(array('id' => $values));
 | 
			
		||||
        
 | 
			
		||||
        return function($value) use ($data) {
 | 
			
		||||
            if ($value === '_header') {
 | 
			
		||||
        $this->typeRepository->findBy(['id' => $values]);
 | 
			
		||||
 | 
			
		||||
        return function ($value) {
 | 
			
		||||
            if ('_header' === $value) {
 | 
			
		||||
                return 'Activity type';
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            /* @var $r \Chill\ActivityBundle\Entity\ActivityType */
 | 
			
		||||
            /** @var \Chill\ActivityBundle\Entity\ActivityType $r */
 | 
			
		||||
            $t = $this->typeRepository->find($value);
 | 
			
		||||
 | 
			
		||||
            return $this->stringHelper->localize($t->getName());
 | 
			
		||||
        };
 | 
			
		||||
        
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getQueryKeys($data)
 | 
			
		||||
    {
 | 
			
		||||
        return array(self::KEY);
 | 
			
		||||
        return [self::KEY];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getTitle()
 | 
			
		||||
    {
 | 
			
		||||
        return 'Aggregate by activity type';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Check if a join between Activity and another alias.
 | 
			
		||||
     *
 | 
			
		||||
     * @param Join[] $joins
 | 
			
		||||
     * @param string $alias the alias to search for
 | 
			
		||||
     *
 | 
			
		||||
     * @return bool
 | 
			
		||||
     */
 | 
			
		||||
    private function checkJoinAlreadyDefined(array $joins, $alias)
 | 
			
		||||
    {
 | 
			
		||||
        foreach ($joins as $join) {
 | 
			
		||||
            if ($join->getAlias() === $alias) {
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,51 +1,41 @@
 | 
			
		||||
<?php
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2019 Champs Libres Cooperative <info@champs-libres.coop>
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
 * the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
namespace Chill\ActivityBundle\Export\Aggregator;
 | 
			
		||||
 | 
			
		||||
use Symfony\Component\Form\FormBuilderInterface;
 | 
			
		||||
use Doctrine\ORM\QueryBuilder;
 | 
			
		||||
use Chill\MainBundle\Export\AggregatorInterface;
 | 
			
		||||
use Symfony\Component\Security\Core\Role\Role;
 | 
			
		||||
use Doctrine\ORM\Query\Expr\Join;
 | 
			
		||||
use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter;
 | 
			
		||||
use Doctrine\ORM\EntityManagerInterface;
 | 
			
		||||
use Chill\MainBundle\Entity\User;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Julien Fastré <julien.fastre@champs-libres.coop>
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Export\Aggregator;
 | 
			
		||||
 | 
			
		||||
use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter;
 | 
			
		||||
use Chill\MainBundle\Entity\User;
 | 
			
		||||
use Chill\MainBundle\Export\AggregatorInterface;
 | 
			
		||||
use Closure;
 | 
			
		||||
use Doctrine\ORM\EntityManagerInterface;
 | 
			
		||||
use Doctrine\ORM\QueryBuilder;
 | 
			
		||||
use Symfony\Component\Form\FormBuilderInterface;
 | 
			
		||||
use Symfony\Component\Security\Core\Role\Role;
 | 
			
		||||
 | 
			
		||||
class ActivityUserAggregator implements AggregatorInterface
 | 
			
		||||
{
 | 
			
		||||
    public const KEY = 'activity_user_id';
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     *
 | 
			
		||||
     * @var EntityManagerInterface
 | 
			
		||||
     */
 | 
			
		||||
    protected $em;
 | 
			
		||||
    
 | 
			
		||||
    const KEY = 'activity_user_id';
 | 
			
		||||
    
 | 
			
		||||
    function __construct(EntityManagerInterface $em)
 | 
			
		||||
 | 
			
		||||
    public function __construct(EntityManagerInterface $em)
 | 
			
		||||
    {
 | 
			
		||||
        $this->em = $em;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    public function addRole()
 | 
			
		||||
    {
 | 
			
		||||
        return new Role(ActivityStatsVoter::STATS);
 | 
			
		||||
@@ -53,9 +43,9 @@ class ActivityUserAggregator implements AggregatorInterface
 | 
			
		||||
 | 
			
		||||
    public function alterQuery(QueryBuilder $qb, $data)
 | 
			
		||||
    {
 | 
			
		||||
        // add select element    
 | 
			
		||||
        // add select element
 | 
			
		||||
        $qb->addSelect(sprintf('IDENTITY(activity.user) AS %s', self::KEY));
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        // add the "group by" part
 | 
			
		||||
        $qb->addGroupBy(self::KEY);
 | 
			
		||||
    }
 | 
			
		||||
@@ -70,16 +60,17 @@ class ActivityUserAggregator implements AggregatorInterface
 | 
			
		||||
        // nothing to add
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getLabels($key, $values, $data): \Closure
 | 
			
		||||
    public function getLabels($key, $values, $data): Closure
 | 
			
		||||
    {
 | 
			
		||||
        // preload users at once
 | 
			
		||||
        $this->em->getRepository(User::class)
 | 
			
		||||
            ->findBy(['id' => $values]);
 | 
			
		||||
        
 | 
			
		||||
        return function($value) {
 | 
			
		||||
 | 
			
		||||
        return function ($value) {
 | 
			
		||||
            switch ($value) {
 | 
			
		||||
                case '_header':
 | 
			
		||||
                    return 'activity user';
 | 
			
		||||
 | 
			
		||||
                default:
 | 
			
		||||
                    return $this->em->getRepository(User::class)->find($value)
 | 
			
		||||
                        ->getUsername();
 | 
			
		||||
@@ -89,11 +80,11 @@ class ActivityUserAggregator implements AggregatorInterface
 | 
			
		||||
 | 
			
		||||
    public function getQueryKeys($data)
 | 
			
		||||
    {
 | 
			
		||||
        return [ self::KEY ];
 | 
			
		||||
        return [self::KEY];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getTitle(): string
 | 
			
		||||
    {
 | 
			
		||||
        return "Aggregate by activity user";
 | 
			
		||||
        return 'Aggregate by activity user';
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,121 +1,69 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2015 Champs-Libres <info@champs-libres.coop>
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
 * the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Export\Export;
 | 
			
		||||
 | 
			
		||||
use Chill\MainBundle\Export\ExportInterface;
 | 
			
		||||
use Doctrine\ORM\QueryBuilder;
 | 
			
		||||
use Symfony\Component\Security\Core\Role\Role;
 | 
			
		||||
use Doctrine\ORM\Query;
 | 
			
		||||
use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter;
 | 
			
		||||
use Chill\MainBundle\Export\ExportInterface;
 | 
			
		||||
use Doctrine\ORM\EntityManagerInterface;
 | 
			
		||||
use Doctrine\ORM\Query;
 | 
			
		||||
use LogicException;
 | 
			
		||||
use Symfony\Component\Security\Core\Role\Role;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 * @author Julien Fastré <julien.fastre@champs-libres.coop>
 | 
			
		||||
 */
 | 
			
		||||
class CountActivity implements ExportInterface
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     *
 | 
			
		||||
     * @var EntityManagerInterface
 | 
			
		||||
     */
 | 
			
		||||
    protected $entityManager;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    public function __construct(
 | 
			
		||||
            EntityManagerInterface $em
 | 
			
		||||
            )
 | 
			
		||||
    {
 | 
			
		||||
        EntityManagerInterface $em
 | 
			
		||||
    ) {
 | 
			
		||||
        $this->entityManager = $em;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    public function buildForm(\Symfony\Component\Form\FormBuilderInterface $builder)
 | 
			
		||||
    {
 | 
			
		||||
        
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getDescription()
 | 
			
		||||
    {
 | 
			
		||||
        return "Count activities by various parameters.";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getTitle()
 | 
			
		||||
    {
 | 
			
		||||
        return "Count activities";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getType()
 | 
			
		||||
    {
 | 
			
		||||
        return 'activity';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function initiateQuery(array $requiredModifiers,  array $acl, array $data = array())
 | 
			
		||||
    {
 | 
			
		||||
        $qb = $this->entityManager->createQueryBuilder();
 | 
			
		||||
        $centers = array_map(function($el) { return $el['center']; }, $acl);
 | 
			
		||||
        
 | 
			
		||||
        $qb->select('COUNT(activity.id) as export_count_activity')
 | 
			
		||||
                ->from('ChillActivityBundle:Activity', 'activity')
 | 
			
		||||
                ->join('activity.person', 'person')
 | 
			
		||||
                ;
 | 
			
		||||
        
 | 
			
		||||
        $qb->where($qb->expr()->in('person.center', ':centers'))
 | 
			
		||||
            ->setParameter('centers', $centers)
 | 
			
		||||
            ;
 | 
			
		||||
        
 | 
			
		||||
        return $qb;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public function supportsModifiers()
 | 
			
		||||
    {
 | 
			
		||||
        return array('person', 'activity');
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public function requiredRole()
 | 
			
		||||
    {
 | 
			
		||||
        return new Role(ActivityStatsVoter::STATS);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getAllowedFormattersTypes()
 | 
			
		||||
    {
 | 
			
		||||
        return array(\Chill\MainBundle\Export\FormatterInterface::TYPE_TABULAR);
 | 
			
		||||
        return [\Chill\MainBundle\Export\FormatterInterface::TYPE_TABULAR];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getDescription()
 | 
			
		||||
    {
 | 
			
		||||
        return 'Count activities by various parameters.';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getLabels($key, array $values, $data)
 | 
			
		||||
    {
 | 
			
		||||
        if ($key !== 'export_count_activity') {
 | 
			
		||||
            throw new \LogicException("the key $key is not used by this export");
 | 
			
		||||
        if ('export_count_activity' !== $key) {
 | 
			
		||||
            throw new LogicException("the key {$key} is not used by this export");
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        return function($value) {
 | 
			
		||||
            return $value === '_header' ? 
 | 
			
		||||
 | 
			
		||||
        return static function ($value) {
 | 
			
		||||
            return '_header' === $value ?
 | 
			
		||||
                    'Number of activities'
 | 
			
		||||
                    :
 | 
			
		||||
                    $value
 | 
			
		||||
                    ;
 | 
			
		||||
                    $value;
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getQueryKeys($data)
 | 
			
		||||
    {
 | 
			
		||||
        return array('export_count_activity');
 | 
			
		||||
        return ['export_count_activity'];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getResult($qb, $data)
 | 
			
		||||
@@ -123,4 +71,40 @@ class CountActivity implements ExportInterface
 | 
			
		||||
        return $qb->getQuery()->getResult(Query::HYDRATE_SCALAR);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getTitle()
 | 
			
		||||
    {
 | 
			
		||||
        return 'Count activities';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getType()
 | 
			
		||||
    {
 | 
			
		||||
        return 'activity';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function initiateQuery(array $requiredModifiers, array $acl, array $data = [])
 | 
			
		||||
    {
 | 
			
		||||
        $qb = $this->entityManager->createQueryBuilder();
 | 
			
		||||
        $centers = array_map(static function ($el) {
 | 
			
		||||
            return $el['center'];
 | 
			
		||||
        }, $acl);
 | 
			
		||||
 | 
			
		||||
        $qb->select('COUNT(activity.id) as export_count_activity')
 | 
			
		||||
            ->from('ChillActivityBundle:Activity', 'activity')
 | 
			
		||||
            ->join('activity.person', 'person');
 | 
			
		||||
 | 
			
		||||
        $qb->where($qb->expr()->in('person.center', ':centers'))
 | 
			
		||||
            ->setParameter('centers', $centers);
 | 
			
		||||
 | 
			
		||||
        return $qb;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function requiredRole()
 | 
			
		||||
    {
 | 
			
		||||
        return new Role(ActivityStatsVoter::STATS);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function supportsModifiers()
 | 
			
		||||
    {
 | 
			
		||||
        return ['person', 'activity'];
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,69 +1,48 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2017 Champs-Libres <info@champs-libres.coop>
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
 * the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Export\Export;
 | 
			
		||||
 | 
			
		||||
use Chill\MainBundle\Export\ListInterface;
 | 
			
		||||
use Chill\ActivityBundle\Entity\ActivityReason;
 | 
			
		||||
use Chill\MainBundle\Entity\User;
 | 
			
		||||
use Chill\MainBundle\Entity\Scope;
 | 
			
		||||
use Chill\ActivityBundle\Entity\ActivityType;
 | 
			
		||||
use Doctrine\ORM\Query\Expr;
 | 
			
		||||
use Chill\MainBundle\Templating\TranslatableStringHelper;
 | 
			
		||||
use Symfony\Component\Security\Core\Role\Role;
 | 
			
		||||
use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter;
 | 
			
		||||
use Symfony\Component\Form\FormBuilderInterface;
 | 
			
		||||
use Chill\MainBundle\Export\FormatterInterface;
 | 
			
		||||
use Chill\MainBundle\Export\ListInterface;
 | 
			
		||||
use Chill\MainBundle\Templating\TranslatableStringHelper;
 | 
			
		||||
use DateTime;
 | 
			
		||||
use Doctrine\ORM\EntityManagerInterface;
 | 
			
		||||
use Doctrine\ORM\Query;
 | 
			
		||||
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
 | 
			
		||||
use Symfony\Component\Form\FormBuilderInterface;
 | 
			
		||||
use Symfony\Component\Security\Core\Role\Role;
 | 
			
		||||
use Symfony\Component\Translation\TranslatorInterface;
 | 
			
		||||
use Symfony\Component\Validator\Constraints\Callback;
 | 
			
		||||
use Doctrine\ORM\Query;
 | 
			
		||||
use Chill\MainBundle\Export\FormatterInterface;
 | 
			
		||||
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
 | 
			
		||||
use Symfony\Component\Validator\Context\ExecutionContextInterface;
 | 
			
		||||
 | 
			
		||||
use function array_key_exists;
 | 
			
		||||
use function count;
 | 
			
		||||
use function in_array;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Create a list for all activities
 | 
			
		||||
 *
 | 
			
		||||
 * @author Julien Fastré <julien.fastre@champs-libres.coop>
 | 
			
		||||
 * Create a list for all activities.
 | 
			
		||||
 */
 | 
			
		||||
class ListActivity implements ListInterface
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     *
 | 
			
		||||
     * @var EntityManagerInterface
 | 
			
		||||
     */
 | 
			
		||||
    protected $entityManager;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     *
 | 
			
		||||
     * @var TranslatorInterface
 | 
			
		||||
     */
 | 
			
		||||
    protected $translator;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     *
 | 
			
		||||
     * @var TranslatableStringHelper
 | 
			
		||||
     */
 | 
			
		||||
    protected $translatableStringHelper;
 | 
			
		||||
 | 
			
		||||
    protected $fields = array(
 | 
			
		||||
    protected $fields = [
 | 
			
		||||
        'id',
 | 
			
		||||
        'date',
 | 
			
		||||
        'durationTime',
 | 
			
		||||
@@ -74,115 +53,132 @@ class ListActivity implements ListInterface
 | 
			
		||||
        'type_name',
 | 
			
		||||
        'person_firstname',
 | 
			
		||||
        'person_lastname',
 | 
			
		||||
        'person_id'
 | 
			
		||||
    );
 | 
			
		||||
        'person_id',
 | 
			
		||||
    ];
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @var TranslatableStringHelper
 | 
			
		||||
     */
 | 
			
		||||
    protected $translatableStringHelper;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @var TranslatorInterface
 | 
			
		||||
     */
 | 
			
		||||
    protected $translator;
 | 
			
		||||
 | 
			
		||||
    public function __construct(
 | 
			
		||||
            EntityManagerInterface $em,
 | 
			
		||||
            TranslatorInterface $translator,
 | 
			
		||||
            TranslatableStringHelper $translatableStringHelper
 | 
			
		||||
            )
 | 
			
		||||
    {
 | 
			
		||||
        EntityManagerInterface $em,
 | 
			
		||||
        TranslatorInterface $translator,
 | 
			
		||||
        TranslatableStringHelper $translatableStringHelper
 | 
			
		||||
    ) {
 | 
			
		||||
        $this->entityManager = $em;
 | 
			
		||||
        $this->translator = $translator;
 | 
			
		||||
        $this->translatableStringHelper = $translatableStringHelper;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * {@inheritDoc}
 | 
			
		||||
     *
 | 
			
		||||
     * @param FormBuilderInterface $builder
 | 
			
		||||
     * {@inheritdoc}
 | 
			
		||||
     */
 | 
			
		||||
    public function buildForm(FormBuilderInterface $builder)
 | 
			
		||||
    {
 | 
			
		||||
        $builder->add('fields', ChoiceType::class, array(
 | 
			
		||||
        $builder->add('fields', ChoiceType::class, [
 | 
			
		||||
            'multiple' => true,
 | 
			
		||||
            'expanded' => true,
 | 
			
		||||
            'choices' => array_combine($this->fields, $this->fields),
 | 
			
		||||
            'label'    => 'Fields to include in export',
 | 
			
		||||
            'constraints' => [new Callback(array(
 | 
			
		||||
                'callback' => function($selected, ExecutionContextInterface $context) {
 | 
			
		||||
            'label' => 'Fields to include in export',
 | 
			
		||||
            'constraints' => [new Callback([
 | 
			
		||||
                'callback' => static function ($selected, ExecutionContextInterface $context) {
 | 
			
		||||
                    if (count($selected) === 0) {
 | 
			
		||||
                        $context->buildViolation('You must select at least one element')
 | 
			
		||||
                            ->atPath('fields')
 | 
			
		||||
                            ->addViolation();
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            ))]
 | 
			
		||||
        ));
 | 
			
		||||
 | 
			
		||||
                },
 | 
			
		||||
            ])],
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * {@inheritDoc}
 | 
			
		||||
     * {@inheritdoc}
 | 
			
		||||
     *
 | 
			
		||||
     * @return type
 | 
			
		||||
     */
 | 
			
		||||
    public function getAllowedFormattersTypes()
 | 
			
		||||
    {
 | 
			
		||||
        return array(FormatterInterface::TYPE_LIST);
 | 
			
		||||
        return [FormatterInterface::TYPE_LIST];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getDescription()
 | 
			
		||||
    {
 | 
			
		||||
        return "List activities";
 | 
			
		||||
        return 'List activities';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getLabels($key, array $values, $data)
 | 
			
		||||
    {
 | 
			
		||||
        switch ($key)
 | 
			
		||||
        {
 | 
			
		||||
            case 'date' :
 | 
			
		||||
                return function($value) {
 | 
			
		||||
                    if ($value === '_header') return 'date';
 | 
			
		||||
        switch ($key) {
 | 
			
		||||
            case 'date':
 | 
			
		||||
                return static function ($value) {
 | 
			
		||||
                    if ('_header' === $value) {
 | 
			
		||||
                        return 'date';
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    $date = \DateTime::createFromFormat('Y-m-d H:i:s', $value);
 | 
			
		||||
                    $date = DateTime::createFromFormat('Y-m-d H:i:s', $value);
 | 
			
		||||
 | 
			
		||||
                    return $date->format('d-m-Y');
 | 
			
		||||
                };
 | 
			
		||||
            case 'attendee':
 | 
			
		||||
                return function($value) {
 | 
			
		||||
                    if ($value === '_header') return 'attendee';
 | 
			
		||||
                return static function ($value) {
 | 
			
		||||
                    if ('_header' === $value) {
 | 
			
		||||
                        return 'attendee';
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    return $value ? 1 : 0;
 | 
			
		||||
                };
 | 
			
		||||
            case 'list_reasons' :
 | 
			
		||||
                /* @var $activityReasonsRepository EntityRepository */
 | 
			
		||||
            case 'list_reasons':
 | 
			
		||||
                /** @var EntityRepository $activityReasonsRepository */
 | 
			
		||||
                $activityRepository = $this->entityManager
 | 
			
		||||
                    ->getRepository('ChillActivityBundle:Activity');
 | 
			
		||||
 | 
			
		||||
                return function($value) use ($activityRepository) {
 | 
			
		||||
                    if ($value === '_header') return 'activity reasons';
 | 
			
		||||
                return function ($value) use ($activityRepository) {
 | 
			
		||||
                    if ('_header' === $value) {
 | 
			
		||||
                        return 'activity reasons';
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    $activity = $activityRepository
 | 
			
		||||
                            ->find($value);
 | 
			
		||||
                        ->find($value);
 | 
			
		||||
 | 
			
		||||
                    return implode(", ", array_map(function(ActivityReason $r) {
 | 
			
		||||
 | 
			
		||||
                        return '"'.
 | 
			
		||||
                    return implode(', ', array_map(function (ActivityReason $r) {
 | 
			
		||||
                        return '"' .
 | 
			
		||||
                                $this->translatableStringHelper->localize($r->getCategory()->getName())
 | 
			
		||||
                                .' > '.
 | 
			
		||||
                                . ' > ' .
 | 
			
		||||
                                $this->translatableStringHelper->localize($r->getName())
 | 
			
		||||
                                .'"';
 | 
			
		||||
                                . '"';
 | 
			
		||||
                    }, $activity->getReasons()->toArray()));
 | 
			
		||||
                };
 | 
			
		||||
            case 'circle_name' :
 | 
			
		||||
                return function($value) {
 | 
			
		||||
                    if ($value === '_header') return 'circle';
 | 
			
		||||
            case 'circle_name':
 | 
			
		||||
                return function ($value) {
 | 
			
		||||
                    if ('_header' === $value) {
 | 
			
		||||
                        return 'circle';
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    return $this->translatableStringHelper
 | 
			
		||||
                            ->localize(json_decode($value, true));
 | 
			
		||||
                        ->localize(json_decode($value, true));
 | 
			
		||||
                };
 | 
			
		||||
            case 'type_name' :
 | 
			
		||||
                return function($value) {
 | 
			
		||||
                    if ($value === '_header') return 'activity type';
 | 
			
		||||
            case 'type_name':
 | 
			
		||||
                return function ($value) {
 | 
			
		||||
                    if ('_header' === $value) {
 | 
			
		||||
                        return 'activity type';
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    return $this->translatableStringHelper
 | 
			
		||||
                            ->localize(json_decode($value, true));
 | 
			
		||||
                        ->localize(json_decode($value, true));
 | 
			
		||||
                };
 | 
			
		||||
 | 
			
		||||
            default:
 | 
			
		||||
                return function($value) use ($key) {
 | 
			
		||||
                    if ($value === '_header') return $key;
 | 
			
		||||
                return static function ($value) use ($key) {
 | 
			
		||||
                    if ('_header' === $value) {
 | 
			
		||||
                        return $key;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    return $value;
 | 
			
		||||
                };
 | 
			
		||||
@@ -209,68 +205,76 @@ class ListActivity implements ListInterface
 | 
			
		||||
        return 'activity';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function initiateQuery(array $requiredModifiers, array $acl, array $data = array())
 | 
			
		||||
    public function initiateQuery(array $requiredModifiers, array $acl, array $data = [])
 | 
			
		||||
    {
 | 
			
		||||
        $centers = array_map(function($el) { return $el['center']; }, $acl);
 | 
			
		||||
        $centers = array_map(static function ($el) {
 | 
			
		||||
            return $el['center'];
 | 
			
		||||
        }, $acl);
 | 
			
		||||
 | 
			
		||||
        // throw an error if any fields are present
 | 
			
		||||
        if (!\array_key_exists('fields', $data)) {
 | 
			
		||||
            throw new \Doctrine\DBAL\Exception\InvalidArgumentException("any fields "
 | 
			
		||||
                . "have been checked");
 | 
			
		||||
        if (!array_key_exists('fields', $data)) {
 | 
			
		||||
            throw new \Doctrine\DBAL\Exception\InvalidArgumentException('any fields '
 | 
			
		||||
                . 'have been checked');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $qb = $this->entityManager->createQueryBuilder();
 | 
			
		||||
 | 
			
		||||
        $qb
 | 
			
		||||
                ->from('ChillActivityBundle:Activity', 'activity')
 | 
			
		||||
                ->join('activity.person', 'person')
 | 
			
		||||
                ->join('person.center', 'center')
 | 
			
		||||
                ->andWhere('center IN (:authorized_centers)')
 | 
			
		||||
                ->setParameter('authorized_centers', $centers);
 | 
			
		||||
                ;
 | 
			
		||||
            ->from('ChillActivityBundle:Activity', 'activity')
 | 
			
		||||
            ->join('activity.person', 'person')
 | 
			
		||||
            ->join('person.center', 'center')
 | 
			
		||||
            ->andWhere('center IN (:authorized_centers)')
 | 
			
		||||
            ->setParameter('authorized_centers', $centers);
 | 
			
		||||
 | 
			
		||||
        foreach ($this->fields as $f) {
 | 
			
		||||
            if (in_array($f, $data['fields'])) {
 | 
			
		||||
            if (in_array($f, $data['fields'], true)) {
 | 
			
		||||
                switch ($f) {
 | 
			
		||||
                    case 'id':
 | 
			
		||||
                        $qb->addSelect('activity.id AS id');
 | 
			
		||||
 | 
			
		||||
                        break;
 | 
			
		||||
                    case 'person_firstname':
 | 
			
		||||
                        $qb->addSelect('person.firstName AS person_firstname');
 | 
			
		||||
 | 
			
		||||
                        break;
 | 
			
		||||
                    case 'person_lastname':
 | 
			
		||||
                        $qb->addSelect('person.lastName AS person_lastname');
 | 
			
		||||
 | 
			
		||||
                        break;
 | 
			
		||||
                    case 'person_id':
 | 
			
		||||
                        $qb->addSelect('person.id AS person_id');
 | 
			
		||||
 | 
			
		||||
                        break;
 | 
			
		||||
                    case 'user_username':
 | 
			
		||||
                        $qb->join('activity.user', 'user');
 | 
			
		||||
                        $qb->addSelect('user.username AS user_username');
 | 
			
		||||
 | 
			
		||||
                        break;
 | 
			
		||||
                    case 'circle_name':
 | 
			
		||||
                        $qb->join('activity.scope', 'circle');
 | 
			
		||||
                        $qb->addSelect('circle.name AS circle_name');
 | 
			
		||||
 | 
			
		||||
                        break;
 | 
			
		||||
                    case 'type_name':
 | 
			
		||||
                        $qb->join('activity.type', 'type');
 | 
			
		||||
                        $qb->addSelect('type.name AS type_name');
 | 
			
		||||
 | 
			
		||||
                        break;
 | 
			
		||||
                    case 'list_reasons':
 | 
			
		||||
                        // this is a trick... The reasons is filled with the
 | 
			
		||||
                        // activity id which will be used to load reasons
 | 
			
		||||
                        $qb->addSelect('activity.id AS list_reasons');
 | 
			
		||||
 | 
			
		||||
                        break;
 | 
			
		||||
 | 
			
		||||
                    default:
 | 
			
		||||
                        $qb->addSelect(sprintf('activity.%s as %s', $f, $f));
 | 
			
		||||
 | 
			
		||||
                        break;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        return $qb;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -281,7 +285,6 @@ class ListActivity implements ListInterface
 | 
			
		||||
 | 
			
		||||
    public function supportsModifiers()
 | 
			
		||||
    {
 | 
			
		||||
        return array('activity', 'person');
 | 
			
		||||
        return ['activity', 'person'];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,154 +1,97 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2015 Champs-Libres <info@champs-libres.coop>
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
 * the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Export\Export;
 | 
			
		||||
 | 
			
		||||
use Chill\MainBundle\Export\ExportInterface;
 | 
			
		||||
use Doctrine\ORM\QueryBuilder;
 | 
			
		||||
use Symfony\Component\Security\Core\Role\Role;
 | 
			
		||||
use Doctrine\ORM\Query;
 | 
			
		||||
use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter;
 | 
			
		||||
use Chill\MainBundle\Export\ExportInterface;
 | 
			
		||||
use Doctrine\ORM\EntityManagerInterface;
 | 
			
		||||
use Doctrine\ORM\Query;
 | 
			
		||||
use LogicException;
 | 
			
		||||
use Symfony\Component\Security\Core\Role\Role;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This export allow to compute stats on activity duration.
 | 
			
		||||
 * 
 | 
			
		||||
 *
 | 
			
		||||
 * The desired stat must be given in constructor.
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 * @author Julien Fastré <julien.fastre@champs-libres.coop>
 | 
			
		||||
 */
 | 
			
		||||
class StatActivityDuration implements ExportInterface
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     *
 | 
			
		||||
     * @var EntityManagerInterface
 | 
			
		||||
     */
 | 
			
		||||
    protected $entityManager;
 | 
			
		||||
    
 | 
			
		||||
    const SUM = 'sum';
 | 
			
		||||
    
 | 
			
		||||
    public const SUM = 'sum';
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The action for this report.
 | 
			
		||||
     *
 | 
			
		||||
     * @var string
 | 
			
		||||
     */
 | 
			
		||||
    protected $action;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * constructor
 | 
			
		||||
     * 
 | 
			
		||||
     * @param EntityManagerInterface $em
 | 
			
		||||
     * @var EntityManagerInterface
 | 
			
		||||
     */
 | 
			
		||||
    protected $entityManager;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * constructor.
 | 
			
		||||
     *
 | 
			
		||||
     * @param string $action the stat to perform
 | 
			
		||||
     */
 | 
			
		||||
    public function __construct(
 | 
			
		||||
            EntityManagerInterface $em,
 | 
			
		||||
            $action = 'sum'
 | 
			
		||||
            )
 | 
			
		||||
    {
 | 
			
		||||
        EntityManagerInterface $em,
 | 
			
		||||
        $action = 'sum'
 | 
			
		||||
    ) {
 | 
			
		||||
        $this->entityManager = $em;
 | 
			
		||||
        $this->action = $action;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    public function buildForm(\Symfony\Component\Form\FormBuilderInterface $builder)
 | 
			
		||||
    {
 | 
			
		||||
        
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getDescription()
 | 
			
		||||
    {
 | 
			
		||||
        if ($this->action === self::SUM) {
 | 
			
		||||
            return "Sum activities duration by various parameters.";
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getTitle()
 | 
			
		||||
    {
 | 
			
		||||
        if ($this->action === self::SUM) {
 | 
			
		||||
            return "Sum activity duration";
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getType()
 | 
			
		||||
    {
 | 
			
		||||
        return 'activity';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function initiateQuery(array $requiredModifiers,  array $acl, array $data = array())
 | 
			
		||||
    {
 | 
			
		||||
        $centers = array_map(function($el) { return $el['center']; }, $acl);
 | 
			
		||||
        $qb = $this->entityManager->createQueryBuilder();
 | 
			
		||||
        
 | 
			
		||||
        if ($this->action === self::SUM) {
 | 
			
		||||
            $select = "SUM(activity.durationTime) AS export_stat_activity";
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        $qb->select($select)
 | 
			
		||||
                ->from('ChillActivityBundle:Activity', 'activity')
 | 
			
		||||
                ->join('activity.person',  'person')
 | 
			
		||||
                ->join('person.center', 'center')
 | 
			
		||||
                ->where($qb->expr()->in('center', ':centers'))
 | 
			
		||||
                ->setParameter(':centers', $centers)
 | 
			
		||||
                ;
 | 
			
		||||
        
 | 
			
		||||
        return $qb;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public function supportsModifiers()
 | 
			
		||||
    {
 | 
			
		||||
        return array('person', 'activity');
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public function requiredRole()
 | 
			
		||||
    {
 | 
			
		||||
        return new Role(ActivityStatsVoter::STATS);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getAllowedFormattersTypes()
 | 
			
		||||
    {
 | 
			
		||||
        return array(\Chill\MainBundle\Export\FormatterInterface::TYPE_TABULAR);
 | 
			
		||||
        return [\Chill\MainBundle\Export\FormatterInterface::TYPE_TABULAR];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getDescription()
 | 
			
		||||
    {
 | 
			
		||||
        if (self::SUM === $this->action) {
 | 
			
		||||
            return 'Sum activities duration by various parameters.';
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getLabels($key, array $values, $data)
 | 
			
		||||
    {
 | 
			
		||||
        if ($key !== 'export_stat_activity') {
 | 
			
		||||
            throw new \LogicException("the key $key is not used by this export");
 | 
			
		||||
        if ('export_stat_activity' !== $key) {
 | 
			
		||||
            throw new LogicException("the key {$key} is not used by this export");
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        switch ($this->action) {
 | 
			
		||||
            case self::SUM:
 | 
			
		||||
                $header = "Sum of activities  duration";
 | 
			
		||||
                $header = 'Sum of activities  duration';
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        return function($value) use ($header) {
 | 
			
		||||
            return $value === '_header' ? 
 | 
			
		||||
 | 
			
		||||
        return static function ($value) use ($header) {
 | 
			
		||||
            return '_header' === $value ?
 | 
			
		||||
                    $header
 | 
			
		||||
                    :
 | 
			
		||||
                    $value
 | 
			
		||||
                    ;
 | 
			
		||||
                    $value;
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getQueryKeys($data)
 | 
			
		||||
    {
 | 
			
		||||
        return array('export_stat_activity');
 | 
			
		||||
        return ['export_stat_activity'];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getResult($qb, $data)
 | 
			
		||||
@@ -156,4 +99,46 @@ class StatActivityDuration implements ExportInterface
 | 
			
		||||
        return $qb->getQuery()->getResult(Query::HYDRATE_SCALAR);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getTitle()
 | 
			
		||||
    {
 | 
			
		||||
        if (self::SUM === $this->action) {
 | 
			
		||||
            return 'Sum activity duration';
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getType()
 | 
			
		||||
    {
 | 
			
		||||
        return 'activity';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function initiateQuery(array $requiredModifiers, array $acl, array $data = [])
 | 
			
		||||
    {
 | 
			
		||||
        $centers = array_map(static function ($el) {
 | 
			
		||||
            return $el['center'];
 | 
			
		||||
        }, $acl);
 | 
			
		||||
        $qb = $this->entityManager->createQueryBuilder();
 | 
			
		||||
 | 
			
		||||
        if (self::SUM === $this->action) {
 | 
			
		||||
            $select = 'SUM(activity.durationTime) AS export_stat_activity';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $qb->select($select)
 | 
			
		||||
            ->from('ChillActivityBundle:Activity', 'activity')
 | 
			
		||||
            ->join('activity.person', 'person')
 | 
			
		||||
            ->join('person.center', 'center')
 | 
			
		||||
            ->where($qb->expr()->in('center', ':centers'))
 | 
			
		||||
            ->setParameter(':centers', $centers);
 | 
			
		||||
 | 
			
		||||
        return $qb;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function requiredRole()
 | 
			
		||||
    {
 | 
			
		||||
        return new Role(ActivityStatsVoter::STATS);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function supportsModifiers()
 | 
			
		||||
    {
 | 
			
		||||
        return ['person', 'activity'];
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,52 +1,40 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2017 Champs-Libres <info@champs-libres.coop>
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
 * the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Export\Filter;
 | 
			
		||||
 | 
			
		||||
use Chill\MainBundle\Export\FilterInterface;
 | 
			
		||||
use Symfony\Component\Form\FormEvent;
 | 
			
		||||
use Symfony\Component\Form\FormEvents;
 | 
			
		||||
use Chill\MainBundle\Form\Type\Export\FilterType;
 | 
			
		||||
use DateTime;
 | 
			
		||||
use Doctrine\ORM\Query\Expr;
 | 
			
		||||
use Symfony\Component\Form\Extension\Core\Type\DateType;
 | 
			
		||||
use Symfony\Component\Form\FormError;
 | 
			
		||||
use Chill\MainBundle\Form\Type\Export\FilterType;
 | 
			
		||||
use Doctrine\ORM\Query\Expr;
 | 
			
		||||
use Symfony\Component\Form\FormEvent;
 | 
			
		||||
use Symfony\Component\Form\FormEvents;
 | 
			
		||||
use Symfony\Component\Translation\TranslatorInterface;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 
 | 
			
		||||
 *
 | 
			
		||||
 * @author Julien Fastré <julien.fastre@champs-libres.coop>
 | 
			
		||||
 */
 | 
			
		||||
class ActivityDateFilter implements FilterInterface
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     *
 | 
			
		||||
     * @var TranslatorInterface
 | 
			
		||||
     */
 | 
			
		||||
    protected $translator;
 | 
			
		||||
    
 | 
			
		||||
    function __construct(TranslatorInterface $translator)
 | 
			
		||||
 | 
			
		||||
    public function __construct(TranslatorInterface $translator)
 | 
			
		||||
    {
 | 
			
		||||
        $this->translator = $translator;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
    public function addRole()
 | 
			
		||||
    {
 | 
			
		||||
        return null;
 | 
			
		||||
@@ -55,15 +43,18 @@ class ActivityDateFilter implements FilterInterface
 | 
			
		||||
    public function alterQuery(\Doctrine\ORM\QueryBuilder $qb, $data)
 | 
			
		||||
    {
 | 
			
		||||
        $where = $qb->getDQLPart('where');
 | 
			
		||||
        $clause = $qb->expr()->between('activity.date', ':date_from', 
 | 
			
		||||
            ':date_to');
 | 
			
		||||
        $clause = $qb->expr()->between(
 | 
			
		||||
            'activity.date',
 | 
			
		||||
            ':date_from',
 | 
			
		||||
            ':date_to'
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        if ($where instanceof Expr\Andx) {
 | 
			
		||||
            $where->add($clause);
 | 
			
		||||
        } else {
 | 
			
		||||
            $where = $qb->expr()->andX($clause);
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        $qb->add('where', $where);
 | 
			
		||||
        $qb->setParameter('date_from', $data['date_from']);
 | 
			
		||||
        $qb->setParameter('date_to', $data['date_to']);
 | 
			
		||||
@@ -76,55 +67,58 @@ class ActivityDateFilter implements FilterInterface
 | 
			
		||||
 | 
			
		||||
    public function buildForm(\Symfony\Component\Form\FormBuilderInterface $builder)
 | 
			
		||||
    {
 | 
			
		||||
        $builder->add('date_from', DateType::class, array(
 | 
			
		||||
            'label' => "Activities after this date",
 | 
			
		||||
            'data'  => new \DateTime(),
 | 
			
		||||
            'attr'  => array('class' => 'datepicker'),
 | 
			
		||||
            'widget'=> 'single_text',
 | 
			
		||||
        $builder->add('date_from', DateType::class, [
 | 
			
		||||
            'label' => 'Activities after this date',
 | 
			
		||||
            'data' => new DateTime(),
 | 
			
		||||
            'attr' => ['class' => 'datepicker'],
 | 
			
		||||
            'widget' => 'single_text',
 | 
			
		||||
            'format' => 'dd-MM-yyyy',
 | 
			
		||||
        ));
 | 
			
		||||
        
 | 
			
		||||
        $builder->add('date_to', DateType::class, array(
 | 
			
		||||
            'label' => "Activities before this date",
 | 
			
		||||
            'data'  => new \DateTime(),
 | 
			
		||||
            'attr'  => array('class' => 'datepicker'),
 | 
			
		||||
            'widget'=> 'single_text',
 | 
			
		||||
        ]);
 | 
			
		||||
 | 
			
		||||
        $builder->add('date_to', DateType::class, [
 | 
			
		||||
            'label' => 'Activities before this date',
 | 
			
		||||
            'data' => new DateTime(),
 | 
			
		||||
            'attr' => ['class' => 'datepicker'],
 | 
			
		||||
            'widget' => 'single_text',
 | 
			
		||||
            'format' => 'dd-MM-yyyy',
 | 
			
		||||
        ));
 | 
			
		||||
        
 | 
			
		||||
        $builder->addEventListener(FormEvents::POST_SUBMIT, function(FormEvent $event) {
 | 
			
		||||
            /* @var $filterForm \Symfony\Component\Form\FormInterface */
 | 
			
		||||
        ]);
 | 
			
		||||
 | 
			
		||||
        $builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
 | 
			
		||||
            /** @var \Symfony\Component\Form\FormInterface $filterForm */
 | 
			
		||||
            $filterForm = $event->getForm()->getParent();
 | 
			
		||||
            $enabled = $filterForm->get(FilterType::ENABLED_FIELD)->getData();
 | 
			
		||||
            
 | 
			
		||||
            if ($enabled === true) {
 | 
			
		||||
 | 
			
		||||
            if (true === $enabled) {
 | 
			
		||||
                // if the filter is enabled, add some validation
 | 
			
		||||
                $form      = $event->getForm();
 | 
			
		||||
                $form = $event->getForm();
 | 
			
		||||
                $date_from = $form->get('date_from')->getData();
 | 
			
		||||
                $date_to   = $form->get('date_to')->getData();
 | 
			
		||||
                
 | 
			
		||||
                $date_to = $form->get('date_to')->getData();
 | 
			
		||||
 | 
			
		||||
                // check that fields are not empty
 | 
			
		||||
                if ($date_from === null) {
 | 
			
		||||
                if (null === $date_from) {
 | 
			
		||||
                    $form->get('date_from')->addError(new FormError(
 | 
			
		||||
                        $this->translator->trans('This field '
 | 
			
		||||
                        . 'should not be empty')));
 | 
			
		||||
                        . 'should not be empty')
 | 
			
		||||
                    ));
 | 
			
		||||
                }
 | 
			
		||||
                if ($date_to   === null) {
 | 
			
		||||
 | 
			
		||||
                if (null === $date_to) {
 | 
			
		||||
                    $form->get('date_to')->addError(new FormError(
 | 
			
		||||
                        $this->translator->trans('This field '
 | 
			
		||||
                        . 'should not be empty')));
 | 
			
		||||
                } 
 | 
			
		||||
                
 | 
			
		||||
                        . 'should not be empty')
 | 
			
		||||
                    ));
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // check that date_from is before date_to
 | 
			
		||||
                if (
 | 
			
		||||
                    ($date_from !== null && $date_to !== null)
 | 
			
		||||
                    &&
 | 
			
		||||
                    $date_from >= $date_to
 | 
			
		||||
                    (null !== $date_from && null !== $date_to)
 | 
			
		||||
                    && $date_from >= $date_to
 | 
			
		||||
                ) {
 | 
			
		||||
                    $form->get('date_to')->addError(new FormError(
 | 
			
		||||
                        $this->translator->trans('This date should be after '
 | 
			
		||||
                            . 'the date given in "Implied in an activity after '
 | 
			
		||||
                            . 'this date" field')));
 | 
			
		||||
                            . 'this date" field')
 | 
			
		||||
                    ));
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
@@ -132,17 +126,16 @@ class ActivityDateFilter implements FilterInterface
 | 
			
		||||
 | 
			
		||||
    public function describeAction($data, $format = 'string')
 | 
			
		||||
    {
 | 
			
		||||
        return array(
 | 
			
		||||
            "Filtered by date of activity: only between %date_from% and %date_to%",
 | 
			
		||||
            array(
 | 
			
		||||
                "%date_from%" => $data['date_from']->format('d-m-Y'),
 | 
			
		||||
                '%date_to%'   => $data['date_to']->format('d-m-Y')
 | 
			
		||||
            ));
 | 
			
		||||
        return [
 | 
			
		||||
            'Filtered by date of activity: only between %date_from% and %date_to%',
 | 
			
		||||
            [
 | 
			
		||||
                '%date_from%' => $data['date_from']->format('d-m-Y'),
 | 
			
		||||
                '%date_to%' => $data['date_to']->format('d-m-Y'),
 | 
			
		||||
            ], ];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getTitle()
 | 
			
		||||
    {
 | 
			
		||||
        return "Filtered by date activity";
 | 
			
		||||
        return 'Filtered by date activity';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,88 +1,83 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2016 Champs-Libres <info@champs-libres.coop>
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
 * the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Export\Filter;
 | 
			
		||||
 | 
			
		||||
use Chill\MainBundle\Export\FilterInterface;
 | 
			
		||||
use Doctrine\ORM\QueryBuilder;
 | 
			
		||||
use Symfony\Component\Form\FormBuilderInterface;
 | 
			
		||||
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
 | 
			
		||||
use Chill\ActivityBundle\Entity\ActivityReason;
 | 
			
		||||
use Chill\MainBundle\Templating\TranslatableStringHelper;
 | 
			
		||||
use Doctrine\ORM\Query\Expr;
 | 
			
		||||
use Symfony\Component\Security\Core\Role\Role;
 | 
			
		||||
use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter;
 | 
			
		||||
use Doctrine\ORM\EntityRepository;
 | 
			
		||||
use Doctrine\ORM\Query\Expr\Join;
 | 
			
		||||
use Symfony\Component\Validator\Context\ExecutionContextInterface;
 | 
			
		||||
use Chill\MainBundle\Export\ExportElementValidatedInterface;
 | 
			
		||||
use Chill\MainBundle\Export\FilterInterface;
 | 
			
		||||
use Chill\MainBundle\Templating\TranslatableStringHelper;
 | 
			
		||||
use Doctrine\ORM\EntityRepository;
 | 
			
		||||
use Doctrine\ORM\Query\Expr;
 | 
			
		||||
use Doctrine\ORM\Query\Expr\Join;
 | 
			
		||||
use Doctrine\ORM\QueryBuilder;
 | 
			
		||||
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
 | 
			
		||||
use Symfony\Component\Form\FormBuilderInterface;
 | 
			
		||||
use Symfony\Component\Security\Core\Role\Role;
 | 
			
		||||
use Symfony\Component\Validator\Context\ExecutionContextInterface;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 
 | 
			
		||||
 *
 | 
			
		||||
 * @author Julien Fastré <julien.fastre@champs-libres.coop>
 | 
			
		||||
 */
 | 
			
		||||
class ActivityReasonFilter implements FilterInterface,
 | 
			
		||||
   ExportElementValidatedInterface
 | 
			
		||||
use function array_key_exists;
 | 
			
		||||
use function count;
 | 
			
		||||
 | 
			
		||||
class ActivityReasonFilter implements
 | 
			
		||||
    ExportElementValidatedInterface,
 | 
			
		||||
    FilterInterface
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     *
 | 
			
		||||
     * @var TranslatableStringHelper
 | 
			
		||||
     */
 | 
			
		||||
    protected $translatableStringHelper;
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * The repository for activity reasons
 | 
			
		||||
     * The repository for activity reasons.
 | 
			
		||||
     *
 | 
			
		||||
     * @var EntityRepository
 | 
			
		||||
     */
 | 
			
		||||
    protected $reasonRepository;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @var TranslatableStringHelper
 | 
			
		||||
     */
 | 
			
		||||
    protected $translatableStringHelper;
 | 
			
		||||
 | 
			
		||||
    public function __construct(
 | 
			
		||||
            TranslatableStringHelper $helper,
 | 
			
		||||
            EntityRepository $reasonRepository
 | 
			
		||||
        TranslatableStringHelper $helper,
 | 
			
		||||
        EntityRepository $reasonRepository
 | 
			
		||||
    ) {
 | 
			
		||||
        $this->translatableStringHelper = $helper;
 | 
			
		||||
        $this->reasonRepository         = $reasonRepository;
 | 
			
		||||
        $this->reasonRepository = $reasonRepository;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    public function addRole()
 | 
			
		||||
    {
 | 
			
		||||
        return new Role(ActivityStatsVoter::STATS);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function alterQuery(QueryBuilder $qb, $data)
 | 
			
		||||
    {
 | 
			
		||||
        $where = $qb->getDQLPart('where');
 | 
			
		||||
        $join  = $qb->getDQLPart('join');
 | 
			
		||||
        $join = $qb->getDQLPart('join');
 | 
			
		||||
        $clause = $qb->expr()->in('reasons', ':selected_activity_reasons');
 | 
			
		||||
        //dump($join);
 | 
			
		||||
        // add a join to reasons only if needed
 | 
			
		||||
        if (
 | 
			
		||||
            (array_key_exists('activity', $join)
 | 
			
		||||
            &&
 | 
			
		||||
            !$this->checkJoinAlreadyDefined($join['activity'], 'reasons')
 | 
			
		||||
            (
 | 
			
		||||
                array_key_exists('activity', $join)
 | 
			
		||||
            && !$this->checkJoinAlreadyDefined($join['activity'], 'reasons')
 | 
			
		||||
            )
 | 
			
		||||
            OR
 | 
			
		||||
            (! array_key_exists('activity', $join))
 | 
			
		||||
            || (!array_key_exists('activity', $join))
 | 
			
		||||
        ) {
 | 
			
		||||
            $qb->add(
 | 
			
		||||
                    'join', 
 | 
			
		||||
                    array('activity' => new Join(Join::INNER_JOIN, 'activity.reasons', 'reasons')), 
 | 
			
		||||
                    true
 | 
			
		||||
                    );
 | 
			
		||||
                'join',
 | 
			
		||||
                ['activity' => new Join(Join::INNER_JOIN, 'activity.reasons', 'reasons')],
 | 
			
		||||
                true
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ($where instanceof Expr\Andx) {
 | 
			
		||||
@@ -90,27 +85,10 @@ class ActivityReasonFilter implements FilterInterface,
 | 
			
		||||
        } else {
 | 
			
		||||
            $where = $qb->expr()->andX($clause);
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        $qb->add('where', $where);
 | 
			
		||||
        $qb->setParameter('selected_activity_reasons', $data['reasons']);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * Check if a join between Activity and Reason is already defined
 | 
			
		||||
     * 
 | 
			
		||||
     * @param Join[] $joins
 | 
			
		||||
     * @return boolean
 | 
			
		||||
     */
 | 
			
		||||
    private function checkJoinAlreadyDefined(array $joins, $alias)
 | 
			
		||||
    {
 | 
			
		||||
        foreach ($joins as $join) {
 | 
			
		||||
            if ($join->getAlias() === $alias) {
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function applyOn()
 | 
			
		||||
    {
 | 
			
		||||
@@ -121,49 +99,63 @@ class ActivityReasonFilter implements FilterInterface,
 | 
			
		||||
    {
 | 
			
		||||
        //create a local copy of translatableStringHelper
 | 
			
		||||
        $helper = $this->translatableStringHelper;
 | 
			
		||||
        
 | 
			
		||||
        $builder->add('reasons', EntityType::class, array(
 | 
			
		||||
 | 
			
		||||
        $builder->add('reasons', EntityType::class, [
 | 
			
		||||
            'class' => 'ChillActivityBundle:ActivityReason',
 | 
			
		||||
            'choice_label' => function (ActivityReason $reason) use ($helper) {
 | 
			
		||||
            'choice_label' => static function (ActivityReason $reason) use ($helper) {
 | 
			
		||||
                return $helper->localize($reason->getName());
 | 
			
		||||
            },
 | 
			
		||||
            'group_by' => function(ActivityReason $reason) use ($helper) {
 | 
			
		||||
            'group_by' => static function (ActivityReason $reason) use ($helper) {
 | 
			
		||||
                return $helper->localize($reason->getCategory()->getName());
 | 
			
		||||
            },
 | 
			
		||||
            'multiple' => true,
 | 
			
		||||
            'expanded' => false
 | 
			
		||||
        ));
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public function validateForm($data, ExecutionContextInterface $context)
 | 
			
		||||
    {
 | 
			
		||||
        if ($data['reasons'] === null || count($data['reasons']) === 0) {
 | 
			
		||||
            $context->buildViolation("At least one reason must be choosen")
 | 
			
		||||
                ->addViolation();
 | 
			
		||||
        }
 | 
			
		||||
            'expanded' => false,
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        public function getTitle()
 | 
			
		||||
    {
 | 
			
		||||
        return 'Filter by reason';
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public function addRole()
 | 
			
		||||
    {
 | 
			
		||||
        return new Role(ActivityStatsVoter::STATS);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public function describeAction($data, $format = 'string')
 | 
			
		||||
    {
 | 
			
		||||
        // collect all the reasons'name used in this filter in one array
 | 
			
		||||
        $reasonsNames = array_map(
 | 
			
		||||
                function(ActivityReason $r) {
 | 
			
		||||
                    return "\"".$this->translatableStringHelper->localize($r->getName())."\"";
 | 
			
		||||
                },
 | 
			
		||||
                $this->reasonRepository->findBy(array('id' => $data['reasons']->toArray()))
 | 
			
		||||
                );
 | 
			
		||||
        
 | 
			
		||||
        return array("Filtered by reasons: only %list%", 
 | 
			
		||||
            ["%list%" => implode(", ", $reasonsNames)]);
 | 
			
		||||
            function (ActivityReason $r) {
 | 
			
		||||
                return '"' . $this->translatableStringHelper->localize($r->getName()) . '"';
 | 
			
		||||
            },
 | 
			
		||||
            $this->reasonRepository->findBy(['id' => $data['reasons']->toArray()])
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        return ['Filtered by reasons: only %list%',
 | 
			
		||||
            ['%list%' => implode(', ', $reasonsNames)], ];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getTitle()
 | 
			
		||||
    {
 | 
			
		||||
        return 'Filter by reason';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function validateForm($data, ExecutionContextInterface $context)
 | 
			
		||||
    {
 | 
			
		||||
        if (null === $data['reasons'] || count($data['reasons']) === 0) {
 | 
			
		||||
            $context->buildViolation('At least one reason must be choosen')
 | 
			
		||||
                ->addViolation();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Check if a join between Activity and Reason is already defined.
 | 
			
		||||
     *
 | 
			
		||||
     * @param Join[] $joins
 | 
			
		||||
     * @param mixed $alias
 | 
			
		||||
     *
 | 
			
		||||
     * @return bool
 | 
			
		||||
     */
 | 
			
		||||
    private function checkJoinAlreadyDefined(array $joins, $alias)
 | 
			
		||||
    {
 | 
			
		||||
        foreach ($joins as $join) {
 | 
			
		||||
            if ($join->getAlias() === $alias) {
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,67 +1,63 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2018 Champs-Libres <info@champs-libres.coop>
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
 * the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Export\Filter;
 | 
			
		||||
 | 
			
		||||
use Chill\MainBundle\Export\FilterInterface;
 | 
			
		||||
use Doctrine\ORM\QueryBuilder;
 | 
			
		||||
use Symfony\Component\Form\FormBuilderInterface;
 | 
			
		||||
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
 | 
			
		||||
use Chill\MainBundle\Templating\TranslatableStringHelper;
 | 
			
		||||
use Doctrine\ORM\Query\Expr;
 | 
			
		||||
use Symfony\Component\Security\Core\Role\Role;
 | 
			
		||||
use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter;
 | 
			
		||||
use Doctrine\ORM\EntityRepository;
 | 
			
		||||
use Doctrine\ORM\Query\Expr\Join;
 | 
			
		||||
use Symfony\Component\Validator\Context\ExecutionContextInterface;
 | 
			
		||||
use Chill\MainBundle\Export\ExportElementValidatedInterface;
 | 
			
		||||
use Chill\ActivityBundle\Entity\ActivityType;
 | 
			
		||||
use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter;
 | 
			
		||||
use Chill\MainBundle\Export\ExportElementValidatedInterface;
 | 
			
		||||
use Chill\MainBundle\Export\FilterInterface;
 | 
			
		||||
use Chill\MainBundle\Templating\TranslatableStringHelper;
 | 
			
		||||
use Doctrine\ORM\EntityRepository;
 | 
			
		||||
use Doctrine\ORM\Query\Expr;
 | 
			
		||||
use Doctrine\ORM\Query\Expr\Join;
 | 
			
		||||
use Doctrine\ORM\QueryBuilder;
 | 
			
		||||
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
 | 
			
		||||
use Symfony\Component\Form\FormBuilderInterface;
 | 
			
		||||
use Symfony\Component\Security\Core\Role\Role;
 | 
			
		||||
use Symfony\Component\Validator\Context\ExecutionContextInterface;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
class ActivityTypeFilter implements FilterInterface,
 | 
			
		||||
   ExportElementValidatedInterface
 | 
			
		||||
use function count;
 | 
			
		||||
 | 
			
		||||
class ActivityTypeFilter implements
 | 
			
		||||
    ExportElementValidatedInterface,
 | 
			
		||||
    FilterInterface
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     *
 | 
			
		||||
     * @var TranslatableStringHelper
 | 
			
		||||
     */
 | 
			
		||||
    protected $translatableStringHelper;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The repository for activity reasons
 | 
			
		||||
     * The repository for activity reasons.
 | 
			
		||||
     *
 | 
			
		||||
     * @var EntityRepository
 | 
			
		||||
     */
 | 
			
		||||
    protected $typeRepository;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    public function __construct(
 | 
			
		||||
            TranslatableStringHelper $helper,
 | 
			
		||||
            EntityRepository $typeRepository
 | 
			
		||||
        TranslatableStringHelper $helper,
 | 
			
		||||
        EntityRepository $typeRepository
 | 
			
		||||
    ) {
 | 
			
		||||
        $this->translatableStringHelper = $helper;
 | 
			
		||||
        $this->typeRepository = $typeRepository;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    public function addRole()
 | 
			
		||||
    {
 | 
			
		||||
        return new Role(ActivityStatsVoter::STATS);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function alterQuery(QueryBuilder $qb, $data)
 | 
			
		||||
    {
 | 
			
		||||
        $where = $qb->getDQLPart('where');
 | 
			
		||||
@@ -72,27 +68,10 @@ class ActivityTypeFilter implements FilterInterface,
 | 
			
		||||
        } else {
 | 
			
		||||
            $where = $qb->expr()->andX($clause);
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        $qb->add('where', $where);
 | 
			
		||||
        $qb->setParameter('selected_activity_types', $data['types']);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * Check if a join between Activity and Reason is already defined
 | 
			
		||||
     * 
 | 
			
		||||
     * @param Join[] $joins
 | 
			
		||||
     * @return boolean
 | 
			
		||||
     */
 | 
			
		||||
    private function checkJoinAlreadyDefined(array $joins, $alias)
 | 
			
		||||
    {
 | 
			
		||||
        foreach ($joins as $join) {
 | 
			
		||||
            if ($join->getAlias() === $alias) {
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function applyOn()
 | 
			
		||||
    {
 | 
			
		||||
@@ -103,46 +82,60 @@ class ActivityTypeFilter implements FilterInterface,
 | 
			
		||||
    {
 | 
			
		||||
        //create a local copy of translatableStringHelper
 | 
			
		||||
        $helper = $this->translatableStringHelper;
 | 
			
		||||
        
 | 
			
		||||
        $builder->add('types', EntityType::class, array(
 | 
			
		||||
 | 
			
		||||
        $builder->add('types', EntityType::class, [
 | 
			
		||||
            'class' => ActivityType::class,
 | 
			
		||||
            'choice_label' => function (ActivityType $type) use ($helper) {
 | 
			
		||||
            'choice_label' => static function (ActivityType $type) use ($helper) {
 | 
			
		||||
                return $helper->localize($type->getName());
 | 
			
		||||
            },
 | 
			
		||||
            'multiple' => true,
 | 
			
		||||
            'expanded' => false
 | 
			
		||||
        ));
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public function validateForm($data, ExecutionContextInterface $context)
 | 
			
		||||
    {
 | 
			
		||||
        if ($data['types'] === null || count($data['types']) === 0) {
 | 
			
		||||
            $context->buildViolation("At least one type must be choosen")
 | 
			
		||||
                ->addViolation();
 | 
			
		||||
        }
 | 
			
		||||
            'expanded' => false,
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        public function getTitle()
 | 
			
		||||
    {
 | 
			
		||||
        return 'Filter by activity type';
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public function addRole()
 | 
			
		||||
    {
 | 
			
		||||
        return new Role(ActivityStatsVoter::STATS);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public function describeAction($data, $format = 'string')
 | 
			
		||||
    {
 | 
			
		||||
        // collect all the reasons'name used in this filter in one array
 | 
			
		||||
        $reasonsNames = array_map(
 | 
			
		||||
                function(ActivityType $t) {
 | 
			
		||||
                    return "\"".$this->translatableStringHelper->localize($t->getName())."\"";
 | 
			
		||||
                },
 | 
			
		||||
                $this->typeRepository->findBy(array('id' => $data['types']->toArray()))
 | 
			
		||||
                );
 | 
			
		||||
        
 | 
			
		||||
        return array("Filtered by activity type: only %list%", 
 | 
			
		||||
            ["%list%" => implode(", ", $reasonsNames)]);
 | 
			
		||||
            function (ActivityType $t) {
 | 
			
		||||
                return '"' . $this->translatableStringHelper->localize($t->getName()) . '"';
 | 
			
		||||
            },
 | 
			
		||||
            $this->typeRepository->findBy(['id' => $data['types']->toArray()])
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        return ['Filtered by activity type: only %list%',
 | 
			
		||||
            ['%list%' => implode(', ', $reasonsNames)], ];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getTitle()
 | 
			
		||||
    {
 | 
			
		||||
        return 'Filter by activity type';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function validateForm($data, ExecutionContextInterface $context)
 | 
			
		||||
    {
 | 
			
		||||
        if (null === $data['types'] || count($data['types']) === 0) {
 | 
			
		||||
            $context->buildViolation('At least one type must be choosen')
 | 
			
		||||
                ->addViolation();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Check if a join between Activity and Reason is already defined.
 | 
			
		||||
     *
 | 
			
		||||
     * @param Join[] $joins
 | 
			
		||||
     * @param mixed $alias
 | 
			
		||||
     *
 | 
			
		||||
     * @return bool
 | 
			
		||||
     */
 | 
			
		||||
    private function checkJoinAlreadyDefined(array $joins, $alias)
 | 
			
		||||
    {
 | 
			
		||||
        foreach ($joins as $join) {
 | 
			
		||||
            if ($join->getAlias() === $alias) {
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,79 +1,66 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2017 Champs-Libres <info@champs-libres.coop>
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
 * the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Export\Filter;
 | 
			
		||||
 | 
			
		||||
use Chill\ActivityBundle\Entity\ActivityReason;
 | 
			
		||||
use Chill\MainBundle\Export\ExportElementValidatedInterface;
 | 
			
		||||
use Chill\MainBundle\Export\FilterInterface;
 | 
			
		||||
use Symfony\Component\Form\FormEvent;
 | 
			
		||||
use Symfony\Component\Form\FormEvents;
 | 
			
		||||
use Chill\MainBundle\Form\Type\Export\FilterType;
 | 
			
		||||
use Chill\MainBundle\Templating\TranslatableStringHelper;
 | 
			
		||||
use Chill\PersonBundle\Export\Declarations;
 | 
			
		||||
use DateTime;
 | 
			
		||||
use Doctrine\ORM\EntityRepository;
 | 
			
		||||
use Doctrine\ORM\Query\Expr;
 | 
			
		||||
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
 | 
			
		||||
use Symfony\Component\Form\Extension\Core\Type\DateType;
 | 
			
		||||
use Symfony\Component\Form\FormError;
 | 
			
		||||
use Chill\MainBundle\Form\Type\Export\FilterType;
 | 
			
		||||
use Doctrine\ORM\Query\Expr;
 | 
			
		||||
use Chill\MainBundle\Templating\TranslatableStringHelper;
 | 
			
		||||
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
 | 
			
		||||
use Chill\ActivityBundle\Entity\ActivityReason;
 | 
			
		||||
use Doctrine\ORM\EntityRepository;
 | 
			
		||||
use Doctrine\ORM\EntityManager;
 | 
			
		||||
use Chill\PersonBundle\Export\Declarations;
 | 
			
		||||
use Symfony\Component\Form\FormEvent;
 | 
			
		||||
use Symfony\Component\Form\FormEvents;
 | 
			
		||||
use Symfony\Component\Translation\TranslatorInterface;
 | 
			
		||||
use Symfony\Component\Validator\Context\ExecutionContextInterface;
 | 
			
		||||
use Chill\MainBundle\Export\ExportElementValidatedInterface;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 
 | 
			
		||||
 *
 | 
			
		||||
 * @author Julien Fastré <julien.fastre@champs-libres.coop>
 | 
			
		||||
 */
 | 
			
		||||
class PersonHavingActivityBetweenDateFilter implements FilterInterface, 
 | 
			
		||||
    ExportElementValidatedInterface
 | 
			
		||||
use function count;
 | 
			
		||||
 | 
			
		||||
class PersonHavingActivityBetweenDateFilter implements
 | 
			
		||||
    ExportElementValidatedInterface,
 | 
			
		||||
    FilterInterface
 | 
			
		||||
{
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     *
 | 
			
		||||
     * @var TranslatableStringHelper
 | 
			
		||||
     */
 | 
			
		||||
    protected $translatableStringHelper;
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     *
 | 
			
		||||
     * @var EntityRepository
 | 
			
		||||
     */
 | 
			
		||||
    protected $activityReasonRepository;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     *
 | 
			
		||||
     * @var TranslatorInterface 
 | 
			
		||||
     * @var TranslatableStringHelper
 | 
			
		||||
     */
 | 
			
		||||
    protected $translatableStringHelper;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @var TranslatorInterface
 | 
			
		||||
     */
 | 
			
		||||
    protected $translator;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    public function __construct(
 | 
			
		||||
            TranslatableStringHelper $translatableStringHelper,
 | 
			
		||||
            EntityRepository $activityReasonRepository,
 | 
			
		||||
            TranslatorInterface $translator
 | 
			
		||||
        TranslatableStringHelper $translatableStringHelper,
 | 
			
		||||
        EntityRepository $activityReasonRepository,
 | 
			
		||||
        TranslatorInterface $translator
 | 
			
		||||
    ) {
 | 
			
		||||
        $this->translatableStringHelper = $translatableStringHelper;
 | 
			
		||||
        $this->activityReasonRepository = $activityReasonRepository;
 | 
			
		||||
        $this->translator               = $translator;
 | 
			
		||||
        $this->translator = $translator;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    public function addRole()
 | 
			
		||||
    {
 | 
			
		||||
        return null;
 | 
			
		||||
@@ -83,24 +70,26 @@ class PersonHavingActivityBetweenDateFilter implements FilterInterface,
 | 
			
		||||
    {
 | 
			
		||||
        // create a query for activity
 | 
			
		||||
        $sqb = $qb->getEntityManager()->createQueryBuilder();
 | 
			
		||||
        $sqb->select("person_person_having_activity.id")
 | 
			
		||||
                ->from("ChillActivityBundle:Activity", "activity_person_having_activity")
 | 
			
		||||
                ->join("activity_person_having_activity.person", "person_person_having_activity")
 | 
			
		||||
                ;
 | 
			
		||||
        $sqb->select('person_person_having_activity.id')
 | 
			
		||||
            ->from('ChillActivityBundle:Activity', 'activity_person_having_activity')
 | 
			
		||||
            ->join('activity_person_having_activity.person', 'person_person_having_activity');
 | 
			
		||||
        // add clause between date
 | 
			
		||||
        $sqb->where("activity_person_having_activity.date BETWEEN "
 | 
			
		||||
                . ":person_having_activity_between_date_from"
 | 
			
		||||
                . " AND "
 | 
			
		||||
                . ":person_having_activity_between_date_to");
 | 
			
		||||
        $sqb->where('activity_person_having_activity.date BETWEEN '
 | 
			
		||||
                . ':person_having_activity_between_date_from'
 | 
			
		||||
                . ' AND '
 | 
			
		||||
                . ':person_having_activity_between_date_to');
 | 
			
		||||
        // add clause activity reason
 | 
			
		||||
        $sqb->join('activity_person_having_activity.reasons', 
 | 
			
		||||
                'reasons_person_having_activity');
 | 
			
		||||
        $sqb->join(
 | 
			
		||||
            'activity_person_having_activity.reasons',
 | 
			
		||||
            'reasons_person_having_activity'
 | 
			
		||||
        );
 | 
			
		||||
        $sqb->andWhere(
 | 
			
		||||
                $sqb->expr()->in(
 | 
			
		||||
                    'reasons_person_having_activity',
 | 
			
		||||
                    ":person_having_activity_reasons")
 | 
			
		||||
                );
 | 
			
		||||
        
 | 
			
		||||
            $sqb->expr()->in(
 | 
			
		||||
                'reasons_person_having_activity',
 | 
			
		||||
                ':person_having_activity_reasons'
 | 
			
		||||
            )
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        $where = $qb->getDQLPart('where');
 | 
			
		||||
        $clause = $qb->expr()->in('person.id', $sqb->getDQL());
 | 
			
		||||
 | 
			
		||||
@@ -109,12 +98,16 @@ class PersonHavingActivityBetweenDateFilter implements FilterInterface,
 | 
			
		||||
        } else {
 | 
			
		||||
            $where = $qb->expr()->andX($clause);
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        $qb->add('where', $where);
 | 
			
		||||
        $qb->setParameter('person_having_activity_between_date_from', 
 | 
			
		||||
                $data['date_from']);
 | 
			
		||||
        $qb->setParameter('person_having_activity_between_date_to', 
 | 
			
		||||
                $data['date_to']);
 | 
			
		||||
        $qb->setParameter(
 | 
			
		||||
            'person_having_activity_between_date_from',
 | 
			
		||||
            $data['date_from']
 | 
			
		||||
        );
 | 
			
		||||
        $qb->setParameter(
 | 
			
		||||
            'person_having_activity_between_date_to',
 | 
			
		||||
            $data['date_to']
 | 
			
		||||
        );
 | 
			
		||||
        $qb->setParameter('person_having_activity_reasons', $data['reasons']);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -125,104 +118,107 @@ class PersonHavingActivityBetweenDateFilter implements FilterInterface,
 | 
			
		||||
 | 
			
		||||
    public function buildForm(\Symfony\Component\Form\FormBuilderInterface $builder)
 | 
			
		||||
    {
 | 
			
		||||
        $builder->add('date_from', DateType::class, array(
 | 
			
		||||
            'label' => "Implied in an activity after this date",
 | 
			
		||||
            'data'  => new \DateTime(),
 | 
			
		||||
            'attr'  => array('class' => 'datepicker'),
 | 
			
		||||
            'widget'=> 'single_text',
 | 
			
		||||
        $builder->add('date_from', DateType::class, [
 | 
			
		||||
            'label' => 'Implied in an activity after this date',
 | 
			
		||||
            'data' => new DateTime(),
 | 
			
		||||
            'attr' => ['class' => 'datepicker'],
 | 
			
		||||
            'widget' => 'single_text',
 | 
			
		||||
            'format' => 'dd-MM-yyyy',
 | 
			
		||||
        ));
 | 
			
		||||
        
 | 
			
		||||
        $builder->add('date_to', DateType::class, array(
 | 
			
		||||
            'label' => "Implied in an activity before this date",
 | 
			
		||||
            'data'  => new \DateTime(),
 | 
			
		||||
            'attr'  => array('class' => 'datepicker'),
 | 
			
		||||
            'widget'=> 'single_text',
 | 
			
		||||
        ]);
 | 
			
		||||
 | 
			
		||||
        $builder->add('date_to', DateType::class, [
 | 
			
		||||
            'label' => 'Implied in an activity before this date',
 | 
			
		||||
            'data' => new DateTime(),
 | 
			
		||||
            'attr' => ['class' => 'datepicker'],
 | 
			
		||||
            'widget' => 'single_text',
 | 
			
		||||
            'format' => 'dd-MM-yyyy',
 | 
			
		||||
        ));
 | 
			
		||||
        
 | 
			
		||||
        $builder->add('reasons', EntityType::class, array(
 | 
			
		||||
        ]);
 | 
			
		||||
 | 
			
		||||
        $builder->add('reasons', EntityType::class, [
 | 
			
		||||
            'class' => 'ChillActivityBundle:ActivityReason',
 | 
			
		||||
            'choice_label' => function (ActivityReason $reason) {
 | 
			
		||||
                return $this->translatableStringHelper
 | 
			
		||||
                        ->localize($reason->getName());
 | 
			
		||||
                    ->localize($reason->getName());
 | 
			
		||||
            },
 | 
			
		||||
            'group_by' => function(ActivityReason $reason) {
 | 
			
		||||
            'group_by' => function (ActivityReason $reason) {
 | 
			
		||||
                return $this->translatableStringHelper
 | 
			
		||||
                        ->localize($reason->getCategory()->getName());
 | 
			
		||||
                    ->localize($reason->getCategory()->getName());
 | 
			
		||||
            },
 | 
			
		||||
            'data' => $this->activityReasonRepository->findAll(),
 | 
			
		||||
            'multiple' => true,
 | 
			
		||||
            'expanded' => false,
 | 
			
		||||
            'label'    => "Activity reasons for those activities"
 | 
			
		||||
        ));
 | 
			
		||||
        
 | 
			
		||||
        $builder->addEventListener(FormEvents::POST_SUBMIT, function(FormEvent $event) {
 | 
			
		||||
            /* @var $filterForm \Symfony\Component\Form\FormInterface */
 | 
			
		||||
            'label' => 'Activity reasons for those activities',
 | 
			
		||||
        ]);
 | 
			
		||||
 | 
			
		||||
        $builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
 | 
			
		||||
            /** @var \Symfony\Component\Form\FormInterface $filterForm */
 | 
			
		||||
            $filterForm = $event->getForm()->getParent();
 | 
			
		||||
            $enabled = $filterForm->get(FilterType::ENABLED_FIELD)->getData();
 | 
			
		||||
            
 | 
			
		||||
            if ($enabled === true) {
 | 
			
		||||
 | 
			
		||||
            if (true === $enabled) {
 | 
			
		||||
                // if the filter is enabled, add some validation
 | 
			
		||||
                $form      = $event->getForm();
 | 
			
		||||
                $form = $event->getForm();
 | 
			
		||||
                $date_from = $form->get('date_from')->getData();
 | 
			
		||||
                $date_to   = $form->get('date_to')->getData();
 | 
			
		||||
                
 | 
			
		||||
                $date_to = $form->get('date_to')->getData();
 | 
			
		||||
 | 
			
		||||
                // check that fields are not empty
 | 
			
		||||
                if ($date_from === null) {
 | 
			
		||||
                if (null === $date_from) {
 | 
			
		||||
                    $form->get('date_from')->addError(new FormError(
 | 
			
		||||
                        $this->translator->trans('This field '
 | 
			
		||||
                        . 'should not be empty')));
 | 
			
		||||
                        . 'should not be empty')
 | 
			
		||||
                    ));
 | 
			
		||||
                }
 | 
			
		||||
                if ($date_to   === null) {
 | 
			
		||||
 | 
			
		||||
                if (null === $date_to) {
 | 
			
		||||
                    $form->get('date_to')->addError(new FormError(
 | 
			
		||||
                        $this->translator->trans('This field '
 | 
			
		||||
                        . 'should not be empty')));
 | 
			
		||||
                } 
 | 
			
		||||
                
 | 
			
		||||
                        . 'should not be empty')
 | 
			
		||||
                    ));
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // check that date_from is before date_to
 | 
			
		||||
                if (
 | 
			
		||||
                    ($date_from !== null && $date_to !== null)
 | 
			
		||||
                    &&
 | 
			
		||||
                    $date_from >= $date_to
 | 
			
		||||
                    (null !== $date_from && null !== $date_to)
 | 
			
		||||
                    && $date_from >= $date_to
 | 
			
		||||
                ) {
 | 
			
		||||
                    $form->get('date_to')->addError(new FormError(
 | 
			
		||||
                        $this->translator->trans('This date '
 | 
			
		||||
                        . 'should be after the date given in "Implied in an '
 | 
			
		||||
                        . 'activity after this date" field')));
 | 
			
		||||
                        . 'activity after this date" field')
 | 
			
		||||
                    ));
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public function validateForm($data, ExecutionContextInterface $context)
 | 
			
		||||
    {
 | 
			
		||||
        if ($data['reasons'] === null || count($data['reasons']) === 0) {
 | 
			
		||||
            $context->buildViolation("At least one reason must be choosen")
 | 
			
		||||
                ->addViolation();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function describeAction($data, $format = 'string')
 | 
			
		||||
    {
 | 
			
		||||
        return array(
 | 
			
		||||
            "Filtered by person having an activity between %date_from% and "
 | 
			
		||||
            . "%date_to% with reasons %reasons_name%",
 | 
			
		||||
            array(
 | 
			
		||||
                "%date_from%" => $data['date_from']->format('d-m-Y'),
 | 
			
		||||
                '%date_to%'   => $data['date_to']->format('d-m-Y'),
 | 
			
		||||
                "%reasons_name%"  => implode(", ", array_map(
 | 
			
		||||
                        function (ActivityReason $r) {
 | 
			
		||||
                            return '"'.$this->translatableStringHelper->
 | 
			
		||||
                                    localize($r->getName()).'"';
 | 
			
		||||
                        },
 | 
			
		||||
                        $data['reasons']))
 | 
			
		||||
            ));
 | 
			
		||||
        return [
 | 
			
		||||
            'Filtered by person having an activity between %date_from% and '
 | 
			
		||||
            . '%date_to% with reasons %reasons_name%',
 | 
			
		||||
            [
 | 
			
		||||
                '%date_from%' => $data['date_from']->format('d-m-Y'),
 | 
			
		||||
                '%date_to%' => $data['date_to']->format('d-m-Y'),
 | 
			
		||||
                '%reasons_name%' => implode(', ', array_map(
 | 
			
		||||
                    function (ActivityReason $r) {
 | 
			
		||||
                        return '"' . $this->translatableStringHelper->
 | 
			
		||||
                                    localize($r->getName()) . '"';
 | 
			
		||||
                    },
 | 
			
		||||
                    $data['reasons']
 | 
			
		||||
                )),
 | 
			
		||||
            ], ];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getTitle()
 | 
			
		||||
    {
 | 
			
		||||
        return "Filtered by person having an activity in a period";
 | 
			
		||||
        return 'Filtered by person having an activity in a period';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function validateForm($data, ExecutionContextInterface $context)
 | 
			
		||||
    {
 | 
			
		||||
        if (null === $data['reasons'] || count($data['reasons']) === 0) {
 | 
			
		||||
            $context->buildViolation('At least one reason must be choosen')
 | 
			
		||||
                ->addViolation();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,33 +0,0 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Form;
 | 
			
		||||
 | 
			
		||||
use Chill\ActivityBundle\Entity\ActivityPresence;
 | 
			
		||||
use Symfony\Component\Form\AbstractType;
 | 
			
		||||
use Symfony\Component\Form\FormBuilderInterface;
 | 
			
		||||
use Symfony\Component\OptionsResolver\OptionsResolver;
 | 
			
		||||
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
 | 
			
		||||
use Chill\MainBundle\Form\Type\TranslatableStringFormType;
 | 
			
		||||
 | 
			
		||||
class ActivityPresenceType extends AbstractType
 | 
			
		||||
{
 | 
			
		||||
    public function buildForm(FormBuilderInterface $builder, array $options): void
 | 
			
		||||
    {
 | 
			
		||||
        $builder
 | 
			
		||||
            ->add('name', TranslatableStringFormType::class)
 | 
			
		||||
            ->add('active', ChoiceType::class, array(
 | 
			
		||||
                'choices' => array(
 | 
			
		||||
                    'Yes' => true,
 | 
			
		||||
                    'No'  => false
 | 
			
		||||
                ),
 | 
			
		||||
                'expanded' => true
 | 
			
		||||
            ));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function configureOptions(OptionsResolver $resolver): void
 | 
			
		||||
    {
 | 
			
		||||
        $resolver->setDefaults(array(
 | 
			
		||||
            'data_class' => ActivityPresence::class
 | 
			
		||||
        ));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,25 +1,31 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Form;
 | 
			
		||||
 | 
			
		||||
use Chill\MainBundle\Form\Type\TranslatableStringFormType;
 | 
			
		||||
use Symfony\Component\Form\AbstractType;
 | 
			
		||||
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
 | 
			
		||||
use Symfony\Component\Form\FormBuilderInterface;
 | 
			
		||||
use Symfony\Component\OptionsResolver\OptionsResolver;
 | 
			
		||||
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
 | 
			
		||||
use Chill\MainBundle\Form\Type\TranslatableStringFormType;
 | 
			
		||||
 | 
			
		||||
class ActivityReasonCategoryType extends AbstractType
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * @param FormBuilderInterface $builder
 | 
			
		||||
     * @param array $options
 | 
			
		||||
     */
 | 
			
		||||
    public function buildForm(FormBuilderInterface $builder, array $options)
 | 
			
		||||
    {
 | 
			
		||||
        $builder
 | 
			
		||||
            ->add('name', TranslatableStringFormType::class)
 | 
			
		||||
            ->add('active', CheckboxType::class, array('required' => false))
 | 
			
		||||
        ;
 | 
			
		||||
            ->add('active', CheckboxType::class, ['required' => false]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -27,9 +33,9 @@ class ActivityReasonCategoryType extends AbstractType
 | 
			
		||||
     */
 | 
			
		||||
    public function configureOptions(OptionsResolver $resolver)
 | 
			
		||||
    {
 | 
			
		||||
        $resolver->setDefaults(array(
 | 
			
		||||
            'data_class' => 'Chill\ActivityBundle\Entity\ActivityReasonCategory'
 | 
			
		||||
        ));
 | 
			
		||||
        $resolver->setDefaults([
 | 
			
		||||
            'data_class' => 'Chill\ActivityBundle\Entity\ActivityReasonCategory',
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -1,37 +1,40 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Form;
 | 
			
		||||
 | 
			
		||||
use Chill\ActivityBundle\Form\Type\TranslatableActivityReasonCategory;
 | 
			
		||||
use Chill\MainBundle\Form\Type\TranslatableStringFormType;
 | 
			
		||||
use Symfony\Component\Form\AbstractType;
 | 
			
		||||
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
 | 
			
		||||
use Symfony\Component\Form\FormBuilderInterface;
 | 
			
		||||
use Symfony\Component\OptionsResolver\OptionsResolver;
 | 
			
		||||
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
 | 
			
		||||
use Chill\MainBundle\Form\Type\TranslatableStringFormType;
 | 
			
		||||
use Chill\ActivityBundle\Form\Type\TranslatableActivityReasonCategory;
 | 
			
		||||
 | 
			
		||||
class ActivityReasonType extends AbstractType
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * @param FormBuilderInterface $builder
 | 
			
		||||
     * @param array $options
 | 
			
		||||
     */
 | 
			
		||||
    public function buildForm(FormBuilderInterface $builder, array $options)
 | 
			
		||||
    {
 | 
			
		||||
        $builder
 | 
			
		||||
            ->add('name', TranslatableStringFormType::class)
 | 
			
		||||
            ->add('active', CheckboxType::class, array('required' => false))
 | 
			
		||||
            ->add('category', TranslatableActivityReasonCategory::class)
 | 
			
		||||
        ;
 | 
			
		||||
            ->add('active', CheckboxType::class, ['required' => false])
 | 
			
		||||
            ->add('category', TranslatableActivityReasonCategory::class);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @param OptionsResolver $resolver
 | 
			
		||||
     */
 | 
			
		||||
    public function configureOptions(OptionsResolver $resolver)
 | 
			
		||||
    {
 | 
			
		||||
        $resolver->setDefaults(array(
 | 
			
		||||
            'data_class' => 'Chill\ActivityBundle\Entity\ActivityReason'
 | 
			
		||||
        ));
 | 
			
		||||
        $resolver->setDefaults([
 | 
			
		||||
            'data_class' => 'Chill\ActivityBundle\Entity\ActivityReason',
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -1,74 +1,87 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Form;
 | 
			
		||||
 | 
			
		||||
use Chill\ActivityBundle\Entity\Activity;
 | 
			
		||||
use Chill\ActivityBundle\Entity\ActivityPresence;
 | 
			
		||||
use Chill\ActivityBundle\Entity\ActivityReason;
 | 
			
		||||
use Chill\DocStoreBundle\Form\StoredObjectType;
 | 
			
		||||
use Chill\MainBundle\Form\Type\ChillCollectionType;
 | 
			
		||||
use Chill\MainBundle\Form\Type\CommentType;
 | 
			
		||||
use Chill\PersonBundle\Entity\Person;
 | 
			
		||||
use Chill\PersonBundle\Entity\SocialWork\SocialIssue;
 | 
			
		||||
use Chill\PersonBundle\Entity\SocialWork\SocialAction;
 | 
			
		||||
use Chill\ThirdPartyBundle\Entity\ThirdParty;
 | 
			
		||||
use Doctrine\ORM\EntityRepository;
 | 
			
		||||
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
 | 
			
		||||
use Symfony\Component\Form\AbstractType;
 | 
			
		||||
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
 | 
			
		||||
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
 | 
			
		||||
use Symfony\Component\Form\FormBuilderInterface;
 | 
			
		||||
use Symfony\Component\OptionsResolver\OptionsResolver;
 | 
			
		||||
use Chill\MainBundle\Security\Authorization\AuthorizationHelper;
 | 
			
		||||
use Doctrine\Persistence\ObjectManager;
 | 
			
		||||
use Chill\MainBundle\Templating\TranslatableStringHelper;
 | 
			
		||||
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
 | 
			
		||||
use Chill\ActivityBundle\Form\Type\TranslatableActivityReason;
 | 
			
		||||
use Chill\ActivityBundle\Form\Type\TranslatableActivityType;
 | 
			
		||||
use Chill\MainBundle\Entity\User;
 | 
			
		||||
use Chill\MainBundle\Form\Type\ChillDateType;
 | 
			
		||||
use Chill\MainBundle\Form\Type\CommentType;
 | 
			
		||||
use Chill\MainBundle\Form\Type\ScopePickerType;
 | 
			
		||||
use Chill\MainBundle\Form\Type\UserPickerType;
 | 
			
		||||
use Chill\MainBundle\Security\Authorization\AuthorizationHelper;
 | 
			
		||||
use Chill\MainBundle\Templating\TranslatableStringHelper;
 | 
			
		||||
use DateInterval;
 | 
			
		||||
use DateTime;
 | 
			
		||||
use DateTimeZone;
 | 
			
		||||
use Doctrine\Persistence\ObjectManager;
 | 
			
		||||
use RuntimeException;
 | 
			
		||||
use Symfony\Component\Form\AbstractType;
 | 
			
		||||
use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToTimestampTransformer;
 | 
			
		||||
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
 | 
			
		||||
use Symfony\Component\Form\FormBuilderInterface;
 | 
			
		||||
use Symfony\Component\Form\FormEvent;
 | 
			
		||||
use Symfony\Component\Form\FormEvents;
 | 
			
		||||
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
 | 
			
		||||
use Chill\MainBundle\Form\Type\UserPickerType;
 | 
			
		||||
use Chill\MainBundle\Form\Type\ScopePickerType;
 | 
			
		||||
use Chill\MainBundle\Form\Type\ChillDateType;
 | 
			
		||||
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
 | 
			
		||||
use Symfony\Component\Form\CallbackTransformer;
 | 
			
		||||
use Chill\PersonBundle\Form\DataTransformer\PersonToIdTransformer;
 | 
			
		||||
use Chill\PersonBundle\Templating\Entity\SocialIssueRender;
 | 
			
		||||
use Symfony\Component\OptionsResolver\OptionsResolver;
 | 
			
		||||
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
 | 
			
		||||
 | 
			
		||||
use function in_array;
 | 
			
		||||
 | 
			
		||||
class ActivityType extends AbstractType
 | 
			
		||||
{
 | 
			
		||||
    protected User $user;
 | 
			
		||||
    /**
 | 
			
		||||
     * @var AuthorizationHelper
 | 
			
		||||
     */
 | 
			
		||||
    protected $authorizationHelper;
 | 
			
		||||
 | 
			
		||||
    protected AuthorizationHelper $authorizationHelper;
 | 
			
		||||
    /**
 | 
			
		||||
     * @var ObjectManager
 | 
			
		||||
     */
 | 
			
		||||
    protected $om;
 | 
			
		||||
 | 
			
		||||
    protected ObjectManager $om;
 | 
			
		||||
    protected $timeChoices;
 | 
			
		||||
 | 
			
		||||
    protected TranslatableStringHelper $translatableStringHelper;
 | 
			
		||||
    /**
 | 
			
		||||
     * @var TranslatableStringHelper
 | 
			
		||||
     */
 | 
			
		||||
    protected $translatableStringHelper;
 | 
			
		||||
 | 
			
		||||
    protected array $timeChoices;
 | 
			
		||||
    /**
 | 
			
		||||
     * the user running this form.
 | 
			
		||||
     *
 | 
			
		||||
     * @var User
 | 
			
		||||
     */
 | 
			
		||||
    protected $user;
 | 
			
		||||
 | 
			
		||||
    public function __construct (
 | 
			
		||||
    public function __construct(
 | 
			
		||||
        TokenStorageInterface $tokenStorage,
 | 
			
		||||
        AuthorizationHelper $authorizationHelper,
 | 
			
		||||
        ObjectManager $om,
 | 
			
		||||
        TranslatableStringHelper $translatableStringHelper,
 | 
			
		||||
        array $timeChoices,
 | 
			
		||||
        SocialIssueRender $socialIssueRender
 | 
			
		||||
        array $timeChoices
 | 
			
		||||
    ) {
 | 
			
		||||
        if (!$tokenStorage->getToken()->getUser() instanceof User) {
 | 
			
		||||
            throw new \RuntimeException("you should have a valid user");
 | 
			
		||||
            throw new RuntimeException('you should have a valid user');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $this->user = $tokenStorage->getToken()->getUser();
 | 
			
		||||
        $this->authorizationHelper = $authorizationHelper;
 | 
			
		||||
        $this->om = $om;
 | 
			
		||||
        $this->translatableStringHelper = $translatableStringHelper;
 | 
			
		||||
        $this->timeChoices = $timeChoices;
 | 
			
		||||
        $this->socialIssueRender = $socialIssueRender;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function buildForm(FormBuilderInterface $builder, array $options): void
 | 
			
		||||
    public function buildForm(FormBuilderInterface $builder, array $options)
 | 
			
		||||
    {
 | 
			
		||||
        // handle times choices
 | 
			
		||||
        $timeChoices = [];
 | 
			
		||||
@@ -83,286 +96,104 @@ class ActivityType extends AbstractType
 | 
			
		||||
            'placeholder' => 'Choose the duration',
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        /** @var \Chill\ActivityBundle\Entity\ActivityType $activityType */
 | 
			
		||||
        $activityType = $options['activityType'];
 | 
			
		||||
 | 
			
		||||
        if (!$activityType->isActive()) {
 | 
			
		||||
            throw new \InvalidArgumentException('Activity type must be active');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // TODO revoir la gestion des center au niveau du form des activité.
 | 
			
		||||
        if ($options['center']) {
 | 
			
		||||
            $builder->add('scope', ScopePickerType::class, [
 | 
			
		||||
                'center' => $options['center'],
 | 
			
		||||
                'role' => $options['role']
 | 
			
		||||
            ]);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /** @var ? \Chill\PersonBundle\Entity\AccompanyingPeriod  $accompanyingPeriod */
 | 
			
		||||
        $accompanyingPeriod = NULL;
 | 
			
		||||
        if ($options['accompanyingPeriod']) {
 | 
			
		||||
            $accompanyingPeriod = $options['accompanyingPeriod'];
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ($activityType->isVisible('socialIssues') && $accompanyingPeriod) {
 | 
			
		||||
            $builder->add('socialIssues', EntityType::class, [
 | 
			
		||||
                'label' => $activityType->getLabel('socialIssues'),
 | 
			
		||||
                'required' => $activityType->isRequired('socialIssues'),
 | 
			
		||||
                'class' => SocialIssue::class,
 | 
			
		||||
                'choice_label' => function (SocialIssue $socialIssue) {
 | 
			
		||||
                    return $this->socialIssueRender->renderString($socialIssue, []);
 | 
			
		||||
                },
 | 
			
		||||
                'multiple' => true,
 | 
			
		||||
                'choices' => $accompanyingPeriod->getRecursiveSocialIssues(),
 | 
			
		||||
        $builder
 | 
			
		||||
            ->add('date', ChillDateType::class, [
 | 
			
		||||
                'required' => true,
 | 
			
		||||
            ])
 | 
			
		||||
            ->add('durationTime', ChoiceType::class, $durationTimeOptions)
 | 
			
		||||
            ->add('attendee', ChoiceType::class, [
 | 
			
		||||
                'expanded' => true,
 | 
			
		||||
            ]);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ($activityType->isVisible('socialActions') && $accompanyingPeriod) {
 | 
			
		||||
            $builder->add('socialActions', EntityType::class, [
 | 
			
		||||
                'label' => $activityType->getLabel('socialActions'),
 | 
			
		||||
                'required' => $activityType->isRequired('socialActions'),
 | 
			
		||||
                'class' => SocialAction::class,
 | 
			
		||||
                'choice_label' => function (SocialAction $socialAction) {
 | 
			
		||||
                    return $this->translatableStringHelper->localize($socialAction->getTitle());
 | 
			
		||||
                },
 | 
			
		||||
                'multiple' => true,
 | 
			
		||||
                'choices' => $accompanyingPeriod->getRecursiveSocialActions(),
 | 
			
		||||
                'expanded' => true,
 | 
			
		||||
            ]);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ($activityType->isVisible('date')) {
 | 
			
		||||
            $builder->add('date', ChillDateType::class, [
 | 
			
		||||
                'label' => $activityType->getLabel('date'),
 | 
			
		||||
                'required' => $activityType->isRequired('date'),
 | 
			
		||||
            ]);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ($activityType->isVisible('durationTime')) {
 | 
			
		||||
            $durationTimeOptions['label'] = $activityType->getLabel('durationTime');
 | 
			
		||||
            $durationTimeOptions['required'] = $activityType->isRequired('durationTime');
 | 
			
		||||
 | 
			
		||||
            $builder->add('durationTime', ChoiceType::class, $durationTimeOptions);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ($activityType->isVisible('travelTime')) {
 | 
			
		||||
            $durationTimeOptions['label'] = $activityType->getLabel('travelTime');
 | 
			
		||||
            $durationTimeOptions['required'] = $activityType->isRequired('travelTime');
 | 
			
		||||
 | 
			
		||||
            $builder->add('travelTime', ChoiceType::class, $durationTimeOptions);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ($activityType->isVisible('attendee')) {
 | 
			
		||||
            $builder->add('attendee', EntityType::class, [
 | 
			
		||||
                'label' => $activityType->getLabel('attendee'),
 | 
			
		||||
                'required' => $activityType->isRequired('attendee'),
 | 
			
		||||
                'expanded' => true,
 | 
			
		||||
                'class' => ActivityPresence::class,
 | 
			
		||||
                'choice_label' => function (ActivityPresence $activityPresence) {
 | 
			
		||||
                    return $this->translatableStringHelper->localize($activityPresence->getName());
 | 
			
		||||
                },
 | 
			
		||||
                'query_builder' => function (EntityRepository $er) {
 | 
			
		||||
                    return $er->createQueryBuilder('a')
 | 
			
		||||
                        ->where('a.active = true');
 | 
			
		||||
                },
 | 
			
		||||
            ]);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ($activityType->isVisible('user') && $options['center']) {
 | 
			
		||||
            $builder->add('user', UserPickerType::class, [
 | 
			
		||||
                'label' => $activityType->getLabel('user'),
 | 
			
		||||
                'required' => $activityType->isRequired('user'),
 | 
			
		||||
                'center' => $options['center'],
 | 
			
		||||
                'role'   => $options['role']
 | 
			
		||||
            ]);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ($activityType->isVisible('reasons')) {
 | 
			
		||||
            $builder->add('reasons', EntityType::class, [
 | 
			
		||||
                'label' => $activityType->getLabel('reasons'),
 | 
			
		||||
                'required' => $activityType->isRequired('reasons'),
 | 
			
		||||
                'class' => ActivityReason::class,
 | 
			
		||||
                'multiple' => true,
 | 
			
		||||
                'choice_label' => function (ActivityReason $activityReason) {
 | 
			
		||||
                    return $this->translatableStringHelper->localize($activityReason->getName());
 | 
			
		||||
                },
 | 
			
		||||
                'attr' => array('class' => 'select2 '),
 | 
			
		||||
                'query_builder' => function (EntityRepository $er) {
 | 
			
		||||
                    return $er->createQueryBuilder('a')
 | 
			
		||||
                        ->where('a.active = true');
 | 
			
		||||
                },
 | 
			
		||||
            ]);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ($activityType->isVisible('comment')) {
 | 
			
		||||
            $builder->add('comment', CommentType::class, [
 | 
			
		||||
                'label' => $activityType->getLabel('comment'),
 | 
			
		||||
                'required' => $activityType->isRequired('comment'),
 | 
			
		||||
            ]);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ($activityType->isVisible('persons')) {
 | 
			
		||||
            $builder->add('persons', HiddenType::class, [
 | 
			
		||||
               //'data_class' => Person::class,
 | 
			
		||||
            ]);
 | 
			
		||||
            $builder->get('persons')
 | 
			
		||||
               ->addModelTransformer(new CallbackTransformer(
 | 
			
		||||
                   function (iterable $personsAsIterable): string {
 | 
			
		||||
                       $personIds = [];
 | 
			
		||||
                       foreach ($personsAsIterable as $value) {
 | 
			
		||||
                          $personIds[] = $value->getId();
 | 
			
		||||
                       }
 | 
			
		||||
                       return implode(',', $personIds);
 | 
			
		||||
                   },
 | 
			
		||||
                   function (?string $personsAsString): array {
 | 
			
		||||
                       return array_map(
 | 
			
		||||
                          fn(string $id): ?Person => $this->om->getRepository(Person::class)->findOneBy(['id' => (int) $id]),
 | 
			
		||||
                          explode(',', $personsAsString)
 | 
			
		||||
                       );
 | 
			
		||||
                   }
 | 
			
		||||
               ))
 | 
			
		||||
           ;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ($activityType->isVisible('thirdParties')) {
 | 
			
		||||
            $builder->add('thirdParties', HiddenType::class, [
 | 
			
		||||
               //'data_class' => ThirdParty::class,
 | 
			
		||||
            ]);
 | 
			
		||||
            $builder->get('thirdParties')
 | 
			
		||||
               ->addModelTransformer(new CallbackTransformer(
 | 
			
		||||
                   function (iterable $thirdpartyAsIterable): string {
 | 
			
		||||
                       $thirdpartyIds = [];
 | 
			
		||||
                       foreach ($thirdpartyAsIterable as $value) {
 | 
			
		||||
                          $thirdpartyIds[] = $value->getId();
 | 
			
		||||
                       }
 | 
			
		||||
                       return implode(',', $thirdpartyIds);
 | 
			
		||||
                   },
 | 
			
		||||
                   function (?string $thirdpartyAsString): array {
 | 
			
		||||
                       return array_map(
 | 
			
		||||
                           fn(string $id): ?ThirdParty => $this->om->getRepository(ThirdParty::class)->findOneBy(['id' => (int) $id]),
 | 
			
		||||
                           explode(',', $thirdpartyAsString)
 | 
			
		||||
                       );
 | 
			
		||||
                   }
 | 
			
		||||
               ))
 | 
			
		||||
           ;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ($activityType->isVisible('documents')) {
 | 
			
		||||
            $builder->add('documents', ChillCollectionType::class, [
 | 
			
		||||
                'entry_type' => StoredObjectType::class,
 | 
			
		||||
                'label' => $activityType->getLabel('documents'),
 | 
			
		||||
                'required' => $activityType->isRequired('documents'),
 | 
			
		||||
                'allow_add' => true,
 | 
			
		||||
                'button_add_label' => 'activity.Insert a document',
 | 
			
		||||
                'button_remove_label' => 'activity.Remove a document'
 | 
			
		||||
            ]);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ($activityType->isVisible('users')) {
 | 
			
		||||
            $builder->add('users', HiddenType::class, [
 | 
			
		||||
               //'data_class' => User::class,
 | 
			
		||||
            ]);
 | 
			
		||||
            $builder->get('users')
 | 
			
		||||
               ->addModelTransformer(new CallbackTransformer(
 | 
			
		||||
                   function (iterable $usersAsIterable): string {
 | 
			
		||||
                       $userIds = [];
 | 
			
		||||
                       foreach ($usersAsIterable as $value) {
 | 
			
		||||
                           $userIds[] = $value->getId();
 | 
			
		||||
                       }
 | 
			
		||||
                       return implode(',', $userIds);
 | 
			
		||||
                   },
 | 
			
		||||
                   function (?string $usersAsString): array {
 | 
			
		||||
                       return array_map(
 | 
			
		||||
                           fn(string $id): ?User => $this->om->getRepository(User::class)->findOneBy(['id' => (int) $id]),
 | 
			
		||||
                           explode(',', $usersAsString)
 | 
			
		||||
                       );
 | 
			
		||||
                   }
 | 
			
		||||
               ))
 | 
			
		||||
           ;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ($activityType->isVisible('emergency')) {
 | 
			
		||||
            $builder->add('emergency', CheckboxType::class, [
 | 
			
		||||
                'label' => $activityType->getLabel('emergency'),
 | 
			
		||||
                'required' => $activityType->isRequired('emergency'),
 | 
			
		||||
            ]);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ($activityType->isVisible('sentReceived')) {
 | 
			
		||||
            $builder->add('sentReceived', ChoiceType::class, [
 | 
			
		||||
                'label' => $activityType->getLabel('sentReceived'),
 | 
			
		||||
                'required' => $activityType->isRequired('sentReceived'),
 | 
			
		||||
                'required' => false,
 | 
			
		||||
                'choices' => [
 | 
			
		||||
                    'Sent' => Activity::SENTRECEIVED_SENT,
 | 
			
		||||
                    'Received' => Activity::SENTRECEIVED_RECEIVED,
 | 
			
		||||
                    'present' => true,
 | 
			
		||||
                    'not present' => false,
 | 
			
		||||
                ],
 | 
			
		||||
            ])
 | 
			
		||||
            ->add('user', UserPickerType::class, [
 | 
			
		||||
                'center' => $options['center'],
 | 
			
		||||
                'role' => $options['role'],
 | 
			
		||||
            ])
 | 
			
		||||
            ->add('scope', ScopePickerType::class, [
 | 
			
		||||
                'center' => $options['center'],
 | 
			
		||||
                'role' => $options['role'],
 | 
			
		||||
            ])
 | 
			
		||||
            ->add('reasons', TranslatableActivityReason::class, [
 | 
			
		||||
                'multiple' => true,
 | 
			
		||||
                'required' => false,
 | 
			
		||||
            ])
 | 
			
		||||
            ->add('type', TranslatableActivityType::class, [
 | 
			
		||||
                'placeholder' => 'Choose a type',
 | 
			
		||||
                'active_only' => true,
 | 
			
		||||
            ])
 | 
			
		||||
            ->add('comment', CommentType::class, [
 | 
			
		||||
                'required' => false,
 | 
			
		||||
            ]);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        foreach (['durationTime', 'travelTime'] as $fieldName) {
 | 
			
		||||
            if (!$activityType->isVisible($fieldName)) {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
        $builder->get('durationTime')
 | 
			
		||||
            ->addModelTransformer($durationTimeTransformer);
 | 
			
		||||
 | 
			
		||||
            $builder->get($fieldName)
 | 
			
		||||
                ->addModelTransformer($durationTimeTransformer);
 | 
			
		||||
 | 
			
		||||
            $builder->get($fieldName)
 | 
			
		||||
                ->addEventListener(FormEvents::PRE_SET_DATA, function(FormEvent $formEvent) use (
 | 
			
		||||
        $builder->get('durationTime')
 | 
			
		||||
            ->addEventListener(
 | 
			
		||||
                FormEvents::PRE_SET_DATA,
 | 
			
		||||
                static function (FormEvent $formEvent) use (
 | 
			
		||||
                    $timeChoices,
 | 
			
		||||
                    $builder,
 | 
			
		||||
                    $durationTimeTransformer,
 | 
			
		||||
                    $durationTimeOptions,
 | 
			
		||||
                    $fieldName
 | 
			
		||||
                    $durationTimeOptions
 | 
			
		||||
                ) {
 | 
			
		||||
                    // set the timezone to GMT, and fix the difference between current and GMT
 | 
			
		||||
                    // the datetimetransformer will then handle timezone as GMT
 | 
			
		||||
                    $timezoneUTC = new \DateTimeZone('GMT');
 | 
			
		||||
                    /* @var $data \DateTime */
 | 
			
		||||
                    $data = $formEvent->getData() === NULL ?
 | 
			
		||||
                        \DateTime::createFromFormat('U', 300) :
 | 
			
		||||
                        $formEvent->getData();
 | 
			
		||||
                    $timezoneUTC = new DateTimeZone('GMT');
 | 
			
		||||
                    /** @var DateTime $data */
 | 
			
		||||
                    $data = $formEvent->getData() === null ?
 | 
			
		||||
                                    DateTime::createFromFormat('U', 300) :
 | 
			
		||||
                                    $formEvent->getData();
 | 
			
		||||
                    $seconds = $data->getTimezone()->getOffset($data);
 | 
			
		||||
                    $data->setTimeZone($timezoneUTC);
 | 
			
		||||
                    $data->add(new \DateInterval('PT'.$seconds.'S'));
 | 
			
		||||
                    $data->add(new DateInterval('PT' . $seconds . 'S'));
 | 
			
		||||
 | 
			
		||||
                    // test if the timestamp is in the choices.
 | 
			
		||||
                    // If not, recreate the field with the new timestamp
 | 
			
		||||
                    if (!in_array($data->getTimestamp(), $timeChoices)) {
 | 
			
		||||
                    if (!in_array($data->getTimestamp(), $timeChoices, true)) {
 | 
			
		||||
                        // the data are not in the possible values. add them
 | 
			
		||||
                        $timeChoices[$data->format('H:i')] = $data->getTimestamp();
 | 
			
		||||
                        $form = $builder->create($fieldName, ChoiceType::class, array_merge(
 | 
			
		||||
                            $durationTimeOptions, [
 | 
			
		||||
                                'choices' => $timeChoices,
 | 
			
		||||
                                'auto_initialize' => false
 | 
			
		||||
                            ]
 | 
			
		||||
                        ));
 | 
			
		||||
                        $form = $builder->create(
 | 
			
		||||
                            'durationTime',
 | 
			
		||||
                            ChoiceType::class,
 | 
			
		||||
                            array_merge(
 | 
			
		||||
                                $durationTimeOptions,
 | 
			
		||||
                                [
 | 
			
		||||
                                    'choices' => $timeChoices,
 | 
			
		||||
                                    'auto_initialize' => false,
 | 
			
		||||
                                ]
 | 
			
		||||
                            )
 | 
			
		||||
                        );
 | 
			
		||||
                        $form->addModelTransformer($durationTimeTransformer);
 | 
			
		||||
                        $formEvent->getForm()->getParent()->add($form->getForm());
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
        }
 | 
			
		||||
                }
 | 
			
		||||
            );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    public function configureOptions(OptionsResolver $resolver): void
 | 
			
		||||
    /**
 | 
			
		||||
     * @param OptionsResolverInterface $resolver
 | 
			
		||||
     */
 | 
			
		||||
    public function configureOptions(OptionsResolver $resolver)
 | 
			
		||||
    {
 | 
			
		||||
        $resolver->setDefaults([
 | 
			
		||||
            'data_class' => Activity::class
 | 
			
		||||
            'data_class' => 'Chill\ActivityBundle\Entity\Activity',
 | 
			
		||||
        ]);
 | 
			
		||||
 | 
			
		||||
        $resolver
 | 
			
		||||
            ->setRequired(['center', 'role', 'activityType', 'accompanyingPeriod'])
 | 
			
		||||
            ->setAllowedTypes('center', ['null', 'Chill\MainBundle\Entity\Center'])
 | 
			
		||||
            ->setAllowedTypes('role', 'Symfony\Component\Security\Core\Role\Role')
 | 
			
		||||
            ->setAllowedTypes('activityType', \Chill\ActivityBundle\Entity\ActivityType::class)
 | 
			
		||||
            ->setAllowedTypes('accompanyingPeriod', [\Chill\PersonBundle\Entity\AccompanyingPeriod::class, 'null'])
 | 
			
		||||
        ;
 | 
			
		||||
            ->setRequired(['center', 'role'])
 | 
			
		||||
            ->setAllowedTypes('center', 'Chill\MainBundle\Entity\Center')
 | 
			
		||||
            ->setAllowedTypes('role', 'Symfony\Component\Security\Core\Role\Role');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getBlockPrefix(): string
 | 
			
		||||
    /**
 | 
			
		||||
     * @return string
 | 
			
		||||
     */
 | 
			
		||||
    public function getBlockPrefix()
 | 
			
		||||
    {
 | 
			
		||||
        return 'chill_activitybundle_activity';
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,39 +0,0 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Form;
 | 
			
		||||
 | 
			
		||||
use Chill\ActivityBundle\Entity\ActivityTypeCategory;
 | 
			
		||||
use Symfony\Component\Form\AbstractType;
 | 
			
		||||
use Symfony\Component\Form\Extension\Core\Type\NumberType;
 | 
			
		||||
use Symfony\Component\Form\FormBuilderInterface;
 | 
			
		||||
use Symfony\Component\OptionsResolver\OptionsResolver;
 | 
			
		||||
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
 | 
			
		||||
use Chill\MainBundle\Form\Type\TranslatableStringFormType;
 | 
			
		||||
 | 
			
		||||
class ActivityTypeCategoryType extends AbstractType
 | 
			
		||||
{
 | 
			
		||||
    public function buildForm(FormBuilderInterface $builder, array $options): void
 | 
			
		||||
    {
 | 
			
		||||
        $builder
 | 
			
		||||
            ->add('name', TranslatableStringFormType::class)
 | 
			
		||||
            ->add('active', ChoiceType::class, array(
 | 
			
		||||
                'choices' => array(
 | 
			
		||||
                    'Yes' => true,
 | 
			
		||||
                    'No'  => false
 | 
			
		||||
                ),
 | 
			
		||||
                'expanded' => true
 | 
			
		||||
            ))
 | 
			
		||||
            ->add('ordering', NumberType::class, [
 | 
			
		||||
                'required' => true,
 | 
			
		||||
                'scale' => 5
 | 
			
		||||
            ])
 | 
			
		||||
        ;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function configureOptions(OptionsResolver $resolver): void
 | 
			
		||||
    {
 | 
			
		||||
        $resolver->setDefaults(array(
 | 
			
		||||
            'data_class' => ActivityTypeCategory::class
 | 
			
		||||
        ));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,28 +1,26 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Form;
 | 
			
		||||
 | 
			
		||||
use Chill\ActivityBundle\Entity\ActivityTypeCategory;
 | 
			
		||||
use Chill\ActivityBundle\Form\Type\ActivityFieldPresence;
 | 
			
		||||
use Chill\MainBundle\Templating\TranslatableStringHelper;
 | 
			
		||||
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
 | 
			
		||||
use Chill\MainBundle\Form\Type\TranslatableStringFormType;
 | 
			
		||||
use Symfony\Component\Form\AbstractType;
 | 
			
		||||
use Symfony\Component\Form\Extension\Core\Type\NumberType;
 | 
			
		||||
use Symfony\Component\Form\Extension\Core\Type\TextType;
 | 
			
		||||
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
 | 
			
		||||
use Symfony\Component\Form\FormBuilderInterface;
 | 
			
		||||
use Symfony\Component\OptionsResolver\OptionsResolver;
 | 
			
		||||
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
 | 
			
		||||
use Chill\MainBundle\Form\Type\TranslatableStringFormType;
 | 
			
		||||
 | 
			
		||||
class ActivityTypeType extends AbstractType
 | 
			
		||||
{
 | 
			
		||||
    private TranslatableStringHelper $translatableStringHelper;
 | 
			
		||||
 | 
			
		||||
    public function __construct(TranslatableStringHelper $translatableStringHelper)
 | 
			
		||||
    {
 | 
			
		||||
        $this->translatableStringHelper = $translatableStringHelper;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function buildForm(FormBuilderInterface $builder, array $options)
 | 
			
		||||
    {
 | 
			
		||||
        $builder
 | 
			
		||||
@@ -30,42 +28,27 @@ class ActivityTypeType extends AbstractType
 | 
			
		||||
            ->add('active', ChoiceType::class, [
 | 
			
		||||
                'choices' => [
 | 
			
		||||
                    'Yes' => true,
 | 
			
		||||
                    'No'  => false
 | 
			
		||||
                    'No' => false,
 | 
			
		||||
                ],
 | 
			
		||||
                'expanded' => true
 | 
			
		||||
            ])
 | 
			
		||||
            ->add('category', EntityType::class, [
 | 
			
		||||
                'class' => ActivityTypeCategory::class,
 | 
			
		||||
                'choice_label' => function (ActivityTypeCategory $activityTypeCategory) {
 | 
			
		||||
                    return $this->translatableStringHelper->localize($activityTypeCategory->getName());
 | 
			
		||||
                },
 | 
			
		||||
            ])
 | 
			
		||||
            ->add('ordering', NumberType::class, [
 | 
			
		||||
                'required' => true,
 | 
			
		||||
                'scale' => 5
 | 
			
		||||
            ])
 | 
			
		||||
        ;
 | 
			
		||||
 | 
			
		||||
        $fields = [
 | 
			
		||||
            'persons', 'user', 'date', 'place', 'persons',
 | 
			
		||||
            'thirdParties', 'durationTime', 'travelTime', 'attendee',
 | 
			
		||||
            'reasons', 'comment', 'sentReceived', 'documents',
 | 
			
		||||
            'emergency', 'accompanyingPeriod', 'socialData', 'users'
 | 
			
		||||
        ];
 | 
			
		||||
        foreach ($fields as $field) {
 | 
			
		||||
            $builder
 | 
			
		||||
                ->add($field.'Visible', ActivityFieldPresence::class)
 | 
			
		||||
                ->add($field.'Label', TextType::class, [
 | 
			
		||||
                    'required' => false,
 | 
			
		||||
                    'empty_data' => '',
 | 
			
		||||
                ]);
 | 
			
		||||
        }
 | 
			
		||||
                'expanded' => true,
 | 
			
		||||
            ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @param OptionsResolverInterface $resolver
 | 
			
		||||
     */
 | 
			
		||||
    public function configureOptions(OptionsResolver $resolver)
 | 
			
		||||
    {
 | 
			
		||||
        $resolver->setDefaults(array(
 | 
			
		||||
            'data_class' => \Chill\ActivityBundle\Entity\ActivityType::class
 | 
			
		||||
        ));
 | 
			
		||||
        $resolver->setDefaults([
 | 
			
		||||
            'data_class' => 'Chill\ActivityBundle\Entity\ActivityType',
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return string
 | 
			
		||||
     */
 | 
			
		||||
    public function getBlockPrefix()
 | 
			
		||||
    {
 | 
			
		||||
        return 'chill_activitybundle_activitytype';
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,29 +0,0 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Form\Type;
 | 
			
		||||
 | 
			
		||||
use Chill\ActivityBundle\Entity\ActivityType;
 | 
			
		||||
use Symfony\Component\Form\AbstractType;
 | 
			
		||||
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
 | 
			
		||||
use Symfony\Component\OptionsResolver\OptionsResolver;
 | 
			
		||||
 | 
			
		||||
class ActivityFieldPresence extends AbstractType
 | 
			
		||||
{
 | 
			
		||||
    public function getParent()
 | 
			
		||||
    {
 | 
			
		||||
        return ChoiceType::class;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function configureOptions(OptionsResolver $resolver)
 | 
			
		||||
    {
 | 
			
		||||
        $resolver->setDefaults(
 | 
			
		||||
            array(
 | 
			
		||||
                'choices' => [
 | 
			
		||||
                    'Invisible' => ActivityType::FIELD_INVISIBLE,
 | 
			
		||||
                    'Optional' => ActivityType::FIELD_OPTIONAL,
 | 
			
		||||
                    'Required' => ActivityType::FIELD_REQUIRED,
 | 
			
		||||
                ],
 | 
			
		||||
            )
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,54 +1,41 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Chill is a software for social workers
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2014-2020, Champs Libres Cooperative SCRLFS,
 | 
			
		||||
 * <http://www.champs-libres.coop>, <info@champs-libres.coop>
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as
 | 
			
		||||
 * published by the Free Software Foundation, either version 3 of the
 | 
			
		||||
 * License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Form\Type;
 | 
			
		||||
 | 
			
		||||
use Symfony\Component\Form\AbstractType;
 | 
			
		||||
use Symfony\Component\OptionsResolver\OptionsResolver;
 | 
			
		||||
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
 | 
			
		||||
use Chill\MainBundle\Templating\TranslatableStringHelper;
 | 
			
		||||
use Doctrine\ORM\EntityRepository;
 | 
			
		||||
use Chill\ActivityBundle\Entity\ActivityReason;
 | 
			
		||||
use Chill\ActivityBundle\Templating\Entity\ActivityReasonRender;
 | 
			
		||||
use Chill\MainBundle\Templating\TranslatableStringHelper;
 | 
			
		||||
use Doctrine\ORM\EntityRepository;
 | 
			
		||||
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
 | 
			
		||||
use Symfony\Component\Form\AbstractType;
 | 
			
		||||
use Symfony\Component\OptionsResolver\OptionsResolver;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * FormType to choose amongst activity reasons
 | 
			
		||||
 * 
 | 
			
		||||
 * FormType to choose amongst activity reasons.
 | 
			
		||||
 */
 | 
			
		||||
class TranslatableActivityReason extends AbstractType
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     *
 | 
			
		||||
     * @var TranslatableStringHelper
 | 
			
		||||
     */
 | 
			
		||||
    protected $translatableStringHelper;
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     *
 | 
			
		||||
     * @var ActivityReasonRender
 | 
			
		||||
     */
 | 
			
		||||
    protected $reasonRender;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @var TranslatableStringHelper
 | 
			
		||||
     */
 | 
			
		||||
    protected $translatableStringHelper;
 | 
			
		||||
 | 
			
		||||
    public function __construct(
 | 
			
		||||
        TranslatableStringHelper $translatableStringHelper,
 | 
			
		||||
        ActivityReasonRender $reasonRender
 | 
			
		||||
@@ -57,6 +44,30 @@ class TranslatableActivityReason extends AbstractType
 | 
			
		||||
        $this->reasonRender = $reasonRender;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function configureOptions(OptionsResolver $resolver)
 | 
			
		||||
    {
 | 
			
		||||
        $resolver->setDefaults(
 | 
			
		||||
            [
 | 
			
		||||
                'class' => 'ChillActivityBundle:ActivityReason',
 | 
			
		||||
                'choice_label' => function (ActivityReason $choice) {
 | 
			
		||||
                    return $this->reasonRender->renderString($choice, []);
 | 
			
		||||
                },
 | 
			
		||||
                'group_by' => function (ActivityReason $choice): ?string {
 | 
			
		||||
                    if (null !== $category = $choice->getCategory()) {
 | 
			
		||||
                        return $this->translatableStringHelper->localize($category->getName());
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    return null;
 | 
			
		||||
                },
 | 
			
		||||
                'query_builder' => static function (EntityRepository $er) {
 | 
			
		||||
                    return $er->createQueryBuilder('r')
 | 
			
		||||
                        ->where('r.active = true');
 | 
			
		||||
                },
 | 
			
		||||
                'attr' => ['class' => ' select2 '],
 | 
			
		||||
            ]
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getBlockPrefix()
 | 
			
		||||
    {
 | 
			
		||||
        return 'translatable_activity_reason';
 | 
			
		||||
@@ -66,28 +77,4 @@ class TranslatableActivityReason extends AbstractType
 | 
			
		||||
    {
 | 
			
		||||
        return EntityType::class;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public function configureOptions(OptionsResolver $resolver)
 | 
			
		||||
    {
 | 
			
		||||
        $resolver->setDefaults(
 | 
			
		||||
            array(
 | 
			
		||||
                'class' => 'ChillActivityBundle:ActivityReason',
 | 
			
		||||
                'choice_label' => function(ActivityReason $choice)  {
 | 
			
		||||
                    return $this->reasonRender->renderString($choice, []);
 | 
			
		||||
                },
 | 
			
		||||
                'group_by' => function(ActivityReason $choice): ?string {
 | 
			
		||||
                    if (null !== $category = $choice->getCategory()) {
 | 
			
		||||
                        return $this->translatableStringHelper->localize($category->getName());
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    return null;
 | 
			
		||||
                },
 | 
			
		||||
                'query_builder' => function (EntityRepository $er) {
 | 
			
		||||
                    return $er->createQueryBuilder('r')
 | 
			
		||||
                        ->where('r.active = true');
 | 
			
		||||
                },
 | 
			
		||||
                'attr' => [ 'class' => ' select2 ']
 | 
			
		||||
            )
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,40 +1,27 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Chill is a software for social workers
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2014-2015, Champs Libres Cooperative SCRLFS,
 | 
			
		||||
 * <http://www.champs-libres.coop>, <info@champs-libres.coop>
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as
 | 
			
		||||
 * published by the Free Software Foundation, either version 3 of the
 | 
			
		||||
 * License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Form\Type;
 | 
			
		||||
 | 
			
		||||
use Symfony\Component\Form\AbstractType;
 | 
			
		||||
use Symfony\Component\OptionsResolver\OptionsResolver;
 | 
			
		||||
use Symfony\Component\HttpFoundation\RequestStack;
 | 
			
		||||
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
 | 
			
		||||
use Doctrine\ORM\EntityRepository;
 | 
			
		||||
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
 | 
			
		||||
use Symfony\Component\Form\AbstractType;
 | 
			
		||||
use Symfony\Component\HttpFoundation\RequestStack;
 | 
			
		||||
use Symfony\Component\OptionsResolver\OptionsResolver;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Description of TranslatableActivityReasonCategory
 | 
			
		||||
 *
 | 
			
		||||
 * @author Champs-Libres Coop
 | 
			
		||||
 * Description of TranslatableActivityReasonCategory.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class TranslatableActivityReasonCategory extends AbstractType
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
@@ -47,6 +34,21 @@ class TranslatableActivityReasonCategory extends AbstractType
 | 
			
		||||
        $this->requestStack = $requestStack;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function configureOptions(OptionsResolver $resolver)
 | 
			
		||||
    {
 | 
			
		||||
        $locale = $this->requestStack->getCurrentRequest()->getLocale();
 | 
			
		||||
        $resolver->setDefaults(
 | 
			
		||||
            [
 | 
			
		||||
                'class' => 'ChillActivityBundle:ActivityReasonCategory',
 | 
			
		||||
                'choice_label' => 'name[' . $locale . ']',
 | 
			
		||||
                'query_builder' => static function (EntityRepository $er) {
 | 
			
		||||
                    return $er->createQueryBuilder('c')
 | 
			
		||||
                        ->where('c.active = true');
 | 
			
		||||
                },
 | 
			
		||||
            ]
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getBlockPrefix()
 | 
			
		||||
    {
 | 
			
		||||
        return 'translatable_activity_reason_category';
 | 
			
		||||
@@ -56,19 +58,4 @@ class TranslatableActivityReasonCategory extends AbstractType
 | 
			
		||||
    {
 | 
			
		||||
        return EntityType::class;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function configureOptions(OptionsResolver $resolver)
 | 
			
		||||
    {
 | 
			
		||||
        $locale = $this->requestStack->getCurrentRequest()->getLocale();
 | 
			
		||||
        $resolver->setDefaults(
 | 
			
		||||
            array(
 | 
			
		||||
                'class' => 'ChillActivityBundle:ActivityReasonCategory',
 | 
			
		||||
                'choice_label' => 'name['.$locale.']',
 | 
			
		||||
                'query_builder' => function (EntityRepository $er) {
 | 
			
		||||
                    return $er->createQueryBuilder('c')
 | 
			
		||||
                        ->where('c.active = true');
 | 
			
		||||
                }
 | 
			
		||||
            )
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,60 +1,71 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Chill is a software for social workers
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2014-2015, Champs Libres Cooperative SCRLFS,
 | 
			
		||||
 * <http://www.champs-libres.coop>, <info@champs-libres.coop>
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as
 | 
			
		||||
 * published by the Free Software Foundation, either version 3 of the
 | 
			
		||||
 * License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Form\Type;
 | 
			
		||||
 | 
			
		||||
use Symfony\Component\Form\AbstractType;
 | 
			
		||||
use Symfony\Component\OptionsResolver\OptionsResolver;
 | 
			
		||||
use Symfony\Component\HttpFoundation\RequestStack;
 | 
			
		||||
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
 | 
			
		||||
use Chill\ActivityBundle\Entity\ActivityType;
 | 
			
		||||
use Chill\MainBundle\Templating\TranslatableStringHelper;
 | 
			
		||||
use Doctrine\ORM\EntityRepository;
 | 
			
		||||
use Chill\ActivityBundle\Entity\ActivityType;
 | 
			
		||||
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
 | 
			
		||||
use Symfony\Component\Form\AbstractType;
 | 
			
		||||
use Symfony\Component\OptionsResolver\OptionsResolver;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Description of TranslatableActivityType
 | 
			
		||||
 *
 | 
			
		||||
 * @author Champs-Libres Coop
 | 
			
		||||
 * Description of TranslatableActivityType.
 | 
			
		||||
 */
 | 
			
		||||
class TranslatableActivityType extends AbstractType
 | 
			
		||||
{
 | 
			
		||||
    protected $activityTypeRepository;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     *
 | 
			
		||||
     * @var TranslatableStringHelper
 | 
			
		||||
     */
 | 
			
		||||
    protected $translatableStringHelper;
 | 
			
		||||
 | 
			
		||||
    protected $activityTypeRepository;
 | 
			
		||||
 | 
			
		||||
    public function __construct(
 | 
			
		||||
            TranslatableStringHelper $helper,
 | 
			
		||||
            EntityRepository $activityTypeRepository
 | 
			
		||||
            )
 | 
			
		||||
    {
 | 
			
		||||
        TranslatableStringHelper $helper,
 | 
			
		||||
        EntityRepository $activityTypeRepository
 | 
			
		||||
    ) {
 | 
			
		||||
        $this->translatableStringHelper = $helper;
 | 
			
		||||
        $this->activityTypeRepository = $activityTypeRepository;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function buildForm(\Symfony\Component\Form\FormBuilderInterface $builder, array $options)
 | 
			
		||||
    {
 | 
			
		||||
        /** @var \Doctrine\ORM\QueryBuilder $qb */
 | 
			
		||||
        $qb = $options['query_builder'];
 | 
			
		||||
 | 
			
		||||
        if (true === $options['active_only']) {
 | 
			
		||||
            $qb->where($qb->expr()->eq('at.active', ':active'));
 | 
			
		||||
            $qb->setParameter('active', true, \Doctrine\DBAL\Types\Type::BOOLEAN);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function configureOptions(OptionsResolver $resolver)
 | 
			
		||||
    {
 | 
			
		||||
        $resolver->setDefaults(
 | 
			
		||||
            [
 | 
			
		||||
                'class' => 'ChillActivityBundle:ActivityType',
 | 
			
		||||
                'active_only' => true,
 | 
			
		||||
                'query_builder' => $this->activityTypeRepository
 | 
			
		||||
                    ->createQueryBuilder('at'),
 | 
			
		||||
                'choice_label' => function (ActivityType $type) {
 | 
			
		||||
                    return $this->translatableStringHelper->localize($type->getName());
 | 
			
		||||
                },
 | 
			
		||||
            ]
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getBlockPrefix()
 | 
			
		||||
    {
 | 
			
		||||
        return 'translatable_activity_type';
 | 
			
		||||
@@ -64,30 +75,4 @@ class TranslatableActivityType extends AbstractType
 | 
			
		||||
    {
 | 
			
		||||
        return EntityType::class;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function buildForm(\Symfony\Component\Form\FormBuilderInterface $builder, array $options) {
 | 
			
		||||
        /* @var $qb \Doctrine\ORM\QueryBuilder */
 | 
			
		||||
        $qb = $options['query_builder'];
 | 
			
		||||
 | 
			
		||||
        if ($options['active_only'] === true) {
 | 
			
		||||
            $qb->where($qb->expr()->eq('at.active', ':active'));
 | 
			
		||||
            $qb->setParameter('active', true, \Doctrine\DBAL\Types\Type::BOOLEAN);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function configureOptions(OptionsResolver $resolver)
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
        $resolver->setDefaults(
 | 
			
		||||
            array(
 | 
			
		||||
                'class' => 'ChillActivityBundle:ActivityType',
 | 
			
		||||
                'active_only' => true,
 | 
			
		||||
                'query_builder' => $this->activityTypeRepository
 | 
			
		||||
                    ->createQueryBuilder('at'),
 | 
			
		||||
                'choice_label' => function (ActivityType $type) {
 | 
			
		||||
                    return $this->translatableStringHelper->localize($type->getName());
 | 
			
		||||
                }
 | 
			
		||||
            )
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,54 +0,0 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Menu;
 | 
			
		||||
 | 
			
		||||
use Chill\MainBundle\Routing\LocalMenuBuilderInterface;
 | 
			
		||||
use Chill\MainBundle\Security\Authorization\AuthorizationHelper;
 | 
			
		||||
use Knp\Menu\MenuItem;
 | 
			
		||||
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
 | 
			
		||||
use Symfony\Contracts\Translation\TranslatorInterface;
 | 
			
		||||
 | 
			
		||||
class AccompanyingCourseMenuBuilder implements LocalMenuBuilderInterface
 | 
			
		||||
{
 | 
			
		||||
    protected TokenStorageInterface $tokenStorage;
 | 
			
		||||
 | 
			
		||||
    protected AuthorizationHelper $authorizationHelper;
 | 
			
		||||
 | 
			
		||||
    protected TranslatorInterface $translator;
 | 
			
		||||
 | 
			
		||||
    public function __construct(
 | 
			
		||||
        TokenStorageInterface $tokenStorage,
 | 
			
		||||
        AuthorizationHelper $authorizationHelper,
 | 
			
		||||
        TranslatorInterface $translator
 | 
			
		||||
    ) {
 | 
			
		||||
        $this->translator = $translator;
 | 
			
		||||
        $this->authorizationHelper = $authorizationHelper;
 | 
			
		||||
        $this->tokenStorage = $tokenStorage;
 | 
			
		||||
    }
 | 
			
		||||
    public static function getMenuIds(): array
 | 
			
		||||
    {
 | 
			
		||||
        return ['accompanyingCourse'];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function buildMenu($menuId, MenuItem $menu, array $parameters)
 | 
			
		||||
    {
 | 
			
		||||
        $period = $parameters['accompanyingCourse'];
 | 
			
		||||
 | 
			
		||||
        $menu->addChild($this->translator->trans('Activity list'), [
 | 
			
		||||
            'route' => 'chill_activity_activity_list',
 | 
			
		||||
            'routeParameters' => [
 | 
			
		||||
                'accompanying_period_id' => $period->getId(),
 | 
			
		||||
            ]])
 | 
			
		||||
            ->setExtras(['order' => 40]);
 | 
			
		||||
 | 
			
		||||
        $menu->addChild($this->translator->trans('Add a new activity'), [
 | 
			
		||||
            'route' => 'chill_activity_activity_select_type',
 | 
			
		||||
            'routeParameters' => [
 | 
			
		||||
                'accompanying_period_id' => $period->getId(),
 | 
			
		||||
            ]])
 | 
			
		||||
            ->setExtras(['order' => 41]);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,45 +1,46 @@
 | 
			
		||||
<?php
 | 
			
		||||
/*
 | 
			
		||||
 * 
 | 
			
		||||
 */
 | 
			
		||||
namespace Chill\ActivityBundle\Menu;
 | 
			
		||||
 | 
			
		||||
use Chill\MainBundle\Routing\LocalMenuBuilderInterface;
 | 
			
		||||
use Chill\MainBundle\Security\Authorization\AuthorizationHelper;
 | 
			
		||||
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
 | 
			
		||||
use Symfony\Component\Translation\TranslatorInterface;
 | 
			
		||||
use Knp\Menu\MenuItem;
 | 
			
		||||
use Symfony\Component\Security\Core\Role\Role;
 | 
			
		||||
use Chill\ActivityBundle\Security\Authorization\ActivityVoter;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Julien Fastré <julien.fastre@champs-libres.coop>
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Menu;
 | 
			
		||||
 | 
			
		||||
use Chill\ActivityBundle\Security\Authorization\ActivityVoter;
 | 
			
		||||
use Chill\MainBundle\Routing\LocalMenuBuilderInterface;
 | 
			
		||||
use Chill\MainBundle\Security\Authorization\AuthorizationHelper;
 | 
			
		||||
use Knp\Menu\MenuItem;
 | 
			
		||||
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
 | 
			
		||||
use Symfony\Component\Security\Core\Role\Role;
 | 
			
		||||
use Symfony\Component\Translation\TranslatorInterface;
 | 
			
		||||
 | 
			
		||||
class MenuBuilder implements LocalMenuBuilderInterface
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     *
 | 
			
		||||
     * @var TokenStorageInterface
 | 
			
		||||
     */
 | 
			
		||||
    protected $tokenStorage;
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     *
 | 
			
		||||
     * @var TranslatorInterface
 | 
			
		||||
     */
 | 
			
		||||
    protected $translator;
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     *
 | 
			
		||||
     * @var AuthorizationHelper
 | 
			
		||||
     */
 | 
			
		||||
    protected $authorizationHelper;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @var TokenStorageInterface
 | 
			
		||||
     */
 | 
			
		||||
    protected $tokenStorage;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @var TranslatorInterface
 | 
			
		||||
     */
 | 
			
		||||
    protected $translator;
 | 
			
		||||
 | 
			
		||||
    public function __construct(
 | 
			
		||||
        TokenStorageInterface $tokenStorage, 
 | 
			
		||||
        TranslatorInterface $translator, 
 | 
			
		||||
        TokenStorageInterface $tokenStorage,
 | 
			
		||||
        TranslatorInterface $translator,
 | 
			
		||||
        AuthorizationHelper $authorizationHelper
 | 
			
		||||
    ) {
 | 
			
		||||
        $this->tokenStorage = $tokenStorage;
 | 
			
		||||
@@ -47,42 +48,41 @@ class MenuBuilder implements LocalMenuBuilderInterface
 | 
			
		||||
        $this->authorizationHelper = $authorizationHelper;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
    public function buildMenu($menuId, MenuItem $menu, array $parameters)
 | 
			
		||||
    {
 | 
			
		||||
        /* @var $person \Chill\PersonBundle\Entity\Person */
 | 
			
		||||
        $person  = $parameters['person'];
 | 
			
		||||
        $user    = $this->tokenStorage->getToken()->getUser();
 | 
			
		||||
        /** @var \Chill\PersonBundle\Entity\Person $person */
 | 
			
		||||
        $person = $parameters['person'];
 | 
			
		||||
        $user = $this->tokenStorage->getToken()->getUser();
 | 
			
		||||
        $roleSee = new Role(ActivityVoter::SEE);
 | 
			
		||||
        $roleAdd = new Role(ActivityVoter::CREATE);
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        if ($this->authorizationHelper->userHasAccess($user, $person, $roleSee)) {
 | 
			
		||||
            $menu->addChild($this->translator->trans('Activity list'), [
 | 
			
		||||
                    'route' => 'chill_activity_activity_list',
 | 
			
		||||
                    'routeParameters' => [
 | 
			
		||||
                        'person_id' => $person->getId()
 | 
			
		||||
                    ]
 | 
			
		||||
                ])
 | 
			
		||||
                'route' => 'chill_activity_activity_list',
 | 
			
		||||
                'routeParameters' => [
 | 
			
		||||
                    'person_id' => $person->getId(),
 | 
			
		||||
                ],
 | 
			
		||||
            ])
 | 
			
		||||
                ->setExtras([
 | 
			
		||||
                    'order' => 201
 | 
			
		||||
                    'order' => 201,
 | 
			
		||||
                ]);
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        if ($this->authorizationHelper->userHasAccess($user, $person, $roleAdd)) {
 | 
			
		||||
            $menu->addChild($this->translator->trans('Add a new activity'), [
 | 
			
		||||
                    'route' => 'chill_activity_activity_new',
 | 
			
		||||
                    'routeParameters' => [
 | 
			
		||||
                        'person_id' => $person->getId()
 | 
			
		||||
                    ]
 | 
			
		||||
                ])
 | 
			
		||||
                'route' => 'chill_activity_activity_new',
 | 
			
		||||
                'routeParameters' => [
 | 
			
		||||
                    'person_id' => $person->getId(),
 | 
			
		||||
                ],
 | 
			
		||||
            ])
 | 
			
		||||
                ->setExtras([
 | 
			
		||||
                    'order' => 200
 | 
			
		||||
                    'order' => 200,
 | 
			
		||||
                ]);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static function getMenuIds(): array
 | 
			
		||||
    {
 | 
			
		||||
        return [ 'person' ];
 | 
			
		||||
        return ['person'];
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,78 +1,69 @@
 | 
			
		||||
<?php
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2018 Julien Fastré <julien.fastre@champs-libres.coop>
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
 * the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Menu;
 | 
			
		||||
 | 
			
		||||
use Chill\ActivityBundle\Security\Authorization\ActivityVoter;
 | 
			
		||||
use Chill\MainBundle\Routing\LocalMenuBuilderInterface;
 | 
			
		||||
use Knp\Menu\MenuItem;
 | 
			
		||||
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
 | 
			
		||||
use Chill\ActivityBundle\Security\Authorization\ActivityVoter;
 | 
			
		||||
use Symfony\Component\Translation\TranslatorInterface;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 
 | 
			
		||||
 *
 | 
			
		||||
 * @author Julien Fastré <julien.fastre@champs-libres.coop>
 | 
			
		||||
 */
 | 
			
		||||
class PersonMenuBuilder implements LocalMenuBuilderInterface
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     *
 | 
			
		||||
     * @var TranslatorInterface
 | 
			
		||||
     */
 | 
			
		||||
    protected $translator;
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     *
 | 
			
		||||
     * @var AuthorizationCheckerInterface
 | 
			
		||||
     */
 | 
			
		||||
    protected $authorizationChecker;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @var TranslatorInterface
 | 
			
		||||
     */
 | 
			
		||||
    protected $translator;
 | 
			
		||||
 | 
			
		||||
    public function __construct(
 | 
			
		||||
        AuthorizationCheckerInterface $authorizationChecker,
 | 
			
		||||
        TranslatorInterface $translator)
 | 
			
		||||
    {
 | 
			
		||||
        TranslatorInterface $translator
 | 
			
		||||
    ) {
 | 
			
		||||
        $this->translator = $translator;
 | 
			
		||||
        $this->authorizationChecker = $authorizationChecker;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
    public function buildMenu($menuId, MenuItem $menu, array $parameters)
 | 
			
		||||
    {
 | 
			
		||||
        /* @var $person \Chill\PersonBundle\Entity\Person */
 | 
			
		||||
        /** @var \Chill\PersonBundle\Entity\Person $person */
 | 
			
		||||
        $person = $parameters['person'];
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        if ($this->authorizationChecker->isGranted(ActivityVoter::SEE, $person)) {
 | 
			
		||||
            $menu->addChild(
 | 
			
		||||
                $this->translator->trans('Activity list'), [
 | 
			
		||||
                $this->translator->trans('Activity list'),
 | 
			
		||||
                [
 | 
			
		||||
                    'route' => 'chill_activity_activity_list',
 | 
			
		||||
                    'routeParameters' => [ 'person_id' => $person->getId() ],
 | 
			
		||||
                ])
 | 
			
		||||
                ->setExtra('order', 201)
 | 
			
		||||
                ;
 | 
			
		||||
                    'routeParameters' => ['person_id' => $person->getId()],
 | 
			
		||||
                ]
 | 
			
		||||
            )
 | 
			
		||||
                ->setExtra('order', 201);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ($this->authorizationChecker->isGranted(ActivityVoter::CREATE, $person)) {
 | 
			
		||||
            $menu->addChild(
 | 
			
		||||
                $this->translator->trans('Add a new activity'), [
 | 
			
		||||
                $this->translator->trans('Add a new activity'),
 | 
			
		||||
                [
 | 
			
		||||
                    'route' => 'chill_activity_activity_new',
 | 
			
		||||
                    'routeParameters' => [ 'person_id' => $person->getId() ],
 | 
			
		||||
                ])
 | 
			
		||||
                ->setExtra('order', 200)
 | 
			
		||||
                ;
 | 
			
		||||
                    'routeParameters' => ['person_id' => $person->getId()],
 | 
			
		||||
                ]
 | 
			
		||||
            )
 | 
			
		||||
                ->setExtra('order', 200);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,169 +0,0 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Chill is a software for social workers
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2021, Champs Libres Cooperative SCRLFS,
 | 
			
		||||
 * <http://www.champs-libres.coop>, <info@champs-libres.coop>
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as
 | 
			
		||||
 * published by the Free Software Foundation, either version 3 of the
 | 
			
		||||
 * License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Repository;
 | 
			
		||||
 | 
			
		||||
use Chill\ActivityBundle\Entity\Activity;
 | 
			
		||||
use Chill\PersonBundle\Entity\Person;
 | 
			
		||||
use Chill\ActivityBundle\Repository\ActivityRepository;
 | 
			
		||||
use Chill\ActivityBundle\Security\Authorization\ActivityVoter;
 | 
			
		||||
use Chill\MainBundle\Entity\Scope;
 | 
			
		||||
use Doctrine\ORM\QueryBuilder;
 | 
			
		||||
use Doctrine\ORM\Query\Expr\Orx;
 | 
			
		||||
use Chill\MainBundle\Security\Authorization\AuthorizationHelper;
 | 
			
		||||
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
 | 
			
		||||
use Symfony\Component\Security\Core\Role\Role;
 | 
			
		||||
use Doctrine\ORM\EntityManagerInterface;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
final class ActivityACLAwareRepository 
 | 
			
		||||
{
 | 
			
		||||
    private AuthorizationHelper $authorizationHelper;
 | 
			
		||||
 | 
			
		||||
    private TokenStorageInterface $tokenStorage;
 | 
			
		||||
 | 
			
		||||
    private ActivityRepository $repository;
 | 
			
		||||
 | 
			
		||||
    private EntityManagerInterface $em;
 | 
			
		||||
 | 
			
		||||
    public function __construct(
 | 
			
		||||
        AuthorizationHelper $authorizationHelper,
 | 
			
		||||
        TokenStorageInterface $tokenStorage,
 | 
			
		||||
        ActivityRepository $repository,
 | 
			
		||||
        EntityManagerInterface $em
 | 
			
		||||
    ) {
 | 
			
		||||
        $this->authorizationHelper = $authorizationHelper;
 | 
			
		||||
        $this->tokenStorage = $tokenStorage;
 | 
			
		||||
        $this->repository = $repository;
 | 
			
		||||
        $this->em = $em;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function queryTimelineIndexer(string $context, array $args = []): array
 | 
			
		||||
    {
 | 
			
		||||
        $metadataActivity = $this->em->getClassMetadata(Activity::class);
 | 
			
		||||
 | 
			
		||||
        $from = $this->getFromClauseCenter($args);
 | 
			
		||||
        [$where, $parameters] = $this->getWhereClause($context, $args);
 | 
			
		||||
 | 
			
		||||
        return [
 | 
			
		||||
           'id' => $metadataActivity->getTableName()
 | 
			
		||||
                .'.'.$metadataActivity->getColumnName('id'),
 | 
			
		||||
           'type' => 'activity',
 | 
			
		||||
           'date' => $metadataActivity->getTableName()
 | 
			
		||||
                .'.'.$metadataActivity->getColumnName('date'),
 | 
			
		||||
           'FROM' => $from,
 | 
			
		||||
           'WHERE' => $where,
 | 
			
		||||
           'parameters' => $parameters
 | 
			
		||||
       ];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private function getFromClauseCenter(array $args): string
 | 
			
		||||
    {
 | 
			
		||||
        $metadataActivity = $this->em->getClassMetadata(Activity::class);
 | 
			
		||||
        $metadataPerson = $this->em->getClassMetadata(Person::class);
 | 
			
		||||
        $associationMapping = $metadataActivity->getAssociationMapping('person');
 | 
			
		||||
        
 | 
			
		||||
        return $metadataActivity->getTableName().' JOIN '
 | 
			
		||||
            .$metadataPerson->getTableName().' ON '
 | 
			
		||||
            .$metadataPerson->getTableName().'.'.
 | 
			
		||||
                $associationMapping['joinColumns'][0]['referencedColumnName']
 | 
			
		||||
            .' = '
 | 
			
		||||
            .$associationMapping['joinColumns'][0]['name']
 | 
			
		||||
            ;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private function getWhereClause(string $context, array $args): array
 | 
			
		||||
    {
 | 
			
		||||
        $where = '';
 | 
			
		||||
        $parameters = [];
 | 
			
		||||
        
 | 
			
		||||
        $metadataActivity = $this->em->getClassMetadata(Activity::class);
 | 
			
		||||
        $metadataPerson = $this->em->getClassMetadata(Person::class);
 | 
			
		||||
        $activityToPerson = $metadataActivity->getAssociationMapping('person')['joinColumns'][0]['name'];
 | 
			
		||||
        $activityToScope  = $metadataActivity->getAssociationMapping('scope')['joinColumns'][0]['name'];
 | 
			
		||||
        $personToCenter = $metadataPerson->getAssociationMapping('center')['joinColumns'][0]['name'];
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        // acls:
 | 
			
		||||
        $role = new Role(ActivityVoter::SEE);
 | 
			
		||||
        $reachableCenters = $this->authorizationHelper->getReachableCenters($this->tokenStorage->getToken()->getUser(), 
 | 
			
		||||
                $role);
 | 
			
		||||
        
 | 
			
		||||
        if (count($reachableCenters) === 0) {
 | 
			
		||||
            // insert a dummy condition
 | 
			
		||||
            return 'FALSE = TRUE';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ($context === 'person') { 
 | 
			
		||||
            // we start with activities having the person_id linked to person 
 | 
			
		||||
            $where .= sprintf('%s = ? AND ', $activityToPerson);
 | 
			
		||||
            $parameters[] = $person->getId();
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        // we add acl (reachable center and scopes)
 | 
			
		||||
        $where .= '('; // first loop for the for centers
 | 
			
		||||
        $centersI = 0; // like centers#i
 | 
			
		||||
        foreach ($reachableCenters as $center) {
 | 
			
		||||
            // we pass if not in centers
 | 
			
		||||
            if (!\in_array($center, $args['centers'])) {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
            // we get all the reachable scopes for this center
 | 
			
		||||
            $reachableScopes = $this->authorizationHelper->getReachableScopes($this->tokenStorage->getToken()->getUser(), $role, $center);
 | 
			
		||||
            // we get the ids for those scopes
 | 
			
		||||
            $reachablesScopesId = array_map(
 | 
			
		||||
                function(Scope $scope) { return $scope->getId(); }, 
 | 
			
		||||
                $reachableScopes
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
            // if not the first center
 | 
			
		||||
            if ($centersI > 0) {
 | 
			
		||||
                $where .= ') OR (';
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // condition for the center
 | 
			
		||||
            $where .= sprintf(' %s.%s = ? ', $metadataPerson->getTableName(), $personToCenter);
 | 
			
		||||
            $parameters[] = $center->getId();
 | 
			
		||||
 | 
			
		||||
            // begin loop for scopes
 | 
			
		||||
            $where .= ' AND (';
 | 
			
		||||
            $scopesI = 0; //like scope#i
 | 
			
		||||
 | 
			
		||||
            foreach ($reachablesScopesId as $scopeId) {
 | 
			
		||||
                if ($scopesI > 0) {
 | 
			
		||||
                    $where .= ' OR ';
 | 
			
		||||
                }
 | 
			
		||||
                $where .= sprintf(' %s.%s = ? ', $metadataActivity->getTableName(), $activityToScope);
 | 
			
		||||
                $parameters[] = $scopeId;
 | 
			
		||||
                $scopesI ++;
 | 
			
		||||
            }
 | 
			
		||||
            // close loop for scopes
 | 
			
		||||
            $where .= ') ';
 | 
			
		||||
            $centersI++;
 | 
			
		||||
        }
 | 
			
		||||
        // close loop for centers
 | 
			
		||||
        $where .= ')';
 | 
			
		||||
        
 | 
			
		||||
        return [$where, $parameters];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -1,42 +0,0 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Chill is a software for social workers
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2021, Champs Libres Cooperative SCRLFS,
 | 
			
		||||
 * <http://www.champs-libres.coop>, <info@champs-libres.coop>
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as
 | 
			
		||||
 * published by the Free Software Foundation, either version 3 of the
 | 
			
		||||
 * License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Repository;
 | 
			
		||||
 | 
			
		||||
use Chill\ActivityBundle\Entity\Activity;
 | 
			
		||||
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
 | 
			
		||||
use Doctrine\Persistence\ManagerRegistry;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @method AccompanyingPeriodParticipation|null find($id, $lockMode = null, $lockVersion = null)
 | 
			
		||||
 * @method AccompanyingPeriodParticipation|null findOneBy(array $criteria, array $orderBy = null)
 | 
			
		||||
 * @method AccompanyingPeriodParticipation[]    findAll()
 | 
			
		||||
 * @method AccompanyingPeriodParticipation[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
 | 
			
		||||
 */
 | 
			
		||||
class ActivityRepository extends ServiceEntityRepository
 | 
			
		||||
{
 | 
			
		||||
    public function __construct(ManagerRegistry $registry)
 | 
			
		||||
    {
 | 
			
		||||
        parent::__construct($registry, Activity::class);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,10 @@
 | 
			
		||||
@import '~ChillMainSass/custom/config/colors';
 | 
			
		||||
@import '~ChillMainSass/custom/mixins/entity';
 | 
			
		||||
 | 
			
		||||
.chill-entity.chill-entity__activity-reason {
 | 
			
		||||
    @include entity($chill-pink, white);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.activity {
 | 
			
		||||
    color: $chill-green;
 | 
			
		||||
}
 | 
			
		||||
@@ -1 +1 @@
 | 
			
		||||
require('./scss/chillactivity.scss');
 | 
			
		||||
require('./activity/activity.scss');
 | 
			
		||||
 
 | 
			
		||||
@@ -1,114 +0,0 @@
 | 
			
		||||
@import '~ChillMainSass/custom/config/colors';
 | 
			
		||||
@import '~ChillMainSass/custom/mixins/entity';
 | 
			
		||||
 | 
			
		||||
.chill-entity.chill-entity__activity-reason {
 | 
			
		||||
    @include entity($chill-pink, white);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.activity {
 | 
			
		||||
    color: $chill-green;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// exceptions for flex-bloc in concerned-groups
 | 
			
		||||
div.flex-bloc.concerned-groups {
 | 
			
		||||
   margin-top: 1em;
 | 
			
		||||
   div.item-bloc {
 | 
			
		||||
      flex-grow: 0; flex-shrink: 0; flex-basis: 25%; //4 blocs
 | 
			
		||||
      ul.list-content {
 | 
			
		||||
         list-style-type: none;
 | 
			
		||||
         padding-left: 0;
 | 
			
		||||
         li {
 | 
			
		||||
            margin-bottom: 0.2em;
 | 
			
		||||
            a {
 | 
			
		||||
               color: white;
 | 
			
		||||
               cursor: pointer;
 | 
			
		||||
               &:hover {
 | 
			
		||||
                  color: #ffffffab;
 | 
			
		||||
               }
 | 
			
		||||
            }
 | 
			
		||||
         }
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
   &.person div.item-bloc {
 | 
			
		||||
      flex-basis: 33%; //3 blocs
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// exceptions for flex-table in list-records
 | 
			
		||||
div.flex-table.list-records {
 | 
			
		||||
   div.item-bloc {
 | 
			
		||||
      div.item-row.main {
 | 
			
		||||
         div.item-col {
 | 
			
		||||
            &:first-child {
 | 
			
		||||
               flex-basis: 27%;
 | 
			
		||||
            }
 | 
			
		||||
            ul.list-content {
 | 
			
		||||
               li.social-issues, li.social-actions {
 | 
			
		||||
                  .badge-primary {
 | 
			
		||||
                     font-variant: small-caps;
 | 
			
		||||
                     font-weight: bold;
 | 
			
		||||
                     font-size: 88%;
 | 
			
		||||
                     margin-bottom: 0.2em;
 | 
			
		||||
                  }
 | 
			
		||||
               }
 | 
			
		||||
               li.social-issues .badge-primary {
 | 
			
		||||
                  background-color: var(--chill-orange);
 | 
			
		||||
               }
 | 
			
		||||
               li.social-actions .badge-primary {
 | 
			
		||||
                  background-color: var(--chill-green);
 | 
			
		||||
               }
 | 
			
		||||
            }
 | 
			
		||||
         }
 | 
			
		||||
      }
 | 
			
		||||
      div.item-row.details {
 | 
			
		||||
         flex-direction: row;
 | 
			
		||||
         & > div.item-col {
 | 
			
		||||
            justify-content: flex-start;
 | 
			
		||||
            align-self: center;
 | 
			
		||||
            &:nth-child(1) {
 | 
			
		||||
               flex-grow: 1; flex-shrink: 0; flex-basis: 30%;
 | 
			
		||||
            }
 | 
			
		||||
            &:nth-child(2) {
 | 
			
		||||
               flex-grow: 0; flex-shrink: 1; flex-basis: 70%;
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
            &:only-child {
 | 
			
		||||
               flex-grow: 0; flex-shrink: 0; flex-basis: 100%;
 | 
			
		||||
               & > div.concerned-groups {
 | 
			
		||||
                  flex-grow: 0; flex-shrink: 0; flex-basis: 100%;
 | 
			
		||||
                  display: flex;
 | 
			
		||||
                  flex-direction: column; // TODO pas fini
 | 
			
		||||
                  div.group {
 | 
			
		||||
                     flex-grow: 1; flex-shrink: 0; flex-basis: 30%;
 | 
			
		||||
                     h4 {} 
 | 
			
		||||
                     ul.list-content {
 | 
			
		||||
                        li { 
 | 
			
		||||
                           display: inline;
 | 
			
		||||
                        } 
 | 
			
		||||
                     }
 | 
			
		||||
                  }
 | 
			
		||||
               }
 | 
			
		||||
            }
 | 
			
		||||
         }
 | 
			
		||||
         div.concerned-groups {
 | 
			
		||||
            font-size: 85%;
 | 
			
		||||
            h4 {
 | 
			
		||||
               text-transform: uppercase;
 | 
			
		||||
            }
 | 
			
		||||
         }
 | 
			
		||||
      }
 | 
			
		||||
      ul.list-content {
 | 
			
		||||
         list-style-type: none;
 | 
			
		||||
         padding-left: 1em;
 | 
			
		||||
         margin: 0 0;
 | 
			
		||||
         li {
 | 
			
		||||
            margin-bottom: 0.2em;
 | 
			
		||||
         }
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
   div.duration {
 | 
			
		||||
      font-size: smaller;
 | 
			
		||||
      padding-left: 1em;
 | 
			
		||||
      margin-top: 1em;
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,170 +0,0 @@
 | 
			
		||||
<template>
 | 
			
		||||
   <teleport to="#add-persons">
 | 
			
		||||
 | 
			
		||||
      <div class="flex-bloc concerned-groups" :class="getContext">
 | 
			
		||||
         <persons-bloc 
 | 
			
		||||
            v-for="bloc in contextPersonsBlocs"
 | 
			
		||||
            v-bind:key="bloc.key"
 | 
			
		||||
            v-bind:bloc="bloc"
 | 
			
		||||
            v-bind:setPersonsInBloc="setPersonsInBloc">
 | 
			
		||||
         </persons-bloc>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
      <add-persons 
 | 
			
		||||
         buttonTitle="activity.add_persons"
 | 
			
		||||
         modalTitle="activity.add_persons"
 | 
			
		||||
         v-bind:key="addPersons.key"
 | 
			
		||||
         v-bind:options="addPersons.options"
 | 
			
		||||
         @addNewPersons="addNewPersons"
 | 
			
		||||
         ref="addPersons">
 | 
			
		||||
      </add-persons>
 | 
			
		||||
 
 | 
			
		||||
  </teleport>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import { mapState } from 'vuex';
 | 
			
		||||
import AddPersons from 'ChillPersonAssets/vuejs/_components/AddPersons.vue';
 | 
			
		||||
import PersonsBloc from './components/PersonsBloc.vue';
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
   name: "App",
 | 
			
		||||
   components: {
 | 
			
		||||
      AddPersons,
 | 
			
		||||
      PersonsBloc
 | 
			
		||||
   },
 | 
			
		||||
   data() {
 | 
			
		||||
      return {
 | 
			
		||||
         personsBlocs: [
 | 
			
		||||
            {  key: 'persons', 
 | 
			
		||||
               title: 'activity.bloc_persons', 
 | 
			
		||||
               persons: [], 
 | 
			
		||||
               included: false 
 | 
			
		||||
            },
 | 
			
		||||
            {  key: 'personsAssociated', 
 | 
			
		||||
               title: 'activity.bloc_persons_associated', 
 | 
			
		||||
               persons: [], 
 | 
			
		||||
               included: false 
 | 
			
		||||
            },
 | 
			
		||||
            {  key: 'personsNotAssociated', 
 | 
			
		||||
               title: 'activity.bloc_persons_not_associated', 
 | 
			
		||||
               persons: [], 
 | 
			
		||||
               included: false 
 | 
			
		||||
            },
 | 
			
		||||
            {  key: 'thirdparty', 
 | 
			
		||||
               title: 'activity.bloc_thirdparty', 
 | 
			
		||||
               persons: [], 
 | 
			
		||||
               included: true
 | 
			
		||||
            },
 | 
			
		||||
            {  key: 'users', 
 | 
			
		||||
               title: 'activity.bloc_users', 
 | 
			
		||||
               persons: [], 
 | 
			
		||||
               included: true
 | 
			
		||||
            },
 | 
			
		||||
         ],
 | 
			
		||||
         addPersons: {
 | 
			
		||||
            key: 'activity',
 | 
			
		||||
            options: {
 | 
			
		||||
               type: ['person', 'thirdparty'], // TODO add 'user'
 | 
			
		||||
               priority: null,
 | 
			
		||||
               uniq: false,
 | 
			
		||||
            }
 | 
			
		||||
         }
 | 
			
		||||
      }
 | 
			
		||||
   },
 | 
			
		||||
   computed: {
 | 
			
		||||
      ...mapState({
 | 
			
		||||
         persons: state => state.activity.persons,
 | 
			
		||||
         thirdParties: state => state.activity.thirdParties,
 | 
			
		||||
         users: state => state.activity.users,
 | 
			
		||||
         accompanyingCourse: state => state.activity.accompanyingPeriod
 | 
			
		||||
      }),
 | 
			
		||||
      getContext() {
 | 
			
		||||
         return (this.accompanyingCourse) ? "accompanyingCourse" : "person";
 | 
			
		||||
      },
 | 
			
		||||
      contextPersonsBlocs() {
 | 
			
		||||
         return this.personsBlocs.filter(bloc => bloc.included !== false);
 | 
			
		||||
      }
 | 
			
		||||
   },
 | 
			
		||||
   mounted() {
 | 
			
		||||
      this.setPersonsInBloc();
 | 
			
		||||
   },
 | 
			
		||||
   methods: {
 | 
			
		||||
      setPersonsInBloc() {
 | 
			
		||||
         let groups; 
 | 
			
		||||
         if (this.accompanyingCourse) {
 | 
			
		||||
            groups = this.splitPersonsInGroups();
 | 
			
		||||
         }     
 | 
			
		||||
         this.personsBlocs.forEach(bloc => {
 | 
			
		||||
            if (this.accompanyingCourse) {
 | 
			
		||||
               switch (bloc.key) {
 | 
			
		||||
                  case 'personsAssociated':
 | 
			
		||||
                     bloc.persons = groups.personsAssociated;
 | 
			
		||||
                     bloc.included = true;
 | 
			
		||||
                     break;
 | 
			
		||||
                  case 'personsNotAssociated':
 | 
			
		||||
                     bloc.persons = groups.personsNotAssociated;
 | 
			
		||||
                     bloc.included = true;
 | 
			
		||||
                     break;
 | 
			
		||||
               }
 | 
			
		||||
            } else {
 | 
			
		||||
               switch (bloc.key) {
 | 
			
		||||
                  case 'persons': 
 | 
			
		||||
                     bloc.persons = this.persons;
 | 
			
		||||
                     bloc.included = true;
 | 
			
		||||
                     break;
 | 
			
		||||
               }
 | 
			
		||||
            }
 | 
			
		||||
            switch (bloc.key) {
 | 
			
		||||
               case 'thirdparty':
 | 
			
		||||
                  bloc.persons = this.thirdParties;
 | 
			
		||||
                  break;
 | 
			
		||||
               case 'users':
 | 
			
		||||
                  bloc.persons = this.users;
 | 
			
		||||
                  break;
 | 
			
		||||
            }
 | 
			
		||||
         }, groups);
 | 
			
		||||
      },
 | 
			
		||||
      splitPersonsInGroups() {
 | 
			
		||||
         let personsAssociated = [];
 | 
			
		||||
         let personsNotAssociated = this.persons;
 | 
			
		||||
         let participations = this.getCourseParticipations();         
 | 
			
		||||
         this.persons.forEach(person => {
 | 
			
		||||
            participations.forEach(participation => {
 | 
			
		||||
               if (person.id === participation.id) {
 | 
			
		||||
                  console.log(person.id);
 | 
			
		||||
                  personsAssociated.push(person);
 | 
			
		||||
                  personsNotAssociated = personsNotAssociated.filter(p => p !== person);
 | 
			
		||||
               }
 | 
			
		||||
            });
 | 
			
		||||
         });
 | 
			
		||||
         return { 
 | 
			
		||||
            'personsAssociated': personsAssociated, 
 | 
			
		||||
            'personsNotAssociated': personsNotAssociated 
 | 
			
		||||
         };
 | 
			
		||||
      },
 | 
			
		||||
      getCourseParticipations() {
 | 
			
		||||
         let participations = [];
 | 
			
		||||
         this.accompanyingCourse.participations.forEach(participation => {
 | 
			
		||||
            if (!participation.endDate) {
 | 
			
		||||
               participations.push(participation.person);
 | 
			
		||||
            }
 | 
			
		||||
         });
 | 
			
		||||
         return participations;
 | 
			
		||||
      },
 | 
			
		||||
      addNewPersons({ selected, modal }) {
 | 
			
		||||
         console.log('@@@ CLICK button addNewPersons', selected);
 | 
			
		||||
         selected.forEach(function(item) {
 | 
			
		||||
               this.$store.dispatch('addPersonsInvolved', item);
 | 
			
		||||
            }, this
 | 
			
		||||
         );
 | 
			
		||||
         this.$refs.addPersons.resetSearch(); // to cast child method
 | 
			
		||||
         modal.showModal = false;
 | 
			
		||||
         this.setPersonsInBloc();
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="scss">
 | 
			
		||||
</style>
 | 
			
		||||
@@ -1,29 +0,0 @@
 | 
			
		||||
<template>
 | 
			
		||||
   <li>
 | 
			
		||||
      <span class="badge badge-primary" :title="person.text">
 | 
			
		||||
         <span class="chill_denomination">
 | 
			
		||||
            {{ textCutted }}
 | 
			
		||||
         </span>
 | 
			
		||||
         <a class="fa fa-fw fa-times"
 | 
			
		||||
            @click.prevent="$emit('remove', person)">
 | 
			
		||||
         </a>
 | 
			
		||||
      </span>
 | 
			
		||||
   </li>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
export default {
 | 
			
		||||
   name: "PersonBadge",
 | 
			
		||||
   props: ['person'],
 | 
			
		||||
   computed: {
 | 
			
		||||
      textCutted() {
 | 
			
		||||
         let more = (this.person.text.length > 15) ?'…' : '';
 | 
			
		||||
         return this.person.text.slice(0,15) + more;
 | 
			
		||||
      }
 | 
			
		||||
   },
 | 
			
		||||
   emits: ['remove'],
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="css" scoped>
 | 
			
		||||
</style>
 | 
			
		||||
@@ -1,41 +0,0 @@
 | 
			
		||||
<template>
 | 
			
		||||
   <div class="item-bloc">
 | 
			
		||||
      <div class="item-row">
 | 
			
		||||
         <div class="item-col">
 | 
			
		||||
            <h4>{{ $t(bloc.title) }}</h4>
 | 
			
		||||
         </div>
 | 
			
		||||
         <div class="item-col">
 | 
			
		||||
            <ul class="list-content">
 | 
			
		||||
               <person-badge
 | 
			
		||||
                  v-for="person in bloc.persons"
 | 
			
		||||
                  v-bind:key="person.id"
 | 
			
		||||
                  v-bind:person="person"
 | 
			
		||||
                  @remove="removePerson">
 | 
			
		||||
               </person-badge>
 | 
			
		||||
            </ul>
 | 
			
		||||
         </div>
 | 
			
		||||
      </div>
 | 
			
		||||
   </div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import PersonBadge from './PersonBadge.vue';
 | 
			
		||||
export default {
 | 
			
		||||
   name:"PersonsBloc",
 | 
			
		||||
   components: {
 | 
			
		||||
      PersonBadge
 | 
			
		||||
   },
 | 
			
		||||
   props: ['bloc', 'setPersonsInBloc'],
 | 
			
		||||
   methods: {
 | 
			
		||||
      removePerson(item) {
 | 
			
		||||
         console.log('@@ CLICK remove person: item', item);
 | 
			
		||||
         this.$store.dispatch('removePersonInvolved', item);
 | 
			
		||||
         this.setPersonsInBloc();
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="scss">
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
@@ -1,20 +0,0 @@
 | 
			
		||||
import { personMessages } from 'ChillPersonAssets/vuejs/_js/i18n'
 | 
			
		||||
 | 
			
		||||
const appMessages = {
 | 
			
		||||
   fr: {
 | 
			
		||||
      activity: {
 | 
			
		||||
         add_persons: "Ajouter des personnes concernées",
 | 
			
		||||
         bloc_persons: "Usagers",
 | 
			
		||||
         bloc_persons_associated: "Usagers du parcours",
 | 
			
		||||
         bloc_persons_not_associated: "Tiers non-pro.",
 | 
			
		||||
         bloc_thirdparty: "Tiers professionnels",
 | 
			
		||||
         bloc_users: "T(M)S",
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Object.assign(appMessages.fr, personMessages.fr);
 | 
			
		||||
 | 
			
		||||
export {
 | 
			
		||||
   appMessages
 | 
			
		||||
};
 | 
			
		||||
@@ -1,16 +0,0 @@
 | 
			
		||||
import { createApp } from 'vue';
 | 
			
		||||
import { _createI18n } from 'ChillMainAssets/vuejs/_js/i18n'
 | 
			
		||||
import { appMessages } from './i18n'
 | 
			
		||||
import store from './store'
 | 
			
		||||
 | 
			
		||||
import App from './App.vue';
 | 
			
		||||
 | 
			
		||||
const i18n = _createI18n(appMessages);
 | 
			
		||||
 | 
			
		||||
const app = createApp({
 | 
			
		||||
   template: `<app></app>`,
 | 
			
		||||
})
 | 
			
		||||
.use(store)
 | 
			
		||||
.use(i18n)
 | 
			
		||||
.component('app', App)
 | 
			
		||||
.mount('#activity');
 | 
			
		||||
@@ -1,98 +0,0 @@
 | 
			
		||||
import 'es6-promise/auto';
 | 
			
		||||
import { createStore } from 'vuex';
 | 
			
		||||
 | 
			
		||||
const debug = process.env.NODE_ENV !== 'production';
 | 
			
		||||
//console.log('window.activity', window.activity);
 | 
			
		||||
 | 
			
		||||
const addIdToValue = (string, id) => {
 | 
			
		||||
   let array = string ? string.split(',') : [];
 | 
			
		||||
   array.push(id.toString());
 | 
			
		||||
   let str = array.join();
 | 
			
		||||
   return str;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const removeIdFromValue = (string, id) => {
 | 
			
		||||
   let array = string.split(',');
 | 
			
		||||
   array = array.filter(el => el !== id.toString());
 | 
			
		||||
   let str = array.join();
 | 
			
		||||
   return str;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const store = createStore({
 | 
			
		||||
   strict: debug,
 | 
			
		||||
   state: {
 | 
			
		||||
     activity: window.activity
 | 
			
		||||
   },
 | 
			
		||||
   getters: {
 | 
			
		||||
   },
 | 
			
		||||
   mutations: {
 | 
			
		||||
      addPersonsInvolved(state, payload) {
 | 
			
		||||
         //console.log('### mutation addPersonsInvolved', payload.result.type);
 | 
			
		||||
         switch (payload.result.type) {
 | 
			
		||||
            case 'person':
 | 
			
		||||
               state.activity.persons.push(payload.result);
 | 
			
		||||
               break;
 | 
			
		||||
            case 'thirdparty':
 | 
			
		||||
               state.activity.thirdParties.push(payload.result);
 | 
			
		||||
               break;
 | 
			
		||||
            case 'user':
 | 
			
		||||
               state.activity.users.push(payload.result); 
 | 
			
		||||
               break;
 | 
			
		||||
         };
 | 
			
		||||
      },
 | 
			
		||||
      removePersonInvolved(state, payload) {
 | 
			
		||||
         //console.log('### mutation removePersonInvolved', payload.type);
 | 
			
		||||
         switch (payload.type) {
 | 
			
		||||
            case 'person':
 | 
			
		||||
               state.activity.persons = state.activity.persons.filter(person => person !== payload);
 | 
			
		||||
               break;
 | 
			
		||||
            case 'thirdparty':
 | 
			
		||||
               state.activity.thirdParties = state.activity.thirdParties.filter(thirdparty => thirdparty !== payload);
 | 
			
		||||
               break;
 | 
			
		||||
            case 'user':
 | 
			
		||||
               state.activity.users = state.activity.users.filter(user => user !== payload); 
 | 
			
		||||
               break;
 | 
			
		||||
         };
 | 
			
		||||
      }
 | 
			
		||||
   },
 | 
			
		||||
   actions: {
 | 
			
		||||
      addPersonsInvolved({ commit }, payload) {
 | 
			
		||||
         console.log('### action addPersonsInvolved', payload.result.type);
 | 
			
		||||
         switch (payload.result.type) {
 | 
			
		||||
            case 'person':
 | 
			
		||||
               let aPersons = document.getElementById("chill_activitybundle_activity_persons");
 | 
			
		||||
               aPersons.value = addIdToValue(aPersons.value, payload.result.id);
 | 
			
		||||
               break;
 | 
			
		||||
            case 'thirdparty':
 | 
			
		||||
               let aThirdParties = document.getElementById("chill_activitybundle_activity_thirdParties");
 | 
			
		||||
               aThirdParties.value = addIdToValue(aThirdParties.value, payload.result.id);
 | 
			
		||||
               break;
 | 
			
		||||
            case 'user':
 | 
			
		||||
               let aUsers = document.getElementById("chill_activitybundle_activity_users");
 | 
			
		||||
               aUsers.value = addIdToValue(aUsers.value, payload.result.id);
 | 
			
		||||
               break;
 | 
			
		||||
         };
 | 
			
		||||
         commit('addPersonsInvolved', payload);
 | 
			
		||||
      },
 | 
			
		||||
      removePersonInvolved({ commit }, payload) {
 | 
			
		||||
         console.log('### action removePersonInvolved', payload);
 | 
			
		||||
         switch (payload.type) {
 | 
			
		||||
            case 'person':
 | 
			
		||||
               let aPersons = document.getElementById("chill_activitybundle_activity_persons");
 | 
			
		||||
               aPersons.value = removeIdFromValue(aPersons.value, payload.id);
 | 
			
		||||
               break;
 | 
			
		||||
            case 'thirdparty':
 | 
			
		||||
               let aThirdParties = document.getElementById("chill_activitybundle_activity_thirdParties");
 | 
			
		||||
               aThirdParties.value = removeIdFromValue(aThirdParties.value, payload.id);
 | 
			
		||||
               break;
 | 
			
		||||
            case 'user':
 | 
			
		||||
               let aUsers = document.getElementById("chill_activitybundle_activity_users");
 | 
			
		||||
               aUsers.value = removeIdFromValue(aUsers.value, payload.id);
 | 
			
		||||
               break;
 | 
			
		||||
         };
 | 
			
		||||
         commit('removePersonInvolved', payload);
 | 
			
		||||
      }
 | 
			
		||||
  }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
export default store;
 | 
			
		||||
@@ -1,13 +1,40 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
use Symfony\Component\HttpKernel\Kernel;
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
use Symfony\Component\Config\Loader\LoaderInterface;
 | 
			
		||||
use Symfony\Component\HttpKernel\Kernel;
 | 
			
		||||
 | 
			
		||||
class AppKernel extends Kernel
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * @return string
 | 
			
		||||
     */
 | 
			
		||||
    public function getCacheDir()
 | 
			
		||||
    {
 | 
			
		||||
        return sys_get_temp_dir() . '/ActivityBundle/cache';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return string
 | 
			
		||||
     */
 | 
			
		||||
    public function getLogDir()
 | 
			
		||||
    {
 | 
			
		||||
        return sys_get_temp_dir() . '/ActivityBundle/logs';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function registerBundles()
 | 
			
		||||
    {
 | 
			
		||||
        return array(
 | 
			
		||||
        return [
 | 
			
		||||
            new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
 | 
			
		||||
            new Chill\CustomFieldsBundle\ChillCustomFieldsBundle(),
 | 
			
		||||
            new Symfony\Bundle\SecurityBundle\SecurityBundle(),
 | 
			
		||||
@@ -20,28 +47,12 @@ class AppKernel extends Kernel
 | 
			
		||||
            new \Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle(),
 | 
			
		||||
            new Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle(),
 | 
			
		||||
            new Symfony\Bundle\MonologBundle\MonologBundle(),
 | 
			
		||||
            #add here all the required bundle (some bundle are not required)
 | 
			
		||||
        );
 | 
			
		||||
            //add here all the required bundle (some bundle are not required)
 | 
			
		||||
        ];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function registerContainerConfiguration(LoaderInterface $loader)
 | 
			
		||||
    {
 | 
			
		||||
        $loader->load($this->getRootDir().'/config/config_'.$this->getEnvironment().'.yml');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return string
 | 
			
		||||
     */
 | 
			
		||||
    public function getCacheDir()
 | 
			
		||||
    {
 | 
			
		||||
        return sys_get_temp_dir().'/ActivityBundle/cache';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return string
 | 
			
		||||
     */
 | 
			
		||||
    public function getLogDir()
 | 
			
		||||
    {
 | 
			
		||||
        return sys_get_temp_dir().'/ActivityBundle/logs';
 | 
			
		||||
        $loader->load($this->getRootDir() . '/config/config_' . $this->getEnvironment() . '.yml');
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,11 +1,22 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
use Doctrine\Common\Annotations\AnnotationRegistry;
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
use Composer\Autoload\ClassLoader;
 | 
			
		||||
use Doctrine\Common\Annotations\AnnotationRegistry;
 | 
			
		||||
 | 
			
		||||
/** @var ClassLoader $loader */
 | 
			
		||||
$loader = require __DIR__.'/../../../../../vendor/autoload.php';
 | 
			
		||||
$loader = require __DIR__ . '/../../../../../vendor/autoload.php';
 | 
			
		||||
 | 
			
		||||
AnnotationRegistry::registerLoader(array($loader, 'loadClass'));
 | 
			
		||||
AnnotationRegistry::registerLoader([$loader, 'loadClass']);
 | 
			
		||||
 | 
			
		||||
return $loader;
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@@ -1,7 +1,18 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
use Symfony\Component\HttpFoundation\Request;
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers.
 | 
			
		||||
 *
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 *
 | 
			
		||||
 * @see https://www.champs-libres.coop/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
use Symfony\Component\Debug\Debug;
 | 
			
		||||
use Symfony\Component\HttpFoundation\Request;
 | 
			
		||||
 | 
			
		||||
// If you don't want to setup permissions the proper way, just uncomment the following PHP line
 | 
			
		||||
// read http://symfony.com/doc/current/book/installation.html#configuration-and-setup for more information
 | 
			
		||||
@@ -9,18 +20,20 @@ use Symfony\Component\Debug\Debug;
 | 
			
		||||
 | 
			
		||||
// This check prevents access to debug front controllers that are deployed by accident to production servers.
 | 
			
		||||
// Feel free to remove this, extend it, or make something more sophisticated.
 | 
			
		||||
if (isset($_SERVER['HTTP_CLIENT_IP'])
 | 
			
		||||
if (
 | 
			
		||||
    isset($_SERVER['HTTP_CLIENT_IP'])
 | 
			
		||||
    || isset($_SERVER['HTTP_X_FORWARDED_FOR'])
 | 
			
		||||
    || !(in_array(@$_SERVER['REMOTE_ADDR'], array('127.0.0.1', 'fe80::1', '::1')) || php_sapi_name() === 'cli-server')
 | 
			
		||||
    || !(\in_array($_SERVER['REMOTE_ADDR'], ['127.0.0.1', 'fe80::1', '::1'], true) || \PHP_SAPI === 'cli-server')
 | 
			
		||||
) {
 | 
			
		||||
    header('HTTP/1.0 403 Forbidden');
 | 
			
		||||
    exit('You are not allowed to access this file. Check '.basename(__FILE__).' for more information.');
 | 
			
		||||
 | 
			
		||||
    exit('You are not allowed to access this file. Check ' . basename(__FILE__) . ' for more information.');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$loader = require_once __DIR__.'/../app/bootstrap.php.cache';
 | 
			
		||||
$loader = require_once __DIR__ . '/../app/bootstrap.php.cache';
 | 
			
		||||
Debug::enable();
 | 
			
		||||
 | 
			
		||||
require_once __DIR__.'/../app/AppKernel.php';
 | 
			
		||||
require_once __DIR__ . '/../app/AppKernel.php';
 | 
			
		||||
 | 
			
		||||
$kernel = new AppKernel('dev', true);
 | 
			
		||||
$kernel->loadClassCache();
 | 
			
		||||
 
 | 
			
		||||
@@ -1,97 +0,0 @@
 | 
			
		||||
{% macro href(pathname, key, value) %}
 | 
			
		||||
    {% set parms = { (key): value } %}
 | 
			
		||||
    {{ path(pathname, parms) }}
 | 
			
		||||
{% endmacro %}
 | 
			
		||||
 | 
			
		||||
{% if context == 'person' %}
 | 
			
		||||
    {% set blocs = [
 | 
			
		||||
        {   'title': 'Others persons'|trans, 
 | 
			
		||||
            'items': entity.persons,
 | 
			
		||||
            'path' : 'chill_person_view',
 | 
			
		||||
            'key'  : 'person_id'
 | 
			
		||||
        },
 | 
			
		||||
        {   'title': 'Third parties'|trans, 
 | 
			
		||||
            'items': entity.thirdParties,
 | 
			
		||||
            'path' : 'chill_3party_3party_show',
 | 
			
		||||
            'key'  : 'thirdparty_id'
 | 
			
		||||
        },
 | 
			
		||||
        {   'title': 'Users concerned'|trans, 
 | 
			
		||||
            'items': entity.users,
 | 
			
		||||
            'path' : 'admin_user_show',
 | 
			
		||||
            'key'  : 'id'
 | 
			
		||||
        },
 | 
			
		||||
    ] %}
 | 
			
		||||
{% else %}
 | 
			
		||||
    {% set blocs = [
 | 
			
		||||
        {   'title': 'Persons in accompanying course'|trans, 
 | 
			
		||||
            'items': entity.personsAssociated,
 | 
			
		||||
            'path' : 'chill_person_view',
 | 
			
		||||
            'key'  : 'person_id'
 | 
			
		||||
        },
 | 
			
		||||
        {   'title': 'Third persons'|trans, 
 | 
			
		||||
            'items': entity.personsNotAssociated,
 | 
			
		||||
            'path' : 'chill_person_view',
 | 
			
		||||
            'key'  : 'person_id'
 | 
			
		||||
        },
 | 
			
		||||
        {   'title': 'Third parties'|trans, 
 | 
			
		||||
            'items': entity.thirdParties,
 | 
			
		||||
            'path' : 'chill_3party_3party_show',
 | 
			
		||||
            'key'  : 'thirdparty_id'
 | 
			
		||||
        },
 | 
			
		||||
        {   'title': 'Users concerned'|trans, 
 | 
			
		||||
            'items': entity.users,
 | 
			
		||||
            'path' : 'admin_user_show',
 | 
			
		||||
            'key'  : 'id'
 | 
			
		||||
        },
 | 
			
		||||
    ] %}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{% if (with_display == 'bloc') %}
 | 
			
		||||
<div class="{{ context }} flex-bloc concerned-groups">
 | 
			
		||||
    {% for bloc in blocs %}
 | 
			
		||||
    <div class="item-bloc">
 | 
			
		||||
        <div class="item-row">
 | 
			
		||||
            <div class="item-col">
 | 
			
		||||
                <h4>{{ bloc.title }}</h4>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="item-col">
 | 
			
		||||
                <ul class="list-content">
 | 
			
		||||
                    {% for item in bloc.items %}
 | 
			
		||||
                    <li>
 | 
			
		||||
                        <a href="{{ _self.href(bloc.path, bloc.key, item.id) }}">
 | 
			
		||||
                            <span class="badge badge-primary">
 | 
			
		||||
                                {{ item|chill_entity_render_box({'only_denomination': true}) }}
 | 
			
		||||
                            </span>
 | 
			
		||||
                        </a>
 | 
			
		||||
                    </li>
 | 
			
		||||
                    {% endfor %}
 | 
			
		||||
                </ul>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    {% endfor %}
 | 
			
		||||
</div>
 | 
			
		||||
{% endif %}
 | 
			
		||||
    
 | 
			
		||||
{% if (with_display == 'row') %}
 | 
			
		||||
<div class="concerned-groups">
 | 
			
		||||
    {% for bloc in blocs %}
 | 
			
		||||
    <div class="group">
 | 
			
		||||
        {% if bloc.items|length > 0 %}
 | 
			
		||||
            <h4>{{ bloc.title }}</h4>
 | 
			
		||||
            <ul class="list-content">
 | 
			
		||||
                {% for item in bloc.items %}
 | 
			
		||||
                <li>
 | 
			
		||||
                    <a href="{{ _self.href(bloc.path, bloc.key, item.id) }}">
 | 
			
		||||
                        <span class="badge badge-primary">
 | 
			
		||||
                            {{ item|chill_entity_render_box({'only_denomination': true}) }}
 | 
			
		||||
                        </span>
 | 
			
		||||
                    </a>
 | 
			
		||||
                </li>
 | 
			
		||||
                {% endfor %}
 | 
			
		||||
            </ul>
 | 
			
		||||
        {% endif %}
 | 
			
		||||
    </div>
 | 
			
		||||
    {% endfor %}
 | 
			
		||||
</div>
 | 
			
		||||
{% endif %}
 | 
			
		||||
@@ -6,6 +6,7 @@
 | 
			
		||||
{% block title  'Remove activity'|trans %}
 | 
			
		||||
 | 
			
		||||
{% block personcontent %}
 | 
			
		||||
 | 
			
		||||
{{ include('@ChillMain/Util/confirmation_template.html.twig',
 | 
			
		||||
    {
 | 
			
		||||
        'title'             : 'Remove activity'|trans,
 | 
			
		||||
@@ -14,4 +15,5 @@
 | 
			
		||||
        'cancel_parameters' : { 'person_id' : activity.person.id, 'id' : activity.id },
 | 
			
		||||
        'form'              : delete_form
 | 
			
		||||
    } ) }}
 | 
			
		||||
    
 | 
			
		||||
{% endblock %}
 | 
			
		||||
@@ -1,16 +0,0 @@
 | 
			
		||||
{% extends "@ChillPerson/AccompanyingCourse/layout.html.twig" %}
 | 
			
		||||
 | 
			
		||||
{% set activeRouteKey = 'chill_activity_activity_list' %}
 | 
			
		||||
 | 
			
		||||
{% block title  'Remove activity'|trans %}
 | 
			
		||||
 | 
			
		||||
{% block content %}
 | 
			
		||||
    {{ include('@ChillMain/Util/confirmation_template.html.twig',
 | 
			
		||||
        {
 | 
			
		||||
            'title'             : 'Remove activity'|trans,
 | 
			
		||||
            'confirm_question'  : 'Are you sure you want to remove the activity about "%name%" ?'|trans({ '%name%' : accompanyingCourse.id } ),
 | 
			
		||||
            'cancel_route'      : 'chill_activity_activity_list',
 | 
			
		||||
            'cancel_parameters' : { 'accompanying_course_id' : accompanyingCourse.id, 'id' : activity.id },
 | 
			
		||||
            'form'              : delete_form
 | 
			
		||||
        } ) }}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
@@ -1,101 +1,59 @@
 | 
			
		||||
<h1>{{ "Update activity"|trans }}</h1>
 | 
			
		||||
{#
 | 
			
		||||
 * Copyright (C) 2014, Champs Libres Cooperative SCRLFS, <http://www.champs-libres.coop>
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 *  it under the terms of the GNU Affero General Public License as
 | 
			
		||||
 * published by the Free Software Foundation, either version 3 of the
 | 
			
		||||
 *  License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
#}
 | 
			
		||||
{% extends "@ChillPerson/layout.html.twig"  %}
 | 
			
		||||
 | 
			
		||||
{{ form_start(edit_form) }}
 | 
			
		||||
{{ form_errors(edit_form) }}
 | 
			
		||||
{% set activeRouteKey = 'chill_activity_activity_list' %}
 | 
			
		||||
 | 
			
		||||
{%- if edit_form.emergency is defined -%}
 | 
			
		||||
    {{ form_row(edit_form.emergency) }}
 | 
			
		||||
{% endif %}
 | 
			
		||||
{% block title  'Update activity'|trans %}
 | 
			
		||||
 | 
			
		||||
{%- if edit_form.sentReceived is defined -%}
 | 
			
		||||
    {{ form_row(edit_form.sentReceived) }}
 | 
			
		||||
{% endif %}
 | 
			
		||||
{% block personcontent %}
 | 
			
		||||
    <h1>{{ "Update activity"|trans }}</h1>
 | 
			
		||||
 | 
			
		||||
    {{ form_start(edit_form) }}
 | 
			
		||||
 | 
			
		||||
{%- if edit_form.user is defined -%}
 | 
			
		||||
    {{ form_row(edit_form.user) }}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{%- if edit_form.scope is defined -%}
 | 
			
		||||
    {{ form_row(edit_form.scope) }}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{%- if edit_form.socialActions is defined -%}
 | 
			
		||||
    {{ form_row(edit_form.socialActions) }}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{%- if edit_form.socialIssues is defined -%}
 | 
			
		||||
    {{ form_row(edit_form.socialIssues) }}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{%- if edit_form.reasons is defined -%}
 | 
			
		||||
    {{ form_row(edit_form.reasons) }}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
<h2 class="chill-red">{{ 'Concerned groups'|trans }}</h2>
 | 
			
		||||
 | 
			
		||||
{%- if edit_form.persons is defined -%}
 | 
			
		||||
    {{ form_widget(edit_form.persons) }}
 | 
			
		||||
{% endif %}
 | 
			
		||||
{%- if edit_form.thirdParties is defined -%}
 | 
			
		||||
    {{ form_widget(edit_form.thirdParties) }}
 | 
			
		||||
{% endif %}
 | 
			
		||||
{%- if edit_form.users is defined -%}
 | 
			
		||||
    {{ form_widget(edit_form.users) }}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
<div id="add-persons"></div>
 | 
			
		||||
 | 
			
		||||
<h2 class="chill-red">{{ 'Activity data'|trans }}</h2>
 | 
			
		||||
 | 
			
		||||
{%- if edit_form.date is defined -%}
 | 
			
		||||
    <h2>{{ 'Activity data'|trans }}</h2>
 | 
			
		||||
    {{ form_row(edit_form.date) }}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
.. location
 | 
			
		||||
 | 
			
		||||
{%- if edit_form.durationTime is defined -%}
 | 
			
		||||
    {{ form_row(edit_form.durationTime) }}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{%- if edit_form.travelTime is defined -%}
 | 
			
		||||
    {{ form_row(edit_form.travelTime) }}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{%- if edit_form.comment is defined -%}
 | 
			
		||||
    .. public and private
 | 
			
		||||
    {{ form_row(edit_form.comment) }}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{%- if edit_form.documents is defined -%}
 | 
			
		||||
    {{ form_row(edit_form.documents) }}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{%- if edit_form.attendee is defined -%}
 | 
			
		||||
    {{ form_row(edit_form.type) }}
 | 
			
		||||
    {{ form_row(edit_form.attendee) }}
 | 
			
		||||
{% endif %}
 | 
			
		||||
    {{ form_row(edit_form.reasons) }}
 | 
			
		||||
    {{ form_row(edit_form.comment) }}
 | 
			
		||||
 | 
			
		||||
.. status
 | 
			
		||||
    {{ form_widget(edit_form) }}
 | 
			
		||||
        <ul class="record_actions sticky-form-buttons">
 | 
			
		||||
            <li class="cancel">
 | 
			
		||||
                <a href="{{ path('chill_activity_activity_show', { 'id': entity.id, 'person_id': entity.person.id } ) }}" class="sc-button bt-cancel">
 | 
			
		||||
                    {{ 'Cancel'|trans }}
 | 
			
		||||
                </a>
 | 
			
		||||
            </li>
 | 
			
		||||
            <li>
 | 
			
		||||
                <button class="sc-button bt-update" type="submit">{{ 'Save activity'|trans }}</button>
 | 
			
		||||
            </li>
 | 
			
		||||
        </ul>
 | 
			
		||||
    {{ form_end(edit_form) }}
 | 
			
		||||
 | 
			
		||||
{% set person_id = null %}
 | 
			
		||||
{% if entity.person %}
 | 
			
		||||
    {% set person_id = entity.person.id %}
 | 
			
		||||
{% endif %}
 | 
			
		||||
    {# {{ form(delete_form) }} #}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% set accompanying_course_id = null %}
 | 
			
		||||
{% if accompanyingCourse %}
 | 
			
		||||
    {% set accompanying_course_id = accompanyingCourse.id %}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
    <ul class="record_actions sticky-form-buttons">
 | 
			
		||||
        <li class="cancel">
 | 
			
		||||
            <a href="{{ path('chill_activity_activity_show', { 'id': entity.id, 'person_id': person_id, 'accompanying_period_id': accompanying_course_id  } ) }}" class="sc-button bt-cancel">
 | 
			
		||||
                {{ 'Cancel'|trans }}
 | 
			
		||||
            </a>
 | 
			
		||||
        </li>
 | 
			
		||||
        <li>
 | 
			
		||||
            <button class="sc-button bt-update" type="submit">{{ 'Save activity'|trans }}</button>
 | 
			
		||||
        </li>
 | 
			
		||||
    </ul>
 | 
			
		||||
{{ form_end(edit_form) }}
 | 
			
		||||
 | 
			
		||||
{# {{ form(delete_form) }} #}
 | 
			
		||||
{% block js %}
 | 
			
		||||
<script type="text/javascript">
 | 
			
		||||
    chill.displayAlertWhenLeavingModifiedForm('form[name="{{ edit_form.vars.form.vars.name }}"]', '{{ "You are going to leave a page with unsubmitted data. Are you sure you want to leave ?"|trans }}');
 | 
			
		||||
</script>
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,25 +0,0 @@
 | 
			
		||||
{% extends "@ChillPerson/AccompanyingCourse/layout.html.twig" %}
 | 
			
		||||
 | 
			
		||||
{% set activeRouteKey = 'chill_activity_activity_list' %}
 | 
			
		||||
 | 
			
		||||
{% block title  'Update activity'|trans %}
 | 
			
		||||
 | 
			
		||||
{% block content %}
 | 
			
		||||
    <div id="activity"></div> {# <=== vue component #}
 | 
			
		||||
    {% include 'ChillActivityBundle:Activity:edit.html.twig' %}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block js %}
 | 
			
		||||
    {{ encore_entry_link_tags('async_upload') }}
 | 
			
		||||
    <script type="text/javascript">
 | 
			
		||||
        chill.displayAlertWhenLeavingModifiedForm('form[name="{{ edit_form.vars.form.vars.name }}"]', 
 | 
			
		||||
            '{{ "You are going to leave a page with unsubmitted data. Are you sure you want to leave ?"|trans }}');
 | 
			
		||||
        window.activity = {{ activity_json|json_encode|raw }}; 
 | 
			
		||||
    </script>
 | 
			
		||||
    {{ encore_entry_script_tags('vue_activity') }}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block css %}
 | 
			
		||||
    {{ encore_entry_link_tags('async_upload') }}
 | 
			
		||||
    {{ encore_entry_link_tags('vue_activity') }}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
@@ -1,41 +0,0 @@
 | 
			
		||||
{#
 | 
			
		||||
 * Copyright (C) 2014, Champs Libres Cooperative SCRLFS, <http://www.champs-libres.coop>
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 *  it under the terms of the GNU Affero General Public License as
 | 
			
		||||
 * published by the Free Software Foundation, either version 3 of the
 | 
			
		||||
 *  License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
#}
 | 
			
		||||
{% extends "@ChillPerson/layout.html.twig"  %}
 | 
			
		||||
 | 
			
		||||
{% set activeRouteKey = 'chill_activity_activity_list' %}
 | 
			
		||||
 | 
			
		||||
{% block title  'Update activity'|trans %}
 | 
			
		||||
 | 
			
		||||
{% block personcontent %}
 | 
			
		||||
    {% include 'ChillActivityBundle:Activity:edit.html.twig' %}
 | 
			
		||||
    <div id="activity"></div> {# <=== vue component #}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block js %}
 | 
			
		||||
    {{ encore_entry_link_tags('async_upload') }}
 | 
			
		||||
    <script type="text/javascript">
 | 
			
		||||
        chill.displayAlertWhenLeavingModifiedForm('form[name="{{ edit_form.vars.form.vars.name }}"]', 
 | 
			
		||||
            '{{ "You are going to leave a page with unsubmitted data. Are you sure you want to leave ?"|trans }}');
 | 
			
		||||
        window.activity = {{ activity_json|json_encode|raw }};
 | 
			
		||||
    </script>
 | 
			
		||||
    {{ encore_entry_script_tags('vue_activity') }}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block css %}
 | 
			
		||||
    {{ encore_entry_link_tags('async_upload') }}
 | 
			
		||||
    {{ encore_entry_link_tags('vue_activity') }}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
@@ -1,179 +1,87 @@
 | 
			
		||||
{% set person_id = null %}
 | 
			
		||||
{% if person %}
 | 
			
		||||
    {% set person_id = person.id %}
 | 
			
		||||
{% endif %}
 | 
			
		||||
{#
 | 
			
		||||
 * Copyright (C) 2014, Champs Libres Cooperative SCRLFS, <http://www.champs-libres.coop>
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 *  it under the terms of the GNU Affero General Public License as
 | 
			
		||||
 * published by the Free Software Foundation, either version 3 of the
 | 
			
		||||
 *  License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
#}
 | 
			
		||||
{% extends "@ChillPerson/layout.html.twig"  %}
 | 
			
		||||
 | 
			
		||||
{% set accompanying_course_id = null %}
 | 
			
		||||
{% if accompanyingCourse %}
 | 
			
		||||
    {% set accompanying_course_id = accompanyingCourse.id %}
 | 
			
		||||
{% endif %}
 | 
			
		||||
{% set activeRouteKey = 'chill_activity_activity_list' %}
 | 
			
		||||
 | 
			
		||||
<h2>{{ 'Activity list' |trans }}</h2>
 | 
			
		||||
{% block title %}{{ 'Activity list' |trans }}{% endblock title %}
 | 
			
		||||
 | 
			
		||||
{% if activities|length == 0 %}
 | 
			
		||||
    <p class="chill-no-data-statement">
 | 
			
		||||
        {{ "There isn't any activities."|trans }}
 | 
			
		||||
        <a href="{{ path('chill_activity_activity_new', {'person_id': person_id, 'accompanying_period_id': accompanying_course_id}) }}" class="sc-button bt-create button-small"></a>
 | 
			
		||||
    </p>
 | 
			
		||||
{% else %}
 | 
			
		||||
{% block personcontent %}
 | 
			
		||||
    <h2>{{ 'Activity list' |trans }}</h2>
 | 
			
		||||
 | 
			
		||||
<div class="flex-table list-records {{ context }}">
 | 
			
		||||
    <!--
 | 
			
		||||
    <thead>
 | 
			
		||||
        <tr>
 | 
			
		||||
            <th class="chill-red">{{'Date' | trans }}</th>
 | 
			
		||||
            <th class="chill-green">{{'Duration Time' | trans }}</th>
 | 
			
		||||
            <th class="chill-orange">{{'Reasons' | trans}}</th>
 | 
			
		||||
            <th>{{'Type' | trans}}</th>
 | 
			
		||||
            <th> </th>
 | 
			
		||||
        </tr>
 | 
			
		||||
    </thead>
 | 
			
		||||
-->
 | 
			
		||||
    {% for activity in activities %}
 | 
			
		||||
        {% set t = activity.type %}
 | 
			
		||||
        <div class="item-bloc">
 | 
			
		||||
            <div class="item-row main">
 | 
			
		||||
                <div class="item-col">
 | 
			
		||||
                                        
 | 
			
		||||
                    {% if activity.date %}
 | 
			
		||||
                        <h3>{{ activity.date|format_date('long') }}</h3>
 | 
			
		||||
    {% if activities|length == 0 %}
 | 
			
		||||
        <p class="chill-no-data-statement">
 | 
			
		||||
            {{ "There isn't any activities."|trans }}
 | 
			
		||||
            <a href="{{ path('chill_activity_activity_new', {'person_id': person.id}) }}" class="sc-button bt-create button-small"></a>
 | 
			
		||||
        </p>
 | 
			
		||||
    {% else %}
 | 
			
		||||
    <table class="records_list">
 | 
			
		||||
        <thead>
 | 
			
		||||
            <tr>
 | 
			
		||||
                <th class="chill-red">{{'Date' | trans }}</th>
 | 
			
		||||
                <th class="chill-green">{{'Duration Time' | trans }}</th>
 | 
			
		||||
                <th class="chill-orange">{{'Reasons' | trans}}</th>
 | 
			
		||||
                <th>{{'Type' | trans}}</th>
 | 
			
		||||
                <th> </th>
 | 
			
		||||
            </tr>
 | 
			
		||||
        </thead>
 | 
			
		||||
        <tbody>
 | 
			
		||||
        {% for activity in activities %}
 | 
			
		||||
            <tr>
 | 
			
		||||
                <td>{% if activity.date %}{{ activity.date|format_date('long') }}{% endif %}</td>
 | 
			
		||||
                <td>{{ activity.durationTime|date('H:i') }}</td>
 | 
			
		||||
                <td>
 | 
			
		||||
                    {% if activity.comment.comment is not empty %}
 | 
			
		||||
                            {{ activity.comment|chill_entity_render_box( { 'limit_lines': 3, 'metadata': false } ) }}
 | 
			
		||||
                    {% endif %}
 | 
			
		||||
                   
 | 
			
		||||
                    <div class="duration">
 | 
			
		||||
                      {% if t.durationTimeVisible > 0 %}
 | 
			
		||||
                        <p>
 | 
			
		||||
                            <i class="fa fa-fw fa-hourglass-end"></i>
 | 
			
		||||
                            {{ activity.durationTime|date('H:i') }}
 | 
			
		||||
                        </p>
 | 
			
		||||
                      {% endif %}
 | 
			
		||||
                        
 | 
			
		||||
                        {% if activity.travelTime and t.travelTimeVisible %}
 | 
			
		||||
                        <p>
 | 
			
		||||
                            <i class="fa fa-fw fa-car"></i>
 | 
			
		||||
                            {{ activity.travelTime|date('H:i') }}
 | 
			
		||||
                        </p>
 | 
			
		||||
                        {% endif %}
 | 
			
		||||
                    </div>
 | 
			
		||||
                    
 | 
			
		||||
                </div>
 | 
			
		||||
                <div class="item-col">
 | 
			
		||||
                    <ul class="list-content">
 | 
			
		||||
                        {% if activity.user and t.userVisible %}
 | 
			
		||||
                        <li>
 | 
			
		||||
                            <b>{{ 'by'|trans }}{{ activity.user.usernameCanonical }}</b>
 | 
			
		||||
                        </li>
 | 
			
		||||
                        {% endif %}
 | 
			
		||||
                        
 | 
			
		||||
                        <li>
 | 
			
		||||
                            <b>{{ activity.type.name | localize_translatable_string }}</b>
 | 
			
		||||
                            
 | 
			
		||||
                            {% if activity.attendee is not null and t.attendeeVisible %}
 | 
			
		||||
                                {% if activity.attendee %}
 | 
			
		||||
                                    {{ '→ ' ~ 'present'|trans|capitalize }} 
 | 
			
		||||
                                {% else %} 
 | 
			
		||||
                                    {{ '→ ' ~ 'not present'|trans|capitalize }}
 | 
			
		||||
                                {% endif %}
 | 
			
		||||
                            {% endif %}
 | 
			
		||||
                        </li>
 | 
			
		||||
                        
 | 
			
		||||
                        <li>
 | 
			
		||||
                            <b>{{ 'location'|trans ~ ': ' }}</b>
 | 
			
		||||
                            Domicile de l'usager
 | 
			
		||||
                            {#
 | 
			
		||||
                                {% if activity.location %}{{ activity.location }}{% endif %}
 | 
			
		||||
                            #}
 | 
			
		||||
                        </li>
 | 
			
		||||
                        
 | 
			
		||||
                        {%- if t.reasonsVisible -%}
 | 
			
		||||
                        <li>
 | 
			
		||||
                            {%- if activity.reasons is empty -%}
 | 
			
		||||
                                <span class="chill-no-data-statement">{{ 'No reason associated'|trans }}</span>
 | 
			
		||||
                            {%- else -%}
 | 
			
		||||
                                {% for r in activity.reasons %}
 | 
			
		||||
                                    {{ r|chill_entity_render_box }}
 | 
			
		||||
                                {% endfor %}
 | 
			
		||||
                            {%- endif -%}
 | 
			
		||||
                        </li>
 | 
			
		||||
                        {% endif %}
 | 
			
		||||
 | 
			
		||||
                        {%- if t.socialIssuesVisible %}
 | 
			
		||||
                            <li class="social-issues">
 | 
			
		||||
                                {%- if activity.socialIssues is empty -%}
 | 
			
		||||
                                    <span class="chill-no-data-statement">{{ 'No social issues associated'|trans }}</span>
 | 
			
		||||
                                {%- else -%}
 | 
			
		||||
                                    {% for r in activity.socialIssues %}
 | 
			
		||||
                                      {{ r|chill_entity_render_box }}
 | 
			
		||||
                                    {% endfor %}
 | 
			
		||||
                                {%- endif -%}
 | 
			
		||||
                            </li>
 | 
			
		||||
                        {% endif %}
 | 
			
		||||
                        
 | 
			
		||||
                        {%- if t.socialActionsVisible -%}
 | 
			
		||||
                            <li class="social-actions">
 | 
			
		||||
                                {%- if activity.socialActions is empty -%}
 | 
			
		||||
                                    <span class="chill-no-data-statement">{{ 'No social actions associated'|trans }}</span>
 | 
			
		||||
                                {%- else -%}
 | 
			
		||||
                                    {% for r in activity.socialActions %}
 | 
			
		||||
                                        <span class="badge badge-primary">{{ r.title|localize_translatable_string }}</span>
 | 
			
		||||
                                    {% endfor %}
 | 
			
		||||
                                {%- endif -%}
 | 
			
		||||
                            </li>
 | 
			
		||||
                        {% endif %}
 | 
			
		||||
 | 
			
		||||
                        
 | 
			
		||||
                    </ul>
 | 
			
		||||
                    {%- if activity.reasons is empty -%}
 | 
			
		||||
                        {{ 'No reason associated'|trans }}
 | 
			
		||||
                    {%- else -%}
 | 
			
		||||
                        {% for r in activity.reasons %}{{ r|chill_entity_render_box }} {% endfor %}
 | 
			
		||||
                    {%- endif -%}
 | 
			
		||||
                </td>
 | 
			
		||||
                <td>{{ activity.type.name | localize_translatable_string }}</td>
 | 
			
		||||
                <td>
 | 
			
		||||
                    <ul class="record_actions">
 | 
			
		||||
                        <li>
 | 
			
		||||
                            <a href="{{ path('chill_activity_activity_show', { 'id': activity.id, 'person_id': person_id, 'accompanying_period_id': accompanying_course_id }) }}" class="sc-button bt-show "></a>
 | 
			
		||||
                            <a href="{{ path('chill_activity_activity_show', { 'id': activity.id, 'person_id': person.id }) }}" class="sc-button bt-show "></a>
 | 
			
		||||
                        </li>
 | 
			
		||||
                        {# TOOD
 | 
			
		||||
                        {% if is_granted('CHILL_ACTIVITY_UPDATE', activity) %}
 | 
			
		||||
                        #}
 | 
			
		||||
                        <li>
 | 
			
		||||
                            <a href="{{ path('chill_activity_activity_edit', { 'id': activity.id, 'person_id': person_id, 'accompanying_period_id': accompanying_course_id }) }}" class="sc-button bt-update "></a>
 | 
			
		||||
                            <a href="{{ path('chill_activity_activity_edit', { 'id': activity.id, 'person_id': person.id }) }}" class="sc-button bt-update "></a>
 | 
			
		||||
                        </li>
 | 
			
		||||
                        {# TOOD
 | 
			
		||||
                        {% endif %}
 | 
			
		||||
                        {% if is_granted('CHILL_ACTIVITY_DELETE', activity) %}
 | 
			
		||||
                        #}
 | 
			
		||||
                        <li>
 | 
			
		||||
                            <a href="{{ path('chill_activity_activity_delete', { 'id': activity.id, 'person_id' : person_id, 'accompanying_period_id': accompanying_course_id } ) }}" class="sc-button bt-delete "></a>
 | 
			
		||||
                            <a href="{{ path('chill_activity_activity_delete', { 'id': activity.id, 'person_id' : person.id } ) }}" class="sc-button bt-delete "></a>
 | 
			
		||||
                        </li>
 | 
			
		||||
                        {#
 | 
			
		||||
                        {% endif %}
 | 
			
		||||
                        #}
 | 
			
		||||
                    </ul>
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
            
 | 
			
		||||
            {%  
 | 
			
		||||
                if activity.comment.comment is not empty 
 | 
			
		||||
                or activity.persons|length > 0
 | 
			
		||||
                or activity.thirdParties|length > 0
 | 
			
		||||
                or activity.users|length > 0 
 | 
			
		||||
            %}
 | 
			
		||||
            <div class="item-row details">
 | 
			
		||||
                <div class="item-col">
 | 
			
		||||
                    {% include 'ChillActivityBundle:Activity:concernedGroups.html.twig' with {'context': context, 'with_display': 'row', 'entity': activity } %}
 | 
			
		||||
                </div>
 | 
			
		||||
                
 | 
			
		||||
                {% if activity.comment.comment is not empty %}
 | 
			
		||||
                <div class="item-col comment">
 | 
			
		||||
                    {{ activity.comment|chill_entity_render_box( { 'limit_lines': 3, 'metadata': false } ) }}
 | 
			
		||||
                </div>
 | 
			
		||||
                {% endif %}
 | 
			
		||||
            </div>
 | 
			
		||||
            {% endif %}
 | 
			
		||||
            
 | 
			
		||||
        </div>
 | 
			
		||||
    {% endfor %}
 | 
			
		||||
</div>
 | 
			
		||||
{% endif %}
 | 
			
		||||
                </td>
 | 
			
		||||
            </tr>
 | 
			
		||||
        {% endfor %}
 | 
			
		||||
        </tbody>
 | 
			
		||||
    </table>
 | 
			
		||||
    {% endif %}
 | 
			
		||||
 | 
			
		||||
<ul class="record_actions">
 | 
			
		||||
    <li>
 | 
			
		||||
        <a href="{{ path('chill_activity_activity_new', {'person_id': person_id, 'accompanying_period_id': accompanying_course_id}) }}" class="sc-button bt-create">
 | 
			
		||||
            {{ 'Add a new activity' | trans }}
 | 
			
		||||
        </a>
 | 
			
		||||
    </li>
 | 
			
		||||
</ul>
 | 
			
		||||
    <ul class="record_actions">
 | 
			
		||||
        <li>
 | 
			
		||||
            <a href="{{ path('chill_activity_activity_new', {'person_id': person.id}) }}" class="sc-button bt-create">
 | 
			
		||||
                {{ 'Add a new activity' | trans }}
 | 
			
		||||
            </a>
 | 
			
		||||
        </li>
 | 
			
		||||
    </ul>
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +0,0 @@
 | 
			
		||||
{% extends "@ChillPerson/AccompanyingCourse/layout.html.twig"  %}
 | 
			
		||||
 | 
			
		||||
{% set activeRouteKey = 'chill_activity_activity_list' %}
 | 
			
		||||
 | 
			
		||||
{% block title %}{{ 'Activity list' |trans }}{% endblock title %}
 | 
			
		||||
 | 
			
		||||
{% block content %}
 | 
			
		||||
    {% include 'ChillActivityBundle:Activity:list.html.twig' with {'context': 'accompanyingCourse'} %}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
@@ -1,25 +0,0 @@
 | 
			
		||||
{#
 | 
			
		||||
 * Copyright (C) 2014, Champs Libres Cooperative SCRLFS, <http://www.champs-libres.coop>
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 *  it under the terms of the GNU Affero General Public License as
 | 
			
		||||
 * published by the Free Software Foundation, either version 3 of the
 | 
			
		||||
 *  License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
#}
 | 
			
		||||
{% extends "@ChillPerson/layout.html.twig"  %}
 | 
			
		||||
 | 
			
		||||
{% set activeRouteKey = 'chill_activity_activity_list' %}
 | 
			
		||||
 | 
			
		||||
{% block title %}{{ 'Activity list' |trans }}{% endblock title %}
 | 
			
		||||
 | 
			
		||||
{% block personcontent %}
 | 
			
		||||
    {% include 'ChillActivityBundle:Activity:list.html.twig' with {'context': 'person'} %}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
@@ -1,100 +1,50 @@
 | 
			
		||||
<h1>{{ "Activity creation"|trans }}</h1>
 | 
			
		||||
{#
 | 
			
		||||
 * Copyright (C) 2014, Champs Libres Cooperative SCRLFS, <http://www.champs-libres.coop>
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 *  it under the terms of the GNU Affero General Public License as
 | 
			
		||||
 * published by the Free Software Foundation, either version 3 of the
 | 
			
		||||
 *  License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
#}
 | 
			
		||||
{% extends "@ChillPerson/layout.html.twig"  %}
 | 
			
		||||
 | 
			
		||||
{{ form_start(form) }}
 | 
			
		||||
{{ form_errors(form) }}
 | 
			
		||||
{% set activeRouteKey = 'chill_activity_activity_new' %}
 | 
			
		||||
 | 
			
		||||
{% block title 'Activity creation' |trans %}
 | 
			
		||||
 | 
			
		||||
{%- if form.emergency is defined -%}
 | 
			
		||||
    {{ form_row(form.emergency) }}
 | 
			
		||||
{% endif %}
 | 
			
		||||
{% block personcontent %}
 | 
			
		||||
    <h2 class="chill-red">{{ "Activity creation"|trans }}</h1>
 | 
			
		||||
 | 
			
		||||
{%- if form.sentReceived is defined -%}
 | 
			
		||||
    {{ form_row(form.sentReceived) }}
 | 
			
		||||
{% endif %}
 | 
			
		||||
    {{ form_start(form) }}
 | 
			
		||||
 | 
			
		||||
{%- if form.user is defined -%}
 | 
			
		||||
    {{ form_row(form.user) }}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{%- if form.scope is defined -%}
 | 
			
		||||
    {{ form_row(form.scope) }}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{%- if form.socialActions is defined -%}
 | 
			
		||||
    {{ form_row(form.socialActions) }}
 | 
			
		||||
{% endif %}
 | 
			
		||||
    <h2 class="chill-red">{{ 'Activity data'|trans }}</h2>
 | 
			
		||||
 | 
			
		||||
{%- if form.socialIssues is defined -%}
 | 
			
		||||
    {{ form_row(form.socialIssues) }}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
{%- if form.reasons is defined -%}
 | 
			
		||||
    {{ form_row(form.reasons) }}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
<h2 class="chill-red">{{ 'Concerned groups'|trans }}</h2>
 | 
			
		||||
 | 
			
		||||
{%- if form.persons is defined -%}
 | 
			
		||||
    {{ form_widget(form.persons) }}
 | 
			
		||||
{% endif %}
 | 
			
		||||
{%- if form.thirdParties is defined -%}
 | 
			
		||||
    {{ form_widget(form.thirdParties) }}
 | 
			
		||||
{% endif %}
 | 
			
		||||
{%- if form.users is defined -%}
 | 
			
		||||
    {{ form_widget(form.users) }}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
<div id="add-persons"></div>
 | 
			
		||||
 | 
			
		||||
<h2 class="chill-red">{{ 'Activity data'|trans }}</h2>
 | 
			
		||||
 | 
			
		||||
{%- if form.date is defined -%}
 | 
			
		||||
    {{ form_row(form.date) }}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
.. location
 | 
			
		||||
 | 
			
		||||
{%- if form.durationTime is defined -%}
 | 
			
		||||
    {{ form_row(form.durationTime) }}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{%- if form.travelTime is defined -%}
 | 
			
		||||
    {{ form_row(form.travelTime) }}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{%- if form.comment is defined -%}
 | 
			
		||||
    .. public and private
 | 
			
		||||
    {{ form_row(form.comment) }}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{%- if form.documents is defined -%}
 | 
			
		||||
    {{ form_row(form.documents) }}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{%- if form.attendee is defined -%}
 | 
			
		||||
    {{ form_row(form.type) }}
 | 
			
		||||
    {{ form_row(form.attendee) }}
 | 
			
		||||
{% endif %}
 | 
			
		||||
    {{ form_row(form.reasons) }}
 | 
			
		||||
    {{ form_row(form.comment) }}
 | 
			
		||||
 | 
			
		||||
.. status
 | 
			
		||||
        <div class="grid-12 centered sticky-form-buttons">
 | 
			
		||||
            <button class="sc-button green margin-10" type="submit"><i class="fa fa-save"></i> {{ 'Add a new activity'|trans }}</button>
 | 
			
		||||
        </div>
 | 
			
		||||
    {{ form_end(form) }}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
<ul class="record_actions sticky-form-buttons">
 | 
			
		||||
  <li class="cancel">
 | 
			
		||||
    <a 
 | 
			
		||||
      class="sc-button bt-cancel"
 | 
			
		||||
      {%- if context == 'person' -%} 
 | 
			
		||||
      href="{{ chill_return_path_or('chill_activity_activity_list', { 'person_id': person.id } )}}"
 | 
			
		||||
      {%- else -%}
 | 
			
		||||
      href="{{ chill_return_path_or('chill_activity_activity_list', { 'accompanying_period_id': accompanyingCourse.id } )}}"
 | 
			
		||||
      {%- endif -%}
 | 
			
		||||
      >
 | 
			
		||||
      {{ 'Cancel'|trans|chill_return_path_label }}
 | 
			
		||||
    </a>
 | 
			
		||||
  </li>
 | 
			
		||||
  <li>
 | 
			
		||||
    <button class="sc-button bt-create" type="submit">
 | 
			
		||||
      {{ 'Add a new activity'|trans }}
 | 
			
		||||
    </button>
 | 
			
		||||
  </li>
 | 
			
		||||
</ul>
 | 
			
		||||
{{ form_end(form) }}
 | 
			
		||||
{% block js %}
 | 
			
		||||
<script type="text/javascript">
 | 
			
		||||
    chill.displayAlertWhenLeavingUnsubmittedForm('form[name="{{ form.vars.form.vars.name }}"]', '{{ "You are going to leave a page with unsubmitted data. Are you sure you want to leave ?"|trans }}');
 | 
			
		||||
</script>
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,25 +0,0 @@
 | 
			
		||||
{% extends "@ChillPerson/AccompanyingCourse/layout.html.twig"  %}
 | 
			
		||||
 | 
			
		||||
{% set activeRouteKey = 'chill_activity_activity_new' %}
 | 
			
		||||
 | 
			
		||||
{% block title 'Activity creation' |trans %}
 | 
			
		||||
 | 
			
		||||
{% block content %}
 | 
			
		||||
    <div id="activity"></div> {# <=== vue component #}
 | 
			
		||||
    {% include 'ChillActivityBundle:Activity:new.html.twig' with {'context': 'accompanyingCourse'} %}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block js %}
 | 
			
		||||
    {{ encore_entry_script_tags('async_upload') }}
 | 
			
		||||
    <script type="text/javascript">
 | 
			
		||||
        chill.displayAlertWhenLeavingUnsubmittedForm('form[name="{{ form.vars.form.vars.name }}"]', 
 | 
			
		||||
            '{{ "You are going to leave a page with unsubmitted data. Are you sure you want to leave ?"|trans }}');
 | 
			
		||||
        window.activity = {{ activity_json|json_encode|raw }}; 
 | 
			
		||||
    </script>
 | 
			
		||||
    {{ encore_entry_script_tags('vue_activity') }}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block css %}
 | 
			
		||||
    <link rel="stylesheet" href="{{ asset('build/async_upload.css') }}"/>
 | 
			
		||||
    {{ encore_entry_link_tags('vue_activity') }}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
@@ -1,25 +0,0 @@
 | 
			
		||||
{% extends "@ChillPerson/layout.html.twig"  %}
 | 
			
		||||
 | 
			
		||||
{% set activeRouteKey = 'chill_activity_activity_new' %}
 | 
			
		||||
 | 
			
		||||
{% block title 'Activity creation' |trans %}
 | 
			
		||||
 | 
			
		||||
{% block personcontent %}
 | 
			
		||||
    {% include 'ChillActivityBundle:Activity:new.html.twig' with {'context': 'person'} %}
 | 
			
		||||
    <div id="activity"></div> {# <=== vue component #}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block js %}
 | 
			
		||||
    {{ encore_entry_link_tags('async_upload') }}
 | 
			
		||||
    <script type="text/javascript">
 | 
			
		||||
        chill.displayAlertWhenLeavingUnsubmittedForm('form[name="{{ form.vars.form.vars.name }}"]', 
 | 
			
		||||
            '{{ "You are going to leave a page with unsubmitted data. Are you sure you want to leave ?"|trans }}');
 | 
			
		||||
        window.activity = {{ activity_json|json_encode|raw }};
 | 
			
		||||
    </script>
 | 
			
		||||
    {{ encore_entry_script_tags('vue_activity') }}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block css %}
 | 
			
		||||
    {{ encore_entry_link_tags('async_upload') }}
 | 
			
		||||
    {{ encore_entry_link_tags('vue_activity') }}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
@@ -1,28 +0,0 @@
 | 
			
		||||
<h2 class="chill-red">{{ "Activity creation"|trans }}</h2>
 | 
			
		||||
 | 
			
		||||
{# TODO: refaire l'html css des tuilles #}
 | 
			
		||||
 | 
			
		||||
{% for row in data %}
 | 
			
		||||
    <h3>{{ row.activityTypeCategory.name|localize_translatable_string }}</h3>
 | 
			
		||||
    <div style="display:flex;justify-content:center;gap:12px;flex-wrap:wrap;">
 | 
			
		||||
        {% for activityType in row.activityTypes %}
 | 
			
		||||
 | 
			
		||||
            {% set person_id = null %}
 | 
			
		||||
            {% if person %}
 | 
			
		||||
                {% set person_id = person.id %}
 | 
			
		||||
            {% endif %}
 | 
			
		||||
 | 
			
		||||
            {% set accompanying_course_id = null %}
 | 
			
		||||
            {% if accompanyingCourse %}
 | 
			
		||||
                {% set accompanying_course_id = accompanyingCourse.id %}
 | 
			
		||||
            {% endif %}
 | 
			
		||||
 | 
			
		||||
            <a href="{{ path('chill_activity_activity_new', {'person_id': person_id, 'activityType_id': activityType.id, 'accompanying_period_id': accompanying_course_id }) }}">
 | 
			
		||||
 | 
			
		||||
                <div style="width:200px;height:200px;border:1px dotted red;display:flex;justify-content:center;align-items:center;align-content:center;">
 | 
			
		||||
                    {{ activityType.name|localize_translatable_string }}
 | 
			
		||||
                </div>
 | 
			
		||||
            </a>
 | 
			
		||||
        {% endfor %}
 | 
			
		||||
    </div>
 | 
			
		||||
{% endfor %}
 | 
			
		||||
@@ -1,9 +0,0 @@
 | 
			
		||||
{% extends "@ChillPerson/AccompanyingCourse/layout.html.twig"  %}
 | 
			
		||||
 | 
			
		||||
{% set activeRouteKey = 'chill_activity_activity_new' %}
 | 
			
		||||
 | 
			
		||||
{% block title 'Activity creation'|trans %}
 | 
			
		||||
 | 
			
		||||
{% block content %}
 | 
			
		||||
    {% include 'ChillActivityBundle:Activity:selectType.html.twig' %}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
@@ -1,9 +0,0 @@
 | 
			
		||||
{% extends "@ChillPerson/layout.html.twig"  %}
 | 
			
		||||
 | 
			
		||||
{% set activeRouteKey = 'chill_activity_activity_new' %}
 | 
			
		||||
 | 
			
		||||
{% block title 'Activity creation'|trans %}
 | 
			
		||||
 | 
			
		||||
{% block personcontent %}
 | 
			
		||||
    {% include 'ChillActivityBundle:Activity:selectType.html.twig' %}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user