USP_ITINERARYITEMEVENT_EDIT
Allows the user to edit an existing event on an itinerary.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@ID | uniqueidentifier | IN | |
@CHANGEAGENTID | uniqueidentifier | IN | |
@ITINERARYID | uniqueidentifier | IN | |
@PROGRAMID | uniqueidentifier | IN | |
@EVENTID | uniqueidentifier | IN | |
@ITINERARYITEMSTARTTIME | UDT_HOURMINUTE | IN | |
@ITINERARYITEMENDTIME | UDT_HOURMINUTE | IN | |
@ITINERARYITEMSTARTDATE | datetime | IN | |
@ITINERARYITEMENDDATE | datetime | IN | |
@BLOCKEVENT | bit | IN | |
@NOTES | nvarchar(500) | IN | |
@RESOURCES | xml | IN | |
@IGNORECONFLICTS | bit | IN | |
@STAFFRESOURCES | xml | IN |
Definition
Copy
CREATE procedure dbo.USP_ITINERARYITEMEVENT_EDIT
(
@ID uniqueidentifier,
@CHANGEAGENTID uniqueidentifier = null,
@ITINERARYID uniqueidentifier,
@PROGRAMID uniqueidentifier,
@EVENTID uniqueidentifier,
@ITINERARYITEMSTARTTIME dbo.UDT_HOURMINUTE,
@ITINERARYITEMENDTIME dbo.UDT_HOURMINUTE,
@ITINERARYITEMSTARTDATE datetime,
@ITINERARYITEMENDDATE datetime,
@BLOCKEVENT bit,
@NOTES nvarchar(500),
@RESOURCES xml,
@IGNORECONFLICTS bit,
@STAFFRESOURCES xml = null
)
as
begin
set nocount on;
if @CHANGEAGENTID is null
exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;
declare @ORDERID uniqueidentifier;
declare @SALESMETHODID uniqueidentifier;
declare @ARRIVALDATE datetime;
declare @MAXDATE datetime;
declare @ERRORMESSAGE nvarchar(500);
declare @DESCRIPTION nvarchar(100);
declare @EVENTSTARTTIME UDT_HOURMINUTE;
declare @EVENTENDTIME UDT_HOURMINUTE;
declare @CURRENTDATE datetime;
declare @CREATENEWCONFLICT bit = 0;
declare @ITEMSTARTDATETIME datetime;
declare @ITEMENDDATETIME datetime;
declare @EVENTSTARTDATE datetime;
declare @EVENTENDDATE datetime;
declare @ISFLATRATE bit = 0;
declare @STATUSCODE tinyint;
set @ITEMSTARTDATETIME = dbo.UFN_DATE_ADDHOURMINUTE(dbo.UFN_DATE_GETEARLIESTTIME(@ITINERARYITEMSTARTDATE),@ITINERARYITEMSTARTTIME)
set @ITEMENDDATETIME = dbo.UFN_DATE_ADDHOURMINUTE(dbo.UFN_DATE_GETEARLIESTTIME(@ITINERARYITEMENDDATE),@ITINERARYITEMENDTIME)
set @CURRENTDATE = getdate();
set @SALESMETHODID = dbo.UFN_SALESMETHOD_GETIDFROMTYPECODE(3)
select
@ORDERID = RESERVATION.ID,
@ARRIVALDATE = dbo.UFN_DATE_ADDHOURMINUTE(RESERVATION.ARRIVALDATE, RESERVATION.ARRIVALTIME),
@ISFLATRATE = case when PRICINGCODE = 1 then 1 else 0 end,
@STATUSCODE = SALESORDER.STATUSCODE
from dbo.RESERVATION
inner join dbo.ITINERARY on ITINERARY.RESERVATIONID = RESERVATION.ID
inner join dbo.SALESORDER on SALESORDER.ID = RESERVATION.ID
where ITINERARY.ID = @ITINERARYID
if @STATUSCODE in (1, 5)
raiserror('BBERR_INVALIDSTATUS', 13, 1)
select
@DESCRIPTION = EVENT.NAME,
@EVENTSTARTTIME = EVENT.STARTTIME,
@EVENTENDTIME = EVENT.ENDTIME,
@EVENTSTARTDATE = EVENT.STARTDATETIME,
@EVENTENDDATE = EVENT.ENDDATETIME
from dbo.EVENT where EVENT.ID = @EVENTID;
if @ITEMSTARTDATETIME not between @EVENTSTARTDATE and @EVENTENDDATE
raiserror('BBERR_INVALIDTIMES', 13, 1);
if @IGNORECONFLICTS = 0
begin
declare @OLDITINERARYSTART datetime;
declare @OLDITINERARYEND datetime;
declare @ITINERARYSTART datetime;
declare @ITINERARYEND datetime;
declare @CHECKITINERARYCONFLICTS bit = 0;
select
@OLDITINERARYSTART = ITINERARY.STARTDATETIME,
@OLDITINERARYEND = ITINERARY.ENDDATETIME
from dbo.ITINERARY
where ID = @ITINERARYID
select
@ITINERARYSTART = min(STARTDATETIME),
@ITINERARYEND = max(ENDDATETIME)
from
(
select
@ITEMSTARTDATETIME as STARTDATETIME,
@ITEMENDDATETIME as ENDDATETIME
union all
select
ITINERARYITEM.STARTDATETIME as STARTDATETIME,
ITINERARYITEM.ENDDATETIME as ENDDATETIME
from dbo.ITINERARYITEM
where
ITINERARYID = @ITINERARYID and
ID <> @ID
) T
if @OLDITINERARYSTART is null or @OLDITINERARYSTART <> @ITINERARYSTART or
@OLDITINERARYEND is null or @OLDITINERARYEND <> @ITINERARYEND
set @CHECKITINERARYCONFLICTS = 1
if dbo.UFN_CONFLICTCHECK_CONFLICTSEXIST
(
@ITEMSTARTDATETIME, @ITEMENDDATETIME,
null, @RESOURCES, null,
null, @ITINERARYID, @ID,
0, -- Ignore Super Record
0, -- Ignore Record
1, -- Ignore Sub Record
0 -- Ignore All Sub Records of Record
) = 1
begin
raiserror('BBERR_RESOURCECONFLICTSEXIST', 13, 1);
return 1;
end
if dbo.UFN_CONFLICTCHECK_CONFLICTSEXIST
(
@ITEMSTARTDATETIME, @ITEMENDDATETIME,
null, null, @STAFFRESOURCES,
null, @ITINERARYID, @ID,
0, -- Ignore Super Record
0, -- Ignore Record
1, -- Ignore Sub Record
0 -- Ignore All Sub Records of Record
) = 1
begin
raiserror('BBERR_STAFFRESOURCECONFLICTSEXIST', 13, 1);
return 1;
end
-- If itinerary times changing, need to check on conflicts
if @CHECKITINERARYCONFLICTS = 1
begin
declare @ITINERARYRESOURCES xml
set @ITINERARYRESOURCES = dbo.UFN_ITINERARYRESOURCE_GETRESOURCES_TOITEMLISTXML(@ITINERARYID);
declare @ITINERARYSTAFFRESOURCES xml
set @ITINERARYSTAFFRESOURCES = dbo.UFN_ITINERARY_GETSTAFFRESOURCES_TOITEMLISTXML(@ITINERARYID);
if dbo.UFN_CONFLICTCHECK_CONFLICTSEXIST
(
@ITINERARYSTART, @ITINERARYEND,
null, @ITINERARYRESOURCES, @ITINERARYSTAFFRESOURCES,
null, @ITINERARYID, @ID,
0, -- Ignore Super Record
1, -- Ignore Record
1, -- Ignore Sub Record
0 -- Ignore All Sub Records of Record
) = 1
begin
raiserror('BBERR_ITINERARYRESOURCECONFLICTSEXIST', 13, 1);
return 1;
end
end
end
if @ARRIVALDATE > dbo.UFN_DATE_ADDHOURMINUTE(@ITINERARYITEMSTARTDATE, @ITINERARYITEMSTARTTIME)
raiserror('BBERR_INVALIDDATE', 13, 1)
set @MAXDATE = dateadd(d, 4, dbo.UFN_DATE_GETLATESTTIME(@ARRIVALDATE))
if @ITEMSTARTDATETIME > @MAXDATE or @ITEMENDDATETIME > @MAXDATE
raiserror('BBERR_OUTSIDEDATERANGE', 13, 1)
-- Need to check location block from custom item, also.
if exists (select 1 from dbo.ITINERARYITEM
inner join dbo.ITINERARY on ITINERARY.ID = ITINERARYITEM.ITINERARYID
inner join dbo.RESERVATION on ITINERARY.RESERVATIONID = RESERVATION.ID
inner join dbo.SALESORDER on RESERVATION.ID = SALESORDER.ID
where ITEMTYPECODE = 0
and BLOCKEVENT = 1
and EVENTID = @EVENTID
and ITINERARY.RESERVATIONID <> @ORDERID
and ITINERARYITEM.ID <> @ID
and SALESORDER.STATUSCODE <> 5)
raiserror('BBERR_EVENTEXISTSWITHBLOCK', 13, 1);
if @BLOCKEVENT = 1
begin
-- CR63788 MDC - Block event changes should apply globally to the reservation.
-- Do not block events in the same reservation.
if exists (select 1
from dbo.ITINERARYITEM
inner join dbo.ITINERARY on ITINERARYITEM.ITINERARYID = ITINERARY.ID
inner join dbo.RESERVATION on ITINERARY.RESERVATIONID = RESERVATION.ID
inner join dbo.SALESORDER on RESERVATION.ID = SALESORDER.ID
where ITEMTYPECODE = 0
and EVENTID = @EVENTID
and ITINERARY.RESERVATIONID <> @ORDERID
and ITINERARYITEM.ID <> @ID
and SALESORDER.STATUSCODE <> 5
)
raiserror('BBERR_CANNOTBLOCK', 13, 1);
end
update dbo.ITINERARYITEM
set BLOCKEVENT = @BLOCKEVENT,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
where @EVENTID = EVENTID
and ITINERARYID in (select ID
from dbo.ITINERARY
where ITINERARY.RESERVATIONID = @ORDERID)
and ITEMTYPECODE = 0
if not exists (select 1 from dbo.ITINERARYITEM where EVENTID = @EVENTID and ITEMTYPECODE = 0 and ITINERARYID = @ITINERARYID)
begin
if not exists (select 1 from dbo.EVENT inner join dbo.PROGRAM on PROGRAM.ID = EVENT.PROGRAMID where EVENT.ID = @EVENTID and PROGRAM.ISACTIVE = 1 and EVENT.ISACTIVE = 1 and dbo.UFN_EVENT_ISONSALE(@EVENTID, @CURRENTDATE, 3) = 1)
begin
raiserror('BBERR_INACTIVEPROGRAMEVENT', 13, 1);
end
end
begin try
if not exists (select ID from dbo.ITINERARYITEM where ITINERARYID = @ITINERARYID and ITEMTYPECODE = 0 and EVENTID = @EVENTID)
begin
if @CREATENEWCONFLICT = 0 --No tickets for an invalid item
begin
update dbo.[SALESORDERITEM] set
[SALESORDERITEM].[QUANTITY] = SALESORDERITEM.[QUANTITY] - ITINERARYATTENDEE.QUANTITY,
[SALESORDERITEM].CHANGEDBYID = @CHANGEAGENTID,
[SALESORDERITEM].DATECHANGED = @CURRENTDATE
from dbo.[SALESORDERITEM]
inner join dbo.SALESORDERITEMTICKET as SOIT on [SALESORDERITEM].ID = SOIT.ID
inner join dbo.ITINERARYITEM on
(SOIT.EVENTID = ITINERARYITEM.EVENTID) or
(SOIT.PROGRAMID = ITINERARYITEM.PROGRAMID and ITINERARYITEM.EVENTID is null)
inner join dbo.ITINERARYATTENDEE on ITINERARYATTENDEE.PRICETYPECODEID = SOIT.PRICETYPECODEID
where
SALESORDERITEM.SALESORDERID = @ORDERID and
ITINERARYITEM.ID = @ID and
ITINERARYATTENDEE.ITINERARYID = @ITINERARYID and
ITINERARYITEM.ITEMTYPECODE <> 3
declare @e int;
declare @contextCache varbinary(128);
set @contextCache = CONTEXT_INFO();
if not @CHANGEAGENTID is null
set CONTEXT_INFO @CHANGEAGENTID
delete from dbo.[SALESORDERITEM]
where ID in
(
select SALESORDERITEMFEE.ID from SALESORDERITEM
inner join dbo.SALESORDERITEMFEE on
SALESORDERITEM.ID = SALESORDERITEMFEE.SALESORDERITEMID
where SALESORDERITEM.SALESORDERID = @ORDERID and
SALESORDERITEM.QUANTITY = 0
)
delete from dbo.SALESORDERITEMORDERDISCOUNTDETAIL
where SALESORDERITEMID in
(
select ID
from dbo.SALESORDERITEM
where SALESORDERITEM.QUANTITY = 0 AND
SALESORDERITEM.SALESORDERID = @ORDERID
)
delete dbo.SALESORDERITEM
where SALESORDERITEM.QUANTITY = 0 and
SALESORDERITEM.SALESORDERID = @ORDERID
if not @contextCache is null
set CONTEXT_INFO @contextCache
select @e=@@error;
if @e <> 0
return 2;
end
declare @ORDERITEMS table
(ID uniqueidentifier,
QUANTITY decimal(20,4),
PRICETYPECODEID uniqueidentifier,
PRICETYPE nvarchar(100),
PRICE money,
PRICINGSTRUCTURECODE tinyint);
if exists (select 1 from dbo.PROGRAMEVENTPRICE where EVENTID = @EVENTID)
begin
insert into @ORDERITEMS
select
newid(),
IT.QUANTITY,
PROGRAMEVENTPRICE.PRICETYPECODEID,
dbo.UFN_PRICETYPECODE_GETDESCRIPTION(PROGRAMEVENTPRICE.PRICETYPECODEID) as PRICETYPE,
PROGRAMEVENTPRICE.FACEPRICE,
0
from dbo.ITINERARYATTENDEE IT
inner join dbo.PROGRAMEVENTPRICE on @EVENTID = PROGRAMEVENTPRICE.EVENTID
inner join dbo.PRICETYPECODE on PRICETYPECODE.ID = PROGRAMEVENTPRICE.PRICETYPECODEID
where
PROGRAMEVENTPRICE.EVENTID = @EVENTID and
IT.PRICETYPECODEID = PRICETYPECODE.ID and
IT.ITINERARYID = @ITINERARYID and
not exists (select 1
from dbo.SALESMETHODEXCLUDEDPRICETYPE
where SALESMETHODEXCLUDEDPRICETYPE.SALESMETHODID = @SALESMETHODID and
SALESMETHODEXCLUDEDPRICETYPE.PRICETYPECODEID = PROGRAMEVENTPRICE.PRICETYPECODEID)
end
else
begin
-- Fix the program ID if we need to
if (@PROGRAMID is null)
select @PROGRAMID = EVENT.PROGRAMID from dbo.EVENT where EVENT.ID = @EVENTID;
insert into @ORDERITEMS
select
newid(),
IT.QUANTITY,
PROGRAMPRICE.PRICETYPECODEID,
dbo.UFN_PRICETYPECODE_GETDESCRIPTION(PROGRAMPRICE.PRICETYPECODEID) as PRICETYPE,
PROGRAMPRICE.FACEPRICE,
0
from dbo.ITINERARYATTENDEE IT
inner join dbo.PROGRAMPRICE on PROGRAMPRICE.PROGRAMID = @PROGRAMID
inner join dbo.PRICETYPECODE on PRICETYPECODE.ID = PROGRAMPRICE.PRICETYPECODEID
where
PROGRAMPRICE.PROGRAMID = @PROGRAMID and
IT.PRICETYPECODEID = PRICETYPECODE.ID and
IT.ITINERARYID = @ITINERARYID and
not exists (select 1
from dbo.SALESMETHODEXCLUDEDPRICETYPE
where SALESMETHODEXCLUDEDPRICETYPE.SALESMETHODID = @SALESMETHODID and
SALESMETHODEXCLUDEDPRICETYPE.PRICETYPECODEID = PROGRAMPRICE.PRICETYPECODEID)
end
if exists (
select PRICETYPECODEID
from dbo.ITINERARYATTENDEE
where
ITINERARYID = @ITINERARYID and
PRICETYPECODEID not in (select PRICETYPECODEID from @ORDERITEMS)
)
raiserror('BBERR_INVALIDPRICETYPE', 13, 1);
declare @QUANTITY integer;
declare @TICKETSAVAILABLE integer;
select @QUANTITY = SUM(OI.QUANTITY)
from @ORDERITEMS OI
set @TICKETSAVAILABLE = dbo.UFN_EVENT_GETAVAILABILITY(@EVENTID);
if @QUANTITY > @TICKETSAVAILABLE
begin
declare @DIFFERENCE integer;
set @DIFFERENCE = @QUANTITY - @TICKETSAVAILABLE
set @ERRORMESSAGE = @DESCRIPTION + ' does not have enough capacity for this group. You can either reduce the group size by ' +
convert(nvarchar(10), @DIFFERENCE) + ' or choose a different event.'
raiserror(@ERRORMESSAGE, 13, 1)
end
if @CREATENEWCONFLICT = 0 --No tickets for an invalid item
begin
update dbo.SALESORDERITEM set
SALESORDERITEM.QUANTITY = SALESORDERITEM.QUANTITY + ITEMS.QUANTITY,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
from @ORDERITEMS items
where
SALESORDERID = @ORDERID and
SALESORDERITEM.ID in
(
select ID from dbo.SALESORDERITEMTICKET
where EVENTID = @EVENTID and
SALESORDERITEMTICKET.PRICETYPECODEID = ITEMS.PRICETYPECODEID
)
-- Set items to be flat rate if the reservation is flat rate and the program is included
if @ISFLATRATE = 1
begin
update @ORDERITEMS set PRICINGSTRUCTURECODE = 1
where dbo.UFN_RESERVATIONRATESCALE_ISEVENTINCLUDED(@ORDERID,@EVENTID) = 1
end
insert into dbo.SALESORDERITEM
(
ID,
SALESORDERID,
TYPECODE,
DESCRIPTION,
QUANTITY,
PRICE,
PRICINGSTRUCTURECODE,
ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
)
select
ITEMS.ID,
@ORDERID,
0,
@DESCRIPTION + ' - ' + ITEMS.PRICETYPE,
ITEMS.QUANTITY,
ITEMS.PRICE,
ITEMS.PRICINGSTRUCTURECODE,
@CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
from @ORDERITEMS ITEMS
where
not exists
(
select 1 from dbo.SALESORDERITEM
inner join dbo.SALESORDERITEMTICKET on SALESORDERITEM.ID = SALESORDERITEMTICKET.ID
where
SALESORDERID = @ORDERID and
EVENTID = @EVENTID and
SALESORDERITEMTICKET.PRICETYPECODEID = ITEMS.PRICETYPECODEID
);
insert into dbo.SALESORDERITEMTICKET
(
ID,
EVENTID,
PROGRAMID,
PROGRAMNAME,
PROGRAMCATEGORYNAME,
PRICETYPECODEID,
PRICE,
ADDEDBYID,
CHANGEDBYID,
DATEADDED,
DATECHANGED
)
select
ITEMS.ID,
@EVENTID,
(select PROGRAMID from dbo.EVENT where ID = @EVENTID),
coalesce((
select [PROGRAM].[NAME]
from dbo.[EVENT]
inner join dbo.[PROGRAM]
on [EVENT].[PROGRAMID] = [PROGRAM].[ID]
where [EVENT].[ID] = @EVENTID
),''),
coalesce((
select [PROGRAMCATEGORYCODE].[DESCRIPTION]
from dbo.[EVENT]
inner join dbo.[PROGRAM]
on [EVENT].[PROGRAMID] = [PROGRAM].[ID]
inner join dbo.[PROGRAMCATEGORYCODE]
on [PROGRAM].[PROGRAMCATEGORYCODEID] = [PROGRAMCATEGORYCODE].[ID]
where [EVENT].[ID] = @EVENTID
),''),
ITEMS.PRICETYPECODEID,
ITEMS.PRICE,
@CHANGEAGENTID,
@CHANGEAGENTID,
@CURRENTDATE,
@CURRENTDATE
from @ORDERITEMS ITEMS
where
ITEMS.ID in
( select ID from dbo.SALESORDERITEM where SALESORDERID = @ORDERID )
end
end
update dbo.ITINERARYITEM set
NAME = @DESCRIPTION,
STARTTIME = @ITINERARYITEMSTARTTIME,
ENDTIME = @ITINERARYITEMENDTIME,
NOTES = @NOTES,
EVENTID = @EVENTID,
PROGRAMID = null,
ITEMTYPECODE = case @CREATENEWCONFLICT when 1 then 3 else 0 end,
INVALIDREASONCODE = case @CREATENEWCONFLICT when 1 then 10 else 0 end,
STARTDATE = @ITINERARYITEMSTARTDATE,
ENDDATE = @ITINERARYITEMENDDATE,
BLOCKEVENT = @BLOCKEVENT,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
where ID = @ID;
-- Need to create the job, the job occurrence will be created using the trigger
exec dbo.USP_RESOURCE_PROCESS @RESOURCES output, @CHANGEAGENTID, 0;
exec dbo.USP_STAFFRESOURCE_PROCESS @STAFFRESOURCES output, @CHANGEAGENTID, 0, 0, 0;
exec dbo.USP_ITINERARYITEMRESOURCE_GETRESOURCES_UPDATEFROMXML @ID, @RESOURCES, @CHANGEAGENTID, @CURRENTDATE
exec dbo.USP_ITINERARYITEM_GETSTAFFRESOURCES_UPDATEFROMXML @ID, @STAFFRESOURCES, @CHANGEAGENTID, @CURRENTDATE
exec dbo.USP_ITINERARY_CHECKPERTICKETRESOURCES @ITINERARYID;
exec dbo.USP_ITINERARY_RESOURCES_SALESORDERSYNC @ITINERARYID, @ORDERID, @CHANGEAGENTID
exec dbo.USP_ITINERARY_STAFFRESOURCES_SALESORDERSYNC @ITINERARYID, @ORDERID, @CHANGEAGENTID
exec dbo.USP_ITINERARYITEM_RESOURCES_SALESORDERSYNC @ID, @ORDERID, @CHANGEAGENTID
exec dbo.USP_ITINERARYITEM_STAFFRESOURCES_SALESORDERSYNC @ID, @ORDERID, @CHANGEAGENTID
if @ISFLATRATE = 1
begin
exec dbo.USP_RESERVATION_UPDATEFLATRATEPERTICKETPRICE @ORDERID, null, @CHANGEAGENTID, @CURRENTDATE;
exec dbo.USP_RESERVATION_DISTRIBUTEAPPLICATIONS @ORDERID, @CHANGEAGENTID, @CURRENTDATE;
exec dbo.USP_SALESORDER_CALCULATEFEES @ORDERID, @CHANGEAGENTID;
exec dbo.USP_RESERVATION_CALCULATEFLATRATEFEES @ORDERID, @CHANGEAGENTID;
--exec dbo.USP_SALESORDER_APPLYITEMDISCOUNTS @ORDERID, @CHANGEAGENTID;
--exec dbo.USP_SALESORDER_APPLYORDERDISCOUNTS @ORDERID, @CHANGEAGENTID;
-- Generate taxes last
exec dbo.USP_SALESORDER_CALCULATETAXES @ORDERID, @CHANGEAGENTID;
exec dbo.USP_RESERVATIONRATESCALE_UPDATETAXES @ORDERID, @CHANGEAGENTID, @CURRENTDATE;
end
else
begin
exec dbo.USP_SALESORDER_CALCULATEFEES @ORDERID, @CHANGEAGENTID;
exec dbo.USP_SALESORDER_APPLYITEMDISCOUNTS @ORDERID, @CHANGEAGENTID;
exec dbo.USP_SALESORDER_APPLYORDERDISCOUNTS @ORDERID, @CHANGEAGENTID;
-- Generate taxes last
exec dbo.USP_SALESORDER_CALCULATETAXES @ORDERID, @CHANGEAGENTID;
end
end try
begin catch
exec dbo.USP_RAISE_ERROR
return 1
end catch
return 0;
end