会社は毎月1日と16日に請求書を受け取ります。 (2週間ごとにCron Jobを実行し、注文テーブルをスキャンしてから請求書テーブルに追加します)請求書とトラッキングを生成
orders
テーブルに顧客の注文リストがあります。それが属している会社orders.company_id
テーブルorders
から注文の合計コストを計算します。
私は合理的な請求書トラッキングを設計する方法を理解しようとしています。いつか同社は私に手数料を送信する必要がありますかいつか私は彼らに手数料、私は次のように請求書を追跡する必要がある(invoice.amount
)
を送信:会社は私の量を送った
- 私は会社に金額を送らなかった
- 私は会社 に送ら
- どのくらいの量がやった会社から受信されたどのくらいの量
- は私が全額を受け取りました(そうでない場合は、私は、DBに更新するために何が必要なのでしょうか?)
- 請求書のステータスここでは(請求書送信、キャンセル、受取額、送信された金額)
がデータベースであります
mysql> select * from company;
+----+-----------+
| id | name |
+----+-----------+
| 1 | Company A |
| 2 | Company B |
+----+-----------+
お客様が私のウェブサイトから会社を選択することができます
会社テーブル:デザインは、私が思い付いたてきました。
受注テーブル
mysql> select * from orders;
+----+---------+------------+------------+---------------------+-----------+
| id | user_id | company_id | total_cost | order_date | status_id |
+----+---------+------------+------------+---------------------+-----------+
| 1 | 5 | 2 | 25.00 | 2012-02-03 23:30:24 | 1 |
| 2 | 7 | 2 | 30.00 | 2012-02-13 18:06:12 | 1 |
+----+---------+------------+------------+---------------------+-----------+
2人の顧客が会社B(orders.company_id = 2
)から製品を注文しました。私は注文フィールドが十分ではないことを知っている、あなたのために単純化されています。
orders_productsテーブルの顧客が注文したものを製品の
mysql> select * from orders_products;
+----+----------+------------+--------------+-------+
| id | order_id | product_id | product_name | cost |
+----+----------+------------+--------------+-------+
| 1 | 1 | 34 | Chair | 10.00 |
| 2 | 1 | 25 | TV | 10.00 |
| 3 | 1 | 27 | Desk | 2.50 |
| 4 | 1 | 36 | Laptop | 2.50 |
| 5 | 2 | 75 | PHP Book | 25.00 |
| 6 | 2 | 74 | MySQL Book | 5.00 |
+----+----------+------------+--------------+-------+
一覧。
請求書テーブル
mysql> select * from invoice;
+----+------------+------------+---------------------+--------+-----------+
| id | company_id | invoice_no | invoice_date | amount | status_id |
+----+------------+------------+---------------------+--------+-----------+
| 7 | 2 | 123 | 2012-02-16 23:59:59 | 55.00 | 1 |
+----+------------+------------+---------------------+--------+-----------+
私は請求書テーブルの設計にはかなりこだわっています場所です。どのようにしたらいいのか分かりません。請求書は2週間ごとに生成されます。結果の一例invoice.amount
から、invoice.amount
は-50.00(マイナス)であれば、それは会社が私に手数料量を送信する必要があります意味orders.company_id = 2
テーブルから
を計算されているので、55.00です。
invoice.amount
が50.00の場合は、会社に料金を送付する必要があることを意味します。
STATUS_IDは次のようになります。(1)請求書が送信され、(2)キャンセル、(3)
を完了し、私はorders
テーブルにinvoice_id
フィールドを追加する必要がありますか?行が '請求書'テーブルに挿入されると、orders.invoice_id
フィールドが更新されます。
invoice_paymentテーブル
mysql> select * from invoice_payment;
+----+------------+-----------------+-------------+---------------------+---------------------+
| id | invoice_id | amount_received | amount_sent | date_received | date_sent |
+----+------------+-----------------+-------------+---------------------+---------------------+
| 1 | 1 | 0.00 | 55.00 | 0000-00-00 00:00:00 | 2012-02-18 22:20:53 |
+----+------------+-----------------+-------------+---------------------+---------------------+
私が追跡し、トランザクションを更新することができますここでは支払いがBACSを介して行われます。..です。
この優れたテーブルデザインは何ですか?また改善すべき点はありますか?どのフィールドとテーブルを追加するべきですか?
請求書が生成されていると、後で私はorders_products
またはorders
テーブルに変更を加える必要がある場合 - それはinvoice.amount
フィールドを再計算する必要がありますか? (私はPHP/MySQLを使用します)。
SQLダンプ:あなたがアップデートしたい
CREATE TABLE IF NOT EXISTS `company` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(25) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
INSERT INTO `company` (`id`, `name`) VALUES
(1, 'Company A'),
(2, 'Company B');
CREATE TABLE IF NOT EXISTS `invoice` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`company_id` int(11) NOT NULL,
`invoice_no` int(11) NOT NULL,
`invoice_date` datetime NOT NULL,
`amount` decimal(6,2) NOT NULL,
`status_id` tinyint(1) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;
INSERT INTO `invoice` (`id`, `company_id`, `invoice_no`, `invoice_date`, `amount`, `status_id`) VALUES
(7, 2, 123, '2012-02-16 23:59:59', '55.00', 1);
CREATE TABLE IF NOT EXISTS `invoice_payment` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`invoice_id` int(11) NOT NULL,
`amount_received` decimal(6,2) NOT NULL,
`amount_sent` decimal(6,2) NOT NULL,
`date_received` datetime NOT NULL,
`date_sent` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
INSERT INTO `invoice_payment` (`id`, `invoice_id`, `amount_received`, `amount_sent`, `date_received`, `date_sent`) VALUES
(1, 1, '0.00', '55.00', '0000-00-00 00:00:00', '2012-02-18 22:20:53');
CREATE TABLE IF NOT EXISTS `orders` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`company_id` int(11) NOT NULL,
`total_cost` decimal(6,2) NOT NULL,
`order_date` datetime NOT NULL,
`status_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
INSERT INTO `orders` (`id`, `user_id`, `company_id`, `total_cost`, `order_date`, `status_id`) VALUES
(1, 5, 2, '25.00', '2012-02-03 23:30:24', 1),
(2, 7, 2, '30.00', '2012-02-13 18:06:12', 1);
CREATE TABLE IF NOT EXISTS `orders_products` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`order_id` int(11) NOT NULL,
`product_id` int(11) NOT NULL,
`product_name` varchar(100) NOT NULL,
`cost` decimal(6,2) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;
INSERT INTO `orders_products` (`id`, `order_id`, `product_id`, `product_name`, `cost`) VALUES
(1, 1, 34, 'Chair', '10.00'),
(2, 1, 25, 'TV', '10.00'),
(3, 1, 27, 'Desk', '2.50'),
(4, 1, 36, 'Laptop', '2.50'),
(5, 2, 75, 'PHP Book', '25.00'),
(6, 2, 74, 'MySQL Book', '5.00');
お気軽に/ここに答えるためにテーブルを追加します。 SimplyFi -
おかげ
2012年です。COTSやFOSSアカウンティングを使用する代わりに、独自のアカウンティングシステムを作成する魅力的な理由はありますか? –
@Catcallあなたは何を意味するのかよくわかりません...私はすでに顧客が製品を注文できるようにシステムを開発しました。バックエンドでは、注文のリストなどが表示されます。 –
私はGoogleが独自の会計システムを作成しておらず、Facebookは独自の会計システムを書いていないことを意味します。なぜあなたはあなた自身の会計システムを書いているのですか?時には、車輪を再発明する良い理由があります。会計は、通常、正当な理由ではありません。 –