Last active
June 7, 2016 13:09
-
-
Save johndstein/6c4ab0a6c900d7a8b78bd68500ef63c4 to your computer and use it in GitHub Desktop.
Latest Good Simple Membership Renewal
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /** | |
| * Automatically creates a membership renewal opportunity so many days | |
| * before the old membership expires. | |
| * | |
| * New membership starts on the expiration date of the old membership and is | |
| * valid for specified number of months. | |
| * | |
| * We created the following opp custom fields specifically for this purpose. | |
| * | |
| * * Membership_Auto_Renew_Days_Prior__c | |
| * * Membership_Term_Months__c | |
| * * Membership_Auto_Renew_Day__c | |
| * (formula) | |
| * npe01__Membership_End_Date__c - Membership_Auto_Renew_Days_Prior__c | |
| * | |
| * We reference the following NPSP custom fields. | |
| * | |
| * * npe01__Membership_Start_Date__c | |
| * * npe01__Membership_End_Date__c | |
| * * npe01__Membership_Origin__c | |
| * * npe01__Member_Level__c | |
| * | |
| **/ | |
| public class AutoMembershipRenewal { | |
| public void createRenewals() { | |
| List<Opportunity> expiringOpps = selectExpiringMemberships(); | |
| List<Opportunity> renewalOpps = new List<Opportunity>(); | |
| for (Opportunity expiring : expiringOpps) { | |
| Opportunity renewal = createRenewal(expiring); | |
| renewalOpps.add(renewal); | |
| } | |
| insert renewalOpps; | |
| } | |
| public Opportunity createRenewal(Opportunity old) { | |
| // Turns out that opportunity contact roles get cloned somehow. | |
| Opportunity opp = old.clone(); | |
| Date start = old.npe01__Membership_End_Date__c + 1; | |
| opp.Name = ('Membership Renewal - ' + old.Account.Name + ' - ' + start.format()).abbreviate(120); | |
| opp.StageName = 'Renewal Generated'; | |
| opp.RecordTypeId = '012o0000000cR8VAAU'; // Type changes per client. | |
| opp.CloseDate = system.today(); | |
| opp.npe01__Membership_Origin__c = 'Renewal'; | |
| opp.npe01__Membership_Start_Date__c = start; | |
| opp.npe01__Membership_End_Date__c = | |
| start.addMonths(opp.Membership_Term_Months__c.intValue()) - 1; | |
| return opp; | |
| } | |
| // npe01__Membership_End_Date__c = NEXT_90_DAYS | |
| public List<opportunity> selectExpiringMemberships() { | |
| return [ | |
| SELECT | |
| Id, | |
| RecordTypeId, | |
| Member_Type__c, // not always needed. client specific. | |
| Amount, // must always include or won't get cloned. | |
| StageName, // not always needed. client specific. | |
| Membership_Auto_Renew_Days_Prior__c, | |
| Membership_Term_Months__c, | |
| AccountId, | |
| Account.Name, | |
| npe01__Membership_End_Date__c, | |
| npe01__Member_Level__c | |
| FROM | |
| Opportunity | |
| WHERE | |
| RecordTypeId = '012o0000000cR8VAAU' | |
| AND Member_Type__c = 'Standard' // not always needed. client specific. | |
| AND StageName != 'Extra Grace Period' // not always needed. client specific. | |
| AND Membership_Auto_Renew_Day__c = TODAY | |
| AND Membership_Auto_Renew_Days_Prior__c > 0 | |
| AND IsWon = true | |
| ]; | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment