USP_DATAFORMTEMPLATE_ADD_ASSIGNVOLUNTEERS

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

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier INOUT The output parameter indicating the ID of the record added.
@CURRENTAPPUSERID uniqueidentifier IN Input parameter indicating the ID of the current user.
@JOBOCCURRENCEID uniqueidentifier IN Input parameter indicating the context ID for the record being added.
@STARTDATE date IN Dates
@ENDDATE date IN
@VOLUNTEERS xml IN
@SINGLEDAY_EDIT bit IN
@CHANGEAGENTID uniqueidentifier IN Input parameter indicating the ID of the change agent invoking the procedure.

Definition

Copy

CREATE procedure dbo.USP_DATAFORMTEMPLATE_ADD_ASSIGNVOLUNTEERS
(
    @ID uniqueidentifier = null output,
    @CURRENTAPPUSERID uniqueidentifier,
    @JOBOCCURRENCEID uniqueidentifier,
    @STARTDATE date = null,
    @ENDDATE date = null,
    @VOLUNTEERS xml = null,
    @SINGLEDAY_EDIT bit = 0,
    @CHANGEAGENTID uniqueidentifier = null
)
as

set nocount on;

declare @ISADMIN bit;
declare @APPUSER_IN_NONRACROLE bit;
declare @APPUSER_IN_NOSECGROUPROLE bit;
declare @APPUSER_IN_NONSITEROLE bit;
declare @APPUSER_IN_NOSITEROLE bit;
declare @JOBOCCURRENCE_STARTDATE date;

declare @DATESVALID_FOR_OCCURRENCE bit = 1;

set @ISADMIN = dbo.UFN_APPUSER_ISSYSADMIN(@CURRENTAPPUSERID);
set @APPUSER_IN_NONRACROLE = dbo.UFN_SECURITY_APPUSER_IN_NONRACROLE(@CURRENTAPPUSERID);
set @APPUSER_IN_NOSECGROUPROLE = dbo.UFN_SECURITY_APPUSER_IN_NO_SECURITY_GROUP_ROLE(@CURRENTAPPUSERID);
set @APPUSER_IN_NONSITEROLE = dbo.UFN_SECURITY_APPUSER_IN_NONSITEROLE(@CURRENTAPPUSERID);
set @APPUSER_IN_NOSITEROLE = dbo.UFN_SECURITY_APPUSER_IN_NO_SITE_ROLE(@CURRENTAPPUSERID);

if not exists(select 1 from dbo.UFN_JOBOCCURRENCE_SCHEDULE(@STARTDATE, @ENDDATE, @JOBOCCURRENCEID, null))
    set @DATESVALID_FOR_OCCURRENCE = 0;

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

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

begin try

    declare @ASSIGNMENTS table (VOLUNTEERASSIGNMENTID uniqueidentifier, VOLUNTEERID uniqueidentifier, ASSIGN bit)

    insert into @ASSIGNMENTS (VOLUNTEERASSIGNMENTID, VOLUNTEERID, ASSIGN) 
    select 
        VOLUNTEERASSIGNMENTID, 
        VOLUNTEERID, 
        ASSIGN
    from
        (select
            T.c.value('(VOLUNTEERASSIGNMENTID)[1]','uniqueidentifier') as VOLUNTEERASSIGNMENTID,
            T.c.value('(VOLUNTEERID)[1]','uniqueidentifier') as VOLUNTEERID,
            T.c.value('(ASSIGN)[1]','bit') as ASSIGN
        from @VOLUNTEERS.nodes('/VOLUNTEERS/ITEM') T(c)) as VOLUNTEERS;

    if not exists(select * from @ASSIGNMENTS where (ASSIGN = 1 and VOLUNTEERASSIGNMENTID is null) or (ASSIGN = 0 and not VOLUNTEERASSIGNMENTID is null))
        raiserror('BBERR_ASSIGNVOLUNTEERS_ATLEASTONEVOLUNTEER', 13, 1);

    if  (0 = (select ISACTIVE from dbo.JOBOCCURRENCE where ID = @JOBOCCURRENCEID)) and    -- Job occurrence is inactive
        (exists (select 1 from @ASSIGNMENTS where ASSIGN = 1))                            -- Someone is being assigned to it
        raiserror('BBERR_ASSIGNVOLUNTEERS_OCCURRENCEISINACTIVE', 13, 1);

    --remove assignments
    declare @contextCache varbinary(128);
    set @contextCache = CONTEXT_INFO();

    if not @CHANGEAGENTID is null
        set CONTEXT_INFO @CHANGEAGENTID;

    delete dbo.VOLUNTEERASSIGNMENT 
    from dbo.VOLUNTEERASSIGNMENT
    inner join @ASSIGNMENTS VOLUNTEERS 
        on VOLUNTEERS.VOLUNTEERASSIGNMENTID = VOLUNTEERASSIGNMENT.ID
    where 
        VOLUNTEERS.ASSIGN = 0;

    if not @contextCache is null
        set CONTEXT_INFO @contextCache;

    if @DATESVALID_FOR_OCCURRENCE = 0 and @SINGLEDAY_EDIT = 0 
        raiserror('BBERR_ASSIGNVOLUNTEERS_NOOCCURRENCEEXISTS', 13, 1);

    select @JOBOCCURRENCE_STARTDATE = STARTDATE from dbo.JOBOCCURRENCE where ID = @JOBOCCURRENCEID;

    if @STARTDATE < @JOBOCCURRENCE_STARTDATE
        set @STARTDATE = @JOBOCCURRENCE_STARTDATE;

    if exists (
            select
                1
            from 
                dbo.VOLUNTEERASSIGNMENT 
            inner join dbo.JOBOCCURRENCE on JOBOCCURRENCE.ID = @JOBOCCURRENCEID
            inner join dbo.JOBOCCURRENCE ASSIGNEDJOB on ASSIGNEDJOB.ID = VOLUNTEERASSIGNMENT.JOBOCCURRENCEID
            inner join @ASSIGNMENTS VOLUNTEERS on VOLUNTEERASSIGNMENT.VOLUNTEERID = VOLUNTEERS.VOLUNTEERID and VOLUNTEERASSIGNMENT.DATE = @STARTDATE
            where
                (VOLUNTEERS.ASSIGN = 1)
                and ASSIGNEDJOB.ID <> JOBOCCURRENCE.ID
                and ((ASSIGNEDJOB.STARTTIME < JOBOCCURRENCE.ENDTIME and ASSIGNEDJOB.ENDTIME > JOBOCCURRENCE.STARTTIME)
                or (ASSIGNEDJOB.STARTTIME = JOBOCCURRENCE.STARTTIME and ASSIGNEDJOB.ENDTIME = JOBOCCURRENCE.ENDTIME)
                or ASSIGNEDJOB.STARTTIME = '' or ASSIGNEDJOB.ENDTIME = ''
                or JOBOCCURRENCE.STARTTIME = '' or JOBOCCURRENCE.ENDTIME  = ''))
        raiserror('BBERR_VOLUNTEERALREADYSCHEDULED', 13, 1);

    --add assignments
    --allow add/edit on days with assignments that no longer fall within timeframe of job occurrence
    if @SINGLEDAY_EDIT = 1 and @DATESVALID_FOR_OCCURRENCE = 0 and 
        exists(select 1 from @ASSIGNMENTS where (ASSIGN = 1 and VOLUNTEERASSIGNMENTID is null))

        insert into dbo.VOLUNTEERASSIGNMENT(JOBOCCURRENCEID, VOLUNTEERID, DATE, ADDEDBYID, CHANGEDBYID, DATECHANGED, DATEADDED)
        select 
            @JOBOCCURRENCEID
            VOLUNTEERS.VOLUNTEERID, 
            @STARTDATE
            @CHANGEAGENTID
            @CHANGEAGENTID
            @CURRENTDATE
            @CURRENTDATE
        from @ASSIGNMENTS VOLUNTEERS
        inner join dbo.JOBOCCURRENCE 
            on JOBOCCURRENCE.ID = @JOBOCCURRENCEID
        where 
            (VOLUNTEERS.ASSIGN = 1 and VOLUNTEERS.VOLUNTEERASSIGNMENTID is null) and
            (@ISADMIN = 1 or 
                (@APPUSER_IN_NONRACROLE = 1 or
                dbo.UFN_SECURITY_APPUSER_GRANTED_CONSTITID_FORREPORT(@CURRENTAPPUSERID, VOLUNTEERS.VOLUNTEERID, @APPUSER_IN_NOSECGROUPROLE) = 1)
                and
                (@APPUSER_IN_NONSITEROLE = 1 or
                dbo.UFN_SECURITY_APPUSER_GRANTED_CONSTITID_FORREPORT_BYSITE(@CURRENTAPPUSERID, VOLUNTEERS.VOLUNTEERID, @APPUSER_IN_NOSITEROLE) = 1)
            ) and
            not exists ( --don't include in list if a conflict exists on the specific date 
                select 1
                from dbo.VOLUNTEERASSIGNMENT 
                inner join dbo.JOBOCCURRENCE ASSIGNEDJOB 
                    on ASSIGNEDJOB.ID = VOLUNTEERASSIGNMENT.JOBOCCURRENCEID
                where 
                    VOLUNTEERASSIGNMENT.VOLUNTEERID = VOLUNTEERS.VOLUNTEERID and VOLUNTEERASSIGNMENT.DATE = @STARTDATE
                    and ((ASSIGNEDJOB.STARTTIME < JOBOCCURRENCE.ENDTIME and ASSIGNEDJOB.ENDTIME > JOBOCCURRENCE.STARTTIME)
                    or (ASSIGNEDJOB.STARTTIME = JOBOCCURRENCE.STARTTIME and ASSIGNEDJOB.ENDTIME = JOBOCCURRENCE.ENDTIME)
                    or ASSIGNEDJOB.STARTTIME = '' or ASSIGNEDJOB.ENDTIME = ''
                    or JOBOCCURRENCE.STARTTIME = '' or JOBOCCURRENCE.ENDTIME  = ''));
    else
        insert into dbo.VOLUNTEERASSIGNMENT(JOBOCCURRENCEID, VOLUNTEERID, DATE, ADDEDBYID, CHANGEDBYID, DATECHANGED, DATEADDED)
        select 
            @JOBOCCURRENCEID
            VOLUNTEER_DATES.VOLUNTEERID, 
            VOLUNTEER_DATES.ASSIGNMENTDATE, 
            @CHANGEAGENTID
            @CHANGEAGENTID
            @CURRENTDATE
            @CURRENTDATE
        from 
            (select 
                VOLUNTEERS.VOLUNTEERASSIGNMENTID,
                VOLUNTEERS.VOLUNTEERID, 
                DATES.ASSIGNMENTDATE,
                ASSIGN,
                OPENINGS,
                ROW_NUMBER() OVER (PARTITION BY DATES.ASSIGNMENTDATE order by DATES.ASSIGNMENTDATE, CONSTITUENT.KEYNAME) as ROWNUMBER
             from @ASSIGNMENTS VOLUNTEERS
             inner join dbo.CONSTITUENT
                on CONSTITUENT.ID = VOLUNTEERS.VOLUNTEERID
             cross join dbo.UFN_JOBOCCURRENCE_SCHEDULE(@STARTDATE, @ENDDATE, @JOBOCCURRENCEID, null) DATES
             where not exists ( --don't include in list if a conflict exists on the specific date 
                select 1
                from dbo.VOLUNTEERASSIGNMENT 
                cross apply dbo.UFN_JOBOCCURRENCE_SCHEDULE(VOLUNTEERASSIGNMENT.DATE, VOLUNTEERASSIGNMENT.DATE, VOLUNTEERASSIGNMENT.JOBOCCURRENCEID, null) ASSIGNEDJOB 
                where 
                    VOLUNTEERASSIGNMENT.VOLUNTEERID = VOLUNTEERS.VOLUNTEERID and VOLUNTEERASSIGNMENT.DATE = DATES.ASSIGNMENTDATE
                    and ((ASSIGNEDJOB.JOBSTARTTIME < DATES.JOBENDTIME and ASSIGNEDJOB.JOBENDTIME > DATES.JOBSTARTTIME)
                    or (ASSIGNEDJOB.JOBSTARTTIME = DATES.JOBSTARTTIME and ASSIGNEDJOB.JOBENDTIME = DATES.JOBENDTIME)
                    or ASSIGNEDJOB.JOBSTARTTIME = '' or ASSIGNEDJOB.JOBENDTIME = ''
                    or DATES.JOBSTARTTIME = '' or DATES.JOBENDTIME  = ''))
                and (VOLUNTEERS.ASSIGN = 1 and VOLUNTEERS.VOLUNTEERASSIGNMENTID is null)
            ) VOLUNTEER_DATES
        where 
            (@SINGLEDAY_EDIT = 1 or (VOLUNTEER_DATES.ROWNUMBER <= VOLUNTEER_DATES.OPENINGS)) and
            (@ISADMIN = 1 or 
                (@APPUSER_IN_NONRACROLE = 1 or
                dbo.UFN_SECURITY_APPUSER_GRANTED_CONSTITID_FORREPORT(@CURRENTAPPUSERID, VOLUNTEER_DATES.VOLUNTEERID, @APPUSER_IN_NOSECGROUPROLE) = 1)
                and
                (@APPUSER_IN_NONSITEROLE = 1 or
                dbo.UFN_SECURITY_APPUSER_GRANTED_CONSTITID_FORREPORT_BYSITE(@CURRENTAPPUSERID, VOLUNTEER_DATES.VOLUNTEERID, @APPUSER_IN_NOSITEROLE) = 1)
            );
end try

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

return 0;