¥{price.toLocaleString()} {message}
\r\n );\r\n }\r\n else\r\n {\r\n return (\r\n¥{price.toLocaleString()} {message}
\r\n );\r\n }\r\n }\r\n\r\n return (\r\n-
\r\n );\r\n }\r\n\r\n\r\n // -------------------------------------------------------------------------------------------------------------- //\r\n // ソート\r\n // -------------------------------------------------------------------------------------------------------------- //\r\n\r\n static sortEventList(event_list)\r\n {\r\n var arranged = new Map();\r\n\r\n // 開始時間でソート\r\n event_list.sort((a, b) => a.start > b.start);\r\n\r\n event_list.forEach(function (event)\r\n {\r\n let key = moment(event.start).format(\"YYYYMMDD\");\r\n\r\n if (!arranged.has(key))\r\n arranged.set(key, {\"date\": event.start, \"list\": []});\r\n\r\n arranged.get(key).list.push(event);\r\n });\r\n\r\n return arranged;\r\n }\r\n\r\n static sortItemPriceInverse(item_prices)\r\n {\r\n item_prices.sort((a, b) => b.priority - a.priority);\r\n return item_prices;\r\n }\r\n\r\n static sortItemPrice(item_prices)\r\n {\r\n item_prices.sort((a, b) => a.priority - b.priority);\r\n return item_prices;\r\n }\r\n\r\n static getCurrentLanguage(i18n)\r\n {\r\n return i18n.language || window.localStorage.i18nextLng || 'ja';\r\n }\r\n\r\n static findSelectedItemById(item_list, item_id)\r\n {\r\n for (let item of item_list)\r\n {\r\n if (item.item_id === item_id)\r\n return item;\r\n }\r\n\r\n return {\r\n item_id: null,\r\n item_name: \"N/A\",\r\n description: \"N/A\",\r\n thumbnails: [],\r\n item_prices: [],\r\n };\r\n }\r\n\r\n static findBillByOrderId(bill_list, order_id)\r\n {\r\n for (let billEntity of bill_list)\r\n {\r\n if (billEntity.order_id === order_id)\r\n return billEntity;\r\n }\r\n return null;\r\n }\r\n\r\n static findSelectedEvent(event_list, id)\r\n {\r\n for (let event of event_list)\r\n {\r\n if (event.item_reservation && event.item_reservation.id === id)\r\n return event;\r\n }\r\n return null;\r\n }\r\n\r\n static findAnotherReservations(this_event, from_event_list)\r\n {\r\n return from_event_list.filter((eventEntity) =>\r\n this_event.another_reservation.filter((anotherReservationEntity) =>\r\n eventEntity.item_reservation && eventEntity.item_reservation.id === anotherReservationEntity.id\r\n ).length > 0 // contains\r\n );\r\n }\r\n\r\n static findCouponById(coupon_id, from_counpon_list)\r\n {\r\n for (let couponEntity of from_counpon_list)\r\n {\r\n if (couponEntity.id === coupon_id)\r\n return couponEntity;\r\n }\r\n return null;\r\n }\r\n\r\n static filterEvent(event_list, item_list,\r\n reservation_status,\r\n reservation_type = 1, /* アイテムカテゴリー 0:オプション 1:アイテム */\r\n item_type = undefined, /* アイテムタイプ 0:未定義 1:貸出資産(重複不可) 2:オプション(重複可能) */\r\n display = undefined, /* アイテム表示非表示 0:非表示 1:表示 */\r\n available = undefined, /* アイテム利用可不可 0:利用不可 1:利用可 */\r\n warning = undefined /* アイテム予約フラグ */)\r\n {\r\n var list = [];\r\n\r\n for (let event of event_list)\r\n {\r\n // 新規登録イベントの場合\r\n if (!event.item_reservation)\r\n continue;\r\n\r\n let itemEntity = Toolkit.findSelectedItemById(item_list, event.item_reservation.item_id);\r\n let add = true;\r\n\r\n if (reservation_status !== undefined && event.item_reservation.reservation_status !== reservation_status)\r\n add = false;\r\n if (reservation_type !== undefined && itemEntity.reservation_type !== reservation_type)\r\n add = false;\r\n if (item_type !== undefined && itemEntity.item_type !== item_type)\r\n add = false;\r\n if (display !== undefined && itemEntity.display !== display)\r\n add = false;\r\n if (available !== undefined && itemEntity.available !== available)\r\n add = false;\r\n if (warning !== undefined && event.item_reservation.warning !== warning)\r\n add = false;\r\n\r\n if (add)\r\n list.push(event);\r\n }\r\n\r\n return list;\r\n }\r\n\r\n static countItemAndOption(selected_event, event_list, item_list)\r\n {\r\n var itemCount = 0;\r\n var optionCount = 0;\r\n\r\n selected_event.another_reservation.map((another_reservation) =>\r\n {\r\n var event = Toolkit.findSelectedEvent(event_list, another_reservation.item_reservation_id);\r\n if (event)\r\n {\r\n var item = Toolkit.findSelectedItemById(item_list, event.item_reservation.item_id);\r\n if (item)\r\n {\r\n switch (item.item_type)\r\n {\r\n case 1: /* 貸し出し資産 */\r\n if (item.reservation_type === 0) /* 予約選択不可 */\r\n optionCount++; // オプション扱い\r\n else\r\n itemCount++;\r\n break;\r\n\r\n case 2: /* オプション */\r\n optionCount++;\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n\r\n return {\r\n item: itemCount,\r\n option: optionCount\r\n }\r\n }\r\n\r\n /**\r\n * チェックリストのカウント\r\n * @param selected_id_list\r\n * @returns {number}\r\n */\r\n static countChecked(selected_id_list = {})\r\n {\r\n let count = 0;\r\n for (let bill_id in selected_id_list)\r\n {\r\n if (selected_id_list[bill_id])\r\n count++;\r\n }\r\n return count;\r\n }\r\n\r\n /**\r\n * 2つのイベントリストのマージ\r\n * @param event_list\r\n * @param add_event_list\r\n * @param remove_temp\r\n * @returns {*}\r\n */\r\n static mergeEvent(event_list, add_event_list, remove_temp = true)\r\n {\r\n let new_event_list = [];\r\n event_list.map((event, index) =>\r\n {\r\n // マージ時に一時イベントを掃除する\r\n if (!remove_temp || !event.id.toString().match(/_new_/))\r\n new_event_list.push(event)\r\n });\r\n\r\n add_event_list.map(add_event =>\r\n {\r\n let same_event_index = -1;\r\n new_event_list.map((event, index) =>\r\n {\r\n if (event.id === add_event.id)\r\n same_event_index = index;\r\n\r\n // 別イベントの共通項目の同期\r\n if (event.order && add_event.order && event.order.id === add_event.order.id)\r\n {\r\n event.another_reservation.map((another_reservation, idx) =>\r\n {\r\n if (another_reservation.id === add_event.item_reservation.id)\r\n event.another_reservation[idx] = add_event.item_reservation;\r\n });\r\n }\r\n\r\n if (event.user_information && add_event.user_information && event.user_information.user_id === add_event.user_information.user_id)\r\n event.user_information = add_event.user_information;\r\n });\r\n\r\n if (same_event_index >= 0)\r\n {\r\n // イベントの上書き更新\r\n new_event_list[same_event_index] = add_event\r\n }\r\n else\r\n {\r\n new_event_list.push(add_event);\r\n }\r\n });\r\n\r\n return new_event_list;\r\n }\r\n\r\n static removeEvent(event_list, remove_event_id)\r\n {\r\n let new_event_list = [];\r\n for (let _event of event_list)\r\n {\r\n if (remove_event_id !== _event.id)\r\n new_event_list.push(_event);\r\n }\r\n return new_event_list;\r\n }\r\n\r\n /**\r\n * DBから取得したanother_reservationは参照が切れている為、必要な時に主予約のイベントの値で上書きする\r\n */\r\n static updateItemReservationsByOtherEvent(target_event, event_list)\r\n {\r\n target_event.another_reservation.map((another_reservation, index) =>\r\n {\r\n event_list.map((event) =>\r\n {\r\n if (event.id === another_reservation.id)\r\n target_event.another_reservation[index] = event.item_reservation\r\n })\r\n });\r\n\r\n return target_event;\r\n }\r\n\r\n // -------------------------------------------------------------------------------------------------------------- //\r\n // 予約管理系\r\n // -------------------------------------------------------------------------------------------------------------- //\r\n\r\n // -------------------------------------------------------------------------------------------------------------- //\r\n // 表示制御・判定\r\n // -------------------------------------------------------------------------------------------------------------- //\r\n\r\n /**\r\n * イベント編集可能かどうか?\r\n * @param item_reservation\r\n * @returns {boolean}\r\n */\r\n static editEnabled(item_reservation)\r\n {\r\n return Toolkit.editEnabledStatus(item_reservation.reservation_status);\r\n }\r\n\r\n static editEnabledStatus(reservation_status)\r\n {\r\n return reservation_status === BackendStatic.RESERVATION_STATUS_NOT_APPROVED ||\r\n reservation_status === BackendStatic.RESERVATION_STATUS_APPROVED ||\r\n reservation_status === BackendStatic.RESERVATION_STATUS_WAIT_PAYMENT;\r\n }\r\n\r\n /**\r\n *\r\n * @param item_reservation\r\n * @returns {boolean}\r\n */\r\n static reserveAvailable(item_reservation)\r\n {\r\n return item_reservation.reservation_status === BackendStatic.RESERVATION_STATUS_DELETED ||\r\n item_reservation.reservation_status === BackendStatic.RESERVATION_STATUS_CANCELED;\r\n\r\n }\r\n\r\n // -------------------------------------------------------------------------------------------------------------- //\r\n // アイテム追加\r\n // -------------------------------------------------------------------------------------------------------------- //\r\n\r\n /**\r\n * 新規イベント\r\n * @param user_information\r\n * @param reserve_from\r\n * @param reserve_to\r\n * @returns {*}\r\n */\r\n static createNewEvent(reserve_from, reserve_to, user_information)\r\n {\r\n let order_id = \"_new_\" + this.generateId();\r\n let bill = {\r\n bill_id: \"_new_\" + this.generateId(),\r\n customer_id: 1,\r\n user_id: user_information ? user_information.user_id : -1,\r\n order_id: order_id,\r\n bill_date: moment().toDate(),\r\n name: \"請求書\",\r\n price: 0,\r\n tax: 0,\r\n payment_type: BackendStatic.PAYMENT_TYPE_UNKNOWN,\r\n payment_date: moment().toDate(),\r\n payment_status: BackendStatic.PAYMENT_STATUS_NOT_YET,\r\n paid_at: null,\r\n\r\n payment: []\r\n };\r\n\r\n let newOrder = {\r\n order_id: order_id,\r\n order_datetime: moment().toDate(),\r\n reservation_status: BackendStatic.RESERVATION_STATUS_APPROVED,\r\n reservation_extra: [],\r\n change_histories: [],\r\n };\r\n\r\n return {\r\n id: \"_new_\" + this.generateId(),\r\n title: \"新規イベント\",\r\n start: reserve_from,\r\n end: reserve_to,\r\n user_information: user_information,\r\n order: newOrder,\r\n item_reservation: null,\r\n bill: bill,\r\n another_reservation: []\r\n };\r\n }\r\n\r\n static createNewUserInformation()\r\n {\r\n return {\r\n \"user_id\": \"_new_\" + this.generateId(),\r\n \"name_sei\": \"\",\r\n \"name_mei\": \"\",\r\n \"furigana_sei\": \"\",\r\n \"furigana_mei\": \"\",\r\n \"birthday\": \"\",\r\n \"postcode\": \"\",\r\n \"prefecture\": \"東京都\",\r\n \"city\": \"\",\r\n \"address1\": \"\",\r\n \"address2\": \"\",\r\n \"mail_address\": \"\",\r\n \"phone_number\": \"\",\r\n \"identification_status\": 0,\r\n \"id_content\": 0,\r\n \"id_content_uploaded_at\": \"\",\r\n \"id_memo\": \"\",\r\n\r\n \"memo\": \"\",\r\n \"coupon\": []\r\n };\r\n }\r\n\r\n static addNewExtra(selected_event, extra, for_event_list)\r\n {\r\n let newReservationExtra = {\r\n id: \"_new_\" + this.generateId(),\r\n order_id: selected_event.order.order_id,\r\n user_id: selected_event.user_information.user_id,\r\n name: extra.name,\r\n price: extra.price,\r\n remark: extra.remark,\r\n coupon_id: extra.coupon_id,\r\n price_extra: extra.price_extra,\r\n price_extra_reason: extra.price_extra_reason,\r\n };\r\n\r\n // 同じ order_id を持つものに追加\r\n for_event_list\r\n .filter((eventEntity) => eventEntity.order && eventEntity.order.order_id === selected_event.order.order_id)\r\n .map((eventEntity) =>\r\n {\r\n eventEntity.order.reservation_extra.push(newReservationExtra);\r\n });\r\n\r\n return for_event_list;\r\n }\r\n\r\n static newPayment(payment)\r\n {\r\n let newPayment = {\r\n id: \"_new_\" + this.generateId(),\r\n bill_id: payment.bill_id,\r\n payment_type: payment.payment_type,\r\n payment_date: payment.payment_date,\r\n payment_status: payment.payment_status,\r\n price: payment.price,\r\n paid_price: payment.paid_price,\r\n paid_at: payment.paid_at,\r\n };\r\n\r\n return newPayment;\r\n }\r\n\r\n /**\r\n * 指定イベントにアイテムを追加する\r\n * @param selected_event 主イベント\r\n * @param reserve_from 予約開始日時\r\n * @param reserve_to 予約開始日時\r\n * @param selected_item 選択アイテム\r\n * @param for_event_list イベントリスト\r\n * @returns {*}\r\n */\r\n static addNewItem(selected_event, reserve_from, reserve_to, selected_item, for_event_list)\r\n {\r\n var item_lent = {\r\n item_lent_id: 1,\r\n amount: 0,\r\n lent_type: 1,\r\n lent_account_id: null,\r\n lent_datetime: null,\r\n lent_done: 0,\r\n lent_remarks: \"\",\r\n send_with_another: 0,\r\n name: \"\",\r\n postcode: \"\",\r\n prefecture: \"\",\r\n city: \"\",\r\n address1: \"\",\r\n address2: \"\",\r\n phone_number: \"\"\r\n };\r\n\r\n var item_return = {\r\n item_return_id: 1,\r\n return_type: 1,\r\n return_account_id: null,\r\n return_datetime: null,\r\n return_done: 0,\r\n return_remarks: \"\",\r\n };\r\n\r\n var newItemReservation = {\r\n \"id\": \"_new_\" + this.generateId(),\r\n 'item_id': selected_item.item_id,\r\n 'order_id': selected_event.order.order_id,\r\n \"reservation_type\": selected_item.reservation_type,\r\n \"reservation_status\": BackendStatic.RESERVATION_STATUS_APPROVED,\r\n \"datetime_from\": reserve_from,\r\n 'datetime_to': reserve_to,\r\n \"amount\": 1,\r\n \"price_summary\": 0,\r\n \"remark\": \"\",\r\n\r\n item_lent: item_lent,\r\n item_return: item_return\r\n };\r\n\r\n // すでにアイテムがイベントに紐づいてる時 → 追加のイベント作成\r\n if (selected_event.item_reservation !== null)\r\n {\r\n // 同じ order_id を持つものに追加\r\n newItemReservation['is_main'] = 0;\r\n for_event_list\r\n .filter((eventEntity) => eventEntity.order && eventEntity.order.order_id === selected_event.order.order_id)\r\n .map((eventEntity) => eventEntity.another_reservation.push(newItemReservation));\r\n\r\n // 追加のイベント\r\n var newEvent = {\r\n 'id': \"_new_\" + this.generateId(),\r\n 'title': selected_item.item_name,\r\n 'start': reserve_from,\r\n 'end': reserve_to,\r\n\r\n 'user_information': selected_event.user_information,\r\n 'order': selected_event.order,\r\n 'item_reservation': newItemReservation,\r\n\r\n 'another_reservation': selected_event.another_reservation.slice() // 配列のコピー\r\n };\r\n\r\n for_event_list.push(newEvent);\r\n }\r\n else\r\n {\r\n // item_reservationの設定\r\n newItemReservation['is_main'] = 1;\r\n for_event_list.map((eventEntity) =>\r\n {\r\n if (eventEntity.id === selected_event.id)\r\n {\r\n eventEntity.title = selected_item.item_name;\r\n eventEntity.start = reserve_from;\r\n eventEntity.end = reserve_to;\r\n eventEntity.item_reservation = newItemReservation;\r\n eventEntity.another_reservation = [\r\n // { id : newItemReservation.id }\r\n ]\r\n }\r\n });\r\n }\r\n\r\n return for_event_list;\r\n }\r\n\r\n /**\r\n * 指定したアイテム予約のステータスを変更する\r\n * @param new_status\r\n * @param item_reservation\r\n * @param for_event_list\r\n */\r\n static changeItemReservationStatus(new_status, item_reservation, for_event_list)\r\n {\r\n for_event_list.filter((eventEntity) => eventEntity.item_reservation.id === item_reservation.id)\r\n .map((eventEntity) =>\r\n {\r\n eventEntity.item_reservation.reservation_status = new_status;\r\n });\r\n\r\n return for_event_list;\r\n }\r\n\r\n /**\r\n * アイテムの利用不可期間設定リストから、利用不可となる日付のDateリストを作成\r\n * @param available_term_list\r\n * @returns {Array}\r\n */\r\n static createDateListFromAvailableTerms(available_term_list)\r\n {\r\n let dateList = [];\r\n\r\n if (available_term_list !== undefined)\r\n {\r\n available_term_list.map((availableTermEntity, index) =>\r\n {\r\n switch (availableTermEntity.apply_type)\r\n {\r\n case BackendStatic.SCHEDULE_FOR_DAY:\r\n break;\r\n\r\n case BackendStatic.SCHEDULE_FOR_DATE:\r\n break;\r\n\r\n case BackendStatic.SCHEDULE_FOR_RANGE:\r\n let addDates = this.createDateList(availableTermEntity.apply_date_from, availableTermEntity.apply_date_to);\r\n addDates.map((addDateEntity) => dateList.push(addDateEntity));\r\n break;\r\n }\r\n });\r\n }\r\n return dateList;\r\n }\r\n\r\n static isMatchDisAvailableDate(date, available_term_list)\r\n {\r\n let available = false;\r\n let disavailable = false;\r\n let holiday = false;\r\n let rangeAndPartial = false;\r\n\r\n if (available_term_list)\r\n available_term_list.map((availableTermEntity, index) =>\r\n {\r\n let isApply = false;\r\n let targetDate = moment(date);\r\n if (availableTermEntity.apply_day)\r\n {\r\n let applyDays = JSON.parse(availableTermEntity.apply_day);\r\n isApply = applyDays.length === 0;\r\n for (let day of applyDays)\r\n {\r\n if (Number(day) === 7)\r\n {\r\n isApply |= HolidayJp.isHoliday(date);\r\n }\r\n else\r\n {\r\n isApply |= targetDate.day() === Number(day);\r\n }\r\n }\r\n }\r\n\r\n if (isApply)\r\n {\r\n switch (availableTermEntity.apply_type)\r\n {\r\n case BackendStatic.SCHEDULE_FOR_DAY:\r\n if (availableTermEntity.available === BackendStatic.SCHEDULE_AVAILABLE)\r\n available = true;\r\n else if (availableTermEntity.available === BackendStatic.SCHEDULE_DISAVAILABLE)\r\n disavailable = true;\r\n else if (availableTermEntity.available === BackendStatic.SCHEDULE_HOLIDAY)\r\n holiday = true;\r\n\r\n break;\r\n\r\n case BackendStatic.SCHEDULE_FOR_DATE:\r\n let settingDate = moment(availableTermEntity.apply_date);\r\n if (availableTermEntity.is_every_years)\r\n settingDate.year(targetDate.year());\r\n\r\n if (targetDate.isSame(settingDate, \"day\"))\r\n {\r\n if (availableTermEntity.available === BackendStatic.SCHEDULE_AVAILABLE)\r\n available = true;\r\n else if (availableTermEntity.available === BackendStatic.SCHEDULE_DISAVAILABLE)\r\n disavailable = true;\r\n else if (availableTermEntity.available === BackendStatic.SCHEDULE_HOLIDAY)\r\n holiday = true;\r\n }\r\n break;\r\n\r\n case BackendStatic.SCHEDULE_FOR_RANGE:\r\n let settingDateFrom = moment(availableTermEntity.apply_date_from);\r\n let settingDateTo = moment(availableTermEntity.apply_date_to).endOf('day');\r\n if (availableTermEntity.is_every_years)\r\n {\r\n settingDateFrom.year(targetDate.year());\r\n settingDateTo.year(targetDate.year());\r\n }\r\n\r\n if (targetDate.isBetween(settingDateFrom, settingDateTo))\r\n {\r\n if (availableTermEntity.available === BackendStatic.SCHEDULE_AVAILABLE)\r\n {\r\n available = true;\r\n }\r\n else if (availableTermEntity.available === BackendStatic.SCHEDULE_DISAVAILABLE)\r\n {\r\n disavailable = true;\r\n // if (this.isTimePartial(settingDateFrom, targetDate) ||\r\n // this.isTimePartial(settingDateTo, targetDate))\r\n // {\r\n // rangeAndPartial = true;\r\n // }\r\n }\r\n else if (availableTermEntity.available === BackendStatic.SCHEDULE_HOLIDAY)\r\n holiday = true;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n\r\n if (available)\r\n return SharekanStatic.CALENDAR_STATUS_CAN_RESERVE;\r\n\r\n if (disavailable)\r\n return SharekanStatic.CALENDAR_STATUS_DISABLE;\r\n else if (holiday)\r\n return SharekanStatic.CALENDAR_STATUS_HOLIDAY;\r\n else if (rangeAndPartial)\r\n return SharekanStatic.CALENDAR_STATUS_PARTIAL\r\n\r\n return SharekanStatic.CALENDAR_STATUS_CAN_RESERVE;\r\n }\r\n\r\n static isTimePartial(moment, momentBase)\r\n {\r\n return moment.isSame(momentBase, \"day\") /* 同一日 */ &&\r\n moment.hour() !== 0 &&\r\n moment.minute() !== 0; /* 0:00 設定 */\r\n }\r\n\r\n static getDateStartMoment(moment)\r\n {\r\n moment.hour(0);\r\n moment.minute(0);\r\n moment.second(0);\r\n return moment;\r\n }\r\n\r\n static getDateEndMoment(moment)\r\n {\r\n moment.hour(23);\r\n moment.minute(59);\r\n moment.second(59);\r\n return moment;\r\n }\r\n\r\n\r\n static createDateList(datetime_start, datetime_end)\r\n {\r\n let dateList = [];\r\n let startMoment = this.getDateStartMoment(moment(datetime_start));\r\n let endMoment = this.getDateEndMoment(moment(datetime_end).subtract(1, 's')); //0時までの予約を前日〆で計算するため1秒引く\r\n\r\n while (startMoment.isBefore(endMoment))\r\n {\r\n dateList.push(startMoment.toDate());\r\n\r\n startMoment.add(1, 'days');\r\n }\r\n\r\n return dateList;\r\n }\r\n\r\n static howManyHours(datetime_start, datetime_end)\r\n {\r\n if (datetime_start === null || datetime_end === null)\r\n return 0;\r\n\r\n let start = moment(datetime_start);\r\n let end = moment(datetime_end);\r\n\r\n return end.diff(start, \"hours\", true).toFixed(1);\r\n }\r\n\r\n static howManyDays(datetime_start, datetime_end)\r\n {\r\n if (datetime_start === null || datetime_end === null)\r\n return 0;\r\n\r\n let start = moment(datetime_start);\r\n let end = moment(datetime_end);\r\n\r\n return end.diff(start, \"days\", true).toFixed(1);\r\n }\r\n\r\n static isDisabledDate(date, available_term_list)\r\n {\r\n let disabledDates = Toolkit.createDateListFromAvailableTerms(available_term_list);\r\n return disabledDates.filter((disabledDate) => moment(disabledDate).isSame(moment(date), \"day\")).length > 0;\r\n }\r\n\r\n // -------------------------------------------------------------------------------------------------------------- //\r\n // チャート\r\n // -------------------------------------------------------------------------------------------------------------- //\r\n static createDateLabel(datetime_start, datetime_end)\r\n {\r\n let labelList = [];\r\n\r\n let dateList = this.createDateList(datetime_start, datetime_end);\r\n dateList.map((date) =>\r\n {\r\n labelList.push(\r\n moment(date).format(i18n.t(\"date_format\"))\r\n );\r\n });\r\n return labelList;\r\n }\r\n\r\n\r\n // -------------------------------------------------------------------------------------------------------------- //\r\n // 抽出系\r\n // -------------------------------------------------------------------------------------------------------------- //\r\n\r\n /**\r\n * 指定アイテムIDの予約イベントをすべて抽出\r\n * @param event_list\r\n * @param item_entity\r\n * @returns {*}\r\n */\r\n static findEventsHasItem(event_list, item_entity)\r\n {\r\n return event_list.filter((eventEntity) => eventEntity.item_reservation !== null && eventEntity.item_reservation.item_id === item_entity.item_id);\r\n }\r\n\r\n // -------------------------------------------------------------------------------------------------------------- //\r\n // イベント開始・終了時間取得(item_reservation未登録の場合は event.start/event.end から取得\r\n // -------------------------------------------------------------------------------------------------------------- //\r\n\r\n static getEventDatetimeFrom(eventEntity)\r\n {\r\n if (eventEntity.item_reservation === null)\r\n return eventEntity.start;\r\n return eventEntity.item_reservation.datetime_from;\r\n }\r\n\r\n static getEventDatetimeTo(eventEntity)\r\n {\r\n if (eventEntity.item_reservation === null)\r\n return eventEntity.end;\r\n return eventEntity.item_reservation.datetime_to;\r\n }\r\n\r\n\r\n /**\r\n * 渡したイベントリストから、指定アイテムの予約をさがし、指定イベントと被っているものがあればすべて抽出\r\n * @param item_entity\r\n * @param this_event\r\n * @param from_event_list\r\n * @returns {*}\r\n */\r\n static isBooked(item_entity, this_event,\r\n show_items_from, show_items_to,\r\n from_event_list)\r\n {\r\n\r\n return this.findEventsHasItem(from_event_list, item_entity)\r\n .filter((eventEntity) =>\r\n eventEntity.id !== this_event.id &&\r\n eventEntity.item_reservation &&\r\n eventEntity.item_reservation.reservation_status < BackendStatic.RESERVATION_STATUS_DONE &&\r\n (\r\n moment(this.getEventDatetimeFrom(eventEntity)).isBetween(show_items_from, show_items_to) ||\r\n moment(this.getEventDatetimeTo(eventEntity)).subtract(1, 'second').isBetween(show_items_from, show_items_to) ||\r\n (\r\n moment(this.getEventDatetimeFrom(eventEntity)).isBefore(show_items_from) &&\r\n moment(this.getEventDatetimeTo(eventEntity)).subtract(1, 'second').isAfter(show_items_to)\r\n )\r\n )\r\n );\r\n }\r\n\r\n /**\r\n * target_eventによって予約済であったイベントが、どう予約済であったのか?\r\n * @param range_from\r\n * @param range_to\r\n * @param target_event\r\n * @returns {number}\r\n */\r\n static bookedType(range_from, range_to,\r\n target_event)\r\n {\r\n if (moment(target_event.item_reservation.datetime_from).isBetween(range_from, range_to) &&\r\n moment(target_event.item_reservation.datetime_to).isBetween(range_from, range_to))\r\n return BOOKED_TYPE_INCLUDED; // 前後のぞいて予約済 「datetime_fromまでか、datetime_to以降に利用可能です。」\r\n else if (moment(target_event.item_reservation.datetime_from).isBetween(range_from, range_to))\r\n return BOOKED_TYPE_AFTER_START; // datetime_from から利用されている「datetime_fromまで利用可能です。」\r\n else if (moment(target_event.item_reservation.datetime_to).isBetween(range_from, range_to))\r\n return BOOKED_TYPE_BEFORE_END; // datetime_to まで利用されている 「datetime_to以降に利用可能です。」\r\n else if (moment(target_event.item_reservation.datetime_from).isBefore(range_from) &&\r\n moment(target_event.item_reservation.datetime_to).isAfter(range_to))\r\n return BOOKED_TYPE_ALL; // 利用期間すべて予約済\r\n\r\n return 0;\r\n }\r\n\r\n static isIn(a_from, a_to, b_from, b_to)\r\n {\r\n if (moment(b_from).isBetween(a_from, a_to) &&\r\n moment(b_to).isBetween(a_from, a_to))\r\n return BOOKED_TYPE_INCLUDED; // 前後のぞいて予約済 「datetime_fromまでか、datetime_to以降に利用可能です。」\r\n else if (moment(b_from).isBetween(a_from, a_to))\r\n return BOOKED_TYPE_AFTER_START; // datetime_from から利用されている「datetime_fromまで利用可能です。」\r\n else if (moment(b_to).isBetween(a_from, a_to))\r\n return BOOKED_TYPE_BEFORE_END; // datetime_to まで利用されている 「datetime_to以降に利用可能です。」\r\n else if (moment(b_from).isBefore(a_from) &&\r\n moment(b_to).isAfter(a_to))\r\n return BOOKED_TYPE_ALL; // 利用期間すべて予約済\r\n\r\n return 0;\r\n }\r\n\r\n /**\r\n * 利用不可の理由チェック\r\n * @param item_entity\r\n * @param this_event\r\n * @param show_items_from\r\n * @param show_items_to\r\n * @param from_event_list\r\n * @returns {{message: string, status: number}|{booked_events: *, message: string, status: number}}\r\n */\r\n static unavailableBecause(item_entity, this_event,\r\n show_items_from, show_items_to,\r\n from_event_list)\r\n {\r\n\r\n // ---------------------------------------------------------------------------------------------------------- //\r\n // 利用設定不可\r\n // ---------------------------------------------------------------------------------------------------------- //\r\n if (item_entity.available === 0)\r\n return {status: 1, message: \"利用不可設定のアイテムです。\"};\r\n\r\n // ---------------------------------------------------------------------------------------------------------- //\r\n // 期間内に他のイベントで予約中\r\n // ---------------------------------------------------------------------------------------------------------- //\r\n let booked_events = this.isBooked(item_entity, this_event, show_items_from, show_items_to, from_event_list);\r\n if (booked_events.length > 0)\r\n return {status: 4, booked_events: booked_events, message: \"指定期間内に予約済みのアイテムです。\"};\r\n\r\n // ---------------------------------------------------------------------------------------------------------- //\r\n // このイベントで予約中\r\n // ---------------------------------------------------------------------------------------------------------- //\r\n if (this_event.item_reservation !== null &&\r\n this_event.item_reservation.item_id === item_entity.item_id && this_event.item_reservation.reservation_status)\r\n return {status: 2, message: \"予約中です。\"};\r\n\r\n // ---------------------------------------------------------------------------------------------------------- //\r\n // another events で予約中\r\n // ---------------------------------------------------------------------------------------------------------- //\r\n let another_events = this.findAnotherReservations(this_event, from_event_list);\r\n let booked_another_events = this.findEventsHasItem(another_events, item_entity);\r\n if (booked_another_events.length > 0)\r\n return {status: 3, booked_events: booked_another_events, message: \"予約中です。\"};\r\n\r\n return {status: 0, message: \"利用可能です。\"};\r\n }\r\n\r\n // -------------------------------------------------------------------------------------------------------------- //\r\n // 価格テーブル表示\r\n // -------------------------------------------------------------------------------------------------------------- //\r\n\r\n static itemColor(itemEntity)\r\n {\r\n if (!itemEntity.color)\r\n {\r\n return null\r\n }\r\n\r\n return colors[itemEntity.color];\r\n }\r\n\r\n static colors()\r\n {\r\n let colorList = [];\r\n for (let colorName in colors)\r\n colorList.push(colors[colorName]);\r\n\r\n return colorList;\r\n }\r\n\r\n static priorityColor(priority)\r\n {\r\n let index = priority;\r\n if (index > priority_table.length - 1)\r\n index = priority_table.length - 1;\r\n\r\n return {\r\n color: priority_table[index]\r\n }\r\n }\r\n\r\n static priorityColorTable()\r\n {\r\n return priority_table;\r\n }\r\n\r\n static priorities()\r\n {\r\n let priorities = [];\r\n priority_table.map((entity, index) => priorities.push(index));\r\n return priorities;\r\n }\r\n\r\n /**\r\n * 指定日の適用価格を取得\r\n * @param date\r\n * @param item_prices\r\n * @returns {*}\r\n */\r\n static findAppliedPrice(date, item_prices)\r\n {\r\n var appliedPrice = null;\r\n\r\n let priorityPrices = this.sortItemPriceInverse(item_prices); // 優先度低い方からチェック\r\n priorityPrices.map((itemPriceEntity) =>\r\n {\r\n // 適用開始日指定\r\n let isApply = !itemPriceEntity.enable_from ||\r\n (itemPriceEntity.enable_from && moment(date).isSameOrAfter(itemPriceEntity.enable_from, \"day\"));\r\n\r\n let targetDate = moment(date);\r\n if (itemPriceEntity.apply_day)\r\n {\r\n let applyDays = JSON.parse(itemPriceEntity.apply_day);\r\n let _isApply = applyDays.length === 0;\r\n for (let day of applyDays)\r\n {\r\n if (Number(day) === 7)\r\n {\r\n _isApply |= HolidayJp.isHoliday(date);\r\n }\r\n else\r\n {\r\n _isApply |= targetDate.day() === Number(day);\r\n }\r\n }\r\n isApply &= _isApply;\r\n }\r\n\r\n if (isApply)\r\n {\r\n switch (itemPriceEntity.apply_type)\r\n {\r\n case BackendStatic.PRICE_APPLY_TYPE_FOR_ALL: // 基本料金\r\n case BackendStatic.PRICE_APPLY_TYPE_FOR_DAY: // 曜日\r\n appliedPrice = itemPriceEntity;\r\n break;\r\n\r\n case BackendStatic.PRICE_APPLY_TYPE_FOR_DATE: // 特定日\r\n let settingDate = moment(itemPriceEntity.apply_date);\r\n if (itemPriceEntity.is_every_years)\r\n settingDate.year(targetDate.year());\r\n if (targetDate.isSame(settingDate, 'day'))\r\n appliedPrice = itemPriceEntity;\r\n break;\r\n\r\n case BackendStatic.PRICE_APPLY_TYPE_FOR_RANGE: // 日付範囲\r\n let settingDateFrom = moment(itemPriceEntity.apply_date_from);\r\n let settingDateTo = moment(itemPriceEntity.apply_date_to).endOf('day');\r\n if (itemPriceEntity.is_every_years)\r\n {\r\n settingDateFrom.year(targetDate.year());\r\n settingDateTo.year(targetDate.year());\r\n }\r\n\r\n if (targetDate.isBetween(settingDateFrom, settingDateTo, null, '[]'))\r\n appliedPrice = itemPriceEntity;\r\n break;\r\n }\r\n }\r\n });\r\n\r\n return appliedPrice;\r\n }\r\n\r\n /**\r\n * 指定予約期間を日付で区切る\r\n * @param start_datetime\r\n * @param end_datetime\r\n * @returns {[]}\r\n */\r\n static splitDays(start_datetime, end_datetime)\r\n {\r\n let split_list = [];\r\n\r\n let start = moment(start_datetime);\r\n let end = moment(end_datetime);\r\n\r\n if (start.day() !== end.day()) // 開始と終了が異なる日の場合\r\n {\r\n while (start.day() !== end.day())\r\n {\r\n split_list.push({start: start.toDate(), end: start.endOf(\"day\").toDate()});\r\n\r\n start = start.add(1, \"day\").startOf(\"day\");\r\n }\r\n\r\n split_list.push({start: start.toDate(), end: end.toDate()});\r\n }\r\n else\r\n {\r\n split_list.push({start: start.toDate(), end: end.toDate()});\r\n }\r\n\r\n console.log(\"split_list-----------------\");\r\n console.log(split_list);\r\n\r\n return split_list;\r\n }\r\n\r\n static latest_location_path = \"\";\r\n static force_location_path = \"\";\r\n\r\n static equalLatestPath(path)\r\n {\r\n return this.latest_location_path === path;\r\n }\r\n\r\n static replaceHistory(path)\r\n {\r\n this.latest_location_path = path;\r\n history.replaceState(null, null, path);\r\n }\r\n\r\n static pushHistory(path)\r\n {\r\n if (!path)\r\n path = BackendStatic.BACKEND_VIEW_HOME;\r\n if (this.latest_location_path === path)\r\n return \"\";\r\n if (this.force_location_path)\r\n path = this.force_location_path;\r\n if (path.match(/sign_out/))\r\n location.href = path;\r\n this.latest_location_path = path;\r\n history.pushState(null, null, path);\r\n this.force_location_path = \"\";\r\n this.viewPathGoogleAnalytics(path);\r\n return path;\r\n }\r\n\r\n static returnPage(state)\r\n {\r\n let return_page = Toolkit.pushHistory(state.return_page);\r\n switch (return_page)\r\n {\r\n case BackendStatic.BACKEND_VIEW_MESSAGE:\r\n return {\r\n show_view: BackendStatic.BACKEND_VIEW_MESSAGE,\r\n open_left_list: true,\r\n };\r\n case BackendStatic.BACKEND_VIEW_EDIT_USER:\r\n if (state.selected_event && state.selected_user)\r\n {\r\n return {\r\n show_view: BackendStatic.BACKEND_VIEW_EDIT_USER,\r\n selected_user: state.selected_user,\r\n return_page: BackendStatic.BACKEND_VIEW_USERS,\r\n };\r\n }\r\n break;\r\n case BackendStatic.BACKEND_VIEW_EDIT_EVENT:\r\n if (state.selected_event && state.selected_user)\r\n {\r\n return {\r\n show_view: BackendStatic.BACKEND_VIEW_EDIT_EVENT,\r\n selected_event: state.selected_event,\r\n selected_user: state.selected_user,\r\n return_page: BackendStatic.BACKEND_VIEW_RESERVATIONS,\r\n };\r\n }\r\n break;\r\n case BackendStatic.BACKEND_VIEW_ROOT:\r\n case BackendStatic.BACKEND_VIEW_HOME:\r\n case null:\r\n case \"\":\r\n return {\r\n show_view: null,\r\n open_left_list: true,\r\n };\r\n default:\r\n return {\r\n show_view: return_page,\r\n };\r\n }\r\n state.return_page = return_page;\r\n return Toolkit.returnPage(state);\r\n }\r\n\r\n static urlQuery()\r\n {\r\n var vars = {};\r\n var param = location.search.substring(1).split('&');\r\n for (var i = 0; i < param.length; i++)\r\n {\r\n var keySearch = param[i].search(/=/);\r\n var key = '';\r\n if (keySearch != -1) key = param[i].slice(0, keySearch);\r\n var val = param[i].slice(param[i].indexOf('=', 0) + 1);\r\n if (key != '') vars[key] = decodeURI(val);\r\n }\r\n return vars;\r\n }\r\n\r\n /**\r\n * カスタマ設定関係\r\n */\r\n static saveConfig(type, value, text, onSuccess = null, onError = null)\r\n {\r\n Toolkit.request(this,\r\n '/backend/api/edit_customer_config',\r\n {\r\n config_type: type,\r\n config_value: value,\r\n config_text: text,\r\n },\r\n (_configs) =>\r\n {\r\n // success\r\n console.log(_configs);\r\n if (onSuccess)\r\n onSuccess(_configs);\r\n },\r\n (error) =>\r\n {\r\n console.log(error);\r\n if (onError)\r\n onError(error);\r\n }\r\n )\r\n\r\n }\r\n\r\n static checkAccountPrivilege(account, type, value)\r\n {\r\n for (let _privilege of account.privileges)\r\n {\r\n if (_privilege.privilege_type === type)\r\n return _privilege.privilege >= value;\r\n }\r\n return false\r\n }\r\n\r\n\r\n /**\r\n * @deprecated\r\n * setStateForComponent の state に指定した設定値を取得してセットする\r\n */\r\n static loadConfig(component, configTypeList = [], onSuccess = null, onError = null)\r\n {\r\n if (!component.state.loaded_customer_configs)\r\n {\r\n component.setState({loaded_customer_configs: true});\r\n Toolkit.fetch(\r\n component,\r\n BackendStatic.API_GET_CUSTOMER_CONFIG_LIST,\r\n {\r\n config_type: configTypeList\r\n },\r\n (res) =>\r\n {\r\n // array -> map\r\n let customer_config = component.state.customer_config ? component.state.customer_config : {};\r\n res.customer_config.map((customerConfigEntity) =>\r\n {\r\n customer_config[customerConfigEntity.config_type] = customerConfigEntity;\r\n });\r\n\r\n component.setState({\r\n customer_config: customer_config\r\n });\r\n\r\n if (onSuccess)\r\n onSuccess(res);\r\n },\r\n (error) =>\r\n {\r\n if (onError)\r\n onError(error);\r\n }\r\n );\r\n }\r\n }\r\n\r\n static getConfigText(component, config_type)\r\n {\r\n let configEntity = Toolkit.getConfig(component, config_type);\r\n\r\n if (configEntity !== null)\r\n return configEntity.config_text;\r\n\r\n return '';\r\n }\r\n\r\n static getConfigValue(component, config_type)\r\n {\r\n let configEntity = Toolkit.getConfig(component, config_type);\r\n\r\n if (configEntity !== null)\r\n return configEntity.config_value;\r\n\r\n return '';\r\n }\r\n\r\n static isConfigAvailable(component, config_type)\r\n {\r\n let configEntity = Toolkit.getConfig(component, config_type);\r\n\r\n if (configEntity !== null)\r\n return configEntity.config_value === BackendStatic.CUSTOMER_CONFIG_VALUE_AVAILABLE;\r\n\r\n return false;\r\n }\r\n\r\n static getConfig(component, config_type)\r\n {\r\n if (component && component.state && component.state.customer_config && component.state.customer_config[config_type])\r\n return component.state.customer_config[config_type];\r\n else\r\n {\r\n if (component.props.customer_information && component.props.customer_information.config)\r\n {\r\n for (let _config of component.props.customer_information.config)\r\n if (_config.config_type === config_type)\r\n return _config;\r\n }\r\n\r\n if (!component.state.customer_config || !component.state.customer_config[config_type])\r\n {\r\n if (component.isMounted)\r\n this.loadConfig(component, [config_type]);\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n static createNewItem(successCallback)\r\n {\r\n Toolkit.fetch(this,\r\n BackendStatic.API_EDIT_ITEM,\r\n {\r\n item: {\r\n display_item_id: null,\r\n reservation_type: 1,\r\n item_type: 1,\r\n item_name: \"新しいアイテム\",\r\n description: null,\r\n available_num: 1,\r\n display: 0,\r\n available: 0,\r\n color: \"#f44336\",\r\n parent_item_id: null\r\n }\r\n },\r\n res =>\r\n {\r\n successCallback(res.item);\r\n }\r\n );\r\n }\r\n\r\n // -------------------------------------------------------------------------------------------------------------- //\r\n // API\r\n // -------------------------------------------------------------------------------------------------------------- //\r\n static fetch(component, api, param, successCallback = null, errorCallback = null)\r\n {\r\n console.log(\"------------------------------------------------------------------------------------------------\");\r\n console.log(\"[API] start fetch ... \" + api);\r\n console.log(param);\r\n console.log(\"------------------------------------------------------------------------------------------------\");\r\n let is_backend = false;\r\n let path_split = location.pathname.split('/');\r\n if (path_split.length > 1)\r\n is_backend = path_split[1] === 'backend';\r\n\r\n switch (api)\r\n {\r\n case BackendStatic.API_GET_ORDER_INQUIRY:\r\n {\r\n let url = is_backend ? '/backend/api/get_inquiries' : '/frontend/api/get_inquiries';\r\n this.request(\r\n component,\r\n url,\r\n param,\r\n _res =>\r\n {\r\n successCallback({\r\n order_inquiry_list: _res.inquiries,\r\n });\r\n },\r\n errorCallback\r\n );\r\n }\r\n break;\r\n\r\n case BackendStatic.API_GET_CUSTOMER_CONFIG_LIST:\r\n {\r\n let url = is_backend ? '/backend/api/get_customer_configs' : '/frontend/api/get_customer_configs';\r\n this.request(\r\n component,\r\n url,\r\n param,\r\n _res =>\r\n {\r\n successCallback({\r\n customer_config: _res.customer_configs,\r\n });\r\n },\r\n errorCallback\r\n );\r\n }\r\n break;\r\n case BackendStatic.API_GET_ITEM_LIST:\r\n {\r\n let url = is_backend ? '/backend/api/get_items' : '/frontend/api/get_items';\r\n this.request(\r\n component,\r\n url,\r\n param,\r\n _res =>\r\n {\r\n successCallback({\r\n item_list: _res.items,\r\n total_list_size: _res.total\r\n });\r\n },\r\n errorCallback\r\n );\r\n }\r\n break;\r\n case BackendStatic.API_GET_ACCOUNT_LIST:\r\n this.request(\r\n component,\r\n '/backend/api/get_accounts',\r\n param,\r\n _res =>\r\n {\r\n successCallback({\r\n account_list: _res.accounts,\r\n });\r\n },\r\n errorCallback\r\n );\r\n break;\r\n\r\n case BackendStatic.API_GET_CALENDAR_STATUS:\r\n this.request(\r\n component,\r\n '/api/get_calendar_status',\r\n param,\r\n _res =>\r\n {\r\n successCallback({\r\n reservation_status_result: _res.status,\r\n suspension_events: _res.suspension_events,\r\n });\r\n },\r\n errorCallback\r\n );\r\n break;\r\n\r\n case BackendStatic.API_GET_KPI:\r\n this.request(\r\n component,\r\n '/backend/api/get_kpi',\r\n param,\r\n _res =>\r\n {\r\n successCallback({\r\n data_list: _res,\r\n });\r\n },\r\n errorCallback\r\n );\r\n break;\r\n\r\n case BackendStatic.API_GET_NOTIFICATION_LIST:\r\n this.request(\r\n component,\r\n '/backend/api/get_notifications',\r\n param,\r\n _res =>\r\n {\r\n successCallback({\r\n notification_list: _res.notifications,\r\n total_list_size: _res.total, //ないこともある\r\n });\r\n },\r\n errorCallback\r\n );\r\n break;\r\n\r\n case BackendStatic.API_GET_MESSAGE_CHANNEL_LIST:\r\n this.request(\r\n component,\r\n '/backend/api/get_message_channels',\r\n param,\r\n _res =>\r\n {\r\n successCallback({\r\n message_channel_list: _res.message_channels,\r\n });\r\n },\r\n errorCallback\r\n );\r\n break;\r\n\r\n case BackendStatic.API_SEND_MESSAGE:\r\n let send = () =>\r\n {\r\n let url = '/backend/api/send_message';\r\n if (param['sender_type'] === BackendStatic.MAIL_FROM_USER)\r\n url = '/frontend/api/send_message';\r\n\r\n this.request(\r\n component,\r\n url,\r\n {\r\n user_id: param['user_id'],\r\n },\r\n _res =>\r\n {\r\n let message_channel = _res.message_channel;\r\n API.graphql(graphqlOperation(createMessage, {\r\n input: {\r\n customer_id: message_channel['customer_id'],\r\n channel: message_channel['channel_key'],\r\n sender_type: param['sender_type'],\r\n sender_id: _res.sender_id,\r\n body: param['body'],\r\n message_type: param['message_type'],\r\n image_base64: param['image_base64'],\r\n send_at: moment(new Date(), 'YYYY-MM-DD hh:mm:ss'),\r\n }\r\n }));\r\n if (successCallback)\r\n successCallback(_res);\r\n },\r\n errorCallback\r\n );\r\n\r\n };\r\n\r\n if (param['image'])\r\n {\r\n // 画像は圧縮する\r\n const THUMBNAIL_WIDTH = 330; // 画像リサイズ後の横の長さの最大値\r\n const THUMBNAIL_HEIGHT = 330; // 画像リサイズ後の縦の長さの最大値\r\n\r\n let image = new Image();\r\n image.onload = function ()\r\n {\r\n let width, height;\r\n if (image.width > image.height)\r\n {\r\n let ratio = image.height / image.width;\r\n width = THUMBNAIL_WIDTH;\r\n height = THUMBNAIL_WIDTH * ratio;\r\n }\r\n else\r\n {\r\n let ratio = image.width / image.height;\r\n width = THUMBNAIL_HEIGHT * ratio;\r\n height = THUMBNAIL_HEIGHT;\r\n }\r\n let canvas = document.createElement(\"canvas\")\r\n canvas.setAttribute('width', width)\r\n canvas.setAttribute('height', height);\r\n let ctx = canvas.getContext('2d');\r\n ctx.clearRect(0, 0, width, height);\r\n ctx.drawImage(image, 0, 0, image.width, image.height, 0, 0, width, height);\r\n param['image_base64'] = canvas.toDataURL('image/jpeg');\r\n\r\n send();\r\n };\r\n image.src = param['image'];\r\n }\r\n else\r\n {\r\n send();\r\n }\r\n break;\r\n\r\n case BackendStatic.API_GET_MESSAGE:\r\n let _messageList = [];\r\n API.graphql(graphqlOperation(messagesByChannelSortedByCreatedAt,\r\n {\r\n channel: param['channel'],\r\n sortDirection: \"DESC\",\r\n limit: 20,\r\n nextToken: param['nextToken']\r\n }\r\n )).then(res =>\r\n {\r\n console.log(\"[API_GET_MESSAGE] DONE!\");\r\n console.log(res.data);\r\n\r\n res.data.messagesByChannelSortedByCreatedAt.items.forEach((message) =>\r\n {\r\n _messageList.push({\r\n id: message.id,\r\n user_id: message.sender_id,\r\n reply: message.sender_type,\r\n message_type: message.message_type,\r\n flag: false,\r\n read: false,\r\n content: message.body,\r\n media: message.image_base64,\r\n created_at: message.createdAt,\r\n updated_at: \"\"\r\n })\r\n });\r\n successCallback({\r\n message_list: _messageList,\r\n nextToken: res.data.messagesByChannelSortedByCreatedAt.nextToken,\r\n });\r\n }).catch(e =>\r\n {\r\n console.error(e);\r\n errorCallback(e);\r\n });\r\n break;\r\n\r\n case BackendStatic.API_GET_USER_LIST:\r\n this.request(\r\n component,\r\n '/backend/api/get_users',\r\n param,\r\n _res =>\r\n {\r\n successCallback({\r\n user_list: _res.users,\r\n total_list_size: _res.total\r\n });\r\n },\r\n errorCallback\r\n );\r\n break;\r\n\r\n case BackendStatic.API_GET_EVENT_LIST:\r\n this.request(\r\n component,\r\n '/backend/api/get_events',\r\n param,\r\n _res =>\r\n {\r\n successCallback({\r\n event_list: _res.events,\r\n total_list_size: _res.total,\r\n count: _res.count,\r\n account: _res.account,\r\n customer_information: _res.customer_information,\r\n paypal_client_id: _res.paypal_client_id,\r\n });\r\n },\r\n errorCallback\r\n );\r\n break;\r\n\r\n case BackendStatic.API_GET_CUSTOMIZE_EVENT_LIST:\r\n this.request(\r\n component,\r\n '/backend/api/get_customized_events',\r\n param,\r\n _res =>\r\n {\r\n successCallback({\r\n customized_event_list: _res.customized_events,\r\n });\r\n },\r\n errorCallback\r\n );\r\n break;\r\n\r\n case BackendStatic.API_UPDATE_RESERVATION_STATUS:\r\n this.request(\r\n component,\r\n '/backend/api/update_reservation_status',\r\n param,\r\n successCallback,\r\n errorCallback\r\n );\r\n break;\r\n\r\n case BackendStatic.API_GET_CHANGE_HISTORY:\r\n this.request(\r\n component,\r\n '/backend/api/get_change_histories',\r\n param,\r\n _change_history_list =>\r\n {\r\n successCallback({\r\n change_history_list: _change_history_list,\r\n });\r\n },\r\n errorCallback\r\n );\r\n break;\r\n\r\n case BackendStatic.API_GET_PAYMENT_LIST:\r\n this.request(\r\n component,\r\n '/backend/api/get_payments',\r\n param,\r\n _res =>\r\n {\r\n successCallback({\r\n payment_list: _res.payments,\r\n total_list_size: _res.total\r\n });\r\n },\r\n errorCallback\r\n );\r\n break;\r\n\r\n case BackendStatic.API_GET_BILL_LIST:\r\n this.request(\r\n component,\r\n '/backend/api/get_bills',\r\n param,\r\n _res =>\r\n {\r\n successCallback({\r\n bill_list: _res.bills,\r\n total_list_size: _res.total\r\n });\r\n },\r\n errorCallback\r\n );\r\n break;\r\n\r\n case BackendStatic.API_UPDATE_PAYMENT_STATUS:\r\n this.request(\r\n component,\r\n '/backend/api/update_payment_status',\r\n param,\r\n successCallback,\r\n errorCallback\r\n );\r\n break;\r\n\r\n case BackendStatic.API_GET_COUPON_LIST:\r\n this.request(\r\n component,\r\n '/backend/api/get_coupons',\r\n param,\r\n _res =>\r\n {\r\n successCallback({\r\n coupon_list: _res.coupons,\r\n total_list_size: _res.total\r\n });\r\n },\r\n errorCallback\r\n );\r\n break;\r\n\r\n case BackendStatic.API_EDIT_EVENT:\r\n // オブジェクトを削除\r\n if (param.event.eventTitle)\r\n param.event.eventTitle = undefined;\r\n\r\n console.log(\"event : \" + JSON.stringify(param));\r\n\r\n this.request(\r\n component,\r\n '/backend/api/edit_event',\r\n param,\r\n _res =>\r\n {\r\n if (_res.events.length > 0)\r\n {\r\n let variables = {\r\n input: {\r\n id: _res.events[0].order.id,\r\n order_id: _res.events[0].order.id,\r\n customer_id: _res.events[0].order.customer_id,\r\n edit_account_id: _res.account.id,\r\n }\r\n };\r\n\r\n if (param.event.id.toString().match(/_new_/))\r\n API.graphql(graphqlOperation(createReservation, variables));\r\n else\r\n API.graphql(graphqlOperation(updateReservation, variables));\r\n }\r\n\r\n successCallback(_res)\r\n },\r\n errorCallback\r\n );\r\n break;\r\n\r\n case BackendStatic.API_EDIT_ITEM:\r\n this.request(\r\n component,\r\n '/backend/api/edit_item',\r\n param,\r\n successCallback,\r\n errorCallback\r\n );\r\n break;\r\n\r\n case BackendStatic.API_EDIT_USER_INFORMATION:\r\n this.request(\r\n component,\r\n '/backend/api/edit_user_information',\r\n param,\r\n successCallback,\r\n errorCallback\r\n );\r\n break;\r\n\r\n case BackendStatic.API_EDIT_COUPON:\r\n this.request(\r\n component,\r\n '/backend/api/edit_coupon',\r\n param,\r\n successCallback,\r\n errorCallback\r\n );\r\n break;\r\n\r\n case BackendStatic.API_GRANT_USER_COUPON:\r\n this.request(\r\n component,\r\n '/backend/api/grant_user_coupon',\r\n param,\r\n successCallback,\r\n errorCallback\r\n );\r\n break;\r\n\r\n case BackendStatic.API_DROP_USER_COUPON:\r\n this.request(\r\n component,\r\n '/backend/api/drop_user_coupon',\r\n param,\r\n successCallback,\r\n errorCallback\r\n );\r\n break;\r\n\r\n case FrontendStatic.API_GET_USER_EVENT_LIST:\r\n this.request(\r\n component,\r\n '/frontend/api/get_events',\r\n param,\r\n _res =>\r\n {\r\n successCallback({\r\n event_list: _res.events,\r\n total_list_size: _res.total,\r\n count: _res.count,\r\n account: _res.account,\r\n customer_information: _res.customer_information,\r\n });\r\n },\r\n errorCallback\r\n );\r\n break;\r\n\r\n case FrontendStatic.API_GET_MY_INFORMATION:\r\n this.request(\r\n component,\r\n '/frontend/api/get_my_information',\r\n param,\r\n _res =>\r\n {\r\n successCallback({\r\n customer_information: _res.customer_information,\r\n user_information: _res.user_information,\r\n message_channel: _res.message_channel,\r\n paypal_client_id: _res.paypal_client_id,\r\n });\r\n },\r\n errorCallback\r\n );\r\n break;\r\n\r\n case FrontendStatic.API_GET_CUSTOMER_INFORMATION:\r\n this.request(\r\n component,\r\n '/frontend/api/get_customer',\r\n param,\r\n _res =>\r\n {\r\n successCallback({\r\n customer_information: _res.customer,\r\n });\r\n },\r\n errorCallback\r\n );\r\n break;\r\n\r\n case FrontendStatic.API_APPLY_EVENT:\r\n this.request(\r\n component,\r\n '/frontend/api/apply_event',\r\n param,\r\n _res =>\r\n {\r\n API.graphql(graphqlOperation(createReservation, {\r\n input: {\r\n id: _res.events[0].order.id,\r\n order_id: _res.events[0].order.id,\r\n customer_id: _res.events[0].order.customer_id,\r\n }\r\n }));\r\n successCallback(_res)\r\n },\r\n errorCallback\r\n );\r\n break;\r\n\r\n case FrontendStatic.API_CHECK_COUPON:\r\n this.request(\r\n component,\r\n '/frontend/api/check_coupon',\r\n param,\r\n _res =>\r\n {\r\n successCallback({\r\n available: _res.available,\r\n coupon: _res.coupon,\r\n user_coupons: _res.user_coupons,\r\n });\r\n },\r\n errorCallback\r\n );\r\n break;\r\n }\r\n }\r\n\r\n static request(component, url, params, successCallback = null, errorCallback = null)\r\n {\r\n console.log(url);\r\n\r\n if (component.setState) component.setState({loading: true});\r\n Axios.post(url, this.deepCopy(params))\r\n .then((response) =>\r\n {\r\n if (component.setState) component.setState({loading: false});\r\n if (successCallback) successCallback(response.data);\r\n })\r\n .catch((e) =>\r\n {\r\n if (component.setState) component.setState({loading: false});\r\n\r\n if (e.response && e.response.data)\r\n {\r\n console.error('url=' + url + '\\nerror : ' + e.response.data);\r\n if (e.response.status === 440)\r\n {\r\n location.reload(true);\r\n ErrorMessageProtocol.next('ログインセッションが切れました');\r\n return;\r\n }\r\n\r\n if (errorCallback) errorCallback(e.response.data);\r\n if (e.response.status === 400) ErrorMessageProtocol.next(e.response.data);\r\n else ErrorMessageProtocol.next('エラーが発生しました');\r\n }\r\n else\r\n {\r\n console.error(e);\r\n if (e.message === 'Network Error')\r\n {\r\n ErrorMessageProtocol.next('現在オフラインです。');\r\n }\r\n else\r\n {\r\n if (errorCallback) errorCallback('エラーが発生しました');\r\n else ErrorMessageProtocol.next('エラーが発生しました');\r\n }\r\n }\r\n });\r\n }\r\n\r\n static noticeUpdateReservation(order_id, customer_id, account_id = -1)\r\n {\r\n API.graphql(\r\n graphqlOperation(\r\n updateReservation,\r\n {\r\n input: {\r\n id: order_id,\r\n order_id: order_id,\r\n customer_id: customer_id,\r\n edit_account_id: account_id,\r\n }\r\n }\r\n )\r\n );\r\n }\r\n\r\n static getZipAddress(zipcode, successCallback)\r\n {\r\n Axios.get('https://api.zipaddress.net/?', {params: {zipcode: zipcode}})\r\n .then(_res =>\r\n {\r\n console.log(_res);\r\n if (_res.data.code >= 400)\r\n {\r\n successCallback({\r\n pref: '存在しません',\r\n city: '存在しません',\r\n town: '存在しません',\r\n });\r\n }\r\n else\r\n {\r\n successCallback(_res.data.data);\r\n }\r\n })\r\n .catch(e =>\r\n {\r\n successCallback({\r\n pref: '取得に失敗しました',\r\n city: '取得に失敗しました',\r\n town: '取得に失敗しました',\r\n });\r\n });\r\n }\r\n\r\n static notification(message)\r\n {\r\n let options = {\r\n body: message,\r\n icon: '/images/sharekan5.png',\r\n // vibrate: [200, 100, 200, 100, 200, 100, 200],\r\n // tag: 'vibration-sample'\r\n };\r\n\r\n try\r\n {\r\n if (Notification.permission === \"granted\")\r\n new Notification('シェアカン', options);\r\n else\r\n Notification.requestPermission(function (permission)\r\n {\r\n if (permission === \"granted\")\r\n new Notification('シェアカン', options);\r\n });\r\n }\r\n catch (e)\r\n {\r\n console.log(e);\r\n }\r\n }\r\n\r\n static getStorageContent(params_str, callback)\r\n {\r\n console.log('【getStorageContent】 ' + params_str);\r\n\r\n if (!params_str)\r\n return callback(\"\");\r\n\r\n let params = params_str;\r\n if (typeof params_str === 'string')\r\n try\r\n {\r\n params = JSON.parse(params_str);\r\n }\r\n catch (e)\r\n {\r\n params = {};\r\n }\r\n let key = params.key;\r\n // delete params.key;\r\n Storage.get(key, params)\r\n .then(result =>\r\n {\r\n console.log(result);\r\n callback(result);\r\n })\r\n .catch(err => console.log(err));\r\n }\r\n\r\n\r\n /**\r\n * Google Analytics Tracking\r\n */\r\n static isInitializedGoogleAnalytics = false;\r\n\r\n static initializeGoogleAnalytics(trackingId)\r\n {\r\n if (trackingId)\r\n {\r\n ReactGA.initialize(trackingId);\r\n this.isInitializedGoogleAnalytics = true;\r\n }\r\n else\r\n {\r\n this.isInitializedGoogleAnalytics = false;\r\n }\r\n }\r\n\r\n static viewPathGoogleAnalytics(path)\r\n {\r\n if (this.isInitializedGoogleAnalytics)\r\n {\r\n ReactGA.set({page: path});\r\n ReactGA.pageview(path);\r\n }\r\n }\r\n\r\n static conversionGoogleAnalytics(send_to)\r\n {\r\n if (this.isInitializedGoogleAnalytics && send_to)\r\n {\r\n ReactGA.ga('event', 'conversion', {'send_to': send_to});\r\n }\r\n }\r\n}","/* eslint-disable */\n// this is an auto generated file. This will be overwritten\n\nexport const getReservation = /* GraphQL */ `\n query GetReservation($id: ID!) {\n getReservation(id: $id) {\n id\n customer_id\n order_id\n edit_account_id\n }\n }\n`;\nexport const listReservations = /* GraphQL */ `\n query ListReservations(\n $filter: ModelReservationFilterInput\n $limit: Int\n $nextToken: String\n ) {\n listReservations(filter: $filter, limit: $limit, nextToken: $nextToken) {\n items {\n id\n customer_id\n order_id\n edit_account_id\n }\n nextToken\n }\n }\n`;\nexport const getMessage = /* GraphQL */ `\n query GetMessage($id: ID!) {\n getMessage(id: $id) {\n id\n customer_id\n channel\n sender_type\n sender_id\n body\n message_type\n image_base64\n send_at\n createdAt\n }\n }\n`;\nexport const listMessages = /* GraphQL */ `\n query ListMessages(\n $filter: ModelMessageFilterInput\n $limit: Int\n $nextToken: String\n ) {\n listMessages(filter: $filter, limit: $limit, nextToken: $nextToken) {\n items {\n id\n customer_id\n channel\n sender_type\n sender_id\n body\n message_type\n image_base64\n send_at\n createdAt\n }\n nextToken\n }\n }\n`;\nexport const reservationsByCustomerId = /* GraphQL */ `\n query ReservationsByCustomerId(\n $customer_id: Int\n $sortDirection: ModelSortDirection\n $filter: ModelReservationFilterInput\n $limit: Int\n $nextToken: String\n ) {\n reservationsByCustomerId(\n customer_id: $customer_id\n sortDirection: $sortDirection\n filter: $filter\n limit: $limit\n nextToken: $nextToken\n ) {\n items {\n id\n customer_id\n order_id\n edit_account_id\n }\n nextToken\n }\n }\n`;\nexport const messagesByChannel = /* GraphQL */ `\n query MessagesByChannel(\n $channel: String\n $sortDirection: ModelSortDirection\n $filter: ModelMessageFilterInput\n $limit: Int\n $nextToken: String\n ) {\n messagesByChannel(\n channel: $channel\n sortDirection: $sortDirection\n filter: $filter\n limit: $limit\n nextToken: $nextToken\n ) {\n items {\n id\n customer_id\n channel\n sender_type\n sender_id\n body\n message_type\n image_base64\n send_at\n createdAt\n }\n nextToken\n }\n }\n`;\nexport const messagesByChannelSortedBySendAt = /* GraphQL */ `\n query MessagesByChannelSortedBySendAt(\n $channel: String\n $send_at: ModelStringKeyConditionInput\n $sortDirection: ModelSortDirection\n $filter: ModelMessageFilterInput\n $limit: Int\n $nextToken: String\n ) {\n messagesByChannelSortedBySendAt(\n channel: $channel\n send_at: $send_at\n sortDirection: $sortDirection\n filter: $filter\n limit: $limit\n nextToken: $nextToken\n ) {\n items {\n id\n customer_id\n channel\n sender_type\n sender_id\n body\n message_type\n image_base64\n send_at\n createdAt\n }\n nextToken\n }\n }\n`;\nexport const messagesByChannelSortedByCreatedAt = /* GraphQL */ `\n query MessagesByChannelSortedByCreatedAt(\n $channel: String\n $createdAt: ModelStringKeyConditionInput\n $sortDirection: ModelSortDirection\n $filter: ModelMessageFilterInput\n $limit: Int\n $nextToken: String\n ) {\n messagesByChannelSortedByCreatedAt(\n channel: $channel\n createdAt: $createdAt\n sortDirection: $sortDirection\n filter: $filter\n limit: $limit\n nextToken: $nextToken\n ) {\n items {\n id\n customer_id\n channel\n sender_type\n sender_id\n body\n message_type\n image_base64\n send_at\n createdAt\n }\n nextToken\n }\n }\n`;\nexport const messagesByCustomerId = /* GraphQL */ `\n query MessagesByCustomerId(\n $customer_id: Int\n $sortDirection: ModelSortDirection\n $filter: ModelMessageFilterInput\n $limit: Int\n $nextToken: String\n ) {\n messagesByCustomerId(\n customer_id: $customer_id\n sortDirection: $sortDirection\n filter: $filter\n limit: $limit\n nextToken: $nextToken\n ) {\n items {\n id\n customer_id\n channel\n sender_type\n sender_id\n body\n message_type\n image_base64\n send_at\n createdAt\n }\n nextToken\n }\n }\n`;\n","export default function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}","/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh