MENU
Abo
某SIer勤務。
新卒文系からエンジニア就職。
日々の学びをつらつらと書いています。
保有資格:
Salesforce認定アドミニストレーター  
Salesforce認定Platformデベロッパー
Salesforce認定上級Platformデベロッパー
カテゴリー
アーカイブ

【Apex】休日マスタを使用した営業日取得処理の実装

今回は休日マスタを使用した営業日取得処理を作ってみたので記事にしました。

割と汎用性あるんじゃないかと思います。

目次

処理の流れ

以下のような処理の流れで実装してみました。

  1. 商品オブジェクトの「注文受付日」項目に日付を設定し、保存
  2. その日を基準日として、トリガで土日と休日マスタに登録された日付から営業日を算出
  3. 他の日付項目に自動設定

「注文受付日」を設定し保存します。

土日と休日マスタに登録された日付を除いた営業日が設定されます。

事前準備:休日マスタ作成

事前準備として「休日マスタ」オブジェクトを作成し、土日以外の休日を登録しておきます。

実装

今回は「商品」オブジェクトのトリガを作成しました。

trigger Product2Trigger on Product2 (before insert, before update) {
    
    if(trigger.isBefore && trigger.isInsert){
        Product2TriggerHandler pro = new Product2TriggerHandler();
        pro.beforeInsert(Trigger.new);
    }
    
    if(trigger.isBefore && trigger.isUpdate){
        Product2TriggerHandler pro = new Product2TriggerHandler();
        pro.beforeUpdate(Trigger.new);
    } 
}
public class Product2TriggerHandler {
    
    public void beforeInsert(List<Product2> newList){
        setBusinesDay(newList);
    }
    
    public void beforeUpdate(List<Product2> newList){
        setBusinesDay(newList);
    }
    
    /** 営業日設定処理 **/
    public void setBusinesDay(List<Product2> newList){
        
        Set<Date> proDateSet = new Set<Date>();
        Set<Date> holidaySet = new Set<Date>();
        
        for(Product2 p : newList){
            proDateSet.add(p.OrderAcceptedDate__c);
        }
        
        //休日マスタ取得
        for(HolidayMaster__c hm : [Select Id, Holiday__c From HolidayMaster__c]){
            holidaySet.add(hm.Holiday__c);
        }
        
        //Trigger.newに値を設定
        for(Product2 p : newList){
            if(p.OrderAcceptedDate__c != null){
                //注文日(注文受付日の前営業日)設定
                p.OrderDate__c = getBusinessDay(holidaySet, p.OrderAcceptedDate__c.addDays(-1), -1);
                //注文取消期限(注文受付日の翌営業日)設定
                p.OrderCancellationDate__c = getBusinessDay(holidaySet, p.OrderAcceptedDate__c.addDays(1), 1);
                //出荷日(注文受付日の4営業日後)設定
                p.ShippingDate__c = getBusinessDay(holidaySet, p.OrderAcceptedDate__c.addDays(1), 4);
            }else{
                p.OrderDate__c = null;
                p.OrderCancellationDate__c = null;
                p.ShippingDate__c = null;
            }      
        }
    }
    
    /** 営業日取得処理 **/
    private Date getBusinessDay(Set<Date> holidaySet, Date baseDate, Integer numOfDay){
        
        Date returnDate;
        Date targetdate = baseDate;
        DateTime dt = targetDate;
        Integer i = 1;
        Integer j = 0; //営業日カウント用
        String yobi = dt.format('E'); //曜日取得
        
        if(numOfDay >= 0){
            while(j != numOfDay){
                if(!holidaySet.contains(targetdate) && yobi != 'Sat' && yobi != 'Sun'){
                    //基準日(注文受付日)が休日マスタに登録されていない、かつ、基準日の曜日が土日でない場合
                    returnDate = targetdate;
                    j++;
                }
                targetdate = baseDate.addDays(i);
                dt = targetdate;
                yobi = dt.format('E');
                i++;
            }
        }else{
            i = -1;
            while(j != numOfDay){
                if(!holidaySet.contains(targetdate) && yobi != 'Sat' && yobi != 'Sun'){
                    //基準日(注文受付日)が休日マスタに登録されていない、かつ、基準日の曜日が土日でない場合
                    returnDate = targetdate;
                    j--;
                }
                targetdate = baseDate.addDays(i);
                dt = targetdate;
                yobi = dt.format('E');
                i--;
            }
        }     
        return returnDate;
    }
}

30~34行目で引数を指定し営業日取得処理(getBusinessDayメソッド)を呼び出しています。

getBusinessDay(holidaySet, p.OrderAcceptedDate__c.addDays(1), 1);

この引数を変更することで、土日と休日マスタに登録された日付を除いた基準日のn日前、n日後の営業日を取得できます。

  • 基準日より前の営業日を取得
    • 第2引数に「addDays(-1)」を設定
  • 基準日より後の営業日を取得
    • 第2引数に「addDays(1)」を設定
  • 基準日から1日後(前)の営業日を取得
    • 第3引数に「1」を設定
  • 基準日から3日後(前)の営業日を取得
    • 第3引数に「3」を設定

機会があれば使ってみてください。

今回は以上です!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

某SIer勤務。
新卒文系からエンジニア就職。
日々の学びをつらつらと書いています。
保有資格:Salesforce認定アドミニストレーター
     Salesforce認定Platformデベロッパー
     Salesforce認定上級Platformデベロッパー

コメント

コメントする

CAPTCHA


目次