Skip to content

Instantly share code, notes, and snippets.

@johndstein
Last active June 7, 2016 13:09
Show Gist options
  • Select an option

  • Save johndstein/6c4ab0a6c900d7a8b78bd68500ef63c4 to your computer and use it in GitHub Desktop.

Select an option

Save johndstein/6c4ab0a6c900d7a8b78bd68500ef63c4 to your computer and use it in GitHub Desktop.
Latest Good Simple Membership Renewal
/**
* 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