evmtools-node
Version:
このライブラリは、プライムブレインズ社で利用している「進捗管理ツール(Excel)」ファイルを読み込み、 プロジェクトの進捗状況や要員別の作業量を可視化するためのライブラリです。
138 lines • 4.84 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.formatRelativeDays = exports.formatRelativeDaysNumber = exports.minDate = exports.maxDate = exports.dateStr = exports.generateBaseDates = void 0;
exports.printTaskNodes = printTaskNodes;
exports.printTaskRows = printTaskRows;
exports.printTask = printTask;
exports.isHoliday = isHoliday;
const logger_1 = require("../logger");
const logger = (0, logger_1.getLogger)('common/utils');
/**
* FROM/TOの日付を渡して、日付配列を作る。今のところJSTで作成する事
* @param from 例 new Date('2025-06-01T00:00:00+09:00'),
* @param to 例 new Date('2025-06-30T00:00:00+09:00')
* @returns
*/
const generateBaseDates = (from, to) => {
const dates = [];
const current = new Date(from); // from を複製
while (current <= to) {
dates.push(new Date(current)); // コピーして格納
current.setDate(current.getDate() + 1); // 1日進める
}
return dates;
};
exports.generateBaseDates = generateBaseDates;
/**
* date をyyyy/mmdd表記する
* @param date
* @returns
*/
const dateStr = (date) => {
if (!date)
return '';
return date.toLocaleString('ja-JP', {
timeZone: 'Asia/Tokyo',
year: 'numeric',
month: '2-digit',
day: '2-digit',
});
};
exports.dateStr = dateStr;
function printTaskNodes(taskNodes, baseDates) {
// TaskNode自体が Iterable なので、rootTaskごとにIterateする
for (const rootTask of taskNodes) {
// rootTaskごとにfor文を回せば良い
for (const row of rootTask) {
printTask(row, baseDates);
}
}
}
function printTaskRows(rows, baseDates) {
for (const row of rows) {
printTask(row, baseDates);
}
}
function printTask(row, baseDates) {
if (!row.isLeaf)
return;
console.log('-----');
console.log('row.id', 'row.name', 'row.isLeaf', 'baseDateDisp', 'row.calculatePV(baseDate)', 'row.calculatePVs(baseDate)'
// baseDatesn,
// 'baseDate'
);
for (const baseDate of baseDates) {
// const baseDatesn = date2Sn(baseDate)
const baseDateDisp = (0, exports.dateStr)(baseDate);
console.log(row.id, row.name, row.isLeaf, baseDateDisp, row.calculatePV(baseDate), row.calculatePVs(baseDate)
// baseDatesn,
// baseDate
);
}
}
/**
* Date配列を引数にとり、MaxやMinを選んで返す
*
* @param dates
* @param maxOrMinDate
* @returns
*/
const maxOrMinDate = (dates, maxOrMinDate) => {
const datesNum = dates
.filter((date) => !(date === undefined))
.map((date) => date.getTime());
return datesNum.length > 0 ? new Date(maxOrMinDate(...datesNum)) : undefined;
};
const maxDate = (dates) => maxOrMinDate(dates, Math.max);
exports.maxDate = maxDate;
const minDate = (dates) => maxOrMinDate(dates, Math.min);
exports.minDate = minDate;
/**
* baseDate(基準日) に比べて targetDate(おもに期限) が何日後かを計算して返す
* base 2025/07/19 target 2025/07/18 => -1
* @param baseDate
* @param targetDate
* @param locale
* @returns
*/
const formatRelativeDaysNumber = (baseDate, targetDate) => {
if (!baseDate || !targetDate)
return undefined;
const base = new Date(baseDate);
const target = new Date(targetDate);
const diffMs = target.getTime() - base.getTime();
const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));
return diffDays;
};
exports.formatRelativeDaysNumber = formatRelativeDaysNumber;
/**
* baseDate(基準日) に比べて targetDate(おもに期限) が何日後かを計算して返す
* (文字列で)
* base 2025/07/19 target 2025/07/18 => -1
* @param baseDate
* @param targetDate
* @param locale
* @returns
*/
const formatRelativeDays = (baseDate, targetDate, locale = 'ja') => {
const diffDays = (0, exports.formatRelativeDaysNumber)(baseDate, targetDate);
if (diffDays === undefined)
return undefined;
const rtf = new Intl.RelativeTimeFormat(locale, { numeric: 'auto' });
return rtf.format(diffDays, 'day'); // "in 3 days" → "3日後"
};
exports.formatRelativeDays = formatRelativeDays;
function isHoliday(date, project) {
const day = date.getDay(); // 0: 日, 6: 土
const isWeekend = day === 0 || day === 6;
// Projectが保持する holidayDatasに同じ日付のデータがあれば祝日
const isProjectHoliday = project?.holidayDatas.some((d) => {
logger.debug(`Projectの祝日:${d.date.toDateString()}`);
return d.date.toDateString() === date.toDateString();
}) ?? false;
logger.debug(`weekend? ${isWeekend}`);
logger.debug(`holiday? ${isProjectHoliday}`);
return isWeekend || isProjectHoliday;
}
// if (!module.parent) { /* empty */ }
//# sourceMappingURL=utils.js.map