Skip to content

Commit 11964ad

Browse files
authored
Track OrgLimits data on Log__c (#646)
* Added new field Log__c.OrganizationLimits__c to capture org limits data from the class System.OrgLimits * Added a new LoggerParameter__mdt record, StoreOrganizationLimits, to control if org limits data is captured * Added new checkbox field Log__c.HasOrganizationLimits__c to help with filtering on records that have a value populated in Log__c.OrganizationLimits__c * Added new LWC logOrganizationLimits to parse the JSON stored in Log__c.OrganizationLimits__c and display it in a page section, similar to how the LogEntry__c formula fields for transaction limits are displayed using Dynamic Forms * Scope creep: added a new LoggerParameter__mdt record, StoreTransactionLimits, to control if transaction limits are retrieved from the class System.Limits & stored on LogEntry__c. Previously, transaction limits were always populated, with no way to disable it - using the Limits class does seem to have some overheaded, so being able to disable this functionality can, hilariously, help with limits. * Scope creep: Fixed some padding in loggerPageSection.html so it's more consistent with 'real' field section headers * Scope creep: added some new npm scripts in package.json for using 'sf apex tail log'
1 parent 5835da6 commit 11964ad

27 files changed

Lines changed: 739 additions & 50 deletions

README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@
55

66
The most robust logger for Salesforce. Works with Apex, Lightning Components, Flow, Process Builder & Integrations. Designed for Salesforce admins, developers & architects.
77

8-
## Unlocked Package - v4.13.1
8+
## Unlocked Package - v4.13.2
99

10-
[![Install Unlocked Package in a Sandbox](./images/btn-install-unlocked-package-sandbox.png)](https://test.salesforce.com/packaging/installPackage.apexp?p0=04t5Y000001MkE3QAK)
11-
[![Install Unlocked Package in Production](./images/btn-install-unlocked-package-production.png)](https://login.salesforce.com/packaging/installPackage.apexp?p0=04t5Y000001MkE3QAK)
10+
[![Install Unlocked Package in a Sandbox](./images/btn-install-unlocked-package-sandbox.png)](https://test.salesforce.com/packaging/installPackage.apexp?p0=04t5Y000001MkEmQAK)
11+
[![Install Unlocked Package in Production](./images/btn-install-unlocked-package-production.png)](https://login.salesforce.com/packaging/installPackage.apexp?p0=04t5Y000001MkEmQAK)
1212
[![View Documentation](./images/btn-view-documentation.png)](https://jongpie.github.io/NebulaLogger/)
1313

14-
`sf package install --wait 20 --security-type AdminsOnly --package 04t5Y000001MkE3QAK`
14+
`sf package install --wait 20 --security-type AdminsOnly --package 04t5Y000001MkEmQAK`
1515

16-
`sfdx force:package:install --wait 20 --securitytype AdminsOnly --package 04t5Y000001MkE3QAK`
16+
`sfdx force:package:install --wait 20 --securitytype AdminsOnly --package 04t5Y000001MkEmQAK`
1717

1818
---
1919

docs/apex/Configuration/LoggerParameter.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,10 @@ Indicates if Nebula Logger will send an error email notification if any internal
102102

103103
Indicates if Nebula Logger will store the header values when logging an instance of `System.HttpResponse`. Controlled by the custom metadata record `LoggerParameter.StoreHttpResponseHeaderValues`, or `true` as the default. Regardless of how this parameter is configured, Nebula Logger will still log the header keys of any instance of `System.HttpResponse` that is logged - this parameter only controls if the header values are stored.
104104

105+
#### `STORE_ORGANIZATION_LIMITS``Boolean`
106+
107+
Indicates if Nebula Logger will store the organization limits on `Log__c`, retrieved from the class `System.OrgLimits`. Controlled by the custom metadata record `LoggerParameter.StoreOrganizationLimits`, or `true` as the default.
108+
105109
#### `STORE_REST_REQUEST_HEADER_VALUES``Boolean`
106110

107111
Indicates if Nebula Logger will store the header values when logging an instance of `System.RestRequest`. Controlled by the custom metadata record `LoggerParameter.StoreRestRequestHeaderValues`, or `true` as the default. Regardless of how this parameter is configured, Nebula Logger will still log the header keys of any instance of `System.RestRequest` that is logged - this parameter only controls if the header values are stored.
@@ -110,6 +114,10 @@ Indicates if Nebula Logger will store the header values when logging an instance
110114

111115
Indicates if Nebula Logger will store the header values when logging an instance of `System.RestResponse`. Controlled by the custom metadata record `LoggerParameter.StoreRestResponseHeaderValues`, or `true` as the default. Regardless of how this parameter is configured, Nebula Logger will still log the header keys of any instance of `System.RestResponse` that is logged - this parameter only controls if the header values are stored.
112116

117+
#### `STORE_TRANSACTION_LIMITS``Boolean`
118+
119+
Indicates if Nebula Logger will store the transaction limits on `LogEntry__c`, retrieved from the class `System.Limits`. Controlled by the custom metadata record `LoggerParameter.StoreTransactionLimits`, or `true` as the default.
120+
113121
#### `SYSTEM_DEBUG_MESSAGE_FORMAT``String`
114122

115123
The merge-field syntax to use when calling System.debug(). Controlled by the custom metadata record `LoggerParameter.SystebugMessageFormat`, or `{OriginLocation__c}\n{Message__c}` as the default

docs/apex/Log-Management/LogHandler.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,16 @@ Manages setting fields on `Log__c` before insert & before update
88

99
---
1010

11+
### Properties
12+
13+
#### `Max``Integer`
14+
15+
#### `Name``String`
16+
17+
#### `Used``Integer`
18+
19+
---
20+
1121
### Methods
1222

1323
#### `getSObjectType()``Schema.SObjectType`

nebula-logger/core/main/configuration/classes/LoggerParameter.cls

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,20 @@ public class LoggerParameter {
365365
private set;
366366
}
367367

368+
/**
369+
* @description Indicates if Nebula Logger will store the organization limits on `Log__c`, retrieved from the class `System.OrgLimits`.
370+
* Controlled by the custom metadata record `LoggerParameter.StoreOrganizationLimits`, or `true` as the default.
371+
*/
372+
public static final Boolean STORE_ORGANIZATION_LIMITS {
373+
get {
374+
if (STORE_ORGANIZATION_LIMITS == null) {
375+
STORE_ORGANIZATION_LIMITS = getBoolean('StoreOrganizationLimits', true);
376+
}
377+
return STORE_ORGANIZATION_LIMITS;
378+
}
379+
private set;
380+
}
381+
368382
/**
369383
* @description Indicates if Nebula Logger will store the header values when logging an instance of `System.RestRequest`.
370384
* Controlled by the custom metadata record `LoggerParameter.StoreRestRequestHeaderValues`, or `true` as the default.
@@ -397,6 +411,20 @@ public class LoggerParameter {
397411
private set;
398412
}
399413

414+
/**
415+
* @description Indicates if Nebula Logger will store the transaction limits on `LogEntry__c`, retrieved from the class `System.Limits`.
416+
* Controlled by the custom metadata record `LoggerParameter.StoreTransactionLimits`, or `true` as the default.
417+
*/
418+
public static final Boolean STORE_TRANSACTION_LIMITS {
419+
get {
420+
if (STORE_TRANSACTION_LIMITS == null) {
421+
STORE_TRANSACTION_LIMITS = getBoolean('StoreTransactionLimits', true);
422+
}
423+
return STORE_TRANSACTION_LIMITS;
424+
}
425+
private set;
426+
}
427+
400428
/**
401429
* @description The merge-field syntax to use when calling System.debug().
402430
* Controlled by the custom metadata record `LoggerParameter.SystemDebugMessageFormat`, or `{OriginLocation__c}\n{Message__c}` as the default
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?xml version="1.0" encoding="UTF-8" ?>
2+
<CustomMetadata
3+
xmlns="http://soap.sforce.com/2006/04/metadata"
4+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5+
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
6+
>
7+
<label>Store Organization Limits</label>
8+
<protected>false</protected>
9+
<values>
10+
<field>Description__c</field>
11+
<value
12+
xsi:type="xsd:string"
13+
>When set to &apos;true&apos; (default), organization limits are retrieved from the class System.OrgLimits and stored on Log__c.
14+
15+
When set to &apos;false&apos;, organization limits are not retrieved or stored. This helps reduce some CPU time &amp; heap size usage.</value>
16+
</values>
17+
<values>
18+
<field>Value__c</field>
19+
<value xsi:type="xsd:string">true</value>
20+
</values>
21+
</CustomMetadata>
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?xml version="1.0" encoding="UTF-8" ?>
2+
<CustomMetadata
3+
xmlns="http://soap.sforce.com/2006/04/metadata"
4+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5+
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
6+
>
7+
<label>Store Transaction Limits</label>
8+
<protected>false</protected>
9+
<values>
10+
<field>Description__c</field>
11+
<value
12+
xsi:type="xsd:string"
13+
>When set to &apos;true&apos; (default), transaction limits are retrieved from the class System.Limits and stored on LogEntry__c.
14+
15+
When set to &apos;false&apos;, transaction limits are not retrieved or stored. This helps reduce some CPU time &amp; heap size usage.</value>
16+
</values>
17+
<values>
18+
<field>Value__c</field>
19+
<value xsi:type="xsd:string">true</value>
20+
</values>
21+
</CustomMetadata>

nebula-logger/core/main/log-management/classes/LogHandler.cls

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,20 @@
77
* @group Log Management
88
* @description Manages setting fields on `Log__c` before insert & before update
99
*/
10-
@SuppressWarnings('PMD.CognitiveComplexity, PMD.CyclomaticComplexity')
10+
@SuppressWarnings('PMD.CognitiveComplexity, PMD.CyclomaticComplexity, PMD.FieldDeclarationsShouldBeAtStart, PMD.PropertyNamingConventions')
1111
public without sharing class LogHandler extends LoggerSObjectHandler {
1212
private static final Map<String, LogStatus__mdt> MOCK_LOG_STATUS_TO_STATUS = new Map<String, LogStatus__mdt>();
1313

14+
private static final List<OrganizationLimit> ORGANIZATION_LIMITS {
15+
get {
16+
if (ORGANIZATION_LIMITS == null) {
17+
ORGANIZATION_LIMITS = loadOrganizationLimits();
18+
}
19+
return ORGANIZATION_LIMITS;
20+
}
21+
set;
22+
}
23+
1424
@TestVisible
1525
private List<Log__c> logs;
1626
@TestVisible
@@ -31,11 +41,13 @@ public without sharing class LogHandler extends LoggerSObjectHandler {
3141

3242
this.setHasCommentsField();
3343
this.setClosedStatusFields();
44+
this.setOrganizationLimits();
3445
// The log OwnerId field should support being manually changed, so only auto-set it on insert
3546
this.setOwnerId();
3647
this.setParentLog();
3748
// The log retention date field should support being manually changed, so only auto-set it on insert
3849
this.setLogRetentionDetails();
50+
this.setCheckboxFields();
3951
}
4052

4153
protected override void executeBeforeUpdate(Map<Id, SObject> triggerNewMap, Map<Id, SObject> triggerOldMap) {
@@ -46,6 +58,7 @@ public without sharing class LogHandler extends LoggerSObjectHandler {
4658
this.setClosedStatusFields();
4759
// Priority logic relies on roll-up fields, so only run on update (after log entries are inserted)
4860
this.setPriority();
61+
this.setCheckboxFields();
4962
}
5063

5164
protected override void executeAfterInsert(Map<Id, SObject> triggerNewMap) {
@@ -82,6 +95,16 @@ public without sharing class LogHandler extends LoggerSObjectHandler {
8295
}
8396
}
8497

98+
private void setOrganizationLimits() {
99+
if (LoggerParameter.STORE_ORGANIZATION_LIMITS == false) {
100+
return;
101+
}
102+
103+
for (Log__c log : this.logs) {
104+
log.OrganizationLimits__c = JSON.serializePretty(ORGANIZATION_LIMITS);
105+
}
106+
}
107+
85108
private void setOwnerId() {
86109
// Loop through the logs and figure out what value has been configured as the default owner (if any)
87110
Map<Id, String> ownerNamesByLoggingUserId = new Map<Id, String>();
@@ -197,6 +220,12 @@ public without sharing class LogHandler extends LoggerSObjectHandler {
197220
}
198221
}
199222

223+
private void setCheckboxFields() {
224+
for (Log__c log : this.logs) {
225+
log.HasOrganizationLimits__c = log.OrganizationLimits__c != null;
226+
}
227+
}
228+
200229
private void updateUnlinkedChildLogs() {
201230
Map<String, Log__c> transactionIdToPossibleParentLog = new Map<String, Log__c>();
202231
for (Log__c log : this.logs) {
@@ -262,6 +291,23 @@ public without sharing class LogHandler extends LoggerSObjectHandler {
262291
return logStatusNameToStatus;
263292
}
264293

294+
private static List<OrganizationLimit> loadOrganizationLimits() {
295+
List<OrganizationLimit> organizationLimits = new List<OrganizationLimit>();
296+
297+
List<String> systemOrgLimitNames = new List<String>(System.OrgLimits.getMap().keySet());
298+
systemOrgLimitNames.sort();
299+
for (String systemOrgLimitName : systemOrgLimitNames) {
300+
System.OrgLimit systemOrgLimit = System.OrgLimits.getMap().get(systemOrgLimitName);
301+
OrganizationLimit organizationLimit = new OrganizationLimit();
302+
organizationLimit.Name = systemOrgLimit.getName();
303+
organizationLimit.Used = systemOrgLimit.getValue();
304+
organizationLimit.Max = systemOrgLimit.getLimit();
305+
organizationLimits.add(organizationLimit);
306+
}
307+
308+
return organizationLimits;
309+
}
310+
265311
private static Map<Id, LoggerScenario__c> queryLoggerScenarios(List<Log__c> logs) {
266312
List<Id> loggerScenarioIds = new List<Id>();
267313
for (Log__c log : logs) {
@@ -303,4 +349,12 @@ public without sharing class LogHandler extends LoggerSObjectHandler {
303349
private static void setMockLogStatus(LogStatus__mdt logStatus) {
304350
MOCK_LOG_STATUS_TO_STATUS.put(logStatus.MasterLabel, logStatus);
305351
}
352+
353+
@SuppressWarnings('PMD.ApexDoc')
354+
@TestVisible
355+
private class OrganizationLimit {
356+
public String Name { get; set; }
357+
public Integer Used { get; set; }
358+
public Integer Max { get; set; }
359+
}
306360
}

nebula-logger/core/main/log-management/flexipages/LogRecordPage.flexipage-meta.xml

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1178,6 +1178,45 @@
11781178
<name>Facet-82b9e667-1aa4-42ed-8a09-ac611351ece9</name>
11791179
<type>Facet</type>
11801180
</flexiPageRegions>
1181+
<flexiPageRegions>
1182+
<itemInstances>
1183+
<componentInstance>
1184+
<componentInstanceProperties>
1185+
<name>decorate</name>
1186+
<value>true</value>
1187+
</componentInstanceProperties>
1188+
<componentInstanceProperties>
1189+
<name>richTextValue</name>
1190+
<value
1191+
>&lt;p style=&quot;text-align: center;&quot;&gt;&lt;strong&gt;No Organization Limits Data Available for This Log&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://ideas.salesforce.com/s/idea/a0B8W00000H6VzyUAF/allow-conditional-tabs-for-lightning-app-builder-tab-component&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Upvote this Idea&lt;/a&gt; to make this experience better&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;</value>
1192+
</componentInstanceProperties>
1193+
<componentName>flexipage:richText</componentName>
1194+
<identifier>flexipage_richText</identifier>
1195+
<visibilityRule>
1196+
<criteria>
1197+
<leftValue>{!Record.HasOrganizationLimits__c}</leftValue>
1198+
<operator>EQUAL</operator>
1199+
<rightValue>false</rightValue>
1200+
</criteria>
1201+
</visibilityRule>
1202+
</componentInstance>
1203+
</itemInstances>
1204+
<itemInstances>
1205+
<componentInstance>
1206+
<componentName>logOrganizationLimits</componentName>
1207+
<identifier>c_logOrganizationLimits</identifier>
1208+
<visibilityRule>
1209+
<criteria>
1210+
<leftValue>{!Record.HasOrganizationLimits__c}</leftValue>
1211+
<operator>EQUAL</operator>
1212+
<rightValue>true</rightValue>
1213+
</criteria>
1214+
</visibilityRule>
1215+
</componentInstance>
1216+
</itemInstances>
1217+
<name>Facet-fb2a30be-0705-474f-aaae-25d2ed03d33c</name>
1218+
<type>Facet</type>
1219+
</flexiPageRegions>
11811220
<flexiPageRegions>
11821221
<itemInstances>
11831222
<componentInstance>
@@ -1271,6 +1310,20 @@
12711310
<identifier>detailTab</identifier>
12721311
</componentInstance>
12731312
</itemInstances>
1313+
<itemInstances>
1314+
<componentInstance>
1315+
<componentInstanceProperties>
1316+
<name>body</name>
1317+
<value>Facet-fb2a30be-0705-474f-aaae-25d2ed03d33c</value>
1318+
</componentInstanceProperties>
1319+
<componentInstanceProperties>
1320+
<name>title</name>
1321+
<value>Organization Limits</value>
1322+
</componentInstanceProperties>
1323+
<componentName>flexipage:tab</componentName>
1324+
<identifier>flexipage_tab</identifier>
1325+
</componentInstance>
1326+
</itemInstances>
12741327
<itemInstances>
12751328
<componentInstance>
12761329
<componentInstanceProperties>
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"apiName": "Log__c",
3+
"childRelationships": {},
4+
"fields": {
5+
"OrganizationLimits__c": {
6+
"displayValue": null,
7+
"value": "[{\"Used\":0,\"Name\":\"AnalyticsExternalDataSizeMB\",\"Max\":40960},{\"Used\":0,\"Name\":\"CdpAiInferenceApiMonthlyLimit\",\"Max\":500000000},{\"Used\":0,\"Name\":\"ConcurrentAsyncGetReportInstances\",\"Max\":200},{\"Used\":0,\"Name\":\"ConcurrentEinsteinDataInsightsStoryCreation\",\"Max\":5},{\"Used\":0,\"Name\":\"ConcurrentEinsteinDiscoveryStoryCreation\",\"Max\":2},{\"Used\":0,\"Name\":\"ConcurrentSyncReportRuns\",\"Max\":20},{\"Used\":0,\"Name\":\"DailyAnalyticsDataflowJobExecutions\",\"Max\":60},{\"Used\":0,\"Name\":\"DailyAnalyticsUploadedFilesSizeMB\",\"Max\":51200},{\"Used\":334,\"Name\":\"DailyApiRequests\",\"Max\":5000000},{\"Used\":1,\"Name\":\"DailyAsyncApexExecutions\",\"Max\":250000},{\"Used\":0,\"Name\":\"DailyAsyncApexTests\",\"Max\":1320},{\"Used\":0,\"Name\":\"DailyBulkApiBatches\",\"Max\":15000},{\"Used\":0,\"Name\":\"DailyBulkV2QueryFileStorageMB\",\"Max\":976562},{\"Used\":0,\"Name\":\"DailyBulkV2QueryJobs\",\"Max\":10000},{\"Used\":0,\"Name\":\"DailyDeliveredPlatformEvents\",\"Max\":25000},{\"Used\":0,\"Name\":\"DailyDurableGenericStreamingApiEvents\",\"Max\":200000},{\"Used\":0,\"Name\":\"DailyDurableStreamingApiEvents\",\"Max\":200000},{\"Used\":0,\"Name\":\"DailyEinsteinDataInsightsStoryCreation\",\"Max\":1000},{\"Used\":0,\"Name\":\"DailyEinsteinDiscoveryOptimizationJobRuns\",\"Max\":25},{\"Used\":0,\"Name\":\"DailyEinsteinDiscoveryPredictAPICalls\",\"Max\":50000},{\"Used\":0,\"Name\":\"DailyEinsteinDiscoveryPredictionsByCDC\",\"Max\":500000},{\"Used\":0,\"Name\":\"DailyEinsteinDiscoveryStoryCreation\",\"Max\":100},{\"Used\":0,\"Name\":\"DailyGenericStreamingApiEvents\",\"Max\":10000},{\"Used\":0,\"Name\":\"DailyStandardVolumePlatformEvents\",\"Max\":25000},{\"Used\":0,\"Name\":\"DailyStreamingApiEvents\",\"Max\":200000},{\"Used\":0,\"Name\":\"DailyWorkflowEmails\",\"Max\":1800},{\"Used\":3,\"Name\":\"DataStorageMB\",\"Max\":200},{\"Used\":1,\"Name\":\"DurableStreamingApiConcurrentClients\",\"Max\":1000},{\"Used\":4,\"Name\":\"FileStorageMB\",\"Max\":50},{\"Used\":0,\"Name\":\"HourlyAsyncReportRuns\",\"Max\":1200},{\"Used\":0,\"Name\":\"HourlyDashboardRefreshes\",\"Max\":200},{\"Used\":0,\"Name\":\"HourlyDashboardResults\",\"Max\":5000},{\"Used\":0,\"Name\":\"HourlyDashboardStatuses\",\"Max\":999999999},{\"Used\":0,\"Name\":\"HourlyElevateAsyncReportRuns\",\"Max\":1200},{\"Used\":0,\"Name\":\"HourlyElevateSyncReportRuns\",\"Max\":500},{\"Used\":0,\"Name\":\"HourlyLongTermIdMapping\",\"Max\":100000},{\"Used\":0,\"Name\":\"HourlyManagedContentPublicRequests\",\"Max\":50000},{\"Used\":0,\"Name\":\"HourlyODataCallout\",\"Max\":20000},{\"Used\":0,\"Name\":\"HourlyPublishedPlatformEvents\",\"Max\":250000},{\"Used\":0,\"Name\":\"HourlyPublishedStandardVolumePlatformEvents\",\"Max\":100000},{\"Used\":0,\"Name\":\"HourlyShortTermIdMapping\",\"Max\":100000},{\"Used\":0,\"Name\":\"HourlySyncReportRuns\",\"Max\":500},{\"Used\":0,\"Name\":\"HourlyTimeBasedWorkflow\",\"Max\":1000},{\"Used\":0,\"Name\":\"MassEmail\",\"Max\":10},{\"Used\":0,\"Name\":\"MonthlyEinsteinDiscoveryStoryCreation\",\"Max\":500},{\"Used\":0,\"Name\":\"Package2VersionCreates\",\"Max\":6},{\"Used\":0,\"Name\":\"Package2VersionCreatesWithoutValidation\",\"Max\":500},{\"Used\":8,\"Name\":\"PermissionSets\",\"Max\":1500},{\"Used\":0,\"Name\":\"PrivateConnectOutboundCalloutHourlyLimitMB\",\"Max\":0},{\"Used\":0,\"Name\":\"PublishCallbackUsageInApex\",\"Max\":5242880},{\"Used\":0,\"Name\":\"SingleEmail\",\"Max\":15},{\"Used\":0,\"Name\":\"StreamingApiConcurrentClients\",\"Max\":1000}]"
8+
}
9+
},
10+
"id": "a027d00000IJmfRAAT",
11+
"lastModifiedById": "0057d000008gZI9AAM",
12+
"lastModifiedDate": "2024-03-10T04:51:54.000Z",
13+
"recordTypeId": "012000000000000AAA",
14+
"recordTypeInfo": null,
15+
"systemModstamp": "2024-03-10T04:51:54.000Z"
16+
}

0 commit comments

Comments
 (0)