-- 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; -- İptal edilen transferin payı talep kalemine geri döner. CALL public."Prc_P_MaterialRequestItemSync"(p_id); 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; $$;