/// <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); }
/// <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); }