frmRegistroLetes.vb 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563
  1. Public Class frmRegistroLetes
  2. Dim RegistroConsulta As New RegistrosDAO
  3. Dim Operaciones As New Operaciones
  4. Dim CodEmpr = Operaciones.CodEmpr
  5. Dim CodEmis = Operaciones.CodEmis
  6. Dim CodECalRi = Operaciones.CodECalRi
  7. Dim ListaPlazo = Operaciones.ListaPlazo
  8. Dim ListaTiposMercado = Operaciones.ListaTiposMercados
  9. Dim ListaPeriodos = Operaciones.ListaPeriodos
  10. Dim ListaTipoTasa = Operaciones.ListaTipoTasa
  11. Dim ListaTipoRenta = Operaciones.ListaTipoRenta
  12. Dim ListaEstado = Operaciones.ListaEstado
  13. Dim ListaCasasCorredoras = Operaciones.ListaCasasCorredoras
  14. Dim CodPais = Operaciones.CodPais
  15. Dim ValorCambiado As Boolean = False
  16. Dim Direccion As String = String.Empty
  17. Dim CodigoInstrumento As String = Variables.CodigoInstrumento
  18. Dim tablas As String
  19. Private Sub frmRegistroLetes_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  20. If (CodigoInstrumento = "LETE") Then
  21. tablas = "LET0"
  22. ElseIf (CodigoInstrumento = "PBUR") Then
  23. tablas = "PBUR"
  24. ElseIf (CodigoInstrumento = "VCN") Then
  25. tablas = "VCN"
  26. End If
  27. AgregarColumnasInv()
  28. AgregarColumnasIns()
  29. txtPosicion.Text = "1"
  30. txtConta.Text = RegistroConsulta.Contador(tablas)
  31. ValorCambiado = False
  32. Cargar(CodigoInstrumento, 1, 100)
  33. End Sub
  34. Sub AgregarColumnasInv()
  35. Dim Empresa, Instrumento, Emisor, CalRiesgo, Calif, Pais, TipoMercado, Nombre, Periodicidad, Plazo As New DataGridViewTextBoxColumn
  36. Dim CantidadPlazo, TipoRenta, TipoTasa, Numero, Fecha, Codigo, Estado As New DataGridViewTextBoxColumn
  37. Codigo.Name = "Codigo de Inversion"
  38. Empresa.Name = "Empresa"
  39. Instrumento.Name = "Instrumento"
  40. Emisor.Name = "Emisor"
  41. CalRiesgo.Name = "Calificadora Riesgo"
  42. Calif.Name = "Calificadora"
  43. Pais.Name = "Pais"
  44. TipoMercado.Name = "Tipo Mercado"
  45. Nombre.Name = "Nombre"
  46. Periodicidad.Name = "Periodicidad"
  47. CantidadPlazo.Name = "Cantidad Plazo"
  48. Plazo.Name = "Plazo"
  49. TipoRenta.Name = "Tipo de Renta"
  50. TipoTasa.Name = "Tipo de Tasa"
  51. Numero.Name = "Numero"
  52. Fecha.Name = "Fecha"
  53. Estado.Name = "Estado"
  54. dgvLETES.Columns.Add(Codigo)
  55. dgvLETES.Columns.Add(Estado)
  56. dgvLETES.Columns.Add(Empresa)
  57. dgvLETES.Columns.Add(Instrumento)
  58. dgvLETES.Columns.Add(Emisor)
  59. dgvLETES.Columns.Add(CalRiesgo)
  60. dgvLETES.Columns.Add(Calif)
  61. dgvLETES.Columns.Add(CantidadPlazo)
  62. dgvLETES.Columns.Add(Plazo)
  63. dgvLETES.Columns.Add(Fecha)
  64. dgvLETES.Columns.Add(TipoMercado)
  65. dgvLETES.Columns.Add(Pais)
  66. dgvLETES.Columns.Add(Nombre)
  67. dgvLETES.Columns.Add(Periodicidad)
  68. dgvLETES.Columns.Add(TipoTasa)
  69. dgvLETES.Columns.Add(TipoRenta)
  70. dgvLETES.Columns.Add(Numero)
  71. End Sub
  72. Sub AgregarColumnasIns()
  73. Dim ValorNo, FechaOpe, FechaLiq, FechaVenc, PlazoInv, Casa, ComCasa, PorComCasa, ComBolsa, PorComBolsa, Periodicidad As New DataGridViewTextBoxColumn
  74. Dim Base, RendBruto, RendNeto, IngBruto, IngNeto, ValorTra, Precio, TotPagar As New DataGridViewTextBoxColumn
  75. ValorNo.Name = "Valor Nominal"
  76. FechaOpe.Name = "Fecha de Operacion"
  77. FechaLiq.Name = "Fecha de Liquidación"
  78. FechaVenc.Name = "Fecha de Vencimiento"
  79. PlazoInv.Name = "Plazo de Inversión"
  80. Casa.Name = "Casa Corredora"
  81. ComCasa.Name = "Comisión Casa"
  82. PorComCasa.Name = "Porcentaje Comisión Casa"
  83. ComBolsa.Name = "Comision Bolsa"
  84. PorComBolsa.Name = "Porcentaje Comisión Bolsa"
  85. Periodicidad.Name = "Periodicidad"
  86. Base.Name = "Dias Base"
  87. RendBruto.Name = "Rendimiento Bruto"
  88. RendNeto.Name = "Rendimiento Neto"
  89. IngBruto.Name = "Ingreso Bruto"
  90. IngNeto.Name = "Ingreso Neto"
  91. ValorTra.Name = "Valor Trasado"
  92. Precio.Name = "Precio"
  93. TotPagar.Name = "Total a Pagar"
  94. dgvLETES.Columns.Add(ValorNo)
  95. dgvLETES.Columns.Add(FechaOpe)
  96. dgvLETES.Columns.Add(FechaLiq)
  97. dgvLETES.Columns.Add(FechaVenc)
  98. dgvLETES.Columns.Add(PlazoInv)
  99. dgvLETES.Columns.Add(Casa)
  100. dgvLETES.Columns.Add(ComCasa)
  101. dgvLETES.Columns.Add(PorComCasa)
  102. dgvLETES.Columns.Add(ComBolsa)
  103. dgvLETES.Columns.Add(PorComBolsa)
  104. dgvLETES.Columns.Add(Periodicidad)
  105. dgvLETES.Columns.Add(Base)
  106. dgvLETES.Columns.Add(RendBruto)
  107. dgvLETES.Columns.Add(RendNeto)
  108. dgvLETES.Columns.Add(IngBruto)
  109. dgvLETES.Columns.Add(IngNeto)
  110. dgvLETES.Columns.Add(ValorTra)
  111. dgvLETES.Columns.Add(Precio)
  112. dgvLETES.Columns.Add(TotPagar)
  113. End Sub
  114. Sub Cargar(ByVal Cod As String, ByVal Inicio As Integer, ByVal Final As Integer)
  115. Dim CodigoEmpresa As String = " "
  116. Dim CodigoEmisor As String = " "
  117. Dim CodigoECal As String = " "
  118. Dim PlazoF As String = " "
  119. Dim TiposMercado As String = " "
  120. Dim Pais As String = " "
  121. Dim Periodos As String = " "
  122. Dim Periodos2 As String = " "
  123. Dim TipoTasa As String = " "
  124. Dim TipoRenta As String = " "
  125. Dim Estado As String = " "
  126. Dim CasasCorredoras As String = " "
  127. Dim codigo As String = Variables.Codigo
  128. Dim RendNeto As String = ""
  129. Dim Prec As String = ""
  130. Dim ValTrasado As String = ""
  131. Dim CCasa As String = ""
  132. Dim CBolsa As String = ""
  133. Dim IngBruto As String = ""
  134. Dim TotPagar As String = ""
  135. Dim IngNeto As String = ""
  136. Dim Instrumento As String = ""
  137. Dim dr
  138. If (CodigoInstrumento = "LETE") Then
  139. Instrumento = "LETES"
  140. ElseIf (CodigoInstrumento = "PBUR") Then
  141. Instrumento = "PAPEL BURSATIL"
  142. ElseIf ((CodigoInstrumento = "VCN")) Then
  143. Instrumento = "Valores Comerciales"
  144. End If
  145. If (CodigoInstrumento = "LETE") Then
  146. dr = RegistroConsulta.CargarInvLETE(Cod, Inicio, Final)
  147. ElseIf (CodigoInstrumento = "PBUR") Then
  148. dr = RegistroConsulta.CargarInvPBUR(Cod, Inicio, Final)
  149. ElseIf (CodigoInstrumento = "VCN") Then
  150. dr = RegistroConsulta.CargarInvVCN(Cod, Inicio, Final)
  151. End If
  152. While dr.Read
  153. Dim VRenBruto, VPlazo, VAnioBase, VValNom, VComisionCasa, VComisionBolsa
  154. VRenBruto = dr("RendBruto").ToString
  155. VPlazo = dr("Plazo").ToString
  156. VAnioBase = dr("AnioBase").ToString
  157. VValNom = dr("ValNom").ToString
  158. VComisionCasa = dr("ComisionCasa").ToString
  159. VComisionBolsa = dr("ComisionBolsa").ToString
  160. If (String.IsNullOrEmpty(VRenBruto)) Then
  161. VRenBruto = 0
  162. End If
  163. If (String.IsNullOrEmpty(VPlazo)) Then
  164. VPlazo = 0
  165. End If
  166. If (String.IsNullOrEmpty(VAnioBase)) Then
  167. VAnioBase = 365
  168. End If
  169. If (String.IsNullOrEmpty(VValNom)) Then
  170. VValNom = 0
  171. End If
  172. If (String.IsNullOrEmpty(VComisionCasa)) Then
  173. VComisionCasa = 0
  174. End If
  175. If (String.IsNullOrEmpty(VComisionBolsa)) Then
  176. VComisionBolsa = 0
  177. End If
  178. Prec = Precio(VRenBruto, VPlazo, VAnioBase)
  179. ValTrasado = ValorTrasado(VValNom, Prec)
  180. CCasa = ComisionCalculo(ValTrasado, VComisionCasa, VPlazo, VAnioBase)
  181. CBolsa = ComisionCalculo(ValTrasado, VComisionBolsa, VPlazo, VAnioBase)
  182. IngBruto = IngresoBruto(VValNom, ValTrasado)
  183. TotPagar = TotalPagar(ValTrasado, CCasa, CBolsa)
  184. IngNeto = IngresoNeto(VValNom, TotPagar)
  185. RendNeto = RendimientoNeto(VValNom, TotPagar, VPlazo, VAnioBase)
  186. For Each pair In CodEmpr
  187. If (pair.Key.ToString = dr("CodEmpr").ToString) Then
  188. CodigoEmpresa = pair.Value
  189. Exit For
  190. ElseIf (String.IsNullOrEmpty(dr("CodEmpr").ToString)) Then
  191. CodigoEmpresa = " ---- ---- ---- ---- "
  192. Exit For
  193. End If
  194. Next
  195. For Each pair In CodEmis
  196. If (pair.Key.ToString = dr("CodEmis").ToString) Then
  197. CodigoEmisor = pair.Value
  198. Exit For
  199. ElseIf (String.IsNullOrEmpty(dr("CodEmis").ToString)) Then
  200. CodigoEmisor = " ---- ---- ---- ---- "
  201. Exit For
  202. End If
  203. Next
  204. For Each pair In CodECalRi
  205. If (pair.Key.ToString = dr("CodECalRi").ToString) Then
  206. CodigoECal = pair.Value
  207. Exit For
  208. ElseIf (String.IsNullOrEmpty(dr("CodECalRi").ToString)) Then
  209. CodigoECal = " ---- ---- ---- ---- "
  210. Exit For
  211. End If
  212. Next
  213. For Each pair In ListaPlazo
  214. If (pair.Key.ToString = dr("PlazoFact").ToString) Then
  215. PlazoF = pair.Value
  216. Exit For
  217. ElseIf (String.IsNullOrEmpty(dr("PlazoFact").ToString)) Then
  218. PlazoF = " ---- ---- ---- ---- "
  219. Exit For
  220. End If
  221. Next
  222. For Each pair In ListaTiposMercado
  223. If (pair.Key.ToString = dr("TipoMerc").ToString) Then
  224. TiposMercado = pair.Value
  225. Exit For
  226. ElseIf (String.IsNullOrEmpty(dr("TipoMerc").ToString)) Then
  227. TiposMercado = " ---- ---- ---- ---- "
  228. Exit For
  229. End If
  230. Next
  231. For Each pair In CodPais
  232. If (pair.Key.ToString = dr("CodPais").ToString) Then
  233. Pais = pair.Value
  234. Exit For
  235. ElseIf (String.IsNullOrEmpty(dr("CodPais").ToString)) Then
  236. Pais = " ---- ---- ---- ---- "
  237. Exit For
  238. End If
  239. Next
  240. For Each pair In ListaPeriodos
  241. If (pair.Key.ToString = dr("Periodicidad").ToString) Then
  242. Periodos = pair.Value
  243. ElseIf (String.IsNullOrEmpty(dr("Periodicidad").ToString)) Then
  244. Periodos = " ---- ---- ---- ---- "
  245. End If
  246. If (pair.Key.ToString = dr("Periodic").ToString) Then
  247. Periodos2 = pair.Value
  248. ElseIf (String.IsNullOrEmpty(dr("Periodic").ToString)) Then
  249. Periodos2 = " ---- ---- ---- ---- "
  250. End If
  251. Next
  252. For Each pair In ListaTipoTasa
  253. If (pair.Key.ToString = dr("TipTasa").ToString) Then
  254. TipoTasa = pair.Value
  255. Exit For
  256. ElseIf (String.IsNullOrEmpty(dr("TipTasa").ToString)) Then
  257. TipoTasa = " ---- ---- ---- ---- "
  258. Exit For
  259. End If
  260. Next
  261. For Each pair In ListaTipoRenta
  262. If (pair.Key.ToString = dr("TipRenta").ToString) Then
  263. TipoRenta = pair.Value
  264. Exit For
  265. ElseIf (String.IsNullOrEmpty(dr("TipRenta").ToString)) Then
  266. TipoRenta = " ---- ---- ---- ---- "
  267. Exit For
  268. End If
  269. Next
  270. For Each pair In ListaEstado
  271. If (pair.Key.ToString = dr("DocEst").ToString) Then
  272. Estado = pair.Value
  273. Exit For
  274. ElseIf (String.IsNullOrEmpty(dr("DocEst").ToString)) Then
  275. Estado = " ---- ---- ---- ---- "
  276. Exit For
  277. End If
  278. Next
  279. For Each pair In ListaCasasCorredoras
  280. If (pair.Key.ToString = dr("CasasCorredoras").ToString) Then
  281. CasasCorredoras = pair.Value
  282. Exit For
  283. ElseIf (String.IsNullOrEmpty(dr("CasasCorredoras").ToString)) Then
  284. CasasCorredoras = " ---- ---- ---- ---- "
  285. Exit For
  286. End If
  287. Next
  288. 'dgvReportes.Rows.Add(dr("CodInv"), Estado, CodigoEmpresa, "Reportos", CodigoEmisor, dr("CodCalRi"), CodigoECal, dr("Plazo"), PlazoF, dr("FechaDoc"), TiposMercado, Pais, dr("NombreManIF"), Periodos, TipoTasa, TipoRenta, dr("NumManInv"), "", dr("Nombre"), dr("FCompra"), dr("ValTrans"), dr("Dias"), dr("FVenc"), dr("Rend"), ComisionCasa, ComisionBolsa, IOF, 0, TotalCostos, MontoLiq, InteresGenerar, dr("CostoTransfr"), RendimientoAntes, ValorRecompra, Renta, IngresoNeto, ValorNeto, RendimientoDespues, "", PorcentajeComisionCasa, PorcentajeComisionBolsa, PorcentajeComisionIOF)
  289. dgvLETES.Rows.Add(dr("CodInv"), Estado, CodigoEmpresa, Instrumento, CodigoEmisor, dr("CodCalRi"), CodigoECal, dr("Plazo"), PlazoF, dr("FechaDoc"), TiposMercado, Pais, dr("NombreManIF"), Periodos, TipoTasa, TipoRenta, dr("NumManInv"), dr("ValNom"), dr("FOper"), dr("FLiq"), dr("FVenc"), dr("Plazo"), CasasCorredoras, dr("ComisionCasa"), CCasa, dr("ComisionBolsa"), CBolsa, Periodos2, dr("AnioBase"), dr("RendBruto"), RendNeto, IngBruto, IngNeto, ValTrasado, Prec, TotPagar)
  290. End While
  291. End Sub
  292. Function ValorTrasado(ByVal ValorNominal As Double, ByVal Precio As Double)
  293. If (Double.TryParse(ValorNominal, Nothing) And Double.TryParse(Precio, Nothing)) Then
  294. Return CDec(ValorNominal) * CDec(Precio)
  295. End If
  296. Return Nothing
  297. End Function
  298. Function Precio(ByVal RendimientoBruto As Double, ByVal PlazoInversion As Double, ByVal AnioBase As Integer)
  299. If (Double.TryParse(RendimientoBruto, Nothing) And Double.TryParse(PlazoInversion, Nothing)) Then
  300. Dim DatosOperacion As Double
  301. If (AnioBase = 0) Then
  302. AnioBase = 365
  303. End If
  304. Dim Rendimiento = CDec(RendimientoBruto)
  305. Dim Plazo = CDec((PlazoInversion))
  306. DatosOperacion = (1 - (Rendimiento / (1 + Rendimiento * Plazo / AnioBase)) * Plazo / AnioBase)
  307. Return DatosOperacion
  308. End If
  309. Return Nothing
  310. End Function
  311. Function ComisionCalculo(ByVal ValorTras As Double, ByVal ComisionDeCasa As Double, ByVal PlazoInversion As Double, ByVal AnioBase As Integer)
  312. If (Double.TryParse(ValorTras, Nothing) And Double.TryParse(ComisionDeCasa, Nothing) And Double.TryParse(PlazoInversion, Nothing)) Then
  313. Dim comision = (CDec(ValorTras) * CDec(ComisionDeCasa)) * (CDec(PlazoInversion) / AnioBase)
  314. Return comision
  315. End If
  316. Return Nothing
  317. End Function
  318. Function RendimientoNeto(ByVal ValorNominal As Double, ByVal TotalPagar As Double, ByVal PlazoInversion As Integer, ByVal AnioBase As Integer)
  319. If (Double.TryParse(ValorNominal, Nothing) And Double.TryParse(TotalPagar, Nothing) And Double.TryParse(PlazoInversion, Nothing)) Then
  320. If CDec(TotalPagar) = 0 Or CDec(PlazoInversion) = 0 Then
  321. Return 0
  322. End If
  323. Dim RendimientoNet = ((CDec(ValorNominal) - CDec(TotalPagar)) / CDec(TotalPagar)) * (AnioBase / CDec(PlazoInversion))
  324. Return RendimientoNet
  325. End If
  326. Return Nothing
  327. End Function
  328. Function IngresoBruto(ByVal ValorNominal As Double, ByVal ValorTrasado As Double)
  329. If (Double.TryParse(ValorNominal, Nothing) And Double.TryParse(ValorTrasado, Nothing)) Then
  330. Dim Bruto = CDec(ValorNominal) - CDec(ValorTrasado)
  331. Return Bruto
  332. End If
  333. Return Nothing
  334. End Function
  335. Function IngresoNeto(ByVal ValorNominal As Double, ByVal TotalPagar As Double)
  336. If (Double.TryParse(ValorNominal, Nothing) And Double.TryParse(TotalPagar, Nothing)) Then
  337. Dim Neto = CDec(ValorNominal) - CDec(TotalPagar)
  338. Return Neto
  339. End If
  340. Return Nothing
  341. End Function
  342. Function TotalPagar(ByVal ValorTrasado As Double, ByVal ComisionCasa As Double, ByVal ComisionBolsa As Double)
  343. If (Double.TryParse(ValorTrasado, Nothing) And Double.TryParse(ComisionCasa, Nothing) And Double.TryParse(ComisionBolsa, Nothing)) Then
  344. Dim Total = CDec(ValorTrasado) + CDec(ComisionCasa) + CDec(ComisionBolsa)
  345. Return Total
  346. End If
  347. Return Nothing
  348. End Function
  349. Private Sub navSiguienteRegistro_Click(sender As Object, e As EventArgs)
  350. Direccion = "D"
  351. Mover(Direccion)
  352. ValorCambiado = False
  353. End Sub
  354. Sub Mover(ByVal Direccion As String)
  355. Dim ReferenciaD = txtPosicion.Text + 1
  356. Dim ReferenciaI = txtPosicion.Text - 1
  357. Dim Cantidad = txtConta.Text
  358. Dim ValorExacto = txtPosicion.Text
  359. Dim Inicio, Final As Integer
  360. If (Direccion = "D") Then
  361. If (Cantidad >= ValorExacto) Then
  362. dgvLETES.Rows.Clear()
  363. If (Not ValorCambiado) Then
  364. txtPosicion.Text = ReferenciaD
  365. ValorCambiado = False
  366. End If
  367. Inicio = txtPosicion.Text - 1
  368. Inicio = Inicio * 100
  369. Final = Inicio + 100
  370. Cargar(CodigoInstrumento, Inicio, Final)
  371. Else
  372. MsgBox("Rango Fuera de Valor")
  373. End If
  374. ElseIf (Direccion = "I") Then
  375. If (ReferenciaI >= 1) Then
  376. dgvLETES.Rows.Clear()
  377. If (Not ValorCambiado) Then
  378. If (Not ValorExacto = 1) Then
  379. txtPosicion.Text = ReferenciaI
  380. End If
  381. Else
  382. ValorCambiado = False
  383. End If
  384. Inicio = txtPosicion.Text - 1
  385. Inicio = Inicio * 100
  386. Final = Inicio + 100
  387. Cargar(CodigoInstrumento, Inicio, Final)
  388. Else
  389. MsgBox("Rango Fuera de Valor")
  390. End If
  391. ElseIf (Direccion = "SD") Then
  392. Final = txtConta.Text * 100
  393. Inicio = Final - 100
  394. dgvLETES.Rows.Clear()
  395. Cargar(CodigoInstrumento, Inicio, Final)
  396. txtPosicion.Text = Cantidad
  397. ElseIf (Direccion = "SI") Then
  398. Final = 100
  399. Inicio = Final - 100
  400. dgvLETES.Rows.Clear()
  401. Cargar(CodigoInstrumento, Inicio, Final)
  402. txtPosicion.Text = 1
  403. End If
  404. End Sub
  405. Private Sub navRegistroAnterior_Click(sender As Object, e As EventArgs) Handles navRegistroAnterior.Click
  406. Direccion = "I"
  407. Mover(Direccion)
  408. ValorCambiado = False
  409. End Sub
  410. Private Sub txtPosicion_TextChanged(sender As Object, e As EventArgs) Handles txtPosicion.TextChanged
  411. ValorCambiado = True
  412. End Sub
  413. Private Sub navUltimoRegistro_Click(sender As Object, e As EventArgs) Handles navUltimoRegistro.Click
  414. Direccion = "SD"
  415. Mover(Direccion)
  416. ValorCambiado = False
  417. End Sub
  418. Private Sub navPrimerRegistro_Click(sender As Object, e As EventArgs) Handles navPrimerRegistro.Click
  419. Direccion = "SI"
  420. Mover(Direccion)
  421. ValorCambiado = False
  422. End Sub
  423. Private Sub RichTextBox1_TextChanged(sender As Object, e As EventArgs)
  424. End Sub
  425. End Class