BEGIN TRANSACTION
GO
ALTER TABLE dbo.BasicTransactions
	DROP CONSTRAINT FK_BasicTransactions_Companies
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.BasicTransactions
	DROP COLUMN CompanyID
GO
COMMIT

BEGIN TRANSACTION
GO
ALTER TABLE dbo.CostCenters
	DROP CONSTRAINT FK_CostCenters_Companies
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.CostCenters
	DROP COLUMN CompanyID
GO
COMMIT

BEGIN TRANSACTION
GO
ALTER TABLE dbo.Customers
	DROP CONSTRAINT FK_Customers_Companies
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.Customers
	DROP COLUMN CompanyID
GO
COMMIT

BEGIN TRANSACTION
GO
ALTER TABLE dbo.Employees
	DROP CONSTRAINT FK_Employees_Companies
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.Employees
	DROP COLUMN CompanyID
GO
COMMIT

BEGIN TRANSACTION
GO
ALTER TABLE dbo.Inventory
	DROP CONSTRAINT FK_Inventory_Companies
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.Inventory
	DROP COLUMN CompanyID
GO
COMMIT

BEGIN TRANSACTION
GO
ALTER TABLE dbo.Ledgers
	DROP CONSTRAINT FK_Ledgers_Companies
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.Ledgers
	DROP COLUMN CompanyID
GO
COMMIT

BEGIN TRANSACTION
GO
ALTER TABLE dbo.Products
	DROP CONSTRAINT FK_Products_Companies
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.Products
	DROP COLUMN CompanyID
GO
COMMIT

BEGIN TRANSACTION
GO
ALTER TABLE dbo.ProductTypes
	DROP CONSTRAINT FK_ProductTypes_Companies
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.ProductTypes
	DROP COLUMN CompanyID
GO
COMMIT

BEGIN TRANSACTION
GO
ALTER TABLE dbo.Roles
	DROP CONSTRAINT FK_Roles_Companies
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.Roles
	DROP COLUMN CompanyID
GO
COMMIT

BEGIN TRANSACTION
GO
ALTER TABLE dbo.Tax
	DROP CONSTRAINT FK_Tax_Companies
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.Tax
	DROP COLUMN CompanyID
GO
COMMIT

BEGIN TRANSACTION
GO
DROP TABLE dbo.TransactionContra
GO
COMMIT

BEGIN TRANSACTION
GO
ALTER TABLE dbo.TransactionSale
	DROP CONSTRAINT FK_TransactionSale_Companies
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.TransactionSale
	DROP COLUMN CompanyID
GO
COMMIT

BEGIN TRANSACTION
GO
ALTER TABLE dbo.UserRoles
	DROP CONSTRAINT IX_UserRoles
GO
ALTER TABLE dbo.UserRoles ADD CONSTRAINT
	IX_UserRoles UNIQUE NONCLUSTERED 
	(
	UserID,
	Role
	) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

GO
ALTER TABLE dbo.UserRoles
	DROP COLUMN CompanyID
GO
COMMIT

BEGIN TRANSACTION
GO
ALTER TABLE dbo.Users
	DROP CONSTRAINT FK_Users_Companies
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.Users
	DROP COLUMN CompanyID
GO
COMMIT

BEGIN TRANSACTION
GO
DROP TABLE Companies
GO
COMMIT

BEGIN TRANSACTION
GO
CREATE TABLE dbo.Waiters
	(
	WaiterID uniqueidentifier NOT NULL,
	Name nvarchar(200) NOT NULL,
	timestamp timestamp NOT NULL
	)  ON [PRIMARY]
GO
ALTER TABLE dbo.Waiters ADD CONSTRAINT
	PK_Waiters PRIMARY KEY CLUSTERED 
	(
	WaiterID
	) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

GO
CREATE NONCLUSTERED INDEX IX_Waiters_Name ON dbo.Waiters
	(
	Name
	) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
COMMIT

INSERT INTO Waiters (WaiterID, Name) 
SELECT l.LedgerID, l.Name FROM Ledgers l INNER JOIN Employees e ON l.LedgerID = e.LedgerID  ORDER BY Name

BEGIN TRANSACTION
GO
ALTER TABLE dbo.TransactionSale
	DROP CONSTRAINT FK_TransactionSale_Employees
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.TransactionSale ADD CONSTRAINT
	FK_TransactionSale_Waiters FOREIGN KEY
	(
	WaiterID
	) REFERENCES dbo.Waiters
	(
	WaiterID
	) ON UPDATE  NO ACTION 
	 ON DELETE  NO ACTION 
	
GO
COMMIT

BEGIN TRANSACTION
GO
ALTER TABLE dbo.CashPayments
	DROP CONSTRAINT FK_CashPayments_Employees
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.CashPayments ADD CONSTRAINT
	FK_CashPayments_Users FOREIGN KEY
	(
	CashierID
	) REFERENCES dbo.Users
	(
	UserID
	) ON UPDATE  NO ACTION 
	 ON DELETE  NO ACTION 
	
GO
COMMIT

DROP TABLE CashPayments

DROP TABLE Employees
DELETE FROM Ledgers WHERE Type = 'S'


BEGIN TRANSACTION
GO
ALTER TABLE dbo.BasicTransactions
	DROP CONSTRAINT FK_BasicTransactions_Users_PosterID
GO
COMMIT
BEGIN TRANSACTION
GO
EXECUTE sp_rename N'dbo.BasicTransactions', N'Vouchers', 'OBJECT' 
GO
EXECUTE sp_rename N'dbo.Vouchers.TransactionID', N'VoucherID', 'COLUMN' 
GO
ALTER TABLE dbo.Vouchers
	DROP COLUMN Posted, Review, PosterID, Autolocked
GO
COMMIT

BEGIN TRANSACTION
GO
ALTER TABLE dbo.Inventory
	DROP CONSTRAINT FK_Inventory_BasicTransactions
GO
ALTER TABLE dbo.TransactionSale
	DROP CONSTRAINT FK_TransactionSale_BasicTransactions
GO
ALTER TABLE dbo.Vouchers
	DROP CONSTRAINT IX_BasicTransactions_Code_Type
GO
ALTER TABLE dbo.Vouchers
	DROP CONSTRAINT PK_BasicTransactions
GO
ALTER TABLE dbo.Vouchers ADD CONSTRAINT
	PK_Vouchers PRIMARY KEY CLUSTERED 
	(
	VoucherID
	) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

GO
ALTER TABLE dbo.Vouchers ADD CONSTRAINT
	IX_Vouchers_Code_Type UNIQUE NONCLUSTERED 
	(
	Code,
	Type
	) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.TransactionSale ADD CONSTRAINT
	FK_TransactionSale_BasicTransactions FOREIGN KEY
	(
	TransactionID
	) REFERENCES dbo.Vouchers
	(
	VoucherID
	) ON UPDATE  NO ACTION 
	 ON DELETE  NO ACTION 
	
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.Inventory ADD CONSTRAINT
	FK_Inventory_BasicTransactions FOREIGN KEY
	(
	TransactionID
	) REFERENCES dbo.Vouchers
	(
	VoucherID
	) ON UPDATE  NO ACTION 
	 ON DELETE  NO ACTION 
	
GO
COMMIT


BEGIN TRANSACTION
GO
ALTER TABLE dbo.TransactionSale
	DROP CONSTRAINT FK_TransactionSale_BasicTransactions
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.TransactionSale
	DROP CONSTRAINT FK_TransactionSale_Waiters
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.TransactionSale
	DROP CONSTRAINT FK_TransactionSale_Customers
GO
COMMIT
BEGIN TRANSACTION
GO
EXECUTE sp_rename N'dbo.TransactionSale', N'SaleVoucher', 'OBJECT' 
GO
EXECUTE sp_rename N'dbo.SaleVoucher.TransactionID', N'VoucherID', 'COLUMN' 
GO
ALTER TABLE dbo.SaleVoucher ADD CONSTRAINT
	FK_SaleVoucher_Customers FOREIGN KEY
	(
	CustomerID
	) REFERENCES dbo.Customers
	(
	CustomerID
	) ON UPDATE  NO ACTION 
	 ON DELETE  NO ACTION 
	
GO
ALTER TABLE dbo.SaleVoucher ADD CONSTRAINT
	FK_SaleVoucher_Waiters FOREIGN KEY
	(
	WaiterID
	) REFERENCES dbo.Waiters
	(
	WaiterID
	) ON UPDATE  NO ACTION 
	 ON DELETE  NO ACTION 
	
GO
ALTER TABLE dbo.SaleVoucher ADD CONSTRAINT
	FK_SaleVoucher_Vouchers FOREIGN KEY
	(
	VoucherID
	) REFERENCES dbo.Vouchers
	(
	VoucherID
	) ON UPDATE  NO ACTION 
	 ON DELETE  NO ACTION 
	
GO
COMMIT

BEGIN TRANSACTION
GO
ALTER TABLE dbo.Inventory
	DROP CONSTRAINT FK_Inventory_BasicTransactions
GO
COMMIT
BEGIN TRANSACTION
GO
EXECUTE sp_rename N'dbo.Inventory.TransactionID', N'VoucherID', 'COLUMN' 
GO
ALTER TABLE dbo.Inventory ADD CONSTRAINT
	FK_Inventory_Vouchers FOREIGN KEY
	(
	VoucherID
	) REFERENCES dbo.Vouchers
	(
	VoucherID
	) ON UPDATE  NO ACTION 
	 ON DELETE  NO ACTION 
	
GO
COMMIT
GO

DROP PROCEDURE [dbo].[BasicTransactions_Insert]
DROP PROCEDURE [dbo].[BasicTransactions_Update]
GO

-- Product Sorting
UPDATE Products
SET SortOrder = inv.Sort
FROM (SELECT ProductID, Count(*) AS Sort FROM Inventory GROUP BY ProductID) AS inv
WHERE Products.ProductID = inv.ProductID
GO

BEGIN TRANSACTION
GO
ALTER TABLE dbo.Vouchers
	DROP CONSTRAINT DF_BasicTransactions_TransactionID
GO
COMMIT
GO
DROP TRIGGER [dbo].[BasicTransactions_Update_Auto]
GO
DROP TRIGGER [dbo].[BasicTransactions_Insert_Auto]
GO
DROP PROCEDURE [dbo].[TransactionSale_Update]
GO
DROP PROCEDURE [dbo].[TransactionSale_Insert]
GO
CREATE PROCEDURE [dbo].[SaleVoucher_Update]
(
	@VoucherID uniqueidentifier,
	@BillID nvarchar(10) OUTPUT,
	@TableID nvarchar(10),
	@WaiterID uniqueidentifier,
	@CustomerID uniqueidentifier,
	@Paid bit,
	@Void bit,
	@VoidReason nvarchar(50),
	@Printed bit OUTPUT,
	@Alarm datetime,
	@KotID nvarchar(10) OUTPUT,
	@CreditCard bit,
	@IsImportant bit,
	@timestamp timestamp OUTPUT
 )
AS
BEGIN
	IF @Printed = 1 AND (SELECT Printed FROM SaleVoucher WHERE VoucherID = @VoucherID) = 0 
	BEGIN
		SELECT @BillID = ISNULL(CAST(MAX(CAST(REPLACE(BillID, '-', '') AS int)) + 1 AS nvarchar(9)), '010001') FROM SaleVoucher WHERE BillID LIKE '__-____'
		IF LEN(@BillID) = 5
		SET @BillID = '0' + @BillID
		SET @BillID = SUBSTRING(@BillID, 1, 2) + '-' + SUBSTRING(@BillID, 3, 7) 
		IF SUBSTRING(@BillID,3,7) = '-0000'
		SET @BillID = SUBSTRING(@BillID, 1, 2) + '-0001'
	END
    ELSE
    BEGIN
        SELECT @BillID = BillID FROM SaleVoucher WHERE VoucherID = @VoucherID
    END
    IF @TableID = ''
    BEGIN
      SELECT @TableID = 'C' + CAST(ISNULL(MAX(CAST(SUBSTRING(TableID, 2, 10) AS int)), 0) + 1 AS nvarchar(10)) FROM SaleVoucher WHERE TableID LIKE 'C%' AND Paid = 0 AND Void = 0
    END
	IF (SELECT Printed FROM SaleVoucher WHERE VoucherID = @VoucherID) = 1
		SET @Printed = 1
	UPDATE [dbo].[SaleVoucher] SET 
		[BillID] = @BillID, 
		[TableID] = @TableID, 
		[WaiterID] = @WaiterID, 
		[CustomerID] = @CustomerID, 
		[Paid] = @Paid, 
		[Void] = @Void, 
		[VoidReason] = @VoidReason, 
		[Printed] = @Printed, 
		[Alarm] = @Alarm,
		[CreditCard] = @CreditCard,
		[IsImportant] = @IsImportant
		WHERE VoucherID = @VoucherID

    UPDATE Vouchers SET LastEditDate = GETDATE() WHERE VoucherID = @VoucherID

	SELECT @timestamp = timestamp, @KotID = KotID FROM [dbo].[SaleVoucher] WHERE VoucherID = @VoucherID
END

GO

CREATE PROCEDURE [dbo].[SaleVoucher_Insert]
(
	@VoucherID uniqueidentifier,
	@BillID nvarchar(10) OUTPUT,
	@TableID nvarchar(10),
	@WaiterID uniqueidentifier,
	@CustomerID uniqueidentifier,
	@Paid bit,
	@Void bit,
	@VoidReason nvarchar(50),
	@Printed bit,
	@Alarm datetime,
	@KotID nvarchar(10) OUTPUT,
	@CreditCard bit,
    @IsImportant bit,
	@timestamp timestamp OUTPUT
 )
AS
BEGIN
	SELECT @KotID = ISNULL('K-' + CAST(MAX(CAST(SUBSTRING(KotID, 3,8) AS int)) + 1 AS nvarchar(8)), 'K-1') FROM [dbo].[SaleVoucher]
	IF @Printed = 1
	BEGIN
		SELECT @BillID = ISNULL(CAST(MAX(CAST(REPLACE(BillID, '-', '') AS int)) + 1 AS nvarchar(9)), '010001') FROM SaleVoucher WHERE BillID LIKE '__-____'
		IF LEN(@BillID) = 5
		SET @BillID = '0' + @BillID
		SET @BillID = SUBSTRING(@BillID, 1, 2) + '-' + SUBSTRING(@BillID, 3, 7) 
		IF SUBSTRING(@BillID,3,7) = '-0000'
		SET @BillID = SUBSTRING(@BillID, 1, 2) + '-0001'
	END
	ELSE
	BEGIN
		SET @BillID = @KotID
	END
    IF @TableID = ''
    BEGIN
      SELECT @TableID = 'C' + CAST(ISNULL(MAX(CAST(SUBSTRING(TableID, 2, 10) AS int)), 0) + 1 AS nvarchar(10)) FROM SaleVoucher WHERE TableID LIKE 'C%' AND Paid = 0 AND Void = 0
    END
	INSERT INTO [dbo].[SaleVoucher] ([VoucherID], [BillID], [TableID], [WaiterID], [CustomerID], [Paid], [Void], [VoidReason], [Printed], [Alarm], [KotID], [CreditCard] ,[IsImportant])
	VALUES (@VoucherID, @BillID, @TableID, @WaiterID, @CustomerID, @Paid, @Void, @VoidReason, @Printed, @Alarm, @KotID, @CreditCard, @IsImportant)
	SELECT @timestamp = timestamp FROM [dbo].[SaleVoucher] WHERE VoucherID = @VoucherID
END
GO

-- Waiters
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_Waiters
	(
	WaiterID uniqueidentifier NOT NULL,
	Code int NULL,
	Name nvarchar(200) NOT NULL,
	timestamp timestamp NOT NULL
	)  ON [PRIMARY]
GO
IF EXISTS(SELECT * FROM dbo.Waiters)
	 EXEC('INSERT INTO dbo.Tmp_Waiters (WaiterID, Name)
		SELECT WaiterID, Name FROM dbo.Waiters WITH (HOLDLOCK TABLOCKX)')
GO
ALTER TABLE dbo.SaleVoucher
	DROP CONSTRAINT FK_SaleVoucher_Waiters
GO
DROP TABLE dbo.Waiters
GO
EXECUTE sp_rename N'dbo.Tmp_Waiters', N'Waiters', 'OBJECT' 
GO
ALTER TABLE dbo.Waiters ADD CONSTRAINT
	PK_Waiters PRIMARY KEY CLUSTERED 
	(
	WaiterID
	) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

GO
CREATE NONCLUSTERED INDEX IX_Waiters_Name ON dbo.Waiters
	(
	Name
	) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.SaleVoucher ADD CONSTRAINT
	FK_SaleVoucher_Waiters FOREIGN KEY
	(
	WaiterID
	) REFERENCES dbo.Waiters
	(
	WaiterID
	) ON UPDATE  NO ACTION 
	 ON DELETE  NO ACTION 
	
GO
COMMIT

-- Add Waiter
DECLARE @Code int
SELECT @Code = 1
UPDATE Waiters SET @Code = Code = @Code + 1

INSERT INTO Waiters (WaiterID, Code, Name) 
VALUES (NEWID(), 1, 'Waiter');

BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_Waiters
	(
	WaiterID uniqueidentifier NOT NULL,
	Code int NOT NULL,
	Name nvarchar(200) NOT NULL,
	timestamp timestamp NOT NULL
	)  ON [PRIMARY]
GO
IF EXISTS(SELECT * FROM dbo.Waiters)
	 EXEC('INSERT INTO dbo.Tmp_Waiters (WaiterID, Code, Name)
		SELECT WaiterID, Code, Name FROM dbo.Waiters WITH (HOLDLOCK TABLOCKX)')
GO
ALTER TABLE dbo.SaleVoucher
	DROP CONSTRAINT FK_SaleVoucher_Waiters
GO
DROP TABLE dbo.Waiters
GO
EXECUTE sp_rename N'dbo.Tmp_Waiters', N'Waiters', 'OBJECT' 
GO
ALTER TABLE dbo.Waiters ADD CONSTRAINT
	PK_Waiters PRIMARY KEY CLUSTERED 
	(
	WaiterID
	) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

GO
CREATE NONCLUSTERED INDEX IX_Waiters_Name ON dbo.Waiters
	(
	Name
	) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
CREATE UNIQUE NONCLUSTERED INDEX IX_Waiters ON dbo.Waiters
	(
	Code
	) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.SaleVoucher ADD CONSTRAINT
	FK_SaleVoucher_Waiters FOREIGN KEY
	(
	WaiterID
	) REFERENCES dbo.Waiters
	(
	WaiterID
	) ON UPDATE  NO ACTION 
	 ON DELETE  NO ACTION 
	
GO
COMMIT

-- Waiter Role
INSERT INTO Roles (Role, Description) VALUES ('Waiter/Master', 'Add / Edit / Delete Waiters')
--INSERT INTO Roles (Role, Description) VALUES ('Log/View', 'View the event Log')


---- User Modification
BEGIN TRANSACTION
GO
ALTER TABLE dbo.Users
	DROP CONSTRAINT DF_Users_CreationDate
GO
ALTER TABLE dbo.Users
	DROP COLUMN Email, Approved, Question, Answer, Comment, CreationDate, LastLoginDate, LastActivityDate, LastPasswordChangedDate, LastLockoutDate
GO
COMMIT
