Toutes les 2 semaines, le système génère les factures des entreprises.
L'entreprise recevra une facture le 1er et le 16 de chaque mois. (Il s'exécutera via Cron Job toutes les 2 semaines. Il parcourra le tableau des commandes, puis s'ajoutera au tableau des «factures». Y a-t-il une alternative?)
Il y a une liste de commandes clients dans le orders
tableau et il indique également à quelle entreprise il appartient ( orders.company_id
)
Le invoice
tableau calcule le coût total des commandes à partir du orders
tableau.
J'essaie de comprendre comment concevoir un suivi raisonnable des factures. Parfois, l'entreprise devra m'envoyer les frais ou parfois je leur enverrai les frais ( invoice.amount
)
J'ai besoin de suivre les factures avec les éléments suivants:
- lorsque l'entreprise m'a envoyé le montant
- quand ai-je envoyé le montant à l'entreprise
- le montant reçu de l'entreprise
- combien ai-je envoyé à l'entreprise
- ai-je reçu le montant total (sinon, de quoi ai-je besoin pour mettre à jour le Db?)
- état de la facture (facture envoyée, annulée, montant reçu, montant envoyé)
Voici la conception de la base de données que j'ai élaborée:
table entreprise
mysql> select * from company;
+----+-----------+
| id | name |
+----+-----------+
| 1 | Company A |
| 2 | Company B |
+----+-----------+
Les clients peuvent sélectionner une entreprise sur mon site Web.
tableau des commandes
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 |
+----+---------+------------+------------+---------------------+-----------+
deux clients ont commandé les produits à la société B ( orders.company_id = 2
). Je sais que les champs de commandes ne suffisent pas, simplement simplifiés pour vous.
Table commandes_produits
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 des produits que les clients ont commandés.
table de facturation
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 |
+----+------------+------------+---------------------+--------+-----------+
C'est là que je suis assez coincé sur la conception des tableaux de facturation. Je ne sais pas comment procéder. Les factures seront générées toutes les 2 semaines. De l'exemple de résultat invoice.amount
est 55,00 car il a été calculé à partir du orders.company_id = 2
tableau
Si la valeur invoice.amount
est -50,00 (moins), cela signifie que la société devra m'envoyer le montant des frais.
Si la valeur invoice.amount
est de 50,00, cela signifie que je dois envoyer les frais à l'entreprise.
Le status_id peut être: (1) Facture envoyée, (2) Annulée, (3) Terminée
Dois-je ajouter un invoice_id
champ dans la orders
table? Mettez à jour le orders.invoice_id
champ lorsque la ligne a été insérée dans le tableau "facture".
table de facturation_paiement
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 |
+----+------------+-----------------+-------------+---------------------+---------------------+
C'est là que je peux suivre et mettre à jour la transaction .. le paiement sera effectué via BACS.
Est-ce une bonne conception des tables ou que dois-je améliorer? Quels champs et tables dois-je ajouter?
Si la facture a été générée et que je dois par la suite apporter les modifications dans orders_products
ou les orders
tableaux - doit-elle recalculer le invoice.amount
champ? (J'utiliserai PHP / MySQL).
Dump 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');
N'hésitez pas à mettre à jour / ajouter des tableaux pour répondre ici.
Merci
la source
AllocationType
ce si je voulais envoyer de l'argent au client? Dois-je également insérer dans leCashPayment
tableau (disons les payer via BACS)?