- {{ entity.name|localize_translatable_string }} |
+ {{ entity.name|localize_translatable_string }}
+
+
+
+ |
-
diff --git a/src/Bundle/ChillActivityBundle/Tests/Form/Type/TranslatableActivityReasonTest.php b/src/Bundle/ChillActivityBundle/Tests/Form/Type/TranslatableActivityReasonTest.php
index 59659e40f..3c9777051 100644
--- a/src/Bundle/ChillActivityBundle/Tests/Form/Type/TranslatableActivityReasonTest.php
+++ b/src/Bundle/ChillActivityBundle/Tests/Form/Type/TranslatableActivityReasonTest.php
@@ -11,7 +11,7 @@ declare(strict_types=1);
namespace Chill\ActivityBundle\Tests\Form\Type;
-use Chill\ActivityBundle\Form\Type\TranslatableActivityReason;
+use Chill\ActivityBundle\Form\Type\PickActivityReasonType;
use Chill\MainBundle\Templating\TranslatableStringHelper;
use Symfony\Component\Form\PreloadedExtension;
use Symfony\Component\Form\Test\TypeTestCase;
@@ -36,7 +36,7 @@ final class TranslatableActivityReasonTest extends TypeTestCase
public function testSimple()
{
- $translatableActivityReasonType = new TranslatableActivityReason(
+ $translatableActivityReasonType = new PickActivityReasonType(
$this->getTranslatableStringHelper()
);
diff --git a/src/Bundle/ChillActivityBundle/config/services/controller.yaml b/src/Bundle/ChillActivityBundle/config/services/controller.yaml
index 96ace0a64..c14c40475 100644
--- a/src/Bundle/ChillActivityBundle/config/services/controller.yaml
+++ b/src/Bundle/ChillActivityBundle/config/services/controller.yaml
@@ -1,4 +1,11 @@
services:
- Chill\ActivityBundle\Controller\ActivityController:
+ _defaults:
autowire: true
+ autoconfigure: true
+
+ Chill\ActivityBundle\Controller\:
+ resource: '../../Controller/'
+ tags: ['controller.service_arguments']
+
+ Chill\ActivityBundle\Controller\ActivityController:
tags: ['controller.service_arguments']
diff --git a/src/Bundle/ChillActivityBundle/config/services/form.yaml b/src/Bundle/ChillActivityBundle/config/services/form.yaml
index fd034b2da..f4945d8ce 100644
--- a/src/Bundle/ChillActivityBundle/config/services/form.yaml
+++ b/src/Bundle/ChillActivityBundle/config/services/form.yaml
@@ -1,19 +1,12 @@
---
services:
- chill.activity.form.type.translatableactivityreasoncategory:
- class: Chill\ActivityBundle\Form\Type\TranslatableActivityReasonCategory
- arguments:
- - "@request_stack"
- tags:
- - { name: form.type, alias: translatable_activity_reason_category }
+ Chill\ActivityBundle\Form\Type\TranslatableActivityReasonCategoryType:
+ autowire: true
+ autoconfigure: true
- chill.activity.form.type.translatableactivityreason:
- class: Chill\ActivityBundle\Form\Type\TranslatableActivityReason
- arguments:
- $translatableStringHelper: "@chill.main.helper.translatable_string"
- $reasonRender: '@Chill\ActivityBundle\Templating\Entity\ActivityReasonRender'
- tags:
- - { name: form.type, alias: translatable_activity_reason }
+ Chill\ActivityBundle\Form\Type\PickActivityReasonType:
+ autowire: true
+ autoconfigure: true
chill.activity.form.type.translatableactivitytype:
class: Chill\ActivityBundle\Form\Type\TranslatableActivityType
diff --git a/src/Bundle/ChillActivityBundle/config/services/repositories.yaml b/src/Bundle/ChillActivityBundle/config/services/repositories.yaml
index c9fe8d843..096528221 100644
--- a/src/Bundle/ChillActivityBundle/config/services/repositories.yaml
+++ b/src/Bundle/ChillActivityBundle/config/services/repositories.yaml
@@ -1,5 +1,8 @@
---
services:
+ Chill\ActivityBundle\Repository\ActivityReasonRepository:
+ autowire: true
+
chill_activity.repository.activity_type: '@Chill\ActivityBundle\Repository\ActivityTypeRepository'
chill_activity.repository.reason: '@Chill\ActivityBundle\Repository\ActivityReasonRepository'
chill_activity.repository.reason_category: '@Chill\ActivityBundle\Repository\ActivityReasonCategoryRepository'
diff --git a/src/Bundle/ChillActivityBundle/translations/messages.fr.yml b/src/Bundle/ChillActivityBundle/translations/messages.fr.yml
index 2f7aee6ac..20d72e7b3 100644
--- a/src/Bundle/ChillActivityBundle/translations/messages.fr.yml
+++ b/src/Bundle/ChillActivityBundle/translations/messages.fr.yml
@@ -117,6 +117,7 @@ Activity Reasons: Sujets d'une activité
Activity Reasons Category: Catégories de sujet d'activités
Activity Types Categories: Catégories des types d'activité
Activity Presences: Presences aux activités
+Associated activity reason category is inactive: La catégorie de sujet attachée est inactive
# Crud
@@ -276,7 +277,7 @@ Creators: Créateurs
Filter activity by userscope: Filtrer les activités par service du créateur
'Filtered activity by userscope: only %scopes%': "Filtré par service du créateur: uniquement %scopes%"
Accepted userscope: Services
-
+
Filter acp which has no activity: Filtrer les parcours qui n’ont pas d’activité
Filtered acp which has no activities: Filtrer les parcours sans activité associée
Group acp by activity number: Grouper les parcours par nombre d’activité
diff --git a/src/Bundle/ChillBudgetBundle/Controller/Admin/AdminController.php b/src/Bundle/ChillBudgetBundle/Controller/Admin/AdminController.php
new file mode 100644
index 000000000..998775fbe
--- /dev/null
+++ b/src/Bundle/ChillBudgetBundle/Controller/Admin/AdminController.php
@@ -0,0 +1,26 @@
+render('@ChillBudget/Admin/index.html.twig');
+ }
+}
diff --git a/src/Bundle/ChillBudgetBundle/Controller/Admin/ChargeKindController.php b/src/Bundle/ChillBudgetBundle/Controller/Admin/ChargeKindController.php
new file mode 100644
index 000000000..e1989176d
--- /dev/null
+++ b/src/Bundle/ChillBudgetBundle/Controller/Admin/ChargeKindController.php
@@ -0,0 +1,28 @@
+addOrderBy('e.ordering', 'ASC');
+
+ return $query;
+ }
+}
diff --git a/src/Bundle/ChillBudgetBundle/Controller/Admin/ResourceKindController.php b/src/Bundle/ChillBudgetBundle/Controller/Admin/ResourceKindController.php
new file mode 100644
index 000000000..90b8e750a
--- /dev/null
+++ b/src/Bundle/ChillBudgetBundle/Controller/Admin/ResourceKindController.php
@@ -0,0 +1,28 @@
+addOrderBy('e.ordering', 'ASC');
+
+ return $query;
+ }
+}
diff --git a/src/Bundle/ChillBudgetBundle/DependencyInjection/ChillBudgetExtension.php b/src/Bundle/ChillBudgetBundle/DependencyInjection/ChillBudgetExtension.php
index b5cb3a9c1..ed7fd1ae9 100644
--- a/src/Bundle/ChillBudgetBundle/DependencyInjection/ChillBudgetExtension.php
+++ b/src/Bundle/ChillBudgetBundle/DependencyInjection/ChillBudgetExtension.php
@@ -11,6 +11,10 @@ declare(strict_types=1);
namespace Chill\BudgetBundle\DependencyInjection;
+use Chill\BudgetBundle\Controller\Admin\ChargeKindController;
+use Chill\BudgetBundle\Controller\Admin\ResourceKindController;
+use Chill\BudgetBundle\Entity\ChargeKind;
+use Chill\BudgetBundle\Entity\ResourceKind;
use Chill\BudgetBundle\Security\Authorization\BudgetElementVoter;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
@@ -33,6 +37,7 @@ class ChillBudgetExtension extends Extension implements PrependExtensionInterfac
$loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__ . '/../config'));
$loader->load('services/config.yaml');
$loader->load('services/form.yaml');
+ $loader->load('services/repository.yaml');
$loader->load('services/security.yaml');
$loader->load('services/controller.yaml');
$loader->load('services/templating.yaml');
@@ -48,6 +53,7 @@ class ChillBudgetExtension extends Extension implements PrependExtensionInterfac
{
$this->prependAuthorization($container);
$this->prependRoutes($container);
+ $this->prependCruds($container);
}
/** (non-PHPdoc).
@@ -75,6 +81,56 @@ class ChillBudgetExtension extends Extension implements PrependExtensionInterfac
]);
}
+ protected function prependCruds(ContainerBuilder $container)
+ {
+ $container->prependExtensionConfig('chill_main', [
+ 'cruds' => [
+ [
+ 'class' => ChargeKind::class,
+ 'name' => 'charge_kind',
+ 'base_path' => '/admin/budget/charge-kind',
+ 'form_class' => \Chill\BudgetBundle\Form\Admin\ChargeKindType::class,
+ 'controller' => ChargeKindController::class,
+ 'actions' => [
+ 'index' => [
+ 'role' => 'ROLE_ADMIN',
+ 'template' => '@ChillBudget/Admin/Charge/index.html.twig',
+ ],
+ 'new' => [
+ 'role' => 'ROLE_ADMIN',
+ 'template' => '@ChillBudget/Admin/Charge/new.html.twig',
+ ],
+ 'edit' => [
+ 'role' => 'ROLE_ADMIN',
+ 'template' => '@ChillBudget/Admin/Charge/edit.html.twig',
+ ],
+ ],
+ ],
+ [
+ 'class' => ResourceKind::class,
+ 'name' => 'resource_kind',
+ 'base_path' => '/admin/budget/resource-kind',
+ 'form_class' => \Chill\BudgetBundle\Form\Admin\ResourceKindType::class,
+ 'controller' => ResourceKindController::class,
+ 'actions' => [
+ 'index' => [
+ 'role' => 'ROLE_ADMIN',
+ 'template' => '@ChillBudget/Admin/Resource/index.html.twig',
+ ],
+ 'new' => [
+ 'role' => 'ROLE_ADMIN',
+ 'template' => '@ChillBudget/Admin/Resource/new.html.twig',
+ ],
+ 'edit' => [
+ 'role' => 'ROLE_ADMIN',
+ 'template' => '@ChillBudget/Admin/Resource/edit.html.twig',
+ ],
+ ],
+ ],
+ ],
+ ]);
+ }
+
protected function storeConfig($position, array $config, ContainerBuilder $container)
{
$container
diff --git a/src/Bundle/ChillBudgetBundle/DependencyInjection/Configuration.php b/src/Bundle/ChillBudgetBundle/DependencyInjection/Configuration.php
index cf8f72a16..8856df22b 100644
--- a/src/Bundle/ChillBudgetBundle/DependencyInjection/Configuration.php
+++ b/src/Bundle/ChillBudgetBundle/DependencyInjection/Configuration.php
@@ -26,6 +26,7 @@ class Configuration implements ConfigurationInterface
// ressources
->arrayNode('resources')->defaultValue([])
+ ->setDeprecated('Chill', '2.0', 'Since the introduction of budget admin entities, config is no longer used')
->arrayPrototype()
->children()
->scalarNode('key')->isRequired()->cannotBeEmpty()
@@ -49,6 +50,7 @@ class Configuration implements ConfigurationInterface
->end()
->end()
->arrayNode('charges')->defaultValue([])
+ ->setDeprecated('Chill', '2.0', 'Since the introduction of budget admin entities, config is no longer used')
->arrayPrototype()
->children()
->scalarNode('key')->isRequired()->cannotBeEmpty()
diff --git a/src/Bundle/ChillBudgetBundle/Entity/Charge.php b/src/Bundle/ChillBudgetBundle/Entity/Charge.php
index dc03eef80..056e4abff 100644
--- a/src/Bundle/ChillBudgetBundle/Entity/Charge.php
+++ b/src/Bundle/ChillBudgetBundle/Entity/Charge.php
@@ -11,8 +11,8 @@ declare(strict_types=1);
namespace Chill\BudgetBundle\Entity;
-use Chill\MainBundle\Entity\Center;
-use Chill\MainBundle\Entity\HasCenterInterface;
+use Chill\MainBundle\Entity\HasCentersInterface;
+use Chill\PersonBundle\Entity\Person;
use DateTimeImmutable;
use Doctrine\ORM\Mapping as ORM;
@@ -22,7 +22,7 @@ use Doctrine\ORM\Mapping as ORM;
* @ORM\Table(name="chill_budget.charge")
* @ORM\Entity(repositoryClass="Chill\BudgetBundle\Repository\ChargeRepository")
*/
-class Charge extends AbstractElement implements HasCenterInterface
+class Charge extends AbstractElement implements HasCentersInterface
{
public const HELP_ASKED = 'running';
@@ -39,6 +39,12 @@ class Charge extends AbstractElement implements HasCenterInterface
self::HELP_NOT_RELEVANT,
];
+ /**
+ * @ORM\ManyToOne(targetEntity=ChargeKind::class, inversedBy="AbstractElement")
+ * @ORM\JoinColumn
+ */
+ private ?ChargeKind $charge = null;
+
/**
* @var string
* @ORM\Column(name="help", type="string", nullable=true)
@@ -46,22 +52,29 @@ class Charge extends AbstractElement implements HasCenterInterface
private $help = self::HELP_NOT_RELEVANT;
/**
- * @var int
- *
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
- private $id;
+ private ?int $id = null;
public function __construct()
{
$this->setStartDate(new DateTimeImmutable('today'));
}
- public function getCenter(): ?Center
+ public function getCenters(): array
{
- return $this->getPerson()->getCenter();
+ if (null !== $this->getPerson()) {
+ return [$this->getPerson()->getCenter()];
+ }
+
+ return $this->getHousehold()->getCurrentPersons()->map(static fn (Person $p) => $p->getCenter())->toArray();
+ }
+
+ public function getCharge(): ?ChargeKind
+ {
+ return $this->charge;
}
public function getHelp()
@@ -89,6 +102,13 @@ class Charge extends AbstractElement implements HasCenterInterface
return false;
}
+ public function setCharge(?ChargeKind $charge): self
+ {
+ $this->charge = $charge;
+
+ return $this;
+ }
+
public function setHelp($help)
{
$this->help = $help;
diff --git a/src/Bundle/ChillBudgetBundle/Entity/ChargeKind.php b/src/Bundle/ChillBudgetBundle/Entity/ChargeKind.php
new file mode 100644
index 000000000..d1393eafb
--- /dev/null
+++ b/src/Bundle/ChillBudgetBundle/Entity/ChargeKind.php
@@ -0,0 +1,108 @@
+id;
+ }
+
+ public function getIsActive(): bool
+ {
+ return $this->isActive;
+ }
+
+ public function getKind(): ?string
+ {
+ return $this->kind;
+ }
+
+ public function getName(): ?array
+ {
+ return $this->name;
+ }
+
+ public function getOrdering(): float
+ {
+ return $this->ordering;
+ }
+
+ public function setIsActive(bool $isActive): self
+ {
+ $this->isActive = $isActive;
+
+ return $this;
+ }
+
+ public function setKind(?string $kind): self
+ {
+ $this->kind = $kind;
+
+ return $this;
+ }
+
+ public function setName(array $name): self
+ {
+ $this->name = $name;
+
+ return $this;
+ }
+
+ public function setOrdering(float $ordering): ChargeKind
+ {
+ $this->ordering = $ordering;
+
+ return $this;
+ }
+}
diff --git a/src/Bundle/ChillBudgetBundle/Entity/Resource.php b/src/Bundle/ChillBudgetBundle/Entity/Resource.php
index 949872d6c..28b8645e0 100644
--- a/src/Bundle/ChillBudgetBundle/Entity/Resource.php
+++ b/src/Bundle/ChillBudgetBundle/Entity/Resource.php
@@ -11,8 +11,8 @@ declare(strict_types=1);
namespace Chill\BudgetBundle\Entity;
-use Chill\MainBundle\Entity\Center;
-use Chill\MainBundle\Entity\HasCenterInterface;
+use Chill\MainBundle\Entity\HasCentersInterface;
+use Chill\PersonBundle\Entity\Person;
use DateTimeImmutable;
use Doctrine\ORM\Mapping as ORM;
@@ -22,25 +22,33 @@ use Doctrine\ORM\Mapping as ORM;
* @ORM\Table(name="chill_budget.resource")
* @ORM\Entity(repositoryClass="Chill\BudgetBundle\Repository\ResourceRepository")
*/
-class Resource extends AbstractElement implements HasCenterInterface
+class Resource extends AbstractElement implements HasCentersInterface
{
/**
- * @var int
- *
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
- private $id;
+ private ?int $id = null;
+
+ /**
+ * @ORM\ManyToOne(targetEntity=ResourceKind::class, inversedBy="AbstractElement")
+ * @ORM\JoinColumn
+ */
+ private ?ResourceKind $resource = null;
public function __construct()
{
$this->setStartDate(new DateTimeImmutable('today'));
}
- public function getCenter(): ?Center
+ public function getCenters(): array
{
- return $this->getPerson()->getCenter();
+ if (null !== $this->getPerson()) {
+ return [$this->getPerson()->getCenter()];
+ }
+
+ return $this->getHousehold()->getCurrentPersons()->map(static fn (Person $p) => $p->getCenter())->toArray();
}
/**
@@ -53,6 +61,11 @@ class Resource extends AbstractElement implements HasCenterInterface
return $this->id;
}
+ public function getResource(): ?ResourceKind
+ {
+ return $this->resource;
+ }
+
public function isCharge(): bool
{
return false;
@@ -62,4 +75,11 @@ class Resource extends AbstractElement implements HasCenterInterface
{
return true;
}
+
+ public function setResource(?ResourceKind $resource): self
+ {
+ $this->resource = $resource;
+
+ return $this;
+ }
}
diff --git a/src/Bundle/ChillBudgetBundle/Entity/ResourceKind.php b/src/Bundle/ChillBudgetBundle/Entity/ResourceKind.php
new file mode 100644
index 000000000..5d88af298
--- /dev/null
+++ b/src/Bundle/ChillBudgetBundle/Entity/ResourceKind.php
@@ -0,0 +1,108 @@
+id;
+ }
+
+ public function getIsActive(): bool
+ {
+ return $this->isActive;
+ }
+
+ public function getKind(): ?string
+ {
+ return $this->kind;
+ }
+
+ public function getName(): ?array
+ {
+ return $this->name;
+ }
+
+ public function getOrdering(): float
+ {
+ return $this->ordering;
+ }
+
+ public function setIsActive(bool $isActive): self
+ {
+ $this->isActive = $isActive;
+
+ return $this;
+ }
+
+ public function setKind(?string $kind): self
+ {
+ $this->kind = $kind;
+
+ return $this;
+ }
+
+ public function setName(array $name): self
+ {
+ $this->name = $name;
+
+ return $this;
+ }
+
+ public function setOrdering(float $ordering): self
+ {
+ $this->ordering = $ordering;
+
+ return $this;
+ }
+}
diff --git a/src/Bundle/ChillBudgetBundle/Form/Admin/ChargeKindType.php b/src/Bundle/ChillBudgetBundle/Form/Admin/ChargeKindType.php
new file mode 100644
index 000000000..661199aec
--- /dev/null
+++ b/src/Bundle/ChillBudgetBundle/Form/Admin/ChargeKindType.php
@@ -0,0 +1,42 @@
+add('name', TranslatableStringFormType::class, [
+ 'label' => 'Nom',
+ ])
+ ->add('ordering', NumberType::class)
+ ->add('isActive', CheckboxType::class, [
+ 'label' => 'Actif ?',
+ 'required' => false,
+ ]);
+ }
+
+ public function configureOptions(OptionsResolver $resolver)
+ {
+ $resolver
+ ->setDefault('class', ChargeKind::class);
+ }
+}
diff --git a/src/Bundle/ChillBudgetBundle/Form/Admin/ResourceKindType.php b/src/Bundle/ChillBudgetBundle/Form/Admin/ResourceKindType.php
new file mode 100644
index 000000000..7b2622c5d
--- /dev/null
+++ b/src/Bundle/ChillBudgetBundle/Form/Admin/ResourceKindType.php
@@ -0,0 +1,42 @@
+add('name', TranslatableStringFormType::class, [
+ 'label' => 'Nom',
+ ])
+ ->add('ordering', NumberType::class)
+ ->add('isActive', CheckboxType::class, [
+ 'label' => 'Actif ?',
+ 'required' => false,
+ ]);
+ }
+
+ public function configureOptions(OptionsResolver $resolver)
+ {
+ $resolver
+ ->setDefault('class', ResourceKind::class);
+ }
+}
diff --git a/src/Bundle/ChillBudgetBundle/Form/ChargeType.php b/src/Bundle/ChillBudgetBundle/Form/ChargeType.php
index 387c1e424..3dc2e230c 100644
--- a/src/Bundle/ChillBudgetBundle/Form/ChargeType.php
+++ b/src/Bundle/ChillBudgetBundle/Form/ChargeType.php
@@ -13,15 +13,18 @@ namespace Chill\BudgetBundle\Form;
use Chill\BudgetBundle\Config\ConfigRepository;
use Chill\BudgetBundle\Entity\Charge;
+use Chill\BudgetBundle\Entity\ChargeKind;
+use Chill\BudgetBundle\Repository\ChargeKindRepository;
use Chill\MainBundle\Form\Type\ChillDateType;
use Chill\MainBundle\Templating\TranslatableStringHelperInterface;
+use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\MoneyType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
-
+use Symfony\Contracts\Translation\TranslatorInterface;
use function array_flip;
use function asort;
@@ -31,21 +34,35 @@ class ChargeType extends AbstractType
protected TranslatableStringHelperInterface $translatableStringHelper;
+ private ChargeKindRepository $repository;
+
+ private TranslatorInterface $translator;
+
public function __construct(
ConfigRepository $configRepository,
- TranslatableStringHelperInterface $translatableStringHelper
+ TranslatableStringHelperInterface $translatableStringHelper,
+ ChargeKindRepository $repository,
+ TranslatorInterface $translator
) {
$this->configRepository = $configRepository;
$this->translatableStringHelper = $translatableStringHelper;
+ $this->repository = $repository;
+ $this->translator = $translator;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
- ->add('type', ChoiceType::class, [
- 'choices' => $this->getTypes(),
- 'placeholder' => 'Choose a charge type',
- 'attr' => ['class' => ' select2 '],
+ ->add('charge', EntityType::class, [
+ 'class' => ChargeKind::class,
+ 'choices' => $this->repository->findAllActive(),
+ 'label' => 'Charge type',
+ 'required' => true,
+ 'placeholder' => $this->translator->trans('admin.form.Choose the type of charge'),
+ 'choice_label' => function (ChargeKind $resource) {
+ return $this->translatableStringHelper->localize($resource->getName());
+ },
+ 'attr' => ['class' => 'select2'],
])
->add('amount', MoneyType::class)
->add('comment', TextareaType::class, [
diff --git a/src/Bundle/ChillBudgetBundle/Form/ResourceType.php b/src/Bundle/ChillBudgetBundle/Form/ResourceType.php
index 6239dace8..106f50ad1 100644
--- a/src/Bundle/ChillBudgetBundle/Form/ResourceType.php
+++ b/src/Bundle/ChillBudgetBundle/Form/ResourceType.php
@@ -13,15 +13,17 @@ namespace Chill\BudgetBundle\Form;
use Chill\BudgetBundle\Config\ConfigRepository;
use Chill\BudgetBundle\Entity\Resource;
+use Chill\BudgetBundle\Entity\ResourceKind;
+use Chill\BudgetBundle\Repository\ResourceKindRepository;
use Chill\MainBundle\Form\Type\ChillDateType;
use Chill\MainBundle\Templating\TranslatableStringHelperInterface;
+use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
-use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\MoneyType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
-
+use Symfony\Contracts\Translation\TranslatorInterface;
use function array_flip;
class ResourceType extends AbstractType
@@ -30,22 +32,35 @@ class ResourceType extends AbstractType
protected TranslatableStringHelperInterface $translatableStringHelper;
+ private ResourceKindRepository $repository;
+
+ private TranslatorInterface $translator;
+
public function __construct(
ConfigRepository $configRepository,
- TranslatableStringHelperInterface $translatableStringHelper
+ TranslatableStringHelperInterface $translatableStringHelper,
+ ResourceKindRepository $repository,
+ TranslatorInterface $translator
) {
$this->configRepository = $configRepository;
$this->translatableStringHelper = $translatableStringHelper;
+ $this->repository = $repository;
+ $this->translator = $translator;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
- ->add('type', ChoiceType::class, [
- 'choices' => $this->getTypes(),
- 'placeholder' => 'Choose a resource type',
- 'label' => 'Resource element type',
- 'attr' => ['class' => ' select2 '],
+ ->add('resource', EntityType::class, [
+ 'class' => ResourceKind::class,
+ 'choices' => $this->repository->findAllActive(),
+ 'label' => 'Resource type',
+ 'required' => true,
+ 'placeholder' => $this->translator->trans('admin.form.Choose the type of resource'),
+ 'choice_label' => function (ResourceKind $resource) {
+ return $this->translatableStringHelper->localize($resource->getName());
+ },
+ 'attr' => ['class' => 'select2'],
])
->add('amount', MoneyType::class)
->add('comment', TextareaType::class, [
diff --git a/src/Bundle/ChillBudgetBundle/Menu/AdminMenuBuilder.php b/src/Bundle/ChillBudgetBundle/Menu/AdminMenuBuilder.php
new file mode 100644
index 000000000..894230ad9
--- /dev/null
+++ b/src/Bundle/ChillBudgetBundle/Menu/AdminMenuBuilder.php
@@ -0,0 +1,62 @@
+security = $security;
+ }
+
+ public function buildMenu($menuId, MenuItem $menu, array $parameters)
+ {
+ // all the entries below must have ROLE_ADMIN permissions
+ if (!$this->security->isGranted('ROLE_ADMIN')) {
+ return;
+ }
+
+ $menu->addChild('Budget', [
+ 'route' => 'chill_admin_budget',
+ ])
+ ->setAttribute('class', 'list-group-item-header')
+ ->setExtras([
+ 'order' => 7050,
+ 'explain' => 'Budget resource and charge type configuration',
+ ]);
+ $menu
+ ->addChild('admin.menu.Resource types', [
+ 'route' => 'chill_crud_resource_kind_index',
+ ])
+ ->setExtras([
+ 'order' => 7060,
+ ]);
+ $menu
+ ->addChild('admin.menu.Charge types', [
+ 'route' => 'chill_crud_charge_kind_index',
+ ])
+ ->setExtras([
+ 'order' => 7070,
+ ]);
+ }
+
+ public static function getMenuIds(): array
+ {
+ return ['admin_section', 'admin_budget'];
+ }
+}
diff --git a/src/Bundle/ChillBudgetBundle/Repository/ChargeKindRepository.php b/src/Bundle/ChillBudgetBundle/Repository/ChargeKindRepository.php
new file mode 100644
index 000000000..e170a362a
--- /dev/null
+++ b/src/Bundle/ChillBudgetBundle/Repository/ChargeKindRepository.php
@@ -0,0 +1,84 @@
+repository = $entityManager->getRepository(ChargeKind::class);
+ }
+
+ public function find($id): ?ChargeKind
+ {
+ return $this->repository->find($id);
+ }
+
+ /**
+ * @return ChargeType[]
+ */
+ public function findAll(): array
+ {
+ return $this->repository->findAll();
+ }
+
+ /**
+ * @return ChargeType[]
+ */
+ public function findAllActive(): array
+ {
+ $qb = $this->repository->createQueryBuilder('c');
+
+ return $qb
+ ->select('c')
+ ->where($qb->expr()->eq('c.isActive', 'true'))
+ ->orderBy('c.ordering', 'ASC')
+ ->getQuery()
+ ->getResult();
+ }
+
+ /**
+ * @return ChargeType[]
+ */
+ public function findAllByType(string $type): array
+ {
+ return $this->findBy(['elementType' => $type]);
+ }
+
+ /**
+ * @param mixed|null $limit
+ * @param mixed|null $offset
+ *
+ * @return ChargeType[]
+ */
+ public function findBy(array $criteria, ?array $orderBy = null, ?int $limit = null, ?int $offset = null): array
+ {
+ return $this->repository->findBy($criteria, $orderBy, $limit, $offset);
+ }
+
+ public function findOneBy(array $criteria): ?ChargeKind
+ {
+ return $this->repository->findOneBy($criteria);
+ }
+
+ public function getClassName(): string
+ {
+ return ChargeKind::class;
+ }
+}
diff --git a/src/Bundle/ChillBudgetBundle/Repository/ResourceKindRepository.php b/src/Bundle/ChillBudgetBundle/Repository/ResourceKindRepository.php
new file mode 100644
index 000000000..03af9e083
--- /dev/null
+++ b/src/Bundle/ChillBudgetBundle/Repository/ResourceKindRepository.php
@@ -0,0 +1,84 @@
+repository = $entityManager->getRepository(ResourceKind::class);
+ }
+
+ public function find($id): ?ResourceKind
+ {
+ return $this->repository->find($id);
+ }
+
+ /**
+ * @return ResourceType[]
+ */
+ public function findAll(): array
+ {
+ return $this->repository->findAll();
+ }
+
+ /**
+ * @return ResourceType[]
+ */
+ public function findAllActive(): array
+ {
+ $qb = $this->repository->createQueryBuilder('r');
+
+ return $qb
+ ->select('r')
+ ->where($qb->expr()->eq('r.isActive', 'true'))
+ ->orderBy('r.ordering', 'ASC')
+ ->getQuery()
+ ->getResult();
+ }
+
+ /**
+ * @return ResourceType[]
+ */
+ public function findAllByType(string $type): array
+ {
+ return $this->findBy(['elementType' => $type]);
+ }
+
+ /**
+ * @param mixed|null $limit
+ * @param mixed|null $offset
+ *
+ * @return ResourceType[]
+ */
+ public function findBy(array $criteria, ?array $orderBy = null, ?int $limit = null, ?int $offset = null): array
+ {
+ return $this->repository->findBy($criteria, $orderBy, $limit, $offset);
+ }
+
+ public function findOneBy(array $criteria): ?ResourceKind
+ {
+ return $this->repository->findOneBy($criteria);
+ }
+
+ public function getClassName(): string
+ {
+ return ResourceKind::class;
+ }
+}
diff --git a/src/Bundle/ChillBudgetBundle/Resources/views/Admin/Charge/edit.html.twig b/src/Bundle/ChillBudgetBundle/Resources/views/Admin/Charge/edit.html.twig
new file mode 100644
index 000000000..3a60d3e9c
--- /dev/null
+++ b/src/Bundle/ChillBudgetBundle/Resources/views/Admin/Charge/edit.html.twig
@@ -0,0 +1,12 @@
+{% extends '@ChillMain/CRUD/Admin/index.html.twig' %}
+
+{% block title %}
+ {% include('@ChillMain/CRUD/_edit_title.html.twig') %}
+{% endblock %}
+
+{% block admin_content %}
+ {% embed '@ChillMain/CRUD/_edit_content.html.twig' %}
+ {% block content_form_actions_view %}{% endblock %}
+ {% block content_form_actions_save_and_show %}{% endblock %}
+ {% endembed %}
+{% endblock %}
diff --git a/src/Bundle/ChillBudgetBundle/Resources/views/Admin/Charge/index.html.twig b/src/Bundle/ChillBudgetBundle/Resources/views/Admin/Charge/index.html.twig
new file mode 100644
index 000000000..2486aaecf
--- /dev/null
+++ b/src/Bundle/ChillBudgetBundle/Resources/views/Admin/Charge/index.html.twig
@@ -0,0 +1,49 @@
+{% extends '@ChillMain/Admin/layoutWithVerticalMenu.html.twig' %}
+
+{% block title %}{{ 'admin.title.Charge Type List'|trans }}{% endblock title %}
+
+{% block admin_content %}
+
+
{{ 'admin.title.Charge Type List'|trans }}
+
+
+
+
+ {{ 'Ordering'|trans }} |
+ {{ 'Name'|trans }} |
+ {{ 'Active'|trans }} |
+ |
+
+
+
+ {% for entity in entities %}
+
+ {{ entity.ordering }} |
+ {{ entity|chill_entity_render_box }} |
+
+ {%- if entity.isActive -%}
+
+ {%- else -%}
+
+ {%- endif -%}
+ |
+
+
+ |
+
+ {% endfor %}
+
+
+
+
+{% endblock %}
diff --git a/src/Bundle/ChillBudgetBundle/Resources/views/Admin/Charge/new.html.twig b/src/Bundle/ChillBudgetBundle/Resources/views/Admin/Charge/new.html.twig
new file mode 100644
index 000000000..00ebd2938
--- /dev/null
+++ b/src/Bundle/ChillBudgetBundle/Resources/views/Admin/Charge/new.html.twig
@@ -0,0 +1,11 @@
+{% extends '@ChillMain/CRUD/Admin/index.html.twig' %}
+
+{% block title %}
+ {% include('@ChillMain/CRUD/_new_title.html.twig') %}
+{% endblock %}
+
+{% block admin_content %}
+ {% embed '@ChillMain/CRUD/_new_content.html.twig' %}
+ {% block content_form_actions_save_and_show %}{% endblock %}
+ {% endembed %}
+{% endblock %}
diff --git a/src/Bundle/ChillBudgetBundle/Resources/views/Admin/Resource/edit.html.twig b/src/Bundle/ChillBudgetBundle/Resources/views/Admin/Resource/edit.html.twig
new file mode 100644
index 000000000..3a60d3e9c
--- /dev/null
+++ b/src/Bundle/ChillBudgetBundle/Resources/views/Admin/Resource/edit.html.twig
@@ -0,0 +1,12 @@
+{% extends '@ChillMain/CRUD/Admin/index.html.twig' %}
+
+{% block title %}
+ {% include('@ChillMain/CRUD/_edit_title.html.twig') %}
+{% endblock %}
+
+{% block admin_content %}
+ {% embed '@ChillMain/CRUD/_edit_content.html.twig' %}
+ {% block content_form_actions_view %}{% endblock %}
+ {% block content_form_actions_save_and_show %}{% endblock %}
+ {% endembed %}
+{% endblock %}
diff --git a/src/Bundle/ChillBudgetBundle/Resources/views/Admin/Resource/index.html.twig b/src/Bundle/ChillBudgetBundle/Resources/views/Admin/Resource/index.html.twig
new file mode 100644
index 000000000..35bf88609
--- /dev/null
+++ b/src/Bundle/ChillBudgetBundle/Resources/views/Admin/Resource/index.html.twig
@@ -0,0 +1,49 @@
+{% extends '@ChillMain/Admin/layoutWithVerticalMenu.html.twig' %}
+
+{% block title %}{{ 'admin.title.Resource Type List'|trans }}{% endblock title %}
+
+{% block admin_content %}
+
+ {{ 'admin.title.Resource Type List'|trans }}
+
+
+
+
+ {{ 'Ordering'|trans }} |
+ {{ 'Name'|trans }} |
+ {{ 'Active'|trans }} |
+ |
+
+
+
+ {% for entity in entities %}
+
+ {{ entity.ordering }} |
+ {{ entity|chill_entity_render_box }} |
+
+ {%- if entity.isActive -%}
+
+ {%- else -%}
+
+ {%- endif -%}
+ |
+
+
+ |
+
+ {% endfor %}
+
+
+
+
+{% endblock %}
diff --git a/src/Bundle/ChillBudgetBundle/Resources/views/Admin/Resource/new.html.twig b/src/Bundle/ChillBudgetBundle/Resources/views/Admin/Resource/new.html.twig
new file mode 100644
index 000000000..00ebd2938
--- /dev/null
+++ b/src/Bundle/ChillBudgetBundle/Resources/views/Admin/Resource/new.html.twig
@@ -0,0 +1,11 @@
+{% extends '@ChillMain/CRUD/Admin/index.html.twig' %}
+
+{% block title %}
+ {% include('@ChillMain/CRUD/_new_title.html.twig') %}
+{% endblock %}
+
+{% block admin_content %}
+ {% embed '@ChillMain/CRUD/_new_content.html.twig' %}
+ {% block content_form_actions_save_and_show %}{% endblock %}
+ {% endembed %}
+{% endblock %}
diff --git a/src/Bundle/ChillBudgetBundle/Resources/views/Admin/index.html.twig b/src/Bundle/ChillBudgetBundle/Resources/views/Admin/index.html.twig
new file mode 100644
index 000000000..0e3beca04
--- /dev/null
+++ b/src/Bundle/ChillBudgetBundle/Resources/views/Admin/index.html.twig
@@ -0,0 +1,14 @@
+{% extends "@ChillMain/Admin/layoutWithVerticalMenu.html.twig" %}
+
+{% block vertical_menu_content %}
+ {{ chill_menu('admin_budget', {
+ 'layout': '@ChillMain/Admin/menu_admin_section.html.twig',
+ }) }}
+{% endblock %}
+
+{% block layout_wvm_content %}
+ {% block admin_content %}
+
+ {{ 'admin.title.Budget configuration'|trans }}
+ {% endblock %}
+{% endblock %}
diff --git a/src/Bundle/ChillBudgetBundle/Resources/views/Budget/_macros.html.twig b/src/Bundle/ChillBudgetBundle/Resources/views/Budget/_macros.html.twig
index 41b6f36df..e8d10578b 100644
--- a/src/Bundle/ChillBudgetBundle/Resources/views/Budget/_macros.html.twig
+++ b/src/Bundle/ChillBudgetBundle/Resources/views/Budget/_macros.html.twig
@@ -16,7 +16,11 @@
- {{ f.type|budget_element_type_display(family) }}
+ {% if f.isResource %}
+ {{ f.resource.name|localize_translatable_string }}
+ {% else %}
+ {{ f.charge.name|localize_translatable_string }}
+ {% endif %}
|
{{ f.amount|format_currency('EUR') }} |
diff --git a/src/Bundle/ChillBudgetBundle/Resources/views/Charge/confirm_delete.html.twig b/src/Bundle/ChillBudgetBundle/Resources/views/Charge/confirm_delete.html.twig
index f64184d6f..7a97731da 100644
--- a/src/Bundle/ChillBudgetBundle/Resources/views/Charge/confirm_delete.html.twig
+++ b/src/Bundle/ChillBudgetBundle/Resources/views/Charge/confirm_delete.html.twig
@@ -3,13 +3,13 @@
{% set indexPage = 'chill_budget_elements_index' %}
{% set activeRouteKey = '' %}
{% set person = element.person %}
- {% set confirm_question = 'Are you sure you want to remove the charge "%type%" associated to "%name%" ?'|trans({ '%name%' : person.firstname ~ ' ' ~ person.lastname, '%type%': element.type|budget_element_type_display('charge') } ) %}
+ {% set confirm_question = 'Are you sure you want to remove the charge "%type%" associated to "%name%" ?'|trans({ '%name%' : person.firstname ~ ' ' ~ person.lastname, '%type%': element.charge.getName | localize_translatable_string } ) %}
{% else %}
{% set template = '@ChillPerson/Household/layout.html.twig' %}
{% set indexPage = 'chill_budget_elements_household_index' %}
{% set activeRouteKey = '' %}
{% set household = element.household %}
- {% set confirm_question = 'Are you sure you want to remove the charge "%type%" associated to household "%household%" ?'|trans({ '%household%' : household.id, '%type%': element.type|budget_element_type_display('charge') } ) %}
+ {% set confirm_question = 'Are you sure you want to remove the charge "%type%" associated to household "%household%" ?'|trans({ '%household%' : household.id, '%type%': element.charge.getName | localize_translatable_string } ) %}
{% endif %}
{% extends template %}
diff --git a/src/Bundle/ChillBudgetBundle/Resources/views/Charge/edit.html.twig b/src/Bundle/ChillBudgetBundle/Resources/views/Charge/edit.html.twig
index fed80a5c0..ab68314d6 100644
--- a/src/Bundle/ChillBudgetBundle/Resources/views/Charge/edit.html.twig
+++ b/src/Bundle/ChillBudgetBundle/Resources/views/Charge/edit.html.twig
@@ -21,7 +21,7 @@
{{ form_start(form) }}
-{{ form_row(form.type) }}
+{{ form_row(form.charge) }}
{{ form_row(form.amount) }}
{{ form_row(form.help) }}
{{ form_row(form.comment) }}
diff --git a/src/Bundle/ChillBudgetBundle/Resources/views/Charge/new.html.twig b/src/Bundle/ChillBudgetBundle/Resources/views/Charge/new.html.twig
index 817d501ca..bdd7334bb 100644
--- a/src/Bundle/ChillBudgetBundle/Resources/views/Charge/new.html.twig
+++ b/src/Bundle/ChillBudgetBundle/Resources/views/Charge/new.html.twig
@@ -20,7 +20,7 @@
{{ form_start(form) }}
-{{ form_row(form.type) }}
+{{ form_row(form.charge) }}
{{ form_row(form.amount) }}
{{ form_row(form.help) }}
{{ form_row(form.comment) }}
diff --git a/src/Bundle/ChillBudgetBundle/Resources/views/Charge/view.html.twig b/src/Bundle/ChillBudgetBundle/Resources/views/Charge/view.html.twig
index d3b9ef71b..509c421b0 100644
--- a/src/Bundle/ChillBudgetBundle/Resources/views/Charge/view.html.twig
+++ b/src/Bundle/ChillBudgetBundle/Resources/views/Charge/view.html.twig
@@ -25,7 +25,7 @@
- {{ element.type|budget_element_type_display('charge') }}
+ {{ element.charge.getName | localize_translatable_string }}
diff --git a/src/Bundle/ChillBudgetBundle/Resources/views/Entity/budget_element_type.html.twig b/src/Bundle/ChillBudgetBundle/Resources/views/Entity/budget_element_type.html.twig
new file mode 100644
index 000000000..f2187a8b8
--- /dev/null
+++ b/src/Bundle/ChillBudgetBundle/Resources/views/Entity/budget_element_type.html.twig
@@ -0,0 +1 @@
+ {{ entity.name|localize_translatable_string }}
\ No newline at end of file
diff --git a/src/Bundle/ChillBudgetBundle/Resources/views/Resource/confirm_delete.html.twig b/src/Bundle/ChillBudgetBundle/Resources/views/Resource/confirm_delete.html.twig
index 73ae173ff..f60c3b6de 100644
--- a/src/Bundle/ChillBudgetBundle/Resources/views/Resource/confirm_delete.html.twig
+++ b/src/Bundle/ChillBudgetBundle/Resources/views/Resource/confirm_delete.html.twig
@@ -3,13 +3,13 @@
{% set indexPage = 'chill_budget_elements_index' %}
{% set activeRouteKey = '' %}
{% set person = element.person %}
- {% set confirm_question = 'Are you sure you want to remove the ressource "%type%" associated to "%name%" ?'|trans({ '%name%' : person.firstname ~ ' ' ~ person.lastname, '%type%': element.type|budget_element_type_display('resource') } ) %}
+ {% set confirm_question = 'Are you sure you want to remove the ressource "%type%" associated to "%name%" ?'|trans({ '%name%' : person.firstname ~ ' ' ~ person.lastname, '%type%': element.resource.getName | localize_translatable_string } ) %}
{% else %}
{% set template = '@ChillPerson/Household/layout.html.twig' %}
{% set indexPage = 'chill_budget_elements_household_index' %}
{% set activeRouteKey = '' %}
{% set household = element.household %}
- {% set confirm_question = 'Are you sure you want to remove the ressource "%type%" associated to household "%household%" ?'|trans({ '%household%' : household.id, '%type%': element.type|budget_element_type_display('resource') } ) %}
+ {% set confirm_question = 'Are you sure you want to remove the ressource "%type%" associated to household "%household%" ?'|trans({ '%household%' : household.id, '%type%': element.resource.getName | localize_translatable_string} ) %}
{% endif %}
{% extends template %}
diff --git a/src/Bundle/ChillBudgetBundle/Resources/views/Resource/edit.html.twig b/src/Bundle/ChillBudgetBundle/Resources/views/Resource/edit.html.twig
index 8b051eeaf..85cf7e8e4 100644
--- a/src/Bundle/ChillBudgetBundle/Resources/views/Resource/edit.html.twig
+++ b/src/Bundle/ChillBudgetBundle/Resources/views/Resource/edit.html.twig
@@ -23,7 +23,7 @@
{{ form_start(form) }}
-{{ form_row(form.type) }}
+{{ form_row(form.resource) }}
{{ form_row(form.amount) }}
{{ form_row(form.comment) }}
{{ form_row(form.startDate) }}
diff --git a/src/Bundle/ChillBudgetBundle/Resources/views/Resource/new.html.twig b/src/Bundle/ChillBudgetBundle/Resources/views/Resource/new.html.twig
index 4ea71f4de..5c1b63d12 100644
--- a/src/Bundle/ChillBudgetBundle/Resources/views/Resource/new.html.twig
+++ b/src/Bundle/ChillBudgetBundle/Resources/views/Resource/new.html.twig
@@ -22,8 +22,7 @@
{{ title }}
{{ form_start(form) }}
-
-{{ form_row(form.type) }}
+{{ form_row(form.resource) }}
{{ form_row(form.amount) }}
{{ form_row(form.comment) }}
{{ form_row(form.startDate) }}
diff --git a/src/Bundle/ChillBudgetBundle/Resources/views/Resource/view.html.twig b/src/Bundle/ChillBudgetBundle/Resources/views/Resource/view.html.twig
index 110aed9fe..c3618b498 100644
--- a/src/Bundle/ChillBudgetBundle/Resources/views/Resource/view.html.twig
+++ b/src/Bundle/ChillBudgetBundle/Resources/views/Resource/view.html.twig
@@ -25,7 +25,7 @@
- {{ element.type|budget_element_type_display('resource') }}
+ {{ element.resource.getName | localize_translatable_string }}
diff --git a/src/Bundle/ChillBudgetBundle/Security/Authorization/BudgetElementVoter.php b/src/Bundle/ChillBudgetBundle/Security/Authorization/BudgetElementVoter.php
index 0a428d324..5203f9092 100644
--- a/src/Bundle/ChillBudgetBundle/Security/Authorization/BudgetElementVoter.php
+++ b/src/Bundle/ChillBudgetBundle/Security/Authorization/BudgetElementVoter.php
@@ -20,7 +20,7 @@ use Chill\PersonBundle\Entity\Household\Household;
use Chill\PersonBundle\Entity\Person;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
-use function in_array;
+use UnexpectedValueException;
class BudgetElementVoter extends AbstractChillVoter implements ProvideRoleHierarchyInterface
{
@@ -68,12 +68,29 @@ class BudgetElementVoter extends AbstractChillVoter implements ProvideRoleHierar
protected function supports($attribute, $subject)
{
- return (in_array($attribute, self::ROLES, true) && $subject instanceof AbstractElement)
- || (($subject instanceof Person || $subject instanceof Household) && in_array($attribute, [self::SEE, self::CREATE], true));
+ return $this->voter->supports($attribute, $subject);
}
protected function voteOnAttribute($attribute, $subject, TokenInterface $token)
{
- return $this->voter->voteOnAttribute($attribute, $subject, $token);
+ if (
+ $subject instanceof Person
+ || ($subject instanceof AbstractElement && null !== $person = $subject->getPerson())) {
+ return $this->voter->voteOnAttribute($attribute, $person ?? $subject, $token);
+ }
+
+ if (
+ $subject instanceof Household
+ || ($subject instanceof AbstractElement && null !== $household = $subject->getHousehold())) {
+ foreach (($household ?? $subject)->getCurrentPersons() as $person) {
+ if ($this->voter->voteOnAttribute($attribute, $person, $token)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ throw new UnexpectedValueException('This subject is not supported, or is an element not associated with person or household');
}
}
diff --git a/src/Bundle/ChillBudgetBundle/Templating/BudgetElementTypeRender.php b/src/Bundle/ChillBudgetBundle/Templating/BudgetElementTypeRender.php
new file mode 100644
index 000000000..9cc89e2bf
--- /dev/null
+++ b/src/Bundle/ChillBudgetBundle/Templating/BudgetElementTypeRender.php
@@ -0,0 +1,55 @@
+translatableStringHelper = $translatableStringHelper;
+ $this->engine = $engine;
+ }
+
+ public function renderBox($entity, array $options): string
+ {
+ return $this->engine->render('@ChillBudget/Entity/budget_element_type.html.twig', [
+ 'entity' => $entity,
+ 'options' => $options,
+ ]);
+ }
+
+ public function renderString($entity, array $options): string
+ {
+ $title = '';
+
+ if (null !== $entity->getName()) {
+ return $this->translatableStringHelper->localize($entity->getName());
+ }
+
+ return $title;
+ }
+
+ public function supports($entity, array $options): bool
+ {
+ return $entity instanceof ChargeKind || $entity instanceof ResourceKind;
+ }
+}
diff --git a/src/Bundle/ChillBudgetBundle/config/services/controller.yaml b/src/Bundle/ChillBudgetBundle/config/services/controller.yaml
index 82c683536..ae6fb84d6 100644
--- a/src/Bundle/ChillBudgetBundle/config/services/controller.yaml
+++ b/src/Bundle/ChillBudgetBundle/config/services/controller.yaml
@@ -3,3 +3,7 @@ services:
autowire: true
resource: '../../Controller'
tags: ['controller.service_arguments']
+ Chill\BudgetBundle\Controller\Admin\:
+ autowire: true
+ autoconfigure: true
+ resource: '../../Controller/Admin'
diff --git a/src/Bundle/ChillBudgetBundle/config/services/form.yaml b/src/Bundle/ChillBudgetBundle/config/services/form.yaml
index 63862ce94..a033413d0 100644
--- a/src/Bundle/ChillBudgetBundle/config/services/form.yaml
+++ b/src/Bundle/ChillBudgetBundle/config/services/form.yaml
@@ -1,14 +1,9 @@
services:
- Chill\BudgetBundle\Form\ResourceType:
- arguments:
- $configRepository: '@Chill\BudgetBundle\Config\ConfigRepository'
- $translatableStringHelper: '@Chill\MainBundle\Templating\TranslatableStringHelper'
- tags:
- - { name: 'form.type' }
-
- Chill\BudgetBundle\Form\ChargeType:
- arguments:
- $configRepository: '@Chill\BudgetBundle\Config\ConfigRepository'
- $translatableStringHelper: '@Chill\MainBundle\Templating\TranslatableStringHelper'
+ Chill\BudgetBundle\Form\:
+ autowire: true
+ resource: '../../Form'
tags:
- { name: 'form.type' }
+# Chill\BudgetBundle\Form\Admin\:
+# autowire: true
+# resource: '../../Form/Admin'
diff --git a/src/Bundle/ChillBudgetBundle/config/services/menu.yaml b/src/Bundle/ChillBudgetBundle/config/services/menu.yaml
index 34128519b..ba8b301d5 100644
--- a/src/Bundle/ChillBudgetBundle/config/services/menu.yaml
+++ b/src/Bundle/ChillBudgetBundle/config/services/menu.yaml
@@ -1,8 +1,5 @@
services:
- Chill\BudgetBundle\Menu\PersonMenuBuilder:
- autowire: true
- autoconfigure: true
-
- Chill\BudgetBundle\Menu\HouseholdMenuBuilder:
+ Chill\BudgetBundle\Menu\:
autowire: true
autoconfigure: true
+ resource: './../../Menu'
diff --git a/src/Bundle/ChillBudgetBundle/config/services/repository.yaml b/src/Bundle/ChillBudgetBundle/config/services/repository.yaml
new file mode 100644
index 000000000..7205a8378
--- /dev/null
+++ b/src/Bundle/ChillBudgetBundle/config/services/repository.yaml
@@ -0,0 +1,5 @@
+services:
+ Chill\BudgetBundle\Repository\:
+ autowire: true
+ autoconfigure: true
+ resource: './../../Repository'
\ No newline at end of file
diff --git a/src/Bundle/ChillBudgetBundle/config/services/templating.yaml b/src/Bundle/ChillBudgetBundle/config/services/templating.yaml
index 903db5d67..2646f3892 100644
--- a/src/Bundle/ChillBudgetBundle/config/services/templating.yaml
+++ b/src/Bundle/ChillBudgetBundle/config/services/templating.yaml
@@ -1,7 +1,5 @@
services:
- Chill\BudgetBundle\Templating\Twig:
- arguments:
- $configRepository: '@Chill\BudgetBundle\Config\ConfigRepository'
- $translatableStringHelper: '@Chill\MainBundle\Templating\TranslatableStringHelper'
- tags:
- - { name: 'twig.extension' }
\ No newline at end of file
+ Chill\BudgetBundle\Templating\:
+ autowire: true
+ autoconfigure: true
+ resource: '../../Templating'
diff --git a/src/Bundle/ChillBudgetBundle/migrations/Version20221116163445.php b/src/Bundle/ChillBudgetBundle/migrations/Version20221116163445.php
new file mode 100644
index 000000000..118b7c30d
--- /dev/null
+++ b/src/Bundle/ChillBudgetBundle/migrations/Version20221116163445.php
@@ -0,0 +1,39 @@
+addSql('DROP SEQUENCE chill_budget.charge_type_id_seq CASCADE');
+ $this->addSql('DROP SEQUENCE chill_budget.resource_type_id_seq CASCADE');
+ $this->addSql('DROP TABLE chill_budget.charge_type');
+ $this->addSql('DROP TABLE chill_budget.resource_type');
+ }
+
+ public function getDescription(): string
+ {
+ return 'Create resource type and charge type';
+ }
+
+ public function up(Schema $schema): void
+ {
+ $this->addSql('CREATE SEQUENCE chill_budget.charge_type_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+ $this->addSql('CREATE SEQUENCE chill_budget.resource_type_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+ $this->addSql('CREATE TABLE chill_budget.charge_type (id INT NOT NULL, isActive BOOLEAN DEFAULT TRUE NOT NULL, name JSONB DEFAULT \'{}\'::jsonb NOT NULL, ordering DOUBLE PRECISION DEFAULT \'0\' NOT NULL, PRIMARY KEY(id))');
+ $this->addSql('CREATE TABLE chill_budget.resource_type (id INT NOT NULL, isActive BOOLEAN DEFAULT TRUE NOT NULL, name JSONB DEFAULT \'{}\'::jsonb NOT NULL, ordering DOUBLE PRECISION DEFAULT \'0\' NOT NULL, PRIMARY KEY(id))');
+ }
+}
diff --git a/src/Bundle/ChillBudgetBundle/migrations/Version20221130101659.php b/src/Bundle/ChillBudgetBundle/migrations/Version20221130101659.php
new file mode 100644
index 000000000..98d67b341
--- /dev/null
+++ b/src/Bundle/ChillBudgetBundle/migrations/Version20221130101659.php
@@ -0,0 +1,41 @@
+addSql('ALTER TABLE chill_budget.resource_type DROP kind');
+ $this->addSql('ALTER TABLE chill_budget.resource_type DROP tags');
+ $this->addSql('ALTER TABLE chill_budget.charge_type DROP kind');
+ $this->addSql('ALTER TABLE chill_budget.charge_type DROP tags');
+ }
+
+ public function getDescription(): string
+ {
+ return 'Add kind and tags property to charge and resource types';
+ }
+
+ public function up(Schema $schema): void
+ {
+ $this->addSql('ALTER TABLE chill_budget.charge_type ADD kind VARCHAR(255) DEFAULT \'\' NOT NULL');
+ $this->addSql('ALTER TABLE chill_budget.charge_type ADD tags JSONB DEFAULT \'{}\'::jsonb NOT NULL');
+ $this->addSql('COMMENT ON COLUMN chill_budget.charge_type.tags IS \'(DC2Type:jsonb)\'');
+ $this->addSql('ALTER TABLE chill_budget.resource_type ADD kind VARCHAR(255) DEFAULT \'\' NOT NULL');
+ $this->addSql('ALTER TABLE chill_budget.resource_type ADD tags JSONB DEFAULT \'{}\'::jsonb NOT NULL');
+ $this->addSql('COMMENT ON COLUMN chill_budget.resource_type.tags IS \'(DC2Type:jsonb)\'');
+ }
+}
diff --git a/src/Bundle/ChillBudgetBundle/migrations/Version20221202165608.php b/src/Bundle/ChillBudgetBundle/migrations/Version20221202165608.php
new file mode 100644
index 000000000..c2152100b
--- /dev/null
+++ b/src/Bundle/ChillBudgetBundle/migrations/Version20221202165608.php
@@ -0,0 +1,41 @@
+addSql('ALTER TABLE chill_budget.charge DROP CONSTRAINT FK_5C99D2C355284914');
+ $this->addSql('ALTER TABLE chill_budget.charge DROP charge_id');
+ $this->addSql('ALTER TABLE chill_budget.resource DROP CONSTRAINT FK_5E0A5E9789329D25');
+ $this->addSql('ALTER TABLE chill_budget.resource DROP resource_id');
+ }
+
+ public function getDescription(): string
+ {
+ return 'Integrate budget admin entity';
+ }
+
+ public function up(Schema $schema): void
+ {
+ $this->addSql('ALTER TABLE chill_budget.charge ADD charge_id INT DEFAULT NULL');
+ $this->addSql('ALTER TABLE chill_budget.charge ADD CONSTRAINT FK_5C99D2C355284914 FOREIGN KEY (charge_id) REFERENCES chill_budget.charge_type (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+ $this->addSql('CREATE INDEX IDX_5C99D2C355284914 ON chill_budget.charge (charge_id)');
+ $this->addSql('ALTER TABLE chill_budget.resource ADD resource_id INT DEFAULT NULL');
+ $this->addSql('ALTER TABLE chill_budget.resource ADD CONSTRAINT FK_5E0A5E9789329D25 FOREIGN KEY (resource_id) REFERENCES chill_budget.resource_type (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+ $this->addSql('CREATE INDEX IDX_5E0A5E9789329D25 ON chill_budget.resource (resource_id)');
+ }
+}
diff --git a/src/Bundle/ChillBudgetBundle/migrations/Version20221207105407.php b/src/Bundle/ChillBudgetBundle/migrations/Version20221207105407.php
new file mode 100644
index 000000000..cfe3a0089
--- /dev/null
+++ b/src/Bundle/ChillBudgetBundle/migrations/Version20221207105407.php
@@ -0,0 +1,81 @@
+addSql('DELETE FROM chill_budget.resource_type;');
+ $this->addSql('DELETE FROM chill_budget.charge_type;');
+ }
+
+ public function getDescription(): string
+ {
+ return 'Use new budget admin entities';
+ }
+
+ public function setContainer(?ContainerInterface $container = null)
+ {
+ $this->container = $container;
+ }
+
+ public function up(Schema $schema): void
+ {
+ $resources = $this->container->getParameter('chill_budget.resources');
+ $charges = $this->container->getParameter('chill_budget.charges');
+
+ foreach ($resources as $value) {
+ $lang = $value['labels'][0]['lang'];
+ $label = $value['labels'][0]['label'];
+ $kind = $value['key'];
+ $this->addSql(
+ 'INSERT INTO chill_budget.resource_type (id, isActive, name, ordering, kind) VALUES (
+ nextval(\'chill_budget.resource_type_id_seq\'), true, jsonb_build_object(:lang::text, :label::text), 0, :kind::text)',
+ ['lang' => $lang, 'label' => $label, 'kind' => $kind],
+ ['lang' => Types::STRING, 'label' => Types::STRING, 'kind' => Types::STRING]
+ );
+ $this->addSql(
+ 'UPDATE chill_budget.resource SET resource_id = resource_type.id
+ FROM chill_budget.resource_type WHERE resource.type = :kind AND resource_type.kind = resource.type;',
+ ['kind' => $kind],
+ ['kind' => Types::STRING]
+ );
+ }
+
+ foreach ($charges as $value) {
+ $lang = $value['labels'][0]['lang'];
+ $label = $value['labels'][0]['label'];
+ $kind = $value['key'];
+ $this->addSql(
+ 'INSERT INTO chill_budget.charge_type VALUES (nextval(\'chill_budget.charge_type_id_seq\'), true,
+ jsonb_build_object(:lang::text, :label::text), 0, :kind::text);',
+ ['lang' => $lang, 'label' => $label, 'kind' => $kind],
+ ['lang' => Types::STRING, 'label' => Types::STRING, 'kind' => Types::STRING]
+ );
+ $this->addSql(
+ 'UPDATE chill_budget.charge SET charge_id = charge_type.id
+ FROM chill_budget.charge_type WHERE charge.type = :kind AND charge_type.kind = charge.type;',
+ ['kind' => $kind],
+ ['kind' => Types::STRING]
+ );
+ }
+ }
+}
diff --git a/src/Bundle/ChillBudgetBundle/translations/messages.fr.yml b/src/Bundle/ChillBudgetBundle/translations/messages.fr.yml
index 299fa295e..5fd8fa6f6 100644
--- a/src/Bundle/ChillBudgetBundle/translations/messages.fr.yml
+++ b/src/Bundle/ChillBudgetBundle/translations/messages.fr.yml
@@ -58,6 +58,8 @@ Charge updated: charge mise à jour
Choose a resource type: Choisissez un type de ressource
Choose a charge type: Choisissez un type de charge
+Resource type: Type de ressource
+Charge type: Type de charge
Amount: Montant
Comment: Commentaire
@@ -74,3 +76,28 @@ The balance: Différence entre ressources et charges
Valid since %startDate% until %endDate%: Valide depuis le %startDate% jusqu'au %endDate%
Valid since %startDate%: Valide depuis le %startDate%
+
+## admin
+
+crud:
+ resource_kind:
+ title_new: Nouveau type de ressource
+ title_edit: Modifier le type de ressource
+ charge_kind:
+ title_new: Nouveau type de charge
+ title_edit: Modifier le type de charge
+
+admin:
+ menu:
+ Resource types: Types de ressource
+ Charge types: Types de charge
+ title:
+ Charge Type List: Liste des types de charge
+ Resource Type List: Liste des types de ressource
+ Budget configuration: Configuration des éléments de budget
+ new:
+ Create a new charge type: Créér un nouveau type de charge
+ Create a new resource type: Créér un nouveau type de ressource
+ form:
+ Choose the type of resource: Choisissez une type de ressource
+ Choose the type of charge: Choisissez une type de charge
diff --git a/src/Bundle/ChillCalendarBundle/Controller/CalendarController.php b/src/Bundle/ChillCalendarBundle/Controller/CalendarController.php
index db5f2ec16..550c6e984 100644
--- a/src/Bundle/ChillCalendarBundle/Controller/CalendarController.php
+++ b/src/Bundle/ChillCalendarBundle/Controller/CalendarController.php
@@ -45,6 +45,7 @@ use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Serializer\SerializerInterface;
+use Symfony\Contracts\Translation\TranslatorInterface;
class CalendarController extends AbstractController
{
@@ -68,6 +69,8 @@ class CalendarController extends AbstractController
private TranslatableStringHelperInterface $translatableStringHelper;
+ private TranslatorInterface $translator;
+
private UserRepositoryInterface $userRepository;
public function __construct(
@@ -81,7 +84,8 @@ class CalendarController extends AbstractController
TranslatableStringHelperInterface $translatableStringHelper,
PersonRepository $personRepository,
AccompanyingPeriodRepository $accompanyingPeriodRepository,
- UserRepositoryInterface $userRepository
+ UserRepositoryInterface $userRepository,
+ TranslatorInterface $translator
) {
$this->calendarACLAwareRepository = $calendarACLAwareRepository;
$this->docGeneratorTemplateRepository = $docGeneratorTemplateRepository;
@@ -94,6 +98,7 @@ class CalendarController extends AbstractController
$this->personRepository = $personRepository;
$this->accompanyingPeriodRepository = $accompanyingPeriodRepository;
$this->userRepository = $userRepository;
+ $this->translator = $translator;
}
/**
@@ -131,7 +136,7 @@ class CalendarController extends AbstractController
$em->remove($entity);
$em->flush();
- $this->addFlash('success', $this->get('translator')
+ $this->addFlash('success', $this->translator
->trans('The calendar item has been successfully removed.'));
return new RedirectResponse($redirectRoute);
@@ -190,7 +195,7 @@ class CalendarController extends AbstractController
if ($form->isSubmitted() && $form->isValid()) {
$em->flush();
- $this->addFlash('success', $this->get('translator')->trans('Success : calendar item updated!'));
+ $this->addFlash('success', $this->translator->trans('Success : calendar item updated!'));
if ($form->get('save_and_upload_doc')->isClicked()) {
return $this->redirectToRoute('chill_calendar_calendardoc_new', ['id' => $entity->getId()]);
@@ -210,7 +215,7 @@ class CalendarController extends AbstractController
}
if ($form->isSubmitted() && !$form->isValid()) {
- $this->addFlash('error', $this->get('translator')->trans('This form contains errors'));
+ $this->addFlash('error', $this->translator->trans('This form contains errors'));
}
$entity_array = $this->serializer->normalize($entity, 'json', ['groups' => 'read']);
@@ -369,7 +374,7 @@ class CalendarController extends AbstractController
$em->persist($entity);
$em->flush();
- $this->addFlash('success', $this->get('translator')->trans('Success : calendar item created!'));
+ $this->addFlash('success', $this->translator->trans('Success : calendar item created!'));
if ($form->get('save_and_upload_doc')->isClicked()) {
return $this->redirectToRoute('chill_calendar_calendardoc_new', ['id' => $entity->getId()]);
@@ -393,7 +398,7 @@ class CalendarController extends AbstractController
}
if ($form->isSubmitted() && !$form->isValid()) {
- $this->addFlash('error', $this->get('translator')->trans('This form contains errors'));
+ $this->addFlash('error', $this->translator->trans('This form contains errors'));
}
if (null === $view) {
diff --git a/src/Bundle/ChillCalendarBundle/Export/Aggregator/AgentAggregator.php b/src/Bundle/ChillCalendarBundle/Export/Aggregator/AgentAggregator.php
index 9b0ad9057..e1de9f399 100644
--- a/src/Bundle/ChillCalendarBundle/Export/Aggregator/AgentAggregator.php
+++ b/src/Bundle/ChillCalendarBundle/Export/Aggregator/AgentAggregator.php
@@ -66,6 +66,10 @@ final class AgentAggregator implements AggregatorInterface
return 'Agent';
}
+ if (null === $value || '' === $value) {
+ return '';
+ }
+
$r = $this->userRepository->find($value);
return $this->userRender->renderString($r, []);
diff --git a/src/Bundle/ChillCalendarBundle/Export/Aggregator/CancelReasonAggregator.php b/src/Bundle/ChillCalendarBundle/Export/Aggregator/CancelReasonAggregator.php
index 329e2e50e..611cb6d79 100644
--- a/src/Bundle/ChillCalendarBundle/Export/Aggregator/CancelReasonAggregator.php
+++ b/src/Bundle/ChillCalendarBundle/Export/Aggregator/CancelReasonAggregator.php
@@ -67,6 +67,10 @@ class CancelReasonAggregator implements AggregatorInterface
return 'Cancel reason';
}
+ if (null === $value || '' === $value) {
+ return '';
+ }
+
$j = $this->cancelReasonRepository->find($value);
return $this->translatableStringHelper->localize(
diff --git a/src/Bundle/ChillCalendarBundle/Export/Aggregator/JobAggregator.php b/src/Bundle/ChillCalendarBundle/Export/Aggregator/JobAggregator.php
index 2a6f3b63e..23292a5b0 100644
--- a/src/Bundle/ChillCalendarBundle/Export/Aggregator/JobAggregator.php
+++ b/src/Bundle/ChillCalendarBundle/Export/Aggregator/JobAggregator.php
@@ -66,6 +66,10 @@ final class JobAggregator implements AggregatorInterface
return 'Job';
}
+ if (null === $value || '' === $value) {
+ return '';
+ }
+
$j = $this->jobRepository->find($value);
return $this->translatableStringHelper->localize(
diff --git a/src/Bundle/ChillCalendarBundle/Export/Aggregator/LocationAggregator.php b/src/Bundle/ChillCalendarBundle/Export/Aggregator/LocationAggregator.php
index 687dc9096..940000f47 100644
--- a/src/Bundle/ChillCalendarBundle/Export/Aggregator/LocationAggregator.php
+++ b/src/Bundle/ChillCalendarBundle/Export/Aggregator/LocationAggregator.php
@@ -60,6 +60,10 @@ final class LocationAggregator implements AggregatorInterface
return 'Location';
}
+ if (null === $value || '' === $value) {
+ return '';
+ }
+
$l = $this->locationRepository->find($value);
return $l->getName();
diff --git a/src/Bundle/ChillCalendarBundle/Export/Aggregator/LocationTypeAggregator.php b/src/Bundle/ChillCalendarBundle/Export/Aggregator/LocationTypeAggregator.php
index b23b304f6..6574e3934 100644
--- a/src/Bundle/ChillCalendarBundle/Export/Aggregator/LocationTypeAggregator.php
+++ b/src/Bundle/ChillCalendarBundle/Export/Aggregator/LocationTypeAggregator.php
@@ -66,7 +66,13 @@ final class LocationTypeAggregator implements AggregatorInterface
return 'Location type';
}
- $j = $this->locationTypeRepository->find($value);
+ if (null === $value || '' === $value) {
+ return '';
+ }
+
+ if (null === $j = $this->locationTypeRepository->find($value)) {
+ return '';
+ }
return $this->translatableStringHelper->localize(
$j->getTitle()
diff --git a/src/Bundle/ChillCalendarBundle/Export/Aggregator/ScopeAggregator.php b/src/Bundle/ChillCalendarBundle/Export/Aggregator/ScopeAggregator.php
index b16b06d84..3aff3e0d8 100644
--- a/src/Bundle/ChillCalendarBundle/Export/Aggregator/ScopeAggregator.php
+++ b/src/Bundle/ChillCalendarBundle/Export/Aggregator/ScopeAggregator.php
@@ -66,6 +66,10 @@ final class ScopeAggregator implements AggregatorInterface
return 'Scope';
}
+ if (null === $value || '' === $value) {
+ return '';
+ }
+
$s = $this->scopeRepository->find($value);
return $this->translatableStringHelper->localize(
diff --git a/src/Bundle/ChillDocStoreBundle/Resources/views/AccompanyingCourseDocument/_workflow.html.twig b/src/Bundle/ChillDocStoreBundle/Resources/views/AccompanyingCourseDocument/_workflow.html.twig
index 44dbcb9f4..f914bd7f5 100644
--- a/src/Bundle/ChillDocStoreBundle/Resources/views/AccompanyingCourseDocument/_workflow.html.twig
+++ b/src/Bundle/ChillDocStoreBundle/Resources/views/AccompanyingCourseDocument/_workflow.html.twig
@@ -1,64 +1,71 @@
{% import "@ChillDocStore/Macro/macro.html.twig" as m %}
{% import "@ChillDocStore/Macro/macro_mimeicon.html.twig" as mm %}
-
-
-
-
-
-
-
- {{ document.title }}
+{% if document is null %}
+
+ {{ 'workflow.Document deleted'|trans }}
+
+{% else %}
+
+
+
+
+
+
+
+ {{ document.title }}
- {{ mm.mimeIcon(document.object.type) }}
-
- {% if document.description is not empty %}
-
- {{ document.description }}
-
- {% endif %}
+ {{ mm.mimeIcon(document.object.type) }}
+ {% if document.description is not empty %}
+
+ {{ document.description }}
+
+ {% endif %}
+
-
-{% set freezed = false %}
-{% for step in entity_workflow.stepsChained %}
- {% if loop.last %}
- {% if step.previous is not null and step.previous.freezeAfter == true %}
- {% set freezed = true %}
- {% endif %}
- {% endif %}
-{% endfor %}
-
-{% if display_action is defined and display_action == true %}
-
- {% if document.course != null and is_granted('CHILL_PERSON_ACCOMPANYING_PERIOD_SEE', document.course) %}
- -
-
- {{ 'Course number'|trans }} {{ document.course.id }}
-
-
- {% endif %}
- -
- {{ m.download_button(document.object, document.title) }}
-
- -
- {% if chill_document_is_editable(document.object) %}
- {% if not freezed %}
- {{ document.object|chill_document_edit_button({'title': document.title|e('html') }) }}
- {% else %}
-
- {{ 'Update document'|trans }}
-
+ {% set freezed = false %}
+ {% for step in entity_workflow.stepsChained %}
+ {% if loop.last %}
+ {% if step.previous is not null and step.previous.freezeAfter == true %}
+ {% set freezed = true %}
{% endif %}
{% endif %}
- {% if is_granted('CHILL_ACCOMPANYING_COURSE_DOCUMENT_SEE', document) and document.course != null %}
+ {% endfor %}
+
+ {% if display_action is defined and display_action == true %}
+
-
+ {% if chill_document_is_editable(document.object) %}
+ {% if not freezed %}
+ -
+ {{ document.object|chill_document_edit_button({'title': document.title|e('html') }) }}
+
+ {% else %}
+ -
+
+ {{ 'Update document'|trans }}
+
+
+ {% endif %}
+ {% endif %}
+ {% if is_granted('CHILL_ACCOMPANYING_COURSE_DOCUMENT_SEE', document) and document.course != null %}
+ -
+
+
+ {% endif %}
+
+ {% endif %}
{% endif %}
diff --git a/src/Bundle/ChillDocStoreBundle/Service/StoredObjectManager.php b/src/Bundle/ChillDocStoreBundle/Service/StoredObjectManager.php
index daed12b84..a1ef42ff1 100644
--- a/src/Bundle/ChillDocStoreBundle/Service/StoredObjectManager.php
+++ b/src/Bundle/ChillDocStoreBundle/Service/StoredObjectManager.php
@@ -60,7 +60,7 @@ final class StoredObjectManager implements StoredObjectManagerInterface
$this
->tempUrlGenerator
->generate(
- Request::METHOD_PUT,
+ Request::METHOD_HEAD,
$document->getFilename()
)
->url
diff --git a/src/Bundle/ChillDocStoreBundle/Workflow/AccompanyingCourseDocumentWorkflowHandler.php b/src/Bundle/ChillDocStoreBundle/Workflow/AccompanyingCourseDocumentWorkflowHandler.php
index 8e94dbd83..96787a6fc 100644
--- a/src/Bundle/ChillDocStoreBundle/Workflow/AccompanyingCourseDocumentWorkflowHandler.php
+++ b/src/Bundle/ChillDocStoreBundle/Workflow/AccompanyingCourseDocumentWorkflowHandler.php
@@ -65,6 +65,10 @@ class AccompanyingCourseDocumentWorkflowHandler implements EntityWorkflowHandler
{
$doc = $this->getRelatedEntity($entityWorkflow);
+ if (null === $doc) {
+ return $this->translator->trans('workflow.Document deleted');
+ }
+
return $this->translator->trans('workflow.Document (n°%doc%)', ['%doc%' => $entityWorkflow->getRelatedEntityId()])
. ' - ' . $doc->getTitle();
}
diff --git a/src/Bundle/ChillDocStoreBundle/translations/messages.fr.yml b/src/Bundle/ChillDocStoreBundle/translations/messages.fr.yml
index 3dda25797..4fbad1546 100644
--- a/src/Bundle/ChillDocStoreBundle/translations/messages.fr.yml
+++ b/src/Bundle/ChillDocStoreBundle/translations/messages.fr.yml
@@ -63,3 +63,6 @@ Create new DocumentCategory: Créer une nouvelle catégorie de document
# WOPI EDIT
online_edit_document: Éditer en ligne
+
+workflow:
+ Document deleted: Document supprimé
diff --git a/src/Bundle/ChillEventBundle/Form/Type/PickEventType.php b/src/Bundle/ChillEventBundle/Form/Type/PickEventType.php
index 782bd7628..4e8179f10 100644
--- a/src/Bundle/ChillEventBundle/Form/Type/PickEventType.php
+++ b/src/Bundle/ChillEventBundle/Form/Type/PickEventType.php
@@ -151,7 +151,7 @@ class PickEventType extends AbstractType
} else {
$centers = $this->authorizationHelper->getReachableCenters(
$this->user,
- (string) $options['role']
+ (string) $options['role']->getRole()
);
}
diff --git a/src/Bundle/ChillEventBundle/Resources/views/Event/confirm_delete.html.twig b/src/Bundle/ChillEventBundle/Resources/views/Event/confirm_delete.html.twig
index 86b7c6fd2..c3a13b55a 100644
--- a/src/Bundle/ChillEventBundle/Resources/views/Event/confirm_delete.html.twig
+++ b/src/Bundle/ChillEventBundle/Resources/views/Event/confirm_delete.html.twig
@@ -5,6 +5,7 @@
{% block title 'Delete event'|trans %}
{% block event_content %}
+
{{ include('@ChillMain/Util/confirmation_template.html.twig',
{
@@ -15,6 +16,6 @@
'form' : delete_form
}
) }}
-
+
{% endblock %}
diff --git a/src/Bundle/ChillEventBundle/Resources/views/Event/edit.html.twig b/src/Bundle/ChillEventBundle/Resources/views/Event/edit.html.twig
index 288c81edd..a528f1f5c 100644
--- a/src/Bundle/ChillEventBundle/Resources/views/Event/edit.html.twig
+++ b/src/Bundle/ChillEventBundle/Resources/views/Event/edit.html.twig
@@ -3,6 +3,7 @@
{% block title 'Event edit'|trans %}
{% block event_content -%}
+
{{ 'Event edit'|trans }}
{{ form_start(edit_form) }}
@@ -28,6 +29,8 @@
{{ form_widget(edit_form.submit, { 'attr' : { 'class' : 'btn btn-update' } }) }}
-
+
{{ form_end(edit_form) }}
+
+
{% endblock %}
diff --git a/src/Bundle/ChillEventBundle/Resources/views/Event/list.html.twig b/src/Bundle/ChillEventBundle/Resources/views/Event/list.html.twig
index 6e77b6df8..8d5f49da8 100644
--- a/src/Bundle/ChillEventBundle/Resources/views/Event/list.html.twig
+++ b/src/Bundle/ChillEventBundle/Resources/views/Event/list.html.twig
@@ -6,42 +6,42 @@
{{ 'Results %start%-%end% of %total%'|trans({ '%start%' : start, '%end%': start + events|length, '%total%' : total } ) }}
-
+
-
- {{ 'Name'|trans }} |
- {{ 'Date'|trans }} |
- {{ 'Event type'|trans }} |
- |
-
+
+ {{ 'Name'|trans }} |
+ {{ 'Date'|trans }} |
+ {{ 'Event type'|trans }} |
+ |
+
- {% for event in events %}
-
- {{ event.name }} |
- {{ event.date|format_date('long') }} |
- {{ event.type.name|localize_translatable_string }} |
-
-
- -
- {# {% if is_granted('CHILL_EVENT_SEE_DETAILS', event) %} #}
-
- {{ 'See'|trans }}
-
- {# {% endif %} #}
- {% if is_granted('CHILL_EVENT_UPDATE', event) %}
+ {% for event in events %}
+
+ {{ event.name }} |
+ {{ event.date|format_date('long') }} |
+ {{ event.type.name|localize_translatable_string }} |
+
+
+ -
+ {# {% if is_granted('CHILL_EVENT_SEE_DETAILS', event) %} #}
+
+ {{ 'See'|trans }}
+
+ {# {% endif %} #}
+ {% if is_granted('CHILL_EVENT_UPDATE', event) %}
{{ 'Edit'|trans }}
- {% endif %}
-
-
- |
-
- {% endfor %}
+ {% endif %}
+
+
+ |
+
+ {% endfor %}
-
+
{% endif %}
{% if preview == false %}
-{{ chill_pagination(paginator) }}
+ {{ chill_pagination(paginator) }}
{% endif %}
+
diff --git a/src/Bundle/ChillEventBundle/Resources/views/Event/listByPerson.html.twig b/src/Bundle/ChillEventBundle/Resources/views/Event/listByPerson.html.twig
index 53e97c3c4..ef2dae85c 100644
--- a/src/Bundle/ChillEventBundle/Resources/views/Event/listByPerson.html.twig
+++ b/src/Bundle/ChillEventBundle/Resources/views/Event/listByPerson.html.twig
@@ -44,59 +44,59 @@
{{ participation.role.name|localize_translatable_string }} |
{{ participation.status.name|localize_translatable_string }} |
-
+
{% set currentPath = path(app.request.attributes.get('_route'), app.request.attributes.get('_route_params')) %}
{% set returnLabel = 'Back to %person% events'|trans({ '%person%' : currentPerson } ) %}
{% if is_granted('CHILL_EVENT_SEE_DETAILS', participation.event) %}
- -
-
+ class="btn btn-primary btn-sm" title="{{ 'See details of the event'|trans }}">
+
+
{% endif %}
{% if is_granted('CHILL_EVENT_UPDATE', participation.event)
and is_granted('CHILL_EVENT_PARTICIPATION_UPDATE', participation) %}
- -
-
{% else %}
-
-
{% if is_granted('CHILL_EVENT_UPDATE', participation.event) %}
-
- {{ 'Edit the event'|trans }}
-
+
+ {{ 'Edit the event'|trans }}
+
{% endif %}
{% if is_granted('CHILL_EVENT_PARTICIPATION_UPDATE', participation) %}
-
- {{ 'Edit the participation'|trans }}
-
+
+ {{ 'Edit the participation'|trans }}
+
{% endif %}
-
{% endif %}
-
+
|
{% endfor %}
@@ -108,31 +108,17 @@
{{ chill_pagination(paginator) }}
{% endif %}
- |