Compare commits

...

8 Commits

Author SHA1 Message Date
9adbe69a70 update doc 2025-09-22 15:37:44 +08:00
4ac71b4232 update env 2025-09-22 15:06:53 +08:00
a1098a1166 fix 2025-09-22 15:06:42 +08:00
089b5f79f8 fix doc 2025-09-22 12:57:07 +08:00
2ff79c58ee fix file name 2025-09-22 12:56:54 +08:00
301e202c49 update 個別配慮 in monthly version 2025-09-21 17:55:11 +08:00
8801e60604 batch approve 2025-09-19 16:56:33 +08:00
e00eae5930 update doc 2025-09-18 21:13:03 +08:00
41 changed files with 13156 additions and 97 deletions

View File

@@ -3,7 +3,7 @@
// https://alicorn.cybozu.com/k/#/space/15/thread/22
const env = {
"園児別出欠簿入力": {
appId: 182,
appId: 250,
excelName: "出欠集計表",
view: {
linkFor0to1: 13352636,
@@ -11,28 +11,28 @@ const env = {
}
},
"0,1歳日誌出力用": {
appId: 186,
appId: 255,
excelName: "ゆり・つき1視診表",
},
"2歳以上日誌出力用": {
appId: 187,
appId: 256,
excelName: "幼児日誌",
},
"個別配慮": {
appId: 183,
appId: 251,
excelName: "個別配慮",
},
"園児台帳": {
appId: 179,
appId: 247,
},
"保育・教育日数マスタ": {
appId: 184,
appId: 253,
},
"Excelテンプレート": {
appId: 185
appId: 254
},
"担任マスタ": {
appId: 190
appId: 259
}
};

View File

@@ -0,0 +1,283 @@
(function () {
"use strict";
/**
* 一括承認処理を管理するクラス
* 特定のビューでレコードの一括承認機能を提供する
*/
class BatchApprovalHandler {
/**
* コンストラクタ
* @param {number} mineView - マイビューのID
* @param {string} classifyField - 分類フィールドのプレースホルダー
* @param {Object} btnClassifyMap - 年齢分類マッピングオブジェクト
* @param {Object} actionMap - アクション名マッピングオブジェクト
* @param {Function} getStatusPrefix - ステータス接頭辞を取得する関数
* @param {Object} statusFieldMap
* @param {string} classifyFormField
*/
constructor(mineView, classifyField, btnClassifyMap, actionMap, getStatusPrefix, statusFieldMap, classifyFormField = "学年") {
this.mineView = mineView;
this.classifyField = classifyField;
this.btnClassifyMap = btnClassifyMap;
this.actionMap = actionMap;
this.getStatusPrefix = getStatusPrefix;
this.statusFieldMap = statusFieldMap;
this.classifyFormField = classifyFormField;
this.stopFlag = false;
}
stopProcess() {
this.stopFlag = true;
}
/**
* 一括承認ボタンを作成する
* @method
*/
createApproveBtn() {
const headerSpace = getHeaderSpace('single-label-line');
const elements = createBtnGroupArea('batch-approve-area', '一括承認', this.handleApproveData.bind(this), {
btnElId: 'batch-btn'
});
if (elements && headerSpace) {
headerSpace.appendChild(elements['batch-approve-area']);
}
}
/**
* 一括承認処理を実行する
* @method
* @param {Event} e - イベントオブジェクト
*/
async handleApproveData(e) {
this.stopFlag = false;
const appId = kintone.app.getId();
const loginUser = kintone.getLoginUser();
loading(true, '一括承認処理中...');
showError(false);
const api = new KintoneRestAPIClient();
// レコードを取得
const records = await this.getRecords(api, appId, loginUser.code);
if (!records || records.length === 0) {
loading(false);
return e;
}
// ステータスを更新
const result = await this.updateRecordsStatus(api, appId, records);
if (result && result.success > 0) {
// 承認者情報を更新
await this.updateRecords(api, appId, records, result.successIds, loginUser);
await this.showSuccessDialog(result);
}
loading(false);
}
/**
* 成功ダイアログを表示する
* @method
* @param {Object} result - 処理結果
*/
async showSuccessDialog(result) {
const contentEl = document.createElement('div');
contentEl.style.fontSize = '16px';
if (result.success === result.total) {
contentEl.innerHTML = `✅ 全${result.total}件のレコードを承認しました`;
} else {
const successText = `${result.success}件のレコードを承認済み`;
const failedText = `⚠️ ${result.total - result.success}件の承認に失敗`;
contentEl.innerHTML = `${successText}<br>${failedText}<br><br>合計: ${result.total}`;
}
showDialog({
title: '一括承認完了',
content: contentEl,
ok: '更新して確認',
cancel: false,
onClose: () => { location.reload(); }
});
}
/**
* アクションプロセスマップを読み込む
* @method
* @param {Object} api - Kintone REST API クライアント
* @param {number} appId - アプリID
*/
async loadActionProcessMap(api, appId) {
try {
const result = await api.app.getProcessManagement({
app: appId,
preview: false
});
const actionProcessMap = {};
result.actions.forEach(action => {
actionProcessMap[action.from + ":" + action.name] = action;
});
return actionProcessMap;
} catch (error) {
showError(true, 'プロセス管理情報の読み取りに失敗しました\n - ' + error.message);
}
}
/**
* レコードを取得する
* @method
* @param {Object} api - Kintone REST API クライアント
* @param {number} appId - アプリID
* @param {string} loginUserCd - ログインユーザーコード
*/
async getRecords(api, appId, loginUserCd) {
try {
return await api.record.getAllRecordsWithId({
app: appId,
condition: `作業者 in ("${loginUserCd}")`
});
} catch (error) {
showError(true, 'レコードの読み取りに失敗しました\n - ' + error.message);
return null;
}
}
/**
* レコードを更新する
* @method
* @param {Object} api - Kintone REST API クライアント
* @param {number} appId - アプリID
* @param {Array} oldRecords - 更新前レコード
* @param {Set} successIds - 成功したレコードID
* @param {Object} loginUser - ログインユーザー情報
*/
async updateRecords(api, appId, oldRecords, successIds, loginUser) {
const actionProcessMap = await this.loadActionProcessMap(api, appId);
if (!actionProcessMap) {
return;
}
const updateFieldRecords = [];
for (const record of oldRecords) {
const updateKey = this.getRecordAutoUpdateField(record, actionProcessMap, successIds);
if (updateKey) {
updateFieldRecords.push({
'id': record.$id.value,
'record': {
[updateKey]: {
'value': loginUser.name
}
}
});
}
}
if (updateFieldRecords.length > 0) {
try {
await api.record.updateAllRecords({
app: appId,
records: updateFieldRecords
});
} catch (error) {
showError(true, 'レコード更新に失敗しました\n - ' + error.message);
}
}
}
/**
* 自動更新フィールド名を取得する
* @method
* @param {Object} record - レコードオブジェクト
* @param {Object} actionProcessMap - アクションプロセスマップ
* @param {Set} successIds - 成功したレコードID
*/
getRecordAutoUpdateField(record, actionProcessMap, successIds) {
const id = record.$id.value;
if (!successIds.has(id)) {
return null;
}
const oldStatus = record.ステータス.value;
const actionName = record.action;
const action = actionProcessMap[oldStatus + ":" + actionName];
return action ? this.statusFieldMap[action.to] : null;
}
/**
* レコードステータスを更新する
* @method
* @param {Object} api - Kintone REST API クライアント
* @param {number} appId - アプリID
* @param {Array} records - 更新対象レコード
*/
async updateRecordsStatus(api, appId, records) {
const updateRecords = []
for (const record of records) {
const actionToPerform = this.getActionName(record);
if (this.stopFlag) {
return
}
if (!!actionToPerform) {
record.action = actionToPerform;
updateRecords.push({
id: record.$id.value,
action: actionToPerform,
revision: record.$revision.value
});
}
}
const result = {
success: 0,
total: records.length,
successIds: new Set(),
};
const batchSize = 100; // Kintone APIの制限
for (let i = 0; i < updateRecords.length; i += batchSize) {
const batch = updateRecords.slice(i, i + batchSize);
try {
const response = await api.record.updateRecordsStatus({
app: appId,
records: batch
});
result.success += response.records.length;
response.records.forEach(record => {
result.successIds.add(record.id);
});
} catch (error) {
showError(true, `レコードステータス更新エラー\n - ${error.message}`);
}
}
return result;
}
/**
* アクション名を取得する
* @method
* @param {string} record - レコードオブジェクト
*/
getActionName(record) {
const yearStr = record[this.classifyFormField]?.value || '';
const status = record.ステータス.value;
const actionTemplate = this.actionMap[this.getStatusPrefix(status)] || '';
const btnClassify = this.btnClassifyMap[yearStr] || '';
return actionTemplate.replaceAll(this.classifyField, btnClassify);
}
}
// グローバルにクラスを公開
window.BatchApprovalHandler = BatchApprovalHandler;
})();

View File

@@ -8,6 +8,8 @@
'完了': '園長'
}
window._StatusFieldMap = statusFieldMap
kintone.events.on("app.record.detail.process.proceed", (event) => {
const field = statusFieldMap[event.nextStatus.value];
if (field) {

File diff suppressed because one or more lines are too long

2433
src/10.個別支援計画/kuc.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -8,13 +8,13 @@
return event;
});
kintone.events.on(["app.record.create.change.担当","app.record.edit.change.担当"], function(event) {
kintone.events.on(["app.record.create.change.担当","app.record.edit.change.担当", "app.record.index.edit.change.担当"], function(event) {
var record = event.record;
record.担当_文字列.value = record.担当.value.map(function(user) {return user.name}).join(",");
return event;
});
kintone.events.on(["app.record.create.change.コーディネーター","app.record.edit.change.コーディネーター"], function(event) {
kintone.events.on(["app.record.create.change.コーディネーター","app.record.edit.change.コーディネーター", "app.record.index.edit.change.コーディネーター"], function(event) {
var record = event.record;
record.コーディネーター_文字列.value = record.コーディネーター.value.map(function(user) {return user.name}).join(",");
return event;

View File

@@ -10,6 +10,8 @@
"完了": "園長3"
}
window._StatusFieldMap = statusFieldMap
kintone.events.on("app.record.detail.process.proceed", (event) => {
const field = statusFieldMap[event.nextStatus.value];
if (field) {

View File

@@ -0,0 +1,54 @@
(function () {
"use strict";
// マイビューのID
const mineView = 13353711;
// 分類フィールドのプレースホルダー
const classifyField = "${classify}";
// ボタン分類マッピング
const btnClassifyMap = {
"0歳児": "0~2歳",
"1歳児": "0~2歳",
"2歳児": "0~2歳",
"3歳児": "3~5歳",
"4歳児": "3~5歳",
"5歳児": "3~5歳",
}
// アクションマッピング
const actionMap = {
"担任作成中": `指導教諭確認依頼${classifyField}`,
"指導教諭確認中": `承認する`,
"園長確認中": `承認する${classifyField}`
}
/**
* ステータスから接頭辞を取得する
* @param {string} status - ステータス文字列
*/
const getStatusPrefix = (status) => {
return status.split("")[0];
};
// kintoneイベントの登録
kintone.events.on("app.record.index.show", (event) => {
// 特定のビューの場合のみ処理を実行
if (event.viewId === mineView) {
// BatchApprovalHandlerクラスのインスタンスを作成
const batchApproval = new BatchApprovalHandler(
mineView,
classifyField,
btnClassifyMap,
actionMap,
getStatusPrefix,
_StatusFieldMap
);
// 一括承認ボタンを作成
batchApproval.createApproveBtn();
}
return event;
});
})();

View File

@@ -3,11 +3,12 @@
const statusFieldMap = {
'指導教諭確認中0~2歳': '担任',
'主幹確認中': '指導',
'園長確認中': '主幹',
'園長確認中': '指導',
'完了': '園長'
}
window._StatusFieldMap = statusFieldMap
kintone.events.on("app.record.detail.process.proceed", (event) => {
const field = statusFieldMap[event.nextStatus.value];
if (field) {

View File

@@ -4,11 +4,12 @@
const statusFieldMap = {
'指導教諭確認中0~2歳': '担任',
'指導教諭確認中3~5歳': '担任',
'主幹確認中': '指導',
'園長確認中': '主幹',
'園長確認中': '指導',
'完了': '園長'
}
window._StatusFieldMap = statusFieldMap
kintone.events.on("app.record.detail.process.proceed", (event) => {
const field = statusFieldMap[event.nextStatus.value];
if (field) {

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -5,11 +5,13 @@
"app.record.create.show",
"app.record.edit.show",
"app.record.create.change.担当",
"app.record.edit.change.担当"
"app.record.edit.change.担当",
"app.record.index.edit.change.担当"
];
kintone.events.on(events, function(event) {
var record = event.record;
//kintone.app.record.setFieldShown("担任", false);
record.担任.value = record.担当.value.map(function(user) {return user.name}).join(",");
return event;
});

View File

@@ -6,6 +6,8 @@
'完了': '園長'
}
window._StatusFieldMap = statusFieldMap
kintone.events.on("app.record.detail.process.proceed", (event) => {
const field = statusFieldMap[event.nextStatus.value];
if (field) {

View File

@@ -0,0 +1,50 @@
(function () {
"use strict";
// マイビューのID
const mineView = 8352036;
// 分類フィールドのプレースホルダー
const classifyField = "${classify}";
// ボタン分類マッピング
const btnClassifyMap = {
"0歳児": "",
}
// アクションマッピング
const actionMap = {
"担任作成中": `指導教諭確認依頼`,
"指導教諭確認中": `承認する`,
"主幹確認中": `承認する`,
"園長確認中": `承認する`
}
/**
* ステータスから接頭辞を取得する
* @param {string} status - ステータス文字列
*/
const getStatusPrefix = (status) => {
return status.split("")[0];
};
// kintoneイベントの登録
kintone.events.on("app.record.index.show", (event) => {
// 特定のビューの場合のみ処理を実行
if (event.viewId === mineView) {
// BatchApprovalHandlerクラスのインスタンスを作成
const batchApproval = new BatchApprovalHandler(
mineView,
classifyField,
btnClassifyMap,
actionMap,
getStatusPrefix,
_StatusFieldMap
);
// 一括承認ボタンを作成
batchApproval.createApproveBtn();
}
return event;
});
})();

File diff suppressed because one or more lines are too long

2433
src/3.保育計画 月案/kuc.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,19 @@
(function () {
"use strict";
var events = [
"app.record.create.show",
"app.record.edit.show",
"app.record.create.change.担当",
"app.record.edit.change.担当",
"app.record.index.edit.change.担当"
];
kintone.events.on(events, function(event) {
var record = event.record;
//kintone.app.record.setFieldShown("担任", false);
record.担任.value = record.担当.value.map(function(user) {return user.name}).join(",");
return event;
});
})();

View File

@@ -0,0 +1,19 @@
(function () {
"use strict";
const statusFieldMap = {
'園長確認中': '指導',
'完了': '園長'
}
window._StatusFieldMap = statusFieldMap
kintone.events.on("app.record.detail.process.proceed", (event) => {
const field = statusFieldMap[event.nextStatus.value];
if (field) {
event.record[field].value = kintone.getLoginUser().name;
}
return event;
});
})();

View File

@@ -0,0 +1,55 @@
(function () {
"use strict";
// マイビューのID
const mineView = 8352036;
// 分類フィールドのプレースホルダー
const classifyField = "${classify}";
// ボタン分類マッピング
const btnClassifyMap = {
"1歳児": "0~2歳",
"2歳児": "0~2歳",
"3歳児": "3~5歳",
"4歳児": "3~5歳",
"5歳児": "3~5歳",
"5歳児": "3~5歳",
}
// アクションマッピング
const actionMap = {
"担任作成中": `指導教諭確認依頼${classifyField}`,
"指導教諭確認中": `承認する`,
"主幹確認中": `承認する`,
"園長確認中": `承認する${classifyField}`
}
/**
* ステータスから接頭辞を取得する
* @param {string} status - ステータス文字列
*/
const getStatusPrefix = (status) => {
return status.split("")[0];
};
// kintoneイベントの登録
kintone.events.on("app.record.index.show", (event) => {
// 特定のビューの場合のみ処理を実行
if (event.viewId === mineView) {
// BatchApprovalHandlerクラスのインスタンスを作成
const batchApproval = new BatchApprovalHandler(
mineView,
classifyField,
btnClassifyMap,
actionMap,
getStatusPrefix,
_StatusFieldMap
);
// 一括承認ボタンを作成
batchApproval.createApproveBtn();
}
return event;
});
})();

File diff suppressed because one or more lines are too long

2433
src/4.保育計画 週案/kuc.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -5,7 +5,8 @@
"app.record.create.show",
"app.record.edit.show",
"app.record.create.change.担任",
"app.record.edit.change.担任"
"app.record.edit.change.担任",
"app.record.index.edit.change.担任"
];
kintone.events.on(events, function(event) {

View File

@@ -9,6 +9,8 @@
'完了5週目': '園長',
}
window._StatusFieldMap = statusFieldMap
kintone.events.on("app.record.detail.process.proceed", (event) => {
const field = statusFieldMap[event.nextStatus.value];
if (field) {

View File

@@ -0,0 +1,154 @@
(function () {
"use strict";
// マイビューのID
const mineView = 8352036;
// 分類フィールドのプレースホルダー
const classifyField = "${classify}";
// ボタン分類マッピング
const btnClassifyMap = {
"0歳児": "0~2歳",
"1歳児": "0~2歳",
"2歳児": "0~2歳",
"3歳児": "3~5歳",
"4歳児": "3~5歳",
"5歳児": "3~5歳",
}
// アクションマッピング
const actionMap = {
"担任作成中": `指導教諭確認依頼(${classifyField}`,
"指導教諭確認中": `承認する`,
"園長確認中": `承認する(${classifyField}`
}
// ダイアログ要素と次のステータスを格納する変数
let askDialogEl;
let nextStatus;
// 次のステータスのテンプレートオブジェクト
const nextStatusTemplate = {
"next": `承認する(${classifyField}、5週目作成依頼`,
"end": `承認する(${classifyField}、完了)`
}
/**
* ステータスから接頭辞を取得する
* @param {string} status - ステータス文字列
*/
const getStatusPrefix = (status) => {
return status.split("")[0];
};
// kintoneイベントの登録
kintone.events.on("app.record.index.show", (event) => {
// 特定のビューの場合のみ処理を実行
if (event.viewId === mineView) {
// BatchApprovalHandlerクラスのインスタンスを作成
const batchApproval = new BatchApprovalHandler(
mineView,
classifyField,
btnClassifyMap,
actionMap,
getStatusPrefix,
_StatusFieldMap,
"担当学年"
);
// 元のgetActionNameメソッドを保存
const originalGetActionName = batchApproval.getActionName;
// getActionNameメソッドをオーバーライド
batchApproval.getActionName = function (record) {
const status = record.ステータス.value;
// 「園長確認中4週目」以外のステータスは元の処理を実行
if (status !== '園長確認中4週目') {
return originalGetActionName.call(this, record);
}
// 週目に応じて異なるステータスに遷移する場合、ユーザーに選択させる
if (!nextStatus) {
askNextStatus(batchApproval)
batchApproval.stopProcess();
return
}
return getSpecialActionName(record);
};
// 一括承認ボタンを作成
batchApproval.createApproveBtn();
}
return event;
});
/**
* 特殊なアクション名を取得する
* @param {Object} record - レコードオブジェクト
* @returns {string} アクション名
*/
function getSpecialActionName(record) {
const template = nextStatusTemplate[nextStatus];
const yearStr = record.担当学年.value || '';
const btnClassify = btnClassifyMap[yearStr] || '';
return template.replaceAll(classifyField, btnClassify);
}
/**
* 次のステータスをユーザーに問い合わせる
* @param {Object} batchApproval - BatchApprovalHandlerインスタンス
*/
function askNextStatus(batchApproval) {
askDialogEl = new Kuc.Dialog({
title: '一括承認を一時停止',
content: makeDialog(batchApproval),
footerVisible: false
});
askDialogEl.open();
return '';
}
/**
* ダイアログ内容を作成する
* @param {Object} batchApproval - BatchApprovalHandlerインスタンス
* @returns {HTMLElement} ダイアログのコンテンツ要素
*/
function makeDialog(batchApproval) {
const contentEl = document.createElement('div');
contentEl.innerHTML = `
<p>
「園長確認中4週目」の記録について、次のステータスを選択してください
</p>
`;
const divEl = document.createElement('div');
divEl.style.textAlign = 'center';
// 5週目作成依頼ボタン
const nextButton = new Kuc.Button({
text: '承認する5週目作成依頼',
type: 'submit',
});
nextButton.style.paddingRight = '16px';
nextButton.addEventListener('click', (event) => {
askDialogEl.close();
nextStatus = "next";
batchApproval.handleApproveData()
});
divEl.appendChild(nextButton);
// 完了ボタン
const endButton = new Kuc.Button({
text: '承認する(完了)',
type: 'submit',
});
endButton.addEventListener('click', (event) => {
askDialogEl.close();
nextStatus = "end";
batchApproval.handleApproveData()
});
divEl.appendChild(endButton);
contentEl.appendChild(divEl);
return contentEl;
}
})();

View File

@@ -1,6 +1,8 @@
(function () {
"use strict";
const APP_ENV = env["個別配慮"];
// 20250911に追加された、月次サフィックスを持つフィールドのリスト
const monthlyField = ['子どもの姿', '保育者援助_配慮_環境構成', '反省_評価', '主幹', '園長', '担任', '指導']
kintone.events.on("app.record.index.show", (event) => {
const headerSpace = getHeaderSpace('single-label-line');
@@ -23,27 +25,58 @@
showError(false);
const api = new KintoneRestAPIClient();
const monthNumber = Number(month);
const yearNumber = Number(year);
// 本アプリからデータを読み取る
const currentAppRecords = await getRecords(api, year, month);
const currentAppRecords = await getYearlyRecords(api, yearNumber, monthNumber);
if (!currentAppRecords) {
// エラー
loading(false);
return e;
}
const eachChildUniqueRecord = {};
// 各児童の最新の記録を取得する(日付フィールドに基づく)
for (const record of currentAppRecords) {
const key = record['園児ユニークキー'].value;
const existData = eachChildUniqueRecord[key];
if (!existData || existData['日付'].value < record['日付'].value) {
eachChildUniqueRecord[key] = record;
}
}
const records = Object.values(eachChildUniqueRecord);
// 指定された月のデータを、月次サフィックスのないフィールドにマッピングする「子どもの姿_5月」=>「子どもの姿」)
// 既存のコード(元々は月次サフィックスのないフィールドを使用)を極力変更しないようにするため
// 4月のデータはデフォルトで月次サフィックスのないフィールドに格納されているため、4月の処理はスキップする
if (monthNumber !== 4) {
for (const field of monthlyField) {
for (const record of records) {
record[field].value = record[`${field}_${monthNumber}`].value;
}
}
}
const excelName = APP_ENV.excelName;
await createExcelAndDownload({
api,
excelName,
exportName: getExcelName(excelName, year + month),
bizLogic: writeExcel(currentAppRecords, year, month),
bizLogic: writeExcel(records, year, month),
});
loading(false);
}
async function getRecords(api, year, month) {
const firstDate = getFormatDateString(year, month, 1)
const lastDate = getFormatDateString(getLastDate(year, month));
async function getYearlyRecords(api, year, month) {
let fromYear = year;
let toYear = year;
if (month < 4) {
fromYear--;
} else {
toYear++;
}
const firstDate = getFormatDateString(fromYear, 4, 1)
const lastDate = getFormatDateString(getLastDate(toYear, 3));
try {
return await api.record.getAllRecordsWithId({
app: env["個別配慮"].appId,
@@ -123,7 +156,6 @@
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;

View File

@@ -63,6 +63,8 @@
'完了': '園長_3月'
}
window._StatusFieldMap = statusFieldMap
kintone.events.on("app.record.detail.process.proceed", (event) => {
const field = statusFieldMap[event.nextStatus.value];
if (field) {

View File

@@ -0,0 +1,54 @@
(function () {
"use strict";
// マイビューのID
const mineView = 13352233;
// 分類フィールドのプレースホルダー
const classifyField = "${classify}";
// ボタン分類マッピング
const btnClassifyMap = {
"0歳児": "0~2歳",
"1歳児": "0~2歳",
"2歳児": "0~2歳",
"3歳児": "3~5歳",
"4歳児": "3~5歳",
"5歳児": "3~5歳",
}
// アクションマッピング
const actionMap = {
"担任作成中": `指導教諭確認依頼${classifyField}`,
"指導教諭確認中": `承認する`,
"園長確認中": `承認する${classifyField}`
}
/**
* ステータスから接頭辞を取得する
* @param {string} status - ステータス文字列
*/
const getStatusPrefix = (status) => {
return status.split("")[0];
};
// kintoneイベントの登録
kintone.events.on("app.record.index.show", (event) => {
// 特定のビューの場合のみ処理を実行
if (event.viewId === mineView) {
// BatchApprovalHandlerクラスのインスタンスを作成
const batchApproval = new BatchApprovalHandler(
mineView,
classifyField,
btnClassifyMap,
actionMap,
getStatusPrefix,
_StatusFieldMap
);
// 一括承認ボタンを作成
batchApproval.createApproveBtn();
}
return event;
});
})();

File diff suppressed because one or more lines are too long

2433
src/8.学期反省・評価/kuc.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -9,19 +9,19 @@
return event;
});
kintone.events.on(["app.record.create.change.担当1","app.record.edit.change.担当1"], function(event) {
kintone.events.on(["app.record.create.change.担当1","app.record.edit.change.担当1", "app.record.index.edit.change.担当1"], function(event) {
var record = event.record;
record.担任1.value = record.担当1.value.map(function(user) {return user.name}).join(",");
return event;
});
kintone.events.on(["app.record.create.change.担当2","app.record.edit.change.担当2"], function(event) {
kintone.events.on(["app.record.create.change.担当2","app.record.edit.change.担当2", "app.record.index.edit.change.担当2"], function(event) {
var record = event.record;
record.担任2.value = record.担当2.value.map(function(user) {return user.name}).join(",");
return event;
});
kintone.events.on(["app.record.create.change.担当3","app.record.edit.change.担当3"], function(event) {
kintone.events.on(["app.record.create.change.担当3","app.record.edit.change.担当3", "app.record.index.edit.change.担当3"], function(event) {
var record = event.record;
record.担任3.value = record.担当3.value.map(function(user) {return user.name}).join(",");
return event;

View File

@@ -10,6 +10,8 @@
'完了3学期': '園長3',
}
window._StatusFieldMap = statusFieldMap
kintone.events.on("app.record.detail.process.proceed", (event) => {
const field = statusFieldMap[event.nextStatus.value];
if (field) {

View File

@@ -0,0 +1,54 @@
(function () {
"use strict";
// マイビューのID
const mineView = 13352759;
// 分類フィールドのプレースホルダー
const classifyField = "${classify}";
// ボタン分類マッピング
const btnClassifyMap = {
"0歳児": "0~2歳",
"1歳児": "0~2歳",
"2歳児": "0~2歳",
"3歳児": "3~5歳",
"4歳児": "3~5歳",
"5歳児": "3~5歳",
}
// アクションマッピング
const actionMap = {
"担任作成中": `指導教諭確認依頼${classifyField}`,
"指導教諭確認中": `承認する`,
"園長確認中": `承認する${classifyField}`
}
/**
* ステータスから接頭辞を取得する
* @param {string} status - ステータス文字列
*/
const getStatusPrefix = (status) => {
return status.split("")[0];
};
// kintoneイベントの登録
kintone.events.on("app.record.index.show", (event) => {
// 特定のビューの場合のみ処理を実行
if (event.viewId === mineView) {
// BatchApprovalHandlerクラスのインスタンスを作成
const batchApproval = new BatchApprovalHandler(
mineView,
classifyField,
btnClassifyMap,
actionMap,
getStatusPrefix,
_StatusFieldMap
);
// 一括承認ボタンを作成
batchApproval.createApproveBtn();
}
return event;
});
})();

View File

@@ -8,56 +8,17 @@
## 1.園児別出欠簿入力
**管理画面URL**: [https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=19](https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=19)
| 削除 | | 新規(更新) |
| --- | --- | --- |
| `utils.js` | → | `utils.js` |
| `main.js` | → | `main.js` |
| `ExtractHandler.js` | → | `ExtractHandler.js` |
| 削除 | | 新規(更新) |
| ------------------------ | - | --- |
| `utils.js` | → | `utils.js` |
| `ExtractHandler.js` | → | `ExtractHandler.js` |
| `detail-page-desktop.js` | → | `detail-page-desktop.js` |
| | | `processStateHandler.js` |
## 10.個別支援計画
**管理画面URL**: [https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=37](https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=37)
| 削除 | | 新規(更新) |
| --- | --- | --- |
| | | `pvc.main.js` |
| | | `processStateHandler.js` |
## 0,1歳日誌出力用
**管理画面URL**: [https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=47](https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=47)
| 削除 | | 新規(更新) |
| --- | --- | --- |
| `utils.js` | → | `utils.js` |
| `main.js` | → | `main.js` |
| | | `processStateHandler.js` |
## 2歳以上日誌出力用
**管理画面URL**: [https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=48](https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=48)
| 削除 | | 新規(更新) |
| --- | --- | --- |
| `utils.js` | → | `utils.js` |
| `main.js` | → | `main.js` |
| | | `processStateHandler.js` |
## 2.保育計画 月案0歳児用
**管理画面URL**: [https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=77](https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=77)
| 削除 | | 新規(更新) |
| --- | --- | --- |
| `env.js` | | `processStateHandler.js` |
| `main.js` | | |
**スマートフォン用のJavaScript / CSSファイル** を削除してください。
| 削除(スマートフォン用) |
@@ -70,11 +31,6 @@
## 3.保育計画 月案
**管理画面URL**: [https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=17](https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=17)
| 削除 | | 新規(更新) |
| --- | --- | --- |
| `env.js` | | `processStateHandler.js` |
| `main.js` | | |
**スマートフォン用のJavaScript / CSSファイル** を削除してください。
| 削除(スマートフォン用) |
@@ -87,11 +43,6 @@
## 4.保育計画 週案
**管理画面URL**: [https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=18](https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=18)
| 削除 | | 新規(更新) |
| --- | --- | --- |
| `env.js` | | `processStateHandler.js` |
| `main.js` | | |
**スマートフォン用のJavaScript / CSSファイル** を削除してください。
| 削除(スマートフォン用) |
@@ -104,24 +55,22 @@
## 6.個別配慮
**管理画面URL**: [https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=23](https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=23)
| 削除 | | 新規(更新) |
| --- | --- | --- |
| `utils.js` | → | `utils.js` |
| 削除 | | 新規(更新) |
| --------- | - | --- |
| `main.js` | → | `main.js` |
| | | `processStateHandler.js` |
## 7.園児台帳
**管理画面URL**: [https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=16](https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=16)
| 削除 | | 新規(更新) |
| --- | --- | --- |
| `main.js` | | `KintoneRestAPIClient.min.js` |
| | \| | `kuc.min.js` |
| | \| | `env.js` |
| | \| | `utils.js` |
| | ↳ | `main.js` |
| 削除 | | 新規(更新) |
| --------- | -- | --- |
| `main.js` | | `KintoneRestAPIClient.min.js` |
| | │ | `kuc.min.js` |
| | │ | `env.js` |
| | │ | `utils.js` |
| | └▸ | `main.js` |
**スマートフォン用のJavaScript / CSSファイル** を削除してください。
@@ -134,11 +83,6 @@
## 8.学期反省・評価
**管理画面URL**: [https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=49](https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=49)
| 削除 | | 新規(更新) |
| --- | --- | --- |
| `env.js` | | `processStateHandler.js` |
| `main.js` | | |
**スマートフォン用のJavaScript / CSSファイル** を削除してください。
| 削除(スマートフォン用) |
@@ -152,9 +96,9 @@
**管理画面URL**: [https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=41](https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=41)
| 削除 | | 新規(更新) |
| --- | --- | --- |
| | | `main.js` |
| | | `main.css` |
| --- | - | --- |
| | | `main.js` |
| | | `main.css` |
**フォーム更新**:
- スペース追加「calendar-area」

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

View File

@@ -0,0 +1,154 @@
# 【新機能用ファイルアップロード】
以下の各アプリのカスタマイズ画面から、**新機能対応** ファイルをアップロードしてください。
> 「(作業者が自分)」一覧にて、「一括承認」ボタンを作成する。
> ![success.png](./success.png)
## 1.園児別出欠簿入力
**管理画面URL**: [https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=19](https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=19)
| 削除 | 新規(更新) | ファイル |
| -------------- | ------------------------- | --- |
| ~~`utils.js`~~ | `src/` | `pvc.utils.js` |
| ~~`main.js`~~ | `src/1.園児別出欠簿入力/` | `pvc.main.js` |
| | `src/1.園児別出欠簿入力/` | `pvc.processAutoUpdate.js` |
## 10.個別支援計画
**管理画面URL**: [https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=37](https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=37)
| 削除 | 新規(更新) | ファイル |
| --- | ----------------------- | --- |
| | `src/10.個別支援計画/` | `KintoneRestAPIClient.min.js` |
| | `src/10.個別支援計画/` | `kuc.min.js` |
| | `src/` | `pvc.utils.js` |
| | `src/` | `pvc.ProcessBatchApprovalHandler.js` |
| | `src/10.個別支援計画/` | `pvc.main.js` |
| | `src/10.個別支援計画/` | `pvc.processAutoUpdate.js` |
| | `src/10.個別支援計画/` | `pvc.processBatchApproval.js` |
## 0,1歳日誌出力用
**管理画面URL**: [https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=47](https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=47)
| 削除 | 新規(更新) | ファイル |
| -------------- | -------------------------- | --- |
| ~~`utils.js`~~ | `src/` | `pvc.utils.js` |
| ~~`main.js`~~ | `src/0,1歳日誌出力用/` | `pvc.main.js` |
| | `src/0,1歳日誌出力用/` | `pvc.processAutoUpdate.js` |
## 2歳以上日誌出力用
**管理画面URL**: [https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=48](https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=48)
| 削除 | 新規(更新) | ファイル |
| -------------- | ---------------------------- | --- |
| ~~`utils.js`~~ | `src/` | `pvc.utils.js` |
| ~~`main.js`~~ | `src/2歳以上日誌出力用/` | `pvc.main.js` |
| | `src/2歳以上日誌出力用/` | `pvc.processAutoUpdate.js` |
## 2.保育計画 月案0歳児用
**管理画面URL**: [https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=77](https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=77)
| 削除 | 新規(更新) | ファイル |
| ----------------- | ----------------------- | --- |
| ~~`env.js`~~ | `src/2.保育計画 月案0歳児用/` | `KintoneRestAPIClient.min.js` |
| ~~`main.js`~~ | `src/2.保育計画 月案0歳児用/` | `kuc.min.js` |
| ~~`pvc.main.js`~~ | `src/` | `pvc.utils.js` |
| | `src/` | `pvc.ProcessBatchApprovalHandler.js` |
| | `src/2.保育計画 月案0歳児用/` | `pvc.main.js` |
| | `src/2.保育計画 月案0歳児用/` | `pvc.processAutoUpdate.js` |
| | `src/2.保育計画 月案0歳児用/` | `pvc.processBatchApproval.js` |
## 3.保育計画 月案
**管理画面URL**: [https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=17](https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=17)
| 削除 | 新規(更新) | ファイル |
| ----------------- | ----------------------- | --- |
| ~~`env.js`~~ | `src/3.保育計画 月案/` | `KintoneRestAPIClient.min.js` |
| ~~`main.js`~~ | `src/3.保育計画 月案/` | `kuc.min.js` |
| ~~`pvc.main.js`~~ | `src/` | `pvc.utils.js` |
| | `src/` | `pvc.ProcessBatchApprovalHandler.js` |
| | `src/3.保育計画 月案/` | `pvc.main.js` |
| | `src/3.保育計画 月案/` | `pvc.processAutoUpdate.js` |
| | `src/3.保育計画 月案/` | `pvc.processBatchApproval.js` |
## 4.保育計画 週案
**管理画面URL**: [https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=18](https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=18)
| 削除 | 新規(更新) | ファイル |
| ----------------- | ----------------------- | --- |
| ~~`env.js`~~ | `src/4.保育計画 週案/` | `KintoneRestAPIClient.min.js` |
| ~~`main.js`~~ | `src/4.保育計画 週案/` | `kuc.min.js` |
| ~~`pvc.main.js`~~ | `src/` | `pvc.utils.js` |
| | `src/` | `pvc.ProcessBatchApprovalHandler.js` |
| | `src/4.保育計画 週案/` | `pvc.main.js` |
| | `src/4.保育計画 週案/` | `pvc.processAutoUpdate.js` |
| | `src/4.保育計画 週案/` | `pvc.processBatchApproval.js` |
> 「(作業者が自分)」一覧で「一括承認」ボタンをクリックしたとき
>
> 「4.保育計画 週案」で分岐が発生する場合、ユーザーに選択させるダイアログがポップアップ表示されます
>
> ![branch.png](./branch.png)
## 6.個別配慮
**管理画面URL**: [https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=23](https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=23)
| 削除 | 新規(更新) | ファイル |
| -------------- | ------------------ | --- |
| ~~`utils.js`~~ | `src/` | `pvc.utils.js` |
| ~~`main.js`~~ | `src/` | `pvc.ProcessBatchApprovalHandler.js` |
| | `src/6.個別配慮/` | `pvc.main.js` |
| | `src/6.個別配慮/` | `pvc.processAutoUpdate.js` |
| | `src/6.個別配慮/` | `pvc.processBatchApproval.js` |
>
> ### 「6.個別配慮」項目におけるデータ修正のお願い
>
> 「個別配慮」項目において、各園児につき年間1件のデータ記録を保持し、かつ、該当する月のマッピング項目にデータが正しく記録される状態にすることです。
>
> #### データ処理のロジックについて
>
> システム側で以下のロジックに則ってデータの読み取りと選択を行います。ご確認いただき、データの準備にご協力ください。
>
> 1. **年度内データの読み取り**
> 対象期間内のすべてのデータを読み取ります。
> * **例**: `「入力開始日付当月1日」 > '2025/03/31' AND < '2026/04/01'`
>
> 2. **最新データの選択(園児ごと)**
> 同一園児に複数のデータ記録が存在する場合、最新の日付のデータを1件選択します。
> * **例**: 8月1日と9月1日のデータがある場合、9月1日のデータを選択します。
>
> 3. **月次マッピング項目からのデータ抽出**
> 選択されたデータから、指定された月のマッピング項目のデータを抽出します。
> * **例**: 9月のデータを出力する場合、そのデータ内の「子供の姿_9月」項目から情報を抽出します。
>
## 8.学期反省・評価
**管理画面URL**: [https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=49](https://sagamikouseikai.cybozu.com/k/admin/app/customize?app=49)
| 削除 | 新規(更新) | ファイル |
| ----------------- | ----------------------- | --- |
| ~~`env.js`~~ | `src/8.学期反省・評価/` | `KintoneRestAPIClient.min.js` |
| ~~`main.js`~~ | `src/8.学期反省・評価/` | `kuc.min.js` |
| ~~`pvc.main.js`~~ | `src/` | `pvc.utils.js` |
| | `src/` | `pvc.ProcessBatchApprovalHandler.js` |
| | `src/8.学期反省・評価/` | `pvc.main.js` |
| | `src/8.学期反省・評価/` | `pvc.processAutoUpdate.js` |
| | `src/8.学期反省・評価/` | `pvc.processBatchApproval.js` |

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB