DELIMITER //
CREATE PROCEDURE CalculateFifoCosts(IN startDate DATE, IN endDate DATE)
BEGIN
-- Dəyişənlər
DECLARE stockId INT;
DECLARE totalQuantity INT;
DECLARE remainingQuantity INT;
DECLARE cost DECIMAL(10,2);
DECLARE quantityToUse INT;
DECLARE unitCost DECIMAL(10,2);
DECLARE availableQuantity INT;
-- Müvəqqəti cədvəl yaradın
CREATE TEMPORARY TABLE IF NOT EXISTS fifo_costs (
stock_id INT,
total_cost DECIMAL(10,2)
);
-- Müvəqqəti cədvəli təmizləyin
TRUNCATE TABLE fifo_costs;
-- Satışları hesablamaq üçün blok
BEGIN
DECLARE done INT DEFAULT FALSE;
-- Satışları hesablamaq üçün cursor
DECLARE cur CURSOR FOR
SELECT stock_id, SUM(count) AS total_quantity
FROM sales
WHERE finished = 1 AND created_at BETWEEN startDate AND endDate
GROUP BY stock_id;
-- Əsas cursor üçün NOT FOUND handler
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
-- Əsas cursoru açın
OPEN cur;
read_loop: LOOP
FETCH cur INTO stockId, totalQuantity;
IF done THEN
LEAVE read_loop;
END IF;
-- FIFO hesablaması üçün dəyişənlər
SET remainingQuantity = totalQuantity;
SET cost = 0;
-- FIFO əsasında maya dəyərini hesablamaq üçün blok
BEGIN
DECLARE done2 INT DEFAULT FALSE;
-- FIFO əsasında maya dəyərini hesablamaq üçün cursor
DECLARE fifo_cur CURSOR FOR
SELECT input_products.count, input_products.maya_deyeri
FROM input_products
JOIN invoices ON input_products.invoice_id = invoices.id
WHERE input_products.stock_id = stockId
ORDER BY invoices.date ASC;
-- Daxili cursor üçün NOT FOUND handler
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done2 = TRUE;
-- Daxili cursoru açın
OPEN fifo_cur;
repeat_loop: LOOP
FETCH fifo_cur INTO availableQuantity, unitCost;
-- Əgər məlumat yoxdur və ya qalan miqdar sıfırdırsa, döngüdən çıxın
IF done2 OR remainingQuantity <= 0 THEN
LEAVE repeat_loop;
END IF;
-- Hesablama üçün qalan miqdarı istifadə edin
SET quantityToUse = LEAST(availableQuantity, remainingQuantity);
SET cost = cost + (quantityToUse * unitCost);
SET remainingQuantity = remainingQuantity - quantityToUse;
END LOOP;
-- Daxili cursoru bağlayın
CLOSE fifo_cur;
END;
-- Hesablanmış maliyyəti müvəqqəti cədvələ əlavə edin
INSERT INTO fifo_costs (stock_id, total_cost) VALUES (stockId, cost);
END LOOP;
-- Əsas cursoru bağlayın
CLOSE cur;
END;
-- Nəticələri əldə etmək üçün müvəqqəti cədvəli seçin
SELECT * FROM fifo_costs;
-- Müvəqqəti cədvəli silin
DROP TEMPORARY TABLE fifo_costs;
END //
DELIMITER ;
$startDate = '1994-08-31';
$endDate = '2024-08-31';
$results = DB::select('CALL CalculateFifoCosts(?, ?)', [$startDate, $endDate]);
$collection = collect($results);
$totalCost = $collection->sum('total_cost');
dd($totalCost);
by Rahim Süleymanov | Aug 20, 2024