ken_nogi/Pleasanter/営業積算システム/docs/新・営業積算システム仕様書_分割/057_新・営業積算システム仕様書_別記資料スクリプト(27/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.2 KiB
Raw Permalink Blame History

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

// ...(前ファイルからの続き)
            let targetUrl = baseUrl + '/items/' + parentId;
            window.location.href = targetUrl;
            break;
        default:
            console.log('processScript: 未対応のプロセス名です: ' + procName);
            return false;
    }

    // プロセス実行
    $p.execProcess($btn);

    //プロセス側で設定した入力検証ValidateInputsが未入力エラーになった場合、
    //Pleasanterが対象項目へ<label id="Results_XXX-error" class="error" for="Results_XXX">入力必須項目です。</label>を
    //動的追加する。これを拾い、for属性から通常のフィールドラベルclass="error"でない方)を逆引きして
    //まとめて下部にアラート表示する(必須項目名はスクリプト内にハードコードしない)
    setTimeout(function () {
        let $errorLabels = $('label.error[id$="-error"]');
        if ($errorLabels.length) {
            let labelTexts = [];
            $errorLabels.each(function () {
                let forAttr = $(this).attr('for');
                let $fieldLabel = $('label[for="' + forAttr + '"]').not('.error').first();
                labelTexts.push($fieldLabel.length ? $fieldLabel.text().trim() : forAttr);
            });
            $p.ex.setMyMessage('new-status-red', labelTexts.join('、') + ' は必須項目です。入力してください。');
        }
    }, 300);

}

//----------------------------------------------------------------------
//日付項目(dateColumn)に本日日付、ユーザー項目(userColumn)にログインユーザーを設定する。
//以前はProcess側の「データの変更」機能で設定していたが、その反映サーバー側はexecProcess後になり、
//先に動くbefore_validate側のログ転記処理saveReasonLog/saveCalculateLog等が値を取得できず欠落する
//不具合があったため、execProcess呼び出し前にクライアント側で直接設定するここへ移設した
$p.ex.setTodayAndUser = function (dateColumn, userColumn) {
    let now = new Date();
    let dateStr = now.getFullYear() + '/' + (now.getMonth() + 1).toString().padStart(2, '0') + '/' + now.getDate().toString().padStart(2, '0');
    $p.set($('#Results_' + dateColumn), dateStr);
    $p.set($('#Results_' + userColumn), $p.userId());
}

//----------------------------------------------------------------------
//ClassG現在の進捗が「1:承認図後・着工中」の場合、ClassH現場の進捗・ClassI必要な見積金額//DescriptionA問い合わせ経緯が未入力ならアラート表示プロセス実行自体をブロックする
//「新規依頼」プロセス実行前のみ呼ばれる新規依頼以降はStatusControlsによりClassG/H/Iが読取専用化されるため、01_基本スクリプト.jsのbefore_validateからここへ移設
$p.ex.checkClassGRequiredFields = function () {
    if ($('#Results_ClassG').val() == '1') {
        let emptyLabels = [];
        if (!$('#Results_ClassH').val()) emptyLabels.push('現場の進捗');
        if (!$('#Results_ClassI').val()) emptyLabels.push('必要な見積金額');
        if (!$('#Results_DescriptionA').val()) emptyLabels.push('問い合わせ経緯');

        if (emptyLabels.length > 0) {
            window.alert(emptyLabels.join('、') + ' は必須項目です。入力してください。');
            return false;
        }
    }
    return true;
}

serverscripts/0_子番自動保存スクリプト.js.js

/*
@config :
@filename : 子番自動保存スクリプト.js
@title : 子番自動保存スクリプト
@name :
@siteIds :
@siteTitles : 問合せ内容管理
@disabled: false
*/

try {
    setSubNumber();
} catch (error) {
    context.Log(error);
}

//新規作成直後(自動採番=ClassX確定後にClassXから子番ClassBを算出しDBへ保存する。
//クライアント側 $p.setSubNumberscripts/1_01_基本スクリプト.js.jsと同じロジック・同じガードをサーバー側にも実装し、
//「編集画面を開かない限りClassBがDBへ保存されない」不具合に対応する。
function setSubNumber() {
    let classX = model.ClassX;
    if (!classX) {
        context.Log('[子番自動保存] ClassXが空のためスキップしました。ResultId=' + model.ResultId);
        return;
    }

    let subNumber = classX.split('-')[1]; //管理番号を「-」で分割して子番を取得
    if (subNumber && subNumber !== model.ClassB) {
        model.ClassB = subNumber;
        model.UpdateOnExit = true; //スクリプト終了時に現在のレコード情報を自動保存
        context.Log('[子番自動保存] ClassBを保存しました。ResultId=' + model.ResultId + ' ClassB=' + subNumber);
    }
}

serverscripts/1_祝日リスト取得スクリプト.js.js