Files
Client/Server/Database/DBScript/BillingDB/BillingDB_PROC_CREATE.sql
LGram16 dd97ddec92 Restructure repository to include all source folders
Move git root from Client/ to src/ to track all source code:
- Client: Game client source (moved to Client/Client/)
- Server: Game server source
- GameTools: Development tools
- CryptoSource: Encryption utilities
- database: Database scripts
- Script: Game scripts
- rylCoder_16.02.2008_src: Legacy coder tools
- GMFont, Game: Additional resources

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 20:17:20 +09:00

3580 lines
86 KiB
Transact-SQL

/************************************
* Made in date : 2004-03-26
* LOCATION DBNAME : RYLBillingDB
************************************/
-- 매 5분마다 JOB을 실행시켜서 피시방 정량제 남은시간을 미디어웹쪽에 넘길 자료 준비
CREATE PROC agt_CRM_RemainServiceTime
AS
SET NOCOUNT ON
/*
DECLARE @TempTable TABLE
(
CRMIndex int primary key
, UsingTime int
)
*/
CREATE TABLE #TempTable
(
CRMIndex int primary key
, UsingTime int
)
-- 현재 접속중인 피시방에 대한 유저를 체크해서..사용량을 검사한다.
INSERT INTO #TempTable
SELECT intCRMIndex,SUM(DATEDIFF(MINUTE,dateLoginTime,GETDATE()))
FROM TblCurrentUser
WHERE intCRMIndex > 0 AND strBillingType = 'T'
GROUP BY intCRMIndex
BEGIN TRAN
-- 사용시간량을 업데이트한다.
UPDATE TblPCRoomBilling_Time
SET intUsingTime =intUsingTime+UsingTime
FROM #TempTable
WHERE TblPCRoomBilling_Time.intCRMIndex = #TempTable.CRMIndex
IF @@ERROR <> 0
BEGIN
ROLLBACK TRAN
RETURN
END
INSERT INTO TblCRM_SERVICETIME
SELECT strCRMCode,'002',intServiceTime - intUsingTime,'N','N',GETDATE()
FROM #TempTable a JOIN TblPCRoomBilling_Time b ON a.CRMIndex = b.intCRMIndex
JOIN TblPCRoomBillingInfo c ON a.CRMIndex = c.intCRMIndex
IF @@ERROR <> 0
BEGIN
ROLLBACK TRAN
RETURN
END
UPDATE TblCurrentUser
SET dateLoginTime = GETDATE()
WHERE intCRMIndex > 0 AND strBillingType = 'T'
IF @@ERROR <> 0
BEGIN
ROLLBACK TRAN
RETURN
END
COMMIT TRAN
DROP TABLE #TempTable
GO
CREATE PROC agt_CRM_RemainServiceTime_LOG
AS
SET NOCOUNT ON
INSERT INTO RYLBillingDB_log..TblCRM_SERVICETIME_LOG
SELECT strCRMCode,intServiceTime,DelColumn,dateInsertTime
FROM TblCRM_SERVICETIME
WHERE WebCHK = 'Y'
DELETE TblCRM_SERVICETIME
WHERE WebCHK = 'Y'
GO
-- 매 5분마다 JOB을 실행시켜서 피시방 정량제 남은시간을 미디어웹쪽에 준비된 자료를 넘김
CREATE PROC agt_CRM_RemainServiceTime_Transfer
AS
SET NOCOUNT ON
DECLARE @Rowid INT
DECLARE @strCRMCode VARCHAR(20)
DECLARE @intServiceTime INT
DECLARE @delColumn CHAR(1)
DECLARE @TempTable TABLE
(
RowID INT IDENTITY(1,1) PRIMARY KEY
, strCRMCode VARCHAR(20)
, intServiceTime INT
, delColumn CHAR(1)
)
-- 중복된 데이터는 한건만 처리한다.
INSERT INTO @TempTable
SELECT strCRMCode,MIN(intServiceTime),delColumn
FROM TblCRM_SERVICETIME
WHERE WebCHK = 'N'
GROUP BY strCRMCode,delColumn
SET @Rowid = @@ROWCOUNT
--SET XACT_ABORT ON
--BEGIN TRAN
UPDATE TblCRM_SERVICETIME
SET WebCHK = 'Y'
WHERE WebCHK ='N'
WHILE @Rowid <> 0
BEGIN
SELECT @strCRMCode = strCRMCode,@intServiceTime=intServiceTime,@delColumn=delColumn
FROM @TempTable
WHERE RowID = @Rowid
-- 나중에 변경해야할 부분
IF EXISTS(SELECT CRMCODE FROM MEDIAWEBBILLING..GAME.CRM_SERVICETIME WHERE CRMCODE = @strCRMCode AND GAMECODE ='002' )
BEGIN
UPDATE MEDIAWEBBILLING..GAME.CRM_SERVICETIME
SET SERVICETIME = @intServiceTime,DELCHK = @delColumn
WHERE CRMCODE = @strCRMCode AND GAMECODE ='002'
END
ELSE
BEGIN
INSERT MEDIAWEBBILLING..GAME.CRM_SERVICETIME (CRMCODE,GAMECODE,SERVICETIME,DELCHK)
VALUES (@strCRMCode,'002',@intServiceTime,@delColumn)
END
SET @Rowid = @Rowid - 1
END
--COMMIT TRAN
--SET XACT_ABORT OFF
GO
-- COMMAND : IP변경
-- 1.해당 CRMCODE,PRICETYPE에 해당되는 IP를 변경한다.
CREATE PROC agt_CRM_RYLLOG_ChangeIP @intIndex INT,@strCRMCode VARCHAR(20),@strBillingType CHAR(1),
@strCRMIP1 VARCHAR(13),@strStartCRMIP1 INT,@strEndCRMIP1 INT,
@strCRMIP2 VARCHAR(13),@strStartCRMIP2 INT,@strEndCRMIP2 INT,
@strCRMIP3 VARCHAR(13),@strStartCRMIP3 INT,@strEndCRMIP3 INT
AS
SET NOCOUNT ON
DECLARE @intCRMIndex INT
DECLARE @FCRMIP1 VARCHAR(15)
DECLARE @FCRMIP2 VARCHAR(15)
DECLARE @FCRMIP3 VARCHAR(15)
-- 기존 과금등록된 피시방인지 검색한다.
SELECT @intCRMIndex = intCRMIndex
FROM TblPCRoomBillingInfo
WHERE strCRMCode = @strCRMCode and strBillingType = @strBillingType
BEGIN TRAN
IF @intCRMIndex > 0
BEGIN
-- 기존 아이피 대역을 삭제한다.
DELETE TblGameRoomIPList
WHERE intCRMIndex = @intCRMIndex
-- 새로 OPEN하는 아이피대역을 입력한다.
IF @strStartCRMIP1 > 0
BEGIN
-- 처음아이피가 최종아이피보다 작은경우까지만 입력한다.
WHILE (@strStartCRMIP1 <= @strEndCRMIP1)
BEGIN
SET @FCRMIP1 = @strCRMIP1 + CAST(@strStartCRMIP1 AS VARCHAR(3))
INSERT INTO TblGameRoomIPList VALUES (@intCRMIndex,@FCRMIP1)
IF @@ERROR <> 0
BEGIN
ROLLBACK TRAN
RETURN
END
SET @strStartCRMIP1 = @strStartCRMIP1 + 1
END
END
-- 아이피 대역을 표시한다.
IF @strStartCRMIP2 > 0
BEGIN
-- 처음아이피가 최종아이피보다 작은경우까지만 입력한다.
WHILE (@strStartCRMIP2 <= @strEndCRMIP2)
BEGIN
SET @FCRMIP2 = @strCRMIP2 + CAST(@strStartCRMIP2 AS VARCHAR(3))
INSERT INTO TblGameRoomIPList VALUES (@intCRMIndex,@FCRMIP2)
IF @@ERROR <> 0
BEGIN
ROLLBACK TRAN
RETURN
END
SET @strStartCRMIP2 = @strStartCRMIP2 + 1
END
END
-- 아이피 대역을 표시한다.
IF @strStartCRMIP3 > 0
BEGIN
-- 처음아이피가 최종아이피보다 작은경우까지만 입력한다.
WHILE (@strStartCRMIP3 <= @strEndCRMIP3)
BEGIN
SET @FCRMIP3 = @strCRMIP3 + CAST(@strStartCRMIP3 AS VARCHAR(3))
INSERT INTO TblGameRoomIPList VALUES (@intCRMIndex,@FCRMIP3)
IF @@ERROR <> 0
BEGIN
ROLLBACK TRAN
RETURN
END
SET @strStartCRMIP3 = @strStartCRMIP3 + 1
END
END
-- 아이피가 없어지는 곳에 게임을 하는 유저는 바로 끊어야한다.
-- 정액제 피시방이 아이피를 변경할 경우에는 모든 유저들을 튕시킨다.
IF (@strBillingType ='D')
BEGIN
-- 해당유저들을 인서트한다.
INSERT INTO TblCurrentUser_Disconn
SELECT strClientID,UID,tinyServerID,'ED' FROM TblCurrentUser WHERE intCRMIndex = @intCRMIndex AND strIP NOT in (
SELECT strIP FROM TblGameRoomIpList WHERE intCRMIndex = @intCRMIndex )
IF @@ERROR <> 0
BEGIN
ROLLBACK TRAN
RETURN
END
END
-- 정량제 피시방일 경우 해당 아이피만 튕시킨다.
ELSE IF (@strBillingType ='T')
BEGIN
-- 해당유저들을 인서트한다.
INSERT INTO TblCurrentUser_Disconn
SELECT strClientID,UID,tinyServerID,'ET' FROM TblCurrentUser WHERE intCRMIndex = @intCRMIndex AND strIP NOT in (
SELECT strIP FROM TblGameRoomIpList WHERE intCRMIndex = @intCRMIndex )
IF @@ERROR <> 0
BEGIN
ROLLBACK TRAN
RETURN
END
END
UPDATE TblCRM_RYLLOG
SET strConvertCHK = 'Y'
WHERE intIndex = @intIndex AND strCommand ='E' AND strConvertCHK ='N'
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
END
COMMIT TRAN
GO
-- COMMAND : CLOSE (해지)
-- 1.해지시 정량제에 한하여 CRMCODE,PRICETYPE에 해당되는 잔여시간을 CRM_SERVICETIME에 기록한다.
-- 2.현재 유저가 플레이중인지 아닌지를 체크해야한다.
CREATE PROC agt_CRM_RYLLOG_CLOSE @intIndex INT,@strCRMCode VARCHAR(20),@strBillingType CHAR(1)
AS
SET NOCOUNT ON
DECLARE @intCRMINDEX INT
-- 기존 과금등록된 피시방인지 검색한다.
SELECT @intCRMIndex = intCRMIndex
FROM TblPCRoomBillingInfo
WHERE strCRMCode = @strCRMCode and strBillingType = @strBillingType
BEGIN TRAN
-- 해지할 피시방이 존재한다면
IF @intCRMIndex > 0
BEGIN
-- 현재 같은 피시방에 접속되어있는 유저가 플레이중이면 과금정보를 삭제하면 안된다.
IF EXISTS (SELECT strClientid FROM TblCurrentUser WHERE intCRMIndex = @intCRMINDEX)
BEGIN
IF @strBillingType = 'D' -- 정액제인경우
BEGIN
UPDATE TblPCRoomBilling_Date
SET strClosed ='Y'
WHERE intCRMIndex = @intCRMIndex
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
END
ELSE IF (@strBillingType ='T')-- 나머지 정량제라고 하면
BEGIN
UPDATE TblPCRoomBilling_Time
SET strClosed ='Y'
WHERE intCRMIndex = @intCRMIndex
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
END
-- 해지한 피시방에 접속한 모든 유저는 바로 접속을 끊어야한다.
-- 해당유저들을 인서트한다.
INSERT INTO TblCurrentUser_Disconn
SELECT strClientID,UID,tinyServerID,'BB' FROM TblCurrentUser WHERE intCRMIndex = @intCRMIndex
IF @@ERROR <> 0
BEGIN
ROLLBACK TRAN
RETURN
END
END
ELSE -- 현재 아무도 해당 피시방에 접속된 유저가 없으면
BEGIN
-- 과금 종류를 각각삭제한다.
IF @strBillingType = 'D' -- 정액제
BEGIN
DELETE TblPCRoomBilling_Date
WHERE intCRMIndex = @intCRMIndex
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
END
ELSE IF (@strBillingType ='T')-- 나머지 정량제
BEGIN
DECLARE @Remain INT
SELECT @Remain = (intServiceTime - intUsingTime) FROM TblPCRoomBilling_Time
WHERE intCRMIndex = @intCRMIndex
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
DELETE TblPCRoomBilling_Time WHERE intCRMIndex = @intCRMIndex
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
-- 미디어웹에 전달할 자료를 전달 테이블에 입력한다.
INSERT INTO TblCRM_SERVICETIME (strCRMCode,strGameCode,intServiceTime,DelColumn,WebCHK)
VALUES (@strCRMCode,'002',@Remain,'Y','N')
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
END
-- 아이피 정보를 삭제한다.
DELETE TblGameRoomIpList
WHERE intCRMIndex = @intCRMIndex
IF @@ROWCOUNT = 0
BEGIN
ROLLBACK TRAN
RETURN
END
DELETE TblPCRoomBillingInfo
WHERE intCRMIndex = @intCRMIndex
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
END
UPDATE TblCRM_RYLLOG
SET strConvertCHK = 'Y'
WHERE intIndex = @intIndex AND strCommand ='B' AND strConvertCHK ='N'
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
END
COMMIT TRAN
GO
CREATE PROC agt_CRM_RYLLOG_Delete
AS
SET NOCOUNT ON
DECLARE @MIN INT -- 전에 가져왔던 최대값
SELECT @MIN = intCount FROM TblImportedNum WHERE strCompType = 'M'
BEGIN TRAN
INSERT INTO RYLBillingDB_LOG.dbo.TblCRM_RYLLOG_LOG
SELECT * FROM TblCRM_RYLLOG
WHERE intIndex <= @MIN
IF @@ERROR <> 0
BEGIN
ROLLBACK TRAN
RETURN
END
DELETE TblCRM_RYLLOG
WHERE intIndex <= @MIN
IF @@ERROR <> 0
BEGIN
ROLLBACK TRAN
RETURN
END
COMMIT TRAN
GO
-- COMMAND : 배치재승인
-- 1.CRMCODE,PRICETYPE,IP 정보가 있음을 전제한다.
CREATE PROC agt_CRM_RYLLOG_Exchange @intIndex INT,@strCRMCode VARCHAR(20),@strBillingType CHAR(1),
@intServiceTime INT,@dateServiceDay SMALLDATETIME,@tinyServiceIpNum TINYINT
AS
SET NOCOUNT ON
DECLARE @intCRMIndex INT
DECLARE @Remain INT
-- 기존 과금등록된 피시방인지 검색한다.
SELECT @intCRMIndex = intCRMIndex
FROM TblPCRoomBillingInfo
WHERE strCRMCode = @strCRMCode and strBillingType = @strBillingType
BEGIN TRAN
IF @intCRMIndex > 0
BEGIN
IF @strBillingType = 'D' -- 정액제
BEGIN
UPDATE TblPCRoomBilling_Date
SET dateEndTime = @dateServiceDay,tinyServiceIpNum = @tinyServiceIpNum,tinyUsedIpNum = 0
WHERE intCRMIndex = @intCRMIndex
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
-- 정액제인 경우 현재 접속된 모든 유저를 튕 리스트에 등록한다.
-- 아이피가 없어지는 곳에 게임을 하는 유저는 바로 끊어야한다.
-- 해당유저들을 인서트한다.
INSERT INTO TblCurrentUser_Disconn
SELECT strClientID,UID,tinyServerID,'FF' FROM TblCurrentUser WHERE intCRMIndex = @intCRMIndex AND strBillingType ='D'
IF @@ERROR <> 0
BEGIN
ROLLBACK TRAN
RETURN
END
END
ELSE IF (@strBillingType ='T')-- 나머지 정량제
BEGIN
UPDATE TblPCRoomBilling_Time
SET intServiceTime = intServiceTime + @intServiceTime
WHERE intCRMIndex = @intCRMIndex
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
-- 시간이 추가되자 마자 바로 보내져야한다.
SELECT @Remain = (intServiceTime - intUsingTime) FROM TblPCRoomBilling_Time
WHERE intCRMIndex = @intCRMIndex
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
-- 이전에 로그아웃된 유저의 서비스타입기록을 없앤다.
DELETE TblCRM_SERVICETIME
WHERE strCRMCode = @strCRMCode
IF @@ERROR <> 0
BEGIN
ROLLBACK TRAN
RETURN
END
-- 미디어웹에 전달할 자료를 전달 테이블에 입력한다.
INSERT INTO TblCRM_SERVICETIME (strCRMCode,strGameCode,intServiceTime,DelColumn,WebCHK)
VALUES (@strCRMCode,'002',@Remain,'N','N')
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
END
UPDATE TblCRM_RYLLOG
SET strConvertCHK = 'Y'
WHERE intIndex = @intIndex AND strCommand ='F' AND strConvertCHK ='N'
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
END
COMMIT TRAN
GO
-- 가져온 데이터를 전부 실행한다.(1분마다 실행)
CREATE PROC agt_CRM_RYLLOG_EXECUTE
AS
SET NOCOUNT ON
DECLARE @ROWID INT
DECLARE @intIndex INT
DECLARE @strCRMCode VARCHAR(20)
DECLARE @strBillingType CHAR(1)
DECLARE @strCommand CHAR(1)
DECLARE @strCRMIP1 VARCHAR(13)
DECLARE @strStartCRMIP1 TINYINT
DECLARE @strEndCRMIP1 TINYINT
DECLARE @strCRMIP2 VARCHAR(13)
DECLARE @strStartCRMIP2 TINYINT
DECLARE @strEndCRMIP2 TINYINT
DECLARE @strCRMIP3 VARCHAR(13)
DECLARE @strStartCRMIP3 TINYINT
DECLARE @strEndCRMIP3 TINYINT
DECLARE @strTimeProcess CHAR(1)
DECLARE @intServiceTime INT
DECLARE @dateServiceDay SMALLDATETIME
DECLARE @tinyServiceIPNum TINYINT
-- 처리할 데이터를 임시테이블에 보관한다.
DECLARE @TempTable Table
(
RowID INT IDENTITY(1,1) PRIMARY KEY
, intIndex INT
, strCRMCode VARCHAR(20)
, strBillingType CHAR(1)
, strCommand CHAR(1)
, strCRMIP1 VARCHAR(13)
, strStartCRMIP1 TINYINT
, strEndCRMIP1 TINYINT
, strCRMIP2 VARCHAR(13)
, strStartCRMIP2 TINYINT
, strEndCRMIP2 TINYINT
, strCRMIP3 VARCHAR(13)
, strStartCRMIP3 TINYINT
, strEndCRMIP3 TINYINT
, strTimeProcess CHAR(1)
, intServiceTime INT
, dateServiceDay SMALLDATETIME
, tinyServiceIPNum TINYINT
)
-- 들어온 순서대로 처리를 해야함.
-- intIndex 값이 큰것부터 임시테이블에 입력을 해야만 제일 나중에 처리된다.
INSERT INTO @TempTable (intIndex,strCRMCode,strBillingType,strCommand,strCRMIP1,strStartCRMIP1,strEndCRMIP1,strCRMIP2,strStartCRMIP2,
strEndCRMIP2,strCRMIP3,strStartCRMIP3,strEndCRMIP3,strTimeProcess,intServiceTime,dateServiceDay,tinyServiceIPNum)
SELECT intIndex,strCRMCode,strPriceType,strCommand,strCRMIP1,strStartCRMIP1,strEndCRMIP1,strCRMIP2,strStartCRMIP2,strEndCRMIP2,
strCRMIP3,strStartCRMIP3,strEndCRMIP3,strTimeProcess,intServiceTime,dateServiceDay,tinyServiceIPNum
FROM TblCRM_RYLLOG WHERE strConvertCHK ='N' ORDER BY intIndex DESC
SET @ROWID = @@ROWCOUNT --처리할 데이터 수
WHILE (@ROWID <> 0 )
BEGIN
-- 임시테이블에서 순차적으로 한건씩 처리하기 위해서...데이터를 가져온다.
SELECT @intIndex=intindex,@strCRMCode=strCRMCode,@strBillingType=strBillingType,@strCommand = strCommand,
@strCRMIP1=strCRMIP1,@strStartCRMIP1=strStartCRMIP1,@strEndCRMIP1=strEndCRMIP1,@strCRMIP2=strCRMIP2,
@strStartCRMIP2=strStartCRMIP2,@strEndCRMIP2=strEndCRMIP2,@strCRMIP3=strCRMIP3,@strStartCRMIP3=strStartCRMIP3,
@strEndCRMIP3=strEndCRMIP3,@strTimeProcess=strTimeProcess,@intServiceTime=intServiceTime,
@dateServiceDay=dateServiceDay,@tinyServiceIPNum=tinyServiceIPNum
FROM @TempTable
WHERE ROWID = @ROWID
IF (@strCommand = 'A') -- 신규,추가
BEGIN
EXEC agt_CRM_RYLLOG_OPEN @intIndex,@strCRMCode,@strBillingType,@strCRMIP1,@strStartCRMIP1,
@strEndCRMIP1,@strCRMIP2,@strStartCRMIP2,@strEndCRMIP2,@strCRMIP3,@strStartCRMIP3,
@strEndCRMIP3,@strTimeProcess,@intServiceTime,@dateServiceDay,@tinyServiceIPNum
END
ELSE IF (@strCommand ='B') -- 해지
BEGIN
EXEC agt_CRM_RYLLOG_CLOSE @intIndex,@strCRMCode,@strBillingType
END
ELSE IF (@strCommand ='C') -- 해지대기 : Z로 변경
BEGIN
EXEC agt_CRM_RYLLOG_WAIT @intIndex,@strCRMCode,@strBillingType
END
ELSE IF (@strCommand = 'D') -- 해지취소
BEGIN
EXEC agt_CRM_RYLLOG_WCANCEL @intIndex,@strCRMCode,@strBillingType
END
ELSE IF (@strCommand ='E') -- 아이피변경
BEGIN
EXEC agt_CRM_RYLLOG_ChangeIP @intIndex,@strCRMCode,@strBillingType,@strCRMIP1,@strStartCRMIP1,
@strEndCRMIP1,@strCRMIP2,@strStartCRMIP2,@strEndCRMIP2,@strCRMIP3,@strStartCRMIP3,
@strEndCRMIP3
END
ELSE IF (@strCommand ='F') -- 재배치 승인
BEGIN
EXEC agt_CRM_RYLLOG_Exchange @intIndex,@strCRMCode,@strBillingType,
@intServiceTime,@dateServiceDay,@tinyServiceIpNum
END
SET @ROWID = @ROWID - 1
END
GO
-- 데이터속도를 위해서 처리된 마지막 INDEX값을 알고있어야한다.
CREATE PROC agt_CRM_RYLLOG_OPEN @intIndex INT,@strCRMCode VARCHAR(20),@strBillingType CHAR(1),@strCRMIP1 VARCHAR(13),@strStartCRMIP1 INT,
@strEndCRMIP1 INT,@strCRMIP2 VARCHAR(13),@strStartCRMIP2 INT,@strEndCRMIP2 INT,
@strCRMIP3 VARCHAR(13),@strStartCRMIP3 INT,@strEndCRMIP3 INT,@strTimeProcess CHAR(1),
@intServiceTime INT,@dateServiceDay SMALLDATETIME,@tinyServiceIPNum TINYINT
AS
SET NOCOUNT ON
DECLARE @FCRMIP1 VARCHAR(15)
DECLARE @FCRMIP2 VARCHAR(15)
DECLARE @FCRMIP3 VARCHAR(15)
DECLARE @intCRMIndex INT
SET @intCRMIndex = 0
DECLARE @Remain INT
BEGIN TRAN
-- 기존 과금등록된 피시방인지 검색한다.
SELECT @intCRMIndex = intCRMIndex
FROM TblPCRoomBillingInfo
WHERE strCRMCode = @strCRMCode and strBillingType = @strBillingType
-- 기존 피시방정보가 존재하면 업데이트한다.
IF (@intCRMIndex > 0)
BEGIN
-- 과금 종류를 구분에 각각 테이블에 입력한다.
IF @strBillingType = 'D' -- 정액제
BEGIN
UPDATE TblPCRoomBilling_Date
SET strRegProcess = @strTimeProcess,dateEndTime = @dateServiceDay,tinyServiceIpNum = @tinyServiceIPNum,strClosed='N'
WHERE intCRMIndex = @intCRMIndex
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
END
ELSE IF (@strBillingType ='T') -- 나머지 정량제
BEGIN
IF EXISTS (SELECT intCRMIndex FROM TblPCRoomBilling_Time WHERE intCRMIndex = @intCRMIndex AND strRegProcess = 'M' and strClosed ='Y')
BEGIN
UPDATE TblPCRoomBilling_Time
SET strRegProcess = @strTimeProcess,intServiceTime = @intServiceTime,intUsingTime = 0,strClosed ='N'
WHERE intCRMIndex = @intCRMIndex AND strRegProcess = 'M' and strClosed ='Y'
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
END
ELSE
BEGIN
UPDATE TblPCRoomBilling_Time
SET strRegProcess = @strTimeProcess,intServiceTime = intServiceTime + @intServiceTime,strClosed ='N'
WHERE intCRMIndex = @intCRMIndex
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
END
-- 시간이 추가되자 마자 바로 보내져야한다.
SELECT @Remain = (intServiceTime - intUsingTime) FROM TblPCRoomBilling_Time
WHERE intCRMIndex = @intCRMIndex
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
-- 이전에 이미들어가있던 서비스타입기록을 없앤다.
DELETE TblCRM_SERVICETIME
WHERE strCRMCode = @strCRMCode
IF @@ERROR <> 0
BEGIN
ROLLBACK TRAN
RETURN
END
-- 미디어웹에 전달할 자료를 전달 테이블에 입력한다.
INSERT INTO TblCRM_SERVICETIME (strCRMCode,strGameCode,intServiceTime,DelColumn,WebCHK)
VALUES (@strCRMCode,'002',@Remain,'N','N')
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
END
END
-- 존재하지 않는다면
ELSE IF (@intCRMIndex = 0)
BEGIN
-- 신규가입하는 피시방 정보를 입력한다.
INSERT INTO TblPCRoomBillingInfo (intCRMIndex,strCRMCode,strBillingType)
VALUES (@intIndex,@strCRMCode,@strBillingType)
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
-- 과금 종류를 구분에 각각 테이블에 입력한다.
IF @strBillingType = 'D' -- 정액제
BEGIN
INSERT INTO TblPCRoomBilling_Date (intCRMIndex,strRegProcess,dateStartTime,dateEndTime,tinyServiceIpNum)
VALUES (@intIndex,@strTimeProcess,GETDATE(),@dateServiceDay,@tinyServiceIpNum)
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
END
ELSE IF @strBillingType ='T'-- 나머지 정량제
BEGIN
INSERT INTO TblPCRoomBilling_Time (intCRMIndex,strRegProcess,intServiceTime)
VALUES (@intIndex,@strTimeProcess,@intServiceTime)
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
-- SET @Remain = @intServiceTime
-- 미디어웹에 전달할 자료를 전달 테이블에 입력한다.
INSERT INTO TblCRM_SERVICETIME (strCRMCode,strGameCode,intServiceTime,DelColumn,WebCHK)
VALUES (@strCRMCode,'002',@intServiceTime,'N','N')
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
END
-- 새로 OPEN하는 아이피대역을 입력한다.
IF @strStartCRMIP1 > 0
BEGIN
-- 처음아이피가 최종아이피보다 작은경우까지만 입력한다.
WHILE (@strStartCRMIP1 <= @strEndCRMIP1)
BEGIN
SET @FCRMIP1 = @strCRMIP1 + CAST(@strStartCRMIP1 AS VARCHAR(3))
INSERT INTO TblGameRoomIPList VALUES (@intIndex,@FCRMIP1)
IF ( @@ERROR <> 0 )
BEGIN
ROLLBACK TRAN
RETURN
END
SET @strStartCRMIP1 = @strStartCRMIP1 + 1
END
END
-- 아이피 대역을 표시한다.
IF @strStartCRMIP2 > 0
BEGIN
-- 처음아이피가 최종아이피보다 작은경우까지만 입력한다.
WHILE (@strStartCRMIP2 <= @strEndCRMIP2)
BEGIN
SET @FCRMIP2 = @strCRMIP2 + CAST(@strStartCRMIP2 AS VARCHAR(3))
INSERT INTO TblGameRoomIPList VALUES (@intIndex,@FCRMIP2)
IF ( @@ERROR <> 0 )
BEGIN
ROLLBACK TRAN
RETURN
END
SET @strStartCRMIP2 = @strStartCRMIP2 + 1
END
END
-- 아이피 대역을 표시한다.
IF @strStartCRMIP3 > 0
BEGIN
-- 처음아이피가 최종아이피보다 작은경우까지만 입력한다.
WHILE (@strStartCRMIP3 <= @strEndCRMIP3)
BEGIN
SET @FCRMIP3 = @strCRMIP3 + CAST(@strStartCRMIP3 AS VARCHAR(3))
INSERT INTO TblGameRoomIPList VALUES (@intIndex,@FCRMIP3)
IF ( @@ERROR <> 0 )
BEGIN
ROLLBACK TRAN
RETURN
END
SET @strStartCRMIP3 = @strStartCRMIP3 + 1
END
END
END
UPDATE TblCRM_RYLLOG
SET strConvertCHK = 'Y'
WHERE intIndex = @intIndex AND strCommand ='A' AND strConvertCHK ='N'
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
COMMIT TRAN
GO
-- 현재 변경된 전체 데이터를 미디어 웹에서 가져온다.
CREATE PROC agt_CRM_RYLLOG_Pulling
AS
SET NOCOUNT ON
DECLARE @MIN INT -- 전에 가져왔던 최대값
DECLARE @MAX INT --앞으로 가져올 최대값
SET @MAX = 0
SELECT @MIN = intCount FROM TblImportedNum WHERE strCompType = 'M'
--SET XACT_ABORT ON
--BEGIN TRAN
-- 미디어웹에서 처리할 데이터를 가져온다.
INSERT INTO TblCRM_RYLLOG (intIndex,strCRMCode,strPriceType,dateSysDay,strCommand,strCRMIP1,strStartCRMIP1,strEndCRMIP1,
strCRMIP2,strStartCRMIP2,strEndCRMIP2,strCRMIP3,strStartCRMIP3,strEndCRMIP3,
strTimeprocess,intServiceTime,dateServiceDay,TinyServiceIPNum,dateEndday,intEndTime,strRYLCHK)
SELECT * FROM MEDIAWEBBILLING..CRM.CRM_RYLLOG WHERE SEQID > @MIN AND RYLCHK = 'N'
-- 총처리된 데이터수를 가져온다.
SELECT @MAX = MAX(intIndex) FROM TblCRM_RYLLOG WHERE strRYLCHK = 'N' AND strConvertCHK ='N'
IF @MAX > 0
BEGIN
UPDATE MEDIAWEBBILLING..CRM.CRM_RYLLOG
SET RYLCHK = 'Y'
WHERE SEQID > @MIN AND SEQID <= @MAX AND RYLCHK = 'N'
-- 데이터를 업데이트한다.
UPDATE TblImportedNum
SET intCount = @MAX
WHERE strCompType = 'M'
END
--COMMIT TRAN
--SET XACT_ABORT OFF
GO
-- COMMAND : WAIT (해지대기)
-- 1.TimeProcess를 'z'로 변경한다.
CREATE PROC agt_CRM_RYLLOG_WAIT @intIndex INT,@strCRMCode VARCHAR(20),@strBillingType CHAR(1)
AS
SET NOCOUNT ON
DECLARE @intCRMIndex INT
-- 기존 과금등록된 피시방인지 검색한다.
SELECT @intCRMIndex = intCRMIndex
FROM TblPCRoomBillingInfo
WHERE strCRMCode = @strCRMCode and strBillingType = @strBillingType
BEGIN TRAN
IF @intCRMIndex > 0
BEGIN
-- 과금 종류를 각각삭제한다.
IF @strBillingType = 'D' -- 정액제
BEGIN
UPDATE TblPCRoomBilling_Date
SET strRegProcess = 'z'
WHERE intCRMIndex = @intCRMIndex
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
END
ELSE IF @strBillingType ='T' -- 나머지 정량제
BEGIN
UPDATE TblPCRoomBilling_Time
SET strRegProcess = 'z'
WHERE intCRMIndex = @intCRMIndex
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
END
UPDATE TblCRM_RYLLOG
SET strConvertCHK = 'Y'
WHERE intIndex = @intIndex AND strCommand ='C' AND strConvertCHK ='N'
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
END
COMMIT TRAN
GO
-- COMMAND : WCANCEL (해지취소)
-- 1.TimeProcess를 'm'로 변경한다.
CREATE PROC agt_CRM_RYLLOG_WCANCEL @intIndex INT,@strCRMCode VARCHAR(20),@strBillingType CHAR(1)
AS
SET NOCOUNT ON
DECLARE @intCRMIndex INT
-- 기존 과금등록된 피시방인지 검색한다.
SELECT @intCRMIndex = intCRMIndex
FROM TblPCRoomBillingInfo
WHERE strCRMCode = @strCRMCode and strBillingType = @strBillingType
BEGIN TRAN
IF @intCRMIndex > 0
BEGIN
IF @strBillingType = 'D' -- 정액제
BEGIN
UPDATE TblPCRoomBilling_Date
SET strRegProcess = 'm'
WHERE intCRMIndex = @intCRMIndex
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
END
ELSE IF (@strBillingType ='T') -- 나머지 정량제
BEGIN
UPDATE TblPCRoomBilling_Time
SET strRegProcess = 'm'
WHERE intCRMIndex = @intCRMIndex
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
END
UPDATE TblCRM_RYLLOG
SET strConvertCHK = 'Y'
WHERE intIndex = @intIndex AND strCommand ='D' AND strConvertCHK ='N'
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
END
COMMIT TRAN
GO
CREATE PROC agt_DeletePcroombiling_Date_Z_Type
AS
SET NOCOUNT ON
CREATE TABLE #TempCrmindex
(
ROWID INT IDENTITY(1,1)
, CRMINDEX INT
)
DECLARE @ROWID INT
DECLARE @CRMINDEX INT
INSERT INTO #TempCrmindex
SELECT intCRMIndex FROM TblPcroombilling_date WHERE strRegProcess = 'z' and dateEndTime < getdate()
SET @ROWID = @@ROWCOUNT
WHILE @ROWID > 0
BEGIN
SELECT @CRMINDEX = CRMINDEX FROM #TempCrmindex WHERE ROWID =@ROWID
IF NOT EXISTS (SELECT strClientID FROM TblCurrentUser WHERE intCRMIndex = @CRMINDEX)
BEGIN
INSERT INTO Rylbillingdb_log..TblPCRoomBilling_Date_DELLOG
SELECT * FROM TblPCRoomBilling_Date WHERE intCRMIndex = @CRMIndex
INSERT INTO Rylbillingdb_log..TblGameRoomIPList_DELLOG
SELECT * FROM TblGameRoomIPList WHERE intCRMIndex = @CRMIndex
INSERT INTO Rylbillingdb_log..TblPCRoomBillingInfo_DELLOG
SELECT * FROM TblPCRoomBillingInfo WHERE intCRMIndex = @CRMIndex
DELETE TblPCRoomBilling_Date
WHERE intCRMIndex = @CRMIndex
-- 해당 아이피를 삭제한다.
DELETE TblGameRoomIPList
WHERE intCRMIndex = @CRMIndex
-- 피시방 정보를 삭제한다.
DELETE TblPCRoomBillingInfo
WHERE intCRMIndex = @CRMIndex
END
SET @ROWID = @ROWID - 1
END
DROP TABLE #TempCrmindex
GO
--가져온데이터를 처리한다.
CREATE PROC agt_PersonBilling_CHK
AS
SET NOCOUNT ON
DECLARE @ROWID INT
DECLARE @intIndex INT
DECLARE @strClientID VARCHAR(20)
DECLARE @UID INT
DECLARE @strBillingType CHAR(1)
DECLARE @dateEndTime SMALLDATETIME
DECLARE @intServiceTime INT
DECLARE @strCorrentState CHAR(1)
DECLARE @TempTable TABLE
(
RowID INT IDENTITY(1,1) PRIMARY KEY
, intIndex INT
, strClientID VARCHAR(20)
, UID INT
, strBillingType CHAR(1)
, dateEndTime SMALLDATETIME
, intServiceTime INT
)
INSERT INTO @TempTable (intIndex,strClientID,UID,strBillingType,dateEndTime,intServiceTime)
SELECT intIndex,strClientID,UID,strBillingType,dateEndTime,intServiceTime FROM TblPersonBilling_log
WHERE strConvertCHK = 'N' ORDER BY intIndex DESC
SET @ROWID = @@ROWCOUNT
WHILE @ROWID <> 0
BEGIN
SELECT @intIndex = intIndex,@strClientID=strClientID,@UID=UID,@strBillingType=strBillingType,@dateEndTime=dateEndTime
,@intServiceTime=intServiceTime
FROM @TempTable
WHERE RowID = @ROWID
EXEC agt_PersonBilling_CHK_Include @intIndex,@strClientID,@UID,@strBillingType,@dateEndTime,@intServiceTime
SET @ROWID = @ROWID - 1
END
GO
--가져온데이터를 처리한다.
CREATE PROC agt_PersonBilling_CHK_2
AS
SET NOCOUNT ON
DECLARE @ROWID INT
DECLARE @intIndex INT
DECLARE @strClientID VARCHAR(20)
DECLARE @UID INT
DECLARE @strBillingType CHAR(1)
DECLARE @dateEndTime SMALLDATETIME
DECLARE @intServiceTime INT
DECLARE @strCorrentState CHAR(1)
DECLARE @TempTable TABLE
(
RowID INT IDENTITY(1,1) PRIMARY KEY
, intIndex INT
, strClientID VARCHAR(20)
, UID INT
, strBillingType CHAR(1)
, dateEndTime SMALLDATETIME
, intServiceTime INT
)
INSERT INTO @TempTable (intIndex,strClientID,UID,strBillingType,dateEndTime,intServiceTime)
SELECT DISTINCT intIndex,strClientID,UID,strBillingType,dateEndTime,intServiceTime
FROM RYLBILLINGDB_LOG..TblPersonBilling_log_HISTORY
WHERE strConvertCHK = 'N' AND INTINDEX >= 122188 ORDER BY intIndex DESC
SET @ROWID = @@ROWCOUNT
WHILE @ROWID <> 0
BEGIN
SELECT @intIndex = intIndex,@strClientID=strClientID,@UID=UID,@strBillingType=strBillingType,@dateEndTime=dateEndTime
,@intServiceTime=intServiceTime
FROM @TempTable
WHERE RowID = @ROWID
EXEC agt_PersonBilling_CHK_Include_2 @intIndex,@strClientID,@UID,@strBillingType,@dateEndTime,@intServiceTime
SET @ROWID = @ROWID - 1
END
GO
CREATE PROC agt_PersonBilling_CHK_Include @intIndex INT,@strClientID VARCHAR(20),@UID INT,@strBillingType CHAR(1),
@dateEndTime SMALLDATETIME,@intServiceTime INT
AS
SET NOCOUNT ON
DECLARE @nTime INT
IF EXISTS (SELECT strClientID FROM TblPersonInfo WHERE UID =@UID)
BEGIN
SELECT @nTime = DATEDIFF(DAY,GETDATE(),RegLoginTime)
FROM TblPersonInfo WHERE UID = @UID
IF @nTime >= 0
BEGIN
UPDATE TblPersonInfo
SET RegLoginTime = GETDATE() - 1
WHERE UID = @UID
END
END
ELSE
BEGIN
INSERT INTO TblPersonInfo
VALUES (@UID,@strClientID,GETDATE()-1,GETDATE())
END
BEGIN TRAN
IF EXISTS (SELECT strClientID FROM TblPersonBillingInfo WHERE strClientID = @strClientID)
BEGIN
IF @strBillingType = 'D'
BEGIN
UPDATE TblPersonBillingInfo
SET dateEndTime = @dateEndTime,dateRegTime = GETDATE()
WHERE strClientID = @strClientID
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
END
ELSE IF @strBillingType = 'T'
BEGIN
UPDATE TblPersonBillingInfo
SET intServiceTime = intServiceTime + @intServiceTime,dateRegTime = GETDATE()
WHERE strClientID = @strClientID
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
END
END
-- 기존사용자가 아니면 인서트한다.
ELSE
BEGIN
INSERT INTO TblPersonBillingInfo
VALUES (@strClientID,@UID,@dateEndTime,@intServiceTime,0,GETDATE())
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
END
UPDATE TblPersonBilling_log
SET strConvertCHK = 'Y'
WHERE intIndex =@intIndex AND strConvertCHK = 'N'
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
COMMIT TRAN
RETURN
GO
CREATE PROC agt_PersonBilling_CHK_Include_2 @intIndex INT,@strClientID VARCHAR(20),@UID INT,@strBillingType CHAR(1),
@dateEndTime SMALLDATETIME,@intServiceTime INT
AS
SET NOCOUNT ON
DECLARE @nTime INT
IF EXISTS (SELECT strClientID FROM TblPersonInfo WHERE UID =@UID)
BEGIN
SELECT @nTime = DATEDIFF(DAY,GETDATE(),RegLoginTime)
FROM TblPersonInfo WHERE UID = @UID
IF @nTime >= 0
BEGIN
UPDATE TblPersonInfo
SET RegLoginTime = GETDATE() - 1
WHERE UID = @UID
END
END
ELSE
BEGIN
INSERT INTO TblPersonInfo
VALUES (@UID,@strClientID,GETDATE()-1,GETDATE())
END
BEGIN TRAN
IF EXISTS (SELECT strClientID FROM TblPersonBillingInfo WHERE strClientID = @strClientID)
BEGIN
IF @strBillingType = 'D'
BEGIN
UPDATE TblPersonBillingInfo
SET dateEndTime = @dateEndTime,dateRegTime = GETDATE()
WHERE strClientID = @strClientID
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
END
ELSE IF @strBillingType = 'T'
BEGIN
UPDATE TblPersonBillingInfo
SET intServiceTime = intServiceTime + @intServiceTime,dateRegTime = GETDATE()
WHERE strClientID = @strClientID
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
END
END
-- 기존사용자가 아니면 인서트한다.
ELSE
BEGIN
INSERT INTO TblPersonBillingInfo
VALUES (@strClientID,@UID,@dateEndTime,@intServiceTime,0,GETDATE())
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
END
/*
UPDATE TblPersonBilling_log
SET strConvertCHK = 'Y'
WHERE intIndex =@intIndex AND strConvertCHK = 'N'
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
*/
COMMIT TRAN
RETURN
GO
CREATE PROC agt_PersonBilling_Delete
AS
SET NOCOUNT ON
DECLARE @MIN INT -- 전에 가져왔던 최대값
SELECT @MIN = intCount FROM TblImportedNum WHERE strCompType = 'H'
BEGIN TRAN
INSERT INTO RYLBillingDB_LOG.dbo.TblPersonBilling_log_History
SELECT * FROM TblPersonBilling_log
WHERE intIndex <= @MIN
IF @@ERROR <> 0
BEGIN
ROLLBACK TRAN
RETURN
END
DELETE TblPersonBilling_log
WHERE intIndex <= @MIN
IF @@ERROR <> 0
BEGIN
ROLLBACK TRAN
RETURN
END
COMMIT TRAN
GO
CREATE PROC agt_PersonBilling_Pulling
AS
SET NOCOUNT ON
-- 현재 데이터가 처리된 미디어웹 건수를 가져온다.
DECLARE @MIN INT
DECLARE @MAX INT
SET @MAX = 0
SELECT @MIN = intCount FROM TblImportedNum WHERE strCompType = 'H'
--SET XACT_ABORT ON
--BEGIN TRAN
--한게임에서 새롭게 처리할 데이터를 가져온다.
INSERT INTO TblPersonBilling_log (intIndex,strClientID,UID,strBillingType,dateEndTime,
intServiceTime,strConvertCHK,dateInsertTime)
SELECT BILLNUM,MEMBERID,RYLUID,BILLTYPE,ENDDATE,GAMEMIN,'N',GETDATE()
FROM HANBILLING..HANGAME.RYLBILLINGT WHERE BILLNUM > @MIN AND HanCHK = 'N'
-- 총처리된 데이터수를 가져온다.
SELECT @MAX = MAX(intIndex) FROM TblPersonBilling_log WHERE strConvertCHK ='N'
IF @MAX > 0
BEGIN
UPDATE HANBILLING..HANGAME.RYLBILLINGT
SET HANCHK = 'Y'
WHERE BILLNUM > @MIN AND BILLNUM <= @MAX AND HANCHK = 'N'
-- 데이터를 업데이트한다.
UPDATE TblImportedNum
SET intCount = @MAX
WHERE strCompType = 'H'
END
--COMMIT TRAN
--SET XACT_ABORT OFF
GO
CREATE PROC USP_CheckNewBillRemainTime @UID INT
AS
SET NOCOUNT ON
DECLARE @BillingType CHAR(1)
DECLARE @RemainTotal INT
DECLARE @strClientID VARCHAR(20)
DECLARE @RemainDate INT
DECLARE @RemainTime INT
SET @BillingType = 'N'
SET @RemainTotal = 0
SELECT @strClientID = strClientID
FROM TblPersonInfo
WHERE UID = @UID
SELECT @RemainDate=DATEDIFF(DAY,GETDATE(),dateEndTime),@RemainTime = intServiceTime - intUsingTime
FROM TblPersonBillingInfo
WHERE strClientID = @strClientID
-- BillingType ='D'
IF @RemainDate > 0
BEGIN
SET @BillingType = 'D'
SET @RemainTotal = @RemainDate
END
ELSE IF @RemainDate = 0
BEGIN
IF @RemainTime > 0
BEGIN
SET @BillingType = 'T'
SET @RemainTotal = @RemainTime
END
ELSE
BEGIN
SET @BillingType = 'D'
SET @RemainTotal = @RemainDate
END
END
ELSE
BEGIN
IF @RemainTime >= 0
BEGIN
SET @BillingType = 'T'
SET @RemainTotal = @RemainTime
END
END
SELECT CAST (@BillingType AS CHAR(2)),@RemainTotal
GO
-- 개인 정량 및 정액이 종료 되었을때 자동으로 끊기전에 개인관련 빌링을 체크한다.
CREATE PROC USPCheckBilling_BeforeLogOut @strClientID VARCHAR(20)
AS
-- 로그아웃 하기 전에 개인아이디의 추가 과금여부를 체크한다.
SET NOCOUNT ON
DECLARE @BillingType CHAR(1)
DECLARE @CanPlayTime INT
DECLARE @UsedTime INT
DECLARE @PlayTime INT
-- 현재 접속된 정보를 얻어온다.
SELECT @BillingType = strBillingType,@UsedTime = DATEDIFF(MINUTE,dateLoginTime,GETDATE())
FROM TblCurrentUser WHERE strClientID = @strClientID
IF @BillingType = 'T'
BEGIN
-- 현재 과금정보를 얻어온다.
SELECT @CanPlayTime =( intServiceTime - intUsingTime)
FROM TblPersonBillingInfo
WHERE strClientID = @strClientID
-- 날짜를 계산한다.
SET @PlayTime = @CanPlayTime - @UsedTime
SELECT @PlayTime
RETURN
END
ELSE
BEGIN
SET @PlayTime = 0
SELECT @PlayTime
RETURN
END
GO
-- 캐릭터 선택창 가기 전에 과금 여부를 체크한다.
-- 캐릭터 선택창에서 다시 실행한다.
-- 추가사항 : 블럭된 캐릭터인지 아닌지를 가려야한다.
CREATE PROC USPCheckBilling_CharIDLogin @strClientID VARCHAR(20),@UID INT,@check TINYINT,@ClientIP VARCHAR(15),@ServerID TINYINT
AS
SET NOCOUNT ON
DECLARE @strBillingType CHAR(1) --D,T
DECLARE @strBillingType2 CHAR(2) -- RETURN VALUES
DECLARE @PlayTime INT --남은시간(분),남은일자
DECLARE @CanUseTime INT
DECLARE @FLAG INT
SET @strBillingType = 'N'
SET @PlayTime = 0
SET @CanUseTime = 0
SET @FLAG = -1
DECLARE @IPType CHAR(1) --D,T
DECLARE @intCRMIndex1 INT
DECLARE @intCRMIndex2 INT
SET @intCRMIndex1 =0
SET @intCRMIndex2 =0
DECLARE @BillingDate CHAR(1)
DECLARE @BillingTime CHAR(1)
SET @BillingDate = 'D'
SET @BillingTime = 'T'
-- 피시방중 정량제와 정액제를 같이 사용하는 경우 해당 과금의 피시방인덱스를 얻어와야한다.
DECLARE @OutCRMIndex INT
DECLARE @tinyServerID INT
SET @tinyServerID = -1
DECLARE @FreeTime INT
-- 현재 로그인 된 사용자 인지 아닌지 체크한다.
SELECT @tinyServerID = tinyServerID FROM TblCurrentUser WHERE strClientid = @strClientID
IF @tinyServerID > -1
BEGIN
SET @FLAG = 1 --중복된 유저임.
SET @intCRMIndex1 = @tinyServerID
SET @strBillingType2 = @strBillingType
SELECT @FLAG as FLAG,@strBillingType2 as BillingType,@PlayTime as PlayTime,@intCRMIndex1 as ServerID
RETURN
END
-- 무료계정 여부 체크
IF (@Check = 1) --무료계정
BEGIN
SET @FLAG = 0
--접속테이블에 입력한다.
INSERT INTO TblCurrentUser(strClientid,UID,intCRMIndex,strip,strBillingType,tinyServerID)
VALUES (@strClientID,@UID,@intCRMIndex1,@ClientIP,@strBillingType,@ServerID)
SET @strBillingType2 = @strBillingType
SELECT @FLAG as FLAG,@strBillingType2 as BillingType,
@PlayTime as PlayTime,@intCRMIndex1 as CRMIndex
RETURN
END
-- 무료계정인지 아닌지 체크한다
SELECT @FreeTime = DATEDIFF(DAY,GETDATE(),RegLoginTime)
FROM TBLPERSONINFO
WHERE UID = @UID
-- 실제 무료 계정임을 나타냄.
IF (@FreeTime >= 0)
BEGIN
SET @FLAG = 0
-- 임시테이블 TblCurrentUser에 입력한다.
INSERT INTO TblCurrentUser (strClientid,UID,intCRMIndex,strip,strBillingType,tinyServerID)
VALUES (@strClientID,@UID,@intCRMIndex1,@ClientIP,@strBillingType,@ServerID)
SET @strBillingType2 = @strBillingType
SELECT @FLAG as FLAG,@strBillingType2 as BillingType,
@FreeTime as PlayTime,@intCRMIndex1 as CRMIndex
RETURN
END
/*************************************************
* @FLAG = 0,@strBillingType ='D',@PlayTime = 남은일자 --개인정액제 성공
* @FLAG = 0,@strBillingType ='T',@PlayTime = 남은시간 --개인정량제 성공
* @FLAG = 1,@strBillingType ='N',@PlayTime = 0 --과금등록이 되어있지 않음
* @FLAG = 2,@strBillingType ='D',@PlayTime = 0 --개인정액제 과금이 종료된 경우
* @FLAG = 3,@strBillingType ='T',@PlayTime = 0 --개인정량제 과금이 종료된 경우
**************************************************/
EXEC @FLAG = USPCheckBilling_Person @strClientID,@strBillingType OUTPUT,@PlayTime OUTPUT
-- 개인과금이 성공적인경우
IF (@FLAG = 0)
BEGIN
-- 정액제 개인 유저인경우
IF (@strBillingType =@BillingDate)
BEGIN
--접속테이블에 입력한다.
INSERT INTO TblCurrentUser(strClientid,UID,intCRMIndex,strip,strBillingType,tinyServerID)
VALUES (@strClientID,@UID,@intCRMIndex1,@ClientIP,@strBillingType,@ServerID)
SET @strBillingType2 = @strBillingType
SELECT @FLAG as FLAG,@strBillingType2 as BillingType,
@PlayTime as PlayTime,@intCRMIndex1 as CRMIndex
RETURN
END
-- 정량제 개인 유저인경우
ELSE IF (@strBillingType =@BillingTime)
BEGIN
SET @FLAG = -1
--AGAIN CHECK ClientIP
/*********************************************
* @FLAG = 0,@intCRMIndex1 = 숫자,@intCRMIndex2 = 숫자 -- 피시방 아이피가 정액과 정량 모두를 사용함
* @FLAG = 0,@intCRMIndex1 = 숫자,@intCRMIndex2 = 0 -- 피시방 아이피가 정액 또는 정량중 하나 임
* @FLAG = 1,@intCRMIndex1 = 0,@intCRMIndex2 = 0 -- 피시방 아이피가 아님
*********************************************/
EXEC @FLAG = USPCheckBilling_ClientIP @ClientIP,@intCRMIndex1 OUTPUT,@intCRMIndex2 OUTPUT
-- PC방이 아닌경우
IF @FLAG <> 0
BEGIN
-- 개인정량제로 리턴한다.
SET @FLAG = 0
SET @intCRMIndex1 = 0
--접속테이블에 입력한다.
INSERT INTO TblCurrentUser (strClientid,UID,intCRMIndex,strip,strBillingType,tinyServerID)
VALUES (@strClientID,@UID,@intCRMIndex1,@ClientIP,@strBillingType,@ServerID)
SET @strBillingType2 = @strBillingType
SELECT @FLAG as FLAG,@strBillingType2 as BillingType,
@PlayTime as PlayTime,@intCRMIndex1 as CRMIndex
RETURN
END
-- PC방 아이피인경우
ELSE IF @FLAG = 0
BEGIN
-- 해당 아이피의 과금 방식 가져오기
IF (@intCRMIndex1 <> 0 AND @intCRMIndex2 = 0) -- 하나의 과금 방식만 따른다.
BEGIN
SELECT @IPType = strBillingType
FROM TblPCRoomBillingInfo
WHERE intCRMIndex = @intCRMIndex1
END
ELSE IF (@intCRMIndex1 <> 0 AND @intCRMIndex2 <> 0) -- 두개의 과금 방식을 따른다.
BEGIN
SET @IPType = 'C'
END
-- PC방 과금종류를 체크한다.
-- T:정량제,D:정액제
EXEC @FLAG = USPCheckBilling_GameRoom @intCRMIndex1,@intCRMIndex2,@IPType,@OutCRMIndex OUTPUT,@strBillingType OUTPUT,@canUseTime OUTPUT
IF @FLAG <> 0 --ERROR
BEGIN
-- PC방 과금이 종료된 경우이므로 다시 개인정량제로 과금을 적용시킨다.
SET @intCRMIndex1 = 0
SET @FLAG = 0
SET @strBillingType = @BillingTime
--접속테이블에 입력한다.
INSERT INTO TblCurrentUser (strClientid,UID,intCRMIndex,strip,strBillingType,tinyServerID)
VALUES (@strClientID,@UID,@intCRMIndex1,@ClientIP,@strBillingType,@ServerID)
SET @strBillingType2 = @strBillingType
SELECT @FLAG as FLAG,@strBillingType2 as BillingType,
@PlayTime as PlayTime,@intCRMIndex1 as CRMIndex
RETURN
END
ELSE
BEGIN
IF @strBillingType = 'D' -- 정액제
BEGIN
-- 아이피 하나를 사용해서 카운트를 1 더하기 한다.
EXEC USPCheckBilling_UpIPCount @OutCRMIndex
--접속테이블에 입력한다.
INSERT INTO TblCurrentUser (strClientid,UID,intCRMIndex,strip,strBillingType,tinyServerID)
VALUES (@strClientID,@UID,@OutCRMIndex,@ClientIP,@strBillingType,@ServerID)
SET @strBillingType2 = @strBillingType
SELECT @FLAG as FLAG,@strBillingType2 as BillingType,
@PlayTime as PlayTime,@OutCRMIndex as CRMIndex
RETURN
END
ELSE IF @strBillingType = 'T' -- 정액제
BEGIN
--접속테이블에 입력한다.
INSERT INTO TblCurrentUser (strClientid,UID,intCRMIndex,strip,strBillingType,tinyServerID)
VALUES (@strClientID,@UID,@OutCRMIndex,@ClientIP,@strBillingType,@ServerID)
SET @strBillingType2 = @strBillingType
SELECT @FLAG as FLAG,@strBillingType2 as BillingType,
@PlayTime as PlayTime,@OutCRMIndex as CRMIndex
RETURN
END
END
END
END
END
-- 개인과금이 실패된 경우 다시 과금등록된 피시방인지 아닌지 체크한다.
ELSE
BEGIN
--AGAIN CHECK ClientIP
/*********************************************
* @FLAG = 0,@intCRMIndex1 = 숫자,@intCRMIndex2 = 숫자 -- 피시방 아이피가 정액과 정량 모두를 사용함
* @FLAG = 0,@intCRMIndex1 = 숫자,@intCRMIndex2 = 0 -- 피시방 아이피가 정액 또는 정량중 하나 임
* @FLAG = 1,@intCRMIndex1 = 0,@intCRMIndex2 = 0 -- 피시방 아이피가 아님
*********************************************/
EXEC @FLAG = USPCheckBilling_ClientIP @ClientIP,@intCRMIndex1 OUTPUT,@intCRMIndex2 OUTPUT
-- PC방이 아닌경우
IF @FLAG <> 0
BEGIN
/*
-- 임시 적용 부분
SET @FLAG = 0
SET @intCRMIndex1 = 0
SET @strBillingType = 'N'
--접속테이블에 입력한다.
INSERT INTO TblCurrentUser(strClientid,UID,intCRMIndex,strip,strBillingType,tinyServerID)
VALUES (@strClientID,@UID,@intCRMIndex1,@ClientIP,@strBillingType,@ServerID)
SET @strBillingType2 = @strBillingType
SELECT @FLAG as FLAG,@strBillingType2 as BillingType,@PlayTime as PlayTime,@intCRMIndex1 as CRMIndex
RETURN
*/
-- 에러리턴한다.
SET @FLAG = 2
SET @strBillingType2 = @strBillingType
SELECT @FLAG as FLAG,@strBillingType2 as BillingType,
@PlayTime as PlayTime,@intCRMIndex1 as CRMIndex
RETURN
END
ELSE IF @FLAG = 0
BEGIN
-- 해당 아이피의 과금 방식 가져오기
IF (@intCRMIndex1 <> 0 AND @intCRMIndex2 = 0) -- 하나의 과금 방식만 따른다.
BEGIN
SELECT @IPType = strBillingType
FROM TblPCRoomBillingInfo
WHERE intCRMIndex = @intCRMIndex1
END
ELSE IF (@intCRMIndex1 <> 0 AND @intCRMIndex2 <> 0) -- 두개의 과금 방식을 따른다.
BEGIN
SET @IPType = 'C'
END
-- PC방 과금종류를 체크한다.
-- T:정량제,D:정액제
EXEC @FLAG = USPCheckBilling_GameRoom @intCRMIndex1,@intCRMIndex2,@IPType,@OutCRMIndex OUTPUT,@strBillingType OUTPUT,@canUseTime OUTPUT
IF @FLAG <> 0 --ERROR
BEGIN
SET @strBillingType = 'N'
-- PC방 과금이 종료된 에러를 리턴한다.
SET @strBillingType2 = @strBillingType
SELECT @FLAG as FLAG,@strBillingType2 as BillingType,
@PlayTime as PlayTime,@intCRMIndex1 as CRMIndex
RETURN
END
ELSE -- SUCCESS
BEGIN
IF @strBillingType = 'D' -- 정액제
BEGIN
-- 아이피 하나를 사용해서 카운트를 1 더하기 한다.
EXEC USPCheckBilling_UpIPCount @OutCRMIndex
--접속테이블에 입력한다.
INSERT INTO TblCurrentUser (strClientid,UID,intCRMIndex,strip,strBillingType,tinyServerID)
VALUES (@strClientID,@UID,@OutCRMIndex,@ClientIP,@strBillingType,@ServerID)
SET @strBillingType2 = @strBillingType
SELECT @FLAG as FLAG,@strBillingType2 as BillingType,
@PlayTime as PlayTime,@OutCRMIndex as CRMIndex
RETURN
END
ELSE IF @strBillingType = 'T' -- 정액제
BEGIN
--접속테이블에 입력한다.
INSERT INTO TblCurrentUser (strClientid,UID,intCRMIndex,strip,strBillingType,tinyServerID)
VALUES (@strClientID,@UID,@OutCRMIndex,@ClientIP,@strBillingType,@ServerID)
SET @strBillingType2 = @strBillingType
SELECT @FLAG as FLAG,@strBillingType2 as BillingType,
@PlayTime as PlayTime,@OutCRMIndex as CRMIndex
RETURN
END
END
END
END
GO
CREATE PROC USPCheckBilling_ClientIP @IP VARCHAR(15),@intCRMIndex1 INT OUTPUT,@intCRMIndex2 INT OUTPUT
AS
SET NOCOUNT ON
DECLARE @RETURN INT
DECLARE @intCRMIndex INT
SET @intCRMIndex = 0
DECLARE @FLAG INT
SET @FLAG = 1
DECLARE TblGameRoomIPList_Cursor CURSOR FOR
SELECT intCRMIndex FROM TblGameRoomIPList WHERE strIP = @IP
OPEN TblGameRoomIPList_Cursor
FETCH NEXT FROM TblGameRoomIPList_Cursor into @intCRMIndex
WHILE @@FETCH_STATUS = 0
BEGIN
IF @FLAG = 1
BEGIN
SET @intCRMIndex1 = @intCRMIndex
END
ELSE IF @FLAG = 2
BEGIN
SET @intCRMIndex2 = @intCRMIndex
END
FETCH NEXT FROM TblGameRoomIPList_Cursor into @intCRMIndex
SET @FLAG = @FLAG + 1
END
CLOSE TblGameRoomIPList_Cursor
DEALLOCATE TblGameRoomIPList_Cursor
--NOT EXISTS
IF @intCRMIndex1 = 0
BEGIN
SET @RETURN = 1
RETURN @RETURN
END
ELSE
BEGIN
SET @RETURN = 0
RETURN @RETURN
END
GO
-- 게임방 과금 체크
-- 주의 : @IPType을 인자로 받을때 클라이언트 아이피가 정액+정량 인경우는 C문자로 통일해서 받는다.
CREATE PROC USPCheckBilling_GameRoom @intCRMIndex INT,@intCRMIndex2 INT,@IPType CHAR(1),
@OutCRMIndex INT OUTPUT,@BillingType CHAR(1) OUTPUT,@canUseTime INT OUTPUT
AS
SET NOCOUNT ON
DECLARE @RETURN INT
-- 해당 아이피의 과금 방식이 정량제만 적용된 방식이라고 하면
IF @IPType = 'T'
BEGIN
-- IF @RETURN = 1 ERROR ELSE SUCCESS
EXEC @RETURN = USPCheckBilling_GameRoom_Time @intCRMIndex,@BillingType OUTPUT,@CanUseTime OUTPUT
IF @RETURN <> 0
BEGIN
RETURN 1 --ERROR
END
ELSE
BEGIN
SET @OutCRMIndex = @intCRMIndex
RETURN 0 --SUCCESS
END
END
-- 정액제 아이피만 적용된 아이피라고 하면
ELSE IF @IPTYPE = 'D'
BEGIN
EXEC @RETURN = USPCheckBilling_GameRoom_Date @intCRMIndex,@BillingType OUTPUT,@CanUseTime OUTPUT
IF @RETURN <> 0
BEGIN
RETURN 2 --ERROR
END
ELSE
BEGIN
SET @OutCRMIndex = @intCRMIndex
RETURN 0 --SUCCESS
END
END
-- 정액제 정량제 아이피 모두를 허용된 아이피라고 하면
ELSE IF @IPTYPE = 'C'
BEGIN
-- 첫번째 정액제 체크
EXEC @RETURN = USPCheckBilling_GameRoom_Date @intCRMIndex,@BillingType OUTPUT,@CanUseTime OUTPUT
IF @RETURN <> 0
BEGIN
--RETURN 3 --ERROR
SET @BillingType ='N'
SET @CanUseTime = 0
-- 두번째 정액체크함.
EXEC @RETURN = USPCheckBilling_GameRoom_Date @intCRMIndex2,@BillingType OUTPUT,@CanUseTime OUTPUT
IF @RETURN <> 0
BEGIN
SET @BillingType = 'N'
SET @CanUseTime = 0
-- 첫번째 정량제 체크함.
EXEC @RETURN = USPCheckBilling_GameRoom_Time @intCRMIndex,@BillingType OUTPUT,@CanUseTime OUTPUT
IF @RETURN <> 0
BEGIN
-- 두번째 정량제 체크함.
-- 정량제 체크함.
EXEC @RETURN = USPCheckBilling_GameRoom_Time @intCRMIndex2,@BillingType OUTPUT,@CanUseTime OUTPUT
IF @RETURN <> 0
BEGIN
RETURN 3 --ERROR
END
ELSE
BEGIN
SET @OutCRMIndex = @intCRMIndex2
RETURN 0 --SUCCESS
END
END
ELSE
BEGIN
SET @OutCRMIndex = @intCRMIndex
RETURN 0 --SUCCESS
END
END
ELSE
BEGIN
SET @OutCRMIndex = @intCRMIndex2
RETURN 0 --SUCCESS
END
END
ELSE
BEGIN
SET @OutCRMIndex = @intCRMIndex
RETURN 0 --SUCCESS
END
END
GO
CREATE PROC USPCheckBilling_GameRoom_Date @intCRMIndex INT,@BillingType CHAR(1) OUTPUT,@CanUseTime INT OUTPUT
AS
SET NOCOUNT ON
DECLARE @tinyServiceIpNum TINYINT -- 총 접속 가능한 아이피수
DECLARE @tinyUsedIpNum TINYINT --현재 접속된 아이피수
DECLARE @dateEndTime SMALLDATETIME -- 정액제 종료일자
DECLARE @strRegProcess CHAR(1) --가상계좌,비가상계좌
DECLARE @strClosed CHAR(1) -- 현재 해지상태인지 파악
SET @tinyServiceIpNum = 0
SET @tinyUsedIpNum = 0
SET @strRegProcess = 'N'
-- 현재 정액제 아이피 허용갯수를 가져온다.
BEGIN TRAN
SELECT @strRegProcess = strRegProcess,@tinyServiceIpNum = tinyServiceIpNum,
@dateEndTime = dateEndTime,@tinyUsedIpNum = tinyUsedIpNum,@strClosed = strClosed
FROM TblPCRoomBilling_Date WITH (UPDLOCK)
WHERE intCRMIndex = @intCRMIndex
COMMIT TRAN
-- 현재 해지된 피시방인지 체크한다.
IF @strClosed = 'Y'
BEGIN
SET @BillingType = 'N'
SET @canUseTime = 0
RETURN 1 --ERROR
END
IF @strRegProcess = 'N' -- 아이피가 존재하지 않음
BEGIN
SET @BillingType = 'N'
SET @canUseTime = 0
RETURN 1 --ERROR
END
ELSE -- 아이피가 존재함
BEGIN
-- 허용된 아이피 갯수가 초과 되었는지 확인한다.
--1. 허용된 아이피수 보다 현재 많이 사용하고 있다면
IF @tinyUsedIpNum >= @tinyServiceIpNum
BEGIN
SET @BillingType = 'D'
SET @CanUseTime = 0
RETURN 2 --ERROR
END
--2. 허용된 아이피수가 현재 사용된 아이피수보다 더 많다고 하면
ELSE IF (@tinyUsedIpNum < @tinyServiceIpNum)
BEGIN
-- 가상계좌 이므로 현재 날짜를 검토한다.
IF @strRegProcess = 'z'
BEGIN
-- EXPIRED DATE
IF (GETDATE() >= @dateEndTime)
BEGIN
SET @BillingType ='D'
SET @CanUseTime = 0
RETURN 3 --ERROR
END
ELSE
BEGIN
SET @BillingType = 'D'
-- 현재 남아있는 날짜를 리턴한다.
SET @CanUseTime = DATEDIFF(DAY,GETDATE(),@dateEndTime)
RETURN 0 --SUCCESS
END
END
-- 비가상계좌이므로 무조건 시간이 지나도 성공리턴한다.
ELSE IF @strRegProcess = 'm'
BEGIN
SET @BillingType = 'D'
-- 현재 남아있는 날짜를 리턴한다.
SET @CanUseTime = DATEDIFF(DAY,GETDATE(),@dateEndTime)
RETURN 0 --SUCCESS
END
END
END
GO
CREATE PROC USPCheckBilling_GameRoom_Time @intCRMIndex INT,@BillingType CHAR(1) OUTPUT,@CanUseTime INT OUTPUT
AS
SET NOCOUNT ON
DECLARE @strRegProcess CHAR(1) --가상계좌,비가상계좌
DECLARE @IntServiceTime INT --총 정량제 등록시간(분)
DECLARE @intUsingTime INT --정량제 사용한 시간(분)
DECLARE @strClosed CHAR(1) -- 해지된 피시방 여부인지체크...
DECLARE @intRemainTime INT
SET @intRemainTime = 0
SET @intServiceTime = 0 -- 총가능한 플레이시간을 0으로 초기화한다.
SET @strRegProcess ='N'
-- 정량제 테이블에서 과금정보를 불러온다.
SELECT @strRegProcess = strRegProcess,@IntServiceTime=intServiceTime,
@intUsingTime = intUsingTime,@strClosed = strClosed
FROM TblPCRoomBilling_Time
WHERE intCRMIndex = @intCRMIndex
-- 현재 해지된 피시방인지 체크한다.
IF @strClosed = 'Y'
BEGIN
SET @BillingType = 'N'
SET @canUseTime = 0
RETURN 1 --ERROR
END
IF @strRegProcess = 'N'
BEGIN
SET @BillingType = 'N'
SET @canUseTime = 0
RETURN 1 --ERROR
END
-- 비가상계좌 (m), 가상계좌(z)
ELSE IF @strRegProcess = 'z'
BEGIN
-- CAN'T PLAY
IF (@IntServiceTime <= @intUsingTime)
BEGIN
SET @BillingType = 'T'
SET @canUseTime = 0
RETURN 2 --ERROR
END
ELSE
BEGIN
-- 현재 접속중인 피시방에 대한 유저를 체크해서..사용량을 검사한다.
SELECT @intRemainTime = SUM(DATEDIFF(MINUTE,dateLoginTime,GETDATE()))
FROM TblCurrentUser
WHERE intCRMIndex = @intCRMIndex AND strBillingType = 'T'
-- ERROR
IF ((@IntServiceTime - @intUsingTime) < @intRemainTime)
BEGIN
SET @BillingType = 'T'
SET @canUseTime = 0
RETURN 3 --ERROR
END
SET @BillingType = 'T'
SET @CanUseTime = @IntServiceTime - @intUsingTime
RETURN 0 -- SUCCESS
END
END
ELSE IF @strRegProcess = 'm'
BEGIN
-- 총사용시간이 지났더라도 플레이 할수 있도록 해준다.
-- CAN PLAY
SET @BillingType = 'T'
SET @CanUseTime = @IntServiceTime - @intUsingTime
RETURN 0 -- SUCCESS
END
GO
-- 캐릭터 선택창 가기 전에 과금 여부를 체크한다.
-- 캐릭터 선택창에서 다시 실행한다.
CREATE PROC USPCheckBilling_Login @strClientID VARCHAR(20),@UID INT, @Check Int,@ClientIP VARCHAR(15),@ServerID TINYINT
AS
SET NOCOUNT ON
--DECLARE @RegLogInTime
DECLARE @strBillingType CHAR(1) --D,T
DECLARE @strBillingType2 CHAR(2)
DECLARE @PlayTime INT --남은시간(분),남은일자
DECLARE @CanUseTime INT
DECLARE @FLAG INT
SET @strBillingType = 'N'
SET @PlayTime = 0
SET @CanUseTime = 0
SET @FLAG = -1
DECLARE @IPType CHAR(1) --D,T
DECLARE @intCRMIndex1 INT
DECLARE @intCRMIndex2 INT
SET @intCRMIndex1 =0
SET @intCRMIndex2 =0
DECLARE @BillingDate CHAR(1)
DECLARE @BillingTime CHAR(1)
SET @BillingDate = 'D'
SET @BillingTime = 'T'
-- 피시방중 정량제와 정액제를 같이 사용하는 경우 해당 과금의 피시방인덱스를 얻어와야한다.
DECLARE @OutCRMIndex INT
DECLARE @tinyServerID INT
SET @tinyServerID = -1
DECLARE @FreeTime INT
/***************************************
임시적용부분
***************************************/
EXEC USPInsertPerson @strClientID,@UID
-- 현재 로그인 된 사용자 인지 아닌지 체크한다.
SELECT @tinyServerID = tinyServerID FROM TblCurrentUser_Temp WHERE strClientid = @strClientID
IF @tinyServerID > -1
BEGIN
SET @FLAG = 1 --중복된 유저임.
SET @intCRMIndex1 = @tinyServerID
SET @strBillingType2 = @strBillingType
SELECT @FLAG as FLAG,@strBillingType2 as BillingType,@PlayTime as PlayTime,@intCRMIndex1 as ServerID
RETURN
END
-- 현재 로그인 된 사용자 인지 아닌지 체크한다.
SELECT @tinyServerID = tinyServerID FROM TblCurrentUser WHERE strClientid = @strClientID
IF @tinyServerID > -1
BEGIN
SET @FLAG = 1 --중복된 유저임.
SET @intCRMIndex1 = @tinyServerID
SET @strBillingType2 = @strBillingType
SELECT @FLAG as FLAG,@strBillingType2 as BillingType,@PlayTime as PlayTime,@intCRMIndex1 as ServerID
RETURN
END
-- 무료계정 여부 체크 -- 나중에 수정해야함.
IF (@Check = 1) --무료계정
BEGIN
SET @FLAG = 0
-- 임시테이블 TblCurrentUser_Temp에 입력한다.
INSERT INTO TblCurrentUser_Temp (strClientid,UID,intCRMIndex,strip,strBillingType,tinyServerID)
VALUES (@strClientID,@UID,@intCRMIndex1,@ClientIP,@strBillingType,@ServerID)
SET @strBillingType2 = @strBillingType
SELECT @FLAG as FLAG,@strBillingType2 as BillingType,
@PlayTime as PlayTime,@intCRMIndex1 as CRMIndex
RETURN
END
-- 무료계정인지 아닌지 체크한다
SELECT @FreeTime = DATEDIFF(DAY,GETDATE(),RegLoginTime)
FROM TBLPERSONINFO
WHERE uid = @UID
-- 실제 무료 계정임을 나타냄.
IF (@FreeTime >= 0)
BEGIN
SET @FLAG = 0
-- 임시테이블 TblCurrentUser_Temp에 입력한다.
INSERT INTO TblCurrentUser_Temp (strClientid,UID,intCRMIndex,strip,strBillingType,tinyServerID)
VALUES (@strClientID,@UID,@intCRMIndex1,@ClientIP,@strBillingType,@ServerID)
SET @strBillingType2 = @strBillingType
SELECT @FLAG as FLAG,@strBillingType2 as BillingType,
@FreeTime as PlayTime,@intCRMIndex1 as CRMIndex
RETURN
END
/*************************************************
* @FLAG = 0,@strBillingType ='D',@PlayTime = 남은일자 --개인정액제 성공
* @FLAG = 0,@strBillingType ='T',@PlayTime = 남은시간 --개인정량제 성공
* @FLAG = 1,@strBillingType ='N',@PlayTime = 0 --과금등록이 되어있지 않음
* @FLAG = 2,@strBillingType ='D',@PlayTime = 0 --개인정액제 과금이 종료된 경우
* @FLAG = 3,@strBillingType ='T',@PlayTime = 0 --개인정량제 과금이 종료된 경우
**************************************************/
EXEC @FLAG = USPCheckBilling_Person @strClientID,@strBillingType OUTPUT,@PlayTime OUTPUT
-- 개인과금이 성공적인경우
IF (@FLAG = 0)
BEGIN
-- 정액제 개인 유저인경우
IF (@strBillingType =@BillingDate)
BEGIN
-- 임시테이블 TblCurrentUser_Temp에 입력한다.
INSERT INTO TblCurrentUser_Temp (strClientid,UID,intCRMIndex,strip,strBillingType,tinyServerID)
VALUES (@strClientID,@UID,@intCRMIndex1,@ClientIP,@strBillingType,@ServerID)
SET @strBillingType2 = @strBillingType
SELECT @FLAG as FLAG,@strBillingType2 as BillingType,@PlayTime as PlayTime,@intCRMIndex1 as CRMIndex
RETURN
END
-- 정량제 개인 유저인경우
ELSE IF (@strBillingType =@BillingTime)
BEGIN
SET @FLAG = -1
--AGAIN CHECK ClientIP
/*********************************************
* @FLAG = 0,@intCRMIndex1 = 숫자,@intCRMIndex2 = 숫자 -- 피시방 아이피가 정액과 정량 모두를 사용함
* @FLAG = 0,@intCRMIndex1 = 숫자,@intCRMIndex2 = 0 -- 피시방 아이피가 정액 또는 정량중 하나 임
* @FLAG = 1,@intCRMIndex1 = 0,@intCRMIndex2 = 0 -- 피시방 아이피가 아님
*********************************************/
EXEC @FLAG = USPCheckBilling_ClientIP @ClientIP,@intCRMIndex1 OUTPUT,@intCRMIndex2 OUTPUT
-- PC방이 아닌경우
IF @FLAG <> 0
BEGIN
-- 개인정량제로 리턴한다.
SET @FLAG = 0
SET @intCRMIndex1 = 0
-- 임시테이블 TblCurrentUser_Temp에 입력한다.
INSERT INTO TblCurrentUser_Temp (strClientid,UID,intCRMIndex,strip,strBillingType,tinyServerID)
VALUES (@strClientID,@UID,@intCRMIndex1,@ClientIP,@strBillingType,@ServerID)
SET @strBillingType2 = @strBillingType
SELECT @FLAG as FLAG,@strBillingType2 as BillingType,@PlayTime as PlayTime,@intCRMIndex1 as CRMIndex
RETURN
END
-- PC방 아이피인경우
ELSE IF @FLAG = 0
BEGIN
-- 해당 아이피의 과금 방식 가져오기
IF (@intCRMIndex1 <> 0 AND @intCRMIndex2 = 0) -- 하나의 과금 방식만 따른다.
BEGIN
SELECT @IPType = strBillingType
FROM TblPCRoomBillingInfo
WHERE intCRMIndex = @intCRMIndex1
END
ELSE IF (@intCRMIndex1 <> 0 AND @intCRMIndex2 <> 0) -- 두개의 과금 방식을 따른다.
BEGIN
SET @IPType = 'C'
END
-- PC방 과금종류를 체크한다.
-- T:정량제,D:정액제
EXEC @FLAG = USPCheckBilling_GameRoom @intCRMIndex1,@intCRMIndex2,@IPType,@OutCRMIndex OUTPUT,@strBillingType OUTPUT,@canUseTime OUTPUT
IF @FLAG <> 0 --ERROR
BEGIN
-- PC방 과금이 종료된 경우이므로 다시 개인정량제로 과금을 적용시킨다.
SET @intCRMIndex1 = 0
SET @FLAG = 0
SET @strBillingType = @BillingTime
-- 임시테이블 TblCurrentUser_Temp에 입력한다.
INSERT INTO TblCurrentUser_Temp (strClientid,UID,intCRMIndex,strip,strBillingType,tinyServerID)
VALUES (@strClientID,@UID,@intCRMIndex1,@ClientIP,@strBillingType,@ServerID)
SET @strBillingType2 = @strBillingType
SELECT @FLAG as FLAG,@strBillingType2 as BillingType,
@PlayTime as PlayTime,@intCRMIndex1 as CRMIndex
RETURN
END
ELSE
BEGIN
IF @strBillingType = 'D' -- 정액제
BEGIN
-- 아이피 하나를 사용해서 카운트를 1 더하기 한다.
EXEC USPCheckBilling_UpIPCount @OutCRMIndex
-- 임시테이블 TblCurrentUser_Temp에 입력한다.
INSERT INTO TblCurrentUser_Temp (strClientid,UID,intCRMIndex,strip,strBillingType,tinyServerID)
VALUES (@strClientID,@UID,@OutCRMIndex,@ClientIP,@strBillingType,@ServerID)
SET @strBillingType2 = @strBillingType
SELECT @FLAG as FLAG,@strBillingType2 as BillingType,
@canUseTime as PlayTime,@OutCRMIndex as CRMIndex
RETURN
END
ELSE IF @strBillingType = 'T' -- 정액제
BEGIN
-- 임시테이블 TblCurrentUser_Temp에 입력한다.
INSERT INTO TblCurrentUser_Temp (strClientid,UID,intCRMIndex,strip,strBillingType,tinyServerID)
VALUES (@strClientID,@UID,@OutCRMIndex,@ClientIP,@strBillingType,@ServerID)
SET @strBillingType2 = @strBillingType
SELECT @FLAG as FLAG,@strBillingType2 as BillingType,
@canUseTime as PlayTime,@OutCRMIndex as CRMIndex
RETURN
END
END
END
END
END
-- 개인과금이 실패된 경우 다시 과금등록된 피시방인지 아닌지 체크한다.
ELSE
BEGIN
--AGAIN CHECK ClientIP
/*********************************************
* @FLAG = 0,@intCRMIndex1 = 숫자,@intCRMIndex2 = 숫자 -- 피시방 아이피가 정액과 정량 모두를 사용함
* @FLAG = 0,@intCRMIndex1 = 숫자,@intCRMIndex2 = 0 -- 피시방 아이피가 정액 또는 정량중 하나 임
* @FLAG = 1,@intCRMIndex1 = 0,@intCRMIndex2 = 0 -- 피시방 아이피가 아님
*********************************************/
EXEC @FLAG = USPCheckBilling_ClientIP @ClientIP,@intCRMIndex1 OUTPUT,@intCRMIndex2 OUTPUT
-- PC방이 아닌경우
IF @FLAG <> 0
BEGIN
/*********임시 적용 부분 ************
SET @FLAG = 0
SET @intCRMIndex1 = 0
SET @strBillingType = 'N'
--접속테이블에 입력한다.
INSERT INTO TblCurrentUser_temp(strClientid,UID,intCRMIndex,strip,strBillingType,tinyServerID)
VALUES (@strClientID,@UID,@intCRMIndex1,@ClientIP,@strBillingType,@ServerID)
SET @strBillingType2 = @strBillingType
SELECT @FLAG as FLAG,@strBillingType2 as BillingType,@PlayTime as PlayTime,@intCRMIndex1 as CRMIndex
RETURN
*********임시 적용 부분 끝 ************/
-- 에러리턴한다
SET @FLAG = 2
SET @strBillingType2 = @strBillingType
SELECT @FLAG as FLAG,@strBillingType2 as BillingType,
@PlayTime as PlayTime,@intCRMIndex1 as CRMIndex
RETURN
END
ELSE IF @FLAG = 0
BEGIN
-- 해당 아이피의 과금 방식 가져오기
IF (@intCRMIndex1 <> 0 AND @intCRMIndex2 = 0) -- 하나의 과금 방식만 따른다.
BEGIN
SELECT @IPType = strBillingType
FROM TblPCRoomBillingInfo
WHERE intCRMIndex = @intCRMIndex1
END
ELSE IF (@intCRMIndex1 <> 0 AND @intCRMIndex2 <> 0) -- 두개의 과금 방식을 따른다.
BEGIN
SET @IPType = 'C'
END
-- PC방 과금종류를 체크한다.
-- T:정량제,D:정액제
EXEC @FLAG = USPCheckBilling_GameRoom @intCRMIndex1,@intCRMIndex2,@IPType,@OutCRMIndex OUTPUT,@strBillingType OUTPUT,@canUseTime OUTPUT
IF @FLAG <> 0 --ERROR
BEGIN
SET @FLAG = 2
SET @strBillingType = 'N'
-- PC방 과금이 종료된 에러를 리턴한다.
SET @strBillingType2 = @strBillingType
SELECT @FLAG as FLAG,@strBillingType2 as BillingType,
@PlayTime as PlayTime,@intCRMIndex1 as CRMIndex
RETURN
END
ELSE -- SUCCESS
BEGIN
IF @strBillingType = 'D' -- 정액제
BEGIN
-- 아이피 하나를 사용해서 카운트를 1 더하기 한다.
EXEC USPCheckBilling_UpIPCount @OutCRMIndex
-- 임시테이블 TblCurrentUser_Temp에 입력한다.
INSERT INTO TblCurrentUser_Temp (strClientid,UID,intCRMIndex,strip,strBillingType,tinyServerID)
VALUES (@strClientID,@UID,@OutCRMIndex,@ClientIP,@strBillingType,@ServerID)
SET @strBillingType2 = @strBillingType
SELECT @FLAG as FLAG,@strBillingType2 as BillingType,
@canUseTime as PlayTime,@OutCRMIndex as CRMIndex
RETURN
END
ELSE IF @strBillingType = 'T' -- 정액제
BEGIN
-- 임시테이블 TblCurrentUser_Temp에 입력한다.
INSERT INTO TblCurrentUser_Temp (strClientid,UID,intCRMIndex,strip,strBillingType,tinyServerID)
VALUES (@strClientID,@UID,@OutCRMIndex,@ClientIP,@strBillingType,@ServerID)
SET @strBillingType2 = @strBillingType
SELECT @FLAG as FLAG,@strBillingType2 as BillingType,
@canUseTime as PlayTime,@OutCRMIndex as CRMIndex
RETURN
END
END
END
END
GO
-- 로그아웃 시 과금체크 부분
-- 로그아웃시 과금이 지난 경우는 불활성 상태로 저장하고 종료한다.
CREATE PROC USPCheckBilling_LogOut @ClientID VARCHAR(20)
AS
SET NOCOUNT ON
-- 현재 로그인 된 정보 값을 가져온다.
DECLARE @BillingType CHAR(1)
DECLARE @strIp VARCHAR(15)
DECLARE @tinyServerID TINYINT
DECLARE @UID INT
SET @UID = -1
DECLARE @CRMIndex INT
SET @CRMIndex = -1
DECLARE @DateLoginTime SMALLDATETIME
DECLARE @FirstLoginTime SMALLDATETIME
DECLARE @UsingTime INT
DECLARE @ERROR INT
-- 임시로그인 테이블에 존재하는지 안하는지 확인한다.
SELECT @UID = UID,@CRMIndex = intCRMIndex,@strIp = strIp,@BillingType = strBillingType,
@tinyServerID = tinyServerID,@DateLoginTime = DateLoginTime
FROM TblCurrentUser_temp
WHERE strClientid = @ClientID
-- 존재안한다고 하면
-- 캐릭터 선택하고 플레이하고 난뒤 로그아웃 할때 적용되는 부분
IF @UID = -1
BEGIN
SELECT @UID = UID,@CRMIndex = intCRMIndex,@strIp = strIp,@BillingType = strBillingType,
@tinyServerID = tinyServerID,@DateLoginTime = DateLoginTime,@FirstLoginTime = FirstLoginTime
FROM TblCurrentUser
WHERE strClientid = @ClientID
-- 현재 접속된 유저가 없음 (TBLCURRENTUSER)
IF @UID = -1
BEGIN
SELECT 1 AS ERROR
RETURN
END
-- 로그인 정보로 부터 현재까지 사용한 PLAYTIME을 구한다.
SET @UsingTime = DATEDIFF(MINUTE,@DateLoginTime,GETDATE())
-- 개인유저인경우
IF @CRMIndex = 0
BEGIN
-- 과금타입을 구분, 정량제인경우
IF @BillingType = 'T'
BEGIN
EXEC @ERROR =USPCheckBilling_LogOut_PersonTime @ClientID,@UsingTime
-- ERROR HANDLER
IF @ERROR <> 0
BEGIN
SELECT @ERROR
RETURN
END
END
ELSE -- 개인정액제,무료계정일경우 경우
BEGIN
-- 데이터를 삭제한다
DELETE TblCurrentUser WHERE strClientid = @ClientID
END
END
-- 일반 게임방인 경우
ELSE IF (@CRMIndex > 0)
BEGIN
-- 게임방 코드를 구한다.
DECLARE @CRMCode VARCHAR(20)
SELECT @CRMCode = strCRMCode FROM TblPCRoomBillingInfo WHERE intCRMIndex = @CRMIndex
IF @BillingType = 'T'
BEGIN
EXEC @ERROR = USPCheckBilling_LogOut_PCTime 'Y',@CRMIndex,@CRMCode,@UsingTime,@ClientID
-- ERROR HANDLER
IF @ERROR <> 0
BEGIN
SELECT @ERROR
RETURN
END
END
ELSE IF @BillingType ='D'-- 게임방 정액제인 경우
BEGIN
EXEC @ERROR= USPCheckBilling_LogOut_PCDate 'Y',@CRMIndex,@CRMCode,@UsingTime,@ClientID
IF @ERROR <> 0
BEGIN
SELECT @ERROR
RETURN
END
END
END
-- 로그를 남긴다.
INSERT INTO RylBillingDB_LOG.DBO.TblCurrentUser_Log (strClientID,UID,intCRMIndex,strIp,strBillingType,tinyServerID,FirstLoginTime,LoginTime,LogoutTime,intPlayTime)
VALUES (@ClientID,@UID,@CRMIndex,@strIp,@BillingType,@tinyServerID,@FirstLoginTime,@DateLoginTime,GETDATE(),@UsingTime)
UPDATE TblPersonInfo
SET LastLogOutTime = GETDATE()
WHERE UID = @UID
SELECT 0 AS SUCCESS
RETURN
END
ELSE -- 캐릭터 선택창에서..바로 로그아웃 할때 적용되는 부분. 임시테이블에서 삭제하고 로그아웃한다.
BEGIN
BEGIN TRAN
-- 임시 피시방 아이피를 하나 낮춘다.
IF ((@CRMIndex > 0) AND (@BillingType = 'D'))
BEGIN
-- 허용아이피 갯수를 낮춘다.
UPDATE TblPCRoomBilling_Date
SET tinyUsedIpNum = tinyUsedIpNum - 1
WHERE intCRMIndex = @CRMIndex
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
SELECT 2 AS ERROR
RETURN
END
END
-- 로그를 남긴다.
DELETE TblCurrentUser_Temp WHERE strClientid = @ClientID
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
SELECT 3 AS ERROR
RETURN
END
COMMIT TRAN
--INSERT INTO RylBillingDB_Log.dbo.TblCurrentUser_Log
--VALUES (@ClientID,@UID,@CRMIndex,@strIp,@BillingType,@tinyServerID,@FirstLoginTime,@DateLoginTime,GETDATE(),0)
SELECT 0 AS SUCCESS
RETURN
END
GO
CREATE PROC USPCheckBilling_LogOut_PCDate @DelFlag CHAR(1),@CRMIndex INT,@CRMCode VARCHAR(20),@UsingTime INT,@ClientID VARCHAR(20)
AS
SET NOCOUNT ON
-- 자동으로 정액제 유저가 나가면 정량제 유저가 접속되어있는 곳을 정액제 유저로 변환해야함.
DECLARE @TimeCRMIndex INT
DECLARE @UserID VARCHAR(20)
DECLARE @LogOutTime INT
DECLARE @strClosed CHAR(1)
DECLARE @RegProcess CHAR(1)
DECLARE @RemainTime INT
-- 정량제가 정액제로 자동으로 바뀌면 IPNUMCOUNT
DECLARE @IPNUMYESNO INT
SET @IPNUMYESNO = 0
SET @LogOutTime = -1
SET @TimeCRMIndex = 0
DECLARE @RETURN INT
SET @RETURN = -1
SELECT @TimeCRMIndex = intCRMIndex FROM TblPCRoomBillingInfo WHERE strCRMCode = @CRMCode AND strBillingType ='T'
-- 정량제 피시방이 존재한다면
IF @TimeCRMIndex > 0
BEGIN
-- 현재접속된 유저의 아이디를 얻어온다.해당 아이피가 정액제 아이피인것중에서 가져와야함.
SELECT TOP 1 @UserID = strClientid,@LogOutTime = DATEDIFF(MINUTE,dateLoginTime,GETDATE())
FROM TblCurrentUser WHERE intCRMIndex = @TimeCRMIndex AND strBillingType ='T'
AND strIP IN (SELECT strIP FROM TblGameRoomIpList WHERE intCRMIndex = @CRMIndex)
-- 정액제 유저로 변경할 정량제 유저를 먼저 로그아웃 시킨다.
IF (@LogOutTime > -1)
BEGIN
EXEC @RETURN = USPCheckBilling_LogOut_PCTime 'N',@TimeCRMIndex,@CRMCode,@LogOutTime,@UserID
-- @RETURN : 0 (SUCCESS)
IF @RETURN <> 0
BEGIN
RETURN 301
END
-- 다른 정량제 유저가 접속중이면 과금 타입을 정액제로 바꾼다.
UPDATE TblCurrentUser
SET intCRMIndex = @CRMIndex,strBillingType ='D',dateLoginTime = GETDATE()
WHERE strClientid = @UserID
IF @@ROWCOUNT = 1
BEGIN
SET @IPNUMYESNO = 1
END
-- 로그를 남긴다.
INSERT INTO RylBillingDB_LOG.DBO.TblCurrentUser_Log (strClientID,UID,intCRMIndex,strIp,strBillingType,tinyServerID,FirstLoginTime,LoginTime,LogoutTime,intPlayTime)
VALUES (@UserID,NULL,@TimeCRMIndex,NULL,'T',NULL,NULL,NULL,GETDATE(),@LogOutTime)
END
END
-- 사용시간을 체크해서 가상계좌이면 삭제한다.
SELECT @RegProcess = strRegProcess,@RemainTime = DATEDIFF(SECOND,GETDATE(),dateEndTime),@strClosed =strClosed
FROM TblPCRoomBilling_Date
WHERE intCRMIndex = @CRMIndex
BEGIN TRAN
-- 가상계좌와 과금종료일자가 지나면 과금컬럼을 삭제한다.
IF (((@RegProcess = 'z') AND (@RemainTime <= 0)) OR @strClosed = 'Y')
BEGIN
-- 현재 자신외에 다른 유저가 들어가있는지 확인한다.
DECLARE @Count INT
SELECT @Count = COUNT(strClientID) FROM TblCurrentUser WHERE intCRMIndex = @CRMIndex
-- 자신외에 다른 유저들이 존재하지 않는다고 하면 전체 정보를 삭제한다.
IF (@Count = 1)
BEGIN
DELETE TblPCRoomBilling_Date
WHERE intCRMIndex = @CRMIndex
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN 302
END
-- 해당 아이피를 삭제한다.
DELETE TblGameRoomIPList
WHERE intCRMIndex = @CRMIndex
IF @@ROWCOUNT = 0
BEGIN
ROLLBACK TRAN
RETURN 303
END
-- 피시방 정보를 삭제한다.
DELETE TblPCRoomBillingInfo
WHERE intCRMIndex = @CRMIndex
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN 304
END
END
ELSE -- 자신외에 다른 유저가 현재 접속되어있다.
BEGIN
IF @IPNUMYESNO = 0
BEGIN
-- 허용아이피 갯수를 낮춘다.
UPDATE TblPCRoomBilling_Date
SET tinyUsedIpNum = tinyUsedIpNum - 1
WHERE intCRMIndex = @CRMIndex
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN 305
END
END
END
END
ELSE
BEGIN
IF @IPNUMYESNO = 0
BEGIN
-- 허용아이피 갯수를 낮춘다.
UPDATE TblPCRoomBilling_Date
SET tinyUsedIpNum = tinyUsedIpNum - 1
WHERE intCRMIndex = @CRMIndex
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN 306
END
END
END
DELETE TblCurrentUser WHERE strClientid =@ClientID
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN 307
END
COMMIT TRAN
RETURN 0
GO
CREATE PROC USPCheckBilling_LogOut_PCTime @DelFlag CHAR(1),@CRMIndex INT,@CRMCode VARCHAR(20),@UsingTime INT,@ClientID VARCHAR(20)
AS
SET NOCOUNT ON
DECLARE @RemainTime INT
DECLARE @RegProcess CHAR(1)
DECLARE @strClose CHAR(1) -- 해지된 피시방인지 체크한다.
BEGIN TRAN
UPDATE TblPCRoomBilling_Time
SET intUsingTime = intUsingTime + @UsingTime
WHERE intCRMIndex = @CRMIndex
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN 201
END
-- 사용시간을 체크해서 가상계좌이면 삭제한다.
SELECT @RegProcess = strRegProcess,@RemainTime =(intServiceTime - intUsingTime),@strClose = strClosed
FROM TblPCRoomBilling_Time
WHERE intCRMIndex = @CRMIndex
-- 해지된 피시방이거나 가상계좌 중 사용시간이 초과 되었을 경우 과금필드를 삭제한다.
IF (((@RegProcess = 'z') AND (@RemainTime <= 0)) OR @strClose ='Y' )
BEGIN
-- 현재 자신외에 다른 유저가 들어가있는지 확인한다.
DECLARE @Count INT
SELECT @Count = COUNT(strClientID) FROM TblCurrentUser WHERE intCRMIndex = @CRMIndex
-- 현재 같은 피시방에 다른 유저들이 접속되어있음
IF (@COUNT > 1)
BEGIN
-- 미디어웹에 보낼 정량제 사용량에 대해서 기록을 입력한다.
INSERT INTO TblCRM_ServiceTime (strCRMCode,strGameCode,intServiceTime,delColumn,WebCHK)
VALUES (@CRMCode,'002',@RemainTime,'N','N')
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN 202
END
END
-- 현재 다른 유저들이 피시방에 접속해있지 않다.
ELSE --IF (@COUNT = 1)
BEGIN
-- 해당시간을 삭제한다.
DELETE TblPCRoomBilling_Time
WHERE intCRMIndex = @CRMIndex
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN 203
END
-- 미디어웹에 보낼 정량제 사용량에 대해서 기록을 입력한다.
INSERT INTO TblCRM_ServiceTime (strCRMCode,strGameCode,intServiceTime,delColumn,WebCHK)
VALUES (@CRMCode,'002',@RemainTime,'Y','N')
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN 204
END
-- 해당 아이피를 삭제한다.
DELETE TblGameRoomIPList
WHERE intCRMIndex = @CRMIndex
IF @@ROWCOUNT = 0
BEGIN
ROLLBACK TRAN
RETURN 205
END
-- 피시방 정보를 삭제한다.
DELETE TblPCRoomBillingInfo
WHERE intCRMIndex = @CRMIndex
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN 206
END
END
END
ELSE -- 사용시간이 남아있는 경우
BEGIN
-- 미디어웹에 보낼 정량제 사용량에 대해서 기록을 입력한다.
INSERT INTO TblCRM_ServiceTime (strCRMCode,strGameCode,intServiceTime,delColumn,WebCHK)
VALUES (@CRMCode,'002',@RemainTime,'N','N')
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN 207
END
END
-- 해당 유저를 삭제함.
IF @DelFlag = 'Y'
BEGIN
DELETE TblCurrentUser WHERE strClientid = @ClientID
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN 208
END
END
COMMIT TRAN
RETURN 0
GO
CREATE PROC USPCheckBilling_LogOut_PersonTime @ClientID VARCHAR(20),@UsingTime INT
AS
SET NOCOUNT ON
DECLARE @RemainTime INT
SET @RemainTime = -1
BEGIN TRAN
UPDATE TblPersonBillingInfo
SET intUsingTime = intUsingTime + @UsingTime
WHERE strClientid = @ClientID
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN 100
END
DELETE TblCurrentUser WHERE strClientid = @ClientID
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN 101
END
COMMIT TRAN
RETURN 0
GO
-- CHECK PERSONALBILLING
CREATE PROC USPCheckBilling_Person @strClientid VARCHAR(20),@strBillingType CHAR(1) OUTPUT,@PlayTime INT OUTPUT
AS
SET NOCOUNT ON
DECLARE @RETURN INT -- 0:SUCCESS,1:ERROR
DECLARE @dateEndTime SMALLDATETIME
IF EXISTS (SELECT strClientID FROM TblPersonBillingInfo WHERE strClientid = @strClientID)
BEGIN
SELECT @dateEndTime = dateEndTime,@PlayTime = (intServiceTime - intUsingTime)
FROM TblPersonBillingInfo
WHERE strClientid = @strClientID
-- 현재 과금이 등록된 상태인 유저라고하면
-- 먼저 과금타입 중 정액제가 적용되는지 알아본다.
-- EXPIRED PERIOD TIME
IF ((GETDATE() >= @dateEndTime) or (@dateEndTime is NULL))
BEGIN
-- 정량제가 적용되는지 알아본다.
IF (@PlayTime <= 0)
BEGIN
SET @strBillingType = 'N' -- 과금 전상태로 세팅한다.
SET @RETURN = 3 --ERROR
RETURN @RETURN
END
ELSE
BEGIN
SET @strBillingType = 'T' -- 정량제 과금으로 OUTPUT한다.
SET @RETURN = 0 --SUCCESS
RETURN @RETURN
END
END
-- CAN PLAY
ELSE
BEGIN
SET @strBillingType = 'D' -- 정액제 과금으로 OUTPUT한다.
SET @PlayTime = DATEDIFF(DAY,GETDATE(),@dateEndTime)
SET @RETURN = 0 --SUCCESS
RETURN @RETURN
END
END
ELSE
BEGIN
-- NOT EXISTS
SET @strBillingType = 'N' -- 과금 전상태로 세팅한다.
SET @PlayTime = 0 -- 과금 전상태로 세팅한다.
SET @RETURN = 1 --ERROR
RETURN @RETURN
END
GO
CREATE PROC USPCheckBilling_UpIPCount @intCRMIndex INT
AS
UPDATE TblPCRoomBilling_Date
SET tinyUsedIpNum = tinyUsedIpNum + 1
WHERE intCRMIndex = @intCRMIndex
GO
-- 블럭 체크
CREATE Proc USPCheckRestraintChar @ServerID Tinyint,@UID INT
AS
SET NOCOUNT ON
DECLARE @tinyType TINYINT
SET @tinyType = 0
DECLARE @tinyKind TINYINT -- 1:영구,0:임시
DECLARE @EndTime INT
DECLARE @dateEndTime SMALLDATETIME
DECLARE @intEndTime INT
DECLARE @RETURNCHAR1 VARCHAR(20)
DECLARE @RETURNCHAR2 VARCHAR(20)
DECLARE @RETURNCHAR3 VARCHAR(20)
SELECT @tinyType=tinyType,@tinyKind = tinykind,@EndTime =DATEDIFF(MINUTE,GETDATE(),dateEndTime)
FROM TblRestraintChar
WHERE tinyServerID=@ServerID AND UID = @UID AND tinyBlocked = 1
IF @tinyType = 0 -- 블럭안함
BEGIN
SELECT @tinyType,@RETURNCHAR1,@RETURNCHAR2,@RETURNCHAR2
RETURN
END
ELSE IF @tinyType = 1 -- 계정블럭
BEGIN
-- 기간여부체크
IF (@EndTime <= 0 and @tinyKind = 0) --블럭해제된 상태임
BEGIN
UPDATE TblRestraintChar
SET tinyBlocked = 0
WHERE tinyServerID=@ServerID AND UID = @UID AND tinyBlocked = 1
SET @tinyType = 0
SELECT @tinyType,@RETURNCHAR1,@RETURNCHAR2,@RETURNCHAR2
RETURN
END
ELSE
BEGIN
SELECT @tinyType,@RETURNCHAR1,@RETURNCHAR2,@RETURNCHAR2
RETURN
END
END
ELSE IF @tinyType = 2 --캐릭터블럭
BEGIN
DECLARE @strCharName VARCHAR(20)
SET @EndTime = 0
DECLARE @TIME INT
SET @TIME = 1
DECLARE Restraint_Cursor CURSOR FOR
SELECT strCharName,DATEDIFF(MINUTE,GETDATE(),dateEndTime),tinyKind
FROM TblRestraintChar
WHERE tinyServerID=@ServerID AND UID = @UID AND tinyBlocked = 1
OPEN Restraint_Cursor FETCH NEXT FROM Restraint_Cursor INTO @strCharName,@EndTime,@tinyKind
WHILE @@FETCH_STATUS = 0
BEGIN
IF ((@EndTime > 0) or (@tinyKind = 1))
BEGIN
IF @TIME = 1
SET @RETURNCHAR1 = @strCharName
ELSE IF @TIME = 2
SET @RETURNCHAR2 = @strCharName
ELSE IF @TIME = 3
SET @RETURNCHAR3 = @strCharName
END
ELSE
BEGIN
UPDATE TblRestraintChar
SET tinyBlocked = 0
WHERE tinyServerID=@ServerID AND UID = @UID AND strCharName = @strCharName AND tinyBlocked = 1
END
SET @TIME = @TIME + 1
FETCH NEXT FROM Restraint_Cursor into @strCharName,@EndTime,@tinyKind
END
CLOSE Restraint_Cursor
DEALLOCATE Restraint_Cursor
IF ((@RETURNCHAR1 IS NULL) AND (@RETURNCHAR2 IS NULL) AND (@RETURNCHAR3 IS NULL))
BEGIN
SET @tinyType = 0
END
SELECT @tinyType,@RETURNCHAR1,@RETURNCHAR2,@RETURNCHAR3
RETURN
END
GO
CREATE PROC USPDeleteRestraintChar @SeverID tinyint,@UID INT,@Charname varchar(16)
AS
SET NOCOUNT ON
IF EXISTS (SELECT UID FROM TblRestraintChar WHERE tinyServerID=@SeverID AND UID = @UID AND strCharName = @Charname)
BEGIN
DELETE TblRestraintChar
WHERE tinyServerID=@SeverID AND UID = @UID AND strCharName = @Charname
SELECT @@ROWCOUNT
END
ELSE
BEGIN
SELECT 0
END
GO
-- 현재 서버군에 접속되어있는 유저들을 리턴한다.
CREATE PROC USPDisConnectLogOut @ServerID INT
AS
SET NOCOUNT ON
DECLARE @RowID INT
DECLARE @strClientID VARCHAR(20)
DECLARE @TempTable TABLE
(
RowID INT IDENTITY(1,1) PRIMARY KEY
, strClientID VARCHAR(20)
)
INSERT INTO @TempTable (strClientID)
SELECT strClientID FROM TblCurrentUser WHERE tinyServerID = @ServerID
SET @RowID = @@ROWCOUNT
WHILE @RowID <> 0
BEGIN
SELECT @strClientID = strClientID FROM @TempTable WHERE RowID = @RowID
-- 개인개인 과금을 처리한다.
EXEC USPDisConnectLogOut_Include @strClientID
SET @RowID = @RowID - 1
END
SELECT 0 AS SUCCESS
GO
-- 로그아웃 시 과금체크 부분
-- 로그아웃시 과금이 지난 경우는 불활성 상태로 저장하고 종료한다.
CREATE PROC USPDisConnectLogOut_Include @ClientID VARCHAR(20)
AS
SET NOCOUNT ON
-- 현재 로그인 된 정보 값을 가져온다.
DECLARE @BillingType CHAR(1)
DECLARE @strIp VARCHAR(15)
DECLARE @tinyServerID TINYINT
DECLARE @UID INT
SET @UID = -1
DECLARE @CRMIndex INT
SET @CRMIndex = -1
DECLARE @DateLoginTime SMALLDATETIME
DECLARE @FirstLoginTime SMALLDATETIME
DECLARE @UsingTime INT
-- 임시로그인 테이블에 존재하는지 안하는지 확인한다.
SELECT @UID = UID,@CRMIndex = intCRMIndex,@strIp = strIp,@BillingType = strBillingType,
@tinyServerID = tinyServerID,@DateLoginTime = DateLoginTime
FROM TblCurrentUser_temp
WHERE strClientid = @ClientID
IF @UID = -1
BEGIN
SELECT @UID = UID,@CRMIndex = intCRMIndex,@strIp = strIp,@BillingType = strBillingType,
@tinyServerID = tinyServerID,@DateLoginTime = DateLoginTime,@FirstLoginTime = FirstLoginTime
FROM TblCurrentUser
WHERE strClientid = @ClientID
-- 현재 접속된 유저가 없음 (TBLCURRENTUSER)
IF @UID = -1
BEGIN
RETURN
END
-- 로그인 정보로 부터 현재까지 사용한 PLAYTIME을 구한다.
SET @UsingTime = DATEDIFF(MINUTE,@DateLoginTime,GETDATE())
-- 개인유저인경우
IF @CRMIndex = 0
BEGIN
-- 과금타입을 구분, 정량제인경우
IF @BillingType = 'T'
BEGIN
EXEC USPCheckBilling_LogOut_PersonTime @ClientID,@UsingTime
END
ELSE -- 정액제,비과금유저인경우
BEGIN
DELETE TblCurrentUser where strClientid = @ClientID
END
END
-- 일반 게임방인 경우
ELSE IF (@CRMIndex > 0)
BEGIN
-- 게임방 코드를 구한다.
DECLARE @CRMCode VARCHAR(20)
SELECT @CRMCode = strCRMCode FROM TblPCRoomBillingInfo WHERE intCRMIndex = @CRMIndex
IF @BillingType = 'T'
BEGIN
EXEC USPCheckBilling_LogOut_PCTime 'Y',@CRMIndex,@CRMCode,@UsingTime,@ClientID
END
ELSE -- 게임방 정액제인 경우
BEGIN
EXEC USPCheckBilling_LogOut_PCDate 'Y',@CRMIndex,@CRMCode,@UsingTime,@ClientID
END
END
-- 로그를 남긴다.
INSERT INTO RylBillingDB_LOG.DBO.TblCurrentUser_Log (strClientID,UID,intCRMIndex,strIp,strBillingType,tinyServerID,FirstLoginTime,LoginTime,LogoutTime,intPlayTime)
VALUES (@ClientID,@UID,@CRMIndex,@strIp,@BillingType,@tinyServerID,@FirstLoginTime,@DateLoginTime,GETDATE(),@UsingTime)
UPDATE TblPersonInfo
SET LastLogOutTime = GETDATE()
WHERE UID = @UID
RETURN
END
ELSE -- 임시테이블에서 삭제하고 로그아웃한다.
BEGIN
BEGIN TRAN
-- 임시 피시방 아이피를 하나 낮춘다.
IF ((@CRMIndex > 0) AND (@BillingType = 'D'))
BEGIN
-- 허용아이피 갯수를 낮춘다.
UPDATE TblPCRoomBilling_Date
SET tinyUsedIpNum = tinyUsedIpNum - 1
WHERE intCRMIndex = @CRMIndex
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
END
-- 로그를 남긴다.
DELETE TblCurrentUser_Temp WHERE strClientid = @ClientID
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRAN
RETURN
END
COMMIT TRAN
INSERT INTO RylBillingDB_Log.dbo.TblCurrentUser_Log (strClientID,UID,intCRMIndex,strIp,strBillingType,tinyServerID,FirstLoginTime,LoginTime,LogoutTime,intPlayTime)
VALUES (@ClientID,@UID,@CRMIndex,@strIp,@BillingType,@tinyServerID,@FirstLoginTime,@DateLoginTime,GETDATE(),0)
RETURN
END
GO
-- 서버쪽에서 1분마다 관련 프로시져를 돌린다.
-- 1. 피시방 아이피 변경 : Command : ET,ED
-- 2. 피시방 해지가 왔을때 : Command : BB
-- 3. 피사방 재배치 관련 : Command : FF
CREATE PROC USPGRoomCurrent_DisConn @ClientID VARCHAR(20)
AS
SET NOCOUNT ON
DECLARE @UID INT
DECLARE @CRMIndex INT
DECLARE @strIp VARCHAR(15)
DECLARE @BillingType CHAR(1)
DECLARE @tinyServerID TINYINT
DECLARE @DateLoginTime SMALLDATETIME
DECLARE @FirstLoginTime SMALLDATETIME
SET @UID = -1
SELECT @UID = UID,@CRMIndex = intCRMIndex,@strIp = strIp,@BillingType = strBillingType,
@tinyServerID = tinyServerID,@DateLoginTime = DateLoginTime,@FirstLoginTime = FirstLoginTime
FROM TblCurrentUser
WHERE strClientid = @ClientID
-- 유저가 존재한다고 하면
IF (@UID > 0 )
BEGIN
-- 해지되는 피시방의 유저일경우
IF EXISTS (SELECT strClientID FROM TblCurrentUser_DISCONN WHERE strClientID = @ClientID AND strCommand = 'BB')
BEGIN
--DELETE TblCurrentUser
--WHERE strClientid = @ClientID
-- 게임방 코드를 구한다.
DECLARE @CRMCode VARCHAR(20)
SELECT @CRMCode = strCRMCode FROM TblPCRoomBillingInfo WHERE intCRMIndex = @CRMIndex
IF @BillingType = 'T'
BEGIN
EXEC USPCheckBilling_LogOut_PCTime 'Y',@CRMIndex,@CRMCode,0,@ClientID
END
ELSE IF @BillingType ='D'-- 게임방 정액제인 경우
BEGIN
EXEC USPCheckBilling_LogOut_PCDate 'Y',@CRMIndex,@CRMCode,0,@ClientID
END
-- 로그를 남긴다.
INSERT INTO RylBillingDB_LOG.DBO.TblCurrentUser_Log (strClientID,UID,intCRMIndex,strIp,strBillingType,tinyServerID,FirstLoginTime,LoginTime,LogoutTime,intPlayTime)
VALUES (@ClientID,@UID,@CRMIndex,@strIp,@BillingType,@tinyServerID,@FirstLoginTime,@DateLoginTime,GETDATE(),0)
DELETE TblCurrentUser_DISCONN
WHERE strClientID = @ClientID
RETURN
END
-- 재배치가 일어나는 경우 (정액제 피시방일때만 기록에 남는다)
ELSE IF EXISTS (SELECT strClientID FROM TblCurrentUser_DISCONN WHERE strClientID = @ClientID AND strCommand = 'FF')
BEGIN
DELETE TblCurrentUser
WHERE strClientid = @ClientID
-- 로그를 남긴다.
INSERT INTO RylBillingDB_LOG.DBO.TblCurrentUser_Log (strClientID,UID,intCRMIndex,strIp,strBillingType,tinyServerID,FirstLoginTime,LoginTime,LogoutTime,intPlayTime)
VALUES (@ClientID,@UID,@CRMIndex,@strIp,@BillingType,@tinyServerID,@FirstLoginTime,@DateLoginTime,GETDATE(),0)
DELETE TblCurrentUser_DISCONN
WHERE strClientID = @ClientID
RETURN
END
-- 정량제 아이피가 변경되는 경우
ELSE IF EXISTS (SELECT strClientID FROM TblCurrentUser_DISCONN WHERE strClientID = @ClientID AND strCommand = 'ET')
BEGIN
DELETE TblCurrentUser
WHERE strClientid = @ClientID
-- 로그를 남긴다.
INSERT INTO RylBillingDB_LOG.DBO.TblCurrentUser_Log (strClientID,UID,intCRMIndex,strIp,strBillingType,tinyServerID,FirstLoginTime,LoginTime,LogoutTime,intPlayTime)
VALUES (@ClientID,@UID,@CRMIndex,@strIp,@BillingType,@tinyServerID,@FirstLoginTime,@DateLoginTime,GETDATE(),0)
DELETE TblCurrentUser_DISCONN
WHERE strClientID = @ClientID
RETURN
END
-- 정액제 아이피가 변경되는 경우
ELSE IF EXISTS (SELECT strClientID FROM TblCurrentUser_DISCONN WHERE strClientID = @ClientID AND strCommand = 'ED')
BEGIN
-- 게임방 코드를 구한다.
SELECT @CRMCode = strCRMCode FROM TblPCRoomBillingInfo WHERE intCRMIndex = @CRMIndex
IF @BillingType = 'D'
BEGIN
EXEC USPCheckBilling_LogOut_PCDate 'Y',@CRMIndex,@CRMCode,0,@ClientID
END
-- 로그를 남긴다.
INSERT INTO RylBillingDB_LOG.DBO.TblCurrentUser_Log (strClientID,UID,intCRMIndex,strIp,strBillingType,tinyServerID,FirstLoginTime,LoginTime,LogoutTime,intPlayTime)
VALUES (@ClientID,@UID,@CRMIndex,@strIp,@BillingType,@tinyServerID,@FirstLoginTime,@DateLoginTime,GETDATE(),0)
DELETE TblCurrentUser_DISCONN
WHERE strClientID = @ClientID
RETURN
END
END
GO
CREATE PROC USPInsertPerson @strClientid VARCHAR(20),@UID INT
AS
SET NOCOUNT ON
IF NOT EXISTS (SELECT strClientid FROM TblPersonInfo WHERE UID = @UID)
BEGIN
INSERT INTO TblPersonInfo (UID,strClientid,RegLoginTime,LastLogOutTime)
VALUES (@UID,@strClientid,GETDATE()+7,GETDATE())
END
GO
CREATE PROC USPSelectServerID @strClientid VARCHAR(20)
AS
SET NOCOUNT ON
SELECT tinyServerid FROM TblCurrentUser WHERE strClientid = @strClientid
GO
-- 해당 서버 시작 및 종료 시 로그인 데이터 삭제하기.
CREATE PROC USPServer_End @ServerID Tinyint
AS
SET NOCOUNT ON
DELETE TblCurrentUser_Temp
WHERE tinyServerID = @ServerID
DELETE TblCurrentUser
WHERE tinyServerID = @ServerID
SELECT 0 AS SUCCESS
GO
-- 해당 서버 시작 및 종료 시 로그인 데이터 삭제하기.
CREATE PROC USPServer_Start @ServerID Tinyint
AS
SET NOCOUNT ON
DELETE TblCurrentUser_Temp
WHERE tinyServerID = @ServerID
DELETE TblCurrentUser
WHERE tinyServerID = @ServerID
SELECT 0 AS SUCCESS
GO