Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * For each of the passed in Accounts, calculate and update all of the Next Visit
- * date fields
- */
- public static void updateAccountNextVisits(Set<Id> accountIds) {
- Set<Id> accountsToQuery = accountIds.clone();
- Set<Id> accountsToNull = new Set<Id>();
- Map<Id, Account> accountsToUpdateMap = new Map<Id, Account>();
- Map<Id, Id> contactAccountMap = new Map<Id, Id>();
- Map<Id, Map<String, Date>> accountMinDateMap = new Map<Id, Map<String, Date>>();
- // build contact => account map
- for (Contact c : [
- Select
- Id,
- AccountId
- From
- Contact
- Where
- AccountId in :accountIds]) {
- contactAccountMap.put(c.Id, c.AccountId);
- }
- // Event
- // NOTE: We cannot aggregate directly on the account because it's a polymorphic lookup on
- // (User, Contact), and only Id and Name are directly queryable. We have to manage this
- // lookup in code. In other words, we query for Contact, then map from Contact to Account,
- // then find the minDate in code instead of via the query. Gross, but it's really the best
- // option.
- for (AggregateResult ar : [
- select
- whoId,
- owner.title,
- min(startDateTime) mindate
- from
- Event
- where
- status__c in :MetadataConstants.NEXT_VISIT_STATUSES and
- whoId in (
- Select
- Id
- From
- Contact
- Where
- AccountId in :accountIds) and
- event.startDateTime >= today
- group by
- whoId,
- owner.title]) {
- System.debug('RRR6 Aggregate Result found: '+ar);
- Id contactId = (Id)ar.get('whoId');
- if (contactId == null || ((String)contactId).subString(0,3) != MetadataConstants.contactKeyPrefix) {
- continue;
- }
- String ownerTitle = (String)ar.get('title');
- DateTime minDateTime = (DateTime)ar.get('mindate');
- Date minDate = minDateTime == null ? null : minDateTime.date();
- System.debug('title is '+ownerTitle);
- Id accountId = contactAccountMap.get(contactId);
- if (accountMinDateMap.get(accountId) == null) {
- accountMinDateMap.put(accountId, new Map<String, Date>());
- }
- // set the accountMinDate value
- if (accountMinDateMap.get(accountId).get(getTitle(ownerTitle)) == null || minDate < accountMinDateMap.get(accountId).get(getTitle(ownerTitle))) {
- accountMinDateMap.get(accountId).put(getTitle(ownerTitle), minDate);
- }
- }
- // Update the accounts
- for (Id accountId : accountMinDateMap.keySet()) {
- Boolean addAccount = false;
- Account a = accountsToUpdateMap.get(accountId) == null ? new Account(Id = accountId, DW_Office_Next_Visit_Date__c = null, IARM_Office_Next_Visit_Date__c = null, RPC_Office_Next_Visit_Date__c = null, WLSR_Office_Next_Visit_Date__c = null, Recalculate_Next_Visit_Dates__c = false) : accountsToUpdateMap.get(accountId);
- for (String ownerTitle : accountMinDateMap.get(accountId).keySet()) {
- Date minDate = accountMinDateMap.get(accountId).get(ownerTitle);
- if (ownerTitle == MetadataConstants.TITLE_DW && (a.DW_Office_Next_Visit_Date__c == null || minDate < a.DW_Office_Next_Visit_Date__c)) {
- a.DW_Office_Next_Visit_Date__c = minDate;
- addAccount = true;
- }
- else if (ownerTitle == MetadataConstants.TITLE_IARM && (a.IARM_Office_Next_Visit_Date__c == null || minDate < a.IARM_Office_Next_Visit_Date__c)) {
- a.IARM_Office_Next_Visit_Date__c = minDate;
- addAccount = true;
- }
- else if (ownerTitle == MetadataConstants.TITLE_RPC && (a.RPC_Office_Next_Visit_Date__c == null || minDate < a.RPC_Office_Next_Visit_Date__c)) {
- a.RPC_Office_Next_Visit_Date__c = minDate;
- addAccount = true;
- }
- else if (ownerTitle == MetadataConstants.TITLE_WLSR && (a.WLSR_Office_Next_Visit_Date__c == null || minDate < a.WLSR_Office_Next_Visit_Date__c)) {
- a.WLSR_Office_Next_Visit_Date__c = minDate;
- addAccount = true;
- }
- if (addAccount) {
- if (accountIds.contains(accountId)) {
- accountIds.remove(accountId);
- }
- accountsToUpdateMap.put(a.Id, a);
- }
- }
- }
- // EventAttendee
- // (same NOTE applies as Event)
- for (AggregateResult ar : [
- select
- attendeeId,
- event.owner.title,
- min(event.startDateTime) mindate
- from
- EventAttendee
- where
- status not in :MetadataConstants.NEXT_VISIT_EVENTATTENDEE_EXCLUDE_STATUSES and
- event.status__c in :MetadataConstants.NEXT_VISIT_STATUSES and
- attendeeId in (
- Select
- Id
- From
- Contact
- Where
- AccountId in :accountIds) and
- event.startDateTime >= today
- group by
- attendeeId,
- event.owner.title]) {
- System.debug('RRR6 Aggregate Result found: '+ar);
- Id contactId = (Id)ar.get('attendeeId');
- if (contactId == null || ((String)contactId).subString(0,3) != MetadataConstants.contactKeyPrefix) {
- continue;
- }
- String ownerTitle = (String)ar.get('title');
- DateTime minDateTime = (DateTime)ar.get('mindate');
- Date minDate = minDateTime == null ? null : minDateTime.date();
- System.debug('title is '+ownerTitle);
- Id accountId = contactAccountMap.get(contactId);
- if (accountMinDateMap.get(accountId) == null) {
- accountMinDateMap.put(accountId, new Map<String, Date>());
- }
- // set the accountMinDate value
- if (accountMinDateMap.get(accountId).get(getTitle(ownerTitle)) == null || minDate < accountMinDateMap.get(accountId).get(getTitle(ownerTitle))) {
- accountMinDateMap.get(accountId).put(getTitle(ownerTitle), minDate);
- }
- }
- // Update the accounts
- for (Id accountId : accountMinDateMap.keySet()) {
- Boolean addAccount = false;
- Account a = accountsToUpdateMap.get(accountId) == null ? new Account(Id = accountId, DW_Office_Next_Visit_Date__c = null, IARM_Office_Next_Visit_Date__c = null, RPC_Office_Next_Visit_Date__c = null, WLSR_Office_Next_Visit_Date__c = null, Recalculate_Next_Visit_Dates__c = false) : accountsToUpdateMap.get(accountId);
- for (String ownerTitle : accountMinDateMap.get(accountId).keySet()) {
- Date minDate = accountMinDateMap.get(accountId).get(ownerTitle);
- if (ownerTitle == MetadataConstants.TITLE_DW && (a.DW_Office_Next_Visit_Date__c == null || minDate < a.DW_Office_Next_Visit_Date__c)) {
- a.DW_Office_Next_Visit_Date__c = minDate;
- addAccount = true;
- }
- else if (ownerTitle == MetadataConstants.TITLE_IARM && (a.IARM_Office_Next_Visit_Date__c == null || minDate < a.IARM_Office_Next_Visit_Date__c)) {
- a.IARM_Office_Next_Visit_Date__c = minDate;
- addAccount = true;
- }
- else if (ownerTitle == MetadataConstants.TITLE_RPC && (a.RPC_Office_Next_Visit_Date__c == null || minDate < a.RPC_Office_Next_Visit_Date__c)) {
- a.RPC_Office_Next_Visit_Date__c = minDate;
- addAccount = true;
- }
- else if (ownerTitle == MetadataConstants.TITLE_WLSR && (a.WLSR_Office_Next_Visit_Date__c == null || minDate < a.WLSR_Office_Next_Visit_Date__c)) {
- a.WLSR_Office_Next_Visit_Date__c = minDate;
- addAccount = true;
- }
- if (addAccount) {
- if (accountIds.contains(accountId)) {
- accountIds.remove(accountId);
- }
- accountsToUpdateMap.put(a.Id, a);
- }
- }
- }
- // Attendee
- for (AggregateResult ar : [
- select
- contact__r.accountId,
- visit__r.assigned_to__r.title,
- min(visit__r.start_date_time__c) mindate
- from
- attendee__c
- where
- contact__r.accountId in :accountsToQuery and
- visit__r.start_date_time__c >= today
- group by
- contact__r.accountId,
- visit__r.assigned_to__r.title]) {
- System.debug('RRR5 Aggregate Result found: '+ar);
- Id accountId = (Id)ar.get('accountId');
- String ownerTitle = (String)ar.get('title');
- DateTime minDateTime = (DateTime)ar.get('mindate');
- Date minDate = minDateTime == null ? null : minDateTime.date();
- System.debug('title is '+ownerTitle);
- Boolean addAccount = false;
- Account a = accountsToUpdateMap.get(accountId) == null ? new Account(Id = accountId, DW_Office_Next_Visit_Date__c = null, IARM_Office_Next_Visit_Date__c = null, RPC_Office_Next_Visit_Date__c = null, WLSR_Office_Next_Visit_Date__c = null, Recalculate_Next_Visit_Dates__c = false) : accountsToUpdateMap.get(accountId);
- if (ownerTitle == MetadataConstants.TITLE_DW && (a.DW_Office_Next_Visit_Date__c == null || minDate < a.DW_Office_Next_Visit_Date__c)) {
- a.DW_Office_Next_Visit_Date__c = minDate;
- addAccount = true;
- }
- else if (ownerTitle == MetadataConstants.TITLE_IARM && (a.IARM_Office_Next_Visit_Date__c == null || minDate < a.IARM_Office_Next_Visit_Date__c)) {
- a.IARM_Office_Next_Visit_Date__c = minDate;
- addAccount = true;
- }
- else if (ownerTitle == MetadataConstants.TITLE_RPC && (a.RPC_Office_Next_Visit_Date__c == null || minDate < a.RPC_Office_Next_Visit_Date__c)) {
- a.RPC_Office_Next_Visit_Date__c = minDate;
- addAccount = true;
- }
- else if (ownerTitle == MetadataConstants.TITLE_WLSR && (a.WLSR_Office_Next_Visit_Date__c == null || minDate < a.WLSR_Office_Next_Visit_Date__c)) {
- a.WLSR_Office_Next_Visit_Date__c = minDate;
- addAccount = true;
- }
- if (addAccount) {
- System.debug('adding account '+a);
- if (accountIds.contains(accountId)) {
- accountIds.remove(accountId);
- }
- accountsToUpdateMap.put(a.Id, a);
- }
- }
- update accountsToUpdateMap.values();
- accountsToNull.addAll(accountIds);
- System.debug('SSS3 removing '+accountsToNull);
- List<Account> accountsToUpdate = new List<Account>();
- for (Account a : [
- Select
- DW_Office_Next_Visit_Date__c,
- IARM_Office_Next_Visit_Date__c,
- RPC_Office_Next_Visit_Date__c,
- WLSR_Office_Next_Visit_Date__c
- From
- Account
- Where
- Id in :accountsToNull]) {
- a.DW_Office_Next_Visit_Date__c = null;
- a.IARM_Office_Next_Visit_Date__c = null;
- a.RPC_Office_Next_Visit_Date__c = null;
- a.WLSR_Office_Next_Visit_Date__c = null;
- a.Recalculate_Next_Visit_Dates__c = false;
- accountsToUpdate.add(a);
- }
- System.debug('TTT2 nulling '+accountsToUpdate);
- update accountsToUpdate;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement