ken_nogi/Pleasanter/営業積算システム/docs/新・営業積算システム仕様書_分割/032_新・営業積算システム仕様書_別記資料スクリプト(2/28).md
Kenichiro NOGI ce58cb4be4 初回コミット: dev配下(NodeSrv/Pleasanter等)をGitea管理下に統合
GitHub(nextgroup2706/ken_nogi)は今後使わず自社Gitea運用に切替え。
NodeSrvは旧リポジトリの履歴を破棄しファイルのみ統合(Dokploy用サービスアカウントは
別途mygit-admin/NodeSrv.gitに履歴あり)。notepmエクスポート(12GB)とPleasanter
インストーラzip(208MB)はサイズが大きいため.gitignoreで除外。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-04 15:37:06 +09:00

5.0 KiB
Raw Blame History

別記資料 スクリプトScripts全文 228

// ...(前ファイルからの続き)
    let str3 = $p.normalizeForDuplicationKey($('#Results_Class022').val());   //エリア
    let str4 = $('#Results_Class199').val() || '';   //重複許容(営業積算専用)
    $p.set($('#Results_Class200'), str1 + str2 + str3 + str4);   //重複チェック
}

//----------------------------------------------------------------------
//重複チェックキー用の文字列正規化
//カナ項目はClientRegexValidation^[ァ-ヶー0-0-9  ]+$)で全角カタカナ・長音・数字・スペース以外
//入力できない設計だが、半角カナはこの正規表現をすり抜けるため変換する。ひらがな・全角英数字の変換は
//保険通常入力では発生しないがAPI経由投入等に備える$p.normalizeForDuplicationKey = function (str) {
    if (!str) return '';
    let s = String(str);

    //半角カナ→全角カナ変換(濁点・半濁点合成)
    s = $p.halfKanaToFullKana(s);

    //ひらがな→全角カタカナ変換
    s = s.replace(/[ぁ-ゖ]/g, function (match) {
        return String.fromCharCode(match.charCodeAt(0) + 0x60);
    });

    //全角英数字→半角変換
    s = s.replace(/[---]/g, function (match) {
        return String.fromCharCode(match.charCodeAt(0) - 0xFEE0);
    });

    //半角スペース→全角スペースに統一
    s = s.replace(/ /g, ' ');

    //記号除去(氏名区切りとして使われる中黒「・」と長音「ー」は残す)
    s = s.replace(/[!-\/:-@\[-`{-~----]/g, function (match) {
        return (match === '・') ? match : '';
    });

    return s;
}

//半角カナ文字列を全角カナへ変換する(濁点・半濁点はゼロ幅文字゙゚として後続するため合成する)
$p.halfKanaToFullKana = function (str) {
    let kanaMap = {
        'ア': 'ア', 'イ': 'イ', 'ウ': 'ウ', 'エ': 'エ', 'オ': 'オ',
        'カ': 'カ', 'キ': 'キ', 'ク': 'ク', 'ケ': 'ケ', 'コ': 'コ',
        'サ': 'サ', 'シ': 'シ', 'ス': 'ス', 'セ': 'セ', 'ソ': 'ソ',
        'タ': 'タ', 'チ': 'チ', 'ツ': 'ツ', 'テ': 'テ', 'ト': 'ト',
        'ナ': 'ナ', 'ニ': 'ニ', 'ヌ': 'ヌ', 'ネ': 'ネ', 'ノ': '',
        'ハ': 'ハ', 'ヒ': 'ヒ', 'フ': 'フ', 'ヘ': 'ヘ', 'ホ': 'ホ',
        'マ': 'マ', 'ミ': 'ミ', 'ム': 'ム', 'メ': 'メ', 'モ': 'モ',
        'ヤ': 'ヤ', 'ユ': 'ユ', 'ヨ': 'ヨ',
        'ラ': 'ラ', 'リ': 'リ', 'ル': 'ル', 'レ': 'レ', 'ロ': 'ロ',
        'ワ': 'ワ', 'ヲ': 'ヲ', 'ン': 'ン',
        'ァ': 'ァ', 'ィ': 'ィ', 'ゥ': 'ゥ', 'ェ': 'ェ', 'ォ': 'ォ',
        'ッ': 'ッ', 'ャ': 'ャ', 'ュ': 'ュ', 'ョ': 'ョ', 'ー': 'ー'
    };
    let dakutenMap = { 'カ': 'ガ', 'キ': 'ギ', 'ク': 'グ', 'ケ': 'ゲ', 'コ': 'ゴ', 'サ': 'ザ', 'シ': 'ジ', 'ス': 'ズ', 'セ': 'ゼ', 'ソ': 'ゾ', 'タ': 'ダ', 'チ': 'ヂ', 'ツ': 'ヅ', 'テ': 'デ', 'ト': 'ド', 'ハ': 'バ', 'ヒ': 'ビ', 'フ': 'ブ', 'ヘ': 'ベ', 'ホ': 'ボ' };
    let handakutenMap = { 'ハ': 'パ', 'ヒ': 'ピ', 'フ': 'プ', 'ヘ': 'ペ', 'ホ': 'ポ' };

    let result = '';
    for (let i = 0; i < str.length; i++) {
        let ch = str[i];
        let next = str[i + 1];
        let full = kanaMap[ch];
        if (full === undefined) {
            result += ch;
            continue;
        }
        if (next === '゙' && dakutenMap[full]) {
            result += dakutenMap[full];
            i++;
        } else if (next === '゚' && handakutenMap[full]) {
            result += handakutenMap[full];
            i++;
        } else {
            result += full;
        }
    }
    return result;
}

//----------------------------------------------------------------------
//新規作成時の最終確認メッセージ(重複チェックキーは登録完了後に編集不可になるための警告)
$p.buildNewRecordKeyConfirmMessage = function () {
    let seiKana = $('#Results_Class003').val() || '(未入力)';
    let meiKana = $('#Results_Class004').val() || '(未入力)';
    let areaText = $('#Results_Class022 option:selected').text().trim() || '(未選択)';
    return '新規作成します。\n\n以下の内容は、登録完了処理後は変更できません。内容に間違いがないか最終確認をお願いします。\n\n施主氏名カナ' + seiKana + ' ' + meiKana + '\nエリア' + areaText + '\n\nよろしいですか';
}

//----------------------------------------------------------------------
//施主名をマージする
$p.mergeCustomerName = function () {
    //4つの項目を1つにマージする
    let str1 = $('#Results_Class001').val();   //施主1・姓
    let str2 = $('#Results_Class002').val();   //施主1・名
    let str3 = $('#Results_Class003').val();   //施主1・姓カナ
    let str4 = $('#Results_Class004').val();   //施主1・名カナ
// ...(次ファイルへ続く)