Advertisement
Guest User

Untitled

a guest
Sep 20th, 2017
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 12.13 KB | None | 0 0
  1.     /*
  2.      * For each of the passed in Accounts, calculate and update all of the Next Visit
  3.      * date fields
  4.      */
  5.     public static void updateAccountNextVisits(Set<Id> accountIds) {
  6.         Set<Id> accountsToQuery = accountIds.clone();
  7.         Set<Id> accountsToNull = new Set<Id>();
  8.         Map<Id, Account> accountsToUpdateMap = new Map<Id, Account>();
  9.         Map<Id, Id> contactAccountMap = new Map<Id, Id>();
  10.         Map<Id, Map<String, Date>> accountMinDateMap = new Map<Id, Map<String, Date>>();
  11.        
  12.         // build contact => account map
  13.         for (Contact c : [
  14.                 Select
  15.                     Id,
  16.                     AccountId
  17.                 From
  18.                     Contact
  19.                 Where
  20.                     AccountId in :accountIds]) {
  21.             contactAccountMap.put(c.Id, c.AccountId);
  22.         }
  23.        
  24.         // Event
  25.         // NOTE: We cannot aggregate directly on the account because it's a polymorphic lookup on
  26.         // (User, Contact), and only Id and Name are directly queryable.  We have to manage this
  27.         // lookup in code.  In other words, we query for Contact, then map from Contact to Account,
  28.         // then find the minDate in code instead of via the query.  Gross, but it's really the best
  29.         // option.
  30.         for (AggregateResult ar : [
  31.                 select
  32.                     whoId,
  33.                     owner.title,
  34.                     min(startDateTime) mindate
  35.                 from
  36.                     Event
  37.                 where
  38.                     status__c in :MetadataConstants.NEXT_VISIT_STATUSES and
  39.                     whoId in (
  40.                         Select
  41.                             Id
  42.                         From
  43.                             Contact
  44.                         Where
  45.                             AccountId in :accountIds)  and
  46.                     event.startDateTime >= today
  47.                 group by
  48.                     whoId,
  49.                     owner.title]) {
  50.             System.debug('RRR6 Aggregate Result found: '+ar);
  51.             Id contactId = (Id)ar.get('whoId');
  52.             if (contactId == null || ((String)contactId).subString(0,3) != MetadataConstants.contactKeyPrefix) {
  53.                 continue;
  54.             }
  55.             String ownerTitle = (String)ar.get('title');
  56.             DateTime minDateTime = (DateTime)ar.get('mindate');
  57.             Date minDate = minDateTime == null ? null : minDateTime.date();
  58.             System.debug('title is '+ownerTitle);
  59.            
  60.             Id accountId = contactAccountMap.get(contactId);
  61.             if (accountMinDateMap.get(accountId) == null) {
  62.                 accountMinDateMap.put(accountId, new Map<String, Date>());
  63.             }
  64.            
  65.             // set the accountMinDate value
  66.             if (accountMinDateMap.get(accountId).get(getTitle(ownerTitle)) == null || minDate < accountMinDateMap.get(accountId).get(getTitle(ownerTitle))) {
  67.                 accountMinDateMap.get(accountId).put(getTitle(ownerTitle), minDate);
  68.             }
  69.         }
  70.        
  71.         // Update the accounts
  72.         for (Id accountId : accountMinDateMap.keySet()) {
  73.             Boolean addAccount = false;
  74.             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);
  75.  
  76.             for (String ownerTitle : accountMinDateMap.get(accountId).keySet()) {
  77.                 Date minDate = accountMinDateMap.get(accountId).get(ownerTitle);
  78.    
  79.                 if (ownerTitle == MetadataConstants.TITLE_DW && (a.DW_Office_Next_Visit_Date__c == null || minDate < a.DW_Office_Next_Visit_Date__c)) {
  80.                     a.DW_Office_Next_Visit_Date__c = minDate;
  81.                     addAccount = true;
  82.                 }
  83.                 else if (ownerTitle == MetadataConstants.TITLE_IARM && (a.IARM_Office_Next_Visit_Date__c == null || minDate < a.IARM_Office_Next_Visit_Date__c)) {
  84.                     a.IARM_Office_Next_Visit_Date__c = minDate;
  85.                     addAccount = true;
  86.                 }
  87.                 else if (ownerTitle == MetadataConstants.TITLE_RPC && (a.RPC_Office_Next_Visit_Date__c == null || minDate < a.RPC_Office_Next_Visit_Date__c)) {
  88.                     a.RPC_Office_Next_Visit_Date__c = minDate;
  89.                     addAccount = true;
  90.                 }
  91.                 else if (ownerTitle == MetadataConstants.TITLE_WLSR && (a.WLSR_Office_Next_Visit_Date__c == null || minDate < a.WLSR_Office_Next_Visit_Date__c)) {
  92.                     a.WLSR_Office_Next_Visit_Date__c = minDate;
  93.                     addAccount = true;
  94.                 }
  95.                
  96.                 if (addAccount) {
  97.                     if (accountIds.contains(accountId)) {
  98.                         accountIds.remove(accountId);
  99.                     }
  100.                     accountsToUpdateMap.put(a.Id, a);
  101.                 }
  102.             }
  103.         }
  104.        
  105.         // EventAttendee
  106.         // (same NOTE applies as Event)
  107.         for (AggregateResult ar : [
  108.                 select
  109.                     attendeeId,
  110.                     event.owner.title,
  111.                     min(event.startDateTime) mindate
  112.                 from
  113.                     EventAttendee
  114.                 where
  115.                     status not in :MetadataConstants.NEXT_VISIT_EVENTATTENDEE_EXCLUDE_STATUSES and
  116.                     event.status__c in :MetadataConstants.NEXT_VISIT_STATUSES and
  117.                     attendeeId in (
  118.                         Select
  119.                             Id
  120.                         From
  121.                             Contact
  122.                         Where
  123.                             AccountId in :accountIds)  and
  124.                     event.startDateTime >= today
  125.                 group by
  126.                     attendeeId,
  127.                     event.owner.title]) {
  128.             System.debug('RRR6 Aggregate Result found: '+ar);
  129.             Id contactId = (Id)ar.get('attendeeId');
  130.             if (contactId == null || ((String)contactId).subString(0,3) != MetadataConstants.contactKeyPrefix) {
  131.                 continue;
  132.             }
  133.             String ownerTitle = (String)ar.get('title');
  134.             DateTime minDateTime = (DateTime)ar.get('mindate');
  135.             Date minDate = minDateTime == null ? null : minDateTime.date();
  136.             System.debug('title is '+ownerTitle);
  137.            
  138.             Id accountId = contactAccountMap.get(contactId);
  139.             if (accountMinDateMap.get(accountId) == null) {
  140.                 accountMinDateMap.put(accountId, new Map<String, Date>());
  141.             }
  142.            
  143.             // set the accountMinDate value
  144.             if (accountMinDateMap.get(accountId).get(getTitle(ownerTitle)) == null || minDate < accountMinDateMap.get(accountId).get(getTitle(ownerTitle))) {
  145.                 accountMinDateMap.get(accountId).put(getTitle(ownerTitle), minDate);
  146.             }
  147.         }
  148.        
  149.         // Update the accounts
  150.         for (Id accountId : accountMinDateMap.keySet()) {
  151.             Boolean addAccount = false;
  152.             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);
  153.  
  154.             for (String ownerTitle : accountMinDateMap.get(accountId).keySet()) {
  155.                 Date minDate = accountMinDateMap.get(accountId).get(ownerTitle);
  156.    
  157.                 if (ownerTitle == MetadataConstants.TITLE_DW && (a.DW_Office_Next_Visit_Date__c == null || minDate < a.DW_Office_Next_Visit_Date__c)) {
  158.                     a.DW_Office_Next_Visit_Date__c = minDate;
  159.                     addAccount = true;
  160.                 }
  161.                 else if (ownerTitle == MetadataConstants.TITLE_IARM && (a.IARM_Office_Next_Visit_Date__c == null || minDate < a.IARM_Office_Next_Visit_Date__c)) {
  162.                     a.IARM_Office_Next_Visit_Date__c = minDate;
  163.                     addAccount = true;
  164.                 }
  165.                 else if (ownerTitle == MetadataConstants.TITLE_RPC && (a.RPC_Office_Next_Visit_Date__c == null || minDate < a.RPC_Office_Next_Visit_Date__c)) {
  166.                     a.RPC_Office_Next_Visit_Date__c = minDate;
  167.                     addAccount = true;
  168.                 }
  169.                 else if (ownerTitle == MetadataConstants.TITLE_WLSR && (a.WLSR_Office_Next_Visit_Date__c == null || minDate < a.WLSR_Office_Next_Visit_Date__c)) {
  170.                     a.WLSR_Office_Next_Visit_Date__c = minDate;
  171.                     addAccount = true;
  172.                 }
  173.                
  174.                 if (addAccount) {
  175.                     if (accountIds.contains(accountId)) {
  176.                         accountIds.remove(accountId);
  177.                     }
  178.                     accountsToUpdateMap.put(a.Id, a);
  179.                 }
  180.             }
  181.         }
  182.  
  183.         // Attendee
  184.         for (AggregateResult ar : [
  185.                 select
  186.                     contact__r.accountId,
  187.                     visit__r.assigned_to__r.title,
  188.                     min(visit__r.start_date_time__c) mindate
  189.                 from
  190.                     attendee__c
  191.                 where
  192.                     contact__r.accountId in :accountsToQuery and
  193.                     visit__r.start_date_time__c >= today
  194.                 group by
  195.                     contact__r.accountId,
  196.                     visit__r.assigned_to__r.title]) {
  197.             System.debug('RRR5 Aggregate Result found: '+ar);
  198.             Id accountId = (Id)ar.get('accountId');
  199.             String ownerTitle = (String)ar.get('title');
  200.             DateTime minDateTime = (DateTime)ar.get('mindate');
  201.             Date minDate = minDateTime == null ? null : minDateTime.date();
  202.             System.debug('title is '+ownerTitle);
  203.             Boolean addAccount = false;
  204.  
  205.             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);
  206.            
  207.             if (ownerTitle == MetadataConstants.TITLE_DW && (a.DW_Office_Next_Visit_Date__c == null || minDate < a.DW_Office_Next_Visit_Date__c)) {
  208.                 a.DW_Office_Next_Visit_Date__c = minDate;
  209.                 addAccount = true;
  210.             }
  211.             else if (ownerTitle == MetadataConstants.TITLE_IARM && (a.IARM_Office_Next_Visit_Date__c == null || minDate < a.IARM_Office_Next_Visit_Date__c)) {
  212.                 a.IARM_Office_Next_Visit_Date__c = minDate;
  213.                 addAccount = true;
  214.             }
  215.             else if (ownerTitle == MetadataConstants.TITLE_RPC && (a.RPC_Office_Next_Visit_Date__c == null || minDate < a.RPC_Office_Next_Visit_Date__c)) {
  216.                 a.RPC_Office_Next_Visit_Date__c = minDate;
  217.                 addAccount = true;
  218.             }
  219.             else if (ownerTitle == MetadataConstants.TITLE_WLSR && (a.WLSR_Office_Next_Visit_Date__c == null || minDate < a.WLSR_Office_Next_Visit_Date__c)) {
  220.                 a.WLSR_Office_Next_Visit_Date__c = minDate;
  221.                 addAccount = true;
  222.             }
  223.            
  224.             if (addAccount) {
  225.                 System.debug('adding account '+a);
  226.                 if (accountIds.contains(accountId)) {
  227.                     accountIds.remove(accountId);
  228.                 }
  229.                 accountsToUpdateMap.put(a.Id, a);
  230.             }
  231.         }
  232.        
  233.         update accountsToUpdateMap.values();
  234.        
  235.         accountsToNull.addAll(accountIds);
  236.         System.debug('SSS3 removing '+accountsToNull);
  237.         List<Account> accountsToUpdate = new List<Account>();
  238.         for (Account a : [
  239.                 Select
  240.                     DW_Office_Next_Visit_Date__c,
  241.                     IARM_Office_Next_Visit_Date__c,
  242.                     RPC_Office_Next_Visit_Date__c,
  243.                     WLSR_Office_Next_Visit_Date__c
  244.                 From
  245.                     Account
  246.                 Where
  247.                     Id in :accountsToNull]) {
  248.             a.DW_Office_Next_Visit_Date__c = null;
  249.             a.IARM_Office_Next_Visit_Date__c = null;
  250.             a.RPC_Office_Next_Visit_Date__c = null;
  251.             a.WLSR_Office_Next_Visit_Date__c = null;
  252.             a.Recalculate_Next_Visit_Dates__c = false;
  253.             accountsToUpdate.add(a);
  254.         }
  255.         System.debug('TTT2 nulling '+accountsToUpdate);
  256.        
  257.         update accountsToUpdate;
  258.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement