using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using System.ServiceModel; using System.Text; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using Extensiones; using static Extensiones.ModExtensiones; using Microsoft.Reporting.WebForms; public partial class Ventas_RepCancelacionesPorRespuesta : ClsPaginas { private DataTable DtVentas { get { return (ViewState["DtVentas"] == null) ? null : (DataTable)ViewState["DtVentas"]; } set { ViewState["DtVentas"] = value; } } private int CveVenta { get { return (ViewState["CveVenta"] == null) ? -1 : ViewState["CveVenta"].ToString().ToEntero(); } set { ViewState["CveVenta"] = value; } } protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { CargaDatos(); } } private void CargaDatos() { HdnLigaRefacturar.Value = ""; if (Request["CveVenta"] != null) { this.CveVenta = Request["CveVenta"].ToString().ToEntero(); } var ObjVentas = new ClsVentas(); if (ObjVentas.GetVentas(UsuarioActual.CveEmpresa, "-1", "-1", -1, "-1", -1, -1, -2, -1, "-1", "-1", "-1", CveUsuarioConsulta: UsuarioActual.CveUsuario)) { if (Request["CveVenta"] != null && Request["CveVenta"].ToString().ToEntero() > 0) { DtVentas = ObjVentas.DtResultados.FiltraParametros($"CveVenta={Request["CveVenta"].ToString().ToEntero()}"); } else { DtVentas = ObjVentas.DtResultados.Copy(); } } ObjVentas.Dispose(); GvDatos.DataSource = DtVentas.FiltraParametros("CveEstatusFactura = 20 AND CveEstatusRefacturacion = 0"); var DtRefacturar = DtVentas.FiltraParametros("CveEstatusRefacturacion IN (1,3)"); if (DtRefacturar != null && DtRefacturar.Rows.Count > 0) { DivRefacturar.Visible = true; GvRefacturaciones.DataSource = DtRefacturar; GvRefacturaciones.DataBind(); } GvDatos.DataBind(); UPDatos.Update(); } protected void BtnValidar_Click(object sender, EventArgs e) { this.HdnLigaRefacturar.Value = ""; this.CveVenta = -1; GridViewRow GvRow = (GridViewRow)(((LinkButton)sender).NamingContainer); this.CveVenta = GvRow.DataKey("CveVenta").ToEntero(); int CveCliente = GvRow.DataKey("CveCliente").ToEntero(); string Total = GvRow.DataKey("Total"); string SubTotal = GvRow.DataKey("SubTotal"); string Uuid = GvRow.DataKey("FolioFiscal"); string RFCCliente = GvRow.DataKey("RFCCliente"); string Folio = GvRow.DataKey("Folio"); string TipoDocto = GvRow.DataKey("TipoDocto"); string Nombre = GvRow.DataKey("Nombre"); if (CveVenta > 0 && Uuid != "") { var resp = VerificarVigenciaSAT(CveVenta, CveCliente, Folio, TipoDocto, Uuid, UsuarioActual.Empresa.RFC, RFCCliente, Total); if (resp.EnviarAcuse) { Alert(resp.Mensaje,TipoMensaje.MsgConfirmacion,"BtnEnviarMailCancelacion();"); } else { Alert(resp.Mensaje); } } CargaDatos(); } protected void BtnValidarRefacturacion_Click(object sender, EventArgs e) { this.HdnLigaRefacturar.Value = ""; this.CveVenta = -1; GridViewRow GvRow = (GridViewRow)(((LinkButton)sender).NamingContainer); this.CveVenta = GvRow.DataKey("CveVenta").ToEntero(); int CveCliente = GvRow.DataKey("CveCliente").ToEntero(); string Total = GvRow.DataKey("Total"); string SubTotal = GvRow.DataKey("SubTotal"); string Uuid = GvRow.DataKey("FolioFiscal"); string RFCCliente = GvRow.DataKey("RFCCliente"); string Folio = GvRow.DataKey("Folio"); string TipoDocto = GvRow.DataKey("TipoDocto"); string Nombre = GvRow.DataKey("Nombre"); if (CveVenta > 0 && Uuid != "") { var respuesta = VerificarVigenciaSAT(CveVenta, CveCliente, Folio, TipoDocto, Uuid, UsuarioActual.Empresa.RFC, RFCCliente, Total, true); CargaDatos(); if (respuesta.CveEstatus.Contiene(4,5)) { HdnLigaRefacturar.Value = respuesta.LigaRefacturacion; Alert(respuesta.Mensaje, JSBtnAceptar: $"RefacturarDocumento();"); } else { Alert(respuesta.Mensaje,TipoMensaje.MsgAdvertencia); } //if (respuesta.IrARefacturar) //{ // Server.Transfer(respuesta.LigaRefacturacion); //} //else //{ // Alert(respuesta.Mensaje); // CargaDatos(); //} } UPDatos.Update(); } private MRespuestaSAT VerificarVigenciaSAT(int CveVenta, int CveCliente, string Folio, string TipoDocto, string uuid, string emisor, string receptor, string total, bool EsRefacturacion = false) { HdnLigaRefacturar.Value = ""; var retorno = new MRespuestaSAT() { Mensaje = "", EnviarAcuse = false, LigaRefacturacion = "", IrARefacturar = false }; var sb = new StringBuilder(); string CancelacionAcuse = ""; DateTime CancelacionFecha = DateTime.Now; int CveEstatus = 4; try { var resp = Timbrado.VerificarVigenciaSAT(uuid, UsuarioActual.Empresa.RFC, receptor, total, true); if (resp != null) { if (resp.Estado == null) { sb.Append("No se pudo comprobar el estado de la factura. El servicio del sat no esta disponible"); retorno.Mensaje = sb.ToString(); return retorno; } sb.AppendFormat("Folio Fiscal: {0}
", uuid); sb.AppendFormat("Código Estado: {0}
", resp.CodigoEstatus); sb.AppendFormat("Estado: {0}
", resp.Estado); sb.AppendFormat("Es Cancelable: {0}
", string.IsNullOrEmpty(resp.EsCancelable) ? "Desconocido" : resp.EsCancelable); sb.AppendFormat("Estatus de Cancelación: {0}

", string.IsNullOrEmpty(resp.EsCancelable) ? "Desconocido" : resp.EstatusCancelacion); if (!UsuarioActual.Empresa.FacturaProduccion && (string.IsNullOrEmpty(uuid) || uuid.Contains("test"))) { var respCancelacion = CancelarDocumento(CveVenta, CveEstatus, CveCliente, Folio, uuid, CancelacionAcuse, CancelacionFecha, TipoDocto, total.ToDouble(), UsuarioActual.Empresa.CvePAC, EsRefacturacion: EsRefacturacion); //sb.AppendFormat("{0}
", respCancelacion.Mensaje); if (!respCancelacion.HuboError) { CveEstatus = respCancelacion.CveEstatus; retorno.EnviarAcuse = true; sb.Append("El documento se canceló correctamente."); sb.Append($"
Imprimir Acuse"); if (!EsRefacturacion) { sb.Append("

¿Desea enviar el Acuse de Cancelación al Cliente?"); } } if (respCancelacion.CveEstatus.Contiene(4, 5) && EsRefacturacion) { retorno.IrARefacturar = true; retorno.LigaRefacturacion = string.Format("Ventas.aspx?CveDevolucion={0}&NuevaFactura=1", CveVenta); } } else { if ((resp.EsCancelable.ToUpper() == "NO CANCELABLE")) { sb.Append("Esta factura no es cancelable."); retorno.Mensaje = sb.ToString(); return retorno; } if (resp.Estado.ToUpper().Trim() == "CANCELADO" || resp.EstatusCancelacion.ToUpper() == "PLAZO VENCIDO") { CveEstatus = 5; var respCancelacion = CancelarDocumento(CveVenta, CveEstatus, CveCliente, Folio, uuid, CancelacionAcuse, CancelacionFecha, TipoDocto, total.ToDouble(), UsuarioActual.Empresa.CvePAC, EsRefacturacion: EsRefacturacion); //sb.AppendFormat("{0}
", respCancelacion.Mensaje); if (!respCancelacion.HuboError) { retorno.EnviarAcuse = true; CveEstatus = respCancelacion.CveEstatus; var ObjVentas = new ClsVentas(); if (ObjVentas.UpdateEstatusVenta(CveVenta, CveEstatus, UsuarioActual.CveEmpresa)) { sb.Append("El estatus de la factura fue cambiado a 'Cancelada'."); } else { sb.Append("Ocurrió un error al cambiar el estatus de la factura."); } ObjVentas.Dispose(); sb.Append("El documento se canceló correctamente."); sb.Append($"
Imprimir Acuse"); if (!EsRefacturacion) { sb.Append("

¿Desea enviar el Acuse de Cancelación al Cliente?"); } } if (respCancelacion.CveEstatus.Contiene(4, 5) && EsRefacturacion) { retorno.IrARefacturar = true; retorno.LigaRefacturacion = string.Format("Ventas.aspx?CveDevolucion={0}&NuevaFactura=1", CveVenta); } } else if (resp.EstatusCancelacion.ToUpper() == "SOLICITUD RECHAZADA") { //ASIGNAMOS ESTATUS EMITIDA CveEstatus = 3; var ObjVentas = new ClsVentas(); if (ObjVentas.UpdateEstatusVenta(CveVenta, CveEstatus, UsuarioActual.CveEmpresa)) { sb.Append("El estatus de la factura fue cambiado a 'Emitida'."); } else { sb.Append("Ocurrió un error al cambiar el estatus de la factura."); } ObjVentas.Dispose(); } else if (resp.Estado.ToUpper().Trim() == "VIGENTE" && string.IsNullOrEmpty(resp.EstatusCancelacion)) { //ASIGNAMOS ESTATUS EMITIDA CveEstatus = 3; var ObjVentas = new ClsVentas(); if (ObjVentas.UpdateEstatusVenta(CveVenta, CveEstatus, UsuarioActual.CveEmpresa)) { sb.Append("El estatus de la factura fue cambiado a 'Emitida'."); } else { sb.Append("Ocurrió un error al cambiar el estatus de la factura."); } ObjVentas.Dispose(); } } } else { sb.Append("No se pudo comprobar la vigencia de la factura."); retorno.Mensaje = sb.ToString(); return retorno; } } catch (Exception ex) { sb.Append("Error al consumir el servicio: " + ex.Message); retorno.Mensaje = sb.ToString(); return retorno; } retorno.CveEstatus = CveEstatus; retorno.Mensaje = sb.ToString(); return retorno; } private Modelos.Factura.MCancelacionVentaMensaje CancelarDocumento(int CveVenta, int CveEstatus, int CveCliente, string Folio, string FolioFiscal, string CancelacionAcuse, DateTime CancelacionFecha, string TipoComprobante, double Total, int CvePACCancelacion, bool EsRefacturacion = false) { Modelos.Factura.MCancelacionVentaMensaje retorno = null; var factura = new Modelos.Factura(UsuarioActual, CveVenta, UsuarioActual.CveEmpresa, EsCancelacion:true); if (EsRefacturacion) { retorno = factura.CancelarPorRefacturacion(); } else { retorno = factura.EjecutarCancelacionPendiente(CveEstatus, CancelacionFecha, CancelacionAcuse); } return retorno; } private string DecodeBase64(string strXMLCodificado) { try { byte[] decbuff = Convert.FromBase64String(strXMLCodificado); return System.Text.Encoding.UTF8.GetString(decbuff); } catch { return ""; } } protected void LnkValidar_Click(object sender, EventArgs e) { this.HdnLigaRefacturar.Value = ""; this.CveVenta = -1; if (DtVentas != null) { var sb = new StringBuilder(); foreach (DataRow Row in DtVentas.Rows) { int CveVenta = Row["CveVenta"].ToEntero(); string Total = Row["Total"].ToString(); string SubTotal = Row["SubTotal"].ToString(); string Uuid = Row["FolioFiscal"].ToString(); string RFCCliente = Row["RFCCliente"].ToString(); string Folio = Row["Folio"].ToString(); string TipoDocto = Row["TipoDocto"].ToString(); string Nombre = Row["Nombre"].ToString(); int CveCliente = Row["CveCliente"].ToEntero(); if (CveVenta > 0) { sb.AppendFormat("{0}
", VerificarVigenciaSAT(CveVenta, CveCliente, Folio, TipoDocto, Uuid, UsuarioActual.Empresa.RFC, RFCCliente, SubTotal)); } } Alert(sb.ToString()); } CargaDatos(); } protected void GvDatos_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { if (e.Row.DBCampo("PuedeRefacturar").ToString().ToEntero() == 0) { e.Row.Cells[10].Text = ""; } } } public void BtnEnviarMailCancelacion_Click(object sender, EventArgs e) { if (this.CveVenta > 0) { ImprimeCancelacion(this.CveVenta); } else { Alert("No se encontro la factura para enviar el acuse", TipoMensaje.MsgAdvertencia); } } public void ImprimeCancelacion(int CveVenta) { var Archivo = new System.IO.FileInfo(ModExtensiones.DirectorioBaseEmpresas + @"Empresas\Grales\Formatos\AcuseCancelacion.rdlc"); if (Archivo.Exists) { var ObjFactura = new Modelos.Factura(UsuarioActual, CveVenta, UsuarioActual.CveEmpresa); string SelloCancelacion = ""; string FechaCancelacion = ""; DataTable DtDatos = null; using (ClsVentas ObjVentas = new ClsVentas()) { if (ObjVentas.GetVenta(CveVenta, UsuarioActual.CveEmpresa)) { DtDatos = ObjVentas.DtResultados.Copy(); DataRow drv = DtDatos.Rows[0]; SelloCancelacion = drv["SelloCancelacion"].ToString(); FechaCancelacion = drv["FechaCancelacion"].ToString().ToDateTime().ToString("dd/MM/yyyy HH:mm:ss"); } } List parametros = new List(); parametros.Add(new ReportParameter("FechaCancelacion", FechaCancelacion.ToString())); parametros.Add(new ReportParameter("FolioFiscal", ObjFactura.FolioFiscal)); parametros.Add(new ReportParameter("RFCEmisor", UsuarioActual.Empresa.RFC)); parametros.Add(new ReportParameter("SelloCancelacion", SelloCancelacion)); byte[] ObjetoPDF = StreamPDF(@"Empresas\Grales\Formatos\AcuseCancelacion.rdlc", DtDatos, parametros, "AcuseCancelacion" + CveVenta); List LSRutasMail = new List(); string Asunto = string.Empty; string Cuerpo = string.Empty; StringBuilder sb = new StringBuilder(); if (UsuarioActual.CveEmpresa == 119) { sb.Append(""); sb.Append(""); sb.Append(""); sb.Append(""); sb.Append(" Acuse De Cancelación"); sb.Append(" "); sb.Append(""); sb.Append(""); sb.Append(" "); sb.Append($" Estimado Cliente {ObjFactura.Cliente.Nombre},

"); sb.Append($" Le informamos que Agroquímicos JAM, S.A. DE C.V ha cancelado el CFDI {ObjFactura.SerieFolio}, el cual ha quedado sin Efectos Fiscales y encontrará adjunto en este correo el Acuse de
"); sb.Append($" cancelación del SAT.
"); sb.Append(" POR LO QUE PEDIMOS ELIMINARLO Y NO INCLUIRLO EN SU CONTABILIDAD, YA QUE PUEDE REPRESENTAR UN PROBLEMA FISCAL PARA USTED O SU EMPRESA CUANDO EL SAT REALICE UNA FUTURA AUDITORIA
"); sb.Append(" EN SU CONTABILIDAD.
"); sb.Append(" "); sb.Append("




"); sb.Append(" Este correo se generó automaticamente, favor de no responder este mensaje."); sb.Append("
"); sb.Append(""); sb.Append(""); } else { sb.Append(""); sb.Append(""); sb.Append(""); sb.Append(""); sb.Append(" Acuse De Cancelación"); sb.Append(" "); sb.Append(""); sb.Append(""); sb.Append(" "); sb.Append($" Estimado Cliente {ObjFactura.Cliente.Nombre},

"); sb.Append($" A través del presente medio la Empresa {UsuarioActual.Empresa.Empresa} - {UsuarioActual.Empresa.RFC}, canceló el documento tipo {ObjFactura.TipodeComprobante}
"); sb.Append($" con folio {ObjFactura.SerieFolio} y el Importe de ${ObjFactura.Total}.

"); sb.Append(" Le hacemos llegar el acuse de cancelación.
"); sb.Append(" "); sb.Append("




"); sb.Append(" Este correo se generó automaticamente, favor de no responder este mensaje."); sb.Append("
"); sb.Append(""); sb.Append(""); } Asunto = $"Acuse de Cancelacion {ObjFactura.SerieFolio}"; Cuerpo = sb.ToString(); string DisplayName = ""; if (UsuarioActual.CveEmpresa == 119) DisplayName = "Facturación Agroquímicos JAM"; LSRutasMail.Add(new ClsSisMail.ArchivoMail() { ArchivoBinario = ObjetoPDF, NombreArchivo = $"AcuseCancelacion{ObjFactura.SerieFolio}.pdf" }); ClsSisMail ObjMail = new ClsSisMail(); if (ObjMail.SendMail(UsuarioActual.Empresa, ObjFactura.Cliente.Mail, Asunto, Cuerpo, "", LSRutasMail, Displayname: DisplayName)) { Alert("El acuse de cancelación ha sido envíado correctamente."); } else { Alert("El acuse de cancelación no pudo ser enviado.",TipoMensaje.MsgError); } } } } public class MRespuestaSAT { public int CveEstatus { get; set; } public bool EnviarAcuse { get; set; } public string LigaRefacturacion { get; set; } public bool IrARefacturar { get; set; } public string Mensaje { get; set; } }