Twilioで日毎に作業者から確認連絡をしてもらうのを自動化する

# 背景
大勢の人に毎日してもらう作業の確認連絡を入れてもらうという作業を自動化したいという依頼を受けました。その会社は毎日決まった時間に作業者から電話で連絡をしてもらって、それをオペレーターが台帳に記載するということを毎日しています。メールではダメかと聞いてみると、メールでは「ちゃんと確認してない」と偉い人が言うらしく、「電話」で確認を取るというのが必須の条件らしいです。

# 考えたこと
- 作業者のいつも使っている電話番号をデータベースに登録する
- twilioの電話番号を配布して、そこに作業者に1日1回、ワン切りで電話してもらう
- 電話番号と作業者が結びついているので、着信があったら作業確認があったこととして、データベースに記録する
- 夕方になって着信が無い人にだけオペレーターが電話して確認する。

# データベースの用意
Mysqlで作ることにしました。3つのテーブルを用意します。
- confirmation_group (グループが分かれているのでそれを登録する)
- confirmation_target (作業者を登録する)
- confirmation_record (日毎の作業記録をストアする)

データベース名は"ct"としました。

```ruby:qiita.mysql
CREATE TABLE `confirmation_group` (
  `cgid` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`cgid`)
) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=utf8



CREATE TABLE `confirmation_record` (
  `crid` int(11) NOT NULL AUTO_INCREMENT,
  `ctid` int(11) DEFAULT NULL,
  `confirmed_time` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`crid`)
) ENGINE=MyISAM AUTO_INCREMENT=1119 DEFAULT CHARSET=utf8

CREATE TABLE `confirmation_target` (
  `ctid` int(11) NOT NULL AUTO_INCREMENT,
  `cgid` int(11) DEFAULT NULL,
  `name` varchar(20) DEFAULT NULL,
  `phone_number` varchar(20) DEFAULT NULL,
  `pin` varchar(5) DEFAULT NULL,
  `language` varchar(2) DEFAULT NULL,
  PRIMARY KEY (`ctid`),
  UNIQUE KEY `pin` (`pin`)
) ENGINE=MyISAM AUTO_INCREMENT=40 DEFAULT CHARSET=utf8
```
confirmation_targetのテーブルに、作業者の連絡先や名前を登録する。こんな感じになります。電話番号に国番号を入れるのがポイントです。
080-4444-2222なら、+818044442222のように最初に+81を追加し、代わりに最初の0を取るようにします。

```ruby:qiita.mysql
mysql> select * from confirmation_target;
+------+------+----------------------+---------------+-------+----------+
| ctid | cgid | name                 | phone_number  | pin   | language |
+------+------+----------------------+---------------+-------+----------+
|    9 |    1 | 山田太郎              | +818xxxx97491 | 9999  | ja       |
|   17 |    9 | John Doe             | +818xxxx04433 | 17    | en       |
```

# PHPライブラリ
https://jp.twilio.com/docs/php/install
からtwilioのphpライブラリをダウンロードする。
それをWEBサーバーのルートディレクトリからアクセスできるところに配置する。

# TwiMLを吐き出すPHPを用意する

```ruby:qiita.php
<?php
mb_internal_encoding("utf-8"); 

require('/var/www/html/twilio-php-master/Services/Twilio.php');


global $auth_token;
$auth_token = 'xxxxxxxxxxxxxxx';

global $account_sid;
$account_sid = 'xxxxxxxxxx';


$conn = mysql_connect('localhost', '<user>', '<password>', TRUE) or die(mysql_error());
mysql_query("SET NAMES utf8",$conn);
mysql_select_db('ct') or die(mysql_error());
$from = $_REQUEST['From'];
  $sql = "select * from confirmation_target where phone_number = '$from'"; 
  $res = mysql_query($sql, $conn) or die(mysql_error());
  $ct = mysql_fetch_assoc($res);
  $ctid = $ct["ctid"];

  $timenow  = date("Y-m-d H:i:s");

$client = new Services_Twilio($account_sid, $auth_token); 
 
    header("content-type: text/xml");
    echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";

    if($ct['name'])
    { 
      if($ct['language'] === 'en') {
      echo "<Response>
              <Say >Goog morning ". $ct['name'] . ".  Thank you for calling and confirmation.</Say>
              <Say>Please come back again tomorrow.  Have a nice day.</Say>
        </Response>";
      }
      else{
        echo "<Response>
                <Say language='ja-jp'>" . $ct['name'] . "さん、お電話ありがとうございます。本日の確認はこれで終了です。明日も忘れずにお願いいたします。</Say>
          </Response>";

      }
      $sql = "insert into confirmation_record values (null, '$ctid','$timenow') "; 
      $res2 = mysql_query($sql, $conn) or die(mysql_error());


    }
echo $out;

?>

```

そしてこのPHPを（ウェブブラウザからアクセスできる場所がである必要がある）Twilioの管理画面から音声通話のRequest URLに登録します。するとそのTwilioの電話番号にかかった着信は上記のPHPに処理が渡されます。

上のPHPは着信番号を基に、confirmation_targetのテーブルからその人の名前を検索し、その人のID（テーブルでは”ctid”）と連絡があった時間を記録しています。

# 状態を確認
こんなクエリを叩くと特定の日の結果がわかります。

```ruby:qiita.mysql
SELECT * FROM confirmation_record cr LEFT JOIN confirmation_target ct ON ct.ctid = cr.ctid WHERE ct.cgid = 9 AND cr.confirmed_time LIKE '2014-07-13%';

```

実際にはウェブのインターフェースを用意して、オペレータが簡単に確認できるようにしました。

# 結論
世の中には理不尽な理由で非効率な作業がまかり通っているというのを実感しました。メールでの確認は「ちゃんとしていな」くて、電話での確認は「ちゃんとしている」という発想は残念ながらまだまだ根深く残っています。

もちろん若い世代のマネージャー（係長、主任級の方）はそんな風に感じないようですが、上には逆らえません。Twilioを上手に使うと両方の顔を立てながらその橋渡しができる分野がたくさんあると感じました。