未発注レコード全件取得後、メール送信、発注済みに変換

背景・実現したいこと

・ 一括発注ボタンを作成。

・処理内容は、queryに’orderAgree in (“未発注”)’を指定後、APIにてrecords取得

発注No、仕入先コードに合わせて発注内容をまとめた後、

メール送信プログラム(弊社サーバー内にあるリンク)に

データをPOST送信、受け取ったデータでメール文面作成後、仕入先に送信する。

その後、「未発注」を「発注済」に変更する。

・上記カスタマイズを作成したアプリをお客様に提供した後、

お問い合わせが入る。

・お問い合わせ内容「

現状、発注時に数十社の発注確定した際に8社分しかメール送信されていません

件数や会社を変えて試したのですが、どの場合も上記状況となっています

何か考えられることはありますでしょうか」

・テスト環境にてテストを行ったが上記現象が確認できず

アプリ内のレコード状態を本番環境に近いものに変更しても

再現がとれず、こちらにお問い合わせする形になりました。

 

発注メール送信部分 ソースコード

var DataArr = [];  //送りつけるデータ用
var DataCnt = 0;  //データ用
var BlackList = [];  //送信しないデータ
var HaccyuArr = [];  //発注をかけるデータ
//var HaccyuArr = [];
for(var i=0; i<sendArr.length; i++){
  if(BlackList.indexOf(sendArr[i]['レコード番号']['value'])<0){
    
    //////////////////////////////////////////////////////////////
    // / / / / / /  発注するデータをメールで送信  / / / / / / / //
    //////////////////////////////////////////////////////////////
    //仕入れ先マスターからレコードとメールアドレスをとってくる
    var query = 'companyCode = "' + sendArr[i]['companyCode']['value'] + '"';
    var appUrl2 = kintone.api.url('/k/v1/records')+'?app='+SIIRE_APP_ID+'&id=companyCode&query='+encodeURIComponent(query);
    
    var xmlHttp2;
    xmlHttp2 = new XMLHttpRequest();
    xmlHttp2.open("GET",appUrl2,false);
    xmlHttp2.setRequestHeader('X-Requested-With','XMLHttpRequest');
    xmlHttp2.send(null);
    var obj2 = JSON.parse(xmlHttp2.responseText);
    var getRec = obj2['records'];
    if(getRec.length == 0){
      window.alert("仕入先マスタに"+sendArr[i]['partner']['value']+"がありません");
      for(var j=i; j<sendArr.length; j++){
        if(HaccyuNum == sendArr[j]['発注No']['value']){
          BlackList.push(sendArr[j]['レコード番号']['value']);
        }
      }
    }else{
      var siireCode =  getRec['0']['companyCode']['value'];
      var siireName = getRec['0']['partner']['value'];
      var HaccyuNum = sendArr[i]['発注No']['value'];
      //var mailRadioButton = getRec['0']['mailRadioButton']['value'];
      var mail = getRec['0']['メールアドレス']['value'];
      if(mail == ""){
        window.alert("仕入先マスタの"+sendArr[i]['partner']['value']+"にメールアドレスがありません");
        for(var j=i; j<sendArr.length; j++){
          if(HaccyuNum == sendArr[j]['発注No']['value']){
            BlackList.push(sendArr[j]['レコード番号']['value']);
          }
        }
      }else{
        if(getRec['0']['mailRadioButton']['value'] === '送信する'){
          DataArr[DataCnt] = [];
          DataArr[DataCnt]['value'] = DataCnt;
          DataArr[DataCnt][HaccyuNum] = [];
          DataArr[DataCnt][HaccyuNum]['value'] = HaccyuNum;
          DataArr[DataCnt][HaccyuNum]['仕入先名'] = siireName;
          DataArr[DataCnt][HaccyuNum]['Mail'] = mail;
          //DataArr[DataCnt][HaccyuNum]['発注内容'] = [];
          var cnt = 0;
          var s_arr = [];
          var width = 7;
          for(var j=i; j<sendArr.length; j++){
            if(HaccyuNum == sendArr[j]['発注No']['value']){
              s_arr[cnt*width] = sendArr[j]['JANコード']['value'];
              s_arr[cnt*width+1] = sendArr[j]['商品名']['value'];
              s_arr[cnt*width+2] = sendArr[j]['商品名2']['value'];
              s_arr[cnt*width+3] = sendArr[j]['発注数']['value'];
              s_arr[cnt*width+4] = sendArr[j]['単価']['value'];
              s_arr[cnt*width+5] = sendArr[j]['発注金額']['value'];
              s_arr[cnt*width+6] = sendArr[j]['納入希望日']['value'];
              BlackList.push(sendArr[j]['レコード番号']['value']);
              HaccyuArr.push(sendArr[j]['レコード番号']['value']);
              cnt++;
            }
          }
          var va = "";
          va = s_arr.join();
          console.log(va);
          setData(mail,siireCode,HaccyuNum,va);
          DataCnt++;
        }else{
          for(var j=i; j<sendArr.length; j++){
            if(HaccyuNum == sendArr[j]['発注No']['value']){
              BlackList.push(sendArr[j]['レコード番号']['value']);
            }
          }
        }
      }
    }
  }
}

//////////////////////////////////////////////////////
// / / / / / /  未発注を発注済に変換  / / / / / / / //
//////////////////////////////////////////////////////
var error_flg = false;
for(var i=0; i<HaccyuArr.length; i++){
  var objParam = {
    "app": kintone.app.getId(),
    "records": [
      {
        "id": HaccyuArr[i],
        "record": {
          "orderAgree": {
            "value" : '発注済'
          }
        }
      }
    ]
  };
  var appUrl = kintone.api.url('/k/v1/records');
  var token = kintone.getRequestToken();  //CSRFトークンを取得
  objParam[" __REQUEST_TOKEN__"]=token;
  var xmlHttp = new XMLHttpRequest();  //同期リクエストを行う
  xmlHttp.open("PUT",appUrl,false);  //アクセスURLの指定(HTTPメソッド,URL,非同期かどうか)
  //PUT:リソースを作成、置換する
  xmlHttp.setRequestHeader('Content-Type','application/json');
  xmlHttp.setRequestHeader('X-Requested-With','XMLHttpRequest');
  xmlHttp.send(JSON.stringify(objParam));
  if(xmlHttp.status != 200){
    alert('status:'+xmlHttp.status+'登録エラー');
    error_flg = true;
  }
}
if(!error_flg){
  window.alert('全ての処理が完了しました');
}

 レコード取得部分 ソースコード

  //全レコード取得
  var KintoneRecordManager = (function()
  {
    //変数宣言&初期化
    KintoneRecordManager.prototype.records = [];  //取得したレコード
    KintoneRecordManager.prototype.appId = null;  //アプリID
    KintoneRecordManager.prototype.query = '';  //検索クエリ
    KintoneRecordManager.prototype.limit = 500;  //一回あたりの最大取得件数
    KintoneRecordManager.prototype.offset = 0;  //オフセット
    KintoneRecordManager.prototype.currentQuery = kintone.app.getQueryCondition();

    function KintoneRecordManager(){
      this.appId = kintone.app.getId();
    }

    //すべてのレコードを取得する
    KintoneRecordManager.prototype.getRecords = function(callback)
    {
      var current_query = this.currentQuery;
      if(current_query != ''){
        current_query += ' and ';
      }
      current_query += 'orderAgree in ("未発注") limit ' + this.limit + ' offset ' + this.offset;
      kintone.api
      (
        kintone.api.url('/k/v1/records',true),
        'GET',
        {
          app: this.appId,
          query: current_query,
        },
        (function(_this)
        {
          return function(res)
          {
            var len;
            Array.prototype.push.apply(_this.records, res.records);
            len = res.records.length;
            _this.offset += len;
            if(len < _this.limit)//まだレコードがあるか?
            {
              _this.ready = true;
              if(callback !== null)
              {
                callback(_this.records);//レコード取得後のcallback
              }
            }else{
              _this.getRecords(callback);//自分自身をコール
            }
          }
        })(this)
      );
    };
    
    return KintoneRecordManager;
})();

 

以上が使用しているソースコードになります。

8件しかメール送信できない原因について

なにかヒントになるものがございましたら

ご教示いただければ幸いです

 

以上、よろしくお願いいたします

 

全て見たわけではありませんが、ぱっと見て気になったところとして

  var query = 'companyCode = "' + sendArr[i]['companyCode']['value'] + '"';
    var appUrl2 = kintone.api.url('/k/v1/records')+'?app='+SIIRE_APP_ID+'&id=companyCode&query='+encodeURIComponent(query);

「id=companyCode」は不要かと思います。API自体がエラーになることはありませんが、今後の不具合の可能性になるかもしれません。

      if(getRec['0']['mailRadioButton']['value'] === '送信する'){
        DataArr[DataCnt] = [];
        DataArr[DataCnt]['value'] = DataCnt;
        DataArr[DataCnt][HaccyuNum] = [];
        DataArr[DataCnt][HaccyuNum]['value'] = HaccyuNum;
          DataArr[DataCnt][HaccyuNum]['仕入先名'] = siireName;
        DataArr[DataCnt][HaccyuNum]['Mail'] = mail;

空の配列に対してvalueやhaccyuNumを代入しようとしています。

恐らくは「DataArr[DataCnt] = {};」ではないのかと思います。