仕訳に関わるテーブルが作成され、そのテーブルから参照している定義も既に出て来ているので、勘定科目と補助科目テーブルを作成します。
簿記3級レベルでは、勘定科目は、資産、負債、純資産、収益、費用の5つの要素に所属すること、その5つの要素は借方、貸方のどちらかのポジションを持ち、取引を記録した仕訳の貸借で、本来のポジション側に現れたら増加、逆のポジションに現れたら減少とすれば良いというのが原則で、簡単な条件分岐で、プログラミング言語上も、SQLで処理するにもそれ程難しく無いはず。
なのですが、原則があれば例外はつきもので、簿記3級レベルでも、その原則に従わない勘定科目があります。
1 評価勘定にあたるもの
貸倒引当金/減価償却累計額
これらは、資産科目に属するのですが、売掛金や固定資産等の評価を減算させる性質をもっていて、勘定科目の原則とは逆の働きをします
2 売上値引/返品
これらは、収益科目にあたるのですが、やはり意味は逆の働きをします
3 期末商品棚卸高/仕入戻し高/仕入値引高
これらは、売上原価を構成する費用科目ですが、意味は逆となります
直接法で減価償却を仕訳していれば、減価償却費累計額は使わないし、売上値引や返品も売上で反対仕訳を行えば良いですが、期末商品棚卸高を使わない(科目名な違うかもしれませんが)とか、貸倒引当金が出てこない決算整理はほぼないと思いますので、
仕訳上の貸借2通り、科目全体の持つポジション2通り、特定の科目が持つポジション2通りの計8通りの組合せがあることになります。このことを勘定科目を表現するテーブルに載っけておかないと困った事になるはずです。
CREATE TABLE kaikei."ma_勘定科目" (
id integer NOT NULL,
created_at timestamp without time zone,
updated_at timestamp without time zone,
"勘定科目属性" text NOT NULL,
"勘定科目コード" text NOT NULL,
"勘定科目名" text NOT NULL,
---------------------
"勘定科目正式名" text NOT NULL,
"貸借" text NOT NULL,
"借方税区分コード" text NOT NULL,
"借方税区分名" text,
"貸方税区分コード" text,
"貸方税区分名" text NOT NULL,
---------------------
---------------------
---------------------
"要素コード" text NOT NULL
);
-- 一部割愛
COMMENT ON COLUMN kaikei."ma_勘定科目"."貸借" IS 'その科目のポジション';
COMMENT ON COLUMN kaikei."ma_勘定科目"."要素コード" IS '五要素へのリンク';
CREATE SEQUENCE kaikei."ma_勘定科目_id_seq"
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER SEQUENCE kaikei."ma_勘定科目_id_seq" OWNED BY kaikei."ma_勘定科目".id;
ALTER TABLE ONLY kaikei."ma_勘定科目" ALTER COLUMN id SET DEFAULT nextval('kaikei."ma_勘定科目_id_seq"'::regclass);
ALTER TABLE ONLY kaikei."ma_勘定科目"
ADD CONSTRAINT "ma_勘定科目_pkey" PRIMARY KEY (id);
ALTER TABLE ONLY kaikei."ma_勘定科目"
ADD CONSTRAINT "u_ma_勘定科目勘定科目コード" UNIQUE ("勘定科目コード");
CREATE UNIQUE INDEX "i_ma_勘定科目勘定科目コード" ON kaikei."ma_勘定科目" USING btree ("勘定科目コード");
ALTER TABLE ONLY kaikei."ma_勘定科目"
ADD CONSTRAINT "f_ma_勘定科目" FOREIGN KEY ("貸借")
REFERENCES kaikei."type_貸借"(id) ON UPDATE CASCADE DEFERRABLE;
ALTER TABLE ONLY kaikei."ma_勘定科目"
ADD CONSTRAINT "f_ma_勘定科目_要素コード" FOREIGN KEY ("要素コード")
REFERENCES kaikei."type_勘定要素"("要素コード") ON UPDATE CASCADE DEFERRABLE;
ALTER TABLE ONLY kaikei."ma_勘定科目"
ADD CONSTRAINT "f_ma_勘定科目借方税区分コード" FOREIGN KEY ("借方税区分コード")
REFERENCES kaikei."type_税区分"("税区分コード") ON UPDATE CASCADE DEFERRABLE;
ALTER TABLE ONLY kaikei."ma_勘定科目"
ADD CONSTRAINT "f_ma_勘定科目勘定科目属性" FOREIGN KEY ("勘定科目属性")
REFERENCES kaikei."ma_勘定科目属性"("属性コード") ON UPDATE CASCADE DEFERRABLE;
-- ma_勘定科目属性は、勘定科目をグルーピングするための表となっています。
ALTER TABLE ONLY kaikei."ma_勘定科目"
ADD CONSTRAINT "f_ma_勘定科目貸方税区分コード" FOREIGN KEY ("貸方税区分コード")
REFERENCES kaikei."type_税区分"("税区分コード") ON UPDATE CASCADE DEFERRABLE;
この定義で、テーブルの定義から8通りの組合せが表現できると思います。