Cada 2 semanas, el sistema generará las facturas para las empresas.
La empresa recibirá una factura los días 1 y 16 cada mes. (Se ejecutará a través de Cron Job cada 2 semanas. Se escanea a través de la tabla de pedidos y luego se agrega a la tabla de 'facturas'. ¿Hay alguna alternativa?)
Hay una lista de pedidos de clientes en la orders
tabla y también indica a qué compañía pertenece ( orders.company_id
)
La invoice
tabla calcula el costo total de los pedidos de la orders
tabla.
Estoy tratando de descubrir cómo diseñar un seguimiento razonable de las facturas. Compañía en algún momento tendrá que me mandan los cánones o en algún momento les mandan los cánones ( invoice.amount
)
Necesito rastrear las facturas con lo siguiente:
- cuando la empresa me ha enviado la cantidad
- ¿Cuándo envié el monto a la empresa?
- cuánto ha recibido la empresa
- ¿Cuánto le envié a la empresa?
- ¿Recibí la cantidad completa (si no, ¿qué necesito actualizar en el Db?)
- estado de la factura (Factura enviada, cancelada, cantidad recibida, cantidad enviada)
Aquí está el diseño de la base de datos que se me ocurrió:
mesa de la empresa
mysql> select * from company;
+----+-----------+
| id | name |
+----+-----------+
| 1 | Company A |
| 2 | Company B |
+----+-----------+
Los clientes pueden seleccionar una empresa de mi sitio web.
tabla de pedidos
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 |
+----+---------+------------+------------+---------------------+-----------+
dos clientes han pedido los productos a la Compañía B ( orders.company_id = 2
). Sé que los campos de pedidos no son suficientes, simplemente simplificados para ti.
tabla de pedidos_productos
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 de productos que los clientes han pedido.
tabla de factura
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 |
+----+------------+------------+---------------------+--------+-----------+
Aquí es donde estoy bastante atrapado en el diseño de tablas de facturas. No estoy seguro de cómo debería hacerse. Las facturas se generarán cada 2 semanas. El resultado del ejemplo invoice.amount
es 55.00 porque se ha calculado a partir de la orders.company_id = 2
tabla
Si invoice.amount
es -50.00 (menos), significa que la compañía deberá enviarme el monto de las tarifas.
Si invoice.amount
es 50.00, significa que necesito enviarle los honorarios a la compañía.
El status_id podría ser: (1) Factura enviada, (2) Cancelada, (3) Completada
¿Necesito agregar un invoice_id
campo en la orders
tabla? Actualice el orders.invoice_id
campo cuando la fila se haya insertado en la tabla 'factura'.
tabla de pago de factura
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 |
+----+------------+-----------------+-------------+---------------------+---------------------+
Aquí es donde puedo rastrear y actualizar la transacción. El pago se realizará a través de BACS.
¿Es este un buen diseño de tablas o qué necesito mejorar? ¿Qué campos y tablas debo agregar?
Si la factura se ha generado y luego tengo que hacer los cambios en orders_products
o orders
tablas - en caso de que vuelva a calcular el invoice.amount
campo? (Usaré PHP / MySQL).
Volcado de 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');
Siéntase libre de querer actualizar / agregar tablas para responder aquí.
Gracias
fuente
AllocationType
si quisiera enviar dinero al cliente? ¿Debo insertar también en laCashPayment
tabla (digamos, pagándolas a través de BACS)?