public void Alta(LINEA_VENTA objeto)
 {
     using (SIST_SUPERMERCADOEntities ctx = SIST_SUPERMERCADOEntities.ObtenerInstancia())
     {
         ctx.LINEA_VENTA.AddObject(objeto);
         ctx.SaveChanges();
     }
 }
 public void Modificacion(LINEA_VENTA objeto)
 {
     using (SIST_SUPERMERCADOEntities ctx = SIST_SUPERMERCADOEntities.ObtenerInstancia())
     {
         ctx.LINEA_VENTA.Attach(objeto);
         ctx.ObjectStateManager.ChangeObjectState(objeto, System.Data.EntityState.Modified);
         ctx.SaveChanges();
     }
 }
 public LINEA_VENTA AltaConRetorno(LINEA_VENTA objeto)
 {
     using (SIST_SUPERMERCADOEntities ctx = SIST_SUPERMERCADOEntities.ObtenerInstancia())
     {
         ctx.LINEA_VENTA.AddObject(objeto);
         ctx.SaveChanges();
         return ObtenerPorID(objeto.LIN_ID);
     }
 }
 //public void BajaLogica(LINEA_VENTA entidad)
 //{
 //    entidad.CLI_ESTADO = false;
 //    mLINEA_VENTA.Modificacion();
 //}
 public void BajaFisica(LINEA_VENTA entidad)
 {
     mLINEA_VENTA.Baja(entidad);
 }
 public void Modificacion(LINEA_VENTA entidad)
 {
     mLINEA_VENTA.Modificacion(entidad);
 }
 public void Alta(LINEA_VENTA entidad)
 {
     mLINEA_VENTA.Alta(entidad);
 }
 public LINEA_VENTA AltaConRetorno(LINEA_VENTA entidad)
 {
     return mLINEA_VENTA.AltaConRetorno(entidad);
 }
 /// <summary>
 /// Crear un nuevo objeto LINEA_VENTA.
 /// </summary>
 /// <param name="lIN_ID">Valor inicial de la propiedad LIN_ID.</param>
 /// <param name="lIN_CANTIDAD">Valor inicial de la propiedad LIN_CANTIDAD.</param>
 /// <param name="lIN_PRECIOUNIDAD">Valor inicial de la propiedad LIN_PRECIOUNIDAD.</param>
 /// <param name="lIN_TOTAL">Valor inicial de la propiedad LIN_TOTAL.</param>
 /// <param name="vTA_ID">Valor inicial de la propiedad VTA_ID.</param>
 /// <param name="lIN_PRECIOCOSTO">Valor inicial de la propiedad LIN_PRECIOCOSTO.</param>
 /// <param name="lIN_PRECIONETO">Valor inicial de la propiedad LIN_PRECIONETO.</param>
 /// <param name="lIN_TIVA_PORCENTAJE">Valor inicial de la propiedad LIN_TIVA_PORCENTAJE.</param>
 /// <param name="lIN_DESCRIPCION">Valor inicial de la propiedad LIN_DESCRIPCION.</param>
 /// <param name="lIN_DESCRESUMIDA">Valor inicial de la propiedad LIN_DESCRESUMIDA.</param>
 public static LINEA_VENTA CreateLINEA_VENTA(global::System.Int32 lIN_ID, global::System.Decimal lIN_CANTIDAD, global::System.Decimal lIN_PRECIOUNIDAD, global::System.Decimal lIN_TOTAL, global::System.Int32 vTA_ID, global::System.Decimal lIN_PRECIOCOSTO, global::System.Decimal lIN_PRECIONETO, global::System.Decimal lIN_TIVA_PORCENTAJE, global::System.String lIN_DESCRIPCION, global::System.String lIN_DESCRESUMIDA)
 {
     LINEA_VENTA lINEA_VENTA = new LINEA_VENTA();
     lINEA_VENTA.LIN_ID = lIN_ID;
     lINEA_VENTA.LIN_CANTIDAD = lIN_CANTIDAD;
     lINEA_VENTA.LIN_PRECIOUNIDAD = lIN_PRECIOUNIDAD;
     lINEA_VENTA.LIN_TOTAL = lIN_TOTAL;
     lINEA_VENTA.VTA_ID = vTA_ID;
     lINEA_VENTA.LIN_PRECIOCOSTO = lIN_PRECIOCOSTO;
     lINEA_VENTA.LIN_PRECIONETO = lIN_PRECIONETO;
     lINEA_VENTA.LIN_TIVA_PORCENTAJE = lIN_TIVA_PORCENTAJE;
     lINEA_VENTA.LIN_DESCRIPCION = lIN_DESCRIPCION;
     lINEA_VENTA.LIN_DESCRESUMIDA = lIN_DESCRESUMIDA;
     return lINEA_VENTA;
 }
 /// <summary>
 /// Método desusado para agregar un nuevo objeto al EntitySet LINEA_VENTA. Considere la posibilidad de usar el método .Add de la propiedad ObjectSet&lt;T&gt; asociada.
 /// </summary>
 public void AddToLINEA_VENTA(LINEA_VENTA lINEA_VENTA)
 {
     base.AddObject("LINEA_VENTA", lINEA_VENTA);
 }
        private VENTA Ticket(string color)
        {
            //Comprobante = new COMPROBANTE();
            //int nroComprobante = (int)TipoComprobante.TIC_ULTIMONUMERO;
            //Comprobante.TIC_ID = TipoComprobante.TIC_ID;
            //Comprobante.COM_NROCOMPROBANTE = nroComprobante.ToString();
            //TipoComprobante.TIC_ULTIMONUMERO = nroComprobante + 1;

            //cTIPO_COMPROBANTES.Modificacion(TipoComprobante);
            //Comprobante = cCOMPROBANTE.AltaConRetorno(Comprobante);

            VENTA NuevaVta = new VENTA();
            NuevaVta.VTA_FECHA = DateTime.Now;
            NuevaVta.VTA_COLOR = color;
            NuevaVta.VTA_PORCENTAJEDESCUENTO = Convert.ToDecimal(txtDescuento.Text);
            NuevaVta.VTA_DIFTARJETA = Convert.ToDecimal(txtDiferenciaTarjeta.Text);
            NuevaVta.VTA_SUBTOTAL = Convert.ToDecimal(txtSubtotal.Text);
            NuevaVta.VTA_TOTAL = Convert.ToDecimal(txtTotal.Text);
            NuevaVta.VTA_CACELADA = false;
            NuevaVta.FOR_ID = FormaPago.FOR_ID;
            NuevaVta.CAJ_ID = CajaPerteneciente.CAJ_ID;
            //NuevaVta.COM_ID = Comprobante.COM_ID;
            NuevaVta.VTA_MONTOPAGO = Convert.ToDecimal(lblPagaCon.Text);

            // SI ES FACTURA A ASEGURARSE QUE SE TIENEN LOS DATOS DEL CLIENTE SI ES.
            if (ClienteConsumidorFinal)
            {
                NuevaVta.VTA_CONSUMIDORFINAL = true;
            }
            else
            {
                NuevaVta.VTA_CONSUMIDORFINAL = false;
                NuevaVta.CLI_ID_CONSUMIDOR = Cliente.CLI_ID;
            }

            NuevaVta = cVENTAS.AltaConRetorno(NuevaVta);

            foreach (LINEA_VENTA LineaEnGrilla in LineasEnGrilla)
            {
                var linea = new LINEA_VENTA
                {
                    LIN_DESCRIPCION = LineaEnGrilla.LIN_DESCRIPCION,
                    LIN_DESCRESUMIDA = LineaEnGrilla.LIN_DESCRESUMIDA,
                    LIN_TIVA_PORCENTAJE = LineaEnGrilla.LIN_TIVA_PORCENTAJE,
                    LIN_PRECIOCOSTO = LineaEnGrilla.LIN_PRECIOCOSTO,
                    LIN_PRECIOUNIDAD = LineaEnGrilla.LIN_PRECIOUNIDAD,
                    LIN_PRECIONETO = LineaEnGrilla.LIN_PRECIONETO,
                    LIN_CANTIDAD = LineaEnGrilla.LIN_CANTIDAD,
                    LIN_TOTAL = LineaEnGrilla.LIN_TOTAL,
                    LIN_ESTADOPROMO = LineaEnGrilla.LIN_ESTADOPROMO,
                    PRO_ID = LineaEnGrilla.PRO_ID,
                    CAT_ID = LineaEnGrilla.CAT_ID,
                    ENV_ID = LineaEnGrilla.ENV_ID,
                    LIN_GUID = LineaEnGrilla.LIN_GUID,
                    VTA_ID = NuevaVta.VTA_ID
                };

                cLINEA_VENTA.AltaConRetorno(linea);
            }

            //SI ES UNA CTA CTE LA FORMA DE PAGO DOY DE ALTA EL MOVIMIENTO DE LA CTA CTE Y ACTUALIZO LA CTA DEL CLIENTE
            TIPO_MOVIMIENTO eTIPO_MOVIMIENTO = cTIPO_MOVIMIENTOS.ObtenerPorDescripcion(TipoComprobante.TIC_DESCRIPCION);

            if (FormaPago.FOR_DESCRIPCION == Constantes.Efectivo)
            {
                CreaMovimientoCaja(NuevaVta, (decimal)NuevaVta.VTA_TOTAL, "Venta en Efectivo", "VENTA");
            }

            if (FormaPago.FOR_DESCRIPCION == "CTA CTE")
            {
                CONTROLADORA.cCTACTE_CLIENTE cCTACTE_CLIENTES = CONTROLADORA.cCTACTE_CLIENTE.ObtenerInstancia();
                CONTROLADORA.cMOVIMIENTO_CTACTE_CLIENTE cMOVIMIENTO_CTACTE_CLIENTES = CONTROLADORA.cMOVIMIENTO_CTACTE_CLIENTE.ObtenerInstancia();

                if (eTIPO_MOVIMIENTO == null)
                {
                    eTIPO_MOVIMIENTO = cTIPO_MOVIMIENTOS.ObtenerPorDescripcion(lblTipoComprobante.Text.ToUpper());
                }

                MOVIMIENTO_CTACTE_CLIENTE eMOV_CTA_CTE_CLI = new MOVIMIENTO_CTACTE_CLIENTE();

                var cta_cliente = cCLIENTE.ObtenerCtaCteCliente(Cliente);

                eMOV_CTA_CTE_CLI.TIPM_ID = eTIPO_MOVIMIENTO.TIPM_ID;
                eMOV_CTA_CTE_CLI.MCCC_VALORMOVIMIENTO = NuevaVta.VTA_TOTAL;
                eMOV_CTA_CTE_CLI.MCCC_CONCEPTO = Constantes.Debe;
                eMOV_CTA_CTE_CLI.MCCC_FECHAMOVIMIENTO = NuevaVta.VTA_FECHA;
                eMOV_CTA_CTE_CLI.MCCC_SALDOMOVIMIENTO = NuevaVta.VTA_TOTAL;
                eMOV_CTA_CTE_CLI.CCC_ID = cta_cliente.CCC_ID;
                eMOV_CTA_CTE_CLI.VTA_ID = NuevaVta.VTA_ID;

                cta_cliente.CCC_SALDO += NuevaVta.VTA_TOTAL;

                cCTACTE_CLIENTES.Modificacion(cta_cliente);
                cMOVIMIENTO_CTACTE_CLIENTES.Alta(eMOV_CTA_CTE_CLI);
            }

            //PONER QUE PASA CUANDO LA FORMA DE PAGO ES POR CHEQUEY TARJETA Y/O MULTIPLE
            if (FormaPago.FOR_DESCRIPCION == Constantes.Tarjeta)
            {
                Tarjeta = cTARJETA.AltaConRetorno(Tarjeta);
                NuevaVta.TARJ_ID = Tarjeta.TARJ_ID;
            }

            if (FormaPago.FOR_DESCRIPCION == Constantes.Cheque)
            {
                Cheque = cCHEQUE.AltaConRetorno(Cheque);
                NuevaVta.CHE_ID = Cheque.CHE_ID;

                //VALIDAR QUE SI EL CHEQUE ES MAYOR A LA VENTA GENERA UN MOVIMIENTO DE CAJA TIPO EXTRACCION Y EN LA DESCRIPCION
                //PONER VUELTO DE CHEQUE EN LA VENTA X.
                //sino generar la extraccion en caja y mostrar cartel que se generara una extraccion de caja.
                var totalVta = Convert.ToDecimal(txtTotal.Text);
                if (Cheque.CHE_VALOR > totalVta)
                {
                    string vuelto = (Cheque.CHE_VALOR - totalVta).ToString();
                    MostrarMensajeAdvertencia("Se generara una extraccion de caja, con la diferencia entre el valor del cheque y el total de la venta. Total de la extracion de caja " + vuelto + ".");

                    CreaMovimientoCaja(NuevaVta, Convert.ToDecimal(vuelto), "Vuelto de Cheque Nro: " + Cheque.CHE_NUMERO + ".", "EXTRACCION");
                }
            }

            if (FormaPago.FOR_DESCRIPCION == Constantes.NotaCredito)
            {
                if (NuevaVta == null)
                {
                    MostrarMensajeAdvertencia("Debe seleccionar una nota de crédito.");
                    NuevaVta = null;
                    return NuevaVta;
                }

                NuevaVta.NOT_ID = Nota_Credito.NOT_ID;

                var totalVta = Convert.ToDecimal(txtTotal.Text);
                if (Nota_Credito.NOT_TOTAL != totalVta)
                {
                    MostrarMensajeAdvertencia("El total de la venta tiene que ser igual al total de la nota de crédito.");
                    NuevaVta = null;
                    return NuevaVta;
                }
            }

            if (FormaPago.FOR_DESCRIPCION == Constantes.Multiple)
            {
                //SI ES SOLO CHEQUE GENERA MOVIMIENTO DE CAJA PORQUE DA UN VUELTO
                if (SoloCheques == "Solo Cheques")
                {
                    decimal totalPagos = 0;
                    foreach (var item in frmVENTAS.ListaMultiplesPagos)
                    {
                        totalPagos += item.CHE_VALOR;
                    }

                    string vuelto = (totalPagos - Convert.ToDecimal(txtTotal.Text)).ToString();
                    MostrarMensajeAdvertencia("Se generara una extraccion de caja, con la diferencia entre el valor de los cheque y el total de la venta. Total de la extracion de caja $" + vuelto + ".");

                    CreaMovimientoCaja(NuevaVta, Convert.ToDecimal(vuelto), "Vuelto de Cheque Nro: " + frmVENTAS.Cheque.CHE_NUMERO + ".", "EXTRACCION");
                }

                //GENERAR LA MULTIPLE CON LA LISTA DE PAGOS DE MULTIPLE
                var MultipleNew = new MULTIPLE();
                List<CHEQUE> chequesMultiples = new List<CHEQUE>();
                List<TARJETA> tarjetasMultiples = new List<TARJETA>();
                List<NOTA_CREDITO> notasCreditosMultiples = new List<NOTA_CREDITO>();
                decimal totalMultiple = 0;
                decimal totalMultipleEfectivo = 0;

                foreach (var item in ListaMultiplesPagos)
                {
                    switch (item.FORM_PAGO)
                    {
                        case Constantes.Cheque:
                            Cheque = new CHEQUE();
                            Cheque.BAN_ID = item.BAN_ID;
                            Cheque.CHE_FECHAEMISION = item.CHE_FECHAEMISION;
                            Cheque.CHE_FECHAVENCIMIENTO = item.CHE_FECHAVENCIMIENTO;
                            Cheque.CHE_NUMERO = item.CHE_NUMERO;
                            Cheque.CHE_VALOR = item.CHE_VALOR;

                            chequesMultiples.Add(Cheque);

                            totalMultiple += item.CHE_VALOR;
                            break;

                        case Constantes.NotaCredito:

                            notasCreditosMultiples.Add(item.NOTA_CREDITO);

                            totalMultiple += (decimal)item.NOTA_CREDITO.NOT_TOTAL;
                            break;

                        case Constantes.Tarjeta:
                            var Tarjeta = new TARJETA();
                            Tarjeta.TTARJ_ID = item.TARJ_TIPO_TARJETA.TTARJ_ID;
                            Tarjeta.TARJ_CUOTAS = item.TARJ_CUOTAS;
                            Tarjeta.TARJ_NUMERO = item.TARJ_NUMERO;
                            Tarjeta.TARJ_DNI = item.TARJ_DNI;
                            Tarjeta.TARJ_DIFTARJETA = item.TARJ_DIFTARJETA;
                            Tarjeta.TARJ_TOTALAPAGAR = item.TARJ_TOTALAPAGAR;
                            Tarjeta.TARJ_MONTOCUOTA = item.TARJ_MONTOCUOTA;
                            Tarjeta.TARJ_TOTAL = item.TARJ_TOTAL;

                            tarjetasMultiples.Add(Tarjeta);

                            totalMultiple += item.TARJ_TOTALAPAGAR;
                            break;

                        case Constantes.Efectivo:
                            MultipleNew.MUL_EFECTIVO = item.EFEC_MONTO;
                            totalMultiple += item.EFEC_MONTO;
                            totalMultipleEfectivo += item.EFEC_MONTO;
                            break;

                        default: break;
                    }
                }

                MultipleNew.MUL_MONTO = totalMultiple;
                cMULTIPLE.Alta(MultipleNew, tarjetasMultiples, chequesMultiples, notasCreditosMultiples);
                NuevaVta.MUL_ID = MultipleNew.MUL_ID;

                if (totalMultipleEfectivo != 0)
                {
                    CreaMovimientoCaja(NuevaVta, totalMultipleEfectivo, "Venta en Efectivo pago Multiple", "VENTA");
                }
            }

            if (FormaPago.FOR_DESCRIPCION == Constantes.Ficha)
            {
                foreach (LINEA_VENTA LineaEnGrilla in LineasEnGrilla)
                {
                    var linea = new DETALLE_FICHA();
                    linea.DETF_DESCRIPCION = LineaEnGrilla.LIN_DESCRIPCION;
                    linea.DETF_DESCRESUMIDA = LineaEnGrilla.LIN_DESCRESUMIDA;
                    linea.DETF_PRECIOUNIDAD = LineaEnGrilla.LIN_PRECIOUNIDAD;
                    linea.DETF_CANTIDAD = LineaEnGrilla.LIN_CANTIDAD;
                    linea.DETF_TOTAL = LineaEnGrilla.LIN_TOTAL;
                    linea.DETF_ESTADOPROMO = LineaEnGrilla.LIN_ESTADOPROMO;
                    linea.PRO_ID = LineaEnGrilla.PRO_ID;
                    linea.CAT_ID = LineaEnGrilla.CAT_ID;
                    linea.ENV_ID = LineaEnGrilla.ENV_ID;
                    linea.DETF_FECHA = DateTime.Now;
                    linea.FIC_ID = Ficha.FIC_ID;
                    linea.EMP_ID = eEmpleado.EMP_ID;

                    var Detalle = cDETALLE_FICHA.AltaConRetorno(linea);
                }
            }

            return NuevaVta;
        }
        private void LlenarLineaEnGrilla(PRODUCTO oProducto, CATEGORIA_PRODUCTO oCategoria, decimal? CAT_PRECIO, ENVASE oEnvase, bool ingresaMedianteCodBarra = true)
        {
            LINEA_VENTA linea = null;
            if (oProducto != null) //es producto
            {
                //controla la cantidad
                if (!ControlaCantidad(oProducto, 1))
                {
                    MostrarMensajeAdvertencia(Mensajes.ProductoSinStock);
                    return;
                }

                picProducto.ImageLocation = oProducto.PRO_IMAGEN;
                picProducto.SizeMode = PictureBoxSizeMode.StretchImage;
                txtPromocion.Visible = (oProducto.PRO_ESTADOPROMO == null) ? false : (bool)oProducto.PRO_ESTADOPROMO;

                decimal GANANCIA = 0;
                if (oProducto.PRO_ESTADOPROMO == false)
                    GANANCIA = oProducto.PRO_COSTO + Convert.ToDecimal(oProducto.PRO_COSTO * (oProducto.PRO_MARGENGANANCIAREAL / 100));
                else
                    GANANCIA = oProducto.PRO_COSTO + Convert.ToDecimal(oProducto.PRO_COSTO * (oProducto.PRO_MARGENPROMO / 100));

                if (oProducto.PRO_CODBALANZA != null) //es balanza
                {
                    if (!ingresaMedianteCodBarra) // si no se ingresa mediante codigo de barra
                    {
                        linea = new LINEA_VENTA();
                        linea.LIN_DESCRIPCION = oProducto.PRO_DESCRIPCION;
                        linea.LIN_DESCRESUMIDA = oProducto.PRO_DESCRECUMIDA;
                        linea.LIN_TIVA_PORCENTAJE = (decimal)oProducto.TIPO_IVA.TIVA_PORCENTAJE;
                        linea.LIN_PRECIOCOSTO = oProducto.PRO_COSTO;
                        linea.LIN_PRECIOUNIDAD = (oProducto.PRO_ESTADOPROMO == true) ? (decimal)oProducto.PRO_PRECIOPROMO : oProducto.PRO_PRECIOVTA;
                        linea.LIN_PRECIONETO = decimal.Round((oProducto.PRO_COSTO + GANANCIA) * Convert.ToDecimal((oProducto.TIPO_IVA.TIVA_PORCENTAJE / 100) + 1), 3);
                        linea.LIN_CANTIDAD = Convert.ToDecimal(1.ToString("0.000"));
                        linea.LIN_TOTAL = decimal.Round((linea.LIN_PRECIOUNIDAD * linea.LIN_CANTIDAD), 3);
                        linea.LIN_ESTADOPROMO = (oProducto.PRO_ESTADOPROMO == true) ? true : false;
                        linea.PRO_ID = oProducto.PRO_ID;
                        linea.PRODUCTO = oProducto;
                    }
                    else // si se ingresa mediante codigo de barra
                    {
                        string codigoBarra = MetodosComunes.RetornaSoloNumeros(txtCodigoBarra.Text);
                        var DigitoPrecio = codigoBarra.Substring(7, 5);

                        var AntesDeLaComa = DigitoPrecio.Substring(0, 3);
                        var NumDecimal = DigitoPrecio.Substring(3, 2);
                        var precioBalanza = Convert.ToDecimal(AntesDeLaComa + "," + NumDecimal);

                        if (eParametro.PAR_ADMINISTRAR_BALANZA) // toma el precio con el peso de la balanza
                        {
                            linea = new LINEA_VENTA();
                            linea.LIN_DESCRIPCION = oProducto.PRO_DESCRIPCION;
                            linea.LIN_DESCRESUMIDA = oProducto.PRO_DESCRECUMIDA;
                            linea.LIN_TIVA_PORCENTAJE = (decimal)oProducto.TIPO_IVA.TIVA_PORCENTAJE;
                            linea.LIN_PRECIOCOSTO = oProducto.PRO_COSTO;
                            linea.LIN_PRECIOUNIDAD = (oProducto.PRO_ESTADOPROMO == true) ? (decimal)oProducto.PRO_PRECIOPROMO : oProducto.PRO_PRECIOVTA;
                            linea.LIN_PRECIONETO = decimal.Round(Convert.ToDecimal(linea.LIN_PRECIOUNIDAD / ((linea.LIN_TIVA_PORCENTAJE / 100) + 1)), 3);
                            linea.LIN_CANTIDAD = decimal.Round(Convert.ToDecimal(precioBalanza / linea.LIN_PRECIOUNIDAD), 3);
                            linea.LIN_TOTAL = decimal.Round((linea.LIN_PRECIOUNIDAD * linea.LIN_CANTIDAD), 3);
                            linea.LIN_ESTADOPROMO = (oProducto.PRO_ESTADOPROMO == true) ? true : false;
                            linea.PRO_ID = oProducto.PRO_ID;
                            linea.PRODUCTO = oProducto;
                        }
                        else // toma el precio con la etiqueta
                        {
                            linea = new LINEA_VENTA();
                            linea.LIN_DESCRIPCION = oProducto.PRO_DESCRIPCION;
                            linea.LIN_DESCRESUMIDA = oProducto.PRO_DESCRECUMIDA;
                            linea.LIN_TIVA_PORCENTAJE = Constantes.PorcentajeIvaDefault;
                            linea.LIN_PRECIOCOSTO = (decimal)precioBalanza; //TODO: ver si esta bien ya que no se sabe el costo de la categoria
                            linea.LIN_PRECIOUNIDAD = Convert.ToDecimal(((decimal)precioBalanza).ToString("0.000"));
                            linea.LIN_PRECIONETO = decimal.Round(Convert.ToDecimal(linea.LIN_PRECIOUNIDAD / ((linea.LIN_TIVA_PORCENTAJE / 100) + 1)), 3);
                            linea.LIN_CANTIDAD = Convert.ToDecimal(1.ToString("0.000"));
                            linea.LIN_TOTAL = Convert.ToDecimal(((decimal)precioBalanza).ToString("0.000"));
                            linea.LIN_ESTADOPROMO = (oProducto.PRO_ESTADOPROMO == true) ? true : false;
                            linea.PRO_ID = oProducto.PRO_ID;
                            linea.PRODUCTO = oProducto;
                        }
                    }
                }
                else //es producto
                {
                    linea = new LINEA_VENTA();
                    linea.LIN_DESCRIPCION = oProducto.PRO_DESCRIPCION;
                    linea.LIN_DESCRESUMIDA = oProducto.PRO_DESCRECUMIDA;
                    linea.LIN_TIVA_PORCENTAJE = (decimal)oProducto.TIPO_IVA.TIVA_PORCENTAJE;
                    linea.LIN_PRECIOCOSTO = oProducto.PRO_COSTO;
                    linea.LIN_PRECIOUNIDAD = (oProducto.PRO_ESTADOPROMO == true) ? (decimal)oProducto.PRO_PRECIOPROMO : oProducto.PRO_PRECIOVTA;
                    linea.LIN_PRECIONETO = decimal.Round((oProducto.PRO_COSTO + GANANCIA) * Convert.ToDecimal((oProducto.TIPO_IVA.TIVA_PORCENTAJE / 100) + 1), 3);
                    linea.LIN_CANTIDAD = Convert.ToDecimal(1.ToString("0.000"));
                    linea.LIN_TOTAL = decimal.Round((linea.LIN_PRECIOUNIDAD * linea.LIN_CANTIDAD), 3);
                    linea.LIN_ESTADOPROMO = (oProducto.PRO_ESTADOPROMO == true) ? true : false;
                    linea.PRO_ID = oProducto.PRO_ID;
                    linea.PRODUCTO = oProducto;
                }
            }
            if (oCategoria != null) //es categoria
            {
                linea = new LINEA_VENTA();
                linea.LIN_DESCRIPCION = oCategoria.CAT_DESCRIPCION;
                linea.LIN_DESCRESUMIDA = oCategoria.CAT_DESCRIPCION;
                linea.LIN_TIVA_PORCENTAJE = Constantes.PorcentajeIvaDefault;
                linea.LIN_PRECIOCOSTO = (decimal)CAT_PRECIO; //TODO: ver si esta bien ya que no se sabe el costo de la categoria
                linea.LIN_PRECIOUNIDAD = Convert.ToDecimal(((decimal)CAT_PRECIO).ToString("0.000"));
                linea.LIN_PRECIONETO = decimal.Round(Convert.ToDecimal(linea.LIN_PRECIOUNIDAD / ((linea.LIN_TIVA_PORCENTAJE / 100) + 1)), 3);
                linea.LIN_CANTIDAD = Convert.ToDecimal(1.ToString("0.000"));
                linea.LIN_TOTAL = decimal.Round((linea.LIN_PRECIOUNIDAD * linea.LIN_CANTIDAD), 3);
                linea.LIN_ESTADOPROMO = false;
                linea.CAT_ID = oCategoria.CAT_ID;
                linea.CATEGORIA_PRODUCTO = oCategoria;
            }
            if (oEnvase != null) //es envase
            {
                linea = new LINEA_VENTA();
                linea.LIN_DESCRIPCION = oEnvase.ENV_DESCRIPCION;
                linea.LIN_DESCRESUMIDA = oEnvase.ENV_DESCRIPCION;
                linea.LIN_TIVA_PORCENTAJE = Constantes.PorcentajeIvaDefault;
                linea.LIN_PRECIOCOSTO = oEnvase.ENV_PRECIO_COSTO;
                linea.LIN_PRECIOUNIDAD = oEnvase.ENV_PRECIO;
                linea.LIN_PRECIONETO = decimal.Round(Convert.ToDecimal(linea.LIN_PRECIOUNIDAD / ((linea.LIN_TIVA_PORCENTAJE / 100) + 1)), 3);
                linea.LIN_CANTIDAD = Convert.ToDecimal(1.ToString("0.000"));
                linea.LIN_TOTAL = decimal.Round((linea.LIN_PRECIOUNIDAD * linea.LIN_CANTIDAD), 3);
                linea.LIN_ESTADOPROMO = false;
                linea.ENV_ID = oEnvase.ENV_ID;
                linea.ENVASE = oEnvase;
            }

            linea.INGRESAMEDIANTECODBARRA = ingresaMedianteCodBarra;
            linea.LIN_GUID = Guid.NewGuid().ToString();
            AgregarLineasEnGrilla(linea);

            LlenaLabelTotales();
            ControlaStock(oProducto, oCategoria, oEnvase);

            if (dgvGrilla.Rows.Count > 0)
            {
                dgvGrilla.CurrentCell = dgvGrilla.Rows[dgvGrilla.Rows.Count - 1].Cells[0];
            }

            if ((oProducto != null && oProducto.PRO_GRANEL == true) || (oProducto != null && oProducto.PRO_CODBALANZA != null && !ingresaMedianteCodBarra))
            {
                btnCantidad(); //abre frmCantidad
            }

            Nuevo_Item();
        }
        private void LlenaGrillaDesdePresupuesto()
        {
            var LineasEnGrillaTemporal = new List<LINEA_VENTA>();
            var LineasEnGrillaTemporalSinStock = new List<LINEA_VENTA>();

            foreach (DETALLE_PRESUPUESTO detallePresupuesto in Presupuesto.DETALLES_PRESUPUESTO)
            {
                LINEA_VENTA linea = new LINEA_VENTA();
                linea.LIN_DESCRIPCION = detallePresupuesto.DETP_DESCRIPCION;
                linea.LIN_DESCRESUMIDA = detallePresupuesto.DETP_DESCRIPCION;
                linea.LIN_TIVA_PORCENTAJE = detallePresupuesto.DETP_TIVA_PORCENTAJE;
                linea.LIN_PRECIOCOSTO = detallePresupuesto.DETP_PRECIOCOSTO;
                linea.LIN_PRECIOUNIDAD = detallePresupuesto.DETP_PRECIOUNIDAD;
                linea.LIN_PRECIONETO = detallePresupuesto.DETP_PRECIONETO;
                linea.LIN_CANTIDAD = detallePresupuesto.DETP_CANTIDAD;
                linea.LIN_TOTAL = detallePresupuesto.DETP_TOTAL;
                linea.LIN_ESTADOPROMO = false;
                linea.PRO_ID = detallePresupuesto.PRO_ID;
                linea.PRODUCTO = detallePresupuesto.PRODUCTO;
                linea.CAT_ID = detallePresupuesto.CAT_ID;
                linea.CATEGORIA_PRODUCTO = detallePresupuesto.CATEGORIA_PRODUCTO;
                linea.ENV_ID = detallePresupuesto.ENV_ID;
                linea.ENVASE = detallePresupuesto.ENVASE;

                linea.LIN_GUID = Guid.NewGuid().ToString();

                if (linea.PRODUCTO != null) //es producto
                {
                    //controla la cantidad, agrega linea si la cantidad es correcta
                    if (ControlaCantidad(linea.PRODUCTO, linea.LIN_CANTIDAD))
                    {
                        LineasEnGrillaTemporal.Add(linea);
                    }
                    else
                    {
                        decimal result = (decimal)linea.PRODUCTO.PRO_STOCKACTUAL;
                        if (result > 0) //controlo si se puede agregar con la cantidad existente
                        {
                            linea.LIN_CANTIDAD = result;
                            LineasEnGrillaTemporal.Add(linea);
                        }
                        LineasEnGrillaTemporalSinStock.Add(linea);
                    }
                }
            }

            if (LineasEnGrillaTemporalSinStock.Count > 0)
            {
                string productoSinStock = string.Empty;
                foreach (var item in LineasEnGrillaTemporalSinStock)
                {
                    productoSinStock = string.Concat(productoSinStock, item.PRODUCTO.PRO_DESCRIPCION, "\n");
                }
                MostrarMensajeAdvertencia(string.Format("Los siguientes productos se encuentran sin Stock: \n {0}", productoSinStock));
            }

            LineasEnGrilla = LineasEnGrillaTemporal;
        }
        private void AgregarLineasEnGrilla(LINEA_VENTA linea)
        {
            if (LineasEnGrilla == null)
                LineasEnGrilla = new List<LINEA_VENTA>();

            if (!ControlaSumaVenta(linea.LIN_PRECIOUNIDAD, linea.LIN_CANTIDAD, Convert.ToDecimal(txtTotal.Text)))
                return;

            if (linea.PRO_ID != null) //es producto
            {
                if (linea.PRODUCTO.PRO_CODBALANZA != null) //es balanza
                {
                    LineasEnGrilla.Add(linea);
                    return;
                }
                if (linea.PRODUCTO != null && linea.PRODUCTO.PRO_GRANEL == true) //es granel
                {
                    LineasEnGrilla.Add(linea);
                    return;
                }
                else //es producto
                {
                    int bandera = 0;

                    foreach (var item in LineasEnGrilla)
                    {
                        //si el producto existe en la grilla entra y le suma la cantidad correcta y pone la bandera en 1
                        if (item.PRO_ID != null && item.PRO_ID == linea.PRODUCTO.PRO_ID)
                        {
                            item.LIN_CANTIDAD += linea.LIN_CANTIDAD;

                            //CALCULO DEL PRECIO
                            item.LIN_TOTAL = Convert.ToDecimal(decimal.Round(linea.LIN_PRECIOUNIDAD * item.LIN_CANTIDAD, 3).ToString("0.000"));
                            bandera = 1;
                        }
                    }
                    //si no entro xq el producto no existe la bandera esta en 0 y entra para agregarlo a la grilla
                    if (bandera == 0)
                    {
                        LineasEnGrilla.Add(linea);
                        return;
                    }
                }
            }
            if (linea.CAT_ID != null) //es categoria
            {
                LineasEnGrilla.Add(linea);
                return;
            }
            if (linea.ENV_ID != null) //es envase
            {
                int bandera = 0;

                foreach (var item in LineasEnGrilla)
                {
                    //si el producto existe en la grilla entra y le suma la cantidad correcta y pone la bandera en 1
                    if (item.ENV_ID != null && item.ENV_ID == linea.ENVASE.ENV_ID)
                    {
                        item.LIN_CANTIDAD += linea.LIN_CANTIDAD;

                        //CALCULO DEL PRECIO
                        item.LIN_TOTAL = Convert.ToDecimal(decimal.Round(linea.LIN_PRECIOUNIDAD * item.LIN_CANTIDAD, 3).ToString("0.000"));
                        bandera = 1;
                    }
                }
                //si no entro xq el producto no existe la bandera esta en 0 y entra para agregarlo a la grilla
                if (bandera == 0)
                {
                    LineasEnGrilla.Add(linea);
                    return;
                }
            }
        }
        private void btnCERRARFICHA_Click(object sender, EventArgs e)
        {
            //GENERAR LA VENTA SIN ACTUALIZAR STOCK PORQUE EL STOCK YA SE RESTO CUANDO SE VENDIO
            try
            {
                if (dgvGRILLA_FICHAS.CurrentRow == null)
                {
                    MostrarMensajeAdvertencia(Mensajes.SeleccionarItem);
                    return;
                }

                if (!validar_CerrarFicha())
                    return;

                var fichaSeleccionada = cFICHA.ObtenerPorID(Convert.ToInt32(dgvGRILLA_FICHAS.CurrentRow.Cells[0].Value));
                var fichaAldiaDeHoy = new FICHA();
                fichaAldiaDeHoy = cFICHA.CalcularFichaAlDiaDeHoy(fichaSeleccionada);
                var TotalFicha = fichaAldiaDeHoy.FIC_TOTAL;

                var rta = MostrarMensajePreguntaSI_NO("Al cerrar la ficha se genera una venta con cuenta corriente.\n Se guardará un movimiento en la cta cte del cliente " + ((CLIENTE)cmbCLIENTE.SelectedItem).CLI_NOMBREYAPELLIDO + ", con un total del movimiento de " + TotalFicha + ". Desea Continuar?\r\n.");
                if (!rta)
                    return;

                if (!Valida_Caja())
                {
                    return;
                };

                if (!Cobrar_Venta(fichaAldiaDeHoy))
                {
                    return;
                };

                using (TransactionScope TRANSACCION = new TransactionScope())
                {
                    //Comprobante = new COMPROBANTE();
                    //TipoComprobante = cTIPO_COMPROBANTES.ObtenerPorDescripcion(Constantes.Ticket);
                    //int nroComprobante = (int)TipoComprobante.TIC_ULTIMONUMERO;
                    //Comprobante.TIC_ID = TipoComprobante.TIC_ID;
                    //Comprobante.COM_NROCOMPROBANTE = nroComprobante.ToString();
                    //TipoComprobante.TIC_ULTIMONUMERO = nroComprobante + 1;

                    //cTIPO_COMPROBANTES.Modificacion(TipoComprobante);
                    //Comprobante = cCOMPROBANTE.AltaConRetorno(Comprobante);

                    VENTA NuevaVta = new VENTA();
                    NuevaVta.VTA_FECHA = DateTime.Now;
                    NuevaVta.VTA_COLOR = "B";
                    NuevaVta.VTA_PORCENTAJEDESCUENTO = 0;
                    NuevaVta.VTA_DIFTARJETA = 0;
                    NuevaVta.VTA_SUBTOTAL = fichaAldiaDeHoy.FIC_TOTAL;
                    NuevaVta.VTA_TOTAL = fichaAldiaDeHoy.FIC_TOTAL;
                    NuevaVta.VTA_CACELADA = false;
                    NuevaVta.FOR_ID = cFORMA_PAGO.ObtenerPorDescripcion(Constantes.CtaCte).FOR_ID;
                    NuevaVta.CAJ_ID = CajaPerteneciente.CAJ_ID;
                    //NuevaVta.COM_ID = Comprobante.COM_ID;
                    NuevaVta.VTA_MONTOPAGO = 0;

                    // SI ES FACTURA A ASEGURARSE QUE SE TIENEN LOS DATOS DEL CLIENTE SI ES.
                    NuevaVta.VTA_CONSUMIDORFINAL = false;
                    NuevaVta.CLI_ID_CONSUMIDOR = Cliente.CLI_ID;

                    NuevaVta = cVENTAS.AltaConRetorno(NuevaVta);

                    foreach (var linea in fichaAldiaDeHoy.DETALLES_FICHA)
                    {
                        LINEA_VENTA NuevaLinea = new LINEA_VENTA();

                        if (linea.PRO_ID != null) //es producto
                        {
                            NuevaLinea.LIN_DESCRIPCION = linea.DETF_DESCRIPCION;
                            NuevaLinea.LIN_DESCRESUMIDA = linea.DETF_DESCRESUMIDA;
                            NuevaLinea.LIN_PRECIOUNIDAD = (linea.PRODUCTO.PRO_ESTADOPROMO == true) ? (decimal)linea.PRODUCTO.PRO_PRECIOPROMO : linea.PRODUCTO.PRO_PRECIOVTA;
                            NuevaLinea.LIN_CANTIDAD = linea.DETF_CANTIDAD;
                            NuevaLinea.LIN_TOTAL = linea.PRODUCTO.PRO_PRECIOVTA * linea.DETF_CANTIDAD;
                            NuevaLinea.LIN_ESTADOPROMO = linea.DETF_ESTADOPROMO;
                            NuevaLinea.PRO_ID = linea.PRO_ID;

                            NuevaLinea.VTA_ID = NuevaVta.VTA_ID;
                            cLINEA_VENTA.Alta(NuevaLinea);

                            if (linea.DETF_TOTAL != NuevaLinea.LIN_TOTAL)
                            {
                                linea.DETF_TOTAL = NuevaLinea.LIN_TOTAL;
                                cDETALLE_FICHA.Modificacion(linea);
                            }
                        }
                        if (linea.CAT_ID != null) //es categoria
                        {
                            NuevaLinea.LIN_DESCRIPCION = linea.DETF_DESCRIPCION;
                            NuevaLinea.LIN_DESCRESUMIDA = linea.DETF_DESCRESUMIDA;
                            NuevaLinea.LIN_PRECIOUNIDAD = linea.DETF_PRECIOUNIDAD;
                            NuevaLinea.LIN_CANTIDAD = linea.DETF_CANTIDAD;
                            NuevaLinea.LIN_TOTAL = linea.DETF_TOTAL;
                            NuevaLinea.LIN_ESTADOPROMO = linea.DETF_ESTADOPROMO;
                            NuevaLinea.CAT_ID = linea.CAT_ID;

                            NuevaLinea.VTA_ID = NuevaVta.VTA_ID;
                            cLINEA_VENTA.Alta(NuevaLinea);
                        }

                        if (linea.ENV_ID != null) //es envase
                        {
                            NuevaLinea.LIN_DESCRIPCION = linea.DETF_DESCRIPCION;
                            NuevaLinea.LIN_DESCRESUMIDA = linea.DETF_DESCRESUMIDA;
                            NuevaLinea.LIN_PRECIOUNIDAD = linea.ENVASE.ENV_PRECIO;
                            NuevaLinea.LIN_CANTIDAD = linea.DETF_CANTIDAD;
                            NuevaLinea.LIN_TOTAL = linea.ENVASE.ENV_PRECIO * linea.DETF_CANTIDAD;
                            NuevaLinea.LIN_ESTADOPROMO = linea.DETF_ESTADOPROMO;
                            NuevaLinea.ENV_ID = linea.ENV_ID;

                            NuevaLinea.VTA_ID = NuevaVta.VTA_ID;
                            cLINEA_VENTA.Alta(NuevaLinea);

                            if (linea.DETF_TOTAL != NuevaLinea.LIN_TOTAL)
                            {
                                linea.DETF_TOTAL = NuevaLinea.LIN_TOTAL;
                                cDETALLE_FICHA.Modificacion(linea);
                            }
                        }
                    }

                    //SI ES UNA CTA CTE LA FORMA DE PAGO DOY DE ALTA EL MOVIMIENTO DE LA CTA CTE Y ACTUALIZO LA CTA DEL CLIENTE
                    TIPO_MOVIMIENTO eTIPO_MOVIMIENTO = cTIPO_MOVIMIENTOS.ObtenerPorDescripcion(TipoComprobante.TIC_DESCRIPCION);

                    //GENERO LA CUENTA CORRIENTE
                    CONTROLADORA.cCTACTE_CLIENTE cCTACTE_CLIENTES = CONTROLADORA.cCTACTE_CLIENTE.ObtenerInstancia();
                    CONTROLADORA.cMOVIMIENTO_CTACTE_CLIENTE cMOVIMIENTO_CTACTE_CLIENTES = CONTROLADORA.cMOVIMIENTO_CTACTE_CLIENTE.ObtenerInstancia();

                    if (eTIPO_MOVIMIENTO == null)
                    {
                        eTIPO_MOVIMIENTO = cTIPO_MOVIMIENTOS.ObtenerPorDescripcion(TipoComprobante.TIC_DESCRIPCION);
                    }

                    MOVIMIENTO_CTACTE_CLIENTE eMOV_CTA_CTE_CLI = new MOVIMIENTO_CTACTE_CLIENTE();

                    var cta_cliente = cCLIENTESES.ObtenerCtaCteCliente(Cliente);

                    eMOV_CTA_CTE_CLI.TIPM_ID = eTIPO_MOVIMIENTO.TIPM_ID;
                    eMOV_CTA_CTE_CLI.MCCC_VALORMOVIMIENTO = NuevaVta.VTA_TOTAL;
                    eMOV_CTA_CTE_CLI.MCCC_CONCEPTO = Constantes.Debe;
                    eMOV_CTA_CTE_CLI.MCCC_FECHAMOVIMIENTO = NuevaVta.VTA_FECHA;
                    eMOV_CTA_CTE_CLI.MCCC_SALDOMOVIMIENTO = NuevaVta.VTA_TOTAL;
                    eMOV_CTA_CTE_CLI.CCC_ID = cta_cliente.CCC_ID;
                    eMOV_CTA_CTE_CLI.VTA_ID = NuevaVta.VTA_ID;

                    cta_cliente.CCC_SALDO += NuevaVta.VTA_TOTAL;

                    cCTACTE_CLIENTES.Modificacion(cta_cliente);
                    cMOVIMIENTO_CTACTE_CLIENTES.Alta(eMOV_CTA_CTE_CLI);

                    //actualizo la ficha
                    eFicha = fichaAldiaDeHoy;

                    eFicha.VTA_ID = NuevaVta.VTA_ID;
                    eFicha.FIC_FECHACIERRE = DateTime.Now;
                    eFicha.FIC_TOTAL = fichaAldiaDeHoy.FIC_TOTAL;
                    eFicha.FIC_ESTADOAPERTURA = false;

                    cFICHA.Modificacion(eFicha);

                    //actualizo los detalle de la ficha
                    foreach (var item in eFicha.DETALLES_FICHA)
                    {
                        if (item.PRODUCTO != null) // si no es una categoria
                        {
                            item.DETF_PRECIOCOSTO = item.PRODUCTO.PRO_COSTO;
                            item.DETF_PRECIOUNIDAD = (item.PRODUCTO.PRO_ESTADOPROMO == true) ? (decimal)item.PRODUCTO.PRO_PRECIOPROMO : item.PRODUCTO.PRO_PRECIOVTA;
                            item.DETF_ESTADOPROMO = item.PRODUCTO.PRO_ESTADOPROMO;
                            item.DETF_PRECIOUNIDAD = item.PRODUCTO.PRO_PRECIOVTA;
                            item.DETF_TOTAL = item.DETF_PRECIOUNIDAD * item.DETF_CANTIDAD;

                            cDETALLE_FICHA.Modificacion(item);
                        }
                    }

                    cVENTAS.Modificacion(NuevaVta);

                    //TODO: sacar mensaje
                    MostrarMensajeInformativo("La Ficha se realizó con éxito, a continuación se imprimira el Comprobante.");
                    ImprimirReporteFicha(eFicha.FIC_ESTADOAPERTURA);

                    TRANSACCION.Complete();
                }

                ARMA_GRILLA_FICHA();
                dgvGRILLA_DETALLE_FICHA.DataSource = null;
            }
            catch (Exception ex)
            {
                ProcesarExcepcion(ex);
            }
        }