public long CerrarKiosco(ComprobanteKioscoDto kiosco, TipoComprobante tipo)
 {
     using (var context = new ModeloXCommerceContainer())
     {
         //GENERO DETALLE DE CAJA
         var cfId = context.Personas.OfType <Cliente>().FirstOrDefault(x => x.Dni == "99999999").Id;
         if (cfId == null)
         {
             throw new Exception("Falta consumidor final");
         }
         var comp = new ComprobanteFactura
         {
             ClienteId           = cfId,
             Descuento           = kiosco.Descuento,
             Fecha               = DateTime.Now,
             Numero              = NumeroDeComprobante.UltimoNumeroComprobante(),
             TipoComprobante     = tipo,
             UsuarioId           = Entidad.Entidad.UsuarioId,
             SubTotal            = kiosco.SubTotal,
             Total               = kiosco.Total,
             DetalleComprobantes = new List <DetalleComprobante>()
         };
         context.Comprobantes.Add(comp);
         var list = new List <DetalleComprobante>();
         foreach (var items in kiosco.Items)
         {
             var detComp = new DetalleComprobante
             {
                 ComprobanteId  = comp.Id,
                 SubTotal       = items.SubTotal,
                 Codigo         = items.CodigoProducto,
                 Cantidad       = items.Cantidad,
                 PrecioUnitario = items.PrecioUnitario,
                 Descripcion    = items.Descripcion,
                 ArticuloId     = items.ArticuloId
             };
             list.Add(detComp);
             context.DetalleComprobantes.Add(detComp);
         }
         comp.DetalleComprobantes = list;
         context.SaveChanges();
         //GENERAR MOVIMIENTO
         MovimientoServicio m = new MovimientoServicio();
         m.GenerarMovimiento(new MovimientoDto
         {
             CajaId        = Entidad.Entidad.CajaId,
             ComprobanteId = comp.Id,
             Fecha         = DateTime.Now,
             Monto         = kiosco.Total,
             TipoMovimento = TipoMovimiento.Ingreso,
             UsuarioId     = Entidad.Entidad.UsuarioId,
             Descripcion   = $"FC_{comp.TipoComprobante}_{comp.Numero.ToString("0000")}_{comp.Fecha.ToString("ddmmyyyy")}"
         });
         return(comp.Id);
     }
 }
        public void CerrarMesa
            (ComprobanteMesaDto Comprobante, TipoComprobante tipoComprobante)
        {
            using (var context = new ModeloXCommerceContainer())
            {
                if (Comprobante.Total == 0)
                {
                    var mesaCero = context.Mesas.FirstOrDefault(x => x.Id == Comprobante.MesaId);
                    if (mesaCero == null)
                    {
                        throw new Exception("no se encontro la entidad");
                    }
                    mesaCero.EstadoMesa = EstadoMesa.Cerrada;
                    var comprobanteCero = context.Comprobantes.OfType <ComprobanteSalon>().FirstOrDefault(x =>
                                                                                                          x.MesaId == Comprobante.MesaId && x.EstadoComprobante == EstadoComprobanteSalon.Proceso);
                    comprobanteCero.EstadoComprobante = EstadoComprobanteSalon.Finalizado;
                    context.SaveChanges();
                    return;
                }

                //CAMBIAR ESTADO MESA
                var mesa = context.Mesas.FirstOrDefault(x => x.Id == Comprobante.MesaId);
                if (mesa == null)
                {
                    throw new Exception("no se encontro la entidad");
                }
                mesa.EstadoMesa = EstadoMesa.Cerrada;
                //CAMBIAR ESTADO COMPROBANTE
                var comprobante = context.Comprobantes.OfType <ComprobanteSalon>().FirstOrDefault(x =>
                                                                                                  x.MesaId == Comprobante.MesaId && x.EstadoComprobante == EstadoComprobanteSalon.Proceso);
                comprobante.Numero            = NumeroDeComprobante.UltimoNumeroComprobante();
                comprobante.TipoComprobante   = tipoComprobante;
                comprobante.SubTotal          = Comprobante.SubTotal;
                comprobante.Descuento         = Comprobante.Descuento;
                comprobante.Total             = Comprobante.Total;
                comprobante.EstadoComprobante = EstadoComprobanteSalon.Finalizado;
                comprobante.TipoComprobante   = Comprobante.TipoComprobante;
                MovimientoServicio m  = new MovimientoServicio();
                FormaPagoServicio  fp = new FormaPagoServicio();

                if (Comprobante.MontoEfectivo > 0)
                {
                    //GENERAR MOVIMIENTO
                    m.GenerarMovimiento(new MovimientoDto
                    {
                        CajaId        = Entidad.Entidad.CajaId,
                        ComprobanteId = comprobante.Id,
                        Fecha         = DateTime.Now,
                        Monto         = Comprobante.MontoEfectivo,
                        TipoMovimento = TipoMovimiento.Ingreso,
                        Descripcion   = $"FC_{comprobante.TipoComprobante}_{comprobante.Numero.ToString("0000")}_{comprobante.Fecha.ToString("ddmmyyyy")}",
                        UsuarioId     = Entidad.Entidad.UsuarioId
                    });
                }

                if (Comprobante.MontoCtaCte > 0)
                {
                    //GENERAR MOVIMIENTO
                    m.GenerarMovimiento(new MovimientoDto
                    {
                        CajaId        = Entidad.Entidad.CajaId,
                        ComprobanteId = comprobante.Id,
                        Fecha         = DateTime.Now,
                        Monto         = Comprobante.MontoCtaCte,
                        TipoMovimento = TipoMovimiento.Ingreso,
                        Descripcion   = $"CC_{comprobante.TipoComprobante}_{comprobante.Numero.ToString("0000")}_{comprobante.Fecha.ToString("ddmmyyyy")}",
                        UsuarioId     = Entidad.Entidad.UsuarioId
                    });
                }

                if (Comprobante.MontoTarjeta > 0)
                {
                    m.GenerarMovimiento(new MovimientoDto
                    {
                        CajaId        = Entidad.Entidad.CajaId,
                        ComprobanteId = comprobante.Id,
                        Fecha         = DateTime.Now,
                        Monto         = Comprobante.MontoTarjeta,
                        TipoMovimento = TipoMovimiento.Ingreso,
                        Descripcion   = $"TC_{comprobante.TipoComprobante}_{comprobante.Numero.ToString("0000")}_{comprobante.Fecha.ToString("ddmmyyyy")}",
                        UsuarioId     = Entidad.Entidad.UsuarioId
                    });
                }

                if (Comprobante.MontoCheque > 0)
                {
                    m.GenerarMovimiento(new MovimientoDto
                    {
                        CajaId        = Entidad.Entidad.CajaId,
                        ComprobanteId = comprobante.Id,
                        Fecha         = DateTime.Now,
                        Monto         = Comprobante.MontoCheque,
                        TipoMovimento = TipoMovimiento.Ingreso,
                        Descripcion   = $"CH_{comprobante.TipoComprobante}_{comprobante.Numero.ToString("0000")}_{comprobante.Fecha.ToString("ddmmyyyy")}",
                        UsuarioId     = Entidad.Entidad.UsuarioId
                    });
                }
                context.SaveChanges();
            }
        }
        public void Entregar(DeliveryDto comprobante)
        {
            using (var context = new ModeloXCommerceContainer())
            {
                var Comprobante = context.Comprobantes.OfType <AccesoDatos.ComprobanteDelivery>().FirstOrDefault(x => x.Id == comprobante.Id);
                Comprobante.EstadoPedido    = EstadoPedido.Entregado;
                Comprobante.TipoComprobante = comprobante.TipoComprobante;
                var movimiento = new MovimientoServicio();
                movimiento.GenerarMovimiento(new MovimientoDto
                {
                    Monto         = comprobante.Total,
                    CajaId        = Entidad.Entidad.CajaId,
                    ComprobanteId = comprobante.Id,
                    Fecha         = DateTime.Now,
                    TipoMovimento = TipoMovimiento.Ingreso,
                    UsuarioId     = Entidad.Entidad.UsuarioId,
                    Descripcion   = $"FC_{ Comprobante.TipoComprobante }_{ comprobante.Numero.ToString("0000") }_{ comprobante.Fecha.ToString("ddmmyyyy") }"
                });


                foreach (var item in Comprobante.DetalleComprobantes)
                {
                    if (context.Articulos.FirstOrDefault(x => x.Id == item.ArticuloId).DescuentaStock)
                    {
                        var articulo = context.Articulos.FirstOrDefault(x => x.Id == item.ArticuloId);
                        if (articulo == null)
                        {
                            throw new Exception("No se encontro la entidad");
                        }

                        articulo.Stock -= item.Cantidad;
                    }
                }

                //TODO
                MovimientoServicio m = new MovimientoServicio();

                if (comprobante.MontoEfectivo > 0)
                {
                    //GENERAR MOVIMIENTO
                    m.GenerarMovimiento(new MovimientoDto
                    {
                        CajaId        = Entidad.Entidad.CajaId,
                        ComprobanteId = comprobante.Id,
                        Fecha         = DateTime.Now,
                        Monto         = comprobante.MontoEfectivo,
                        TipoMovimento = TipoMovimiento.Ingreso,
                        Descripcion   = $"FC_{Comprobante.TipoComprobante}_{comprobante.Numero.ToString("0000")}_{comprobante.Fecha.ToString("ddmmyyyy")}",
                        UsuarioId     = Entidad.Entidad.UsuarioId
                    });
                }

                if (comprobante.MontoCtaCte > 0)
                {
                    //CUENTA CORRIENTE NO GENERA DETALLE DE CAJA AL INSTANTE(DEBE PAGAR PARA GENERARLO)
                    CuentaCorrienteServicio cta = new CuentaCorrienteServicio();
                    cta.Vender(comprobante.ClienteId, comprobante.Total);
                    OperacionServicio op = new OperacionServicio();
                    op.Agregar(new OperacionDto
                    {
                        TipoOperacion     = TipoOperacion.Venta,
                        ComprobanteId     = comprobante.Id,
                        Fecha             = DateTime.Now,
                        Monto             = comprobante.MontoCtaCte,
                        CuentaCorrienteId = cta.ObtenerCorrientePorClienteId(comprobante.ClienteId).Id
                    });
                    //GENERAR MOVIMIENTO
                    m.GenerarMovimiento(new MovimientoDto
                    {
                        CajaId        = Entidad.Entidad.CajaId,
                        ComprobanteId = comprobante.Id,
                        Fecha         = DateTime.Now,
                        Monto         = comprobante.MontoCtaCte,
                        TipoMovimento = TipoMovimiento.Ingreso,
                        Descripcion   = $"CC_{Comprobante.TipoComprobante}_{comprobante.Numero.ToString("0000")}_{comprobante.Fecha.ToString("ddmmyyyy")}",
                        UsuarioId     = Entidad.Entidad.UsuarioId
                    });
                }

                if (comprobante.MontoTarjeta > 0)
                {
                    m.GenerarMovimiento(new MovimientoDto
                    {
                        CajaId        = Entidad.Entidad.CajaId,
                        ComprobanteId = comprobante.Id,
                        Fecha         = DateTime.Now,
                        Monto         = comprobante.MontoTarjeta,
                        TipoMovimento = TipoMovimiento.Ingreso,
                        Descripcion   = $"TC_{Comprobante.TipoComprobante}_{comprobante.Numero.ToString("0000")}_{comprobante.Fecha.ToString("ddmmyyyy")}",
                        UsuarioId     = Entidad.Entidad.UsuarioId
                    });
                }

                if (comprobante.MontoCheque > 0)
                {
                    m.GenerarMovimiento(new MovimientoDto
                    {
                        CajaId        = Entidad.Entidad.CajaId,
                        ComprobanteId = comprobante.Id,
                        Fecha         = DateTime.Now,
                        Monto         = comprobante.MontoCheque,
                        TipoMovimento = TipoMovimiento.Ingreso,
                        Descripcion   = $"CH_{Comprobante.TipoComprobante}_{comprobante.Numero.ToString("0000")}_{comprobante.Fecha.ToString("ddmmyyyy")}",
                        UsuarioId     = Entidad.Entidad.UsuarioId
                    });
                }
                context.SaveChanges();
            }
        }
        public void CerrarComprobanteCompra(ComprobanteCompraDto comprobante)
        {
            using (var context = new ModeloXCommerceContainer())
            {
                ArticuloServicio art = new ArticuloServicio();
                //DetalleComprobante
                var Comprobante = context.Comprobantes.OfType <AccesoDatos.ComprobanteCompra>().FirstOrDefault(x => x.Id == comprobante.Id);
                Comprobante.TipoComprobante = comprobante.TipoComprobante;
                foreach (var item in comprobante.Items)
                {
                    var articulo = art.ObtenerPorId(item.ArticuloId);
                    articulo.Stock += item.Cantidad;
                    art.Modificar(articulo);
                }
                Comprobante.DetalleComprobantes = comprobante.Items.Select(x => new AccesoDatos.DetalleComprobante
                {
                    ArticuloId     = x.ArticuloId,
                    Cantidad       = x.Cantidad,
                    ComprobanteId  = comprobante.Id,
                    PrecioUnitario = x.PrecioUnitario,
                    SubTotal       = x.SubTotal,
                    Descripcion    = x.Descripcion,
                    Codigo         = x.CodigoProducto
                }).ToList();
                context.SaveChanges();
                //Movimiento
                MovimientoServicio m  = new MovimientoServicio();
                FormaPagoServicio  fp = new FormaPagoServicio();

                if (comprobante.MontoEfectivo > 0)
                {
                    //GENERAR MOVIMIENTO
                    m.GenerarMovimiento(new MovimientoDto
                    {
                        CajaId        = Entidad.Entidad.CajaId,
                        ComprobanteId = Comprobante.Id,
                        Fecha         = DateTime.Now,
                        Monto         = comprobante.MontoEfectivo,
                        TipoMovimento = TipoMovimiento.Egreso,
                        Descripcion   = $"FC_{Comprobante.TipoComprobante}_{Comprobante.Numero.ToString("0000")}_{Comprobante.Fecha.ToString("ddmmyyyy")}",
                        UsuarioId     = Entidad.Entidad.UsuarioId
                    });
                }

                //if (dto.MontoCtaCte > 0)
                //{
                //    //CUENTA CORRIENTE NO GENERA DETALLE DE CAJA AL INSTANTE(DEBE PAGAR PARA GENERARLO)
                //    CuentaCorrienteServicio cta = new CuentaCorrienteServicio();
                //    cta.Vender(comprobante.ClienteId, comprobante.Total);
                //    OperacionServicio op = new OperacionServicio();
                //    op.Agregar(new OperacionDto
                //    {
                //        TipoOperacion = TipoOperacion.Venta,
                //        ComprobanteId = comprobante.Id,
                //        Fecha = DateTime.Now,
                //        Monto = dto.MontoCtaCte,
                //        CuentaCorrienteId = cta.ObtenerCorrientePorClienteId(comprobante.ClienteId).Id
                //    });
                //    //GENERAR MOVIMIENTO
                //    m.GenerarMovimiento(new MovimientoDto
                //    {
                //        CajaId = Entidad.Entidad.CajaId,
                //        ComprobanteId = comprobante.Id,
                //        Fecha = DateTime.Now,
                //        Monto = dto.MontoCtaCte,
                //        TipoMovimento = TipoMovimiento.Egreso,
                //        Descripcion = $"CC_{comprobante.TipoComprobante}_{comprobante.Numero.ToString("0000")}_{comprobante.Fecha.ToString("ddmmyyyy")}",
                //        UsuarioId = Entidad.Entidad.UsuarioId
                //    });
                //}

                if (comprobante.MontoTarjeta > 0)
                {
                    m.GenerarMovimiento(new MovimientoDto
                    {
                        CajaId        = Entidad.Entidad.CajaId,
                        ComprobanteId = Comprobante.Id,
                        Fecha         = DateTime.Now,
                        Monto         = comprobante.MontoTarjeta,
                        TipoMovimento = TipoMovimiento.Egreso,
                        Descripcion   = $"TC_{Comprobante.TipoComprobante}_{Comprobante.Numero.ToString("0000")}_{Comprobante.Fecha.ToString("ddmmyyyy")}",
                        UsuarioId     = Entidad.Entidad.UsuarioId
                    });
                }

                if (comprobante.MontoCheque > 0)
                {
                    m.GenerarMovimiento(new MovimientoDto
                    {
                        CajaId        = Entidad.Entidad.CajaId,
                        ComprobanteId = Comprobante.Id,
                        Fecha         = DateTime.Now,
                        Monto         = comprobante.MontoCheque,
                        TipoMovimento = TipoMovimiento.Egreso,
                        Descripcion   = $"CH_{Comprobante.TipoComprobante}_{Comprobante.Numero.ToString("0000")}_{Comprobante.Fecha.ToString("ddmmyyyy")}",
                        UsuarioId     = Entidad.Entidad.UsuarioId
                    });
                }
            }
        }