feat: additional role 'customer expert'
This commit is contained in:
@@ -22,6 +22,7 @@ Symfony roles:
|
|||||||
| `1293` | `ROLE_MANAGER` |
|
| `1293` | `ROLE_MANAGER` |
|
||||||
| `1477` | `ROLE_GROUPS_MANAGER` |
|
| `1477` | `ROLE_GROUPS_MANAGER` |
|
||||||
| `1478` | `ROLE_GROUPS_ADMIN` |
|
| `1478` | `ROLE_GROUPS_ADMIN` |
|
||||||
|
| `1483` | `ROLE_CUSTOMER_EXPERT` |
|
||||||
| label `Hausleitung {CODE}` | `ROLE_HOUSE_MANAGER` + hotel code `{CODE}` |
|
| label `Hausleitung {CODE}` | `ROLE_HOUSE_MANAGER` + hotel code `{CODE}` |
|
||||||
| nothing matched | `ROLE_CUSTOMER` |
|
| nothing matched | `ROLE_CUSTOMER` |
|
||||||
|
|
||||||
|
|||||||
@@ -26,11 +26,21 @@ class CrmAttributesResponseParser
|
|||||||
{
|
{
|
||||||
use TypeConversionTrait;
|
use TypeConversionTrait;
|
||||||
|
|
||||||
private const BPN_CRM_ID_ADMIN = 1292;
|
/**
|
||||||
private const BPN_CRM_ID_MANAGER = 1293;
|
* The CRM selections that stand for a role, by selection id. "Hausleitung" is deliberately not
|
||||||
private const BPN_CRM_ID_TEAMER = 1070;
|
* in here: its ids are deployment configuration (see $houseManagerIds) and carry a hotel code
|
||||||
private const BPN_CRM_ID_GROUPS_MANAGER = 1477;
|
* on top of the role.
|
||||||
private const BPN_CRM_ID_GROUPS_ADMIN = 1478;
|
*
|
||||||
|
* @var array<int, string> selection id => role
|
||||||
|
*/
|
||||||
|
private const ROLE_BY_CRM_ID = [
|
||||||
|
1070 => Role::TEAMER,
|
||||||
|
1292 => Role::ADMIN,
|
||||||
|
1293 => Role::MANAGER,
|
||||||
|
1477 => Role::GROUPS_MANAGER,
|
||||||
|
1478 => Role::GROUPS_ADMIN,
|
||||||
|
1483 => Role::CUSTOMER_EXPERT,
|
||||||
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param array<int|string, string> $houseManagerIds "Hausleitung" selection id => hotel code
|
* @param array<int|string, string> $houseManagerIds "Hausleitung" selection id => hotel code
|
||||||
@@ -71,20 +81,11 @@ class CrmAttributesResponseParser
|
|||||||
$roles[] = Role::HOUSE_MANAGER;
|
$roles[] = Role::HOUSE_MANAGER;
|
||||||
$hotelCodes[] = $hotelCode;
|
$hotelCodes[] = $hotelCode;
|
||||||
}
|
}
|
||||||
if (self::BPN_CRM_ID_ADMIN === $attribute->id) {
|
|
||||||
$roles[] = Role::ADMIN;
|
$role = self::ROLE_BY_CRM_ID[$attribute->id] ?? null;
|
||||||
}
|
|
||||||
if (self::BPN_CRM_ID_MANAGER === $attribute->id) {
|
if (null !== $role) {
|
||||||
$roles[] = Role::MANAGER;
|
$roles[] = $role;
|
||||||
}
|
|
||||||
if (self::BPN_CRM_ID_TEAMER === $attribute->id) {
|
|
||||||
$roles[] = Role::TEAMER;
|
|
||||||
}
|
|
||||||
if (self::BPN_CRM_ID_GROUPS_MANAGER === $attribute->id) {
|
|
||||||
$roles[] = Role::GROUPS_MANAGER;
|
|
||||||
}
|
|
||||||
if (self::BPN_CRM_ID_GROUPS_ADMIN === $attribute->id) {
|
|
||||||
$roles[] = Role::GROUPS_ADMIN;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ final class Role
|
|||||||
public const HOUSE_MANAGER = 'ROLE_HOUSE_MANAGER';
|
public const HOUSE_MANAGER = 'ROLE_HOUSE_MANAGER';
|
||||||
public const GROUPS_ADMIN = 'ROLE_GROUPS_ADMIN';
|
public const GROUPS_ADMIN = 'ROLE_GROUPS_ADMIN';
|
||||||
public const GROUPS_MANAGER = 'ROLE_GROUPS_MANAGER';
|
public const GROUPS_MANAGER = 'ROLE_GROUPS_MANAGER';
|
||||||
|
public const CUSTOMER_EXPERT = 'ROLE_CUSTOMER_EXPERT';
|
||||||
public const EMPLOYEE = 'ROLE_EMPLOYEE';
|
public const EMPLOYEE = 'ROLE_EMPLOYEE';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -63,6 +64,7 @@ final class Role
|
|||||||
self::HOUSE_MANAGER,
|
self::HOUSE_MANAGER,
|
||||||
self::GROUPS_ADMIN,
|
self::GROUPS_ADMIN,
|
||||||
self::GROUPS_MANAGER,
|
self::GROUPS_MANAGER,
|
||||||
|
self::CUSTOMER_EXPERT,
|
||||||
self::EMPLOYEE,
|
self::EMPLOYEE,
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -92,6 +94,7 @@ final class Role
|
|||||||
self::HOUSE_MANAGER,
|
self::HOUSE_MANAGER,
|
||||||
self::GROUPS_ADMIN,
|
self::GROUPS_ADMIN,
|
||||||
self::GROUPS_MANAGER,
|
self::GROUPS_MANAGER,
|
||||||
|
self::CUSTOMER_EXPERT,
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -287,6 +290,7 @@ final class Role
|
|||||||
self::HOUSE_MANAGER => 'Hausleitung',
|
self::HOUSE_MANAGER => 'Hausleitung',
|
||||||
self::GROUPS_ADMIN => 'Preisrechner Admin',
|
self::GROUPS_ADMIN => 'Preisrechner Admin',
|
||||||
self::GROUPS_MANAGER => 'Preisrechner',
|
self::GROUPS_MANAGER => 'Preisrechner',
|
||||||
|
self::CUSTOMER_EXPERT => 'KO-Experte',
|
||||||
self::EMPLOYEE => 'Mitarbeiter:in',
|
self::EMPLOYEE => 'Mitarbeiter:in',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -40,6 +40,20 @@ class CrmAttributesResponseParserTest extends TestCase
|
|||||||
self::assertNotContains('ROLE_GROUPS_MANAGER', $roles);
|
self::assertNotContains('ROLE_GROUPS_MANAGER', $roles);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testParseAssignsCustomerExpertRoleWhenSelected(): void
|
||||||
|
{
|
||||||
|
$roles = $this->parseRoles($this->selectionXml(1483, true));
|
||||||
|
|
||||||
|
self::assertContains('ROLE_CUSTOMER_EXPERT', $roles);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testParseAssignsNoCustomerExpertRoleWhenNotSelected(): void
|
||||||
|
{
|
||||||
|
$roles = $this->parseRoles($this->selectionXml(1483, false));
|
||||||
|
|
||||||
|
self::assertNotContains('ROLE_CUSTOMER_EXPERT', $roles);
|
||||||
|
}
|
||||||
|
|
||||||
public function testParseAssignsNoGroupsRolesWhenNotSelected(): void
|
public function testParseAssignsNoGroupsRolesWhenNotSelected(): void
|
||||||
{
|
{
|
||||||
$roles = $this->parseRoles($this->selectionXml(1477, false));
|
$roles = $this->parseRoles($this->selectionXml(1477, false));
|
||||||
|
|||||||
@@ -24,6 +24,25 @@ class RoleTest extends TestCase
|
|||||||
self::assertSame([Role::TEAMER], Role::effectiveOnly($roles));
|
self::assertSame([Role::TEAMER], Role::effectiveOnly($roles));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testCustomerExpertClaimOnlyProducesANomination(): void
|
||||||
|
{
|
||||||
|
$roles = Role::sync([], [Role::CUSTOMER_EXPERT]);
|
||||||
|
|
||||||
|
self::assertSame([Role::pending(Role::CUSTOMER_EXPERT), Role::CUSTOMER], $roles);
|
||||||
|
self::assertSame([Role::CUSTOMER], Role::effectiveOnly($roles));
|
||||||
|
self::assertSame(
|
||||||
|
[Role::CUSTOMER_EXPERT => 'KO-Experte'],
|
||||||
|
Role::nominatedFrom($roles),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testApprovedCustomerExpertDisplacesTheCustomerFallback(): void
|
||||||
|
{
|
||||||
|
$roles = Role::approve([Role::pending(Role::CUSTOMER_EXPERT), Role::CUSTOMER], Role::CUSTOMER_EXPERT);
|
||||||
|
|
||||||
|
self::assertSame([Role::CUSTOMER_EXPERT], $roles);
|
||||||
|
}
|
||||||
|
|
||||||
public function testApprovedRoleSurvivesTheNextSyncAndIsNotMarkedAgain(): void
|
public function testApprovedRoleSurvivesTheNextSyncAndIsNotMarkedAgain(): void
|
||||||
{
|
{
|
||||||
$roles = Role::sync([Role::TEAMER, Role::GROUPS_ADMIN], [Role::GROUPS_ADMIN, Role::TEAMER]);
|
$roles = Role::sync([Role::TEAMER, Role::GROUPS_ADMIN], [Role::GROUPS_ADMIN, Role::TEAMER]);
|
||||||
|
|||||||
Reference in New Issue
Block a user