use CUENTAS_COBRAR

create table [catalogo].[Usuario] (
	IdUsuario varchar(20) primary key,
	Nombre nvarchar(255) not null,
	Apellido1 nvarchar(255) not null,
	Apellido2 nvarchar(255) not null,
	Correo varchar(200) not null,
	Habilitado bit not null
);


create table [catalogo].[Moneda] (
	IdMoneda int IDENTITY(1,1) primary key,
	Descripcion nvarchar(255) not null,
	Simbolo char(1) null,
	Habilitado bit not null
);

create table [catalogo].[TipoDocumento] (
	IdTipoDocumento int IDENTITY(1,1) primary key,
	Descripcion nvarchar(255) not null,
	Habilitado bit not null
);

create table [catalogo].[TipoPago] (
	IdTipoPago int IDENTITY(1,1) primary key,
	Descripcion nvarchar(255) not null,
	Habilitado bit not null
);

create table [catalogo].[Rol] (
	IdRol int IDENTITY(1,1) primary key,
	Descripcion nvarchar(255) not null,
	Habilitado bit not null
);

create table [global].[RolDeUsuario] (
	IdUsuario varchar(20),
	IdRol int,
	DescripcionDeRol nvarchar(255),
	PRIMARY KEY(IdUsuario, IdRol),
	FOREIGN KEY (IdUsuario) REFERENCES [catalogo].[Usuario](IdUsuario) on update cascade,
	FOREIGN KEY (IdRol) REFERENCES [catalogo].[Rol](IdRol) on update cascade,
);

create table [catalogo].[Banco] (
	IdBanco int IDENTITY(1,1) primary key,
	Nombre nvarchar(255) not null,
	Nomenclatura nvarchar(100) not null,
	Habilitado bit not null
);

create table [catalogo].[TipoIdentificacion] (
	IdTipoIdentificacion int IDENTITY(1,1) primary key,
	Descripcion nvarchar(255) not null,
	Habilitado bit not null
);

create table [catalogo].[TipoTelefono] (
	IdTipoTelefono int IDENTITY(1,1) primary key,
	Descripcion nvarchar(255) not null,
	Habilitado bit not null
);

create table [catalogo].[Pais] (
	IdPais int IDENTITY(1,1) primary key,
	Nombre nvarchar(255) not null,
	Nacionalidad nvarchar(100) not null,
	CodigoDeArea varchar(4) not null,
	Habilitado bit not null
);

create table [global].[Cliente] (
	NoIdentificacion nvarchar(30) primary key,
	IdTipoIdentificacion int not null,
	IdPaisNacionalidad int not null,
	Nombre nvarchar(255) not null,
	Apellido1 nvarchar(255),
	Apellido2 nvarchar(255),
	Correo varchar(200) not null,
	Direccion varchar(500),
	Habilitado bit not null,
	FOREIGN KEY (IdTipoIdentificacion) REFERENCES [catalogo].[TipoIdentificacion](IdTipoIdentificacion) on update cascade,
	FOREIGN KEY (IdPaisNacionalidad) REFERENCES [catalogo].[Pais](IdPais) on update cascade,
);

--Preguntar a ronald por el telefono
create table [global].[Telefono] (
	IdTelefono int IDENTITY(1,1) primary key,
	IdTipoTelefono int not null,
	NoIdentificacionCliente nvarchar(30) not null,
	Numero nvarchar(25) not null,
	Habilitado bit not null,
	FOREIGN KEY (IdTipoTelefono) REFERENCES [catalogo].[TipoTelefono](IdTipoTelefono) on Update Cascade,
	FOREIGN KEY (NoIdentificacionCliente) REFERENCES [global].[Cliente](NoIdentificacion) on Update Cascade,
);

create table [global].[Pago] (
	NoRecibo int IDENTITY(1,1) primary key,
	IdBanco int not null,
	IdMoneda int not null,
	IdTipoPago int not null,
	FechaPago datetime not null,
	FOREIGN KEY (IdBanco) REFERENCES [catalogo].[Banco](IdBanco) on update cascade,
	FOREIGN KEY (IdMoneda) REFERENCES [catalogo].[Moneda](IdMoneda) on update cascade,
	FOREIGN KEY (IdTipoPago) REFERENCES [catalogo].[TipoPago](IdTipoPago) on update cascade,
);

create table [global].[Factura] (
	Consecutivo nvarchar(40) primary key,
	NoIdentificacionCliente nvarchar(30) not null,
	IdMoneda int not null,
	IdTipoDocumento int not null,
	FechaEmision datetime not null,
	FechaVencimiento datetime not null,
	ConsecutivoNotaReferencia nvarchar(40),
	NombreReceptor nvarchar(255) not null,
	SubTotal decimal(18,2) not null,
	TotalImpuestos decimal(18,2) not null,
	TotalFactura decimal(18,2) not null,
	DiasCredito int not null,
	Saldo decimal(18,2) not null, 
	Estado nvarchar(10) not null,
	FOREIGN KEY (NoIdentificacionCliente) REFERENCES [global].[Cliente](NoIdentificacion) on update cascade,
	FOREIGN KEY (IdMoneda) REFERENCES [catalogo].[Moneda](IdMoneda) on update cascade,
	FOREIGN KEY (IdTipoDocumento) REFERENCES [catalogo].[TipoDocumento](IdTipoDocumento) on update cascade,
);

create table [global].[PagoContieneFactura] (
	ConsecutivoFactura nvarchar(40),
	NoReciboPago int,
	Primary Key(ConsecutivoFactura, NoReciboPago),
	FOREIGN KEY (ConsecutivoFactura) REFERENCES [global].[Factura](Consecutivo),
	FOREIGN KEY (NoReciboPago) REFERENCES [global].[Pago](NoRecibo),
);
go

CREATE TRIGGER agregar_descripciones_RolDeUsuario
ON global.RolDeUsuario
INSTEAD OF INSERT
AS
Begin
	Declare @descripcion nvarchar(255)
	Declare @idRol int
	Declare @idUsuario varchar(20)

	select @descripcion = descripcion from catalogo.Rol r join
	inserted i on i.IdRol = r.IdRol where i.IdRol = r.IdRol
	select @idRol = IdRol from inserted
	select @idUsuario = IdUsuario from inserted

	insert into RolDeUsuario ( IdUsuario, IdRol, DescripcionDeRol) values (@idUsuario, @idRol, @descripcion) 
End

go