USP_DATAFORMTEMPLATE_ADD_RESERVATION

The save procedure used by the add dataform template "Reservation Add Data Form".

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier INOUT The output parameter indicating the ID of the record added.
@CHANGEAGENTID uniqueidentifier IN Input parameter indicating the ID of the change agent invoking the procedure.
@CURRENTAPPUSERID uniqueidentifier IN Input parameter indicating the ID of the current user.
@CONSTITUENTID uniqueidentifier IN Patron
@NAME nvarchar(100) IN Reservation name
@CONTACTRELATIONSHIPID uniqueidentifier IN Contact
@ARRIVALDATE date IN Date of visit
@COMMENTS nvarchar(1000) IN Comments
@ATTENDEES xml IN Visitors
@DEPOSITTYPECODE tinyint IN
@DEPOSITREQUIRED bit IN Reservation deposit required
@DEPOSITDUEDATE date IN Reservation deposit due
@FINALDUEDATE date IN Order balance due
@DEPOSITAMOUNT money IN Reservation deposit amount
@EXCEEDCAPACITY bit IN Exceed capacity available
@CONTRACTREQUIRED bit IN Contract required
@CONTRACTDUEDATE date IN Contract due
@FINALCOUNTREQUIRED bit IN Final count required
@FINALCOUNTDUEDATE date IN Final count due
@PRICINGCODE tinyint IN Pricing structure
@RATESCALEID uniqueidentifier IN Flat rate scale
@GROUPSALESGROUPTYPECODEID uniqueidentifier IN Group type
@ARRIVALTIME UDT_HOURMINUTE IN Arrival time
@DEPARTURETIME UDT_HOURMINUTE IN Departure time
@QUICKITINERARYPROGRAMEVENTID uniqueidentifier IN Quick itinerary
@QUICKITINERARYTYPECODE tinyint IN
@IGNORECONFLICTS bit IN Ignore group type resource conflicts
@SECURITYDEPOSITTYPECODE tinyint IN
@SECURITYDEPOSITREQUIRED bit IN Security deposit required
@SECURITYDEPOSITDUEDATE date IN Security deposit due
@SECURITYDEPOSITAMOUNT money IN Security deposit amount
@SECURITYDEPOSITPERCENT decimal(5, 2) IN Security deposit amount

Definition

Copy

CREATE procedure dbo.USP_DATAFORMTEMPLATE_ADD_RESERVATION
(
    @ID uniqueidentifier = null output,
    @CHANGEAGENTID uniqueidentifier = null,
    @CURRENTAPPUSERID uniqueidentifier,
    @CONSTITUENTID uniqueidentifier = null,
    @NAME nvarchar(100) = null,
    @CONTACTRELATIONSHIPID uniqueidentifier = null,
    @ARRIVALDATE date = null,
    @COMMENTS nvarchar(1000) = '',
    @ATTENDEES xml = null,
    @DEPOSITTYPECODE tinyint = 0,
    @DEPOSITREQUIRED bit = 0,
    @DEPOSITDUEDATE date = null,
    @FINALDUEDATE date = null,
    @DEPOSITAMOUNT money = 0.00,
    @EXCEEDCAPACITY bit = 0,
    @CONTRACTREQUIRED bit = 0,
    @CONTRACTDUEDATE date = null,
    @FINALCOUNTREQUIRED bit = 0,
    @FINALCOUNTDUEDATE date = null,
    @PRICINGCODE tinyint = 0,
    @RATESCALEID uniqueidentifier = null,
    @GROUPSALESGROUPTYPECODEID uniqueidentifier = null,
    @ARRIVALTIME dbo.UDT_HOURMINUTE = '',
    @DEPARTURETIME dbo.UDT_HOURMINUTE = '',
    @QUICKITINERARYPROGRAMEVENTID uniqueidentifier = null,
    @QUICKITINERARYTYPECODE tinyint = 3,
    @IGNORECONFLICTS bit = 0,
    @SECURITYDEPOSITTYPECODE tinyint = 0,
    @SECURITYDEPOSITREQUIRED bit = 0,
    @SECURITYDEPOSITDUEDATE date = null,
    @SECURITYDEPOSITAMOUNT money = 0.00,
    @SECURITYDEPOSITPERCENT decimal(5,2) = null
)
as
    set nocount on;

    if @ID is null
        set @ID = newid();

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

    declare @CURRENTDATE datetime;
    set @CURRENTDATE = getdate();

    declare @CREATEITINERARY bit = 0;

    begin try
        -- Validate flat rate scale
        if @PRICINGCODE = 0
            set @RATESCALEID = null;
        else if @RATESCALEID is null
            raiserror('ERR_RATESCALEIDREQUIRED', 13, 1);

        declare @ATTENDEESTABLE table (
            ID uniqueidentifier,
            PRICETYPECODEID uniqueidentifier,
            QUANTITY smallint,
            SEQUENCE int
        );

        insert into @ATTENDEESTABLE (
            ID,
            PRICETYPECODEID,
            QUANTITY,
            SEQUENCE
        )
        select
            ID,
            PRICETYPECODEID,
            QUANTITY,
            SEQUENCE
        from
            dbo.UFN_ITINERARY_GETATTENDEES_FROMITEMLISTXML(@ATTENDEES);

        if @@rowcount > 0 begin
            set @CREATEITINERARY = 1;

            update @ATTENDEESTABLE
            set ID = newid()
            where ID is null or ID = '00000000-0000-0000-0000-000000000000';
        end

        -- Validate that the attendee count is not greater than the capacity available
        if (@CREATEITINERARY = 1 and @EXCEEDCAPACITY = 0)
        begin
            declare @MAXIMUMCAPACITY int;
            select @MAXIMUMCAPACITY = MAXIMUMCAPACITY
            from dbo.GROUPSALESDEFAULT

            if (@MAXIMUMCAPACITY > 0)
            begin            
                if ((select sum(QUANTITY) from @ATTENDEESTABLE) > dbo.UFN_GROUPSALESCAPACITY_CAPACITYREMAINING(@ARRIVALDATE, null))
                    raiserror('ERR_EXCEEDSCAPACITY', 13, 1);
            end
        end              

        -- Validation for deposit amount
        if @DEPOSITREQUIRED = 1 and @DEPOSITAMOUNT <= 0.00 and @DEPOSITTYPECODE = 0
        begin
            raiserror('ERR_DEPOSITAMOUNT', 13, 1);
        end

        if @DEPOSITREQUIRED = 0
        begin
            set @DEPOSITDUEDATE = null
            set @DEPOSITAMOUNT = 0.0
        end

        -- Validation for security deposit amount
        if @SECURITYDEPOSITREQUIRED = 1 and @SECURITYDEPOSITAMOUNT <= 0.00 and @SECURITYDEPOSITTYPECODE = 0
        begin
            raiserror('ERR_SECURITYDEPOSITAMOUNT', 13, 1);
        end

        if @SECURITYDEPOSITREQUIRED = 0
        begin
            set @SECURITYDEPOSITDUEDATE = null
            set @SECURITYDEPOSITAMOUNT = 0.0
        end

        declare @CONTACTID uniqueidentifier;
        declare @ADDRESSID uniqueidentifier;
        declare @EMAILADDRESSID uniqueidentifier;
        declare @PHONEID uniqueidentifier;

        exec dbo.USP_RESERVATION_GETCONTACTINFO @CONSTITUENTID, @CONTACTRELATIONSHIPID,
            @CONTACTID output, @ADDRESSID output, @EMAILADDRESSID output, @PHONEID output;

        -- Validate active constituents
        exec dbo.USP_CONSTITUENT_CHECKINACTIVEANDDECEASED @CONSTITUENTID;

        if @CONTACTID <> @CONSTITUENTID
            exec dbo.USP_CONSTITUENT_CHECKINACTIVEANDDECEASED @CONTACTID, 'BBERR_CONTACTISINACTIVE', 'BBERR_CONTACTISDECEASED';

        -- Blank out CONTRACTDUEDATE, FINALCOUNTDUEDATE
        if @CONTRACTREQUIRED = 0
            set @CONTRACTDUEDATE = null;

        if @FINALCOUNTREQUIRED = 0
            set @FINALCOUNTDUEDATE = null;

        insert into dbo.SALESORDER
        (
            ID,
            APPUSERID,
            SALESMETHODTYPECODE,
            CONSTITUENTID,
            CONTACTRELATIONSHIPID,
            COMMENTS,
            RECIPIENTID,
            ADDRESSID,
            PHONEID,
            EMAILADDRESSID,
            ADDEDBYID,
            CHANGEDBYID,
            DATEADDED,
            DATECHANGED
        )
        values
        (
            @ID,
            @CURRENTAPPUSERID,
            3, -- Group Sales
            @CONSTITUENTID,
            @CONTACTRELATIONSHIPID,
            @COMMENTS,
            @CONTACTID,
            @ADDRESSID,
            @PHONEID,
            @EMAILADDRESSID,
            @CHANGEAGENTID,
            @CHANGEAGENTID,
            @CURRENTDATE,
            @CURRENTDATE
        );

        insert into dbo.RESERVATION
        (
            ID,
            NAME,
            ARRIVALDATE,
            DEPOSITREQUIRED,
            DEPOSITAMOUNT,
            DEPOSITDUEDATE,
            SECURITYDEPOSITREQUIRED,
            SECURITYDEPOSITAMOUNT,
            SECURITYDEPOSITDUEDATE,
            FINALDUEDATE,
            CONTRACTREQUIRED,
            CONTRACTDUEDATE,
            FINALCOUNTREQUIRED,
            FINALCOUNTDUEDATE,
            PRICINGCODE,
            ARRIVALTIME,
            ADDEDBYID,
            CHANGEDBYID,
            DATEADDED,
            DATECHANGED
        )
        values
        (
            @ID,
            @NAME,
            @ARRIVALDATE,
            @DEPOSITREQUIRED,
            @DEPOSITAMOUNT,
            @DEPOSITDUEDATE,
            @SECURITYDEPOSITREQUIRED,
            @SECURITYDEPOSITAMOUNT,
            @SECURITYDEPOSITDUEDATE,
            @FINALDUEDATE,
            @CONTRACTREQUIRED,
            @CONTRACTDUEDATE,
            @FINALCOUNTREQUIRED,
            @FINALCOUNTDUEDATE,
            @PRICINGCODE,
            @ARRIVALTIME,
            @CHANGEAGENTID,
            @CHANGEAGENTID,
            @CURRENTDATE,
            @CURRENTDATE
        );

        exec dbo.[USP_RESERVATIONSTATUSHISTORY_ADD] @ID, @CHANGEAGENTID, 0

        declare @ITINERARYID uniqueidentifier;

        if @CREATEITINERARY = 1
        begin
            declare @ITINERARYNAME nvarchar(154);
            set @CONTACTID = isnull(@CONTACTID, @CONSTITUENTID)

            select @ITINERARYNAME = NAME from dbo.UFN_CONSTITUENT_DISPLAYNAME(@CONTACTID)    

            set @ITINERARYID = newid();

            insert into dbo.ITINERARY
            (
                ID,
                RESERVATIONID,
                LEADERID,
                NAME,
                GROUPSALESGROUPTYPECODEID,
                ADDEDBYID,
                CHANGEDBYID,
                DATEADDED,
                DATECHANGED
            )
            values
            (
                @ITINERARYID,
                @ID,
                @CONTACTID,
                @ITINERARYNAME,
                @GROUPSALESGROUPTYPECODEID,
                @CHANGEAGENTID,
                @CHANGEAGENTID,
                @CURRENTDATE,
                @CURRENTDATE
            );

            insert into dbo.ITINERARYATTENDEE (
                ID,
                ITINERARYID,
                PRICETYPECODEID,
                QUANTITY,
                SEQUENCE,
                ADDEDBYID,
                CHANGEDBYID,
                DATEADDED,
                DATECHANGED
            )
            select
                ID,
                @ITINERARYID,
                PRICETYPECODEID,
                QUANTITY,
                SEQUENCE,
                @CHANGEAGENTID,
                @CHANGEAGENTID,
                @CURRENTDATE,
                @CURRENTDATE
            from
                @ATTENDEESTABLE;

            if (not @GROUPSALESGROUPTYPECODEID is null)
                exec dbo.USP_ITINERARY_LOADREQUIREDRESOURCESBYGROUPTYPE @ITINERARYID, @CHANGEAGENTID;
        end    

        if @PRICINGCODE = 1 and @RATESCALEID is not null
        begin
            exec dbo.USP_RESERVATION_UPDATERATESCALE @ID, @RATESCALEID, @CHANGEAGENTID, @CURRENTDATE;
            exec dbo.USP_RESERVATION_UPDATEFLATRATE @ID, @CHANGEAGENTID, @CURRENTDATE;
        end        

        if @CREATEITINERARY = 1
        begin
            if @QUICKITINERARYTYPECODE = 0
            begin

                -- Add scheduled event
                declare @EITEMID uniqueidentifier = newid()

                declare @EVENTSTARTTIME dbo.UDT_HOURMINUTE = '0000'
                select @EVENTSTARTTIME = EVENT.STARTTIME 
                from dbo.EVENT where ID = @QUICKITINERARYPROGRAMEVENTID

                -- Resetting ARRIVALTIME to be the start of the event time
                -- For purpose of adding event and checking for conflicts
                if @EVENTSTARTTIME > @ARRIVALTIME
                    set @ARRIVALTIME = @EVENTSTARTTIME

                exec dbo.USP_ITINERARYITEMEVENT_ADD @EITEMID, @CHANGEAGENTID, @CURRENTDATE, @ITINERARYID
                    @QUICKITINERARYPROGRAMEVENTID, @ARRIVALTIME, @DEPARTURETIME, @ARRIVALDATE, @ARRIVALDATE, 0, '', null, @IGNORECONFLICTS;
            end

            else if @QUICKITINERARYTYPECODE = 1
            begin

                -- Add daily admission program
                declare @DAITEMID uniqueidentifier = newid()
                exec dbo.USP_ITINERARYITEMDAILYADMISSION_ADD @DAITEMID, @CHANGEAGENTID, @CURRENTDATE, @ITINERARYID,
                    @QUICKITINERARYPROGRAMEVENTID, @ARRIVALDATE, @ARRIVALTIME, @DEPARTURETIME, '', null, @IGNORECONFLICTS;

            end

            else if @QUICKITINERARYTYPECODE = 2
            begin

                -- Add custom item
                declare @CUSTOMITEMID uniqueidentifier = newid()
                exec dbo.USP_ITINERARYITEMCUSTOMITEM_ADD @CUSTOMITEMID, @CHANGEAGENTID, @CURRENTDATE, @ITINERARYID
                    @NAME, @ARRIVALDATE, @ARRIVALDATE, @ARRIVALTIME, @DEPARTURETIME, '', null, 0, null, @IGNORECONFLICTS;

            end

            if @QUICKITINERARYTYPECODE <> 3 
            begin
                exec dbo.USP_ITINERARY_CHECKPERTICKETRESOURCES @ITINERARYID;

                if @IGNORECONFLICTS = 0
                begin
                    declare @RESOURCES xml
                    declare @STAFFRESOURCES xml

                    set @RESOURCES = dbo.UFN_ITINERARYRESOURCE_GETRESOURCES_TOITEMLISTXML(@ITINERARYID);

                    set @STAFFRESOURCES = dbo.UFN_ITINERARY_GETSTAFFRESOURCES_TOITEMLISTXML(@ITINERARYID);    

                    if dbo.UFN_CONFLICTCHECK_CONFLICTSEXIST
                    (
                        dbo.UFN_DATE_ADDHOURMINUTE(@ARRIVALDATE, @ARRIVALTIME), 
                        dbo.UFN_DATE_ADDHOURMINUTE(@ARRIVALDATE, @DEPARTURETIME),
                        null, @RESOURCES, @STAFFRESOURCES
                        null, @ITINERARYID,    null,
                        0,
                        1,
                        0,
                        0
                    ) = 1
                    begin
                        raiserror('BBERR_CONFLICTSEXIST', 13, 1);
                        return 1;
                    end
                end
            end
        end
        else if @QUICKITINERARYTYPECODE <> 3
        begin
            raiserror('BBERR_VISITORSREQUIRED', 13, 1);
        end                            

        -- Update deposit amounts
        declare @AMOUNTDUE money = null

        if (@SECURITYDEPOSITREQUIRED = 1 and @SECURITYDEPOSITTYPECODE = 1) or (@DEPOSITREQUIRED = 1 and @DEPOSITTYPECODE = 1) begin
            set @AMOUNTDUE = dbo.UFN_SALESORDER_TOTAL(@ID);

            declare @DEPOSITPERCENT decimal(5,2);

            select top 1 @DEPOSITPERCENT = DEPOSITPERCENT
            from dbo.GROUPSALESDEFAULT;

            update dbo.RESERVATION set
                SECURITYDEPOSITAMOUNT =
                    case
                        when @SECURITYDEPOSITREQUIRED = 1 and @SECURITYDEPOSITTYPECODE = 1 then
                            round(@AMOUNTDUE * @SECURITYDEPOSITPERCENT * .01, 2)
                        else SECURITYDEPOSITAMOUNT
                    end,
                DEPOSITAMOUNT =
                    case
                        when @DEPOSITREQUIRED = 1 and @DEPOSITTYPECODE = 1 then
                            round(@AMOUNTDUE * @DEPOSITPERCENT * .01, 2)
                        else
                            DEPOSITAMOUNT
                    end,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @CURRENTDATE
            where ID = @ID;
        end
    end try

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

    return 0;