app/Customize/Service/kintoneCalendarService.php line 338

Open in your IDE?
  1. <?php
  2. //kakunin コメント確認する
  3. /*
  4. ファイル名:kintoneCalendarService.php
  5. 処理概要:kintone予定アプリから情報を渡す
  6. 作成年月日:2023/08/18
  7. 作成者:a.tojo
  8. 修正年月日:2024/04/24 k.saito
  9. 修正内容:kintoneでキャンセルになった(非表示チェックがON)データは、抽出対象から外す
  10. 修正年月日:2024/07/23 k.saito
  11. 修正内容:エアコン2階下ろし工事のカレンダ表示ができない現象の調査で、ログ埋込
  12. 修正年月日:2024/07/23 k.saito
  13. 修正内容:getStaffRecord 関数内で、スタッフの担当エリアが存在しない場合は、「無視する」の処理が不十分。修正。
  14. */
  15. declare(strict_types=1); //ECCUBEでエラー出たら外す
  16. namespace Customize\Service;
  17. require_once(dirname(__FILE__4) . '/php/kintone/kntn_class_schedule.php');
  18. require_once(dirname(__FILE__4) . '/php/kintone/kntn_class_staff.php');
  19. require_once(dirname(__FILE__4) . '/php/common/error_notification.php');   // エラー通知クラス
  20. //PHPUnit用
  21. //namespace kintone\sinwasama;
  22. //require_once(dirname(__FILE__) . '/php/kintone/kntn_class_schedule.php');
  23. //require_once(dirname(__FILE__) . '/php/kintone/kntn_class_staff.php');
  24. use Carbon\Carbon;
  25. use Carbon\CarbonPeriod;
  26. use php\kintone\KntnSchedule;
  27. use php\kintone\KntnStaff;
  28. //use php\common\ErrNotifi;
  29. //use php\common\LogOut; 
  30. use \Datetime;
  31. use Eccube\Request\Context;
  32. use Customize\Service\getAreaForCalendarService//各エリアの変数が格納されている
  33. class kintoneCalendarService
  34. {
  35.     /**
  36.      * @var KntnSchedule
  37.      */
  38.     private $kntn;
  39.     /**
  40.      * @var sendErrorNotifiService
  41.      */
  42.     protected $sendErrorNotifi;
  43.     public function __construct(
  44.         sendErrorNotifiService $sendErrorNotifi,
  45.         getAreaForCalendarService $getAreaForCalendarService
  46.     ) {
  47.         $this->sendErrorNotifi $sendErrorNotifi;
  48.         $this->getAreaForCalendarService $getAreaForCalendarService;
  49.     }
  50.     /**
  51.      * カレンダーに設定する予約可能日の詳細を作成する
  52.      *
  53.      * @param Carbon $targetDate ターゲット日 本日
  54.      * @param array $reservationDetail 予約可能日の詳細。カレンダーで使用。商品カテゴリ対応のスタッフを各地域ごとに表示
  55.      * @param array $subStaffReservationDetail サブ担当者の予約可能日の詳細。カレンダーで使用。商品カテゴリ関係なく各地域対応スタッフを表示
  56.      * @param array $areaStaffFromCalender 各エリアの担当スタッフ
  57.      * @param Carbon $startMonth 本日の前月の中旬 ※作業開始日と作業終了日が前月〜今月を跨ぐ可能性があるため
  58.      * @param Carbon $endMonth 本日の来月末
  59.      * @param boolean $subStaffFlg エコキュート判断用。trueの場合は対象カテゴリがエコキュート
  60.      * @param array $subStaff エコキュート用、担当エリアのサブスタッフ
  61.      * 
  62.      * @return array $reservationDetail,$subStaffReservationDetail
  63.      */
  64.     public function
  65.     makeReservationDetail(Carbon $targetDate$area$categoryName, &$reservationDetail, &$subStaffReservationDetail$subStaffFlg)
  66.     {
  67.         log_debug('makereservationDetail start');
  68.         //dump($targetDate);
  69.         //初期化 start
  70.         $startMonth $targetDate->copy()->startOfMonth(); //>subMonth()->endOfMonth()->subDays(15);
  71.         $endMonth $targetDate->copy()->addMonth()->endOfMonth();
  72.         $startMonthString $startMonth->toDateString();
  73.         $endMonthString $endMonth->toDateString();
  74.         $subStaff = [];
  75.         $subStaffKey 'サブスタッフ';
  76.         $reservationDetail = [];
  77.         $staffFlg 'default';
  78.         //deleteTargetの値で削除対象の時間帯が変わる為
  79.         $am1 'AM1';
  80.         $am2 'AM2';
  81.         $pm1 'PM1';
  82.         $pm2 'PM2';
  83.         $timePeriodDelete = array(
  84.             'AM1' => array($am1),
  85.             'AM2' => array($am2),
  86.             'AM' => array($am1$am2),
  87.             'PM1' => array($pm1),
  88.             'PM2' => array($pm2),
  89.             'PM' => array($pm1$pm2),
  90.             'AM1~PM1' => array($am1$am2$pm1),
  91.             'AM2~PM2' => array($am2$pm1$pm2),
  92.             'AM2~PM1' => array($am2$pm1),
  93.             '終日' => array($am1$am2$pm1$pm2)
  94.         );
  95.         $normalTimezone $timePeriodDelete['終日'];
  96.         $ecocuteTimezone $timePeriodDelete['AM'];
  97.         //kintoneから商品カテゴリ対応のメインスタッフを取得(エコキュート含む)
  98.         $categoryStaff $this->getStaffScheduleRecord($categoryName$startMonthString$endMonthString);
  99.         dump($categoryStaff);
  100.         log_debug($categoryName 'に対応しているスタッフ');
  101.         log_debug(print_r($categoryStafftrue));
  102.         //各エリア対応のスタッフを取得する
  103.         $areaStaff $this->getAreaStaffRecord($categoryStaff$area);
  104.         dump($areaStaff);
  105.         //デバッグ
  106.         $areastaff_txt print_r($areaStafftrue);
  107.         log_debug('areastaff:'.$areastaff_txt);
  108.         //エコキュートの場合はサブ担当者の情報も取得するため
  109.         if ($subStaffFlg) {
  110.             log_info('エコキュートなのでサブ担当者を選択');
  111.             $createdStaff $categoryStaff;
  112.             //検索しやすくする為、キー値をスタッフコードにする
  113.             foreach ($createdStaff as $staffKey => $staffValue) {
  114.                 $staffCode $staffValue['ユーザー選択'][0]['code'];
  115.                 $createdStaff[$staffCode] = $staffValue;
  116.                 unset($createdStaff[$staffKey]);
  117.             }
  118.             foreach ($area as $targetArea) {
  119.                 $variable $targetArea['variable'];
  120.                 $areaName $targetArea['name'];
  121.                 $subStaff[$variable] = $this->getStaffScheduleRecord($areaName$startMonthString$endMonthString$subStaffFlg$createdStaff); //サブスタッフのレコードを取得
  122.             }
  123.         }
  124.         //カレンダー用の各エリアスタッフ $areaStaffFromCalender を作成する
  125.         $key '';
  126.         $value '';
  127.         $areaStaffFromCalender = [];
  128.         foreach ($areaStaff as $targetAreaKey => $targetArea) {
  129.             //商品カテゴリ担当&エリア担当のスタッフがいない可能性がある為
  130.             if ($areaStaff[$targetAreaKey]['対応スタッフ']) {
  131.                 foreach ($areaStaff[$targetAreaKey]['対応スタッフ'] as $targetAreaStaff) {
  132.                     $key $targetAreaStaff['id']; //レコードid
  133.                     $value $targetAreaStaff['name']; //名前
  134.                     $areaStaffFromCalender[$targetAreaKey]['対応スタッフ'][$key] = $value;
  135.                 }
  136.             } else {
  137.                 $areaStaffFromCalender[$targetAreaKey]['対応スタッフ'] = [];
  138.             }
  139.         };
  140.         dump($areaStaffFromCalender);
  141.         //デバッグ
  142.         $areaStaffFromCalender_txt print_r($areaStaffFromCalendertrue);
  143.         log_debug('areaStaffFromCalender:'.$areaStaffFromCalender_txt);
  144.         //各日付の予約状況を作成する
  145.         //初期化 各日付・時間帯を作成する
  146.         $period $startMonth->copy()->toPeriod($endMonth);
  147.         foreach ($period as $day) {
  148.             //dump($day);
  149.             $day $day->format('Y-m-d');
  150.             $reservationDetail[$day] = [];
  151.             foreach ($area as $targetarea) {
  152.                 $variable $targetarea['variable']; //anjou
  153.                 $reservationDetail[$day][$variable]['AM1'] = [];
  154.                 $reservationDetail[$day][$variable]['AM2'] = [];
  155.                 $reservationDetail[$day][$variable]['PM1'] = [];
  156.                 $reservationDetail[$day][$variable]['PM2'] = [];
  157.             }
  158.         }
  159.         //dump($areaStaffFromCalender);
  160.         foreach ($reservationDetail as $dayKey => $dayValue) {
  161.             foreach ($dayValue as $areaKey => $areaValue) {
  162.                 // reservationDetailに値を設定
  163.                 foreach ($normalTimezone as $timeZoneKey) {
  164.                     $reservationDetail[$dayKey][$areaKey][$timeZoneKey] = $areaStaffFromCalender[$areaKey]['対応スタッフ'];
  165.                 }
  166.                 if ($subStaffFlg) {
  167.                     //dump('エコキュートの場合');
  168.                     foreach ($ecocuteTimezone as $timeZoneKey) {
  169.                         $subStaffReservationDetail[$dayKey][$areaKey][$timeZoneKey] = $subStaff[$areaKey]['list'];
  170.                     }
  171.                 }
  172.             }
  173.         }
  174.         //デバッグ
  175.         $reservationDetail_txt print_r($reservationDetailtrue);
  176.         log_debug('削除前reservationDetail:'.$reservationDetail_txt);
  177.         //dump('削除前');
  178.         //dump($reservationDetail);
  179.         //dump($subStaffReservationDetail);
  180.         //dump($categoryStaff);
  181.         //dump($subStaff);
  182.         //予定がある担当スタッフを配列から削除
  183.         if ($subStaffFlg) {
  184.             $staffFlg 'main';
  185.         }
  186.         //dump($categoryStaff);
  187.         //予定がある担当スタッフを配列から削除
  188.         foreach ($categoryStaff as $staff) {
  189.             //dump($staff);
  190.             $targetStaffId $staff['レコードid'];
  191.             $targetStaff $staff['名前']; //削除対象スタッフ
  192.             $deleteArea $staff['担当エリアテーブル']; //削除対象エリア
  193.             //dump($staff);
  194.             //来月の予定がない場合がある為
  195.             if (is_array($staff['予定'])) {
  196.                 foreach ($staff['予定'] as $schedule) { //スタッフの予定を取得
  197.                     //dump($schedule);
  198.                     $deleteTarget $schedule['スケジュール選択']; //削除する時間帯。AM1、AM1~PM2など
  199.                     $deleteDayStart $schedule['作業開始日'];
  200.                     $deleteDayEnd $schedule['作業完了日'];
  201.                     if ($deleteDayStart === $deleteDayEnd) {
  202.                         log_debug('予定アプリレコード番号' $schedule['レコード番号'] . ':作業開始日と作業完了日が同じ');
  203.                         log_info('$reservationDetailから' $deleteDayStart '~' $deleteDayEnd 'までの' $targetStaff 'さんを削除開始。 削除スケジュール:' $deleteTarget);
  204.                         $deleteDay $deleteDayStart;
  205.                         //作業開始日が先月末の予定もあるため
  206.                         if (array_key_exists($deleteDay$reservationDetail)) {
  207.                             $reservationDetail[$deleteDayStart] = $this->deleteStaffFromScheduleArray($reservationDetail[$deleteDay], $timePeriodDelete$deleteDay$targetStaffId$targetStaff$deleteArea$deleteTarget$staffFlg);
  208.                         }
  209.                     } else {
  210.                         log_debug('予定アプリレコード番号' $schedule['レコード番号'] . ':作業開始日と作業完了日が違う');
  211.                         //削除する作業開始日から作業完了日までの日付の範囲を作成する
  212.                         log_debug('作業開始日' $deleteDayStart 'と作業終了日' $deleteDayEnd 'をcarbonに変換');
  213.                         $deleteDayStart Carbon::parse($deleteDayStart);
  214.                         $deleteDayEnd Carbon::parse($deleteDayEnd);
  215.                         //dump($deleteDayStart);
  216.                         //dump($deleteDayEnd);
  217.                         $deleteDayPeriod $deleteDayStart->copy()->toPeriod($deleteDayEnd);
  218.                         foreach ($deleteDayPeriod as $deleteDayCarbon) {
  219.                             $deleteDay $deleteDayCarbon->toDateString();
  220.                             //dump($deleteDay);
  221.                             //作業開始日が先月末の予定もあるため
  222.                             if (array_key_exists($deleteDay$reservationDetail)) {
  223.                                 $reservationDetail[$deleteDay] = $this->deleteStaffFromScheduleArray($reservationDetail[$deleteDay], $timePeriodDelete$deleteDay$targetStaffId$targetStaff$deleteArea$deleteTarget$staffFlg);
  224.                             }
  225.                         }
  226.                     }
  227.                 }
  228.             }
  229.         }
  230.         if ($subStaffFlg) {
  231.             //エコキュートの場合
  232.             //サブスタッフ
  233.             $staffFlg 'sub';
  234.             foreach ($subStaff as $areaKey => $areaValue) {
  235.                 foreach ($areaValue as $staffKey => $staff) {
  236.                     if ($staffKey === 'list') { //listキーは見ない
  237.                         continue;
  238.                     }
  239.                     $targetStaffId $staff['レコードid'];
  240.                     $targetStaff $staff['名前']; //削除対象スタッフ
  241.                     $deleteArea $staff['担当エリアテーブル']; //削除対象エリア
  242.                     //来月の予定がない場合がある為
  243.                     if (is_array($staff['予定'])) {
  244.                         foreach ($staff['予定'] as $schedule) { //スタッフの予定を取得
  245.                             //dump($schedule);
  246.                             $deleteDayStart $schedule['作業開始日'];
  247.                             $deleteDayEnd $schedule['作業完了日'];
  248.                             if ($deleteDayStart === $deleteDayEnd) {
  249.                                 log_debug('予定アプリレコード番号' $schedule['レコード番号'] . ':作業開始日と作業完了日が同じ' $staffFlg);
  250.                                 log_debug('$reservationDetailから' $deleteDayStart '~' $deleteDayEnd 'までの' $targetStaff 'さんを削除開始。 削除スケジュール:' $deleteTarget);
  251.                                 $deleteDay $deleteDayStart;
  252.                                 //作業開始日が先月末の予定もあるため
  253.                                 if (array_key_exists($deleteDay$subStaffReservationDetail)) {
  254.                                     $subStaffReservationDetail[$deleteDayStart] = $this->deleteStaffFromScheduleArray($subStaffReservationDetail[$deleteDay], $timePeriodDelete$deleteDay$targetStaffId$targetStaff$deleteArea$deleteTarget$staffFlg);
  255.                                 }
  256.                             } else {
  257.                                 log_debug('予定アプリレコード番号' $schedule['レコード番号'] . ':作業開始日と作業完了日が違う');
  258.                                 //削除する作業開始日から作業完了日までの日付の範囲を作成する
  259.                                 log_debug('作業開始日' $deleteDayStart 'と作業終了日' $deleteDayEnd 'をcarbonに変換');
  260.                                 $deleteDayStart Carbon::parse($deleteDayStart);
  261.                                 $deleteDayEnd Carbon::parse($deleteDayEnd);
  262.                                 //dump($deleteDayStart);
  263.                                 //dump($deleteDayEnd);
  264.                                 $deleteDayPeriod $deleteDayStart->copy()->toPeriod($deleteDayEnd);
  265.                                 foreach ($deleteDayPeriod as $deleteDayCarbon) {
  266.                                     $deleteDay $deleteDayCarbon->toDateString();
  267.                                     //dump($deleteDay);
  268.                                     //作業開始日が先月末の予定もあるため
  269.                                     if (array_key_exists($deleteDay$subStaffReservationDetail)) {
  270.                                         log_debug('サブ担当者削除開始日と終了日が違う');
  271.                                         log_debug($deleteDayStart);
  272.                                         log_debug($targetStaff);
  273.                                         $subStaffReservationDetail[$deleteDay] = $this->deleteStaffFromScheduleArray($subStaffReservationDetail[$deleteDay], $timePeriodDelete$deleteDay$targetStaffId$targetStaff$deleteArea$deleteTarget$staffFlg);
  274.                                     }
  275.                                 }
  276.                             }
  277.                         }
  278.                     }
  279.                 }
  280.             }
  281.         }
  282.         //デバッグ
  283.         $reservationDetail_txt print_r($reservationDetailtrue);
  284.         log_debug('削除後reservationDetail:'.$reservationDetail_txt);
  285.         //dump('削除後');
  286.         //dump($reservationDetail);
  287.         //dump($subStaffReservationDetail);
  288.         //debug 問題なければ消す
  289.         dump($categoryName 'に対応しているスタッフは(作業レベル');
  290.         dump($categoryStaff);
  291.         dump('エリアごとのスタッフ');
  292.         dump($areaStaff);
  293.         if ($subStaff) {
  294.             dump('エコキュートの場合');
  295.             dump($subStaff);
  296.         }
  297.         //debug
  298.         //問題なければ消す
  299.         //debug
  300.         log_debug('makereservationDetail end');
  301.     }
  302.     /** 
  303.      *kintone 予約アプリの情報を返す
  304.      *担当スタッフの空き状況を確認する為
  305.      */
  306.     public function getScheduleRecord($staffCode$startMonthString$endMonthString)
  307.     {
  308.         log_debug('getScheduleRecord start');
  309.         log_info($staffCode 'の' $startMonthString 'から' $endMonthString 'までの予定をkintoneから取得する');
  310.         $staff_record '予定アプリにデータなし';
  311.         //レコード取得
  312.         $result = array(); // 戻り値格納変数
  313.         // 抽出条件。カテゴリー & レコード番号で抽出
  314.         $query '(内容 not in ("削除") and 非表示チェック not in ("非表示") and 対応スタッフ in (' '"' $staffCode '")' ' and (作業開始日時 >= "' $startMonthString '" and 作業開始日時 <= ' '"' $endMonthString '" )) or (内容 not in ("削除") and 非表示チェック not in ("非表示") and 対応スタッフ in (' '"' $staffCode '")' 'and (作業完了日時 >= "' $startMonthString '" and 作業完了日時 <= ' '"' $endMonthString '" ))';
  315.         //dump($staffCode);
  316.         //dump($query);
  317.         // クエリ以外を指定
  318.         $non_query "order by 作業開始日時 asc";
  319.         // 取得するフィールドコードを指定。nullは全フィールドコード。
  320.         $fields = array('fields' => array('レコード番号''対応スタッフ''作業開始日時''作業完了日時''スケジュール選択''内容'));
  321.         //$fields = null;
  322.         $kntn = new KntnSchedule();
  323.         // $count > 0 の間、ループ。クエリー対象の全レコードのECコード取得
  324.         while (($count $kntn->getRecords($result$fields$query$non_query)) > 0) {
  325.             // 1000件単位で読み出し。各処理は、以下のようにレコード単位で取り出して処理したり、色々。
  326.             $staff_record = [];
  327.             foreach ($result['records'] as $record) {
  328.                 $startOfWork Carbon::parse($record['作業開始日時']['value'])->setTimezone('Asia/Tokyo');
  329.                 $endOfWork Carbon::parse($record['作業完了日時']['value'])->setTimezone('Asia/Tokyo');
  330.                 $data = array(
  331.                     'レコード番号' => $record['レコード番号']['value'],
  332.                     '対応スタッフ' => $record['対応スタッフ']['value'],
  333.                     '作業開始日時' => $startOfWork->format('Y-m-d H:i:s'),
  334.                     '作業完了日時' => $endOfWork->format('Y-m-d H:i:s'),
  335.                     '作業開始日' => $startOfWork->format('Y-m-d'),
  336.                     '作業完了日' => $endOfWork->format('Y-m-d'),
  337.                     'スケジュール選択' => $record['スケジュール選択']['value']
  338.                 );
  339.                 $staff_record[] = $data;
  340.             }
  341.         }
  342.         //dump($staff_record);
  343.         if (!$kntn->getSuccessFlg()) {
  344.             // 失敗
  345.             // エラーログ出力
  346.             dump('kntn error');
  347.             log_error('kntn getCalendarRecord fail');
  348.             log_error('kntn result' print_r($resulttrue));
  349.             return false;
  350.         }
  351.         log_debug('getScheduleRecord end');
  352.         //dump($staff_record);
  353.         return $staff_record;
  354.     }
  355.     //各地域の対応スタッフ名を返す
  356.     public function getAreaStaffRecord($CategoryStaff$area): array
  357.     {
  358.         log_debug('getAreaStaffRecord start');
  359.         $staff '';
  360.         $areaData = [];
  361.         //dump($area);
  362.         foreach ($area as $targetArea) {
  363.             $areaName $targetArea['name'];
  364.             $variable $targetArea['variable'];
  365.             $areaData[$variable] = [];
  366.             $areaCharge = [];
  367.             foreach ($CategoryStaff as $staff) {
  368.                 //dump($staff);
  369.                 if (in_array($areaName$staff['担当エリアテーブル'], true)) {
  370.                     $staffCode $staff['ユーザー選択'][0]['code'];
  371.                     $staffData = array('id' => $staff['レコードid'], 'name' => $staff['名前'], 'ユーザー選択コード' => $staffCode);
  372.                     $areaCharge[] = $staffData;
  373.                 }
  374.             }
  375.             $areaData[$variable] = array('variable' => $variable'対応エリア' => $areaName'対応スタッフ' => $areaCharge);
  376.         }
  377.         //log_debug(print_r($areaData, true));
  378.         log_debug('getAreaStaffRecord end');
  379.         return $areaData;
  380.     }
  381.     /** 
  382.      *kintone スタッフアプリの情報を返す
  383.      *担当エリア、設置出来る商品を取得するため
  384.      */
  385.     public function getStaffRecord($targetName$subStaffFlg)
  386.     {
  387.         log_debug('getStaffRecord start:');
  388.         log_info($targetName '対応のスタッフをkintoneから検索');
  389.         //レコード取得
  390.         $staffRecord = [];
  391.         $data = [];
  392.         $result = []; // 戻り値格納変数
  393.         //エリアに応じた変数を検索出来る配列を作成
  394.         //$getAreaForCalendarService = new getAreaForCalendarService(); //各エリアの変数が格納されたクラス
  395.         //$getAreaForCalendarService = $getAreaForCalendarService->getArea();
  396.         $getAreaForCalendarService $this->getAreaForCalendarService->getArea();
  397.         $searchAreaVariables = [];
  398.         foreach ($getAreaForCalendarService as $variable) {
  399.             $key $variable['name'];
  400.             $value $variable['variable'];
  401.             $searchAreaVariables[$key] = $value;
  402.         }
  403.         dump($searchAreaVariables);
  404.         $query '中分類 in ("' $targetName '")';
  405.         //エコキュートの場合はサブ担当者も決めないといけないため条件を変える
  406.         if ($subStaffFlg) {
  407.             //dump('サブ担当者を検索する');
  408.             $query '担当エリア in ("' $targetName '")';
  409.         }
  410.         $non_query "order by レコード番号 desc";
  411.         // 取得するフィールドコードを指定。nullは全フィールドコード。
  412.         $fields = array('fields' => array('$id''名前''ユーザー選択''スキル入力テーブル''担当エリアテーブル'));
  413.         $kntn = new KntnStaff();
  414.         // $count > 0 の間、ループ。クエリー対象の全レコードのECコード取得
  415.         while (($count $kntn->getRecords($result$fields$query$non_query)) > 0) {
  416.             //dump($result['records']);
  417.             // 1000件単位で読み出し。各処理は、以下のようにレコード単位で取り出して処理したり、色々。
  418.             foreach ($result['records'] as $record) {
  419.                 //テーブルフィールド用
  420.                 $table = [];
  421.                 $area = [];
  422.                 $skill = [];
  423.                 $user = [];
  424.                 foreach ($record['ユーザー選択']['value'] as $table) {
  425.                     $tabledata = array('code' => $table['code'], 'name' => $table['name']);
  426.                     $user[] = $tabledata;
  427.                 }
  428.                 foreach ($record['スキル入力テーブル']['value'] as $table) {
  429.                     $skill[] = $table['value']['中分類']['value'];
  430.                 }
  431.                 foreach ($record['担当エリアテーブル']['value'] as $table) {
  432.                     $value $table['value']['担当エリア']['value'];
  433.                     //kintoneスタッフアプリで対応エリア外の地域を設定する可能性がある為、設定した場合はスルーする
  434.                     if (array_key_exists($value$searchAreaVariables)) {
  435.                         $key $searchAreaVariables[$value]; //該当エリアの変数をキーにする。安城市の場合はanjouをキーにする
  436.                         $area[$key] = $value;
  437.                     } else {
  438.                         log_info($record['名前']['value'] . 'さんはスタッフアプリの担当エリアテーブルにECCUBEエリア外のエリア[' $value ']を設定しております。');
  439.                     }
  440.                     // ここが不十分
  441.                     // $area[$key] = $value;
  442.                 }
  443.                 $data = array(
  444.                     'レコードid' => $record['$id']['value'],
  445.                     '名前' => $record['名前']['value'],
  446.                     'ユーザー選択' => $user,
  447.                     'スキル入力テーブル' => $skill,
  448.                     '担当エリアテーブル' => $area
  449.                 );
  450.                 $staffRecord[] = $data;
  451.                 //dump($staffRecord);
  452.             }
  453.         }
  454.         if (!$kntn->getSuccessFlg()) {
  455.             // 失敗
  456.             // エラーログ出力
  457.             dump('kntn error');
  458.             log_error('kntn getCalendarRecord fail');
  459.             log_error('kntn result' print_r($resulttrue));
  460.             //LogOut::error(basename(__FILE__), __LINE__, "kntn getCalendarRecord", 'fail', dirname(__FILE__));
  461.             //LogOut::error(basename(__FILE__), __LINE__, "kntn result", print_r($result, true), dirname(__FILE__));
  462.             return false;
  463.         }
  464.         log_debug('getStaffRecord end');
  465.         return $staffRecord;
  466.     }
  467.     //商品カテゴリ対応スタッフの配列に予定アプリのスケジュールを追加して返す
  468.     public function getStaffScheduleRecord($targetName$startMonthString$endMonthString$subStaffFlg false, &$createdStaff null): array
  469.     {
  470.         log_debug('getStaffScheduleRecord start');
  471.         $CategoryScheduleStaff = [];
  472.         $CategoryStaff $this->getStaffRecord($targetName$subStaffFlg);
  473.         dump($CategoryStaff);
  474.         if ($subStaffFlg === false) {
  475.             log_debug('通常スタッフ');
  476.             foreach ($CategoryStaff as $staff) {
  477.                 $staffCode $staff['ユーザー選択'][0]['code'];
  478.                 $scheduleData $this->getScheduleRecord($staffCode$startMonthString$endMonthString);
  479.                 $staff['予定'] = $scheduleData;
  480.                 $CategoryScheduleStaff[] = $staff;
  481.             }
  482.         } else {
  483.             log_debug('サブスタッフ');
  484.             $CategoryScheduleStaff['list'] = [];
  485.             //スタッフのレコードが既に存在する場合は使い回す
  486.             foreach ($CategoryStaff as $staff) {
  487.                 //dump($staff);
  488.                 $staffCode $staff['ユーザー選択'][0]['code'];
  489.                 $recordId $staff['レコードid'];
  490.                 if (array_key_exists($staffCode$createdStaff)) {
  491.                     //dump('$createdStaffに' . $staffCode . 'あり');
  492.                     $staff['予定'] = $createdStaff[$staffCode]['予定'];
  493.                 } else {
  494.                     log_debug('$createdStaffに' $staffCode 'なし');
  495.                     $scheduleData $this->getScheduleRecord($staffCode$startMonthString$endMonthString);
  496.                     $staff['予定'] = $scheduleData;
  497.                     $createdStaff[$staffCode] = $staff;
  498.                 }
  499.                 $CategoryScheduleStaff[] = $staff;
  500.                 $CategoryScheduleStaff['list'][$recordId] = $staff['名前'];
  501.             }
  502.         }
  503.         //dump($CategoryScheduleStaff);
  504.         log_debug('getStaffScheduleRecord end');
  505.         return $CategoryScheduleStaff;
  506.     }
  507.     /**
  508.      * カレンダー生成用の配列からスタッフを削除する
  509.      *
  510.      * @param string $deleteDay 削除日
  511.      * @param array $reservationDetailDeleteDay カレンダー生成用の各スタッフの予定が格納された配列(削除日のみ)。
  512.      * @param string $targetStaff 削除対象のスタッフ
  513.      * @param string $deleteTarget 削除対象の時間帯(AM1など)
  514.      * @param array $deleteArea スタッフの対応エリア(削除するエリア)
  515.      */
  516.     //public function deleteStaffFromScheduleArray($reservationDetail, $targetStaffId, $targetStaff, $deleteArea, $deleteDayStart, $deleteDayEnd, $deleteTarget): array
  517.     public function deleteStaffFromScheduleArray($reservationDetailDeleteDay$timePeriodDelete$deleteDay$targetStaffId$targetStaff$deleteArea$deleteTarget$staffFlg): array
  518.     {
  519.         log_debug('deleteStaffFromScheduleArray start');
  520.         switch ($staffFlg) {
  521.             case 'main':
  522.                 log_debug('エコキュートメインスタッフなのでAM1〜PM2まで削除');
  523.                 $deleteTarget $timePeriodDelete['終日'];
  524.                 break;
  525.             case 'sub':
  526.                 log_debug('エコキュートサブスタッフなのでAM1〜AM2まで削除');
  527.                 $deleteTarget $timePeriodDelete['AM'];
  528.                 break;
  529.             default:
  530.                 log_debug('エコキュート以外のスタッフなので通常通り削除');
  531.                 $deleteTarget $timePeriodDelete[$deleteTarget];
  532.         }
  533.         log_debug($targetStaff 'さんの対応エリア' print_r($deleteAreatrue));
  534.         log_debug($targetStaff 'さんの削除スケジュール' .  print_r($deleteTargettrue));
  535.         //dump('削除前のカレンダー(' . $deleteDay . ')' . print_r($reservationDetailDeleteDay, true));
  536.         //スタッフの対応エリアのスケジュール(AM1など)を削除
  537.         foreach ($deleteArea as $targetAreaKey => $targetArea) {
  538.             foreach ($deleteTarget as $deleteTimeKey => $deleteTime) {
  539.                 log_debug($deleteDay ':' $targetArea 'の' $targetStaff 'さんを削除。' $deleteTime 'の' '対象配列キー(スタッフアプリレコードid):' $targetStaffId);
  540.                 if (in_array($targetStaff$reservationDetailDeleteDay[$targetAreaKey][$deleteTime], true)) {
  541.                     unset($reservationDetailDeleteDay[$targetAreaKey][$deleteTime][$targetStaffId]);
  542.                 } else {
  543.                     log_info('削除出来ませんでした。' $targetStaff 'さんが存在しません(予定アプリで別レコードで同じ日付・時間帯を選択した場合も表示される)');
  544.                 }
  545.             }
  546.         }
  547.         log_debug('deleteStaffFromScheduleArray end');
  548.         return $reservationDetailDeleteDay;
  549.     }
  550.     /**
  551.      * 各時間帯のスタッフの空き状況数を計算・表示する
  552.      *
  553.      * @param string $availabilityDisplay 空き状況(カレンダーディスプレイ用)
  554.      * @param int $availabilityCount AMかPMのスタッフ数
  555.      * @param array $schedule1 時間帯のスタッフ数、AM1/PM1用
  556.      * @param array $schedule2 時間帯のスタッフ数、AM2/PM2用
  557.      * @param string $reservable カレンダーディスプレイ用 予約可能
  558.      * @param string $reservationNot カレンダーディスプレイ用 予約不可
  559.      * @param string $few カレンダーディスプレイ用 残りわずか
  560.      */
  561.     public function
  562.     calculateAvailability(&$availabilityDisplay, &$availabilityCount$schedule1$schedule2$reservable$reservationNot$few)
  563.     {
  564.         log_debug('calculateAvailability start');
  565.         //dump($schedule1);
  566.         //dump($schedule2);
  567.         $availabilityCount count($schedule1) + count($schedule2);
  568.         $availabilityCount intval($availabilityCount);
  569.         if ($availabilityCount >= 4) {
  570.             $availabilityDisplay $reservable;
  571.         } elseif ($availabilityCount <= && $availabilityCount >= 1) {
  572.             $availabilityDisplay $few;
  573.         } elseif ($availabilityCount <= 0) {
  574.             $availabilityDisplay $reservationNot;
  575.         }
  576.         log_debug('calculateAvailability end');
  577.     }
  578.     /**
  579.      * ECCUBEカレンダーの営業日の予約不可能日を設定する
  580.      *
  581.      * @param Carbon $few ターゲット日
  582.      * @var array $japanHoliday date型のGoogleカレンダ-の祝日
  583.      * @param array $targetMonthCalendar 対象月のカレンダー
  584.      * @param array $reservationDetail 各日付のAM1~PM2のまでの対応スタッフ詳細。$targetMonthCalendar生成時に使用
  585.      * @param array $subStaffReservationDetail エコキュートの場合、各日付のAM1~PM2のまでのサブスタッフ詳細。$targetMonthCalendar生成時に使用 
  586.      * @var array $areaStaffFromCalender 各エリアの担当スタッフ
  587.      * @var date $targetYmdDateTime カレンダーの対象日
  588.      * @var string $availabilityCount 各時間帯の合計スタッフ数(AMの場合はAM1とAM2の合計)
  589.      * 
  590.      * @var string $searchDay 検索対象の日付。$reservationDetailの検索に使用。
  591.      */
  592.     public function
  593.     setReservationDay($targetMonthCalendar$reservationDetail$subStaffReservationDetailCarbon $targetDate$area$category$reservable$reservationNot$few$subStaffFlg): array
  594.     {
  595.         log_debug('setReservationDay start');
  596.         //dump($reservationDetail);
  597.         //dump($subStaffReservationDetail);
  598.         //初期化 start
  599.         $targetYearString = (string) $targetDate->copy()->year//reservationDetailから予約日を検索するため
  600.         $targetMonthString $targetDate->copy()->format('m'); //reservationDetailから予約日を検索するため
  601.         $availabilityDisplay '';
  602.         $availabilityCount '';
  603.         if ($subStaffFlg) {
  604.             //エコキュートの場合
  605.             for ($i 0$i count($targetMonthCalendar); $i++) {
  606.                 // カレンダー配列の日が空の場合は処理をスキップ
  607.                 if ($targetMonthCalendar[$i]['day'] == '') {
  608.                     continue;
  609.                 }
  610.                 $searchDay $targetYearString '-' $targetMonthString '-' sprintf('%02d'$targetMonthCalendar[$i]['day']);
  611.                 foreach ($reservationDetail[$searchDay] as $areaKey => $areaValue) {
  612.                     //空き状況の計算と表示
  613.                     //AM
  614.                     $schedule2 = []; //予定がある対象日は時間帯関わらず削除されている為、AM2は計算しなくて良い
  615.                     $targetMonthCalendar[$i]['reservation'][$areaKey]['AM1'] = $schedule1 =  $reservationDetail[$searchDay][$areaKey]['AM1'];
  616.                     $this->calculateAvailability($availabilityDisplay$availabilityCount$schedule1$schedule2$reservable$reservationNot$few);
  617.                     $mainStaffCount $availabilityCount;
  618.                     $mainStaffDispllay $availabilityDisplay;
  619.                     if ($mainStaffCount === 1) {
  620.                         //dump('エコキュートのメインスタッフ数が残り1の場合');
  621.                         //残り1名のメインスタッフはサブスタッフにならない為、削除
  622.                         $delete_key array_key_first($reservationDetail[$searchDay][$areaKey]['AM1']);
  623.                         unset($subStaffReservationDetail[$searchDay][$areaKey]['AM1'][$delete_key]);
  624.                         //dump($subStaffReservationDetail[$searchDay][$areaKey]['AM1']);
  625.                     }
  626.                     //サブスタッフ
  627.                     //AM1、AM2のいずれかに予定がある対象日は削除されているため、AM2は計算しなくて良い
  628.                     $targetMonthCalendar[$i]['reservation'][$areaKey]['subStaff']['AM1'] = $schedule1 $subStaffReservationDetail[$searchDay][$areaKey]['AM1'];
  629.                     $this->calculateAvailability($availabilityDisplay$availabilityCount$schedule1$schedule2$reservable$reservationNot$few);
  630.                     //メインスタッフとサブスタッフの人数を比較して、少ない方を表示する.
  631.                     if ($mainStaffCount <= $availabilityCount) {
  632.                         $targetMonthCalendar[$i]['reservation'][$areaKey]['AMCount'] = $mainStaffCount;
  633.                         $targetMonthCalendar[$i]['reservation'][$areaKey]['AM'] = $mainStaffDispllay;
  634.                     } else {
  635.                         $targetMonthCalendar[$i]['reservation'][$areaKey]['AMCount'] = $availabilityCount;
  636.                         $targetMonthCalendar[$i]['reservation'][$areaKey]['AM'] = $availabilityDisplay;
  637.                     }
  638.                     //PM エコキュートの場合は強制的に予約不可にする
  639.                     $targetMonthCalendar[$i]['reservation'][$areaKey]['PM'] = $reservationNot;
  640.                 }
  641.             }
  642.         } else {
  643.             for ($i 0$i count($targetMonthCalendar); $i++) {
  644.                 // カレンダー配列の日が空の場合は処理をスキップ
  645.                 if ($targetMonthCalendar[$i]['day'] == '') {
  646.                     continue;
  647.                 }
  648.                 $searchDay $targetYearString '-' $targetMonthString '-' sprintf('%02d'$targetMonthCalendar[$i]['day']);
  649.                 //dump($reservationDetail[$searchDay]);
  650.                 foreach ($reservationDetail[$searchDay] as $areaKey => $areaValue) {
  651.                     //空き状況の計算と表示
  652.                     //AM
  653.                     $targetMonthCalendar[$i]['reservation'][$areaKey]['AM1'] = $schedule1 =  $reservationDetail[$searchDay][$areaKey]['AM1'];
  654.                     $targetMonthCalendar[$i]['reservation'][$areaKey]['AM2'] = $schedule2 $reservationDetail[$searchDay][$areaKey]['AM2'];
  655.                     $this->calculateAvailability($availabilityDisplay$availabilityCount$schedule1$schedule2$reservable$reservationNot$few);
  656.                     $targetMonthCalendar[$i]['reservation'][$areaKey]['AMCount'] = $availabilityCount;
  657.                     $targetMonthCalendar[$i]['reservation'][$areaKey]['AM'] = $availabilityDisplay;
  658.                     //PM
  659.                     $targetMonthCalendar[$i]['reservation'][$areaKey]['PM1'] = $schedule1 $reservationDetail[$searchDay][$areaKey]['PM1'];
  660.                     $targetMonthCalendar[$i]['reservation'][$areaKey]['PM2'] = $schedule2 $reservationDetail[$searchDay][$areaKey]['PM2'];
  661.                     $this->calculateAvailability($availabilityDisplay$availabilityCount$schedule1$schedule2$reservable$reservationNot$few);
  662.                     $targetMonthCalendar[$i]['reservation'][$areaKey]['PMCount'] = $availabilityCount;
  663.                     $targetMonthCalendar[$i]['reservation'][$areaKey]['PM'] = $availabilityDisplay;
  664.                 }
  665.             }
  666.         }
  667.         log_debug('setReservationDay end');
  668.         return $targetMonthCalendar;
  669.     }
  670.     /**
  671.      * ECCUBEカレンダーの定休日と祝日を予約不可にする
  672.      *
  673.      * @param Carbon $few ターゲット日
  674.      * @param array $japanHoliday date型のGoogleカレンダ-の祝日
  675.      * @param array $targetMonthCalendar 対象月のカレンダー 
  676.      */
  677.     public function
  678.     setReservationHoliDay($targetMonthCalendar$holidayListOfTwoMonths$holidayCarbon $targetDate$area$reservationNot): array
  679.     {
  680.         log_debug('setReservationHoliDay start');
  681.         //ECCUBEカレンダーがDATE型の為、型変換を行う
  682.         $japanHoliday = array();
  683.         foreach ($holiday as $day) {
  684.             $japanHoliday[] = Carbon::parse($day)->toDateTime()->setTime(000);
  685.         }
  686.         for ($i 0$i count($targetMonthCalendar); $i++) {
  687.             // カレンダー配列の日が空の場合は処理をスキップ
  688.             if ($targetMonthCalendar[$i]['day'] == '') {
  689.                 $targetMonthCalendar[$i]['holiday'] = false;
  690.                 $targetMonthCalendar[$i]['today'] = false;
  691.                 continue;
  692.             }
  693.             $targetYmdDateTime = new \DateTime($targetDate->copy()->format('Y-n') . '-' $targetMonthCalendar[$i]['day']); //対象日
  694.             //dump($targetYmdDateTime);
  695.             // カレンダーの日付が定休日リストに存在するかを確認
  696.             $result array_search($targetYmdDateTime$holidayListOfTwoMonths);
  697.             //dump($holidayListOfTwoMonths);
  698.             // 定休日フラグを設定
  699.             if ($result !== false) {
  700.                 $targetMonthCalendar[$i]['holiday'] = true;
  701.                 //定休日は予約不可
  702.                 foreach ($area as $targetarea) {
  703.                     $variable $targetarea['variable'];
  704.                     $targetMonthCalendar[$i]['reservation'][$variable]['AM'] = $reservationNot;
  705.                     $targetMonthCalendar[$i]['reservation'][$variable]['PM'] = $reservationNot;
  706.                 }
  707.             } else {
  708.                 $targetMonthCalendar[$i]['holiday'] = false;
  709.             }
  710.             // 今日フラグを設定
  711.             if ($targetYmdDateTime == new \DateTime($targetDate->copy()->format('Y-n-j'))) {
  712.                 $targetMonthCalendar[$i]['today'] = true;
  713.             } else {
  714.                 $targetMonthCalendar[$i]['today'] = false;
  715.             }
  716.             //対象日が日曜日なら予約不可
  717.             if ($targetMonthCalendar[$i]['dayOfWeek'] === 'Sun') {
  718.                 foreach ($area as $targetarea) {
  719.                     $variable $targetarea['variable'];
  720.                     $targetMonthCalendar[$i]['reservation'][$variable]['AM'] = $reservationNot;
  721.                     $targetMonthCalendar[$i]['reservation'][$variable]['PM'] = $reservationNot;
  722.                 }
  723.             }
  724.             //対象日が祝日なら予約不可
  725.             //dump($targetYmdDateTime);
  726.             //dump($japanHoliday);
  727.             $japanHolidayjudgement array_search($targetYmdDateTime$japanHoliday);
  728.             if ($japanHolidayjudgement !== false) {
  729.                 $targetMonthCalendar[$i]['holiday'] = true;
  730.                 foreach ($area as $targetarea) {
  731.                     $variable $targetarea['variable'];
  732.                     $targetMonthCalendar[$i]['reservation'][$variable]['AM'] = $reservationNot;
  733.                     $targetMonthCalendar[$i]['reservation'][$variable]['PM'] = $reservationNot;
  734.                 }
  735.             }
  736.         }
  737.         log_debug('setReservationHoliDay end');
  738.         //dump($targetMonthCalendar);
  739.         return $targetMonthCalendar;
  740.     }
  741.     /**
  742.      * ECCUBEカレンダーの月初から本日までを予約不可にする
  743.      * 在庫がある商品は本日から予約可能にする。
  744.      * 在庫がない商品は本日から4日までを予約不可にする。
  745.      * 在庫がない場合は在庫の取り寄せ状況を考慮して祝日がある場合は予約不可日数を増やす
  746.      * 在庫あり・なしは$bakusokuflgで判断する。
  747.      * 
  748.      * @param array $targetMonthCalendar 対象月のカレンダー
  749.      * @param string $bakusokuflg 在庫がある場合はtrue、ない場合はfalse 
  750.      * @param Carbon $targetDate 本日の日付と時刻
  751.      * @param string $targetDateCopy 本日。比較対象のため0時にセットする
  752.      * @param string $noReservationDayStart 予約不可日開始日(月初)
  753.      * @param string $noReservationDayEnd 予約不可日終了日、爆速商品で値が変わる為、初期値は前日
  754.      * @param array $japanHoliday 祝日と定休日をまとめた配列。本日〜4日以内に祝日があるか判断する為
  755.      * @param Carbon $amTenFlg 本日のAM10時。現在時刻が10時か比較する為
  756.      * @param string $today 本日。現在時刻が10時か比較する為
  757.      * @param Carbon $noReservationDayEnd 爆速商品以外の場合に不可にする日付の最終日、来月用に仕様する。
  758.      */
  759.     public function
  760.     setNotReservationToday(&$targetMonthCalendar$bakusokuflg$area$holidayListOfTwoMonths$holidayCarbon $targetDate$reservationNot, &$notReservationDay, &$noReservationDayEnd)
  761.     {
  762.         log_debug("setNotReservationToday start");
  763.         //dump($targetDate);
  764.         $targetDateCopy $targetDate->copy()->startOfDay(); //本日。比較対象のため0時にセットする
  765.         $noReservationDayStart $targetDateCopy->copy()->startOfMonth(); //予約不可日開始日(月初)
  766.         $noReservationDayEnd $targetDateCopy->copy()->subDay(); //予約不可日終了日、爆速商品で値が変わる為、初期値は前日
  767.         $today $targetDate->format("Y-m-d"); //本日。比較対象のため0時にセットする
  768.         $amTenFlg $targetDate->copy()->hour(10); // 10時のCarbonオブジェクトを作成
  769.         //dump($noReservationDayStart);
  770.         //dump($noReservationDayEnd);
  771.         //dump($holidayListOfTwoMonths);
  772.         //dump($holiday);
  773.         //ECCUBEカレンダーがDATE型の為、祝日は型変換を行う     
  774.         $japanHoliday = array();
  775.         foreach ($holiday as $day) {
  776.             $japanHoliday[] = Carbon::parse($day)->toDateTime()->setTime(000);
  777.         }
  778.         //dump($japanHoliday);
  779.         //判定の為、定休日と祝日をまとめる
  780.         $japanHoliday array_merge($japanHoliday$holidayListOfTwoMonths);
  781.         //爆速商品(在庫ありかなしか)に合わせて予約不可日を設定する為
  782.         //dump($bakusokuflg);
  783.         if ($bakusokuflg === true) {
  784.             log_info('爆速商品ではない');
  785.             $addDaysCounter 0//予約可能日を当日+平日4日分の日にちにするため
  786.             while ($addDaysCounter 4) {
  787.                 dump($addDaysCounter);
  788.                 $noReservationDayEnd->addDays(1);
  789.                 $dateJudge $noReservationDayEnd->toDate(); //祝日判定用
  790.                 //dump($noReservationDayEnd);
  791.                 //dump($dateJudge);
  792.                 //dump($japanHoliday);
  793.                 //土日の場合
  794.                 if ($noReservationDayEnd->dayOfWeek === Carbon::SATURDAY || $noReservationDayEnd->dayOfWeek === Carbon::SUNDAY) {
  795.                     log_debug($noReservationDayEnd 'は土日なのでカウントしない');
  796.                 }
  797.                 //祝日、定休日の場合、指定日が土日で祝日の場合はカウントしない
  798.                 elseif (array_search($dateJudge$japanHoliday) !== false) {
  799.                     log_debug($noReservationDayEnd 'は祝日,定休日なのでカウントしない');
  800.                 } else {
  801.                     log_debug($noReservationDayEnd 'は平日なのでカウントする');
  802.                     $addDaysCounter++;
  803.                 }
  804.             }
  805.         } elseif ($bakusokuflg === false) {
  806.             log_info('爆速商品');
  807.         } else {
  808.             $errormsg __LINE__ ':爆速商品の判断が出来ません';
  809.             log_error($errormsg);
  810.             $this->sendErrorNotifi->errorNotifi($errormsg);
  811.         }
  812.         $dayEnd $noReservationDayEnd->copy()->addDays()->toDateString();
  813.         //予約不可日を作成する
  814.         $period CarbonPeriod::create($noReservationDayStart$noReservationDayEnd);
  815.         log_notice($noReservationDayStart->toString() . 'から' $noReservationDayEnd->toString() . 'までは予約不可にする');
  816.         foreach ($period as $periodDate) {
  817.             $notReservationDay[] = $periodDate->toDate();
  818.         }
  819.         dump($noReservationDayEnd);
  820.         //カレンダー作成
  821.         for ($i 0$i count($targetMonthCalendar); $i++) {
  822.             // カレンダー配列の日が空の場合は処理をスキップ
  823.             if ($targetMonthCalendar[$i]['day'] == '') {
  824.                 $targetMonthCalendar[$i]['holiday'] = false;
  825.                 $targetMonthCalendar[$i]['today'] = false;
  826.                 continue;
  827.             }
  828.             $targetYmdDateTime = new \DateTime($targetDate->copy()->format('Y-n') . '-' $targetMonthCalendar[$i]['day']); //対象日
  829.             //dump($targetYmdDateTime);
  830.             // カレンダーの日付がお休みか確認
  831.             $result array_search($targetYmdDateTime$notReservationDay);
  832.             //dump($targetMonthCalendar[$i]);
  833.             if ($result !== false) {
  834.                 //予約不可設定
  835.                 foreach ($area as $targetarea) {
  836.                     $variable $targetarea['variable'];
  837.                     $targetMonthCalendar[$i]['reservation'][$variable]['AM'] = $reservationNot;
  838.                     $targetMonthCalendar[$i]['reservation'][$variable]['PM'] = $reservationNot;
  839.                 }
  840.             }
  841.             //現在時刻が10時前後で本日の予約状況を変える為
  842.             $targetYmdDateTime $targetYmdDateTime->format("Y-m-d"); //比較のため
  843.             if ($targetYmdDateTime === $today) {
  844.                 //dump('本日判断');
  845.                 if ($targetDate->lessThan($amTenFlg)) {
  846.                     //dump("AM10時前");
  847.                     foreach ($area as $targetarea) {
  848.                         $variable $targetarea['variable'];
  849.                         $targetMonthCalendar[$i]['reservation'][$variable]['AM'] = $reservationNot;
  850.                     }
  851.                 } else {
  852.                     log_debug("AM10時以降");
  853.                     foreach ($area as $targetarea) {
  854.                         $variable $targetarea['variable'];
  855.                         $targetMonthCalendar[$i]['reservation'][$variable]['AM'] = $reservationNot;
  856.                         $targetMonthCalendar[$i]['reservation'][$variable]['PM'] = $reservationNot;
  857.                     }
  858.                 }
  859.             }
  860.             //4日目以降の処理はしなくて良いため
  861.             if ($targetMonthCalendar[$i]['yearMonthDay'] === $dayEnd) {
  862.                 log_debug("setNotReservationToday end");
  863.                 return;
  864.             }
  865.         }
  866.         log_debug("setNotReservationToday end");
  867.         return;
  868.     }
  869.     /**
  870.      * 来月用ECCUBEカレンダーの月初から予約不可日までを予約不可にする
  871.      * 
  872.      * @param array $targetMonthCalendar 来月のカレンダー
  873.      * @param Carbon $targetDate 本日の日付と時刻
  874.      * @param array $notReservationDay 予約不可日
  875.      */
  876.     public function
  877.     setNotReservationNextCalendar($targetMonthCalendar$areaCarbon $targetDate$reservationNot$notReservationDay$noReservationDayEnd)
  878.     {
  879.         log_debug("setNotReservationNextCalendar start");
  880.         //$targetDate = $targetDate->copy()->addMonth();
  881.         $targetDate $targetDate->copy()->startOfMonth()->addMonth(); //うるう年回避のため、月初にしてから1月加算する
  882.         $lastKey array_key_last($notReservationDay);
  883.         $dayEnd $notReservationDay[$lastKey];
  884.         $noReservationDayStart $targetDate->copy()->startOfMonth(); //予約不可日開始日(月初)
  885.         //予約不可日を作成する
  886.         $period CarbonPeriod::create($noReservationDayStart$noReservationDayEnd);
  887.         log_notice($noReservationDayStart->toString() . 'から' $noReservationDayEnd->toString() . 'までは予約不可にする');
  888.         foreach ($period as $periodDate) {
  889.             $notReservationDay[] = $periodDate->toDate();
  890.         }
  891.         //カレンダー作成
  892.         for ($i 0$i count($targetMonthCalendar); $i++) {
  893.             // カレンダー配列の日が空の場合は処理をスキップ
  894.             if ($targetMonthCalendar[$i]['day'] == '') {
  895.                 $targetMonthCalendar[$i]['holiday'] = false;
  896.                 $targetMonthCalendar[$i]['today'] = false;
  897.                 continue;
  898.             }
  899.             $targetYmdDateTime = new \DateTime($targetDate->copy()->format('Y-n') . '-' $targetMonthCalendar[$i]['day']); //対象日
  900.             // カレンダーの日付がお休みか確認
  901.             dump($targetYmdDateTime);
  902.             $result array_search($targetYmdDateTime$notReservationDay);
  903.             //dump($targetMonthCalendar[$i]);
  904.             if ($result !== false) {
  905.                 //予約不可設定
  906.                 foreach ($area as $targetarea) {
  907.                     $variable $targetarea['variable'];
  908.                     $targetMonthCalendar[$i]['reservation'][$variable]['AM'] = $reservationNot;
  909.                     $targetMonthCalendar[$i]['reservation'][$variable]['PM'] = $reservationNot;
  910.                 }
  911.             }
  912.             //4日目以降の処理はしなくて良いため
  913.             if ($targetMonthCalendar[$i]['yearMonthDay'] === $dayEnd) {
  914.                 log_debug("setNotReservationToday end");
  915.                 return $targetMonthCalendar;
  916.             }
  917.         }
  918.         log_debug("setNotReservationNextCalendar end");
  919.         return $targetMonthCalendar;
  920.     }
  921. }