0

会社は毎月 1 日と 16 日に請求書を受け取ります。(これは 2 週間ごとに Cron ジョブを介して実行されます。注文テーブルをスキャンしてから、「請求書」テーブルに追加します。代替手段はありますか?)

テーブルには顧客の注文のリストがありorders、それがどの会社に属しているかも示しています ( orders.company_id)

テーブルは、テーブルinvoiceからの注文の総コストを計算し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より 55.00 はorders.company_id = 2表から計算したため

が -50.00 (マイナス)の場合、invoice.amount会社が私に手数料の額を送る必要があることを意味します。

invoice.amountが 50.00の場合、会社に料金を送金する必要があることを意味します。

status_id は、(1) 請求書送信済み、(2) キャンセル済み、(3) 完了済みのいずれかです。

テーブルにinvoice_idフィールドを追加する必要がありますか? 行が「invoice」テーブルに挿入されordersたら、フィールドを更新します。orders.invoice_id

請求書_支払いテーブル

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');

Answer here にテーブルを更新/追加してください。

ありがとう

4

1 に答える 1

0

Geminiのアドオン- SimplyFiをご覧ください。それに応じて請求書をブランド化し、顧客が生成したときに自動で電子メールを送信し、支払いをログに記録し、未受領の支払い (ステートメント) のリマインダーを送信できます。また、システムに統合するために使用できる完全な REST ベースの API を備えています。また、定期請求機能の恩恵を受けることもできます。

マイナスの請求金額について言及している場合、それらは事実上「クレジットノート」です(あなたの投稿から私が理解したことから)。通常、クライアントに発行された後に請求書自体を変更するべきではありません。金額を修正する必要がある場合 (つまり、加算または減算)、新しい請求書を発行する必要があります (追加された金額に対して)。 、または差し引かれた金額の貸方票。

また、顧客が数週間以内に新しい請求書を受け取る場合は、返金しないことをお勧めします。単に口座残高を追跡し、必要な場合にのみ請求書または貸方票を発行します。お金の移動にはお金がかかりますし、必要がなければ移動する必要はありません。ちょうど私の2セント

于 2012-02-16T16:22:37.053 に答える