USE [prince]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		Ghasem Babaie
-- Create date: 1401-02-07
-- Description:	کاهش شارژ کارت خرید - مطابق با درخواست شعب
--				فراخوانی می شود API در SP این  
-- =============================================
ALTER PROCEDURE [Orginal].[SHC_VipDecreaseCharge] 
(
	@BranchCode				[Common].[_TINY_],
	@FinancialYear			[Common].[_SMALL_],
    @CardNo					[Common].[_SMALL_],
	@DecreaseChargeAmount	[Common].[_MONEY_], 
	@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_],
			@FNY_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_] = '',
			@SCC_ID					[Common].[_INT_],
			@VCO_ID					[Common].[_INT_] = -2000,
            @SHI_ID  				[Common].[_INT_],
            @CBI_Branch_CPN_ID		[Common].[_INT_],
            @ACN_CPN_ID				[Common].[_INT_],
            @CPN_CardAccount		[Common].[_INT_],
            @ACN_CurrentAmount      [Common].[_MONEY_],
            @CBI_ID					[Common].[_INT_],
            @VCL_ID					[Common].[_INT_],
            @TrackingCode			[Common].[_TINY_],            
            @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 @DecreaseChargeAmount > 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
										-- بررسی در حال استفاده نبودن کارت خرید
										IF (@SHC_InUse = 0) OR ((@SHC_InUse = 1) AND (@SHC_BranchCode = @BranchCode))
										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
												-- Get Open FinancialYear ID
												SET @FNY_ID = (SELECT TOP 1 [FNY_ID] FROM [Common].[FinancialYear] WHERE ISNULL([FNY_CloseDate_INT], 0) = 0)		
														  
												-- کد حساب کارت خرید شخص
												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
													-- بررسی کافی بودن موجودی کارت خرید
													IF @ACN_CurrentAmount >= @DecreaseChargeAmount
													BEGIN
														-- کد حساب شخص
														SET @ACN_CPN_ID = (SELECT [ACN_ID] FROM [Common].[Account] WHERE [ACN_TBL_Holder] = 15 AND [ACN_HolderID] = @CBI_Branch_CPN_ID)
														IF @ACN_CPN_ID > 0
														BEGIN
															-- ایجاد کد رهگیری مربوط به عملیات کارت خرید
															-- این کد برای پیگیری های بعدی و استخراج وضعیت عملیات مالی کارت خرید و بروز رسانی وضعیت و بازگشت زدن عملیات مالی کاربرد دارد
															EXEC [VIP].[SHC_VipGenerateTrackingCode] @BranchCode, @TrackingCode OUT
														
															-- INSERT INTO [VipShoppingCardOperation]
															EXEC [VIP].[VCO_Insert] @VCO_ID OUTPUT,@BranchCode,@FinancialYear,@CardNo,0,@DecreaseChargeAmount,@CurrentDate,@CurrentTime,0,@TrackingCode,@MethodName,'',0
															IF @VCO_ID > 0 
															BEGIN
																-- INSERT INTO [ShoppingCardCharge]
																EXEC [Orginal].[SCC_Insert] @SCC_ID OUTPUT,@CBI_Branch_CPN_ID,@CurrentDate,N'مرکز و شعب - کسر شارژ کارت خرید',@DecreaseChargeAmount,1,0 
																IF @SCC_ID > 0 
																BEGIN												
																	-- Financial Transaction
																	-- طرف حساب: شخص و حساب تجمیعی کارت خرید
																	EXEC [Orginal].[FirstFinancialTransaction] 39,0,@DecreaseChargeAmount,@CurrentDate,@CurrentTime,@CBI_Branch_CPN_ID,@CardAccount,154,@SCC_ID,NULL,'','','','','','',1,@DO OUTPUT 
																	IF @DO > 0 
																	BEGIN		
																		-- Payment Operation 						
																		-- طرف حساب: شخص - این عملیات اعتباری است و شخص بستانکاری می شود
																		EXEC [Orginal].[POP_Insert] 154,@SCC_ID,11,@FNY_ID,'','',NULL,@ACN_CPN_ID,NULL,@CurrentDate,@DecreaseChargeAmount,0,0,1,'','','','','',1,@Out_POP_ID OUTPUT
																		IF @Out_POP_ID > 0 
																		BEGIN									
																			-- INSERT INTO [ShoppingCardItemsCharge] & Financial Transaction
																			EXEC [Orginal].[SHI_Insert] @SHI_ID OUTPUT,0,@SCC_ID,@SHC_ID,@DecreaseChargeAmount,'',5,'',0,417,@VCO_ID
																			IF @SHI_ID > 0 
																			BEGIN									
																				-- Financial Transaction & Payment Operation 
																				-- طرف حساب: کارت خرید مورد نظر و حساب تجمیعی کارت خرید
																				EXEC [Orginal].[GeneralTransferCredit] 38,11,@DecreaseChargeAmount,@CurrentDate,@CurrentTime,@CPN_CardAccount,@SCC_ID,@CardAccount,'',155,@SHI_ID,NULL,'','','','','','','','','','',1,@Out_POP_ID output,@DO OUTPUT 
																				IF @DO > 0 
																				BEGIN	
																					-- Update Field [SHC_InUse] & [SHC_BranchCode]
																					-- با این بروز رسانی، کارت در وضعیت در حال استفاده قرار می گیرد و قفل می شود
																					-- در واقع وقتی در این وضعیت باشد، فقط شعبه ای که باعث قفل شدن کارت شده، می تونه ازش استفاده کنه
																					EXEC [Common].[SHC_VipUpdateInUse] @SHC_ID,@BranchCode,1 
																				
																					-- Update Financial Date & Time
																					EXEC [Orginal].[FNT_UpdateDateTime] 154,@SCC_ID,@CurrentDate,@CurrentTime																				
																				END
																				ELSE
																					SET @Res = -6 -- Failed Call [GeneralTransferCredit]
																			END
																			ELSE
																				SET @Res = -5 -- Failed INSERT INTO [ShoppingCardItemsCharge]
																		END
																		ELSE
																			SET @Res = -4 -- Failed INSERT INTO [PaymentOperation]		
																	END
																	ELSE
																		SET @Res = -3 -- Failed INSERT INTO [FinancialTransaction]	
																END
																ELSE
																	SET @Res = -2 -- Failed INSERT INTO [ShoppingCardCharge]
															END
															ELSE
																SET @Res = -1 -- Failed INSERT INTO [VipShoppingCardOperation]
														END
														ELSE
															SET @Res = -11 -- IF @ACN_CPN_ID > 0
													END
													ELSE
														SET @Res = -16 -- IF @ACN_CurrentAmount >= @DecreaseChargeAmount						
												END
												ELSE
													SET @Res = -10 -- IF @CPN_CardAccount > 0
											END
											ELSE
												SET @Res = -9 -- IF @CardAccount > 0 
										END
										ELSE
											SET @Res = -15 -- IF (@SHC_InUse = 0) OR ((@SHC_InUse = 1) AND (@SHC_BranchCode = @BranchCode))
									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 @DecreaseChargeAmount > 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 -2 THEN N'خطا در ثبت اطلاعات کسر وجه'
								WHEN -3 THEN N'خطا در ثبت عملیات مالی حساب تجمیعی کارت خرید'
								WHEN -4 THEN N'خطا در ثبت عملیات مالی بستانکاری شخص شعبه'
								WHEN -5 THEN N'خطا در ثبت کسر شارژ کارت خرید'
								WHEN -6 THEN N'خطا در ثبت عملیات مالی حساب کارت خرید'
								WHEN -7 THEN N'مبلغ وارد شده نامعتبر است'
								WHEN -8 THEN N'کارت خرید یافت نشد'
								WHEN -9 THEN N'خطا در استخراج حساب تجمیعی کارت خرید'
								WHEN -10 THEN N'خطا در استخراج کد حساب کارت خرید شخص'
								WHEN -11 THEN N'خطا در استخراج کد حساب شخص'
								WHEN -12 THEN N'کارت خرید غیرفعال است'
								WHEN -13 THEN N'کارت خرید حذف شده است'
								WHEN -14 THEN N'کارت خرید منقضی شده است'
								WHEN -15 THEN N'کارت خرید توسط شعبه دیگری در حال استفاده است'
								WHEN -16 THEN N'موجودی کارت خرید کافی نیست'
								WHEN -17 THEN N'شعبه مورد نظر نامعتبر است'
								WHEN -18 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,@TrackingCode,@ACN_CurrentAmount,0,@MethodName,@Res,@ResMsg,'',1,'SHC_VipDecreaseCharge',@CurrentDate,@CurrentTime

	SELECT @Res AS [Res], 
			@ResMsg AS [ResMsg], 
			@ACN_CurrentAmount AS [CurrentAmount],
			@SHC_ExpireDate AS [ExpireDate],
			@TrackingCode AS [TrackingCode]

END
