Exemplo n.º 1
0
        private int SaveVenta()
        {
            var continuar   = true;
            var consecutivo = 0;

            commB.BeginTran();
            try
            {
                var venta = new ControlEntity.Venta();
                venta.Estado      = Enum.GetName(typeof(BaseHelpers.Helpers.Tools.EstatusDocumentosEnum.EstatusDocumentosTypes), 2);
                venta.Consecutivo = Convert.ToInt16(GetConsecutivo(true));
                consecutivo       = venta.Consecutivo;
                venta.Fecha       = DateTime.Now;
                venta.IdCaja      = curCaja;
                venta.IdCliente   = Convert.ToInt32(txtCliente.Text);
                venta.IdUsuario   = curUser;
                // los textos de totales ya tienen el redondeo aplicado
                // por eso esta bien que los guarde desde ahi
                venta.TotalDescuentos = Convert.ToDecimal(string.IsNullOrEmpty(this.txtTotalDescuento.Text) ? "0" : this.txtTotalDescuento.Text);
                venta.TotalImpuestos  = Convert.ToDecimal(string.IsNullOrEmpty(this.txtTotalImpuestos.Text) ? "0" : this.txtTotalImpuestos.Text);
                venta.TotalVenta      = Convert.ToDecimal(this.txtGrandTotal.Text);
                // guarda detalle
                foreach (var item in detailRep.CartLines)
                {
                    var ventaDetalle = new ControlEntity.DetalleVenta();
                    ventaDetalle.Cantidad   = item.Cantidad;
                    ventaDetalle.Descuento  = item.MontoDescuento;
                    ventaDetalle.IdProducto = item.Producto.IdProducto;
                    ventaDetalle.Precio     = item.Producto.PrecioVenta;
                    ventaDetalle.Impuestos  = item.Cantidad *
                                              (item.Producto.PrecioVenta * item.Producto.Descuento / 100);
                    commB.AddEntity <ControlEntity.DetalleVenta>(ventaDetalle);
                    if (item.Producto.VerificaDisponible)
                    {
                        var existencia = inventBL.GetExistenciaByIdProducto(item.Producto.IdProducto);
                        if (existencia != null)
                        {
                            if (existencia.Cantidad >= item.Cantidad)
                            {
                                /// actualizar costo: get costo
                                existencia.Cantidad -= item.Cantidad;
                                //inventBL.UpdateExistenciaVentas(existencia, item.Cantidad); da error de que no ha insertado encabezado de factura
                            }
                            else
                            {
                                commB.Reload(existencia);
                                lblMensaje.Text = "El producto " + item.Producto.Descripcion +
                                                  " no posee suficientes existencias para cumplir con la cantidad solicitada, por favor disminuya la cantidad solicitada";
                                continuar = false;
                                break;
                            }
                        }
                    }
                    /// insertar movimiento de inventario
                }
                commB.CreateEntity <ControlEntity.Venta>(venta);
                if (continuar)
                {
                    /// salvar pagos
                    foreach (var pago in pagosRep.PagosLines)
                    {
                        switch (pago.FormaPago)
                        {
                        case "Efectivo":
                            /// actualiza saldo caja efectivo
                            if (ventasB.UpdateSaldoCaja(curCaja, pago.MontoAplicado, 0) <= 0)
                            {
                                continuar = false;
                                break;
                            }
                            /// actualiza efectivo si recibido > aplicado
                            var cambio = pago.MontoPagado - pago.MontoAplicado;
                            if (pago.MontoPagado > pago.MontoAplicado)
                            {
                                if (ventasB.UpdateSaldoCaja(curCaja, -(cambio), 0) <= 0)
                                {
                                    continuar = false;
                                }
                            }
                            break;

                        case "Tarjeta":
                        case "Cheque":
                            /// actualiza saldo caja documentos
                            if (ventasB.UpdateSaldoCaja(curCaja, 0, pago.MontoAplicado) <= 0)
                            {
                                continuar = false;
                            }
                            /// actualiza efectivo si recibido > aplicado
                            var cambioDocumentos = pago.MontoPagado - pago.MontoAplicado;
                            if (pago.MontoPagado > pago.MontoAplicado)
                            {
                                if (ventasB.UpdateSaldoCaja(curCaja, -(cambioDocumentos), 0) <= 0)
                                {
                                    continuar = false;
                                }
                            }
                            break;

                        case "Credito":
                            if (!ActualizaCxc(pago, consecutivo))
                            {
                                continuar = false;
                            }
                            break;

                        default:
                            break;
                        }
                        /// inserta en pagos documentos: hay que hacer la tabla
                        var newPago = new ControlEntity.Pago();
                        newPago.IdBanco             = pago.Banco;
                        newPago.Estado              = "Normal";
                        newPago.IdCaja              = curCaja;
                        newPago.ConsecutivoVentas   = consecutivo;
                        newPago.FormaPago           = pago.FormaPago;
                        newPago.IdLinea             = pago.Linea;
                        newPago.IdTarjeta           = pago.Tarjeta;
                        newPago.MontoAplicado       = pago.MontoAplicado;
                        newPago.MontoRecibido       = pago.MontoPagado;
                        newPago.NumeroChequeTarjeta = pago.Documento;
                        /// save
                        ventasB.SavePago(newPago);
                    }
                }
                if (!continuar)
                {
                    commB.Rollback();
                    return(0);
                }
                commB.Commit();
                return(venta.Consecutivo);
            }
            catch (Exception ex)
            {
                commB.Rollback();
                ControlBusiness.BusinessHelpers.General.DoError(ex, "Control", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                return(0);
            }
        }