USP_DATAFORMTEMPLATE_EDIT_RECONCILIATIONCLOSESHIFT2

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@ACTUALCASH money IN
@COMMENT nvarchar(max) IN
@WORKSTATIONID uniqueidentifier IN
@CASHDENOMINATIONS xml IN
@COINDENOMINATIONS xml IN
@CHECKNUM int IN
@CHECKTOTAL money IN
@STATUSCODE tinyint IN
@CURRENTAPPUSERID uniqueidentifier IN

Definition

Copy

CREATE procedure dbo.USP_DATAFORMTEMPLATE_EDIT_RECONCILIATIONCLOSESHIFT2 (
    @ID uniqueidentifier,
    @CHANGEAGENTID uniqueidentifier = null,
    @ACTUALCASH money,
    @COMMENT nvarchar(max),
    @WORKSTATIONID uniqueidentifier,
    @CASHDENOMINATIONS xml,
    @COINDENOMINATIONS xml,
    @CHECKNUM int,
    @CHECKTOTAL money,
    @STATUSCODE tinyint,
    @CURRENTAPPUSERID uniqueidentifier
)
as
    set nocount on;

    declare @APPUSERID uniqueidentifier;
    select @APPUSERID = APPUSERID from dbo.RECONCILIATION where ID = @ID;
    declare @CLOSEDRAWERCONFIGURATIONOPTIONCODE tinyint
    select @CLOSEDRAWERCONFIGURATIONOPTIONCODE = CONFIGURATIONOPTIONCODE from dbo.CLOSEDRAWERCONFIGURATION;

    if @CLOSEDRAWERCONFIGURATIONOPTIONCODE = 0
        set @CURRENTAPPUSERID = @APPUSERID;

    if @CHANGEAGENTID is null  
        exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output

    declare @CURRENTDATE datetime = getdate();
    declare @CLIENTDATETIME datetime = dbo.UFN_TIMEZONEENTRY_GETSYSTEMDEFAULTDATEWITHTIMEOFFSET(getutcdate(), 1);

    begin try
        -- Check if there are pending orders with application user
        if exists (
            select SALESORDERPAYMENT.ID 
            from dbo.SALESORDERPAYMENT
            inner join dbo.SALESORDER 
                on SALESORDERPAYMENT.SALESORDERID = SALESORDER.ID
            where 
                SALESORDERPAYMENT.RECONCILIATIONID is null 
                and SALESORDER.STATUSCODE <> 1
                and SALESORDERPAYMENT.APPUSERID = @APPUSERID
                and SALESORDER.SALESMETHODTYPECODE <> 3
        )
        begin
            raiserror('ERR_RECONCILIATION_PENDINGORDEREXISTS', 13, 1);
        end

        -- update SALESORDERPAYMENT table
        declare @OLDSTATUSCODE tinyint
        declare @OLDSUBMITTEDDATE datetime
        declare @CASHSALESMETHODCODE tinyint;
        declare @CHECKSALESMETHODCODE tinyint;

        select @OLDSTATUSCODE = STATUSCODE
            ,@OLDSUBMITTEDDATE = ORIGINALSUBMISSIONDATE
            ,@CASHSALESMETHODCODE = CASHOVERSHORTSALESMETHODCODE
            ,@CHECKSALESMETHODCODE = CHECKOVERSHORTSALESMETHODCODE
        from dbo.RECONCILIATION 
        where ID = @ID ;

        -- update RECONCILIATION table
        update dbo.[RECONCILIATION] 
        set
            [ACTUALCASH] = @ACTUALCASH,
            [COMMENT] = @COMMENT,
            [STATUSCODE] = @STATUSCODE,
            [ORIGINALSUBMISSIONDATE] = case when @OLDSTATUSCODE = 0 and @STATUSCODE = 1 then @CLIENTDATETIME else @OLDSUBMITTEDDATE end,
            [RECONCILIATIONDATE] = @CLIENTDATETIME,
            [CHANGEDBYID] = @CHANGEAGENTID,
            [DATECHANGED] = @CURRENTDATE,
            [APPUSERID] = @CURRENTAPPUSERID
        where [ID] = @ID;

        -- only update SALESORDERPAYMENT table when
        -- current reconciliation is open
        if @OLDSTATUSCODE = 0 begin
            update dbo.SALESORDERPAYMENT with (rowlock)
            set
                RECONCILIATIONID = @ID,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @CURRENTDATE
            from dbo.[SALESORDERPAYMENT]
            where 
                SALESORDERPAYMENT.RECONCILIATIONID is null and
                SALESORDERPAYMENT.DONOTRECONCILE = 0 and
                (@CLOSEDRAWERCONFIGURATIONOPTIONCODE = 2 or SALESORDERPAYMENT.APPUSERID = @APPUSERID)

            -- update reservation security deposit payment table
            update dbo.RESERVATIONSECURITYDEPOSITPAYMENT with (rowlock)
            set
                RECONCILIATIONID = @ID,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @CURRENTDATE
            from dbo.[RESERVATIONSECURITYDEPOSITPAYMENT]
            inner join dbo.[SALESORDER]
                on [RESERVATIONSECURITYDEPOSITPAYMENT].[RESERVATIONID] = [SALESORDER].[ID]
            where 
                RESERVATIONSECURITYDEPOSITPAYMENT.RECONCILIATIONID is null
                and (@CLOSEDRAWERCONFIGURATIONOPTIONCODE = 2 or RESERVATIONSECURITYDEPOSITPAYMENT.APPUSERID = @APPUSERID)
                and [SALESORDER].[SALESMETHODTYPECODE] <> 2;


            update dbo.[CREDITPAYMENT]
            set
                [RECONCILIATIONID] = @ID,
                [CHANGEDBYID] = @CHANGEAGENTID,
                [DATECHANGED] = @CURRENTDATE
            where 
                [CREDITPAYMENT].[RECONCILIATIONID] is null and 
                (@CLOSEDRAWERCONFIGURATIONOPTIONCODE = 2 or [CREDITPAYMENT].[APPUSERID] = @APPUSERID) and
                [CREDITPAYMENT].[REFUNDPROCESSED] = 1 and
                [CREDITPAYMENT].CREDITID not in (
                    select FT.ID
                    from dbo.FINANCIALTRANSACTION as FT
                    inner join dbo.CREDIT_EXT as EXT on EXT.ID = FT.ID
                    left outer join dbo.SALESORDER on SALESORDER.REVENUEID = FT.PARENTID
                    where SALESORDER.ID is null and EXT.SALESORDERID is null
                );
        end

        -- Do not get the sale method code if it is not the default
        if @CASHSALESMETHODCODE = 0
            select @CASHSALESMETHODCODE = isnull(MIN(T.SALESMETHODTYPECODE), @CASHSALESMETHODCODE)
            from (
                select SO.SALESMETHODTYPECODE
                from dbo.SALESORDERPAYMENT P 
                inner join dbo.REVENUEPAYMENTMETHOD PM on PM.REVENUEID = P.PAYMENTID
                inner join dbo.SALESORDER SO on SO.ID = P.SALESORDERID
                where P.RECONCILIATIONID = @ID and PM.PAYMENTMETHODCODE = 0
                union all
                select SO.SALESMETHODTYPECODE
                from dbo.RESERVATIONSECURITYDEPOSITPAYMENT P
                inner join dbo.REVENUEPAYMENTMETHOD PM on PM.REVENUEID = P.PAYMENTID
                inner join dbo.SALESORDER SO on SO.ID = P.RESERVATIONID
                where P.RECONCILIATIONID = @ID and PM.PAYMENTMETHODCODE = 0
                union all
                select isnull(CHILDSALESORDER.SALESMETHODTYPECODE, SALESORDER.SALESMETHODTYPECODE)
                from dbo.CREDITPAYMENT P
                inner join dbo.FINANCIALTRANSACTION as FT on FT.ID = P.CREDITID
                inner join dbo.CREDIT_EXT as EXT on EXT.ID = FT.ID
                left outer join dbo.SALESORDER as CHILDSALESORDER on CHILDSALESORDER.REVENUEID = FT.PARENTID
                left outer join dbo.SALESORDER on SALESORDER.ID = EXT.SALESORDERID
                where P.RECONCILIATIONID = @ID and P.PAYMENTMETHODCODE = 0
                and (CHILDSALESORDER.ID is not null or EXT.SALESORDERID is not null)
            ) T

        -- Do not get the sale method code if it is not the default
        if @CHECKSALESMETHODCODE = 3
            select @CHECKSALESMETHODCODE = isnull(MAX(T.SALESMETHODTYPECODE), @CHECKSALESMETHODCODE)
            from (
                select SO.SALESMETHODTYPECODE
                from dbo.SALESORDERPAYMENT P 
                inner join dbo.REVENUEPAYMENTMETHOD PM on PM.REVENUEID = P.PAYMENTID
                inner join dbo.SALESORDER SO on SO.ID = P.SALESORDERID
                where P.RECONCILIATIONID = @ID and PM.PAYMENTMETHODCODE = 1
                union all
                select SO.SALESMETHODTYPECODE
                from dbo.RESERVATIONSECURITYDEPOSITPAYMENT P
                inner join dbo.REVENUEPAYMENTMETHOD PM on PM.REVENUEID = P.PAYMENTID
                inner join dbo.SALESORDER SO on SO.ID = P.RESERVATIONID
                where P.RECONCILIATIONID = @ID and PM.PAYMENTMETHODCODE = 1
                union all
                select isnull(CHILDSALESORDER.SALESMETHODTYPECODE, SALESORDER.SALESMETHODTYPECODE)
                from dbo.CREDITPAYMENT P
                inner join dbo.FINANCIALTRANSACTION as FT on FT.ID = P.CREDITID
                inner join dbo.CREDIT_EXT as EXT on EXT.ID = FT.ID
                left outer join dbo.SALESORDER as CHILDSALESORDER on CHILDSALESORDER.REVENUEID = FT.PARENTID
                left outer join dbo.SALESORDER on SALESORDER.ID = EXT.SALESORDERID
                where P.RECONCILIATIONID = @ID and P.PAYMENTMETHODCODE = 1
                and (CHILDSALESORDER.ID is not null or EXT.SALESORDERID is not null)
            ) T

        update dbo.[RECONCILIATION] 
        set
            [CASHOVERSHORTSALESMETHODCODE] = @CASHSALESMETHODCODE,
            [CHECKOVERSHORTSALESMETHODCODE] = @CHECKSALESMETHODCODE,
            [CHANGEDBYID] = @CHANGEAGENTID,
            [DATECHANGED] = @CURRENTDATE
        where [ID] = @ID;

        declare @TempDenom table(
            ID uniqueidentifier default null,
            DENOMINATIONID uniqueidentifier,
            NAME nvarchar(50),
            QUANTITY int,
            VALUE money);

        insert into @TempDenom
        select
            ID,
            DENOMINATIONID,
            NAME,
            QUANTITY,
            VALUE
        from dbo.UFN_CLOSEDRAWER_GETDENOMINATIONS_FROMITEMLISTXML(@CASHDENOMINATIONS)

        insert into @TempDenom
        select
            ID,
            DENOMINATIONID,
            NAME,
            QUANTITY,
            VALUE
        from dbo.UFN_CLOSEDRAWER_GETDENOMINATIONS_FROMITEMLISTXML(@COINDENOMINATIONS)

        -- update CLOSEDRAWERDENOMINATION table
        merge CLOSEDRAWERDENOMINATION as target
        using @TempDenom as source
        on (target.ID = source.ID)
        when matched then
            update set
                target.QUANTITY = source.QUANTITY,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @CURRENTDATE
        when not matched and source.QUANTITY > 0 then
            insert(
                RECONCILIATIONID,
                CURRENCYDENOMINATIONID,
                QUANTITY,
                ADDEDBYID,
                CHANGEDBYID,
                DATEADDED,
                DATECHANGED
            )
            values (
                @ID,
                source.DENOMINATIONID,
                source.QUANTITY,
                @CHANGEAGENTID,
                @CHANGEAGENTID,
                @CURRENTDATE,
                @CURRENTDATE
            );

        -- update RECONCILIATIONDETAIL table

        -- build a temporary table containing the values from the XML
        declare @TempTbl table (
            ID uniqueidentifier default null,
            PAYMENTMETHODCODE int,
            CREDITTYPECODEID uniqueidentifier,
            OTHERPAYMENTMETHODCODEID uniqueidentifier,
            ISREFUND bit,
            AMOUNT money,
            EXPECTED int
        );

        if exists (select ID from dbo.CLOSEDRAWERCONFIGURATION where CONFIGURATIONOPTIONCODE != 0)
            set @APPUSERID = null;

        insert into @TempTbl 
        select 
            [ID],
            [PAYMENTMETHODCODE], 
            [CREDITTYPECODEID],
            [OTHERPAYMENTMETHODCODEID],
            [ISREFUND],
            [TOTALAMOUNT],
            [EXPECTED]
        from dbo.UFN_RECONCILIATION_GETOTHERRECEIPTS(@ID, @APPUSERID )
        where 
            EXPECTED <> 0 and ISLABEL = 0

        update @TempTbl set ID = newid() where (ID is null) or (ID = '00000000-0000-0000-0000-000000000000');
        update @TempTbl set CREDITTYPECODEID = null where CREDITTYPECODEID = '00000000-0000-0000-0000-000000000000';
        update @TempTbl set OTHERPAYMENTMETHODCODEID = null where OTHERPAYMENTMETHODCODEID = '00000000-0000-0000-0000-000000000000';

        if @@Error <> 0
            return 1;

        -- update the items that exist in the XML table and the db
        update dbo.[RECONCILIATIONDETAIL]
        set [RECONCILIATIONDETAIL].[QUANTITY]= [temp].EXPECTED,
            [RECONCILIATIONDETAIL].[AMOUNT] = [temp].AMOUNT,
            [RECONCILIATIONDETAIL].CHANGEDBYID = @CHANGEAGENTID,
            [RECONCILIATIONDETAIL].DATECHANGED = @CURRENTDATE 
        from @TempTbl as [temp]
        where 
            [temp].ID = [RECONCILIATIONDETAIL].ID and
            (
                ([RECONCILIATIONDETAIL].[QUANTITY] <> [temp].[EXPECTED]) or 
                ([RECONCILIATIONDETAIL].[QUANTITY] is null and [temp].[EXPECTED] is not null) or 
                ([RECONCILIATIONDETAIL].[QUANTITY] is not null and [temp].[EXPECTED] is null
            ) and
            [temp].[ISREFUND] = 0 and temp.PAYMENTMETHODCODE != 1;

        --Update refund
        update dbo.[RECONCILIATIONCREDITDETAIL]
        set 
            [RECONCILIATIONCREDITDETAIL].[QUANTITY]= [temp].EXPECTED,
            [RECONCILIATIONCREDITDETAIL].CHANGEDBYID = @CHANGEAGENTID,
            [RECONCILIATIONCREDITDETAIL].DATECHANGED = @CURRENTDATE 
        from @TempTbl as [temp]
        where [temp].ID = [RECONCILIATIONCREDITDETAIL].ID
            and [temp].[ISREFUND] = 1;

        if @@Error <> 0
            return 3;    

        -- insert new items
        insert into [RECONCILIATIONDETAIL] (
            [ID],
            [RECONCILIATIONID],
            [PAYMENTMETHODCODE],
            [QUANTITY],
            [AMOUNT],
            [CREDITTYPECODEID],
            [OTHERPAYMENTMETHODCODEID],
            [ADDEDBYID], 
            [CHANGEDBYID], 
            [DATEADDED], 
            [DATECHANGED]
        )
        select [ID],
            @ID
            [PAYMENTMETHODCODE],
            [EXPECTED],
            [AMOUNT],
            [CREDITTYPECODEID],
            [OTHERPAYMENTMETHODCODEID],
            @CHANGEAGENTID
            @CHANGEAGENTID
            @CURRENTDATE
            @CURRENTDATE
        from @TempTbl as [temp]
        where 
            not exists (select ID from dbo.[RECONCILIATIONDETAIL] as data where data.ID = [temp].ID) and
            [temp].[ISREFUND] = 0

        --Insert refund
        if @ID in (select [ID] from @TempTbl where [ISREFUND] = 1) and not exists (select [ID] from dbo.[RECONCILIATIONCREDITDETAIL] where [ID] = @ID)
            insert into [RECONCILIATIONCREDITDETAIL] (
                [ID],
                [QUANTITY],
                [ADDEDBYID], 
                [CHANGEDBYID], 
                [DATEADDED], 
                [DATECHANGED]
            )
            select 
                [ID],
                [EXPECTED],
                @CHANGEAGENTID
                @CHANGEAGENTID
                @CURRENTDATE
                @CURRENTDATE
            from @TempTbl as [temp]
            where 
                [temp].[ID] = @ID and 
                [temp].[ISREFUND] = 1

        if exists(select 1 from dbo.RECONCILIATIONDETAIL where RECONCILIATIONID = @ID and PAYMENTMETHODCODE = 1)
            update dbo.RECONCILIATIONDETAIL set
                QUANTITY = @CHECKNUM,
                AMOUNT = @CHECKTOTAL,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @CURRENTDATE
            where RECONCILIATIONID = @ID and PAYMENTMETHODCODE = 1
        else
            insert into dbo.RECONCILIATIONDETAIL(
                RECONCILIATIONID,
                PAYMENTMETHODCODE,
                QUANTITY,
                AMOUNT,
                ADDEDBYID,
                CHANGEDBYID,
                DATEADDED,
                DATECHANGED
            )
            values (
                @ID,
                1,
                @CHECKNUM,
                @CHECKTOTAL,
                @CHANGEAGENTID,
                @CHANGEAGENTID,
                @CURRENTDATE,
                @CURRENTDATE
            );

        if @@Error <> 0
            return 4;

    end try
    begin catch
        exec dbo.USP_RAISE_ERROR
        return 1
    end catch

    return 0;