Alle 2 Wochen generiert das System die Rechnungen für die Unternehmen.
Das Unternehmen erhält jeden Monat am 1. und 16. eine Rechnung. (Es wird alle 2 Wochen über Cron Job ausgeführt. Es durchsucht die Auftragstabelle und fügt sie dann in die Rechnungstabelle ein. Gibt es eine Alternative?)
Die orders
Tabelle enthält eine Liste der Kundenbestellungen und gibt an, zu welchem Unternehmen sie gehört ( orders.company_id
)
Die invoice
Tabelle berechnet die Gesamtkosten der Bestellungen aus der orders
Tabelle.
Ich versuche herauszufinden, wie man eine vernünftige Rechnungsverfolgung gestaltet. Irgendwann muss mir das Unternehmen die Gebühren schicken oder irgendwann sende ich ihnen die Gebühren ( invoice.amount
)
Ich muss die Rechnungen wie folgt verfolgen:
- wenn die Firma mir den Betrag geschickt hat
- Wann habe ich den Betrag an die Firma geschickt?
- Wie viel Betrag wurde von der Firma erhalten
- Wie viel Betrag habe ich an die Firma geschickt?
- Habe ich den vollen Betrag erhalten (wenn nicht, was muss ich auf der Datenbank aktualisieren?)
- Rechnungsstatus (Rechnung gesendet, storniert, erhaltener Betrag, gesendeter Betrag)
Hier ist das Datenbankdesign, das ich mir ausgedacht habe:
Firmentisch
mysql> select * from company;
+----+-----------+
| id | name |
+----+-----------+
| 1 | Company A |
| 2 | Company B |
+----+-----------+
Kunden können ein Unternehmen von meiner Website auswählen.
Bestelltabelle
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 |
+----+---------+------------+------------+---------------------+-----------+
Zwei Kunden haben die Produkte bei Firma B ( orders.company_id = 2
) bestellt. Ich weiß, dass die Auftragsfelder nicht ausreichen, nur für Sie vereinfacht.
Bestellungstabellen
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 |
+----+----------+------------+--------------+-------+
Liste der Produkte, die Kunden bestellt haben.
Rechnungstabelle
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 |
+----+------------+------------+---------------------+--------+-----------+
Hier stecke ich ziemlich fest in der Gestaltung von Rechnungstabellen. Ich bin mir nicht sicher, wie es gemacht werden soll. Rechnungen werden alle 2 Wochen erstellt. Aus dem Ergebnis ergibt sich ein Beispiel von invoice.amount
55,00, da es aus der orders.company_id = 2
Tabelle berechnet wurde
Wenn der invoice.amount
Wert -50,00 (minus) beträgt, muss das Unternehmen mir den Gebührenbetrag senden.
Wenn der invoice.amount
Wert 50,00 ist, muss ich dem Unternehmen die Gebühren zusenden.
Die status_id könnte sein: (1) Gesendete Rechnung, (2) Storniert, (3) Abgeschlossen
Muss ich invoice_id
der orders
Tabelle ein Feld hinzufügen ? Aktualisieren Sie das orders.invoice_id
Feld, wenn die Zeile in die Rechnungstabelle eingefügt wurde.
Rechnung_Zahlungstabelle
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 |
+----+------------+-----------------+-------------+---------------------+---------------------+
Hier kann ich die Transaktion verfolgen und aktualisieren. Die Zahlung erfolgt über BACS.
Ist das ein gutes Tischdesign oder was muss ich verbessern? Welche Felder und Tabellen sollte ich hinzufügen?
Wenn die Rechnung erstellt wurde und ich später die Änderungen in orders_products
oder orders
Tabellen vornehmen muss - sollte das invoice.amount
Feld neu berechnet werden? (Ich werde PHP / MySQL verwenden).
SQL Dump :
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');
Fühlen Sie sich frei, wenn Sie hier aktualisieren / Tabellen zur Antwort hinzufügen möchten.
Vielen Dank
quelle
AllocationType
, wenn ich Kundengeld senden möchte? Muss ich mich auch in dieCashPayment
Tabelle einfügen (sagen wir, ich bezahle sie über BACS)?