2026-10-14 19:26:03 +00:00
-- Otomatik Ata: stoktan çı kan satı rı n lot dağı lı mı nı kaynak konumun stoğundan ürün kategorisinin çı kı ş stratejisiyle yeniden kurar
-- (FIFO: ilk giren ilk çı kar, LIFO: son giren ilk çı kar — InDate, aynı anda girenlerde lot/seri no; kategorisiz ürün FIFO). Planlama'nı n Öner'i aynı kuralı izler.
2026-10-12 21:43:05 +00:00
-- Stok yetmezse karşı lanabilen kadar atanı r; eksik Tamamla'da bildirilir.
CREATE OR REPLACE PROCEDURE public . " Inv_P_TransferLineLotAssign " ( p_id uuid , p_user_id uuid DEFAULT NULL )
LANGUAGE plpgsql AS $ $
DECLARE v_tenant uuid ; v_method varchar ( 16 ) ; v_src uuid ; v_src_internal boolean ; v_product uuid ;
2026-10-14 19:26:03 +00:00
v_line_uom varchar ( 64 ) ; v_product_uom varchar ( 64 ) ; v_need numeric ( 18 , 4 ) ; v_strategy varchar ( 16 ) ;
2026-10-12 21:43:05 +00:00
BEGIN
SELECT l . " TenantId " , CASE WHEN p . " TrackInventory " THEN p . " TrackingMethod " END , t . " SourceLocationId " ,
2026-10-14 19:26:03 +00:00
COALESCE ( src . " LocationType " = ' Internal ' , false ) , l . " ProductId " , l . " UomId " , p . " UomId " , COALESCE ( pc . " RemovalStrategy " , ' FIFO ' ) ,
2026-10-12 21:43:05 +00:00
public . " Inv_F_UomConvert " ( CASE WHEN l . " Quantity " > 0 THEN l . " Quantity " ELSE l . " DemandQuantity " END , l . " UomId " , p . " UomId " )
2026-10-14 19:26:03 +00:00
INTO v_tenant , v_method , v_src , v_src_internal , v_product , v_line_uom , v_product_uom , v_strategy , v_need
2026-10-12 21:43:05 +00:00
FROM " Inv_T_TransferLine " l
INNER JOIN " Inv_T_Transfer " t ON t . " Id " = l . " TransferId "
INNER JOIN " Inv_T_Product " p ON p . " Id " = l . " ProductId "
2026-10-14 19:26:03 +00:00
LEFT JOIN " Inv_T_ProductCategory " pc ON pc . " Id " = p . " CategoryId "
2026-10-12 21:43:05 +00:00
LEFT JOIN " Inv_T_Location " src ON src . " Id " = t . " SourceLocationId "
WHERE l . " Id " = p_id ;
IF COALESCE ( v_method , ' ' ) NOT IN ( ' Lot ' , ' Serial ' ) THEN
RAISE EXCEPTION ' Ürün lot/seri numarası yla takip edilmiyor. ' USING ERRCODE = ' P0001 ' , DETAIL = ' 50314 ' ;
END IF ;
IF NOT COALESCE ( v_src_internal , false ) THEN
RAISE EXCEPTION ' Otomatik atama yalnı z stoktan çı kan satı rda yapı lı r. ' USING ERRCODE = ' P0001 ' , DETAIL = ' 50317 ' ;
END IF ;
UPDATE " Inv_T_TransferLineLot " SET " IsDeleted " = true , " DeletionTime " = NOW ( ) AT TIME ZONE ' UTC ' , " DeleterId " = p_user_id
WHERE " TransferLineId " = p_id AND " IsDeleted " = false ;
INSERT INTO " Inv_T_TransferLineLot " ( " Id " , " TenantId " , " TransferLineId " , " LotNo " , " Quantity " , " CreationTime " , " CreatorId " , " IsDeleted " )
SELECT gen_random_uuid ( ) , v_tenant , p_id , s . " LotNo " ,
public . " Inv_F_UomConvert " ( LEAST ( s . " Quantity " , v_need - s . " Before " ) , v_product_uom , v_line_uom ) ,
NOW ( ) AT TIME ZONE ' UTC ' , p_user_id , false
FROM ( SELECT " LotNo " , " Quantity " ,
2026-10-14 19:26:03 +00:00
SUM ( " Quantity " ) OVER ( ORDER BY CASE WHEN v_strategy = ' LIFO ' THEN NULL ELSE COALESCE ( " InDate " , ' 9999-12-31 ' ) END NULL S FIRST ,
CASE WHEN v_strategy = ' LIFO ' THEN COALESCE ( " InDate " , ' 1900-01-01 ' ) END DESC NULL S LAST ,
CASE WHEN v_strategy = ' LIFO ' THEN NULL ELSE " LotNo " END ,
CASE WHEN v_strategy = ' LIFO ' THEN " LotNo " END DESC NULL S LAST
ROWS UNBOUNDED PRECEDING ) - " Quantity " AS " Before "
2026-10-12 21:43:05 +00:00
FROM " Inv_T_Stock "
WHERE " LocationId " = v_src AND " ProductId " = v_product AND " LotNo " < > ' ' AND " Quantity " > 0
AND " TenantId " IS NOT DISTINCT FROM v_tenant ) s
WHERE s . " Before " < v_need ;
END ;
$ $ ;