feat(field_sales) : fondations du module Tournées + VisitableInterface + RBAC (ERP-123)
- Module FieldSales (ID field_sales, REQUIRED false) avec 2 permissions field_sales.tours.view / .manage (scope V0.2, pas de reports.*), active dans config/modules.php. - Contrat partage VisitableInterface (getId/getDisplayName/getVisitableType) implemente par Client (client) et Supplier (supplier) sans import inter-module. Note doctrine.yaml : contrat polymorphe (2 implementations) donc resolu par service via (tier_type, tier_id), pas via resolve_target_entities. - 3 miroirs RBAC alignes : sidebar.php (section Tournées, item /tours, i18n sidebar.field_sales.*), personas.ts et SeedE2ECommand.php (user-full) ; matrice metier RbacSeeder (Commerciale = view+manage, Bureau = view, Compta exclue, Admin bypass).
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Tests\Module\FieldSales;
|
||||
|
||||
use App\Module\FieldSales\FieldSalesModule;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
/**
|
||||
* Tests structurels du module FieldSales (M6) : identite du module et contrat
|
||||
* `permissions()`. Fige le set de permissions du scope V0.2 (tournees seules,
|
||||
* plus aucune permission `reports.*`).
|
||||
*
|
||||
* @internal
|
||||
*/
|
||||
final class FieldSalesModuleTest extends TestCase
|
||||
{
|
||||
public function testModuleIdentity(): void
|
||||
{
|
||||
self::assertSame('field_sales', FieldSalesModule::ID);
|
||||
self::assertSame('Tournées', FieldSalesModule::LABEL);
|
||||
self::assertFalse(FieldSalesModule::REQUIRED);
|
||||
}
|
||||
|
||||
public function testPermissionsSetContainsExactlyTwoCodes(): void
|
||||
{
|
||||
// Garde-fou : si quelqu'un ajoute/retire une permission sans ajuster les
|
||||
// tests ou la doc, ce test casse explicitement. Le scope V0.2 est limite
|
||||
// aux tournees (view + manage) : aucune permission `reports.*`.
|
||||
$codes = array_column(FieldSalesModule::permissions(), 'code');
|
||||
sort($codes);
|
||||
|
||||
self::assertSame(
|
||||
['field_sales.tours.manage', 'field_sales.tours.view'],
|
||||
$codes,
|
||||
);
|
||||
}
|
||||
|
||||
public function testEveryPermissionCodeIsPrefixedByModuleId(): void
|
||||
{
|
||||
// Invariant verifie aussi par app:sync-permissions : chaque code doit
|
||||
// etre prefixe par "<ID>." (sinon la commande de sync echoue).
|
||||
foreach (FieldSalesModule::permissions() as $permission) {
|
||||
self::assertStringStartsWith(FieldSalesModule::ID.'.', $permission['code']);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user