技術・販売指針情報
last update: Thu, 18 Jul 2024 08:50:45 GMT ( 9 months ago )

        SS Sophie のこと

        • SS-Sophie とは

        • SS-Sophie の技術情報

          • テーブル定義


            <資料1> 環境変数、取込フォーマットおよび Mongodb コレクション(mst.gp の type 含む)の定義:
          • テーブルの追加

            新規にコレクションを追加する場合は、インデックスを生成することで自動的にコレクションが追加されます。
            詳細な手順は以下です。
            ■正規手順
            1. RSD「[support] 工程管理表_sub」の適切な箇所に追加するコレクションとインデックスの情報を追記する。
             ※原則としてインデックスにはkaisha_cdと_flgを設定するようにしてください。
            2. 該当のプロジェクトの工程管理票の初期環境構築ツールを開く。
            3. 「インデックス生成」タブを開き、「状態確認」ボタンを実行してコンソールで差分を確認する。
            4. 差分に問題がなければ「再構築実行」ボタンで再構築をする。
            ■簡易手順
            1. 「File/Database Manager」でindexコマンドに引数を与えて実行することでインデックスを生成する。
          • インデックスの確認方法

            インデックスが最新かどうかを確認する方法は以下になります。
            (1)工程管理表を該当のプロジェクトで開く
            (2)緑色の「初期環境構築ツール」で 該当の会社コード のデータを修正編集にする
            (3)タブ「1.インデックスの生成」を開き「状態確認」を行う
             エラーがあればコンソールに出力されるので原因を確認する
            (4)確認ok と出れば完了。
          • 共通関数(発番)

            「発番ができません」のエラーが発生しているとき、コンソールにて以下のロジックを流すことで簡単に解決できます。
            ただし、FINAL に HATUBAN_KBN キーにて初期値が設定されているものに限ります。
            それ以外の発番区分は FINAL の設定から順次行う必要があります(システムとしてはない前提)
            var KBNs = [ 'AAA', 'BBB' ]; // 補完したい区分を設定
            var when = Promise.resolve();
            KBNs.forEach(kbn=>{ when = when.then(()=>{ return fn.DAO.issueAutoNum(kbn); });
            });
            when.then( ()=>console.log('OK') )['catch']( e=>console.error('NG', e) );
          • 共通関数(決算期取得)

            // 決算期取得用関数
            fn.async.getMdlKessanKi( mdl_kbn )
            fn.sync.getProcKessanKi( proc_ym ) // 利用例
            fn.async.getMdlKessanKi('hankan').then(r=>console.log(r)) // 今だったら 78
            fn.sync.getProcKessanKi( 201904 ) // 79 // 注意点
            過去の決算期は kaisha データに入っていることが前提
            未来はなくても自動算出
          • 共通定義(部表示のルール)

            部の表示については、期変わりによる組織変更と決算処理の関係上一定の時期においては過去部門を表示、新部門を表示する必要がある。
            その実装について以下のように定義するものとする

            <資料1> 期替わり前後_部門を持つ画面における部門の扱いについて:
            各画面における実装

            (共通関数)fn.async.showSoshikiDialog(main_style, kessan_ki, soshiki_kbn, mixin)
            本関数では、検索オプションとして以下を強制セットしている
            必要に応じて mixin オプションにて対応するものとする
             var search = { max_rec: 1000, required: [], fields: fields, searchOnShow: TRUE, mixin: fn.extend(TRUE, { selector: { "inv_flg": { $in: [FALSE, NULL] }, "kessan_ki": { $gte: kessan_ki }, "search.tags": "keihi=1" }, options: { sort: { "cd": 1 } } }, mixin || {}), };


            (各画面)
            画面のセットアップにおいて以下のように記述する

             "bu.cd": { fnkeys: refer(showSoshikiDialog), maxDigit: fn.fin('disp_keta.bu_cd'), dbName: "mst.soshiki", searchField: "cd", codeDom: [{"kessan_ki":"kessan_ki"}, {"soshiki_kbn":"soshiki_kbn"}], getField: ["ex_nm.s"], refDom: ["bu.nm"], initialValue: fn.mem("div.bu.cd"), modifyFilter: function(filter) { filter.kessan_ki = {$gte: book.value(wrapper_name, "kessan_ki")}; return filter; } }, "kessan_ki":{ initialValue: fn.mem("div.program.kessan_ki") }, "soshiki_kbn":{ initialValue: fn.fin("Data.SOSHIKI_KBN.BU") },
            ※ただし、経費系の入力画面、仕訳入力画面、入金・支払入力画面は個別に入力日付による制御をしている。 ・経費
            book.setup の modifyFilter は定義しない。

            showSoshikiDialogの呼び出し時にmixinとして以下を定義

             var mixin = {selector: {"kessan_ki": obj["kessan_ki"]}};
            ・仕訳入力画面、入金入力画面、支払入力画面
            book.setup の modifyFilter は定義しない。

            showSoshikiDialogの呼び出し時にmixinとして以下を定義

             {selector: {"kessan_ki": book.value(wrapper_name, "kessan_ki"),"search.tags": {$in: ["keihi=1","shiwake=1", NULL]} }}
          • 自動照合機能について

            本項目では、売上による売掛金、仕入による買掛金を外部から取得したデータを元に自動照合して消込する機能について記載します。
            • 仕組み

              ・買掛金の自動照合(主に住電)の流れ
              1)毎月月初に「仕入先締処理」により台帳データ(買掛金の消込データ)を出力
              2)毎月8日くらいまでに住電よりEDIとして買掛明細データがファイルとして送信されてくる
              3)ファイルサーバー上の所定のフォルダ(住電財務2)に請求.yyyymmddとして格納される
              4)「住電一括自動照合実行指示」画面にて全地区の台帳データと取り込んだEDIデータを突合する
              5)「買掛自動照合入力」画面にて、自動で照合された結果の確認とできなかったものの手動照合を行う
              6)同画面にて「金額集計」ボタンで消込予定金額を確認し、「照合額反映」ボタンにより支払データを更新する
              ※住電からの請求書の金額との突合

              ・売掛金の自動照合(ALPINE)の流れ
              1)毎月月初に「販売先締処理」により台帳データ(売掛金の消込データ)を出力
              2)毎月8日くらいまでにALPINEよりEDIとして売掛研修データがファイルとして送信されてくる
              3)ファイルサーバー上の所定のフォルダ(アルパイン2)に買掛明細.yyyymmddとして格納される
              4)「売掛自動照合入力」画面にて販売先にALPINEを選択し、「自動照合」ボタンにて台帳データと取り込んだ EDIデータを突合する
              5)同画面にて、自動で照合された結果の確認とできなかったものの手動照合を行う
              6)同画面にて「金額集計」ボタンで消込予定金額を確認し、「照合額反映」ボタンにより入金データを更新する

              ・売掛金の自動照合(富士通系)の流れ
              1)毎月月初に「販売先締処理」により台帳データ(売掛金の消込データ)を出力
              2)富士通の提供するウェブサイトより、研修データをダウンロードする(販売先ごと:現在は3ファイル)
              3)ファイルサーバー上の所定のフォルダ(富士通2)に買掛明細.yyyymmdd(A|B)として格納する(手動)
              4)「売掛自動照合入力」画面にて販売先に対象の販売先を選択し、「自動照合」ボタンにて台帳データと取り込んだ TSV(タブ区切り)データを突合する
              5)同画面にて、自動で照合された結果の確認とできなかったものの手動照合を行う
              6)同画面にて「金額集計」ボタンで消込予定金額を確認し、「照合額反映」ボタンにより入金データを更新する


            • EDIデータの取込みについて

              EDI処理と呼ばれるものは、クライアントのファイルサーバー上に、SynqueryEmbed をインストールし、スクリプトにより所定のフォルダより、未処理のファイルをすべて処理して、BKフォルダに移動する処理となります。

              図:SynqueryEmbedの構造


              (1)Gate-Way(ローカルの端末:ファイルサーバー等)の起動に合わせて SynqueryEmbed が起動します。
              (2)−1 Gate-Wayからクラウドへ接続と通知(自分の情報)を行います
              (2)−2 Gate-Wayからリレーサーバーへの接続と通知を行います。
              (3)クラウドは接続要求をしてきたGate-Wayの情報をデバイスリストに追加・更新します。
              (4)アプリケーションからGate-Wayの生存(alive)をリレーサーバーにチェックします。
              (5)リレーサーバーはアプリケーションより問合せされたGate-Wayの有無をチェックしその結果を返します。
              (6)生存が確認されたGate-Wayに対してデータ送受信が可能になります。
              (7)アプリケーションから送信されたコマンド、Gate-Wayから送信されたデータはリレーサーバーを通じてやりとりできるようになります。


              ※ SynqueryEmbed の機能を使えばクラウド上から、ファイルサーバーへのアクセスもできるようになります。


              • 格納先(プロジェクト)の指定
                三昌商事の環境においては、開発環境〜運用環境がいくつかあるため、EDI処理が実行された際にどのプロジェクト(環境)に取得したデータを格納するのかを定義する必要があります。

                ・マニュアル操作(コマンド発行)による方法

                ・初期環境設定ツールによる方法
                 三昌商事の場合は、「初期環境設定ツール」の「その他」タブにてコマンド送信をしてデータ等を参照できます。

                (初期環境設定ツール)

                ※環境の切り替えは、業務時間内には行わないでください!
                (取り込まれたデータが別のプロジェクト(DB)に取り込まれてしまいます。)
              • 格納先(テーブル)の定義
                三昌商事の環境においては、取り込んで処理をする対象のファイルが複数あるため、そのファイルの格納場所やファイル、取込みデータを格納するテーブルなどの定義が必要になります。
                その定義はfn.FINAL モジュールにあります。

              • EDIマスタの設定
                EDI処理を行う場合には、EDIデータとシステム内の販売先・仕入先を結びつける必要があります。
                これを管理しているのが以下の「EDIグループマスタ登録」画面になります。

                また、販売先・仕入先ごとにどのデータを「入力」するのか、「出力」するのかの定義をファイルごとに定義する必要があります。
                この定義をするのが以下の「EDI統一企業マスタ(販売先・仕入先)」になります。

            • 照合データの管理について

              照合は、台帳データとEDIのデータにて行われるが、全てが一致することはなく、数量違いや、単価違い等が存在し、それが同月内に解消しないことが基本となる。
              また、回収・支払の時期等によって、数ヶ月間その状態で止まることも考えられる。
              そのため、照合処理では、以下のデータ構造でその状態や照合の時系列の維持が行われる。

              台帳照合情報:(dtl.sales_keshi もしくは dtl.purch_keshiの項目)
              sales_keshi/purch_keshi: {
              no: 照合番号
              edi_flg: EDI照合対象であるかのフラグ(true/ false)
              check_flg: 対象フラグ(入金、支払の対象になるかどうかのフラグ)
              match_flg: 一致フラグ(EDIの金額と一致しているかどうかのフラグ)
              isan_kaisho_flg: 違算解消フラグ(台帳出力時に、check_flg, match_flg がtrue のものにtrue がセットされる)
              isan_kaisho_shime_date: 違算解消日付(解消した台帳出力日が登録される)
              hasIsan: 違算フラグ(本データはcheck_flg, match_flg が true であってもEDI側は一致していない場合にtrueとなる)
              tanka: 単価
              suryo: 数量
              zei_kbn: 税区分
              gaku_exc: 税抜額
              gaku: 税込額
              seq: 台帳出力番号(出力年月+" "(半角スペース)+ 連番(16進:桁数を減らすため
              }

              EDI照合情報:(dtl.sales_auto_shogo もしくは dtl.purch_auto_shogoの項目)
              sales_keshi/purch_keshi: {
              no: 照合番号
              check_flg: 対象フラグ(入金、支払の対象になるかどうかのフラグ)
              flg: 一致フラグ(EDIの金額と一致しているかどうかのフラグ)
              isan_kaisho_flg: 違算解消フラグ(台帳出力時に、check_flg, match_flg がtrue のものにtrue がセットされる)
              isan_kaisho_shime_date: 違算解消日付(解消した台帳出力日が登録される)
              hasIsan: 違算フラグ(本データはcheck_flg, match_flg が true であってもEDI側は一致していない場合にtrueとなる)
              tanka: 単価
              suryo: 数量
              gaku_exc: 税抜額
              gaku: 税込額
              }
              ※台帳のseq: 台帳出力番号に該当するEDI取込番号は、proc_no(EDI照合情報と同じレベル)項目に登録されている。(出力年月+" "(半角スペース)+ 連番(10進:9999行のデータは今のところないため
              台帳とEDIで、一致フラグのキーが違うことに気をつけてください。  
            • 住電

              • データの性質
              • ディレクトリ
              • ファイルとテーブル
              • 照合ルール
              • 違算の取り扱い
            • 富士通

              • データの性質
              • ディレクトリ
              • ファイルとテーブル
              • 照合ルール
              • 違算の取り扱い
            • ALPINE

            • ケーススタディと対応

          • 決算期の管理

            <編集中>
            ・決算期の保存場所
             SS-Sophieにおいて決算期はSSK.mst.kaisha(自社マスタ)に保存されています。
            ・現在の決算期
             決算期は各モジュールごとに設定されており、
             SSK.mst.kaisha.sys_termにて各モジュールの現在の決算期が確認できます。
            ・決算期の設定
             決算期(○期)とその範囲はSSK.mst.kaisha.ki_termにて定義されています。
             SS-Sophieでは管理タブの「決算期管理データ登録」にて確認、登録が可能です。
          • 前月の売上・仕入を戻せない

            SS-Sophie(というより商流)では、以下の条件が不整合な売上・仕入は戻す(返品)処理ができません。
            ・売上(仕入)した時の単価が受発注データの単価と違う
            ・売上(仕入)した時のレートが受発注データのレートと違う
            ・売上(仕入)した時の税区分が受発注データの税区分と違う
            ・売上(仕入)した時の通貨が受発注データの通貨と違う

            ・売上入力画面、仕入入力画面における編集可否(削除可否)の判定は以下になります。
            ・売上の編集可否判定のロジック: _listupSalesTrnByEno関数内(ソースで検索してください)
            ・仕入の編集可否判定のロジック: _setStatusToPurchTrn関数内(ソースで検索してください)

            上記のようなケースの場合は、一度「受発注データを売上(仕入)当時の状態に戻す」必要があります。
            ただし、月末レートを利用した取引の為替レートの変更については特別処理がありますのでそちらも参照してください。


          • 月末レートを利用した取引のレート変更をしたい

            月末レートは、毎月の販売月締め処理ごとに変更されます。
            このタイミングで受発注データの適用レートも合わせて変更されることになります。
            その結果、売上・仕入をした時点のレートと受発注の適用レートに不整合が発生するため、過去の売上・仕入を変更(削除:返品)することができなくなります。
            このようなケースで、受発注データのレートを当時のレートに戻すために以下のような実装がされています。

            1)受発注入力画面の受注(発注)レート欄に「変更」ボタンが表示される。
            以下のような売上は変更(削除:返品)できません。

            なので受発注を修正します。(レート部分に「変更」ボタンがでています)



            2)「変更」ボタンを押すと過去に計上された売上(仕入)で利用されているレートの一覧が表示される
             ※この一覧に表示されるレートは有効な売上(仕入)のみのものになっています。



            本実装は、以下のロジックにて実現されています。

            受発注入力画面(ボタン表示の判定):setKwsRateDialogBtn
            受発注入力画面(レート表示の判定):openKwsRateDialog


          • 更新したのに受発注 TRN ができない

            受発注残を画面から更新したり、月末で洗い替えがされたはずなのに、trn.odr が発生しないケースがあります。
            これは完了分です。
            画面では「差分:の trn を起こすため、金額に変更がない場合、trn.odr は発生しません。
            もしこの更新を検索したい場合、 SSK.history で { kaisha_cd: "SSK", _flg: null, collection: "SSK.dtl.odr_zan", "data._id": "(対象の odr_zan の _id)" } { sort: {_stamp: -1} } として、検索してください。
          • Lockトラブルあれこれ

            この項には、画面操作時に以下のような画面

            が表示された場合に考えうる原因と対応を記載します。

            <前提条件>
            トランザクションとは、データの更新においていくつかのテーブルの更新を同時に行い、それらのデータの整合性を保障するために実装された機能になります。
            流れとしては、
            1)トランザクションの生成 : var tran = fn.DAO.createTransaction(); // sync
            2)トランザクションの開始 :   tran.begin(); // async
            3)対象データのロック : tran.lock(table_full_name, selector, is_new); // async
            4)対象データの更新 : fn.DAO.exec(q.func, q.args); // async
            5)コミット、もしくは、ロールバック : tran.commit(); || tran.rollback(); // async

            となり、ロールバックした場合は4)で行われた更新はすべて元の状態に戻ります。

            <基本系の記述例>
            通常のロックの場合は以下のようになります。
             var tran; 
            return Promise.resolve().then(function() { 
             // getNewData の時点でいくつかのディティールのロックが必要なので、 
             // 処理の冒頭でトランザクションは開始 
             tran = fn.DAO.createTransaction(); 
             return tran.begin(); 
            }).then(function() { 
             // 修正の場合はすべてのデータをいったん削除するためロック 
             if (fn.fin('STATIC.STATE.' + op_mode) == fn.fin('STATIC.STATE.edit')) { 
             // 更新対象の伝票データ群のロック 
             var q = fn.DAO.query(DB_NAME, "find", {selector: {denpyo_no: now_denpyo_no}}); 
             return tran.lock(q.args[0], q.args[1]); } 
            }).then(function() { 
             // 色々なアップデート処理 
            }).then(function() { 
             // トランザクションのコミット(更新の確定) 
             return tran.commit().then(function() { 
             return den_no; 
             }); 
            })['catch'](function(e) { 
             dbg('save:', e); 
             if (!tran) throw e; // Transactionの生成自体でエラーが起きた場合はロールバックは呼ばない 
             // トランザクションのロールバック(すべての更新のキャンセル) 
             return tran.rollback(e).then(function() { throw e; }); 
            }); 


            <一括登録する場合の記述例>
            fn.DAO.batch を利用したある程度量のあるデータを一括して登録した場合は、ロック対象とならずに、ロールバックを行なっても元に戻りません。その場合は以下のように記述します。
            return Promise.resolve().then(function() { 
             // 一括登録 
             // block 分一気に投入 
             var c = fn.fin('C.trn.sales'), a = [c, trn_sales]; // trn_salesは、複数の売上データを持つ配列 
             return fn.DAO.batch('save', a); } 
            }).then(function() { 
             // 登録したデータのロック(これによりロールバック対象にする) 
             var sel = fn.sync.cdWrap({"sales_import.jikko_no": G_jikko_no}); 
             var q = fn.DAO.query("trn.sales", 'find', { selector: sel}); 
             return G_tran.lock(q.args[0], q.args[1], TRUE); 
            });



            • 新規登録したレコードがロックされたままになる

              <発生箇所> 
              勘定計画入力画面
              <発生操作> 
              新規データ(科目コード+内訳+税区分で未登録のものがあるケース)の登録
              <原 因> 
              新規に登録するオブジェクト内に、_id : null が入っていた
              オブジェクト内に_id : null が入る原因となったのは、HTML 上のWrapper_name内に_id のフィールドが非表示で記載されており、新規登録時に、_id を除去していなかったため。
              (_id は更新の判定に使うつもりでいた)
              <対 応>
              新規登録時には、_id を登録オブジェクトから削除する

          • Lockが発生していない場合の不要データ処理手順

            バグデータが発生した場合の指針に関して。
            前提:財務課に連絡し、会計転送を止めてもらう

            指針①:当該処理部門に依頼し、余計なデータに対応するデータを作成する
            (※マイナスデータの場合プラスデータを立てる)
            指針②:Dフラグはつけない。
            指針③:仕分けデータの削除もしない。

            注意: 会計転送されてしまっている場合は、辻褄が合うように会計転送を行う
            この場合、仕分け台帳に赤黒のデータが出るので、当該部門には連絡しておく。

            要は最終的にトランザクションの帳尻が合うようにすること。
          • 棚卸による関連データの更新について

            棚卸入力・反映処理画面にて行われる「棚卸」の仕様を以下に記載します。

            1)在庫DTLのフィールドについて
            <倉庫コード>
            在庫DTLには倉庫コードが3つあります
            倉庫移動、在庫引当等により倉庫コードが変わるとレコードが分裂します
            ・現在倉庫(souko.cd)
            ・仕入時倉庫(purch.souko.cd)
            ・初期仕入時倉庫(purch.souko_origin.cd)
            <数量フィールド>には以下のものがあります。
            ・仕入数
            ・売上数
            ・売上保留数
            ・入庫数
            ・出庫数
            ・棚差数:累計の棚差数(棚差数は棚卸後もリセットされない
            ・在庫数:自動計算(仕入数+入庫数+棚差数-売上数-売上保留数-出庫数)
            ・棚卸時在庫数:棚卸入力・反映処理画面にて、「棚卸開始」ボタンを押した時の在庫数
            ・棚卸入力数:棚卸中に入力した棚差数(「棚卸開始」時に0クリアされる

            2)プラス(棚益)の場合の更新<更新時>
            棚卸入力数が+(プラス)の場合は、
            1)在庫移動TRN に 以下のようなデータが作成されます。



            3)マイナス(棚損)の場合の更新<更新時> 


            4)プラス(棚益)の場合の更新<棚卸反映処理時>


            5)マイナス(棚損)の場合の更新<棚卸反映処理時> 


            ※備忘録(棚卸反映時の在庫DTLの更新ルールの変更 on 2019.04.21)
            以前は、棚卸反映時に以下のように在庫DTLの数量を更新していたが、「棚差数」を累計で保持し続けることになったため、それ以外の数量については更新しないようになった。
            Before(下段の処理により、更新されてしまったデータは補正済み)


            After


            ※追記(棚卸し時の受発注残の更新と、完了日付の制御)

          • 多量データ取得時の対応

            [疑問]
            一覧系画面(受発注一覧など)においてデータを取得する場合、検索条件によってはデータ量が多量になる場合がある。
            その状態で「出力」をすると、DBアクセスに時間がかかりタイムアウトで落ちてしまう。如何にして対応すればよいか。

            [回答]
            分割取得機構を実装することでタイムアウトを回避する。
            記述方法の一例をを下記する。

            例)受発注一覧SRC function outCsv
            function outCsv(){
             var sel
             var one_blk = 500;
             var DispLock = fn.sync.dispLock(fn.sync.getInfoMes(fn.fin("INFO.get")));
             return Promise.resolve().then(function(){
               //変更状態をチェック
               return _checkBeforeExec();
             }).then(function() {
              return makeSelector();
             }).then(function(_sel) {
              sel = _sel
              return getData(sel, {}, "count");
             }).then(function(cnt) {
              var pnum = Math.floor(cnt / one_blk) + 1;
              var when = Promise.resolve()
              var data = [];
              for (i = 0; i < pnum; i++)(function(idx){
               when = when.then(function(){
                return getAggData(sel, {
                 sort: {
                 odr_reg_no: -1
                 },
                 skip: idx * one_blk,
                 limit: one_blk
                }).then(function(one_data){
                 var now_num = (idx+1)*one_blk;
                 if(now_num > cnt) now_num = cnt;
                 DispLock.notify("データ取得中…"+"("+now_num +"/"+cnt+")");
                 data = data.concat(one_data)
                });
               })
              })(i);
              return when.then(function(){
               return data;
              })



             function getAggData(sel, opt, func, cl) {
              func = func || "find";
              cl = cl || collection;
              return Promise.resolve().then(function() {
               return fn.DAO.query(cl, func, {
                selector: sel,
                options: opt
               });
              }).then(function(q) {
               return fn.DAO.talk('aggregate', [q.collection, [{ $sort: opt.sort }, { $match: q.selector }, { $skip: opt.skip }, { $limit: opt.limit }, { $sort: opt.sort} ]]);
              })["catch"](function(e) {
               dbg("getData:", e);
               throw e;
              });
             }

            上記getAggData内のfn.DAO.talkにてaggregateを絡ませることで、メモリ落ちも防ぐごとができる。
          • Win 版 Chrome 76 の描画問題

            Window 版の Chrome 76 にて帳票の文字が折り返す問題が発生しました。
            これは Windows 版 Chrome の SVG 描画方法にバグがある(必要以上に各文字の描画横幅を確保してしまう)ためと考えられ、EasySvg モジュールにて少し小さい描画を行うことで、事象を緩和している状況です。

            この状況をモニタリングするため、管理タブの「パーツテスト」にて、利用中ブラウザの描画状況を確認できるようにしています。(注*)?develop をつけることで「パーツテスト」メニューは表示されます

            以下はバグのない Mac 版での実行例です。
            「描画」ボタンを押すと、現状の描画状況が閲覧できます。


            「EasySvg の切替」ボタンで補正前のバージョンでの描画を確認することができます。
            本来は以下のように est(予測)値とwidth(実際)値がほぼイコールになる必要があります。


            ですが、現在の EasySvg モジュール(0.4.0)では強制的に文字サイズを丸めているので、幾分小さく印字されている状況です。これを Win 版でみると、ほどよいサイズになっているのがわかるはずです。

            2019年 8月 16日時点の Windows / Mac の描画差比較(補正なしモジュール)


            今後も似たようなことがあれば、このツールを用いて確認を行いましょう。

          • システムエラーが出た時の内容を見る方法

            利用者から、以下のようなエラーが発生したと連絡が来た場合に、そのメッセージに表示されている文字列をとる方法です。

            ● 利用者からの画像

            システムエラー

            ● 手順

            1)「管理者タブ」の「アラート確認」を開く


            2)「エラーログ」タブを開き、該当の期間で検索すると同一の内容が見つかります。



            3)カーソルを合わせるとPowerTipが表示されるので、その行をクリック



            4)PowerTipが固定されるので文字列をコピーできます。



            以上
          • 個人設定の方法

            2019.10.23 update:
            個人設定でタブの表示を切替られるようになりました。
            詳しくは以下をみてください。
            (Google Drive)SS-SOPHIE PRIVATE SETTING REFERENCE
          • インシデント管理表

            • 出力方法

              mongoDBアクセスする。
              ◆選択項目
              環境:運用ti4r3gdj
              タブ:コマンド
              コレクション名:incident
              プルダウン① ダウンロード(mongodump)
              プルダウン② 日本語(Shift-JIS)
              プルダウン③ 出力タイプ:txt(タブ区切り)
              ◆検索クエリ
              {},{"fields":["id","state","display","subject"], "sort":{"id":1}},
              id = 管理表の「No.」
              state = 管理表の「状況」
              display = 管理表の「画面名」
              subject = 管理表の「概要」
          • データ出力機構(汎用帳票出力)


            <資料1> 出力機構の解説・データの記述様式と最新のケーススタディ:

             (Google Drive)新帳票出力機構概要_正

            <資料2> 三昌商事帳票定義一覧:


            <資料3> データ出力機構マニュアル:

             (ドキュメント)データ出力機構マニュアル

            <補足1> 014 品目別部門別在庫実績表 に関するケーススタディ:

            (1)税込表示を税抜き表示に変えたい
            方針:データ収集時に集めてくるデータを「税込」から「税抜」に変更する
            フェーズ:projection
            変更内容:prt.projection.find_jjj の "fields" キーにおいて、_inc となっているものを _exc に変更する。
            例)キー sales_jjj_gaku_cv の値 $tou_mth_jjj.sales_gaku_inc_cv => $tou_mth_jjj.sales_gaku_exc_cv

            (2)税抜合計値が 0 のデータは集計しないようにしたい
            方針:集めたデータのうち、stock_kkk_gaku_cv(kkk.stock_gaku_exc_cv よりの値)、stock_jjj_gaku_cv(tou_mth_jjj.stock_gaku_exc_cv よりの値) が 0 のものは集計対象外にしたい
            フェーズ:aggregate
            変更内容:prt.aggregate.skipIf において、上記条件を登録する。
            例)キー skipIf の値を "=!x.stock_kkk_gaku_cv && !x.stock_jjj_gaku_cv" に設定( x には収集してきたデータが自動的に入る仕様です)(キーがない場合は追加すること)
            ※注意:キー"skipIf"は joinの後に実行されるので、joinに先立ってデータを取り除く必要がある際には不適。
            projection段階で selectorを用いデータを取らないようにする措置が必要。

            (3)一覧の行の高さを 2行分にしたい
            方針:matrix の設定で body 部分の高さを 2 に設定する
            フェーズ:draw
            変更内容:prt.draw.mainTable.body の row_height を設定する
            例)キー row_height の値を 2 に設定。(キーがない場合は追加すること)
            (2018/9/27今釜記入)1.5行分もできる!№014「品目別部門別在庫実績表」参照

            (4)一覧の上に固定文字列 [ 千円 ] を表示したい
            方針:sequence に "tanniHyouki" を追加する
            フェーズ:draw
            変更内容:prt.draw に "tanniHyouki" キーを追加するとともに、 sequence に "tanniHyouki" を追加する。
            例)tanniHyouki キーに値 { lines: [ [ [ "[ 千円 ]", 60 ] ] ], print: { position: { x: 155, y: 25 } }, timing: "always" } を設定。全てのページの上部右方に [ 千円 ] が表示される。

            (5)一覧の表示行数を少なくしたい
            方針:dataNum の値を調整する
            フェーズ:aggregate
            変更内容:prt.aggregate.find_jjj.dataNum に適切な数字を設定する。
            例)dataNum に 25 を設定。

            (6)最終ページに全体合計を出力したい
            方針:集計キーレベル(stock)を設定するとともに、extraPage を設定、最終ページのみに出力する項目「全社」を追加する
            ※ stock 設定がない場合、出力キーレベル(output)と集計キーレベルは同じとして扱われます。
            フェーズ:aggregate、draw
            変更内容:
             1) prt.aggregate.find_jjj.stock に [0, 1, 2]( 部別品目別および全社のレベルでの集計 )を設定
             2) prt.aggregate.find_jjj.extraPage ["ALL"] を設定
             3) prt.draw に "zenshaTitle" キーを追加するとともに、その表示内容を設定。出力タイミングは最後だけなので "wholeFoot" とする。
            例)prt.aggregate.find_jjj.stock に [0, 1, 2] を設定、prt.aggregate.find_jjj.extraPage ["ALL"] を設定 => ALL で集計された値で ALL のページが作成される。
            zenshaTitle キーに値 "lines":[[["",60,null,null,{"fontSize":14}]],[["全社",60,null,null,{"fontSize":14}]]],"print":{"position":{"x":15,"y":15},"timing":"paperFoot"} を設定。

            (7)明細の最後に合計行を表示したい
            方針:出力レベル(aggregate.output)を調整する
            フェーズ:aggregate
            変更内容:prt.aggregate.find_jjj.output に prt.aggregate.find_jjj.keys を参考に出力レベルを設定する
            例)prt.aggregate.find_jjj.keys が ["hin"] だけの場合、レベルは最大 1 なので、全体合計を出したい場合は output = [0, 1] を設定する。

            その他、最新のケーススタディが<資料1>に追記されています。
            参考にして作成を進めてください。
            • 帳票登録

              ◆作成の手順例
              …(帳票開発ボリューム検討)2018_01_開発帳票と実装方法精査+移行データにて指定されている帳票の作成手順を記述。

              【初心者のための検索方法】
              ①帳票ボリューム検討 > 開発帳票 全 >利用データ欄を見る。
              ②テーブル定義 > コレクション一覧 > から検索してシートの在処を把握する。
              ③フィールドをkeysに変換する簡単な方法 Object.keys({}) 例:Object.keys({"grp_cd":"グループコード","trad_cd":"取引先コード","grp_nm":"グループ名","trad_nm":"取引先名","inv_flg":"有効"})

              ※下記する内容はざっくりとした説明です。より技術的な内容は「新帳票出力機構概要_正」を参照ください。
               (Google Drive)新帳票出力機構概要_正

              1.帳票設計作業
              mongoDBアクセスする
              環境:運用ti4r3gdj
              タブ:データベース
              コレクション名:SSK.mst.report_settings
              セレクタ名:reg_no (帳票開発ボリューム検討資料のインデックスNo.)
              オプション:

              ※コレクション名は変わらない

              取得ボタンを押下
              レコード表示後、moreボタンで開く

              最初に、「帳票開発ボリューム検討」の「開発帳票_全」シートを参照して、
              編集すべきreg_noに対応するvalue値を更新する。


              _id : 自動付与されるid
              csv : csv出力機能の設定。{"active":false}を指定すると画面上に「出力」ボタンが出なくなる。
              dsp : 画面上検索機能(未実装)の設定。{"active":false}を指定すると画面上に「検索」ボタンが出なくなる。
              explains : 帳票の説明。
              kaisha_cd : 会社コードを指定。
              mdl_kbn : どのモジュールの処理年月日を基準とするか指定。
              menu_kbn : 集計出力帳票 と 期間集計出力帳票のどちらから帳票を出力するか指定。
              prt : 印刷機能の設定。ただし、印刷機能を使用しない場合でもprojection、aggregateは記述必須。
              prt_kbn : おまとめ印刷(未実装)用のキーを設定。
              reg_nm : 帳票名を設定。この名称が帳票そのものタイトルとなる。
              reg_no : 帳票の登録番号を設定。他帳票との重複不可。
              report_type : (未使用)とりあえずデフォルト"multi-list"でOK
              search_items : 検索条件(項目など)の設定。
              search_term : 検索条件(期間)の設定。
              tab_kbn : 出力可能とするタブを指定。複数指定可能。

              prtをmoreで開く


              active : 「印刷」ボタンの表示/非表示設定。trueで表示。
              paper : 用紙サイズの設定。使用できる内容はFINAL参照。
              projection : データの取得設定を行う。詳細後述。
              aggregate : データの加工設定を行う。詳細後述。
              draw : データの描画設定を行う。詳細後述。

              保存するときは同期ボタンを押下
            • データ取得

              2.データ取得
              projection

              find_stock_mth(命名任意) : どのコレクションから、どのデータを、どんな条件で、どのように 取得するかを定義し、実際にデータを取得する。 この例の場合は、月次在庫DTLを用いている。
              sequence : 後段の処理に渡したいデータを指定。
              find_soshiki(命名任意) : 行っている内容は上述のfind_stock_mthと同じ。 但し、templateを用いることで簡略化している。 マスタの一部項目取得の場合はこちらが便利。(find_userも同様。) templateに指定できる値は「新帳票出力機構概要_正」を参照。

              ※命名任意項目の命名例: 「販売実績DTL」 find + _jjj 「販売先末々残高DTL」 find + _u_matsu_zan 「仕入先末々残高DTL」 find + _m_matsu_zan 「勘定残高DTL」 find + _acnt_zan

              c : データを取得するコレクションを指定。"SSK."は省略できる。
              g : 分割取得単位を指定する。上記例の場合は部コードごとにデータを取得する。
              p : 処理パイプラインの指定。基本的には変えなくていいはず…
              fields : 取得したいデータのフィールド(項目)を指定。
              selector : データ取得時のセレクタを指定。上記例の場合は決算期と部コードを条件としている。
              sort : データ取得時のソート条件を指定。


              データが取得できました!

              保存するときは同期ボタンを押下
            • データ加工

              3.データ加工
              aggregate
               
              skipIf : 弾きたいデータの条件を定義。
              join : 追加したいデータを作成
              join_args : joinを行う際、別コレクションからデータを取得したい場合に定義。
              keys : キー項目の列挙 ※注意…キーなので、ここには数値項目(数量、金額)は基本入れない。
              calc : 計算しておきたいデータを作成(例えば利益額など)
              dataNum : 印刷時、1ページあたりに表示するデータ行数を指定
              stock : 集計キーの位置を指定
              output : 帳票の中で合計行を出したいキーの位置を指定。(stockにない場合は使用できない)
              上記例の場合、全体計、部コード計、社員コード計が出る。
              pageFactor : レイアウト。基本は変えなくて問題ないはず…
              paging : ページ替えをしたいキーの位置を指定。(stockにない場合は使用できない)
              sum : 足し算したい項目を指定
              (例)Aという製品、それぞれ売上金額が異なるものが3行ある場合
              製品:売上金額 A:100
              A:50
              A:30
              項目をsumに追加した場合→A:180
              項目をsumに追加しなかった場合→A:30(一番下の項目のみ)
              そのまま表記したい場合→項目をsumではなくkeysに入れる
              renewData : renewしたい項目を指定。商品マスタなどはprojectionで全件取得するにも、 件数が多すぎて落ちる可能性が高いので、これを用いる必要がある。
              fixData : aggregateのデータを最終加工できる。例えば、集計行に"全社計"と表示させるなど可能。
              sort : 集計後のデータにてソートをしたい場合に指定。

              データの加工・集計ができました!

              保存するときは同期ボタンを押下

              ◆joinでよく作成する項目の記述例
              ・jjj
              ①半期 or 年間の月数の判定文(半期:6 | 年間:12)
              {月数: "if(\"%_YM_E_%\" - \"%_YM_S_%\" == 99){return 12}else{return 6}"} (仮)
              ⇒期間の終わりの年月 - 期間の初めの年月 = 99だったら年間を示す12,そうでなかったら半期を示す6
              上記の式は前提として、search_term.typeがhalfの場合のみ有効

              ◆calcでよく作成する項目の記述例
              ・jjj (前提)projection.fieldsに以下記述済みとする。
              {tou_sales_gaku:"$tou_mth_jjj.sales_gaku_exc_cv",tou_cost_gaku:"$tou_mth_jjj.cost_gaku_exc_cv"}


              ①税別基準換算利益金額を作成する場合 
               {税別基準換算利益金額 : "=x.tou_sales_gaku - x.tou_cost_gaku"}
               ⇒利益金額は、売上額 - 原価額 で算出します。


              ②千円単位の売上金額を作成する場合
              {千円単位の売上金額 : "=calc(x.tou_sales_gaku, '/', 1000, {decimalRounding: 0} )"}
               ⇒千円単位の金額は、小数点以下を切り捨てます。


              ③利益率を作成する場合
               {利益率 : "return x.tou_sales_gaku == 0 ? '-%' :calc(x.tou_profits_gaku*100, '/', x.tou_sales_gaku,{decimalDigits:2,decimalRounding: 0})+'%'"}
               ⇒売上額が0だったらエラー表示回避のため"-%"。利益率は利益額 * 100 / 売上額の計算結果に"%"を付与。
              上記の場合、小数点3桁目で切り捨て小数点2桁表示にします。
                

              ④売上金額の12ヵ月平均額を作成する場合
               { 売上金額の12ヵ月平均額: "=calc(x.tou_sales_gaku, '/', 12)"}
            • データ描画

              4.データ描画・出力
              draw
               
              data : aggregateから渡ってきた変数を指定
              head : 描画するヘッダー部の設定を記述。 例:{ "ラベル名",ラベル幅 }
              modifyHead : ヘッダーを動的に書き換える場合に使用。
              modifyHead_args : modifyHeadに使用するデータを記述。
              body : 描画するボディーの設定を記述。 ※ヘッダーに幅指定されていれば、ここでは幅指定不要
              print : 表の開始地点の座標を指定。
              style : スタイルを変更したい場合に使用。※font-size や font-weightなど。
              template : 描画する表の種類を指定。

              帳票のスタイリングができました!



              csv
               
              active : 値をfalseにすると画面上に「出力」ボタンが出なくなる。
              find_zan(命名任意) : どこにあるデータをcsv出力するか指定する。基本的にはaggregateと同じ変数にすること。
              sequence : 処理をしたいデータを指定。(つまり、ここでは上で指定した"find_zan"が該当する。)
              joint : データの区切りを指定。カンマ区切りなら "," 、タブ区切りなら "\t" を指定。(指定ない場合はタブ区切り)

               
              filename : ファイルの名称を指定。拡張子まで指定する。
              headers : ヘッダーの情報を{キー:ラベル名}というオブジェクトで指定する。
              keys : 出力したいデータのキーを配列で指定。headersと同じ順番、同じ個数にすること!
              例) headers側 {"odr_cd":"注文番号","shohin_nm":"注文商品"} ※オブジェクト(key:valのセットで1つのカウント)
              keys側 ["odr_cd","shohin_nm"] ※配列


              データ出力の設定ができました!


              ここまで出来たら、忘れずに同期ボタンで保存する!

              実際に帳票を確認する場合
              ・Sophie URLの最後に "?develop" を追加してログイン(開発環境)
              ・該当タブ > データ集計 >帳票No.を指定して実行
            • データ照合

              4.データ照合
              流れ
              ① 作成した帳票をExcelで開く
              ② コンソールにクエリを投入 例) dtl.sum_jjjの税別換算仕入額をチェックする場合(帳票reg_no:085の場合)
              fn = AppSpace.fn;
              var sel = {trad_kbn:"maker",$or:[{"kuni.cd":{$ne:"JPN"}}]};
              var opt = {sort: {trad_dtl_cd: 1},fields: {trad_dtl_cd: 1}};
              var q = fn.DAO.query("mst.trad_dtl", "find", {selector: sel, options: opt});
              //上記条件で取引先詳細DTLを絞り込み。
              fn.DAO.talk(q.func, q.args).then(function(r) {
              debugger;
              var makers = [];
              r.forEach(function(o,i){
              //ここで空の配列makersに取引先詳細コードをプッシュ。
              makers.push(o.trad_dtl_cd);
              });
              //JJJの絞り込み
              var sel2 = {ym: {$gte: 201810, $lte: 201903},"maker.cd":{$in: makers },"tou_mth_jjj.purch_gaku_exc_cv":{$ne:0}};
              var group = {"_id":{"ck_cd":"$ck.cd","maker_cd":"$maker.cd","tsuka_cd":"$tsuka.cd"}, "n":{"$sum":"$tou_mth_jjj.purch_gaku_exc_cv"}};
              var opt2 = {sort: {cd: 1}};
              var q2 = fn.DAO.query("dtl.sum_jjj", "aggregate", {pipeline: ["match", "group", "sort"], selector: sel2, group: group, sort: {"_id.ck_cd": 1,"_id.maker_cd": 1,"_id.tsuka_cd": 1}});
              //上記で作成したクエリでdb検索
              fn.DAO.talk(q2.func, q2.args).then(function(r2) { debugger
              //結果をcsvで吐き出し
              fn.sync.resToCSV(null,r2,"check.csv")
              });
              });
              ③ クエリダウンロードしたデータを①にペーストして照合する
              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
              数値が合わない場合、mongoの「データベース」タブにて、合わなかったデータのキーをセレクタに記述して内容を取得し、データを確認する。
              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

            • 帳票開発メモ

              頻出する記述方法をフェーズごとに記載します。

              <projection>
              ・項目が "null" のデータを取得したい!(参考reg_no:172)
               例)検索条件で「『取消年月日』が "null" 以外の物を除く」場合
              ⇒"{\"date.cancel\":\"null\"}" とすればOK!
              ※「取消年月日」が "null" のものと絞って取得すれば結果として等しくなる。
              (一旦「取消年月日」をすべて取得し、aggregateでskipIfすることも出来るが、そもそも取得段階で取り除けるうえ、
               key項目に入れる必要が発生するので、この段階で取り除いてしまった方がシンプル)

              ….
              <aggregate>

              [join]
              ・Date型の日付を年月(整数)に変換したい! (参考 reg_no:019)
              例) maker_shukka_ymdをYMに変換したい。 ⇒"return parseInt(fn.sync.YMDHMS(x.maker_shukka_ymd,'YM'))"

              ※ parseIntは文字列を整数に変換する関数なので、文字列のYMを取りたい場合は不要。 また、"Y年M月"という表現にしたい場合はfn.syncYMDHMSの第2引数を"Y年M月"とすればOK!

              ・経過月の項目を作りたい! (参考 reg_no:019)
              例) 在庫の経過月(maker_shukka_ymからymまで)を作りたい。 ⇒ "var nen = Math.floor(x.ym / 100) - Math.floor(x.maker_shukka_ym / 100); //Y部分のみの年差を算出
              var mon = x.ym % 100 - x.maker_shukka_ym % 100; // M部分のみの月差を算出
              return nen * 12 + mon;" //Y部分の年差を月差に変換し、M部分の月差と足す

              Math.floor() :引数に入れた数値以下の最大整数値を返す関数。 % (剰余算演算子):割り算の余り値を返す演算子。 例えば 10 % 4 = 2 となる。 (考え方)あくまで整数なので、小数点は考慮しない。10を4で割ると「2あまり2」(10÷4 = (4*2)+2)

              [skipIf]
              ・経過月在庫の中で特定のデータをスキップしたい!(参考 reg_no:018)
              例)金型在庫をペナルティになる7か月以上経過在庫から除外したい
              前提:fn.FINAL L713 付近に"penalty_gai"という項目があるので、
              部門C:["商品C①","商品C②","商品C③"… のように部門コードごとに商品コードを配列化しておく

              →skipIfに下記の項目を入れる。keika_tsukiは必要に応じて変更させること
              var jkn_sel = Number(jkn_obj.select0.cd);var maker_shukka_ym = parseInt(fn.sync.YMDHMS(x.shukka,'YM'));
              var nen = Math.floor(x.ym / 100) - Math.floor(maker_shukka_ym / 100);
              var mon = x.ym % 100 - maker_shukka_ym % 100;var keika_tsuki = nen * 12 + mon;
              if(jkn_sel == 99){
                if(keika_tsuki < 7 || (fn.fin('Data.penalty_gai.' + x.bu_cd) || []).indexOf(x.shohin_cd) != -1) return true;
              }else if(jkn_sel == 7) {
                if( keika_tsuki != 7  || (fn.fin('Data.penalty_gai.' + x.bu_cd) || []).indexOf(x.shohin_cd) != -1) return true;
              }else{
                if(jkn_sel != keika_tsuki) return true;
              }

              [calc]
              ・千円単位の金額項目を作りたい! (参考 reg_no:019)
              例) stock_gakuを千円単位にしたい。 ⇒ "=calc(x.stock_gaku, '/', 1000, {decimalRounding: 0} )"
              ※千円単位にする際、小数点以下は切り捨てること!

              ・利益率(%)項目を作りたい! (参考 reg_no:025)
              例) 利益計画額(kkk_profits_gaku)に対する、利益実績額(tou_profits_gaku)の率項目を作りたい。 ⇒"return x.kkk_profits_gaku == 0 ? '-%' : calc(x.tou_profits_gaku*100, '/', x.kkk_profits_gaku,{decimalDigits:2,decimalRounding: 0})+'%' "

              ※計画が0の場合は計算結果がエラー表示になる。 この場合の回避策として文字列"-%"が返るよう条件分岐させておく。
              decimalDigits:小数点以下桁数何桁に丸めるか。 decimalRounding:四捨五入(1) or 切り捨て(0) or 切り上げ(2) のどれで丸めるか指定。

              <draw>
              ・出力する数値に区切りのカンマを入れたい!
              パターン1 (xxx_gaku)_i:3桁ごとにカンマを付与(小数点以下は四捨五入される)
              (使用例)10000.98 → 10,001
              10000 → 10,000

              パターン2 (xxx_gaku)_f:3桁ごとにカンマを付与(少数点以下はDBに保存されている桁数まで表示
              (使用例)10000.98 → 10,000.98
              10000 → 10,000.00

              パターン3 (xxx_gaku)_f2:3桁ごとにカンマを付与(少数点以下は数値のある桁数まで表示。)
              (使用例)10000.98 → 10,000.98
              10000 → 10,000

              帳票の場合、パターン3にする場合が最も多いと思われる。迷ったらとりあえず_f2にすればよいかと。

              ※注意:drawにデータが渡ってくる段階(aggregateまで)でkey名称を"xxx_gaku"としておく必要がある

              ・タイトル部に「yyyy/mm/dd~yyyy/mm/dd」と期間指定の表記をしたい!(参考 reg_no:255)

              ①aggregateのjoinで下記項目を用意する(key名は任意)
              (開始日) "jkn_s" : "=fn.sync.YMDHMS(jkn_obj.ymd_s,'Y/M/D')"
              (終了日) "jkn_e" : "=fn.sync.YMDHMS(jkn_obj.ymd_e,'Y/M/D')"
              ※合わせてaggregateのkeysにもkeyを用意するのを忘れないこと
              ②drawのタイトルテーブル(名称任意)に下記を記入
              (例)find_cost内にあるjkn_sとjkn_eを用いて期間指定の表記をする
              {"data":"find_cost","lines":[[["年月日:",20],["=jkn_s",20],["~",6],["=jkn_e",20]]],"print":{"position":{"x":90,"y":15},"timing":"always"},"row_height":1,"template":false}

              ・sum項目をソートしたい!
              →aggregateにsort項目を用意します。
              例)sumにあるsales_gakuを並び替えたい
              "if(x.val1.sum.sales_gaku >= x.val2.sum.sales_gaku)"
              仮にx.val1.sum.sales_gaku=50
              x.val2.sum.sales_gaku = 30の場合、並び替えない
              仮にx.val1.sum.sales_gaku=30
              x.val2.sum.sales_gaku = 50の場合、ひっくり返す

              ※calcで計算した値を用いたsortは単体では出来ない。
              簡単な計算項目であればsort内部で計算をするか
              多段aggregateが必要になる模様。

              ・順位項目を作りたい!
              →aggregateでは対応不可。modifyDataが必要になる。


              ・罫線を自在に引きたい!
              →drawで対応。(参考:006-2)
              ①リスト部描画用テーブル内にborder:falseを指定。リスト部の一切の罫線がなくなる。
              ②ヘッダ部罫線用テーブルにて線を座標指定で描画。帳票全体の罫線を指定できる。
              ③リスト部描画用テーブル内にmodifyBodyにてbody部の線を座標指定で描画。各行ごとの罫線を指定できる。


          • デバッガ上でスタイルがコピーできないとき

            SS-Sophie では秒単位でイベントを発生させているため、Google Chrome のデバッガで Style をコピーしている途中で、選択状態が開放されてしまう現象が発生します。
            そういうときは画面左上に表示されているロゴ(会社情報で設定できるところ)を押下してください。開発環境では環境情報の表示とともに、秒針(時間右端の ".")の動く・動かないをトグルする機能を埋め込んでいます。秒針(時間右端の ".")がチカチカしない状態であれば、スタイルのコピーも簡単にできると思います。
          • Tips: 帳票のファイル名

            各場面において出力される帳票のタイトルはデフォルトでは「画面名+日付」となりますが、以下のような設定により、自由につけることが可能です。
            参考)受発注入力画面の出力帳票
            ・画面側の定義(実装ずみ:makeReport 関数内)
             return Promise.resolve().then(function() { return getOdrZan(); }).then(function(odr){ dtlOdrZan = odr; var title_fnc = fn.fin("Print_Title.odr_ipt"); var title = title_fnc && $.isFunction(title_fnc) ? title_fnc(dtlOdrZan): NULL; ・・・中略 });
            ・FINALへの定義(必要に応じて定義)
             // 帳票タイトル編集関数 Print_Title: { odr_ipt: function(dtl_odr) { var g = k=>fn.sync.getVal(dtl_odr, k); var e_no = g("entry_no"); var anken_nm = g("anken_nm") || g("p_odr.maker_shohin_nm"); var maker_nm = g("p_odr.maker.ex_nm.s") || g("p_odr.maker.nm"); var title = [e_no, maker_nm, anken_nm].join("_"); title = title.replace(/ /g, "_"); return title; } },
          • 検証環境へのデータ移行における注意点

            開発資産をテスト環境で確認する際の準備として、運用環境からデータを移植するケースがあります。
            業務データのみを移行する場合は、発番マスタもセットで移行するようにしましょう。
            E1000 duplicate key error のキー重複の原因となります。
          • リリース時の注意点

            編集したRSDをリリースする前は、アカウントマネージャー内の該当RSDを開き、
            変更内容の確認』から最終リリース日以降の変更をチェックして、変更箇所の確認をする。

            ※menuとloginについては、他のプロジェクトでも使われているRSDなので、影響が大きい。
             したがって、編集する前とリリース前に問題がないかの確認を必ず取る。
             業務中のリリースは、万が一何かあった場合の影響が甚大になる恐れもあるため、
             週末の業務終了後などにリリースするのが望ましい。

            (20230407追記)
            コレクション名の変更にかかるリリースに関しては、更新すべきRSDが多岐にわたる可能性がある。
            更新だけしてリリース対象から外れてしまった場合、developでは問題なくとも運用環境ではコレクション名が見当たらずに動作しない。
            そのため、動作確認のほかにリリース対象の確認を徹底すること。

          • リリースプロジェクトについて

            ssk資産の場合(自由に編集作業及びリリース可)
            tigr3gdJ ⇒ti4r3gdJ

            Sophie資産の場合(編集前及びリリース前に要確認)
            ZKi2EkOC ⇒ hiAGazJI
          • chefのリリース手順

            新規のRSDをリリースする場合には、chefのリリースが必要となる。
            一言でいうと、「MODULE LIBRARYを編集してから、その内容をchefに上書く」流れ。
            この手順について記述する。

            ※開発初段からの流れ

            ◇開発準備 フェーズ

            ↓1. 【開発環境】Agile Developerより、開発するRSDを作成する。(stable用RSDも作っておく)
            公開設定を限定公開に変更する。
            ProjectPanelを開き、作成したRSDを登録。
            ProjectPanelのRSD共有情報タブを開き、「このプロジェクトの自RSDを限定公開にして追加」をクリック

            ↓2. 【開発環境】Account Managerより、開発するRSDのstableを実行する。(難読化)

            ↓3. 【Enjoy Sophie】Account Managerより、SOPHIE MODULE LIBRARYにRSD情報を登録する。(stableまで埋まる)
            ※ 記述箇所が2か所あるので注意。

            ※ 画面系RSD、帳票RSDで入力箇所が違うので、登録するRSDに適した箇所に記述すること。
             (帳票) 帳票RSD IDの紐付け  (画面) 画面のレシピの定義 で検索してから記載する。

                      

            ↓4. 三昌商事運用環境【Sophie管理者タブ】コマンド実行より、chef生成(bHicj5Do)を実行してsrcをコピーする。  
                   
                
            ↓5. 【開発環境】Account Managerより、chefにペースト。必ず変更内容を確認し、自身が編集した部分以外の変更箇所がないかチェック。チェック後上書き保存。
             

                      
                      

            ◇開発~検証 フェーズ

            ↓6. 【開発環境】Agile Developerより、実装~検証までをおこなう。

            ◇ローンチ フェーズ

            ↓7. 【開発環境】Account Managerより、開発したRSDをstable実行する。

            ↓8. 【Project Launcher】開発したRSDのstableをプロジェクトローンチする。

            ↓9. 【運用環境】ソースビューより、開発したRSDのリリースIDをコピーする。

            ↓10.【Enjoy Sophie】Account Managerより、SOPHIE MODULE LIBRARYにRSD情報を登録する。(リリースが埋まる)

            ↓11. 三昌商事運用環境【Sophie管理者タブ】コマンド実行より、『chef生成(bHIcj5Do)』 を実行してsrcをコピーする。

            ↓12.【開発環境】Account Managerより、chefにペースト。必ず変更内容を確認し、自身が編集した部分以外の変更箇所がないかチェック。チェック後上書き保存。

            ↓13.【Project Launcher】chefをプロジェクトローンチする。

            ◇完了

            ポイントは、3~5 と 10~12 は同じ作業をリリースまでに2周まわすという点。
            chefを直接編集している場合は、マージの際に消滅してしまうため注意!
            変更内容で差分の確認を漏らさずに行ってください。
             
          • partsのリリース手順

            パーツ開発時のリリース手順は通常の手順と異なり、特殊な操作が必要となるため、
            本項でその手順について記述する

            パーツの編集用RSDを編集
             ※パーツのRSD内でバージョンを定義している場合であれば編集時に最新の値へ書き換えることで、
             それぞれの環境のコンソールで「fn.パーツ名(ex:SSKlist等).version」と打てばバージョン確認ができるので、
             適用できているかの判断が容易になる。


            編集が終わったら「ssk.synquery.com?canary」→「(開発用)モジュール管理」で編集したパーツの属するモジュール区分を選択し、
             自分の編集したモジュールのTime Stampが赤く表示されていることを確認する。

            自分の編集していないモジュールのTime Stampも赤く表示されていた場合は、
             Account Managerにて変更履歴を確認し、動作に影響が出る場合は編集者に確認を取るなどする。

            ③「ssk.synquery.com/?canary」 →「コマンド管理・実行画面」 →「(開発支援)ビルドパッケージ(pack.sys_libs、pack.pars_sss、pack.parts_ssk)の生成 for chef」
            を開き、PairIndexをコメントに従って編集し更新ボタンを押下する。


            コマンドを実行し、ダウンロードされた,min.jsファイルの中身をコピーし、対象の.min.jsと付いたRSDの中身を置き換える。
             ※この時点で?developにて検証が可能となる。


            ⑤Project Launcherにて対象の.min.jsと付いたRSDをリリース
             ※この時点で?testにて検証が可能となる。

            補足:対象となるRSDの確認方法
             先述の「(開発用)モジュール管理」にて、モジュール区分を、「SSKパーツ」または「SSSパーツ」と選択して、
             出てきた一覧の中に該当RSDが存在していれば、本項のリリース手順が必要となる。 

          • FINALリリース時のマージ

            RSDのリリースは、【AccountManagerより当該RSDを検索してPROPERTYタブの[実行]を押下。(stable化)
            次に【ProjectLauncherよりProjectを指定してstableファイルに✓。[プロジェクトローンチ]を押下。(完了)
            但し、FINALリリースにあたっては続きがあり最新ファイルとのマージが必要となる。
            本項では、FINAL(RSD)をstableから本番環境へリリースしたあとのマージ作業手順について記述する。

            merge1
            ① Portal > 工程管理表 > データ比較ツール を選択して[新規作成]押下。
            ② 左データには FINAL最新用[ETe6Gjy6]のSRCをコピペ、右データにはFINAL(stable)[5k3FV91D]をコピペする。
            ③ [比較]を押下。差分は中央に [⇐] が表示される。

            merge2
            ④ 自身が修正した差分箇所[⇐]のみをすべて押下。(FINAL最新に反映していく)※保存はしない
            ⑤ [⇐]が完了できたら、左データのSRCをコピーする。
            ⑥【AccountManager】よりFINAL(最新版)を展開してペーストする。

            merge3
            ⑦ RSD編集ウィンドウ下部の[変更内容を確認]を押下。④差分箇所が変更されていることを確認する。
            ⑧ RSD編集ウィンドウ下部の[上書保存]を押下。(マージ完了)


          • EDIサーバー セットアップ手順

            ◆構成概要
            マシンスペック:
            2020年4月現在時点
             OS:Microsoft Windows Server 2003 R2
             Standard Edition Service Pack2
             CPU:Celeron/1GB

            2020年5月以降
             Express5800/T110j(2nd-Gen)
             OS:Windows2016STD
             CPU:Xeon/16GB/SATA
             Drive:1TB×2(RAID1)

            ディレクトリ構成:
            Dドライブ (D:\直下にフォルダに基本すべてのフォルダを格納)

            1)ベース
            batch
             ┗AL所要計画.bat AL注文.bat AL入荷.bat AL納入指示.bat AL買掛明細.bat
               ES注文1.bat ES注文3.bat ES注文4.bat FJ検査.bat
               PN出荷1.bat PN出荷3.bat PN出荷4.bat PN注文01.bat
               SD出荷1.bat SD出荷3.bat SD出荷4.bat
               TM注文1.bat TM注文3.bat TM注文4.bat
            Synquery_EDI
             ┗EDI
               ┗node_modules
                 ┗stable-socket
                 ┗websockets
               ┗node.exe  
             ┗synquery-embed_ssk_180927.zip

            2)データ系
            ※1…オリジナルデータ
            ※2および3 …コピーデータ

            テスト環境用
            アルパイン
             アルパイン2 アルパイン3
            シャープ シャープ2 シャープ3
            パナソニック パナソニック2 パナソニック3
            住電財務 住電財務2 住電財務3
            住電電線 住電電線2 住電電線3
            新光電気 新光電気2 新光電気3
            東芝 東芝2 東芝3
            富士通 富士通2

            ◆セットアップ手順
            2段階で進行する。
            ①環境構築からSynqueryEmbed試験疎通まで
            ②サービス切替

            ①環境構築
            1.Dドライブにディレクトリを作成する
             
            batch、Synquery_EDI > EDI
              各種データフォルダ
             

            2.GoogleChromeをインストールする。

            3.Chromeよりnodejs
            (64bit installer)をダウンロード。
             URL https://nodejs.org/ja/download/
              ✓D:\Synquery_EDI\EDIへexeファイルを移動して実行する。

            4.Chromeより以下URLのsynquery-embedをダウンロード。
               ※...ssk_xxxxxx.zipは更新によって変わる
              ✓D:\Synquery_EDI\EDIへzipファイルを移動する。
              ✓zipファイルを解凍する。
              ✓解凍したフォルダ内のsynquery-embedフォルダを、一つ上の\EDIに移動する。
              ✓etcフォルダのconfig.ssk.jsonをNotePadで開く。
              "project":を入力する。(開発…"PPnPGXmd"、運用…"ti4r3gdJ"
              "adaptor":{..."server":{..."UUID":{..."value":"SSK_EDI"を入力する。

            5.
            コマンドプロンプトを起動して以下の処理を実行する

            D:(ドライブ移動用)
              ******************************************************************************************
              D:
              D:cd \Synquery_EDI\EDI\synquery-embed
              D:
            \Synquery_EDI\EDI\node.exe --expose-gc --always-compact . ssk
              ******************************************************************************************
              手前のウィンドウの最後に
            のような表示があれば ok です。
             24 Apr 17:52:42 - [xxxxx] net on CONNECTION. (::ffff:127.0.0.1:50865, 0 adaptors exist)
             24 Apr 17:52:42 - [xxxxx] got UUID for greeting succeeded: SSK_EDI



            6.タスクマネージャのプロセスタブでnode.exeが動いていることを確認する

            7.ブラウザよりブロードキャストデータによる疎通確認をおこなう
              ✓対象環境のデバッガコンソールにて以下クエリを発行する
              ******************************************************************************************
                  fn = AppSpace.fn
                  fn.DAO.EDItalk('ECHO', { 
                    val: "プロジェクト #" + $S.DB().project() + " に synquery-embed は繋がっています" 
                  }).then( (r) => console.log(' ====== 疎通確認 OK ====== ', r ? r.val: "???") ).catch( 
                   (e) => console.error(' ====== 疎通確認 NG ====== ', e)
                  );
              ******************************************************************************************
             

            8.ブラウザの初期環境構築ツールよりEmbedとの疎通確認をおこなう
              ✓その他タブ > 開発用のデータIDを選択 
              ✓修正編集ボタン押下 > EDI環境設定(現在)を 確認対象のEmbedが所属するプロジェクトに変更
              ✓上書保存 > 接続確認ボタン押下

             

              ✓予めダミーデータをサーバーへ格納してから、
            PATHを同フォルダに変更のうえDirボタンでresult値を確認する

            9.コマンドプロンプトを起動してサービス登録をおこなう
              サービスを登録することで、サーバー再起動時に自動起動(スタートアップ)されます。
              ******************************************************************************************
              sc create synquery-embed binPath= "cmd.exe /c start /d D:\Synquery_EDI\EDI\node.exe --expose-gc --always-compact . ssk"
              ******************************************************************************************

             ※サービスを削除する場合
              ******************************************************************************************
              sc delete synquery-embed
              ******************************************************************************************

            10.SynqueryからEDIサーバー(embed)に対して発行する制御プログラムを作成する
              ✓DriveListの複製(運用環境[ti4r3gdJ] → 動作検証環境[PPnPGXmd])
                File/Database Manager データベースタブ
            コレクション名:Queuing.DriveList
            取得ボタン実行

                ◇貼付時の変更箇所
            {"project":"PPnPGXmd"}検証環境に変更)
            {"session":{"project":"ti4r3gdJ"(設定はそのまま),…
            同期ボタン実行

            11.注文送信テストを実施する
              ① 使用環境:PPnPGXmd + ?develop

              ② 受発注入力画面より、新規登録または複製登録

              ③ EDI送信指示(定時実行)より、テスト対象のEDIグループを確認して
            Ctrlを押しながら試験ボタン押下

              ④ 帳票印刷レイアウトがでればOK
            ※EDI通信ができなかった場合の見直しポイント
                  ✓EDIサーバー自体がオフライン
                  ✓EDIサーバーのembedモジュールが起動していない(項4以降を確認)

              ⑤ EDIサーバーの取引先フォルダを確認し、ファイルが生成されていればOK
              
          • EDI送信設定

            2024年7月現在の設定は次のとおり。
            EDIイベントスケジュール(土日を除く毎日)
            住電:10:15 txtファイル作成 → 10:35 EDIサーバ → NECデータセンター
            住電:15:15 txtファイル作成 → 15:40 EDIサーバ → NECデータセンター
            TMAT:16:35 txtファイル作成 → 16:40 EDIサーバ → NECデータセンター

            EDI接続先の切替方法
            https://www.synquery.com/synquery/tigr3gdJ#dOybyY7w
             ① 初期環境構築ツール→三昌商事株式会社→3.EDI操作
             ② EDI環境設定(現在)の接続確認 通常は ti4r3gdJ_リリース環境 → 【接続確認】をクリック
             ③ 【修正編集】ボタンを押下
             ④ EDI環境設定(向先)をプルダウンで選択 → 【移動実行】をクリック
             ⑤ リブートで10秒待機
            ⑥   【上書保存】をクリック。 初回のみパスワード(SynqueryIDと同じ)を入力
             ※試験で切り替えた際は、試験終了後に ②~⑥を再度実施し ti4r3gdJ_リリース環境 に戻すこと。

            1.新規取引伺書にてEDI用のコードを取得する。【営業

            2.対象商品を.excelでまとめて追加取引先に登録の依頼をおこない、
            その他、下記の取り決め事項を相手方とまとめておく。【営業】
             ・対象地区
             ・送信頻度
             ・送信対象(注文請けの要否)
             ・制限事項(量産のみ or 国内案件 or 短納期品)

            3.EDI グループマスタ登録画面のプルダウンで選択できるよう登録する。【システム課】
             RSD:FINAL
            追加:EDI_GROUP_CD
            追加:EDI_EXP_FOLDER(送信時)TO:
            ["東芝2"]
             追加:EDI_EXP_MAKER(送信時)TO: ["47337-555"]

            4.EDI依頼元に対して送信フォーマットの承認をおこなう。【システム課】
             RSD:EDI注文(送信)トランザクション

              EDI注文(送信)トランザクション SSK.trn.edi_05s_0500 (2017/09/08時点)
              運用:SEI、TMAT

            5.EDI統一企業マスタ登録を実行する。
            【システム課】
              ※事前に以下の情報を収集すること
            1.対営業 EDI用の仕入先コード(新規取引伺書)
            2.対取引先 統一企業コード

            6.EDIグループマスタを登録する。【システム課】
            ※使用地区、グループ、用途をプリセットする。

            7.SSKローカルサーバーのフォルダ設定をおこなう。【システム課】
             
            (大崎さんに確認のうえ)Final > EDI_EXP_FOLDERで定義した名称で登録する。

            例:
             フォルダ名:住電電線2
            フォルダ名:東芝2

            8.送信テストを実施する。【システム課】

                8-1.EDI仕入先品名マスタを登録する。

                  - 仕入先品名コード
                   取引先よりEDI用の商品コードがある場合、その内容を入力する。
                指定が無い場合、現在Sophieで利用中の商品コードで登録する。
                例:商品コード:EU-26056
                仕入先品名コード:EU-26056


                - EDI品名 

                 【使用okの文字
                 「abc123クロ」半角英数カナ
                 「123黒abc」全角英数カナ
                 「.」ピリオド

                 「-」ハイフン
                 「_」アンダーバー
                 「 」スペース

                ※できるだけ半角英数で入力頂くほうが良いです。
                データを送るときに文字化けするため。

                【使用NGの文字

                 「    」tabスペース

                 「,」カンマ

                8-2.EDI需要先マスタを登録する。
                  送信テストのため何か登録する。(本登録は営業が実施)

                8-3.EDI送り先マスタを登録する。
                  送信テストのため何か登録する。(本登録は営業が実施)

                8-4.受発注を入力する。
                  送信テストのため何か登録する。(本登録は営業が実施)

                8-5./?developで送信指示画面にて送信テスト
                  サーバーにファイルが正しく保存されているか確認する。

                8-6.NEC ⇒ 追加取引先へのサーバーの送信設定をおこなう。
                (全銀使用の場合)以下の設定情報をNECより入手
                ・全銀TCP/IP接続条件確認表
                 ・CIIヘッダ情報

                8-7.追加取引先へデータが到達しているか、送信内容に問題が無いか確認する。
              
               以上のすべてを達成して送信テストが完了

            9.各種マスタを登録する。【営業】
            ‐EDI仕入先品名マスタ登録
             ‐EDI需要先マスタ登録
             ‐EDI送り先マスタ登録

            10.SSKローカルサーバーのバッチ設定をおこなう。【システム課】
            MongoDB のデータベース > コレクション名:Queuing.DriveList
            "hankan_edi_sosin_201810010000_999"をコピーする

               ・取引先の変更(例:SU(住電)⇒ TO(東芝))
                  data
                   mem
                    [["div.remote.param",{"action":"shime","settings":{"edi_group_cd":"SU"}}]]

                    ⇒EDIグループコードを変更する。

               ・1日あたり送信回数の変更(例:2回 ⇒ 1回)

            tactics:
              execArgv: ⇒ https://ssk.synquery.com/?remote=hankan_edi_sosin_20190930000_999",{}
                          remote= **** を _idの内容に変更する
            repeat
                   HMS:[values]:15:00 ⇒ valuesで定義した[h]がセットされ、ここでは[分]を定義する。

            unit:h ⇒ 時間単位
                   values:[時] ⇒ 1回の場合、aryは1つでOK




        • SS-Sophie のAddOnモジュール

          • カレンダーモジュール

            ・概要
             カレンダーモジュールではカレンダーの表示機構、予定の登録を機能をベースに外部モジュールとの連携を基本とした公開関数が用意されています。
             カレンダーモジュールを利用するにはワークフローモジュールもセットで利用することになります。

            ・公開関数
             カレンダーモジュールには以下の公開関数があります。
             ・set($dom, category_cd)
            $dom:カレンダーアイコンをセットするDOMを指定します(30px × 30px)
            以下のようなアイコンがセットされます。
            calendar_icon
            アイコンをクリックするとカレンダーが表示されます。
            category_cd:データの管理単位になります。未指定であれば commerce : 流通となります。

            ・表示領域について
             カレンダーモジュールには以下の表示エリアがあります。

             ・年表示
            年表示

             ・月表示
            月のすべてのタスクが一覧として右側にでます。
            それぞれのタスクの一行は各モジュールにより描画されます。


             ・日表示
            クリックされた日付のみのタスクが一覧に表示されます。
            日表示

             ・カレンダー選択
            ログイン者の権限を利用した表示対象の社員を選択
            会議室マスタ(mst.gp: category_cd(rooms))に登録されたroom の一覧
            各モジュールにより表示対象とする対象者
            を選択する画面になります。(現在開発中)


             ・検索ダイアログ
            フリーワードによる検索と各モジュール特有の検索条件を表示するダイアログです。
            検索対象文字列は、search.tags に保持されているキーワードになります。
            データの保存時に検索させたいフィールドをfn.async.setTags()関数に渡して、 search.tags にセットしておく必要があります。
            fn.async.setTags(doc, fields, save_field_name, normalize)
            doc : 検索キーワードを埋め込むデータ
            fields : 埋め込むデータ上にある検索キーワードを保持しているフィールドの名称(複数は配列で指定)
            save_field_name : 検索用のフィールド名(デフォルトはsearch.tags)
            normalize : 検索キーワードをnormalize するかどうかのフラグ(デフォルトはTRUE)


             ・新規入力画面
            カレンダー標準のイベント(タスク)登録画面になります。
            場所(の下のドロップダウン)よりroom を選ぶと会議室の予定としても登録されます。


          • ワークフローモジュール

            ・概要
             ワークフローモジュールでは日付ごとのタスク一覧表示構、外部モジュールとの連携を基本とした公開関数が用意されています。
             ワークフローモジュールを利用するにはカレンダーモジュールもセットで利用することになります。

            ・公開関数
             ワークフローモジュールには以下の公開関数があります。
             ・set($dom)
            ワークフローのタスク一覧を指定したDOMに貼り付けます
            $dom:ワークフローのタスク一覧をセットするDOMを指定します。
            タスク一覧は指定されたDOMに100%の幅で描画されます。
             ・bindCalendarTargetFilter(type, func)
            カレンダーにおいて「カレンダー」の選択肢(人)をフィルターする関数を指定します
            type:自身のモジュールタイプを指定します。
            func : 内部でtype付きで呼び出された際に実行する関数を指定します
             ・bindSearch(type, func)
            カレンダーにおいて「検索」ダイアログに表示する検索条件を指定、setupする関数を指定します。
            type:自身のモジュールタイプを指定します。
            func : 内部でtype付きで呼び出された際に実行する関数を指定します
             ・bindPopup(type, func)
            カレンダー、もしくは、作業一覧のボタンクリック時にポップアップを表示する際その関数を指定します。
            type:自身のモジュールタイプを指定します。
            func : 内部でtype付きで呼び出された際に実行する関数を指定します
             ・bindInput(type, func)
            カレンダーのタスク一覧で明細の入力画面を表示するのに利用する関数を指定します。
            type:自身のモジュールタイプを指定します。
            func : 内部でtype付きで呼び出された際に実行する関数を指定します
             ・bindDel(type, func)
            カレンダーのタスク一覧で、削除ボタンを押された際に実行する関数を指定します。
            type:自身のモジュールタイプを指定します。
            func : 内部でtype付きで呼び出された際に実行する関数を指定します
             ・bindMakeSelector(type, func)
            カレンダーの検索画面で、「検索」ボタンを押された際に実行する関数を指定します。
            指定した関数内で自分のセットアップした検索条件画面から検索条件を生成して返してください。
            type:自身のモジュールタイプを指定します。
            func : 内部でtype付きで呼び出された際に実行する関数を指定します
             ・setTaskLine($dom)
            カレンダーのタスク一覧に1つのタスクごとの描画を行う関数を指定します
            指定が無い場合、ワークフローの標準描画関数が利用されます
            type:自身のモジュールタイプを指定します。
            func : 内部でtype付きで呼び出された際に実行する関数を指定します
             ・showList($blk, args)
            カレンダーモジュールからcall され、タスク一覧を描画する関数です。
            $blk:カレンダーの更新対象DOMを指定します。
            args : タスク一覧を描画するのに用いるパラメータになり、以下の情報を渡します。
            ym: 表示対象年月
            date: カレンダーで特定の日付の情報を描画する際に渡します。デフォルトは1。
            worker: 作業者を渡します(現在未使用)
            selector: dtl.object を検索するための追加条件を渡します(カレンダーの検索ダイアログ)
            cds: 表示対象の社員コードの配列を渡します
             ・input()
            ワークフローの入力DOMを返します。
             ・showInput()
            ワークフローの入力欄を表示します。
            タスク一覧を非表示にして、エラーメッセージエリアを初期化します。
             ・hideInput()
            ワークフローの入力欄を非表示にします。
            直接ログインモードの場合は画面を閉じます。
            それ以外は、タスク一覧を再表示します。
             ・setSubject(type, subject)
            ワークフローの入力欄のタイトル部分に件名を表示します。
            type:自身のモジュールタイプを指定します。
            subject : タイトルに表示したい文字列を指定します
             ・setBtns(type, btns)
            ワークフローの入力欄のボタンエリア部分にボタンを表示します。
            type:自身のモジュールタイプを指定します。
            btns : 表示したいボタン(イベント付き)を渡します。(配列)
             ・showErr(type, msgs)
            ワークフローの入力欄のエラーメッセージエリア部分にエラーを表示します。
            type:自身のモジュールタイプを指定します。
            msgs : 表示したいエラーメッセージを渡します。(配列)
             ・setStamp(type, stamp)
            ワークフローの入力欄のエラーメッセージエリア部分にエラーを表示します。
            type:自身のモジュールタイプを指定します。
            msgs : 表示したいエラーメッセージを渡します。(配列)
             ・setKigen($dom)
            ワークフローの入力欄のエラーメッセージエリア部分にエラーを表示します。
            type:自身のモジュールタイプを指定します。
            msgs : 表示したいエラーメッセージを渡します。(配列)
             ・getTarget(type)
            カレンダーモジュールからcall され、各モジュールタイプごとにbindCalendarTargetFilterに指定した関数が実行されます。
            type:自身のモジュールタイプが指定されます。
             ・setupSearch(type, $type_search_area, book)
            カレンダーモジュールの検索画面表示ボタン(虫眼鏡)をクリックされた際に、各モジュールタイプごとに
            bindSearchに指定した関数が実行されます。
            type:自身のモジュールタイプを指定します。
            $type_search_area : カレンダー上の検索画面の外部モジュール用のDOMエリアです。
            book : カレンダーモジュールのbook オブジェクトです
             ・makeSelector($dom)
            カレンダーモジュールの検索画面上の、「検索」ボタンをクリックされた際に、各モジュールタイプごとに
            bindMakeSelectorに指定した関数が実行されます。
            type:自身のモジュールタイプを指定します。
            book : カレンダーモジュールのbook オブジェクトです

            ・使い方事例
             (準備中)

          • 日めくり設定

            日めくりメッセージを設定したい場合、mst.himekuri データを投入します。
            kaisha_cd を付与しないデータを作成すれば、プロジェクト内で共有される日めくりメッセージデータとなります。
          • システム設定

            本項では、「システム設定」画面にて各種挙動を制御する定義について記載します。
            SSK運用リリース後に機能改善等の要望で追加しているものになります。

            (初期設定)公開機能リスト
            公開機能リストは、メニューのタブの管理、承認処理権限などの権限を管理するものになります。
            初期構成として提供される機能は、各商流に依存します。
            これらは商流により追加されたりしていますが、契約に基づいてシステム管理者が設定するものとなり、エンドユーザーには公開できないものになります。
            ・現在ある機能リスト(キーは社外秘になります)
            ・MENU
            ・管理者
            ・販売
            ・経費
            ・経理
            ・会計
            ・会計管理
            ・内部監査
            ・外注仕入先(SSKにて追加)
            ・外注販売先(SSKにて追加)
            ・外注倉庫(SSKにて追加)
            ・作業者(商流:業務委託管理にて追加)
            ・台帳・イベント(商流:資産管理システムにて追加)
            ・カレンダー(商流:資産管理システムにて追加)
            ・資産管理(商流:資産管理システムにて追加)
            ・資産分析(商流:資産管理システムにて追加)
            ・PROG
            ・予約実行
            ・経費承認
            ・経費決済
            ・与信管理
            ・EB作成
            ・自動仕訳
            ・作業者管理(商流:業務委託管理にて追加)
            ・出力(商流:資産管理システムにて追加)
            ・ラベル印刷(商流:資産管理システムにて追加)

            利用カレンダー(商流:業務委託管理、資産管理システムにて追加)
            上述にある「カレンダー」、「ワークフロー」モジュールを導入する際にカレンダーの分類を指定します。
            デフォルトは、「private(スケジュール)」、「room(会議室)」になります。
            上記のモジュールはライブラリとして提供されており、独自の入力項目や画面や処理を連動させることで作業管理やアラート設定等を利用することが可能となります。
            例)
            業務委託管理「anken(作業管理)」では「作業マスタ」を利用してフローのチェックやアラートを実装しています。(詳細は「別商流について」を参照のこと)
            資産管理システム「eigyo(営業行動予定)」では、営業の訪問予定等をイベント台帳に登録、週報としての出力(データ出力機構利用)が実装されています。(詳細は「別商流について」を参照のこと)

            利用カレンダー名(商流:資産管理システムにて追加)
            資産管理では、通常のスケジュールとは別のイベント(訪問予定)の入力をカレンダーの「+(追加)」ボタンより呼び出す仕組みを実装しています。その際に入力先を選択する選択肢名として定義しています。

            販売先一括登録機能(商流:中小商社向けシステムにて追加)
            外部で管理している販売先のデータを所定のフォーマットにより取り込むことが可能になるフラグです。
            (デフォルトはFALSE)
            TRUEにした場合、「販売先一覧」画面に、「一括登録」ボタンが表示されます。


            ※「レイアウトダウンロード」ボタンをクリックすることで取り込みフォーマットをダウンロードできます。
            ※取引先も登録する場合は同じコードで、枝番が空のデータをそのグループの先頭に入れてください。

            仕入先一括登録機能 (商流:中小商社向けシステムにて追加)
            外部で管理している販売先のデータを所定のフォーマットにより取り込むことが可能になるフラグです。
            (デフォルトはFALSE)
            取り込みする場合の設定等は「販売先一括登録機能」と同様になります。

            ・倉庫一括登録機能(現在未使用)

            入金・支払種別初期化機能(商流:中小商社向けシステムにて追加)
            「自動仕訳設定マスタ登録」画面にて利用される「入金種別」、「支払種別」を現在の口座マスタの情報にてリセットする機能です。
            (デフォルトはFALSE)

            商品コード手入力(商流:中小商社向けシステムにて追加)
            商品コードはデフォルトでは自動発番される仕組みとなっていますが、このフラグにより手入力で採番することが可能になります。
            (デフォルトはFALSE)
            ※合わせて、「(初期値)商品接頭辞」、「(初期値)商品接尾辞」を定義することで固定の接頭辞、接尾辞を付与することが可能です。

            ダイアログからの新規マスタ登録(商流:中小商社向けシステムにて追加)
            通常、参照ダイアログで選択が可能なマスタの選択肢は、事前にマスタ登録をしておく必要がありますが、こちらのフラグにより、以下の項目について「参照ダイアログ」表示時に必要なマスタが登録されていなかった場合に、別ウィンドウ(もしくはタブ)に自動ログインして「それぞれのマスタ登録」画面が表示され、新規登録が可能となります。
            ・対応項目
            ・販売先マスタ
            ・仕入先マスタ
            ・取引先マスタ
            ・倉庫マスタ
            ・商品・商品構成マスタ
            ※本機能の利用するマスタについては、fn.async.showXXXXDialog 内のstyleプロパティの設定が必要です

            帳票RSD設定商流:中小商社向けシステムにて追加)
            基本帳票を用意してある画面から別の帳票出力を行ないたい場合に指定します。
            キー:帳票を呼び出す際のモジュールID(fn.async.loadReportに渡すもの)
            値 :RSD ID

            受渡場所管理区分商流:中小商社向けシステムにて追加)
            デフォルトで、販売先に紐付きされる受渡場所の管理区分を「TRAD」にすることで「販売先」ではなく、「取引先」単位で受渡場所を管理することができます。
            (デフォルト:NULL、もしくは、USER)

            更新時印刷フラグ(商流:小売業向けシステムにて追加)
            SS-Sophieの初期設定では、販売系データの登録・更新時に帳票が印刷されますが、その機能をOFFにすることができます。




          • 別商流について

            別商流とは、SS-Sophieをベースとして別の業種向けにプロジェクトを分けているものをさします。
            現状以下の商流があります。
            SS-Sophie(ベースプロジェクト:)
            SS-Sophieの中にて拡張されているもののみを記載します。
            ◇追加された機能:
            アラート確認画面(業務委託管理システムにて追加)
            リモートバッチやアラート機能の状態を監視するためのツール。タスク実行結果や、エラーログ等も閲覧可能であり、緊急時にはアラート・ドライブリストの初期化も行うことができます。
            販売先マスタ登録画面(業務委託管理システム、中小商社向けシステムにて改変)
            入力項目に「担当者所属」、「担当者名」、「電話番号」、「メールアドレス」を追加
            仕入先マスタ登録画面(業務委託管理システム、中小商社向けシステムにて改変)
            入力項目に「担当者所属」、「担当者名」、「電話番号」、「メールアドレス」を追加

            業務委託管理システム(ベースプロジェクト:g8V9MiAD)
            案件の登録・管理と、作業者(人材派遣)の管理、受託業務の作業タスクの登録、タスクに対する自動メール送信、時間超過アラート、作業実績管理等を行うための運用者様用のシステムになります。
            ◇追加された機能:
            案件入力画面
            案件一覧画面
            作業マスタ登録画面
            作業マスタ一覧
            アラート確認画面(SS-Sophie)
            管理項目登録(資産管理システム)
            ◇forkされた機能:
            社員一覧・社員登録マスタ
            →商品マスタ連携、作業者区分、社員分類の追加
            作業場所一覧・作業場所マスタ登録(元倉庫一覧・倉庫マスタ登録)
            →CSVからの一括登録機能の追加
            デモ環境:
            小売業向けシステム(ベースプロジェクト:Yp1IRX17)
            Airレジなどの外部端末にて、日々小売を行う業種様用のシステムになります。
            ◇追加された機能:
            売上一覧画面
            →外部売上データ取り込み機能(インポート)
            →上記に関連した受発注データ・売上データ・入金データの自動生成機能
            棚卸入力・反映処理画面
            →棚卸事由に、「商品付替」を追加
            ◇forkされた機能:

            デモ環境:
            中小商社向けシステム(ベースプロジェクト:hiAGazJl)
            大規模な仕組みではなく、小規模の取引や突発的な取引の多い中小商社様用のシステムになります。
            ◇追加された機能:
            見積入力画面+見積書2(帳票)
            見積一覧画面
            注文書2(出力内容等の変更により追加)
            ◇forkされた機能:

            デモ環境:
            製造業向けシステム(ベースプロジェクト:ZKi2EkOC)
            仕入材料から、別の加工品を作成(商品加工)や、仕入材料を小分けにして別商品にする(商品付替)、また、フォーキャストとの連携をスムーズにする(在庫原価の自動計算やスライド処理)を行ない、製造業の業務を効率化するためのシステムになります。
            ◇追加された機能:
            フォーキャスト入力画面
            フォーキャスト一覧画面
            加工指示入力画面
            加工指示一覧
            ◇forkされた機能:
            商品・商品構成マスタ登録画面(商品一覧・商品マスタ登録を拡張)
            商品・商品構成一覧(商品一覧・商品マスタ登録を拡張)
            デモ環境:
            資産管理システム(ベースプロジェクト:)
            人・もの・金などのEXCEL等で管理されているような、「資産」、「文書」、「情報」等を利用者の任意でマスタ設計〜データ登録、データ出力ができる汎用的なデータ機構を保持したシステムになります。
            カレンダーとの連動により、「契約書の更新」等の期限のあるイベントに対して利用者への通知(メール、SMS)を行うことが可能になります。
            ◇追加された機能:
            管理項目登録(画面)
            ◇forkされた機能:

            デモ環境:

        • 別商流にて追加された機能

          本項では、別商流にて追加された機能について記載します。
          • FINAL(システム設定)によるもの

            ここでは、FINALの定義(一部は、システム設定画面にて制御可能)により実装されている機能一覧です。


            業務委託管理(人材派遣系)

            キー/設定名説明のその効果
            CALENDAR.TARGET
            表示対象カレンダー
            CALENDAR.TARGET_NM
            表示対象カレンダー名称
            カレンダー機能を利用する際の、カレンダーカテゴリになります。
            カテゴリごとに実装モジュール(RSD)を用意する必要があります。
            ・FINAL初期値
            // カレンダー
            CALENDAR: {
            TARGET: 'private,room',
            TARGET_NM: {'private': "スケジュール"},
            CATEGORY: 'commerce',
            ICON: FALSE,
            LOAD_ON_BACKGROUND: FALSE,
            DOM: NULL,
            SHOW_ON_SET: FALSE,
            TODAY_TIMER: FALSE,
            EDIT_TEXT: NULL,
            DEL_TEXT: NULL,
            SEEK: 'useDataQuery'
            },
            ・システム設定

            ・サンプルイメージ

            中小商社向け
            キー/設定名説明のその効果
            USE_USER_IMPORT
            販売先一括登録機能
            販売先マスタのデータを任意のフォーマットで取り込むことができるようになる機能です。
            フォーマットを定義するRSDを用意する必要があります。
            ・FINAL初期値
            'USE_USER_IMPORT': FALSE,
            ・機能利用時のイメージ


            USE_MAKER_IMPORT
            仕入先一括登録機能
            仕入先マスタのデータを任意のフォーマットで取り込むことができるようになる機能です。
            フォーマットを定義するRSDを用意する必要があります。
            ・FINAL初期値
            'USE_MAKER_IMPORT': FALSE,
            ・機能利用時のイメージ


            USE_SOUKO_IMPORT
            作業場所(倉庫)一括登録機能
            倉庫マスタのデータを任意のフォーマットで取り込むことができるようになる機能です。
            フォーマットを定義するRSDを用意する必要があります。
            ・FINAL初期値
            'USE_SOUKO_IMPORT': FALSE,
            ・機能利用時のイメージ


            USE_KIND_KBN_INIT
            入金・支払種別再構成機能
            口座マスタの登録に基づいて「各種区分マスタ」の「入金種別」、「支払種別」の初期設定、および、「自動仕訳設定マスタ」の設定値を再構築することができます。
            ※登録済みのデータは初期化されますので実行には十分お気をつけください。
            以下のルールに基づいてデータが生成されます。
            ・<固定>
            (01|02)-JPY-000: 000(未設定)JPY
            ・<入金固定>
            01-JPY-001: 001売掛現金回収(未設定)JPY
            01-JPY-099: 099売掛振込手数料 JPY
            01-JPY-100: 100売掛手形回収 JPY
            ・<支払固定>
            ・<口座ごと>
            01-JPY-0n1: 0n1売掛(口座名)振込 JPY
            01-JPY-0n2: 0n2売掛(口座名)送金 JPY
            01-JPY-0n5: 0n5売掛(口座名)小切手 JPY
            ※JPY、USDがそれぞれ作られます
            ※0n1 などのn は 1からの連番
            ※詳しくは、「各種区分マスタ登録画面」のRSD、もしくは、
            初期設定マニュアル(会計モジュールを利用する前に:各種区分マスタの登録)」を参照してください。
            ※自動仕訳設定についてはすべてが生成されませんので別途確認してください。
            ・機能利用時のイメージ


            SHOHIN_CD_EDITABLE
            商品コード手動設定
            商品マスタ(商品構成マスタ)のコード値を手動で定義できるようにするプロパティです。
            後述のDefault.shohin_prefix/ Default.shohin.suffix を利用して固定文字列を前後に付与することができます。
            ※prefix 、suffix は初期値であり、画面上で編集もできます。
            ・FINAL初期値
            'SHOHIN_CD_EDITABLE': FALSE,
            ・機能利用時のイメージ

            Default.shohin_prefix
            (初期値)商品接頭辞
            商品コードの接頭辞を指定できます。
            ※SHOHIN_CD_EDITABLE == TRUE の場合にのみ利用できます。
            ・FINAL初期値
            なし
            ・システム設定

            Default.shohin_suffix
            (初期値)商品接尾辞
            商品コードの接尾辞を指定できます。
            ※SHOHIN_CD_EDITABLE == TRUE の場合にのみ利用できます。
            ・FINAL初期値
            なし
            ・システム設定

            ADD_ON_DIALOG
            ダイアログからの新規登録機能
            参照ダイアログを開いた際に、そのマスタの新規登録画面を別のタブとして開く機能を利用できます。
            ※自動ログインします。登録後はタブを閉じて、参照ダイアログで検索すると選択できるようになります。
            ※現在対応しているダイアログ。
            ・販売先マスタ
            ・仕入先マスタ
            ・倉庫マスタ
            ・商品マスタ
            ・受渡場所マスタ
            ・引渡先マスタ
            ・FINAL初期値
            'ADD_ON_DIALOG': FALSE,
            ・機能利用時のイメージ

            REPORT_RSDS
            帳票RSD設定
            画面より出力する系の帳票RSDを変更する設定になります。
            ※呼び出すRSDを別途用意する必要があります。
            ・FINAL初期値
            なし
            ・システム設定

            UWBASHO_KANRI_KBN
            受渡場所管理区分
            受渡場所は、本来「USER:販売先」に紐付きますが、この設定により「TRAD:取引先」ごとに管理できるようにも設定できます。
            ・FINAL初期値
            'UWBASHO_KANRI_KBN': "USER", // USER OR TRAD
            ・システム設定

            ・サンプルイメージ

            Default.print_on_update
            (初期値)更新時印刷フラグ
            販売系の各画面において、新規登録時/更新時に印刷を実行するかを切り替えできます。
            FALSEを指定することで、更新時には印刷ダイアログが表示されなくなります。
            ※画面下部の「印刷」ボタンからは印刷可能です。
            ・FINAL初期値
            print_on_update: TRUE,
            Default.print_kakunin
            (初期値)確認票印刷フラグ
            販売系の各画面において、新規登録時/更新時に「確認票」を必須選択にするかを切り替えできます。
            FALSEを指定することで、更新時にロックされている「確認票」にチェックが付かなくなります。
            ・FINAL初期値
            print_kakunin: TRUE,
            ・FALSE 時イメージ

            Default.tax_hasu_shori
            (初期値)消費税端数処理区分
            消費税計算の際に、端数処理(0:切り捨て、1:四捨五入、2:切り上げ)をどうするかを指定できます。
            ・FINAL初期値
            tax_hasu_shori: 1, // 四捨五入
            ・消費税に関する法律についての資料(OBCのサイトから)
            https://www.obc.co.jp/360/list/post74
            TOGGLE_ON_DIALOG
            ダイアログ上での切替機能
            参照ダイアログにおいて、表示内容を切り替えるためのボタンを表示し、ボタンのクリックによって表示を切り替える機能を有効にします。
            ・FINAL初期値
            TOGGLE_ON_DIALOG: false, // もしくは定義なし
            ※現在対応しているダイアログ。
            ・商品マスタ参照
            ・実装方法(例:fn.async.showShohinDialog)
              header
            ・切り替え用のラベルを用意し、それぞれの第3引数のオブジェクト内に'class' を定義。
                      ["略名", 140, {
            sort: "ex_nm.s",
            'class': "ex_nm_s", // 切り替える際に利用するクラス名
            }],
            ["RefNo", 140, {
            sort: "ref_number",
            hidden: TRUE, // 初期に非表示にするラベルには' hidden ' プロパティをTRUEに
            'class': "ref_number", // 切り替える際に利用するクラス名
            }],
              body
            ・切り替え用のフィールドを用意し、それぞれの第3引数のオブジェクト内に'class' を定義。
                      ["=ex_nm.s", 140, {
            sort: "ex_nm.s",
            'class': "ex_nm_s", // 切り替える際に利用するクラス名
            }],
            ["=ref_number", 140, {
            sort: "ref_number",
            hidden: TRUE, // 初期に非表示にするラベルには' hidden ' プロパティをTRUEに
            'class': "ref_number", // 切り替える際に利用するクラス名
            }],
              styleプロパティ
            ・トグルするためのクラス名の2次元配列を定義。
                  var styles = {
            title: "商品マスタ参照",
            width: 860,
            tab: "hankan",
            module_id: "s-hankan_shohin",
            toggles: [["ex_nm_s", "maker_shohin_nm", "user_shohin_nm"],["ref_number", "maker_description", "user_description"]]
            }
            ・画面イメージ(初期)

            ・画面イメージ(切り替え後)

            KEIHI_SHIHARAI_KIND_KBN_CDS
            経費支払表示区分
            「経費支払入力画面」では、「各種区分マスタ」の「支払種別」を表示していますが、その対象は、「経費支払区分グループ」が限定されており、「その他」となっている種別が表示されません。
            そのような「支払種別」を表示したい場合に、このプロパティを設定します。
            ・FINAL初期値
            KEIHI_SHIHARAI_KIND_KBN_CDS: null, // もしくは定義なし
            ・サンプル設定

            ・経費支払入力画面での表示

            USE_JISHO
            経費辞書利用
            「経費支払入力」で登録したデータをテンプレートとして保存しておきたい場合にこのフラグをTRUEに設定すると、「承認状態」に「経費辞書」が表示されるようになります。
            「経費辞書」で検索した場合は、期間を無視して検索されます。
            ・FINAL初期値
            USE_JISHO: false, // もしくは定義なし
            ・経費支払一覧

            ・経費支払入力画面

            USE_ODR_EDA
            受発注枝番利用
            実装中。
            ・FINAL初期値
            USE_ODR_EDA: false, // もしくは定義なし
            ・受発注残一覧からの「コピー時」

            ・見積入力画面からの自動生成時

            ※見積書入力画面からの自動生成は「見積書機能」が実装されているプロジェクトに限定されます
            USE_PAYDAY_SLIDE
            支払予定日維持機能
            「支払決裁確定入力画面」では、デフォルトでは、画面上で指定した「決裁日」をもって選択したデータの「支払日」を確定します。(EB作成にて支払日が確定されたものは除く)
            このフラグをTRUEにした場合は、画面上に「予定日維持」ドロップダウンが表示され、「1:する」を選んだ場合は「支払予定日」をそのまま支払日として決裁することができます。
            ※本機能は支払予定日が複数日に渡っているものを一括で処理するための機能になります
            ※支払予定日が計上可能な日付でない場合はエラーとなります。
            ・FINAL初期値
            USE_PAYDAY_SLIDE: false, // もしくは定義なし
            ・「支払決裁確定入力画面」

            USE_REPRINT
            再印刷判定機能
            本来、一度印刷したもの(後に客先に送信されているはずのもの)については再送することはないですが、訂正等で再印刷する場合も存在します。
            その場合に、出力時に「(再)」のマークをつけたい場合にこのフラグをTRUEにします。
            ※ただし、本機能は画面ロジック等への修正が必要になります。
            ・FINAL初期値
            USE_REPRINT: false, // もしくは定義なし
            ※現在対応している再印刷機能。
            ・受発注入力画面(注文書)
            ・受発注残一覧画面(一括注文書)
            ・売上一覧画面(経理タブより。Twinlinks様専用RSDにて対応)
            ・画面イメージ(受発注残一覧)

            ・画面イメージ(売上一覧)


            店舗系(コーヒーショップ)


            製造業向け(加工・商品構成・フォーキャスト)


          • RSD複製、もしくは追加

        • SS-Sophie の販売指針

          • 契約に関して


            ● 代理店の責務
            1)販売代理店契約の受諾
            2) synquery ポータルサイトへの定期アクセスし、定期的に業務・運用知識をアップデートする人材の確保
            3)年間販売予測と実績の共有

             販売店の責務
            1)販売店契約の受諾
            2)1つ以上の synquery プロジェクトを保有し、データのチェック等も含めた顧客対応が可能な人材の確保、育成
            3)年間販売予測と実績の共有

          • 価格に関して

            基本モジュールについては販売以下の文書にまとめることとする。 
            モジュールの追加や販売指針も変更あり次第随時追加していくものとする。
            マトリクスで解決できない問題については手塚さんに相談の上、必要に応じて会議を開催すること。
          • 導入に関して

            • 環境の準備

              本製品ではお客様に使っていただくためのテスト環境づくりの機構や、その提供手順書を作成しています。
              製品には大きく「システム共通」「販売」「経費」「経理」「会計」「資産管理」の5つに分かれています。(増える可能性もあります)
              利用開始時にはお客様に提供するモジュールについて、設定を行うようにしてください。
              初期データ投入マニュアル

              なお、大きなデータを扱う取引先では運用中(場合によっては開発中も)は Synquery 上のプロジェクトをわけ、全く別の環境で安全に運用していくこととなります。その場合、あらかじめしっかり運用費、移行費、導入コンサル費を確保することが必要です。お客様にお伝えすることを忘れないようにしてください。
            • リモートバッチの設定

              本製品では Synquery の基盤技術であるリモートバッチの利用設定が必要です。
              以下の手順で設定を行ってください。
              (1) 社員に remoteUser を加え、FINAL の remoteUser、remotePass を設定する
              (2) 設定したユーザーでの SOPHIE ログインを確認し、ログイン時のトークンを東雲に連絡する
              トークン取得に必要なコンソールで入力するコマンドは以下の通り。
                db = $S.DB()
              db._token
              (3) 運用に必要な SOPHIE のタスクを Queuing.DriveList コレクションに追加する

            • カレンダー機能タスクの設定

              カレンダーのアラーム機能の導入には特別な設定が必要となるため、以下の設定を実施すること。
              (1) 社員に remoteUser を加え、FINAL の remoteUser、remotePass を設定する
              (2) 設定したユーザーでの SOPHIE ログインを確認し、ログイン時のトークンを東雲に連絡する
              (3) Queuing.DriveList に以下登録テンプレートから作成した情報を追加する(会社コードごと)
              (4) アラート情報の登録(アラート登録画面から行う。会社コードごとに必要)
              (5) 動作確認
              // <登録テンプレート>
              // 会社コードごとに1データ用意します
              // _id は自由に設定してよいですが、「カテゴリ_alert_登録日時_プロジェクト名_会社コード」を標準形とします。
              // オブジェクトは大きいですが、変更箇所は (*)のついた 7箇所です
              { "_id":"anken_alert_201901010000_g8V9MiAD_SOB", //(*1)任意の文字列を設定。迷うときは「カテゴリ_alert_登録日時_プロジェクト名_会社コード」としてください "name":"(1) [ANKEN] Alert Timer(dev)", //(変更自由) "explain":"スケジュールを監視、実行する", //(変更自由) "tactics":[ [ "phantomAction",{ "API":"SeleniumAPI","execArgv":[ "https://synquery.com/g8V9MiAD?kcd=SOB&remote=anken_alert_201901010000_g8V9MiAD_SOB", //(*2)実行するプロジェクトコード、会社コードと、_id に設定した文字列の3つを置き換え { } ], "script":"https://ssk.synquery.com/J0jcGMqS.js", "scriptType":"url","timeout":600000} ]], "repeat":{ "YMD":"2019/01/01", "HMS":"00:00:00", "zone":32400000,"unit":"m", "values":[0,5,10,15,20,25,30,35,40,45,50,55] }, "assign":null, "create":"2019-01-01T00:00:00.000Z", "data":{ "kaisha_cd":"SOB", //(*3)実行する会社コードに変更 "mdl_kbn":"cmn", "mdl_key":"facility_alert", "mdl_tab":"base.kanri", //(アラートメニューの置き場が変更される場合はここを モジュール名.タブ名 に変更) "mem":[ ["div.remote.param",{ }] ], "shain":{"cd":9999 } }, "last_result":{ }, "notify":{ "subject":"スケジュール 実行結果:%_Task.State_%","always":[ ], "body":"%_Task.Name_%\n %_Task.ResultLog_%", "mailto":[ "xxx@xxx.co.jp" ] }, //(*4)エラー発生時等の通知アドレスを設定 "parent":null, "project":"g8V9MiAD", //(*5)実行プロジェクトを設定 "runner":{ "_id":"5c473706c376e47d642a59a8","hostname":"10.1.201.201","subnet":null }, "session":{ "project":"g8V9MiAD", //(*6)実行プロジェクトを設定 "token":"2aa6903c40b0f64600ab680936f11baf64b25f9c06812d68c727ab5125d94b24", //(*7)東雲に連絡した token を設定 "use":"mosession" }, "stamp":"2019-01-01T00:00:00.000Z", "start":"2019-01-01T00:00:00.000Z", "start_first":null, "start_limit":null, "state":"repeating", "tags":["SOPHIE","calendar"], "update":{"stamp":"2019-01-01T00:00:00.000Z" }, "user":null
              }
              ● アラートタスクのデバック方法 

              アラートのデバッグ方法には以下の 5 つがあります。順次実行してエラーの原因を特定してください。
              (1) Queuing.Log の結果を見る。(タイムスタンプキーは stamp です。)
              (2) dtl.object の { category_cd: "errorLog" } のデータを見る。(タイムスタンプキーは _stamp です。)
              (3) dtl.object の { category_cd: "alertLog" } のデータを見る。(タイムスタンプキーは _stamp です。)
              (4) Queuing.DriveList の登録データで tactics.execArgv に登録されている URL を直接画面で実行してデバッグする 

              ● アラートタスクが止まっているように見える 

              アラートの呼び出し判定ロジックは、DBに保管されています。
              そのため、リモートで実行された際もdebuggerは有効になり、そこで処理が待機状態になってしまうことに注意してください。

              ● 開発環境で作った呼び出し用の関数がないと言われる 

              開発環境には、URLに?developがついています。
              アラートの実行(リモートバッチ)に登録されている実行URL(リモートユーザーが実行するためのURL)がどうなっているかを必ず確認してください。
              (上記の(5)登録テンプレートのtactics内のURLです)

              ● 適時に発報させるための設定 

              アラートは上記で定義したDriveListの時間間隔ごとに検索され、アラートの設定間隔にて対象データ(dtl.object)を検索にいきます。タスクの発報等のタイミングは0分、5分、10分など切りの良い時間に設定することが主になるのでアラートの検索範囲を0分、5分、10分という間隔にするとうまくひっかからない可能性があります。そのためDriveList、アラートとも以下のような区切りで定義すると良いです。
              DriveList:4、9、14、19、24、29、34、39、44、49、54、59
              アラート:4、9、14、19、24、29、34、39、44、49、54、59
              例えば、12:04:12にDriveListが起動した場合のデータ抽出される時間間隔は以下のようになります。

              アラートの抽出:前日の12:04:12〜当日の12:09:12
              dtl.objectの抽出:12:04:00〜12:08:30
              これにより、dtl.objectの発報タイミングが12:05:00のものが処理されることになります。