プロセス管理、ステータスの初期値について

お世話になっております。

 

掲題の件、プロセス管理のステータスの初期値を任意に変更したいと考えております。

Aアプリにプロセス管理を設定しており、

外部システムからPOSTを使用しAアプリにレコードを作成した際、プロセスのステータスが最初のステータスになっています。

 

最初のステータスは作業者を「作業者を設定しない」か「作成者」にしか設定できないため、ユーザーの誰かが最初のステータスを変更し、次のステータスに変更しなければならないのですが、

この、誰かが最初のステータスを変更するという手間を省けないかなと思っております。

 

POSTでレコードを登録する際、プロセス管理のステータスを指定の値に変更することは可能なのでしょうか?

外部システムからPOSTされてくるレコードのステータスを変更するとなると、(外部システムが調整可能なものか不明ですが)調整可能であれば外部システムでレコード登録(POST)時に、POST完了後に レコードのステータス更新API を続けざまに実行するような連携プログラムにしてしまうというのがスッキリしそうです。

 

ポイントはレコードのステータス更新APIをどうやって実行するかですが、考えうる方法は今回にマッチしなかったり、今はできないものも含めて次の4つくらいになってくると思います。

(1) 画面操作によるレコード登録であればsubmit.successイベントで実行する

(2) 調整可能な外部連携であればレコード登録に続けて実行する(上で書いた方法)

(3) 外部システムのPOSTとは非同期に、ステータス更新するバッチプログラム等を準備する

(4) レコード登録のhookを受けて実行する(AWS Lambda等による)イベントドリブンな別連携の仕組みを考える(今はkintoneがhookしてくれませんが、近く出来るようになる予感)

現状ですと、(2)、(3)のいずれかが現実的な選択肢になりますね。

Ryu Yamashita様

 

お世話になります。

外部システムは、Wordpressで「Cybozu WP to Kintone」というkintoneとの連携プラグインを使用して

kintoneにレコードを登録しています。

 

調整可能なのでプラグインの中身を見て、POST完了時にステータス更新のAPIを実行という処理を実行できるか試してみます。

 

大変参考になりました!ありがとうございます。

(2) の方法を取られるということですね。Cybozu WP to KintoneであればプラグインのPHPを調整しようと思えばできそうですね。ただ、レコードのステータス更新APIも結構クセがあります(具体的にはassineeプロパティの指定が面倒なケースが有ります。決め打ちなら難しくないですが)ので、健闘をお祈りしています。

お世話になります。

 

先日質問させていただいてから試行錯誤しておりますが、

どうにもうまくいきません。

 

Wordpressのプラグインのお話になってしまうので、ここでお聞きするのはお門違いかもしれませんが、

何かアドバイスなどいただければ幸いです。

 

Wordpressのプラグイン【cybozu-wp-to-kintone】にclass-kintone-api.phpというphpファイルがあり、

中身を見ると、kintoneに対してPOSTをしているコードが書かれておりました。

 

以下、該当部分の抜粋です。

==========================================================================================-

/*
* Send form data to Kintone API
* @param string $kintone Shortcode attributes it need for auth.
* @param string $data $_POST data
* @return array true or WP_Error object
* @since 0.1
*/
private static function save_data( $kintone, $data )
{
$url = sprintf(
‘https://%s.cybozu.com/k/v1/record.json’,
$kintone[‘sub_domain’]
);

if ( isset( $kintone[‘basic_auth_user’] ) && isset( $kintone[‘basic_auth_pass’] ) ) {
$headers = Kintone_API::get_request_headers( $kintone[‘token’], $kintone[‘basic_auth_user’], $kintone[‘basic_auth_pass’] );
} else {
$headers = Kintone_API::get_request_headers( $kintone[‘token’] );
}
if ( is_wp_error( $headers ) ) {
return $headers;
}

$headers[‘Content-Type’] = ‘application/json’;

$record = self::parse_record( $data );

$body = array(
‘app’ => $kintone[‘app’],
‘record’ => $record,
);

$res = wp_remote_post(
$url,
array(
‘method’ => ‘POST’,
‘headers’ => $headers,
‘body’ => json_encode( $body ),
)
);

if ( is_wp_error( $res ) ) {

return $res;

/*###############################
* 追加処理 開始
*/###############################

$url_get = ‘https://<サブドメイン名>.cybozu.com/k/v1/records.json?app=382’;
$headers_get = array( ‘X-Cybozu-API-Token’ => ‘<APIトークン>’ );
$res_get = wp_remote_get(
$url_get,
array(
‘headers’ => $headers_get
)
);
$return_value = json_decode( $res_get[‘body’], true );

$recno = $return_value[‘records’][0][‘record_no’][‘value’];

$url_put = sprintf(
‘https://%s.cybozu.com/k/v1/record/status.json’,
$kintone[‘sub_domain’]
);

$body_put = array(
‘app’ => $kintone[‘app’],
‘id’ => $recno,
‘record’ => array(
‘action’ => array(“value” => “申請済み”),
)
);

$res_put = wp_remote_request(
$url_put,
array(
‘method’ => ‘PUT’,
‘headers’ => $headers,
‘body’ => json_encode( $body_put ),
)
);

if ( is_wp_error( $res_put ) ) {
return $res_put;
} elseif ( $res_put[‘response’][‘code’] !== 200 ) {
$message = json_decode( $res_put[‘body’], true );
$e = new WP_Error();
$e->add( ‘validation-error’, $message[‘message’], $message );
return $e;
} else {

return true;

}

/*###############################
* 追加処理 終了
*/###############################

 

} elseif ( $res[‘response’][‘code’] !== 200 ) {
$message = json_decode( $res[‘body’], true );
$e = new WP_Error();
$e->add( ‘validation-error’, $message[‘message’], $message );
return $e;
} else {

return true;

}
}

 

/*
* Prase $_POST to Kintone’s record format.
* @param string $data $_POST data
* @return array Kintone’s formated array.
* @since 0.1
*/
public static function parse_record( $data )
{
$record = array();
foreach ( $data as $key => $value ) {
$key = preg_replace(“/^_kintone_control_/”, “”, $key);
$record[$key] = array( ‘value’ => $value );
}

return $record;
}

public static function send( $data )
{
$kintone = get_option( $data[‘_kintone_key’], false );
if ( ! $kintone ) {
return new WP_Error( __LINE__ );
}

$result = self::save_data( $kintone, $data );

if ( is_wp_error( $result ) ) {
return $result;

} else {
update_option( ‘kintone-success’, true );
return true;

}
}

/*
* Save shortcode atts and token as option
* @param string $data shortcode atts
* @return array options key
* @since 0.1
*/
public static function save_option_key( $atts ) {
$option_key = ‘kintone-’. sha1( $atts[‘sub_domain’] . $atts[‘app’] ); update_option( $option_key, $atts );

return $option_key;
}
}

// EOF

==========================================================================================-

追加処理 開始 ~ 追加処理 終了 までの範囲が今回追記した部分になります。

上記コードでの動作としては、Wordpress上で「送信」ボタンを押すとkintoneには問題なくレコード登録されますが、

GET・PUTは動作しませんでした。

 

コードの記載場所、内容に誤りはありますでしょうか?

お手数ですが、よろしくお願いいたします。

wp_remote_get() や wp_remote_put() というものを私も触ったことないので、何とも申し上げづらいところがありますが、・・・

 

GETは正しそうなのと、PUTはボディの形式が レコードのステータス更新API の形式になってないのでドキュメントをチェックされたり、必要によっては事前にPOSTMANでリクエスト自体を通せるようになるのが先決ではないでしょうか。

 

また、GETとPUTのデバッグですが、リクエスト記載箇所は良さそうに見えますが、リクエストが失敗しているということであれば、そのエラーメッセージは拾えないのでしょうか。

リクエスト失敗でエラーが拾えないのであれば こちら で触れていますRequestBinを使って、(urlだけ差し替えて)リクエストが意図通りに送信できているかを確認されると良いかと思います。

Ryu Yamashita様

 

お世話になります。

アドバイスいただきありがとうございます。

 

RequestBinはphpでも使用できることを失念しておりました。

RequestBinでecho出力内容の確認とステータス更新APIのドキュメント再確認し、無事にステータス更新することができました。

 

結果的に以下3点がエラーの原因でした。

①追加処理の記載場所の間違い(GET・PUTリクエストがスルーされていた)

②PUTリクエストボディの形式の間違い

③phpファイル保存時の文字コードの間違い

 

①の追記場所についてですが、 if ( is_wp_error( $res_put ) ) { の下ではなく、} else { の下に記載が正しかったです。

②PUTリクエストについてはステータス更新APIのドキュメントの通り修正しました。

③phpファイルの文字コード違いについては、ステータスが日本語だったのでphpファイルの保存時に、文字コードをUTF-8と指定して保存しました。

 

最終的には、以下のようなコードになりました。

==========================================================================================-

/*
* Send form data to Kintone API
* @param string $kintone Shortcode attributes it need for auth.
* @param string $data $_POST data
* @return array true or WP_Error object
* @since 0.1
*/
private static function save_data( $kintone, $data )
{
$url = sprintf(
‘https://%s.cybozu.com/k/v1/record.json’,
$kintone[‘sub_domain’]
);

if ( isset( $kintone[‘basic_auth_user’] ) && isset( $kintone[‘basic_auth_pass’] ) ) {
$headers = Kintone_API::get_request_headers( $kintone[‘token’], $kintone[‘basic_auth_user’], $kintone[‘basic_auth_pass’] );
} else {
$headers = Kintone_API::get_request_headers( $kintone[‘token’] );
}
if ( is_wp_error( $headers ) ) {
return $headers;
}

$headers[‘Content-Type’] = ‘application/json’;

$record = self::parse_record( $data );

$body = array(
‘app’ => $kintone[‘app’],
‘record’ => $record,
);

$res = wp_remote_post(
$url,
array(
‘method’ => ‘POST’,
‘headers’ => $headers,
‘body’ => json_encode( $body ),
)
);

if ( is_wp_error( $res ) ) {

return $res; 

} elseif ( $res[‘response’][‘code’] !== 200 ) {
$message = json_decode( $res[‘body’], true );
$e = new WP_Error();
$e->add( ‘validation-error’, $message[‘message’], $message );
return $e;
} else {

/*###############################
* 追加処理 開始
*/###############################

$url_get = ‘https://<サブドメイン名>.cybozu.com/k/v1/records.json?app=382’;
$headers_get = array( ‘X-Cybozu-API-Token’ => ‘<APIトークン>’ );
$res_get = wp_remote_get(
$url_get,
array(
‘headers’ => $headers_get
)
);
$return_value = json_decode( $res_get[‘body’], true );

$recno = $return_value[‘records’][0][‘record_no’][‘value’];

$url_put = sprintf(
‘https://%s.cybozu.com/k/v1/record/status.json’,
$kintone[‘sub_domain’]
);

$body_put = array(
‘app’ => $kintone[‘app’],
‘id’ => $recno,
‘action’ => ‘申請済み’,
);

$res_put = wp_remote_request(

$url_put,
array(
‘method’ => ‘PUT’,
‘headers’ => $headers,
‘body’ => json_encode( $body_put ),
)
);

if ( is_wp_error( $res_put ) ) {
return $res_put;
} elseif ( $res_put[‘response’][‘code’] !== 200 ) {
$message = json_decode( $res_put[‘body’], true );
$e = new WP_Error();
$e->add( ‘validation-error’, $message[‘message’], $message );
return $e;
} else {

return true;

}

/*###############################
* 追加処理 終了
*/###############################

 

}
}

 

/*
* Prase $_POST to Kintone’s record format.
* @param string $data $_POST data
* @return array Kintone’s formated array.
* @since 0.1
*/
public static function parse_record( $data )
{
$record = array();
foreach ( $data as $key => $value ) {
$key = preg_replace(“/^_kintone_control_/”, “”, $key);
$record[$key] = array( ‘value’ => $value );
}

return $record;
}

public static function send( $data )
{
$kintone = get_option( $data[‘_kintone_key’], false );
if ( ! $kintone ) {
return new WP_Error( __LINE__ );
}

$result = self::save_data( $kintone, $data );

if ( is_wp_error( $result ) ) {
return $result;

} else {
update_option( ‘kintone-success’, true );
return true;

}
}

/*
* Save shortcode atts and token as option
* @param string $data shortcode atts
* @return array options key
* @since 0.1
*/
public static function save_option_key( $atts ) {
$option_key = ‘kintone-’. sha1( $atts[‘sub_domain’] . $atts[‘app’] ); update_option( $option_key, $atts );

return $option_key;
}
}

// EOF

==========================================================================================-

 

RequestBinでecho出力していなければリクエストがスルーされていることに気づかず右往左往していたと思います。

非常に参考になりました!ありがとうございます。

RequestBinはHTTPリクエストのインスペクタ、簡易テストツールなので、記述言語には無関係ですね。

ひとまず、解決に至れて良かったです。