diff --git a/devdocs/specs/core-roles.txt b/devdocs/specs/core-roles.txt
index 894d0f79..9b4826e5 100644
--- a/devdocs/specs/core-roles.txt
+++ b/devdocs/specs/core-roles.txt
@@ -216,6 +216,7 @@ Can't select new parts only uses existing ones
ONLY ACCESS TO DASHBOARD TO SEE *THEIR* SHIT, SERVICE NAV ITEMS NOT VISIBLE
### SubContractorFull
+See case 1465 mentioned above
Same as limited except can also see the client name and address and can select parts and other things to add to workorder but not see any details about those things outside the wo view
see roles.odt for more info
diff --git a/server/AyaNova/biz/AuthorizationRoles.cs b/server/AyaNova/biz/AuthorizationRoles.cs
index adc2b4b5..bcdd6828 100644
--- a/server/AyaNova/biz/AuthorizationRoles.cs
+++ b/server/AyaNova/biz/AuthorizationRoles.cs
@@ -33,9 +33,9 @@ namespace AyaNova.Biz
///TechFull
TechFull = 256,
///SubContractorLimited
- SubContractorLimited = 512,
+ SubContractorLimited = 512, //same as tech but restricted by further business rules (more fine grained)
///SubContractorFull
- SubContractorFull = 1024,
+ SubContractorFull = 1024,//same as tech limited but restricted by further business rules (more fine grained)
///ClientLimited
CustomerLimited = 2048,
///ClientFull
diff --git a/server/AyaNova/biz/BizRoles.cs b/server/AyaNova/biz/BizRoles.cs
index ef9185b0..1ad391b0 100644
--- a/server/AyaNova/biz/BizRoles.cs
+++ b/server/AyaNova/biz/BizRoles.cs
@@ -244,78 +244,89 @@ namespace AyaNova.Biz
//
roles.Add(AyaType.WorkOrder, new BizRoleSet()
{
- Change = AuthorizationRoles.BizAdminFull | AuthorizationRoles.DispatchFull | AuthorizationRoles.TechFull | AuthorizationRoles.AccountingFull,
- ReadFullRecord = AuthorizationRoles.BizAdminLimited | AuthorizationRoles.DispatchLimited | AuthorizationRoles.SalesFull | AuthorizationRoles.SalesLimited | AuthorizationRoles.TechLimited,
+ Change = AuthorizationRoles.BizAdminFull | AuthorizationRoles.DispatchFull | AuthorizationRoles.TechFull | AuthorizationRoles.SubContractorFull |AuthorizationRoles.AccountingFull,
+ ReadFullRecord = AuthorizationRoles.BizAdminLimited | AuthorizationRoles.DispatchLimited | AuthorizationRoles.SalesFull |
+ AuthorizationRoles.SalesLimited | AuthorizationRoles.SubContractorLimited | AuthorizationRoles.TechLimited,
Select = AuthorizationRoles.All
});
roles.Add(AyaType.WorkOrderItem, new BizRoleSet()
{
- Change = AuthorizationRoles.BizAdminFull | AuthorizationRoles.DispatchFull | AuthorizationRoles.TechFull | AuthorizationRoles.AccountingFull,
- ReadFullRecord = AuthorizationRoles.BizAdminLimited | AuthorizationRoles.DispatchLimited | AuthorizationRoles.SalesFull | AuthorizationRoles.SalesLimited | AuthorizationRoles.TechLimited,
+ Change = AuthorizationRoles.BizAdminFull | AuthorizationRoles.DispatchFull | AuthorizationRoles.TechFull | AuthorizationRoles.SubContractorFull |AuthorizationRoles.AccountingFull,
+ ReadFullRecord = AuthorizationRoles.BizAdminLimited | AuthorizationRoles.DispatchLimited | AuthorizationRoles.SalesFull |
+ AuthorizationRoles.SalesLimited | AuthorizationRoles.SubContractorLimited | AuthorizationRoles.TechLimited,
Select = AuthorizationRoles.All
});
roles.Add(AyaType.WorkOrderItemExpense, new BizRoleSet()
{
- Change = AuthorizationRoles.BizAdminFull | AuthorizationRoles.DispatchFull | AuthorizationRoles.TechFull | AuthorizationRoles.AccountingFull,
- ReadFullRecord = AuthorizationRoles.BizAdminLimited | AuthorizationRoles.DispatchLimited | AuthorizationRoles.SalesFull | AuthorizationRoles.SalesLimited | AuthorizationRoles.TechLimited,
+ Change = AuthorizationRoles.BizAdminFull | AuthorizationRoles.DispatchFull | AuthorizationRoles.TechFull | AuthorizationRoles.SubContractorFull |AuthorizationRoles.AccountingFull,
+ ReadFullRecord = AuthorizationRoles.BizAdminLimited | AuthorizationRoles.DispatchLimited | AuthorizationRoles.SalesFull |
+ AuthorizationRoles.SalesLimited | AuthorizationRoles.SubContractorLimited | AuthorizationRoles.TechLimited,
Select = AuthorizationRoles.All
});
roles.Add(AyaType.WorkOrderItemLabor, new BizRoleSet()
{
- Change = AuthorizationRoles.BizAdminFull | AuthorizationRoles.DispatchFull | AuthorizationRoles.TechFull | AuthorizationRoles.AccountingFull,
- ReadFullRecord = AuthorizationRoles.BizAdminLimited | AuthorizationRoles.DispatchLimited | AuthorizationRoles.SalesFull | AuthorizationRoles.SalesLimited | AuthorizationRoles.TechLimited,
+ Change = AuthorizationRoles.BizAdminFull | AuthorizationRoles.DispatchFull | AuthorizationRoles.TechFull | AuthorizationRoles.SubContractorFull |AuthorizationRoles.AccountingFull,
+ ReadFullRecord = AuthorizationRoles.BizAdminLimited | AuthorizationRoles.DispatchLimited | AuthorizationRoles.SalesFull |
+ AuthorizationRoles.SalesLimited | AuthorizationRoles.SubContractorLimited | AuthorizationRoles.TechLimited,
Select = AuthorizationRoles.All
});
roles.Add(AyaType.WorkOrderItemLoan, new BizRoleSet()
{
- Change = AuthorizationRoles.BizAdminFull | AuthorizationRoles.DispatchFull | AuthorizationRoles.TechFull | AuthorizationRoles.AccountingFull,
- ReadFullRecord = AuthorizationRoles.BizAdminLimited | AuthorizationRoles.DispatchLimited | AuthorizationRoles.SalesFull | AuthorizationRoles.SalesLimited | AuthorizationRoles.TechLimited,
+ Change = AuthorizationRoles.BizAdminFull | AuthorizationRoles.DispatchFull | AuthorizationRoles.TechFull | AuthorizationRoles.SubContractorFull |AuthorizationRoles.AccountingFull,
+ ReadFullRecord = AuthorizationRoles.BizAdminLimited | AuthorizationRoles.DispatchLimited | AuthorizationRoles.SalesFull |
+ AuthorizationRoles.SalesLimited | AuthorizationRoles.SubContractorLimited | AuthorizationRoles.TechLimited,
Select = AuthorizationRoles.All
});
roles.Add(AyaType.WorkOrderItemPart, new BizRoleSet()
{
- Change = AuthorizationRoles.BizAdminFull | AuthorizationRoles.DispatchFull | AuthorizationRoles.TechFull | AuthorizationRoles.AccountingFull,
- ReadFullRecord = AuthorizationRoles.BizAdminLimited | AuthorizationRoles.DispatchLimited | AuthorizationRoles.SalesFull | AuthorizationRoles.SalesLimited | AuthorizationRoles.TechLimited,
+ Change = AuthorizationRoles.BizAdminFull | AuthorizationRoles.DispatchFull | AuthorizationRoles.TechFull | AuthorizationRoles.SubContractorFull |AuthorizationRoles.AccountingFull,
+ ReadFullRecord = AuthorizationRoles.BizAdminLimited | AuthorizationRoles.DispatchLimited | AuthorizationRoles.SalesFull |
+ AuthorizationRoles.SalesLimited | AuthorizationRoles.SubContractorLimited | AuthorizationRoles.TechLimited,
Select = AuthorizationRoles.All
});
roles.Add(AyaType.WorkOrderItemPartRequest, new BizRoleSet()
{
- Change = AuthorizationRoles.BizAdminFull | AuthorizationRoles.DispatchFull | AuthorizationRoles.TechFull | AuthorizationRoles.AccountingFull,
- ReadFullRecord = AuthorizationRoles.BizAdminLimited | AuthorizationRoles.DispatchLimited | AuthorizationRoles.SalesFull | AuthorizationRoles.SalesLimited | AuthorizationRoles.TechLimited,
+ Change = AuthorizationRoles.BizAdminFull | AuthorizationRoles.DispatchFull | AuthorizationRoles.TechFull | AuthorizationRoles.SubContractorFull |AuthorizationRoles.AccountingFull,
+ ReadFullRecord = AuthorizationRoles.BizAdminLimited | AuthorizationRoles.DispatchLimited | AuthorizationRoles.SalesFull |
+ AuthorizationRoles.SalesLimited | AuthorizationRoles.SubContractorLimited | AuthorizationRoles.TechLimited,
Select = AuthorizationRoles.All
});
roles.Add(AyaType.WorkOrderItemScheduledUser, new BizRoleSet()
{
- Change = AuthorizationRoles.BizAdminFull | AuthorizationRoles.DispatchFull | AuthorizationRoles.TechFull | AuthorizationRoles.AccountingFull,
- ReadFullRecord = AuthorizationRoles.BizAdminLimited | AuthorizationRoles.DispatchLimited | AuthorizationRoles.SalesFull | AuthorizationRoles.SalesLimited | AuthorizationRoles.TechLimited,
+ Change = AuthorizationRoles.BizAdminFull | AuthorizationRoles.DispatchFull | AuthorizationRoles.TechFull | AuthorizationRoles.SubContractorFull |AuthorizationRoles.AccountingFull,
+ ReadFullRecord = AuthorizationRoles.BizAdminLimited | AuthorizationRoles.DispatchLimited | AuthorizationRoles.SalesFull |
+ AuthorizationRoles.SalesLimited | AuthorizationRoles.SubContractorLimited | AuthorizationRoles.TechLimited,
Select = AuthorizationRoles.All
});
roles.Add(AyaType.WorkOrderItemTask, new BizRoleSet()
{
- Change = AuthorizationRoles.BizAdminFull | AuthorizationRoles.DispatchFull | AuthorizationRoles.TechFull | AuthorizationRoles.AccountingFull,
- ReadFullRecord = AuthorizationRoles.BizAdminLimited | AuthorizationRoles.DispatchLimited | AuthorizationRoles.SalesFull | AuthorizationRoles.SalesLimited | AuthorizationRoles.TechLimited,
+ Change = AuthorizationRoles.BizAdminFull | AuthorizationRoles.DispatchFull | AuthorizationRoles.TechFull | AuthorizationRoles.SubContractorFull |AuthorizationRoles.AccountingFull,
+ ReadFullRecord = AuthorizationRoles.BizAdminLimited | AuthorizationRoles.DispatchLimited | AuthorizationRoles.SalesFull |
+ AuthorizationRoles.SalesLimited | AuthorizationRoles.SubContractorLimited | AuthorizationRoles.TechLimited,
Select = AuthorizationRoles.All
});
roles.Add(AyaType.WorkOrderItemTravel, new BizRoleSet()
{
- Change = AuthorizationRoles.BizAdminFull | AuthorizationRoles.DispatchFull | AuthorizationRoles.TechFull | AuthorizationRoles.AccountingFull,
- ReadFullRecord = AuthorizationRoles.BizAdminLimited | AuthorizationRoles.DispatchLimited | AuthorizationRoles.SalesFull | AuthorizationRoles.SalesLimited | AuthorizationRoles.TechLimited,
+ Change = AuthorizationRoles.BizAdminFull | AuthorizationRoles.DispatchFull | AuthorizationRoles.TechFull | AuthorizationRoles.SubContractorFull |AuthorizationRoles.AccountingFull,
+ ReadFullRecord = AuthorizationRoles.BizAdminLimited | AuthorizationRoles.DispatchLimited | AuthorizationRoles.SalesFull |
+ AuthorizationRoles.SalesLimited | AuthorizationRoles.SubContractorLimited | AuthorizationRoles.TechLimited,
Select = AuthorizationRoles.All
});
roles.Add(AyaType.WorkOrderItemUnit, new BizRoleSet()
{
- Change = AuthorizationRoles.BizAdminFull | AuthorizationRoles.DispatchFull | AuthorizationRoles.TechFull | AuthorizationRoles.AccountingFull,
- ReadFullRecord = AuthorizationRoles.BizAdminLimited | AuthorizationRoles.DispatchLimited | AuthorizationRoles.SalesFull | AuthorizationRoles.SalesLimited | AuthorizationRoles.TechLimited,
+ Change = AuthorizationRoles.BizAdminFull | AuthorizationRoles.DispatchFull | AuthorizationRoles.TechFull | AuthorizationRoles.SubContractorFull |AuthorizationRoles.AccountingFull,
+ ReadFullRecord = AuthorizationRoles.BizAdminLimited | AuthorizationRoles.DispatchLimited | AuthorizationRoles.SalesFull |
+ AuthorizationRoles.SalesLimited | AuthorizationRoles.SubContractorLimited | AuthorizationRoles.TechLimited,
Select = AuthorizationRoles.All
});
//---
@@ -411,8 +422,8 @@ namespace AyaNova.Biz
//
roles.Add(AyaType.License, new BizRoleSet()
{
- Change = AuthorizationRoles.BizAdminFull | AuthorizationRoles.OpsAdminFull,
- ReadFullRecord = AuthorizationRoles.BizAdminLimited | AuthorizationRoles.OpsAdminLimited
+ Change = AuthorizationRoles.BizAdminFull,
+ ReadFullRecord = AuthorizationRoles.BizAdminLimited
});
////////////////////////////////////////////////////////////
@@ -494,10 +505,11 @@ namespace AyaNova.Biz
//
roles.Add(AyaType.Translation, new BizRoleSet()
{
- Change = AuthorizationRoles.BizAdminFull | AuthorizationRoles.OpsAdminFull,
+ Change = AuthorizationRoles.BizAdminFull,
//Anyone can read it because they need to to open a form, but also in UI
//only the bizadminlimited actually gets a link to see the customization page
- ReadFullRecord = AuthorizationRoles.All
+ ReadFullRecord = AuthorizationRoles.BizAdminLimited,
+ Select = AuthorizationRoles.All
});
@@ -603,7 +615,7 @@ namespace AyaNova.Biz
System.Diagnostics.Debugger.Log(1, "JSONFRAGMENTFORCLIENT", json);
//ONGOING VALIDATION TO CATCH MISMATCH WHEN NEW ROLES ADDED (wont' catch changes to existing unfortunately)
- var lastRoles = "{\"Customer\":{\"Change\":33098,\"ReadFullRecord\":65669,\"Select\":131071},\"CustomerNote\":{\"Change\":33098,\"ReadFullRecord\":65669,\"Select\":131071},\"Contract\":{\"Change\":33098,\"ReadFullRecord\":65669,\"Select\":131071},\"HeadOffice\":{\"Change\":33098,\"ReadFullRecord\":65669,\"Select\":131071},\"LoanUnit\":{\"Change\":33098,\"ReadFullRecord\":65669,\"Select\":131071},\"Part\":{\"Change\":98,\"ReadFullRecord\":98717,\"Select\":131071},\"PurchaseOrder\":{\"Change\":98,\"ReadFullRecord\":98717,\"Select\":131071},\"PM\":{\"Change\":33098,\"ReadFullRecord\":65669,\"Select\":131071},\"PMItem\":{\"Change\":33098,\"ReadFullRecord\":65669,\"Select\":131071},\"PMTemplate\":{\"Change\":33098,\"ReadFullRecord\":65669,\"Select\":131071},\"PMTemplateItem\":{\"Change\":33098,\"ReadFullRecord\":65669,\"Select\":131071},\"Project\":{\"Change\":33098,\"ReadFullRecord\":65669,\"Select\":131071},\"Quote\":{\"Change\":33098,\"ReadFullRecord\":65669,\"Select\":131071},\"QuoteItem\":{\"Change\":33098,\"ReadFullRecord\":65669,\"Select\":131071},\"QuoteTemplate\":{\"Change\":33098,\"ReadFullRecord\":65669,\"Select\":131071},\"QuoteTemplateItem\":{\"Change\":33098,\"ReadFullRecord\":65669,\"Select\":131071},\"Unit\":{\"Change\":33098,\"ReadFullRecord\":65669,\"Select\":131071},\"UnitModel\":{\"Change\":33098,\"ReadFullRecord\":65669,\"Select\":131071},\"Vendor\":{\"Change\":33098,\"ReadFullRecord\":65669,\"Select\":131071},\"WorkOrder\":{\"Change\":330,\"ReadFullRecord\":98437,\"Select\":131071},\"WorkOrderItem\":{\"Change\":330,\"ReadFullRecord\":98437,\"Select\":131071},\"WorkOrderItemExpense\":{\"Change\":330,\"ReadFullRecord\":98437,\"Select\":131071},\"WorkOrderItemLabor\":{\"Change\":330,\"ReadFullRecord\":98437,\"Select\":131071},\"WorkOrderItemLoan\":{\"Change\":330,\"ReadFullRecord\":98437,\"Select\":131071},\"WorkOrderItemPart\":{\"Change\":330,\"ReadFullRecord\":98437,\"Select\":131071},\"WorkOrderItemPartRequest\":{\"Change\":330,\"ReadFullRecord\":98437,\"Select\":131071},\"WorkOrderItemScheduledUser\":{\"Change\":330,\"ReadFullRecord\":98437,\"Select\":131071},\"WorkOrderItemTask\":{\"Change\":330,\"ReadFullRecord\":98437,\"Select\":131071},\"WorkOrderItemTravel\":{\"Change\":330,\"ReadFullRecord\":98437,\"Select\":131071},\"WorkOrderItemUnit\":{\"Change\":330,\"ReadFullRecord\":98437,\"Select\":131071},\"WorkOrderTemplate\":{\"Change\":33098,\"ReadFullRecord\":65669,\"Select\":131071},\"WorkOrderTemplateItem\":{\"Change\":33098,\"ReadFullRecord\":65669,\"Select\":131071},\"Global\":{\"Change\":2,\"ReadFullRecord\":1,\"Select\":0},\"GlobalOps\":{\"Change\":16384,\"ReadFullRecord\":8192,\"Select\":0},\"User\":{\"Change\":2,\"ReadFullRecord\":1,\"Select\":131071},\"UserOptions\":{\"Change\":2,\"ReadFullRecord\":1,\"Select\":0},\"Widget\":{\"Change\":34,\"ReadFullRecord\":17,\"Select\":131071},\"ServerState\":{\"Change\":16384,\"ReadFullRecord\":131071,\"Select\":0},\"License\":{\"Change\":16386,\"ReadFullRecord\":8193,\"Select\":0},\"TrialSeeder\":{\"Change\":16386,\"ReadFullRecord\":8193,\"Select\":0},\"LogFile\":{\"Change\":0,\"ReadFullRecord\":24576,\"Select\":0},\"Backup\":{\"Change\":16384,\"ReadFullRecord\":8195,\"Select\":0},\"FileAttachment\":{\"Change\":2,\"ReadFullRecord\":3,\"Select\":0},\"ServerJob\":{\"Change\":16384,\"ReadFullRecord\":8195,\"Select\":0},\"OpsNotificationSettings\":{\"Change\":16384,\"ReadFullRecord\":8195,\"Select\":0},\"ServerMetrics\":{\"Change\":16384,\"ReadFullRecord\":24576,\"Select\":0},\"Translation\":{\"Change\":16386,\"ReadFullRecord\":131071,\"Select\":0},\"DataListView\":{\"Change\":2,\"ReadFullRecord\":131071,\"Select\":0},\"FormCustom\":{\"Change\":2,\"ReadFullRecord\":131071,\"Select\":0},\"PickListTemplate\":{\"Change\":2,\"ReadFullRecord\":131071,\"Select\":0},\"BizMetrics\":{\"Change\":2,\"ReadFullRecord\":98369,\"Select\":0},\"Notification\":{\"Change\":131071,\"ReadFullRecord\":131071,\"Select\":0},\"NotifySubscription\":{\"Change\":131071,\"ReadFullRecord\":131071,\"Select\":0},\"Report\":{\"Change\":3,\"ReadFullRecord\":131071,\"Select\":131071},\"CustomerServiceRequest\":{\"Change\":4106,\"ReadFullRecord\":2437,\"Select\":131071}}";
+ var lastRoles = "{\"Customer\":{\"Change\":33098,\"ReadFullRecord\":65669,\"Select\":131071},\"CustomerNote\":{\"Change\":33098,\"ReadFullRecord\":65669,\"Select\":131071},\"Contract\":{\"Change\":33098,\"ReadFullRecord\":65669,\"Select\":131071},\"HeadOffice\":{\"Change\":33098,\"ReadFullRecord\":65669,\"Select\":131071},\"LoanUnit\":{\"Change\":33098,\"ReadFullRecord\":65669,\"Select\":131071},\"Part\":{\"Change\":98,\"ReadFullRecord\":98717,\"Select\":131071},\"PurchaseOrder\":{\"Change\":98,\"ReadFullRecord\":98717,\"Select\":131071},\"PM\":{\"Change\":33098,\"ReadFullRecord\":65669,\"Select\":131071},\"PMItem\":{\"Change\":33098,\"ReadFullRecord\":65669,\"Select\":131071},\"PMTemplate\":{\"Change\":33098,\"ReadFullRecord\":65669,\"Select\":131071},\"PMTemplateItem\":{\"Change\":33098,\"ReadFullRecord\":65669,\"Select\":131071},\"Project\":{\"Change\":33098,\"ReadFullRecord\":65669,\"Select\":131071},\"Quote\":{\"Change\":33098,\"ReadFullRecord\":65669,\"Select\":131071},\"QuoteItem\":{\"Change\":33098,\"ReadFullRecord\":65669,\"Select\":131071},\"QuoteTemplate\":{\"Change\":33098,\"ReadFullRecord\":65669,\"Select\":131071},\"QuoteTemplateItem\":{\"Change\":33098,\"ReadFullRecord\":65669,\"Select\":131071},\"Unit\":{\"Change\":33098,\"ReadFullRecord\":65669,\"Select\":131071},\"UnitModel\":{\"Change\":33098,\"ReadFullRecord\":65669,\"Select\":131071},\"Vendor\":{\"Change\":33098,\"ReadFullRecord\":65669,\"Select\":131071},\"WorkOrder\":{\"Change\":1354,\"ReadFullRecord\":98949,\"Select\":131071},\"WorkOrderItem\":{\"Change\":1354,\"ReadFullRecord\":98949,\"Select\":131071},\"WorkOrderItemExpense\":{\"Change\":1354,\"ReadFullRecord\":98949,\"Select\":131071},\"WorkOrderItemLabor\":{\"Change\":1354,\"ReadFullRecord\":98949,\"Select\":131071},\"WorkOrderItemLoan\":{\"Change\":1354,\"ReadFullRecord\":98949,\"Select\":131071},\"WorkOrderItemPart\":{\"Change\":1354,\"ReadFullRecord\":98949,\"Select\":131071},\"WorkOrderItemPartRequest\":{\"Change\":1354,\"ReadFullRecord\":98949,\"Select\":131071},\"WorkOrderItemScheduledUser\":{\"Change\":1354,\"ReadFullRecord\":98949,\"Select\":131071},\"WorkOrderItemTask\":{\"Change\":1354,\"ReadFullRecord\":98949,\"Select\":131071},\"WorkOrderItemTravel\":{\"Change\":1354,\"ReadFullRecord\":98949,\"Select\":131071},\"WorkOrderItemUnit\":{\"Change\":1354,\"ReadFullRecord\":98949,\"Select\":131071},\"WorkOrderTemplate\":{\"Change\":33098,\"ReadFullRecord\":65669,\"Select\":131071},\"WorkOrderTemplateItem\":{\"Change\":33098,\"ReadFullRecord\":65669,\"Select\":131071},\"Global\":{\"Change\":2,\"ReadFullRecord\":1,\"Select\":0},\"GlobalOps\":{\"Change\":16384,\"ReadFullRecord\":8192,\"Select\":0},\"User\":{\"Change\":2,\"ReadFullRecord\":1,\"Select\":131071},\"UserOptions\":{\"Change\":2,\"ReadFullRecord\":1,\"Select\":0},\"Widget\":{\"Change\":34,\"ReadFullRecord\":17,\"Select\":131071},\"ServerState\":{\"Change\":16384,\"ReadFullRecord\":131071,\"Select\":0},\"License\":{\"Change\":2,\"ReadFullRecord\":1,\"Select\":0},\"TrialSeeder\":{\"Change\":16386,\"ReadFullRecord\":8193,\"Select\":0},\"LogFile\":{\"Change\":0,\"ReadFullRecord\":24576,\"Select\":0},\"Backup\":{\"Change\":16384,\"ReadFullRecord\":8195,\"Select\":0},\"FileAttachment\":{\"Change\":2,\"ReadFullRecord\":3,\"Select\":0},\"ServerJob\":{\"Change\":16384,\"ReadFullRecord\":8195,\"Select\":0},\"OpsNotificationSettings\":{\"Change\":16384,\"ReadFullRecord\":8195,\"Select\":0},\"ServerMetrics\":{\"Change\":16384,\"ReadFullRecord\":24576,\"Select\":0},\"Translation\":{\"Change\":2,\"ReadFullRecord\":1,\"Select\":131071},\"DataListView\":{\"Change\":2,\"ReadFullRecord\":131071,\"Select\":0},\"FormCustom\":{\"Change\":2,\"ReadFullRecord\":131071,\"Select\":0},\"PickListTemplate\":{\"Change\":2,\"ReadFullRecord\":131071,\"Select\":0},\"BizMetrics\":{\"Change\":2,\"ReadFullRecord\":98369,\"Select\":0},\"Notification\":{\"Change\":131071,\"ReadFullRecord\":131071,\"Select\":0},\"NotifySubscription\":{\"Change\":131071,\"ReadFullRecord\":131071,\"Select\":0},\"Report\":{\"Change\":3,\"ReadFullRecord\":131071,\"Select\":131071},\"CustomerServiceRequest\":{\"Change\":4106,\"ReadFullRecord\":2437,\"Select\":131071}}";
Dictionary lastRolesDeserialized = Newtonsoft.Json.JsonConvert.DeserializeObject>(lastRoles);
if (lastRolesDeserialized.Count != roles.Count)