public async Task <int> GuardarFactura(GuardarFacturaDto factura)
        {
            var facturaEntidad = new Factura
            {
                ClientesId    = factura.ClientesId,
                Doblado       = factura.Doblado,
                Estado        = factura.Estado,
                SolicitudesId = factura.SolicitudesId,
                Suplemento    = factura.Suplemento,
                TotalGlobal   = factura.TotalGlobal,
                TotalParcial  = factura.TotalParcial
            };

            _context.Set <Factura>().Add(facturaEntidad);
            await _context.SaveChangesAsync();

            foreach (var detalleFactura in factura.DetallesFacturas.DetallesFactura)
            {
                var detalleFacturaEntidad = new DetalleFactura
                {
                    DetalleSolicitudId = detalleFactura.DetalleSolicitudId,
                    Doblado            = detalleFactura.Doblado,
                    FacturaId          = facturaEntidad.Id,
                    LavadoPlanchado    = detalleFactura.LavadoPlanchado,
                    LavadoSeco         = detalleFactura.LavadoSeco,
                    Planchado          = detalleFactura.Planchado,
                    Total = detalleFactura.Total
                };

                _context.Set <DetalleFactura>().Add(detalleFacturaEntidad);
                await _context.SaveChangesAsync();
            }
            return(facturaEntidad.Id);
        }
        /// <summary>
        /// Condiciones de negocio:
        /// 1)
        /// </summary>
        /// <param name="idSolicitud"></param>
        /// <returns></returns>
        public async Task <GuardarFacturaDto> GenerarFacturaDesdeSolicitud(int idSolicitud)
        {
            var solicitud = await _solicitudAccesoBd.ObtenerSolicitudConDetallePorId(idSolicitud);

            if (solicitud != default(SolicitudesConDetallesDto))
            {
                double totalParcial    = 0;
                double totalGlobal     = 0;
                double totalDoblado    = 0;
                double totalSuplemento = 0;

                var listaDetallesFactura = new List <DetallesFacturaDto>();

                foreach (var detalleSolicitud in solicitud.ListadoDetallesSolicitud.DetalleSolicitud)
                {
                    var costo = await _clasificacionPrendasAccesoBd.ObtenerCostoPorIdPrendaClasificacion(detalleSolicitud.PrendasClasificacionId);

                    double lavadoSeco      = 0;
                    double lavadoPlanchado = 0;
                    double planchado       = 0;
                    double doblado         = 0;

                    if (detalleSolicitud.LavadoSeco)
                    {
                        totalParcial += (costo.LavadoSeco * detalleSolicitud.CantidadPrendas);
                        lavadoSeco    = costo.LavadoSeco * detalleSolicitud.CantidadPrendas;
                    }
                    if (detalleSolicitud.LavadoPlanchado)
                    {
                        totalParcial   += (costo.LavadoPlanchado * detalleSolicitud.CantidadPrendas);
                        lavadoPlanchado = (costo.LavadoPlanchado * detalleSolicitud.CantidadPrendas);
                    }
                    if (detalleSolicitud.Planchado)
                    {
                        totalParcial += (costo.Planchado * detalleSolicitud.CantidadPrendas);
                        planchado     = (costo.Planchado * detalleSolicitud.CantidadPrendas);
                    }

                    if (detalleSolicitud.Doblado)
                    {
                        totalParcial += (costo.Doblado * detalleSolicitud.CantidadPrendas);
                        totalDoblado += (costo.Doblado * detalleSolicitud.CantidadPrendas);
                        doblado       = (costo.Doblado * detalleSolicitud.CantidadPrendas);
                    }

                    totalGlobal = totalParcial;

                    var detalleFactura = new DetallesFacturaDto
                    {
                        DetalleSolicitudId = detalleSolicitud.Id,
                        Doblado            = doblado,
                        LavadoPlanchado    = lavadoPlanchado,
                        LavadoSeco         = lavadoSeco,
                        Planchado          = planchado,
                        Total = (doblado + lavadoPlanchado + lavadoSeco + planchado)
                    };
                    listaDetallesFactura.Add(detalleFactura);
                }
                var listadoDetallesFactura = new ListadoDetallesFacturaDto
                {
                    DetallesFactura = listaDetallesFactura
                };

                if (solicitud.SuplementoEntrega)
                {
                    totalSuplemento = totalGlobal * 0.5;
                    totalGlobal     = totalGlobal + totalSuplemento;
                }

                var guardarFactura = new GuardarFacturaDto
                {
                    ClientesId       = solicitud.ClienteId,
                    Doblado          = totalDoblado,
                    Estado           = "Facturado",
                    SolicitudesId    = solicitud.Id,
                    TotalGlobal      = totalGlobal,
                    TotalParcial     = totalParcial,
                    Suplemento       = totalSuplemento,
                    DetallesFacturas = listadoDetallesFactura
                };

                await _facturaAccesoBd.GuardarFactura(guardarFactura);

                return(await Task.FromResult(guardarFactura));
            }
            return(default(GuardarFacturaDto));
        }
        /// <summary>
        /// Condiciones de negocio:
        /// 1) Deben existir detalles en la factura
        /// 2) El valor de la factura debe ser mayor que cero
        /// </summary>
        /// <param name="factura"></param>
        /// <returns></returns>
        public async Task <int> GuardarFactura(GuardarFacturaDto factura)
        {
            var facturaId = await _facturaAccesoBd.GuardarFactura(factura);

            return(facturaId);
        }