修正してやる!入金編 巻之一
ガンヲタ対策のタイトルはさておき、大体において後でどかーんと行くのは代替フローにおいてである。ライミングしてみた。駄洒落とも云う。
入金処理を、同時に仕訳作ってやれバージョンと、仕訳は月次締めでやったれバージョンと見てきた訳だが、それぞれについて、入金に対するキャンセル、修正がどうなるか考えてみる。
ああ頭痛い。入力前にちゃんと確認してくれよなあお金の話なんだから、と云いたい所だが、じゃああんたらもバグ絶対出すなよな、納品物なんだからよ!と云い返されてしまうので、心の叫びに留めておくのが大人である。
ここで、請求の時と同じく、日付に関する制約を確認せねばなるまい。まずは新規登録の場合。
- 入金日は、最新会計締め月以前の日付は入れちゃダメ。もう締めちゃってますから、当然です。粉飾決済になってしまいます。
- 入金日は、入金して来た得意先の最新請求締め日以前の日付は入れちゃダメ。請求と売上の関係と同じく、入金も請求に乗せるので当然です。得意先に怒られます。
本当は入金処理を考える最初に決めなきゃいけなかったんだが、データモデルだのなんだのに気をとられておったわい。遺憾。
で、今回のキャンセル・修正に関する制約も考えてみる。
- 修正対象の入金の入金日が、その得意先の最新請求締め日以前だったら、修正不可。請求書がウソになってしまいます。
- 修正対象の入金の入金日が、最新会計締め月以前の場合は、修正可。
2番目は具体的にどんな入金かと云うと、前受金である。会計締め月以前の入金でも、売上が全然無くて請求書が出ていない場合。で、修正後の入金日は上述の新規登録時の制約に準拠される筈である。
仕訳で考えると、元が前月でも赤と黒は新規登録時制約によって当月に落ちるので、当月の残は前月からの差額となるので問題は無いのじゃ。判るかな。後ほど具体例が出て来ます。
こう云う制約は痛い目に合わないとなかなかぱっと思い付かないと思う。後から思えば当然至極、簡単な事なんだけど、当然過ぎるのか、ヒアリング中でもこちらから尋ねないとお客様からも出てこなかったりするので要注意である。
締め日直前午前4時までデータパッチ10万件の恐怖が後楽園遊園地で君と握手、約束しよう!
こんな事ばかり考えてると、モデリング手法なんてなんだっていい気になるよなー。そんな事ないのは重々承知なんだけど。
同時に仕訳バージョン
同時に仕訳とは云え、極力販売管理システム側と仕訳は連携を取らず、仕訳は作りっぱなしと云う方針であった事を思い出してみる。
つまり、仕訳自体には赤だの黒だのの区分は要らないと思う。最終的に残さえあってればよい。
まずは御馴染み1234様から4/1に現金で2000円入金、800円が未収入金で200円が立替金、振り込み手数料が税込210円とする。仕訳同時バージョンなので、入金テーブルは単純な奴ね。
入金テーブル ID 得意先 入金日 区分 金額 --- ------ ------ ----- ------ 001 1234 04/01 現金 1000円 仕訳テーブル 伝票番号 行 計上日 貸借 勘定 金額 税CD -------- -- ------ ---- ----------- ------- ------ 0401001 1 04/01 D 当座預金 1790円 対象外 0401001 2 04/01 D 受取手数料 200円 売外 0401001 3 04/01 D 仮受消費税 10円 対象外 0401001 4 04/01 C 仮受金 1000円 対象外 0401001 5 04/01 C 未収入金 800円 対象外 0401001 6 04/01 C 立替金 200円 対象外
手数料の税コードに関しては、画面から入力されたものとする。同時生成なので、入金ファイルに税コードは持つ必要無い訳よ。
さて、4/1はエイプリル・フールであるので、入力した人が洒落のキツイ人で、ウソを入力してました、と。別に入力した日と入金日は同一とは限らないんだけど、気にしない。で、4/1の正午を過ぎたので、人間正直にならなければいけない。
修正しよう。実は入金は2500円で、仮受金分は1500円でしたよー、と。まず、画面の一覧からIDが001の入金の行を選択する。
入金テーブル ID 得意先 入金日 区分 金額 --- ------ ------ ----- ------ 001 1234 04/01 現金 1000円
あ。ダメだ。赤の仕訳が切れない。どかーんどかーん。見事地雷を踏みました。
赤の仕訳を切る為には、手数料だの立替金だのの情報が無いといかん。その為には、元の仕訳を掴まえなきゃダメだ。画面にも以前に入力された手数料や立替金や未収入金を表示してやらなければならない。
がー、作りっぱなしコンセプト、ここに崩壊。
さて、道は二つある。
- 諦めて、入金と仕訳を関連付ける項目を追加する。
- 頑張って、入金テーブルに手数料だの立替金だの未収入金だのの項目を追加する。
うーむ、どうする?どうする?
手数料だの立替金だのって、販売管理システム上では全く関係ない、仕訳生成のためだけの情報なんだよなー。ここは今までの案件通り、関連付けてみますか。
まず、今までの案件のやり方を紹介。仕訳テーブルに元ネタになったレコードのIDを持っておく。こんな感じ。
- 伝票番号
- 行番号
- (もろもろ省略)
- 入金ID ←追加しました
これで、入金IDから作った仕訳が引っ張れるぜ。と、思ったが。
最初の内はいいんだこれでも。でも仕訳とは、業務システムの惑星メーテル、終着駅である。みんな改造されてネジになっちゃうのである。売上IDも仕入IDも支払IDも全部面倒みないといかんのである。
- 伝票番号
- 行番号
- (もろもろ省略)
- 入金ID
- 売上ID ←追加しました
- 仕入ID ←追加したってば
- 支払ID ←追加したんだってば
- (他にも増える可能性あり)
しかも、入金IDに値が入れば、他のIDはNULL、売上IDに値が入ればこれまた他のIDがNULLと、それぞれのIDが排他になっとる。どうなんだこれは。ガックンではないか。
渡辺さんの業務本(ISBN:4534032501)で、一番「あーそうか!」と思ったのはこれである。仕訳の元ネタ共通のID、「ソースNo」と云う項目を作っちゃうんである。で、売上テーブルにも仕入テーブルにも入金テーブルにも、仕訳と関連するもの全てにこの項目を追加するんである。
それより、入金テーブルや売上テーブルの方に伝票番号持てばいいじゃん、とも思ったが、ソースNo方式だと販売側IDと伝票番号が1:NだろうとN:1だろうとN:Nだろうと、柔軟に対応出来てしまってナイスなのだこれが。
本では在庫の受払だったけど、事情は同じだ。あー先にこの本読んでればなあも。
入金テーブル
- 入金ID
- (もろもろ省略)
- 仕訳ソースNo ← 追加しました
仕訳テーブル
- 伝票番号
- 行番号
- (もろもろ省略)
- 仕訳ソースNo ← 追加しました
あーがっつり仕訳と関連してしまった。仕方ない。でも後の消し込みとかを仕訳を軸にしなきゃいいよ、それでまずは脱・仕訳大統一理論の一里塚だ。
では、修正対象の入金を選択する所に戻る。ソースNoから関連する仕訳も引っ張る。
入金テーブル ID 得意先 入金日 区分 金額 仕訳ソースNo --- ------ ------ ----- ------ ------------ 001 1234 04/01 現金 1000円 00001 仕訳テーブル 伝票番号 行 計上日 貸借 勘定 金額 税CD 仕訳ソースNo -------- -- ------ ---- ----------- ------- ------ ------------ 0401001 1 04/01 D 当座預金 1790円 対象外 00001 0401001 2 04/01 D 受取手数料 200円 売外 00001 0401001 3 04/01 D 仮受消費税 10円 対象外 00001 0401001 4 04/01 C 仮受金 1000円 対象外 00001 0401001 5 04/01 C 未収入金 800円 対象外 00001 0401001 6 04/01 C 立替金 200円 対象外 00001
ソースNoって、なんか美味しそうだよね。
さて、入金テーブルの修正をどう扱うか、だが。ソースNo実装前は、仕訳で赤黒切って、入金テーブルは更新でいいんじゃないか?と思ったが、仕訳とがっつり手を組んだからには履歴管理対象である。001をキャンセルして新たに入金テーブルを起こさねばなるまい。
赤黒管理まではする必要はないでしょ。同時に仕訳作ってるんだから。
- 入金ID
- (もろもろ省略)
- 仕訳ソースNo
- キャンセルフラグ ← 追加しました
で、現状。
入金テーブル ID 得意先 入金日 区分 金額 仕訳ソースNo キャンセル --- ------ ------ ----- ------ ------------ ---------- 001 1234 04/01 現金 1000円 00001 0
で、画面上で入金額を修正する。仮受金分1500円だったな。他の修正箇所はなしとする。で、登録ボタンを押下した、と。001をキャンセルして002を作る。ソースNoも採番テーブルかなんかから貰って来よう。
入金テーブル ID 得意先 入金日 区分 金額 仕訳ソースNo キャンセル --- ------ ------ ----- ------ ------------ ---------- 001 1234 04/01 現金 1000円 00001 1 002 1234 04/01 現金 1500円 00002 0
さー仕訳だー。
仕訳テーブル 伝票番号 行 計上日 貸借 勘定 金額 税CD 仕訳ソースNo -------- -- ------ ---- ----------- ------- ------ ------------ 0401002 1 04/01 D 当座預金 -1790円 対象外 00002 0401002 2 04/01 D 受取手数料 -200円 売外 00002 0401002 3 04/01 D 仮受消費税 -10円 対象外 00002 0401002 4 04/01 C 仮受金 -1000円 対象外 00002 0401002 5 04/01 C 未収入金 -800円 対象外 00002 0401002 6 04/01 C 立替金 -200円 対象外 00002 0401003 1 04/01 D 当座預金 2290円 対象外 00002 0401003 2 04/01 D 受取手数料 200円 売外 00002 0401003 3 04/01 D 仮受消費税 10円 対象外 00002 0401003 4 04/01 C 仮受金 1500円 対象外 00002 0401003 5 04/01 C 未収入金 800円 対象外 00002 0401003 6 04/01 C 立替金 200円 対象外 00002
むーん。ちょっと待った。002に対して再度修正かけようと思って仕訳を引っ張ったら、上の奴全部持ってきちゃうじゃん。仕訳にも赤黒区分とか要るのか?いやだなあ。どんどん肥大していく、と云うか、今までの案件に近づいて行くー。いやじゃー。
赤伝票に関しては、仕訳ソースは無し、と云う考え方でいいのかな。それとも、元ネタは001だと解釈して、ソースNoを00001にする、とか。もう001はキャンセルされてるから、画面や帳票には二度と出て来ない訳だし。NULLは嫌だからそうする。
何度もすみませんねぇ。
仕訳テーブル 伝票番号 行 計上日 貸借 勘定 金額 税CD 仕訳ソースNo -------- -- ------ ---- ----------- ------- ------ ------------ 0401002 1 04/01 D 当座預金 -1790円 対象外 00001 0401002 2 04/01 D 受取手数料 -200円 売外 00001 0401002 3 04/01 D 仮受消費税 -10円 対象外 00001 0401002 4 04/01 C 仮受金 -1000円 対象外 00001 0401002 5 04/01 C 未収入金 -800円 対象外 00001 0401002 6 04/01 C 立替金 -200円 対象外 00001 0401003 1 04/01 D 当座預金 2290円 対象外 00002 0401003 2 04/01 D 受取手数料 200円 売外 00002 0401003 3 04/01 D 仮受消費税 10円 対象外 00002 0401003 4 04/01 C 仮受金 1500円 対象外 00002 0401003 5 04/01 C 未収入金 800円 対象外 00002 0401003 6 04/01 C 立替金 200円 対象外 00002
でも今回は計上日が変更になってないからいいけど、会計締めをまたがった修正だった場合、上述の新規登録・修正時の日付に関する制約が適用されて、例えばこれが前受金に対する5月に入ってからの修正だったら、こんな感じになる筈だ。
仕訳テーブル 伝票番号 行 計上日 貸借 勘定 金額 税CD 仕訳ソースNo -------- -- ------ ---- ----------- ------- ------ ------------ 0401001 1 04/01 D 当座預金 1790円 対象外 00001 0401001 2 04/01 D 受取手数料 200円 売外 00001 0401001 3 04/01 D 仮受消費税 10円 対象外 00001 0401001 4 04/01 C 仮受金 1000円 対象外 00001 0401001 5 04/01 C 未収入金 800円 対象外 00001 0401001 6 04/01 C 立替金 200円 対象外 00001 0401002 1 05/01 D 当座預金 -1790円 対象外 00001 0401002 2 05/01 D 受取手数料 -200円 売外 00001 0401002 3 05/01 D 仮受消費税 -10円 対象外 00001 0401002 4 05/01 C 仮受金 -1000円 対象外 00001 0401002 5 05/01 C 未収入金 -800円 対象外 00001 0401002 6 05/01 C 立替金 -200円 対象外 00001 0401003 1 05/01 D 当座預金 2290円 対象外 00002 0401003 2 05/01 D 受取手数料 200円 売外 00002 0401003 3 05/01 D 仮受消費税 10円 対象外 00002 0401003 4 05/01 C 仮受金 1500円 対象外 00002 0401003 5 05/01 C 未収入金 800円 対象外 00002 0401003 6 05/01 C 立替金 200円 対象外 00002
同じ仕訳ソースNo00001でも、計上日が違ってくる訳ですな。やっぱ赤黒区分持つかなあ。やだなあ。やめよう。どうせもうキャンセルされた入金は作りっぱなしで良いんだ。
UMLモデリングの本質 (日経ITプロフェッショナルBOOKS)って本では「揺さぶりをかける」と云う表現が出てきて、その揺さぶりでモデルを洗練させて行くってな話が書かれていて、とても素晴らしい考えだと思った。本全体も実に明解で素晴らしい。
が、明日使えないんだよなあ、明日。揺さぶりも、静的なモデルの前に、こんな感じでまずは業務ルールを揺さぶらないといけないんじゃないでしょうかってのが俺の所感。こう云う代替ケース、お客様は絶対(云い切った!)自分からは云って来ませんよ。
チクチクとお客様要求をイジメ倒して、そこからモデリングしていくもんだと思うんだけど。特に日付のルールに関してはもう、大変よ。消し込みの日付なんかもっと大変。静的な構造からは浮き上がって来ない。
あっ、でも「消し込み日クラス」とか作って、静的構造の中でがっつりやれって話なのかな?だよなあ。大変だけど、将来のシステム設計のあり方を考えるには、通るべき道なのやも知れない。けど時間がない。
話がそれたがさて、今回は単に仮受金に対する修正だったのでスルーしたが、これが販売管理システム側には直接関係しない、未収入金や立替金や、殆どないと思うが手数料に対する修正だったらどうする?
仕訳はいいとして、入金テーブルなんか、同内容で修正処理が走る。こんな感じ。
入金テーブル ID 得意先 入金日 区分 金額 仕訳ソースNo キャンセル --- ------ ------ ----- ------ ------------ ---------- 001 1234 04/01 現金 1000円 00001 1 002 1234 04/01 現金 1000円 00002 0
これを冗長と取るか、まあ仕方ないと取るかだが。俺はもう面倒くさいので仕方ないを取る!と云うか、実際に取ったが今の所問題無し!先に進めませんよもう!
一旦休憩、次は月次締めで仕訳を作るぜバージョンで修正してやる!これがバカさかって話ですよ。