非職業エンジニアだけどかんたんFlaskで業務フローを簡略化した話

座禅いぬです。歯医者をしております。

::: note info
本記事は[マナビDX Questで得たもの Advent Calendar 2024](https://qiita.com/advent-calendar/2024/manabi-dx-quest2024)　3日目の記事です！
:::

[13日の記事](https://qiita.com/zazen_inu/items/5a6030d023c0772f1ad9)に引き続き、マナビDXクエストで情報発信の重要性を学び触発されての投稿です。慣れないチャレンジですので乱筆乱文なのをご了承いただければと思います。

今回は自社DXを非常に小さな規模で試みたことについて共有します。

## 背景：会計の手間を減らしてミスをなくしたい
歯科医院における悩みの種の1つは受付業務です。保険証の確認、患者からの電話応対、予約対応、会計等いろいろなことをこなさないといけません。そこで、業務の効率化として応対チャットの導入やキャッシュレス決済、オンライン予約などいろいろなことに取り組んでいます。 

しかしキャッシュレス決済の導入に関しては、支払い方法の希望は多様なため計画なく導入するとかえって業務が煩雑になる懸念がありました。自動釣り銭機の導入も考えたのですが、業務機との連携を考えると三百万近くかかることがわかりました。

 **「業務改善としてツールを導入するだけだとだいたいうまくいかない」** と言うのは、過去に経験が何度もありましたので、先に業務フローをまず考え直すことにしました。その際、今手持ちの技術であるPythonを使って、コストをかけずに短期的な問題解決ができましたので共有します。

## やったこと
<strong>対象とする業務：一日の終わりに売上の現金を数える作業</strong>
まずは会計業務をやっているのを観察させてもらい、何がうまくいっていないかを確認しました。一日の売上のうち、現金を数えて電卓で計算していたのですが、帳簿上のお金と合わず、何回も数えなおしをしていました。

<strong>解決するべき問題：お金を数え、計算する手順の煩雑さ</strong>
単純でしょうもないと思われると思いますが、これだけのことでした。紙幣や硬貨を数え、電卓で掛け算と足し算をする。差額が発生したら、また一から数えなおす。こんなことをしていたのです。必要なところだけを数えなおすように業務フローを修正し、それをサポートするアプリを作成しました。

<strong>改善策：Flaskを用いた簡易計算機</strong>

::: note warn
そもそもキャッシュレス決済早く入れろという話は今回置いておくとします。
:::

```python:　calculator.py
from flask import Flask, render_template, request

app = Flask(__name__, template_folder="templates")


@app.route("/", methods=["GET", "POST"])
def accounting():
    if request.method == "GET":
        return render_template("calculator.html")
    elif request.method == "POST":
        bill_10k = int(request.form.get("bill_10k"))
        bill_5k = int(request.form.get("bill_5k"))
        bill_1k = int(request.form.get("bill_1k"))
        coin_500 = int(request.form.get("coin_500"))
        coin_100 = int(request.form.get("coin_100"))
        coin_50 = int(request.form.get("coin_50"))
        coin_10 = int(request.form.get("coin_10"))
        coin_etc = int(request.form.get("coin_etc"))
        comment = request.form.get("comment")
        total = bill_10k * 10000 + bill_5k * 5000 + bill_1k * 1000 + coin_500 * 500 + coin_100 * 100 + coin_50 * 50 + coin_10 * 10 + coin_etc
        coins = coin_500 + coin_100 + coin_50 + coin_10
        return render_template("calculator.html",
            bill_10k = bill_10k,
            bill_5k = bill_5k,
            bill_1k = bill_1k,
            coin_500 = coin_500,
            coin_100 = coin_100,
            coin_50 = coin_50,
            coin_10 = coin_10,
            coin_etc = coin_etc, 
            comment = comment,
            total = total,
            coins = coins
        )

if __name__ == "__main__":
    app.run(debug=True)
```

表示のための画面をhtmlで作成します。

```html: templates/calculator.html
<html>

<body>
<h1>会計</h1>

<form action="/" method="post">
<p>
    １万円<input type="number" name="bill_10k"{% if bill_10k %} value="{{ bill_10k }}"{% endif %} required>枚
</p>
<p>
    ５千円<input type="number" name="bill_5k"{% if bill_5k %} value="{{ bill_5k }}"{% endif %} required>枚
</p>
<p>
    千円<input type="number" name="bill_1k"{% if bill_1k %} value="{{ bill_1k }}"{% endif %} required>枚
</p>
<p>
    五百円<input type="number" name="coin_500"{% if coin_500 %} value="{{ coin_500 }}"{% endif %} required>枚
</p>
<p>
    百円<input type="number" name="coin_100"{% if coin_100 %} value="{{ coin_100 }}"{% endif %} required>枚
</p>
<p>
    五十円<input type="number" name="coin_50"{% if coin_50 %} value="{{ coin_50 }}"{% endif %} required>枚
</p>
<p>
    10円<input type="number" name="coin_10"{% if coin_10 %} value="{{ coin_10 }}"{% endif %} required>枚
</p>
<p>
    その他<input type="number" name="coin_etc"{% if coin_etc %} value="{{ coin_etc }}"{% endif %} required>円
</p>
<p>
    コメント<input type="text" name="comment"{% if comment %} value="{{ comment }}" {% else %} value="なし"{% endif %} required>
</p>

{% if total %}
<p>
    合計金額: {{ total }}円/硬貨枚数{{ coins }}枚
</p>
{% else %}

    <button type="submit">計算する</button>
{% endif %}

</form>

</body>
</html>

```

## 成果
こんなシンプルな仕組みですが、受付の最後の業務が平均5分以上かかっていたのが、2分程度に短縮されました。計算ミスが明らかに減少し、さらにミスがあってもどの紙幣or硬貨かを推測するのが容易になり、枚数を数えなおすだけなので相当早くなりました。たった3分ですが受付スタッフからストレスがかなり低減したと報告を受けました。


## 今回の学び
まずキャッシュレスは今後必須で、導入予定です。より大きい効果が期待できます。今回の限定された試みでの学びは、<strong>「プログラミングで業務が改善した」ではなく、「業務フローの簡略化に成功した」</strong>という点にあると思います。

そのような観点におけるプログラミングの優れた点として、「動くマニュアル」であるという点があると思います。この場合、スタッフに「現金の数を数える」に専念してもらうことでミスを減らせました。また、実は硬貨の枚数も表示するようにしていますのですが、これによって「硬貨を減らしたい」という心理が働くようで、月ごとに発生する硬貨の両替を有意に減らすことができました。

## それはそれとして：マナビDX Questで得たもの

**マナビDXクエストの素晴らしいところは、学ぶだけではなく、交流・発信の場でもあると言うことです。**

今までは自分1人で悩みながらチャレンジするしかありませんでした。マナビDXクエストでは、悩みを持っている人がたくさんいます。SlackやMeta lifeに自分のチャレンジを発信すると、

<strong>「自分もこういうことにチャレンジしていますよ！勉強会を開きましょう！」</strong>

<strong>「それをやるなら、これが参考になるよ！このツールもいいよ！」</strong>

<strong>「自分の業種でもそれができそう！やってみます！」</stron>

このような返事が返ってくるのです。
そして自分のチャレンジしていることが他の人の学びにも貢献にもなるのです。これは非常に素晴らしいことだと思います。そのようなこともあり、今までは外部発信をしたことがなかったのですが、チャレンジしてみようと触発された次第です。

生成AIがものすごい勢いで進歩している今、人間の賢さの一部を機械が習得していっている事は間違いありません。私たちは今後人間の賢さとは何なのかと言うことを再定義する必要が出てくるでしょう（[参考図書](https://amzn.asia/d/3BLkwLA)）。

そのような状況の中、少なくとも現段階では<strong>人間の特権は意思決定にある</strong>と思います。であれば、私たちが今とりくむべきことはなにか？それは[「とにかくやれ！」](https://www.youtube.com/watch?v=JV3KOJ_Z4Vs)と言うことだと思います。<strong>とにかくやるひとがたくさんいて、助け合える。</strong>これがマナビDXクエストの最大の魅力です。