示例#1
0
        /// <summary>
        /// Deshabilita la relación Egreso/Ingreso - CFDI de Pagos, así como los Documentos Relacionados
        /// </summary>
        /// <param name="id_egreso_ingreso_comprobante">Id de Realción Egreso/Ingreso CFDI de Pago</param>
        /// <param name="id_usuario">Id de Usuario que realiza la operación</param>
        /// <returns></returns>
        public static RetornoOperacion DeshabilitaEgresoIngresoComprobante(int id_egreso_ingreso_comprobante, int id_usuario)
        {
            //Declarando objeto de retorno
            RetornoOperacion resultado = new RetornoOperacion(string.Format("Error al Deshabilitar relación Egreso/Ingreso - CFDI. Id: '{0}'", id_egreso_ingreso_comprobante));

            //Realizando transacción
            using (TransactionScope scope = Transaccion.InicializaBloqueTransaccional(System.Transactions.IsolationLevel.ReadCommitted))
            {
                //Instanciando Registro
                using (EgresoIngresoComprobante eic = new EgresoIngresoComprobante(id_egreso_ingreso_comprobante))
                {
                    //Si el registro existe
                    if (eic.habilitar)
                    {
                        //Deshabilitando
                        resultado = eic.DeshabilitaEgresoIngresoComprobante(id_usuario);
                        //Si no hay errores
                        if (resultado.OperacionExitosa)
                        {
                            //Deshabilitando relaciones de CFDI (documentos relacionados)
                            resultado = ComprobantePagoDocumentoRelacionado.DeshabilitarDocumentosRelacionadosIngresoEgresoComprobantePago(eic.id_egreso_ingreso_comprobante, id_usuario);
                        }
                    }
                }
                //Si no hay errores
                if (resultado.OperacionExitosa)
                {
                    //Confirmando cambios realizados
                    scope.Complete();
                }
            }
            //Devolviendo resultado
            return(resultado);
        }
示例#2
0
        /// <summary>
        /// Añade un conjunto de Pagos (FI) a un CFDI de Recepción de Pagos
        /// </summary>
        /// <param name="lista_fi">Lista de Pagos y su Id de Relación previa existente</param>
        /// <param name="id_usuario">Id de Usuario que realiza la operación</param>
        /// <param name="id_comprobante_pago">Id de CFDI de Recepción de Pagos</param>
        /// <returns></returns>
        public static RetornoOperacion AgregarIngresosACFDIPagos(List <KeyValuePair <int, int> > lista_fi, int id_usuario, int id_comprobante_pago)
        {
            //Declarando objeto de Retorno
            RetornoOperacion resultado = new RetornoOperacion(id_comprobante_pago);

            //Inicializando bloque transaccional
            using (TransactionScope scope = Transaccion.InicializaBloqueTransaccional(System.Transactions.IsolationLevel.ReadCommitted))
            {
                //Instanciando CFDI de Pagos
                using (Comprobante cfdi = new Comprobante(id_comprobante_pago))
                {
                    //SI no se ha generado
                    if (cfdi.habilitar && !cfdi.bit_generado)
                    {
                        //Si la lista contiene elementos válidos
                        if (lista_fi.Count(fi => fi.Key == 0) == 0)
                        {
                            //Se realiza la inserción de la(s) relacion(es) entre el Ingreso y el CFDI registrado
                            foreach (KeyValuePair <int, int> fi in lista_fi)
                            {
                                //Instanciando pago
                                using (Bancos.EgresoIngreso ingreso = new Bancos.EgresoIngreso(fi.Key))
                                {
                                    //Validando conjunto de aplicaciones realizadas sobre la FI
                                    if (ingreso.estatus == Bancos.EgresoIngreso.Estatus.Aplicada)
                                    {
                                        //Recuperando aplicaciones de FI
                                        using (DataTable mitAplicaciones = Reporte.ObtienesDoctoRelacionadoFIFacturaElectronicaRecepcionPago(ingreso.id_egreso_ingreso))
                                        {
                                            //Si existe al menos una aplicación
                                            if (mitAplicaciones != null)
                                            {
                                                //Insertando relación de CFDI de pago y FI
                                                resultado = InsertaEgresoIngresoComprobante(fi.Key, (byte)TipoOperacion.ComprobanteCliente, id_comprobante_pago, (byte)Estatus.Registrado, fi.Value, id_usuario);
                                                //Preservando Id de Relación FI - Comprobante de Pago
                                                int id_ingreso_comprobante_pago = resultado.IdRegistro;
                                                //Si no hay errores
                                                if (resultado.OperacionExitosa)
                                                {
                                                    //Para cada aplicación
                                                    foreach (DataRow apl in mitAplicaciones.Rows)
                                                    {
                                                        //Validando que el saldo del Documento Relacionado no sea negativo
                                                        if ((Convert.ToDecimal(apl["SaldoAnterior"]) - Convert.ToDecimal(apl["MontoPago"])) >= 0)
                                                        {
                                                            //Realizando inserción de Documentos Relacionados (CFDI Aplicados en el pago del Cliente - FI)
                                                            resultado = ComprobantePagoDocumentoRelacionado.InsertarComprobantePagoDocumentoRelacionado(ComprobantePagoDocumentoRelacionado.TipoOperacion.Ingreso, id_comprobante_pago, ComprobantePagoDocumentoRelacionado.TipoOperacionDocumento.Ingreso, Convert.ToInt32(apl["IdDocumentoRelacionado"]), fi.Key, Convert.ToInt32(apl["IdAplicacion"]), Convert.ToDecimal(apl["SaldoAnterior"]), Convert.ToDecimal(apl["MontoPago"]), Convert.ToByte(apl["Secuencia"]), id_ingreso_comprobante_pago, id_usuario);
                                                            //Si hay algún error
                                                            if (!resultado.OperacionExitosa)
                                                            {
                                                                //Instanciando CFDI (Docto. Relacionado) con problemas
                                                                using (Comprobante cfdiDoctoRel = new Comprobante(Convert.ToInt32(apl["IdDocumentoRelacionado"])))
                                                                    //Indicando que CFDI tuvo el problema
                                                                    resultado = new RetornoOperacion(string.Format("Error al Registrar Docto. Relacionado '{0}{1}': Este CFDI ya contiene una relación con este documento o bien ya existe el número de parcialidad del mismo.", cfdiDoctoRel.serie, cfdiDoctoRel.folio));
                                                                break;
                                                            }
                                                        }
                                                        else
                                                        {
                                                            resultado = new RetornoOperacion("Esta acción no se puede completar debido a que alguno de los Documentos Relacionados (UUID) se reportaría con Saldo negativo.");
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    //Si el estatus no es válido (es distinto de aplicación parcial o total)
                                    else
                                    {
                                        resultado = new RetornoOperacion(string.Format("El estatus actual del pago del cliente es '{0}', no es posible generar su CFDI.", ingreso.estatus));
                                    }
                                }
                            }
                        }
                        else
                        {
                            resultado = new RetornoOperacion("Uno o más Pagos tienen un identificador '0' (o no hay elementos especificados), es imposible agregar al CFDI.");
                        }
                    }
                    else
                    {
                        resultado = new RetornoOperacion("El Comprobante ya fue Timbrado. No es posible agregar o quitar Pagos.");
                    }
                    //Si no hay errores, se confirman cambios realizados
                    if (resultado.OperacionExitosa)
                    {
                        resultado = new RetornoOperacion(id_comprobante_pago);
                        scope.Complete();
                    }
                }
            }
            return(resultado);
        }