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 eab153b2e..056e4abff 100644
--- a/src/Bundle/ChillBudgetBundle/Entity/Charge.php
+++ b/src/Bundle/ChillBudgetBundle/Entity/Charge.php
@@ -39,6 +39,12 @@ class Charge extends AbstractElement implements HasCentersInterface
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)
@@ -66,6 +72,11 @@ class Charge extends AbstractElement implements HasCentersInterface
return $this->getHousehold()->getCurrentPersons()->map(static fn (Person $p) => $p->getCenter())->toArray();
}
+ public function getCharge(): ?ChargeKind
+ {
+ return $this->charge;
+ }
+
public function getHelp()
{
return $this->help;
@@ -91,6 +102,13 @@ class Charge extends AbstractElement implements HasCentersInterface
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 bed9f23c3..28b8645e0 100644
--- a/src/Bundle/ChillBudgetBundle/Entity/Resource.php
+++ b/src/Bundle/ChillBudgetBundle/Entity/Resource.php
@@ -31,6 +31,12 @@ class Resource extends AbstractElement implements HasCentersInterface
*/
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'));
@@ -55,6 +61,11 @@ class Resource extends AbstractElement implements HasCentersInterface
return $this->id;
}
+ public function getResource(): ?ResourceKind
+ {
+ return $this->resource;
+ }
+
public function isCharge(): bool
{
return false;
@@ -64,4 +75,11 @@ class Resource extends AbstractElement implements HasCentersInterface
{
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/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/ChillMainBundle/Controller/RegroupmentController.php b/src/Bundle/ChillMainBundle/Controller/RegroupmentController.php
new file mode 100644
index 000000000..c73b03027
--- /dev/null
+++ b/src/Bundle/ChillMainBundle/Controller/RegroupmentController.php
@@ -0,0 +1,26 @@
+addOrderBy('e.id', 'ASC');
+
+ return parent::orderQuery($action, $query, $request, $paginator);
+ }
+}
diff --git a/src/Bundle/ChillMainBundle/DependencyInjection/ChillMainExtension.php b/src/Bundle/ChillMainBundle/DependencyInjection/ChillMainExtension.php
index 9c2148a14..23a4bee89 100644
--- a/src/Bundle/ChillMainBundle/DependencyInjection/ChillMainExtension.php
+++ b/src/Bundle/ChillMainBundle/DependencyInjection/ChillMainExtension.php
@@ -18,6 +18,7 @@ use Chill\MainBundle\Controller\CountryController;
use Chill\MainBundle\Controller\LanguageController;
use Chill\MainBundle\Controller\LocationController;
use Chill\MainBundle\Controller\LocationTypeController;
+use Chill\MainBundle\Controller\RegroupmentController;
use Chill\MainBundle\Controller\UserController;
use Chill\MainBundle\Controller\UserJobApiController;
use Chill\MainBundle\Controller\UserJobController;
@@ -48,6 +49,7 @@ use Chill\MainBundle\Entity\Country;
use Chill\MainBundle\Entity\Language;
use Chill\MainBundle\Entity\Location;
use Chill\MainBundle\Entity\LocationType;
+use Chill\MainBundle\Entity\Regroupment;
use Chill\MainBundle\Entity\User;
use Chill\MainBundle\Entity\UserJob;
use Chill\MainBundle\Form\CivilityType;
@@ -55,6 +57,7 @@ use Chill\MainBundle\Form\CountryType;
use Chill\MainBundle\Form\LanguageType;
use Chill\MainBundle\Form\LocationFormType;
use Chill\MainBundle\Form\LocationTypeType;
+use Chill\MainBundle\Form\RegroupmentType;
use Chill\MainBundle\Form\UserJobType;
use Chill\MainBundle\Form\UserType;
use Exception;
@@ -499,6 +502,27 @@ class ChillMainExtension extends Extension implements
],
],
],
+ [
+ 'class' => Regroupment::class,
+ 'name' => 'regroupment',
+ 'base_path' => '/admin/regroupment',
+ 'form_class' => RegroupmentType::class,
+ 'controller' => RegroupmentController::class,
+ 'actions' => [
+ 'index' => [
+ 'role' => 'ROLE_ADMIN',
+ 'template' => '@ChillMain/Admin/Regroupment/index.html.twig',
+ ],
+ 'new' => [
+ 'role' => 'ROLE_ADMIN',
+ 'template' => '@ChillMain/Admin/Regroupment/new.html.twig',
+ ],
+ 'edit' => [
+ 'role' => 'ROLE_ADMIN',
+ 'template' => '@ChillMain/Admin/Regroupment/edit.html.twig',
+ ],
+ ],
+ ],
],
'apis' => [
[
diff --git a/src/Bundle/ChillMainBundle/Entity/Regroupment.php b/src/Bundle/ChillMainBundle/Entity/Regroupment.php
new file mode 100644
index 000000000..5faffd17c
--- /dev/null
+++ b/src/Bundle/ChillMainBundle/Entity/Regroupment.php
@@ -0,0 +1,95 @@
+centers = new ArrayCollection();
+ }
+
+ public function getCenters(): ?Collection
+ {
+ return $this->centers;
+ }
+
+ public function getId(): ?int
+ {
+ return $this->id;
+ }
+
+ public function getIsActive(): bool
+ {
+ return $this->isActive;
+ }
+
+ public function getName(): string
+ {
+ return $this->name;
+ }
+
+ public function setCenters(?Collection $centers): self
+ {
+ $this->centers = $centers;
+
+ return $this;
+ }
+
+ public function setIsActive(bool $isActive): self
+ {
+ $this->isActive = $isActive;
+
+ return $this;
+ }
+
+ public function setName(string $name): self
+ {
+ $this->name = $name;
+
+ return $this;
+ }
+}
diff --git a/src/Bundle/ChillMainBundle/Form/RegroupmentType.php b/src/Bundle/ChillMainBundle/Form/RegroupmentType.php
new file mode 100644
index 000000000..bc8e6684f
--- /dev/null
+++ b/src/Bundle/ChillMainBundle/Form/RegroupmentType.php
@@ -0,0 +1,47 @@
+add('name', TextType::class, [
+ 'label' => 'Nom',
+ ])
+ ->add('centers', EntityType::class, [
+ 'class' => Center::class,
+ 'multiple' => true,
+ 'attr' => ['class' => 'select2'],
+ ])
+ ->add('isActive', CheckboxType::class, [
+ 'label' => 'Actif ?',
+ 'required' => false,
+ ]);
+ }
+
+ public function configureOptions(OptionsResolver $resolver)
+ {
+ $resolver
+ ->setDefault('class', Regroupment::class);
+ }
+}
diff --git a/src/Bundle/ChillMainBundle/Resources/views/Admin/Regroupment/edit.html.twig b/src/Bundle/ChillMainBundle/Resources/views/Admin/Regroupment/edit.html.twig
new file mode 100644
index 000000000..4d55c480c
--- /dev/null
+++ b/src/Bundle/ChillMainBundle/Resources/views/Admin/Regroupment/edit.html.twig
@@ -0,0 +1,11 @@
+{% 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_save_and_show %}{% endblock %}
+ {% endembed %}
+{% endblock admin_content %}
diff --git a/src/Bundle/ChillMainBundle/Resources/views/Admin/Regroupment/index.html.twig b/src/Bundle/ChillMainBundle/Resources/views/Admin/Regroupment/index.html.twig
new file mode 100644
index 000000000..06e646083
--- /dev/null
+++ b/src/Bundle/ChillMainBundle/Resources/views/Admin/Regroupment/index.html.twig
@@ -0,0 +1,39 @@
+{% extends '@ChillMain/CRUD/Admin/index.html.twig' %}
+
+{% block admin_content %}
+ {% embed '@ChillMain/CRUD/_index.html.twig' %}
+ {% block table_entities_thead_tr %}
+
{{ 'Label'|trans }} |
+
{{ 'Active'|trans }} |
+
|
+ {% endblock %}
+
+ {% block table_entities_tbody %}
+ {% for entity in entities %}
+
+ {{ entity.name }} |
+
+ {% if entity.isActive %}
+
+ {% else %}
+
+ {% endif %}
+ |
+
+
+ |
+
+ {% endfor %}
+ {% endblock %}
+
+ {% block actions_before %}
+
+ {{'Back to the admin'|trans}}
+
+ {% endblock %}
+ {% endembed %}
+{% endblock %}
diff --git a/src/Bundle/ChillMainBundle/Resources/views/Admin/Regroupment/new.html.twig b/src/Bundle/ChillMainBundle/Resources/views/Admin/Regroupment/new.html.twig
new file mode 100644
index 000000000..7c204dddd
--- /dev/null
+++ b/src/Bundle/ChillMainBundle/Resources/views/Admin/Regroupment/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 admin_content %}
diff --git a/src/Bundle/ChillMainBundle/Routing/MenuBuilder/AdminUserMenuBuilder.php b/src/Bundle/ChillMainBundle/Routing/MenuBuilder/AdminUserMenuBuilder.php
index 5cb4e087b..96fdcb60d 100644
--- a/src/Bundle/ChillMainBundle/Routing/MenuBuilder/AdminUserMenuBuilder.php
+++ b/src/Bundle/ChillMainBundle/Routing/MenuBuilder/AdminUserMenuBuilder.php
@@ -53,6 +53,10 @@ class AdminUserMenuBuilder implements LocalMenuBuilderInterface
'route' => 'admin_center',
])->setExtras(['order' => 1010]);
+ $menu->addChild('Regroupements des centres', [
+ 'route' => 'chill_crud_regroupment_index',
+ ])->setExtras(['order' => 1015]);
+
$menu->addChild('List circles', [
'route' => 'admin_scope',
])->setExtras(['order' => 1020]);
diff --git a/src/Bundle/ChillMainBundle/config/services/controller.yaml b/src/Bundle/ChillMainBundle/config/services/controller.yaml
index 28abc94e8..16c545a81 100644
--- a/src/Bundle/ChillMainBundle/config/services/controller.yaml
+++ b/src/Bundle/ChillMainBundle/config/services/controller.yaml
@@ -33,3 +33,7 @@ services:
arguments:
$security: '@Symfony\Component\Security\Core\Security'
tags: ['controller.service_arguments']
+
+ Chill\MainBundle\Controller\RegroupmentController:
+ autowire: true
+ autoconfigure: true
diff --git a/src/Bundle/ChillMainBundle/config/services/form.yaml b/src/Bundle/ChillMainBundle/config/services/form.yaml
index 58f01883f..8157c27e9 100644
--- a/src/Bundle/ChillMainBundle/config/services/form.yaml
+++ b/src/Bundle/ChillMainBundle/config/services/form.yaml
@@ -138,6 +138,10 @@ services:
autowire: true
autoconfigure: true
+ Chill\MainBundle\Form\RegroupmentType:
+ autowire: true
+ autoconfigure: true
+
Chill\MainBundle\Form\DataTransformer\IdToLocationDataTransformer: ~
Chill\MainBundle\Form\DataTransformer\IdToUserDataTransformer: ~
Chill\MainBundle\Form\DataTransformer\IdToUsersDataTransformer: ~
diff --git a/src/Bundle/ChillMainBundle/migrations/Version20230111104315.php b/src/Bundle/ChillMainBundle/migrations/Version20230111104315.php
new file mode 100644
index 000000000..aa6e0f4c5
--- /dev/null
+++ b/src/Bundle/ChillMainBundle/migrations/Version20230111104315.php
@@ -0,0 +1,43 @@
+addSql('DROP SEQUENCE regroupment_id_seq CASCADE');
+ $this->addSql('ALTER TABLE regroupment_center DROP CONSTRAINT FK_2BCCE2F9EC6D1029');
+ $this->addSql('ALTER TABLE regroupment_center DROP CONSTRAINT FK_2BCCE2F95932F377');
+ $this->addSql('DROP TABLE regroupment');
+ $this->addSql('DROP TABLE regroupment_center');
+ }
+
+ public function getDescription(): string
+ {
+ return 'Add regroupment admin entity';
+ }
+
+ public function up(Schema $schema): void
+ {
+ $this->addSql('CREATE SEQUENCE regroupment_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+ $this->addSql('CREATE TABLE regroupment (id INT NOT NULL, name VARCHAR(15) DEFAULT \'\' NOT NULL, isActive BOOLEAN NOT NULL, PRIMARY KEY(id))');
+ $this->addSql('CREATE TABLE regroupment_center (regroupment_id INT NOT NULL, center_id INT NOT NULL, PRIMARY KEY(regroupment_id, center_id))');
+ $this->addSql('CREATE INDEX IDX_2BCCE2F9EC6D1029 ON regroupment_center (regroupment_id)');
+ $this->addSql('CREATE INDEX IDX_2BCCE2F95932F377 ON regroupment_center (center_id)');
+ $this->addSql('ALTER TABLE regroupment_center ADD CONSTRAINT FK_2BCCE2F9EC6D1029 FOREIGN KEY (regroupment_id) REFERENCES regroupment (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+ $this->addSql('ALTER TABLE regroupment_center ADD CONSTRAINT FK_2BCCE2F95932F377 FOREIGN KEY (center_id) REFERENCES centers (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+ }
+}
diff --git a/src/Bundle/ChillMainBundle/translations/messages.fr.yml b/src/Bundle/ChillMainBundle/translations/messages.fr.yml
index b416480a9..f779cf87f 100644
--- a/src/Bundle/ChillMainBundle/translations/messages.fr.yml
+++ b/src/Bundle/ChillMainBundle/translations/messages.fr.yml
@@ -409,6 +409,12 @@ crud:
add_new: Ajouter une civilité
title_new: Nouvelle civilité
title_edit: Modifier une civilité
+ regroupment:
+ index:
+ title: Liste des regroupements
+ add_new: Ajouter un regroupement
+ title_new: Nouveau regroupement
+ title_edit: Modifier un regroupement
No entities: Aucun élément
diff --git a/src/Bundle/ChillWopiBundle/src/Service/Wopi/ChillDocumentLockManager.php b/src/Bundle/ChillWopiBundle/src/Service/Wopi/ChillDocumentLockManager.php
index fce25de58..185256238 100644
--- a/src/Bundle/ChillWopiBundle/src/Service/Wopi/ChillDocumentLockManager.php
+++ b/src/Bundle/ChillWopiBundle/src/Service/Wopi/ChillDocumentLockManager.php
@@ -22,7 +22,7 @@ class ChillDocumentLockManager implements DocumentLockManagerInterface
private const LOCK_DURATION = 60 * 30;
/**
- * Number of seconds to keep the lock after the delete lock operation.
+ * Number of seconds to keep the lock after the delete lock operation
*/
private const LOCK_GRACEFUL_DURATION_TIME = 3;