背景
多摩大学経営情報学部では、経営系・会計系・情報系の教員が結託して作成したオリジナルのビジネスゲーム「TamaBG」を使って、会計や経営の基礎を教えています。1998 年ころに最初期のバージョンが作られたシステムです[1]。
- [1] : http://id.nii.ac.jp/1361/00000034/
当初はデータベースのロック機能が弱くて「最後の1個の製品を複数の購入者が同時に買える(在庫はマイナスになる)」というような不具合がありましたが、2010 年の大改修以降、これまで、ほぼ安定して動いてきました。(「マイナスの購入数を入力して手持ち現金を増やす」という裏技を使われたことはあった)
突然の誤作動
ところが、昨日、出力されたバランスシートがバランスしていないという事態が発生しました(真っ先に気づいたのは、元経営者の教授。さすが!)。よく見ると、いくつかの数値の「3桁カンマ区切り」の左側だけが計算に使われていて、それぞれの項目の数値は正しいものの、合計値が正しく計算できていませんでした。
たとえば
現金 1,000 製品 2,000 固定資産 3,000 --- 合計 3003
といった具合です。
原因と対策
このシステムでは、PHP からの出力を、テンプレートエンジン Smarty で処理しています。2010 年ごろの Smarty の出力の仕様では、数値の加算 +
と、フォーマット指定 |
では加算の優先順位が高いため、たとえば $x = 1000, $y=2000, $z=3000
が代入されいている状態で
$x + $y + $z | number_format -> 6000 | number_format => '6,000'
という出力が得られていましたが、現在は、フォーマット指定のほうが優先順位が高いため
$x + $y + $z | number_format => 1000 + 2000 + '3,000' => 3003
と解釈されます。このため、「値をテンプレート内で計算してからフォーマット指定して出力する」場所が、すべて期待した動作と異なっていました。加算を先にするために、( )
をつけてエラーを解消しました。
($x + $y + $z) | number_format => 6000 | number_format => '6,000'
反省
このエラーは「フォーマット指定している(つもり)なのに、適用されていない」という出力を見て、「なにかおかしい」と気づくことができたはずでした。最終的に数値演算の結果が出力されるので、3桁区切りにならない数値が出てきていました。細かい不具合の徴候に敏感にならなければいけないと改めて確認しました。