USE [Sales]
GO
    create table dbo.Vouchers (
        VoucherID UNIQUEIDENTIFIER not null,
       Date DATETIME not null,
       Pax INT null,
       UserID UNIQUEIDENTIFIER not null,
       CreationDate DATETIME not null,
       LastEditDate DATETIME not null,
       BillID int,
       TableID UNIQUEIDENTIFIER not null,
       WaiterID UNIQUEIDENTIFIER not null,
       CustomerID UNIQUEIDENTIFIER not null,
       Narration NVARCHAR(255) null,
       Void BIT not null,
       VoidReason NVARCHAR(255) null,
       Printed BIT not null,
       VoucherType INT not null,
       KotID int not null,
       primary key (VoucherID)
    )

    create table dbo.Auth_Users (
        UserID UNIQUEIDENTIFIER not null,
       Name NVARCHAR(255) not null unique,
       MsrString NVARCHAR(255) null,
       Password NVARCHAR(255) not null,
       LockedOut BIT not null,
       primary key (UserID)
    )

    create table dbo.Waiters (
        WaiterID UNIQUEIDENTIFIER not null,
       Name NVARCHAR(255) not null unique,
       primary key (WaiterID)
    )

    create table dbo.Customers (
        CustomerID UNIQUEIDENTIFIER not null,
       Name NVARCHAR(255) not null unique,
       Address NVARCHAR(255) null,
       Important BIT null,
       Phone NVARCHAR(255) null,
       Remarks NVARCHAR(255) null,
       primary key (CustomerID)
    )

    create table dbo.Auth_UserGroups (
        UserGroupID UNIQUEIDENTIFIER not null,
       UserID UNIQUEIDENTIFIER not null,
       GroupID UNIQUEIDENTIFIER not null,
       primary key (UserGroupID)
    )

    create table dbo.Kots (
        KotID UNIQUEIDENTIFIER not null,
       VoucherID UNIQUEIDENTIFIER not null,
       Code int not null unique,
       TableID UNIQUEIDENTIFIER not null,
       Printed BIT not null,
       [Date] DATETIME not null,
       UserID UNIQUEIDENTIFIER not null,
       primary key (KotID)
    )

    create table dbo.Reprints (
        ReprintID UNIQUEIDENTIFIER not null,
       UserID UNIQUEIDENTIFIER not null,
       [Date] DATETIME not null,
       VoucherID UNIQUEIDENTIFIER not null,
       primary key (ReprintID)
    )

    create table dbo.Inventories (
        InventoryID UNIQUEIDENTIFIER not null,
       KotID UNIQUEIDENTIFIER not null,
       ProductID UNIQUEIDENTIFIER not null,
       Quantity DECIMAL(19,5) not null,
       Price DECIMAL(19,5) not null,
       FullPrice DECIMAL(19,5) not null,
       ServiceCharge DECIMAL(19,5) not null,
       IsScTaxable BIT not null,
       ServiceTaxRate DECIMAL(19,5) not null,
       VatRate DECIMAL(19,5) not null,
       ServiceTaxID UNIQUEIDENTIFIER not null,
       VatID UNIQUEIDENTIFIER not null,
       Discount DECIMAL(19,5) not null,
	   Amount AS (case when [IsScTaxable]=(1) then ((([Quantity]*[Price])*((1)-[Discount]))*((1)+[ServiceCharge]))*(((1)+[ServiceTaxRate])+[VatRate]) else (([Quantity]*[Price])*((1)-[Discount]))*((((1)+[ServiceCharge])+[ServiceTaxRate])+[VatRate]) end),
       primary key (InventoryID)
    )

    create table dbo.InventoryModifiers (
        InventoryModifierID UNIQUEIDENTIFIER not null,
       InventoryID UNIQUEIDENTIFIER not null,
       ModifierID UNIQUEIDENTIFIER not null,
       primary key (InventoryModifierID)
    )

    create table dbo.Auth_Groups (
        GroupID UNIQUEIDENTIFIER not null,
       Name NVARCHAR(255) not null unique,
       primary key (GroupID)
    )

    create table dbo.Auth_RoleGroups (
        RoleGroupID UNIQUEIDENTIFIER not null,
       RoleID UNIQUEIDENTIFIER not null,
       GroupID UNIQUEIDENTIFIER not null,
       primary key (RoleGroupID)
    )

    create table dbo.Products (
        ProductID UNIQUEIDENTIFIER not null,
       Code INT null,
       Name NVARCHAR(255) not null,
       Units NVARCHAR(255) not null,
       ProductGroupID UNIQUEIDENTIFIER null,
       VatID UNIQUEIDENTIFIER null,
       ServiceTaxID UNIQUEIDENTIFIER null,
       ServiceCharge DECIMAL(19,5) not null,
       IsScTaxable BIT not null,
       Price DECIMAL(19,5) not null,
       FullPrice DECIMAL(19,5) not null,
       IsActive BIT not null,
       IsNotAvailable BIT not null,
       SortOrder INT not null,
       BaseCode INT not null,
       Quantity DECIMAL(19,5) not null,
       primary key (ProductID),
      unique (Name, Units)
    )

    create table dbo.Modifiers (
        ModifierID UNIQUEIDENTIFIER not null,
       Name NVARCHAR(255) not null unique,
       ShowInBill BIT not null,
       Price DECIMAL(19,5) not null,
       primary key (ModifierID)
    )

    create table dbo.ProductGroupModifiers (
        ProductGroupModifierID UNIQUEIDENTIFIER not null,
       ProductGroupID UNIQUEIDENTIFIER null,
       ModifierID UNIQUEIDENTIFIER null,
       ShowAutomatically BIT not null,
       primary key (ProductGroupModifierID)
    )

    create table dbo.Auth_Roles (
        RoleID UNIQUEIDENTIFIER not null,
       Name NVARCHAR(255) not null unique,
       primary key (RoleID)
    )

    create table dbo.ProductGroups (
        ProductGroupID UNIQUEIDENTIFIER not null,
       Name NVARCHAR(255) not null unique,
       DiscountLimit DECIMAL(19,5) not null,
       IsModifierCompulsory BIT not null,
       IsActive BIT not null,
       SortOrder INT not null,
       GroupType NVARCHAR(255) not null,
       primary key (ProductGroupID)
    )

    create table dbo.PrintLocations (
        PrintLocationID UNIQUEIDENTIFIER not null,
       ProductGroupID UNIQUEIDENTIFIER null,
       Location NVARCHAR(255) null,
       Printer NVARCHAR(255) null,
       Copies INT null,
       CutCode NVARCHAR(255) null,
       primary key (PrintLocationID)
    )

    create table dbo.Taxes (
        TaxID UNIQUEIDENTIFIER not null,
       Name NVARCHAR(255) not null unique,
       Rate DECIMAL(19,5) not null,
       primary key (TaxID)
    )

    create table dbo.VoucherSettlements (
        VoucherSettlementID UNIQUEIDENTIFIER not null,
       VoucherID UNIQUEIDENTIFIER not null,
       Settled INT not null,
       Amount DECIMAL(19,5) not null,
       primary key (VoucherSettlementID)
    )

    create table dbo.FoodTables (
        FoodTableID UNIQUEIDENTIFIER not null,
       Name NVARCHAR(255) not null unique,
       IsActive BIT not null,
       Location NVARCHAR(255) null,
       Status NVARCHAR(255) null,
       SortOrder INT not null,
       VoucherID UNIQUEIDENTIFIER null,
       primary key (FoodTableID)
    )

    alter table dbo.Vouchers 
        add constraint FK415A8D77B9E9332A 
        foreign key (UserID) 
        references dbo.Auth_Users

    alter table dbo.Vouchers 
        add constraint FK415A8D77B9E93DDD 
        foreign key (TableID) 
        references dbo.FoodTables

    alter table dbo.Kots 
        add constraint FK415A8D77B9E93BBB 
        foreign key (TableID) 
        references dbo.FoodTables

    alter table dbo.Vouchers 
        add constraint FK415A8D773E16E17E 
        foreign key (WaiterID) 
        references dbo.Waiters

    alter table dbo.Vouchers 
        add constraint FK415A8D7737EDAED4 
        foreign key (CustomerID) 
        references dbo.Customers

    alter table dbo.Auth_UserGroups 
        add constraint FKF726684AB9E9332A 
        foreign key (UserID) 
        references dbo.Auth_Users

    alter table dbo.Auth_UserGroups 
        add constraint FKF726684A26F423BC 
        foreign key (GroupID) 
        references dbo.Auth_Groups

    alter table dbo.Kots 
        add constraint FKF9C1219798E59CD2 
        foreign key (VoucherID) 
        references dbo.Vouchers

    alter table dbo.Kots 
        add constraint FKF9C12197B9E9332A 
        foreign key (UserID) 
        references dbo.Auth_Users

    alter table dbo.Reprints 
        add constraint FK5F5D4BA5B9E9332A 
        foreign key (UserID) 
        references dbo.Auth_Users

    alter table dbo.Reprints 
        add constraint FK5F5D4BA598E59CD2 
        foreign key (VoucherID) 
        references dbo.Vouchers

    alter table dbo.Inventories 
        add constraint FK8C0CFB22DB70F42 
        foreign key (KotID) 
        references dbo.Kots

    alter table dbo.Inventories 
        add constraint FK8C0CFB223F88CAB6 
        foreign key (ProductID) 
        references dbo.Products

    alter table dbo.Inventories 
        add constraint FK8C0CFB221DECC269 
        foreign key (ServiceTaxID) 
        references dbo.Taxes

    alter table dbo.Inventories 
        add constraint FK8C0CFB22EB4DE5BC 
        foreign key (VatID) 
        references dbo.Taxes

    alter table dbo.InventoryModifiers 
        add constraint FK80820FB4BA29671A 
        foreign key (InventoryID) 
        references dbo.Inventories

    alter table dbo.InventoryModifiers 
        add constraint FK80820FB4C0C73B24 
        foreign key (ModifierID) 
        references dbo.Modifiers

    alter table dbo.Auth_RoleGroups 
        add constraint FK656F81475D2D5938 
        foreign key (RoleID) 
        references dbo.Auth_Roles

    alter table dbo.Auth_RoleGroups 
        add constraint FK656F814726F423BC 
        foreign key (GroupID) 
        references dbo.Auth_Groups

    alter table dbo.Products 
        add constraint FK4065562A95976D16 
        foreign key (ProductGroupID) 
        references dbo.ProductGroups

    alter table dbo.Products 
        add constraint FK4065562AEB4DE5BC 
        foreign key (VatID) 
        references dbo.Taxes

    alter table dbo.Products 
        add constraint FK4065562A1DECC269 
        foreign key (ServiceTaxID) 
        references dbo.Taxes

    alter table dbo.ProductGroupModifiers 
        add constraint FK445AB60E95976D16 
        foreign key (ProductGroupID) 
        references dbo.ProductGroups

    alter table dbo.ProductGroupModifiers 
        add constraint FK445AB60EC0C73B24 
        foreign key (ModifierID) 
        references dbo.Modifiers

    alter table dbo.PrintLocations 
        add constraint FK8AE807795976D16 
        foreign key (ProductGroupID) 
        references dbo.ProductGroups

    alter table dbo.VoucherSettlements 
        add constraint FK61CD43EC98E59CD2 
        foreign key (VoucherID) 
        references dbo.Vouchers

GO
CREATE PROCEDURE KotInsert
@VoucherID uniqueidentifier,
@TableID uniqueidentifier,
@Printed bit,
@UserID uniqueidentifier,
@KotID uniqueidentifier
AS
BEGIN
	DECLARE @Date datetime;
	DECLARE @Code int;
    SELECT @Date = GETDATE();
	SELECT @Code = ISNULL(MAX(Code) + 1, 1) FROM Kots
	INSERT INTO Kots (KotID, VoucherID, Code, TableID, Printed, Date, UserID)
		VALUES (@KotID, @VoucherID, @Code, @TableID, @Printed, @Date, @UserID);
END

GO
CREATE PROCEDURE ReprintInsert
@UserID uniqueidentifier,
@VoucherID uniqueidentifier,
@ReprintID uniqueidentifier
AS
BEGIN
	DECLARE @Date datetime;
    SELECT @Date = GETDATE();
	INSERT INTO Reprints (ReprintID, UserID, Date, VoucherID)
		VALUES (@ReprintID, @UserID, @Date, @VoucherID);
END

GO
CREATE PROCEDURE VoucherInsert
@Pax int,
@UserID uniqueidentifier,
@TableID uniqueidentifier,
@WaiterID uniqueidentifier,
@CustomerID uniqueidentifier,
@Narration nvarchar(255),
@Void bit,
@VoidReason nvarchar(255),
@Printed bit,
@VoucherType int,
@VoucherID uniqueidentifier
AS
BEGIN
	DECLARE @Date datetime;
	DECLARE @BillID int;
	DECLARE @KotID int;
    SELECT @Date = GETDATE(), @BillID = null;

    SELECT @KotID = ISNULL(MAX(KotID) + 1, 1) FROM Vouchers;
	IF @Printed = 1
	BEGIN
		SELECT @BillID = ISNULL(MAX(BillID) + 1, 1) FROM Vouchers WHERE VoucherType = @VoucherType;
        IF @BillID % 10000 = 0
            SELECT @BillID = @BillID + 1;
 	END
	INSERT INTO Vouchers (VoucherID, Date, Pax, UserID, CreationDate, LastEditDate, BillID, TableID, WaiterID, CustomerID, Narration, Void, VoidReason, Printed, VoucherType, KotID)
		VALUES (@VoucherID, @Date, @Pax, @UserID, @Date, @Date, @BillID, @TableID, @WaiterID, @CustomerID, @Narration, @Void, @VoidReason, @Printed, @VoucherType, @KotID);
END

GO
CREATE PROCEDURE VoucherUpdate
@Pax int,
@UserID uniqueidentifier,
@TableID uniqueidentifier,
@WaiterID uniqueidentifier,
@CustomerID uniqueidentifier,
@Narration nvarchar(255),
@Void bit,
@VoidReason nvarchar(255),
@Printed bit,
@VoucherType int,
@VoucherID uniqueidentifier
AS
BEGIN
	DECLARE @LastEditDate datetime;
	DECLARE @Date datetime;
	DECLARE @BillID int;
	SELECT @Printed = CASE WHEN @Printed = 1 THEN 1 ELSE Printed END, 
		@BillID = BillID, @Date = Date, @LastEditDate = GETDATE() 
	FROM Vouchers WHERE VoucherID = @VoucherID;

	IF @Printed = 1 AND @BillID IS NULL
	BEGIN
		SELECT @BillID = ISNULL(MAX(BillID) + 1, 1) FROM Vouchers WHERE VoucherType = @VoucherType;
        IF @BillID % 10000 = 0
            SELECT @BillID = @BillID + 1;
		SELECT @Date = @LastEditDate;
 	END

	UPDATE Vouchers SET Pax = @Pax, UserID = @UserID, TableID = @TableID,
		WaiterID = @WaiterID, CustomerID = @CustomerID, Narration = @Narration, Void = @Void,
		VoidReason = @VoidReason, Printed = @Printed, VoucherType = @VoucherType, LastEditDate = @LastEditDate,
		Date = @Date, BillID = @BillID
		WHERE VoucherID = @VoucherID;
END
GO