// PUT: api/CompraMetodoDePago
 /// <summary>
 /// Dado un ID de una Tarjeta o EasyPay, este sera guardado en la memoria
 /// como metodo de pago de un producto que se desee comprar.
 /// </summary>
 /// <param name="cmp">Objeto CompraMetodoPago el cual guarda el
 /// ID del metodo de pago a utilizar.</param>
 /// <returns></returns>
 public string Put([FromBody] CompraMetodoDePago cmp)
 {
     // Establece el metodo de pago que se va a usar en la memoria.
     Memoria.compraMetodoDePago =
         new CompraMetodoDePago(cmp.metodoDePagoID);
     return("OK. ID:" + Memoria.compraMetodoDePago.metodoDePagoID);
 }
        /// <summary>
        /// Método que realiza la compra una vez las validaciones se hayan hecho y todo
        /// este correcto.
        /// </summary>
        /// <param name="producto"></param>
        /// <param name="metodoPago"></param>
        private void efectuarCompra(ProductoCompra producto, CompraMetodoDePago metodoPago)
        {
            registrarTransaccion(producto, metodoPago); // Guarda en la base de datos la propiedad del producto.
            reducirSaldo(producto, metodoPago);         // Reduce el saldo del metodo de pago utilizado.
            compraExitosa();                            // Muestra mensaje de compra exitosa. Elimina método de pago y producto de la memoria.

            // Fin del proceso de compra.
        }
        /// <summary>
        /// Reduce el saldo del método de pago en haras al producto seleccionado.
        /// </summary>
        /// <param name="producto">Producto seleccionado.</param>
        /// <param name="metodoPago">Método de pago seleccionado.</param>
        private void reducirSaldo(ProductoCompra producto
                                  , CompraMetodoDePago metodoPago)
        {
            int montoProducto   = producto.obtenerMonto();
            int saldoDisponible = metodoPago.obtenerSaldo();

            int saldoReducido = saldoDisponible - montoProducto; // Reducción de saldo.

            metodoPago.actualizarSaldo("" + saldoReducido);
        }
        /// <summary>
        /// Hace el registro de transacción en la base de datos. En otras palabras, guarda
        /// el registro de propiedad del producto en la base de datos.
        /// </summary>
        /// <param name="producto">Producto seleccionado.</param>
        /// <param name="metodoPago">Método de pago seleccionado.</param>
        private void registrarTransaccion(ProductoCompra producto
                                          , CompraMetodoDePago metodoPago)
        {
            string tarjeta_id = "";
            string easypay_id = "";

            if (metodoPago.esTarjeta)
            {
                tarjeta_id = metodoPago.metodoDePagoID;
            }

            if (metodoPago.esEasyPay)
            {
                easypay_id = metodoPago.metodoDePagoID;
            }

            // Registro espejo del registro requerido guardado en la base de datos.
            Consecutivo registro_de_consecutivo = new Consecutivo();

            registro_de_consecutivo = registro_de_consecutivo
                                      .traerConsecutivo_registroReflejadoEnDB("transaccion");

            // Se actualiza el id de la transaccion como prefijo+numConsecuvito.
            // Ejemplo: tra4 .
            string id_consecutivo =
                registro_de_consecutivo.prefijo + (int.Parse(registro_de_consecutivo.descripcion) + 1);

            // Se crea objeto Transacción.
            Transaccion transaccion = new Transaccion(
                id_consecutivo
                , Tareas.obtener_fecha_actual()
                , "" + producto.obtenerMonto()
                , Memoria.sesionUsuarioDatos.id
                , producto.productoCompraId
                , tarjeta_id
                , easypay_id);

            // Se guarda el registro de transaccion.
            transaccion.crearRegistroTranseccion(transaccion);

            // Aumentamos el valor "descripcion" del consecutivo en 1.
            string valorDescripcionAumentadoEn1 =
                Tareas.aumentarColumnaDeConsecutivoEn1(registro_de_consecutivo);

            registro_de_consecutivo.descripcion = valorDescripcionAumentadoEn1;

            // Actualizamos el consecutivo en la base de datos.
            registro_de_consecutivo
            .actualizarConsecutivo_baseDeDatos(registro_de_consecutivo);
        }
 /// <summary>
 /// Valida que el usuario haya elegido un metodo de pago y un producto para comprar.
 /// </summary>
 /// <param name="compraProducto">Objeto del producto que se desea comprar.</param>
 /// <param name="compraMetodoDePago">Objeto del metodo de pago elegido.</param>
 /// <returns>True si se han especificado metodo de pago y producto.</returns>
 private bool seHaSeleccionadoProductoYMetodoDePago(
     ProductoCompra compraProducto
     , CompraMetodoDePago compraMetodoDePago)
 {
     if (compraProducto.seHaSeleccionadoProductoParaComprar() &&
         compraMetodoDePago.seHaSeleccionadoMetodoDePago())
     {
         return(true);
     }
     else
     {
         establecerContenido_label(false,
                                   "Ha ocurrido un error"
                                   , "Error interno del sistema."
                                   , "El usuario no ha especificado un producto o método de pago para" +
                                   " efectuar la compra. Por favor, regrese al ménu principal.");
         return(false);
     }
 }
        /// <summary>
        /// Comprueba si el método de pago elegido contiene los fondos suficientes para realizar la compra.
        /// </summary>
        /// <param name="producto"></param>
        /// <param name="metodoPago"></param>
        /// <returns>True si se cuenta con fondos suficientes.</returns>
        private bool fondosSuficientes(ProductoCompra producto, CompraMetodoDePago metodoPago)
        {
            int saldoDisponible = metodoPago.obtenerSaldo();
            int montoProducto   = producto.obtenerMonto();

            if (saldoDisponible >= montoProducto)
            {
                return(true);
            }
            else
            {
                establecerContenido_label(
                    false
                    , "Error durante la transacción"
                    , "Saldo insuficiente"
                    , "El método de pago utilizado no " +
                    "posee los fondos suficientes para " +
                    "efectuar la compra. Por favor, vuelva " +
                    "a intentarlo con un método de pago diferente.");
                return(false);
            }
        }