diff --git a/exports_alias_conventions.csv b/exports_alias_conventions.csv
new file mode 100644
index 000000000..1215479d8
--- /dev/null
+++ b/exports_alias_conventions.csv
@@ -0,0 +1,68 @@
+Entity,Join,Attribute,Alias
+AccompanyingPeriod::class,,,acp
+,AccompanyingPeriodWork::class,acp.works,acpw
+,AccompanyingPeriodParticipation::class,acp.participations,acppart
+,Location::class,acp.administrativeLocation,acploc
+,ClosingMotive::class,acp.closingMotive,acpmotive
+,UserJob::class,acp.job,acpjob
+,Origin::class,acp.origin,acporigin
+,Scope::class,acp.scopes,acpscope
+,SocialIssue::class,acp.socialIssues,acpsocialissue
+,User::class,acp.user,acpuser
+AccompanyingPeriodWork::class,,,acpw
+,AccompanyingPeriodWorkEvaluation::class,acpw.accompanyingPeriodWorkEvaluations,workeval
+,Goal::class,acpw.goals,goal
+,User::class,acpw.referrers,acpwuser
+,Result::class,acpw.results,acpwresult
+,SocialAction::class,acpw.socialAction,acpwsocialaction
+AccompanyingPeriodParticipation::class,,,acppart
+,Person::class,acppart.person,partperson
+AccompanyingPeriodWorkEvaluation::class,,,workeval
+,Evaluation::class,workeval.evaluation,eval
+Goal::class,,,goal
+,Result::class,goal.results,goalresult
+Person::class,,,person
+,Center::class,person.center,center
+,HouseholdMember::class,partperson.householdParticipations,member
+,MaritalStatus::class,person.maritalStatus,personmarital
+ResidentialAddress::class,,,resaddr
+,Person::class,resaddr.person,resaddrperson
+,Center::class,resaddrperson.center,resaddrcenter
+,ThirdParty::class,resaddr.hostThirdParty,tparty
+ThirdParty::class,,,tparty
+,ThirdPartyCategory::class,tparty.categories,tpartycat
+HouseholdMember::class,,,member
+,Household::class,member.household,household
+,Person::class,member.person,memberperson
+,,memberperson.center,membercenter
+Household::class,,,household
+,HouseholdComposition::class,household.compositions,composition
+Activity::class,,,activity
+,Person::class,activity.person,actperson
+,AccompanyingPeriod::class,activity.accompanyingPeriod,actacp
+,Person::class,activity_person_having_activity.person,person_person_having_activity
+,ActivityReason::class,activity_person_having_activity.reasons,reasons_person_having_activity
+,ActivityType::class,activity.activityType,acttype
+,Location::class,activity.location,actloc
+,SocialAction::class,activity.socialActions,actsocialaction
+,SocialIssue::class,activity.socialIssues,actsocialssue
+,ThirdParty::class,activity.thirdParties,acttparty
+,User::class,activity.user,actuser
+,User::class,activity.users,actusers
+,ActivityReason::class,activity.reasons,actreasons
+,Center::class,actperson.center,actcenter
+ActivityReason::class,,,actreasons
+,ActivityReasonCategory::class,actreason.category,actreasoncat
+Calendar::class,,,cal
+,CancelReason::class,cal.cancelReason,calcancel
+,Location::class,cal.location,calloc
+,User::class,cal.user,caluser
+VendeePerson::class,,,vp
+,Person::class,vp.person,vpperson
+,Center::class,vpperson.center,vpcenter
+,SituationProfessionelle::class,vp.situationProfessionelle,vpprof
+,StatutLogement::class,vp.statutLogement,vplog
+,TempsDeTravail::class,vp.tempsDeTravail,vptt
+VendeePersonMineur::class,,,vpm
+,Person::class,vpm.person,vpmperson
+,Center::class,vpmperson.center,vpmcenter
diff --git a/exports_alias_conventions.md b/exports_alias_conventions.md
new file mode 100644
index 000000000..85973eec1
--- /dev/null
+++ b/exports_alias_conventions.md
@@ -0,0 +1,76 @@
+# Export conventions
+
+
+Add condition with distinct alias on each export join clauses (Indicators + Filters + Aggregators)
+
+These are alias conventions :
+
+| Entity | Join | Attribute | Alias |
+| :--- | :--- |:-------------------------------------------|:----------------------------------|
+| AccompanyingPeriod::class | | | acp |
+| | AccompanyingPeriodWork::class | acp.works | acpw |
+| | AccompanyingPeriodParticipation::class | acp.participations | acppart |
+| | Location::class | acp.administrativeLocation | acploc |
+| | ClosingMotive::class | acp.closingMotive | acpmotive |
+| | UserJob::class | acp.job | acpjob |
+| | Origin::class | acp.origin | acporigin |
+| | Scope::class | acp.scopes | acpscope |
+| | SocialIssue::class | acp.socialIssues | acpsocialissue |
+| | User::class | acp.user | acpuser |
+| AccompanyingPeriodWork::class | | | acpw |
+| | AccompanyingPeriodWorkEvaluation::class | acpw.accompanyingPeriodWorkEvaluations | workeval |
+| | Goal::class | acpw.goals | goal |
+| | User::class | acpw.referrers | acpwuser |
+| | Result::class | acpw.results | acpwresult |
+| | SocialAction::class | acpw.socialAction | acpwsocialaction |
+| AccompanyingPeriodParticipation::class | | | acppart |
+| | Person::class | acppart.person | partperson |
+| AccompanyingPeriodWorkEvaluation::class | | | workeval |
+| | Evaluation::class | workeval.evaluation | eval |
+| Goal::class | | | goal |
+| | Result::class | goal.results | goalresult |
+| Person::class | | | person |
+| | Center::class | person.center | center |
+| | HouseholdMember::class | partperson.householdParticipations | member |
+| | MaritalStatus::class | person.maritalStatus | personmarital |
+| ResidentialAddress::class | | | resaddr |
+| | Person::class | resaddr.person | resaddrperson |
+| | Center::class | resaddrperson.center | resaddrcenter |
+| | ThirdParty::class | resaddr.hostThirdParty | tparty |
+| ThirdParty::class | | | tparty |
+| | ThirdPartyCategory::class | tparty.categories | tpartycat |
+| HouseholdMember::class | | | member |
+| | Household::class | member.household | household |
+| | Person::class | member.person | memberperson |
+| | | memberperson.center | membercenter |
+| Household::class | | | household |
+| | HouseholdComposition::class | household.compositions | composition |
+| Activity::class | | | activity |
+| | Person::class | activity.person | actperson |
+| | AccompanyingPeriod::class | activity.accompanyingPeriod | actacp |
+| | Person::class | activity\_person\_having\_activity.person | person\_person\_having\_activity |
+| | ActivityReason::class | activity\_person\_having\_activity.reasons | reasons\_person\_having\_activity |
+| | ActivityType::class | activity.activityType | acttype |
+| | Location::class | activity.location | actloc |
+| | SocialAction::class | activity.socialActions | actsocialaction |
+| | SocialIssue::class | activity.socialIssues | actsocialssue |
+| | ThirdParty::class | activity.thirdParties | acttparty |
+| | User::class | activity.user | actuser |
+| | User::class | activity.users | actusers |
+| | ActivityReason::class | activity.reasons | actreasons |
+| | Center::class | actperson.center | actcenter |
+| ActivityReason::class | | | actreasons |
+| | ActivityReasonCategory::class | actreason.category | actreasoncat |
+| Calendar::class | | | cal |
+| | CancelReason::class | cal.cancelReason | calcancel |
+| | Location::class | cal.location | calloc |
+| | User::class | cal.user | caluser |
+| VendeePerson::class | | | vp |
+| | Person::class | vp.person | vpperson |
+| | Center::class | vpperson.center | vpcenter |
+| | SituationProfessionelle::class | vp.situationProfessionelle | vpprof |
+| | StatutLogement::class | vp.statutLogement | vplog |
+| | TempsDeTravail::class | vp.tempsDeTravail | vptt |
+| VendeePersonMineur::class | | | vpm |
+| | Person::class | vpm.person | vpmperson |
+| | Center::class | vpmperson.center | vpmcenter |
diff --git a/src/Bundle/ChillActivityBundle/Export/Aggregator/ACPAggregators/BySocialActionAggregator.php b/src/Bundle/ChillActivityBundle/Export/Aggregator/ACPAggregators/BySocialActionAggregator.php
index 269924a8a..f35fe6e6b 100644
--- a/src/Bundle/ChillActivityBundle/Export/Aggregator/ACPAggregators/BySocialActionAggregator.php
+++ b/src/Bundle/ChillActivityBundle/Export/Aggregator/ACPAggregators/BySocialActionAggregator.php
@@ -1,5 +1,12 @@
actionRepository = $actionRepository;
}
+ public function addRole(): ?string
+ {
+ return null;
+ }
+
+ public function alterQuery(QueryBuilder $qb, $data)
+ {
+ if (!in_array('actsocialaction', $qb->getAllAliases(), true)) {
+ $qb->join('activity.socialActions', 'actsocialaction');
+ }
+
+ $qb->addSelect('actsocialaction.id AS socialaction_aggregator');
+
+ $groupBy = $qb->getDQLPart('groupBy');
+
+ if (!empty($groupBy)) {
+ $qb->addGroupBy('socialaction_aggregator');
+ } else {
+ $qb->groupBy('socialaction_aggregator');
+ }
+ }
+
+ public function applyOn(): string
+ {
+ return Declarations::ACTIVITY_ACP;
+ }
+
+ public function buildForm(FormBuilderInterface $builder)
+ {
+ // no form
+ }
+
public function getLabels($key, array $values, $data)
{
- return function($value) {
+ return function ($value) {
if ('_header' === $value) {
return 'Social action';
}
@@ -44,40 +83,8 @@ class BySocialActionAggregator implements AggregatorInterface
return ['socialaction_aggregator'];
}
- public function buildForm(FormBuilderInterface $builder)
- {
- // no form
- }
-
public function getTitle(): string
{
return 'Group activity by linked socialaction';
}
-
- public function addRole()
- {
- return null;
- }
-
- public function alterQuery(QueryBuilder $qb, $data)
- {
- if(!in_array('socialaction', $qb->getAllAliases())) {
- $qb->join('activity.socialActions', 'socialaction');
- }
-
- $qb->addSelect('socialaction.id AS socialaction_aggregator');
-
- $groupBy = $qb->getDQLPart('groupBy');
-
- if (!empty($groupBy)) {
- $qb->addGroupBy('socialaction_aggregator');
- } else {
- $qb->groupBy('socialaction_aggregator');
- }
- }
-
- public function applyOn(): string
- {
- return Declarations::ACTIVITY_ACP;
- }
-}
\ No newline at end of file
+}
diff --git a/src/Bundle/ChillActivityBundle/Export/Aggregator/ACPAggregators/BySocialIssueAggregator.php b/src/Bundle/ChillActivityBundle/Export/Aggregator/ACPAggregators/BySocialIssueAggregator.php
index 0e4b9ab8e..1126b9373 100644
--- a/src/Bundle/ChillActivityBundle/Export/Aggregator/ACPAggregators/BySocialIssueAggregator.php
+++ b/src/Bundle/ChillActivityBundle/Export/Aggregator/ACPAggregators/BySocialIssueAggregator.php
@@ -1,5 +1,12 @@
issueRender = $issueRender;
}
- public function getLabels($key, array $values, $data)
- {
- return function ($value): string {
-
- if ($value === '_header') {
- return 'Social issues';
- }
-
- $i = $this->issueRepository->find($value);
-
- return $this->issueRender->renderString($i, []);
- };
- }
-
- public function getQueryKeys($data): array
- {
- return ['socialissue_aggregator'];
- }
-
- public function buildForm(FormBuilderInterface $builder)
- {
- // no form
- }
-
- public function getTitle(): string
- {
- return 'Group activity by linked socialissue';
- }
-
- public function addRole()
+ public function addRole(): ?string
{
return null;
}
public function alterQuery(QueryBuilder $qb, $data)
{
- if (!in_array('socialissue', $qb->getAllAliases())) {
- $qb->join('activity.socialIssues', 'socialissue');
+ if (!in_array('actsocialissue', $qb->getAllAliases(), true)) {
+ $qb->join('activity.socialIssues', 'actsocialissue');
}
- $qb->addSelect('socialissue.id AS socialissue_aggregator');
+ $qb->addSelect('actsocialissue.id AS socialissue_aggregator');
$groupBy = $qb->getDQLPart('groupBy');
@@ -81,4 +59,32 @@ class BySocialIssueAggregator implements AggregatorInterface
{
return Declarations::ACTIVITY_ACP;
}
-}
\ No newline at end of file
+
+ public function buildForm(FormBuilderInterface $builder)
+ {
+ // no form
+ }
+
+ public function getLabels($key, array $values, $data)
+ {
+ return function ($value): string {
+ if ('_header' === $value) {
+ return 'Social issues';
+ }
+
+ $i = $this->issueRepository->find($value);
+
+ return $this->issueRender->renderString($i, []);
+ };
+ }
+
+ public function getQueryKeys($data): array
+ {
+ return ['socialissue_aggregator'];
+ }
+
+ public function getTitle(): string
+ {
+ return 'Group activity by linked socialissue';
+ }
+}
diff --git a/src/Bundle/ChillActivityBundle/Export/Aggregator/ACPAggregators/ByThirdpartyAggregator.php b/src/Bundle/ChillActivityBundle/Export/Aggregator/ACPAggregators/ByThirdpartyAggregator.php
index 5a9e633ef..4b56c6fc7 100644
--- a/src/Bundle/ChillActivityBundle/Export/Aggregator/ACPAggregators/ByThirdpartyAggregator.php
+++ b/src/Bundle/ChillActivityBundle/Export/Aggregator/ACPAggregators/ByThirdpartyAggregator.php
@@ -1,5 +1,12 @@
thirdPartyRender = $thirdPartyRender;
}
- public function getLabels($key, array $values, $data)
- {
- return function ($value): string {
- if ($value === '_header') {
- return 'Accepted thirdparty';
- }
-
- $tp = $this->thirdPartyRepository->find($value);
-
- return $this->thirdPartyRender->renderString($tp, []);
- };
- }
-
- public function getQueryKeys($data): array
- {
- return ['thirdparty_aggregator'];
- }
-
- public function buildForm(FormBuilderInterface $builder)
- {
- // no form
- }
-
- public function getTitle(): string
- {
- return 'Group activity by linked thirdparties';
- }
-
- public function addRole()
+ public function addRole(): ?string
{
return null;
}
public function alterQuery(QueryBuilder $qb, $data)
{
- if (!in_array('thirdparty', $qb->getAllAliases())) {
- $qb->join('activity.thirdParties', 'thirdparty');
+ if (!in_array('acttparty', $qb->getAllAliases(), true)) {
+ $qb->join('activity.thirdParties', 'acttparty');
}
- $qb->addSelect('thirdparty.id AS thirdparty_aggregator');
+ $qb->addSelect('acttparty.id AS thirdparty_aggregator');
$groupBy = $qb->getDQLPart('groupBy');
@@ -80,4 +59,32 @@ class ByThirdpartyAggregator implements AggregatorInterface
{
return Declarations::ACTIVITY_ACP;
}
-}
\ No newline at end of file
+
+ public function buildForm(FormBuilderInterface $builder)
+ {
+ // no form
+ }
+
+ public function getLabels($key, array $values, $data)
+ {
+ return function ($value): string {
+ if ('_header' === $value) {
+ return 'Accepted thirdparty';
+ }
+
+ $tp = $this->thirdPartyRepository->find($value);
+
+ return $this->thirdPartyRender->renderString($tp, []);
+ };
+ }
+
+ public function getQueryKeys($data): array
+ {
+ return ['thirdparty_aggregator'];
+ }
+
+ public function getTitle(): string
+ {
+ return 'Group activity by linked thirdparties';
+ }
+}
diff --git a/src/Bundle/ChillActivityBundle/Export/Aggregator/ACPAggregators/ByUserAggregator.php b/src/Bundle/ChillActivityBundle/Export/Aggregator/ACPAggregators/ByUserAggregator.php
index 95c9998b8..3787e5286 100644
--- a/src/Bundle/ChillActivityBundle/Export/Aggregator/ACPAggregators/ByUserAggregator.php
+++ b/src/Bundle/ChillActivityBundle/Export/Aggregator/ACPAggregators/ByUserAggregator.php
@@ -1,5 +1,12 @@
userRender = $userRender;
}
- public function getLabels($key, array $values, $data)
- {
- return function ($value): string {
- if ($value === '_header') {
- return 'Accepted users';
- }
-
- $u = $this->userRepository->find($value);
-
- return $this->userRender->renderString($u, []);
- };
- }
-
- public function getQueryKeys($data): array
- {
- return ['users_aggregator'];
- }
-
- public function buildForm(FormBuilderInterface $builder)
- {
- // no form
- }
-
- public function getTitle(): string
- {
- return 'Group activity by linked users';
- }
-
- public function addRole()
+ public function addRole(): ?string
{
return null;
}
public function alterQuery(QueryBuilder $qb, $data)
{
- if (!in_array('user', $qb->getAllAliases())) {
- $qb->join('activity.users', 'user');
+ if (!in_array('actusers', $qb->getAllAliases(), true)) {
+ $qb->join('activity.users', 'actusers');
}
- $qb->addSelect('user.id AS users_aggregator');
+ $qb->addSelect('actusers.id AS users_aggregator');
$groupBy = $qb->getDQLPart('groupBy');
@@ -80,4 +59,32 @@ class ByUserAggregator implements AggregatorInterface
{
return Declarations::ACTIVITY_ACP;
}
-}
\ No newline at end of file
+
+ public function buildForm(FormBuilderInterface $builder)
+ {
+ // no form
+ }
+
+ public function getLabels($key, array $values, $data)
+ {
+ return function ($value): string {
+ if ('_header' === $value) {
+ return 'Accepted users';
+ }
+
+ $u = $this->userRepository->find($value);
+
+ return $this->userRender->renderString($u, []);
+ };
+ }
+
+ public function getQueryKeys($data): array
+ {
+ return ['users_aggregator'];
+ }
+
+ public function getTitle(): string
+ {
+ return 'Group activity by linked users';
+ }
+}
diff --git a/src/Bundle/ChillActivityBundle/Export/Aggregator/ACPAggregators/DateAggregator.php b/src/Bundle/ChillActivityBundle/Export/Aggregator/ACPAggregators/DateAggregator.php
index 1c2f02d3b..5603b1b78 100644
--- a/src/Bundle/ChillActivityBundle/Export/Aggregator/ACPAggregators/DateAggregator.php
+++ b/src/Bundle/ChillActivityBundle/Export/Aggregator/ACPAggregators/DateAggregator.php
@@ -1,12 +1,19 @@
'year',
];
- private CONST DEFAULT_CHOICE = 'year';
+ private const DEFAULT_CHOICE = 'year';
private TranslatorInterface $translator;
@@ -31,55 +38,7 @@ class DateAggregator implements AggregatorInterface
$this->translator = $translator;
}
- public function getLabels($key, array $values, $data)
- {
- return function ($value) use ($data): string {
- if ($value === '_header') {
- return 'by '. $data['frequency'];
- }
- switch ($data['frequency']) {
- case 'month':
- $month = \DateTime::createFromFormat('!m', $value);
- return sprintf(
- "%02d (%s)",
- $value,
- $month->format('M')
- );
-
- case 'week':
- //return $this->translator->trans('for week') .' '. $value ;
-
- case 'year':
- //return $this->translator->trans('in year') .' '. $value ;
-
- default:
- return $value;
- }
- };
- }
-
- public function getQueryKeys($data): array
- {
- return ['date_aggregator'];
- }
-
- public function buildForm(FormBuilderInterface $builder)
- {
- $builder->add('frequency', ChoiceType::class, [
- 'choices' => self::CHOICES,
- 'multiple' => false,
- 'expanded' => true,
- 'empty_data' => self::DEFAULT_CHOICE,
- 'data' => self::DEFAULT_CHOICE,
- ]);
- }
-
- public function getTitle(): string
- {
- return 'Group activity by date';
- }
-
- public function addRole()
+ public function addRole(): ?string
{
return null;
}
@@ -90,13 +49,19 @@ class DateAggregator implements AggregatorInterface
switch ($data['frequency']) {
case 'month':
- $fmt = 'MM'; break;
+ $fmt = 'MM';
+
+break;
case 'week':
- $fmt = 'IW'; break;
+ $fmt = 'IW';
+
+break;
case 'year':
- $fmt = 'YYYY'; $order = 'DESC'; break;
+ $fmt = 'YYYY'; $order = 'DESC';
+
+break; // order DESC does not works !
default:
throw new RuntimeException(sprintf("The frequency data '%s' is invalid.", $data['frequency']));
@@ -126,4 +91,53 @@ class DateAggregator implements AggregatorInterface
return Declarations::ACTIVITY_ACP;
}
-}
\ No newline at end of file
+ public function buildForm(FormBuilderInterface $builder)
+ {
+ $builder->add('frequency', ChoiceType::class, [
+ 'choices' => self::CHOICES,
+ 'multiple' => false,
+ 'expanded' => true,
+ 'empty_data' => self::DEFAULT_CHOICE,
+ 'data' => self::DEFAULT_CHOICE,
+ ]);
+ }
+
+ public function getLabels($key, array $values, $data)
+ {
+ return static function ($value) use ($data): string {
+ if ('_header' === $value) {
+ return 'by ' . $data['frequency'];
+ }
+
+ switch ($data['frequency']) {
+ case 'month':
+ $month = DateTime::createFromFormat('!m', $value);
+
+ return sprintf(
+ '%02d (%s)',
+ $value,
+ $month->format('M')
+ );
+
+ case 'week':
+ //return $this->translator->trans('for week') .' '. $value ;
+
+ case 'year':
+ //return $this->translator->trans('in year') .' '. $value ;
+
+ default:
+ return $value;
+ }
+ };
+ }
+
+ public function getQueryKeys($data): array
+ {
+ return ['date_aggregator'];
+ }
+
+ public function getTitle(): string
+ {
+ return 'Group activity by date';
+ }
+}
diff --git a/src/Bundle/ChillActivityBundle/Export/Aggregator/ACPAggregators/LocationTypeAggregator.php b/src/Bundle/ChillActivityBundle/Export/Aggregator/ACPAggregators/LocationTypeAggregator.php
index aa5052aaa..d05c0eb41 100644
--- a/src/Bundle/ChillActivityBundle/Export/Aggregator/ACPAggregators/LocationTypeAggregator.php
+++ b/src/Bundle/ChillActivityBundle/Export/Aggregator/ACPAggregators/LocationTypeAggregator.php
@@ -1,5 +1,12 @@
translatableStringHelper = $translatableStringHelper;
}
+ public function addRole(): ?string
+ {
+ return null;
+ }
+
+ public function alterQuery(QueryBuilder $qb, $data)
+ {
+ if (!in_array('actloc', $qb->getAllAliases(), true)) {
+ $qb->join('activity.location', 'actloc');
+ }
+
+ $qb->addSelect('IDENTITY(actloc.locationType) AS locationtype_aggregator');
+
+ $groupBy = $qb->getDQLPart('groupBy');
+
+ if (!empty($groupBy)) {
+ $qb->addGroupBy('locationtype_aggregator');
+ } else {
+ $qb->groupBy('locationtype_aggregator');
+ }
+ }
+
+ public function applyOn(): string
+ {
+ return Declarations::ACTIVITY_ACP;
+ }
+
+ public function buildForm(FormBuilderInterface $builder)
+ {
+ // no form
+ }
+
public function getLabels($key, array $values, $data)
{
return function ($value): string {
- if ($value === '_header') {
+ if ('_header' === $value) {
return 'Accepted locationtype';
}
@@ -46,41 +85,8 @@ class LocationTypeAggregator implements AggregatorInterface
return ['locationtype_aggregator'];
}
- public function buildForm(FormBuilderInterface $builder)
- {
- // no form
- }
-
public function getTitle(): string
{
return 'Group activity by locationtype';
}
-
- public function addRole()
- {
- return null;
- }
-
- public function alterQuery(QueryBuilder $qb, $data)
- {
- if (!in_array('location', $qb->getAllAliases())) {
- $qb->join('activity.location', 'location');
- }
-
- $qb->addSelect('IDENTITY(location.locationType) AS locationtype_aggregator');
-
- $groupBy = $qb->getDQLPart('groupBy');
-
- if (!empty($groupBy)) {
- $qb->addGroupBy('locationtype_aggregator');
- } else {
- $qb->groupBy('locationtype_aggregator');
- }
- }
-
- public function applyOn(): string
- {
- return Declarations::ACTIVITY_ACP;
- }
-
-}
\ No newline at end of file
+}
diff --git a/src/Bundle/ChillActivityBundle/Export/Aggregator/ACPAggregators/UserScopeAggregator.php b/src/Bundle/ChillActivityBundle/Export/Aggregator/ACPAggregators/UserScopeAggregator.php
index 4d6cef24a..faaa08b8e 100644
--- a/src/Bundle/ChillActivityBundle/Export/Aggregator/ACPAggregators/UserScopeAggregator.php
+++ b/src/Bundle/ChillActivityBundle/Export/Aggregator/ACPAggregators/UserScopeAggregator.php
@@ -1,5 +1,12 @@
translatableStringHelper = $translatableStringHelper;
}
+ public function addRole(): ?string
+ {
+ return null;
+ }
+
+ public function alterQuery(QueryBuilder $qb, $data)
+ {
+ if (!in_array('actuser', $qb->getAllAliases(), true)) {
+ $qb->join('activity.user', 'actuser');
+ }
+
+ $qb->addSelect('IDENTITY(actuser.mainScope) AS userscope_aggregator');
+
+ $groupBy = $qb->getDQLPart('groupBy');
+
+ if (!empty($groupBy)) {
+ $qb->addGroupBy('userscope_aggregator');
+ } else {
+ $qb->groupBy('userscope_aggregator');
+ }
+ }
+
+ public function applyOn(): string
+ {
+ return Declarations::ACTIVITY_ACP;
+ }
+
+ public function buildForm(FormBuilderInterface $builder)
+ {
+ // no form
+ }
+
public function getLabels($key, array $values, $data)
{
return function ($value): string {
- if ($value === '_header') {
+ if ('_header' === $value) {
return 'Scope';
}
@@ -46,41 +85,8 @@ class UserScopeAggregator implements AggregatorInterface
return ['userscope_aggregator'];
}
- public function buildForm(FormBuilderInterface $builder)
- {
- // no form
- }
-
public function getTitle(): string
{
return 'Group activity by userscope';
}
-
- public function addRole()
- {
- return null;
- }
-
- public function alterQuery(QueryBuilder $qb, $data)
- {
- if (!in_array('user', $qb->getAllAliases())) {
- $qb->join('activity.user', 'user');
- }
-
- $qb->addSelect('IDENTITY(user.mainScope) AS userscope_aggregator');
-
- $groupBy = $qb->getDQLPart('groupBy');
-
- if (!empty($groupBy)) {
- $qb->addGroupBy('userscope_aggregator');
- } else {
- $qb->groupBy('userscope_aggregator');
- }
- }
-
- public function applyOn(): string
- {
- return Declarations::ACTIVITY_ACP;
- }
-
-}
\ No newline at end of file
+}
diff --git a/src/Bundle/ChillActivityBundle/Export/Aggregator/ActivityTypeAggregator.php b/src/Bundle/ChillActivityBundle/Export/Aggregator/ActivityTypeAggregator.php
index cedd2df8c..5c285ca3e 100644
--- a/src/Bundle/ChillActivityBundle/Export/Aggregator/ActivityTypeAggregator.php
+++ b/src/Bundle/ChillActivityBundle/Export/Aggregator/ActivityTypeAggregator.php
@@ -13,14 +13,13 @@ namespace Chill\ActivityBundle\Export\Aggregator;
use Chill\ActivityBundle\Export\Declarations;
use Chill\ActivityBundle\Repository\ActivityTypeRepository;
-use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter;
use Chill\MainBundle\Export\AggregatorInterface;
use Chill\MainBundle\Templating\TranslatableStringHelperInterface;
use Closure;
use Doctrine\ORM\Query\Expr\Join;
use Doctrine\ORM\QueryBuilder;
use Symfony\Component\Form\FormBuilderInterface;
-use Symfony\Component\Security\Core\Role\Role;
+use function in_array;
class ActivityTypeAggregator implements AggregatorInterface
{
@@ -38,15 +37,15 @@ class ActivityTypeAggregator implements AggregatorInterface
$this->translatableStringHelper = $translatableStringHelper;
}
- public function addRole()
+ public function addRole(): ?string
{
- return new Role(ActivityStatsVoter::STATS);
+ return null;
}
public function alterQuery(QueryBuilder $qb, $data)
{
- if (!in_array('type', $qb->getAllAliases())) {
- $qb->join('activity.activityType', 'type');
+ if (!in_array('acttype', $qb->getAllAliases(), true)) {
+ $qb->join('activity.activityType', 'acttype');
}
$qb->addSelect(sprintf('IDENTITY(activity.activityType) AS %s', self::KEY));
@@ -95,23 +94,4 @@ class ActivityTypeAggregator implements AggregatorInterface
{
return 'Aggregate by activity type';
}
-
- /**
- * Check if a join between Activity and another alias.
- *
- * @param Join[] $joins
- * @param string $alias the alias to search for
- *
- * @return bool
- */
- private function checkJoinAlreadyDefined(array $joins, $alias)
- {
- foreach ($joins as $join) {
- if ($join->getAlias() === $alias) {
- return true;
- }
- }
-
- return false;
- }
}
diff --git a/src/Bundle/ChillActivityBundle/Export/Aggregator/ActivityUserAggregator.php b/src/Bundle/ChillActivityBundle/Export/Aggregator/ActivityUserAggregator.php
index 675098c60..39c7c52cb 100644
--- a/src/Bundle/ChillActivityBundle/Export/Aggregator/ActivityUserAggregator.php
+++ b/src/Bundle/ChillActivityBundle/Export/Aggregator/ActivityUserAggregator.php
@@ -12,23 +12,21 @@ declare(strict_types=1);
namespace Chill\ActivityBundle\Export\Aggregator;
use Chill\ActivityBundle\Export\Declarations;
-use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter;
use Chill\MainBundle\Export\AggregatorInterface;
use Chill\MainBundle\Repository\UserRepository;
use Chill\MainBundle\Templating\Entity\UserRender;
use Closure;
use Doctrine\ORM\QueryBuilder;
use Symfony\Component\Form\FormBuilderInterface;
-use Symfony\Component\Security\Core\Role\Role;
class ActivityUserAggregator implements AggregatorInterface
{
public const KEY = 'activity_user_id';
- private UserRepository $userRepository;
-
private UserRender $userRender;
+ private UserRepository $userRepository;
+
public function __construct(
UserRepository $userRepository,
UserRender $userRender
@@ -37,9 +35,9 @@ class ActivityUserAggregator implements AggregatorInterface
$this->userRender = $userRender;
}
- public function addRole()
+ public function addRole(): ?string
{
- return new Role(ActivityStatsVoter::STATS);
+ return null;
}
public function alterQuery(QueryBuilder $qb, $data)
diff --git a/src/Bundle/ChillActivityBundle/Export/Aggregator/PersonAggregators/ActivityReasonAggregator.php b/src/Bundle/ChillActivityBundle/Export/Aggregator/PersonAggregators/ActivityReasonAggregator.php
index 8db93265d..9d7cd3116 100644
--- a/src/Bundle/ChillActivityBundle/Export/Aggregator/PersonAggregators/ActivityReasonAggregator.php
+++ b/src/Bundle/ChillActivityBundle/Export/Aggregator/PersonAggregators/ActivityReasonAggregator.php
@@ -14,7 +14,6 @@ namespace Chill\ActivityBundle\Export\Aggregator\PersonAggregators;
use Chill\ActivityBundle\Export\Declarations;
use Chill\ActivityBundle\Repository\ActivityReasonCategoryRepository;
use Chill\ActivityBundle\Repository\ActivityReasonRepository;
-use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter;
use Chill\MainBundle\Export\AggregatorInterface;
use Chill\MainBundle\Export\ExportElementValidatedInterface;
use Chill\MainBundle\Templating\TranslatableStringHelper;
@@ -24,7 +23,6 @@ use Doctrine\ORM\QueryBuilder;
use RuntimeException;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\FormBuilderInterface;
-use Symfony\Component\Security\Core\Role\Role;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
use function array_key_exists;
@@ -48,9 +46,9 @@ class ActivityReasonAggregator implements AggregatorInterface, ExportElementVali
$this->translatableStringHelper = $translatableStringHelper;
}
- public function addRole()
+ public function addRole(): ?string
{
- return new Role(ActivityStatsVoter::STATS);
+ return null;
}
public function alterQuery(QueryBuilder $qb, $data)
@@ -69,29 +67,15 @@ class ActivityReasonAggregator implements AggregatorInterface, ExportElementVali
$qb->addSelect($elem . ' as ' . $alias);
// make a jointure only if needed
- $join = $qb->getDQLPart('join');
-
- if (
- (
- array_key_exists('activity', $join)
- && !$this->checkJoinAlreadyDefined($join['activity'], 'reasons')
- )
- || (!array_key_exists('activity', $join))
- ) {
- $qb->add(
- 'join',
- [
- 'activity' => new Join(Join::INNER_JOIN, 'activity.reasons', 'reasons'),
- ],
- true
- );
+ if (!in_array( 'actreasons', $qb->getAllAliases(), true)) {
+ $qb->innerJoin('activity.reasons', 'actreasons');
}
// join category if necessary
if ('activity_categories_id' === $alias) {
// add join only if needed
- if (!$this->checkJoinAlreadyDefined($qb->getDQLPart('join')['activity'], 'category')) {
- $qb->join('reasons.category', 'category');
+ if (!in_array('actreasoncat', $qb->getAllAliases(), true)) {
+ $qb->join('actreasons.category', 'actreasoncat');
}
}
@@ -195,23 +179,4 @@ class ActivityReasonAggregator implements AggregatorInterface, ExportElementVali
->addViolation();
}
}
-
- /**
- * Check if a join between Activity and another alias.
- *
- * @param Join[] $joins
- * @param string $alias the alias to search for
- *
- * @return bool
- */
- private function checkJoinAlreadyDefined(array $joins, $alias)
- {
- foreach ($joins as $join) {
- if ($join->getAlias() === $alias) {
- return true;
- }
- }
-
- return false;
- }
}
diff --git a/src/Bundle/ChillActivityBundle/Export/Declarations.php b/src/Bundle/ChillActivityBundle/Export/Declarations.php
index 7a5b47028..82f01bcb2 100644
--- a/src/Bundle/ChillActivityBundle/Export/Declarations.php
+++ b/src/Bundle/ChillActivityBundle/Export/Declarations.php
@@ -18,7 +18,7 @@ abstract class Declarations
{
public const ACTIVITY = 'activity';
- public const ACTIVITY_ACP = "activity_linked_to_acp";
+ public const ACTIVITY_ACP = 'activity_linked_to_acp';
- public const ACTIVITY_PERSON = "activity_linked_to_person";
+ public const ACTIVITY_PERSON = 'activity_linked_to_person';
}
diff --git a/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/AvgActivityDuration.php b/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/AvgActivityDuration.php
index 1ae5d1830..b2346b8fd 100644
--- a/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/AvgActivityDuration.php
+++ b/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/AvgActivityDuration.php
@@ -1,5 +1,14 @@
getQuery()->getResult(Query::HYDRATE_SCALAR);
}
+ public function getTitle(): string
+ {
+ return 'Average activity linked to an accompanying period duration';
+ }
+
public function getType(): string
{
return Declarations::ACTIVITY;
@@ -73,17 +84,16 @@ class AvgActivityDuration implements ExportInterface, GroupedExportInterface
public function initiateQuery(array $requiredModifiers, array $acl, array $data = [])
{
$qb = $this->repository->createQueryBuilder('activity')
- ->join('activity.accompanyingPeriod', 'acp')
- ;
+ ->join('activity.accompanyingPeriod', 'actacp');
$qb->select('AVG(activity.durationTime) as export_avg_activity_duration');
return $qb;
}
- public function requiredRole(): Role
+ public function requiredRole(): string
{
- return new Role(ActivityStatsVoter::STATS);
+ return ActivityStatsVoter::STATS;
}
public function supportsModifiers(): array
@@ -91,13 +101,7 @@ class AvgActivityDuration implements ExportInterface, GroupedExportInterface
return [
Declarations::ACTIVITY,
Declarations::ACTIVITY_ACP,
- //PersonDeclarations::ACP_TYPE,
+ PersonDeclarations::ACP_TYPE,
];
}
-
- public function getGroup(): string
- {
- return 'Exports of activities linked to an accompanying period';
- }
-
-}
\ No newline at end of file
+}
diff --git a/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/AvgActivityVisitDuration.php b/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/AvgActivityVisitDuration.php
index b03378b16..0195992fe 100644
--- a/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/AvgActivityVisitDuration.php
+++ b/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/AvgActivityVisitDuration.php
@@ -1,5 +1,14 @@
getQuery()->getResult(Query::HYDRATE_SCALAR);
}
+ public function getTitle(): string
+ {
+ return 'Average activity linked to an accompanying period visit duration';
+ }
+
public function getType(): string
{
return Declarations::ACTIVITY;
@@ -73,17 +84,16 @@ class AvgActivityVisitDuration implements ExportInterface, GroupedExportInterfac
public function initiateQuery(array $requiredModifiers, array $acl, array $data = [])
{
$qb = $this->repository->createQueryBuilder('activity')
- ->join('activity.accompanyingPeriod', 'acp')
- ;
+ ->join('activity.accompanyingPeriod', 'actacp');
$qb->select('AVG(activity.travelTime) as export_avg_activity_visit_duration');
return $qb;
}
- public function requiredRole(): Role
+ public function requiredRole(): string
{
- return new Role(ActivityStatsVoter::STATS);
+ return ActivityStatsVoter::STATS;
}
public function supportsModifiers(): array
@@ -91,13 +101,7 @@ class AvgActivityVisitDuration implements ExportInterface, GroupedExportInterfac
return [
Declarations::ACTIVITY,
Declarations::ACTIVITY_ACP,
- //PersonDeclarations::ACP_TYPE,
+ PersonDeclarations::ACP_TYPE,
];
}
-
- public function getGroup(): string
- {
- return 'Exports of activities linked to an accompanying period';
- }
-
-}
\ No newline at end of file
+}
diff --git a/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/CountActivity.php b/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/CountActivity.php
index 55c0a1974..e4202c33a 100644
--- a/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/CountActivity.php
+++ b/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/CountActivity.php
@@ -23,14 +23,13 @@ use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Query;
use LogicException;
use Symfony\Component\Form\FormBuilderInterface;
-use Symfony\Component\Security\Core\Role\Role;
class CountActivity implements ExportInterface, GroupedExportInterface
{
protected EntityRepository $repository;
public function __construct(
- EntityManagerInterface $em
+ EntityManagerInterface $em
) {
$this->repository = $em->getRepository(Activity::class);
}
@@ -49,6 +48,11 @@ class CountActivity implements ExportInterface, GroupedExportInterface
return 'Count activities linked to an accompanying period by various parameters.';
}
+ public function getGroup(): string
+ {
+ return 'Exports of activities linked to an accompanying period';
+ }
+
public function getLabels($key, array $values, $data)
{
if ('export_count_activity' !== $key) {
@@ -80,18 +84,20 @@ class CountActivity implements ExportInterface, GroupedExportInterface
public function initiateQuery(array $requiredModifiers, array $acl, array $data = [])
{
- $qb = $this->repository->createQueryBuilder('activity')
- ->join('activity.accompanyingPeriod', 'acp')
- ;
+ $qb = $this->repository->createQueryBuilder('activity');
+
+ if (!in_array('actacp', $qb->getAllAliases(), true)) {
+ $qb->join('activity.accompanyingPeriod', 'actacp');
+ }
$qb->select('COUNT(activity.id) as export_count_activity');
-
+
return $qb;
}
- public function requiredRole(): Role
+ public function requiredRole(): string
{
- return new Role(ActivityStatsVoter::STATS);
+ return ActivityStatsVoter::STATS;
}
public function supportsModifiers(): array
@@ -99,12 +105,7 @@ class CountActivity implements ExportInterface, GroupedExportInterface
return [
Declarations::ACTIVITY,
Declarations::ACTIVITY_ACP,
- //PersonDeclarations::ACP_TYPE,
+ PersonDeclarations::ACP_TYPE,
];
}
-
- public function getGroup(): string
- {
- return 'Exports of activities linked to an accompanying period';
- }
}
diff --git a/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/SumActivityDuration.php b/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/SumActivityDuration.php
index 3ab192702..2e87623ef 100644
--- a/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/SumActivityDuration.php
+++ b/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/SumActivityDuration.php
@@ -1,5 +1,14 @@
getQuery()->getResult(Query::HYDRATE_SCALAR);
}
+ public function getTitle(): string
+ {
+ return 'Sum activity linked to an accompanying period duration';
+ }
+
public function getType(): string
{
return Declarations::ACTIVITY;
@@ -72,18 +83,20 @@ class SumActivityDuration implements ExportInterface, GroupedExportInterface
public function initiateQuery(array $requiredModifiers, array $acl, array $data = [])
{
- $qb = $this->repository->createQueryBuilder('activity')
- ->join('activity.accompanyingPeriod', 'acp')
- ;
+ $qb = $this->repository->createQueryBuilder('activity');
+
+ if (!in_array('actacp', $qb->getAllAliases(), true)) {
+ $qb->join('activity.accompanyingPeriod', 'actacp');
+ }
$qb->select('SUM(activity.durationTime) as export_sum_activity_duration');
return $qb;
}
- public function requiredRole(): Role
+ public function requiredRole(): string
{
- return new Role(ActivityStatsVoter::STATS);
+ return ActivityStatsVoter::STATS;
}
public function supportsModifiers(): array
@@ -91,13 +104,7 @@ class SumActivityDuration implements ExportInterface, GroupedExportInterface
return [
Declarations::ACTIVITY,
Declarations::ACTIVITY_ACP,
- //PersonDeclarations::ACP_TYPE,
+ PersonDeclarations::ACP_TYPE,
];
}
-
- public function getGroup(): string
- {
- return 'Exports of activities linked to an accompanying period';
- }
-
-}
\ No newline at end of file
+}
diff --git a/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/SumActivityVisitDuration.php b/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/SumActivityVisitDuration.php
index 452fc4de7..5bb6d542e 100644
--- a/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/SumActivityVisitDuration.php
+++ b/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/SumActivityVisitDuration.php
@@ -1,5 +1,14 @@
getQuery()->getResult(Query::HYDRATE_SCALAR);
}
+ public function getTitle(): string
+ {
+ return 'Sum activity linked to an accompanying period visit duration';
+ }
+
public function getType(): string
{
return Declarations::ACTIVITY;
@@ -72,18 +83,20 @@ class SumActivityVisitDuration implements ExportInterface, GroupedExportInterfac
public function initiateQuery(array $requiredModifiers, array $acl, array $data = [])
{
- $qb = $this->repository->createQueryBuilder('activity')
- ->join('activity.accompanyingPeriod', 'acp')
- ;
+ $qb = $this->repository->createQueryBuilder('activity');
+
+ if (!in_array('actacp', $qb->getAllAliases(), true)) {
+ $qb->join('activity.accompanyingPeriod', 'actacp');
+ }
$qb->select('SUM(activity.travelTime) as export_sum_activity_visit_duration');
return $qb;
}
- public function requiredRole(): Role
+ public function requiredRole(): string
{
- return new Role(ActivityStatsVoter::STATS);
+ return ActivityStatsVoter::STATS;
}
public function supportsModifiers(): array
@@ -91,12 +104,7 @@ class SumActivityVisitDuration implements ExportInterface, GroupedExportInterfac
return [
Declarations::ACTIVITY,
Declarations::ACTIVITY_ACP,
- //PersonDeclarations::ACP_TYPE,
+ PersonDeclarations::ACP_TYPE,
];
}
-
- public function getGroup(): string
- {
- return 'Exports of activities linked to an accompanying period';
- }
-}
\ No newline at end of file
+}
diff --git a/src/Bundle/ChillActivityBundle/Export/Export/LinkedToPerson/CountActivity.php b/src/Bundle/ChillActivityBundle/Export/Export/LinkedToPerson/CountActivity.php
index 75d3122c3..398fb14bb 100644
--- a/src/Bundle/ChillActivityBundle/Export/Export/LinkedToPerson/CountActivity.php
+++ b/src/Bundle/ChillActivityBundle/Export/Export/LinkedToPerson/CountActivity.php
@@ -11,17 +11,16 @@ declare(strict_types=1);
namespace Chill\ActivityBundle\Export\Export\LinkedToPerson;
+use Chill\ActivityBundle\Export\Declarations;
use Chill\ActivityBundle\Repository\ActivityRepository;
use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter;
use Chill\MainBundle\Export\ExportInterface;
use Chill\MainBundle\Export\FormatterInterface;
use Chill\MainBundle\Export\GroupedExportInterface;
-use Chill\ActivityBundle\Export\Declarations;
use Chill\PersonBundle\Export\Declarations as PersonDeclarations;
use Doctrine\ORM\Query;
use LogicException;
use Symfony\Component\Form\FormBuilderInterface;
-use Symfony\Component\Security\Core\Role\Role;
class CountActivity implements ExportInterface, GroupedExportInterface
{
@@ -47,6 +46,11 @@ class CountActivity implements ExportInterface, GroupedExportInterface
return 'Count activities linked to a person by various parameters.';
}
+ public function getGroup(): string
+ {
+ return 'Exports of activities linked to a person';
+ }
+
public function getLabels($key, array $values, $data)
{
if ('export_count_activity' !== $key) {
@@ -80,23 +84,24 @@ class CountActivity implements ExportInterface, GroupedExportInterface
{
$centers = array_map(static fn ($el) => $el['center'], $acl);
- $qb = $this->activityRepository->createQueryBuilder('activity')
- ->join('activity.person', 'person')
- ;
+ $qb = $this->activityRepository->createQueryBuilder('activity');
+
+ if (!in_array('actperson', $qb->getAllAliases(), true)) {
+ $qb->join('activity.person', 'actperson');
+ }
$qb->select('COUNT(activity.id) as export_count_activity');
$qb
->where($qb->expr()->in('person.center', ':centers'))
- ->setParameter('centers', $centers)
- ;
+ ->setParameter('centers', $centers);
return $qb;
}
- public function requiredRole()
+ public function requiredRole(): string
{
- return new Role(ActivityStatsVoter::STATS);
+ return ActivityStatsVoter::STATS;
}
public function supportsModifiers()
@@ -107,9 +112,4 @@ class CountActivity implements ExportInterface, GroupedExportInterface
//PersonDeclarations::PERSON_TYPE,
];
}
-
- public function getGroup(): string
- {
- return 'Exports of activities linked to a person';
- }
}
diff --git a/src/Bundle/ChillActivityBundle/Export/Export/LinkedToPerson/ListActivity.php b/src/Bundle/ChillActivityBundle/Export/Export/LinkedToPerson/ListActivity.php
index 21a68fb93..17b9bd687 100644
--- a/src/Bundle/ChillActivityBundle/Export/Export/LinkedToPerson/ListActivity.php
+++ b/src/Bundle/ChillActivityBundle/Export/Export/LinkedToPerson/ListActivity.php
@@ -12,24 +12,23 @@ declare(strict_types=1);
namespace Chill\ActivityBundle\Export\Export\LinkedToPerson;
use Chill\ActivityBundle\Entity\ActivityReason;
+use Chill\ActivityBundle\Export\Declarations;
use Chill\ActivityBundle\Repository\ActivityRepository;
use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter;
use Chill\MainBundle\Export\FormatterInterface;
use Chill\MainBundle\Export\GroupedExportInterface;
use Chill\MainBundle\Export\ListInterface;
use Chill\MainBundle\Templating\TranslatableStringHelperInterface;
+use Chill\PersonBundle\Export\Declarations as PersonDeclarations;
use DateTime;
use Doctrine\DBAL\Exception\InvalidArgumentException;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Query;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\FormBuilderInterface;
-use Symfony\Component\Security\Core\Role\Role;
use Symfony\Component\Validator\Constraints\Callback;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
-use Chill\ActivityBundle\Export\Declarations;
-use Chill\PersonBundle\Export\Declarations as PersonDeclarations;
use function array_key_exists;
use function count;
@@ -100,6 +99,11 @@ class ListActivity implements ListInterface, GroupedExportInterface
return 'List activities linked to a person description';
}
+ public function getGroup(): string
+ {
+ return 'Exports of activities linked to a person';
+ }
+
public function getLabels($key, array $values, $data)
{
switch ($key) {
@@ -206,9 +210,9 @@ class ListActivity implements ListInterface, GroupedExportInterface
$qb
->from('ChillActivityBundle:Activity', 'activity')
- ->join('activity.person', 'person')
- ->join('person.center', 'center')
- ->andWhere('center IN (:authorized_centers)')
+ ->join('activity.person', 'actperson')
+ ->join('actperson.center', 'actcenter')
+ ->andWhere('actcenter IN (:authorized_centers)')
->setParameter('authorized_centers', $centers);
foreach ($this->fields as $f) {
@@ -235,8 +239,8 @@ class ListActivity implements ListInterface, GroupedExportInterface
break;
case 'user_username':
- $qb->join('activity.user', 'user');
- $qb->addSelect('user.username AS user_username');
+ $qb->join('activity.user', 'actuser');
+ $qb->addSelect('actuser.username AS user_username');
break;
@@ -270,9 +274,9 @@ class ListActivity implements ListInterface, GroupedExportInterface
return $qb;
}
- public function requiredRole()
+ public function requiredRole(): string
{
- return new Role(ActivityStatsVoter::LISTS);
+ return ActivityStatsVoter::LISTS;
}
public function supportsModifiers()
@@ -283,9 +287,4 @@ class ListActivity implements ListInterface, GroupedExportInterface
//PersonDeclarations::PERSON_TYPE,
];
}
-
- public function getGroup(): string
- {
- return 'Exports of activities linked to a person';
- }
}
diff --git a/src/Bundle/ChillActivityBundle/Export/Export/LinkedToPerson/StatActivityDuration.php b/src/Bundle/ChillActivityBundle/Export/Export/LinkedToPerson/StatActivityDuration.php
index 5fae246f8..bcb4da05d 100644
--- a/src/Bundle/ChillActivityBundle/Export/Export/LinkedToPerson/StatActivityDuration.php
+++ b/src/Bundle/ChillActivityBundle/Export/Export/LinkedToPerson/StatActivityDuration.php
@@ -11,6 +11,7 @@ declare(strict_types=1);
namespace Chill\ActivityBundle\Export\Export\LinkedToPerson;
+use Chill\ActivityBundle\Export\Declarations;
use Chill\ActivityBundle\Repository\ActivityRepository;
use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter;
use Chill\MainBundle\Entity\Center;
@@ -18,11 +19,9 @@ use Chill\MainBundle\Export\ExportInterface;
use Chill\MainBundle\Export\FormatterInterface;
use Chill\MainBundle\Export\GroupedExportInterface;
use Chill\PersonBundle\Export\Declarations as PersonDeclarations;
-use Chill\ActivityBundle\Export\Declarations;
use Doctrine\ORM\Query;
use LogicException;
use Symfony\Component\Form\FormBuilderInterface;
-use Symfony\Component\Security\Core\Role\Role;
/**
* This export allow to compute stats on activity duration.
@@ -67,6 +66,11 @@ class StatActivityDuration implements ExportInterface, GroupedExportInterface
}
}
+ public function getGroup(): string
+ {
+ return 'Exports of activities linked to a person';
+ }
+
public function getLabels($key, array $values, $data)
{
if ('export_stat_activity' !== $key) {
@@ -116,15 +120,15 @@ class StatActivityDuration implements ExportInterface, GroupedExportInterface
}
return $qb->select($select)
- ->join('activity.person', 'person')
- ->join('person.center', 'center')
- ->where($qb->expr()->in('center', ':centers'))
+ ->join('activity.person', 'actperson')
+ ->join('actperson.center', 'actcenter')
+ ->where($qb->expr()->in('actcenter', ':centers'))
->setParameter(':centers', $centers);
}
- public function requiredRole()
+ public function requiredRole(): string
{
- return new Role(ActivityStatsVoter::STATS);
+ return ActivityStatsVoter::STATS;
}
public function supportsModifiers()
@@ -135,9 +139,4 @@ class StatActivityDuration implements ExportInterface, GroupedExportInterface
//PersonDeclarations::PERSON_TYPE,
];
}
-
- public function getGroup(): string
- {
- return 'Exports of activities linked to a person';
- }
}
diff --git a/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/BySocialActionFilter.php b/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/BySocialActionFilter.php
index 58d77c73e..5737220b2 100644
--- a/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/BySocialActionFilter.php
+++ b/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/BySocialActionFilter.php
@@ -1,17 +1,25 @@
actionRender = $actionRender;
}
+ public function addRole(): ?string
+ {
+ return null;
+ }
+
+ public function alterQuery(QueryBuilder $qb, $data)
+ {
+ $where = $qb->getDQLPart('where');
+
+ if (!in_array('actsocialaction', $qb->getAllAliases(), true)) {
+ $qb->join('activity.socialActions', 'actsocialaction');
+ }
+
+ $clause = $qb->expr()->in('actsocialaction.id', ':socialactions');
+
+ if ($where instanceof Andx) {
+ $where->add($clause);
+ } else {
+ $where = $qb->expr()->andX($clause);
+ }
+
+ $qb->add('where', $where);
+ $qb->setParameter('socialactions', $data['accepted_socialactions']);
+ }
+
+ public function applyOn(): string
+ {
+ return Declarations::ACTIVITY_ACP;
+ }
+
public function buildForm(FormBuilderInterface $builder)
{
$builder->add('accepted_socialactions', EntityType::class, [
@@ -34,11 +72,6 @@ class BySocialActionFilter implements FilterInterface
]);
}
- public function getTitle(): string
- {
- return 'Filter activity by linked socialaction';
- }
-
public function describeAction($data, $format = 'string'): array
{
$actions = [];
@@ -48,38 +81,12 @@ class BySocialActionFilter implements FilterInterface
}
return ['Filtered activity by linked socialaction: only %actions%', [
- '%actions%' => implode(", ou ", $actions)
+ '%actions%' => implode(', ou ', $actions),
]];
}
- public function addRole()
+ public function getTitle(): string
{
- return null;
+ return 'Filter activity by linked socialaction';
}
-
- public function alterQuery(QueryBuilder $qb, $data)
- {
- $where = $qb->getDQLPart('where');
-
- if (!in_array('socialaction', $qb->getAllAliases())) {
- $qb->join('activity.socialActions', 'socialaction');
- }
-
- $clause = $qb->expr()->in('socialaction.id', ':socialactions');
-
- if ($where instanceof Andx) {
- $where->add($clause);
- } else {
- $where = $qb->expr()->andX($clause);
- }
-
- $qb->add('where', $where);
- $qb->setParameter('socialactions', $data['accepted_socialactions']);
- }
-
- public function applyOn(): string
- {
- return Declarations::ACTIVITY_ACP;
- }
-
-}
\ No newline at end of file
+}
diff --git a/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/BySocialIssueFilter.php b/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/BySocialIssueFilter.php
index 052b780ff..1a9fdb519 100644
--- a/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/BySocialIssueFilter.php
+++ b/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/BySocialIssueFilter.php
@@ -1,17 +1,25 @@
issueRender = $issueRender;
}
- public function buildForm(FormBuilderInterface $builder)
- {
- $builder->add('accepted_socialissues', EntityType::class, [
- 'class' => SocialIssue::class,
- 'choice_label' => function(SocialIssue $si) {
- return $this->issueRender->renderString($si, []);
- },
- 'multiple' => true,
- 'expanded' => true,
- ]);
- }
-
- public function getTitle(): string
- {
- return 'Filter activity by linked socialissue';
- }
-
- public function describeAction($data, $format = 'string'): array
- {
- $issues = [];
-
- foreach ($data['accepted_socialissues'] as $si) {
- $issues[] = $this->issueRender->renderString($si, []);
- }
-
- return ['Filtered activity by linked socialissue: only %issues%', [
- '%issues%' => implode(", ou ", $issues)
- ]];
- }
-
- public function addRole()
+ public function addRole(): ?string
{
return null;
}
@@ -61,11 +39,11 @@ class BySocialIssueFilter implements FilterInterface
{
$where = $qb->getDQLPart('where');
- if (!in_array('socialissue', $qb->getAllAliases())) {
- $qb->join('activity.socialIssues', 'socialissue');
+ if (!in_array('actsocialissue', $qb->getAllAliases(), true)) {
+ $qb->join('activity.socialIssues', 'actsocialissue');
}
- $clause = $qb->expr()->in('socialissue.id', ':socialissues');
+ $clause = $qb->expr()->in('actsocialissue.id', ':socialissues');
if ($where instanceof Andx) {
$where->add($clause);
@@ -77,9 +55,38 @@ class BySocialIssueFilter implements FilterInterface
$qb->setParameter('socialissues', $data['accepted_socialissues']);
}
- public function applyOn(): string
+ public function applyOn(): string
{
return Declarations::ACTIVITY_ACP;
}
-}
\ No newline at end of file
+ public function buildForm(FormBuilderInterface $builder)
+ {
+ $builder->add('accepted_socialissues', EntityType::class, [
+ 'class' => SocialIssue::class,
+ 'choice_label' => function (SocialIssue $si) {
+ return $this->issueRender->renderString($si, []);
+ },
+ 'multiple' => true,
+ 'expanded' => true,
+ ]);
+ }
+
+ public function describeAction($data, $format = 'string'): array
+ {
+ $issues = [];
+
+ foreach ($data['accepted_socialissues'] as $si) {
+ $issues[] = $this->issueRender->renderString($si, []);
+ }
+
+ return ['Filtered activity by linked socialissue: only %issues%', [
+ '%issues%' => implode(', ou ', $issues),
+ ]];
+ }
+
+ public function getTitle(): string
+ {
+ return 'Filter activity by linked socialissue';
+ }
+}
diff --git a/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/ByUserFilter.php b/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/ByUserFilter.php
index b128b03aa..19ddee3ca 100644
--- a/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/ByUserFilter.php
+++ b/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/ByUserFilter.php
@@ -1,17 +1,25 @@
userRender = $userRender;
}
+ public function addRole(): ?string
+ {
+ return null;
+ }
+
+ public function alterQuery(QueryBuilder $qb, $data)
+ {
+ $where = $qb->getDQLPart('where');
+
+ if (!in_array('actusers', $qb->getAllAliases(), true)) {
+ $qb->join('activity.users', 'actusers');
+ }
+
+ $clause = $qb->expr()->in('actusers.id', ':users');
+
+ if ($where instanceof Andx) {
+ $where->add($clause);
+ } else {
+ $where = $qb->expr()->andX($clause);
+ }
+
+ $qb->add('where', $where);
+ $qb->setParameter('users', $data['accepted_users']);
+ }
+
+ public function applyOn(): string
+ {
+ return Declarations::ACTIVITY_ACP;
+ }
+
public function buildForm(FormBuilderInterface $builder)
{
$builder->add('accepted_users', EntityType::class, [
@@ -34,11 +72,6 @@ class ByUserFilter implements FilterInterface
]);
}
- public function getTitle(): string
- {
- return 'Filter activity by linked users';
- }
-
public function describeAction($data, $format = 'string'): array
{
$users = [];
@@ -48,37 +81,12 @@ class ByUserFilter implements FilterInterface
}
return ['Filtered activity by linked users: only %users%', [
- '%users%' => implode(", ou ", $users)
+ '%users%' => implode(', ou ', $users),
]];
}
- public function addRole()
+ public function getTitle(): string
{
- return null;
+ return 'Filter activity by linked users';
}
-
- public function alterQuery(QueryBuilder $qb, $data)
- {
- $where = $qb->getDQLPart('where');
-
- if (!in_array('user', $qb->getAllAliases())) {
- $qb->join('activity.users', 'user');
- }
-
- $clause = $qb->expr()->in('user.id', ':users');
-
- if ($where instanceof Andx) {
- $where->add($clause);
- } else {
- $where = $qb->expr()->andX($clause);
- }
-
- $qb->add('where', $where);
- $qb->setParameter('users', $data['accepted_users']);
- }
-
- public function applyOn(): string
- {
- return Declarations::ACTIVITY_ACP;
- }
-}
\ No newline at end of file
+}
diff --git a/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/EmergencyFilter.php b/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/EmergencyFilter.php
index d7a823891..63650b452 100644
--- a/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/EmergencyFilter.php
+++ b/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/EmergencyFilter.php
@@ -1,11 +1,18 @@
false,
];
- private CONST DEFAULT_CHOICE = false;
+ private const DEFAULT_CHOICE = false;
private TranslatorInterface $translator;
@@ -28,36 +35,7 @@ class EmergencyFilter implements FilterInterface
$this->translator = $translator;
}
- public function buildForm(FormBuilderInterface $builder)
- {
- $builder->add('accepted_emergency', ChoiceType::class, [
- 'choices' => self::CHOICES,
- 'multiple' => false,
- 'expanded' => true,
- 'empty_data' => self::DEFAULT_CHOICE,
- 'data' => self::DEFAULT_CHOICE,
- ]);
- }
-
- public function getTitle(): string
- {
- return 'Filter activity by emergency';
- }
-
- public function describeAction($data, $format = 'string'): array
- {
- foreach (self::CHOICES as $k => $v) {
- if ($v === $data['accepted_emergency']) {
- $choice = $k;
- }
- }
-
- return ['Filtered activity by emergency: only %emergency%', [
- '%emergency%' => $this->translator->trans($choice)
- ]];
- }
-
- public function addRole()
+ public function addRole(): ?string
{
return null;
}
@@ -78,9 +56,37 @@ class EmergencyFilter implements FilterInterface
$qb->setParameter('emergency', $data['accepted_emergency']);
}
- public function applyOn(): string
+ public function applyOn(): string
{
- return Declarations::ACTIVITY_ACP;
+ return Declarations::ACTIVITY_ACP;
}
-}
\ No newline at end of file
+ public function buildForm(FormBuilderInterface $builder)
+ {
+ $builder->add('accepted_emergency', ChoiceType::class, [
+ 'choices' => self::CHOICES,
+ 'multiple' => false,
+ 'expanded' => true,
+ 'empty_data' => self::DEFAULT_CHOICE,
+ 'data' => self::DEFAULT_CHOICE,
+ ]);
+ }
+
+ public function describeAction($data, $format = 'string'): array
+ {
+ foreach (self::CHOICES as $k => $v) {
+ if ($v === $data['accepted_emergency']) {
+ $choice = $k;
+ }
+ }
+
+ return ['Filtered activity by emergency: only %emergency%', [
+ '%emergency%' => $this->translator->trans($choice),
+ ]];
+ }
+
+ public function getTitle(): string
+ {
+ return 'Filter activity by emergency';
+ }
+}
diff --git a/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/LocationTypeFilter.php b/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/LocationTypeFilter.php
index cf29f20f2..4ab27f043 100644
--- a/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/LocationTypeFilter.php
+++ b/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/LocationTypeFilter.php
@@ -1,17 +1,25 @@
translatableStringHelper = $translatableStringHelper;
}
+ public function addRole(): ?string
+ {
+ return null;
+ }
+
+ public function alterQuery(QueryBuilder $qb, $data)
+ {
+ if (!in_array('actloc', $qb->getAllAliases(), true)) {
+ $qb->join('activity.location', 'actloc');
+ }
+
+ $where = $qb->getDQLPart('where');
+ $clause = $qb->expr()->in('actloc.locationType', ':locationtype');
+
+ if ($where instanceof Andx) {
+ $where->add($clause);
+ } else {
+ $where = $qb->expr()->andX($clause);
+ }
+
+ $qb->add('where', $where);
+ $qb->setParameter('locationtype', $data['accepted_locationtype']);
+ }
+
+ public function applyOn(): string
+ {
+ return Declarations::ACTIVITY_ACP;
+ }
+
public function buildForm(FormBuilderInterface $builder)
{
$builder->add('accepted_locationtype', EntityType::class, [
'class' => LocationType::class,
- 'choice_label' => function(LocationType $type) {
+ 'choice_label' => function (LocationType $type) {
return $this->translatableStringHelper->localize($type->getTitle());
},
'multiple' => true,
@@ -34,11 +71,6 @@ class LocationTypeFilter implements FilterInterface
]);
}
- public function getTitle(): string
- {
- return 'Filter activity by locationtype';
- }
-
public function describeAction($data, $format = 'string'): array
{
$types = [];
@@ -50,36 +82,12 @@ class LocationTypeFilter implements FilterInterface
}
return ['Filtered activity by locationtype: only %types%', [
- '%types%' => implode(", ou ", $types)
+ '%types%' => implode(', ou ', $types),
]];
}
- public function addRole()
+ public function getTitle(): string
{
- return null;
+ return 'Filter activity by locationtype';
}
-
- public function alterQuery(QueryBuilder $qb, $data)
- {
- if (!in_array('location', $qb->getAllAliases())) {
- $qb->join('activity.location', 'location');
- }
-
- $where = $qb->getDQLPart('where');
- $clause = $qb->expr()->in('location.locationType', ':locationtype');
-
- if ($where instanceof Andx) {
- $where->add($clause);
- } else {
- $where = $qb->expr()->andX($clause);
- }
-
- $qb->add('where', $where);
- $qb->setParameter('locationtype', $data['accepted_locationtype']);
- }
-
- public function applyOn(): string
- {
- return Declarations::ACTIVITY_ACP;
- }
-}
\ No newline at end of file
+}
diff --git a/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/SentReceivedFilter.php b/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/SentReceivedFilter.php
index 409c974ac..98cb50e89 100644
--- a/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/SentReceivedFilter.php
+++ b/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/SentReceivedFilter.php
@@ -1,12 +1,19 @@
Activity::SENTRECEIVED_RECEIVED,
];
- private CONST DEFAULT_CHOICE = Activity::SENTRECEIVED_SENT;
+ private const DEFAULT_CHOICE = Activity::SENTRECEIVED_SENT;
private TranslatorInterface $translator;
@@ -29,32 +36,7 @@ class SentReceivedFilter implements FilterInterface
$this->translator = $translator;
}
- public function buildForm(FormBuilderInterface $builder)
- {
- $builder->add('accepted_sentreceived', ChoiceType::class, [
- 'choices' => self::CHOICES,
- 'multiple' => false,
- 'expanded' => true,
- 'empty_data' => self::DEFAULT_CHOICE,
- 'data' => self::DEFAULT_CHOICE,
- ]);
- }
-
- public function getTitle(): string
- {
- return 'Filter activity by sentreceived';
- }
-
- public function describeAction($data, $format = 'string'): array
- {
- $sentreceived = array_flip(self::CHOICES)[$data['accepted_sentreceived']];
-
- return ['Filtered activity by sentreceived: only %sentreceived%', [
- '%sentreceived%' => $this->translator->trans($sentreceived)
- ]];
- }
-
- public function addRole()
+ public function addRole(): ?string
{
return null;
}
@@ -75,8 +57,33 @@ class SentReceivedFilter implements FilterInterface
$qb->setParameter('sentreceived', $data['accepted_sentreceived']);
}
- public function applyOn(): string
+ public function applyOn(): string
{
- return Declarations::ACTIVITY_ACP;
+ return Declarations::ACTIVITY_ACP;
}
-}
\ No newline at end of file
+
+ public function buildForm(FormBuilderInterface $builder)
+ {
+ $builder->add('accepted_sentreceived', ChoiceType::class, [
+ 'choices' => self::CHOICES,
+ 'multiple' => false,
+ 'expanded' => true,
+ 'empty_data' => self::DEFAULT_CHOICE,
+ 'data' => self::DEFAULT_CHOICE,
+ ]);
+ }
+
+ public function describeAction($data, $format = 'string'): array
+ {
+ $sentreceived = array_flip(self::CHOICES)[$data['accepted_sentreceived']];
+
+ return ['Filtered activity by sentreceived: only %sentreceived%', [
+ '%sentreceived%' => $this->translator->trans($sentreceived),
+ ]];
+ }
+
+ public function getTitle(): string
+ {
+ return 'Filter activity by sentreceived';
+ }
+}
diff --git a/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/UserFilter.php b/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/UserFilter.php
index d1455ea89..b8d6d1a59 100644
--- a/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/UserFilter.php
+++ b/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/UserFilter.php
@@ -1,12 +1,19 @@
userRender = $userRender;
}
- public function buildForm(FormBuilderInterface $builder)
- {
- $builder->add('accepted_users', EntityType::class, [
- 'class' => User::class,
- 'choice_label' => function (User $u) {
- return $this->userRender->renderString($u, []);
- },
- 'multiple' => true,
- 'expanded' => true,
- 'label' => 'Creators'
- ]);
- }
-
- public function getTitle(): string
- {
- return 'Filter activity by user';
- }
-
- public function describeAction($data, $format = 'string'): array
- {
- $users = [];
-
- foreach ($data['accepted_users'] as $u) {
- $users[] = $this->userRender->renderString($u, []);
- }
-
- return ['Filtered activity by user: only %users%', [
- '%users%' => implode(", ou ", $users)
- ]];
- }
-
- public function addRole()
+ public function addRole(): ?string
{
return null;
}
@@ -74,9 +50,39 @@ class UserFilter implements FilterInterface
$qb->setParameter('users', $data['accepted_users']);
}
- public function applyOn(): string
+ public function applyOn(): string
{
- return Declarations::ACTIVITY_ACP;
+ return Declarations::ACTIVITY_ACP;
}
-}
\ No newline at end of file
+ public function buildForm(FormBuilderInterface $builder)
+ {
+ $builder->add('accepted_users', EntityType::class, [
+ 'class' => User::class,
+ 'choice_label' => function (User $u) {
+ return $this->userRender->renderString($u, []);
+ },
+ 'multiple' => true,
+ 'expanded' => true,
+ 'label' => 'Creators',
+ ]);
+ }
+
+ public function describeAction($data, $format = 'string'): array
+ {
+ $users = [];
+
+ foreach ($data['accepted_users'] as $u) {
+ $users[] = $this->userRender->renderString($u, []);
+ }
+
+ return ['Filtered activity by user: only %users%', [
+ '%users%' => implode(', ou ', $users),
+ ]];
+ }
+
+ public function getTitle(): string
+ {
+ return 'Filter activity by user';
+ }
+}
diff --git a/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/UserScopeFilter.php b/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/UserScopeFilter.php
index 987704ab8..c0cda26a4 100644
--- a/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/UserScopeFilter.php
+++ b/src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/UserScopeFilter.php
@@ -1,17 +1,25 @@
translatableStringHelper = $translatableStringHelper;
}
+ public function addRole(): ?string
+ {
+ return null;
+ }
+
+ public function alterQuery(QueryBuilder $qb, $data)
+ {
+ if (!in_array('actuser', $qb->getAllAliases(), true)) {
+ $qb->join('activity.user', 'actuser');
+ }
+
+ $where = $qb->getDQLPart('where');
+
+ $clause = $qb->expr()->in('actuser.mainScope', ':userscope');
+
+ if ($where instanceof Andx) {
+ $where->add($clause);
+ } else {
+ $where = $qb->expr()->andX($clause);
+ }
+
+ $qb->add('where', $where);
+ $qb->setParameter('userscope', $data['accepted_userscope']);
+ }
+
+ public function applyOn(): string
+ {
+ return Declarations::ACTIVITY_ACP;
+ }
+
public function buildForm(FormBuilderInterface $builder)
{
$builder->add('accepted_userscope', EntityType::class, [
@@ -32,15 +70,10 @@ class UserScopeFilter implements FilterInterface
);
},
'multiple' => true,
- 'expanded' => true
+ 'expanded' => true,
]);
}
- public function getTitle(): string
- {
- return 'Filter activity by userscope';
- }
-
public function describeAction($data, $format = 'string'): array
{
$scopes = [];
@@ -52,38 +85,12 @@ class UserScopeFilter implements FilterInterface
}
return ['Filtered activity by userscope: only %scopes%', [
- '%scopes%' => implode(", ou ", $scopes)
+ '%scopes%' => implode(', ou ', $scopes),
]];
}
- public function addRole()
+ public function getTitle(): string
{
- return null;
+ return 'Filter activity by userscope';
}
-
- public function alterQuery(QueryBuilder $qb, $data)
- {
- if (!in_array('user', $qb->getAllAliases())) {
- $qb->join('activity.user', 'user');
- }
-
- $where = $qb->getDQLPart('where');
-
- $clause = $qb->expr()->in('user.mainScope', ':userscope');
-
- if ($where instanceof Andx) {
- $where->add($clause);
- } else {
- $where = $qb->expr()->andX($clause);
- }
-
- $qb->add('where', $where);
- $qb->setParameter('userscope', $data['accepted_userscope']);
- }
-
- public function applyOn(): string
- {
- return Declarations::ACTIVITY_ACP;
- }
-
-}
\ No newline at end of file
+}
diff --git a/src/Bundle/ChillActivityBundle/Export/Filter/ActivityDateFilter.php b/src/Bundle/ChillActivityBundle/Export/Filter/ActivityDateFilter.php
index 4b20553af..864562cbf 100644
--- a/src/Bundle/ChillActivityBundle/Export/Filter/ActivityDateFilter.php
+++ b/src/Bundle/ChillActivityBundle/Export/Filter/ActivityDateFilter.php
@@ -33,7 +33,7 @@ class ActivityDateFilter implements FilterInterface
$this->translator = $translator;
}
- public function addRole()
+ public function addRole(): ?string
{
return null;
}
@@ -73,8 +73,7 @@ class ActivityDateFilter implements FilterInterface
->add('date_to', ChillDateType::class, [
'label' => 'Activities before this date',
'data' => new DateTime(),
- ])
- ;
+ ]);
$builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
/** @var \Symfony\Component\Form\FormInterface $filterForm */
diff --git a/src/Bundle/ChillActivityBundle/Export/Filter/ActivityTypeFilter.php b/src/Bundle/ChillActivityBundle/Export/Filter/ActivityTypeFilter.php
index 665515cb1..77d887fdf 100644
--- a/src/Bundle/ChillActivityBundle/Export/Filter/ActivityTypeFilter.php
+++ b/src/Bundle/ChillActivityBundle/Export/Filter/ActivityTypeFilter.php
@@ -14,7 +14,6 @@ namespace Chill\ActivityBundle\Export\Filter;
use Chill\ActivityBundle\Entity\ActivityType;
use Chill\ActivityBundle\Export\Declarations;
use Chill\ActivityBundle\Repository\ActivityTypeRepository;
-use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter;
use Chill\MainBundle\Export\ExportElementValidatedInterface;
use Chill\MainBundle\Export\FilterInterface;
use Chill\MainBundle\Templating\TranslatableStringHelperInterface;
@@ -23,7 +22,6 @@ use Doctrine\ORM\Query\Expr\Join;
use Doctrine\ORM\QueryBuilder;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\FormBuilderInterface;
-use Symfony\Component\Security\Core\Role\Role;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
use function count;
@@ -42,9 +40,9 @@ class ActivityTypeFilter implements ExportElementValidatedInterface, FilterInter
$this->activityTypeRepository = $activityTypeRepository;
}
- public function addRole()
+ public function addRole(): ?string
{
- return new Role(ActivityStatsVoter::STATS);
+ return null;
}
public function alterQuery(QueryBuilder $qb, $data)
@@ -104,23 +102,4 @@ class ActivityTypeFilter implements ExportElementValidatedInterface, FilterInter
->addViolation();
}
}
-
- /**
- * Check if a join between Activity and Reason is already defined.
- *
- * @param Join[] $joins
- * @param mixed $alias
- *
- * @return bool
- */
- private function checkJoinAlreadyDefined(array $joins, $alias)
- {
- foreach ($joins as $join) {
- if ($join->getAlias() === $alias) {
- return true;
- }
- }
-
- return false;
- }
}
diff --git a/src/Bundle/ChillActivityBundle/Export/Filter/PersonFilters/ActivityReasonFilter.php b/src/Bundle/ChillActivityBundle/Export/Filter/PersonFilters/ActivityReasonFilter.php
index c0845573a..6d78b3b38 100644
--- a/src/Bundle/ChillActivityBundle/Export/Filter/PersonFilters/ActivityReasonFilter.php
+++ b/src/Bundle/ChillActivityBundle/Export/Filter/PersonFilters/ActivityReasonFilter.php
@@ -14,7 +14,6 @@ namespace Chill\ActivityBundle\Export\Filter\PersonFilters;
use Chill\ActivityBundle\Entity\ActivityReason;
use Chill\ActivityBundle\Export\Declarations;
use Chill\ActivityBundle\Repository\ActivityReasonRepository;
-use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter;
use Chill\MainBundle\Export\ExportElementValidatedInterface;
use Chill\MainBundle\Export\FilterInterface;
use Chill\MainBundle\Templating\TranslatableStringHelper;
@@ -24,7 +23,6 @@ use Doctrine\ORM\Query\Expr\Join;
use Doctrine\ORM\QueryBuilder;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\FormBuilderInterface;
-use Symfony\Component\Security\Core\Role\Role;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
use function array_key_exists;
@@ -44,9 +42,9 @@ class ActivityReasonFilter implements ExportElementValidatedInterface, FilterInt
$this->activityReasonRepository = $activityReasonRepository;
}
- public function addRole()
+ public function addRole(): ?string
{
- return new Role(ActivityStatsVoter::STATS);
+ return null;
}
public function alterQuery(QueryBuilder $qb, $data)
@@ -54,20 +52,9 @@ class ActivityReasonFilter implements ExportElementValidatedInterface, FilterInt
$where = $qb->getDQLPart('where');
$join = $qb->getDQLPart('join');
$clause = $qb->expr()->in('reasons', ':selected_activity_reasons');
- //dump($join);
- // add a join to reasons only if needed
- if (
- (
- array_key_exists('activity', $join)
- && !$this->checkJoinAlreadyDefined($join['activity'], 'reasons')
- )
- || (!array_key_exists('activity', $join))
- ) {
- $qb->add(
- 'join',
- ['activity' => new Join(Join::INNER_JOIN, 'activity.reasons', 'reasons')],
- true
- );
+
+ if (!in_array('actreasons', $qb->getAllAliases(), true)) {
+ $qb->join('activity.reasons', 'actreasons');
}
if ($where instanceof Expr\Andx) {
@@ -125,21 +112,4 @@ class ActivityReasonFilter implements ExportElementValidatedInterface, FilterInt
->addViolation();
}
}
-
- /**
- * Check if a join between Activity and Reason is already defined.
- *
- * @param Join[] $joins
- * @param mixed $alias
- */
- private function checkJoinAlreadyDefined(array $joins, $alias): bool
- {
- foreach ($joins as $join) {
- if ($join->getAlias() === $alias) {
- return true;
- }
- }
-
- return false;
- }
}
diff --git a/src/Bundle/ChillActivityBundle/Export/Filter/PersonFilters/PersonHavingActivityBetweenDateFilter.php b/src/Bundle/ChillActivityBundle/Export/Filter/PersonFilters/PersonHavingActivityBetweenDateFilter.php
index c8c21f385..8db312e35 100644
--- a/src/Bundle/ChillActivityBundle/Export/Filter/PersonFilters/PersonHavingActivityBetweenDateFilter.php
+++ b/src/Bundle/ChillActivityBundle/Export/Filter/PersonFilters/PersonHavingActivityBetweenDateFilter.php
@@ -52,7 +52,7 @@ class PersonHavingActivityBetweenDateFilter implements ExportElementValidatedInt
$this->translator = $translator;
}
- public function addRole()
+ public function addRole(): ?string
{
return null;
}
diff --git a/src/Bundle/ChillCalendarBundle/Export/Aggregator/AgentAggregator.php b/src/Bundle/ChillCalendarBundle/Export/Aggregator/AgentAggregator.php
index ed7c265ff..57ec33cdd 100644
--- a/src/Bundle/ChillCalendarBundle/Export/Aggregator/AgentAggregator.php
+++ b/src/Bundle/ChillCalendarBundle/Export/Aggregator/AgentAggregator.php
@@ -1,20 +1,30 @@
userRender = $userRender;
}
- public function addRole()
+ public function addRole(): ?string
{
return null;
}
public function alterQuery(QueryBuilder $qb, $data)
{
- $qb->join('cal.user', 'u');
+ if (!in_array('caluser', $qb->getAllAliases(), true)) {
+ $qb->join('cal.user', 'caluser');
+ }
- $qb->addSelect('u.id AS agent_aggregator');
+ $qb->addSelect('caluser.id AS agent_aggregator');
$groupBy = $qb->getDQLPart('groupBy');
@@ -41,7 +53,6 @@ final class AgentAggregator implements AggregatorInterface
} else {
$qb->groupBy('agent_aggregator');
}
-
}
public function applyOn(): string
@@ -54,7 +65,7 @@ final class AgentAggregator implements AggregatorInterface
// no form
}
- public function getLabels($key, array $values, $data): \Closure
+ public function getLabels($key, array $values, $data): Closure
{
return function ($value): string {
if ('_header' === $value) {
@@ -74,6 +85,6 @@ final class AgentAggregator implements AggregatorInterface
public function getTitle(): string
{
- return 'Group by agent';
+ return 'Group appointments by agent';
}
-}
\ No newline at end of file
+}
diff --git a/src/Bundle/ChillCalendarBundle/Export/Aggregator/CancelReasonAggregator.php b/src/Bundle/ChillCalendarBundle/Export/Aggregator/CancelReasonAggregator.php
index 583153a7d..a07f052bf 100644
--- a/src/Bundle/ChillCalendarBundle/Export/Aggregator/CancelReasonAggregator.php
+++ b/src/Bundle/ChillCalendarBundle/Export/Aggregator/CancelReasonAggregator.php
@@ -1,11 +1,21 @@
translatableStringHelper = $translatableStringHelper;
}
- public function getLabels($key, array $values, $data): \Closure
- {
- return function($value): string {
- if ($value === '_header') {
- return 'Cancel reason';
- }
-
- $j = $this->cancelReasonRepository->find($value);
-
- return $this->translatableStringHelper->localize(
- $j->getName()
- );
- };
- }
-
- public function getQueryKeys($data): array
- {
- return ['cancel_reason_aggregator'];
- }
-
- public function buildForm(FormBuilderInterface $builder)
- {
- // no form
- }
-
- public function getTitle(): string
- {
- return 'Group by cancel reason';
- }
-
- public function addRole()
+ public function addRole(): ?string
{
return null;
}
@@ -61,7 +41,9 @@ class CancelReasonAggregator implements AggregatorInterface
public function alterQuery(QueryBuilder $qb, $data)
{
// TODO: still needs to take into account appointments without a cancel reason somehow
- $qb->join('cal.cancelReason', 'cr');
+ if (!in_array('calcancel', $qb->getAllAliases(), true)) {
+ $qb->join('cal.cancelReason', 'calcancel');
+ }
$qb->addSelect('IDENTITY(cal.cancelReason) as cancel_reason_aggregator');
@@ -78,4 +60,34 @@ class CancelReasonAggregator implements AggregatorInterface
{
return Declarations::CALENDAR_TYPE;
}
-}
\ No newline at end of file
+
+ public function buildForm(FormBuilderInterface $builder)
+ {
+ // no form
+ }
+
+ public function getLabels($key, array $values, $data): Closure
+ {
+ return function ($value): string {
+ if ('_header' === $value) {
+ return 'Cancel reason';
+ }
+
+ $j = $this->cancelReasonRepository->find($value);
+
+ return $this->translatableStringHelper->localize(
+ $j->getName()
+ );
+ };
+ }
+
+ public function getQueryKeys($data): array
+ {
+ return ['cancel_reason_aggregator'];
+ }
+
+ public function getTitle(): string
+ {
+ return 'Group appointments by cancel reason';
+ }
+}
diff --git a/src/Bundle/ChillCalendarBundle/Export/Aggregator/JobAggregator.php b/src/Bundle/ChillCalendarBundle/Export/Aggregator/JobAggregator.php
index b019cc21b..17905cf35 100644
--- a/src/Bundle/ChillCalendarBundle/Export/Aggregator/JobAggregator.php
+++ b/src/Bundle/ChillCalendarBundle/Export/Aggregator/JobAggregator.php
@@ -1,11 +1,21 @@
translatableStringHelper = $translatableStringHelper;
}
- public function getLabels($key, array $values, $data): \Closure
+ public function addRole(): ?string
{
- return function($value): string {
- if ($value === '_header') {
+ return null;
+ }
+
+ public function alterQuery(QueryBuilder $qb, $data)
+ {
+ if (!in_array('caluser', $qb->getAllAliases(), true)) {
+ $qb->join('cal.user', 'caluser');
+ }
+
+ $qb->addSelect('IDENTITY(caluser.userJob) as job_aggregator');
+
+ $groupBy = $qb->getDQLPart('groupBy');
+
+ if (!empty($groupBy)) {
+ $qb->addGroupBy('job_aggregator');
+ } else {
+ $qb->groupBy('job_aggregator');
+ }
+ }
+
+ public function applyOn(): string
+ {
+ return Declarations::CALENDAR_TYPE;
+ }
+
+ public function buildForm(FormBuilderInterface $builder)
+ {
+ // no form
+ }
+
+ public function getLabels($key, array $values, $data): Closure
+ {
+ return function ($value): string {
+ if ('_header' === $value) {
return 'Job';
}
@@ -43,38 +85,8 @@ final class JobAggregator implements AggregatorInterface
return ['job_aggregator'];
}
- public function buildForm(FormBuilderInterface $builder)
- {
- // no form
- }
-
public function getTitle(): string
{
- return 'Group by agent job';
+ return 'Group appointments by agent job';
}
-
- public function addRole()
- {
- return null;
- }
-
- public function alterQuery(QueryBuilder $qb, $data)
- {
- $qb->join('cal.user', 'u');
-
- $qb->addSelect('IDENTITY(u.userJob) as job_aggregator');
-
- $groupBy = $qb->getDQLPart('groupBy');
-
- if (!empty($groupBy)) {
- $qb->addGroupBy('job_aggregator');
- } else {
- $qb->groupBy('job_aggregator');
- }
- }
-
- public function applyOn(): string
- {
- return Declarations::CALENDAR_TYPE;
- }
-}
\ No newline at end of file
+}
diff --git a/src/Bundle/ChillCalendarBundle/Export/Aggregator/LocationAggregator.php b/src/Bundle/ChillCalendarBundle/Export/Aggregator/LocationAggregator.php
index bc921c9c7..236b1b74f 100644
--- a/src/Bundle/ChillCalendarBundle/Export/Aggregator/LocationAggregator.php
+++ b/src/Bundle/ChillCalendarBundle/Export/Aggregator/LocationAggregator.php
@@ -1,10 +1,20 @@
locationRepository = $locationRepository;
}
- public function getLabels($key, array $values, $data): \Closure
- {
- return function($value): string {
- if ($value === '_header') {
- return 'Location';
- }
-
- $l = $this->locationRepository->find($value);
-
- return $l->getName();
-
- };
- }
-
- public function getQueryKeys($data): array
- {
- return ['location_aggregator'];
- }
-
- public function buildForm(FormBuilderInterface $builder)
- {
- // no form
- }
-
- public function getTitle(): string
- {
- return 'Group by location';
- }
-
- public function addRole(): ?Role
+ public function addRole(): ?string
{
return null;
}
public function alterQuery(QueryBuilder $qb, $data)
{
- $qb->join('cal.location', 'l');
+ if (!in_array('calloc', $qb->getAllAliases(), true)) {
+ $qb->join('cal.location', 'calloc');
+ }
$qb->addSelect('IDENTITY(cal.location) as location_aggregator');
$groupBy = $qb->getDQLPart('groupBy');
@@ -72,4 +55,31 @@ final class LocationAggregator implements AggregatorInterface
return Declarations::CALENDAR_TYPE;
}
-}
\ No newline at end of file
+ public function buildForm(FormBuilderInterface $builder)
+ {
+ // no form
+ }
+
+ public function getLabels($key, array $values, $data): Closure
+ {
+ return function ($value): string {
+ if ('_header' === $value) {
+ return 'Location';
+ }
+
+ $l = $this->locationRepository->find($value);
+
+ return $l->getName();
+ };
+ }
+
+ public function getQueryKeys($data): array
+ {
+ return ['location_aggregator'];
+ }
+
+ public function getTitle(): string
+ {
+ return 'Group appointments by location';
+ }
+}
diff --git a/src/Bundle/ChillCalendarBundle/Export/Aggregator/LocationTypeAggregator.php b/src/Bundle/ChillCalendarBundle/Export/Aggregator/LocationTypeAggregator.php
index 3b3b9105a..c8d02160f 100644
--- a/src/Bundle/ChillCalendarBundle/Export/Aggregator/LocationTypeAggregator.php
+++ b/src/Bundle/ChillCalendarBundle/Export/Aggregator/LocationTypeAggregator.php
@@ -1,11 +1,21 @@
translatableStringHelper = $translatableStringHelper;
}
- public function getLabels($key, array $values, $data): \Closure
+ public function addRole(): ?string
{
- return function($value): string {
- if ($value === '_header') {
+ return null;
+ }
+
+ public function alterQuery(QueryBuilder $qb, $data)
+ {
+ if (!in_array('calloc', $qb->getAllAliases(), true)) {
+ $qb->join('cal.location', 'calloc');
+ }
+
+ $qb->addSelect('IDENTITY(calloc.locationType) as location_type_aggregator');
+
+ $groupBy = $qb->getDQLPart('groupBy');
+
+ if (!empty($groupBy)) {
+ $qb->addGroupBy('location_type_aggregator');
+ } else {
+ $qb->groupBy('location_type_aggregator');
+ }
+ }
+
+ public function applyOn(): string
+ {
+ return Declarations::CALENDAR_TYPE;
+ }
+
+ public function buildForm(FormBuilderInterface $builder)
+ {
+ // no form
+ }
+
+ public function getLabels($key, array $values, $data): Closure
+ {
+ return function ($value): string {
+ if ('_header' === $value) {
return 'Location type';
}
@@ -43,39 +85,8 @@ final class LocationTypeAggregator implements AggregatorInterface
return ['location_type_aggregator'];
}
- public function buildForm(FormBuilderInterface $builder)
- {
- // no form
- }
-
public function getTitle(): string
{
- return 'Group by location type';
+ return 'Group appointments by location type';
}
-
- public function addRole()
- {
- return null;
- }
-
- public function alterQuery(QueryBuilder $qb, $data)
- {
- $qb->join('cal.location', 'l');
-
- $qb->addSelect('IDENTITY(l.locationType) as location_type_aggregator');
-
- $groupBy = $qb->getDQLPart('groupBy');
-
- if (!empty($groupBy)) {
- $qb->addGroupBy('location_type_aggregator');
- } else {
- $qb->groupBy('location_type_aggregator');
- }
- }
-
- public function applyOn(): string
- {
- return Declarations::CALENDAR_TYPE;
- }
-
-}
\ No newline at end of file
+}
diff --git a/src/Bundle/ChillCalendarBundle/Export/Aggregator/MonthYearAggregator.php b/src/Bundle/ChillCalendarBundle/Export/Aggregator/MonthYearAggregator.php
index 71a0e75bb..26329ad13 100644
--- a/src/Bundle/ChillCalendarBundle/Export/Aggregator/MonthYearAggregator.php
+++ b/src/Bundle/ChillCalendarBundle/Export/Aggregator/MonthYearAggregator.php
@@ -1,5 +1,14 @@
translatableStringHelper = $translatableStringHelper;
}
- public function getLabels($key, array $values, $data): \Closure
+ public function addRole(): ?string
+ {
+ return null;
+ }
+
+ public function alterQuery(QueryBuilder $qb, $data)
+ {
+ if (!in_array('caluser', $qb->getAllAliases(), true)) {
+ $qb->join('cal.user', 'caluser');
+ }
+
+ $qb->addSelect('IDENTITY(caluser.mainScope) as scope_aggregator');
+
+ $groupBy = $qb->getDQLPart('groupBy');
+
+ if (!empty($groupBy)) {
+ $qb->addGroupBy('scope_aggregator');
+ } else {
+ $qb->groupBy('scope_aggregator');
+ }
+ }
+
+ public function applyOn(): string
+ {
+ return Declarations::CALENDAR_TYPE;
+ }
+
+ public function buildForm(FormBuilderInterface $builder)
+ {
+ // no form
+ }
+
+ public function getLabels($key, array $values, $data): Closure
{
return function ($value): string {
- if ($value === '_header') {
+ if ('_header' === $value) {
return 'Scope';
}
@@ -43,38 +85,8 @@ final class ScopeAggregator implements AggregatorInterface
return ['scope_aggregator'];
}
- public function buildForm(FormBuilderInterface $builder)
- {
- // no form
- }
-
public function getTitle(): string
{
- return 'Group by agent scope';
+ return 'Group appointments by agent scope';
}
-
- public function addRole()
- {
- return null;
- }
-
- public function alterQuery(QueryBuilder $qb, $data)
- {
- $qb->join('cal.user', 'u');
-
- $qb->addSelect('IDENTITY(u.mainScope) as scope_aggregator');
-
- $groupBy = $qb->getDQLPart('groupBy');
-
- if (!empty($groupBy)) {
- $qb->addGroupBy('scope_aggregator');
- } else {
- $qb->groupBy('scope_aggregator');
- }
- }
-
- public function applyOn(): string
- {
- return Declarations::CALENDAR_TYPE;
- }
-}
\ No newline at end of file
+}
diff --git a/src/Bundle/ChillCalendarBundle/Export/Export/CountAppointments.php b/src/Bundle/ChillCalendarBundle/Export/Export/CountAppointments.php
index e47288edc..b9da17114 100644
--- a/src/Bundle/ChillCalendarBundle/Export/Export/CountAppointments.php
+++ b/src/Bundle/ChillCalendarBundle/Export/Export/CountAppointments.php
@@ -1,13 +1,23 @@
getQuery()->getResult(Query::HYDRATE_SCALAR);
}
+ public function getTitle(): string
+ {
+ return 'Average appointment duration';
+ }
+
public function getType(): string
{
return Declarations::CALENDAR_TYPE;
@@ -83,21 +96,15 @@ class StatAppointmentAvgDuration implements ExportInterface, GroupedExportInterf
return $qb;
}
- public function requiredRole(): Role
+ public function requiredRole(): string
{
- return new Role(AccompanyingPeriodVoter::STATS);
+ return AccompanyingPeriodVoter::STATS;
}
public function supportsModifiers(): array
{
return [
- Declarations::CALENDAR_TYPE
+ Declarations::CALENDAR_TYPE,
];
}
-
- public function getGroup(): string
- {
- return 'Exports of calendar';
- }
-
-}
\ No newline at end of file
+}
diff --git a/src/Bundle/ChillCalendarBundle/Export/Export/StatAppointmentSumDuration.php b/src/Bundle/ChillCalendarBundle/Export/Export/StatAppointmentSumDuration.php
index 0e362d766..286c73be5 100644
--- a/src/Bundle/ChillCalendarBundle/Export/Export/StatAppointmentSumDuration.php
+++ b/src/Bundle/ChillCalendarBundle/Export/Export/StatAppointmentSumDuration.php
@@ -1,5 +1,14 @@
getQuery()->getResult(Query::HYDRATE_SCALAR);
}
+ public function getTitle(): string
+ {
+ return 'Sum of appointment durations';
+ }
+
public function getType(): string
{
return Declarations::CALENDAR_TYPE;
@@ -82,21 +96,15 @@ class StatAppointmentSumDuration implements ExportInterface, GroupedExportInterf
return $qb;
}
- public function requiredRole(): Role
+ public function requiredRole(): string
{
- return new Role(AccompanyingPeriodVoter::STATS);
+ return AccompanyingPeriodVoter::STATS;
}
public function supportsModifiers(): array
{
return [
- Declarations::CALENDAR_TYPE
+ Declarations::CALENDAR_TYPE,
];
}
-
- public function getGroup(): string
- {
- return 'Exports of calendar';
- }
-
-}
\ No newline at end of file
+}
diff --git a/src/Bundle/ChillCalendarBundle/Export/Filter/AgentFilter.php b/src/Bundle/ChillCalendarBundle/Export/Filter/AgentFilter.php
index 5c16d0728..263b1e160 100644
--- a/src/Bundle/ChillCalendarBundle/Export/Filter/AgentFilter.php
+++ b/src/Bundle/ChillCalendarBundle/Export/Filter/AgentFilter.php
@@ -1,5 +1,14 @@
userRender = $userRender;
}
- public function buildForm(FormBuilderInterface $builder)
- {
- $builder->add('accepted_agents', EntityType::class, [
- 'class' => User::class,
- 'choice_label' => function (User $u) {
- return $this->userRender->renderString($u, []);
- },
- 'multiple' => true,
- 'expanded' => true
- ]);
-
- }
-
- public function getTitle(): string
- {
- return 'Filter by agent';
- }
-
- public function describeAction($data, $format = 'string'): array
- {
- $users = [];
-
- foreach ($data['accepted_agents'] as $r) {
- $users[] = $r;
- }
-
- return [
- 'Filtered by agent: only %agents%', [
- '%agents' => implode(", ou ", $users)
- ]];
- }
-
- public function addRole()
+ public function addRole(): ?string
{
return null;
}
@@ -76,4 +53,35 @@ class AgentFilter implements FilterInterface
{
return Declarations::CALENDAR_TYPE;
}
-}
\ No newline at end of file
+
+ public function buildForm(FormBuilderInterface $builder)
+ {
+ $builder->add('accepted_agents', EntityType::class, [
+ 'class' => User::class,
+ 'choice_label' => function (User $u) {
+ return $this->userRender->renderString($u, []);
+ },
+ 'multiple' => true,
+ 'expanded' => true,
+ ]);
+ }
+
+ public function describeAction($data, $format = 'string'): array
+ {
+ $users = [];
+
+ foreach ($data['accepted_agents'] as $r) {
+ $users[] = $r;
+ }
+
+ return [
+ 'Filtered by agent: only %agents%', [
+ '%agents' => implode(', ou ', $users),
+ ], ];
+ }
+
+ public function getTitle(): string
+ {
+ return 'Filter appointments by agent';
+ }
+}
diff --git a/src/Bundle/ChillCalendarBundle/Export/Filter/BetweenDatesFilter.php b/src/Bundle/ChillCalendarBundle/Export/Filter/BetweenDatesFilter.php
index a23c76d98..c3aafc192 100644
--- a/src/Bundle/ChillCalendarBundle/Export/Filter/BetweenDatesFilter.php
+++ b/src/Bundle/ChillCalendarBundle/Export/Filter/BetweenDatesFilter.php
@@ -1,32 +1,67 @@
getDQLPart('where');
+
+ $clause = $qb->expr()->andX(
+ $qb->expr()->gte('cal.startDate', ':dateFrom'),
+ $qb->expr()->lte('cal.endDate', ':dateTo')
+ );
+
+ if ($where instanceof Andx) {
+ $where->add($clause);
+ } else {
+ $where = $qb->expr()->andX($clause);
+ }
+
+ $qb->add('where', $where);
+ $qb->setParameter('dateFrom', $data['date_from'], Types::DATE_MUTABLE);
+ // modify dateTo so that entire day is also taken into account up until the beginning of the next day.
+ $qb->setParameter('dateTo', $data['date_to']->modify('+1 day'), Types::DATE_MUTABLE);
+ }
+
+ public function applyOn(): string
+ {
+ return Declarations::CALENDAR_TYPE;
+ }
public function buildForm(FormBuilderInterface $builder)
{
$builder
->add('date_from', ChillDateType::class, [
- 'data' => new \DateTime(),
+ 'data' => new DateTime(),
])
->add('date_to', ChillDateType::class, [
- 'data' => new \DateTime(),
- ])
- ;
- }
-
- public function getTitle(): string
- {
- return 'Filter by appointments between certain dates';
+ 'data' => new DateTime(),
+ ]);
}
public function describeAction($data, $format = 'string'): array
@@ -37,34 +72,8 @@ class BetweenDatesFilter implements FilterInterface
]];
}
- public function addRole()
+ public function getTitle(): string
{
- return null;
+ return 'Filter appointments between certain dates';
}
-
- public function alterQuery(QueryBuilder $qb, $data)
- {
- $where = $qb->getDQLPart('where');
-
- $clause = $qb->expr()->andX(
- $qb->expr()->gte('cal.startDate', ':dateFrom'),
- $qb->expr()->lte('cal.endDate', ':dateTo')
- );
-
- if ($where instanceof Andx) {
- $where->add($clause);
- } else {
- $where = $qb->expr()->andX($clause);
- }
-
- $qb->add('where', $where);
- $qb->setParameter('dateFrom', $data['date_from']);
- // modify dateTo so that entire day is also taken into account up until the beginning of the next day.
- $qb->setParameter('dateTo', $data['date_to']->modify('+1 day'));
- }
-
- public function applyOn(): string
- {
- return Declarations::CALENDAR_TYPE;
- }
-}
\ No newline at end of file
+}
diff --git a/src/Bundle/ChillCalendarBundle/Export/Filter/JobFilter.php b/src/Bundle/ChillCalendarBundle/Export/Filter/JobFilter.php
index 42e03e239..03cd4857d 100644
--- a/src/Bundle/ChillCalendarBundle/Export/Filter/JobFilter.php
+++ b/src/Bundle/ChillCalendarBundle/Export/Filter/JobFilter.php
@@ -23,7 +23,6 @@ use Symfony\Contracts\Translation\TranslatorInterface;
class JobFilter implements FilterInterface
{
-
protected TranslatorInterface $translator;
private TranslatableStringHelper $translatableStringHelper;
@@ -36,45 +35,19 @@ class JobFilter implements FilterInterface
$this->translatableStringHelper = $translatableStringHelper;
}
- public function buildForm(FormBuilderInterface $builder)
- {
- $builder->add('job', EntityType::class, [
- 'class' => UserJob::class,
- 'choice_label' => function (UserJob $j) {
- return $this->translatableStringHelper->localize(
- $j->getLabel()
- );
- },
- 'multiple' => true,
- 'expanded' => true
- ]);
- }
-
- public function describeAction($data, $format = 'string'): array
- {
- $userJobs = [];
-
- foreach ($data['job'] as $j) {
- $userJobs[] = $this->translatableStringHelper->localize(
- $j->getLabel());
- }
-
- return ['Filtered by agent job: only %jobs%', [
- '%jobs%' => implode(', ou ', $userJobs)
- ]];
- }
-
- public function addRole()
+ public function addRole(): ?string
{
return null;
}
public function alterQuery(QueryBuilder $qb, $data)
{
- $qb->join('cal.user', 'u');
+ if (!in_array('caluser', $qb->getAllAliases(), true)) {
+ $qb->join('cal.user', 'caluser');
+ }
$where = $qb->getDQLPart('where');
- $clause = $qb->expr()->in('u.userJob', ':job');
+ $clause = $qb->expr()->in('caluser.userJob', ':job');
if ($where instanceof Andx) {
$where->add($clause);
@@ -91,9 +64,37 @@ class JobFilter implements FilterInterface
return Declarations::CALENDAR_TYPE;
}
+ public function buildForm(FormBuilderInterface $builder)
+ {
+ $builder->add('job', EntityType::class, [
+ 'class' => UserJob::class,
+ 'choice_label' => function (UserJob $j) {
+ return $this->translatableStringHelper->localize(
+ $j->getLabel()
+ );
+ },
+ 'multiple' => true,
+ 'expanded' => true,
+ ]);
+ }
+
+ public function describeAction($data, $format = 'string'): array
+ {
+ $userJobs = [];
+
+ foreach ($data['job'] as $j) {
+ $userJobs[] = $this->translatableStringHelper->localize(
+ $j->getLabel()
+ );
+ }
+
+ return ['Filtered by agent job: only %jobs%', [
+ '%jobs%' => implode(', ou ', $userJobs),
+ ]];
+ }
public function getTitle(): string
{
- return 'Filter by agent job';
+ return 'Filter appointments by agent job';
}
}
diff --git a/src/Bundle/ChillCalendarBundle/Export/Filter/ScopeFilter.php b/src/Bundle/ChillCalendarBundle/Export/Filter/ScopeFilter.php
index c3fc7b1e4..cbd566e9e 100644
--- a/src/Bundle/ChillCalendarBundle/Export/Filter/ScopeFilter.php
+++ b/src/Bundle/ChillCalendarBundle/Export/Filter/ScopeFilter.php
@@ -23,7 +23,6 @@ use Symfony\Contracts\Translation\TranslatorInterface;
class ScopeFilter implements FilterInterface
{
-
protected TranslatorInterface $translator;
private TranslatableStringHelper $translatableStringHelper;
@@ -36,45 +35,19 @@ class ScopeFilter implements FilterInterface
$this->translatableStringHelper = $translatableStringHelper;
}
- public function buildForm(FormBuilderInterface $builder)
- {
- $builder->add('scope', EntityType::class, [
- 'class' => Scope::class,
- 'choice_label' => function (Scope $s) {
- return $this->translatableStringHelper->localize(
- $s->getName()
- );
- },
- 'multiple' => true,
- 'expanded' => true
- ]);
- }
-
- public function describeAction($data, $format = 'string')
- {
- $scopes = [];
-
- foreach ($data['scope'] as $s) {
- $scopes[] = $this->translatableStringHelper->localize(
- $s->getName());
- }
-
- return ['Filtered by agent scope: only %scopes%', [
- '%scopes%' => implode(', ou ', $scopes)
- ]];
- }
-
- public function addRole()
+ public function addRole(): ?string
{
return null;
}
public function alterQuery(QueryBuilder $qb, $data)
{
- $qb->join('cal.user', 'u');
+ if (!in_array('caluser', $qb->getAllAliases(), true)) {
+ $qb->join('cal.user', 'caluser');
+ }
$where = $qb->getDQLPart('where');
- $clause = $qb->expr()->in('u.mainScope', ':scope');
+ $clause = $qb->expr()->in('caluser.mainScope', ':scope');
if ($where instanceof Andx) {
$where->add($clause);
@@ -91,9 +64,37 @@ class ScopeFilter implements FilterInterface
return Declarations::CALENDAR_TYPE;
}
+ public function buildForm(FormBuilderInterface $builder)
+ {
+ $builder->add('scope', EntityType::class, [
+ 'class' => Scope::class,
+ 'choice_label' => function (Scope $s) {
+ return $this->translatableStringHelper->localize(
+ $s->getName()
+ );
+ },
+ 'multiple' => true,
+ 'expanded' => true,
+ ]);
+ }
+
+ public function describeAction($data, $format = 'string')
+ {
+ $scopes = [];
+
+ foreach ($data['scope'] as $s) {
+ $scopes[] = $this->translatableStringHelper->localize(
+ $s->getName()
+ );
+ }
+
+ return ['Filtered by agent scope: only %scopes%', [
+ '%scopes%' => implode(', ou ', $scopes),
+ ]];
+ }
public function getTitle()
{
- return 'Filter by agent scope';
+ return 'Filter appointments by agent scope';
}
-}
\ No newline at end of file
+}
diff --git a/src/Bundle/ChillCalendarBundle/translations/messages.fr.yml b/src/Bundle/ChillCalendarBundle/translations/messages.fr.yml
index 73a2a5cd6..5c95aaebe 100644
--- a/src/Bundle/ChillCalendarBundle/translations/messages.fr.yml
+++ b/src/Bundle/ChillCalendarBundle/translations/messages.fr.yml
@@ -82,21 +82,21 @@ Sum of appointment durations: Somme de la durée des rendez-vous
Get the sum of appointment durations according to various filters: Calcule la somme des durées des rendez-vous en fonction de différents paramètres.
'Filtered by agent: only %agents%': "Filtré par agents: uniquement %agents%"
-Filter by agent: Filtrer par agents
-Filter by agent job: Filtrer par métiers des agents
+Filter appointments by agent: Filtrer les rendez-vous par agents
+Filter appointments by agent job: Filtrer les rendez-vous par métiers des agents
'Filtered by agent job: only %jobs%': 'Filtré par métiers des agents: uniquement les %jobs%'
-Filter by agent scope: Filtrer par services des agents
+Filter appointments by agent scope: Filtrer les rendez-vous par services des agents
'Filtered by agent scope: only %scopes%': 'Filtré par services des agents: uniquement les services %scopes%'
-Filter by appointments between certain dates: Filtrer par date du rendez-vous
+Filter appointments between certain dates: Filtrer les rendez-vous par date du rendez-vous
'Filtered by appointments between %dateFrom% and %dateTo%': 'Filtré par rendez-vous entre %dateFrom% et %dateTo%'
-Group by agent: Grouper par agent
-Group by agent job: Grouper par métier de l'agent
-Group by agent scope: Grouper par service de l'agent
-Group by location type: Grouper par type de localisation
-Group by location: Grouper par lieu de rendez-vous
-Group by cancel reason: Grouper par motif d'annulation
-Group by month and year: Grouper par mois et année
+Group appointments by agent: Grouper les rendez-vous par agent
+Group appointments by agent job: Grouper les rendez-vous par métier de l'agent
+Group appointments by agent scope: Grouper les rendez-vous par service de l'agent
+Group appointments by location type: Grouper les rendez-vous par type de localisation
+Group appointments by location: Grouper les rendez-vous par lieu de rendez-vous
+Group appointments by cancel reason: Grouper les rendez-vous par motif d'annulation
+Group appointments by month and year: Grouper les rendez-vous par mois et année
Scope: Service
Job: Métier
Location type: Type de localisation
diff --git a/src/Bundle/ChillMainBundle/Controller/ExportController.php b/src/Bundle/ChillMainBundle/Controller/ExportController.php
index a7404b879..1893a64b3 100644
--- a/src/Bundle/ChillMainBundle/Controller/ExportController.php
+++ b/src/Bundle/ChillMainBundle/Controller/ExportController.php
@@ -525,6 +525,21 @@ class ExportController extends AbstractController
);
}
+ private function getExportGroup($target): string
+ {
+ $exportManager = $this->exportManager;
+
+ $groups = $exportManager->getExportsGrouped(true);
+
+ foreach ($groups as $group => $array) {
+ foreach ($array as $alias => $export) {
+ if ($export === $target) {
+ return $group;
+ }
+ }
+ }
+ }
+
/**
* get the next step. If $reverse === true, the previous step is returned.
*
@@ -572,19 +587,4 @@ class ExportController extends AbstractController
throw new LogicException("the step {$step} is not defined.");
}
}
-
- private function getExportGroup($target): string
- {
- $exportManager = $this->exportManager;
-
- $groups = $exportManager->getExportsGrouped(true);
-
- foreach ($groups as $group => $array) {
- foreach ($array as $alias => $export) {
- if ($export === $target) {
- return $group;
- }
- }
- }
- }
}
diff --git a/src/Bundle/ChillMainBundle/Doctrine/DQL/Extract.php b/src/Bundle/ChillMainBundle/Doctrine/DQL/Extract.php
index 72ca2b461..7d8809582 100644
--- a/src/Bundle/ChillMainBundle/Doctrine/DQL/Extract.php
+++ b/src/Bundle/ChillMainBundle/Doctrine/DQL/Extract.php
@@ -1,10 +1,18 @@
EXTRACT(field FROM interval)
@@ -50,5 +58,4 @@ class Extract extends FunctionNode
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}
-
-}
\ No newline at end of file
+}
diff --git a/src/Bundle/ChillMainBundle/Doctrine/DQL/ToChar.php b/src/Bundle/ChillMainBundle/Doctrine/DQL/ToChar.php
index c634555dc..51ff5a9dd 100644
--- a/src/Bundle/ChillMainBundle/Doctrine/DQL/ToChar.php
+++ b/src/Bundle/ChillMainBundle/Doctrine/DQL/ToChar.php
@@ -1,5 +1,14 @@
fmt = $parser->StringExpression();
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}
-
-}
\ No newline at end of file
+}
diff --git a/src/Bundle/ChillMainBundle/Export/ExportInterface.php b/src/Bundle/ChillMainBundle/Export/ExportInterface.php
index 419d9b250..6319fbac9 100644
--- a/src/Bundle/ChillMainBundle/Export/ExportInterface.php
+++ b/src/Bundle/ChillMainBundle/Export/ExportInterface.php
@@ -139,10 +139,8 @@ interface ExportInterface extends ExportElementInterface
/**
* Return the required Role to execute the Export.
- *
- * @return \Symfony\Component\Security\Core\Role\Role
*/
- public function requiredRole();
+ public function requiredRole(): string;
/**
* Inform which ModifiersInterface (i.e. AggregatorInterface, FilterInterface)
diff --git a/src/Bundle/ChillMainBundle/Export/ExportManager.php b/src/Bundle/ChillMainBundle/Export/ExportManager.php
index ed24f1661..e2d099ba8 100644
--- a/src/Bundle/ChillMainBundle/Export/ExportManager.php
+++ b/src/Bundle/ChillMainBundle/Export/ExportManager.php
@@ -550,7 +550,7 @@ class ExportManager
if (null === $centers) {
$centers = $this->authorizationHelper->getReachableCenters(
$this->user,
- $role->getRole(),
+ $role
);
}
@@ -559,13 +559,13 @@ class ExportManager
}
foreach ($centers as $center) {
- if ($this->authorizationChecker->isGranted($role->getRole(), $center) === false) {
+ if ($this->authorizationChecker->isGranted($role, $center) === false) {
//debugging
$this->logger->debug('user has no access to element', [
'method' => __METHOD__,
'type' => get_class($element),
'center' => $center->getName(),
- 'role' => $role->getRole(),
+ 'role' => $role,
]);
///// Bypasse les autorisations qui empêche d'afficher les nouveaux exports
@@ -594,7 +594,7 @@ class ExportManager
'center' => $center,
'circles' => $this->authorizationHelper->getReachableScopes(
$this->user,
- $element->requiredRole()->getRole(),
+ $element->requiredRole(),
$center
),
];
diff --git a/src/Bundle/ChillMainBundle/Export/ModifierInterface.php b/src/Bundle/ChillMainBundle/Export/ModifierInterface.php
index 1265f52c4..ac8e3e692 100644
--- a/src/Bundle/ChillMainBundle/Export/ModifierInterface.php
+++ b/src/Bundle/ChillMainBundle/Export/ModifierInterface.php
@@ -26,9 +26,9 @@ interface ModifierInterface extends ExportElementInterface
* If null, will used the ExportInterface::requiredRole role from
* the current executing export.
*
- * @return \Symfony\Component\Security\Core\Role\Role|null A role required to execute this ModifiersInterface
+ * @return string|null A role required to execute this ModifiersInterface
*/
- public function addRole();
+ public function addRole(): ?string;
/**
* Alter the query initiated by the export, to add the required statements
diff --git a/src/Bundle/ChillMainBundle/Resources/public/vuejs/FormActionGoalResult/App.vue b/src/Bundle/ChillMainBundle/Resources/public/vuejs/FormActionGoalResult/App.vue
new file mode 100644
index 000000000..39a7c023a
--- /dev/null
+++ b/src/Bundle/ChillMainBundle/Resources/public/vuejs/FormActionGoalResult/App.vue
@@ -0,0 +1,295 @@
+
+
{{ "No options availables. Your report is fully configured."|trans }}
{{ form_widget(form.children.formatter) }} {% else %} - {# we always have to render children, to mark as rendered #} - {% for input in form.children.formatter.children %} - {{ form_row(input) }} - {% endfor %} +