USP_CHARGE_AUTOAPPLY

Automatically apply charge.

Parameters

Parameter Parameter Type Mode Description
@CHARGEID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN

Definition

Copy


            CREATE procedure dbo.USP_CHARGE_AUTOAPPLY
                (
                    @CHARGEID uniqueidentifier,
                    @CHANGEAGENTID uniqueidentifier = null
                )
            as
            begin
                set nocount on;


                begin try
                  -- Get the change agent

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

                  declare @CHARGELINEITEMID uniqueidentifier
                  declare @TOTALAMOUNT money
                  declare @TOTALAPPLIEDAMOUNT money 

                  select TOP 1 @TOTALAMOUNT = TRANSACTIONAMOUNT, @CHARGELINEITEMID = ID from dbo.FINANCIALTRANSACTIONLINEITEM 
                  where FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID=@CHARGEID 
                  and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
                  and FINANCIALTRANSACTIONLINEITEM.TYPECODE=0

                  select @TOTALAMOUNT = TRANSACTIONAMOUNT from dbo.FINANCIALTRANSACTIONLINEITEM where FINANCIALTRANSACTIONLINEITEM.ID=@CHARGELINEITEMID
                  if @TOTALAMOUNT>0 
                    SET @TOTALAMOUNT = @TOTALAMOUNT - isnull((select sum(FINANCIALTRANSACTIONLINEITEM_APPLICATION.TRANSACTIONAMOUNT)
                                                                                from dbo.FINANCIALTRANSACTIONLINEITEM as FINANCIALTRANSACTIONLINEITEM_APPLICATION
                                                                                where (FINANCIALTRANSACTIONLINEITEM_APPLICATION.DELETEDON is null) and
                                                                                        (FINANCIALTRANSACTIONLINEITEM_APPLICATION.TARGETLINEITEMID = @CHARGELINEITEMID)), 0)

                  if @TOTALAMOUNT>0
                  begin
                    declare @APPLICATIONSTOAPPLY table
                    (
                        ID uniqueidentifier NULL,
                        SOURCELINEITEMID uniqueidentifier NOT NULL,
                        TARGETLINEITEMID uniqueidentifier NOT NULL,
                        AMOUNT money NOT NULL,
                        TRANDATE date NOT NULL,
                        APPLIEDAMOUNT money NOT NULL                                            
                    )

                    insert into @APPLICATIONSTOAPPLY
                    (
                        ID,
                        SOURCELINEITEMID,
                        TARGETLINEITEMID,
                        AMOUNT,
                        TRANDATE,
                        APPLIEDAMOUNT                        
                    )                  
                      select  APP.ID,                            
                            APP.SOURCELINEITEMID,
                            @CHARGELINEITEMID,
                            APP.TOTALAMOUNTREMAINING,
                            APP.DATE,
                            0                              
                      from dbo.UFN_CHARGEAPPLICATIONS(@CHARGELINEITEMID, null, 1) AS APP
                    where (APP.TOTALAMOUNTREMAINING>0 and not APP.TOTALAMOUNTREMAINING is null);

                    update APP set ID=newid() from @APPLICATIONSTOAPPLY APP where ID is null

                    set @TOTALAPPLIEDAMOUNT=0

                    declare @ROWID uniqueidentifier;
                    declare @ROWAMOUNT money

                    --Apply oldest one first

                    declare APPLY cursor forward_only read_only for select ID, AMOUNT
                    from @APPLICATIONSTOAPPLY      
                    order by TRANDATE asc;

                    open APPLY;
                    fetch next from APPLY into @ROWID, @ROWAMOUNT;

                    while (@@fetch_status = 0 and @TOTALAPPLIEDAMOUNT<@TOTALAMOUNT)
                    begin

                          if @TOTALAPPLIEDAMOUNT + @ROWAMOUNT < @TOTALAMOUNT                          
                          begin
                            update @APPLICATIONSTOAPPLY 
                            set APPLIEDAMOUNT = @ROWAMOUNT 
                            where ID = @ROWID;

                            set @TOTALAPPLIEDAMOUNT =@TOTALAPPLIEDAMOUNT  + @ROWAMOUNT
                          end
                          else
                          begin
                            update @APPLICATIONSTOAPPLY 
                            set APPLIEDAMOUNT = @TOTALAMOUNT-@TOTALAPPLIEDAMOUNT 
                            where ID = @ROWID;

                            set @TOTALAPPLIEDAMOUNT = @TOTALAMOUNT
                          end                            
                          fetch next from APPLY into @RowID, @ROWAMOUNT;
                    end;
                    close APPLY;
                    deallocate APPLY;


                    declare @APPLICATIONSXML xml;

                    --TODO: Postdate and poststatus will need to be changed to the lineitems poststatus/postdate

                    set @APPLICATIONSXML = 
                        (select APPLICATIONSTOAPPLY.ID,
                                APPLICATIONSTOAPPLY.SOURCELINEITEMID,
                                APPLICATIONSTOAPPLY.TARGETLINEITEMID,
                                APPLICATIONSTOAPPLY.APPLIEDAMOUNT AS AMOUNT,
                                GETDATE() AS POSTDATE,
                                1 AS POSTSTATUSCODE
                        from @APPLICATIONSTOAPPLY as APPLICATIONSTOAPPLY 
                        where APPLICATIONSTOAPPLY.APPLIEDAMOUNT > 0
                        for xml raw('ITEM'),type,elements,root('APPLICATIONS'),BINARY BASE64);

                -- Apply the items

                exec dbo.USP_FINANCIALTRANSACTION_LINEITEMAPPLICATIONS_APPLYMULTIPLE @APPLICATIONSXML, @CHANGEAGENTID;

              end
              end try

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

                return 0;

            end