← 事故一覧へ

minorotherunverifiedcollected

3か所にあった料金計算を1か所だけ直し、入会手続きが止まった(未検証の報告)

筆者の会社のサービスで、会員がWebから入会を確定しようとすると、カードに与信した金額と契約の合計が合わず、確定時の照合が入会を止めた。与信額は契約合計より1割ほど少なかった。その会員は2回試してどちらも止まり、時間をおいてやり直しても入会できなかった。

発生日
深刻度
3/10
影響範囲
uptime
タグ
#ai-review#duplicated-logic#proration#payments#partial-fix#consistency-test

原因

筆者によれば、初月の日割りという同じルールを、与信を出すAPI、Webの会員画面、LINEの会員画面の3か所で別々に計算していた。Web側は約1か月前の改修で「日割りしないプランは満額」に直ったが、API側はプランの設定を見ずに月の途中なら必ず日割りしていた。API側は以前の変更で意図して据え置かれたが、それは負債として記録されていなかった。Web側の改修はAIのレビューも検証環境での確認も通っていた。

結果

入会しようとした会員1名がWebから手続きを完了できなかった。与信は照合に失敗した時点で解放され、お金は預かっていない。不整合は本番に出てから19日間誰にも気づかれなかった。踏む条件は4つ重なる必要があり、本番では1つのジムの3つのプランだけ、月に1人ほどだった。

対策

定時の巡回が失敗ログを30分ほどで拾い、担当のAIセッションが本番を読み取りだけで調べて原因を特定し、失敗するテストを先に書いてから修正した。約3時間で検証環境での再現まで済み、当日中に本番へ反映した。API側の計算をWeb側にそろえる数十行の変更だった。筆者は再発防止に、計算結果を突き合わせる整合テスト、据え置きの起票、業務ルールを変える前の実装の列挙、テストの行列の見直しの4つを挙げている。

何が起きたか

筆者の会社のサービスでは、会員がWebから入会するとき、確認画面で金額を見て、 カード情報を入れた時点でその金額の与信をかけ、最後の確定ボタンで契約の合計を 計算し直して与信額と照合してから請求する。ある日の昼すぎ、ひとつのジムの プランでこの照合が合わず、入会の確定が止まった。与信額は契約合計より 1割ほど少なかった。

現場の混乱

その会員は2回試してどちらも止まり、少し時間をおいて最初からやり直しても 入会できなかった。与信は照合に失敗した時点で解放されており、お金は 預かっていない。定時の巡回が30分ほどで失敗ログを拾った。

調べると、不整合は本番に出てから19日間続いていた。踏むには、プランが 「毎月1日始まり・日割りしない」設定であること、開始日が1日以外であること、 カードの与信を伴う入会であること、月の途中の開始日を選べる入会画面で あることの4つが重なる必要があった。一般の入会画面は日割りしないプランで 開始日を1日に絞っており、自由に選べたのは特定のジム向けの画面だけだった。 本番で当てはまるのは1つのジムの3つのプランで、その間に入会した2名は どちらも1日を選んでいた。3人目が、1日以外を選んだ最初の人だった。

原因

筆者によれば、入会の金額は、与信を出すAPI、Webの会員画面、LINEの会員画面の 3か所で別々に計算していた。Web側は1か月ほど前の改修で、プランの設定どおり 「日割りしないプランは満額」に直っていた。API側は設定を見ずに、月の途中なら 必ず日割りしていた。

API側はうっかり直し忘れたのではない。その前の変更で、与信の試算は 「他の場所も同じ無条件の日割りなので、差分の監査を単純にするため変えない」 というコメントつきで意図して据え置かれていた。ただ、その据え置きはどこにも 負債として記録されなかった。Web側の改修はAIのレビューも検証環境での確認も 通っていたが、検証は一般の入会画面で行っており、不整合を踏める画面は 検証の行列に入っていなかった。

対策

当日中に、担当のAIセッションが本番を読み取りだけで調べて原因を特定し、 失敗するテストを先に書いてから修正した。全件テストで修正前後を比べ、 検証環境で修正前の失敗と修正後の成功を再現するまで約3時間だった。 修正はAPI側の計算をWeb側にそろえる数十行で、その日のうちに本番へ出した。 最初の報告に対してエンジニアが「もっと頻繁に起きているはずでは」と疑い、 別のセッションに実測させた結果、不整合の始まった日付と影響するプランの 範囲の2点が訂正された。

筆者は再発防止として、同じルールを持つ箇所の計算結果を突き合わせる 整合テスト、据え置きを前提つきの負債として起票すること、業務ルールを 変える前に実装を全部列挙すること、テストの行列に画面の違いと照合が守る 組み合わせを入れること、の4つを挙げる。照合の仕組みは1か月ほど前に 入れたもので、それ以前は同じ条件の入会が黙って通っていたという。

同じルールが何か所にあるかは、差分のレビューの外側にある。AIのレビューが 差分の中で正しく働いても、直していない側は見えない。

出典