USE [prince]
GO
/****** Object:  StoredProcedure [Orginal].[SHC_VipApplyGiftCharge]    Script Date: 04/30/2026 10:19:57 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		Ghasem Babaie
-- Create date: 1401-02-18
-- Description:	اعمال شارژ هدیه کارت خرید - مطابق با درخواست شعب
--				فراخوانی می شود API در SP این  
-- =============================================
ALTER PROCEDURE [Orginal].[SHC_VipApplyGiftCharge] 
(
	@BranchCode				[Common].[_TINY_],
	@FinancialYear			[Common].[_SMALL_],
	@CardNo					[Common].[_SMALL_],
	@FactorAmount			[Common].[_MONEY_],
	@DecreaseCharge_VCO_ID  [Common].[_INT_], -- آیدی مربوط به عملیات کسر شارژ از کارت خرید
											  -- دریافت می شود CardWithdraw در صورتی که از کارت خریدی در عملیات مالی استفاده شود، این آیدی در متد 
											  -- و بایستی آیدی دریافت شده، در متد مربوط به شارژ هدیه کارت خرید به این اس پی پاس داده شود
	@MethodName				[Common].[_SMALL_], -- دریافت نشود API این مقدار توسط وب سرویس پاس داده شود - در
	@CurrentDate			[Common].[_DATE_], -- دریافت نشود API این مقدار توسط وب سرویس پاس داده شود - در ××× Ex: 1401/02/07
	@CurrentTime			[Common].[_TIME_] -- دریافت نشود API این مقدار توسط وب سرویس پاس داده شود - در ××× Ex: 16:25:12
)
AS
BEGIN

	SET NOCOUNT ON;

	-- Added By Ghasem Babaie - 1405.02.10 [ PRI-5035 ]
	-- چون ممکن است سال مالی مرکز و شعبه با هم متفاوت باشد
	-- تصمیم بر این شد که سال مالی از شعبه به مرکز یا بالعکس ارسال نشود
	-- و این عملیات بر روی آخرین سال مالی باز انجام شود
	-- پس این مقدار را از سمت نرم افزار خالی ارسال می کنیم که در اینجا، آخرین سال مالی باز استخراج شود
	IF LTRIM(RTRIM(ISNULL(@FinancialYear, ''))) = ''
	BEGIN
		SET @FinancialYear = (SELECT [FNY_Name] FROM [Common].[FinancialYear] WHERE ISNULL([FNY_CloseDate_Int], 0) = 0)
    END

    DECLARE @CurrentDate_Int  [Common].[_INT_] = [Common].[SYS_CastDateToNum](@CurrentDate)
    
    DECLARE @CardAccount			[Common].[_INT_],
			@DO						[Common].[_INT_],
			@Out_POP_ID				[Common].[_INT_],
			@SHC_ID					[Common].[_INT_],
			@SHC_IsDisabled			[Common].[_BOOLEAN_],
			@SHC_IsDeleted			[Common].[_BOOLEAN_],
			@SHC_ExpireDate_Int		[Common].[_INT_],
			@SHC_InUse				[Common].[_BOOLEAN_],
			@SHC_BranchCode			[Common].[_TINY_],
			@SHC_ExpireDate			[Common].[_DATE_] = '',
			@VCO_ID					[Common].[_INT_] = -2000,
            @CBI_Branch_CPN_ID		[Common].[_INT_],
            @CBI_CPN_ACN_ID			[Common].[_INT_],
            @CPN_CardAccount		[Common].[_INT_],
            @ACN_CurrentAmount      [Common].[_MONEY_],
            @CBI_ID					[Common].[_INT_],
            @VCO_TrackingCode		[Common].[_TINY_] = '',
            @DefaultPartID			[Common].[_INT_],
            @RecDiscountAccount		[Common].[_INT_],
            @T_RecDiscountAccount	[Common].[_BIG_],            
            @GiftCharge_SCC_ID		[Common].[_INT_],
            @GiftCharge_SHI_ID		[Common].[_INT_],
            @GiftChargeAmount		[Common].[_MONEY_],
            @GiftChargeApplied		[Common].[_MONEY_] = 0,
            @UseOfShoppingCardAutoChargeFormula		[Common].[_INT_],  
            @VCL_ID					[Common].[_INT_],          
            @Res					[Common].[_INT_] = 0, -- 0: Success
            @ResMsg					[Common].[_WIDE_]

	BEGIN TRY
		BEGIN TRANSACTION
		
			-- بررسی معتبر بودن کد شعبه ارسالی
			SET @CBI_ID = 0
			SET @CBI_Branch_CPN_ID = 0
			
			SELECT @CBI_ID = [CBI_ID], @CBI_Branch_CPN_ID = [CBI_Branch_CPN_ID] FROM [Common].[CompanyBranchInfo] WHERE [CBI_Code] = @BranchCode
			IF @CBI_ID > 0
			BEGIN
				-- بررسی انتخاب شده بودن شخص شعبه
				IF @CBI_Branch_CPN_ID > 0
				BEGIN			
					IF @FactorAmount > 0
					BEGIN
						-- استخراج آیدی کارت خرید براساس شماره کارت
						SET @SHC_ID = 0
						SET @SHC_IsDisabled = 0
						SET @SHC_IsDeleted = 0
						
						SELECT @SHC_ID = [SHC_ID], @SHC_IsDisabled = [SHC_IsDisabled], @SHC_IsDeleted = [SHC_IsDeleted], 
								@SHC_ExpireDate_Int = [SHC_ExpireDate_Int], @SHC_InUse = [SHC_InUse], @SHC_BranchCode = [SHC_BranchCode],
								@SHC_ExpireDate = [SHC_ExpireDate]
						FROM [Common].[ShoppingCard] 
						WHERE [SHC_CardNo] = @CardNo
						
						-- بررسی اینکه کارتی با این شماره وجود دارد؟
						-- تمامی مشخصات کارت خرید استخراج می شود و در متغییر هایی قرار می گیرد
						IF @SHC_ID > 0
						BEGIN
							-- بررسی غیرفعال نبودن کارت خرید
							IF @SHC_IsDisabled = 0
							BEGIN	
								-- بررسی حذف نشده بودن کارت خرید
								IF @SHC_IsDeleted = 0
								BEGIN
									-- بررسی سپری نشدن تاریخ انقضاء کارت خرید
									IF @SHC_ExpireDate_Int >= @CurrentDate_Int
									BEGIN
										-- حساب تجميعي کارت خرید
										SET @CardAccount = 0 
										SET @CardAccount = (SELECT [ACN_ID] FROM [Common].[Account] WHERE [ACN_TBL_Holder] = 156 AND [ACN_HolderID] = 0)
										IF @CardAccount > 0
										BEGIN
											-- کد حساب کارت خرید شخص
											SET @CPN_CardAccount = 0
											SELECT @CPN_CardAccount = [ACN_ID], @ACN_CurrentAmount = [ACN_CurrentAmount] FROM [Common].[Account] WHERE [ACN_TBL_Holder] = 153 AND [ACN_HolderID] = @SHC_ID  			  
											IF @CPN_CardAccount > 0
											BEGIN
												-- ××××××××××××××××××××××××××××××××××××××
												-- شروع به ثبت تراکنش های شارژ هدیه
												-- در صورتی که شارژ هدیه فعال باشد، این شارژ محاسبه و بر روی کارت فعلی اعمال می شود
												-- ××××××××××××××××××××××××××××××××××××××
												SET @GiftChargeApplied = 0
												
												-- استخراج مقدار تنظیمات شارژ کارت هدیه													
												SELECT @UseOfShoppingCardAutoChargeFormula = [SST_Value]
												FROM [Common].[SystemSetting] 
												WHERE [SST_Title] = 'UseOfShoppingCardAutoChargeFormula' AND [SST_UserID] = 0

												-- بررسی اینکه شارژ هدیه کارت خرید فعال است؟
												IF @UseOfShoppingCardAutoChargeFormula > 0
												BEGIN
													-- بخش پیش فرض کارت خرید
													SET @DefaultPartID = 0
													SELECT @DefaultPartID = SST_Value  FROM Common.SystemSetting WHERE SST_Title = 'DefaultPartIDForShoppingCard' AND SST_UserID = 0
												    
													-- حساب تخفیف بخش پیش فرض کارت خرید
													SET @RecDiscountAccount = 0
													SELECT @RecDiscountAccount = ACN_ID , @T_RecDiscountAccount = ACN_Name FROM Common.Account WHERE ACN_TBL_Holder = 168 AND ACN_HolderID = @DefaultPartID
												
													-- استخراج مبلغ شارژ هدیه با توجه به فرمول ثبت شده در دیتابیس
													EXEC [Common].[SCF_GetShoppingCardGiftAmount] @CurrentDate,@FactorAmount,@GiftChargeAmount OUTPUT
												
													-- بررسی اینکه مبلغ شارژ هدیه استخراج شده بزرگتر از صفر باشد
													IF @GiftChargeAmount > 0
													BEGIN
														-- ××××××××××××××××××××××××××××××××××××××××××××
														-- بررسی اینکه از کارت خرید مبلغی کسر شده است؟
														-- اگر مبلغی کسر شده باشد، کد رهگیری عملیات شارژ هدیه کارت خرید و عملیات کسر از کارت خرید، بایستی یکسان باشد
														-- به این دلیل بایستی کد رهگیری یکسان باشد، که اگر خواستیم اطلاعات را حذف کنیم، بتوانیم عملیات های مرتبط با یکدیگر را پیدا کنیم
														-- ××××××××××××××××××××××××××××××××××××××××××××
														SET @VCO_TrackingCode = ''
														
														IF @DecreaseCharge_VCO_ID > 0
														BEGIN														
															SET @VCO_TrackingCode = ISNULL((SELECT [VCO_TrackingCode]
																							FROM [VIP].[VipShoppingCardOperation] 
																							WHERE [VCO_ID] = @DecreaseCharge_VCO_ID), '')
														END
														
														IF @VCO_TrackingCode = ''
														BEGIN
															-- چون مبلغی از کارت خرید کسر نشده است و فقط عملیات شارژ هدیه کارت خرید را داریم، بایستی کد رهگیری ایجاد کنیم
															-- ایجاد کد رهگیری مربوط به عملیات شارژ هدیه کارت خرید
															-- این کد برای پیگیری های بعدی و استخراج وضعیت عملیات مالی کارت خرید و بروز رسانی وضعیت و بازگشت زدن عملیات مالی کاربرد دارد
															EXEC [VIP].[SHC_VipGenerateTrackingCode] @BranchCode, @VCO_TrackingCode OUT
														END
														-- ××××××××××××××××××××××××××××××××××××××××××××
														
														-- INSERT INTO [VipShoppingCardOperation]
														EXEC [VIP].[VCO_Insert] @VCO_ID OUTPUT,@BranchCode,@FinancialYear,@CardNo,1,@GiftChargeAmount,@CurrentDate,@CurrentTime,0,@VCO_TrackingCode,@MethodName,'',0
														IF @VCO_ID > 0 
														BEGIN														
															-- INSERT INTO [ShoppingCardCharge]
															EXEC [Orginal].[SCC_Insert] @GiftCharge_SCC_ID OUTPUT,@CBI_Branch_CPN_ID,@CurrentDate,N'مرکز و شعب - شارژ هدیه کارت خرید',@GiftChargeAmount,1,0 
															IF @GiftCharge_SCC_ID > 0 
															BEGIN
																-- Financial Transaction
																-- طرف حساب: شخص و حساب تجمیعی کارت خرید
																-- @CardAccount: حساب تجمیعی کارت خرید
																EXEC [Orginal].[FirstFinancialTransaction] 38,0,@GiftChargeAmount,@CurrentDate,@CurrentTime,@CBI_Branch_CPN_ID,@CardAccount,154,@GiftCharge_SCC_ID,NULL,'','','','','','',1,@DO OUTPUT 
																IF @DO > 0 
																BEGIN
																	-- استخراج حساب مالی شخص پیش فرض شعبه
																	SET @CBI_CPN_ACN_ID = [Common].ACN_GetACNID(@CBI_Branch_CPN_ID, 15)
																	
																	IF @CBI_CPN_ACN_ID > 0
																	BEGIN																	
																		-- Financial Transaction & Payment Operation 
																		-- طرف حساب: شخص و حساب تخفیفات کارت خرید
																		-- به این دلیل حساب تخفیفات کارت خرید مربوط به بخش پیش فرض درگیر می شود که می خواهیم پرداخت شارژ را تخفیف بزنیم
																		-- با انجام این نوع پرداخت، به عبارتی کارت خرید، همان کارت تخفیف می شود																	
																		EXEC [Orginal].[GeneralTransferCredit] 38,40,@GiftChargeAmount,@CurrentDate,@CurrentTime,@RecDiscountAccount,'',@CBI_CPN_ACN_ID,'',154,@GiftCharge_SCC_ID,NULL,'','','','',@T_RecDiscountAccount,'','','','','',1,@Out_POP_ID output,@DO OUTPUT 
																		IF @DO > 0 
																		BEGIN	
																			-- INSERT INTO [ShoppingCardItemsCharge] & Financial Transaction
																			EXEC [Orginal].[SHI_Insert] @GiftCharge_SHI_ID OUTPUT,1,@GiftCharge_SCC_ID,@SHC_ID,@GiftChargeAmount,'',6,'',@GiftChargeAmount,417,@VCO_ID
																			IF @GiftCharge_SHI_ID > 0 
																			BEGIN									
																				-- Financial Transaction & Payment Operation 
																				-- طرف حساب: کارت خرید مورد نظر و حساب تجمیعی کارت خرید
																				EXEC [Orginal].[GeneralTransferCredit] 38,10,@GiftChargeAmount,@CurrentDate,@CurrentTime,@CardAccount,@GiftCharge_SCC_ID,@CPN_CardAccount,'',155,@GiftCharge_SHI_ID,NULL,'','','','','','','','','','',1,@Out_POP_ID output,@DO OUTPUT 
																				IF @DO > 0 
																				BEGIN
																					-- Update GiftAmount
																					EXEC [Common].[SHC_UpdateGiftAmount] @SHC_ID,@GiftChargeAmount,1
																					
																					-- Generate FNT Description
																					EXEC [Orginal].[GenerateFNT_Description_ShoppingCard] @GiftCharge_SCC_ID,1
																					
																					-- Update Financial Date & Time
																					EXEC [Orginal].[FNT_UpdateDateTime] 154,@GiftCharge_SCC_ID,@CurrentDate,@CurrentTime
																					
																					SET @GiftChargeApplied = @GiftChargeAmount
																				END
																				ELSE
																					SET @Res = -24 -- Failed Call [GeneralTransferCredit]
																			END
																			ELSE
																				SET @Res = -23 -- IF @GiftCharge_SHI_ID > 0
																		END
																		ELSE
																			SET @Res = -22 -- Failed Call [GeneralTransferCredit]
																	END
																	ELSE
																		SET @Res = -27 -- IF @CBI_CPN_ACN_ID > 0
																END
																ELSE
																	SET @Res = -21 -- Failed INSERT INTO [FinancialTransaction]	
															END
															ELSE
																SET @Res = -20 -- IF @GiftCharge_SCC_ID > 0
														END
														ELSE
															SET @Res = -1 -- Failed INSERT INTO [VipShoppingCardOperation]																
													END
													ELSE
														SET @Res = -26 -- IF @GiftChargeAmount > 0
												END
												ELSE
													SET @Res = -25 -- IF @UseOfShoppingCardAutoChargeFormula > 0
												-- ××××××××××××××××××××××××××××××××××××××							
											END
											ELSE
												SET @Res = -10 -- IF @CPN_CardAccount > 0									
										END
										ELSE
											SET @Res = -9 -- IF @CardAccount > 0 
									END
									ELSE
										SET @Res = -14 -- IF @SHC_ExpireDate_Int >= @CurrentDate_Int
								END
								ELSE
									SET @Res = -13 -- IF @SHC_IsDeleted = 0
							END
							ELSE
								SET @Res = -12 -- IF @SHC_IsDisabled = 0
						END
						ELSE
							SET @Res = -8 -- IF @SHC_ID > 0     
					END
					ELSE
						SET @Res = -7 -- IF @FactorAmount > 0
				END
				ELSE
					SET @Res = -18 -- IF @CBI_Branch_CPN_ID > 0
			END
			ELSE
				SET @Res = -17 -- IF @CBI_ID > 0
	    
			SET @ResMsg = CASE @Res
								WHEN -1 THEN N'خطا در ثبت درخواست شارژ هدیه کارت خرید'
								WHEN -7 THEN N'مبلغ وارد شده نامعتبر است'
								WHEN -8 THEN N'کارت خرید یافت نشد'
								WHEN -9 THEN N'خطا در استخراج حساب تجمیعی کارت خرید'
								WHEN -10 THEN N'خطا در استخراج کد حساب کارت خرید شخص'
								WHEN -12 THEN N'کارت خرید غیرفعال است'
								WHEN -13 THEN N'کارت خرید حذف شده است'
								WHEN -14 THEN N'کارت خرید منقضی شده است'
								WHEN -17 THEN N'شعبه مورد نظر نامعتبر است'
								WHEN -18 THEN N'شخص شعبه تعیین نشده است'
								WHEN -20 THEN N'خطا در ثبت اطلاعات شارژ هدیه'
								WHEN -21 THEN N'خطا در ثبت عملیات مالی شارژ هدیه - حساب تجمیعی کارت خرید'
								WHEN -22 THEN N'خطا در ثبت عملیات مالی شارژ هدیه - حساب تخفیف کارت خرید'
								WHEN -23 THEN N'خطا در ثبت افزایش شارژ هدیه کارت خرید'
								WHEN -24 THEN N'خطا در ثبت عملیات مالی شارژ هدیه - حساب کارت خرید'
								WHEN -25 THEN N'شارژ هدیه کارت خرید غیرفعال است!'
								WHEN -26 THEN N'شارژ هدیه محاسبه شده صفر است!'
								WHEN -27 THEN N'خطا در استخراج حساب مالی شخص پیش فرض شعبه' 
							END    
		    
		IF @Res < 0 
			ROLLBACK TRANSACTION
		ELSE
		BEGIN
			SET @Res = @VCO_ID -- Return ID Of Table [VipShoppingCardOperation] AS Result!
		
			IF @VCO_ID > 0
				SET @ResMsg = N'شارژ هدیه کارت خرید با موفقیت انجام شد'
			ELSE
				SET @ResMsg = N'بروز خطا در اعمال شارژ هدیه کارت خرید'
			
			COMMIT TRANSACTION	
		END
		
    END TRY
    BEGIN CATCH
        
        ROLLBACK TRANSACTION
        SET @ResMsg = N'خطای ناشناس »» ' + (SELECT ERROR_MESSAGE() AS ErrorMessage)
        SET @Res = -1000;
        
    END CATCH	
	
	-- استخراج موجودی جدید کارت خرید
	SET @ACN_CurrentAmount = ISNULL((SELECT [ACN_CurrentAmount] 
										FROM [Common].[Account] 
										WHERE [ACN_TBL_Holder] = 153 AND [ACN_HolderID] = @SHC_ID), 0)
	
	IF @VCO_ID > 0
	BEGIN
		-- [VCO_CardNewAmount] و [VCO_LastApiResponseMsg] و [VCO_LastApiCalled] بروز رسانی فیلدهای 
		UPDATE [VIP].[VipShoppingCardOperation]
		SET [VCO_LastApiCalled] = @MethodName, [VCO_LastApiResponseMsg] = @ResMsg, [VCO_CardNewAmount] = @ACN_CurrentAmount
		WHERE [VCO_ID] = @VCO_ID
	END	

	-- ثبت لاگ
	EXEC [VIP].[VCL_Insert] @VCL_ID OUT,@BranchCode,@CardNo,@VCO_TrackingCode,@ACN_CurrentAmount,0,@MethodName,@Res,@ResMsg,'',1,'SHC_VipApplyGiftCharge',@CurrentDate,@CurrentTime
	
	SELECT @Res AS [Res], 
			@ResMsg AS [ResMsg], 
			@ACN_CurrentAmount AS [CurrentAmount], 
			ISNULL(@GiftChargeApplied, 0) AS [AddedGiftCharge],
			@SHC_ExpireDate AS [ExpireDate],
			@VCO_TrackingCode AS [TrackingCode]

END
