Salesforceのユーザーから、次の①~③の項目値から「次回契約更新開始月」を
算出したいと依頼がありました。
①「契約起算日」
②「契約更新周期(24ヶ月,36ヶ月等)」「契約更新期間(1, 2ヶ月等)」
③「本日日付」
↓
以下の数式を用意して要件を実現しました。
④「契約経過月数」
⑤「契約状況」
⑥「次回契約更新開始月」
④「契約経過月数」
契約経過月数 ContractPassedMonths__c
/*契約起算日から今日までの経過月 + 1
例) 今日:2024/03/05
1.
契約起算日:2023/12/dd
↓
契約経過月数:4
2.
契約起算日:2024/03/dd
↓
契約経過月数:1
*/
if( isBlank(ContractStartDate_c)
, 0
, 12 * ( year(today()) - year(ContractStartDate_c) )
+ ( month(today()) - month(ContractStartDate_c) )
+ 1
)
⑤「契約状況」
②, ④の値により、レコードの属性を3パターンに分類する。
契約状況 ContractStatus__c
/*「契約経過月数」「契約更新周期」「契約更新期間」から、3パターンに分類する。
1.初回更新前:「契約経過月数」が「契約更新周期」未満
※24ヶ月更新の1ヶ月目, 23ヶ月目等
2.更新期間中:『「契約経過月数」を「契約更新周期」で割った余り』が0以上、「契約更新期間」未満
※24ヶ月更新の24, 49ヶ月目等
3.その他の違約金発生期間
※24ヶ月更新の28ヶ月目等
*/
if( ContractPassedMonths__c != 0 // 業務要件に合わせて、適切にガード節を設定する
, null
, if( ContractPassedMonths__c < ProductPlan__r.UpdateCycle__c
, "初回更新前"
, if( mod(ContractPassedMonths__c, ProductPlan__r.UpdateCycle__c) >= 0
&& mod(ContractPassedMonths__c, ProductPlan__r.UpdateCycle__c) < ProductPlan__r.UpdateTerm__c
, "更新期間中"
, "違約金発生期間"
)))
⑥「次回契約更新開始月」
⑤「契約状況」ごとの計算式で、「次回契約更新開始月」を計算する
次回契約更新開始月 NextContractRenewalMonth__c
/*
例)本日日付 2024/03/05, 更新周期 24ヶ月、更新期間3ヶ月とした場合
1.初回更新前のパターン
契約起算日:2023/10/dd etc.
↓
次回契約更新開始月:2025-09
2.更新期間中のパターン
契約起算日:2020/03/dd etc.
↓
次回契約更新開始月:2024-02
3.その他の違約金発生期間
契約起算日:2021/06/dd etc.
↓
次回契約更新開始月:2025-01
*/
if( false // 業務要件に合わせて、適切にガード節を設定する
, null
// yyyy-MM形式で返す
,left(text(
case( ContractStatus__c
, "初回更新前"
// 「契約起算日」から「更新周期-1」ヶ月経過した月
, addMonths( ContractStartDate__c, ProductPlan__r.UpdateCycle__c - 1 )
, "更新期間中"
// 「契約起算日」に「更新周期」を適切な年数で切り上げて加算した月
, addMonths( ContractStartDate__c, ProductPlan__r.UpdateCycle__c * (0 + floor(ContactPassedMonths__c / ProductPlan__r.UpdateCycle__c) ) - 1
, "違約金発生期間"
// 「契約起算日」に「更新周期」を適切な年数で切り上げて加算した月
, addMonths( ContractStartDate__c, ProductPlan__r.UpdateCycle__c * (1 + floor(ContactPassedMonths__c / ProductPlan__r.UpdateCycle__c) ) - 1
, ""
)
), 7) // left( text(~~), 7)
)
①~③より、いきなり⑥を作れ!って言い出されたときに
1回冷静に要件を整理しましょと説得しながら④~⑥に分割して実装しました。
⑥の数式は多分もっとスマートに記述できるし、場合によっては⑤の分類も
不要になるかもと思いますが、一旦これで公開します。
Excelなどに移植するのもそこまで難しくないと思います。
どなたかのお役に立てば幸いです。