2026-10-12 21:43:05 +00:00
-- Transfer belgesinin durum butonları : Confirm (Hazı rla, taslakta), Check (Hazı rla, bekleyende), Validate (Tamamla), Cancel (İptal Et), Return (İade Et).
CREATE OR REPLACE PROCEDURE public . " Inv_P_TransferSetStatus " ( p_id uuid , p_action varchar , p_user_id uuid DEFAULT NULL )
LANGUAGE plpgsql AS $ $
DECLARE v_status varchar ( 16 ) ; v_kind varchar ( 32 ) ; v_approval varchar ( 50 ) ; v_src uuid ; v_dst uuid ; v_new uuid ;
BEGIN
SELECT " Status " , " OperationKind " , " ApprovalStatus " , " SourceLocationId " , " DestinationLocationId "
INTO v_status , v_kind , v_approval , v_src , v_dst
FROM " Inv_T_Transfer " WHERE " Id " = p_id ;
UPDATE " Inv_T_Transfer " SET " PendingAction " = NULL WHERE " Id " = p_id ;
-- İç transfer depo içinde taşı madı r: iki uç da stok tutan iç konum ve birbirinden farklı olmalı (dı ş konuma giden mal stoktan düşer, hiçbir yere girmez).
-- İade belgesi muaftı r: yanlı şlı kla dı ş konuma yapı lmı ş transfer İade Et ile geri alı nabilmeli.
IF v_kind = ' InternalTransfer ' AND p_action IN ( ' Confirm ' , ' Check ' , ' Validate ' )
AND NOT EXISTS ( SELECT 1 FROM " Inv_T_Transfer " WHERE " Id " = p_id AND " ReturnOfId " IS NOT NULL ) THEN
IF v_src = v_dst THEN
RAISE EXCEPTION ' Kaynak ve hedef konum aynı olamaz. ' USING ERRCODE = ' P0001 ' , DETAIL = ' 50325 ' ;
END IF ;
IF EXISTS ( SELECT 1 FROM " Inv_T_Location " WHERE " Id " IN ( v_src , v_dst ) AND " LocationType " < > ' Internal ' ) THEN
RAISE EXCEPTION ' İç transferde kaynak ve hedef konum iç konum olmalı dı r. ' USING ERRCODE = ' P0001 ' , DETAIL = ' 50326 ' ;
END IF ;
END IF ;
IF p_action = ' Confirm ' THEN
IF v_status < > ' Draft ' THEN
RAISE EXCEPTION ' Yalnı z taslak belge hazı rlanabilir. ' USING ERRCODE = ' P0001 ' , DETAIL = ' 50301 ' ;
END IF ;
IF NOT EXISTS ( SELECT 1 FROM " Inv_T_TransferLine " WHERE " TransferId " = p_id AND " IsDeleted " = false ) THEN
RAISE EXCEPTION ' Ürün satı rı olmayan belge hazı rlanamaz. ' USING ERRCODE = ' P0001 ' , DETAIL = ' 50302 ' ;
END IF ;
IF v_src IS NULL OR v_dst IS NULL THEN
RAISE EXCEPTION ' Kaynak ve hedef konum seçilmelidir. ' USING ERRCODE = ' P0001 ' , DETAIL = ' 50303 ' ;
END IF ;
IF v_kind = ' InternalTransfer ' AND COALESCE ( v_approval , ' ' ) NOT IN ( ' Onaylandı ' , ' Onay Gerekmez ' ) THEN
RAISE EXCEPTION ' Kaynak depo onayı tamamlanmadan iç transfer hazı rlanamaz. ' USING ERRCODE = ' P0001 ' , DETAIL = ' 50304 ' ;
END IF ;
CALL public . " Inv_P_TransferCheckAvailability " ( p_id ) ;
ELSIF p_action = ' Check ' THEN
IF v_status NOT IN ( ' Waiting ' , ' Ready ' ) THEN
RAISE EXCEPTION ' Stok kontrolü yalnı z bekleyen ya da hazı r belgede yapı lı r. ' USING ERRCODE = ' P0001 ' , DETAIL = ' 50305 ' ;
END IF ;
CALL public . " Inv_P_TransferCheckAvailability " ( p_id ) ;
ELSIF p_action = ' Validate ' THEN
IF v_status < > ' Ready ' THEN
RAISE EXCEPTION ' Yalnı z hazı r belge tamamlanabilir. ' USING ERRCODE = ' P0001 ' , DETAIL = ' 50306 ' ;
END IF ;
CALL public . " Inv_P_TransferValidate " ( p_id , p_user_id ) ;
ELSIF p_action = ' Cancel ' THEN
IF v_status IN ( ' Done ' , ' Cancelled ' ) THEN
RAISE EXCEPTION ' Tamamlanmı ş ya da iptal edilmiş belge iptal edilemez. ' USING ERRCODE = ' P0001 ' , DETAIL = ' 50307 ' ;
END IF ;
UPDATE " Inv_T_Transfer " SET " Status " = ' Cancelled ' WHERE " Id " = p_id ;
2026-10-14 09:07:11 +00:00
-- İptal edilen transferin payı talep kalemine geri döner.
CALL public . " Prc_P_MaterialRequestItemSync " ( p_id ) ;
2026-10-12 21:43:05 +00:00
ELSIF p_action = ' Return ' THEN
IF v_status < > ' Done ' THEN
RAISE EXCEPTION ' Yalnı z tamamlanmı ş belge iade edilebilir. ' USING ERRCODE = ' P0001 ' , DETAIL = ' 50308 ' ;
END IF ;
CALL public . " Inv_P_TransferCopy " ( p_id , ' Return ' , p_user_id , v_new ) ;
END IF ;
END ;
$ $ ;