mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-06-07 18:44:08 +00:00
add basic fields csperson to list person export
This commit is contained in:
parent
4ed9d3d8e2
commit
97846a5877
@ -0,0 +1,183 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Chill is a software for social workers
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view
|
||||||
|
* the LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Chill\JobBundle\Export;
|
||||||
|
|
||||||
|
use Chill\JobBundle\Entity\CSPerson;
|
||||||
|
use Chill\PersonBundle\Export\Helper\CustomizeListPersonHelperInterface;
|
||||||
|
use Doctrine\ORM\Query;
|
||||||
|
use Doctrine\ORM\QueryBuilder;
|
||||||
|
use Symfony\Contracts\Translation\TranslatorInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class ListCSPerson.
|
||||||
|
*
|
||||||
|
* @author Mathieu Jaumotte mathieu.jaumotte@champs-libres.coop
|
||||||
|
*/
|
||||||
|
class AddCSPersonToPersonListHelper implements CustomizeListPersonHelperInterface
|
||||||
|
{
|
||||||
|
public function __construct(private readonly TranslatorInterface $translator)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
private const CSPERSON_FIELDS = [
|
||||||
|
/* CSPerson::RESSOURCES,
|
||||||
|
CSPerson::MOBILITE_MOYEN_TRANSPORT,
|
||||||
|
CSPerson::TYPE_CONTRAT,
|
||||||
|
CSPerson::PERMIS_CONDUIRE,
|
||||||
|
CSPerson::ACCOMPAGNEMENTS,
|
||||||
|
CSPerson::SITUATION_PROFESSIONNELLE,
|
||||||
|
CSPerson::NEET_ELIGIBILITY,*/
|
||||||
|
'findernieremploidate',
|
||||||
|
/* 'prescripteur__name',
|
||||||
|
'prescripteur__email',
|
||||||
|
'prescripteur__phone',*/
|
||||||
|
'poleemploiid',
|
||||||
|
'cafid',
|
||||||
|
'cafinscriptiondate',
|
||||||
|
'contratiejdate',
|
||||||
|
'cerinscriptiondate',
|
||||||
|
'ppaeinscriptiondate',
|
||||||
|
'ppaesignataire',
|
||||||
|
'cersignataire',
|
||||||
|
'neetcommissiondate',
|
||||||
|
'fsemademarchecode',
|
||||||
|
];
|
||||||
|
|
||||||
|
public function alterKeys(array $existing): array
|
||||||
|
{
|
||||||
|
return [...$existing, ...self::CSPERSON_FIELDS];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function alterSelect(QueryBuilder $qb, \DateTimeImmutable $computedDate): void
|
||||||
|
{
|
||||||
|
$qb
|
||||||
|
->leftJoin(CSPerson::class, 'cs_person', Query\Expr\Join::WITH, 'cs_person.person = person');
|
||||||
|
|
||||||
|
foreach (self::CSPERSON_FIELDS as $f) {
|
||||||
|
switch ($f) {
|
||||||
|
case 'findernieremploidate':
|
||||||
|
$qb->addSelect('cs_person.dateFinDernierEmploi AS findernieremploidate');
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'poleemploiid':
|
||||||
|
$qb->addSelect('cs_person.poleEmploiId AS poleemploiid');
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'cafid':
|
||||||
|
$qb->addSelect('cs_person.cafId AS cafid');
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'cafinscriptiondate':
|
||||||
|
$qb->addSelect('cs_person.cafInscriptionDate AS cafinscriptiondate');
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'contratiejdate':
|
||||||
|
$qb->addSelect('cs_person.dateContratIEJ AS contratiejdate');
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'cerinscriptiondate':
|
||||||
|
$qb->addSelect('cs_person.cERInscriptionDate AS cerinscriptiondate');
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'ppaeinscriptiondate':
|
||||||
|
$qb->addSelect('cs_person.pPAEInscriptionDate AS ppaeinscriptiondate');
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'ppaesignataire':
|
||||||
|
$qb->addSelect('cs_person.pPAESignataire AS ppaesignataire');
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'cersignataire':
|
||||||
|
$qb->addSelect('cs_person.cERSignataire AS cersignataire');
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'neetcommissiondate':
|
||||||
|
$qb->addSelect('cs_person.nEETCommissionDate AS neetcommissiondate');
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'fsemademarchecode':
|
||||||
|
$qb->addSelect('cs_person.fSEMaDemarcheCode AS fsemademarchecode');
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
$qb->addSelect(sprintf('person.%s as %s', $f, $f));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getLabels(string $key, array $values, array $data): ?callable
|
||||||
|
{
|
||||||
|
// dump('im here');
|
||||||
|
switch ($key) {
|
||||||
|
case 'cerinscriptiondate':
|
||||||
|
case 'ppaeinscriptiondate':
|
||||||
|
case 'neetcommissiondate':
|
||||||
|
case 'findernieremploidate':
|
||||||
|
case 'cafinscriptiondate':
|
||||||
|
case 'contratiejdate':
|
||||||
|
return function ($value) use ($key) {
|
||||||
|
if ('_header' === $value) {
|
||||||
|
return $this->translator->trans($key);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (null === $value) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
// warning: won't work with DateTimeImmutable as we reset time a few lines later
|
||||||
|
$date = \DateTime::createFromFormat('Y-m-d', $value);
|
||||||
|
$hasTime = false;
|
||||||
|
|
||||||
|
if (false === $date) {
|
||||||
|
$date = \DateTime::createFromFormat('Y-m-d H:i:s', $value);
|
||||||
|
$hasTime = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check that the creation could occur.
|
||||||
|
if (false === $date) {
|
||||||
|
throw new \Exception(sprintf('The value %s could not be converted to %s', $value, \DateTime::class));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$hasTime) {
|
||||||
|
$date->setTime(0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $date;
|
||||||
|
};
|
||||||
|
|
||||||
|
default:
|
||||||
|
/* if (!\in_array($key, $this->getAllKeys(), true)) {
|
||||||
|
throw new \RuntimeException("this key is not supported by this helper: {$key}");
|
||||||
|
}*/
|
||||||
|
|
||||||
|
// for fields which are associated with person
|
||||||
|
return function ($value) use ($key) {
|
||||||
|
if ('_header' === $value) {
|
||||||
|
return $this->translator->trans($key);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $value;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,628 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Chill is a software for social workers
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view
|
|
||||||
* the LICENSE file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Chill\JobBundle\Export;
|
|
||||||
|
|
||||||
use Chill\MainBundle\Export\ExportElementValidatedInterface;
|
|
||||||
use Chill\MainBundle\Export\ListInterface;
|
|
||||||
use Chill\PersonBundle\Export\Export\ListPerson;
|
|
||||||
use Chill\JobBundle\Entity\CSPerson;
|
|
||||||
use Chill\PersonBundle\Export\Helper\ListPersonHelper;
|
|
||||||
use Doctrine\ORM\EntityManagerInterface;
|
|
||||||
use Doctrine\ORM\Query;
|
|
||||||
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
|
|
||||||
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
|
|
||||||
use Symfony\Component\Form\FormBuilderInterface;
|
|
||||||
use Chill\MainBundle\Templating\TranslatableStringHelper;
|
|
||||||
use Chill\CustomFieldsBundle\Service\CustomFieldProvider;
|
|
||||||
use Symfony\Component\Validator\Constraints\Callback;
|
|
||||||
use Symfony\Component\Validator\Context\ExecutionContextInterface;
|
|
||||||
use Symfony\Contracts\Translation\TranslatorInterface;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class ListCSPerson.
|
|
||||||
*
|
|
||||||
* @author Mathieu Jaumotte mathieu.jaumotte@champs-libres.coop
|
|
||||||
*/
|
|
||||||
class ListCSPerson extends ListPerson implements ListInterface, ExportElementValidatedInterface
|
|
||||||
{
|
|
||||||
public const CSPERSON = [
|
|
||||||
'ressource__label' => CSPerson::RESSOURCES,
|
|
||||||
'moyen_transport__label' => CSPerson::MOBILITE_MOYEN_TRANSPORT,
|
|
||||||
'type_contrat__label' => CSPerson::TYPE_CONTRAT,
|
|
||||||
'permis_conduire__label' => CSPerson::PERMIS_CONDUIRE,
|
|
||||||
'accompagnement__label' => CSPerson::ACCOMPAGNEMENTS,
|
|
||||||
'situation_professionnelle__label' => CSPerson::SITUATION_PROFESSIONNELLE,
|
|
||||||
'neet_eligibility__label' => CSPerson::NEET_ELIGIBILITY,
|
|
||||||
];
|
|
||||||
|
|
||||||
protected array $personIds = [];
|
|
||||||
protected EntityManagerInterface $em;
|
|
||||||
protected TranslatableStringHelper $translatableStringHelper;
|
|
||||||
protected CustomFieldProvider $customFieldProvider;
|
|
||||||
|
|
||||||
public function __construct(
|
|
||||||
protected TranslatorInterface $translator,
|
|
||||||
EntityManagerInterface $em,
|
|
||||||
ListPersonHelper $listPersonHelper,
|
|
||||||
TranslatableStringHelper $translatableStringHelper,
|
|
||||||
CustomFieldProvider $customFieldProvider,
|
|
||||||
ParameterBagInterface $parameterBag
|
|
||||||
) {
|
|
||||||
parent::__construct($customFieldProvider, $listPersonHelper, $em, $translatableStringHelper, $parameterBag);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Rebuild fields array, combining parent ListPerson and ListCSPerson,
|
|
||||||
* adding query type as value.
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
protected function allFields()
|
|
||||||
{
|
|
||||||
$fields = [
|
|
||||||
'id' => 'integer',
|
|
||||||
'firstName' => 'string',
|
|
||||||
'lastName' => 'string',
|
|
||||||
'gender' => 'string',
|
|
||||||
'birthdate' => 'date',
|
|
||||||
'placeOfBirth' => 'string',
|
|
||||||
'countryOfBirth' => 'json',
|
|
||||||
'nationality' => 'json',
|
|
||||||
'email' => 'string',
|
|
||||||
'phonenumber' => 'string',
|
|
||||||
'mobilenumber' => 'string',
|
|
||||||
'contactInfo' => 'string',
|
|
||||||
'memo' => 'string',
|
|
||||||
'address_valid_from' => 'date',
|
|
||||||
'address_street_address_1' => 'string',
|
|
||||||
'address_street_address_2' => 'string',
|
|
||||||
'address_postcode_code' => 'string',
|
|
||||||
'address_postcode_label' => 'string',
|
|
||||||
'address_country_name' => 'string',
|
|
||||||
'address_country_code' => 'string',
|
|
||||||
'address_isnoaddress' => 'boolean',
|
|
||||||
];
|
|
||||||
|
|
||||||
$CSfields = [
|
|
||||||
'recentopeningdate' => 'date',
|
|
||||||
'recentclosingdate' => 'date',
|
|
||||||
'closingmotive' => 'json',
|
|
||||||
'situation_familiale' => 'json',
|
|
||||||
'enfantacharge' => 'integer',
|
|
||||||
'accompagnement__label' => 'json',
|
|
||||||
'findernieremploidate' => 'date',
|
|
||||||
'prescripteur__name' => 'string',
|
|
||||||
'prescripteur__email' => 'string',
|
|
||||||
'prescripteur__phone' => 'string',
|
|
||||||
'poleemploiid' => 'string',
|
|
||||||
'cafid' => 'string',
|
|
||||||
'cafinscriptiondate' => 'date',
|
|
||||||
'contratiejdate' => 'date',
|
|
||||||
'cerinscriptiondate' => 'date',
|
|
||||||
'ppaeinscriptiondate' => 'date',
|
|
||||||
'ppaesignataire' => 'string',
|
|
||||||
'cersignataire' => 'string',
|
|
||||||
'neet_eligibility__label' => 'string',
|
|
||||||
'neetcommissiondate' => 'date',
|
|
||||||
'fsemademarchecode' => 'string',
|
|
||||||
'permis_conduire__label' => 'json',
|
|
||||||
'situation_professionnelle__label' => 'string',
|
|
||||||
'datefindernieremploi' => 'date',
|
|
||||||
'type_contrat__label' => 'json',
|
|
||||||
'ressource__label' => 'json',
|
|
||||||
'moyen_transport__label' => 'json',
|
|
||||||
];
|
|
||||||
|
|
||||||
return array_merge($fields, $CSfields);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return array FIELDS keys only.
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
private function getFields()
|
|
||||||
{
|
|
||||||
return array_keys($this->allFields());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* give the list of keys the current export added to the queryBuilder in
|
|
||||||
* self::initiateQuery.
|
|
||||||
*
|
|
||||||
* Example: if your query builder will contains `SELECT count(id) AS count_id ...`,
|
|
||||||
* this function will return `array('count_id')`.
|
|
||||||
*
|
|
||||||
* @param mixed[] $data the data from the export's form (added by self::buildForm)
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function getQueryKeys($data)
|
|
||||||
{
|
|
||||||
$csperson = self::CSPERSON;
|
|
||||||
|
|
||||||
$fields = [];
|
|
||||||
foreach ($data['fields'] as $key) {
|
|
||||||
switch ($key) {
|
|
||||||
case 'ressource__label':
|
|
||||||
case 'moyen_transport__label':
|
|
||||||
foreach ($csperson[$key] as $item) {
|
|
||||||
$this->translationCompatKey($item, $key);
|
|
||||||
$fields[] = $item;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'prescripteur__name':
|
|
||||||
case 'prescripteur__email':
|
|
||||||
case 'prescripteur__phone':
|
|
||||||
$key = str_replace('__', '.', (string) $key);
|
|
||||||
|
|
||||||
// no break
|
|
||||||
case 'situation_professionnelle__label':
|
|
||||||
case 'neet_eligibility__label':
|
|
||||||
case 'accompagnement__label':
|
|
||||||
case 'permis_conduire__label':
|
|
||||||
case 'type_contrat__label':
|
|
||||||
default:
|
|
||||||
$fields[] = $key;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $fields;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Some fields values are arrays that have to be splitted in columns.
|
|
||||||
* This function split theses fields.
|
|
||||||
*
|
|
||||||
* @param array $rows
|
|
||||||
*
|
|
||||||
* @return array|\Closure
|
|
||||||
*/
|
|
||||||
private function splitArrayToColumns($rows)
|
|
||||||
{
|
|
||||||
$csperson = self::CSPERSON;
|
|
||||||
|
|
||||||
$results = [];
|
|
||||||
foreach ($rows as $row) {
|
|
||||||
$res = [];
|
|
||||||
foreach ($row as $key => $value) {
|
|
||||||
switch ($key) {
|
|
||||||
case 'ressource__label':
|
|
||||||
case 'moyen_transport__label':
|
|
||||||
foreach ($csperson[$key] as $item) {
|
|
||||||
$this->translationCompatKey($item, $key);
|
|
||||||
if ((null === $value) || (0 === count($value))) {
|
|
||||||
$res[$item] = '';
|
|
||||||
} else {
|
|
||||||
foreach ($value as $v) {
|
|
||||||
$this->translationCompatKey($v, $key);
|
|
||||||
|
|
||||||
if ($item === $v) {
|
|
||||||
$res[$item] = 'x';
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
$res[$item] = '';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'situation_professionnelle__label':
|
|
||||||
$f = false;
|
|
||||||
if ('en_activite' === $value) {
|
|
||||||
$f = true;
|
|
||||||
}
|
|
||||||
$res[$key] = $value;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'type_contrat__label':
|
|
||||||
if ('' !== $value) {
|
|
||||||
$res[$key] = ($f) ? $value : null;
|
|
||||||
} else {
|
|
||||||
$res[$key] = null;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'prescripteur__name':
|
|
||||||
case 'prescripteur__email':
|
|
||||||
case 'prescripteur__phone':
|
|
||||||
$key = str_replace('__', '.', (string) $key);
|
|
||||||
|
|
||||||
// no break
|
|
||||||
case 'neet_eligibility__label':
|
|
||||||
case 'accompagnement__label':
|
|
||||||
case 'permis_conduire__label':
|
|
||||||
default:
|
|
||||||
$res[$key] = $value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$results[] = $res;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $results;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Make item compatible with YAML messages ids
|
|
||||||
* for fields that are splitted in columns (with field key to replace).
|
|
||||||
*
|
|
||||||
* AVANT
|
|
||||||
* key: projet_prof__volume_horaire__label
|
|
||||||
* item: temps_plein
|
|
||||||
* APRES
|
|
||||||
* item: projet_prof.volume_horaire.temps_plein
|
|
||||||
*
|
|
||||||
* @param string $item (&) passed by reference
|
|
||||||
* @param string $key
|
|
||||||
*/
|
|
||||||
private function translationCompatKey(&$item, $key)
|
|
||||||
{
|
|
||||||
$key = str_replace('label', $item, $key);
|
|
||||||
$key = str_replace('__', '.', $key);
|
|
||||||
$item = $key;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function buildForm(FormBuilderInterface $builder)
|
|
||||||
{
|
|
||||||
parent::buildForm($builder); // ajouter un '?' dans la query
|
|
||||||
|
|
||||||
$choices = array_combine($this->getFields(), $this->getFields());
|
|
||||||
|
|
||||||
$builder->add('fields', ChoiceType::class, [
|
|
||||||
'multiple' => true,
|
|
||||||
'expanded' => true,
|
|
||||||
'choices' => $choices,
|
|
||||||
'data' => $choices,
|
|
||||||
// les checkbox cochés !!
|
|
||||||
// 'choices_as_values' => true,
|
|
||||||
'label' => 'Fields to include in export',
|
|
||||||
'choice_label' => fn ($key) => str_replace('__', '.', (string) $key),
|
|
||||||
'choice_attr' => function ($val) {
|
|
||||||
if (str_starts_with($val, 'address_')) {
|
|
||||||
return ['data-display-target' => 'address_date'];
|
|
||||||
}
|
|
||||||
|
|
||||||
return [];
|
|
||||||
},
|
|
||||||
'constraints' => [new Callback(['callback' => function ($selected, ExecutionContextInterface $context) {
|
|
||||||
if (0 === count($selected)) {
|
|
||||||
$context->buildViolation('You must select at least one element')
|
|
||||||
->atPath('fields')
|
|
||||||
->addViolation();
|
|
||||||
}
|
|
||||||
}])],
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return \Doctrine\ORM\NativeQuery|\Doctrine\ORM\QueryBuilder
|
|
||||||
*
|
|
||||||
* @throws \Doctrine\DBAL\Exception\InvalidArgumentException
|
|
||||||
*/
|
|
||||||
public function initiateQuery(array $requiredModifiers, array $acl, array $data = [])
|
|
||||||
{
|
|
||||||
$centers = array_map(fn ($el) => $el['center'], $acl);
|
|
||||||
|
|
||||||
// throw an error if any fields are present
|
|
||||||
if (!\array_key_exists('fields', $data)) {
|
|
||||||
throw new \Doctrine\DBAL\Exception\InvalidArgumentException('any fields have been checked');
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->entityManager->createQueryBuilder()
|
|
||||||
->from('ChillPersonBundle:Person', 'person')
|
|
||||||
->join('person.center', 'center')
|
|
||||||
->andWhere('center IN (:authorized_centers)')
|
|
||||||
->setParameter('authorized_centers', $centers)
|
|
||||||
;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param \Doctrine\ORM\NativeQuery|\Doctrine\ORM\QueryBuilder $qb
|
|
||||||
* @param mixed[] $data
|
|
||||||
*/
|
|
||||||
public function getResult($qb, $data)
|
|
||||||
{
|
|
||||||
$qb->select('person.id');
|
|
||||||
|
|
||||||
$ids = $qb->getQuery()->getResult(Query::HYDRATE_SCALAR);
|
|
||||||
$this->personIds = array_map(fn ($e) => $e['id'], $ids);
|
|
||||||
|
|
||||||
$personIdsParameters = '?'.\str_repeat(', ?', count($this->personIds) - 1);
|
|
||||||
$query = \str_replace('%person_ids%', $personIdsParameters, self::QUERY);
|
|
||||||
|
|
||||||
$rsm = new Query\ResultSetMapping();
|
|
||||||
|
|
||||||
foreach ($this->allFields() as $name => $type) {
|
|
||||||
if (null !== $data['fields'][$name]) {
|
|
||||||
$rsm->addScalarResult(strtolower($name), $name, $type);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$nq = $this->entityManager->createNativeQuery($query, $rsm);
|
|
||||||
|
|
||||||
$idx = 0;
|
|
||||||
for ($i = 1; $i <= 8; ++$i) {
|
|
||||||
++$idx;
|
|
||||||
$nq->setParameter($idx, $data['address_date'], 'date');
|
|
||||||
}
|
|
||||||
for ($i = 1; $i <= count($this->personIds); ++$i) {
|
|
||||||
++$idx;
|
|
||||||
$nq->setParameter($idx, $this->personIds[$i - 1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->splitArrayToColumns(
|
|
||||||
$nq->getResult()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $key The column key, as added in the query
|
|
||||||
* @param mixed[] $values The values from the result. if there are duplicates, those might be given twice. Example: array('FR', 'BE', 'CZ', 'FR', 'BE', 'FR')
|
|
||||||
* @param mixed $data The data from the export's form (as defined in `buildForm`
|
|
||||||
*/
|
|
||||||
public function getLabels($key, array $values, $data)
|
|
||||||
{
|
|
||||||
$csperson = self::CSPERSON;
|
|
||||||
|
|
||||||
return match ($key) {
|
|
||||||
'countryOfBirth', 'situation_familiale', 'closingmotive', 'nationality' => function ($value) use ($key) {
|
|
||||||
if ('_header' === $value) {
|
|
||||||
return $key;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $value['fr'];
|
|
||||||
},
|
|
||||||
'accompagnement__label', 'permis_conduire__label', 'type_contrat__label' => function ($value) use ($key) {
|
|
||||||
if ('_header' === $value) {
|
|
||||||
return $this->translator->trans(
|
|
||||||
str_replace('__', '.', $key)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if ('' === $value) {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
$arr = [];
|
|
||||||
foreach ($value as $v) {
|
|
||||||
$this->translationCompatKey($v, $key);
|
|
||||||
$arr[] = $this->translator->trans($v);
|
|
||||||
}
|
|
||||||
|
|
||||||
return implode(', ', $arr);
|
|
||||||
},
|
|
||||||
'situation_professionnelle__label', 'neet_eligibility__label' => function ($value) use ($key) {
|
|
||||||
if ('_header' === $value) {
|
|
||||||
return $this->translator->trans(
|
|
||||||
str_replace('__', '.', $key)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if ('' === $value) {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
$this->translationCompatKey($value, $key);
|
|
||||||
|
|
||||||
return $this->translator->trans($value);
|
|
||||||
},
|
|
||||||
'birthdate', 'address_valid_from', 'recentopeningdate', 'recentclosingdate', 'findernieremploidate', 'cafinscriptiondate', 'contratiejdate', 'cerinscriptiondate', 'ppaeinscriptiondate', 'neetcommissiondate', 'datefindernieremploi' => function ($value) use ($key) {
|
|
||||||
if ('_header' === $value) {
|
|
||||||
return $key;
|
|
||||||
}
|
|
||||||
if ('' === $value) {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
return $value->format('d-m-Y');
|
|
||||||
},
|
|
||||||
'gender' => function ($value) {
|
|
||||||
if ('_header' === $value) {
|
|
||||||
return 'gender';
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->translator->trans($value);
|
|
||||||
},
|
|
||||||
'address_country_name' => function ($value) use ($key) {
|
|
||||||
if ('_header' === $value) {
|
|
||||||
return \strtolower($key);
|
|
||||||
}
|
|
||||||
if (null === $value) {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->translatableStringHelper->localize(json_decode($value, true));
|
|
||||||
},
|
|
||||||
'address_isnoaddress' => parent::getLabels($key, $values, $data),
|
|
||||||
default => function ($value) use ($key) {
|
|
||||||
if ('_header' === $value) {
|
|
||||||
return $key;
|
|
||||||
}
|
|
||||||
if ('' === $value) {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
return $value;
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Native Query SQL.
|
|
||||||
*/
|
|
||||||
public const QUERY = <<<'SQL'
|
|
||||||
|
|
||||||
WITH accompagning AS (
|
|
||||||
|
|
||||||
SELECT *
|
|
||||||
FROM (
|
|
||||||
|
|
||||||
SELECT
|
|
||||||
p.id,
|
|
||||||
ac.openingdate,
|
|
||||||
|
|
||||||
rank() OVER (
|
|
||||||
PARTITION BY p.id
|
|
||||||
ORDER BY ac.openingdate DESC
|
|
||||||
) openingrank,
|
|
||||||
|
|
||||||
ac.closingdate,
|
|
||||||
|
|
||||||
rank() OVER (
|
|
||||||
PARTITION BY p.id
|
|
||||||
ORDER BY ac.closingdate DESC
|
|
||||||
) closingrank,
|
|
||||||
|
|
||||||
( CASE
|
|
||||||
WHEN ac.closingdate IS NULL
|
|
||||||
THEN NULL
|
|
||||||
ELSE cm.name
|
|
||||||
END ) as closingmotive
|
|
||||||
|
|
||||||
FROM public.chill_person_person AS p
|
|
||||||
|
|
||||||
LEFT OUTER JOIN public.chill_person_accompanying_period AS ac
|
|
||||||
ON p.id = ac.person_id
|
|
||||||
|
|
||||||
LEFT OUTER JOIN public.chill_person_closingmotive AS cm
|
|
||||||
ON ac.closingmotive_id = cm.id
|
|
||||||
|
|
||||||
) AS sq
|
|
||||||
|
|
||||||
WHERE sq.openingrank = 1
|
|
||||||
OR sq.closingrank = 1
|
|
||||||
)
|
|
||||||
SELECT
|
|
||||||
-- identifiant
|
|
||||||
p.id as id,
|
|
||||||
-- **
|
|
||||||
p.firstname as firstName,
|
|
||||||
-- **
|
|
||||||
p.lastname as lastName,
|
|
||||||
-- genre
|
|
||||||
p.gender as gender,
|
|
||||||
-- date de naissance
|
|
||||||
p.birthdate as birthdate,
|
|
||||||
-- **
|
|
||||||
p.place_of_birth as placeOfBirth,
|
|
||||||
-- **
|
|
||||||
cnb.name as countryOfBirth,
|
|
||||||
-- nationalité
|
|
||||||
cnn.name as nationality,
|
|
||||||
-- Courriel
|
|
||||||
p.email as email,
|
|
||||||
-- numéro de téléphone
|
|
||||||
p.phonenumber as phonenumber,
|
|
||||||
-- numéro de téléphone portable
|
|
||||||
p.mobilenumber as mobilenumber,
|
|
||||||
-- **
|
|
||||||
p.contactInfo as contactInfo,
|
|
||||||
-- memo
|
|
||||||
p.memo as memo,
|
|
||||||
|
|
||||||
-- Date de début de validité de l'adresse
|
|
||||||
get_last_address_validfrom(p.id, ?::date) as address_valid_from,
|
|
||||||
-- Adresse SDF
|
|
||||||
get_last_address_isnoaddress(p.id, ?::date) as address_isnoaddress,
|
|
||||||
-- Adresse ligne 1
|
|
||||||
get_last_address_streetaddress1(p.id, ?::date) as address_street_address_1,
|
|
||||||
-- Adresse ligne 2
|
|
||||||
get_last_address_streetaddress2(p.id, ?::date) as address_street_address_2,
|
|
||||||
-- Code postal
|
|
||||||
get_last_address_postcode_code(p.id, ?::date) as address_postcode_code,
|
|
||||||
-- Commune
|
|
||||||
get_last_address_postcode_label(p.id, ?::date) as address_postcode_label,
|
|
||||||
-- Code pays
|
|
||||||
get_last_address_country_code(p.id, ?::date) as address_country_code,
|
|
||||||
-- Pays
|
|
||||||
get_last_address_country_name(p.id, ?::date) as address_country_name,
|
|
||||||
|
|
||||||
-- date d’ouverture du dossier la plus récente
|
|
||||||
ac.openingdate as recentopeningdate,
|
|
||||||
-- date de fermeture du dossier la plus récente
|
|
||||||
ac.closingdate as recentclosingdate,
|
|
||||||
-- motif de cloture
|
|
||||||
ac.closingmotive as closingmotive,
|
|
||||||
|
|
||||||
-- Situation familiale
|
|
||||||
ms.name as situation_familiale,
|
|
||||||
-- Enfants à charge
|
|
||||||
cs.enfantacharge as enfantacharge,
|
|
||||||
-- Date de fin du dernier emploi
|
|
||||||
cs.datefindernieremploi as findernieremploidate,
|
|
||||||
-- Accompagnement
|
|
||||||
cs.accompagnement as accompagnement__label,
|
|
||||||
-- Prescripteur
|
|
||||||
tpp.name as prescripteur__name,
|
|
||||||
-- Email prescripteur
|
|
||||||
tpp.email as prescripteur__email,
|
|
||||||
-- Téléphone prescripteur
|
|
||||||
tpp.telephone as prescripteur__phone,
|
|
||||||
-- Identifiant pôle emploi
|
|
||||||
cs.poleemploiid as poleemploiid,
|
|
||||||
-- Numéro allocataire CAF
|
|
||||||
cs.cafid as cafid,
|
|
||||||
-- Date de l’inscription CAF
|
|
||||||
cs.cafinscriptiondate as cafinscriptiondate,
|
|
||||||
-- Date de l’avenant du contrat
|
|
||||||
cs.datecontratiej as contratiejdate,
|
|
||||||
-- Date de l’inscription CER
|
|
||||||
cs.cerinscriptiondate as cerinscriptiondate,
|
|
||||||
-- Date de l’inscription PPAE
|
|
||||||
cs.ppaeinscriptiondate as ppaeinscriptiondate,
|
|
||||||
-- Signataire PPAE
|
|
||||||
cs.ppaesignataire as ppaesignataire,
|
|
||||||
-- Signataire CER
|
|
||||||
cs.cersignataire as cersignataire,
|
|
||||||
-- Éligibilité NEET
|
|
||||||
cs.neeteligibilite as neet_eligibility__label,
|
|
||||||
-- Date de commission NEET
|
|
||||||
cs.neetcommissiondate as neetcommissiondate,
|
|
||||||
-- Code démarche FSE
|
|
||||||
cs.fsemademarchecode as fsemademarchecode,
|
|
||||||
-- Permis de conduire
|
|
||||||
cs.permisconduire as permis_conduire__label,
|
|
||||||
-- Situation professionnelle
|
|
||||||
cs.situationprofessionnelle as situation_professionnelle__label,
|
|
||||||
-- Type de contrat
|
|
||||||
cs.typecontrat as type_contrat__label,
|
|
||||||
-- Salaire(s), ARE, ASS, RSA, AAH, Autre
|
|
||||||
cs.ressources as ressource__label,
|
|
||||||
-- Transport en commun, Scooter, Vélo, Voiture, Autre
|
|
||||||
cs.mobilitemoyentransport as moyen_transport__label
|
|
||||||
|
|
||||||
FROM public.chill_person_person AS p
|
|
||||||
|
|
||||||
LEFT JOIN chill_job.cs_person AS cs
|
|
||||||
ON p.id = cs.person_id
|
|
||||||
LEFT JOIN chill_3party.third_party AS tpp
|
|
||||||
ON cs.prescripteur_id = tpp.id
|
|
||||||
LEFT JOIN public.chill_person_marital_status AS ms
|
|
||||||
ON p.maritalstatus_id = ms.id
|
|
||||||
|
|
||||||
LEFT JOIN public.country AS cnb
|
|
||||||
ON p.countryofbirth_id = cnb.id
|
|
||||||
LEFT JOIN public.country AS cnn
|
|
||||||
ON p.nationality_id = cnn.id
|
|
||||||
|
|
||||||
LEFT JOIN accompagning AS ac
|
|
||||||
ON p.id = ac.id
|
|
||||||
|
|
||||||
WHERE
|
|
||||||
p.id IN (%person_ids%)
|
|
||||||
|
|
||||||
ORDER BY p.id ASC
|
|
||||||
|
|
||||||
SQL;
|
|
||||||
|
|
||||||
public function validateForm(mixed $data, ExecutionContextInterface $context)
|
|
||||||
{
|
|
||||||
// TODO: Implement validateForm() method.
|
|
||||||
}
|
|
||||||
}
|
|
@ -3,9 +3,9 @@ services:
|
|||||||
autowire: true
|
autowire: true
|
||||||
autoconfigure: true
|
autoconfigure: true
|
||||||
|
|
||||||
Chill\JobBundle\Export\ListCSPerson:
|
Chill\JobBundle\Export\AddCSPersonToPersonListHelper:
|
||||||
tags:
|
tags:
|
||||||
- { name: chill.export, alias: list_CSPerson }
|
- { name: chill_person.list_person_customizer }
|
||||||
|
|
||||||
Chill\JobBundle\Export\ListCV:
|
Chill\JobBundle\Export\ListCV:
|
||||||
tags:
|
tags:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user