Control de Llamadas en C# para Call Center
Control de Llamadas en C# para Call Center
GUIA DE LABORATORIO:
PROGRAMACION MODULAR
JULIO - 2021
Página 1 de 42
Control de registro de llamadas
La empresa Business-Vent, que presta servicios de call center en la ciudad de Lima, realiza el seguimiento
de una cartera de clientes a las cuales se realizó la venta de tarjetas de crédito solicitado por una
determinada empresa. El call center necesita una aplicación que permita tener el control de las llamadas
que realizan sus terminalistas (operador de llamadas), de forma que registre el tipo de llamada realizada, el
horario y la cantidad de minutos. La aplicación deberá registrar las llamadas mostrando el costo por
minuto y el costo por llamada.
El descuento se aplica al importe calculado (costo por minuto por la cantidad de minutos llamados) según
el tipo de llamada.
El costo por llamada resulta de la diferencia del importe de pago y el descuento aplicado.
El botón REGISTRAR envía los datos de las llamadas a un control ListView que muestre el tipo de
llamada, horario de llamada, minutos y el costo por llamada.
Finalmente, mediante el botón mostrar las estadística como el número de llamadas registradas
entre 10 y 30 minutos, el costo acumulado por tipo local nacional e internacional, móvil nacional e
internacional, monto mayor según el costo de llamada, tipo de llamada con costo de llamada
mayor, horario con costo de llamada mayor en un control ListView.
Página 2 de 42
Formulario:
Página 3 de 42
Control Propiedad Valor
Label10 Text COSTO
Label11 (Name) lblCosto
Text lblCosto
Label12 Text REGISTRO DE LLAMADAS
TextBox1 (Name) txtNombre
TextBox2 (Name) txtMinutos
ComboBox1 (Name) cboTipo
Items Local Nacional, Local Internacional, Móvil Nacional, Móvil
Internacional
ComboBox2 (Name) cboHorario
Items Diurno (07:00-13:00), Tarde(13:00-19:00), Noche(19:00-23:00),
Madrugada(23:00-07:00)
Button1 (Name) btnRegistrar
Text REGISTRAR
Button2 (Name) btnEstadisticas
Text MOSTRAR ESTADISTICAS
Button3 (Name) btnNuevo
Text NUEVO
Button4 (Name) btnSalir
Text SALIR
GroupBox1 Text DATOS DEL TERMINALISTA
GroupBox2 Text DATOS DEL REGISTRO
GroupBox3 Text DATOS DE LAS LLAMADAS
ListView1 (Name) lvRegistro
GridLines True
ListView2 (Name) lvEstadisticas
GridLines True
Timer1 (Name) tHora
Página 4 de 42
Programa
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
namespace pjRegistroDeLlamadas
{
public partial class frmLlamadasCaso1 : Form
{
// Declaración de variables GLOBALES
string tipo;
string horario;
int minutos;
double costoMinuto;
double costoLlamada;
double mayorMonto;
string horarioMayor;
string tipoMayor;
// Contadores y acumuladores
int cLlamadas;
double aLocNac, aLocInt, aMovNac, aMovInt;
public frmLlamadas()
{
InitializeComponent();
[Link] = true;
}
Página 5 de 42
private void btnSalir_Click(object sender, EventArgs e)
{
DialogResult r = [Link]("¿Desea terminar la aplicación?",
"Control de llamadas",
[Link],[Link]);
if (r == [Link]) [Link]();
}
// Método que permite asignar el costo por minuto según el tipo de llamada
void asignaCostoxMinuto()
{
// Capturando el tipo de llamada desde el cuadro combinado
tipo = [Link];
// Método que permite mostrar los valores GLOBALES para las estadísticas
void imprimirEstadisticas()
{
// Contar el número de llamadas
numeroLlamadas();
Página 7 de 42
// Determinar el número de llamadas entre 10 y 30 minutos
void numeroLlamadas()
{
// Iniciar variable <-- WPB
int nReg = 0;
double minutos;
Página 9 de 42
Caso 2: Control de registro de llamadas: Método sin valor de retorno con parámetros
La empresa Bussiness-Vent, que presta servicios de call center en la ciudad de Lima, realiza el seguimiento
de una cartera de clientes a las cuales se realizó la venta de tarjetas de crédito solicitado por una
determinada empresa. El call center necesita una aplicación que permita tener el control de las llamadas
que realizan sus terminalistas (operador de llamadas), de forma que registre el tipo de llamada realizada, el
horario y la cantidad de minutos. La aplicación deberá registrar las llamadas mostrando el costo por
minuto y el costo por llamada.
El descuento se aplica al importe calculado (costo por minuto por la cantidad de minutos llamados) según
el tipo de llamada.
El costo por llamada resulta de la diferencia del importe de pago y el descuento aplicado.
El botón REGISTRAR envía los datos de las llamadas a un control ListView que muestre el tipo de
llamada, horario de llamada, minutos y el costo por llamada.
Finalmente, mediante el botón mostrar las estadística como el número de llamadas registradas
entre 10 y 30 minutos, el costo acumulado por tipo local nacional e internacional, móvil nacional e
internacional, monto mayor según el costo de llamada, tipo de llamada con costo de llamada
mayor, horario con costo de llamada mayor en un control ListView.
Página 10 de 42
Formulario:
Página 11 de 42
Control Propiedad Valor
Label10 Text COSTO
Label11 (Name) lblCosto
Text lblCosto
Label12 Text REGISTRO DE LLAMADAS
TextBox1 (Name) txtNombre
TextBox2 (Name) txtMinutos
ComboBox1 (Name) cboTipo
Items Local Nacional, Local Internacional, Móvil Nacional, Móvil
Internacional
ComboBox2 (Name) cboHorario
Items Diurno (07:00-13:00), Tarde(13:00-19:00), Noche(19:00-23:00),
Madrugada(23:00-07:00)
Button1 (Name) btnRegistrar
Text REGISTRAR
Button2 (Name) btnEstadisticas
Text MOSTRAR ESTADISTICAS
Button3 (Name) btnNuevo
Text NUEVO
Button4 (Name) btnSalir
Text SALIR
GroupBox1 Text DATOS DEL TERMINALISTA
GroupBox2 Text DATOS DEL REGISTRO
GroupBox3 Text DATOS DE LAS LLAMADAS
ListView1 (Name) lvRegistro
GridLines True
ListView2 (Name) lvEstadisticas
GridLines True
Timer1 (Name) tHora
Página 12 de 42
Programa
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
namespace pjRegistroDeLlamadas
{
public partial class frmLlamadasCaso2 : Form
{
// Declaracion de variables GLOBALES
double costoMinuto;
double costoLlamada;
public frmLlamadasCaso2()
{
InitializeComponent();
[Link] = true;
}
[Link]();
}
Página 13 de 42
private void btnEstadisticas_Click(object sender, EventArgs e)
{
// Determinar el numero de llamadas entre 10 y 30 minutos
int cLlamadas = 0;
for (int i = 0; i < [Link]; i++)
{
int minutos = [Link]([Link][i].SubItems[2].Text);
if (minutos >= 10 && minutos <= 30)
{
cLlamadas++;
}
}
Página 14 de 42
// Asignar el costo por llamada según el horario
void asignarCostoxLlamada(string horario, int minutos)
{
// Calculando el importe
double importe = costoMinuto * minutos;
Página 16 de 42
Caso3: Control de registro de llamadas: Método con valor de retorno sin parámetros
La empresa Bussiness-Vent, que presta servicios de call center en la ciudad de Lima, realiza el seguimiento
de una cartera de clientes a las cuales se realizó la venta de tarjetas de crédito solicitado por una
determinada empresa. El call center necesita una aplicación que permita tener el control de las llamadas
que realizan sus terminalistas (operador de llamadas), de forma que registre el tipo de llamada realizada, el
horario y la cantidad de minutos. La aplicación deberá registrar las llamadas mostrando el costo por
minuto y el costo por llamada.
El descuento se aplica al importe calculado (costo por minuto por la cantidad de minutos llamados) según
el tipo de llamada.
El costo por llamada resulta de la diferencia del importe de pago y el descuento aplicado.
El botón REGISTRAR envía los datos de las llamadas a un control ListView que muestre el tipo de
llamada, horario de llamada, minutos y el costo por llamada.
Finalmente, mediante el botón mostrar las estadística como el número de llamadas registradas
entre 10 y 30 minutos, el costo acumulado por tipo local nacional e internacional, móvil nacional e
internacional, monto mayor según el costo de llamada, tipo de llamada con costo de llamada
mayor, horario con costo de llamada mayor en un control ListView.
Página 17 de 42
Formulario:
Página 18 de 42
Control Propiedad Valor
Label10 Text COSTO
Label11 (Name) lblCosto
Text lblCosto
Label12 Text REGISTRO DE LLAMADAS
TextBox1 (Name) txtNombre
TextBox2 (Name) txtMinutos
ComboBox1 (Name) cboTipo
Items Local Nacional, Local Internacional, Móvil Nacional, Móvil
Internacional
ComboBox2 (Name) cboHorario
Items Diurno (07:00-13:00), Tarde(13:00-19:00), Noche(19:00-23:00),
Madrugada(23:00-07:00)
Button1 (Name) btnRegistrar
Text REGISTRAR
Button2 (Name) btnEstadisticas
Text MOSTRAR ESTADISTICAS
Button3 (Name) btnNuevo
Text NUEVO
Button4 (Name) btnSalir
Text SALIR
GroupBox1 Text DATOS DEL TERMINALISTA
GroupBox2 Text DATOS DEL REGISTRO
GroupBox3 Text DATOS DE LAS LLAMADAS
ListView1 (Name) lvRegistro
GridLines True
ListView2 (Name) lvEstadisticas
GridLines True
Timer1 (Name) tHora
Página 19 de 42
Programa
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
namespace pjRegistroDeLlamadas
{
public partial class frmLlamadasCaso3 : Form
{
public frmLlamadasCaso3()
{
InitializeComponent();
}
Página 20 de 42
elementosFila[0] = "Número de llamadas entre 10 y 30 minutos";
elementosFila[1] = numeroLlamadas().ToString();
row = new ListViewItem(elementosFila);
[Link](row);
string getHorario()
{
return [Link];
}
int getMinutos()
{
return [Link]([Link]);
}
Página 22 de 42
// Determinar el número de llamadas entre 10 y 30 minutos
int numeroLlamadas()
{
int cLlamadas = 0;
for (int i = 0; i < [Link]; i++)
{
int minutos = [Link]([Link][i].SubItems[2].Text);
if(minutos >= 10 && minutos<= 30) cLlamadas++;
}
return cLlamadas;
}
Página 23 de 42
Caso4: Control de registro de llamadas: Método con valor de retorno con parámetros
La empresa Bussiness-Vent, que presta servicios de call center en la ciudad de Lima, realiza el seguimiento
de una cartera de clientes a las cuales se realizó la venta de tarjetas de crédito solicitado por una
determinada empresa. El call center necesita una aplicación que permita tener el control de las llamadas
que realizan sus terminalistas (operador de llamadas), de forma que registre el tipo de llamada realizada, el
horario y la cantidad de minutos. La aplicación deberá registrar las llamadas mostrando el costo por
minuto y el costo por llamada.
El descuento se aplica al importe calculado (costo por minuto por la cantidad de minutos llamados) según
el tipo de llamada.
El costo por llamada resulta de la diferencia del importe de pago y el descuento aplicado.
El botón REGISTRAR envía los datos de las llamadas a un control ListView que muestre el tipo de
llamada, horario de llamada, minutos y el costo por llamada.
Finalmente, mediante el botón mostrar las estadística como el número de llamadas registradas
entre 10 y 30 minutos, el costo acumulado por tipo local nacional e internacional, móvil nacional e
internacional, monto mayor según el costo de llamada, tipo de llamada con costo de llamada
mayor, horario con costo de llamada mayor en un control ListView.
Página 24 de 42
Formulario:
Página 25 de 42
Control Propiedad Valor
Label10 Text COSTO
Label11 (Name) lblCosto
Text lblCosto
Label12 Text REGISTRO DE LLAMADAS
TextBox1 (Name) txtNombre
TextBox2 (Name) txtMinutos
ComboBox1 (Name) cboTipo
Items Local Nacional, Local Internacional, Móvil Nacional, Móvil
Internacional
ComboBox2 (Name) cboHorario
Items Diurno (07:00-13:00), Tarde(13:00-19:00), Noche(19:00-23:00),
Madrugada(23:00-07:00)
Button1 (Name) btnRegistrar
Text REGISTRAR
Button2 (Name) btnEstadisticas
Text MOSTRAR ESTADISTICAS
Button3 (Name) btnNuevo
Text NUEVO
Button4 (Name) btnSalir
Text SALIR
GroupBox1 Text DATOS DEL TERMINALISTA
GroupBox2 Text DATOS DEL REGISTRO
GroupBox3 Text DATOS DE LAS LLAMADAS
ListView1 (Name) lvRegistro
GridLines True
ListView2 (Name) lvEstadisticas
GridLines True
Timer1 (Name) tHora
Página 26 de 42
Programa
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
namespace pjRegistroDeLlamadas
{
public partial class frmLlamadasCaso4 : Form
{
public frmLlamadasCaso4()
{
InitializeComponent();
}
Página 27 de 42
else if (t == "Local Internacional")
aLocInt += [Link]([Link][i].SubItems[4].Text);
else if (t == "Movil Nacional")
aMovNac += [Link]([Link][i].SubItems[4].Text);
else if (t == "Movil Internacional")
aMovInt += [Link]([Link][i].SubItems[4].Text);
}
Página 28 de 42
elementosFila[0] = "Horario con mayor monto";
elementosFila[1] = [Link][posicion].SubItems[1].Text;
row = new ListViewItem(elementosFila);
[Link](row);
// Implementación de métodos
// Asignación de costo por minuto según el tipo
double asignarCostoxMinuto(string tipo)
{
double costoMinuto = 0;
switch (tipo)
{
case "Local Nacional": costoMinuto = 0.20; break;
case "Local Internacional": costoMinuto = 0.20; break;
case "Movil Nacional": costoMinuto = 0.20; break;
case "Movil Internacional": costoMinuto = 0.20; break;
}
return costoMinuto;
}
Página 29 de 42
// Asignar el costo por llamada segun el horario
double asignarCostoxLlamada(string horario)
{
double importe = asignarCostoxMinuto([Link]) * [Link]([Link]);
double descuento = 0;
switch (horario)
{
case "Diurno (07:00-13:00)": descuento = importe* 0.3; break;
case "Tarde(13:00-19:00)": descuento = importe* 0.2; break;
case "Noche(19:00-23:00)": descuento = importe* 0.1; break;
case "Madrugada(23:00-07:00)": descuento = importe * 0.3; break;
}
return importe - descuento;
}
}
}
Página 30 de 42
Caso5: Integración de Métodos – Control de pagos de empleados
Marketing SAC, es una empresa cooperativa de ahorro y crédito dedicada a brindar productos financieros y
contribuir con el crecimiento de sus clientes, en consecuencia, necesita una aplicación que permita
controlar el pago que realiza a sus empleados así como el monto por movilidad, asignación a favor por el
número de hijos, el descuento de ley y el neto que la empresa necesita pagar a sus empleados.
La asignación por concepto de movilidad se procesa de acuerdo al área y se aplica sobre el sueldo
base, como se muestra en la siguiente tabla:
Calcular el tiempo de servicio según la fecha de ingreso que se registra para un determinado
empleado.
Calcular una asignación adicional por la cantidad de hijos que registra el empleado, de forma que
por cada hijo se le aumente S/. 20.00.
Calcular un descuento del 17% sobre el sueldo base del empleado.
Calcular el monto neto que recibe el empleado, de acuerdo al sueldo base, asignación de movilidad,
asignación por número de hijos y descuento, usando la siguiente formula:
Validar el nombre del empleado de forma que no permita registrar el mismo empleado en la lista
de empleados.
Implementar el botón Consulta 1 que permita determinar el total de empleados por área.
Implementar el botón Consulta 2 que permita determinar el monto acumulado de los netos según
la condición del empleado.
Página 31 de 42
Implementar el botón Consulta 3 que permita determinar el el monto acumulado de los netos
según el área.
Finalmente validar los valores del formulario de forma que al registrar a un empleado no permita
registrar espacios vacíos en el nombre del empleado, determinar que el número de hijos,
determinar que el área y la condición sean seleccionados par aun determinado empleado.
Formulario:
Página 32 de 42
Control Propiedad Valor
ComboBox1 (Name) cboArea
Items Ventas, Marketing, Logística, Préstamo
ComboBox2 (Name) cboCondicion
Items Personal, Comisión
Button1 (Name) btnRegistrar
Text REGISTRAR
Button2 (Name) btnConsulta1
Text CONSULTA 1
Button3 (Name) btnConsulta2
Text CONSULTA 2
Button4 (Name) btnConsulta3
Text CONSULTA 3
Button5 (Name) btnSalir
Text SALIR
GroupBox1 Text DATOS DEL EMPLEADO
GroupBox2 Text DATOS PLANILLA
ListView1 (Name) lvEmpleado
GridLines True
ListView2 (Name) lvEstadisticas
GridLines True
Programa
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
namespace pjRegistroDeLlamadas
{
public partial class frmIntMetodosCaso5 : Form
{
public frmIntMetodosCaso5()
{
InitializeComponent();
}
Página 33 de 42
private void frmIntMetdosCaso5_Load(object sender, EventArgs e)
{
// Realizando cálculos
int años = calcularTiempoDeServicio();
double sueldoBase = asignarSueldoBase(area, condicion);
double movilidad = calcularMovilidad(sueldoBase);
double asignacion = calcularAsignacion(hijos);
double descuento = calcularDescuento(sueldoBase);
double neto = calcularNeto(sueldoBase, movilidad, asignacion,
descuento);
// Imprimir en la lista
imprimir(años, sueldoBase, movilidad, asignacion, descuento, neto);
}
else
{
[Link]("El empleado ya se encuentra registrado", "Alerta:");
return;
}
}
else
{
[Link]("El error se encuentra en " + valida(),"Alerta: ",
[Link], [Link]);
}
}
[Link]();
string[] elementosFila = new string[2];
ListViewItem row;
Página 34 de 42
elementosFila[0] = "Total de Personal del area de Logística";
elementosFila[1] = [Link]("0.00");
row = new ListViewItem(elementosFila);
[Link](row);
[Link]();
string[] elementosFila = new string[2];
ListViewItem row;
[Link]();
string[] elementosFila = new string[2];
ListViewItem row;
Página 35 de 42
private void btnSalir_Click(object sender, EventArgs e)
{
DialogResult r = [Link]("¿Está seguro de salir de la
aplicación?","Planila", [Link],[Link]);
if (r == [Link]) [Link]();
}
int getHijos()
{
return [Link]([Link]);
}
string getArea()
{
return [Link];
}
string getCondicion()
{
return [Link];
}
DateTime getFecha()
{
return [Link];
}
Página 36 de 42
// 2.- Calcular Años de servicio
int calcularTiempoDeServicio()
{
return [Link] - getFecha().Year;
}
Página 37 de 42
// 7.- Método para imprimir
void imprimir(int tiempo, double sueldoBase, double movilidad,
double asignacion, double descuento, double neto)
{
ListViewItem fila = new ListViewItem(getEmpleado());
[Link](getHijos().ToString());
[Link](getArea());
[Link](getCondicion());
[Link]([Link]());
[Link]([Link]("0.00"));
[Link]([Link]("0.00"));
[Link]([Link]("0.00"));
[Link]([Link]("0.00"));
[Link]([Link]("0.00"));
[Link](fila);
}
Página 38 de 42
// CONSULTA 3: Monto acumulado de netos por área
public void montoAcumuladoxArea()
{
aVentas = 0;
aMarketing = 0;
aLogistica = 0;
aPrestamo = 0;
Página 39 de 42
else if ([Link]==-1)
{
[Link]();
return "Condición del empleado";
}
return "";
}
}
}
Revisar literatura como configurar un objeto menuStrip que sirve para crear una barra de menú contenido
en un formulario.
Página 40 de 42
Programa
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
namespace pjRegistroDeLlamadas
{
public partial class frmMenuPrincipalProgModular : Form
{
public frmMenuPrincipalProgModular()
{
InitializeComponent();
}
Página 41 de 42
private void mnuAcerdaDe_Click(object sender, EventArgs e)
{
frmAcercaDe frmCaso = new frmAcercaDe();
[Link] = this;
[Link]();
}
}
}
Página 42 de 42