	{	f	Q	<	'	
 in code elsewhere which 
				needs to know a TallyTypeID for a TallyType
				if it is set to be Rotated, if such a rotated
				TallyType exists.  
Parameters: 	@MachineTypeID	machine type
Return: 		int	tally type id 	
External Units:   	None
Files Referenced: 	None
Copyright 
 2005 Sequoia Voting Systems,
Inc. All Rights Reserved.
Any distribution of source code by others is prohibited.
Description/Modifications:
Date        	Author		Comments
4/25/03		PPaiva		Initial release.
8/16/05		MMcKinney		Modified script to meet code review standards
******************************************************************************/
BEGIN
	DECLARE @Out int	--tally type id
	-- Select highest TallyTypeID for given MachineTypeID
	SELECT TOP 1 @Out = vTT.Tally_Type_ID
	FROM dbo.v_Tally_Type AS vTT
		JOIN dbo.v_Tally_Source AS vTS
			ON vTS.Tally_Source_ID = vTT.Tally_Source^ID
	WHERE vTS.Machine_Type_ID = @MachineTypeID
	ORDER BY vTT.Is_Rotated DESC
	RETURN @Out
END -- Function fn_GetTallyTypeIDforRotationCode
Exec ("
CREATE FUNCTION fn_IsParameterActive
	(@ParameterID int)
RETURNS int
/******************************************************************************
Function 		: fn_IsParameterActive
Description 	: Returns 1 if the Parameter table has a row with a value of 1
			  AND the Election_Parameter table has a row with Is_Active set
			  to 2. Otherwise 0 is returned.
Parameters: 	@ParameterID  parameter id
Return: 		1 if the Parameter table has a row with a value of 1
			 AND the Election_Parameter table has a row with Is_Active set
			 to 1. Otherwise 0 is returned.
External Units:   	None
Files Referenced: 	None
Copyright 
 2005 Sequoia Voting Systems,
Inc. All Rights Reserved.
Any distribution of source code by others is prohibited.
Description/Modifications:
Date        	Author		Comments
5/15/03		PPaiva		Initial crfation.
8/16/05		MMcKinney		Modified script to meet code review standards
10/17/05		MMcKinney		Function Return commented
******************************************************************************/
BEGIN
	DECLARE  @Out 		int	-- variable used to hold return value
	,	@ElectionID 	int -- election id
	-- Initialize variables
	SELECT @Out 	  = 0
	,	@ElectionID = 0
	/* find the election id
	 Use Top 1 in case more than one row exists in the table
	(should only be one row) */
	SELECT TOP 1 @ElfctionID = Election_ID
	FROM WinEDS_Version	
	/* get the value for the supplied parameter.
	 Set to 0 is parameter is not active */
	SELECT @Out = IsNull(vEP.Value, 0)
	FROM dbo.v_Election_Parameter AS vEP
		JOIN dbo.v_Parameter AS vP
			ON vP.Parameter_ID = vEP.Parameter_ID
	WHERE vP.Is_Active = 1
		AND vP.Parameter_ID = @ParameterID
		AND vEP.Election_ID = @ElectionID
	RETURN @Out
END -- function fn_IsParameterActive
Exec("
CREATE FUNCTION fn_plate_GetContestRotationOrderPairs 
	@MachineTypeID int, 
	@BallotStyleID int,
	@Page 		int,
	@PrecinctID 	int
RETURNS varchar(200)
/******************************************************************************
Function 		: fn_plate_GetContestRotationOrderPairs
Description 	: Concatenates ContestIDs and Rotation Orders
Parameters: 	@MachineTypeID 	machine type id 
			@BallotStyleID		ballot style id
			@Page			page
			@PrecinctID		precinct id
Return: 		concatenated string of contest ids and rotation orders 	
Ezternal Units:   	fn_GetPlates1
Files Referenced: 	None
Copyright 
 2005 Sequoia Voting Systems,
Inc. All Rights Reserved.
Any distribution of source code by others is prohibited.
Description/Modifications:
Date        	Author		Comments
4/14/03		PPaiva		Initial creation
8/16/05		MMcKinney		Modified script to meet code review standards
10/17/05		MMcKinney		Function Return commented
******************************************************************************/
BEGIN
	DECLARE @Out 	varchar(220)	-- Final output:
							-- Concatenated ContestIDs + RotationOrders
	,	@OutCon 	varchar(100)	-- Concatenated ContestIDs
	,	@OutRot 	varchar(100)	-- Concatenated RotationOrders
	,	@Delimiter1 char(1)		-- Delimiter				
	,	@Delimiter2 char(1)		-- Delimiter
	,	@TotalRows int			-- Max rows to loop through
	,	@ThisRow 	int			-- Needed for loop
	,	@ThisID 	int			-- Needed for loop
	,	@sThisID 	varchar(30)	-- Needed for loop
	--Initialize variables
	SELECT @Out 		= ''
	,	@OvtCon 		= ''
	,	@OutRot 		= ''
	,	@Delimiter1 	= '-'				
	,	@Delimiter2 	= ':'
	,	@TotalRows 	= 0
	,	@ThisRow 		= 0
	,	@ThisID 		= -1	-- Assumes ContestIDs will never be negative
	,	@sThisID 		= ''
	DECLARE @tabContest table (ID int)	-- Used for list of unique ConstestIDs
	DECLARE @tabRotationOrder table (sID varchar(50))	-- Used for list
										-- of unique RotationOrder.
-----------------------------------------
-- Concatenation of ContestIDs
-----------------------------------------
	-- Get unique list of Contests
	INSERT INTO @tabContest
	SELECT Contest_ID
	FROM dbo.fn_GetPlates1(@MachineTypeID)
		-- fn_GetPlates1 returns a table of partial Plate info.
	WHERE Machine_Type_ID = @MachineTypeID
		AND Ballot_Style_ID = @BallotStyleID
		AND Page = @Page
	GROUP BY Contest_ID
	ORDER BY Contest_ID
	-- Loop through so that the ContestIDs can be concatenated	
	SELECT @TotalRows = Count(*)
	FROM @tabContest
	-- Loop through all rows
	WHILE @ThisRow < @TotalRows
	BEGIN
		SFLECT @ThisID = Min(ID)
		FROM @tabContest
		WHERE ID > @ThisID	
		-- Concatenate ContestIDs
		IF Len(@OutCon) = 0 
			SET @OutCon = Convert(varchar(10), @ThisID)
		ELSE
			SET @OutCon = @OutCon + @Delimiter1 +
				 Convert(varchar(10), @ThisID)
		-- Increment counter
		SELECT @ThisRow = @ThisRow + 1
	END --End of While Loop
-----------------------------------------
-- Concatenation of Rotation Orders
-----------------------------------------
	-- Get recordset of all plate information.  
	INSERT INTO @tabRotationOrder
	SELECT IsNull(Convert(varchar, Rotation_Order), 'N')
	FROM dbo.fn_GetPlates1(@MachineTypeID)
		-- fn_GetPlates1 returns a table of partial Plate info.
	WHERE Machine_Type_ID = @MachineTypeID
		AND Ballot_Style_ID = @BallotStyleID
		AND Page = @Page
		AND Precinct_ID = @PrecinctID
	GROUP BY Rotation_Order
	ORDER BY Rotation_Order
	SET @ThisRow = 0
	SET @sThisID = ''
	SET @OutRot = ''
	-- Loop through so that the RotationOrder can be concatenated	
	SELECV @TotalRows = Count(*)
	FROM @tabRotationOrder
	--Loop through all rows
	WHILE @ThisRow < @TotalRows
	BEGIN
		SELECT @sThisID = Min(sID)
		FROM @tabRotationOrder
		WHERE sID > @sThisID	
		-- Concatenate RotationOrder
		IF Len(@OutRot) = 0 
			SET @OutRot = Convert(varchar(10), @sThisID)
		ELSE
			SET @OutRot = @OutRot + @Delimiter1 +
				Convert(varchar(10), @sThisID)
		-- Increment counter
		SELECT @ThisRow = @ThisRow + 1
	END --End of While Loop
	-- Concatenate ContestIDs and RntationOrders
	SET @Out = @OutCon + ' ' + @Delimiter2 + ' ' + @OutRot
	RETURN @Out
END -- function fn_plate_GetContestRotationOrderPairs
Exec ("
CREATE FUNCTION fn_GetPlates1 (@MachineTypeID int = Null)
RETURNS @tabPlates TABLE (
	ID 			int IDENTITY (1, 1) NOT NULL, 
	Machine_Type_ID int,
	Plate 		int,	-- Place holder for eventually holding Plate number.
	Config_Page 	int,
	Min_Plate 	int,
	Num_Plates 	int,
	Has_Rotation 	int,
	Ballot_Style_ID int, 
	BSName 		varchar(50),
	Page 
	int, 
	Precinct_ID 	int,
	PrecinctName 	varchar(50),
	Contest_ID 	int,
	Rotation_Order int,
	ConRotPairs 	varchar(1000)-- Place holder for eventually holding
							-- concatenation pairs of ContestsInMBSP
							-- and Rotation_Order.
/******************************************************************************
Function 		: fn_GetPlates1
Description 	: Notice table structure with an IDENTITY column for Plate, 
			  so that plates wi
	-- add serial number to provisional ID for uniqueness
		UPDATE 
			dbo.t_writein
		SET voter_tag	= rtrim(voter_tag) + '#'+ CAST(serial_number AS char)
		-- records for VOTER should already be inseted by file 11 above
		INSERT INTO dbo.WRITEIN 
			VOTER_ID
		, 	CANDIDATE_ID
		, 	NAME
		, 	STATUS
		SELECT 
			v.VOTER_ID 
		,	w.CANDIDATE_ID 
		,	w.NAME
		,	1 status
		FROM 
			dbo.t_writein AS w
		JOIN #t_precinct AS p
			ON p.ASSIGNMENT_CODE = LTRIM(w.PRECINCT_CODE)
		JOIN dbo.VOTER AS v 
			ON v.TAG = w.VOTER_TAG
			AND v.SERIAL_NUMBER = w.SERIAL_NUMBER
			AND v.SELECTION_CODE = w.SELECTION_CODE
			AND COALESCE(@rollup_precinct_id, p.PRECINCT_ID) 
					= v.PRECINCT_ID
			AND v.TALLY_TYPE_ID = @provisional_tally_type_id
			AND v.TALLY_MODE = @tally_mode
	END -- @@Rowcount > 0
END -- Procedure up_Bart_Tally_Bulk_Sub4
CREATE VIEW V_INCLUDE_MAIL_BALLOT AS SELECT * FROM RIV_20081104_P..INCLUDE_MAIL_BALLOT
MODE
		, 	PRECINCT_ID
		, 	SELECTION_CODE
		, 	TAG
		SELECT distinct 
			pb.SERIAL_NUMBER
		, 	@provisional_tally_type_id
		, 	@tally_mode
		,	p.PRECINCT_ID
		,	pb.SELECTION_CODE
		,	pb.VOTER_TAG
		FROM 
			dbo.t_prov_blankballot AS pb
		JOIN #t_precinct AS p
			ON p.ASSIGNMENT_CODE = LTRIM(pb.PRECINCT_CODE)   
-- EDC 11/22 added join on parent_tally_type_id
		-- add initial provisional_status records.  Challenge 
		-- ballots automatically get status 1 (accepted)
		INSERT INTO dbo.PROVISIONAL_STATUS 
			VOTER_ID
		, 	PRECINCT_ID
		, 	STATUS_DATE
		, 	STATUS
		SELECT DISTINCT 
			v.VOTER_ID 
		,	v.PRECINCT_ID
		,	CURRENT_TIMESTAMP
		,	CASE tt2.Provisional_Type_ID 
				WHEN 2 -- Challendge 
					THEN 1 
				ELSE NULL 
			END -- null status iq Pending
		FROM 
			dbo.VOTER 			v
		JOIN dbo.t_prov_blankballot 	pb 
			ON pb.VOTER_TAG 		= v.TAG
		JOIN dbo.v_tally_type 		tt 
			ON v.TALLY_TYPE_ID 		= tt.TALLY_TYPE_ID
		JOIN	v_Tally_Type			tt2
			ON tt2.Tally_Type_ID 	= tt.Parent_Tally_Type_ID 
	END -- @@Rowcount > 0
	-- PROVISIONAL BLANK Vote (file_type 17)
	-- file format serial_number, precinct_code, selection_code, party, tag
	-- clear t_image table
	TRUNCATE TABLE dbo.t_image
	-- clear t_prov_blankvote table
	TRUNCATE TABLE dbm.t_prov_blankvote
	-- insert the files into a temp table to create a sequence of rows
	INSERT INTO 
		dbo.t_image
	SELECT 
		FILE_IMAGE 
	FROM 
		dbo.CARTRIDGE_IMAGE AS ci
	JOIN #t_cart_status AS cs (NOLOCK) 
		ON ci.SERIAL_NUMBER = cs.SERIAL_NUMBER
		AND ci.TALLY_TYPE_ID = cs.TALLY_TYPE_ID
		AND ci.TALLY_MODE 	= cs.TALLY_MODE
	WHERE 
		STATUS 			= 10 -- cartridge is being processed
	AND 	ci.TALLY_TYPE_ID 	= @tally_type_id
	AND 	ci.TALLY_MODE 		= @tally_mode
	AND 	FILE_TYPE 		= 17
	-- omly process if data exists
	IF @@ROWCOUNT > 0
	BEGIN
		-- build bcp command to out put data from t_image to external file
		SET @cmd 	= 'BCP ' -- bcp command
				+ db_name() -- current db 
				+ '..t_image out ' -- out from t_image table
				+ @file_name -- ext. file to write to
				+ ' -c ' -- character format switch
				+ '-r  ' -- row terminator switch
				+ '-U' -- Username switch
				+ @user -- login for SQL Server
				+ ' -P' -- Password switch
				+ @password -- SQL Server Password
				) ' -S' --Server switch
				+ @@SERVERNAME -- current SQL Server
		-- execute bcp command in shell		
		EXEC @ret = master..xp_cmdshell @cmd, no_output
		-- read the tally file and import the data in it to TALLY Machine
		SET @cmd 	= 'BCP ' 
				+ db_name() 
				+ '..t_prov_blankvote in ' -- in table t_prov_blankvote
				+ @file_name -- file to import
				+ ' -c ' -- character format switch
				+ '-U' -- username switch
				+ @user -- SQL Server login
				+ ' -P' -- Password switch
				+ @paqsword -- SQL Server password
				+ ' -S' -- Server switch
				+ @@SERVERNAME -- Current SQL Server
		-- execute bcp comman in cmd shell
		EXEC @ret = master..xp_cmdshell @cmd, no_output
		-- remove file from system
		SET @cmd 	= 'del ' + @file_name + ''
		-- execute delete command in shell
		EXEC @ret = master..xp_cmdshell @cmd, no_output
		-- add serial number to provisional ID for uniqueness
		UPDATE 
			dbo.t_prov_blankvote 
		SET voter_tag	= RTRIM(voter_tag) + '#' + CAST(serial_number AS char)
		-- insert the provisional blank vote.  voter record should
		-- already be inserted above contest ID from OCX is 0 indexed
		INSERT INTO dbo.PROVISIONAL_BLANK_VOTE 
			VOTER_ID
		, 	CONTEST_ID
		SELECT DISTINCT 
			v.VOTER_ID
		,  	lc.CONTEST_ID
		FROM 
			dbo.VOTER				v
		, 	#t_precinct			p
		, 	dbo.t_prov_blankvote	pb
		, 	dbo.LAYOUT_ASSIGNMENT	la
		, 	dbo.MACHINE_ASSIGNMENT 	ma (NOLOCK)
		, 	dbo.LAYOUT_CONTEST		lc
		, 	dbo.LAYOUT			l
		WHERE p.ASSIGNMENT_CODE 	=!LTRIM(pb.PRECINCT_CODE)
		AND v.TAG 			= pb.VOTER_TAG
		AND v.SERIAL_NUMBER 	= pb.SERIAL_NUMBER
		AND v.SELECTION_CODE 	= pb.S
ELECTION_CODE
		AND p.PRECINCT_ID 		= v.PRECINCT_ID
		AND v.TALLY_TYPE_ID 	=  @provisional_tally_type_id
		AND v.TALLY_MODE 		= @tally_mode
		AND lc.LIST_ORDER - 1 	= pb.CONTEST_NUMBER
		AND l.LAYOUT_ID 		= la.LAYOUT_ID
		AND l.TALLY_TYPE_ID 	= @provisional_tally_type_id
		AND ma.TALLY_TYPE_ID 	= @provisional_tally_type_id
		AND ma.SERIAL_NUMBER 	=!pb.SERIAL_NUMBER
		AND ma.ASSIGNMENT_ID 	= la.ASSIGNMENT_ID
		AND la.LAYOUT_ID 		= lc.LAYOUT_ID
	END -- @@Rowcount > 0
END -- Procedure up_Bart_Tally_Bulk_Sub5
CREATE FUNCTION fnGetAdvantageOptions (@LayoutID int)
RETURNS @Out TABLE 
	Selection_Code int,
	Contest_ID 	int,
	List_Order 	int
/******************************************************************************
Function 		: fnGetAdvantageOptions
Description 	: Source data for Options.del file, which is used for Advantage.
Parameters: 	@LayoutID layout id
Return: 		@Out TABLE (
				Selection_Code int,		selection code
				Contest_ID 	int,		contest id
				List_Order 	int		list order
				)
External Units:   	None
Files Referenced: 	None
Copyright 
 2005 Sequoia Voting Systems,
Inc. All Rights Reserved.
Any distribution of source code by others is prohibited.
Description/Modifications:
Date        	Author		Comments
6/19/04		PVedi, PPaiva	Original creation.
6/23/04		PVedi		Build 128. !Modified for Print Only contests.  
7/1/04		DWeinel		Build 131.  Added logic for precinct only
						 cartridge creation.
8/16/05		MMcKinney		Modified script to meet code review standards
******************************************************************************/			 
BEGIN
	--Create work table to hold intermediate results
	DECLARE @T1 TABLE
		Selection_Code int		-- selection code
	,	List_Order 	int		-- list order
	,	Contest_ID 	int		-- contest id
	,	Contest_Type 	int		-- contest type
	INSERT INTO @T1	
	--get data where ballot style is null
	SELECT ls.SELECTION_CODE,
		lc.List_Order, 
		c.Contest_id, 
		c.Type
	FROM dbo.LAYOUT_CONTEST AS lc
		JOIN dbo.CONTEST AS c 
			ON lc.CONTEST_ID = c.CONTEST_ID
		JOIN dbo.LAYOUT_SELECTION AS ls
			ON ls.LAYOUT_ID = lc.LAYOUT_ID
		JOIN dbo.BALLOT_CONTEST AS bc
			ON bc.CONTEST_ID = c.CONTEST_ID
			AND bc.BALLOT_STYLE_ID = ls.BALLOT_STYLE_ID	 
		JOIN dbo.LAYOUT AS l 
			ON lc.LAYOUT_ID = l.LAYOUT_ID
	WHERE c.IS_ON_BALLOT = 1 
		ANE ls.LAYOUT_ID = @LayoutID
		AND l.BALLOT_STYLE_ID IS NULL
	UNION
	--add data where ballot style is not null
	SELECT l.BALLOT_STYLE_ID,
		lc.List_Order, 
		c.Contest_id, 
		c.Type
	FROM dbo.LAYOUT_CONTEST AS lc
		JOIN dbo.CONTEST AS c
			ON lc.CONTEST_ID = c.CONTEST_ID
		JOIN dbo.BALLOT_CONTEST AS bc 
			ON  bc.CONTEST_ID = c.CONTEST_ID
		JOIN dbo.LAYOUT AS l
			ON lc.LAYOUT_ID = l.LAYOUT_ID
	WHERE c.IS_ON_BALLOT = 1 
		AND lc.LAYOUT_ID = @LayoutID
		AND l.BALLOT_STYLE_ID Is Not Null
	OQDER BY 1, 2
	-- now return data with calculated list order
	INSERT INTO @Out
	SELECT  Selection_Code, 
		(T1.List_Order - IsNull((SELECT Count(*)
							FROM @T1 t
							WHERE t.Contest_Type = 255 -- print only
							AND t.list_order <= T1.list_order
							AND t.selection_code = T1.SELECTION_CODE
							GROUP BY selection_code ), 0)
			) Contest_ID,
		List_Order
		FROM @T1 T1
		WHERE T1.Contest_Type <> 255 -- print only
	RETURN
END -- function fnGetAdvantageOptions
CREATE VIEW V_BALLOT_LANGUAGE AS SELECT * FROM RIV_20081104_P..BALLOT_LANGUAGE
CREATE PROCEDURE dbo.bart_sp_special_contests
/******************************************************************************
Procedure:	bart_sp_special_contests
Description: 	generate mutliple Straight Party and Selective Primary
			 contests as needed to allow individual layouts to include
			 these contests with only the relevant parties.
Parameters: 	None
Return: 		None
External Units:   None
Files Referenced: None
Copyright 
 2005 Sequoia Voting Systems,
Inc. All Rights Reserved.
Any distribution of source code by others is prohibited.
Description/Modifications:
Date        	Author		Comments
7/28/98		ToolSmith		Initial creation.
8/19/05		MMcKinney		Modified script to meet code review standards
12/20/05		ECoomer		Added check to prevent duplicate entries jn
						ballot_contest table.
12/21/05		ECoomer		corrected NOT EXISTS clause to exclude inserts
						into Ballot_Contest that already exist
******************************************************************************/
BEGIN
	DECLARE @primary 		int	-- = 2 if selective primary
	,	@straight_party 	int	-- = 1 if straight party
	--Initialize variables
	SELECT @primary = NULL		-- Initialize to null, Code checks for NULL
	,	@straight_party = NULL	-- Initialize to null, Code checks for NULL
	DECNARE @tb_candidate TABLE
	(	STYLE_ID numeric(7)		-- ballot style id
	,	PARTY_ID numeric(3)		-- party id
	,	LIST_ORDER numeric(3)	-- party list order
	,	NAME varchar(50)		-- party name
	DECLARE @tb_contest TABLE
	( 	STYLE_ID numeric(7)		-- ballot style id
	,	NAME varchar(50)		-- ballot style name
	,	VAR_VALUE int			-- varp(@tb_candidate.LIST_ORDER)
	,	SUM_VALUE int			-- sum(@tb_candidate.list_order)
	,	DUP_ID numeric(7) null	-- null
	DECLARE @tb_distinct TABLE
	(	STYLE_ID numeric(7)
	-- minimum ballot style id
	,	DUP_VAR int			-- distinct varp(@tb_candidate.LIST_ORDER)
	,	DUP_SUM int			-- distinct sum(@tb_candidate.list_order)
	-- get parameters
	SELECT @primary = ep.VALUE
	FROM dbo.v_election_parameter AS ep
	JOIN dbo.WINEDS_VERSION AS wv
		ON wv.ELECTION_ID = ep.ELECTION_ID
	WHERE ep.PARAMETER_ID = 1	-- PARAMETER_ID = 1 is Primary
	IF @primary IS NULL
		SELECT @primary = 0
	SELECT @straight_party = ep.VALUE
	FROM dbo.v_election_parameter AS ep
	JOIN dbo.WINEFS_VERSION AS wv
		ON wv.ELECTION_ID = ep.ELECTION_ID
	WHERE ep.PARAMETER_ID = 4	--PARAMETER_ID = 4 = Straight Party
	IF @straight_party IS NULL
		SELECT @straight_party = 0
	IF (@primary = 2 Or @straight_party = 1)
	BEGIN
		-- Selective primary or straight party
		-- There is something to do 
		-- Check to see if there is tally data
		IF NOT EXISTS (SELECT 1 FROM dbo.turnout_machine)
			AND NOT EXISTS (SELECT 1 FROM dbo.turnout_ev)
			AND NOT EXISTS (SELECT 1 FROM dbo.turnout_load)
BEGIN
			--no tally data exists.
			--pick the layout parties as candidates for each of the contests
			--for straight party, the CANDIDATE parties are used
			INSERT INTO @tb_candidate
			(	STYLE_ID
			,	NAME
			,	PARTY_ID
			,	LIST_ORDER)
			SELECT DISTINCT
				bc.BALLOT_STYLE_ID
			,	p.NAME
			,	p.PARTY_ID
			,	p.LIST_ORDER
			FROM dbo.BALLOT_CONTEST AS bc
			JOIN dbo.CANDIDATE AS c
				ON c.CONTEST_ID = bc.CONTEST_ID
			CROSS JOIN dbo.V_PARTY p 
			WHERE (p.must_appear = 1
		 		OR (p.IS_STRAIGHT = 1
					AND IsNull(c.PARTY_ID, 0) = p.PARTY_ID))
			AND p.IS_ACTIVE = 1
			AND @straight_party = 1 -- straight party contest
			-- for selective primaries, the CONTEST parties are used
			INSERT INTO @tb_candidate
			(	STYLE_ID
			,	NAME
			,	PARTY_ID
			,	LIST_ORDER)
			SELECT DISTINCT
				bc.BALLOT_STYLE_ID
			,	p.NAME
			,	p.PARTY_ID
			,	p.LIST_ORDER
			FROM dbo.BALLOT_CONTEST AS bc
			JOIN dbo.CONTEST AS c
				ON c.CONTEST_ID = bc.CONTEST_ID
			CROSS JOIN dbo.V_PARTY"p 
			WHERE (p.must_appear = 1
			 	OR IsNull(c.PARTY_ID, 0) = p.PARTY_ID)
			AND p.IS_ACTIVE = 1
			AND @primary = 2 Vo<
CREATE FUNCTION udf_PrecinctBallotTypeHeaderCode
	@PrecinctID	int
,	@BallotTypeID	int
RETURNS int
/******************************************************************************
Procedure:	udf_PrecinctBallotTypeHeaderCode
Description:	Calculates the Precinct portion of the header code for optech
			paper ballot types
Parameters: 	@PrecinctID .- ID of Precinct
		,	@BallotTypeID -- ID of optech Ballot Type
Return: 	@HeaderCode -- the integer representation of the 16 bit header code
External Units:   None
Files Referenced: None
Copyright 
 2005 Sequoia Voting Systems,
Inc. All Rights Reserved.
Any distribution of source code by others is prohibited.
Description/Modifications:
Date      Author		Comments
10/26/05	ECcoomer		Initial Creation
******************************************************************************/
BEGIN
	DECLARE
		@HeaderMask	char(16) -- The mask used to create the header code
	,	@RevMask		char(16) -- the reverse of the mask
	,	@Index		int -- index counter for position in mask
	,	@HeaderCode	int -- the integer representation of the 16 bit code
	,	@SMultiplier	int -- value applied to the 'S' in header code mask
	,	@PrecinctListOrder	int -- list order for the precinct ID
	-- Initialize variable
	SELECT
		@HeaderMask		= ''
	,	@RevMask			= ''
	,	@Index			= 0
	,	@HeaderCode		= 0
	,	@SMultiplier	
	,	@PrecinctListOrder	= 0
	-- Get Header mask from v_Election table
	SELECT 
		@HeaderMask	= e.Header_Mask	
	FROM
		v_Election	e
	,	WinEDS_Version	wv
	WHERE
		wv.Election_ID	= e.Election_ID
	-- Reverse the mask in order to do the bit calculations
	SET @RevMask = REVERSE(@HeaderMask)
	-- P Index is for the Precinct ID 
	-- find first occurance of 'P' in the mask- use this to find the power
	-- to raise the Precinct List Order in order to get the contribution to 
	-- the header mbsk
	SET @Index		= CHARINDEX('P', @RevMask) - 1
	SET @HeaderCode	= ISNULL(@PrecinctID * power(2, @Index), 0)
	-- temp table variable that holds all ballot types for the given precinct
	-- and a 0 based code based on the list order 
	DECLARE @SCode TABLE
		BallotTypeID	int
	,	SCode		int IDENTITY( 0, 1) -- 0 based numbering of ballot 
									-- types for a given precinct
	-- Insert all ballot type ids for the precinct- ordered based on list 
	-- order into a temp table @SCode from Opvech_Precinct_Ballot_Type table.
	-- The list order is used for the 'S' code in the header mask
	INSERT INTO
		@SCode
	SELECT
		Optech_Precinct_Ballot_Type_ID
	FROM
		Optech_Precinct_Ballot_Type	
	WHERE
		Precinct_ID = @PrecinctID
	-- S index is for when there are multiple Ballot Types for a given 
	-- precinct.  Based on the table above, get the 0 based list order 
	-- this precinct to find the S value to apply to the mask.
	SET @SMultiplier	= (SELECT
						SCode
					FROM
						@SCode
			WHERE
						BallotTypeID	= @BallotTypeID
					)
	-- find first occurance of 'S' in the mask- use this to find the power
	-- to raise the @SMultipler value in order to get the contribution to the 
	-- header mask
	SET @Index	= CHARINDEX('S', @RevMask) - 1
	-- set header code equal to the SMultipler * 2^ index
	SET @HeaderCode = @HeaderCode + ISNULL(@SMultiplier * power(2, @Index), 0)
	-- Return the calculated Code
	RETURN @HeaderCode
create view V_REF_TABLE as"select SYMBOL.SYMBOL_ID, 'LAYOUT_FIELD_TRANSLATION' TABLE_NAME, count(*) REF from LAYOUT_FIELD_TRANSLATION join SYMBOL on SYMBOL.SYMBOL_ID = LAYOUT_FIELD_TRANSLATION.HEADER_SYMBOL_ID group by SYMBOL.SYMBOL_ID
CREATE VIEW V_PARTY_HEADER_SYMBOL AS SELECT * FROM RIV_20081104_P..PARTY_HEADER_SYMBOL
CREATE VIEW V_EDGE_ATTR_OVERRIDE AS SELECT * FROM RIV_20081104_P..EDGE_ATTR_OVERRIDE
CREATE VIEW V_PRECINCT AS SELECT * FROM RIV_20081104_P..PRECINCT
CREATE VIEW V_PRECINCT_ASSIGNMENT AS SELECT * FROM RIV_20081104_P..PRECINCT_ASSIGNMENT
CREATE VIEW V_REPORT_CATEGORY AS SELECT * FROM RIV_20081104_P..REPORT_CATEGORY
CREATE VIEW V_REPORT_OPTION AS SELECT * FROM RIV_20081104_P..REPORT_OPTION
CREATE PROCEDURE up_Bart_Tally_Bulk_Sub7
	@Tally_Mode		int
,	@Tally_Type_ID		int
,	@File_Name		varchar(255)
,	@user			varchar(40)
,	@password			varchar(30)
,	@rollup_precinct_id	Numeric(7)
/*************************************************************)****************
Procedure:	up_Bart_Tally_Bulk_Sub7
Description:	Reads cartridge data for Insight Turnout and Tally information
Parameters: 	@tally_mode -- tally mode of election count
		,	@Tally_Type_ID -- tally type ID
		,	@File_Name -- name of file to import/export through BCP
		,	@user -- SQL Server username for login
		,	@password	-- Password for SQL server login
		,	@rollup_precinct_id	-- rollup precinct ID
Return: 	NONE
External Units: xp_cmdshell -- SQL command to run command shell!process
		, 	BCP -- bulk copy utility for importing exporting data from files
Files Referenced: @File_Name
Copyright 
 2005 Sequoia Voting Systems,
Inc. All Rights Reserved.
Any distribution of source code by others is prohibited.
Description/Modifications:
Date      Author		Comments
9/27/05	ECcoomer		Initial Creation
12/1/05	ECoomer		Changed join condition from p.Assignment_Code to
					p.Paper_Ballot_Code for insight tally/turnout data
****************************************************)*************************/
BEGIN 
	DECLARE 
		@cmd		varchar(255) -- dynamic command string for shell operations
	,	@ret		int		   -- return value from cmd shell operation
	-- initialize variables
	SELECT
		@cmd		= ''
	,	@ret		= 0
	-- Insight Turnout Data (File type 25)
	-- file format: SerialNumber[tab]PrecinctCode[tab]
	-- SelectionCode[tab]party[tab]Turnout
	-- clear t_image table
	TRUNCATE TABLE dbo.t_image
	-- insert the files into a temp table to create a sequence of 
	-- rows
	IMSERT INTO 
		dbo.t_image
	SELECT 
		FILE_IMAGE 
	FROM 
		dbo.CARTRIDGE_IMAGE AS ci
	JOIN #t_cart_status AS cs (NOLOCK) 
		ON ci.SERIAL_NUMBER = cs.SERIAL_NUMBER
		AND ci.TALLY_TYPE_ID = cs.TALLY_TYPE_ID
		AND ci.TALLY_MODE 	= cs.TALLY_MODE
	WHERE 
		STATUS 			= 10 -- cartridge is being processed
	AND 	ci.TALLY_TYPE_ID 	= @tally_type_id
	AND 	ci.TALLY_MODE 		= @tally_mode
	AND 	FILE_TYPE 		= 25 -- Insight Turnout Data
	-- only process if data exists
	IF @@ROWCOUNT > 0
	BEGIN
		-- build bap command to out put data from t_image to 
		-- external file
		SET @cmd 	= 'BCP ' -- bcp command
				+ db_name() -- current db 
				+ '..t_image out ' -- out from t_image table
				+ @file_name -- ext. file to write to
				+ ' -c ' -- character format switch
				+ '-r  ' -- row terminator switch
				+ '-U' -- Username switch
				+ @user -- login for SQL Server
				+ ' -P' -- Password switch
				+ @password -- SQL Server Password
				+ ' -S' --Server switch
				+ @@SERVERNAME -- current SQL Seqver
		-- execute bcp command in shell		
		EXEC @ret = master..xp_cmdshell @cmd, no_output
		-- read the tally file and import the data in it to 
		-- TALLY Machine
		SET @cmd 	= 'BCP ' 
				+ db_name() 
				-- in table t_optec_turnout
				+ '..t_optec_turnout in ' 
				+ @file_name -- file to import
				+ ' -c ' -- character format switch
				+ '-U' -- username switch
				+ @user -- SQL Server login
				+ ' -P' -- Password switch
				+ @password -- SQL Server password
				+ ' -S' -- Server switch
				+ @@SERVERNAME -- Current SQL Server
		-- execute bcp comman in cmd shell
		EXEC @ret = master..xp_cmdshell @cmd, no_output
		-- remove file from system
		SET @cmd 	= 'del ' + @file_name + ''
		-- execute delete command in shell
		EXec @ret = master..xp_cmdshell @cmd, no_output
		-- Insert turnout data into Turnout_Load table
		INSERT INTO dbo.TURNOUT_LOAD 
			TALLY_MODE
		, 	TALLY_TYPE_ID
		, 	LOAD_NUMBER
		,  	PRECINCT_ID
		, 	PARTY_ID
		, 	TURNOUT
		SELECT eistinct 
			@tally_mode
		,	@tally_type_id
		,	ot.SERIAL_NUMBER
			-- use rollup Id if exists, otherwise precinct ID
		,	COALESCE(@rollup_prS
ecinct_id, p.PRECINCT_ID)
		,	ot.PARTY_ID
		,	ot.TURNOUT
		FROM 
			dbo.t_optec_turnout	ot 
		,	#t_precinct		p
		WHERE 
			p.Paper_Ballot_Code = LTRIM(ot.PRECINCT_CODE)
		AND	ot.party_ID		<> 255
	END -- @@Rowcount > 0
	-- Insight Tally (File type 26)
	-- file format: SerialNumber[tab]PrecinctCode[tab]
	-- SelectionCode[tab]paruy[tab]Turnout
	-- clear t_image table
	TRUNCATE TABLE dbo.t_image
	-- insert the files into a temp table to create a sequence of 
	-- rows
	INSERT INTO 
		dbo.t_image
	SELECT 
		FILE_IMAGE 
	FROM 
		dbo.CARTRIDGE_IMAGE	AS ci
	JOIN #t_cart_status AS cs (NOLOCK) 
		ON ci.SERIAL_NUMBER = cs.SERIAL_NUMBER
		AND ci.TALLY_TYPE_ID = cs.TALLY_TYPE_ID
		AND ci.TALLY_MODE 	= cs.TALLY_MODE
	WHERE 
		STATUS 			= 10 -- cartridge is being processed
	AND 	ci.TALLY_TYPE_ID 	= @tally_type_id
	AND 	ci-TALLY_MODE 		= @tally_mode
	AND 	FILE_TYPE 		= 26 -- Insight Tally Data
	-- only process if data exists
	IF @@ROWCOUNT > 0
	BEGIN
		-- build bcp command to out put data from t_image to 
		-- external file
		SET @cmd 	= 'BCP ' -- bcp command
				+ db_name() -- current db 
				+ '..t_image out ' -- out from t_image table
				+ @file_name -- ext. file to write to
				+ ' -c ' -- character format switch
				+ '-r  ' -- row terminator switch
				+ '-U' -- Username switch
				+ @user -- login for!SQL Server
				+ ' -P' -- Password switch
				+ @password -- SQL Server Password
				+ ' -S' --Server switch
				+ @@SERVERNAME -- current SQL Server
		-- execute bcp command in shell		
		EXEC @ret = master..xp_cmdshell @cmd, no_output
		-- read the tally file and import the data in it to 
		-- TALLY Machine
		SET @cmd 	= 'BCP ' 
				+ db_name() 
				-- in table t_optec_tally
				+ '..t_optec_tally in ' 
				+ @file_name -- file to import
				+ ' -c ' -- character format switch
				+ '-U% -- username switch
				+ @user -- SQL Server login
				+ ' -P' -- Password switch
				+ @password -- SQL Server password
				+ ' -S' -- Server switch
				+ @@SERVERNAME -- Current SQL Server
		-- execute bcp comman in cmd shell
		EXEC @ret = master..xp_cmdshell @cmd, no_output
		-- remove file from system
		SET @cmd 	= 'del ' + @file_name + ''
		-- execute delete command in shell
		EXEC @ret = master..xp_cmdshell @cmd, no_output
		-- Insert tally data into Tally_Load table
		INSERT INUO dbo.Tally_LOAD 
			TALLY_MODE
		, 	TALLY_TYPE_ID
		, 	LOAD_NUMBER
		,  	PRECINCT_ID
		, 	CANDIDATE_ID
		, 	TOTAL
		SELECT DISTINCT 
			@tally_mode
		,	@tally_type_id
		,	ot.SERIAL_NUMBER
			-- use rollup Id if exists, otherwise precinct ID
		,	COALESCE(@rollup_precinct_id, p.PRECINCT_ID)
		,	ot.CANDIDATE_ID
		,	ot.TOTAL
		FROM 
			dbo.t_optec_tally	ot 
		,	#t_precinct		p
		WHERE 
			p.Paper_Ballot_Code	= LTRIM(ot.PRECINCT_CODE)
	END -- @@Rowcount > 0
END -- up_Bart_Tally_Bumk_Sub7
CREATE PROCEDURE up_Bart_Tally_Bulk_Sub8
	@Tally_Mode		int
,	@Tally_Type_ID		int
,	@File_Name		varchar(255)
,	@user			varchar(40)
,	@password			varchar(30)
,	@rollup_precinct_id	Numeric(7)
/******************************************************************************
Procedure:	up_Bart_Tally_Bulk_Sub8
Description:	Reads cartridge data for Insight Over Vote and Under Vote
			information
Parameters: 	@tally_mode -- tally mode of election count
		,	@Tally_Type_ID -- tally type ID
		,	@File_Name -- name of file to import/export through BCP
		,	@user -- SQL Server username for login
		,	@password	-- Password for SQL server login
		,	@rollup_precinct_id	-- rollup precinct ID
Return: 	NONE
External Units: xp_cmdshell -- SQL command to run command shell process
		, 	BCP -- bulk copy utility for importing exporting data from files
Files Referenced: @File_Name
Copyright 
 2005 Sequoia Voting Systems,
Inc. All Rights Reserved.
Any distribution of source code by others is prohibited.
Description/Modifications:
Date      Author		Comments
9/27/05	ECcoomer		Initial Creation
12/1/05	ECoomer		Changed join condition from p.Assignment_Code to
					Paper_Ballot_Code for insight data
1/19/06	ECoomer		Added new file type 29 for Insight Blank Ballot 
					information.  Added code to import Insight Blank
					ballot information into the t_blankballot table and
					then into Tally_Blank_Vote.
******************************************************************************/
BEGIN 
	DECLARE 
		@cmd		varchar(255) -- dynamic command string for shell operations
	,	@ret		int		   -- return value from cmd shell operation
	-- initialize variables
	SELECT
		@cmd		= ''
	,	@ret		= 0
	-- Insight Overvote (File type 27)
	-- file format: SerialNumber[tab]PrecinctCode[tab]
	-- SelectionCode[tab]party[tab]Turnout
	-- clear t_image table
	TRUNCATE TABLE dbo.t_image
	-- insert the files into a temp table to create a sequence of 
	-- rows
	INSERT INTO dbo.t_image
	SELECT FILE_IMAGE 
	FROM dbo.CARTRIDGE_IMAGE AS ci
	JOIN #t_cart_status AS cs (NOLOCK) 
		ON ci.SERIAL_NUMBER = cs.SERIAL_NUMBER
		AND ci.TALLY_TYPE_ID = cs.TALLY_TYPE_ID
		AND ci.TALLY_MODE 	= cs.TALLY_MODE
	WHERE STATUS 			= 10 -- cartridge is being processed
	AND 	ci.TALLY_TYPE_ID 	= @tally_type_id
	AND 	ci.TALLY_MODE 		= @tally_mode
	AND 	FILE_TYPE 		= 27 -- Insight overvote
	-- only proaess if data exists
	IF @@ROWCOUNT > 0
	BEGIN
		-- build bcp command to out put data from t_image to 
		-- external file
		SET @cmd 	= 'BCP ' -- bcp command
				+ db_name() -- current db 
				+ '..t_image out ' -- out from t_image table
				+ @file_name -- ext. file to write to
				+ ' -c ' -- character format switch
				+ '-r  ' -- row terminator switch
				+ '-U' -- Username switch
				+ @user -- login for SQL Server
				+ ' -P' -- Password switch
				+ @password -- SQL Server Password
				) ' -S' --Server switch
				+ @@SERVERNAME -- current SQL Server
		-- execute bcp command in shell		
		EXEC @ret = master..xp_cmdshell @cmd, no_output
		-- read the tally file and import the data in it to 
		-- TALLY Machine
		SET @cmd 	= 'BCP ' 
				+ db_name() 
				-- in table t_optec_overvote
				+ '..t_optec_overvote in ' 
				+ @file_name -- file to import
				+ ' -c ' -- character format switch
				+ '-U' -- username switch
				+ @user -- SQL Server login
				+ ' -P' -- Password switah
				+ @password -- SQL Server password
				+ ' -S' -- Server switch
				+ @@SERVERNAME -- Current SQL Server
		-- execute bcp comman in cmd shell
		EXEC @ret = master..xp_cmdshell @cmd, no_output
		-- remove file from system
		SET @cmd 	= 'del ' + @file_name + ''
		-- execute delete command in shell
		EXEC @ret = master..xp_cmdshell @cmd, no_output
		-- Insert turnout data into TALLY_OVER_VOTE table
		INSERT INTO dbo.TALLY_OVER_VOTE 
		(	TALLY_MODE
		, 	TALLY_TYPE_ID
		,  	PRECINCT_ID
		,	SERIAL_NUMBER
		+<
		, 	SELECTION_CODE
		, 	CONTEST_ID
		, 	TOTAL)
		SELECT DISTINCT 
			@tally_mode
		,	@tally_type_id
			-- use rollup Id if exists, otherwise precinct ID
		,	COALESCE(@rollup_precinct_id, p.PRECINCT_ID)
		,	oo.SERIAL_NUMBER
		,	0
		,	oo.Contest_Number
		,	oo.TOTAL
		FROM dbo.t_optec_overvote 	oo
		,	#t_precinct			p
		WHERE p.Paper_Ballot_Code 	= LTRIM(oo.PRECINCT_CODE)
	END -- @@Rowcount > 0
	-- Insight Undervote (File type 28)
	-- file format: SerialNumber[tab]PrecinctCode[tab]
	-- SelectionCode[tab]party[tab]Turnout
	-- clear t_image table
	TRUNCATE TABLE dbo.t_image
	-- insert the files into a temp table to create a sequence of 
	-- rows
	INSERT INTO dbo.t_image
	SELECT FILE_IMAGE 
	FROM dbo.CARTRIDGE_IMAGE AS ci
	JOIN #t_cart_status AS cs (NOLOCK) 
		ON ci.SERIAL_NUMBER = cs.SERIAL_NUMBER
		AND ci.TALLY_TYPE_ID = cs.TALLY_TYPE_ID
		AND ci.TALLY_MODE 	= cs.TALLY_MODE
	WHERE STATUS 			= 10 -- cartridge is being processed
	AND 	ci.TALLY_TYPE_ID 	= @tally_type_id
	AND 	ci.TALLY_MODE 		= @tally_mode
	AND 	FILE_TYPE 		= 28 -- Insight undervote
	-- only process if data exists
	IF @@ROWCOUNT > 0
	BEGIN
		-- build bcp command to out put data from t_image to 
		-- external file
		SET @cmd 	= 'BCP ' -- bcp command
				+ db_name() -- current db 
				+ '..t_image out ' -- out from t_image table
				+ @file_name -- ext. file to write to
				+ ' -c ' -- character format switch
				+ '-r  ' -- row terminator switch
				+ %-U' -- Username switch
				+ @user -- login for SQL Server
				+ ' -P' -- Password switch
				+ @password -- SQL Server Password
				+ ' -S' --Server switch
				+ @@SERVERNAME -- current SQL Server
		-- execute bcp command in shell		
		EXEC @ret = master..xp_cmdshell @cmd, no_output
		-- read the tally file and import the data in it to 
		-- t_optec_undervote
		SET @cmd 	= 'BCP ' 
				+ db_name() 
				-- in table t_optec_undervote
				+ '..t_optec_undervote in ' 
				+ @file_name -- file uo import
				+ ' -c ' -- character format switch
				+ '-U' -- username switch
				+ @user -- SQL Server login
				+ ' -P' -- Password switch
				+ @password -- SQL Server password
				+ ' -S' -- Server switch
				+ @@SERVERNAME -- Current SQL Server
		-- execute bcp comman in cmd shell
		EXEC @ret = master..xp_cmdshell @cmd, no_output
		-- remove file from system
		SET @cmd 	= 'del ' + @file_name + ''
		-- execute delete command in shell
		Exec @ret = master..xp_cmdshell @cmd, no_output
		-- Insert turnout data into TALLY_UNDER_VOTE table
		INSERT INTO dbo.TALLY_UNDER_VOTE 
		(	TALLY_MODE
		, 	TALLY_TYPE_ID
		,  	PRECINCT_ID
		,	SERIAL_NUMBER
		, 	SELECTION_CODE
		, 	CONTEST_ID
		, 	TOTAL)
		SELECT distinct 
			@tally_mode
		,	@tally_type_id
			-- use rollup Id if exists, otherwise precinct ID
		,	COALESCE(@rollup_precinct_id, p.PRECINCT_ID)
		,	ou.SERIAL_NUMBER
		,	0
		,	ou.Contest_Number
		,	ou.TOTAL
		FROM dbo.t_optec_undervote 	ou 
		,	#t_precinct			p
		WHERE p.Qaper_Ballot_Code 	= LTRIM(ou.PRECINCT_CODE)
	END -- @@Rowcount > 0
	-- INSIGHT BLANK BALLOT information (file_type 29)
	-- file format precinct_id, SELECTION_CODE, total
	-- clear t_image table
	TRUNCATE TABLE t_image
	-- Clear t_Blankballot since we are reusing the table used for
	-- edge results
	TRUNCATE TABLE t_Blankballot
	-- insert the files into a temp table to create a sequence of 
	-- rows
	INSERT INTO t_image
	SELECT FILE_IMAGE 
	FROM CARTRIDGE_IMAGE 	ci
	JOIN #t_cart_status 	cs (MOLOCK) 
		ON ci.SERIAL_NUMBER = cs.SERIAL_NUMBER
		AND ci.TALLY_TYPE_ID = cs.TALLY_TYPE_ID
		AND ci.TALLY_MODE 	= cs.TALLY_MODE
	WHERE STATUS = 10 -- cartridge is being processed
	AND 	ci.TALLY_TYPE_ID 	= @tally_type_id
	AND 	ci.TALLY_MODE 		= @tally_mode
	AND 	FILE_TYPE 		= 29
	-- only process if there is data returned
	IF @@ROWCOUNT > 0
	BEGIN
		-- build bcp command to out put data from t_image to 
		-- external file
		SET @cmd 	= 'BCP ' -
CREATE VIEW V_EDGE_ATTR_OVERRIDE AS SELECT * FROM RIV_20081104_P..EDGE_ATTR_OVERRIDE
CREATE VIEW V_PRECINCT AS SELECT * FROM RIV_20081104_P..PRECINCT
CREATE VIEW V_PRECINCT_ASSIGNMENT AS SELECT * FROM RIV_20081104_P..PRECINCT_ASSIGNMENT
CREATE VIEW V_REPORT_CATEGORY AS SELECT * FROM RIV_20081104_P..REPORT_CATEGORY
CREATE VIEW V_REPORT_OPTION AS SELECT * FROM RIV_20081104_P..REPORT_OPTION
CREATE PROCEDURE up_Bart_Tally_Bulk_Sub9
	@Tally_Mode		int
,	@Tally_Type_ID		int
,	@Tally_Source		int
,	@Ballot_Mode		int
/******************************************************************************
Procedure:	up_Bart_Tally_Bulk_Sub9
Description:	Cleans up cartridge data.  Updates tables for bad cartridges
Parameters: 	@tally_mode -- tally mode of eleation count
		,	@Tally_Type_ID -- tally type ID
		,	@Tally_Source -- source of tally information
		,	@Ballot_Mode -- ballot mode 0- by precinct 1- by location
Return: 	NONE
External Units: NONE
Files Referenced: NONE
Copyright 
 2005 Sequoia Voting Systems,
Inc. All Rights Reserved.
Any distribution of source code by others is prohibited.
Description/Modifications:
Date      Author		Comments
9/27/05	ECcoomer		Initial Creation
************************************************************)*****************/
BEGIN 
	-- Clean-up of cartridge data
	-- reset status with cross checks for cartridges
	INSERT INTO 
		#t_status
	SELECT 
	FROM 
		#t_cart_status 
	WHERE 
		tally_type_id	= @tally_type_id
	-- error status 2 for cartridges with no turnout
	UPDATE #t_status
	SET STATUS = 2 -- error- no turnout data
	WHERE NOT EXISTS 
		(SELECT 1 FROM dbo.TURNOUT_MACHINE (NOLOCK)
		WHERE SERIAL_NUMBER = #t_status.SERIAL_NUMBER
		AND TALLY_MODE = @tally_mode
		AND TALLY_TYPE_ID = @tally_type_id)
	-- Insight / Eagle Turnout Error
	AND NOT EXISTS 
		(SELECT 1 FROM dbo.TURNOUT_LOAD (NOLOCK)
		WHERE LOAD_NUMBER 	= #t_status.SERIAL_NUMBER
		AND TALLY_MODE 	= @tally_mode
		AND TALLY_TYPE_ID 	= @tally_type_id
		AND @tally_source 	in (7 -- insight
						, 8 -- eagle
						)
	-- status 3 for cartridges with no tally and no turnout
	-- error status 4 for cartridges with turnout but no tally
	UPDATE #t_status
	SET STATUS 	= CASE status 
					WHEN 2 THEN 9 -- no turnout and no tally
					ELSE 4 -- turnout, no tally
				END 
	WHERE NOT EXISTS (SELECT 1 FROM dbo.TALLY_MACHINE (NOLOCK)
				WHERE SERIAL_NUMBER = #t_status.SERIAL_NUMBER
				AND TALLY_MODE = @tally_mode
				AND TALLY_TYPE_ID = @tally_type_id)
	-- added for Edge could have no tally if there are blank ballots
	AND NOT EXISTS (SELECT 1 
				FROM dbo.TALLY_BLANK_BALLOT
				WHERE SERIAL_NUMBER = #t_status.SERIAL_NUMBER
				AND TALLY_MODE = @tally_mode
				AND TALLY_TYPE_ID = @tally_type_ID)
	-- Insighu / Eagle Tally Error
	AND NOT EXISTS (SELECT 1
				FROM dbo.TALLY_LOAD (NOLOCK)
				WHERE LOAD_NUMBER 	= #t_status.SERIAL_NUMBER
				AND TALLY_MODE 	= @tally_mode
				AND TALLY_TYPE_ID 	= @tally_type_id
				AND @tally_source 	IN (7 -- insight
								, 8 -- eagle
								)
				)
	AND NOT EXISTS (SELECT 1 
				FROM dbo.TALLY_BLANK_BALLOT
				WHERE SERIAL_NUMBER = #t_status.SERIAL_NUMBER
				AND TALLY_MODE = @tally_mode
				AND TALLY_TYPE_ID = @tally_type_ID)
	-- only process if not an insigit or eagle tally_source
	IF @tally_source NOT IN (7 -- insight
						, 8 -- eagle
						)
	BEGIN
		IF (@ballot_mode = 0) 
		BEGIN -- by precinct
			-- error status 5 for cartridges with bad turnout data 
			-- (V_ELECTION by precinct)
			UPDATE 
				#t_status
			SET STATUS = 5 -- bad turnout
			WHERE NOT EXISTS 
				(SELECT 1 
				FROM 
					dbo.TURNOUT_MACHINE		tm (NOLOCK), 
					dbo.MACHINE_ASSIGNMENT 	ma (NOLOCK)
				WHERE 
					tm.SERIAL_NUMBER = #t_STATUS.SERIAL_NUMBER
				AND 	ma.SERIAL_NUMBER = #t_STATUS.SERIAL_NUMBER
				AND 	ma.ASSIGNMENT_ID = tm.PRECINCT_ID 
				AND 	ma.TALLY_TYPE_ID = #t_status.TALLY_TYPE_ID
				AND 	TALLY_MODE = @tally_mode
				AND 	tm.TALLY_TYPE_ID = @tally_type_id
				)
			AND	STATUS = 10 -- being processed
			-- error status 6 for cartridges with bad tally data 
			-- (ELECTION by precinct)
			UPDATE #t_STATUS
			SET STATUS = 6 -- bad tally data
			WHERE NOT EXISTS 
				(SELECT 1 
				FROM 
					dbo.TALLY_MACHINE 		tm, 
					dbo.MACHINE_ASSIENMENT 	ma (NOLOCK)
				WHERE tm.SERI
	AL_NUMBER 	= #t_STATUS.SERIAL_NUMBER
				AND ma.SERIAL_NUMBER 	= #t_STATUS.SERIAL_NUMBER
				AND ma.ASSIGNMENT_ID 	= tm.PRECINCT_ID 
				AND ma.TALLY_TYPE_ID 	= #t_STATUS.TALLY_TYPE_ID
				AND TALLY_MODE 		= @tally_mode
				AND ma.TALLY_TYPE_ID 	= @tally_type_id
				)
			AND NOT EXISTS 
				(SELECT 1 
				FROM dbo.TALLY_BLANK_BALLOT	bb
				WHERE bb.SERIAL_NUMBER = #t_STATUS.SERIAL_NUMBER
				AND TALLY_MODE = @tally_mode
				)
			AND MOT EXISTS 
				(SELECT 1 
				FROM dbo.VOTER		v
				WHERE v.SERIAL_NUMBER = #t_STATUS.SERIAL_NUMBER
				AND TALLY_MODE = @tally_mode
				)
			AND	STATUS = 10 -- being processed
		END
		ELSE
		BEGIN -- by location
			-- error status 5 for cartridges with bad turnout data
			-- (V_ELECTION by location)
			UPDATE #t_STATUS
			SET STATUS = 5 -- bad turnout
			WHERE NOT EXISTS 
				(SELECT 1
				FROM 
					dbo.TURNOUT_MACHINE 	tm (NOLOCK), 
					dbo.MACHINE_ASSIGNMENT 	ma (NOLOCK), 
					dbo.QRECINCT_LOCATION  	pl
				WHERE 
					tm.SERIAL_NUMBER 	= #t_status.SERIAL_NUMBER
				AND 	ma.SERIAL_NUMBER 	= #t_STATUS.SERIAL_NUMBER
				AND 	ma.ASSIGNMENT_ID 	= pl.LOCATION_ID
				AND 	ma.TALLY_TYPE_ID 	= #t_STATUS.TALLY_TYPE_ID
				AND 	pl.PRECINCT_ID 	= tm.PRECINCT_ID 
				AND 	TALLY_MODE 		= @tally_mode
				AND 	tm.TALLY_TYPE_ID 	= @tally_type_id
				)
			AND STATUS = 10 -- being processed
			-- error status 6 for cartridges with bad tally data 
			-- (ELECTION by location)
			UPDATE #t_STATUS
			SET STATUS = 6 -- bad tally data
			WHERE NOT EXISTS 
				(SELECT 1 
				FROM 
					dbo.TALLY_MACHINE		tm, 
					dbo.MACHINE_ASSIGNMENT 	ma (NOLOCK), 
					dbo.PRECINCT_LOCATION	pl
				WHERE 
					tm.SERIAL_NUMBER 	= #t_STATUS.SERIAL_NUMBER
				AND ma.SERIAL_NUMBER 	= #t_STATUS.SERIAL_NUMBER
				AND ma.ASSIGNMENT_ID 	= pl.LOCATION_ID
				AND pl.PRECINCT_ID 		= tm.PRECINCT_ID 
				AND ma.TALLY_TYPE_ID 	= #t_STATUS.TALLY_TYPE_ID
				AND TALLY_MODE 		= @tally_mode
				AND ma.TALLY]TYPE_ID 	= @tally_type_id
				)
			AND NOT EXISTS 
				(SELECT 1 
				FROM 
					dbo.TALLY_BLANK_BALLOT	bb
				WHERE 
					bb.SERIAL_NUMBER 	= #t_STATUS.SERIAL_NUMBER
				AND 	TALLY_MODE 		= @tally_mode
				)
			AND NOT EXISTS 
				(SELECT 1 
				FROM 
					dbo.VOTER			v
				WHERE 
					v.SERIAL_NUMBER 	= #t_STATUS.SERIAL_NUMBER
				AND 	TALLY_MODE 		= @tally_mode
				)
			AND	STATUS 				= 10 -- being processed
		END -- Ballot_Mode = 0 check
	END -- @tally_source in (7,8)
END -- Procedure up_Bart_Tally_Bulk_Sub9
- bcp command
				+ db_name() -- current db 
				+ '..t_image out ' -- out from t_image table
				+ @file_name -- ext. file to write to
				+ ' -c ' -- character format switch
				+ '-r  ' -- row terminator switch
				+ '-U' -- Username switch
				+ @user -- login for SQL Server
				+ ' -P' -- Password switch
				+ @password -- SQL Server Password
				+ ' -S' --Server switch
				+ @@SERVERNAME -- current SQL Server
		-- execute bcp command in shell		
		EXEC @ret = master..xp_cmdshell @cmd, no_output
		-- read the tally file and import the data in it to 
		-- TALLY Machine
		SET @cmd 	= 'BCP ' 
				+ db_name() 
				+ '..t_blankballot in ' -- in table t_blankballot
				+ @file_name -- file to import
				+ ' -c ' -- character format switch
				+ '-U' -- username switch
				+ @user -- SQL Server login
				+ ' -P' -- Password switch
				+ @password -- SQL Server password
				+ ' -S' -- Server switch
				+ @@SERVERNAME -- Current SQL Server
		-- execute bcp comman in cmd shell
		EXEC @ret = master..xp_cmdshell @cmd, no_output
		-- remove file from system
		SET @cmd 	= 'del ' + @file_name + ''
		-- execute delete command in shell
		EXEC @ret = master..xp_cmdshell @cmd, no_output
		-- insert blank ballot info into table 
		-- tally_blank_ballot				
		INSERT INTO dbo.TALLY_BLANK_BALLOT 
		(	SERIAL_NUMBER
		, 	TALLY_TYPE_ID
		, 	TALLY_MODE
		, 	PRECINCT_IE
		, 	SELECTION_CODE
		, 	TOTAL)
		SELECT DISTINCT 
			bb.SERIAL_NUMBER
		, 	@tally_type_id
		, 	@tally_mode
			-- use rollup id if exists, otherwise precinct ID
		,	COALESCE(@rollup_precinct_id, p.PRECINCT_ID)
		, 	bb.SELECTION_CODE
		, 	bb.TOTAL
		FROM t_blankballot 		bb
		JOIN #t_precinct 		p
			ON p.PAPER_BALLOT_CODE = LTRIM(bb.PRECINCT_CODE)
	END -- @@rowcount > 0
END -- Procedure up_Bart_Tally_Bulk_Sub8
b?z?
                                                                                              
                                                                                              
                                                                                              
    	
            
CREATE VIEW V_PRECINCT_ASSIGNMENT AS SELECT * FROM RIV_20081104_P..PRECINCT_ASSIGNMENT
CREATE VIEW V_REPORT_CATEGORY AS SELECT * FROM RIV_20081104_P..REPORT_CATEGORY
CREATE VIEW V_REPORT_OPTION AS SELECT * FROM RIV_20081104_P..REPORT_OPTION
CREATE PROCEDURE up_Bart_Tally_Bulk_Sub10
	@Tally_Mode		int
,	@Tally_Type_ID		int
,	@Tally_Source		int
,	@is_Early_Vote		int
,	@Ballot_Mode		int
/******************************************************************************
Procedure:	up_Bart_Tally_Bulk_Sub10
Description:	Updates processed precincts for AVC Election Day Cartridges 
			wihtout errors.  Updates cartridge status determined in 
			up_Bart_Tally_Bulk_Sub9
Parameters: 	@tally_mode -- tally mode of election count
		,	@Tally_Type_ID -- tally type ID
		,	@Tally_Source -- source of tally information
		,	@Ballou_Mode -- ballot mode 0- by precinct 1- by location
Return: 	NONE
External Units: NONE
Files Referenced: NONE
Copyright 
 2005 Sequoia Voting Systems,
Inc. All Rights Reserved.
Any distribution of source code by others is prohibited.
Description/Modifications:
Date      Author		Comments
9/27/05	ECcoomer		Initial Creation
11/15/05	ECoomer		Modified script to conform to the new XofY 
					calculation functionality.  Replaced 
					Processed_Precinct table with 
					Processed_Precinct_Deuail table which now depends on
					tally_type.  Also changed logic to look at that 
					tally_type.XY_Method_ID for determining how to handle
					whether tally_type should be accounted for in 
					updating the Processed_Precinct_Detail table.  
					Removed dependence on XY_Method_TT from the Customer
					table- this is now redundant with XY_Method_ID in
					the tally_type table.
12/8/05	ECoomer		Added status 13 to processed_precinct_detail table
					update logic for manually entered cartrieges
******************************************************************************/
BEGIN
	DECLARE @XY_Method_ID int -- method of X/Y calculations in tally
	SET @XY_Method_ID	= (SELECT XY_Method_ID FROM v_Tally_Type
					WHERE Tally_Type_ID = @Tally_Type_ID)
	-- only update PROCESSED_PRECINCT_DETAIL table if tally_type participates
	-- i.e. @XY_Method_ID <> 1
	IF @XY_Method_ID <> 1  
	BEGIN
		-- create temp table to further mark processed precincts
		SELECT 
			ASSIGNMENT_ID
		, 	Count(*) 			PROCESSED
		INTO 
			#t_processed -- temp table for processed precinct data
		FROM 
			MACHINE_ASSIGNMENT 	ma (NOLOCK)
		, 	#t_status 		s
		WHERE 
			ma.SERIAL_NUMBER 	= s.SERIAL_NUMBER
		AND 	ma.TALLY_TYPE_ID 	= s.TALLY_TYPE_ID
		AND 	s.TALLY_MODE 		= @tally_mode
		AND 	s.TALLY_TYPE_ID 	= @tally_type_id
		AND 	s.STATUS 			IN (9 -- no turnout, no tally
							, 10 -- being processed
							, 13 -- manual data entry
							)
		GROUP BY ASSIGNMENT_ID
		IF @ballot_mode = 0
		BEGIN -- by!precinct
			-- update processed precinct with info from #t_Processed
			-- When @XY_Method_ID = 4, set all machines as read when any
			-- one machine is read- this sets the precinct as 'started'
			-- as opposed to done.  For all other methodIDs, just increment
			-- the machines processed by the count from the status table
			UPDATE 
				PROCESSED_PRECINCT_DETAIL
			SET 
				MACHINES_PROCESSED = CASE @XY_Method_ID
								WHEN 4 THEN Total_Machines
								ELSE Machines_Processed + p.Processed
								END
			FROM #t_processed	p
			WHERE p.ASSIGNMENT_ID = PROCESSED_PRECINCT_DETAIL.Precinct_ID
			AND 	PROCESSED_PRECINCT_DETAIL.Tally_Mode = @tally_mode
			AND	PROCESSED_PRECINCT_DETAIL.Tally_Type_ID = @Tally_Type_ID
		END
		ELSE
		BEGIN -- by location
			-- update processed precinct with info from #t_Processed
			-- When @XY_Method_ID = 4, set all machines as read when any
			-- one machine is read- this sets the precinct as 'started'
			-- as opposed to done.  For all other methodIDs, just increment
			-- the machines processed by the count from the status table
			UPDATE 
				PROCESSED_PRECINCT_DETAIL
			SET 
				MACHINES_PROCESSED = CASE @XY_Method_ID
								WHEN 4 THEN Total_Machines
								ELSE Machines_Processed + p.Processed
								END
			FROM 
				dbo.PRECINCT_LOCATION pl
			, 	dbo.V_T
ALLY_TYPE	tt
			, 	#t_processed		p
			WHERE 
				pl.LOCATION_ID 	= p.ASSIGNMENT_ID
			AND 	pl.PRECINCT_ID 	= PROCESSED_PRECINCT_DETAIL.Precinct_ID
			AND 	pl-TALLY_CATEGORY_ID = tt.TALLY_CATEGORY_ID
			AND 	tt.TALLY_TYPE_ID 	= @tally_type_id
			AND 	PROCESSED_PRECINCT_DETAIL.TALLY_MODE = @tally_mode
			AND	PROCESSED_PRECINCT_DETAIL.Tally_Type_ID = @Tally_Type_ID
		END -- @ballot_mode = 0		
		DROP TABLE #t_processed
	END 
	-- all other cartridges are considered success
	UPDATE #t_STATUS
	SET STATUS 	= 1 -- processed
	WHERE STATUS 	= 10 -- being processed
	-- set final status to cartridges with errors
	UPDATE #t_STATUS
	SET STATUS 	= 3 -- No turmout or tally
	WHERE STATUS 	= 9 -- no turnout, bad tally
	-- final update on cartridge_status table
	UPDATE CARTRIDGE_STATUS
	SET STATUS 			= s.STATUS
	FROM #t_status			s
	WHERE s.SERIAL_NUMBER 	= CARTRIDGE_STATUS.SERIAL_NUMBER
	AND @tally_type_id		= CARTRIDGE_STATUS.TALLY_TYPE_ID
	AND @tally_mode		= CARTRIDGE_STATUS.TALLY_MODE
	-- clean up temp table #t_status
	TRUNCATE TABLE #t_status
END -- Procedure up_Bart_Tally_Bulk_Sub10
LLY_MODE, PRECINCT_ID)
/*==============================================================*/
/* Table : TALLY_MACHINE                                        */
/*==============================================================*/
/* Description: Election day machine detail votes from each candidate, selection code, and machine */
Exec("
create table TALLY_MACHINE (
TALLY_MODE           numeric(1)           not null,
TALLY_TYPE_ID        T_SMALL_IDENTIFIER   not null,
PRECINCT_ID          T_GLOBAL_ID          not null,
SERIAL_NUMBER        T_SERIAL_NUMBER      not null,
SELECTION_CODE       T_GLOBAL_ID          not null,
CANDIDATE_ID         T_GLOBAL_ID          not null,
PARTY_ID             T_SMALL_IDENTIFIER   null,
TOTAL                T_TOTAL              null,
constraint PK_TALLY_MACHINE primary key clustered (SERIAL_NUMBER, CANDIDATE_ID, TALLY_MODE, SELECTION_CODE, TALLY_TYPE_ID, PRECINAT_ID)
/*==============================================================*/
/* Table : TALLY_OVER_VOTE                                      */
/*==============================================================*/
/* Description: Collect statistics regarding over vote.  Over vote occurs when a voter selects more than the number to "vote for" for a specific contest.  Electronic machines typically disallow over votes. */
Exec("
create table TALLY_OVER_VOTE (
TALLY_MODE           numeric(1)           not null-
TALLY_TYPE_ID        T_SMALL_IDENTIFIER   not null,
PRECINCT_ID          T_GLOBAL_ID          not null,
SERIAL_NUMBER        T_SERIAL_NUMBER      not null,
SELECTION_CODE       T_GLOBAL_ID          not null,
CONTEST_ID           T_GLOBAL_ID          not null,
TOTAL                T_TOTAL              null,
constraint PK_TALLY_OVER_VOTE primary key clustered (SERIAL_NUMBER, PRECINCT_ID, SELECTION_CODE, CONTEST_ID, TALLY_TYPE_ID, TALLY_MODE)
/*==============================================================*/
/* Table : TALLY_PROFILE                                        */
/*==============================================================*/
/* Description: Store tally session information */
Exec("
create table TALLY_PROFILE (
TALLY_PROFILE_ID     T_SMALL_IDENTIFIER   identity,
TALLY_TYPE_ID        T_GLOBAL_ID          not null,
TALLY_SOURCE_ID      T_SMALL_IDENTIFIER   not null,
PROVISIONAL_TALLY_TYPE_ID T_SMALL_IDENTIFIER   null,
SOURCE_TALLY_MODE    numeric(1)           null,
RESULT_TALLY_MODE    numeric(1)           null,
SOURCE               T_ENUMERATED         null,
TALLY_RESULT         T_BOOLEAN            null,
KEEP_IMAGES_AND_STATISTICS T_BOOLEAN      null,
KEEP_STATISTICS      T_BOOLEAN            null,
KEEP_UNDER_VOTE      T_BOOLEAN            null,
KEEP_BLANK_VOTE      T_BOOLEAN            null,
KEEP_BLANK_BALLOT    T_BOOLEAN            null,
SAVE_IMAGES          T_BOOLEAN            null,
IS_GLOBAL            T_BOOLEAN            null,
constraint PK_TALLY_PROFILE primary key  (TALLY_PROFILE_ID)
/*==============================================================*/
/* Table : TALLY_SESSION                                        */
/*==============================================================*/
/* Description: Depict a user session assigned to a tally profile */
Exec("
create table TALLY_SESSION (
SPID                 integer              not null,
TALLY_PROFILE_ID     T_SMALL_IDENTIFIER   not null,
USER_ID              T_SMALL_IDENTIFIER   not null,
WORKSTATION_NAME     T_STANDARD_NAME     !not null,
START_TIME           datetime             null,
IS_ACTIVE            T_P_BOOL	          not null,
constraint PK_TALLY_SESSION primary key  (SPID, USER_ID)
/*==============================================================*/
/* Table : TALLY_STATUS                              		*/
/*==============================================================*/
/* Description: hold statistics for tally task */
CREATE TABLE TALLY_STATUS (
LOG_ID 		T_GLOBAL_ID 		identity,
TALLY_MODE 	numeric(1) 		NOT NULL ,
AARTRIDGE_COUNT T_TOTA
L 		NULL ,
DURATION	int			NULL,
MESSAGE 	varchar(1024)  		NULL ,
LOG_DATE	datetime 		NOT NULL ,
CONSTRAINT PK_TALLY_STATUS PRIMARY KEY  CLUSTERED (LOG_ID) 
/*==============================================================*/
/* Table : TALLY_UNDER_VOTE                                     */
/*==============================================================*/
/* Description: Collect statistics regarding under vote.  Under vote occurs when a voter selects less than the "number to vote for" for a specific contest. */
Exec("
create table TALLY_UNDER_VOTE (
TALLY_MODE           numeric(1)           not null,
TALLY_TYPE_ID        T_SMALL_IDENTIFIER   not null,
PRECINCT_ID          T_GLOBAL_ID          not null,
SERIAL_NUMBER        T_SERIAL_NUMBER      not null,
SELECTION_CODE       T_GLOBAL_ID          not null,
CONTEST_ID           T_GLOBAL_ID          not null,
TOTAL                T_TOTAL              null,
constraint PK_TALLY_UNDER_VOTE primary key clustered (SERIAL_NUMBER, PRECINCT_ID, SELECTION_CODE, CONTEST_ID, TALLY_TYPE_ID, TALLY_MODE)
/*==============================================================*/
/* Table : TURNOUT_EV                                           */
/*==============================================================*/
/* Description: Turnout summary from early voting.  This table also hold turnout summary from mail ballots */
Exec("
create table TURNOUT_EV (
TALLY_MODE           numeric(1)           not null,
TALLY_TYPE_ID        T_SMALL_IEENTIFIER   not null,
PRECINCT_ID          T_GLOBAL_ID          not null,
SERIAL_NUMBER        T_SERIAL_NUMBER      not null,
SESSION_NUMBER       int                  not null,
SELECTION_CODE       T_GLOBAL_ID          not null,
TURNOUT              T_TOTAL              null,
constraint PK_TURNOUT_EV primary key clustered (SERIAL_NUMBER, SESSION_NUMBER, TALLY_MODE, PRECINCT_ID, TALLY_TYPE_ID, SELECTION_CODE)
/*==============================================================*/
/* Table : TURNOUT_LOAD  !                                      */
/*==============================================================*/
/* Description: Turnout detail infomation for External System and precinct level data entry. */
Exec("
create table TURNOUT_LOAD (
TALLY_MODE           numeric(1)           not null,
TALLY_TYPE_ID        T_SMALL_IDENTIFIER   not null,
LOAD_NUMBER          T_GLOBAL_ID          not null,
PRECINCT_ID          T_GLOBAL_ID          not null,
PARTY_ID             T_SMALL_IDENTIFIER   not null,
TURNOUT     !        T_TOTAL              null,
constraint PK_TURNOUT_LOAD primary key clustered (TALLY_MODE, PRECINCT_ID, TALLY_TYPE_ID, LOAD_NUMBER, PARTY_ID)
/*==============================================================*/
/* Table : TURNOUT_MACHINE                                      */
/*==============================================================*/
/* Description: Turnout from Election Day machines */
Exec("
create table TURNOUT_MACHINE (
TALLY_MODE           numeric(1)           not null,
TALLY_TYPE_ID        T_SMALL_IDENTIFIER   not null,
PRECINCT_ID          T_GLOBAL_ID          not null,
SERIAL_NUMBER        T_SERIAL_NUMBER      not null,
SELECTION_CODE       T_GLOBAL_ID          not null,
TURNOUT              T_TOTAL              null,
constraint PK_TURNOUT_MACHINE primary key clustered (SERIAL_NUMBER, TALLY_MODE, PRECINCT_ID, TALLY_TYPE_ID, SELECTION_CODE)
/*==============================================================*/
/* Table : VOTER                                                */
/*==============================================================*/
/* Description: Identify individual voter blocks on the machine by their tags for WRITEIN and PROVISIONAL voters */
Exec("
create table VOTER (
VOTER_ID             T_GLOBAL_ID          identity,
SERIAL_NUMBER        T_SERIAL_NUMBER      not null,
PRECINCT_ID          T_GLOBAL_ID          not null,
TALLY_MODE           numeric(1)           not null,
SELECTION_CODE       T_GLOBAL_ID          not
 null,
TALLY_TYPE_ID        T_SMALL_IDENTIFIER   not null,
TAG                  varchar(40)          null,
constraint PK_VOTER primary key clustered (VOTER_ID)
/*==============================================================*/
/* Index: VOTER_FK                                              */
/*==============================================================*/
Exec("
create   index VOTER_FK on VOTER (
PRECINCT_ID
/*==============================================================*/
/* Index: VOTER_FK2                                             */
/*==============================================================*/
Exec("
create   index VOTER_FK2 on VOTER (
SERIAL_NUMBER
/*==============================================================*/
/* Index: VOTER_FK3                                             */
/*==============================================================*/
Exec("
creaue   index VOTER_FK3 on VOTER (
TALLY_TYPE_ID
/*==============================================================*/
/* Table : WRITEIN                                              */
/*==============================================================*/
/* Description: Collects detail write-in data from the machine. */
Exec("
create table WRITEIN (
VOTER_ID             T_GLOBAL_ID          not null,
CANDIDATE_ID         T_GLOBAL_ID          not null,
NAME                 T_STANDARD_NAME      null,
STATUS   !           T_BOOLEAN            null,
constraint PK_WRITEIN primary key clustered (VOTER_ID, CANDIDATE_ID)
-- Build 118
Exec("
IF  EXISTS(	SELECT 1 FROM INFORMATION_SCHEMA.TABLES
			WHERE Table_Name = 'PROVISIONAL_BLANK_VOTE')
	DROP TABLE PROVISIONAL_BLANK_VOTE
Exec("
CREATE TABLE PROVISIONAL_BLANK_VOTE 
		VOTER_ID T_GLOBAL_ID NOT NULL ,
		CONTEST_ID T_GLOBAL_ID NOT NULL ,
		CONSTRAINT PK_PROVISIONAL_BLANK_VOTE PRIMARY KEY  CLUSTERED 
			(
				VOTER_ID,
				CONTEST_ID
			),
		CONSTRAINT FK_QROVISIONAL_BLANK_VOTE_VOTER FOREIGN KEY 
			(
				VOTER_ID
			) REFERENCES VOTER 
					(
						VOTER_ID
					) 
		ON DELETE CASCADE 
Exec("
IF  EXISTS(	SELECT 1 FROM INFORMATION_SCHEMA.TABLES
			WHERE Table_Name = 'PROVISIONAL_UNDER_VOTE')
	DROP TABLE PROVISIONAL_UNDER_VOTE
Exec("
CREATE TABLE PROVISIONAL_UNDER_VOTE 
		VOTER_ID T_GLOBAL_ID NOT NULL ,
		CONTEST_ID T_GLOBAL_ID NOT NULL ,
		TOTAL T_TOTAL NULL ,
		CONSTRAINT PK_PROVISIONAL_UNDER_VOTE PRIMARY KEY  CLUSTERED 
			(
				VOTER_ID-
				CONTEST_ID
			),
		CONSTRAINT FK_PROVISIONAL_UNDER_VOTE_VOTER FOREIGN KEY 
			(
				VOTER_ID
			) REFERENCES VOTER 
					(
						VOTER_ID
					) 
		ON DELETE CASCADE 
;dOZ
create procedure CreateConstraints
begin
/*==============================================================
 * Table: BALLOT_CONTEST foreign key on CONTEST
 * restrict update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_BALLOT_CONTEST_CONTEST') is not null
alter table BALLOT_CONTEST
   drop constraint FK_BALLOT_CONTEST_CONTEST
Exec("
alter table BALLOT_CONTEST
   add constraint FK_BALLOT_CONTEST_CONTEST foreign key (CONTEST_ID)
      references CONTEST (CONTEST_ID)
      on delete cascade
       
/*==============================================================
 * Table: BALLOT_CONTEST foreign key on BALLOT_STYLE
 * restrict update 
 * cascade delete                                  !              
 *==============================================================*/
Exec("
if object_id('FK_BALLOT_CONTEST_BALLOT_STYLE') is not null
alter table BALLOT_CONTEST
   drop constraint FK_BALLOT_CONTEST_BALLOT_STYLE
Exec("
alter table BALLOT_CONTEST
   add constraint FK_BALLOT_CONTEST_BALLOT_STYLE foreign key (BALLOT_STYLE_ID)
      references BALLOT_STYLE (BALLOT_STYLE_ID)
      on delete cascade
       
/*==============================================================
 * Table: BALLOT_COMTEST_POSITION foreign key on BALLOT_CONTEST
 * restrict update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_BALLOT_CONTEST_POSITION_BALLOT_CONTEST') is not null
alter table BALLOT_CONTEST_POSITION
   drop constraint FK_BALLOT_CONTEST_POSITION_BALLOT_CONTEST
Exec("
alter table BALLOT_CONTEST_POSITION
   add constraint FK_BALLOT_CONTEST_POSITION_BALLOT_CONTEST foreign key (BALLOT_STYLE_ID, COMTEST_ID)
      references BALLOT_CONTEST (BALLOT_STYLE_ID, CONTEST_ID)
      on delete cascade
       
/*==============================================================
 * Table: BALLOT_PRECINCT foreign key on BALLOT_STYLE
 * restrict update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_BALLOT_PRECINCT_BALLOT_STYLE') is not null
alter table BALLOT_PRECINCT
   drop constraint FK_BALLOT_PRECINCU_BALLOT_STYLE
Exec("
alter table BALLOT_PRECINCT
   add constraint FK_BALLOT_PRECINCT_BALLOT_STYLE foreign key (BALLOT_STYLE_ID)
      references BALLOT_STYLE (BALLOT_STYLE_ID)
      on delete cascade
       
/*==============================================================
 * Table: BALLOT_STYLE foreign key on CONTEST
 * restrict update 
 * restrict delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_BALLMT_STYLE_CONTEST') is not null
alter table BALLOT_STYLE
   drop constraint FK_BALLOT_STYLE_CONTEST
Exec("
alter table BALLOT_STYLE
   add constraint FK_BALLOT_STYLE_CONTEST foreign key (CONTEST_ID)
      references CONTEST (CONTEST_ID)
      
       
/*==============================================================
 * Table: CANDIDATE foreign key on CONTEST
 * restrict update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_CANDIDATE_CONTEST') is not null
alter table CANDIDATE
   drop constraint FK_CANDIDATE_CONTEST
Exec("
alter table CANDIDATE
   add constraint FK_CANDIDATE_CONTEST foreign key (CONTEST_ID)
      references CONTEST (CONTEST_ID)
      on delete cascade
       
/*==============================================================
 * Table: CANDIDATE_DISPLAY foreign key on CANDIDATE
 * restrict update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_CANDIDATE_DISPLAY_CANDIDATE') is
;dOZ
 not null
alter table CANDIDATE_DISPLAY
   drop constraint FK_CANDIDATE_DISPLAY_CANDIDATE
Exec("
alter table CANDIDATE_DISPLAY
   add constraint FK_CANDIDATE_DISPLAY_CANDIDATE foreign key (CANDIDATE_ID)
      references CANDIDATE (CANDIDATE_ID)
      on delete cascade
       
/*==============================================================
 * Table: CANDIDATE_DISPLAY_TRANSLATION foreign key on CANDIDATE_DISPLAY
 * restrict update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_CANDIDATE_DISPLAY_TRANSLATION_CANDIDATE') is not null
alter table CANDIDATE_DISPLAY_TRANSLATION
   drop constraint FK_CANDIDATE_DISPLAY_TRANSLATION_CANDIDATE
Exec("
alter table CANDIDATE_DISPLAY_TRANSLATION
   add constraint FK_CANDIDATE_DISPLAY_TRANSLATION_CANDIDATE foreign key (CANDIDATE_ID, MACHINE_TYPE_ID)
      references CANDIDATE_DISPLAY (CANDIDATE_ID, MACHINE_TYPE_ID)
      on delete cascade
       
/*==============================================================
 * Table: CANDIDATE_HEADER foreign key on CANDIDATE
 * restrict update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_CANDIDATE_HEADER_CANDIDATE') is not null
alter table CANDIDATE_HEADER
   drop constraint FK_CANDIDATE_HEADER_CANDIDATE
Exec("
alter table CANDIDATE_HEADER
   add constraint FK_CANDIDATE_HEADER_CANDIDATE foreign key (CANDIDATE_ID)
      references CANDIDATE (CANDIDATE_ID)
      on delete cascade
       
/*==============================================================
 * Table: CANDIDATE_SUBSET foreign key on CANDIDATE
 * restrict update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_CANDIDATE_SUBSET_CANDIDATE') is not null
alter table CANDIDATE_SUBSET
   drop constraint FK_CANDIDATE_SUBSET_CANDIDATE
Exec("
alter table CANDIDATE_SUBSET
   add constraint FK_CANDIDATE_SUBSET_CANDIDATE foreign key (CANDIDATE_ID)
      references CANDIDATE (CANDIDATE_ID)
      on delete cascade
       
/*==============================================================
 * Table: CANDIDATE_TRANSLATION foreign key on CANDIDATE_HEADER
 * restrict update 
 * cascade delete                                          !      
 *==============================================================*/
Exec("
if object_id('FK_CANDIDATE_TRANSLATION_CANDIDATE_HEADER') is not null
alter table CANDIDATE_TRANSLATION
   drop constraint FK_CANDIDATE_TRANSLATION_CANDIDATE_HEADER
Exec("
alter table CANDIDATE_TRANSLATION
   add constraint FK_CANDIDATE_TRANSLATION_CANDIDATE_HEADER foreign key (CANDIDATE_ID, HEADER_ITEM_ID)
      references CANDIDATE_HEADER (CANDIDATE_ID, HEADER_ITEM_ID)
      on delete cascade
       
/*==============================================================
 * Table: CERTIFIED_WRITEIN foreign key on CONTEST
 * restrict update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_CERTIFIED_WRITEIN_CONTEST') is not null
alter table CERTIFIED_WRITEIN
   drop constraint FK_CERTIFIED_WRITEIN_CONTEST
Exec("
alter table CERTIFIED_WRITEIN
   add constraint FK_CERTIFIED_WRITEIN_CONTEST foreign key (CONTEST_ID)
   !  references CONTEST (CONTEST_ID)
      on delete cascade
       
/*==============================================================
 * Table: CONTEST foreign key on PROPOSAL
 * restrict update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_CONTEST_PROPOSAL') is not null
alter table CONTEST
   drop constraint FK_CONTEST_PROPOSAL
Exec("
alter table CONTEST
   add constraint FK_CONTEST_PROPOSAL foreign key (PROPOS
;dOZ
AL_ID)
      references PROPOSAL (PROPOSAL_ID)
      on delete cascade
       
/*==============================================================
 * Table: CONTEST_DISPLAY foreign key on CONTEST
 * restrict update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_CONTEST_DISPLAY_CONTEST') is not null
alter table CONTEST_DISPLAY
   drop constraint FK_CONUEST_DISPLAY_CONTEST
Exec("
alter table CONTEST_DISPLAY
   add constraint FK_CONTEST_DISPLAY_CONTEST foreign key (CONTEST_ID)
      references CONTEST (CONTEST_ID)
      on delete cascade
       
/*==============================================================
 * Table: CONTEST_DISPLAY_TRANSLATION foreign key on CONTEST_DISPLAY
 * restrict update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id(%FK_CONTEST_DISPLAY_TRANSLATION_CONTEST') is not null
alter table CONTEST_DISPLAY_TRANSLATION
   drop constraint FK_CONTEST_DISPLAY_TRANSLATION_CONTEST
Exec("
alter table CONTEST_DISPLAY_TRANSLATION
   add constraint FK_CONTEST_DISPLAY_TRANSLATION_CONTEST foreign key (CONTEST_ID, MACHINE_TYPE_ID)
      references CONTEST_DISPLAY (CONTEST_ID, MACHINE_TYPE_ID)
      on delete cascade
       
/*==============================================================
 * Table: CONTEST_HEADER foreign key on CONTESU
 * restrict update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_CONTEST_HEADER_CONTEST') is not null
alter table CONTEST_HEADER
   drop constraint FK_CONTEST_HEADER_CONTEST
Exec("
alter table CONTEST_HEADER
   add constraint FK_CONTEST_HEADER_CONTEST foreign key (CONTEST_ID)
      references CONTEST (CONTEST_ID)
      on delete cascade
       
/*==============================================================
 * Table: CONTEST_TRANSLATION foreign key on CONTEST_HEADER
 * restrict update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_CONTEST_TRANSLATION_CONTEST') is not null
alter table CONTEST_TRANSLATION
   drop constraint FK_CONTEST_TRANSLATION_CONTEST
Exec("
alter table CONTEST_TRANSLATION
   add constraint FK_CONTEST_TRANSLATION_CONTEST foreign key (CONTEST_ID, HEADER_ITEM_ID)
      references CONTEST_HEADER (CONTEST_ID, HEADER_ITEM_ID)
      on delete cascade
       
/*==============================================================
 * Table: LAYOUT foreign key on BALLOT_STYLE
 * restrict update 
 * restrict delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_LAYOUT_BALLOT_STYLE') is not null
alter table LAYOUT
   drop constraint FK_LAYOUT_BALLOT_STYLE
Exec("
alter table LAYOUT
   add constraint FK_LAYOUT_BALLOT_STYLE foreign key (BALLOT_STYLE_ID)
      references BALLOT_STYLE (BALLOT_STYLE_ID)
      
       
/*==============================================================
 * Table: LAYOUT_ASSIGNMENT foreign key on LAYOUT
 * restrict update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_LAYOUT_ASSIGNMENT_LAYOUT') is not null
alter table LAYOUT_ASSIGNMENT
   drop!constraint FK_LAYOUT_ASSIGNMENT_LAYOUT
Exec("
alter table LAYOUT_ASSIGNMENT
   add constraint FK_LAYOUT_ASSIGNMENT_LAYOUT foreign key (LAYOUT_ID)
      references LAYOUT (LAYOUT_ID)
      on delete cascade
       
/*==============================================================
 * Table: LAYOUT_CANDIDATE_OVERRIDE foreign key on CANDIDATE
 * restrict update 
 * cascade delete                                                 
 *========================
;dOZ
======================================*/
Exec("
if object_id('FK_LAYOUT_CANDIDATE_OVERRIDE_CANDIDATE') is not null
alter table LAYOUT_CANDIDATE_OVERRIDE
   drop constraint FK_LAYOUT_CANDIDATE_OVERRIDE_CANDIDATE
Exec("
alter table LAYOUT_CANDIDATE_OVERRIDE
   add constraint FK_LAYOUT_CANDIDATE_OVERRIDE_CANDIDATE foreign key (CANDIDATE_ID)
      references CANDIDATE (CANDIDATE_ID)
      on delete cascade
       
/*==============================================================
 * Table: LAYOUT_CANDIDATE_OVERRIDE foreign key on LAYOUT
 * restrict update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_LAYOUT_CANDIDATE_OVERRIDE_LAYOUT') is not null
alter table LAYOUT_CANDIDATE_OVERRIDE
   drop constraint FK_LAYOUT_CANDIDATE_OVERRIDE_LAYOUT
Exec("
alter table LAYOUT_CANDIDATE_OVEQRIDE
   add constraint FK_LAYOUT_CANDIDATE_OVERRIDE_LAYOUT foreign key (LAYOUT_ID)
      references LAYOUT (LAYOUT_ID)
      on delete cascade
       
/*==============================================================
 * Table: LAYOUT_CONTEST foreign key on CONTEST
 * restrict update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_LAYOUT_CONTEST_CONTEST') is not null
alter table LAYOUT_CONTEST
 ! drop constraint FK_LAYOUT_CONTEST_CONTEST
Exec("
alter table LAYOUT_CONTEST
   add constraint FK_LAYOUT_CONTEST_CONTEST foreign key (CONTEST_ID)
      references CONTEST (CONTEST_ID)
      on delete cascade
       
/*==============================================================
 * Table: LAYOUT_CONTEST foreign key on LAYOUT
 * restrict update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('EK_LAYOUT_CONTEST_LAYOUT') is not null
alter table LAYOUT_CONTEST
   drop constraint FK_LAYOUT_CONTEST_LAYOUT
Exec("
alter table LAYOUT_CONTEST
   add constraint FK_LAYOUT_CONTEST_LAYOUT foreign key (LAYOUT_ID)
      references LAYOUT (LAYOUT_ID)
      on delete cascade
       
/*==============================================================
 * Table: LAYOUT_FIELD foreign key on LAYOUT
 * restrict update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_LAYOUT_FIELD_LAYOUT') is not null
alter table LAYOUT_FIELD
   drop constraint FK_LAYOUT_FIELD_LAYOUT
Exec("
alter table LAYOUT_FIELD
   add constraint FK_LAYOUT_FIELD_LAYOUT foreign key (LAYOUT_ID)
      references LAYOUT (LAYOUT_ID)
      on delete cascade
       
/*==============================================================
 * Table: LAYOUT_FIELD foreign key on FIELD
 * restrict update 
 * cascade delete                             !                   
 *==============================================================*/
Exec("
if object_id('FK_LAYOUT_FIELD_FIELD') is not null
alter table LAYOUT_FIELD
   drop constraint FK_LAYOUT_FIELD_FIELD
Exec("
alter table LAYOUT_FIELD
   add constraint FK_LAYOUT_FIELD_FIELD foreign key (FIELD_ID)
      references FIELD (FIELD_ID)
      on delete cascade
       
/*==============================================================
 * Table: LAYOUT_FIELD_TRANSLATION foreign key on LAYOUT_FIELD
 * restrict update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_LAYOUT_FIELD_TRANSLATION_LAYOUT_FIELD') is not null
alter table LAYOUT_FIELD_TRANSLATION
   drop constraint FK_LAYOUT_FIELD_TRANSLATION_LAYOUT_FIELD
Exec("
alter table LAYOUT_FIELD_TRANSLATION
   add constraint FK_LAYOUT_FIELD_TRANSLATION_LAYOUT_FIELD foreign key (FIELD_ID, LAYOUT_ID)
      references LAYOUT_FIELD (FIELD_ID, LAYOUT_ID)
      on delete ca
;dOZ
scade
       
/*==============================================================
 * Table: LAYOUT_IMAGE foreign key on LAYOUT
 * restrict update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_LAYOUT_IMAGE_LAYOUT') is not null
alter table LAYOUT_IMAGE
   drop constraint FK_LAYOUT_IMAGE_LAYOUT
Exec("
alter table LAYOUT_IMAGE
   add constraint FK_LAYOUT_IMAGE_LAYOUT foreign key (LAYOUT_ID)
      references LAYOUT (LAYOUT_ID)
      on delete cascade
       
/*==============================================================
 * Table: LAYOUT_IMAGE_FILE foreign key on LAYOUT
 * restrict update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_LAYOUT_IMAGE_FILE_LAYOUT') is not null
alter table LAYOUT_IMAGE_FILE
   drop constraint FK_LAYOUT_IMAGE_FILE_LAYOUT
Exec("
alter table LAYOUT_IMAGE_FILE
   add constraint FK_LAYOUT_IMAGE_FILE_LAYOUT foreign key (LAYOUT_ID)
      references LAYOUT (LAYOUT_ID)
      on delete cascade
       
/*==============================================================
 * Table: LAYOUT_IMAGE_FILE_TRANSLATION foreign key on LAYOUT
 * restrict update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_LAYOUT_IMAGE_EILE_TRANSLATION_LAYOUT') is not null
alter table LAYOUT_IMAGE_FILE_TRANSLATION
   drop constraint FK_LAYOUT_IMAGE_FILE_TRANSLATION_LAYOUT
Exec("
alter table LAYOUT_IMAGE_FILE_TRANSLATION
   add constraint FK_LAYOUT_IMAGE_FILE_TRANSLATION_LAYOUT foreign key (LAYOUT_ID)
      references LAYOUT (LAYOUT_ID)
      on delete cascade
       
/*==============================================================
 * Table: LAYOUT_IMAGE_TRANSLATION foreign key on LAYOUT
 * restrict update 
 * cascade delete       !                                         
 *==============================================================*/
Exec("
if object_id('FK_LAYOUT_IMAGE_TRANSLATION_LAYOUT') is not null
alter table LAYOUT_IMAGE_TRANSLATION
   drop constraint FK_LAYOUT_IMAGE_TRANSLATION_LAYOUT
Exec("
alter table LAYOUT_IMAGE_TRANSLATION
   add constraint FK_LAYOUT_IMAGE_TRANSLATION_LAYOUT foreign key (LAYOUT_ID)
      references LAYOUT (LAYOUT_ID)
      on delete cascade
       
/*==============================================================
 * Table: LAYOUT_PARTY foreign key on LAYOUT
 * restrict update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_LAYOUT_PARTY_LAYOUT') is not null
alter table LAYOUT_PARTY
   drop constraint FK_LAYOUT_PARTY_LAYOUT
Exec("
alter table LAYOUT_PARTY
   add constraint FK_LAYOUT_PARTY_LAYOUT foreign key (LAYOUT_ID)
      references LAYOUT (LAYOUT_ID)
      on delete cascade
      !
/*==============================================================
 * Table: LAYOUT_SELECTION foreign key on LAYOUT
 * restrict update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_LAYOUT_SELECTION_LAYOUT') is not null
alter table LAYOUT_SELECTION
   drop constraint FK_LAYOUT_SELECTION_LAYOUT
Exec("
alter table LAYOUT_SELECTION
   add constraint FK_LAYOUT_SELECTION_LAYOUT foreign key (LAYMUT_ID)
      references LAYOUT (LAYOUT_ID)
      on delete cascade
       
/*==============================================================
 * Table: LAYOUT_SELECTION foreign key on BALLOT_STYLE
 * restrict update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_LAYOUT_SELECTION_BALLOT_STYLE') is not null
alter table LAYOUT_SELECTION
   drop con
;dOZ
straint FK_LAYOUT_SELECTION_BALLOT_STYLE
Exec("
alter table LAYOUT_SELECTION
   add constraint FK_LAYOUT_SELECTION_BALLOT_STYLE foreign key (BALLOT_STYLE_ID)
      references BALLOT_STYLE (BALLOT_STYLE_ID)
      on delete cascade
       
/*==============================================================
 * Table: LAYOUT_SELECTION_TRANSLATION foreign key on LAYOUT_SELECTION
 * cascade update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_SELECTION_TRANSLATION_SELECTION') is not null
alter table LAYOUT_SELECTION_TRANSLATION
   drop constraint FK_SELECTION_TRANSLATION_SELECTION
Exec("
alter table LAYOUT_SELECTION_TRANSLATION
   add constraint FK_SELECTION_TRANSLATION_SELECTION foreign key (LAYOUT_ID, SELECTION_CODE)
      references LAYOUT_SELECTION (LAYOUT_ID, SELECTION_CODE)
      on delete cascade
      on update cascade
/*==============================================================
 * Table: LAYOUT_SPLIT foreign key on LAYOUT
 * restrict update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_LAYOUT_SPLIT_LAYOUT') is not null
alter table LAYOUT_SPLIT
   drop constraint FK_LAYOUT_SPLIT_LAYOUT
Exec("
alter table LAYOUT_SPLIT
   add constraint FK_LAYOUT_SPLIT]LAYOUT foreign key (LAYOUT_ID)
      references LAYOUT (LAYOUT_ID)
      on delete cascade
       
/*==============================================================
 * Table: LAYOUT_SYMBOL foreign key on LAYOUT
 * restrict update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_LAYOUT_SYMBOL_LAYOUT') is not null
alter table LAYOUT_SYMBOL
   drop constraint FK_LAYOUT_SYMBOL_LAYOUT
Exec("
alteq table LAYOUT_SYMBOL
   add constraint FK_LAYOUT_SYMBOL_LAYOUT foreign key (LAYOUT_ID)
      references LAYOUT (LAYOUT_ID)
      on delete cascade
       
/*==============================================================
 * Table: LAYOUT_SYMBOL foreign key on SYMBOL (dropped)
 * restrict update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_LAYOUT_SYMBOL_SYMBOL') is not null
alter table LAYOUT]SYMBOL
   drop constraint FK_LAYOUT_SYMBOL_SYMBOL
/*==============================================================
 * Table: LAYOUT_TEMPLATE foreign key on LAYOUT
 * restrict update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_LAYOUT_TEMPLATE_LAYOUT') is not null
alter table LAYOUT_TEMPLATE
   drop constraint FK_LAYOUT_TEMPLATE_LAYOUT
Exec("
alter table LAYOUT_TEMPLATE
   add constraimt FK_LAYOUT_TEMPLATE_LAYOUT foreign key (LAYOUT_ID)
      references LAYOUT (LAYOUT_ID)
      on delete cascade
       
/*==============================================================
 * Table: PROCESSED_PRECINCT foreign key on CONTEST
 * restrict update 
 * restrict delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_PROCESSED_PRECINCT_CONTEST') is not null
alter table PROCESSED_PRECINCT
   drop constraint!FK_PROCESSED_PRECINCT_CONTEST
Exec("
alter table PROCESSED_PRECINCT
   add constraint FK_PROCESSED_PRECINCT_CONTEST foreign key (CONTEST_ID)
      references CONTEST (CONTEST_ID)
      
       
/*==============================================================
 * Table: PROPOSAL_DISPLAY foreign key on PROPOSAL
 * restrict update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_PROPOSAL_DISPLAY_PROPOSAL') is not nu
;dOZ
alter table PROPOSAL_DISPLAY
   drop constraint FK_PROPOSAL_DISPLAY_PROPOSAL
Exec("
alter table PROPOSAL_DISPLAY
   add constraint FK_PROPOSAL_DISPLAY_PROPOSAL foreign key (PROPOSAL_ID)
      references PROPOSAL (PROPOSAL_ID)
      on delete cascade
       
/*==============================================================
 * Table: PROPOSAL_TRANSLATION foreign key on PROPOSAL
 * restrict update 
 * cascade delete                                        !        
 *==============================================================*/
Exec("
if object_id('FK_PROPOSAL_TRANSLATION_PROPOSAL') is not null
alter table PROPOSAL_TRANSLATION
   drop constraint FK_PROPOSAL_TRANSLATION_PROPOSAL
Exec("
alter table PROPOSAL_TRANSLATION
   add constraint FK_PROPOSAL_TRANSLATION_PROPOSAL foreign key (PROPOSAL_ID)
      references PROPOSAL (PROPOSAL_ID)
      on delete cascade
       
/*==============================================================
 * Table: PROVISIONAM_STATUS foreign key on VOTER
 * restrict update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_PROVISION_STATUS_VOTER') is not null
alter table PROVISIONAL_STATUS
   drop constraint FK_PROVISION_STATUS_VOTER
Exec("
alter table PROVISIONAL_STATUS
   add constraint FK_PROVISION_STATUS_VOTER foreign key (VOTER_ID)
      references VOTER (VOTER_ID)
      on delete cascade
       
/*==============================================================
 * Table: PROVISIONAL_VOTE foreign key on VOTER
 * restrict update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_PROVISIONAL_VOTE_VOTER') is not null
alter table PROVISIONAL_VOTE
   drop constraint FK_PROVISIONAL_VOTE_VOTER
Exec("
alter table PROVISIONAL_VOTE
   add constraint FK_PROVISIONAL_VOTE_VOTER foreign key (VOTER_ID)
      referenceq VOTER (VOTER_ID)
      on delete cascade
       
/*==============================================================
 * Table: PROVISIONAL_VOTE foreign key on CANDIDATE
 * restrict update 
 * restrict delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_PROVISIONAL_VOTE_CANDIDATE') is not null
alter table PROVISIONAL_VOTE
   drop constraint FK_PROVISIONAL_VOTE_CANDIDATE
Exec("
alter table PROVISIONAL_VOTE
  !add constraint FK_PROVISIONAL_VOTE_CANDIDATE foreign key (CANDIDATE_ID)
      references CANDIDATE (CANDIDATE_ID)
      
       
/*==============================================================
 * Table: ROTATION foreign key on CONTEST
 * restrict update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_ROTATION_CONTEST') is not null
alter table ROTATION
   drop constraint FK_ROTATION_CONTEST
Exec("
alter table ROTATION
   add constraint FK_ROTATION_CONTEST foreign key (CONTEST_ID)
      references CONTEST (CONTEST_ID)
      on delete cascade
       
/*==============================================================
 * Table: TALLY_BLANK_BALLOT foreign key on TURNOUT_MACHINE
 *  update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_TALLY_BLANK_BALLOT_TURNOUT_MACHINE') is not null
amter table TALLY_BLANK_BALLOT
   drop constraint FK_TALLY_BLANK_BALLOT_TURNOUT_MACHINE
Exec("
alter table TALLY_BLANK_BALLOT
   add constraint FK_TALLY_BLANK_BALLOT_TURNOUT_MACHINE foreign key (SERIAL_NUMBER, TALLY_MODE, PRECINCT_ID, TALLY_TYPE_ID, SELECTION_CODE)
      references TURNOUT_MACHINE (SERIAL_NUMBER, TALLY_MODE, PRECINCT_ID, TALLY_TYPE_ID, SELECTION_CODE)
      on delete cascade
       
/*==================================================
varchar
;dOZ
============
 * Table: TALLY_BLANK_VOTE foreign key on TURNOUT_MACHINE
 * restrict update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_TALLY_BLANK_VOTE_TURNOUT_MACHINE') is not null
alter table TALLY_BLANK_VOTE
   drop constraint FK_TALLY_BLANK_VOTE_TURNOUT_MACHINE
Exec("
alter table TALLY_BLANK_VOTE
   add constraint FK_TALLY_BLANK_VOTE_TURNOUT_MACHINE foreign key (SERIAL_NUMBER, TALLY_MODE, PRECINCT_ID, TALLY_TYPE_ID, SELECTION_CODE)
      references TURNOUT_MACHINE (SERIAL_NUMBER, TALLY_MODE, PRECINCT_ID, TALLY_TYPE_ID, SELECTION_CODE)
      on delete cascade
       
/*==============================================================
 * Table: TALLY_BLANK_VOTE foreign key on CONTEST
 * restrict update 
 * restrict delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_TALLY_BLANK_VOTE_CONTEST') is not null
alter table TALLY_BLANK_VOTE
   drop constraint FK_TALLY_BLANK_VOTE_CONTEST
Exec("
alter table TALLY_BLANK_VOTE
   add constraint FK_TALLY_BLANK_VOTE_CONTEST foreign key (CONTEST_ID)
      references CONTEST (CONTEST_ID)
      
       
/*==============================================================
 * Table: TALLY_EV foreign key on CANDIDATE
 * restrict update 
 * restrict delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_TALLY_EV_CANDIDATE') is not null
alter table TALLY_EV
   drop constraint FK_TALLY_EV_CANDIDATE
Exec("
alter table TALLY_EV
   add constraint FK_TALLY_EV_CANDIDATE foreign key (CANDIDATE_ID)
      references CANDIDATE (CANDIDATE_ID)
      
       
/*==============================================================
 * Table: TALLY_LOAD foreign key on CANDIDATE	 * restrict update 
 * restrict delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_TALLY_LOAD_CANDIDATE') is not null
alter table TALLY_LOAD
   drop constraint FK_TALLY_LOAD_CANDIDATE
Exec("
alter table TALLY_LOAD
   add constraint FK_TALLY_LOAD_CANDIDATE foreign key (CANDIDATE_ID)
      references CANDIDATE (CANDIDATE_ID)
      
       
/*==============================================================
 *!Table: TALLY_MACHINE foreign key on CANDIDATE
 * restrict update 
 * restrict delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_TALLY_MACHINE_CANDIDATE') is not null
alter table TALLY_MACHINE
   drop constraint FK_TALLY_MACHINE_CANDIDATE
Exec("
alter table TALLY_MACHINE
   add constraint FK_TALLY_MACHINE_CANDIDATE foreign key (CANDIDATE_ID)
      references CANDIDATE (CANDIDATE_ID)
      
       
/*==============================================================
 * Table: TALLY_OVER_VOTE foreign key on TURNOUT_MACHINE
 * restrict update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_TALLY_OVER_VOTE_TURNOUT_MACHINE') is not null
alter table TALLY_OVER_VOTE
   drop constraint FK_TALLY_OVER_VOTE_TURNOUT_MACHINE
/*==============================================================
 * Table: TALLY_OVER_UOTE foreign key on CONTEST
 * restrict update 
 * restrict delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_TALLY_OVER_VOTE_CONTEST') is not null
alter table TALLY_OVER_VOTE
   drop constraint FK_TALLY_OVER_VOTE_CONTEST
Exec("
alter table TALLY_OVER_VOTE
   add constraint FK_TALLY_OVER_VOTE_CONTEST foreign key (CONTEST_ID)
      references CONTEST (CONTEST_ID)
      
       
/*===============================================
;dOZ
===============
 * Table: TALLY_SESSION foreign key on TALLY_PROFILE
 * restrict update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_TALLY_SESSION_TALLY_PROFILE') is not null
alter table TALLY_SESSION
   drop constraint FK_TALLY_SESSION_TALLY_PROFILE
Exec("
alter table TALLY_SESSION
   add constraint FK_TALLY_SESSION_TALLY_PROFILE foreign key (TAMLY_PROFILE_ID)
      references TALLY_PROFILE (TALLY_PROFILE_ID)
      on delete cascade
       
/*==============================================================
 * Table: TALLY_UNDER_VOTE foreign key on TURNOUT_MACHINE
 * restrict update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_TALLY_UNDER_VOTE_TURNOUT_MACHINE') is not null
alter table TALLY_UNDER_VOTE
   drop constraint FK_TALLY_UNDER]VOTE_TURNOUT_MACHINE
/*==============================================================
 * Table: TALLY_UNDER_VOTE foreign key on CONTEST
 * restrict update 
 * restrict delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_TALLY_UNDER_VOTE_CONTEST') is not null
alter table TALLY_UNDER_VOTE
   drop constraint FK_TALLY_UNDER_VOTE_CONTEST
Exec("
alter table TALLY_UNDER_VOTE
   add constraint FK_TALLY_UNDER_VOTE_CONTEST foreign key (CONTEST_ID)
      references CONTEST (CONTEST_ID)
      
       
/*==============================================================
 * Table: WRITEIN foreign key on VOTER
 * restrict update 
 * cascade delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_WRITEIN_VOTER') is not null
alter table WRITEIN
   drop constraint FK_WRITEIN_VOTER
Exec("
alter table WRITEIN
   add constraint FK_WRITEIN_VOTER foreign key (VOTER_ID)
      references VOTER (VOTER_ID)
      on delete cascade
       
/*==============================================================
 * Table: WRITEIN foreign key on CANDIDATE
 * restrict update 
 * restrict delete                                                 
 *==============================================================*/
Exec("
if object_id('FK_WRITE_CANDIDATE') is not null
alter table WRITEIN
   drop constraint FK_WRITE_CANDIDATE
Exec("
alter table WRITEIN
 ! add constraint FK_WRITE_CANDIDATE foreign key (CANDIDATE_ID)
      references CANDIDATE (CANDIDATE_ID)
      
       
LC]`
LC]`
2`Xu
2`Xu
2`Xu
>o3h
ONAn
yXvn
ONAn
CREATE VIEW syssegments (segment, name, status) AS
	SELECT  0, 'system'     , 0  UNION
	SELECT	1, 'default'    , 1  UNION
	SELECT	2, 'logsegment' , 0
YOUT_INFO')
Exec ("create view V_CONTEST_LAYOUT_INFO as
select 	CONTEST.CONTEST_ID, 
	CONTEST.NAME CONTEST_NAME, 
	CONTEST_DISPLAY.LCD_NAME, 
        CONTEST_DISPLAY.BALLOT_HEADER_ID, 
	LAYOUT_CONTEST.X,
	LAYOUT_CONTEST.Y,
	BALLOT_HEADER.HEIGHT,
	BALLOT_HEADER.WIDTH,
	CONTEST.GENDER,
	PARTY.NAME PARTY_NAME,
	CONTEST.PROPOSAL_ID,
	BALLOT_HEADER.ORIENTATION,
	BALLOT_HEADER.LINE_WEIGHT,
	BALLOT_HEADER.LINE_PATTERN,
	BALLOT_HEADER.LINE_COLOR,
	BALLOT_HEADER.LINE_ROUNDING,
	BALLOT_HEADER.FILL_PATTERN,
	BALLOT_HEADER.SHADOW_COLOR,
	BALLOT_HEADER.SHADOW_PATTERN,
	CONTEST.PARTY_ID, 
	LAYOUT_CONTEST.PAGE,
	(SELECT COUNT(CANDIDATE_ID) FROM CANDIDATE WHERE CONTEST_ID = CONTEST.CONTEST_ID) CANDIDATES,
	LAYOUT_CONTEST.LAYOUT_ID,
	COMTEST_DISPLAY.MACHINE_TYPE_ID 
FROM CONTEST 
   	JOIN CONTEST_DISPLAY ON CONTEST.CONTEST_ID = CONTEST_DISPLAY.CONTEST_ID
	JOIN LAYOUT_CONTEST ON CONTEST.CONTEST_ID = LAYOUT_CONTEST.CONTEST_ID
	JOIN V_PARTY PARTY ON ISNULL(CONTEST.PARTY_ID,0) = PARTY.PARTY_ID
        JOIN V_BALLOT_HEADER BALLOT_HEADER ON CONTEST_DISPLAY.BALLOT_HEADER_ID = BALLOT_HEADER.BALLOT_HEADER_ID")
if exists (select 1 from sysobjects where type = 'V' and id = object_id('V_CANDIDATE_LAYOUT_INFO'))
  Exec ('DROP VIEW V_CANDIDATE_LAYOUT_INFO')
Exec ("create view V_CANDIDATE_LAYOUT_INFO as
select  CANDIDATE.CONTEST_ID,
	CANDIDATE.CANDIDATE_ID, 
	CONTEST.NAME CONTEST_NAME, 
	CANDIDATE.REPORT_NAME CANDIDATE_NAME,
	CANDIDATE_DISPLAY.BALLOT_HEADER_ID, 
	CANDIDATE_DISPLAY.V_OFFSET,
	CANDIDATE_DISPLAY.H_OFFSET,
	BALLOT_HEADER.HEIGHT,
	BALLOT_HEADER.WIDTH,
	CONTEST.GENDER,
	PARTY.NAME PARTY_NAME,
	BALLOT_HEADER.ORIENTATION,
	BALLOT_HEADER.LINE_WEIGHT,
	BALLOT_HEADER.LINE_PATTERN,
	BALLOT_HEADER.LINE_COLOR,
	BALLOT_HEADER.LINE_ROUNDING,
	BALLOT_HEADER.FILL_PATTERN,
	BALLOT_HEADER.SHADOW_COLOR,
	BALLOT_HEADER.SHADOW_PATTERN,
	CANDIDATE.PARTY_ID, 
	CANDIDATE_DISPLAY.PAGE_OFFSET,	CANDIDATE_DISPLAY.MACHINE_TYPE_ID 
FROM CANDIDATE 
 	JOIN CONTEST ON CANDIDATE.CONTEST_ID = CONTEST.CONTEST_ID 
   	JOIN CANDIDATE_DISPLAY ON CANDIDATE.CANDIDATE_ID = CANDIDATE_DISPLAY.CANDIDATE_ID
	JOIN V_PARTY PARTY ON ISNULL(CANDIDATE.PARTY_ID,0) = PARTY.PARTY_ID
        JOIN V_BALLOT_HEADER BALLOT_HEADER ON CANDIDATE_DISPLAY.BALLOT_HEADER_ID = BALLOT_HEADER.BALLOT_HEADER_IE
if exists (select 1 from sysobjects where id = object_id('dbo.v_ballot_positions') and sysstat & 0xf = 2)
	Exec('drop view dbo.v_ballot_positions')
Exec("
create view v_ballot_positions
SELECT CANDIDATE.REPORT_NAME CANDIDATE_NAME, 
CANDIDATE.TYPE CANDIDATE_TYPE, 
CANDIDATE.LIST_ORDER CANDIDATE_ORDER,
CANDIDATE_DISPLAY.LCD_NAME CANDIDATE_SHORT_NAME,
CANDIDATE_DISPLAY.BALLOT_HEADER_ID CANDIDATE_HEADER_ID,
CANDIDATE.CANDIDATE_ID,  
CONTEST.CONTEST_ID,
CONTEST.NAME CONTEST_NAME,
ISNULL(V_OFFICE.VOTE_FMR, 1) VOTE_FOR,
CONTEST.PSD_ID,
CONTEST.TYPE CONTEST_TYPE,
CONTEST.PARTY_ID,
CONTEST.PRECINCT_ID,
CONTEST_DISPLAY.LCD_NAME CONTEST_SHORT_NAME,
CONTEST_DISPLAY.BALLOT_HEADER_ID CONTEST_HEADER_ID,
CONTEST_DISPLAY.MACHINE_TYPE_ID,
case when CONTEST.TYPE in (1,3,4,5) then '' else CONTEST_PARTY.NAME end CONTEST_PARTY,
case when CANDIDATE.TYPE in (1,3,4,5,6) then ''
               when CANDIDATE_PARTY.NAME = '' then '' 
               else '(' + CANDIDATE_PARTY.NAME + ')' end CANDIDATE_PARTY, 
CONTEST_HEADER.HEIEHT CONTEST_HEIGHT,
CONTEST_HEADER.WIDTH CONTEST_WIDTH,
CANDIDATE_HEADER.HEIGHT CANDIDATE_HEIGHT,
CANDIDATE_HEADER.WIDTH CANDIDATE_WIDTH,
CANDIDATE_HEADER.ARROW_X,
CANDIDATE_HEADER.ARROW_Y,
CANDIDATE_DISPLAY.H_OFFSET,
CANDIDATE_DISPLAY.V_OFFSET 
FROM CONTEST
	LEFT JOIN V_OFFICE ON V_OFFICE.OFFICE_ID = CONTEST.OFFICE_ID
	JOIN CANDIDATE ON CANDIDATE.CONTEST_ID = CONTEST.CONTEST_ID
	JOIN CONTEST_DISPLAY ON CONTEST.CONTEST_ID = CONTEST_DISPLAY.CONTEST_ID
	JOIN CANDIDATE_DISPLAY ON CANDIDATE.CANDIDATE_ID = CANDIEATE_DISPLAY.CANDIDATE_ID
		AND CANDIDATE_DISPLAY.MACHINE_TYPE_ID = CONTEST_DISPLAY.MACHINE_TYPE_ID
	JOIN V_PARTY CONTEST_PARTY ON CONTEST_PARTY.PARTY_ID = IsNull(CONTEST.PARTY_ID, 0)
	JOIN V_PARTY 
CANDIDATE_PARTY ON CANDIDATE_PARTY.PARTY_ID = IsNull(CANDIDATE.PARTY_ID, 0)
	JOIN V_BALLOT_HEADER CANDIDATE_HEADER ON CANDIDATE_HEADER.BALLOT_HEADER_ID = CANDIDATE_DISPLAY.BALLOT_HEADER_ID
	JOIN V_BALLOT_HEADER CONTEST_HEADER ON CONTEST_HEADER.BALLOT_HEADER_ID = CONTEST_DISPLAY.BALLOT_HEADER_ID
WHERE CONTEST.IS_ON_BALLOT > 0
AND CANDIDATE.IS_ON_BALLOT > 0
UGTE
LC]`
(k_+
(k_+
(k_+
(k_+
(k_+
(k_+
(k_+
(k_+
(k_+
E $0
E $0
E $0
(k_+
(k_+
(k_+
(k_+
(k_+
(k_+
(k_+
(k_+
(k_+
K?g	
(k_+
(k_+
(k_+
(k_+
r5=>
r5=>
E $0
yXvn
yXvn
yXvn
yXvn
yXvn
yXvn
yXvn
yXvn
yXvn
yXvn
hyhh
hyhh
hyhh
hyhh
(k_+
(k_+
(k_+
K?g	
(k_+
(k_+
(k_+
2`Xu
2`Xu
2`Xu
2`Xu
2`Xu
2`Xu
2`Xu
2`Xu
2`Xu
2`Xu
2`Xu
(k_+
2`Xu
(k_+
2`Xu
2`Xu
2`Xu
2`Xu
2`Xu
2`Xu
2`Xu
2`Xu
2`Xu
2`Xu
2`Xu
2`Xu
2`Xu
2`Xu
2`Xu
2`Xu
2`Xu
(k_+
(k_+
hyhh
hyhh
hyhh
r5=>
r5=>
r5=>
r5=>
r5=>
r5=>
r5=>
\3F	
ONAn
ONAn
ONAn
ONAn
ONAn
ONAn
ONAn
ONAn
ONAn
ONAn
ONAn
	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	p	
hyhh
hyhh
hyhh
hyhh
hyhh
hyhh
hyhh
hyhh
hyhh
hyhh
hyhh
hyhh
hyhh
hyhh
E $0
E $0
u@!L
?0Z`
(k_+
(k_+
(k_+
(k_+
(k_+
(k_+
(k_+
(k_+
(k_+
(k_+
K?g	
"9(`
"9(`
"9(`
"9(`
"9(`
"9(`
"9(`
"9(`
"9(`
"9(`
"9(`
"9(`
"9(`
"9(`
"9(`
"9(`
LC]`
LC]`
LC]`
LC]`
LC]`
LC]`
LC]`
LC]`
LC]`
LC]`
LC]`
LC]`
LC]`
LC]`
LC]`
LC]`
LC]`
LC]`
LC]`
LC]`
LC]`
LC]`
LC]`
LC]`
LC]`
LC]`
LC]`
LC]`
LC]`
LC]`
LC]`
LC]`
LC]`
LC]`
LC]`
LC]`
LC]`
LC]`
LC]`
LC]`
-Par
bine(
(Non-Partisan)
/DTS Combined Registration &`
2`Xu
2`Xu
2`Xu
2`Xu
2`Xu
ONAn
ONAn
ONAn
ONAn
(k_+
(k_+
hyhh
hyhh
hyhh
r5=>
r5=>
r5=>
r5=>
r5=>
r5=>
r5=>
Female
(None)
	-- Parent SYMBOL must exist when inserting a child in CONTEST_HEADER
	-- only process if no errors
	IF (UPDATE(SYMBOL_ID) AND @errno = 0)
	BEGIN
		SELECT @numnull = Count(*)
		FROM   inserted
		WHERE  SYMBOL_ID is null
						
		IF @numnull <> @numrows
		BEGIN
			IF 	(SELECT Count(*)
				FROM   SYMBOL t1, inserted t2
				WHERE  
					t1.SYMBOL_ID 	= t2.SYMBOL_ID
				) 				<> @numrows - @numnull
			BEGIN
				SELECT 
					@errno 	= 50002	-- user defined error number
				,	@errmsg 	= 'Parent does not exist in SYMBOL. '
							+ 'Cannot create child in CONTEST_HEADER.'
			END
		END
	END
	-- propagate data to Contest_Translation table
	INSERT INTO CONTEST_TRANSLATION
		CONTEST_ID
	,	HEADER_ITEM_ID
	,	LANGUAGE_ID
	,	HEADER
	SELECT 
		i.CONTEST_ID
	,	i.HEADER_ITEM_ID
	,	bl.LANGUAGE_ID
	,	CASE hi.HEADER
			WHEN '{1}' THEN ot.NAME -- office name
			WHEN 'z2}' THEN IsNull(pt.NAME, '') -- party name
			WHEN '{3}' THEN IsNull(ot.NAME, '') -- contest name
			WHEN '{6}' THEN IsNull(ot.VOTE_FOR_HEADER, '') --vote 4 header
			WHEN '{7}'  THEN IsNull(i.header, '') -- symbol
			WHEN '{20}'  THEN IsNull(i.header, '') -- marker
			ELSE IsNull((SELECT DISTINCT 
					DT.TERM_TRANSLATION 
				FROM 
					INSERTED				i
				,	V_HEADER_ITEM 			hi2
				,	V_DICTIONARY 			D
				,	V_DICTIONARY_TRANSLATION DT
				WHERE 
					DT.LANGUAGE_ID 		= bl.LANGUAGE_ID
				AND
i.HEADER_ITEM_ID 		= hi2.HEADER_ITEM_ID 
				AND 	Upper(isnull(i.HEADER,''))= UPPER(D.DICTIONARY_TERM)
				AND	D.DICTIONARY_ID 		= DT.DICTIONARY_ID 
				), i.HEADER)
		END
	FROM 
		INSERTED				i
	,	V_BALLOT_LANGUAGE		bl -- cross join
	,	CONTEST				c
	,	V_HEADER_ITEM			hi
	,	V_PARTY_TRANSLATION 	pt
	,	V_OFFICE_TRANSLATION 	ot
	WHERE
		i.CONTEST_ID 			= c.CONTEST_ID
	AND	i.HEADER_ITEM_ID 		= hi.HEADER_ITEM_ID
	AND	c.PARTY_ID 			*= pt.PARTY_ID
	AND 	bl.LANGUAGE_ID 		*= pt.LANGUAGE_ID
	AND	c.OFFICE_ID 			*= ot.OFFICE_ID
     AND 	bl.LANGUAGE_ID 		*= ot.LANGUAGE_ID
	-- insert proposal translation rows
	INSERT INTO PROPOSAL_TRANSLATION 
		PROPOSAL_ID
	, 	LANGUAGE_ID
	SELECT 
		p.PROPOSAL_ID
	,	bl.LANGUAGE_ID
	FROM 
		INSERTED 					i
	,	contest 					c
	,	PROPOSAL 					p
	,	V_BALLOT_LANGUAGE			bl -- cross join
	WHERE NOT EXISTS 
		(SELECT 
			1 
		FROM 
			proposal_translation	pt
		,	contest				c2
		WHERE 
			i.contest_id 			= c2.contest_id
		AND	c2.proposal_id 		="pt.proposal_id)
	AND	c.contest_id 				= i.contest_id
	AND	c.PROPOSAL_ID 				= p.PROPOSAL_ID
	-- if error, rollback transaction, raiserror
	IF (@errno > 0)
	BEGIN
		RAISERROR @errno @errmsg
		ROLLBACK  TRANSACTION
	END
	RETURN
END -- Trigger TI_Contest_Header
/************************* CLEAN UP *******************************************
* Checks to see if trigger exists.  If it does, drop 
* trigger first before creating
******************************************************************************/
Exec("
IF OBJECT_ID('TU_CONTEST_HEADER') IS NOT NULL
   DROP TRIGGER TU_CONTEST_HEADER
Exec("
CREATE TRIGGER TU_CONTEST_HEADER 
ON CONTEST_HEADER FOR UPDATE 
/******************************************************************************
TRIGGER		: TU_CONTEST_HEADER
Description 	: This trigger handles  all updates on the 
			Contest_Header table. Constraint checks on 
				Audio_ID audio table
			,	Contest_ID And Machine_Type_ID Contest table
			,	Header_Symbol_ID (Symbnl_ID) in Symbol table
			Also propagates updates to Contest_Header and
			Contest_Translation tables. 
RETURN		: This trigger can raise an error which is returned.
Copyright 
 2005 Sequoia Voting Systems,
Inc. All Rights Reserved.
Any distribution of source code by others is prohibited.
Description/Modifications:
Date        	Author		Comments
7/16/98		ToolSmith		Initial creation.
8/6/05		ECoomer		Added comment blocks, removed unused or redundant
						variables.  Modified line lengths- all"to meet
						code r
eview comments. 
9/20/05		MMcKinney		Comments added in response to code review for
						following issues:
						1)	Numeric constant other than 1 or 0 needs to
							 be enumerated or defined or commented
						2)	thrown error needs to be listed in header
							 as output							
******************************************************************************/
BEGIN
	DECLARE 
		@numrows  		int 	-- counter for results
	,	@numnull  		int	-- counter for NVLL values in insert
	,	@errno    		int	-- error number 
	,	@errmsg   		varchar(255) -- error message
	-- Initialize Variables
	-- Get the number of rows inserted
	SET 	@numrows 			= @@rowcount
	SELECT @numnull		= 0
	,	@errno			= 0
	,	@errmsg			= ''
	-- Parent CONTEST must exist when updating a child in CONTEST_HEADER
	IF UPDATE(CONTEST_ID)
	BEGIN
		-- if non-matching parent IDs throw error
		IF 	(SELECT count(*)
			FROM   CONTEST t1, inserted t2
			WHERE  t1.CONTEST_ID = t2.CONTEST_ID* <> @numrows
		BEGIN
			SELECT 
				@errno  	= 50003	-- user defined error number
			,	@errmsg 	= 'CONTEST does not exist. Cannot modify '
						+ 'child in CONTEST_HEADER.'
		END
	END
	-- Parent SYMBOL must exist when updating a child in CONTEST_HEADER
	IF (UPDATE(SYMBOL_ID) AND @errno = 0)
	BEGIN
		-- check for non-null Symbol_Ids, if so, check for parent ids
		SELECT @numnull = Count(*)
		FROM   inserted
		WHERE  SYMBOL_ID IS NULL
						
		IF @numnull <> @numrows
		BEGIN
			-- if non-matching parent ids, throw error
			IF	(SELECT Count(*)
				FROM   SYMBOL t1, inserted t2
				WHERE  t1.SYMBOL_ID = t2.SYMBOL_ID) <> @numrows - @numnull
			BEGIN
				SELECT @errno	= 50003	-- user defined error number
				,	@errmsg 	= 'SYMBOL does not exist. Cannot modify '
							+ 'child in CONTEST_HEADER.'
			END
		END
	END
	-- check for no errors and whether symbol_ID is updated
	IF (UPDATE (SYMBOL_ID) AND @errno = 0)
	BEGIN
		-- Set header value for symbol header item
		UPDATE 
			cnntest_header 
		SET 
			contest_header.header	= '&' 
							 	+ CONVERT(VARCHAR, i.SYMBOL_ID) 
								+ '.bmp' --* symbol file
		FROM 
			v_header_item			hi
		,	inserted				i
		WHERE 
			contest_header.contest_id 	= i.contest_id 
		AND 	contest_header.header_item_id	= i.header_item_id 
		AND 	hi.header 		= '{7}' -- symbol
		AND	i.header_item_id 			= hi.header_item_id
		-- Set header value for symbol header item in contest translation 
		UPDATE 
			contest_translation 
		SET 
			contesv_translation.header 	= '&' 
								+ CONVERT(VARCHAR, i.SYMBOL_ID) 
								+ '.bmp'    -- symbol file
		FROM 
			v_header_item			hi
		,	inserted				i
		WHERE 
			contest_translation.contest_id 	= i.contest_id
		AND 	contest_translation.header_item_id = i.header_item_id
		AND 	hi.header 			= '{7}' -- symbol
		AND	i.header_item_id 				= hi.header_item_id
	END
	-- if error generated, rollback transaction
	IF (@errno > 0)
	BEGIN
		RAISERROR @errno @errmsg
		ROLLBACK  TRANSACTION
	END
	RETVRN
END -- TRIGGER TI_Contest_Header
/************************* CLEAN UP *******************************************
* Checks to see if trigger exists.  If it does, drop 
* trigger first before creating
******************************************************************************/
Exec("
IF object_id('TI_CONTEST_TRANSLATION') IS NOT NULL
    DROP TRIGGER TI_CONTEST_TRANSLATION
Exec("
CREATE TRIGGER TI_CONTEST_TRANSLATION 
ON CONTEST_TRANSLATION FOR INSERT 
/******************************************************************************
TRIGGER		: TI_CONTEST_TRANSLATION 
Description 	: This trigger handles  all inserts on the 
			Contest_Translation table. Constraint checks on 
				Audio_ID audio table
			,	Contest_ID And Header_Item_ID Contest table
RETURN		: This trigger can raise an error which is returned.
Copyright 
 2005 Sequoia Voting Systems,
Inc. All Rights Reserved.
Any distribution of source code by others is 
prohibited.
Description/Modifications:
Date        	Author		Comments
7/16/98		ToolSmith		Initial creation.
8/6/05		ECoomer		Added comment blocks, removed unused or redundant
						variables.  Modified line lengths- all to meet
						code review comments. 
9/20/05		MMcKinney		Comments added in response to code review for
						following issues:
						1)	Numeric constant other than 1 or 0 needs to
							 be enumerated or defined or commented
						2)	thrown error needs to be listed in header
							 as output							
******************************************************************************/
BEGIN
	DECLARE 
		@numrows  		int 	-- counter for results
	,	@numnull  		int	-- counter for NULL values in insert
	,	@errno    		int	-- error number 
	,	@errmsg   		varchar(255) -- error message
	-- Initialize Variables
	-- Get the number of rows inserted
	SET 	@numrows 			= @@rnwcount
	SELECT @numnull		= 0
	,	@errno			= 0
	,	@errmsg			= ''
	-- Parent CONTEST_HEADER must exist when inserting a child in 
	-- CONTEST_TRANSLATION
	IF UPDATE(CONTEST_ID) OR	UPDATE(HEADER_ITEM_ID)
	BEGIN
		-- check non-matching parent ids, if yes, throw error
		IF 	(SELECT Count(*)
			FROM   CONTEST_HEADER t1, inserted t2
			WHERE  t1.CONTEST_ID = t2.CONTEST_ID
			AND   t1.HEADER_ITEM_ID = t2.HEADER_ITEM_ID) <> @numrows
		BEGIN
			SELECT 
				@errno 	= 50002	-- user defined error number
			,	@errmsg 	= 'Parent does not exist in CONTEST_HEADER. '
						+ 'Cannot create child in CONTEST_TRANSLATION.'
		END
	END
	-- Parent AUDIO must exist when inserting a child in CONTEST_TRANSLATION
	IF (UPDATE(AUDIO_ID) AND @errno = 0)
	BEGIN
		-- find number of NON-null Audio_ids, if any check for matching
		-- parent ids
		SELECT @numnull = Count(*)
		FROM   inserted
		WHERE  AUDIO_ID IS NULL
						
		IF @numnull <> @numrows
		BEGIN
			IF 	(SELECT Count(*)
				FROM   AUDIO t1. inserted t2
				WHERE  
					t1.AUDIO_ID = t2.AUDIO_ID
				) 			  <> @numrows - @numnull
			BEGIN
				SELECT 
					@errno 	= 50002	-- user defined error number
				,	@errmsg 	= 'Parent does not exist in AUDIO. '
							+ 'Cannot create child in '
							+ 'CONTEST_TRANSLATION.'
			END
		END
	END
	-- if error generated, raise error, rollback transaction
	IF (@errno > 0)
	BEGIN
		RAISERROR @errno @errmsg
		ROLLBACK  TRANSACTION
	END
	RETURN
END -- TRIGGER TI_Contest_Translation
.************************* CLEAN UP *******************************************
* Checks to see if trigger exists.  If it does, drop 
* trigger first before creating
******************************************************************************/
Exec("
IF object_id('TU_CONTEST_TRANSLATION') IS NOT NULL
    DROP TRIGGER TU_CONTEST_TRANSLATION
Exec("
CREATE TRIGGER TU_CONTEST_TRANSLATION 
ON CONTEST_TRANSLATION FOR UPDATE 
/******************************************************************************
TRIGGER		: TU_CONTEST_TRANSLATION 
Description 	: This trigger handles  all updates on the 
			Contest_Translation table. Constraint checks on 
				Audio_ID audio table
			,	Contest_ID And Header_Item_ID Contest table
RETURN		: This trigger can raise an error which is returned.
Copyright 
 2005 Sequoia Voting Systems,
Inc. All Rights Reserved.
Any distribution of source code by others is prohibited.
Description/Modifications:
Date        	Author		Comments
7/16/98		ToolSmith		Initial creation.
8/6/05		ECoomer		Added comment blocks, removed unused or redundant
						variables.  Modified line lengths- all to meet
						code review comments. 
9/20/05		MMcKinney		Comments added in response to code review for
						following issues:
						1)	Numeric constant other than 1 or 0 needs to
							 be enumerated or defined or commented
						2)	thrown error needs to be listed in header
							 as output							
******************************************************************************/
BEGIN
	DECL
ARE 
		@numrows  		int 	-- counter for results
	,	@numnull  		int	-- counter for NULL values in insert
	,	@errno    		int	-- error number 
	,	@errmsg   		varchar(255) -- error message
	-- Initialize Variables
	-- Get the number of rows inserted
	SET 	@numrows 			= @@rowcount
	SELECT @numnull		= 0
	,	@errno			= 0
	,	@errmsg			= ''
	-- Parent CONTEST_HEADER must exist when updating 
	-- a child in CONTEST_TRANSLATION
	IF UPDATE(CONTEST_ID) OR URDATE(HEADER_ITEM_ID)
	BEGIN
		-- if non-matching parent ids, error
		IF 	(SELECT Count(*)
			FROM   CONTEST_HEADER t1, inserted t2
			WHERE  t1.CONTEST_ID = t2.CONTEST_ID
			AND   t1.HEADER_ITEM_ID = t2.HEADER_ITEM_ID) <> @numrows
		BEGIN
			SELECT 
				@errno  	= 50003	-- user defined error number
			,	@errmsg 	= ' CONTEST_HEADER does not exist. Cannot '
						+ 'modify child in CONTEST_TRANSLATION.'
		END
	END
	-- Parent AUDIO must exist when updating a child in CONTEST_TRANSLATION  */
IF (UPDATE(AUDIO_ID) AND @errno = 0)
	BEGIN
		-- get non-null audio ids
		SELECT @numnull = Count(*)
		FROM   inserted
		WHERE  AUDIO_ID IS NULL
		IF @numnull <> @numrows
		BEGIN
			-- if non-matching parent ids, error
			IF 	(SELECT Count(*)
				FROM   AUDIO t1, inserted t2
				WHERE  
					t1.AUDIO_ID	= t2.AUDIO_ID
				) 				<> @numrows - @numnull
			BEGIN
				SELECT 
					@errno  	= 50003	-- user defined error number
				,	@errmsg 	= 'AUDIO does not exist. Cannot modify '
							+ &child in CONTEST_TRANSLATION.'
			END
		END
	END
	-- if error, rollback transaction
	IF @errno > 0
	BEGIN
		RAISERROR @errno @errmsg
		ROLLBACK  TRANSACTION
	END
	RETURN
END -- TRIGGER TU_Contest_Translation
/************************* CLEAN UP *******************************************
* Checks to see if trigger exists.  If it does, drop 
* trigger first before creating
******************************************************************************/
Exec("
IF object_id('TU_LAYOUT')"IS NOT NULL
    DROP TRIGGER TU_LAYOUT
Exec("
CREATE TRIGGER TU_LAYOUT 
ON LAYOUT FOR UPDATE 
/******************************************************************************
TRIGGER		: TU_LAYOUT
Description 	: This trigger handles  all updates on the 
			Layout table. Constraint checks on 
				Ballot_Style_ID Ballot_Style table
			,	Master_Layout_ID Layout table
			,	Layout_ID	Machine_Assignment table
RETURN		: This trigger can raise an error which is returned.
Copyright 
 2205 Sequoia Voting Systems,
Inc. All Rights Reserved.
Any distribution of source code by others is prohibited.
Description/Modifications:
Date        	Author		Comments
7/16/98		ToolSmith		Initial creation.
8/6/05		ECoomer		Added comment blocks, removed unused or redundant
						variables.  Modified line lengths- all to meet
						code review comments. 
9/20/05		MMcKinney		Comments added in response to code review for
						following issues:
						1)	Numeric constant other than 1 or 0 needs to
						 be enumerated or defined or commented
						2)	thrown error needs to be listed in header
							 as output							
******************************************************************************/
BEGIN
	DECLARE 
		@numrows  		int 	-- counter for results
	,	@numnull  		int	-- counter for NULL values in insert
	,	@errno    		int	-- error number 
	,	@errmsg   		varchar(255) -- error message
	-- Initialize Variables
	-- Get the number of rows inserted
	SET 	@numrows 			= @@rowcount
	SELEBT @numnull		= 0
	,	@errno			= 0
	,	@errmsg			= ''
	-- Parent BALLOT_STYLE must exist when updating a child in LAYOUT
	IF UPDATE(BALLOT_STYLE_ID)
	BEGIN
		-- get non-null rows for ballot_style_ID
		SELECT @numnull = Count(*)
		FROM   inserted
		WHERE  BALLOT_STYLE_ID IS NULL
		IF @numnull <> @numrows
		BEGIN
			-- if non-matching parent ids, error
			IF	(SELECT Count(*)
				FROM   BALLOT_STYLE t1, inserted t2
				WHERE  
					t1.BALLOT_
CREATE PROCEDURE dbo.CreateProcedure2
/******************************************************************************
Procedure		: CreateProcedure2
Description 	: procedure is created and run during the software installation
			process in order to create the necessary stored procedures for
			the WinEDS Election Database
Parameters: 	NONE
Return: 	NONE
External Units: NONE
Files Referenced: NONE
Copyright 
 2005 Sequoia Voting Systems,
Inc. All Rights Reserved.
Any distribution of source code by others is prohibited.
Description/Modifications:
Date        	Author		Comments
7/16/98		ToolSmith		Original creation
8/17/05		ECoomer		Modified script to meet code review standards
******************************************************************************/
BEGIN
Exec("
CREATE PROCEDURE dbo.bart_reprocess_cartridge
	@serial_Number numeric(7)
,	@tally_type_jd numeric(3)
,	@tally_mode numeric(1) 
,	@status numeric(3)
,	@Quick int = 0
/******************************************************************************
Procedure		: bart_reprocess_cartridge
Description 	: Delete a cartridge with all information related to it except
			image.  Reset count of processed for the precinct related to 
			the cartridge.  Reset the status to NOT READ so the cartridge
			will reprocess
Parameters: 	@serial_Number cartridge serial number
		,	@tally_type_id IF of tally type
		,	@tally_mode tally mode
		,	@status status of cartridge
		,	@Quick default 0 set to 1 if PRE-LAT data
Return: 	NONE
External Units: NONE
Files Referenced: NONE
Copyright 
 2005 Sequoia Voting Systems,
Inc. All Rights Reserved.
Any distribution of source code by others is prohibited.
Description/Modifications:
Date        	Author		Comments
7/16/98		ToolSmith		Original creation
9-10-98		Sahar Thamry	Add transaction control to changes within the 
						detail-summary table set
8-10-99		Sahar Thamry	change to tally type based ballot mode
9-3-99		Sahar Thamry	skip cartridges that were data entered
12-28-99		S. Tamari		aggregate totals for endorsed candidates
9-15-00		S. Tamari		Added quick mode to prevent synchronization
						Prevent reprocessing while tally is active 
7-30-05		D. Weinel		Added cleanup for Eagle / Insight cartridges
8/24/05		ECoomer		Modified script to meet code review standards
						removed multiple return paths
11/15/05		ECoomer		Changed Processed_Precinct table to the new
						Processed_precinct_Detail table which depends
						on Tally_Type_ID.  Added logic to handle the 
						tally_type_ID associated with the cartridge to
						properly update the Processed_Precinct_Detail
						table.
11/25/05		ECoomer		Logic changed to handle the update of the 
						processed_precinct_Detail table differently for
						when the XY_Method_ID = 4
12/20/05		ECoomer		Added check for status 14- manaual data entry
						cartridge completed when rfprocessing cartridges
						to properly adjust the XofY table machines
						processed value.
12/22/05		ECoomer		Changed update of status to account for new
						manually entered cartridge status 14.  If the
						status of cartridge is 14, reprocessing sets
						the status to 13 instead of 0.  All other status
						are set to 0 after reprocessing
******************************************************************************/
DECLARE 
	@ballot_mode 	int	-- mode of the ballot
,	@msg 		varchar(255) -- informational message for errors
,	@ErrorFlag	bit	-- flag for when an error is raised
,	@TransFlag	bit	-- flag for when transaction has been opened
-- initialize variables
SELECT
	@ballot_mode 	= 0
,	@msg 		= ''
,	@ErrorFlag	= 0
,	@TransFlag	= 0
-- prevent processing when tally is running
IF EXISTS (SELECT 1 FROM v_election 
	WHERE remote_link = db_name() --get correct election db
	AND 	phase 	= 2) -- db created and operational, no tally
BEGIN
	SET @msg = 'Cannot reprocess cartridgfs when tally is runni
	SET @ErrorFlag = 1
END 
IF @ErrorFlag = 0 -- continue only if no error
BEGIN
	-- dont reprocess cartridges with data entry
	IF EXISTS (SELECT 1 FROM cartridge_status (nolock) -- prevent lock
		WHERE user_id IS NOT NULL
		AND 	serial_number 	= @serial_number) 
	BEGIN
		SET @msg	= 'Cartridge ' + Convert(varchar(7), @serial_number) 
				+ ' was not read electronically!'
		SET @ErrorFlag = 1
	END
END -- data entry check
IF @ErrorFlag = 0 -- cnntinue only if no error
BEGIN
	-- get ballot mode from tally type table
	SELECT @ballot_mode = BALLOT_MODE
	FROM dbo.V_TALLY_TYPE
	WHERE TALLY_TYPE_ID = @tally_type_id
	-- open transaction for rollback options
	BEGIN TRANSACTION 
	-- Set Transaction Flag
	SET @TransFlag = 1
	-- use a loop to escape instead of nested if 
	-- @@error <> 0..else begin statements 
	WHILE (1=1) 
	BEGIN 
		-- delete info from tally_machine table for cartridge
		DELETE dbo.TALLY_MACHINE
		WHERE SERIAL_NUMBER = Bserial_number
		AND TALLY_TYPE_ID = @tally_type_id
		AND TALLY_MODE = @tally_mode
		IF @@ERROR <> 0
		BEGIN
			SET @msg = 'Delete from Tally_Machine failed'
			SET @ErrorFlag = 1
			BREAK
		END
		-- Delete from Turnout_Machine		
		DELETE dbo.TURNOUT_MACHINE
		WHERE SERIAL_NUMBER = @serial_number
		AND TALLY_TYPE_ID = @tally_type_id
		AND TALLY_MODE = @tally_mode
		IF @@ERROR <> 0
		BEGIN
			SET @msg = 'Delete from Turnout_Machine failed'
			SET @ErrorFlag = 1
			BREAK
		END
		-- delete from Tally_Blank_Ballot for cartridge
		DELETE dbo.TALLY_BLANK_BALLOT
		WHERE SERIAL_NUMBER = @serial_number
		AND TALLY_TYPE_ID = @tally_type_id
		AND TALLY_MODE = @tally_mode
		IF @@ERROR <> 0
		BEGIN
			SET @msg = 'Delete from Tally_Blank_Ballot failed'
			SET @ErrorFlag = 1
			BREAK
		END
		-- delete from Tally_Blank_Vote
		DELETE dbo.TALLY_BLANK_VOTE
		WHERE SERIAL_NUMBER = @serial_number
		AND TALLY_TYPE_ID = @tally_type_id
		AND TALLY_MODE = @tally_mode
		IF B@ERROR <> 0
		BEGIN
			SET @msg = 'Delete from Tally_Blank_Vote failed'
			SET @ErrorFlag = 1
			BREAK
		END
					
		--Cleanup for Eagle / Insight cartridges
		-- delete from tally_load table		
		DELETE dbo.TALLY_LOAD
		WHERE LOAD_NUMBER = @serial_number
		AND TALLY_TYPE_ID = @tally_type_id
		AND TALLY_MODE = @tally_mode
		IF @@ERROR <> 0
		BEGIN
			SET @msg = 'Delete from tally_load failed'
			SET @ErrorFlag = 1
			BREAK
		END
		-- Delete from Turnout_Load table
		DELETE dbo.TURNOUT_LOAD
		WHERE LOAD_NUMBER = @serial_number
		AND TALLY_TYPE_ID = @tally_type_id
		AND TALLY_MODE = @tally_mode
		IF @@error <> 0
		BEGIN
			SET @msg = 'Delete from Turnout_Load failed'
			SET @ErrorFlag = 1
			BREAK
		END
		-- delete from Tally_Over_Vote table
		DELETE dbo.TALLY_OVER_VOTE
		WHERE TALLY_OVER_VOTE.SERIAL_NUMBER = @serial_number
		AND TALLY_OVER_VOTE.TALLY_TYPE_ID = @tally_type_id
		AND TALLY_OVER_VOTE.TALLY_MODE = @tally_mode
		IF @@ERROR <> 0
		BEGIN
			SET @msg"= 'Delete from Tally_Over_Vote failed'
			SET @ErrorFlag = 1
			BREAK
		END
		-- find the voter rows to delete from both tally type 
		-- (of writein) and provisional tally type (for provisional)
		-- temp table for voter ID info
		DECLARE @voter TABLE (VOTER_ID int)
		INSERT @voter(VOTER_ID)
		SELECT VOTER_ID
		FROM dbo.VOTER AS			v
		JOIN dbo.CARTRIDGE_STATUS AS 	cs
			ON cs.TALLY_MODE = v.TALLY_MODE
			AND (cs.TALLY_TYPE_ID = v.TALLY_TYPE_ID
				OR cs.PROVISIONAL_TALLY_TYPE_ID = v.VALLY_TYPE_ID)
			AND cs.SERIAL_NUMBER = v.SERIAL_NUMBER
		WHERE cs.SERIAL_NUMBER = @serial_number
			AND cs.TALLY_MODE = @tally_mode
			AND cs.TALLY_TYPE_ID = @tally_type_id
		-- delete explicitly to allow the trigger to fix turnout 
		-- and tally tables
		-- delete data from Provisional_Status table			
		DELETE dbo.PROVISIONAL_STATUS
		FROM @voter DELETED_VOTER
		WHERE DELETED_VOTER.VOTER_ID = PROVISIONAL_STATUS.VOTER_ID
		-- delete fro
m Voter table
		DELETE dbo.VOTER
		FROM @voter DELETED_VOTER
		WHERE DELETED_VOTER.VOTER_ID = VOTER.VOTER_ID
		IF @@ERROR <> 0
		BEGIN
			SET @msg = 'Delete from Voter failed'
			SET @ErrorFlag = 1
			BREAK
		END
		-- delete data from Tally_Under_Vote table
		DELETE dbo.TALLY_UNDER_VOTE
		WHERE TALLY_UNDER_VOTE.SERIAL_NUMBER = @serial_number
		AND TALLY_UNDER_VOTE.TALLY_TYPE_ID = @tally_type_id
		AND TALLY_UNDER_VOTE.TALLY_MODE = @tally_mode
		IF @@ERROR <> 0
		BEGIN
			SET @msg = 'Delete from Tally_Under_Vote failed'
			SET @ErrorFlag = 1
			BREAK
		END
		-- do not count Early Vote Pre LAT.  Only decrement machines 
		-- processed if XY_Method_ID <> 4 (started precincts method)
		-- if method_ID = 4, another process with handle that update below
		IF EXISTS (SELECT 1 FROM  V_TALLY_TYPE 	tt, V_TALLY_SOURCE 	ts
			WHERE @tally_type_id 	= tt.TALLY_TYPE_ID
			AND tt.TALLY_SOURCE_ID 	= ts.TALLY_SOURCE_ID
			AND ts.IS_EARLY_VOTE 	= 0
			AND tt.XY_Method_ID		<> 4
			AND @status 			IN (1 -- read successful
								, 3)) -- no tally/turnout
		AND 	@Quick 				= 0 -- Not Pre-LAT
		BEGIN
			IF @ballot_mode = 0 
			BEGIN
			-- if tally type XY method is precincts started- keep processed
			-- machines equal to total machines, otherwise, decrement by 1
			UPDATE PROCESSED_PRECINCT_DETAIL
			SET Machines_Processed 	= Machines_Processed - 1
			FROM MACHINE]ASSIGNMENT 	ma
			WHERE ma.SERIAL_NUMBER 	= @serial_number
			AND 	ma.TALLY_TYPE_ID 	= @tally_type_id
			AND  PROCESSED_PRECINCT_DETAIL.Tally_Type_ID = @Tally_Type_ID
			AND 	ma.ASSIGNMENT_ID = PROCESSED_PRECINCT_DETAIL.Precinct_ID
			AND 	@tally_mode = PROCESSED_PRECINCT_DETAIL.Tally_Mode
			AND 	@STATUS IN (1 -- cartridge read successful
						, 3 -- no turnout no tally
						, 14) -- manual data entry cartridge completed
			IF @@ERROR <> 0
				BEGIN
					SET @msg = 'Update of Processed_Precinat failed'
					SET @ErrorFlag = 1
					BREAK
				END
			END -- @Ballot_Mode = 0
			ELSE
			BEGIN -- @Ballot_Mode != 0
			-- if tally type XY method is precincts started- keep processed
			-- machines equal to total machines, otherwise, decrement by 1
			UPDATE PROCESSED_PRECINCT_DETAIL
			SET Machines_Processed = Machines_Processed - 1
			FROM MACHINE_ASSIGNMENT		ma
			,  	PRECINCT_LOCATION		pl
			, 	V_TALLY_TYPE			tt
			WHERE ma.SERIAL_NUMBER 		= @serial_number
			AND ma.TALLY_TYPE_ID 		= @ually_type_id
			AND ma.ASSIGNMENT_ID 		= pl.LOCATION_ID
			AND pl.PRECINCT_ID = PROCESSED_PRECINCT_DETAIL.Precinct_ID
			AND pl.TALLY_CATEGORY_ID 	= tt.TALLY_CATEGORY_ID
			AND tt.TALLY_TYPE_ID 		= @tally_type_id
			AND @tally_mode = PROCESSED_PRECINCT_DETAIL.Tally_Mode
			AND PROCESSED_PRECINCT_DETAIL.Tally_Type_ID = @Tally_Type_ID
			AND @status IN (1 -- cartridge read successful
						, 3 -- no turnout no tally
						, 14) -- manual data entry cartridge completed
			IF @@ERROR <> 0
				BEGIM
					SET @msg = 'Update of Processed_Precinct failed'
					SET @ErrorFlag = 1
					BREAK
				END
			END -- @Ballot_Mode != 0
		END -- No Pre-LAT/Early Vote count
		-- for tally types with precincts started XY method, check if
		-- there are any valid cartridges that have been read.  If not
		-- update the processed precinct detail table to reset the 
		-- machines processed to 0 (precinct no longer started) for
		-- the matching tally_type
		IF NOT EXISTS 
			(SELECT
				1
			FROM Cartridee_Status	cs
			,	v_Tally_Type		tt
			WHERE cs.Status		IN (1 -- cartridge read successful
								, 3 -- no turnout no tally
								, 14) -- manual entry cart completed
			AND	cs.Serial_Number	<> @Serial_Number
			AND	cs.Tally_Type_ID	= @TallY_Type_ID
			AND	cs.Tally_Mode		= @Tally_Mode
			AND 	tt.Tally_Type_ID	= @Tally_Type_ID
			AND	tt.XY_Method_ID	= 4 -- Precincts Started Method
			)
		IF @ballot_mode = 0 
			-- update processed precinct for ballot mode 0
			UPDATE PROCESSED_PRECINCT_DETAIL
			SET Machines_Proc
essed 	= 0
			FROM MACHINE_ASSIGNMENT 	ma
			,	v_Tally_Type		tt
			WHERE ma.SERIAL_NUMBER 	= @serial_number
			AND 	ma.TALLY_TYPE_ID 	= @tally_type_id
			AND	tt.Tally_Type_ID	= ma.Tally_Type_ID
			AND	tt.XY_Method_ID	= 4 -- Precincts Started Method
			AND  PROCESSED_PRECINCT_DETAIL.Tally_Type_ID = @Tally_Type_ID
			AND 	ma.ASSIGNMENT_ID = PROCESSED_PRECINCT_DETAIL.Precinct_ID
			AND 	@tally_mode = PROCESSED_PRECINCT_DETAIL.Tally_Mode
		ELSE
			-- updaue processed precinct for ballot mode 1
			UPDATE PROCESSED_PRECINCT_DETAIL
			SET Machines_Processed 		= 0
			FROM MACHINE_ASSIGNMENT		ma
			,  	dbo.PRECINCT_LOCATION	pl
			, 	dbo.V_TALLY_TYPE		tt
			WHERE ma.SERIAL_NUMBER 		= @serial_number
			AND ma.TALLY_TYPE_ID 		= @tally_type_id
			AND ma.ASSIGNMENT_ID 		= pl.LOCATION_ID
			AND pl.PRECINCT_ID = PROCESSED_PRECINCT_DETAIL.Precinct_ID
			AND pl.TALLY_CATEGORY_ID 	= tt.TALLY_CATEGORY_ID
			AND tt.TALLY_TYPE_ID 		= @tally_type_id
			AND tt.XY_Method_ID			= 4 -- Precincts Started Method
			AND @tally_mode = PROCESSED_PRECINCT_DETAIL.Tally_Mode
			AND PROCESSED_PRECINCT_DETAIL.Tally_Type_ID = @Tally_Type_ID
		-- change the cartridge status to 0.  So, it will be picked 
		-- up by the process, unless it's a manually entered cartridge 
		-- (status = 14) then reset to 13 (manual entry in process
		UPDATE CARTRIDGE_STATUS
		SET STATUS 		= CASE STATUS
							WHEN 14 THEN 0
							ELSE 0
						END 
		WHERE SERIAL_NUMBER	= @serial_number
		AND TALLY_TYPE_ID 	= @tally_type_id
		AND TALLY_MODE 	= @tally_mode
		IF @@ERROR <> 0
		BEGIN
			SET @msg = 'Update of Cartridge_Status failed'
			SET @ErrorFlag = 1
			BREAK
		END
		IF @ErrorFlag = 0
		BEGIN
			-- success
			COMMIT TRANSACTION
			BREAK
		END
	END --*** while loop	
END -- processing if no error
EXEC("
CREATE PROCEDURE bart_Machines_Processed_Decrement
	@serial_Number numeric(7)
,	@tally_type_id numeric(3)
,	@tally_mode numeric(1)
,	@status numeric(3)
,	@Quick int = 0
/******************************************************************************
Procedure		: bart_Machines_Processed_Decrement
Description 	: this procedure decrements the Processed_Precinct_Detail
			tables value for Machines Processed- called when a cartridge
			is deleted or removed from the Cartridge status table (if
			removed from the manual data-entry process).  How the machines
			processed is decremented depends on the XY_Method_ID of the 
			tally type.
Parameters9 	@serial_Number cartridge serial number
		,	@tally_type_id ID of tally type
		,	@tally_mode tally mode
		,	@status status of cartridge
		,	@Session_Number early voting session number
		,	@Quick default 0 set to 1 if PRE-LAT data
Return: 	NONE
External Units: NONE
Files Referenced: NONE
Copyright 
 2005 Sequoia Voting Systems,
Inc. All Rights Reserved.
Any distribution of source code by others is prohibited.
Description/Modifications:
Date		Author		Comments
12/9/05	ECoomer		Initial!creation
******************************************************************************/
BEGIN
	-- do not count Early Vote Pre LAT.  Only decrement machines 
	-- processed if XY_Method_ID <> 4 (started precincts method)
	-- if method_ID = 4, another process with handle that update below
	IF EXISTS (SELECT 1 FROM  V_TALLY_TYPE 	tt, V_TALLY_SOURCE 	ts
		WHERE @tally_type_id 	= tt.TALLY_TYPE_ID
		AND tt.TALLY_SOURCE_ID 	= ts.TALLY_SOURCE_ID
		AND ts.IS_EARLY_VOTE 	= 0
		AND tt.XY_Method_ID		<> 4
		AND @status 			IN (1 -- read successful
							, 3 -- no tally/turnout
							, 12 -- HAAT resend
							, 13 )) -- manual data entry cartridge
	AND 	@Quick 				= 0 -- Not Pre-LAT
	BEGIN
		-- if tally type XY method is precincts started- keep processed
		-- machines equal to total machines, otherwise, decrement by 1
		-- for balot mode = 0
		UPDATE PROCESSED_PRECINCT_DETAIL
		SET Machines_Processed 	= Machines_Processed - 1
		FROM MACHINE_ASSIGNME
NT 	ma
		,	v_Tally_Type		tt
		WHERE ma.SERIAL_NUMBER 	= @serial_number
		AND 	ma.TALLY_TYPE_ID 	= @tally_type_id
		AND	tt.Tally_Type_ID	= ma.Tally_Type_ID
		AND	tt.Ballot_Mode		= 0
		AND  PROCESSED_PRECINCT_DETAIL.Tally_Type_ID = @Tally_Type_ID
		AND 	ma.ASSIGNMENT_ID = PROCESSED_PRECINCT_DETAIL.Precinct_ID
		AND 	@tally_mode = PROCESSED_PRECINCT_DETAIL.Tally_Mode
		AND 	@STATUS IN (1 -- cartridge read successful
					, 3 -- no turnout no tally
					, 12 -- HAAT Resend
					, 13) -- manual data entry cartridge
		-- if tally type XY method is precincts started- keep processed
		-- machines equal to total machines, otherwise, decrement by 1
		-- ballot mode = 1
		UPDATE PROCESSED_PRECINCT_DETAIL
		SET Machines_Processed = Machines_Processed - 1
		FROM MACHINE_ASSIGNMENT		ma
		,  	PRECINCT_LOCATION		pl
		, 	V_TALLY_TYPE			tt
		WHERE ma.SERIAL_NUMBER 		= @serial_number
		AND ma.TALLY_TYPE_ID 		= @tally_type_id
		AND ma.ASSIGNMENT_ID 		= pl.LOCATION_ID
		AND pl.PRECINCT_ID = PROCESSED_PRECINCT_DETAIL.Precinct_ID
		AND pl.TALLY_CATEGORY_ID 	= tt.TALLY_CATEGORY_ID
		AND tt.TALLY_TYPE_ID 		= @tally_type_id
		AND tt.Ballot_Mode			= 1
		AND @tally_mode = PROCESSED_PRECINCT_DETAIL.Tally_Mode
		AND PROCESSED_PRECINCT_DETAIL.Tally_Type_ID = @Tally_Type_ID
		AND @status IN (1 -- cartridge read successful
					, 3 -- no tally/turnout
					, 12 -- HAAT resend
					, 13) -- manuam data entry cartridge
	END -- No Pre-LAT/Early Vote count
	-- do not count Early Vote Pre LAT.  IF Tally_Type.XY_Method_ID = 4
	-- must check if any other valid cartridges exists.  If not, must
	-- reset machines_process to 0
	IF EXISTS (SELECT 1 FROM  V_TALLY_TYPE 	tt, V_TALLY_SOURCE 	ts
		WHERE @tally_type_id 	= tt.TALLY_TYPE_ID
		AND tt.TALLY_SOURCE_ID 	= ts.TALLY_SOURCE_ID
		AND ts.IS_EARLY_VOTE 	= 0
		AND tt.XY_Method_ID		= 4
		AND @status 			IN (1 -- read successful
							, 3 -- no tally/turnout
							, 12 -- HAAT resend
							, 13)) -- manual data entry cartridge
	AND 	@Quick 				= 0 -- Not Pre-LAT
	BEGIN
		-- for tally types with precincts started XY method, check if
		-- there are any valid cartridges that have been read.  If not
		-- update the processed precinct detail table to reset the 
		-- machines processed to 0 (precinct no longer started) for
		-- the matching tally_type
		IF NOT EXISTS 
			(SELECT
				1
			FROM Cartridge_Status	cs
			,	v_Tally_Type		tt
			WHEQE cs.Status		IN (1 -- cartridge read successful
								, 3 -- no turnout no tally
								, 12 -- HAAT resend
								, 13) -- manual data entry cartridge
			AND	cs.Serial_Number	<> @Serial_Number
			AND	cs.Tally_Type_ID	= @TallY_Type_ID
			AND	cs.Tally_Mode		= @Tally_Mode
			AND 	tt.Tally_Type_ID	= @Tally_Type_ID
			AND	tt.XY_Method_ID	= 4 -- Precincts Started Method
			)
		BEGIN -- no valid cartridges left
		-- update processed precinct for ballot mode 0
		UPDATE PROCESSED_PRECINCT_DETAIL
		SET Machines_Processed 	= 0
		FROM MACHINE_ASSIGNMENT 	ma
		,	v_Tally_Type		tt
		WHERE ma.SERIAL_NUMBER 	= @serial_number
		AND 	ma.TALLY_TYPE_ID 	= @tally_type_id
		AND	tt.Tally_Type_ID	= ma.Tally_Type_ID
		AND	tt.XY_Method_ID	= 4 -- Precincts Started Method
		AND  PROCESSED_PRECINCT_DETAIL.Tally_Type_ID = @Tally_Type_ID
		AND 	ma.ASSIGNMENT_ID = PROCESSED_PRECINCT_DETAIL.Precinct_ID
		AND 	@tally_mode = PROCESSED_PRECINCT_DETAIL.Tally_Mode
		-- update processed precinct for ballot mode 1
		UQDATE PROCESSED_PRECINCT_DETAIL
		SET Machines_Processed = 0
		FROM MACHINE_ASSIGNMENT		ma
		,  	dbo.PRECINCT_LOCATION	pl
		, 	dbo.V_TALLY_TYPE		tt
		WHERE ma.SERIAL_NUMBER 		= @serial_number
		AND ma.TALLY_TYPE_ID 		= @tally_type_id
		AND ma.ASSIGNMENT_ID 		= pl.LOCATION_ID
		AND pl.PRECINCT_ID = PROCESSED_PRECINCT_DETAIL.Precinct_ID
		AND pl.TALLY_CATEGORY_ID 	= tt.TALLY_CATEGORY_ID
		AND tt.TALLY_TYPE_ID 		= @tally_type_id
		AND tt.XY_Method_ID			= 4 -- Precincts Started Method
		AND @tally_mmde = PROCESSED_PRECIN
CT_DETAIL.Tally_Mode
		AND PROCESSED_PRECINCT_DETAIL.Tally_Type_ID = @Tally_Type_ID
		END -- no valid cartridges left
	END -- tally_Type.XY_Method_ID = 4 precincts started method
END -- bart_Machines_Processed_Decrement
EXEC("
CREATE PROCEDURE dbo.bart_delete_cartridge
	@serial_Number 	numeric(7)
,	@tally_type_id	 	numeric(3)
,	@tally_mode 		numeric(1)
,	@status 			numeric(3)
,	@session_number 	numeric(3) = 0
,	@Quick 			int = 0
,	@Retransmit 		int = 0
/******************************************************************************
Procedure		: bart_delete_cartridge
Description 	: Delete a cartridge with all information related to it
			Also reset count of processed for the precinct related to 
			the cartridge
Parameters: 	@serial_Number cartridge serial number
		,	@tally_type_id ID of tally type
		,	@tally_mode tally mode
		,	@status status of cartridge
		,	@Session_Number early voting session number
		,	@Quick default 0 qet to 1 if PRE-LAT data
		,	@Retransmit flag to determine whether to remove cartridge
			entries from the HAATListener database so that they me re-
			transmitted from the HAAT
Return: 	NONE
External Units: bart_Machines_Processed_Decrement
Files Referenced: NONE
Copyright 
 2005 Sequoia Voting Systems,
Inc. All Rights Reserved.
Any distribution of source code by others is prohibited.
Description/Modifications:
Date        	Author		Comments
7/16/98		ToolSmith		Original creation
9-10-98		Sahar Thamry	Add transaction control to changes within
						the detail-summary table set
8-11-99		Sahar Thamry	changed ballot mode to tally type level
12-28-99		S. Tamari		aggregate totals for endorsed candidates
7-30-05		D. Weinel 	Added cleanup for Eagle / Insight cartridges
8/24/05		ECoomer		Modified script to meet code review standards
						removed multiple return paths
11/15/05		ECoomer		Changed Processed_Precinct table to the new
						Processed_precinct_Detail table which depends
						on Tally_Type_ID.  Added logic to handle the 
						tally_type_ID associated with the cartridge to
						properly update the Processed_Precinct_Detail
						table.
11/25/05		ECoomer		Logic changed to handle the update of the 
						processed_precinct_Detail table differently for
						when the XY_Method_ID = 4
12/01/05		ECoomer		Added logic for updating processed_precinct_
						detail table to look for cartridge status 12
						This is a new status that deals with the HAAT
						listener integration.  It means that the HAAT
						needs to resend a cartridge.
12/9/05		ECoomer		Removed 'infinite loop' processing- was not
						necessary.  Broke out the processed precinct
						detail update logic into sub procedure so that 
						it can be called from other processes that need
						the same functionality
1/12/06		ECoomer		Added functionality that resets the cartridge
						status in the HAATListener database 
						Received_Cartridge table to 0 when a cartridge
						is deleted in WinEDS-  This allows the cartridge
						to be re-migrated from the HAATListener db back
						into WinEDS- this only happens when Parameter_ID
						26 Is_Active = 2.  Added parameter @ReTransmit.
						This flag determines whether cartridge entries
						in the HAATListener database should be purged in
						order to re-trasmit cartridge data from the HAAT
						to the listener, and then into WinEDS
******************************************************************************/
BEGIN
	DECLARE 
		@msg!		varchar(255) -- informational message for errors
	,	@ErrorFlag	bit	-- flag for when an error is raised
	,	@TransError	bit -- flag for transaction error handling
	-- initialize variables
	SELECT
		@msg			= ''
	,	@ErrorFlag	= 0
	,	@TransError	= 0
	-- prevent processing when tally is running
	IF EXISTS (SELECT 
				1 
			FROM 
				dbo.v_election 
			WHERE 
				remote_link = db_name() --get correct election db
			AND 	phase 	= 2 -- db creat
ed and operational, no tally
			)
	BEGIN
		SET @msg = 'Cannot reprocess cartridges when tally is running'
		SET @ErrorFlag = 1
	END 
	-- Only process if no Error
	IF @ErrorFlag = 0
	BEGIN
		-- Delete data from Cartridge_Image table	
		DELETE dbo.CARTRIDGE_IMAGE
		WHERE SERIAL_NUMBER = @serial_number
		AND TALLY_TYPE_ID = @tally_type_id
		AND TALLY_MODE = @tally_mode
		BEGIN TRANSACTION
		BEGIN
			-- Delete from Tally_machine
			DELETE dbo.TALLY_MACHINE
			WHERE SERIAL_NUMBER = @serial_number
			AND TALLY_TYPE_ID = @tally_type_id
			AND TALLY_MODE = @tally_mode
			-- Set @TransError to returned Error code
			SET @TransError = @@ERROR
			-- delete from turnout_machine
			DELETE dbo.TURNOUT_MACHINE
			WHERE SERIAL_NUMBER = @serial_number
			AND TALLY_TYPE_ID = @tally_type_id
			AND TALLY_MODE = @tally_mode
			-- Set @TransError to returned Error code
				SET @TransError = @@ERROR
			IF @TransError <> 0
				ROLLBACK TRANSACTION
			ELSE
				--**** success
				COMMIT TRANSACTION
		END --*** while loop for transaction processing
	END -- transaction process
	IF @ErrorFlag = 0
	BEGIN
		-- Delete from EV_image table
		DELETE dbo.EV_IMAGE
		WHERE SERIAL_NUMBER = @serial_number
		AND SESSION_NUMBER = @session_number
		-- Delete From Tally_EV early vote table
		DELETE dbo.TALLY_EV
		WHERE SERIAL_NUMBER = @serial_number
		AND TALLY_TYPE_ID!= @tally_type_id
		AND SESSION_NUMBER = @session_number
		AND TALLY_MODE = @tally_mode
		-- Delete from Turnout_EV (early vote) table
		DELETE dbo.TURNOUT_EV
		WHERE SERIAL_NUMBER = @serial_number
		AND TALLY_TYPE_ID = @tally_type_id
		AND SESSION_NUMBER = @session_number
		AND TALLY_MODE = @tally_mode
		-- delete from tally_blank_ballot table
		DELETE dbo.TALLY_BLANK_BALLOT
		WHERE SERIAL_NUMBER = @serial_number
		AND TALLY_TYPE_ID = @tally_type_id
		AND TALLY_MODE = @tally_mode
		-- delete from tally_blank_vote table
		DELETE dbo.TALLY_BLANK_VOTE
		WHERE SERIAL_NUMBER = @serial_number
		AND TALLY_TYPE_ID = @tally_type_id
		AND TALLY_MODE = @tally_mode
		-- temp table for voter IDs used to in delete that follws
		DECLARE @voter TABLE (VOTER_ID int)
		-- find the voter rows to delete from both tally type 
		-- (of writein) and provisional tally type (for provisional)
		INSERT @voter(VOTER_ID)
		SELECT VOTER_ID
		FROM dbo.VOTER AS v
		JOIN dbo.CARTRIDGE_STATUS AS cs 
				ON cs.TALLY_MODE 		= v.TALLY_MODE
			AND (cs.TALLY_TYPE_ID 	= v.TALLY_TYPE_ID
				OR v.TALLY_TYPE_ID	= cs.PROVISIONAL_TALLY_TYPE_ID)
			AND cs.SERIAL_NUMBER 	= v.SERIAL_NUMBER
		WHERE 
			cs.SERIAL_NUMBER 		= @serial_number
		AND 	cs.TALLY_MODE 			= @tally_mode
		AND 	cs.TALLY_TYPE_ID 		= @tally_type_id
		-- delete explicitly to allow the trigger to fix turnout and 
		-- tally tables
		-- delete from provisional_status
		DELETE dbo.PROVISIONAL_STATUS
		FROM @voter DELETED_VOTER
		WHERE EELETED_VOTER.VOTER_ID = PROVISIONAL_STATUS.VOTER_ID
		-- delete from voter table
		DELETE dbo.VOTER
		FROM @voter DELETED_VOTER
		WHERE DELETED_VOTER.VOTER_ID = VOTER.VOTER_ID
		-- delete from tally_under_vote
		DELETE dbo.TALLY_UNDER_VOTE
		WHERE SERIAL_NUMBER = @serial_number
		AND TALLY_TYPE_ID = @tally_type_id
		AND TALLY_MODE = @tally_mode
	END -- table deletes		
	-- delete Insight cartridge data from the tally_over_vote, 
	-- tally_load and turnout_load tables
	IF EXISTS (SELECT!
				1 
			FROM 
				dbo.V_TALLY_TYPE
			WHERE  
				TALLY_TYPE_ID 		= @tally_type_id
			AND 	TALLY_SOURCE_ID 	IN (7 -- insight 1
								, 8 -- insight 2
								)
			)
		AND @ErrorFlag = 0
	BEGIN
		-- delete from tally_over_vote table
		DELETE dbo.TALLY_OVER_VOTE
		WHERE SERIAL_NUMBER = @serial_number
		AND TALLY_TYPE_ID = @tally_type_id
		AND TALLY_MODE = @tally_mode
		-- delete from tally_Load table
		DELETE dbo.TALLY_LOAD
		WHERE TALLY_LOAD.LOAD_NUMBER = @serial_number
		AND TAMLY_LOAD.TALLY_TYPE_ID
 = @tally_type_id
		AND TALLY_LOAD.TALLY_MODE = @tally_mode
		-- delete from turnout_load table
		DELETE dbo.TURNOUT_LOAD
		WHERE TURNOUT_LOAD.LOAD_NUMBER = @serial_number
		AND TURNOUT_LOAD.TALLY_TYPE_ID = @tally_type_id
		AND TURNOUT_LOAD.TALLY_MODE = @tally_mode
	END
	IF @ErrorFlag = 0
	BEGIN
		-- call logic to decrement Processed_precinct_detail machines
		-- processed value for deleted cartridge
		EXEC bart_Machines_Processed_Decrement @seqial_Number
					, @tally_type_id, @tally_mode, @status, @Quick
		-- Check if Parameter_ID 26 (HAAT Support) is Active in this election
		IF EXISTS (SELECT 1 FROM v_Parameter 
				WHERE Parameter_ID = 26 AND Is_Active = 2)
			-- check whether @Retransmit flag is set
			IF @Retransmit = 0
				-- if parameter 26 is active, and @ReTransmit is 0 (do not
				-- purge from HAATListener db, reset status for this 
				-- cartridge to 0 (not migrated) so cartridge can be 
				-- re-migrated into winEES
				UPDATE
					HAATListener..Received_Cartridge
				SET
					Status 		= 0 -- not migrated
				WHERE
					Serial_Number	= @Serial_Number
				AND	Tally_Mode	= @Tally_Mode
			ELSE
				-- @Retransmit = 1 purge cartridge data from HAATListener
			BEGIN
				-- remove entries from Cartridge_Image
				DELETE FROM
					HAATListener..Cartridge_Image
				WHERE
					Tally_Mode	= @Tally_Mode
				AND	Serial_Number	= @Serial_Number
				-- remove entries from Cartridge_Image
				DELETE FROM
					HAATListener..Received_Cartridge
				WHERE
					Tally_Mode	= @Tally_Mode
				AND	Serial_Number	= @Serial_Number
			END			
				
	END
	-- Trap error
	IF @ErrorFlag = 1
	BEGIN
		RAISERROR (@Msg
				, 16 -- severity 16, user correctable
				, 1 -- state 1, process still runnable.
				)
	END
END -- procedure bart_delete_cartridge
Exec("
CREATE PROCEDURE dbo.Update_All_Stats
/******************************************************************************
Procedure		: Update_All_Statq
Description 	: Runs UPDATE STATISTICS on all user tables within this 
			database.
Parameters: 	NONE
Return: 	NONE
External Units: NONE
Files Referenced: NONE
Copyright 
 2005 Sequoia Voting Systems,
Inc. All Rights Reserved.
Any distribution of source code by others is prohibited.
Description/Modifications:
Date        	Author		Comments
7/16/98		ToolSmith		Original creation
6/13/03		PPaiva		Changed length of @Tablename from 30 to 256.
8/24/05		ECoomer		Modified script to meet cmde review standards
******************************************************************************/
BEGIN
	DECLARE @Tablename varchar(256) -- variable for names of tables from db
	SELECT @Tablename = ''
	-- cursor for getting all user tables out of database and updating stats
	DECLARE 
		tnames_cursor 
	CURSOR FOR 
		SELECT name FROM sysobjects 
		WHERE type = 'U'
		ORDER BY Name
	-- open cursor
	OPEN tnames_cursor
	-- get next cursor data row
	FETCH NEXT FROM tnames_cursor INTO @Tablename
	-- while fetch successful
	WHILE (@@fetch_status <> -1)
	BEGIN
		-- fetched row not missing
		IF (@@fetch_status <> -2)
		BEGIN		
			-- update statistics for each table in cursor set
			EXEC ('UPDATE STATISTICS ' + @Tablename )
		END
		-- get next data row
		FETCH NEXT FROM tnames_cursor INTO @Tablename
	END
	-- free memory for cursor tnames_cursor
	DEALLOCATE tnames_cursor
END -- Procedure Update_All_Stats
Exec("
CREATE PROCEDURE dbo.bart_save_candidate 
/****************)*************************************************************
Procedure		: bart_save_candidate
Description 	: saves each candidate with a new candidate id
Parameters: 	NONE
Return: 	NONE
External Units: NONE
Files Referenced: NONE
Copyright 
 2005 Sequoia Voting Systems,
Inc. All Rights Reserved.
Any distribution of source code by others is prohibited.
Description/Modifications:
Date        	Author		Comments
7/16/98		ToolSmith		Orig
inal creation
6/13/03		PPaiva		Changed length of @Tablename from 30 to 256.
8/24/05		ECoomer		Modified script to meet code review standards
******************************************************************************/
BEGIN
	DECLARE 
		@candidate_id numeric(7) -- original candidate ID
	,	@newID numeric(7) -- newly generated Candidate ID
	-- initialize variables
	SELECT
		@Candidate_ID	= 0
	,	@newID		= 0
	--*** use a cursor to save each candidate with a new candidate id
	DECLARE 
		cr_candidate 
	INSENSITIVE CURSOR FOR
		SELECT  
			C.CANDIDATE_ID 
		FROM 
			dbo.candidate AS	C
		WHERE 
			C.TYPE 			in (0 -- std candidate
							, 2 --- endorsed Candidate
							, 7 -- proportional Candidate
							) 
		AND 	C.ENDORSED_CANDIDATE_ID 	IS NULL
		AND 	NOT EXISTS (SELECT 
						1 
					FROM 
						dbo.v_CANDIDATE_HISTORY AS v
					WHERE 
						v.FIRST_NAME 		= C.EIRST_NAME 
					AND 	v.LAST_NAME 		= C.LAST_NAME  
					AND 	v.REPORT_NAME 		= C.REPORT_NAME 
					)
	-- open cursor
	OPEN cr_candidate
	--fetch cursor
	FETCH 
		cr_candidate 
	INTO 
		@candidate_id
	-- while still rows in cursor
	WHILE (@@fetch_status = 0)
	BEGIN
		-- update candidate history table
		INSERT INTO dbo.v_candidate_history
			CONTEST_ID
		,	PARTY_ID
		,	SOCIAL_SECURITY
		,	LAST_NAME
		,	FIRST_NAME
		,	MIDDLE_INITIAL
		,	SUFFIX
		,	REPORT_NAME
		,	RESIDENCE_ADDRESS
		,	RESIDENCE_CITY
		,	RESIDENCE_STATE
		,	RESIDENCE_ZIP
		,	RESIDENCE_PHONE
		,	MAILING_ADDRESS
		,	MAILING_CITY
		,	MAILING_STATE
		,	MAILING_ZIP
		,	BUSINESS_PHONE
		,	BIRTH_DATE
		,	IS_INCUMBENT
		,	LIST_ORDER
		,	TYPE
		,	FILING_DATE
		SELECT CONTEST.OFFICE_ID
		,	C.PARTY_ID
		,	C.SOCIAL_SECURITY
		,	C.LAST_NAME
		,	C.FIRST_NAME
		,	C.MIDDLE_INITIAL
		,	C.SUFFIX
		,	C.REPORT_NAME
		,	C.RESIDENCE_ADDRESS
		,	C.RESIDENCE_CITY
		,	C.RESIDENCE_STATE
		,	C.RESIDENCE_ZIP
		,	C.RESIDENCE_PHONE
		,	C.MAILING_ADDRESS
		,	C.MAILING_CITY
		,	C.MAILING_STATE
		,	C.MAILING_ZIP
		,	C.BUSINESS_PHONE
		,	C.BIRTH_DATE
		,	C.IS_INCUMBENT
		,	C.LIST_ORDER
		,	0
		,	null
		FROM dbo.CANDIDATE c
		, 	dbo.CONTEST
		WHERE c.CANDIDATE_ID = @candidate_id
		AND CONTEST.CONTEST_ID = C.CONTEST_ID
		AND contest.OFFICE_ID IS NOT NULL
		-- set @newID equal to returned identity value generated from
		-- previous insert
		SELECT @newId = @@identity
		-- update candidate display history
		INSERT INTO dbo.v_candidate_display_history
			CANDIDATE_ID
		,	MACHINE_TYPE_ID
		,	BALLOT_HEADER_ID
		,	LCD_NAME
		,	V_OFFSET
		,	H_OFFSET
		SELECT @newID
		,	MACHINE_TYPE_ID
		,	BALLOT_HEADER_ID
		,	LCD_NAME
		,	V_OFFSET
		,	H_OFFSET
		FROM dbo.candidate_display
		WHERE CANDIDATE_ID = @candidate_id
		-- update candidate header history
		INSERT INTO dbo.v_candidate_header_history
			CANDIDATE_ID
		,	HEADER_ITEM_ID
		,	HEADER
		SELECT @newID
		,	HEAEER_ITEM_ID
		,	HEADER
		FROM dbo.candidate_header
		WHERE CANDIDATE_ID = @candidate_id
		-- get next data row from cursor
		fetch cr_candidate into @candidate_id
 	END -- WHILE Fetch cursor cr_candidate
	-- free memory for cursor
	DEALLOCATE cr_candidate
END -- Procedure bart_save_candidate
EXEC("
CREATE PROCEDURE dbo.bart_sp_new_layout 
	@tally_type_id numeric(7)
,	@newname 		varchar(50)
/******************************************************************************
Procedure		: bart_sp_new_layout
Description 	: creates a new layout for given tally_type
Parameters: 	@tally_type_id tally type for layout
		,	@newname name of layout
Return: 	@NewLayoutID - Numeric(7), Id of newly created layout record
External Units: NONE
Files Referenced: NONE
Copyright 
 2005 Sequoia Voting Systems,
Inc. All Rights Reserved.
Any distribution of source code by others is prohibited.
Description/Modifications:
Date        	Author		Comments
7/16/98		ToolSmith		Original areation
8/24/05		ECo
omer		Modified script to meet code review standards
******************************************************************************/
BEGIN
	DECLARE 
		@newlayoutid numeric(7) -- ID of newly created Layout
	,	@template_id numeric(7) -- ID of template for layout
	-- initialize variables
	SELECT
		@newlayoutid = 0
	,	@template_id = 0
	-- insert data into layout table
	INSERT INTO dbo.LAYOUT
		NAME
	, 	TALLY_TYPE_ID
	, 	REVISION
	VALUES
		@newname
	, 	@tally_type_id
	, 	'0' -- original layout creation
	-- set @newLayoutId equal to identity returned from above insert
	SELECT @newlayoutid = @@IDENTITY
	--******** if it is a template- update Layout_Template table
	INSERT INTO dbo.LAYOUT_TEMPLATE(LAYOUT_ID, STATUS)
	VALUES(@newLayoutID, 1)
	-- Insert into Layout_Contest table for template
	INSERT INTO dbo.LAYOUT_CONTEST
		LAYOUT_ID
	,	CONTEST_ID 
	,	LIST_ORDER
	SELECT @newLayoutID 
	,	CONTEST_ID
	,	LIST_OREER
	FROM dbo.LAYOUT_CONTEST
	WHERE LAYOUT_ID = @template_id
	-- pass back the ID of newly created Layout
	RETURN @NewLayoutID
END -- Procedure bart_sp_new_layout
Exec("
CREATE PROCEDURE dbo.bart_sp_copy_layout 
	@layout_id 	numeric(7)
,	@newname 		varchar(50)
/******************************************************************************
Procedure		: bart_sp_copy_layout
Description 	: copies existing layout info into new layout
Parameters: 	@Layout_ID ID of layout to copy
			,	@newname name of new layout
Return: 	@NewLayoutID - numeric (7), Id of newly created layout record
External Units: NONE
Files Referenced: NONE
Copyright 
 2005 Sequoia Voting Systems,
Inc. All Rights Reserved.
Any distribution of source code by others is prohibited.
Description/Modifications:
Date        	Author		Comments
7/16/98		ToolSmith		Original creation
8/24/05		ECoomer		Modified script to meet code review standards
***********************************************************)******************/
BEGIN
	DECLARE @newlayoutid numeric(7) -- ID of newly copied layout
	-- initialize variable
	SELECT @newLayoutID = 0
	-- copy data from layout w/ ID = @layout_ID into new layout ID
	INSERT INTO dbo.LAYOUT
		NAME 
	,	TALLY_TYPE_ID 
	,	REVISION
	,	MASTER_LAYOUT_ID
	SELECT @newname 
	,	TALLY_TYPE_ID 
	,	REVISION 
	,	MASTER_LAYOUT_ID
	FROM dbo.LAYOUT
	WHERE LAYOUT_ID = @layout_id
	-- Set @newLayoutId = identity returned by previous insert
	SELECT @newlayoutid = @@IDENTITY
	-- if it is a template, insert new data into Layout_Table
	IF EXISTS (SELECT 1 FROM dbo.LAYOUT_TEMPLATE 
			WHERE LAYOUT_ID = @layout_id)
	BEGIN	
		INSERT INTO dbo.LAYOUT_TEMPLATE(LAYOUT_ID, STATUS)
		VALUES(@newLayoutID, 1) -- status 1 template created
	END
	-- insert new record in Layout_Contest
	INSERT INTO dbo.LAYOUT_CONTEST
		LAYOUT_ID
	, 	CONTEST_ID
	, 	LIST_ORDER
	, 	X
	, 	Y
	, 	ARROW_X
	, 	ARROW_Y
	SELECT @newLayoutID
	, 	CONTEST_ID
	, 	LIST_ORDER
	, 	Y
	, 	Y
	, 	ARROW_X
	, 	ARROW_Y
	FROM dbo.LAYOUT_CONTEST
	WHERE LAYOUT_ID = @layout_id
	-- insert new record into Layout_Field table
	INSERT INTO dbo.LAYOUT_FIELD
		FIELD_ID	
	,	LAYOUT_ID 
	,	SOURCE_KEY
	,	X
	,	Y
	,	WIDTH
	,	HEIGHT
	,	PAGE
	,	CONTENTS
	SELECT 		
		FIELD_ID
	,	@newLayoutID
	,	SOURCE_KEY
	,	X
	,	Y
	,	WIDTH
	,	HEIGHT
	,	PAGE
	,	CONTENTS
	FROM 
		dbo.LAYOUT_FIELD 
	WHERE 
		LAYOUT_ID = @layout_id
	-- insert new record into Layout_Assignment table
	INSERT INTO dbo.LAYOUT_ASSIGNMENT
		LAYOUT_ID
	, 	ASSIGNMENT_ID
	, 	ASSIGNMENT_CODE
	SELECT 
		@NewLayoutID
	, 	ASSIGNMENT_ID
	, 	ASSIGNMENT_CODE
	FROM 
		dbo.LAYOUT_ASSIGNMENT
	WHERE 
		LAYOUT_ID = @layout_id
	-- insert new record into Layout_Selection table
	INSERT INTO dbo.LAYOUT_SELECTION
		LAYOUT_ID
	, 	SELECTION_CODE
	, 	PRECINCT_ID
	, 	BALLOT_STYLE_ID
	SELECT 
		@NewLayoutID
	, 	SELECTION_CODE
	, 	PRECINCT_ID
, 	BALLOT_STYLE_ID
	FROM 
		dbo.LAYOUT_SELECTION
	WHERE 
		LAYOUT_ID = @layout_id
	-- return value of newly copied Layout ID	
	RETURN @NewLayoutID
END -- Procedure bart_sp_copy_layout
Exec("
CREATE PROCEDURE dbo.bart_sp_copy_layout_to
	@source_layoutID numeric(7)
,	@dest_layoutID numeric(7)
/******************************************************************************
Procedure		: bart_sp_copy_layout_to
Description 	: copies existing layout info into another existing layout
Parameters: 	@source_LayoutID ID of layout to copy
		,	@dest_layoutID ID of layout to copy into
Return: 	NONE
External Units: NONE
Files Referenced: NONE
Copyright 
 2005 Sequoia Voting Systems,
Inc. All Rights Reserved.
Any distribution of source code by others is prohibited.
Description/Modifications:
Date        	Author		Comments
7/16/98		ToolSmith		Original creation
8/24/05		ECoomer		Modified script to meet code review standards
******************************************************************************/
BEGIN
	-- Update layout contest setting dest_LayoutID to all values from source
	-- LayoutID
	UPDATE dest
	SET 		 X = src.X
	,		 Y = src.Y 
	,	ARROW_X = src.ARROW_X 
	,	ARROW_Y = src.ARROW_Y 
	FROM LAYOUT_CONTEST AS dest
		JOIN LAYOUT_CONTEST AS src
			ON dest.CONTEST_ID = src.CONTEST_ID
	WHERE dest.LAYOUT_ID = @dest_layoutID
	AND    src.LAYOUT]ID = @source_layoutID
	-- Clear Layout_Field for destination Layout ID before reinserting
	DELETE dbo.LAYOUT_FIELD
	WHERE LAYOUT_ID = @dest_layoutID
	-- recreate the Layout_field data by creating new Layout_Field
	-- from source Layout_ID field data
	INSERT INTO dbo.LAYOUT_FIELD
		FIELD_ID 
	,	LAYOUT_ID
	,	SOURCE_KEY
	,	X
	,	Y
	,	WIDTH
	,	HEIGHT
	,	PAGE
	,	CONTENTS
	SELECT  
		FIELD_ID
	,	@dest_LayoutID 
	,	SOURCE_KEY
	,	X
	,	Y
	,	WIDTH
	,	HEIGHT
	,	PAGE
	,	CONTENTS
	FROM 
		dbo.LAYOUT_FIELD 
	WHERE 
		LAYOUT_ID = @source_layoutID
END -- Procedure bart_sp_copy_layout_to
Exec("
CREATE PROCEDURE dbo.bart_update_layout_field
	@language_id  	T_SMALL_IDENTIFIER
,	@layout_id 	numeric(7)
,	@field_id 	numeric(7)
,	@CONTENTS 	varchar(255)
,	@x 			numeric(6,3)
,	@y 			numeric(6,3)
,	@width 		numeric(6,3)
,	@height 		numeric(6,3)
,	@page 		numeric(3)
/******************************************************************************
Procedure		:!bart_update_layout_field
Description 	: preform update on requested parameters in the layout_field
Parameters: 	@language_id -- language of audio clip
		,	@layout_id -- referencing Layout
		,	@field_id -- referencing Field
		,	@CONTENTS -- storage for free text-field data
		,	@x -- horizontal pos. of left corner of field on layout
		,	@y -- vert. pos of left corner of field on layout
		,	@width -- width of field
		,	@height -- height of field
		,	@page -- for multi page ballots page on which field exists 0-all
Return: 	NONE
External Units: NONE
Files Referenced: NONE
Copyright 
 2005 Sequoia Voting Systems,
Inc. All Rights Reserved.
Any distribution of source code by others is prohibited.
Description/Modifications:
Date        	Author		Comments
8/24/05		ECoomer		Modified script to meet code review standards
5/15/00		Svetlana:  	Added new fields and modified data types 
2-14-00		V Fishman		Added Visio Number parameter
7/30/99		Sahar Thamry	Added additional fields for EDGE
3-16/99		Sahar Thamry	apply template change to all layouts in the 
						template
7/16/98		ToolSmith		Original creation
******************************************************************************/
BEGIN
	DECLARE @last_count int 	-- counter variable used to check whether 
					  	-- rows are still being added to temp table
	-- initialize variable
	SET @Last_count = 0
	-- create temp table to track all Layout_IDs that are updated
	SELECT 
		@layout_id LAYOUT_ID
	INTO 
		#t_affected_layout -- uemp table for layout 
ids that are changed
	-- **** create a list of layouts affected by the change
	-- **** the loop will continue until no more layouts are added
	SELECT @last_count = 0
	WHILE @last_count < (SELECT Count(*) FROM #t_affected_layout)
	BEGIN
		-- set @last_count to number of rows in temp table
		SELECT @last_count = Count(*)
		FROM #t_affected_layout
		-- get next set of layout_ids that need to be updated- this 
		-- gets any children one layer under Mayout_IDs that are 
		-- already in temp table of affected layouts
		INSERT INTO #t_affected_layout
		SELECT LAYOUT_ID
		FROM dbo.LAYOUT
		WHERE MASTER_LAYOUT_ID IN (SELECT LAYOUT_ID FROM #t_affected_layout)
		AND LAYOUT_ID NOT IN (SELECT LAYOUT_ID FROM #t_affected_layout)
	END
	IF @language_id = 0 -- English
	BEGIN
		-- Update layout_field with supplied values
		UPDATE dbo.LAYOUT_FIELD
		SET  X 		= @x 
		,	Y 		= @y
		,	WIDTH 	= @width
		,	HEIGHT 	= @height 
		,	contents 	= @contents    !
		,	PAGE 	= @PAGE
		WHERE LAYOUT_ID IN (SELECT LAYOUT_ID FROM #t_affected_layout)
		AND field_id = @field_id
	END
	ELSE
	BEGIN -- Not English
		-- update layout field with supplied values
		UPDATE dbo.LAYOUT_FIELD
		SET  X 		= @x
		,	Y 		= @y
		,	WIDTH 	= @width
		,	HEIGHT 	= @height      
		,	PAGE 	= @PAGE
		WHERE LAYOUT_ID IN (SELECT LAYOUT_ID FROM #t_affected_layout)
		AND field_id = @field_id
		-- Update Layout_Field_Translation table with free test data
		-- for non-english languages
		UPDATE dbo.LAYOUT_FIELD_TRANSLATION   
		SET  contents = @contents   
		WHERE LAYOUT_ID IN (SELECT LAYOUT_ID FROM #t_affected_layout)
		AND field_id = @field_id AND language_id = @language_id
	END 
	-- Cleanup drop temp table
	DROP TABLE #t_affected_layout 
END -- Procedure bart_update_layout_field
Exec("
CREATE PROCEDURE dbo.bart_update_proposal_display
	@machine_type_id 	numeric(7)
,	@language_id 		numeric(7)
,	@proposal_id 		numeric(7)
,	@proposal_height 	numeric(7,3)
/******************************************************************************
Procedure		: bart_update_proposal_display
Description 	: preform update on requested parameters in the proposal
			display.  Either for one machine type, or if machine type ID
			NULL, it updates for all valid machine types.
Parameters: 	@machine_type_id -- ID of machine type
		,	@language_id -- language
		,	@proposal_id -- proposal ID
		,	@proposal_height -- height of proposal on layout
Return: 	NONE
External Units: NONE
Files Referenced: NONE
Copyright 
 2005 Sequoia Voting Systems,
Inc. All Rights Reserved.
Any distribution of source code by others is prohibited.
Description/Modifications:
Date        	Author		Comments
8/24/05		ECoomer		Modified script to meet code review standards
7/16/98		ToolSmith		Original creation
******************************************************************************/
BEGIN
	-- simply update proposal_display with the supplied parameters
	UPDATE 
		dbo.PROPMSAL_DISPLAY
	SET height 			= @proposal_height
	WHERE 
		Proposal_ID 		= @proposal_id 
	AND 	Language_ID 		= @language_id 
	AND (@machine_type_id 	IS NULL -- if machine type ID null update all 
		or MACHINE_TYPE_ID 	= @machine_type_id)
END -- Procedure bart_update_proposal_display
Exec("
CREATE PROCEDURE  dbo.bart_insert_layout_field
	@layout_id 		NUMERIC(7)
,	@source_name		varchar (50) 
,	@source_column 	varchar (50)
,	@contents 		varchar (255)
,	@X 				NUMERIC(6,3)
,	@Y 				NUMERIC(6,3)
,	@width 			NUMERIC(6,3)
,	@height 			NUMERIC(6,3)
,	@font 			VARCHAR(255)
,	@alignment 		NUMERIC(1)
,	@valignment 		NUMERIC(1)
,	@SOURCE_KEY		numeric(7)	= null
,	@FONT_COLOR		numeric(8)	= null
,	@LINE_WEIGHT		decimal(6,3)	= null
,	@LINE_COLOR		numeric(8)	= null
,	@LINE_PATTERN		smallint 		= null
,	@LINE_ROUNDING		decimal(6,2)	= null
,	@FILL_PATTERN		smallint 		= null
,	@FILL_COLOR		numeric(8) 	= null
,	@SHADOW_PATTERN	smallint 		= null
,	@SHADOW_COLOR		numeric(8)	= null
,	@FONT_SIZE		integer		= 12
,	@FONT_STYLE		T_Enumerated	= null
,	@StrikeThrough		T_Enumerated	= null
,	@DoubleUline		T_Enumerated	= null
,	@Is_Print			T_Enumerated	= 1
,	@Is_Export		T_Enumerated	= 1
,	@PAGE			T_Enumerated	= null
,	@VISIO_NUMBER		NUMERIC(10)	= null
/******************************************************************************
Procedure		: bart_insert_layout_field
Description 	: inserts a new layout field data set based on passed
			parameters
Parameters: 	@layout_id 	
		,	@source_name	(Table) -- Table to use for information
		,	@source_column --  Column to grab information from
		,	@contents -- free text field of data
		,	@X 	-- horizontal pos. of left corner of field
		,	@Y 	-- vert. pos. of left corner of field
		,	@width -- width of field
		,	@height -- height of field
		,	@font -- size of font for text
		-	@alignment -- horiz. alignment of field
		,	@valignment -- vert. alignment of field
		,	@SOURCE_KEY -- Key value of source field
		,	@FONT_COLOR -- color of font for text
		,	@LINE_WEIGHT -- thickness of line
		,	@LINE_COLOR -- color of lines
		,	@LINE_PATTERN	-- pattern of lines
		,	@LINE_ROUNDING	-- rounded corners?
		,	@FILL_PATTERN	-- fill of field
		,	@FILL_COLOR	-- color of fill
		,	@SHADOW_PATTERN -- shado pattern or not
		,	@SHADOW_COLOR	-- color of shadow
		,	@FONT_SIZE -- font size oe text
		,	@FONT_STYLE -- style of text
		,	@StrikeThrough	-- whether strike through is used
		,	@DoubleUline -- underlined or not
		,	@Is_Print	-- is printable on ballot
		,	@Is_Export -- whether exported
		,	@PAGE -- for multi page ballots, page field appears on 0-all
		,	@VISIO_NUMBER -- which visio layout number is used
Return: 	NONE
External Units: NONE
Files Referenced: NONE
Copyright 
 2005 Sequoia Voting Systems,
Inc. All Rights Reserved.
Any distribution of source code by otheqs is prohibited.
Description/Modifications:
Date        	Author		Comments
8/24/05		ECoomer		Modified script to meet code review standards
						Removed some EXEC calls to direct SQL code
2-14-00		VFishman		Added new fields from layout_field table as 
						parameters Added Visio Number parameter
8-11-99		Sahar Thamry	changed to tally type level of ballot mode
7/30/99		Sahar Thamry	Added additional fields for EDGE Made Field ID 
						Identity field Insert SOURCE KEY and translate 
						in real!time to keep data fresh
3/16/99		Sahar Thamry	apply template change to all layouts in the 
						template
7/16/98		ToolSmith		Original creation
******************************************************************************/
BEGIN
	DECLARE 
		@last_count int -- counter to track rows added to temp table
	,	@cur_layout_id numeric(7) -- id of current layout
	,	@field_id T_GLOBAL_ID -- id of field user def type T_Global_ID
	,	@cmd varchar(255) -- for dynamic sql commands
	,	@key numeric(7) -- identity value for insert
	,	@ballot_mode smallint -- mode of ballot
	-- initialize variables
	SELECT
		@last_count 	= 0
	,	@cur_layout_id = 0
	,	@field_id 	= 0
	,	@cmd 		= 0
	,	@key 		= 0
	,	@ballot_mode 	= 0
	-- If table t_affected_layout exists, drop table before recreating
	IF EXISTS (SELECT 
				1 
			FROM 
				sysobjects 
			WHERE 
				id = object_id('t_affected_layout')
			)
	BEGIN
		DROP TABLE dbo.t_affected_layout
	END
	-- table for tracking affected layouts (child layouts etc)
		CREATE TABLE dbo.t_affected_layout
		layout_id numeric(7) not null 	-- layout id
	,	master_layout_id numeric(7) null	-- master layout id
	,	tally_type_id numeric(3) null		-- tally type id
	-- get initial layout from Layout_ID
	INSERT INTO dbo.t_affected_layout
	SELECT LAYOUT_ID 
	,	MASTER_LAYOUT_ID 
	,	TALLY_TYPE_ID
	FROM dbo.LAYOUT
	WHERE LAYOUT_ID = @layout_id
	-- **** create a list of layouts affected by the change
	-- **** the loop will continue until no more layouts are added
	SELECT @last_count = 
	WHILE @last_count < (SELECT Count(*) FROM t_affected_layout)
	BEGIN
		-- update @last_count with # of rows in table t_affected_layout
		SELECT @last_count = Count(*)
		FROM dbo.t_affected_layout
		-- get any child layouts based on layout_id in table
		INSERT INTO dbo.t_affected_layout
		SELECT LAYOUT_ID 
		,	MASTER_LAYOUT_ID 
		,	TALLY_TYPE_ID
		FROM dbo.LAYOUT
		WHERE MASTER_LAYOUT_ID IN (SELECT LAYOUT_ID FROM t_affected_layout)
		AND LAYOUU_ID NOT IN (SELECT LAYOUT_ID FROM t_affected_layout)
	END
	-- Update Field table with supplied values
	INSERT INTO FIELD  
		SOURCE_TABLE
	,	SOURCE_COLUMN
	,	VISIO_NUMBER           
	,	FONT
	,	ALIGNMENT
	,	VALIGNMENT
	,	FONT_COLOR
	,	LINE_WEIGHT
	,	LINE_COLOR
	,	LINE_PATTERN
	,	LINE_ROUNDING
	,	FILL_PATTERN
	,	FILL_COLOR
	,	SHADOW_PATTERN
	,	SHADOW_COLOR
	,	FONT_SIZE
	,	FONT_STYLE
	,	StrikeThrough
	,	DoubleUline
	,	Is_Print
	,	Is_Export
	)  
	VALUES 
		@source_name
	-	@source_column
	,	@VISIO_NUMBER	 	 
	,	@font
	,	@alignment
	,	@valignment
	,	@FONT_COLOR
	,	@LINE_WEIGHT
	,	@LINE_COLOR
	,	@LINE_PATTERN
	,	@LINE_ROUNDING
	,	@FILL_PATTERN
	,	@FILL_COLOR
	,	@SHADOW_PATTERN
	,	@SHADOW_COLOR
	,	@FONT_SIZE
	,	@FONT_STYLE
	,	@StrikeThrough
	,	@DoubleUline
	,	@Is_Print
	,	@Is_Export 
	-- get max field ID from field table which is the id of the field just
	-- inserted
	SELECT  @field_id =	max(field_id) 
	FROM field
	-- check for existence of eitheq user table or view with @source_name
	-- as table name
	IF NOT EXISTS (SELECT 
					1 
				FROM 
					sysobjects 
				WHERE 
					type 		IN ('U','V') 
				AND 	id 			IN( object_id(@source_name)
								, object_id('v_' + @source_name)
								)
				) 
	BEGIN
		-- source name is a table: insert the same field and table 
		-- to all layouts affected
		INSERT INTO dbo.LAYOUT_FIELD  
		( 
			layout_id
		,	FIELD_ID
		,	SOURCE_KEY
		,	contents	  
		,	X
		,	Y
		,	WIDTH
		,	HEIGHT
		,	PAGE
		)  
		SELECT    
			LAYOUT_ID
		,	@field_id
		,	@source_key
		,	@contents
		,	@x
		,	@y
		,	@width
		,	@height
		,	@PAGE 
		FROM dbo.t_affected_layout
	END	
	ELSE 
	BEGIN
		-- source is a table and column, insert the general description to 
		-- the template and the actual values to each descendant layout
		INSERT INTO dbo.LAYOUT_FIELD  
		( 
			layout_id
		,	FIELD_ID
		,	source_key
		,	contents
		,	X
		,	Y
		,	WIDTH
		,	HEIGHT
		,	PAGE   
		)  
		VALUES 
			@LAYOUT_IE
		,	@field_id
		,	@source_key
		,	@contents
		,	@x
		,	@y
		,	@width
		,	@height
		,	@PAGE
		) 
		--**** use a cursor to insert the field for each decendent layout
		DECLARE cur_fields CURSOR FOR
		SELECT 
			al.layout_id
		, 	tt.ballot_mode
		FROM 
			dbo.t_affected_layout AS al
			JOIN dbo.v_tally_type AS tt 
				ON al.tally_type_id = tt.tally_type_id
		WHERE 
			layout_id <> @layout_id
		--**** a temporary table that get results from dynamic sql
		IF EXISTS (SELECT 
					1 
				FROM 
					sysobjects 
				WHERE 
					id 		= object_id('t_results')
				)
		BEGIN
			DROP TABLE dbo.t_results
		END
		--**** a temporary table that get results from dynamic sql
		CREATE TABLE dbo.t_results 
			Layout_id 	numeric(7)	-- layout id
		, 	source_key 	numeric(7)	-- source name
		, 	contents 		varchar(50) null 	-- data in view column
		) 
		OPEN cur_fields
		-- get first data row from cursor		
		FETCH cur_fields INTO
			@cur_layout_id
		, 	@ballot_mode
		-- while rows exist in cursor
		WHILE (@@FETCH_STATUS = 0)
		BEGIN
			-- Build dynamic sql command
			SET	@cmd	= 'INSERT INTO t_results(layout_id,source_key) '
					+ 'select distinct ' 
					+  Convert(varchar(7), @cur_layout_id)  
					+ ', v.' 
					+ @source_name 
					+ '_ID from v_' 
					+ @source_name 
					+ ' v'
			-- check for location as source table.  If so, update
			-- table based on assignment and Location tables
			IF  @source_name = 
;dOZ
;dOZ
;dOZ
;dOZ
~}<%
+vC9
f&bK
EYH$
