001/*
002 * Copyright (c) 2009 The openGion Project.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *     http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013 * either express or implied. See the License for the specific language
014 * governing permissions and limitations under the License.
015 */
016package org.opengion.hayabusa.resource;
017
018import java.util.Calendar;
019
020import static org.opengion.fukurou.system.HybsConst.CR ;                                // 6.1.0.0 (2014/12/26)
021import static org.opengion.fukurou.system.HybsConst.BUFFER_MIDDLE;      // 6.1.0.0 (2014/12/26) refactoring
022
023/**
024 * 事業所(CDJGS) 毎の休日カレンダデータオブジェクトです。
025 *
026 * カレンダデータは、指定の事業所に関して、すべての休日情報を持っています。
027 * 元のカレンダテーブル(GE13)の 1日(DY1)~31日(DY31)までの日付け欄に対して、
028 * 休日日付けの 年月日 に対する、休日かどうかを判断できるだけの情報を保持します。
029 * 具体的には、年月日に対する Set を持つことになります。
030 *
031 * @og.rev 3.6.0.0 (2004/09/17) 新規作成
032 * @og.group リソース管理
033 *
034 * @version  4.0
035 * @author   Hiroki Nakamura
036 * @since    JDK5.0,
037 */
038public abstract class AbstractCalendarPGData implements CalendarData {
039
040        /**
041         * このコンストラクタは、他のパッケージから呼び出せないように、
042         * パッケージプライベートにしておきます。
043         *
044         */
045        /* default */ AbstractCalendarPGData() {
046                // ここでは処理を行いません。
047        }
048
049//      /**
050//       * 指定の日付けから、範囲の間に、本日を含むかどうかを返します。
051//       * 指定の日付けが、キャッシュしているデータの最大と最小の間に
052//       * 存在しない場合は、常に false になります。
053//       * 判定は、年月日の項目のみで比較し、時分秒は無視します。
054//       *
055//       * @og.rev 3.7.1.1 (2005/05/31) 新規追加
056//       * @og.rev 3.8.8.6 (2007/04/20) today を毎回求めます。(キャッシュ対策)
057//       * @og.rev 8.5.6.1 (2024/03/29) interface のデフォルト実装を使用します。
058//       *
059//       * @param       day     指定の開始日付け
060//       * @param       scope   範囲の日数
061//       *
062//       * @return      本日:true それ以外:false
063//       */
064//      @Override       // CalendarData
065//      public boolean isContainedToday( final Calendar day,final int scope ) {
066//              final boolean rtnFlag;
067//
068//              final Calendar today = Calendar.getInstance();
069//              today.set( Calendar.HOUR_OF_DAY ,12 );  // 昼にセット
070//              today.set( Calendar.MINUTE ,0 );
071//              today.set( Calendar.SECOND ,0 );
072//
073//              if( scope == 1 ) {
074//                      // false の確率の高い方から、比較します。
075//                      rtnFlag = day.get( Calendar.DATE )  == today.get( Calendar.DATE  ) &&
076//                                              day.get( Calendar.MONTH ) == today.get( Calendar.MONTH ) &&
077//                                              day.get( Calendar.YEAR )  == today.get( Calendar.YEAR  ) ;
078//              }
079//              else {
080//                      final Calendar next = (Calendar)day.clone();
081//                      next.add( Calendar.DATE,scope );
082//                      rtnFlag = day.before( today ) && next.after( today ) ;
083//              }
084//              return rtnFlag ;
085//      }
086
087        /**
088         * 指定の開始、終了日の期間に、平日(稼働日)が何日あるか求めます。
089         * start と end が、リスト範囲外の場合は、エラーとします。
090         * 開始と終了が同じ日の場合は、1を返します。
091         *
092         * @param       start   開始日付け(稼働日に含めます)
093         * @param       end             終了日付け(稼働日に含めます)
094         *
095         * @return      稼働日数
096         *
097         */
098        @Override       // CalendarData
099        public int getKadoubisu( final Calendar start,final Calendar end ) {
100                final long diff = start.getTimeInMillis() - end.getTimeInMillis() ;
101                final int dayCount = (int)(diff/(1000*60*60*24)) + 1;   // end も含むので+1必要
102
103                final Calendar tempDay = (Calendar)start.clone();
104                int su = 0 ;
105                while( ! isHoliday( tempDay ) ) {
106                        su++ ;
107                        tempDay.add(Calendar.DATE, 1);          // 日にちを進める。
108                }
109
110                final int count = ( dayCount - su ) / 7 + 1;
111
112                return dayCount - count ;
113        }
114
115//      /**
116//       * 指定の開始日に平日のみ期間を加算して求められる日付けを返します。
117//       * これは、実稼働日計算に使用します。
118//       * 例えば、start=20040810 , span=5 で、休日がなければ、10,11,12,13,14 となり、
119//       * 20040815 を返します。
120//       * 指定の日付けや、期間加算後の日付けが、キャッシュしているデータの
121//       * 最大と最小の間に存在しない場合は、エラーとします。
122//       *
123//       * @og.rev 8.5.6.1 (2024/03/29) interface のデフォルト実装を使用します。
124//       *
125//       * @param       start   開始日付け(YYYYMMDD 形式)
126//       * @param       span    稼動期間
127//       *
128//       * @return      開始日から稼動期間を加算した日付け(当日を含む)
129//       *
130//       */
131//      @Override       // CalendarData
132//      public Calendar getAfterDay( final Calendar start,final int span ) {
133//              final Calendar tempDay = (Calendar)start.clone();
134//              int suSpan = span ;
135//              while( suSpan > 0 ) {
136//                      if( ! isHoliday( tempDay ) ) { suSpan--; }
137//                      tempDay.add(Calendar.DATE, 1);          // 日にちを進める。
138//              }
139//              return tempDay ;
140//      }
141
142        /**
143         * オブジェクトの識別子として、詳細なカレンダ情報を返します。
144         *
145         * @return  詳細なカレンダ情報
146         * @og.rtnNotNull
147         */
148        @Override       // Object
149        public String toString() {
150                final StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE );
151                rtn.append( "CLASS   : ").append( getClass().getName() ).append( CR );  // クラス名
152
153                return rtn.toString();
154        }
155}