2. MARCO METODOLÓGICO
3.3 DESARROLLO DE LA PROPUESTA
3.3.4 DESARROLLO
3.3.4.3 Desarrollo Aplicación Móvil
Adquirir una cuenta de desarrollador
Aunque no es necesario tener una cuenta de desarrollador para descargar el SDK y empezar a desarrollar aplicaciones, la cuenta de desarrollador es necesaria para desbloquear nuestro terminal móvil y para publicar nuestras apps en el Store de Windows Phone.
Registrar un teléfono para el desarrollo con Windows Phone
Para que podamos desplegar nuestras aplicaciones Windows Phone en nuestro propio teléfono, tenemos que registrarlo como un dispositivo de desarrollo. Es un proceso que sólo se realiza una vez por teléfono y resulta bastante sencillo.
El SDK de Windows Phone nos provee una aplicación para registrar nuestro terminal. Buscamos Developer Phone Registration en nuestro PC y lo ejecutamos. Nos pedirá que conectemos el teléfono vía USB y las credenciales de nuestra cuenta Microsoft (la asociada a nuestra cuenta de desarrollador).
Figura 62.- Developer Phone Registration
Fuente: http://blogtechdencias.azurewebsites.net/blog/2013/03/17/introduccion-al-desarrollo-de-aplicaciones-en- windows-phone-8/
Diseño de Interfaces
Se ha diseñado una interfaz que muestra las categorías de Productos y Medicamentos de Productos de Venta Libre. En las cuales los usuarios o clientes podrán navegar accediendo a cada una de ellas obteniendo información necesaria sobre el producto deseado además de poder adquirirlo.
Figura 63.- Interfaz Categoría de Productos Fuente: Autora
Para el diseño de la interfaz se ha utilizado código Xml y sus diferentes componentes para el mismo como son Botones, cuadros de texto, etiquetas cada uno de ellos con sus atributos.
<Grid Margin="0,66,-3,30" Name="mnu_principal"
Visibility="Visible"> <ScrollViewer>
<Grid>
<Button x:Name="btnNutricionInfantil"
Content="" HorizontalAlignment="Left"
VerticalAlignment="Top" Width="158" Height="155"
Background="#FFE7008A"
Click="btnNutricionInfantil_Click"
BorderBrush="{x:Null}"/>
<TextBlock HorizontalAlignment="Left"
Se ha creado 9 botones para cada una de las categorías del menú principal en el cual se define borde, tamaño, alineación, etc.
Margin="17,113,0,0" TextWrapping="Wrap"
Text="Nutrición Infantil" VerticalAlignment="Top"
Foreground="White" Width="125" FontSize="16"
Height="25" TextAlignment="Center"/>
<Image x:Name="imNutricionInfantil"
HorizontalAlignment="Left" Height="100"
Margin="28,13,0,0" VerticalAlignment="Top"
Width="100" Source="/Iconos/MenuPrincipal/NInfantil.png" Stretch="UniformToFill" Tap="imNutricionInfantil_Tap"/> </Grid> </ScrollViewer> </Grid>
etiquetas cada uno de los botones de las categorías del menú principal en el cual se define tipo de letra, texto, tamaño de letra, alineación, etc.
Se ha creado 9 imágenes representativas en cada uno de los botones de las categorías del menú principal en el cual se define la fuente de la imagen, márgenes, tamaño, etc.
Los clientes podrán navegar a través de todos los productos y medicamentos de venta libre en cada una de las categorías, para lo cual primero se realizar una verificación de la conexión del Teléfono a Internet para poder tener acceso a la base de datos y extraer los datos. public MainPage() { InitializeComponent(); try { if
(Microsoft.Phone.Net.NetworkInformation.DeviceNetworkInformation.IsNetworkAvailable) _Carga_Todos_Productos();
else
MessageBox.Show("Lo sentimos no podemos conectarnos a internet, Verifique su conexión");
}
catch (Exception _E) {
MessageBox.Show(_E.Message.ToString()); }
tmr.Interval = TimeSpan.FromSeconds(_tiempo); tmr.Tick += VerificaOption;
tmr.Start(); }
Luego de realizar la comprobación de tener acceso a Internet se podrán cargar los datos desde la base de datos al formulario. A continuación una de las interfaces en la categoría Salud Digestiva de la Aplicación
Figura 64.- Interfaz Productos y Medicamentos Fuente: Autora
void _Carga_Todos_Productos() {
Service_Farmacia.Service1Client _productos = new Service_Farmacia.Service1Client(); _productos._ListadoMercadoTodosAsync();
_productos._ListadoMercadoTodosCompleted += _productos__ListadoMercadoTodosCompleted; }
void _productos__ListadoMercadoTodosCompleted(object sender, Service_Farmacia._ListadoMercadoTodosCompletedEventArgs e) {
MainPage._ProductosTodos = newstring[int.Parse(e.Result[0][0].ToString()), 11]; _cantidad_Producto = int.Parse(e.Result[0][0].ToString());
MainPage._codigos_Producto_Cesta = newint[int.Parse(e.Result[0][0].ToString()), 2]; _ProductosBusqueda = newstring[int.Parse(e.Result[0][0].ToString()), 11];
for (int i = 0; i < int.Parse(e.Result[0][0].ToString()); i++) {
_ProductosTodos[i, 0] = e.Result[i + 1][0].ToString(); // p_id
_ProductosTodos[i, 1] = e.Result[i + 1][1].ToString(); //p_codigo
_ProductosTodos[i, 2] = e.Result[i + 1][2].ToString(); //p_nombre
_ProductosTodos[i, 3] = e.Result[i + 1][3].ToString(); //p_foto
_ProductosTodos[i, 4] = e.Result[i + 1][4].ToString(); //p_precio
_ProductosTodos[i, 5] = e.Result[i + 1][5].ToString(); //p_descripcion
_ProductosTodos[i, 6] = e.Result[i + 1][6].ToString(); //p_uso
_ProductosTodos[i, 7] = e.Result[i + 1][7].ToString(); //p_ingrediente
_ProductosTodos[i, 8] = e.Result[i + 1][8].ToString(); //p_stock
_ProductosTodos[i, 9] = e.Result[i + 1][9].ToString(); //tipo
}
_LLenaDatosProducto(); }
privatevoid _buscaCadena() {
Button _bt = newButton(); int i = 0;
for (int j = 0; j < _cantidad_Producto; j++) {
if (_ProductosTodos[j, 2].Contains(txt_buscar.Text)) {
string[] _producto = newstring[10];
_ProductosBusqueda[i, 0] = _producto[0] = _ProductosTodos[j, 0]; // p_id
_ProductosBusqueda[i, 1] = _producto[1] = _ProductosTodos[j, 1]; //p_codigo
_ProductosBusqueda[i, 2] = _producto[2] = _ProductosTodos[j, 2]; //p_nombre
_ProductosBusqueda[i, 3] = _producto[3] = _ProductosTodos[j, 3]; //p_foto
_ProductosBusqueda[i, 4] = _producto[4] = _ProductosTodos[j, 4]; //p_precio
_ProductosBusqueda[i, 5] = _producto[5] = _ProductosTodos[j, 5]; //p_descripcion
_ProductosBusqueda[i, 6] = _producto[6] = _ProductosTodos[j, 6]; //p_uso
_ProductosBusqueda[i, 7] = _producto[7] = _ProductosTodos[j, 7]; //p_ingrediente
_ProductosBusqueda[i, 8] = _producto[8] = _ProductosTodos[j, 8]; //p_stock
_ProductosBusqueda[i, 9] = _producto[9] = _ProductosTodos[j, 9]; //tipo
if (i == 0)
_LlenaTextBlock(im1, title1, desc1, cost1, _producto, iva1, rec1, _bt, rbd1); if (i == 1)
_LlenaTextBlock(im2, title2, desc2, cost2, _producto, iva2, rec2, _bt, rbd2); if (i == 2)
_LlenaTextBlock(im3, title3, desc3, cost3, _producto, iva3, rec3, _bt, rbd3); if (i == 3)
_LlenaTextBlock(im4, title4, desc4, cost4, _producto, iva4, rec4, _bt, rbd4); if (i == 4)
_LlenaTextBlock(im5, title5, desc5, cost5, _producto, iva5, rec5, _bt, rbd5); if (i == 5)
_LlenaTextBlock(im6, title6, desc6, cost6, _producto, iva6, rec6, _bt, rbd6); if (i == 6)
_LlenaTextBlock(im7, title7, desc7, cost7, _producto, iva7, rec7, _bt, rbd7); if (i == 7)
_LlenaTextBlock(im8, title8, desc8, cost8, _producto, iva8, rec8, _bt, rbd8); if (i == 8)
_LlenaTextBlock(im9, title9, desc9, cost9, _producto, iva9, rec9, _bt, rbd9); if (i == 9)
_LlenaTextBlock(im10, title10, desc10, cost10, _producto, iva10, rec10, _bt, rbd10); i++;
} } }
void _LlenaTextBlock(Image imagen, TextBlock titulo, TextBlock descripcion, TextBlock precio,
string[] _val, TextBlock iva2, Rectangle rec2, Button bt, RadioButton rd) {
string _id_producto = _val[0]; string _p_codigo = _val[1]; string _p_nombre = _val[2]; string _p_foto = _val[3]; string _p_precio = _val[4]; string _p_descripcion = _val[5]; string _p_uso = _val[6];
string _p_ingrediente = _val[7]; string _p_stock = _val[8]; string _p_tipo_prodcto = _val[9];
imagen.Visibility = System.Windows.Visibility.Visible; titulo.Visibility = System.Windows.Visibility.Visible; descripcion.Visibility = System.Windows.Visibility.Visible; precio.Visibility = System.Windows.Visibility.Visible; iva2.Visibility = System.Windows.Visibility.Visible; rec2.Visibility = System.Windows.Visibility.Visible; rd.Visibility = System.Windows.Visibility.Visible; bt.Visibility = System.Windows.Visibility.Visible; try
{
BitmapImage _imagen1 = new BitmapImage(new Uri(_p_foto, UriKind.Absolute)); // cambiara a absolut0 imagen.Source = _imagen1; } catch { } titulo.Text = _p_nombre; descripcion.Text = _p_descripcion; precio.Text = _p_precio; }
Cada uno de los productos contiene información como Nombre, Descripción, Uso e Ingredientes; información que podrá tener acceso el usuario desde el lugar en el que se
encuentre pulsando en el botón .
privatevoid detalle1_Click(object sender, RoutedEventArgs e) {
_Detalle_Producto(0); }
privatevoid _Detalle_Producto(int i) {
CCabello._id_p = int.Parse(_Productos[i, 0]); CCabello._titulo = _Productos[i, 2];
CCabello._descripcion = "NOMBRE: " + _Productos[i, 2] + "\n\n\r" + "DESCRIPCIÓN: " + _Productos[i, 5] + "\n\n\r" + "USO: " + _Productos[i, 6] + "\n\n\r" + "INGREDIENTES: " + _Productos[i, 7];
NavigationService.Navigate(new Uri("/Pantallas/DescripcionProducto.xaml",
UriKind.Relative)); }
Figura 65.- Interfaz Detalle de Productos Fuente.- Autora
El usuario podrá solamente acceder a la información o realizar el pedido del producto pulsando en el botón añadir luego de seleccionar el producto y la cantidad requerida.
Figura 66.- Interfaz Agregar Productos Fuente.- Autora
privatevoid abagregar_Click(object sender, EventArgs e) {
_Asigna_a_Cesta() }
void _Asigna_a_Cesta() { string _mensaje = ""; string _codigo = ""; if (rbd1.IsChecked == true) { _mensaje = _Productos[0, 2]; _codigo = _Productos[0, 0]; } if (rbd2.IsChecked == true) { _mensaje = _Productos[1, 2]; _codigo = _Productos[1, 0]; } if (rbd3.IsChecked == true) { _mensaje = _Productos[2, 2]; _codigo = _Productos[2, 0]; } if (rbd4.IsChecked == true) { _mensaje = _Productos[3, 2]; _codigo = _Productos[3, 0]; } if (rbd5.IsChecked == true) { _mensaje = _Productos[4, 2]; _codigo = _Productos[4, 0]; } if (rbd6.IsChecked == true) { _mensaje = _Productos[5, 2]; _codigo = _Productos[5, 0]; } if (rbd7.IsChecked == true) { _mensaje = _Productos[6, 2]; _codigo = _Productos[6, 0]; } if (rbd8.IsChecked == true) { _mensaje = _Productos[7, 2]; _codigo = _Productos[7, 0]; } if (rbd9.IsChecked == true) { _mensaje = _Productos[8, 2];
_codigo = _Productos[8, 0]; } if (rbd10.IsChecked == true) { _mensaje = _Productos[9, 2]; _codigo = _Productos[9, 0]; } if (_mensaje != "") {
if (MessageBox.Show(_mensaje, "Desea agregar",
MessageBoxButton.OKCancel).Equals(MessageBoxResult.OK)) {
if (!Control.BuscaValor(MainPage._codigos_Producto_Cesta, int.Parse(_codigo),
MainPage._cantidad_Producto)) {
Control.InsertaValor(MainPage._codigos_Producto_Cesta, int.Parse(_codigo),
MainPage._cantidad_Producto, int.Parse(tbxCantidad.Text)); MessageBox.Show("Producto Agregado"); }
else
{
MessageBox.Show("Este producto ya se agregado"); }
} else
MessageBox.Show("Producto no agregado"); }
else
MessageBox.Show("No ha elegido ningun producto"); }
Luego de haber seleccionado el producto se solicitará la confirmación del producto seleccionado antes de añadirlo a la cesta de compras, para luego confirmar el ingreso del mismo con un mensaje luego de pulsar el botón Ok, o cancelar el pedido para que no se agregue la canasta.
Figura 67.- Interfaz Confirmación Agregar productos a la lista de pedidos Fuente.- Autora
Al pulsar el botón Cesta se tendrá acceso a la lista de productos seleccionados y añadidos a la cesta, conjuntamente con el costo total del pedido.
Figura 68.- Interfaz Lista de pedidos- Fuente.- Autora
privatevoid abListapedido_Click(object sender, EventArgs e) {
try
{
if (MainPage._codigos_Producto_Cesta[0, 0] != -1)
NavigationService.Navigate(newUri("/Pantallas/Cesta.xaml", UriKind.Relative)); else
MessageBox.Show("No ha seleccionado ningun producto"); }
catch (Exception _E) {
MessageBox.Show("No ha seleccionado ningun producto"); }
}
En la lista de pedido se podrá eliminar productos si es necesario para ello se lo selecciona y
se pulsa en el botón Eliminar . Pidiendo de la misma manera la confirmación de este procedimiento.
Figura 69.- Interfaz Quitar productos de la lista de pedidos Fuente.- Autora
privatevoid abQuitar_Click(object sender, EventArgs e) {
if (MessageBox.Show("Esta seguro que desea quitar de la cesta el producto seleccionado", "Quitar", MessageBoxButton.OKCancel).Equals(MessageBoxResult.OK))
_Eliminar_de_cesta(); } void _Eliminar_de_cesta() { string _mensaje = ""; string _codigo = ""; int band = 0; if (rbd1.IsChecked == true) { MainPage._codigos_Producto_Cesta[0, 0] = -1; MainPage._codigos_Producto_Cesta[0, 1] = 0; band = 1; } if (rbd2.IsChecked == true) { //_mensaje = _Productos[1, 2]; //_codigo = _Productos[1, 0]; MainPage._codigos_Producto_Cesta[1, 0] = -1; MainPage._codigos_Producto_Cesta[1, 1] = 0; band = 1; } if (rbd3.IsChecked == true) { //_mensaje = _Productos[2, 2]; //_codigo = _Productos[2, 0]; MainPage._codigos_Producto_Cesta[2, 0] = -1; MainPage._codigos_Producto_Cesta[2, 1] = 0; band = 1; } if (rbd4.IsChecked == true)
{ //_mensaje = _Productos[3, 2]; //_codigo = _Productos[3, 0]; MainPage._codigos_Producto_Cesta[3, 0] = -1; MainPage._codigos_Producto_Cesta[3, 1] = 0; band = 1; } if (rbd5.IsChecked == true) { //_mensaje = _Productos[4, 2]; //_codigo = _Productos[4, 0]; MainPage._codigos_Producto_Cesta[4, 0] = -1; MainPage._codigos_Producto_Cesta[4, 1] = 0; band = 1; } if (rbd6.IsChecked == true) { //_mensaje = _Productos[5, 2]; //_codigo = _Productos[5, 0]; MainPage._codigos_Producto_Cesta[5, 0] = -1; MainPage._codigos_Producto_Cesta[5, 1] = 0; band = 1; } if (rbd7.IsChecked == true) { //_mensaje = _Productos[6, 2]; //_codigo = _Productos[6, 0]; MainPage._codigos_Producto_Cesta[6, 0] = -1; MainPage._codigos_Producto_Cesta[6, 1] = 0; band = 1; } if (rbd8.IsChecked == true) { //_mensaje = _Productos[7, 2]; //_codigo = _Productos[7, 0]; MainPage._codigos_Producto_Cesta[7, 0] = -1; MainPage._codigos_Producto_Cesta[7, 1] = 0; band = 1; } if (rbd9.IsChecked == true) { MainPage._codigos_Producto_Cesta[8, 0] = -1; MainPage._codigos_Producto_Cesta[8, 1] = 0; band = 1; } if (rbd10.IsChecked == true) { MainPage._codigos_Producto_Cesta[9, 0] = -1; MainPage._codigos_Producto_Cesta[9, 1] = 0; band = 1;
}
if (band == 1) {
Control.RecorreVector(MainPage._codigos_Producto_Cesta, MainPage._cantidad_Producto); MessageBox.Show("Producto quitado de la lista");
_OcultaDatos();
_Busca_Datos_Producto(); }
else
MessageBox.Show("No a seleccionado ningun producto"); }
Cuando se ha determinado el pedido se podrá enviar el mismo a la Farmacia pulsando el
botón enviar , esto se lo podrá hacer siempre y cuando se haya registrado previamente el usuario en el sistema.
Si existe el usuario y este se encuentra registrado en la base de datos se podrá realizar el pedido pulsando el botón enviar.
Figura 70.- Interfaz confirmación agregar pedidos Fuente.- Autora
privatevoid aEnviar_Click(object sender, EventArgs e) {
try
{
if (!_fn.ExisteUsuario()) {
MessageBox.Show("Para poder realizar una compra, primero debe registarse en el sistema"); return;
}
if (MainPage._codigos_Producto_Cesta[0, 0] != -1) {
Pedido_Producto _pedido = newPedido_Producto(); _pedido._ingresaPedido(tbx_total.Text, "P"); _OcultaDatos(); _Busca_Datos_Producto(); NavigationService.GoBack(); } else
MessageBox.Show("No ha seleccionado ningún producto"); }
catch (Exception ex) {
MessageBox.Show("Error" + ex.Message + ""); }
}
Para enviar el pedido primero se realizara la comprobación de la existencia del usuario en la base de datos de lo contrario solicitara se lo haga primero.
Figura 71.- Interfaz confirmación que el cliente esta registrado. Fuente.- Autora
publicbool ExisteUsuario() {
bool _result = false; int count = 0; try
var query = from B inPalabraRegistro.GetDatabase()._Registro select B;
foreach (var item in query) { count++; _Id_User = item.Codigo; _cedula = item.Cedula; _nombre = item.Nombre; _apellido = item.Apellido; } }
catch (Exception _e) { } if (count > 0) _result = true; return _result; }
Para poder realizar pedidos se deberá realizar la autenticación ingresando el mail y la contraseña correspondiente para iniciar Sesión, en el código que se muestra a continuación se realiza una verificación para ver si el usuario se encuentra registrado.
Figura 72.- Interfaz Loguearse cliente Fuente.- Autora
privatevoid btnIniciarSesion_Click(object sender, RoutedEventArgs e) {
if (Microsoft.Phone.Net.NetworkInformation.DeviceNetworkInformation.IsNetworkAvailable) {
} else
MessageBox.Show("Verifique su conexion a internert", "Error PACHA",
MessageBoxButton.OK); }
publicvoid _Login_User(string email, string password) {
Service_Farmacia.Service1Client _login = new Service_Farmacia.Service1Client(); _login._loginClienteAsync(email, password);
_login._loginClienteCompleted += _login__loginClienteCompleted; }
Si no se lo ha hecho se deberá realizar el registro pulsando en Registrar ahora y completar los datos solicitados, esto se lo hará una sola vez en el teléfono quedando autenticado para poder realizar pedidos posteriormente.
Al pulsar en el enlace Registrar ahora nos muestra la pantalla para ingresar los datos correspondientes al registro de un usuario como son email, contraseña, CI, Nombre, Apellido, etc.
Figura 73.- Interfaz registro de clientes Fuente.- Autora
void _cliente_I_InsertarClientesCompleted(object sender, Service_Farmacia.I_InsertarClientesCompletedEventArgs e)
{
MessageBox.Show(e.Result.ToString());
{
Service_Farmacia.Service1Client _devuelveCod = new Service_Farmacia.Service1Client(); _devuelveCod._CodigoAsync();
_devuelveCod._CodigoCompleted += _devuelveCod__CodigoCompleted; }
}
void _devuelveCod__CodigoCompleted(object sender, Service_Farmacia._CodigoCompletedEventArgs
e) {
_fn.Guardar_Usuario(int.Parse(e.Result.ToString()), txtEmail.Text, password.Password, txtCedula.Text, txtNombre.Text, txtApellido.Text, sexo, txtTelefono.Text, txtDireccion.Text);
}
publicvoid Guardar_Usuario(int _codigo, string correo, string password, string cedula, string nombre, string apellido, string sexo, string telefono, string direccion)
{ try
{
var db = PalabraRegistro.GetDatabase(); db._Registro.InsertOnSubmit(newRegistro
{ Codigo = _codigo, Correo = correo, Password = password, Cedula = cedula, Nombre = nombre, Apellido = apellido, sexo = sexo, Telefono = telefono, Direccion = direccion, }); db.SubmitChanges(); } catch (Exception e) { MessageBox.Show(e.Message.ToString()); } }
Si se agregaron productos a la cesta y no se desea realizar el pedido existe la posibilidad de cancelar el pedido, pulsando el botón cancelar seguido de su confirmación.
Figura 74.- Interfaz cancelar lista de pedidos Fuente.- Autora
privatevoid abCancelar_Click(object sender, EventArgs e) {
MessageBox.Show("Cancelar Envio de Pedido", "Farmacia Servicios de Pedidos",
MessageBoxButton.OK);
for (int i = 0; i < MainPage._cantidad_Producto; i++) { MainPage._codigos_Producto_Cesta[i, 0] = -1; MainPage._codigos_Producto_Cesta[i, 1] = 0; } _OcultaDatos(); _Busca_Datos_Producto(); NavigationService.GoBack(); }