USP_STAFFRESOURCE_PROCESS
Process the itinerary item xml to create jobs and populate pricing fields.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@STAFFRESOURCES | xml | INOUT | |
@CHANGEAGENTID | uniqueidentifier | IN | |
@CREATENEWRECORIDS | bit | IN | |
@UPDATEPERCAPACITYRESOURCEQUANTITY | bit | IN | |
@CAPACITY | int | IN |
Definition
Copy
CREATE procedure dbo.USP_STAFFRESOURCE_PROCESS
(
@STAFFRESOURCES xml output,
@CHANGEAGENTID uniqueidentifier = null,
@CREATENEWRECORIDS bit,
@UPDATEPERCAPACITYRESOURCEQUANTITY bit = 0,
@CAPACITY int = 0
)
as begin
set nocount on;
-- Setup the save information
if @CHANGEAGENTID is null
exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output
declare @CURRENTDATE datetime;
set @CURRENTDATE = getdate();
-- First turn the xml into a temp table
declare @STAFFRESOURCESTABLE table
(
FILLEDBYCODE tinyint,
ID uniqueidentifier,
JOBDESCRIPTION nvarchar(255),
JOBID uniqueidentifier,
JOBNAME nvarchar(100),
QUANTITYNEEDED int,
VOLUNTEERTYPEID uniqueidentifier,
PRICE money,
PRICINGSTRUCTURECODE tinyint,
ORIGINALID uniqueidentifier
)
insert into @STAFFRESOURCESTABLE
(
FILLEDBYCODE,
ID,
JOBDESCRIPTION,
JOBID,
JOBNAME,
QUANTITYNEEDED,
VOLUNTEERTYPEID,
PRICE,
PRICINGSTRUCTURECODE
)
select
T.c.value('(FILLEDBYCODE)[1]','tinyint') AS 'FILLEDBYCODE',
T.c.value('(ID)[1]','uniqueidentifier') AS 'ID',
T.c.value('(JOBDESCRIPTION)[1]','nvarchar(255)') AS 'JOBDESCRIPTION',
T.c.value('(JOBID)[1]','uniqueidentifier') AS 'JOBID',
T.c.value('(JOBNAME)[1]','nvarchar(100)') AS 'JOBNAME',
T.c.value('(QUANTITYNEEDED)[1]','int') AS 'QUANTITYNEEDED',
T.c.value('(VOLUNTEERTYPEID)[1]','uniqueidentifier') AS 'VOLUNTEERTYPEID',
T.c.value('(PRICE)[1]','money') AS 'PRICE',
T.c.value('(PRICINGSTRUCTURECODE)[1]','tinyint') AS 'PRICINGSTRUCTURECODE'
from @STAFFRESOURCES.nodes('/STAFFRESOURCES/ITEM') T(c)
/* find any jobs that match by name and volunteer type first */
update @STAFFRESOURCESTABLE set
JOBID = JOB.ID
from dbo.JOB
inner join @STAFFRESOURCESTABLE as STAFFRESOURCESTABLE on
STAFFRESOURCESTABLE.JOBNAME = JOB.NAME and
STAFFRESOURCESTABLE.VOLUNTEERTYPEID = JOB.VOLUNTEERTYPEID
where
(JOBID is null or JOBID = '00000000-0000-0000-0000-000000000000') and
FILLEDBYCODE = 0
/* Finally check that there is only one new job that is going to be created per job name and volunteer type combo */
update @STAFFRESOURCESTABLE set
JOBDESCRIPTION = TOPJOBNAME.JOBDESCRIPTION
from @STAFFRESOURCESTABLE as STAFFRESOURCESTABLE
inner join
(
select
DISTINCTJOBDESCRIPTION.JOBNAME,
DISTINCTJOBDESCRIPTION.VOLUNTEERTYPEID,
(
select top 1
TOPJOBDESCRIPTION.JOBDESCRIPTION
from @STAFFRESOURCESTABLE as TOPJOBDESCRIPTION
where
TOPJOBDESCRIPTION.JOBNAME = DISTINCTJOBDESCRIPTION.JOBNAME and
TOPJOBDESCRIPTION.VOLUNTEERTYPEID = DISTINCTJOBDESCRIPTION.VOLUNTEERTYPEID
) as JOBDESCRIPTION
from @STAFFRESOURCESTABLE as DISTINCTJOBDESCRIPTION
) as TOPJOBNAME on
TOPJOBNAME.JOBNAME = STAFFRESOURCESTABLE.JOBNAME and
TOPJOBNAME.VOLUNTEERTYPEID = STAFFRESOURCESTABLE.VOLUNTEERTYPEID
where
(
STAFFRESOURCESTABLE.JOBID is null or
STAFFRESOURCESTABLE.JOBID = '00000000-0000-0000-0000-000000000000'
) and
STAFFRESOURCESTABLE.FILLEDBYCODE = 0
declare @DISTINCTJOB table
(
JOBID uniqueidentifier,
JOBNAME nvarchar(100),
JOBDESCRIPTION nvarchar(255)
);
insert into @DISTINCTJOB (JOBNAME, JOBDESCRIPTION)
select distinct
JOBNAME,
JOBDESCRIPTION
from @STAFFRESOURCESTABLE as STAFFRESOURCESTABLE
where
(
STAFFRESOURCESTABLE.JOBID is null or
STAFFRESOURCESTABLE.JOBID = '00000000-0000-0000-0000-000000000000'
) and
STAFFRESOURCESTABLE.FILLEDBYCODE = 0
update @DISTINCTJOB set JOBID = NEWID();
update @STAFFRESOURCESTABLE set
JOBID = DISTINCTJOB.JOBID
from @STAFFRESOURCESTABLE as STAFFRESOURCESTABLE
inner join @DISTINCTJOB as DISTINCTJOB on
STAFFRESOURCESTABLE.JOBNAME = DISTINCTJOB.JOBNAME and
STAFFRESOURCESTABLE.JOBDESCRIPTION = DISTINCTJOB.JOBDESCRIPTION;
/* Now create the jobs needed */
insert into dbo.JOB
(
ID,
NAME,
DESCRIPTION,
VOLUNTEERTYPEID,
ADDEDBYID,
CHANGEDBYID,
DATEADDED,
DATECHANGED
)
select distinct
STAFFRESOURCESTABLE.JOBID,
STAFFRESOURCESTABLE.JOBNAME,
STAFFRESOURCESTABLE.JOBDESCRIPTION,
STAFFRESOURCESTABLE.VOLUNTEERTYPEID,
@CHANGEAGENTID,
@CHANGEAGENTID,
@CURRENTDATE,
@CURRENTDATE
from @STAFFRESOURCESTABLE as STAFFRESOURCESTABLE
left outer join dbo.JOB on STAFFRESOURCESTABLE.JOBID = JOB.ID
where
JOB.ID is null and
STAFFRESOURCESTABLE.FILLEDBYCODE = 0;
/* Update any null pricing information fields with values pulled from the resource pricing tables */
update @STAFFRESOURCESTABLE set
PRICE = COALESCE(VOLUNTEERTYPEPRICING.PRICE,0),
PRICINGSTRUCTURECODE = COALESCE(VOLUNTEERTYPEPRICING.PRICINGSTRUCTURECODE,0)
from @STAFFRESOURCESTABLE as STAFFRESOURCESTABLE
left join VOLUNTEERTYPEPRICING on
STAFFRESOURCESTABLE.VOLUNTEERTYPEID = VOLUNTEERTYPEPRICING.ID
where
STAFFRESOURCESTABLE.ID = '00000000-0000-0000-0000-000000000000' or
STAFFRESOURCESTABLE.ID is null or
STAFFRESOURCESTABLE.PRICE is null or
STAFFRESOURCESTABLE.PRICINGSTRUCTURECODE is null or
@CREATENEWRECORIDS = 1
/* If asked to create new record IDs then wipe out the existing record IDs and replace them with new IDs */
if (@CREATENEWRECORIDS = 1)
begin
update @STAFFRESOURCESTABLE set ORIGINALID = ID;
update @STAFFRESOURCESTABLE set ID = newid();
end
/* If we need to update the per capacity resources do so here */
if (@UPDATEPERCAPACITYRESOURCEQUANTITY = 1)
begin
update @STAFFRESOURCESTABLE set
QUANTITYNEEDED = ceiling(cast(@CAPACITY as decimal) / VOLUNTEERTYPE.CAPACITYPERRESOURCE)
from @STAFFRESOURCESTABLE as STAFFRESOURCESTABLE
inner join dbo.VOLUNTEERTYPE on
STAFFRESOURCESTABLE.VOLUNTEERTYPEID = VOLUNTEERTYPE.ID
where (VOLUNTEERTYPE.CAPACITYPERRESOURCE > 0)
end
/* Now recreate the XML from the temp table and setup the return value */
/* SERIALIZE */
set @STAFFRESOURCES =
(
select
[FILLEDBYCODE],
[ID],
[JOBDESCRIPTION],
[JOBID],
[JOBNAME],
[QUANTITYNEEDED],
[VOLUNTEERTYPEID],
[PRICE],
[PRICINGSTRUCTURECODE],
[ORIGINALID]
from @STAFFRESOURCESTABLE
for xml raw('ITEM'),type,elements,root('STAFFRESOURCES'),BINARY BASE64
)
end