Exemplo n.º 1
0
        public void TransferirATerceros(ICuentaBancaria origen, ICuentaBancaria destino, Moneda cantidad)
        {
            if (destino is CuentaDeAhorroExterna == false)
            {
                throw new InvalidOperationException("Cuenta destino no es de otro banco");
            }
            if (origen.Balance.Divisa != destino.Balance.Divisa)
            {
                throw new InvalidOperationException("Divisas diferentes");
            }
            if (origen.Titular.Id != destino.Titular.Id)
            {
                throw new InvalidOperationException("Usuarios diferentes");
            }

            var cuentaExterna = destino as CuentaDeAhorroExterna;
            var exito         = _servicioExternoSPEI.EnviarSpei(cuentaExterna.Banco, cuentaExterna.CLABE, cantidad.Cantidad);

            if (exito)
            {
                origen.Balance.Restar(cantidad);

                //cobrar comision de 1%
                FuncionesComunes.RestarCantidad(origen, new Moneda(cantidad.Cantidad * (decimal)0.01, cantidad.Divisa));
            }
            else
            {
                throw new ApplicationException("Error al enviar SPEI.");
            }
        }
        public void PagarTarjeta(ICuentaBancaria cuentaOrigen, TarjetaDeCredito tarjeta, Moneda cantidad)
        {
            if (cuentaOrigen.Balance.Divisa != tarjeta.Balance.Divisa)
            {
                throw new InvalidOperationException("Divisas diferentes");
            }
            if (cuentaOrigen.Titular.Id != tarjeta.Titular.Id)
            {
                throw new InvalidOperationException("Las cuentas de transferencia son de usuarios diferentes");
            }

            //generar comision de 5% si se paga desde otra TDC
            if (!(cuentaOrigen is CuentaDeAhorro))
            {
                FuncionesComunes.RestarCantidad(cuentaOrigen, new Moneda(cantidad.Cantidad * (decimal)0.05, cantidad.Divisa));
            }

            //generar comision de 10% si se paga despues de fecha de corte
            var hoy = DateTime.Now;

            if (new DateTime(hoy.Year, hoy.Month, tarjeta.FechaDeCorte.Day) < DateTime.Now)
            {
                FuncionesComunes.RestarCantidad(cuentaOrigen, new Moneda(cantidad.Cantidad * 0.10m, cantidad.Divisa));
            }

            cuentaOrigen.Balance.Restar(cantidad);
            tarjeta.Balance.Agregar(cantidad);
        }