Droit d’accès aux données
Il faut filtrer l’accès aux données comme le fait les filtres de synchro du FO.
Il existe pour cela le mécanisme du rowaccess.
Ce mécanisme est déjà utilisé pour customer dans le BO.
Il permet de restreindre l’accès à 2 niveaux :
la fiche n’est pas accessible pour un ID donné
la ligne n’est pas accessible dans une liste
Note : toutefois la liste peut restreindre l’accès à une ligne d’une autre manière.
Calcul du rowaccess
A la fin du login, dans le script project.settings.projectsettings.scriptlibrary.ts, on exécute
await $rowAccess.setByDatasourceAsync(…) avec un datasource de type rowaccess, qui va lister l’ensemble des ID accessibles pour un device_ID (utilisateur connecté) pour une table.
Note : setByDatasourceAsync dispose d’un délai pour être applicable (pour éviter le recalcul lorsque l’utilisateur pratique beaucoup le F5).
Mais on peut le forcer avec le 2e paramètre à true. C’est ce que l’on fait par exemple lorsque l’on ajoute un nouveau tiers.
Si la table sw_sys_rowaccess ne contient aucune ligne pour un metatable_ID donné, tous les utilisateurs ont aucune restriction pour cette table.
Si la table sw_sys_rowaccess contient au moins une ligne pour un metatable_ID donné, un utilisateur (device_ID) qui n’a pas de ligne à aucun accès à cette table.
Pour information, la table sw_sys_rowaccessstatus contient le temps de calcul du rowaccess pour un utilisateur (device_ID) et une table (metatable_ID).
Comment utiliser le rowaccess
Dans un Crud
Rien est nécessaire, le système ne permet pas de charger un crud avec une table pour un ID qui n’est pas dans la table rowaccess.
Dans une Grid (requête SQL)
La syntaxe {{TABLE(<nom_de_table>, <alias_de_table>)}} permet d’introduire via le système un filtrage de la table principale ou de la table en jointure.
Dans une liste d’entité
Il y a plusieurs méthodes pour filtrer l’accès aux données
En lien avec le rowaccess
Avoir un rowaccess sur la table liée à l’entité va filtrer directement la liste comme la syntaxe {{TABLE(<nom_de_table>, <alias_de_table>)}}
Avoir une colonne avec la propriété Data.ApplyRestrictions(.RowAccessDepth)
Automatiquement à true avec une Constraints required.
Exemple 1
Dans le schema customeraddress on ajoute pour la colonne customer_ID"ApplyRestrictions" = true
Cela se traduire : j’ai accès aux adresses des tiers dont j’ai le droit d’accès avec rowaccess.
Exemple 2
En plus de l’exemple précédent, dans le schema intervention on ajoute pour la colonne customeraddress_ID”ApplyRestrictions” = true
Cela se traduit : j’ai accès aux interventions dont le site (l’adresse) est accessible dont le tiers est accessible.
Attention : ApplyRestrictions se base uniquement sur le schema dont le nom correspond à la table.
Sans rowaccess
La jointure sur une foreign pour être en INNER JOIN (voir Colonnes d’entité | Data.Relation.RelationStrength)
Un ou plusieurs datafilters appliqués