138 lines
4.2 KiB
JavaScript
138 lines
4.2 KiB
JavaScript
(function () {
|
|
"use strict";
|
|
const APP_ENV = env["個別配慮"];
|
|
|
|
kintone.events.on("app.record.index.show", (event) => {
|
|
const headerSpace = getHeaderSpace('single-label-line');
|
|
|
|
const elements = createBtnGroupArea('extract-action-area', '帳票出力', handleButtonClick, {
|
|
btnElId: 'extract-btn',
|
|
yearElId: 'extract-year',
|
|
monthElId: 'extract-month',
|
|
})
|
|
|
|
if (!elements) {
|
|
return;
|
|
}
|
|
|
|
headerSpace.appendChild(elements['extract-action-area']);
|
|
});
|
|
|
|
async function handleButtonClick(e, { year, month }) {
|
|
loading(true, '帳票出力中...');
|
|
showError(false);
|
|
const api = new KintoneRestAPIClient();
|
|
|
|
// 本アプリからデータを読み取る
|
|
const currentAppRecords = await getRecords(api, year, month);
|
|
if (!currentAppRecords) {
|
|
// エラー
|
|
loading(false);
|
|
return e;
|
|
}
|
|
|
|
const excelName = APP_ENV.excelName;
|
|
await createExcelAndDownload({
|
|
api,
|
|
excelName,
|
|
exportName: getExcelName(excelName, year + month),
|
|
bizLogic: writeExcel(currentAppRecords, year, month),
|
|
});
|
|
loading(false);
|
|
}
|
|
|
|
async function getRecords(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: `日付 >= "${firstDate}" and 日付 <= "${lastDate}"`
|
|
});
|
|
} catch (e) {
|
|
showError(true, '本アプリのデータ読み取りエラー\n - ' + e);
|
|
}
|
|
}
|
|
|
|
function writeExcel(records, year, month) {
|
|
return async (api, worksheet) => {
|
|
if (!records || !records.length) {
|
|
return;
|
|
}
|
|
|
|
const baseCells = findCellsInfo(worksheet, ['月', '児童名']);
|
|
|
|
const pageSize = 10;
|
|
const totalPages = Math.ceil(records.length / pageSize);
|
|
|
|
// make new copy
|
|
if (totalPages > 2) {
|
|
const lastPage = 2;
|
|
const copyPageRowStart = baseCells['月'][lastPage - 1].row - 1;
|
|
const copyPageRowEnd = baseCells['児童名'][lastPage - 1].row + pageSize;
|
|
|
|
createCopyFromTemplate(worksheet, {
|
|
startPage: lastPage + 1,
|
|
totalPages,
|
|
copyPageRowStart,
|
|
copyPageRowEnd,
|
|
callback: (newPage, rowCount) => {
|
|
['月', '児童名'].forEach((label) => {
|
|
const last = baseCells[label][newPage - 2];
|
|
baseCells[label].push({
|
|
col: last.col,
|
|
row: last.row + rowCount
|
|
});
|
|
})
|
|
}
|
|
})
|
|
}
|
|
|
|
const cols = getLabelColsMapping(worksheet, baseCells['児童名'][0].row, ['児童名', '子どもの姿', '保育者援助_配慮_環境構成']);
|
|
const sortedRecords = sort(records);
|
|
|
|
for (let i = 0; i < totalPages; i++) {
|
|
const monthLabelCell = baseCells['月'][i];
|
|
updateCell(worksheet, { base: monthLabelCell, left: 1 }, Number(month));
|
|
|
|
const childLabelCell = baseCells['児童名'][i];
|
|
let currentRow = childLabelCell.row + 1;
|
|
|
|
for (let j = 0; j < pageSize; j++) {
|
|
const index = i * pageSize + j;
|
|
const record = sortedRecords[index];
|
|
if (!record) {
|
|
break;
|
|
}
|
|
const row = worksheet.getRow(currentRow);
|
|
cols.forEach(col => {
|
|
updateCell(row, { base: { row: currentRow, col: col.index } }, record[col.field].value);
|
|
});
|
|
currentRow++;
|
|
}
|
|
|
|
worksheet.getRow(childLabelCell.row + pageSize).addPageBreak();
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
|
|
function sort(records) {
|
|
// 1. sort by 出席番号
|
|
const sortedRecords = records.sort((a, b) => Number(a['出席番号'].value) - Number(b['出席番号'].value));
|
|
|
|
// 2. sort by 学年
|
|
debugger;
|
|
const termOrder = {};
|
|
termItems.forEach((item, index) => {
|
|
termOrder[item.value] = index;
|
|
});
|
|
sortedRecords.sort((a, b) => {
|
|
return termOrder[a["学年"].value] - termOrder[b["学年"].value];
|
|
});
|
|
return sortedRecords;
|
|
}
|
|
|
|
})();
|