import { XMLHttpRequest } from 'xmlhttprequest' //ケアセブン訪問看護データ計算スクリプト //対象月の指定 let targetMonth;// = '2025-04-01'; //日付データ作成 let startDate;// = new Date(targetMonth); let endDate;// = new Date(targetMonth); //endDate.setMonth(endDate.getMonth() + 1, 0); let startStr; let endStr; //HTTPRequestを使うための宣言 //let XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest; //XMLHttpRequestの定義 //プリザンターAPIKeyとURL let apiKey = 'c63feb0027f958152bd376d1fa63fff7c8ee86e0a13de5ab2f2ea14303e6278cf507547a04a83d02d3b32650bac7b85e7e8f31e9ea1ab17ef620b378a2a02f16'; let baseUrl = 'https://nextoffice.next-hd.co.jp/'; //let baseUrl = 'https://neo999.next-hd.net/'; //対象テーブル情報 let tableA = '126841'; let holidayTable = '281723'; let holiDays = []; let resData = []; let baseYear; let baseMonth; function main() { if (process.argv.length == 4) { baseYear = process.argv[2]; baseMonth = process.argv[3]; if (isNaN(baseYear) || isNaN(baseMonth)) { console.log("■■■■■■■■■■■■■■■■■■■■■■■■■■"); console.log("■ 引数が数字ではありません 実行例↓"); console.log("■ node .\\実行ファイル名 年 月"); console.log("■ 年と月は数字のみ(前0不要)"); console.log("■■■■■■■■■■■■■■■■■■■■■■■■■■"); return false; } else { baseYear = parseFloat(baseYear); baseMonth = parseFloat(baseMonth); if (baseYear <= 2000 || baseYear > 3000) { console.log("■■■■■■■■■■■■■■■■■■■■■■■■■■"); console.log("■ 引数が数字ではありません 実行例↓"); console.log("■ node .\\実行ファイル名 年 月"); console.log("■ 年は西暦4桁で指定してください"); console.log("■■■■■■■■■■■■■■■■■■■■■■■■■■"); return false; } if (baseMonth < 1 || baseMonth > 12) { console.log("■■■■■■■■■■■■■■■■■■■■■■■■■■"); console.log("■ 引数が数字ではありません 実行例↓"); console.log("■ node .\\実行ファイル名 年 月"); console.log("■ 月は1~12で指定してください"); console.log("■■■■■■■■■■■■■■■■■■■■■■■■■■"); return false; } } } else { console.log("■■■■■■■■■■■■■■■■■■■■■■■■■■"); console.log("■ 引数を正確に指定してください 実行例↓"); console.log("■ node .\\実行ファイル名 年 月"); console.log("■ 年と月は数字のみ(前0不要)"); console.log("■■■■■■■■■■■■■■■■■■■■■■■■■■"); return false; } //引数から日付範囲を設定 targetMonth = baseYear + '/' + baseMonth + '/1'; startDate = new Date(targetMonth); endDate = new Date(targetMonth); endDate.setMonth(endDate.getMonth() + 1, 0); startStr = startDate.getFullYear() + '/' + (startDate.getMonth() + 1).toString().padStart(2, '0') + '/' + (startDate.getDate()).toString().padStart(2, '0') + ' 00:00:00'; endStr = endDate.getFullYear() + '/' + (endDate.getMonth() + 1).toString().padStart(2, '0') + '/' + (endDate.getDate()).toString().padStart(2, '0') + ' 23:59:59'; getHolidayData(); sendRequest(0); //loadCSVdata(); } function sendRequest(offset) { try { let tableId = tableA; //送信データ let json = { "ApiVersion": 1.1, "ApiKey": apiKey, "Offset": offset, "View": { "ColumnFilterHash": { "DateA": "[\"" + startStr + ",\"]", "DateB": "[\"," + endStr + "\"]" }, } }; //データ取得リクエスト const url = baseUrl + '/pleasanter/api/items/' + tableId + '/get'; const xhr = new XMLHttpRequest(); //XMLHttpRequestの作成 //HTTPリクエスト実行 xhr.open('POST', url, true); xhr.setRequestHeader('Content-Type', 'application/json;charset=utf-8'); xhr.onload = () => { //XMLHttpRequestのリクエストステータスの確認 if (xhr.status === 200) { //success let data = JSON.parse(xhr.responseText); //結果を配列に結合 resData = resData.concat(data.Response.Data); //全件取得するまで繰り返す if ((data.Response.Offset + data.Response.PageSize) <= data.Response.TotalCount) { sendRequest(data.Response.Offset + data.Response.PageSize); } else { //全件取得したら配列の各要素を処理 resData.forEach(function (value) { //let result = dataCreate(value); //console.log(result); //if (!result) { // console.log(value); // console.log("Update Failed!!"); // return; //} }); } } else { //error console.log(JSON.parse(xhr.responseText)); } }; xhr.send(JSON.stringify(json)); } catch (e) { console.log(e.stack); } } //祝日データの取得 function getHolidayData() { //116221 try { let tableId = holidayTable; //送信データ let json = { "ApiVersion": 1.1, "ApiKey": apiKey, "View": { "ColumnFilterHash": { "DateA": "[\"" + startStr + "," + endStr + "\"]" }, } }; //データ取得リクエスト const url = baseUrl + '/pleasanter/api/items/' + tableId + '/get'; const xhr = new XMLHttpRequest(); //XMLHttpRequestの作成 //HTTPリクエスト実行 xhr.open('POST', url, false); //同期通信 xhr.setRequestHeader('Content-Type', 'application/json;charset=utf-8'); xhr.onload = () => { //XMLHttpRequestのリクエストステータスの確認 if (xhr.status === 200) { //success //console.log(xhr.responseText); let data = JSON.parse(xhr.responseText); //console.log(data.Response.Data); data.Response.Data.forEach(function (value) { let holiday = new Date(value.DateHash.DateA) let holidayStr = holiday.getFullYear() + '-' + (holiday.getMonth() + 1).toString().padStart(2, '0') + '-' + (holiday.getDate()).toString().padStart(2, '0'); holiDays.push(holidayStr); }) } else { //error console.log(xhr.responseText); } }; xhr.send(JSON.stringify(json)); } catch (e) { console.log(e.stack); } } function dataCreate(value) { //対象レコード let resultId = value.ResultId; //時間計算用配列初期化 let timeTable = []; let i, j, k; for (i = 0; i < (24 * 60); i++) { timeTable[i] = 0; } //開始時間、終了時間取得 let startTime = new Date(value.DateHash.DateA); //曜日 let dayOfWeek = startTime.getDay(); //日付のみ取得 let startDate = startTime.getFullYear() + '-' + (startTime.getMonth() + 1).toString().padStart(2, '0') + '-' + (startTime.getDate()).toString().padStart(2, '0'); //祝日フラグ let holidayFlag = 0; if (holiDays.includes(startDate)) holidayFlag = 1; //土日判定 if (dayOfWeek == 0 || dayOfWeek == 6) holidayFlag = 1; let endTime = new Date(value.DateHash.DateB); let startMin = startTime.getHours() * 60 + startTime.getMinutes(); let endMin = endTime.getHours() * 60 + endTime.getMinutes(); //終了時間が0時を過ぎている場合(開始時間より前になっている) if (endTime.getTime() <= startTime.getTime()) { //タイムテーブルへ反映 for (j = 0; j < endMin; j++) { timeTable[j] = 1; } endMin = endMin + (24 * 60); } //タイムテーブルへ反映 for (j = startMin; j < endMin; j++) { timeTable[j] = 1; } //集計 let timeA = 0; //0 ~ 360 let timeB = 0; //360 ~ 510 let timeC = 0; //510 ~ 720 let timeD = 0; //720 ~ 1050 let timeE = 0; //1050 ~ 1320 let timeF = 0; //1320 ~ 1440 for (k = 0; k < 360; k++) { timeA += timeTable[k]; } for (k = k; k < 510; k++) { timeB += timeTable[k]; } for (k = k; k < 720; k++) { timeC += timeTable[k]; } for (k = k; k < 1050; k++) { timeD += timeTable[k]; } for (k = k; k < 1320; k++) { timeE += timeTable[k]; } for (k = k; k < 1440; k++) { timeF += timeTable[k]; } //時間外対応 または休日対応flag let sumFlag = 0; if (timeA > 0) sumFlag = 1; if (timeB > 0) sumFlag = 1; if (timeE > 0) sumFlag = 1; if (timeF > 0) sumFlag = 1; //祝日判定 // if (holidayFlag == 1) { sumFlag = 1; } else { //平日判定の場合は C,D枠を0設定 timeC = 0; timeD = 0; } //時間外対応時間集計 let timeSum = 0; if (endTime.getTime() == startTime.getTime()) { timeSum = 0; } else { timeSum = timeA + timeB + timeC + timeD + timeE + timeF; } //集計分類が「他」の場合は時間外対応集計フラグ外す if (value.ClassHash.ClassJ == '99') sumFlag = 0; //レコード更新用データ作成 let classHash = { 'ClassG': holidayFlag, 'ClassP': sumFlag } let numHash = { 'Num001': timeA, 'Num002': timeB, 'Num003': timeC, 'Num004': timeD, 'Num005': timeE, 'Num006': timeF, 'Num007': timeSum, } //レコード更新 return recordUpdate(resultId, classHash, numHash); } //データ更新 function recordUpdate(resultId, classHash, numHash) { try { //let tableId = tableA; //送信データ let json = { "ApiVersion": 1.1, "ApiKey": apiKey, "ClassHash": classHash, "NumHash": numHash }; //データ更新リクエスト const url = baseUrl + '/pleasanter/api/items/' + resultId + '/update'; const xhr = new XMLHttpRequest(); //XMLHttpRequestの作成 //HTTPリクエスト実行 xhr.open('POST', url, false); //非同期通信:true 同期通信:false xhr.setRequestHeader('Content-Type', 'application/json;charset=utf-8'); xhr.onload = () => { //XMLHttpRequestのリクエストステータスの確認 if (xhr.status === 200) { //success console.log(JSON.parse(xhr.responseText)); return true; } else { //error console.log(xhr.responseText); return false; } }; xhr.send(JSON.stringify(json)); } catch (e) { console.log(e.stack); return false; } } //始動 main();