From 2e6c6a8f97c889f64f29a17c05926d0c1c965640 Mon Sep 17 00:00:00 2001 From: ewandor Date: Sat, 8 Jul 2023 02:47:23 +0200 Subject: [PATCH] Adding a page to list all non executed sentences --- .../UnsettledSentenceController.php | 112 ++++++++++++++++++ src/Entity/SentenceSettlement.php | 79 ++++++++++++ src/Form/SentenceSettlementType.php | 60 ++++++++++ src/Repository/CriminalRepository.php | 18 +++ .../Tools/DocumentRepositoriesExtension.php | 2 +- templates/base.html.twig | 5 +- templates/sentence/line.html.twig | 31 +++++ templates/sentence/list.html.twig | 63 ++++++++++ translations/messages+intl-icu.en.yaml | 8 +- translations/messages+intl-icu.fr.yaml | 6 + 10 files changed, 381 insertions(+), 3 deletions(-) create mode 100644 src/Controller/UnsettledSentenceController.php create mode 100644 src/Entity/SentenceSettlement.php create mode 100644 src/Form/SentenceSettlementType.php create mode 100644 templates/sentence/line.html.twig create mode 100644 templates/sentence/list.html.twig diff --git a/src/Controller/UnsettledSentenceController.php b/src/Controller/UnsettledSentenceController.php new file mode 100644 index 0000000..f7deaa3 --- /dev/null +++ b/src/Controller/UnsettledSentenceController.php @@ -0,0 +1,112 @@ +createForm(SearchBarType::class); + $searchForm->handleRequest($request); + + $pagination = $paginator->paginate( + $CriminalRepository->listForUser($this->getUser()) + ->search(( + $searchForm->isSubmitted() + && $searchForm->isValid() + && $searchForm->getData()['subject'] !== null + ) ? $searchForm->getData()['subject'] : null) + ->limitUnsettled($type) + ->order(['createdAt' => 'DESC']) + ->getResult(), + $request->query->getInt('page', 1) + ); + + foreach ($pagination as $i => $criminal) { + $sentence = new SentenceSettlement($criminal, $type); + $form = $this->createForm( + SentenceSettlementType::class, + $sentence, + [ + 'action'=> $this->generateUrl('unsettled_sentence_settle'), + ]); + $pagination[$i]->form = $form->createView(); + } + + return $this->render('sentence/list.html.twig', [ + 'controller_name' => 'AdminController', + 'type' => $type, + 'pagination' => $pagination, + 'count' => $pagination->getTotalItemCount(), + 'searchForm' => $searchForm->createView(), + ]); + } + + #[Route('/settle', name: 'settle')] + public function settle( + Request $request, + CriminalRepository $CriminalRepository + ) { + $type = null; + $sentenceForm = $this->createForm(SentenceSettlementType::class); + $sentenceForm->handleRequest($request); + + if ($sentenceForm->isSubmitted() && $sentenceForm->isValid()) { + $formData = $sentenceForm->getData(); + $type = $formData['type']; + $criminal = $CriminalRepository->find($formData['criminal_id']); + if (!$criminal) { + $sentenceForm->addError(new FormError('error_document_not_found')); + } else { + try { + $criminal->addSettlement($type, $formData['amount']); + } catch (\OutOfRangeException $e) { + $sentenceForm->addError(new FormError('error_value_out_of_bound')); + } + } + if ($sentenceForm->isValid()) { + $entityManager = $this->getDoctrine()->getManager(); + $entityManager->persist($criminal); + try { + $entityManager->flush(); + } catch (\Throwable $th) { + if ($_ENV['APP_ENV'] === 'dev') { + throw $th; //DEBUG + } else { + $this->logger->error($th); + } + + $this->addFlash('danger', 'alert_error_editing_document'); + return $this->redirectToRoute($request->getRequestUri()); + } + } else { + $this->addFlash('warning', 'alert_error_form_post'); + } + } + + return $this->redirectToRoute('unsettled_sentence_list', ['type' => $type]); + } +} diff --git a/src/Entity/SentenceSettlement.php b/src/Entity/SentenceSettlement.php new file mode 100644 index 0000000..d3c207c --- /dev/null +++ b/src/Entity/SentenceSettlement.php @@ -0,0 +1,79 @@ +criminal = $criminal; + $this->type = $type; + } + + /** + * @return Criminal + */ + public function getCriminal(): Criminal + { + return $this->criminal; + } + + /** + * @param Criminal $criminal + */ + public function setCriminal(Criminal $criminal): void + { + $this->criminal = $criminal; + } + + /** + * @return Criminal + */ + public function getCriminalId(): int + { + return $this->criminal->getId(); + } + + /** + * @return string + */ + public function getType(): string + { + return $this->type; + } + + /** + * @param string $type + */ + public function setType(string $type): void + { + $this->type = $type; + } + + /** + * @return null + */ + public function getAmount() + { + return $this->amount; + } + + /** + * @param null $amount + */ + public function setAmount($amount): void + { + $this->amount = $amount; + } +} \ No newline at end of file diff --git a/src/Form/SentenceSettlementType.php b/src/Form/SentenceSettlementType.php new file mode 100644 index 0000000..d686ff3 --- /dev/null +++ b/src/Form/SentenceSettlementType.php @@ -0,0 +1,60 @@ +TokenStorage = $TokenStorage; + } + + public function buildForm(FormBuilderInterface $builder, array $options) + { + $sentence = $builder->getData(); + + if ($sentence) { + if ($sentence->getType() == "fine") { + $amountType = NumberType::class; + $amountLabel = 'form_label_paid'; + } else { + $amountType = IntegerType::class; + $amountLabel = 'form_label_executed'; + } + } else { + $amountType = null; + $amountLabel = null; + } + + $builder->add('criminal_id', HiddenType::class) + ->add('type', HiddenType::class) + ->add('amount', $amountType, ['label' => $amountLabel]) + ->add('submit', SubmitType::class, [ + 'label' => 'form_button_submit', + 'priority' => -900, + ]) + ; + } + + public function getBlockPrefix() + { + return ''; // return an empty string here + } + + + +} diff --git a/src/Repository/CriminalRepository.php b/src/Repository/CriminalRepository.php index 4872ffd..37c06e7 100644 --- a/src/Repository/CriminalRepository.php +++ b/src/Repository/CriminalRepository.php @@ -19,4 +19,22 @@ class CriminalRepository extends DocumentRepositoriesExtension parent::__construct($registry, Criminal::class); $this->fields = ['amountMoney', 'amountTime', 'content']; //with title, list fields we can search in } + + public function limitUnsettled(string $type) { + if ($type == Criminal::TYPE_FINE) { + $column = 'd.amountMoney'; + } elseif ($type == Criminal::TYPE_JAIL) { + $column = 'd.amountTime'; + } elseif ($type == Criminal::TYPE_COMMUNITY_WORK) { + $column = 'd.amountCommunityWork'; + } else { + throw new \OutOfRangeException($type); + } + + $settledColumn = $column . 'Settled'; + + $this->qb->where("$column <> $settledColumn OR ($column IS NOT NULL AND $settledColumn IS NULL)"); + + return $this; + } } diff --git a/src/Repository/Tools/DocumentRepositoriesExtension.php b/src/Repository/Tools/DocumentRepositoriesExtension.php index 0721497..1a13a81 100644 --- a/src/Repository/Tools/DocumentRepositoriesExtension.php +++ b/src/Repository/Tools/DocumentRepositoriesExtension.php @@ -12,7 +12,7 @@ use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; class DocumentRepositoriesExtension extends ServiceEntityRepository { public array $fields = []; - private QueryBuilder $qb; + protected QueryBuilder $qb; private ?QueryBuilder $qbsearch = null; private ?Group $group = null; private ?User $user = null; diff --git a/templates/base.html.twig b/templates/base.html.twig index f706353..7556998 100644 --- a/templates/base.html.twig +++ b/templates/base.html.twig @@ -152,7 +152,10 @@
  • vaccines{% trans %}title_medicals{% endtrans %}
  • - +
  • + sports{% trans %}title_unsettled_sentence_list{% endtrans %} +
  • + {% if app.user.hasPermission('group_administrate') %}
  • diff --git a/templates/sentence/line.html.twig b/templates/sentence/line.html.twig new file mode 100644 index 0000000..2497cba --- /dev/null +++ b/templates/sentence/line.html.twig @@ -0,0 +1,31 @@ + + + {{ i.directory.firstname }} {{ i.directory.lastname }} {% if i.directory.dead %}, {% trans %}title_dead{% endtrans %}{% endif %} + + + {% trans %}title_missing{% endtrans %}: + {% if type == 'fine' %} + {{ i.amountMoney - i.amountMoneySettled }} {{'currency_symbol'|trans}} + {% elseif type == 'jail' %} + {{ i.amountTime - i.amountTimeSettled }} {{'title_hours'|trans}} + {% elseif type == 'community_work' %} + {{ i.amountCommunityWork - i.amountCommunityWorkSettled }} {{'title_hours'|trans}} + {% endif %} +
    + {{ form_start(i.form) }} + +
    + {{ form_label(i.form.amount) }} +
    + {{ form_widget(i.form.amount) }} + {{ form_widget(i.form.submit, { 'label': 'button_ok' }) }} +
    + {{ form_end(i.form) }} + + + {{i.createdAt |date('_datetime.format'|trans)}} + + + {% include '_cells/documentActions.html.twig' with {'document': i, 'noedit': true, 'nodelete': true, 'noarchive': true} %} + + \ No newline at end of file diff --git a/templates/sentence/list.html.twig b/templates/sentence/list.html.twig new file mode 100644 index 0000000..b81af89 --- /dev/null +++ b/templates/sentence/list.html.twig @@ -0,0 +1,63 @@ +{% extends 'base.html.twig' %} + +{% block title %}{{ "title_unsettled_sentence_list"|trans }}{% endblock %} + +{% block body %} +
    +
    {{form(searchForm)}}
    +
    + +
    +

    {{ 'title_count'|trans }}: {{ count }}

    + {% if pagination[0].directory is not defined %}{% set nodirectorylink = true %}{% endif %} + {% set slicelimit = (limit is defined)? limit : null %} + {% set counter = 0 %} + + {% if pagination|length > 0 %} +
    + + + + + + + {% if noaction is not defined %} + + {% endif %} + + + + {% for i in pagination |slice(0, slicelimit) %} + {% set counter = counter + 1 %} + {% include 'sentence/line.html.twig' with {'sentence': i, 'type': type } %} + {% endfor %} + +
    {% trans %}title_name{% endtrans %}{% trans %}title_missing{% endtrans %}{% trans %}title_date{% endtrans %}{% trans %}tooltip_view{% endtrans %}
    +
    + + {% if slicelimit is not null and pagination|length > slicelimit %} +
    +
    + {% if nodirectorylink is not defined %} + {% trans %}button_view_more{% endtrans %} + {% else %} + {% trans %}button_view_more{% endtrans %} + {% endif %} +
    +
    + {% endif %} + + {% else %} +

    {% trans %}no_data{% endtrans %}

    + {% endif %} +
    + +
    +
    + {{ knp_pagination_render(pagination) }} +
    +{% endblock %} diff --git a/translations/messages+intl-icu.en.yaml b/translations/messages+intl-icu.en.yaml index adb5f87..3f69dac 100644 --- a/translations/messages+intl-icu.en.yaml +++ b/translations/messages+intl-icu.en.yaml @@ -304,6 +304,7 @@ form_label_content: Content form_label_dead: Deceased form_label_download_image: Download picture form_label_email: Email Adress +form_label_executed: Executed form_label_firstname: Firstname form_label_folder_name: Folder name form_label_gang_info: Informations about Group member @@ -335,6 +336,7 @@ form_label_model: Template form_label_motd: M.O.T.D. form_label_name: Name form_label_numberplate: Numberplate +form_label_paid: Paid form_label_password: Password form_label_permissions: Permissions form_label_power: Power @@ -704,6 +706,7 @@ title_errorpage_error: Error title_faceImage: Face photo title_field: Fields title_filter: Filters +title_fines: Fines title_folder_add_directories: List of Directories for adding to a folder title_folder_add_directory: Adding a directory to the folder title_folder_add_documents: Adding a document to the folder @@ -736,6 +739,7 @@ title_group_view_documents: Group's documents title_group_view: View group title_group: group title_groups: groups +title_jail_time: Jail title_hasnopapers: without papers title_height: Height title_history: History @@ -775,6 +779,7 @@ title_medical_trusted: Trusted people title_medicals: Medical visits title_members: Members title_merge_directory: Merges directories +title_missing: Missing title_model: Template title_motd: M.O.T.D title_name: Name @@ -819,7 +824,8 @@ title_users_book: Book title_users_documents: User's documents title_users_list: List of users title_users_sanctions: User's sanctions -title_users: Users +title_users: Users +title_unsettled_sentence_list: Unsettled sentences title_value: Value title_verified: Verified title_versus: Versus diff --git a/translations/messages+intl-icu.fr.yaml b/translations/messages+intl-icu.fr.yaml index 2b89cef..74bf724 100644 --- a/translations/messages+intl-icu.fr.yaml +++ b/translations/messages+intl-icu.fr.yaml @@ -304,6 +304,7 @@ form_label_content: Contenu form_label_dead: Individu décédé form_label_download_image: Télécharger l'image form_label_email: Adresse Email +form_label_executed: Effectuées form_label_firstname: Prénom form_label_folder_name: Nom du dossier form_label_gang_info: Informations du membre dans le Groupe associé @@ -335,6 +336,7 @@ form_label_model: Modèle form_label_motd: M.O.T.D. form_label_name: Nom form_label_numberplate: Plaque d'immatriculation +form_label_paid: Payée form_label_password: Mot de passe form_label_permissions: Permissions form_label_power: Power @@ -703,6 +705,7 @@ title_errorpage_error: Ouups ! title_faceImage: Photo de Face title_field: Champs title_filter: Filtre +title_fines: Amendes title_folder_add_directories: Liste des fiches pour ajout au dossier title_folder_add_directory: Ajouter une fiche au dossier title_folder_add_documents: Ajouter un document au dossier @@ -735,6 +738,7 @@ title_group_view_documents: Voir les documents du groupe title_group_view: Voir un groupe title_group: Groupe title_groups: Groupes +title_jail_time: Prison title_hasnopapers: Sans papier title_height: Taille title_history: Historique @@ -776,6 +780,7 @@ title_members: Membres title_merge_directory: Fusionner les fiches title_model: Modèle title_motd: M.O.T.D +title_missing: Manquant title_name: Nom title_navigation: Menu title_noauthor: Pas d'utilisateur @@ -819,6 +824,7 @@ title_users_documents: Documents de l'utilisateur title_users_list: Liste des Utilisateurs title_users_sanctions: Sanctions de l'utilisateur title_users: Utilisateurs +title_unsettled_sentence_list: Sentences en cours title_value: Valeur title_verified: Vérifié title_versus: Contre