USE `inventory`;

DROP FUNCTION IF EXISTS `inventory`.`TesLaporanStokOpnameFifo`;
DELIMITER //
CREATE DEFINER=`root`@`localhost` FUNCTION `inventory`.`TesLaporanStokOpnameFifo`(
	`PIDOBAT` INT,
	`PSTOK` DECIMAL(15,3),
	`PTANGGAL` DATETIME
) RETURNS decimal(60,2)
    DETERMINISTIC
BEGIN
	
	DECLARE persediaan_akhir DECIMAL(60,2);
	
	SET @jmlsisa= ROUND(0.00,2);
	SET @stokakhir=null;
	
	
	SELECT SUM(jmlsisa * HARGA) INTO persediaan_akhir
		FROM (	
				SELECT ab.TANGGAL, ab.BARANG, ab.JUMLAH, ab.HARGA
						, @stokakhir:=(IF(@stokakhir is null,@stokakhir:=ROUND(PSTOK,2),@stokakhir) - @jmlsisa) stokakhir
						, @jmlsisa:= IF(ab.JUMLAH > @stokakhir OR JENIS=2,@stokakhir, IF(YEAR(ab.TANGGAL)< '2021',@stokakhir,ab.JUMLAH)) jmlsisa
					 
					FROM (
								(
									SELECT pb.TANGGAL, pbd.BARANG, pbd.JUMLAH, pbd.HARGA
									  FROM inventory.penerimaan_barang_detil pbd
										  , inventory.penerimaan_barang pb
									 WHERE pbd.BARANG=PIDOBAT AND pbd.PENERIMAAN=pb.ID AND pbd.`STATUS` = 2 AND pbd.BONUS=0 AND pb.TANGGAL <= PTANGGAL AND pb.`STATUS`=2
									ORDER BY pb.TANGGAL DESC
								)
									UNION ALL
								(
									SELECT DATE_ADD('2022-12-01 00:00:00', INTERVAL ID MINUTE) TANGGAL, pgd.BARANG, pgd.JUMLAH, pgd.HARGA
										HARGA
									FROM inventory.hrg_migrasi_sistem pgd
									WHERE pgd.BARANG=PIDOBAT AND pgd.JUMLAH > 0
								)
									UNION ALL
								(
									SELECT h.TANGGAL, d.BARANG, d.QTY JUMLAH, d.HARGA
									FROM inventory.hibah h
										, inventory.hibah_detil d
									WHERE d.HIBAH = h.ID AND d.BARANG = PIDOBAT AND h.`STATUS` = 2 AND h.JENIS = 1 AND h.TANGGAL <= PTANGGAL
									ORDER BY h.TANGGAL DESC
								)
								
							) ab ORDER BY ab.TANGGAL DESC
				) cd
	WHERE cd.jmlsisa!=0;

	IF persediaan_akhir IS NOT NULL OR persediaan_akhir!=0 THEN
		RETURN persediaan_akhir;
	ELSE
		RETURN PSTOK * (SELECT inventory.getHargaPenerimaanTerakhir(PIDOBAT));
	END IF;

END//
DELIMITER ;