TR_ITINERARYITEM_DELETE_ITINERARYSTAFFRESOURCEUPDATE

Definition

Copy


                    CREATE trigger [dbo].[TR_ITINERARYITEM_DELETE_ITINERARYSTAFFRESOURCEUPDATE] 
                        on [dbo].[ITINERARYITEM] 
                        after delete not for replication
                    as begin
                        declare @CURRENTDATE datetime;                                        
                        set @CURRENTDATE = GetDate();

                        /* Create a map of JOBOCCURRENCEIDs to ITINERARYITEMSTAFFRESOURCEIDs 
                            so we can set the JOBOCCURRENCEID on the ITINERARYITEMSTAFFRESOURCE. */
                        declare @JOBMAP TABLE
                        (
                            RECORDID uniqueidentifier,
                            JOBOCCURRENCEID uniqueidentifier,
                            ITINERARYID uniqueidentifier,
                            CHANGEDBYID uniqueidentifier
                        )

                        /* First items that have changed the itinerary such that it no longer has any items. */
                        insert into @JOBMAP
                            (RECORDID, JOBOCCURRENCEID, ITINERARYID, CHANGEDBYID)
                        select ITINERARYSTAFFRESOURCE.ID, ITINERARYSTAFFRESOURCE.JOBOCCURRENCEID, ITINERARY.ID, deleted.CHANGEDBYID
                        from deleted
                            inner join ITINERARY
                                on deleted.ITINERARYID = ITINERARY.ID
                            inner join dbo.ITINERARYSTAFFRESOURCE
                                on ITINERARYSTAFFRESOURCE.ITINERARYID = ITINERARY.ID
                        where ((ITINERARY.STARTDATETIME is null) and (ITINERARY.ENDDATETIME is null))

                        /* Update the itinerary staff resource records to have a null JOBOCCURRENCEID */
                        update dbo.ITINERARYSTAFFRESOURCE
                            set JOBOCCURRENCEID = null,
                                CHANGEDBYID = JOBMAP.CHANGEDBYID,
                                DATECHANGED = @CURRENTDATE
                        from dbo.ITINERARYSTAFFRESOURCE
                            inner join @JOBMAP as JOBMAP
                                on ITINERARYSTAFFRESOURCE.ID = JOBMAP.RECORDID

                        /* now delete the job occurences */
                        delete from dbo.JOBOCCURRENCE
                        from @JOBMAP as JOBMAP
                        where JOBOCCURRENCE.ID = JOBMAP.JOBOCCURRENCEID

                        /* Now we need to handle items where the removal has changed the start or end date/time of the itinerary */
                        delete from @JOBMAP;

                        insert into @JOBMAP
                            (RECORDID, JOBOCCURRENCEID, ITINERARYID, CHANGEDBYID)
                        select ITINERARYSTAFFRESOURCE.ID, ITINERARYSTAFFRESOURCE.JOBOCCURRENCEID, ITINERARY.ID, deleted.CHANGEDBYID
                        from deleted
                            inner join ITINERARY
                                on deleted.ITINERARYID = ITINERARY.ID
                            inner join dbo.ITINERARYSTAFFRESOURCE
                                on ITINERARYSTAFFRESOURCE.ITINERARYID = ITINERARY.ID
                        where ((ITINERARY.STARTDATETIME > deleted.STARTDATETIME) or
                                (ITINERARY.ENDDATETIME < deleted.ENDDATETIME))

                        /* Update the job occurrences with the new start and end date/time */
                        update dbo.JOBOCCURRENCE
                            set STARTDATE = dbo.UFN_DATE_GETEARLIESTTIME(ITINERARY.STARTDATETIME),
                                ENDDATE = dbo.UFN_DATE_GETEARLIESTTIME(ITINERARY.ENDDATETIME),
                                STARTTIME = dbo.UFN_HOURMINUTE_GETFROMDATE(ITINERARY.STARTDATETIME),
                                ENDTIME = dbo.UFN_HOURMINUTE_GETFROMDATE(ITINERARY.ENDDATETIME),
                                CHANGEDBYID = JOBMAP.CHANGEDBYID,
                                DATECHANGED = @CURRENTDATE
                        from dbo.JOBOCCURRENCE
                            inner join @JOBMAP as JOBMAP
                                on JOBOCCURRENCE.ID = JOBMAP.JOBOCCURRENCEID
                            inner join dbo.ITINERARY
                                on JOBMAP.ITINERARYID = ITINERARY.ID
                        where (STARTDATE <> dbo.UFN_DATE_GETEARLIESTTIME(ITINERARY.STARTDATETIME)) or
                                (ENDDATE <> dbo.UFN_DATE_GETEARLIESTTIME(ITINERARY.ENDDATETIME)) or
                                (STARTTIME <> dbo.UFN_HOURMINUTE_GETFROMDATE(ITINERARY.STARTDATETIME)) or
                                (ENDTIME <> dbo.UFN_HOURMINUTE_GETFROMDATE(ITINERARY.ENDDATETIME))
                    end