バージョン選択

フォーラム

メニュー

オンライン状況

71 人のユーザが現在オンラインです。 (54 人のユーザが フォーラム を参照しています。)
登録ユーザ: 0
ゲスト: 71
もっと...

サイト内検索

機能要望 > その他 > 休日関係で、「振替休日」「第2月曜・第3月曜」をやってみました。

その他

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
sumida
投稿日時: 2013/10/20 21:01
対応状況: −−−
仙人
登録日: 2013/2/10
居住地: 広島県呉市ときどき瀬戸内海
投稿: 641
休日関係で、「振替休日」「第2月曜・第3月曜」をやってみました。
1. 振替休日(カレンダーブロック)
制限事項:
・次月への振替休日は考慮していません。
・実在する日付の確認はしていません。
・配列変数$arrHolidayに[$year]の次元を追加しました。

data/class/SC_Date.php

    public function isHoliday($year, $month, $day)
    {
// -01 changed
        if (is_null(SC_Date_Ex::$arrHoliday)) $this->setArrHoliday($year);
        if (is_null(SC_Date_Ex::$arrHoliday[$year])) $this->setArrHoliday($year);
// -01 changed
        if (is_null(SC_Date_Ex::$arrRegularHoliday)) $this->setRegularHoliday();

// -01 changed
        if (!empty(SC_Date_Ex::$arrHoliday[$year][$month])) {
            if (in_array($day, SC_Date_Ex::$arrHoliday[$year][$month])) {
// -01 changed
                return true;
            }
        }
        if (!empty(SC_Date_Ex::$arrRegularHoliday)) {
            $day = date('w', mktime(0,0,0 ,$month, $day, $year));
            if (in_array($day, SC_Date_Ex::$arrRegularHoliday)) {
                return true;
            }
        }

        return false;
    }


// -01 changed
    private function setArrHoliday($year)
// -01 changed
    {
        $objHoliday = new SC_Helper_Holiday_Ex();
        $holiday = $objHoliday->getList();
// -01 changed
        $arrHoliday[$year] = array();
        foreach ($holiday AS $val) {
            $arrHoliday[$year][$val['month']][] = $val['day'];
        }
// -01 changed
// -01 added
        // 振替休日の確認
        $arrHolidayNew = array();
        foreach ($arrHoliday[$year] AS $month => $arrDay) {
          foreach ($arrDay AS $key => $day) {
            $weekHoliday = date('w', mktime(0, 0, 0, $month, $day, $year));
            if ($weekHoliday == 0) {
                // 日曜日
                $newDay = $day;
                // 休日でない日は?
                do {
                    $newDay += 1;
                } while(in_array($newDay, $arrDay));
                // 振替休日
                $arrHolidayNew[$year][$month][] = $newDay;
            }
          }
        }
        // 振替休日の追加
        foreach ($arrHolidayNew as $year => $arrMonth) {
            foreach ($arrMonth as $month => $arrDay) {
                foreach ($arrDay as $day) {
                    $arrHoliday[$year][$month][] = $day;
                }
            }
        }
// -01 added
        SC_Date_Ex::$arrHoliday = $arrHoliday;
    }


data/Smarty/templates/admin/basis/holiday.tpl

<!--{* -01 deleted
                    <br />
                    <span class="attention">振替休日は自動設定されないので、振替え先の日付を設定してください。</span>
-01 deleted *}-->


2. 第2月曜・第3月曜
制限事項:
・実在する日付の確認はしていません。
仕様:
dtb_holidayテーブルに、「第2月曜・第3月曜」を示す日付を格納する。
  上記日付は、「-xy」
    -:「第xy曜」
    x:第?週
    y:曜日(0:日曜〜6:土曜)
  つまり、
    -21:第2月曜
    -31:第3月曜

data/class/SC_Date.php
新規追加

// -02 added
    public function getDayHoliday($default = false)
    {
        $day_array = array();

        if ($default) $day_array[''] = '--';

        // 0:日曜〜6:土曜
        $day_array[-21] = '第2月曜';
        $day_array[-31] = '第3月曜';

        for ($i=0; $i < 31; $i++) {
            $day_array[ $i + 1 ] = $i + 1;
        }

        return $day_array;
    }
// -02 added


data/class/pages/admin/basis/LC_Page_Admin_Basis_Holiday.php

    public function action()
    {
        $objHoliday = new SC_Helper_Holiday_Ex();

        $objDate = new SC_Date_Ex();
        $this->arrMonth = $objDate->getMonth();
// -02 changed
        $this->arrDay = $objDate->getDayHoliday();
// -02 changed

data/Smarty/templates/admin/basis/holiday.tpl

                <td><!--{$arrHoliday[cnt].title|h}--></td>
<!--{* -02 changed *}-->
                <!--{assign var=holiday_day value=$arrHoliday[cnt].day}-->
                <td><!--{$arrHoliday[cnt].month|h}-->月<!--{$arrDay[$holiday_day]|h}-->日</td>
<!--{* -02 changed *}-->


data/class/SC_Date.php
上記、1.の修正分に追加

    private function setArrHoliday($year)
    {
        $objHoliday = new SC_Helper_Holiday_Ex();
        $holiday = $objHoliday->getList();
        $arrHoliday[$year] = array();
        foreach ($holiday AS $val) {
// -02 added
          if ($val['day'] < 0) {
            // その月の始まりは何曜日か(0:日曜〜6:土曜)
            $weekly1st = date('w', mktime(0, 0, 0, $val['month'], 1, $year));
            // 求めたい曜日:$targetWeeklyDay
            $targetWeeklyDay = abs($val['day']) % 10;
            // 指定された曜日の第1週
            $firstDay = ($targetWeeklyDay - $weekly1st >= 0) ? 1 + $targetWeeklyDay - $weekly1st : 1 + $targetWeeklyDay - $weekly1st + 7;
            // 求めたい週:$week
            $week = intval(abs($val['day']) / 10);
            // 日にちを算出:$day
            $targetDay  = $firstDay + ( 7 * ($week - 1) );
            $arrHoliday[$year][$val['month']][] = $targetDay;
          } else {
// -02 added
            $arrHoliday[$year][$val['month']][] = $val['day'];
// -02 added
          }
// -02 added
        }
        // 振替休日の確認
k-kuwahara
投稿日時: 2013/10/24 20:00
対応状況: −−−
長老
登録日: 2013/4/16
居住地: Tokyo
投稿: 175
Re: 休日関係で、「振替休日」「第2月曜・第3月曜」をやってみました。
sumida様


一点確認したいのですが、
こちらは、cubeのバージョンいくつに実装されたのでしょうか?

おそらく、2.12以上かと思っておりますが…


お手数ですが、ご回答のほどお願い申し上げます。
sumida
投稿日時: 2013/10/24 20:33
対応状況: −−−
仙人
登録日: 2013/2/10
居住地: 広島県呉市ときどき瀬戸内海
投稿: 641
Re: 休日関係で、「振替休日」「第2月曜・第3月曜」をやってみました。
その通りです。
v2.12以上です。

追記:10/25
実在する日をチェックしていない理由:
  休日を登録する時点では、「月・日」だけであり、実在する日は、チェックできない。
  カレンダーブロックで、チェックしても、ショップ画面なので、エラー表示は見苦しいだけ。

振替休日を月越え対応していない理由:
  現在の祝日にない。
  もし、新たに祝日が制定され、月越えが発生する可能性がある場合、処理の追加で対応できる。
  しかし、新たな祝日が「大晦日」であった場合、年越えになる可能性もある。
  現状、休日は、年単位で管理されている。
  例えば、ショップ画面を開いた日が、2014年1月ならば、2013年から導く必要がある。

そこで、休日について検討してみた。
種類として、
(1) 曜日の定休日
(2) 祝日
(3) 創立記念日など、店舗固有の休日
(4) 夏期休業・年末年始休業などの期間がある休日
かな。
(1) は、付加情報として、日付による除外があれば。
(2) は、振替休日対応
(3) は、振替休日対応は、選択
(4) は、日付の範囲指定
となれば、もっと良いかも。
sumida
投稿日時: 2013/10/26 18:53
対応状況: −−−
仙人
登録日: 2013/2/10
居住地: 広島県呉市ときどき瀬戸内海
投稿: 641
Re: 休日関係で、「振替休日」「第2月曜・第3月曜」をやってみました。
振替休日等をやってみたものの、チケット(バックログ#1406「基本情報管理>定休日管理 祝日を自動算出できるように改良」)のなかに、休日に関するものがありました。
「春分の日」「秋分の日」は、日付が変動するので、検討が必要とありました。

祝日データの取得について、検索すると、googleから持ってくるものが多くあります。
これでは、「どうも?〜ん」
で、さらに検索すると、内閣府のデータから祝日を作成するものが、ちらほら。

http://blog.aidream.jp/codeigniter/codeigniter-japanese-holiday-class-1291.html
このサイトにあるクラスライブラリは、面白いかも。
(追記:このクラスライブラリは、振替休日の設定が翌日だけのため、この部分は修正が必要)


この場合、日付による管理ではなく、祝日の名前一覧から取捨選択するような形式になるのかな〜。
sumida
投稿日時: 2014/2/3 16:18
対応状況: −−−
仙人
登録日: 2013/2/10
居住地: 広島県呉市ときどき瀬戸内海
投稿: 641
「春分の日」「秋分の日」「国民の休日」もやってみました。
春分の日・秋分の日・国民の休日の3日分も入れてみました。
最初の投稿の「2. 第2月曜・第3月曜」が変更になっているので、その部分を掲載しておきます。
(なお、春分の日・秋分の日は、官報によって確定するそうです。)

2. 第2月曜・第3月曜
制限事項:
・実在する日付の確認はしていません。
仕様:
dtb_holidayテーブルに、「第2月曜・第3月曜」を示す日付を格納する。
  上記日付は、「-xy」
    -:「第xy曜」
    x:第?週
    y:曜日(0:日曜〜6:土曜)
  つまり、
    -21:第2月曜
    -31:第3月曜

さらに、「春分・秋分・有効年適用」
    -91:春分 3月強制
    -92:秋分 9月強制
    -93:有効年適用 9月強制

data/class/SC_Date.php
新規追加

// -02 added
    public function getDayHoliday($default = false)
    {
        $day_array = array();

        if ($default) $day_array[''] = '--';

        // -xy:第xy曜日
        // y:0(日曜)〜6(土曜)
        $day_array[-21] = '第2月曜';
        $day_array[-31] = '第3月曜';
        // 春分日
        $day_array[-91] = '春分';
        // 秋分日
        $day_array[-92] = '秋分';
        // 「国民の休日」
        $day_array[-93] = '有効年適用';

        for ($i=0; $i < 31; $i++) {
            $day_array[ $i + 1 ] = $i + 1;
        }

        return $day_array;
    }
// -02 added


data/class/pages/admin/basis/LC_Page_Admin_Basis_Holiday.php

    public function action()
    {
        $objHoliday = new SC_Helper_Holiday_Ex();

        $objDate = new SC_Date_Ex();
        $this->arrMonth = $objDate->getMonth();
/* -02 changed
        $this->arrDay = $objDate->getDay();
-02 changed */
        $this->arrDay = $objDate->getDayHoliday();
// -02 changed

data/Smarty/templates/admin/basis/holiday.tpl

                <td><!--{$arrHoliday[cnt].title|h}--></td>
<!--{* -02 changed
                <td><!--{$arrHoliday[cnt].month|h}-->月<!--{$arrHoliday[cnt].day|h}-->日</td>
-02 changed *}-->
                <!--{assign var=holiday_day value=$arrHoliday[cnt].day}-->
                <td><!--{$arrHoliday[cnt].month|h}-->月<!--{$arrDay[$holiday_day]|h}-->日</td>
<!--{* -02 changed *}-->


data/class/SC_Date.php
上記、1.の修正分に追加

/* -01 changed
    private function setArrHoliday()
-01 changed */
    private function setArrHoliday($year)
// -01 changed
    {
        $objHoliday = new SC_Helper_Holiday_Ex();
        $holiday = $objHoliday->getList();
/* -01 changed
        $arrHoliday = array();
        foreach ($holiday AS $val) {
            $arrHoliday[$val['month']][] = $val['day'];
        }
-01 changed */
        $arrHoliday[$year] = array();
        foreach ($holiday AS $val) {
// -02 added
          if ($val['day'] < 0) {
            switch($val['day']) {
              case -91: // 春分の日
                $arrHoliday[$year]['3'][] = $this->getSpringEquinoxDay($year);
                break;
              case -92: // 秋分の日
                $arrHoliday[$year]['9'][] = $this->getAutumnalEquinoxDay($year);
                break;
              case -93: // 「国民の休日」
                if ($this->checkKokuminDay($year)) {
                  $arrHoliday[$year]['9'][] = $this->getAutumnalEquinoxDay($year) - 1;
                }
                break;
              default :
                $arrHoliday[$year][$val['month']][] = $this->getTargetDay($year, $val['month'], intval(abs($val['day']) / 10), abs($val['day']) % 10);
            }
          } else {
// -02 added
            $arrHoliday[$year][$val['month']][] = $val['day'];
// -02 added
          }
// -02 added
        }
// -01 changed
// -01 added
        // 振替休日の確認
        $arrHolidayNew = array();
        foreach ($arrHoliday[$year] AS $month => $arrDay) {
          foreach ($arrDay AS $key => $day) {
            $weekHoliday = date('w', mktime(0, 0, 0, $month, $day, $year));
            if ($weekHoliday == 0) {
                // 日曜日
                $newDay = $day;
                // 休日でない日は?
                do {
                    $newDay += 1;
                } while(in_array($newDay, $arrDay));
                // 振替休日
                $arrHolidayNew[$year][$month][] = $newDay;
            }
          }
        }
        // 振替休日の追加
        foreach ($arrHolidayNew as $year => $arrMonth) {
            foreach ($arrMonth as $month => $arrDay) {
                foreach ($arrDay as $day) {
                    $arrHoliday[$year][$month][] = $day;
                }
            }
        }
// -01 added
        SC_Date_Ex::$arrHoliday = $arrHoliday;
    }
// -02 added
    private function getTargetDay($year, $month, $week, $weekly) {
      // その月の始まりは何曜日か(0:日曜〜6:土曜)
      $weeklyMonth1st = date('w', mktime(0, 0, 0, $month, 1, $year));
      // 指定された曜日の第1週は、何日
      $weekly1stDay = ($weekly - $weeklyMonth1st >= 0) ? 1 + $weekly - $weeklyMonth1st : 1 + $weekly - $weeklyMonth1st + 7;
      // 日にちを算出:$day
      return $weekly1stDay + ( 7 * ($week - 1) );
    }
    private function getSpringEquinoxDay($year) {
      return intval(20.8431 + (0.242194 * ($year - 1980)) - intval(($year - 1980) / 4));
    }
    private function getAutumnalEquinoxDay($year) {
      return intval(23.2488 + (0.242194 * ($year - 1980)) - intval(($year - 1980) / 4));
    }
    private function checkKokuminDay($year) {
      if ($this->getAutumnalEquinoxDay($year) == $this->getTargetDay($year, 9, 3, 1) + 2) { // 敬老の日の翌々日が秋分の日なら「国民の休日」を適用
        return true;
      }
      return false;
    }
// -02 added
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBE公式 Amazon Payプラグイン

統計情報

総メンバー数は88,972名です
総投稿数は110,019件です

投稿数ランキング

1
seasoft
7367
2
468
3217
3
AMUAMU
2712
4
nanasess
2314
5
umebius
2085
6
yuh
1819
7
h_tanaka
1646
8
red
1570
9
mcontact
1296
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
799
14 ramrun 789
15 karin 689
16 sumida 641
17
homan
633
18 DELIGHT 572
19
patapata
502
20
flealog
485


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.