CREATE TABLE IF NOT EXISTS `logbook` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`product_id` int(10) unsigned NOT NULL,
`price` decimal(10,2) NOT NULL DEFAULT '0.00',
`adate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`type` enum('delivered','shipped') NOT NULL,
`quantity` int(10) unsigned NOT NULL,
`calculated` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'учтено',
PRIMARY KEY (`id`),
KEY `product_id` (`product_id`),
KEY `calculated` (`calculated`),
KEY `type` (`type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
CREATE TABLE IF NOT EXISTS `storage_duration` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`adate` date NOT NULL,
`edate` date NOT NULL,
`product_id` int(10) unsigned NOT NULL,
`qty` int(10) unsigned NOT NULL,
`duration` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `product_id` (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
INSERT INTO `warehouse`.`logbook` (`product_id`,`type`, `quantity`) VALUES (1, 'delivered', '1');
INSERT INTO `warehouse`.`logbook` (`product_id`,`type`, `quantity`) VALUES (2, 'delivered', '3');
INSERT INTO `warehouse`.`logbook` (`product_id`,`type`, `quantity`) VALUES (1, 'delivered', '2');
INSERT INTO `warehouse`.`logbook` (`product_id`,`type`, `quantity`) VALUES (2, 'delivered', '2');
INSERT INTO `warehouse`.`logbook` (`product_id`,`type`, `quantity`) VALUES (1, 'shipped', '1');
INSERT INTO `warehouse`.`logbook` (`product_id`,`type`, `quantity`) VALUES (2, 'shipped', '2');
INSERT INTO `warehouse`.`logbook` (`product_id`,`type`, `quantity`) VALUES (1, 'shipped', '2');
INSERT INTO `warehouse`.`logbook` (`product_id`,`type`, `quantity`) VALUES (2, 'shipped', '3');
DROP PROCEDURE IF EXISTS calc;
DELIMITER //
CREATE PROCEDURE calc()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE _in_id,_out_id,_product_id,_in_qty,_out_qty,_calculated, _count INT UNSIGNED;
DECLARE _begin_date,_end_date DATETIME;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
read_line: LOOP
SELECT count(*) INTO _count
FROM logbook l
WHERE type = 'shipped' AND quantity-calculated>0;
IF _count THEN
SELECT
il.id,
ol.id,
ol.product_id,
DATE(il.adate),
DATE(ol.adate),
il.quantity - il.calculated,
ol.quantity - ol.calculated
INTO _in_id,_out_id,_product_id,_begin_date,_end_date,_in_qty,_out_qty
FROM logbook ol
LEFT JOIN logbook il on ol.product_id = il.product_id
WHERE ol.id = (
SELECT min(id)
FROM logbook l
WHERE type = 'shipped' AND quantity-calculated>0 AND product_id = ol.product_id
) AND il.id = (
SELECT min(id)
FROM logbook l
WHERE type = 'delivered' AND quantity-calculated>0 AND product_id = il.product_id
)
LIMIT 1;
IF done THEN LEAVE read_line; END IF;
IF _in_qty > _out_qty THEN SET _calculated = _out_qty;
ELSE SET _calculated = _in_qty; END IF;
INSERT INTO storage_duration SET
adate=_begin_date,
edate=_end_date,
product_id=_product_id,
qty=_calculated,
duration = DATEDIFF(edate,adate);
UPDATE logbook SET calculated = calculated+_calculated
WHERE id =_in_id;
UPDATE logbook SET calculated = calculated+_calculated
WHERE id =_out_id;
ELSE LEAVE read_line; END IF;
END LOOP;
END;
//