Azərbaycan English
Loading...

  

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