Monografias.com > Sin categoría
Descargar Imprimir Comentar Ver trabajos relacionados

Sistema para control de tiempo y asistencia de personal (página 4)



Partes: 1, 2, 3, 4

MisDatos.Close

End Sub

Public Sub LLenaDatos(num As Integer, Datos() As String)

sql = "select * " _

& "FROM Turnos INNER JOIN (Personal INNER JOIN marcacion ON Personal.codigo = marcacion.codigo) " _

& "ON Turnos.codigo = marcacion.cod_turno where marcacion.Num_marcacion= " & num & ""

MisDatos.Open sql, MiConexion, , , adCmdText

With MisDatos

Datos(0) = !nombre1 + " " + !nombre2

Datos(1) = !apellido1 + " " + !apellido2

Datos(2) = CStr(!hora_ing) + ":" + CStr(!minuto_ing) + ":" + CStr(!segundo_ing) _

& " " + CStr(!dia_ing) + "/" + CStr(!mes_ing) + "/" + CStr(!anio_ing + 2000)

FrmConsulta.ImgIngreso.Picture = LoadPicture(App.Path + "fotosm" + CStr(num) + "_1.jpg")

If MisDatos!Estado = 2 Then

Datos(3) = CStr(!hora_sal) + ":" + CStr(!minuto_sal) + ":" + CStr(!segundo_sal) _

& " " + CStr(!dia_sal) + "/" + CStr(!mes_sal) + "/" + CStr(!anio_sal + 2000)

FrmConsulta.ImgSalida.Picture = LoadPicture(App.Path + "fotosm" + CStr(num) + "_2.jpg")

Else

Datos(3) = "NO APLICA"

End If

Datos(4) = CStr(!horas_trab)

Datos(5) = CStr(!minutos_trab)

Datos(6) = CStr(!h_ex_m)

Datos(7) = CStr(!m_ex_m)

Datos(8) = CStr(!h_ex_t)

Datos(9) = CStr(!m_ex_t)

Datos(10) = CStr(!horas_nocturnas)

Datos(11) = CStr(!minutos_nocturnas)

Datos(12) = CStr(!nombre)

Datos(13) = CStr(!horad1) + ":" + CStr(!minutod1) + " +/- " + CStr(!toled1) + " " + CStr(!horah1) + ":" + CStr(!minutoh1) + " +/- " + CStr(!toleh1)

Select Case !observacion

Case 0

Datos(14) = "TODO CORRECTO"

Case 1

Datos(14) = "NO HAY UNA ASIGNACION DE TURNO"

Case 2

Datos(14) = "ATRAZO"

Case 3

Datos(14) = "SALIDA ANTES DE TIEMPO"

Case 4

Datos(14) = "ENTRADA ANTES DE TIEMPO"

Case 5

Datos(14) = "ATRAZO Y SALE ANTES"

Case 6

Datos(14) = "ENTRA PRONTO Y SALE PRONTO"

Case 7

Datos(14) = "NO HA MARCADO LA SALIDA"

End Select

.Close

End With

End Sub

Public Function Consultando(CodPer As Integer) As Boolean

sql = "select codigo from marcacion where codigo=" & CodPer & " and estado=1"

MisDatos.Open sql, MiConexion, , , adCmdText

If MisDatos.BOF = True And MisDatos.EOF = True Then

Consultando = False

Else

Consultando = True

End If

MisDatos.Close

End Function

Public Sub LLenarReporte(F1 As String, F2 As String, Cuantos As Integer, Tabla As MSFlexGrid)

Dim L1(3) As Integer

Dim L2(3) As Integer

Dim Fila As Integer

L1(0) = Day(F1)

L1(1) = Month(F1)

L1(2) = Year(F1) – 2000

L2(0) = Day(F2)

L2(1) = Month(F2)

L2(2) = Year(F2) – 2000

If Cuantos = 1 Then

sql = "SELECT Personal.nombre1, Personal.nombre2, Personal.apellido1, Personal.apellido2, " _

& "Sum(marcacion.h_ex_t) AS ExH100, Sum(marcacion.m_ex_t) AS ExM100, Sum(marcacion.h_ex_m) " _

& "AS ExH50, Sum(marcacion.m_ex_m) AS ExM50, Sum(marcacion.horas_trab) AS HorasT, " _

& "Sum(marcacion.minutos_trab) AS MinutosT, Sum(marcacion.horas_nocturnas) AS HorasN, " _

& "Sum(marcacion.minutos_nocturnas) AS MinutosN, marcacion.dia_ing, marcacion.mes_ing, marcacion.anio_ing, " _

& "marcacion.estado " _

& "FROM Personal INNER JOIN marcacion ON Personal.codigo = marcacion.codigo " _

& "GROUP BY Personal.nombre1, Personal.nombre2, Personal.apellido1, Personal.apellido2, " _

& "marcacion.dia_ing, marcacion.mes_ing, marcacion.anio_ing,marcacion.estado " _

& "HAVING marcacion.dia_ing>=" & L1(0) & " AND marcacion.dia_ing<=" & L2(0) & " " _

& "AND marcacion.mes_ing>=" & L1(1) & " AND marcacion.mes_ing<=" & L2(1) & " " _

& "AND marcacion.anio_ing>=" & L1(2) & " AND marcacion.anio_ing<=" & L2(2) & " " _

& "AND marcacion.estado=2"

Else

sql = ""

End If

MisDatos.CursorType = adOpenDynamic

MisDatos.Open sql, MiConexion, , , adCmdText

Tabla.Rows = 1

If MisDatos.BOF = True And MisDatos.EOF = True Then

Tabla.Enabled = False

Else

Fila = 1

MisDatos.MoveFirst

While MisDatos.EOF = False

Tabla.Rows = Fila + 1

Tabla.TextMatrix(Fila, 0) = MisDatos!nombre1 + " " + MisDatos!nombre2 + " " + MisDatos!apellido1 + " " + MisDatos!apellido2

Tabla.TextMatrix(Fila, 1) = CStr(MisDatos!HorasT) + ":" + CStr(MisDatos!MinutosT)

Tabla.TextMatrix(Fila, 2) = CStr(MisDatos!HorasN) + ":" + CStr(MisDatos!MinutosN)

Tabla.TextMatrix(Fila, 3) = CStr(MisDatos!ExH50) + ":" + CStr(MisDatos!ExM50)

Tabla.TextMatrix(Fila, 4) = CStr(MisDatos!ExH100) + ":" + CStr(MisDatos!ExM100)

Fila = Fila + 1

MisDatos.MoveNext

Wend

Tabla.Enabled = True

End If

MisDatos.Close

End Sub

BD_Personal:

Option Explicit

Private MisDatos As ADODB.Recordset

Private MisDatosAux As ADODB.Recordset

Private MiConexion As ADODB.Connection

Private sql As String

Private mcodigo As Integer

Private mtipo As Integer

Private mnombre1 As String

Private mnombre2 As String

Private mapellido1 As String

Private mapellido2 As String

Private mcontrasena As String

Private mDireccion As String

Property Get codigo() As Integer

codigo = mcodigo

End Property

Property Get tipo() As Integer

tipo = mtipo

End Property

Property Get nombre1() As String

nombre1 = mnombre1

End Property

Property Get nombre2() As String

nombre2 = mnombre2

End Property

Property Get apellido1() As String

apellido1 = mapellido1

End Property

Property Get apellido2() As String

apellido2 = mapellido2

End Property

Property Get contrasena() As String

contrasena = mcontrasena

End Property

Property Get direccion() As String

direccion = mDireccion

End Property

Private Sub Class_Initialize()

Set MiConexion = New ADODB.Connection

Set MisDatos = New ADODB.Recordset

Set MisDatosAux = New ADODB.Recordset

MiConexion.ConnectionString = RutaConexion

MiConexion.Open RutaConexion

MisDatos.CursorType = adOpenDynamic

MisDatos.Open "Select * from Personal order by Apellido1", MiConexion, , , adCmdText

MisDatos.MoveFirst

LlenarDatos

End Sub

Private Sub Class_Terminate()

MisDatos.Close

MiConexion.Close

End Sub

Private Sub LlenarDatos()

With MisDatos

mcodigo = !codigo

mtipo = !tipo

mnombre1 = !nombre1

mnombre2 = !nombre2

mapellido1 = !apellido1

mapellido2 = !apellido2

mcontrasena = !contrasena

mDireccion = !direccion

End With

End Sub

Public Sub Nuevo(tipo As Integer, nombre1 As String, nombre2 As String, apellido1 As String, _

apellido2 As String, contrasena As String, direccion As String)

Dim c As Integer

MisDatosAux.CursorType = adOpenDynamic

MisDatosAux.Open "select Codigo from Personal order by Codigo", MiConexion, , , adCmdText

If MisDatosAux.EOF = True And MisDatosAux.BOF = True Then

c = 1

Else

MisDatosAux.MoveLast

c = MisDatosAux!codigo + 1

End If

MisDatosAux.Close

MiConexion.Execute "Insert into Personal (codigo,tipo,nombre1,nombre2,apellido1," _

& "apellido2,contrasena,direccion) " _

& "values (" & c & "," & tipo & ",'" & nombre1 & "','" & nombre2 & "'," _

& "'" & apellido1 & "','" & apellido2 & "','" & contrasena & "'," _

& "'" & direccion & "')"

MisDatos.Close

MisDatos.Open "select * from Personal order by Apellido1", MiConexion, , , adCmdText

LlenarDatos

End Sub

Public Sub Actualiza(codigo As Integer, tipo As Integer, nombre1 As String, nombre2 As String, apellido1 As String, _

apellido2 As String, contrasena As String, direccion As String)

MiConexion.Execute "Update Personal set tipo=" & tipo & ",Nombre1 ='" & nombre1 & "'," _

& "Nombre2='" & nombre2 & "',Apellido1='" & apellido1 & "'," _

& "Apellido2='" & apellido2 & "',contrasena='" & contrasena & "',Direccion='" & direccion & "' " _

& "where Codigo = " & codigo & ""

MisDatos.Close

MisDatos.Open "select * from Personal order by Apellido1", MiConexion, , , adCmdText

LlenarDatos

End Sub

Public Function BuscaCodigo(codigo As Integer) As Boolean

sql = "select * from personal where codigo = " & codigo & ""

MisDatosAux.Open sql, MiConexion, , , adCmdText

If MisDatosAux.EOF = True And MisDatosAux.BOF = True Then

BuscaCodigo = False

Else

With MisDatosAux

mcodigo = !codigo

mtipo = !tipo

mnombre1 = !nombre1

mnombre2 = !nombre2

mapellido1 = !apellido1

mapellido2 = !apellido2

mcontrasena = !contrasena

mDireccion = !direccion

End With

BuscaCodigo = True

End If

MisDatosAux.Close

End Function

Public Function BuscaRepetido(nombre1 As String, nombre2 As String, apellido1 As String, apellido2 As String) As Integer

sql = "select * from Personal where nombre1 = '" & nombre1 & "'" _

& " and nombre2 = '" & nombre2 & "' and apellido1 = " _

& "'" & apellido1 & "' and apellido2 = '" & apellido2 & "'"

MisDatosAux.Open sql, MiConexion, , , adCmdText

If MisDatosAux.EOF = True And MisDatosAux.BOF = True Then

BuscaRepetido = 0

Else

BuscaRepetido = MisDatosAux!codigo

End If

MisDatosAux.Close

End Function

Public Function ClaveRepetido(clave As String) As Boolean

sql = "select * from Personal where contrasena= '" & clave & "'"

MisDatosAux.Open sql, MiConexion, , , adCmdText

If MisDatosAux.EOF = True And MisDatosAux.BOF = True Then

ClaveRepetido = False

Else

With MisDatosAux

mcodigo = !codigo

mtipo = !tipo

mnombre1 = !nombre1

mnombre2 = !nombre2

mapellido1 = !apellido1

mapellido2 = !apellido2

mcontrasena = !contrasena

mDireccion = !direccion

End With

ClaveRepetido = True

End If

MisDatosAux.Close

End Function

Public Sub Borrar(codigo As Integer)

On Error Resume Next

MiConexion.Execute "Delete from personal where Codigo = " & codigo & ""

End Sub

Public Sub Primero()

If MisDatos.BOF = False Then

MisDatos.MoveFirst

LlenarDatos

End If

End Sub

Public Sub Ultimo()

If MisDatos.EOF = False Then

MisDatos.MoveLast

LlenarDatos

End If

End Sub

Public Sub Anterior()

MisDatos.MovePrevious

If MisDatos.BOF = False Then

LlenarDatos

Else

MisDatos.MoveFirst

End If

End Sub

Public Sub Siguiente()

MisDatos.MoveNext

If MisDatos.EOF = False Then

LlenarDatos

Else

MisDatos.MoveLast

End If

End Sub

Public Sub Busqueda(LstResultados As ListBox, nombre1 As String, nombre2 As String, apellido1 As String, apellido2 As String, direccion As String, tipo As Integer, Optional Asignaciones As Boolean)

Dim ColocaY As Boolean

Dim j As Integer

LstResultados.Clear

ColocaY = False

sql = "Select Codigo,Nombre1,Nombre2,Apellido1,Apellido2 from Personal where"

If nombre1 <> "" Then

sql = sql + " nombre1 like '" & nombre1 & "%'"

ColocaY = True

End If

If nombre2 <> "" Then

If ColocaY = True Then

sql = sql + " and"

End If

sql = sql + " nombre2 like '" & nombre2 & "%'"

ColocaY = True

End If

If apellido1 <> "" Then

If ColocaY = True Then

sql = sql + " and"

End If

sql = sql + " apellido1 like '" & apellido1 & "%'"

ColocaY = True

End If

If apellido2 <> "" Then

If ColocaY = True Then

sql = sql + " and"

End If

sql = sql + " apellido2 like '" & apellido2 & "%'"

ColocaY = True

End If

If direccion <> "" Then

If ColocaY = True Then

sql = sql + " and"

End If

sql = sql + " direccion like '" & direccion & "%'"

ColocaY = True

End If

If tipo <> -1 Then

If ColocaY = True Then

sql = sql + " and"

End If

sql = sql + " tipo = " & tipo & ""

ColocaY = True

End If

If Mid(sql, Len(sql) – 4, 5) = "where" Then

sql = Mid(sql, 1, Len(sql) – 4)

End If

sql = sql + " order by Apellido1,Apellido2,Nombre1,Nombre2"

MisDatosAux.CursorType = adOpenDynamic

MisDatosAux.Open sql, MiConexion, , , adCmdText

If MisDatosAux.EOF = False And MisDatosAux.BOF = False Then

LstResultados.Enabled = True

Do Until MisDatosAux.EOF

LstResultados.AddItem MisDatosAux!nombre1 + " " + _

MisDatosAux!nombre2 + " " + _

MisDatosAux!apellido1 + " " + _

MisDatosAux!apellido2

LstResultados.ItemData(LstResultados.NewIndex) = MisDatosAux!codigo

MisDatosAux.MoveNext

Loop

Else

LstResultados.Enabled = False

LstResultados.AddItem "NO HAY REGISTROS"

End If

MisDatosAux.Close

If Asignaciones = True Then

If LstResultados.Enabled = True Then

For j = 0 To LstResultados.ListCount – 1

sql = "SELECT Asignaciones.cod_empleado, Turnos.nombre " _

& "FROM Turnos INNER JOIN Asignaciones ON Turnos.codigo = Asignaciones.cod_turno " _

& "WHERE (((Asignaciones.cod_empleado)=" & LstResultados.ItemData(j) & "))"

MisDatosAux.CursorType = adOpenDynamic

MisDatosAux.Open sql, MiConexion, , , adCmdText

If MisDatosAux.EOF = True And MisDatosAux.BOF = True Then

LstResultados.List(j) = LstResultados.List(j) + " *** NO ASIGNADO ***"

Else

MisDatosAux.MoveFirst

LstResultados.List(j) = LstResultados.List(j) + " /"

While MisDatosAux.EOF = False

LstResultados.List(j) = LstResultados.List(j) + " " + MisDatosAux!nombre

MisDatosAux.MoveNext

Wend

LstResultados.List(j) = LstResultados.List(j) + " "

End If

MisDatosAux.Close

Next j

End If

End If

End Sub

Public Sub CRBusqueda(codigo As Integer)

MisDatos.MoveFirst

While (MisDatos!codigo <> codigo) And MisDatos.EOF = False

MisDatos.MoveNext

Wend

LlenarDatos

End Sub

BD_Turnos:

Option Explicit

Private MisDatos As ADODB.Recordset

Private MisDatosAux As ADODB.Recordset

Private MiConexion As ADODB.Connection

Private sql As String

Private mcodigo As Integer

Private mnombre As String

Private mhorad1 As Integer

Private mminutod1 As Integer

Private mtoled1 As Integer

Private mhorah1 As Integer

Private mminutoh1 As Integer

Private mtoleh1 As Integer

Property Get codigo() As Integer

codigo = mcodigo

End Property

Property Get nombre() As String

nombre = mnombre

End Property

Property Get Turno1() As String

Turno1 = ""

If mhorad1 < 10 Then Turno1 = "0"

Turno1 = Turno1 + CStr(mhorad1) + ":"

If mminutod1 < 10 Then Turno1 = Turno1 + "0"

Turno1 = Turno1 + CStr(mminutod1) + " +/- "

If mtoled1 < 10 Then Turno1 = Turno1 + "0"

Turno1 = Turno1 + CStr(mtoled1) + " a "

If mhorah1 < 10 Then Turno1 = Turno1 + "0"

Turno1 = Turno1 + CStr(mhorah1) + ":"

If mminutoh1 < 10 Then Turno1 = Turno1 + "0"

Turno1 = Turno1 + CStr(mminutoh1) + " +/- "

If mtoleh1 < 10 Then Turno1 = Turno1 + "0"

Turno1 = Turno1 + CStr(mtoleh1)

End Property

Private Sub Class_Initialize()

Set MiConexion = New ADODB.Connection

Set MisDatos = New ADODB.Recordset

Set MisDatosAux = New ADODB.Recordset

MiConexion.ConnectionString = RutaConexion

MiConexion.Open RutaConexion

MisDatos.CursorType = adOpenDynamic

MisDatos.Open "Select * from Turnos order by nombre", MiConexion, , , adCmdText

If MisDatos.EOF = True And MisDatos.BOF = True Then

mcodigo = 0

Else

MisDatos.MoveFirst

LlenarDatos

End If

End Sub

Private Sub Class_Terminate()

MisDatos.Close

MiConexion.Close

End Sub

Private Sub LlenarDatos()

With MisDatos

mcodigo = !codigo

mnombre = !nombre

mhorad1 = !horad1

mminutod1 = !minutod1

mtoled1 = !toled1

mhorah1 = !horah1

mminutoh1 = !minutoh1

mtoleh1 = !toleh1

End With

End Sub

Public Sub Nuevo(nombre As String, Turno1 As String)

Dim T(6) As Integer

Dim c As Integer

Dim k As Integer

Dim P As Integer

Dim e As Boolean

MisDatosAux.CursorType = adOpenDynamic

MisDatosAux.Open "select Codigo from turnos order by codigo", MiConexion, , , adCmdText

If MisDatosAux.EOF = True And MisDatosAux.BOF = True Then

c = 1

Else

MisDatosAux.MoveLast

c = MisDatosAux!codigo + 1

End If

MisDatosAux.Close

P = 1

For k = 0 To 1

T(k * 3) = Val(Mid(Turno1, P, 2))

T((k * 3) + 1) = Val(Mid(Turno1, P + 3, 2))

T((k * 3) + 2) = Val(Mid(Turno1, P + 10, 2))

P = 16

Next k

MiConexion.Execute "Insert into Turnos (codigo,nombre," _

& "horad1,minutod1,toled1,horah1,minutoh1,toleh1) " _

& "values (" & c & ",'" & nombre & "'," _

& "" & T(0) & "," & T(1) & "," & T(2) & "," _

& "" & T(3) & "," & T(4) & "," & T(5) & ")"

MisDatos.Close

MisDatos.Open "select * from Turnos order by nombre", MiConexion, , , adCmdText

MisDatos.MoveFirst

e = False

While e = False

If MisDatos!codigo = c Then

e = True

Else

MisDatos.MoveNext

End If

Wend

LlenarDatos

End Sub

Public Sub Actualiza(codigo As Integer, nombre As String, Turno1 As String)

Dim T(6) As Integer

Dim c As Integer

Dim k As Integer

Dim P As Integer

Dim e As Boolean

P = 1

For k = 0 To 1

T((k * 3) + 0) = Val(Mid(Turno1, P, 2))

T((k * 3) + 1) = Val(Mid(Turno1, P + 3, 2))

T((k * 3) + 2) = Val(Mid(Turno1, P + 10, 2))

P = 16

Next k

MiConexion.Execute "Update Turnos set nombre ='" & nombre & "'," _

& "horad1=" & T(0) & ",minutod1=" & T(1) & ",toled1=" & T(2) & "," _

& "horah1=" & T(3) & ",minutoh1=" & T(4) & ",toleh1=" & T(5) & " " _

& "where codigo = " & codigo & ""

MisDatos.Close

MisDatos.Open "select * from Turnos order by nombre", MiConexion, , , adCmdText

MisDatos.MoveFirst

e = False

While MisDatos!codigo <> codigo

MisDatos.MoveNext

Wend

LlenarDatos

End Sub

Public Function BuscaCodigo(codigo As Integer) As Boolean

Dim e As Boolean

sql = "select * from Turnos where codigo = " & codigo & ""

MisDatosAux.CursorType = adOpenDynamic

MisDatosAux.Open sql, MiConexion, , , adCmdText

If MisDatosAux.EOF = True And MisDatosAux.BOF = True Then

BuscaCodigo = False

Else

MisDatos.MoveFirst

e = False

While e = False

If MisDatos!codigo = codigo Then

e = True

Else

MisDatos.MoveNext

End If

Wend

LlenarDatos

BuscaCodigo = True

End If

MisDatosAux.Close

End Function

Public Function LLenarLista(lista As ListBox) As Boolean

sql = "select * from Turnos order by nombre"

MisDatosAux.CursorType = adOpenDynamic

MisDatosAux.Open sql, MiConexion, , , adCmdText

lista.Clear

lista.Enabled = True

If Not (MisDatosAux.EOF = True And MisDatosAux.BOF = True) = True Then

MisDatosAux.MoveFirst

While MisDatosAux.EOF = False

lista.AddItem MisDatosAux!nombre

lista.ItemData(lista.NewIndex) = MisDatosAux!codigo

MisDatosAux.MoveNext

Wend

LLenarLista = True

Else

lista.AddItem "NO HAY REGISTROS"

lista.Enabled = False

mcodigo = 0

LLenarLista = False

End If

MisDatosAux.Close

End Function

Public Sub Borrar(codigo As Integer)

On Error Resume Next

MiConexion.Execute "Delete from Turnos where Codigo = " & codigo & ""

MisDatos.Close

MisDatos.Open "Select * from turnos order by nombre", MiConexion, , , adCmdText

If MisDatos.EOF = True And MisDatos.BOF = True Then

mcodigo = 0

Else

MisDatos.MoveFirst

LlenarDatos

End If

End Sub

Public Sub Primero()

If MisDatos.BOF = False Then

MisDatos.MoveFirst

LlenarDatos

End If

End Sub

Public Sub Ultimo()

If MisDatos.EOF = False Then

MisDatos.MoveLast

LlenarDatos

End If

End Sub

Public Sub Anterior()

MisDatos.MovePrevious

If MisDatos.BOF = False Then

LlenarDatos

Else

MisDatos.MoveFirst

End If

End Sub

Public Sub Siguiente()

MisDatos.MoveNext

If MisDatos.EOF = False Then

LlenarDatos

Else

MisDatos.MoveLast

LlenarDatos

End If

End Sub

 

Enviado por:

Ing.+Lic. Yunior Andrés Castillo S.

"NO A LA CULTURA DEL SECRETO, SI A LA LIBERTAD DE INFORMACION"®

www.monografias.com/usuario/perfiles/ing_lic_yunior_andra_s_castillo_s/monografias

Santiago de los Caballeros,

República Dominicana,

2015.

"DIOS, JUAN PABLO DUARTE Y JUAN BOSCH – POR SIEMPRE"®

Partes: 1, 2, 3, 4
 Página anterior Volver al principio del trabajoPágina siguiente 

Nota al lector: es posible que esta página no contenga todos los componentes del trabajo original (pies de página, avanzadas formulas matemáticas, esquemas o tablas complejas, etc.). Recuerde que para ver el trabajo en su versión original completa, puede descargarlo desde el menú superior.

Todos los documentos disponibles en este sitio expresan los puntos de vista de sus respectivos autores y no de Monografias.com. El objetivo de Monografias.com es poner el conocimiento a disposición de toda su comunidad. Queda bajo la responsabilidad de cada lector el eventual uso que se le de a esta información. Asimismo, es obligatoria la cita del autor del contenido y de Monografias.com como fuentes de información.

Categorias
Newsletter