UNPKG

evmtools-node

Version:

このライブラリは、プライムブレインズ社で利用している「進捗管理ツール(Excel)」ファイルを読み込み、 プロジェクトの進捗状況や要員別の作業量を可視化するためのライブラリです。

139 lines 4.94 kB
/** * CsvProjectCreator * * 仕様書: docs/specs/domain/CsvProjectCreator.spec.yaml * 要件ID: REQ-CSV-001 * * CSVファイルパスを受け取り、ファイルを読み込んでProjectを生成するアダプター */ import { Project } from '../domain/Project'; import { ProjectCreator } from '../domain/ProjectCreator'; /** * CsvProjectCreatorのオプション */ export type CsvProjectCreatorOptions = { /** * 文字エンコーディング * - 'utf-8': UTF-8 * - 'shift-jis': Shift-JIS (CP932) * - 'auto': 自動判定(デフォルト) */ encoding?: 'utf-8' | 'shift-jis' | 'auto'; }; /** * CSVファイルからProjectを生成するクラス * * 不変条件: * - INV-CSV-01: createProject()は常にProjectインスタンスを返す(エラー時は例外) * - INV-CSV-02: 戻り値のProjectは有効な状態(baseDate, taskNodes, holidayDatasが設定済み) * - INV-CSV-03: 生成されるtaskNodesは全てisLeaf=true */ export declare class CsvProjectCreator implements ProjectCreator { private _csvPath; private logger; private _encoding; /** * コンストラクタ * * @param csvPath CSVファイルの絶対パスまたは相対パス * @param options オプション設定 * * 事前条件: * - PRE-CSV-01: csvPathが有効なファイルパス * - PRE-CSV-02: 指定パスにCSVファイルが存在する * - PRE-CSV-03: ファイル名が規則に従う({name}_{yyyyMMdd}.csv) */ constructor(_csvPath: string, options?: CsvProjectCreatorOptions); /** * CSVファイルを読み込んでProjectオブジェクトを生成する * * 事後条件: * - POST-CSV-01: 戻り値のProjectにbaseDateが設定されている(ファイル名から抽出) * - POST-CSV-02: 戻り値のProjectにtaskNodesが設定されている(空配列可) * - POST-CSV-03: 戻り値のProjectのholidayDatasは空配列 * - POST-CSV-04: 全てのTaskNodeはisLeaf=true * - POST-CSV-05: 全てのTaskNodeはparentId=undefined * - POST-CSV-06: startDateはタスクの最小開始日、endDateは最大終了日 * * @returns Project * @throws ファイルが存在しない場合: "File not found: {path}" * @throws ファイル名パターン不一致: "Invalid filename format. Expected: {name}_{yyyyMMdd}.csv" * @throws CSV解析エラー: "Failed to parse CSV: {details}" */ createProject(): Promise<Project>; /** * yyyyMMdd形式の文字列からDateを生成 */ private parseDateFromString; /** * エンコーディング自動判定 * * BOM検出またはUTF-8の妥当性チェックで判定 * UTF-8として有効でない場合のみShift-JISとして処理 */ private detectEncoding; /** * BufferがUTF-8として有効かどうかをチェック */ private isValidUtf8; /** * BufferをエンコーディングでデコードしてstringにReturn */ private decodeBuffer; /** * CSVコンテンツをパースしてTaskRow[]を生成 * * ビジネスルール: * - BR-CSV-01: 進捗率が1より大きい場合、100で割って0-1に正規化 * - BR-CSV-02: タスクIDが空または数値でない行はスキップ(警告ログ出力) * - BR-CSV-03: 日付形式はyyyy/MM/ddまたはyyyy-MM-ddを許容 */ private parseCsv; /** * CSVの1行をパースしてカラム配列を返す * カンマ区切り、ダブルクォート対応 */ private parseCSVLine; /** * カラム配列からTaskRowを生成 * * CSV列マッピング: * 0: タスクID → id, sharp * 1: 名称 → name * 2: 担当 → assignee * 3: 予定工数 → workload * 4: 予定開始日 → startDate * 5: 予定終了日 → endDate * 6: 実績開始日 → actualStartDate * 7: 実績終了日 → actualEndDate * 8: 進捗率 → progressRate(0-1に正規化) * 9: 稼働予定日数 → scheduledWorkDays * 10: PV → pv * 11: EV → ev */ private createTaskRowFromColumns; /** * 文字列を数値にパース */ private parseNumber; /** * 日付文字列をパース * * BR-CSV-03: yyyy/MM/ddまたはyyyy-MM-ddを許容 */ private parseDate; /** * 進捗率を0-1に正規化 * * BR-CSV-01: 進捗率が1より大きい場合、100で割って0-1に正規化 */ private normalizeProgressRate; /** * 開始日〜終了日の稼働日をplotMapとして生成 * * 土日を除外した稼働日のみをプロット * 祝日はPhase 1では考慮しない(holidayDatasが空のため) */ private generatePlotMap; } //# sourceMappingURL=CsvProjectCreator.d.ts.map