ejemplo de tellcell usando linq
C sharp
1.802 visualizaciones desde el 27 de Junio del 2018
veremos un ejemplo sobre contratos para teléfonos usando herencias y linq.
//padre
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BibliotecaTeleCell
{
/// <summary>
/// Represneta la información de un Contrato Base de Telefonía Móvil
/// </summary>
public class ContratoBase
{
#region Campos privados
private int _numero;
private DateTime _fechaContrato;
private string _nombreTitular;
#endregion
#region Propiedades
/// <summary>
/// Retorna o asigna el número de la línea
/// </summary>
public int Numero
{
get { return _numero; }
set
{
/* Extrae primer caracter */
char digito = value.ToString()[0];
/* Valida que este dentro de los carcateres esperados */
switch (digito)
{
case '6':
case '7':
case '8':
case '9':
_numero = value;
break;
default:
throw new ArgumentException("Número debe iniciar con 6, 7, 8 O 9");
}
}
}
/// <summary>
/// Retorna o asigna la fecha del contrato
/// </summary>
public DateTime FechaContrato
{
get { return _fechaContrato; }
set {
if (value > DateTime.Now)
{
throw new ArgumentException("Fecha de Contrato no puede ser mayor a la fecha actual");
}
else
{
_fechaContrato = value;
}
}
}
/// <summary>
/// Retorna o asigna el nombre del cliente titular
/// </summary>
public string NombreTitular
{
get { return _nombreTitular; }
set {
if (string.IsNullOrEmpty(value))
{
throw new ArgumentException("Nombre no puede estar vacío");
}
else
{
_nombreTitular = value;
}
}
}
/// <summary>
/// Retorna o asigna indicador si cuenta con equipo propio
/// </summary>
public bool EquipoPropio { get; set; }
/// <summary>
/// Retorna o asigna el tipo de contrato.
/// </summary>
public TipoContrato Tipo { get; set; }
#endregion
/// <summary>
/// Constructor por defecto
/// </summary>
public ContratoBase()
{
this.Init();
}
/// <summary>
/// Inicializa campos y propiedades
/// </summary>
private void Init()
{
_numero = 0;
_fechaContrato = DateTime.Now;
_nombreTitular = string.Empty;
EquipoPropio = false;
Tipo = TipoContrato.Postpago;
}
/// <summary>
/// Calcula el precio del contrato base
/// </summary>
/// <returns></returns>
public int PrecioContrato()
{
int precio = 2990; /* Precio base de habilitación */
/* Agrega un recargo base si no tiene equipo propio */
if (!EquipoPropio)
{
switch (Tipo)
{
case TipoContrato.Postpago:
precio += 990;
break;
case TipoContrato.Prepago:
precio += 1990;
break;
}
}
return precio;
}
}
}
//hija1
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BibliotecaTeleCell
{
public class PostPago : ContratoBase
{
/// <summary>
/// Retorna o asigna el tipo de contrato postpago
/// </summary>
public ContratoPostpago Contrato { get; set; }
/// <summary>
/// Retorna el precio en base al contrato
/// </summary>
public int Precio
{
get
{
int precio = 0;
switch (Contrato)
{
case ContratoPostpago.MultimediaSocial:
precio = 19990;
break;
case ContratoPostpago.MultimediaFull:
precio = 25990;
break;
case ContratoPostpago.MultimediaLTE:
precio = 29990;
break;
}
return precio;
}
}
/// <summary>
/// Retorna los MB de navegación en base al contrato
/// </summary>
public int MBInternet
{
get
{
int mb = 0;
switch (Contrato)
{
case ContratoPostpago.MultimediaSocial:
mb = 1200;
break;
case ContratoPostpago.MultimediaFull:
mb = 1800;
break;
case ContratoPostpago.MultimediaLTE:
mb = 2400;
break;
}
return mb;
}
}
/// <summary>
/// Retorna los minutos de conversación en base al contrato
/// </summary>
public int Minutos
{
get
{
int min = 0;
switch (Contrato)
{
case ContratoPostpago.MultimediaSocial:
min = 150;
break;
case ContratoPostpago.MultimediaFull:
min = 250;
break;
case ContratoPostpago.MultimediaLTE:
min = 500;
break;
}
return min;
}
}
/// <summary>
/// Retorna la cantiadad de SMS en base al contrato
/// </summary>
public int SMS
{
get
{
int sms = 0;
switch (Contrato)
{
case ContratoPostpago.MultimediaSocial:
sms = 100;
break;
case ContratoPostpago.MultimediaFull:
case ContratoPostpago.MultimediaLTE:
sms = 500;
break;
}
return sms;
}
}
/// <summary>
/// Retorna el valor por minuto de voz adicional en base al contrato
/// </summary>
public int MinutoAdicional
{
get
{
int min = 0;
switch (Contrato)
{
case ContratoPostpago.MultimediaSocial:
min = 100;
break;
case ContratoPostpago.MultimediaFull:
min = 70;
break;
case ContratoPostpago.MultimediaLTE:
min = 60;
break;
}
return min;
}
}
/// <summary>
/// Retorna el valor por SMS adicional en base al contrato
/// </summary>
public int SMSAdicional
{
get
{
return 50;
}
}
/// <summary>
/// Retorna el valor por MB de navegación adicional en base al contrato
/// </summary>
public int MBAdicional
{
get
{
return 60;
}
}
/// <summary>
/// Constructor por defecto
/// </summary>
public PostPago()
{
this.Init();
}
/// <summary>
/// Inicializa campos y propiedades
/// </summary>
private void Init()
{
Contrato = ContratoPostpago.MultimediaFull;
}
/// <summary>
/// Calcula el precio del contrato postpago
/// </summary>
/// <returns></returns>
public new int PrecioContrato()
{
int precio = base.PrecioContrato(); /* Precio base de habilitación */
precio += Precio; /* Precio por contrato postpago */
return precio;
}
}
}
//Hija2
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BibliotecaTeleCell
{
public class PrePago: ContratoBase
{
/// <summary>
/// Retorna o asigna el tipo de contrato prepago
/// </summary>
public ContratoPrepago Contrato { get; set; }
/// <summary>
/// Retorna el valor por minuto de voz en base al contrato
/// </summary>
public int ValorMinuto
{
get
{
int min = 0;
switch (Contrato)
{
case ContratoPrepago.MovilSocial:
min = 70;
break;
case ContratoPrepago.MovilInternet:
min = 60;
break;
}
return min;
}
}
/// <summary>
/// Retorna el valor por SMS adicional en base al contrato
/// </summary>
public int ValorSMS
{
get
{
int sms = 0;
switch (Contrato)
{
case ContratoPrepago.MovilSocial:
sms = 60;
break;
case ContratoPrepago.MovilInternet:
sms = 50;
break;
}
return sms;
}
}
/// <summary>
/// Retorna el valor por MB de navegación adicional en base al contrato
/// </summary>
public int ValorMB
{
get
{
return 60;
}
}
/// <summary>
/// constructor por defecto
/// </summary>
public PrePago()
{
this.Init();
}
/// <summary>
/// Inicializa campos y propiedades
/// </summary>
private void Init()
{
Contrato = ContratoPrepago.MovilSocial;
}
/// <summary>
/// Calcula el precio del contrato postpago
/// </summary>
/// <returns></returns>
public new int PrecioContrato()
{
int precio = base.PrecioContrato(); /* Precio base de habilitación */
return precio;
}
}
}
//enum
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BibliotecaTeleCell
{
/// <summary>
/// Representa los Tipos de Contrato Móvil
/// </summary>
public enum TipoContrato
{
Postpago = 0, Prepago = 1
}
/// <summary>
/// Representa los tipos de contrato postpago
/// </summary>
public enum ContratoPostpago
{
MultimediaSocial = 0, MultimediaFull = 1, MultimediaLTE = 2
}
/// <summary>
/// Representa los tipos de contrato prepago
/// </summary>
public enum ContratoPrepago
{
MovilSocial = 0, MovilInternet = 1
}
}
//linq
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BibliotecaTeleCell
{
/// <summary>
/// Representa la colección de contratos
/// </summary>
public class ContratoCollection: List<ContratoBase>
{
public int ContarPorTipoContrato(TipoContrato tipo)
{
return this.Count(c => c.Tipo == tipo);
}
public List<int> ObtenerNumerosEquipoPropio()
{
return this.Where(c => c.EquipoPropio).Select(c => c.Numero).ToList<int>();
}
public List<string> ObtenerNombresPorFecha(DateTime inicio, DateTime termino)
{
return this.Where(c => c.FechaContrato >= inicio && c.FechaContrato <= termino).Select(c => c.NombreTitular).ToList<string>();
}
public double PrecioPromedioPostPago()
{
return this.Where(c => c.Tipo == TipoContrato.Postpago).Average(c => ((PostPago)c).PrecioContrato());
}
public List<DateTime> FechasPostPagoMenorValor()
{
int menor = this.Where(c => (c is PostPago)).Min(c => ((PostPago)c).PrecioContrato());
return this.Where(c => (c is PostPago) && ((PostPago)c).PrecioContrato() == menor).Select(c => c.FechaContrato).ToList<DateTime>();
}
}
}
//wpf
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
/* Add's */
using BibliotecaTeleCell;
namespace TeleCellWPF
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private ContratoCollection contratos = new ContratoCollection();
#region Datos de Ejemplo
private string[] nombres = { "SOFIA" ,"VALENTINA" ,"ISIDORA" ,"ANTONIA" ,"EMILIA"
,"CATALINA" ,"FERNANDA" ,"CONSTANZA" ,"JAVIERA" ,"MARIA"
,"FRANCISCA" ,"AGUSTINA" ,"AMANDA" ,"CAMILA" ,"MONSERRAT"
,"BENJAMIN" ,"VICENTE" ,"MARTIN" ,"MATIAS" ,"JOAQUIN"
,"AGUSTIN" ,"CRISTOBAL" ,"MAXIMILIANO" ,"SEBASTIAN" ,"TOMAS"
,"DIEGO" ,"JOSE" ,"NICOLAS" ,"FELIPE" ,"ALONSO"};
private string[] apellidos = { "SOTO" , "CONTRERAS" , "SILVA" , "SEPÚLVEDA" , "MARTÍNEZ"
,"MORALES" , "RODRÍGUEZ" , "LÓPEZ" , "FUENTES" , "ARAYA"
,"TORRES" , "HERNÁNDEZ" , "FLORES" , "ESPINOZA" , "VALENZUELA"
,"CASTILLO" , "RAMÍREZ" , "REYES" , "GUTIÉRREZ" , "CASTRO"
,"VARGAS" , "ÁLVAREZ" , "VÁSQUEZ" , "FERNÁNDEZ" , "TAPIA"
,"SÁNCHEZ" , "GÓMEZ" , "HERRERA" , "CARRASCO" , "CORTÉS"
,"NÚÑEZ" , "JARA" , "VERGARA" , "RIVERA" , "FIGUEROA"
,"RIQUELME" , "GARCÍA" , "BRAVO" , "MIRANDA" , "VERA"
,"MOLINA" , "VEGA" , "CAMPOS" , "OLIVARES" , "ZÚÑIGA"
,"ORELLANA" , "GALLARDO" , "ALARCÓN" , "ORTIZ" , "GARRIDO"
,"SALAZAR" , "HENRÍQUEZ" , "AGUILERA", "SAAVEDRA" , "PIZARRO"
,"GUZMÁN" ,"NAVARRO" , "ARAVENA" , "PARRA" , "ROMERO"
,"CÁCERES" , "GODOY" , "PEÑA" , "LEIVA" , "ESCOBAR" };
#endregion
public MainWindow()
{
InitializeComponent();
CargaContratos();
}
/// <summary>
/// Carga Contratos d ejemplo para la estadistica
/// </summary>
private void CargaContratos()
{
Random rnd = new Random();
for (int i = 0; i < 15; i++)
{
ContratoBase contrato = null;
TipoContrato tipo = (TipoContrato)(rnd.Next(0, 50) % 2);
/* Asigna Plan */
switch (tipo)
{
case TipoContrato.Postpago:
PostPago post = new PostPago();
post.Contrato = (ContratoPostpago)rnd.Next(0, 2);
contrato = post;
break;
case TipoContrato.Prepago:
PrePago pre = new PrePago();
pre.Contrato = (ContratoPrepago)rnd.Next(0, 1);
contrato = pre;
break;
}
contrato.Tipo = tipo;
contrato.Numero = (rnd.Next(6, 9) * 10000000) + (rnd.Next(0, 10000000));
contrato.FechaContrato = DateTime.Now.AddDays(rnd.Next(1, 15) * (-1));
contrato.NombreTitular = string.Format("{0} {1}", nombres[rnd.Next(0, 29)], apellidos[rnd.Next(0, 64)]);
contrato.EquipoPropio = (rnd.Next(0, 50) % 2 == 0);
contratos.Add(contrato);
}
dgRegistro.ItemsSource = contratos;
}
private void btnContarTipo_Click(object sender, RoutedEventArgs e)
{
txtPostPago.Text = contratos.ContarPorTipoContrato(TipoContrato.Postpago).ToString();
txtPrePago.Text = contratos.ContarPorTipoContrato(TipoContrato.Prepago).ToString();
}
private void btnEquipoPropio_Click(object sender, RoutedEventArgs e)
{
lstEquipoPropio.ItemsSource = contratos.ObtenerNumerosEquipoPropio();
}
private void btnNombres_Click(object sender, RoutedEventArgs e)
{
if ((dpInicio.SelectedDate != null) && (dpTermino.SelectedDate != null))
{
if (dpInicio.SelectedDate <= dpTermino.SelectedDate)
{
DateTime aux = (DateTime)dpInicio.SelectedDate;
DateTime inicio = new DateTime(aux.Year, aux.Month, aux.Day, 0, 0, 0);
aux = (DateTime)dpTermino.SelectedDate;
DateTime termino = new DateTime(aux.Year, aux.Month, aux.Day, 23, 59, 59);
lstNombres.ItemsSource = contratos.ObtenerNombresPorFecha(inicio, termino);
}
else
{
MessageBox.Show("Fecha de inicio debes ser menor o igual a fecha de termino");
}
}
else
{
MessageBox.Show("Debe seleccionar las fechas del rango");
}
}
private void btnMenorValor_Click(object sender, RoutedEventArgs e)
{
lstMenorValor.ItemsSource = contratos.FechasPostPagoMenorValor();
}
}
}
Comentarios sobre la versión: 0.9 (0)
No hay comentarios