ken_nogi/Pleasanter/営業積算システム/docs/新・営業積算システム仕様書_分割/035_新・営業積算システム仕様書_別記資料スクリプト(5/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

4.8 KiB
Raw Blame History

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

// ...(前ファイルからの続き)
        fieldName.indexOf('Attachments') === 0 ? 'AttachmentsHash' :
        'ClassHash';
    return record[hashKey] ? record[hashKey][fieldName] : undefined;
}

//転記先1項目へ、上書きルールに従って値をセットする
//wasEmpty=true未選択→選択: 転記先が空の場合のみセット
//wasEmpty=false選択済み→別選択: 常にセット
//戻り値: 実際にセットした場合はtrue呼び出し元で連鎖転記の要否判定に使う
$p.applyLookupValue = function (toColumn, value, wasEmpty) {
    if (value === undefined || value === null || value === '') return false;
    let $target = $('#Results_' + toColumn);
    if (!$target.length) return false;
    if (wasEmpty && $target.val()) return false; //既存の手入力値を保持
    $p.set($target, value);
    return true;
}

//----------------------------------------------------------------------
//ClassYマスターシート、SiteId:189112選択時の転記
//重複チェックキーClass003姓カナ/Class004名カナ/Class022エリアも転記対象に含める。
//上書き可否はキー項目も含め全項目共通のwasEmptyルールに従うapplyLookupValue参照$p.classYFieldMap = [
    { from: 'ClassA', to: 'ClassZ' },
    { from: 'Class001', to: 'Class001' },
    { from: 'Class002', to: 'Class002' },
    { from: 'Class003', to: 'Class003' },
    { from: 'Class004', to: 'Class004' },
    { from: 'Class009', to: 'Class005' },
    { from: 'Class010', to: 'Class006' },
    { from: 'Class011', to: 'Class007' },
    { from: 'Class012', to: 'Class008' },
    { from: 'Class017', to: 'Class009' },
    { from: 'Class018', to: 'Class010' },
    { from: 'Class019', to: 'Class011' },
    { from: 'Class020', to: 'Class012' },
    { from: 'Class029', to: 'Class021' },
    { from: 'ClassW', to: 'Class022' },
    { from: 'Class033', to: 'Class023' },
    { from: 'Class040', to: 'Class024' },
    { from: 'Class043', to: 'Class025' },
    { from: 'ClassF', to: 'Class031' },
    { from: 'ClassG', to: 'Class032' },
    { from: 'ClassH', to: 'Class033' },
    { from: 'ClassI', to: 'Class034' },
    { from: 'ClassL', to: 'Class035' },
    { from: 'ClassK', to: 'Class036' },
    { from: 'ClassJ', to: 'Class037' },
    { from: 'Date063', to: 'Date001' },
    { from: 'DateH', to: 'Date002' }
];

$p.on('change', 'ClassY', function () {
    let newVal = $('#Results_ClassY').val();
    let wasEmpty = !previousLookupValues.ClassY;

    if (newVal) {
        $p.apiGet({
            'id': newVal,
            'async': false,
            'done': function (data) {
                if (!data.Response || !data.Response.Data || !data.Response.Data[0]) {
                    console.log('マスターシートのレコード取得に失敗しました');
                    $p.ex.setMyMessage('new-status-red', 'データの取得に失敗しました。営業積算へお問い合わせください');
                    return;
                }
                //Class022/023/031エリア・契約ブランド・契約営業所がClassY経由で更新された場合、
                //$p.setのtrigger('change')により各項目のchangeハンドラが連鎖発火し、
                //ClassM/ClassN/Class038への転記も自動的に行われる想定
                let record = data.Response.Data[0];
                $p.classYFieldMap.forEach(function (m) {
                    let value = $p.getApiRecordValue(record, m.from);
                    $p.applyLookupValue(m.to, value, wasEmpty);
                });

                //案件状況ClassSを契約コードClassZの転記結果に応じて自動判定
                $p.judgeClassS();
            },
            'fail': function (data) {
                console.log('マスターシートのレコード取得に失敗しました', data);
                $p.ex.setMyMessage('new-status-red', 'データの取得に失敗しました。営業積算へお問い合わせください');
            }
        });
    } else {
        //マスターシート選択解除 → 未契約
        $p.judgeClassS();
    }

    previousLookupValues.ClassY = newVal;
});

//----------------------------------------------------------------------
//案件状況ClassSの自動判定
//マスターシートClassY未選択の場合は未契約。選択済みの場合は、転記された契約コードClassZ//"9999AAABB"(未契約扱いのダミーコード)なら未契約、それ以外なら契約済みと判定する。
//自動判定後もClassS自体は通常項目のまま読取り専用化しないなので、手入力での変更を妨げない。
// ...(次ファイルへ続く)