end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

在庫管理システムに関するオープンソースや参考資料(書籍)

いろいろググって見たり、書籍を読んでみたけど、次のあたりが、初心者にはお薦め

ADempiere

今も Compiere -> ADempiere ...> iDempiere とフォークされていますが、javaによるオープンソースERP。生産管理や販売管理等、多機能で、当然、ソースも巨大な為、趣味でソースを読む気には慣れません。
http://www.adempiere.com/JP/Top_Page
http://www.adempiere.com/ADempiere_ERP

src

http://sourceforge.net/projects/adempiere/ (本家)
http://sourceforge.jp/projects/adempiere/ (日本用)
※ソースの取得方法は「ADempiere ソースコード ダウンロード」等でググって下さい

SalesCube

アーク情報システムが、開発し、ソース(java)も公開している在庫管理機能も備えた販売管理システム。先程のADempiereより画面がスッキリで、個人的にはこちらの方が好み。
http://www.ark-info-sys.co.jp/jp/product/salescube/product.html

src

ソース行数は10万行を超えているので、中々の規模。
https://ark-salescube.appspot.com/pub/
https://github.com/salescube/SalesCube

グラス片手にデータベース設計〜販売管理システム編

在庫管理に関する書籍は、たくさんありますが、db schema (DDL)が記載されているので、 ADempiere や SalesCube のソースの前に読むのがよいかと
http://www.seshop.com/product/detail/4516/

在庫管理DDLを書いてみた

「グラス片手にデータベース設計」を参考にしましたが、こんな感じかな

create table shouhin_master (
shouhin_cd      varchar(10),
shouhin_name    varchar(20),
hanbai_tanka    int             comment '販売単価(税抜)',
shiire_tanka    int             comment '仕入単価(税抜)',
unit            varchar(5)      comment '単位. {個, M, ㎡}等',
shiire_saki_id  varchar(10),
zaiko_type      varchar(10)     comment '在庫管理区分 {管理対象,管理対象外}',
start_date      date            comment '有効開始日',
end_date        date            comment '有効最終日',
PRIMARY KEY (shouhin_cd, start_date)
) comment='商品マスタ';


create table hachuu (
hachuu_cd       varchar(10),
shiire_saki_id  varchar(10),
shiire_saki     varchar(20),
hachuu_date     date            comment '(伝票上の)発注日',
hachuu_price_net int            comment '合計発注額(税抜)',
hachuu_price_tax int            comment '合計発注額(税)',
tax_rate        decimal(3,2)    comment '消費税率 例:0.05',
delivery_date   date            comment '指定納期(明細中で最遅)',
reply_delivery_date date        comment '回答納期(明細中で最遅)',
delivery_to     varchar(20)     comment '納入先',
note            varchar(200)    comment '備考',
update_user     varchar(32)     comment '更新日時',
update_time     timestamp,
hachuu_user     varchar(32),
hachuu_time     timestamp       comment '発注処理日時',
shiire_user     varchar(32),
shiire_time     timestamp       comment '仕入処理日時',
PRIMARY KEY (hachuu_cd)
) comment='発注';


create table hachuu_meisai (
hachuu_cd       varchar(10),
row_no          int             comment '行NO',
shouhin_cd      varchar(10),
shouhin_name    varchar(20),
shiire_tanka    int             comment '仕入単価(税抜)',
quantity        int             comment '数量',
shiire_price    int             comment '仕入額(税抜)',
unit            varchar(5)      comment '単位. {個, M, ㎡}等',
delivery_date   date            comment '指定納期',
reply_delivery_date date        comment '回答納期',
meisai_note     varchar(100)    comment '備考',
PRIMARY KEY (hachuu_cd,row_no)
) comment='発注明細';


create table soko (
soko_cd         varchar(10),
soko_name       varchar(20),
address         varchar(30),
note            varchar(30)     comment '備考:自社倉庫, 客先倉庫, 仕入先倉庫',
PRIMARY KEY (soko_cd)
) comment='在庫';


create table zaiko (
soko_cd         varchar(10),
shouhin_cd      varchar(10),
lot_no          varchar(10),
valid_zaiko     int             comment '有効在庫数',
actual_zaiko    int             comment '実在庫数',
note            varchar(100)    comment '備考',
update_time     timestamp,
update_user     varchar(32),
PRIMARY KEY (soko_cd,shouhin_cd)
) comment='在庫';