diff --git a/document/PVC.one b/document/PVC.one index 1cde515..386027c 100644 Binary files a/document/PVC.one and b/document/PVC.one differ diff --git a/src/utils.js b/src/utils.js index 93feba9..0fd0a5c 100644 --- a/src/utils.js +++ b/src/utils.js @@ -136,7 +136,7 @@ function createBtnGroupArea(groupId, btnLabel, btnOnClick, { btnElId = false, ye function checkInputData(map, { btnLabel, yearElId, monthElId, dateElId, classElId }) { const year = yearElId && map[yearElId].value; const month = monthElId && map[monthElId].value; - const date = dateElId && (map[dateElId].value === 'end' ? getLastDate(year, month) : map[dateElId].value); + const date = dateElId && (map[dateElId].value === 'end' ? getLastDate(year, month).getDate() : map[dateElId].value); const className = classElId && map[classElId].value; const errorMsgs = []; @@ -170,7 +170,7 @@ function checkInputData(map, { btnLabel, yearElId, monthElId, dateElId, classElI } function getLastDate(year, month) { - return new Date(year, month, 0).getDate(); + return new Date(year, month, 0); } function createBtn(id, label, onClick) { @@ -239,9 +239,9 @@ function getFormatDateString(dateObjOrYear, month, date) { } const formatY = year; const formatM = String(month).padStart(2, '0'); - const formatD = date ? String(date).padStart(2, '0') : ''; + const formatD = String(date).padStart(2, '0'); - return formatY + '-' + formatM + (formatD && ('-' + formatD)); + return `${formatY}-${formatM}-${formatD}`; } function loading(show, text) { diff --git a/src/園児別出欠簿入力/Link1Handler.js b/src/園児別出欠簿入力/Link1Handler.js index 6a62b3d..0031642 100644 --- a/src/園児別出欠簿入力/Link1Handler.js +++ b/src/園児別出欠簿入力/Link1Handler.js @@ -17,24 +17,194 @@ class Link1Handler { showError(false); const api = new KintoneRestAPIClient(); - const dateString = getFormatDateString(year, month); - // 本アプリからデータを読み取る - // const currentAppRecords = await this.getRecords(api, dateString); - // if (!currentAppRecords) { - // // エラー - // loading(false); - // return; - // } + const currentAppRecords = await this.getRecords(api, year, month); + if (!currentAppRecords) { + // エラー + loading(false); + return; + } - // const record = this.generateRecord(dateString, currentAppRecords); - // console.log(record); + // console.log(currentAppRecords); + const recordsWrapper = await this.generateRecords(api, year, month, currentAppRecords); + // console.log(recordsWrapper); - // const result = await this.insertOrUpdateData(api, record, dateString); - // if (result) { - // showSuccess(true, "日誌データ連携作成完了"); - // } - // loading(false); + const result = await this.insertOrUpdateData(api, recordsWrapper); + if (result) { + // TODO dialog + showSuccess(true, "日誌データ連携作成完了"); + this.showSuccessDialog(result, year, month); + } + loading(false); + } + + showSuccessDialog(result, year, month) { + const dateString = year + '年' + month + '月'; + const contentEl = document.createElement('div'); + contentEl.style.fontSize = '16px'; + if (result.updateResult && result.insertResult) { + contentEl.innerHTML = `${dateString}の${result.updateResult.records.length}人の園児の日誌を更新し、${result.insertResult.records.length}人の園児の日誌を新規作成しました。` + } else if (result.updateResult) { + contentEl.innerHTML = `${dateString}の${result.updateResult.records.length}人の園児の日誌が更新されました。`; + } else if (result.insertResult) { + contentEl.innerHTML = `${dateString}の${result.insertResult.records.length}人の園児の日誌が生成されました`; + } else { + contentEl.innerHTML = `${dateString}の園児の日誌に生成するデータはありませんでした。` + } + showDialog({ + title: '日誌データ連携作成完了', + content: contentEl, + ok: 'アプリへ行く', + cancel: '閉じる', + onOk: () => { window.open(`${location.origin}/k/${env["0,1歳日誌出力用"].appId}/`) }, + }); + } + + insertOrUpdateData = async (api, recordsWrapper) => { + try { + const param = { + app: env["0,1歳日誌出力用"].appId, + } + + let insertResult; + if (recordsWrapper['insert'].length) { + param.records = recordsWrapper['insert']; + insertResult = await api.record.addAllRecords(param); + } + + let updateResult; + if (recordsWrapper['update'].length) { + param.records = recordsWrapper['update']; + // 本アプリの当日データでテーブルを上書きし、対応する園児データがない行を【削除】します + updateResult = await api.record.updateAllRecords(param); + } + + return { + recordsWrapper, + insertResult, + updateResult + }; + } catch (e) { + showError(true, '日誌データ連携作成失敗\n - ' + e); + } + }; + + generateRecords = async (api, year, month, records) => { + const generatedRecordIdMap = await this.getGeneratedRecordIdMap(api, year, month); + if (!generatedRecordIdMap) { + // エラー + loading(false); + return; + } + + const kidsMap = {}; + records.forEach((record) => { + const uniqueKey = record['園児ユニークキー'].value; + let map = kidsMap[uniqueKey]; + if (!map) { + map = { + existId: generatedRecordIdMap[uniqueKey], + list: [], + '年': { 'value': Number(year) }, + '月': { 'value': Number(month) }, + 'クラス': { 'value': record['クラス'].value }, + '出席番号': { 'value': record['出席番号'].value }, + '園児名': { 'value': record['園児名'].value }, + '園児ユニークキー': { 'value': uniqueKey }, + '帳票出力用_テーブル': { 'value': undefined }, + }; + kidsMap[uniqueKey] = map + } + record['date'] = Number(record['登園日'].value.split('-')[2]); + map.list.push(record); + }); + // console.log(generatedRecordIdMap); + // console.log(kidsMap); + + const result = { + 'update': [], + 'insert': [] + } + + Object.values(kidsMap).forEach((recordWrapper) => { + const subtable = Array.from({ length: 31 }, (_e, i) => ({ + value: { + '日付': { 'value': i + 1 }, + '出欠': { 'value': '出席停止' }, + } + })); + recordWrapper.list.forEach((record) => { + subtable[record['date'] - 1] = { + value: { + '日付': { 'value': record['date'] }, + '出欠': { 'value': record['出欠'].value }, + '降園': { 'value': record['帰園時刻'].value }, + '検温時刻1': { 'value': record['検温時刻1'].value }, + '体温1': { 'value': record['体温1'].value }, + '検温時刻2': { 'value': record['検温時刻2'].value }, + '体温2': { 'value': record['体温2'].value }, + '検温時刻3': { 'value': record['検温時刻3'].value }, + '体温3': { 'value': record['体温3'].value }, + '食事量': { 'value': record['食事量_結合'].value }, + '排便': { 'value': record['排便'].value }, + '睡眠開始時間1': { 'value': record['睡眠開始時間1'].value }, + '睡眠終了時間1': { 'value': record['睡眠終了時間1'].value }, + '睡眠開始時間2': { 'value': record['睡眠開始時間2'].value }, + '睡眠終了時間2': { 'value': record['睡眠終了時間2'].value }, + '保護者から': { 'value': record['保護者から'].value }, + '園での様子_伝達事項': { 'value': record['園での様子_伝達事項'].value }, + '評価反省': { 'value': record['評価反省'].value }, + } + } + }) + recordWrapper['帳票出力用_テーブル'].value = subtable; + const id = recordWrapper['existId']; + delete recordWrapper['list']; + delete recordWrapper['existId']; + if (id) { + result['update'].push({ + id, + record: recordWrapper + }); + } else { + result['insert'].push(recordWrapper); + } + }); + + return result; + } + + getRecords = async (api, year, month) => { + const firstDate = getFormatDateString(year, month, 1) + const lastDate = getFormatDateString(getLastDate(year, month)); + try { + return await api.record.getAllRecordsWithId({ + app: env["園児別出欠簿入力"].appId, + condition: `学年 in ("0歳児", "1歳児") and 登園日 >= "${firstDate}" and 登園日 <= "${lastDate}"` + }); + } catch (e) { + showError(true, '本アプリのデータ読み取りエラー\n - ' + e); + loading(false); + } + } + + getGeneratedRecordIdMap = async (api, year, month) => { + try { + const result = await api.record.getAllRecordsWithId({ + app: env["0,1歳日誌出力用"].appId, + fields: ["$id", "園児ユニークキー"], + condition: `年 = ${year} and 月 = ${month}` + }); + const map = {} + result.forEach((record) => { + const uniqueKey = record['園児ユニークキー'].value; + map[uniqueKey] = record['$id'].value; + }); + return map; + } catch (e) { + showError(true, '日誌データ読み取りエラー\n - ' + e); + loading(false); + } } static getInstance(headerSpace) { diff --git a/src/園児別出欠簿入力/Link2Handler.js b/src/園児別出欠簿入力/Link2Handler.js index a9d9f25..07b02fa 100644 --- a/src/園児別出欠簿入力/Link2Handler.js +++ b/src/園児別出欠簿入力/Link2Handler.js @@ -30,25 +30,26 @@ class Link2Handler { } const record = this.generateRecord(dateString, currentAppRecords); - console.log(record); + // console.log(record); const result = await this.insertOrUpdateData(api, record, dateString); if (result) { // showSuccess(true, "日誌データ連携作成完了"); - this.showSuccessDialog(result); + this.showSuccessDialog(result, year, month, date); } loading(false); } - showSuccessDialog(result) { + showSuccessDialog(result, year, month, date) { + const dateString = year + '年' + month + '月' + date + '日'; const contentEl = document.createElement('div'); contentEl.style.fontSize = '16px'; if (!result.size) { - contentEl.innerHTML = `${result.dateString}に園児別テーブルに追加するデータはありませんでした。`; + contentEl.innerHTML = `${dateString}の園児別テーブルに追加するデータはありませんでした。`; } else if (result.type === 'update') { - contentEl.innerHTML = `${result.dateString}の園児別テーブルに${result.size}件のデータを再作成しました。`; + contentEl.innerHTML = `${dateString}の園児別テーブルに${result.size}件のデータを再作成しました。`; } else { - contentEl.innerHTML = `${result.dateString}の日誌は生成しましたが、園児別テーブルに${result.size}件のデータを追加しました。`; + contentEl.innerHTML = `${dateString}の日誌は生成しましたが、園児別テーブルに${result.size}件のデータを追加しました。`; } showDialog({ title: '日誌データ連携作成完了', @@ -68,7 +69,7 @@ class Link2Handler { condition: `学年 not in ("", "0歳児", "1歳児") and 登園日 = "${dateString}"` }); } catch (e) { - showError(true, '園児台帳アプリのデータ読み取りエラー\n - ' + e); + showError(true, '本アプリのデータ読み取りエラー\n - ' + e); loading(false); } } @@ -108,7 +109,6 @@ class Link2Handler { id: generatedRecordId, type: generatedRecordId ? 'update' : 'insert', size: record["園児別テーブル"].value.length, - dateString }; let awaitResult;