private void EliminarDetalle(OrdenesPago ordenesPago, OrdenesPagoDetalle detalle)
        {


            detalle.InvertirImportes();
            detalle.FechaAnulacion = _clock.Now;

            var pago = ObtenerFormaPago(ordenesPago, detalle);

            pago.IsDeleted = true;

            AgregarMovimientos(ordenesPago, detalle, pago);

            if (pago.TipoPago == FormaPago.Transferencia || pago.TipoPago == FormaPago.Deposito)
            {
                pago.Importe = -pago.Importe;
                AgregarCuentaMovimiento(ordenesPago, pago);
            }

            _uow.OrdenesPagosDetalle.Modificar(detalle);
        }
        private OrdenesPagoDetalle ObtenerDetalle(DetalleFormaPago pago)
        {
            OrdenesPagoDetalle _ordenPagoDetalle;
            if (pago.Id == Guid.Empty)
            {
                _ordenPagoDetalle = new OrdenesPagoDetalle();
                _ordenPagoDetalle.Id = Guid.NewGuid();
                _ordenPagoDetalle.OrdenPagoId = _ordenPago.Id;
            }
            else
            {
                _ordenPagoDetalle = _ordenPago.OrdenesPagoDetalles.FirstOrDefault(d => d.Id == pago.Id);
            }

            //La caja siempre esta abierta.
            var cajaActual = this.Context.CajaActual;

            _ordenPagoDetalle.CajaId = cajaActual.Id;
            _ordenPagoDetalle.OperadorAutorizaId = operadorAutoriza;
            _ordenPagoDetalle.Descripcion = pago.Descripcion;
            //Fechas.
            _ordenPagoDetalle.FechaAlta = _clock.Now;

            _ordenPagoDetalle.SucursalAltaId = Context.SucursalActual.Id;

            _ordenPagoDetalle.OperadorAltaId = Context.OperadorActual.Id;

            switch (pago.TipoPago)
            {
                case FormaPago.Transferencia:
                    _ordenPagoDetalle.FechaPago = _clock.Now;
                    _ordenPagoDetalle.Transferencia = pago.Importe;
                    _ordenPagoDetalle.ImportePagado = pago.Importe;
                    break;
                case FormaPago.Cheque:
                    _ordenPagoDetalle.FechaPago = _clock.Now;
                    _ordenPagoDetalle.Cheques = pago.Importe;
                    _ordenPagoDetalle.ImportePagado = pago.Importe;
                    break;
                case FormaPago.Deposito:
                    _ordenPagoDetalle.FechaPago = _clock.Now;
                    _ordenPagoDetalle.DepositoEfectivo = pago.Importe;
                    _ordenPagoDetalle.ImportePagado = pago.Importe;
                    break;
                case FormaPago.Efectivo:
                    _ordenPagoDetalle.FechaPago = DtpFecha.Value;
                    _ordenPagoDetalle.Efectivo = pago.Importe;
                    //Si FechaPago > hoy => Pago PRogramado con Importe PAgado = 0
                    _ordenPagoDetalle.ImportePagado = (pago.Fecha.Value.Date == _clock.Now.Date) ? pago.Importe : 0;
                    break;
            }

            return _ordenPagoDetalle;
        }
 private void ActualizarCajaActual(OrdenesPagoDetalle pago, Caja caja)
 {
     caja.Egresos += (float)(pago.Efectivo ?? 0);
     caja.Saldo -= (float)(pago.Efectivo ?? 0);
     caja.FechaModificacion = pago.Id == default(Guid) ? (DateTime?)null : _clock.Now;
     caja.SucursalModificacionId = pago.Id == default(Guid)
                                       ? (int?)null
                                       : Context.SucursalActual.Id;
     caja.OperadorModificacionId = pago.Id == default(Guid)
                                       ? (Guid?)null
                                       : Context.OperadorActual.Id;
 }
        private void AgregarMovimientos(OrdenesPagoDetalle pago, DetalleFormaPago vPago)
        {
            var movimiento = new CajaMovimiento();
            movimiento.Id = Guid.NewGuid();
            movimiento.Importe = pago.ImportePagado;
            movimiento.ComprobanteId = _ordenPago.Id;
            movimiento.TipoComprobante = TipoComprobanteEnum.OrdenPago;
            movimiento.TipoMovimientoCajaId = vPago.IsDeleted ? TipoMovimientoCajaEnum.AnulaciónOrdenPago : TipoMovimientoCajaEnum.PagoGastos;
            movimiento.PcAlta = Environment.MachineName;

            movimiento.CajaId = _cajaActual.Id;

            if (pago.Efectivo.HasValue && pago.Efectivo != 0)
            {
                //Si ImportePagado <> 0 => Pago Normal en Efectivo
                //Si ImportePagado = 0 => Pago Programado
                if (pago.ImportePagado.HasValue && pago.ImportePagado != 0)
                {
                    movimiento.Efectivo = pago.Efectivo;

                    var pagoEfec = vPago as PagoEfectivo;

                    if (pagoEfec.CajaAnterior)
                    {
                        ActualizarCajaAnterior(pagoEfec, _cajaActual, movimiento);
                    }
                    else
                    {
                        ActualizarCajaActual(pago, _cajaActual);
                    }

                    Uow.Cajas.Modificar(_cajaActual);
                }
            }

            if (pago.Cheques.HasValue && pago.Cheques != 0)
            {
                movimiento.Cheque = pago.ImportePagado;
            }

            if (pago.DepositoEfectivo.HasValue && pago.DepositoEfectivo != 0)
            {
                movimiento.Deposito = pago.ImportePagado;
            }

            if (pago.Transferencia.HasValue && pago.Transferencia != 0)
            {
                movimiento.Transferencia = pago.ImportePagado;
            }

            movimiento.FechaAlta = pago.Id == default(Guid) ? _clock.Now : pago.FechaAlta;
            movimiento.SucursalAltaId = Context.SucursalActual.Id;
            movimiento.OperadorAltaId = Context.OperadorActual.Id;

            Uow.CajaMovimientos.Agregar(movimiento);
        }
 private void CargarPago()
 {
     _ordenPagoDetalle = Uow.OrdenesPagosDetalle.Obtener(o => o.Id == _pagoId);
     this.Efectivo = _ordenPagoDetalle.Efectivo * -1;
     this.ImportePagado = _ordenPagoDetalle.ImportePagado.HasValue ? _ordenPagoDetalle.ImportePagado.Value * -1 : 0;
     this.FechaPago = _ordenPagoDetalle.FechaPago ?? DateTime.Today;
     _ordenPagoDetalle.FechaAnulacion = _clock.Now;
     _esEfectivo = _ordenPagoDetalle.Efectivo.HasValue;
 }
        public DetalleFormaPago ObtenerFormaPago(OrdenesPago ordenPago, OrdenesPagoDetalle ordenesPagoDetalle)
        {
            DetalleFormaPago pago = new DetalleFormaPago();

            pago.PuedeEliminar = ordenesPagoDetalle.PuedeEliminar();

            if (ordenesPagoDetalle.Efectivo.HasValue && ordenesPagoDetalle.Efectivo != 0)
            {
                var pagoEfectivo = new PagoEfectivo();
                pagoEfectivo.Id = ordenesPagoDetalle.Id;
                pagoEfectivo.Importe = ordenesPagoDetalle.Efectivo;
                pagoEfectivo.TipoPago = FormaPago.Efectivo;
                pagoEfectivo.Descripcion = ordenesPagoDetalle.Descripcion;
                pagoEfectivo.Fecha = ordenesPagoDetalle.FechaPago;
                pago = pagoEfectivo;
            }

            if (ordenesPagoDetalle.Cheques.HasValue && ordenesPagoDetalle.Cheques != 0)
            {
                var pagoCheque = new PagoCheque();
                pagoCheque.Id = ordenesPagoDetalle.Id;
                pagoCheque.Importe = ordenesPagoDetalle.Cheques;
                pagoCheque.TipoPago = FormaPago.Cheque;
                pagoCheque.Descripcion = ordenesPagoDetalle.Descripcion;
                pagoCheque.Fecha = ordenesPagoDetalle.FechaPago;
                pago = pagoCheque;
            }

            if (ordenesPagoDetalle.DepositoEfectivo.HasValue && ordenesPagoDetalle.DepositoEfectivo != 0)
            {
                var pagoDeposito = new PagoDeposito();
                var cuentaMov =
                    _uow.CuentasMovimientos.Obtener(
                        c =>
                        c.ComprobanteId == ordenPago.Id && c.Descripcion.Contains(ordenesPagoDetalle.Descripcion));
                pagoDeposito.Id = ordenesPagoDetalle.Id;
                pagoDeposito.DepositoCuentaId = cuentaMov.CuentaId;
                pagoDeposito.Importe = ordenesPagoDetalle.DepositoEfectivo;
                pagoDeposito.TipoPago = FormaPago.Deposito;
                pagoDeposito.Descripcion = ordenesPagoDetalle.Descripcion;
                pagoDeposito.Fecha = ordenesPagoDetalle.FechaPago;
                pago = pagoDeposito;
            }

            if (ordenesPagoDetalle.Transferencia.HasValue && ordenesPagoDetalle.Transferencia != 0)
            {
                var pagoTransferencia = new PagoTransferencia();
                var cuentaMov =
                    _uow.CuentasMovimientos.Obtener(
                        c =>
                        c.ComprobanteId == ordenPago.Id && c.Descripcion.Contains(ordenesPagoDetalle.Descripcion));
                pagoTransferencia.Id = ordenesPagoDetalle.Id;
                pagoTransferencia.CuentaId = cuentaMov.CuentaId;
                pagoTransferencia.Importe = ordenesPagoDetalle.Transferencia;
                pagoTransferencia.TipoPago = FormaPago.Transferencia;
                pagoTransferencia.Descripcion = ordenesPagoDetalle.Descripcion;
                pagoTransferencia.Fecha = ordenesPagoDetalle.FechaPago;
                pago = pagoTransferencia;
            }

            return pago;
        }
        public void AgregarMovimientos(OrdenesPago ordenPago, OrdenesPagoDetalle pago, DetalleFormaPago vPago)
        {
            var movimiento = new CajaMovimiento();
            var movimientoAnterior = new CajaMovimiento();
            if (vPago.IsDeleted)
                movimientoAnterior = _uow.CajaMovimientos.Obtener(c => c.ComprobanteId == ordenPago.Id);

            movimiento.Id = Guid.NewGuid();
            movimiento.Importe = pago.ImportePagado;
            movimiento.ComprobanteId = ordenPago.Id;
            movimiento.TipoComprobante = TipoComprobanteEnum.OrdenPago;
            movimiento.TipoMovimientoCajaId = vPago.IsDeleted ? movimientoAnterior.TipoMovimientoCajaId : TipoMovimientoCajaEnum.PagoGastos;
            //movimiento.TipoMovimientoCajaId = vPago.IsDeleted ? TipoMovimientoCajaEnum.AnulaciónOrdenPago : TipoMovimientoCajaEnum.PagoGastos;
            movimiento.PcAlta = Environment.MachineName;
            movimiento.CajaId = _cajaActual.Id;

            if (pago.Efectivo.HasValue && pago.Efectivo != 0)
            {
                //Si ImportePagado <> 0 => Pago Normal en Efectivo
                //Si ImportePagado = 0 => Pago Programado
                if (pago.ImportePagado.HasValue && pago.ImportePagado != 0)
                {
                    var pagoEfec = vPago as PagoEfectivo;

                    if (pagoEfec.CajaAnterior)
                    {
                        ActualizarCajaAnterior(ordenPago, pagoEfec, _cajaActual, movimiento);
                    }
                    else
                    {
                        ActualizarCajaActual(pago, movimiento, _cajaActual);
                    }

               }

                movimiento.Efectivo = pago.Efectivo;
            }

            if (pago.Cheques.HasValue && (pago.Cheques > 0 || pago.Cheques < 0))
            {
                movimiento.Cheque = pago.Cheques;
            }

            if (pago.DepositoEfectivo.HasValue && (pago.DepositoEfectivo > 0 || pago.DepositoEfectivo < 0))
            {
                movimiento.Deposito = pago.DepositoEfectivo;
            }

            if (pago.Transferencia.HasValue && (pago.Transferencia > 0 || pago.Transferencia < 0))
            {
                movimiento.Transferencia = pago.Transferencia;
            }

         //   movimiento.FechaAlta = pago.Id == default(Guid) ? _clock.Now : pago.FechaAlta;

            movimiento.FechaAlta = DateTime.Now;// pago.Id == default(Guid) ? _clock.Now : pago.FechaAlta;


            movimiento.SucursalAltaId = _context.SucursalActual.Id;
            movimiento.OperadorAltaId = _context.OperadorActual.Id;

            _uow.CajaMovimientos.Agregar(movimiento);
        }