CREATE TABLE [dbo].[Transaction] (
    [Id]                    UNIQUEIDENTIFIER    NOT NULL,
    [UserId]                UNIQUEIDENTIFIER    NULL,
    [OrganizationId]        UNIQUEIDENTIFIER    NULL,
    [Type]                  TINYINT             NOT NULL,
    [Amount]                MONEY               NOT NULL,
    [Refunded]              BIT                 NULL,
    [RefundedAmount]        MONEY               NULL,
    [Details]               NVARCHAR(100)       NULL,
    [PaymentMethodType]     TINYINT             NULL,
    [Gateway]               TINYINT             NULL,
    [GatewayId]             VARCHAR(50)         NULL,
    [CreationDate]          DATETIME2 (7)       NOT NULL,
    [ProviderId]            UNIQUEIDENTIFIER    NULL,
    CONSTRAINT [PK_Transaction] PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [FK_Transaction_User] FOREIGN KEY ([UserId]) REFERENCES [dbo].[User] ([Id]) ON DELETE CASCADE,
    CONSTRAINT [FK_Transaction_Organization] FOREIGN KEY ([OrganizationId]) REFERENCES [dbo].[Organization] ([Id]) ON DELETE CASCADE,
    CONSTRAINT [FK_Transaction_Provider] FOREIGN KEY ([ProviderId]) REFERENCES [dbo].[Provider] ([Id]) ON DELETE CASCADE
);

GO
CREATE UNIQUE NONCLUSTERED INDEX [IX_Transaction_Gateway_GatewayId]
    ON [dbo].[Transaction]([Gateway] ASC, [GatewayId] ASC)
    WHERE [Gateway] IS NOT NULL AND [GatewayId] IS NOT NULL;

GO
CREATE NONCLUSTERED INDEX [IX_Transaction_UserId_OrganizationId_CreationDate]
    ON [dbo].[Transaction]([UserId] ASC, [OrganizationId] ASC, [CreationDate] ASC);
