Commit 9d17f5f4 authored by Stephane Bouvry's avatar Stephane Bouvry
Browse files

Merge branch 'kusanagi-discipline-update' into kusanagi

parents 1f54d068 edb27916
Loading
Loading
Loading
Loading
Loading
+70 −137
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ use Oscar\Entity\TVA;
use Oscar\Exception\OscarException;
use Oscar\Formatter\OscarFormatterConst;
use Oscar\Provider\Privileges;
use Oscar\Service\administration\AdminDisciplineAPIService;
use Oscar\Service\administration\AdministrationConfigService;
use Oscar\Service\administration\AdminRolePrivilegeServiceAPIService;
use Oscar\Service\ConfigurationParser;
@@ -528,32 +529,22 @@ class AdministrationController extends AbstractOscarController implements
                ', ',
                $this->getOscarConfigurationService()->getSpentAccountFilter()
            ),
            OscarConfigurationService::activity_request_limit       => $this->getOscarConfigurationService(
            )->getActivityRequestLimit(),
            'timesheet_preview'                                     => $this->getOscarConfigurationService(
            )->getTimesheetPreview(),
            'timesheet_excel'                                       => $this->getOscarConfigurationService(
            )->getTimesheetExcel(),
            'allow_numerotation_custom'                             => $this->getOscarConfigurationService(
            )->getNumerotationEditable(),
            'themes'                                                => $this->getOscarConfigurationService(
            )->getConfiguration('themes'),
            'theme'                                                 => $this->getOscarConfigurationService()->getTheme(
            ),
            OscarConfigurationService::activity_request_limit => $this->getOscarConfigurationService()->getActivityRequestLimit(),
            'timesheet_preview' => $this->getOscarConfigurationService()->getTimesheetPreview(),
            'timesheet_excel' => $this->getOscarConfigurationService()->getTimesheetExcel(),
            'allow_numerotation_custom' => $this->getOscarConfigurationService()->getNumerotationEditable(),
            'themes' => $this->getOscarConfigurationService()->getConfiguration('themes'),
            'theme' => $this->getOscarConfigurationService()->getTheme(),
            'export' => [
                'separator' => $this->getOscarConfigurationService()->getExportSeparator(),
                'dateformat' => $this->getOscarConfigurationService()->getExportDateFormat()
            ],
            'organization_leader_role' => $organization_leader_role,
            OscarConfigurationService::document_use_version_in_name => $this->getOscarConfigurationService(
            )->getDocumentUseVersionInName(),
            OscarConfigurationService::pfi_strict                   => $this->getOscarConfigurationService(
            )->isPfiStrict(),
            OscarConfigurationService::document_use_version_in_name => $this->getOscarConfigurationService()->getDocumentUseVersionInName(),
            OscarConfigurationService::pfi_strict => $this->getOscarConfigurationService()->isPfiStrict(),
            OscarConfigurationService::pfi_strict_format => $pfiFixed,
            "pfi_default_format"                                    => $this->getOscarConfigurationService(
            )->getConfiguration('validation.pfi'),
            "allow_node_selection"                                  => $this->getOscarConfigurationService(
            )->isAllowNodeSelection(),
            "pfi_default_format" => $this->getOscarConfigurationService()->getConfiguration('validation.pfi'),
            "allow_node_selection" => $this->getOscarConfigurationService()->isAllowNodeSelection(),
            "organizationRequire" => [
                "type" => $this->getOscarConfigurationService()->getOrganizationRequired()['type'],
                "country" => $this->getOscarConfigurationService()->getOrganizationRequired()['country']
@@ -609,8 +600,7 @@ class AdministrationController extends AbstractOscarController implements
                    default:
                        return $this->getResponseInternalError();
                }
            }
            else {
            } else {
                switch ($method) {
                    case 'GET':
                        $numerotation = $this->getOscarConfigurationService()->getEditableConfKey('numerotation', []);
@@ -693,8 +683,7 @@ class AdministrationController extends AbstractOscarController implements
                            if (!$tva) {
                                return $this->getResponseInternalError("Impossible de charger la TVA '$id'");
                            }
                        }
                        else {
                        } else {
                            return $this->getResponseBadRequest("");
                        }
                        $this->getEntityManager()->remove($tva);
@@ -721,8 +710,7 @@ class AdministrationController extends AbstractOscarController implements
                            if (!$tva) {
                                throw new OscarException("Impossible de charger la TVA '$id'");
                            }
                        }
                        else {
                        } else {
                            $tva = new TVA();
                            $this->getEntityManager()->persist($tva);
                        }
@@ -801,63 +789,12 @@ class AdministrationController extends AbstractOscarController implements
    public function disciplineAction()
    {
        $this->getOscarUserContextService()->check(Privileges::MAINTENANCE_DISCIPLINE_MANAGE);

        $disciplines = $this->getEntityManager()->getRepository(Discipline::class)->getDisciplinesCounted();
        $method = $this->getHttpXMethod();

        switch ($method) {
            case 'PUT' :
                $label = $this->params()->fromPost('label');
                $discipline = new Discipline();
                $this->getEntityManager()->persist($discipline);
                $discipline->setLabel($label);

                try {
                    $this->getEntityManager()->flush($discipline);
                    $data = $discipline->toJson();
                    $data['actyivitiesLng'] = 0;
                    return $this->ajaxResponse(['discipline' => $data]);
                } catch (\Exception $e) {
                    return $this->getResponseInternalError("Impossible d'ajouter la discipline : " . $e->getMessage());
                }


                break;

            case 'POST' :
                $label = $this->params()->fromPost('label');
                $id = $this->params()->fromPost('id');

                try {
                    $discipline = $this->getEntityManager()->getRepository(Discipline::class)->find($id);
                    $discipline->setLabel($label);
                    $this->getEntityManager()->flush($discipline);
                    $data = $discipline->toJson();
                    return $this->ajaxResponse(['discipline' => $data]);
                } catch (\Exception $e) {
                    return $this->getResponseInternalError("Impossible d'ajouter la discipline : " . $e->getMessage());
                }
                return $this->getResponseNotImplemented("MODIFICATION Pas encore implanté");
                break;

            case 'DELETE' :
                $id = $this->params()->fromQuery('id');
                try {
                    $discipline = $this->getEntityManager()->getRepository(Discipline::class)->find($id);
                    $this->getEntityManager()->remove($discipline);
                    $this->getEntityManager()->flush();
                    return $this->getResponseOk();
                } catch (\Exception $exception) {
                    return $this->getResponseInternalError(
                        "Impossible de supprimer la discipline : " . $exception->getMessage()
                    );
                }
        $disciplineConfigApi = new AdminDisciplineAPIService();
        $disciplineConfigApi->setServiceContainer($this->getServiceLocator());
        if ($this->isAjax() || $this->getRequest()->getQuery('f') === 'json') {
            return $disciplineConfigApi->entrypoint($this->getRequest());
        }

        $datas = [
            'disciplines' => $disciplines
        ];
        return $datas;
        return [];
    }

    public function motsclesAction()
@@ -1069,7 +1006,8 @@ class AdministrationController extends AbstractOscarController implements
        }
    }

    public function activityStatusAction() {
    public function activityStatusAction()
    {
        $this->getOscarUserContextService()->check(Privileges::MAINTENANCE_PARAMETERS_MANAGE);

        /** @var AdministrationConfigService $administrationService */
@@ -1643,8 +1581,7 @@ class AdministrationController extends AbstractOscarController implements
                            $this->getLoggerService()->critical("Action $datas->action inconnue !");
                            return $this->getResponseNotImplemented();
                    }
                }
                else {
                } else {
                    // Contrôle du Role
                    $roleId = trim($datas->get('label'));
                    if ($roleId == "") {
@@ -1668,8 +1605,7 @@ class AdministrationController extends AbstractOscarController implements
                    return $this->ajaxResponse($role->toArray());
                }
            }
        }
        else {
        } else {
            $method = $this->getHttpXMethod();
            $this->getOscarUserContextService()->check(Privileges::DROIT_ROLEORGA_EDITION);
            $role = $this->getEntityManager()->getRepository(OrganizationRole::class)->find($roleId);
@@ -1868,8 +1804,7 @@ class AdministrationController extends AbstractOscarController implements
            'declarersRelanceJour1' => $this->getOscarConfigurationService()->getDeclarersRelanceJour1(),
            'declarersRelance2' => $this->getOscarConfigurationService()->getDeclarersRelance2(),
            'declarersRelanceJour2' => $this->getOscarConfigurationService()->getDeclarersRelanceJour2(),
            'declarersRelanceConflitMessage' => $this->getOscarConfigurationService(
            )->getDeclarersRelanceConflitMessage(),
            'declarersRelanceConflitMessage' => $this->getOscarConfigurationService()->getDeclarersRelanceConflitMessage(),
            'declarersRelanceConflitJour' => $this->getOscarConfigurationService()->getDeclarersRelanceConflitJour(),
            /**  **/
            'validatorsRelance1' => $this->getOscarConfigurationService()->getValidatorsRelance1(),
@@ -1952,8 +1887,7 @@ class AdministrationController extends AbstractOscarController implements
            }

            return [];
        }
        elseif ($method == "POST") {
        } elseif ($method == "POST") {
            // Enregistrement des associations TYPE OSCAR <> TYPE PCRU
            $datas = $this->getJsonPosted();
            $idTypeActivity = $datas['oscar_id'];
@@ -1965,8 +1899,7 @@ class AdministrationController extends AbstractOscarController implements
                $this->getLoggerService()->error($e->getMessage());
                return $this->getResponseInternalError($e->getMessage());
            }
        }
        else {
        } else {
            return $this->getResponseBadRequest("La méthode de transmission ne fonctionne pas");
        }
    }
+20 −1
Original line number Diff line number Diff line
@@ -15,7 +15,7 @@ use Doctrine\ORM\Mapping as ORM;
 * Class Discipline
 * @package Oscar\Entity
 * @ORM\Entity()
 * @ORM\Entity(repositoryClass="Oscar\Entity\DisciplineRepository")
 * @ORM\Entity(repositoryClass="Oscar\Entity\Repository\DisciplineRepository")
 */
class Discipline
{
@@ -38,6 +38,14 @@ class Discipline
     */
    private $label;

    /**
     * Est disponible à la selection
     *
     * @var boolean
     * @ORM\Column(type="boolean", nullable=false, options={"default"=true})
     */
    protected $active = false;

    /**
     * @var \Doctrine\Common\Collections\Collection
     * @ORM\ManyToMany(targetEntity="Activity", mappedBy="disciplines")
@@ -70,6 +78,17 @@ class Discipline
        return $this;
    }

    public function isActive(): bool
    {
        return $this->active;
    }

    public function setActive(bool $active): self
    {
        $this->active = $active;
        return $this;
    }

    /**
     * @return string
     */
+0 −37
Original line number Diff line number Diff line
<?php

/**
 * @author Stéphane Bouvry<stephane.bouvry@unicaen.fr>
 * @date: 17-09-12 09:49
 * @copyright Certic (c) 2017
 */

namespace Oscar\Entity;

use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Query;

class DisciplineRepository extends EntityRepository
{
    /**
     * Retourne les disciplines.
     */
    public function getDisciplines()
    {
        return $this->createQueryBuilder('d')
            ->select('d')
            ->from(Discipline::class)
            ->getQuery()
            ->getResult();
    }

    /**
     * Retourne la liste des disciplines avec le comptage des projets.
     */
    public function getDisciplinesCounted()
    {
        $dql = "SELECT d.id, d.label, count(a.id) as activitiesLng FROM Oscar\Entity\Discipline d LEFT JOIN d.activities a GROUP BY d.id ORDER BY d.label";
        $query = $this->getEntityManager()->createQuery($dql);
        return $query->getArrayResult();
    }
}
+106 −0
Original line number Diff line number Diff line
<?php

/**
 * @author Stéphane Bouvry<stephane.bouvry@unicaen.fr>
 * @date: 17-09-12 09:49
 * @copyright Certic (c) 2017
 */

namespace Oscar\Entity\Repository;

use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Query;

class DisciplineRepository extends EntityRepository implements RepositoryConstants
{
    /**
     * Retourne les disciplines.
     */
    public function getDisciplines()
    {
        return $this->createQueryBuilder('d')
            ->select('d')
            ->getQuery()
            ->getResult();
    }



    public function getDisciplinesArray(...$options)
    {
        $label = 'd.label as label';
        $where = [];
        $having = [];

        if( in_array(self::ARRAY_ACTIVE_ONLY, $options) ){
            $where[] = "d.active = TRUE";
        }

        if( in_array(self::ARRAY_USE_ONLY, $options) ){
            $having[] = "count(a.id) > 0";
        }

        if( in_array(self::ARRAY_LABEL_WITH_COUNT, $options) ){
            $label = "CONCAT(d.label, ' (', count(a.id), ')') as label";
        }

        if( count($where) > 0 ){
            $where = 'WHERE ' . implode(' AND ', $where);
        } else {
            $where = '';
        }
        if( count($having) > 0 ){
            $having = 'HAVING ' . implode(' AND ', $having);
        } else {
            $having = '';
        }


        $dql = "SELECT 
                    d.id, 
                    $label, 
                    d.active, count(a.id) as usage 
                    FROM Oscar\Entity\Discipline d 
                LEFT JOIN d.activities a
                $where 
                GROUP BY d.id 
                $having
                ORDER BY d.label";

        $query = $this->getEntityManager()->createQuery($dql);
        $result = $query->getArrayResult();

        if( in_array(self::ARRAY_FORMAT_FLAT, $options) ){
            $output = [];
            foreach ($result as $row) {
                $output[$row['id']] = $row['label'];
            }
            return $output;
        }

        return $result;
    }

    public function getDisciplinesById(array $ids): array
    {
        return $this->createQueryBuilder('d')
            ->select('d')
            ->where('d.id IN (:ids)')
            ->setParameter('ids', $ids)
            ->getQuery()
            ->getResult();
    }

    /**
     * Retourne la liste des disciplines avec le comptage des projets.
     */
    public function getDisciplinesCounted()
    {
        $dql = "SELECT d.id, d.label, d.active, count(a.id) as count FROM Oscar\Entity\Discipline d 
            LEFT JOIN d.activities a 
            GROUP BY d.id 
            ORDER BY d.label";
        $query = $this->getEntityManager()->createQuery($dql);
        return $query->getArrayResult();
    }
}
+20 −0
Original line number Diff line number Diff line
<?php

namespace Oscar\Entity\Repository;

interface RepositoryConstants
{
    const ARRAY_ACTIVE_ONLY = 'ARRAY_ACTIVE_ONLY';

    const ARRAY_USE_ONLY = 'ARRAY_USE_ONLY';

    /**
     * Ajout (COUNT) au label
     */
    const ARRAY_LABEL_WITH_COUNT = 'ARRAY_LABEL_WITH_COUNT';

    /**
     * Sous la forme [ID] => "LABEL"
     */
    const ARRAY_FORMAT_FLAT = 'ARRAY_FORMAT_FLAT';
}
 No newline at end of file
Loading