0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

「〇年縛り契約」→「次回契約更新月」を数式で表現する

Last updated at Posted at 2024-11-20

Salesforceのユーザーから、次の①~③の項目値から「次回契約更新開始月」を
算出したいと依頼がありました。

①「契約起算日」
②「契約更新周期(24ヶ月,36ヶ月等)」「契約更新期間(1, 2ヶ月等)」
③「本日日付」

image.png

以下の数式を用意して要件を実現しました。
④「契約経過月数」
⑤「契約状況」
⑥「次回契約更新開始月」

④「契約経過月数」

契約経過月数 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などに移植するのもそこまで難しくないと思います。
どなたかのお役に立てば幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?