Co 2 tygodnie system będzie generować faktury dla firm.
Firma otrzyma fakturę 1 i 16 każdego miesiąca. (Będzie uruchamiany za pośrednictwem Cron Job co 2 tygodnie. Skanuje tabelę zamówień, a następnie dodaje do tabeli „faktury”. Czy istnieje alternatywa?)
W orders
tabeli znajduje się lista zamówień klientów, a także wskazuje, do której firmy należy ( orders.company_id
)
invoice
Tabeli obliczyć całkowity koszt zamówień od orders
stołu.
Próbuję wymyślić, jak zaprojektować rozsądne śledzenie faktur. Kiedyś firma będzie musiała przesłać mi opłaty lub innym razem, gdy wyślę im opłaty ( invoice.amount
)
Muszę śledzić faktury za pomocą:
- kiedy firma wyśle mi kwotę
- kiedy wysłałem kwotę do firmy
- ile kwoty otrzymano od firmy
- ile kwoty wysłałem do firmy
- czy otrzymałem pełną kwotę (jeśli nie, co muszę zaktualizować na Db?)
- status faktury (faktura wysłana, anulowana, otrzymana kwota, wysłana kwota)
Oto projekt bazy danych, który wymyśliłem:
stolik firmowy
mysql> select * from company;
+----+-----------+
| id | name |
+----+-----------+
| 1 | Company A |
| 2 | Company B |
+----+-----------+
Klienci mogą wybrać firmę z mojej strony internetowej.
tabela zamówień
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 |
+----+---------+------------+------------+---------------------+-----------+
dwóch klientów zamówiło produkty od firmy B ( orders.company_id = 2
). Wiem, że pola zamówień nie są wystarczające, po prostu uproszczone dla Ciebie.
tabela zamowienia_produkty
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 |
+----+----------+------------+--------------+-------+
Lista produktów zamówionych przez klientów.
tabela faktur
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 |
+----+------------+------------+---------------------+--------+-----------+
Właśnie dlatego utknąłem przy projektowaniu tabel faktur. Nie jestem pewien, jak to zrobić. Faktury będą generowane co 2 tygodnie. Z przykładowego wyniku invoice.amount
wynika 55,00, ponieważ został obliczony z orders.company_id = 2
tabeli
Jeśli invoice.amount
wynosi -50,00 (minus), oznacza to, że firma będzie musiała przesłać mi kwotę opłat.
Jeśli invoice.amount
jest 50,00, oznacza to, że muszę wysłać firmie opłaty.
Status_id może być: (1) Wysłana faktura, (2) Anulowana, (3) Ukończona
Czy muszę dodać invoice_id
pole w orders
tabeli? Zaktualizuj orders.invoice_id
pole, gdy wiersz zostanie wstawiony do tabeli „faktury”.
tabela faktury
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 |
+----+------------+-----------------+-------------+---------------------+---------------------+
Tutaj mogę śledzić i aktualizować transakcje. Płatność zostanie dokonana za pośrednictwem BACS.
Czy to dobry projekt stołów lub co muszę poprawić? Jakie pola i tabele powinienem dodać?
Jeśli faktura została wygenerowana, a później muszę dokonać zmian orders_products
lub orders
tabele - należy ponownie obliczyć invoice.amount
pole? (Będę używać PHP / MySQL).
Zrzut 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');
Zapraszam do aktualizacji / dodawania tabel do odpowiedzi tutaj.
Dzięki
AllocationType
było, gdybym chciał wysłać pieniądze klienta? Czy muszę również wstawiać doCashPayment
tabeli (powiedzmy, płacąc je za pośrednictwem BACS)?