Option Explicit On
Option Strict On
Imports System
Imports System.Collections
Imports System.Collections.Generic
Imports System.Data
Imports System.IO
Imports System.Runtime.Remoting
Imports AjaxControlToolkit.AsyncFileUpload.Constants
Imports Extensiones
Imports Ionic.Zip
Imports Microsoft.Extensions.Primitives
Imports Microsoft.Reporting.WebForms
Imports Stimulsoft.Base
Partial Class Bancos_PagoElectronico
Inherits ClsPaginas
Private Shared missing As Object = System.Reflection.Missing.Value
#Region "PROPIEDADES"
Private Property HeaderTexto As String
Get
Return ViewState("HeaderTexto").ToString
End Get
Set(value As String)
ViewState("HeaderTexto") = value
End Set
End Property
Private Property DetalleTexto As String
Get
Return ViewState("DetalleTexto").ToString
End Get
Set(value As String)
ViewState("DetalleTexto") = value
End Set
End Property
Private Property TrailerTexto As String
Get
Return ViewState("TrailerTexto").ToString
End Get
Set(value As String)
ViewState("TrailerTexto") = value
End Set
End Property
Private Property TextoCompleto As String
Get
Return ViewState("TextoCompleto").ToString
End Get
Set(value As String)
ViewState("TextoCompleto") = value
End Set
End Property
Private Property Vacio As String
Get
Return ViewState("Vacio").ToString
End Get
Set(value As String)
ViewState("Vacio") = value
End Set
End Property
Private Property NombreArchivo As String
Get
Return ViewState("NombreArchivo").ToString
End Get
Set(value As String)
ViewState("NombreArchivo") = value
End Set
End Property
Private Property DTPendientes As DataTable
Get
Return CType(ViewState("DTPendientes"), DataTable)
End Get
Set(value As DataTable)
ViewState("DTPendientes") = value
End Set
End Property
Private Property DTProveedores As DataTable
Get
Return CType(ViewState("DTProveedores"), DataTable)
End Get
Set(value As DataTable)
ViewState("DTProveedores") = value
End Set
End Property
Private Property DTFyE As DataTable
Get
Return CType(ViewState("DTFyE"), DataTable)
End Get
Set(value As DataTable)
ViewState("DTFyE") = value
End Set
End Property
Private Property DTReportes As DataTable
Get
Return CType(ViewState("DTReportes"), DataTable)
End Get
Set(value As DataTable)
ViewState("DTReportes") = value
End Set
End Property
Private Property DTPendienteActual As DataTable
Get
Return CType(ViewState("DTPendienteActual"), DataTable)
End Get
Set(value As DataTable)
ViewState("DTPendienteActual") = value
End Set
End Property
Private Property DTEnviadas As DataTable
Get
Return CType(ViewState("DTEnviadas"), DataTable)
End Get
Set(value As DataTable)
ViewState("DTEnviadas") = value
End Set
End Property
Private ReadOnly Property PadCeros As Char
Get
Return "0"c
End Get
End Property
Private Property TotalAcumulado As Double
Get
Return ViewState("TotalAcumulado").ToString.ToDouble
End Get
Set(value As Double)
ViewState("TotalAcumulado") = value
End Set
End Property
Private Property CveCuenta As Integer
Get
Return ViewState("CveCuenta").ToString.ToEntero
End Get
Set(value As Integer)
ViewState("CveCuenta") = value
End Set
End Property
Private Property DtPago As DataTable
Get
Return CType(ViewState("DtPago"), DataTable)
End Get
Set(value As DataTable)
ViewState("DtPago") = value
End Set
End Property
Private Property DtAlta As DataTable
Get
Return CType(ViewState("DtAlta"), DataTable)
End Get
Set(value As DataTable)
ViewState("DtAlta") = value
End Set
End Property
Private Property CorreoNotificacionesEmpresa As String
Get
Return ViewState("CorreoNotificacionesEmpresa").ToString
End Get
Set(value As String)
ViewState("CorreoNotificacionesEmpresa") = value
End Set
End Property
Private Property TipoMasiva As Integer
Get
Return ViewState("TipoMasiva").ToString.ToEntero
End Get
Set(value As Integer)
ViewState("TipoMasiva") = value
End Set
End Property
Private Property DT_PagosReporte As DataTable
Get
If ViewState("DT_PagosReporte") Is Nothing Then
ViewState("DT_PagosReporte") = New DataTable
End If
Return CType(ViewState("DT_PagosReporte"), DataTable)
End Get
Set(value As DataTable)
ViewState("DT_PagosReporte") = value
End Set
End Property
ReadOnly Property OpBancos As Integer
Get
Dim OpBanco As Integer = -1
If (DdlCuenta.SelectedItem.Text.ToUpper.Contains("BANCOMER") OrElse DdlCuenta.SelectedItem.Text.ToUpper.Contains("BBVA")) Then
OpBanco = 1
End If
If DdlCuenta.SelectedItem.Text.ToUpper.Contains("BAJIO") Then
OpBanco = 2
End If
If DdlCuenta.SelectedItem.Text.ToUpper.Contains("SCOTIA") Then
OpBanco = 3
End If
Return OpBanco
End Get
End Property
#End Region
Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
ViewState("NombreArchivo") = ""
ViewState("HeaderTexto") = ""
ViewState("DetalleTexto") = ""
ViewState("TrailerTexto") = ""
ViewState("Vacio") = ""
ViewState("TotalAcumulado") = 0
CveCuenta = -1
TipoMasiva = 1
txtFechaI.Text = NowADS().ToShortDateString
txtFechaF.Text = NowADS().ToShortDateString
CargaCuentas()
CargaProveedores()
InicializaDatosGenerales()
End If
End Sub
#Region " C A R G A - D A T O S "
Private Sub CargaCuentas()
DdlCuenta.DataSource = GlobalDTBancosCuentas(UsuarioActual.CveUsuario, CveEmpresa:=UsuarioActual.CveEmpresa).FiltraParametros("UsaLayout = 1")
DdlCuenta.DataBind()
UpFiltros.Update()
DdlCuentaReportes.DataSource = GlobalDTBancosCuentas(UsuarioActual.CveUsuario, CveEmpresa:=UsuarioActual.CveEmpresa).FiltraParametros("UsaLayout = 1")
DdlCuentaReportes.DataBind()
UpFiltrosReporte.Update()
End Sub
Protected Sub BtnConsultar_Click(sender As Object, e As EventArgs)
CveCuenta = DdlCuenta.SelectedValue.ToEntero
CargaDatos()
End Sub
Private Sub CargaDatos()
'Carga datos en DT´s
Dim ObjBancos As New ClsBancos
If ObjBancos.GetLayoutPagos(CveCuenta, -1, DdlTipoGeneracion.SelectedValue) Then
DTPendientes = ObjBancos.DtResultados
Else
DTPendientes = Nothing
End If
If ObjBancos.GetLayoutPagosEnviados(CveCuenta, 1, DdlTipoGeneracion.SelectedValue, "-1", "-1") Then
DTEnviadas = ObjBancos.DtResultados
Else
DTEnviadas = Nothing
End If
ObjBancos.Dispose()
'Carga GvPendientes
If DTPendientes IsNot Nothing AndAlso DTPendientes.Rows.Count > 0 Then
GvPendientes.DataSource = DTPendientes
End If
GvPendientes.DataBind()
'Carga GvEnviadas
If DTEnviadas IsNot Nothing AndAlso DTEnviadas.Rows.Count > 0 Then
GvEnviadas.DataSource = DTEnviadas
End If
GvEnviadas.DataBind()
UpGVDatos.Update()
If DTPendientes IsNot Nothing AndAlso DTPendientes.Rows.Count > 0 Then
CargaDatosInformativos()
End If
End Sub
Private Sub CargaDatosInformativos()
Dim Altas = 0
Dim Interbancarias = 0
Dim Bancomer = 0
Dim Scotia = 0
Dim Movimientos = 0
Dim Importe = 0.0
For Each dr As DataRow In DTPendientes.Rows
If OpBancos = 1 Then
If dr("EstatusCtaDeposito").ToString <> "True" Then
Continue For
End If
If dr("CveCuentaDeposito").ToString <> "" And dr("EstatusPagoElectronico").ToString <> "True" And dr("AltaCuenta").ToString = "1" Then
'
ElseIf dr("CveCuentaDeposito").ToString.ToEntero > 0 Then
Movimientos += 1
Importe += dr("Abonado").ToString.ToDouble
End If
End If
If OpBancos = 3 Then
If dr("EstatusCtaDeposito").ToString <> "True" Then
Continue For
End If
If dr("CveCuentaDeposito").ToString <> "" And ((dr("EstatusPagoElectronicoScotia").ToString <> "True" Or dr("FechaEliminacion").ToString.ToDate < NowADS())) And dr("AltaCuenta").ToString = "1" Then
'
ElseIf dr("CveCuentaDeposito").ToString.ToEntero > 0 Then
Movimientos += 1
Importe += dr("Abonado").ToString.ToDouble
End If
End If
Next
'Inicio Bloque es para contar las altas de cuentas
Dim DTPendientesTmp As DataTable = DTPendientes.FiltraParametros("", "",
{"CLABEDestino", "CLABE", "CveBanco", "CveCuentaDeposito", "EstatusCtaDeposito", "EstatusPagoElectronico", "EstatusPagoElectronicoScotia", "AltaCuenta", "BancoNombre", "FechaEliminacion"}
)
For Each dr As DataRow In DTPendientesTmp.Rows
If OpBancos = 1 Then
If dr("EstatusCtaDeposito").ToString <> "True" Then
Continue For
End If
If dr("CveCuentaDeposito").ToString <> "" And dr("EstatusPagoElectronico").ToString <> "True" And dr("AltaCuenta").ToString = "1" Then
Altas += 1
If dr("BancoNombre").ToString.ToUpper.Contains("BANCOMER") OrElse dr("BancoNombre").ToString.ToUpper.Contains("BBVA") Then
Bancomer += 1
Else
Interbancarias += 1
End If
ElseIf dr("CveCuentaDeposito").ToString.ToEntero > 0 Then
'
End If
End If
If OpBancos = 3 Then
If dr("EstatusCtaDeposito").ToString <> "True" Then
Continue For
End If
If dr("CveCuentaDeposito").ToString <> "" And ((dr("EstatusPagoElectronicoScotia").ToString <> "True" Or dr("FechaEliminacion").ToString.ToDate < NowADS())) And dr("AltaCuenta").ToString = "1" Then
Altas += 1
If dr("BancoNombre").ToString.ToUpper.Contains("SCOTIA") Then
Scotia += 1
Else
Interbancarias += 1
End If
ElseIf dr("CveCuentaDeposito").ToString.ToEntero > 0 Then
'
End If
End If
Next
''Fin Bloque es para contar las altas de cuentas
LbNumeroAltas.Text = Altas.ToString
LbNumeroInterbancarias.Text = Interbancarias.ToString
LbNumeroBancomer.Text = Bancomer.ToString
LbNumeroScotia.Text = Scotia.ToString
LbNumeroMovimientos.Text = Movimientos.ToString
LbImporteMovimientos.Text = Importe.ToString.FormatoNumero
UpComandosGeneracion.Update()
VistaComandoGeneracion()
End Sub
Sub VistaComandoGeneracion()
TRNumBancomer.Visible = False
TRNumScotia.Visible = False
TRNumBancomer.Visible = True
If OpBancos = 1 Then
TRNumBancomer.Visible = True
End If
If OpBancos = 3 Then
TRNumScotia.Visible = True
End If
UpComandosGeneracion.Update()
End Sub
#End Region
#Region " DATOS GENERALES LAYOUT "
Private Sub InicializaDatosGenerales()
If UsuarioActual.CveEmpresa = 66 Then
CorreoNotificacionesEmpresa = "pagos@gluyasconstrucciones.com"
ElseIf UsuarioActual.CveEmpresa = 13 Then
CorreoNotificacionesEmpresa = "signotificaciones@adssistemas.mx"
Else
CorreoNotificacionesEmpresa = "signotificaciones@adssistemas.mx"
End If
End Sub
#End Region
#Region " GENERA Y DESCARGA ARCHIVO (TXT) "
Protected Sub CrearTXT()
Dim path As String = Server.MapPath(String.Format("~/Empresas/{0}/Layout/{1}.txt", UsuarioActual.CveEmpresa, NombreArchivo))
' Create or overwrite the file.
Dim fs As FileStream = File.Create(path)
' Add text to the file.
Dim info As Byte() = New UTF8Encoding(True).GetBytes(TextoCompleto)
fs.Write(info, 0, info.Length)
fs.Close()
End Sub
Private Sub DescargarArchivo()
With HttpContext.Current.Response
.Clear()
.Buffer = True
.ContentType = "textplain"
.AddHeader("Content-Disposition", String.Format("attachment;filename={0}{1}.txt", NombreArchivo, NowADS().ToString("ddMMyyyy")))
.Charset = "UTF-8"
.ContentEncoding = Encoding.Default
.Write(TextoCompleto)
.Flush()
.End()
End With
End Sub
Private Sub DescargaZip()
Dim path As String = Server.MapPath(String.Format("~/Empresas/{0}/Layout/", UsuarioActual.CveEmpresa))
Response.Clear()
Dim ElZip As ZipFile = New ZipFile()
Using ElZip
ElZip.AddDirectory(path)
ElZip.Save(Response.OutputStream)
End Using
Response.AddHeader("Content-Disposition", "attachment; filename=LayoutPagos.zip")
Response.ContentType = "application/zip"
Response.End()
End Sub
Private Function CreaArchivo(Tipo As Integer, Optional MismoBanco As Boolean = True, Optional ByRef NombreArchivoEnviado As String = "") As Boolean
System.Threading.Thread.Sleep(1000) 'Un segundo de diferencia Para dIferentes tipos de bancos
DirectoryExistsCreate(String.Format("{0}Layout", UsuarioActual.Empresa.Ruta))
'NombreArchivo = String.Format("{2}{1}{0}.txt", UsuarioActual.CveUsuario, NowADS().ToString("yyyyMMdd-HH-mm-ss"), If(Tipo = 1, "LAYOUTPAGO", "LAYOUTALTA"))
If Tipo = 1 Then
NombreArchivo = String.Format("{2}{1}{0}.txt", UsuarioActual.CveUsuario, NowADS().ToString("yyyyMMdd-HH-mm-ss"), "LAYOUTPAGO")
Else
NombreArchivo = String.Format("{2}{1}{0}{3}.txt", UsuarioActual.CveUsuario, NowADS().ToString("yyyyMMdd-HH-mm-ss"), "LAYOUTALTA", If(MismoBanco, "BANCOMER", "INTERBANCARIO"))
End If
If NombreArchivoEnviado.Length > 0 Then
NombreArchivo = NombreArchivoEnviado
Else
NombreArchivoEnviado = NombreArchivo
End If
Dim path As String = String.Format("{0}Layout\{1}", UsuarioActual.Empresa.Ruta, NombreArchivo)
If File.Exists(path) Then
File.Delete(path)
End If
Dim fs As FileStream = File.Create(path)
Dim info As Byte() = New UTF8Encoding(True).GetBytes(TextoCompleto)
fs.Write(info, 0, info.Length)
fs.Close()
Return True
End Function
Private Function GuardaTXT() As Boolean
Dim Retorno As Boolean = True
Try
Dim Ruta As String = ""
Dim FileName As String = Path.GetFileName(FUTxt.PostedFile.FileName)
NombreArchivo = FileName
Dim Extension As String = Path.GetExtension(FUTxt.PostedFile.FileName)
Dim FolderPath As String = String.Format("{0}Empresas\", Request.ApplicationPath)
Dim FilePath As String = Server.MapPath(FolderPath + FileName)
FUTxt.SaveAs(FilePath)
NombreArchivo = FilePath
Catch ex As Exception
Retorno = False
End Try
Return Retorno
End Function
#End Region
#Region "LAYOUT SCOTIABANK"
'====================================================================
' GenerarLayoutPagosScotia
'====================================================================
Private Sub AltaProveedoresScotia(
Optional ByVal DtPendientesTemp As DataTable = Nothing,
Optional ByVal NumeroConvenio As String = "00000", ' 5 dígitos
Optional ByVal SistemaCentral As String = "001", ' 3 dígitos
Optional ByVal TipoArchivo As String = "EE", ' 2 digitos (define tu propio código)
Optional ByVal Secuencia As Integer = 1, ' 3 dígitos, consecutivo del día
Optional ByVal MovimientoDefault As Char = "P"c ' P =pago, cambia si usas A/C/B
)
'------------------- Constantes de layout -------------------
Dim LARGO_REGISTRO As Integer = 140
Dim Cero As Char = "0"c
Dim Space As Char = " "c
Dim NumeroArchivo As Integer = 1 ' ajústalo si manejas consecutivo diario
Dim FechaArchivo As Date = NowADS().Date
If DtPendientesTemp Is Nothing Then DtPendientesTemp = DTPendientes.Copy
DtPendientesTemp.CaseSensitive = False
DtPendientesTemp = DtPendientesTemp.FiltraParametros("", "",
{"CLABEDestino", "CLABE", "CveBanco", "CveCuentaDeposito", "EstatusCtaDeposito", "EstatusPagoElectronico", "EstatusPagoElectronicoScotia", "AltaCuenta", "BancoNombre", "FechaEliminacion", "ConvenioPagoElectronico"}
)
If DtPendientesTemp.Rows.Count = 0 Then
Alert("No hay datos pendientes para generar el Layout de ScotiaBank.", TipoMensaje.MsgAdvertencia)
Exit Sub
End If
'------------------- Acumulados para el trailer -------------
Dim Altas As Integer = 0, Cambios As Integer = 0
Dim Bajas As Integer = 0, Consultas As Integer = 0
'------------------- Acumulados para el trailer -------------
'------------------- ConvenioPagoElectronico = "0000000" ' 5 dígitos
NumeroConvenio = DtPendientesTemp.Rows(0)("ConvenioPagoElectronico").ToString
If NumeroConvenio.Trim.Length = 0 Then
Alert("El campo NumeroConvenio (ConvenioPagoElectronico) no está definido en los datos de la cuenta.", TipoMensaje.MsgAdvertencia)
End If
Dim sb As New StringBuilder
'=============================================================
' 1) HEADER (140 )
'=============================================================
'Dim hoy As Date = Now.Date
'Dim hora As String = Now.ToString("HHmmss")
Dim Header As New StringBuilder()
Header.Append(TipoArchivo.PadRight(2, Space)) 'TIPO ARCHIVO (2)
Header.Append("HA") 'TIPO REGISTRO (2)
Header.Append("JDF") 'SISTEMA-CENTRAL (3)
Header.Append(NumeroConvenio.PadLeft(7, Cero)) 'NUMERO DE CONTRATO (7) ' ocupa 5 dígitos pero en el layout se usa 7
Header.Append(NowADS.ToString("yyyyMMdd")) 'FECHA-SOLICITUD (8)
Header.Append("001") 'SECUENCIA (3)
Header.Append("M") 'MANTENIMIENTO-O-CONSULTA (1)
Header.Append(" ".PadLeft(8, Space)) 'FECHA GENERACIÓN ARCHIVO (8) *** Respusta de ScotiaBank ***
Header.Append(" ".PadLeft(6, Space)) 'Hora GENERACIÓN ARCHIVO (6) *** Respusta de ScotiaBank ***
Header.Append(" ".PadLeft(3, Space)) 'CÓDIGO-RESPUESTA (3) *** Respusta de ScotiaBank ***
Header.Append(" ".PadLeft(97, Space)) 'FILLER (97)
sb.AppendLine(Header.ToString)
'=============================================================
' 2) DETALLES (140 )
'=============================================================
Dim SBErrores As New StringBuilder
For Each dr As DataRow In DtPendientesTemp.Rows
Dim registro As New StringBuilder()
Dim esError As Boolean = False
'---- Datos base tomados de DTPendientes ------------------
Dim CuentaDestino As String = ""
Dim cuentaDigitos As String = dr("CLABEDestino").ToString.Trim
Dim Clabe As String = dr("CLABE").ToString.Trim
Dim limite As String = (9000000000 * 100D).ToString("F0")
Dim banco As String = dr("CveBanco").ToString.PadLeft(3, Cero)
If cuentaDigitos.Length = 11 AndAlso banco = "044" Then
CuentaDestino = cuentaDigitos
ElseIf Clabe.Length = 18 Then
CuentaDestino = Clabe
Else
CuentaDestino = Clabe
SBErrores.Append($"Cuenta {CuentaDestino} debe tener 11 o 18 dígitos.
")
esError = True
End If
If banco.Length <> 3 OrElse Not IsNumeric(banco) OrElse banco = "000" Then
SBErrores.Append($"Cuenta {CuentaDestino} código {banco} no es un banco válido. Debe ser numérico de 3 dígitos.
")
esError = True
End If
Dim CveCuentaDeposito As String = dr("CveCuentaDeposito").ToString
'Dim movimiento As Char = If(dr.Table.Columns.Contains("Movimiento"),
' dr("Movimiento").ToString.FirstOrDefault(), MovimientoDefault)
Dim CVETIPOCUENTA As String = If(CuentaDestino.Length = 18, "09", "01")
'---- TIPO DE REGISTRO ------------------
'ANEXO E de ScotiaBank
'DA = DETALLE ALTA DE DATOS DE CUENTA Y LIMITE RELACIONADO
'DC = DETALLE CAMBIOS DE DATOS DE CUENTA Y LIMITE RELACIONADO
'DB = DETALLE BAJA DE DATOS DE CUENTA Y LIMITE RELACIONADO
'DQ = DETALLE CONSULTA DE DATOS DE CUENTA Y LIMITE RELACIONADO
'DR = DETALLE RESPUESTA *** Respusta de ScotiaBank ***
Dim TipoRegistro As String = "DA" ' Por default es D (Alta), cambia a C si es cambio o baja
'---- TIPO DE REGISTRO ------------------
'---- Construcción del registro ---------------------------
registro.Append(TipoArchivo.PadRight(2, Space)) 'TIPO ARCHIVO (2)
registro.Append(TipoRegistro) 'TIPO REGISTRO (2)
registro.Append("A") 'CVE-MOVIMIENTO-CUENTA (1)
registro.Append(CVETIPOCUENTA) 'CVE-TIPO - CUENTA (2)
registro.Append("00") 'CVE-MONEDA - CUENTA (2) 00 Pesps 01 Dollares
registro.Append(banco) 'NUM-banco - CUENTA (3)
registro.Append(CuentaDestino.PadLeft(20, Cero)) 'NUM-CUENTA (20)
registro.Append(NowADS.AddDays(364).ToString("yyyyMMdd")) 'FECHA DE ELIMINACIÓN (8)
registro.Append(CveCuentaDeposito.PadRight(50, Space)) 'DESCRIPCIÓN (50)
registro.Append(limite.PadLeft(17, Cero)) 'LIMITE-POR-TRANSACCIÓN (17)
registro.Append("04") 'TIPO DE PAGO (2)
registro.Append(" ") 'CÓDIGO-RESPUESTA (3) CÓDIGO DE RESPUESTA DE REG. "D*", ANEXO 'C' *** Respusta de ScotiaBank ***
registro.Append(" ".PadLeft(28, Space)) 'FILLER (28)
If registro.Length = LARGO_REGISTRO AndAlso Not esError Then
sb.AppendLine(registro.ToString)
Select Case TipoRegistro
Case "DA"
Altas = Altas + 1
Case "DC"
Cambios = Cambios + 1
Case "DB"
Bajas = Bajas + 1
Case "DQ"
Consultas = Consultas + 1
Case Else
esError = True
End Select
End If
Next
'=============================================================
' 3) TRAILER (PIE) (140)
'=============================================================
Dim trailer As New StringBuilder()
trailer.Append(TipoArchivo.PadRight(2, Space)) 'TIPO DE ARCHIVO (2)
trailer.Append("TA") 'TIPO DE REGISTRO (2)
trailer.Append(Altas.ToString.PadLeft(8, Cero)) 'CANTIDAD DE MOVIMIENTOS ALTAS (8)
trailer.Append(Cambios.ToString.PadLeft(8, Cero)) 'CANTIDAD DE MOVIMIENTOS CAMBIOS (8)
trailer.Append(Bajas.ToString.PadLeft(8, Cero)) 'CANTIDAD DE MOVIMIENTOS BAJAS (8)
trailer.Append(Consultas.ToString.PadLeft(8, Cero)) 'CANTIDAD DE CONSULTAS (8)
'MOVIMIENTOS ACEPTADOS
trailer.Append("0".PadLeft(8, Cero)) 'CANTIDAD DE MOVIMIENTOS ALTAS (8) *** Respusta de ScotiaBank ***
trailer.Append("0".PadLeft(8, Cero)) 'CANTIDAD DE MOVIMIENTOS CAMBIOS (8) *** Respusta de ScotiaBank ***
trailer.Append("0".PadLeft(8, Cero)) 'CANTIDAD DE MOVIMIENTOS BAJAS (8) *** Respusta de ScotiaBank ***
trailer.Append("0".PadLeft(8, Cero)) 'CANTIDAD DE CONSULTAS (8) *** Respusta de ScotiaBank ***
'MOVIMIENTOS RECHAZADOS
trailer.Append("0".PadLeft(8, Cero)) 'CANTIDAD DE MOVIMIENTOS ALTAS (8) *** Respusta de ScotiaBank ***
trailer.Append("0".PadLeft(8, Cero)) 'CANTIDAD DE MOVIMIENTOS CAMBIOS (8) *** Respusta de ScotiaBank ***
trailer.Append("0".PadLeft(8, Cero)) 'CANTIDAD DE MOVIMIENTOS BAJAS (8) *** Respusta de ScotiaBank ***
trailer.Append("0".PadLeft(8, Cero)) 'CANTIDAD DE CONSULTAS (8) *** Respusta de ScotiaBank ***
trailer.Append("0".PadLeft(3, Cero)) 'CÓDIGO-RESPUESTA (3) *** Respusta de ScotiaBank ***
trailer.Append("0".PadLeft(3, Cero)) 'CÓDIGO-RESPUESTA - Archivo (3) *** Respusta de ScotiaBank ***
trailer.Append(" ".PadLeft(34, Space)) 'FILLER (34)
sb.Append(trailer.ToString)
'------------------- Crear archivo y mostrar descargas ------------------
TextoCompleto = sb.ToString
If sb.Length = 0 Then
Alert("No se generó ningún registro válido para Bajío.", TipoMensaje.MsgAdvertencia)
Exit Sub
End If
If SBErrores.Length > 0 Then
Alert("Errores encontrados al generar el layout de ScotiaBank:
" & SBErrores.ToString, TipoMensaje.MsgAdvertencia)
Else
Dim NombreArchivoEnviado As String = $"altacuentasScotia_{FechaArchivo:ddMMyyyy}_{NumeroArchivo:D3}.txt"
If CreaArchivo(2, True, NombreArchivoEnviado) Then
DVDescargaPagos.Visible = False
DVDescargaReporte.Visible = False
LblCuentas.Text = "Cuentas Bajio"
'NombreArchivoBancomer = "" 'No usamos estos para scotia
'NombreArchivoInterbancario = ""
'NombreArchivoCIE = ""
NombreArchivo = NombreArchivoEnviado
DVDescargaCuentas1.Visible = True
LnkDescargaCuentas1.Text = NombreArchivo
RegistraScript("$('#ModalDescarga').modal({ backdrop: 'static', keyboard: false});")
UpModalDescarga.Update()
End If
End If
CargaDatos()
End Sub
'---------------------------------------------------------------
' Limpia y normaliza texto para Scotia (solo A-Z,0-9,espacio)
'---------------------------------------------------------------
Private Function LimpiarTextoScotia(txt As String, largo As Integer) As String
Dim clean = New String(txt _
.Normalize(System.Text.NormalizationForm.FormD) _
.Where(Function(ch) Char.IsLetterOrDigit(ch) OrElse ch = " "c) _
.ToArray()) _
.ToUpperInvariant()
Return clean.PadRight(largo).Substring(0, largo)
End Function
'====================================================================
' GeneraPagoScotiaBank – Layout Pagos Scotiabank (For Each, método único)
'====================================================================
' ▸ Genera un archivo de pagos masivos para Scotiabank (Archivo de intercambio EE).
' ▸ Registros y longitudes exactas:
' • HA, HB, DA, TB, TA → 370 caracteres
' • DM (correo) → 104 caracteres
' ▸ Se permite partición por bloques (TamanoBloque), pero todo dentro de un
' mismo método para claridad. Sólo se complementa con LimpiarTextoScotia().
'====================================================================
Public Sub GeneraPagoScotiaBank(ByVal DTPendientes As DataTable, InsertaEnDB As Boolean)
Dim TamanoBloque As Integer = 500 ' pagos por bloque
Dim ErrorLayout As Boolean = False
'------------------- VALIDACIONES BÁSICAS ---------------------------
If DTPendientes Is Nothing OrElse DTPendientes.Rows.Count = 0 Then
Alert("No hay datos pendientes para generar el Layout de ScotiaBank.", TipoMensaje.MsgAdvertencia)
ErrorLayout = True
End If
Dim CuentaCargo As String = DTPendientes.Rows(0)("CLABEOrigen").ToString
If CuentaCargo.Length <> 11 Then
Alert("El campo CuentaCargo debe ser numérico de 11 dígitos.", TipoMensaje.MsgAdvertencia)
ErrorLayout = True
End If
Dim NumeroConvenio As String = DTPendientes.Rows(0)("ConvenioPagoElectronico").ToString
If NumeroConvenio.Trim.Length = 0 Then
Alert("El campo NumeroConvenio (ConvenioPagoElectronico) no está definido en los datos de la cuenta.", TipoMensaje.MsgAdvertencia)
ErrorLayout = True
End If
If NumeroConvenio.Length <> 5 Then
Alert("El campo NumeroConvenio debe ser numérico de 5 dígitos.", TipoMensaje.MsgAdvertencia)
ErrorLayout = True
End If
'------------------- ACUMULADORES -----------------------------------
Dim sb As New StringBuilder()
Dim totalPagos As Integer = 0
Dim totalImporte As Decimal = 0D
Dim pagosBloque As Integer = 0
Dim importeBloque As Decimal = 0D
Dim numBloque As Integer = 0
Dim SPACE As Char = " "c
Dim CERO As Char = "0"c
'------------------- HEADER ARCHIVO (HA) ----------------------------
Dim ha As New StringBuilder()
ha.Append("EE") ' 1‑2 Tipo Archivo
ha.Append("HA") ' 3‑4 Tipo Registro
ha.Append(NumeroConvenio.PadLeft(5, "0"c)) ' 5‑9 Nº Convenio
ha.Append("01") ' 10‑11 Secuencia fija "01"
ha.Append("00000000") ' 12‑19 Fecha generación
ha.Append("00000000") ' 20‑27 Fecha inicial (opcional)
ha.Append("00000000") ' 28‑35 Fecha final (opcional)
ha.Append("000") ' 36‑38 Código status "000"
ha.Append(" ".PadLeft(332, SPACE)) ' 39‑370 FILLER (espacios)
sb.AppendLine(ha.ToString())
'------------------- RECORRIDO DETALLES -----------------------------
Dim SBErrores As StringBuilder = New StringBuilder()
'Dim esError As Boolean = False
Dim idx As Integer = 0
Dim hb As New StringBuilder()
hb.Append("EE") ' 1‑2
hb.Append("HB") ' 3‑4
hb.Append("00") ' 5‑6 Moneda cuenta cargo (00=MXN)
hb.Append("0000") ' 7‑10 Uso futuro = ceros
hb.Append(CuentaCargo) ' 11‑21 Cuenta cargo (11)
hb.Append("0000000001") ' 22‑31 Referencia de cargo? (ejemplo)
hb.Append("000") ' 32‑34 Codigo del registro
hb.Append(" ".PadLeft(336, SPACE)) ' 35‑370 FILLER espacios
sb.AppendLine(hb.ToString())
For Each dr As DataRow In DTPendientes.Rows
''--- ¿Inicia BLOQUE? (HB) ---------------------------------------
'If idx Mod TamanoBloque = 0 Then
' numBloque += 1
' pagosBloque = 0
' importeBloque = 0D
' Dim hb As New StringBuilder(New String(" "c, 370))
' hb.Append("EE") ' 1‑2
' hb.Append("HB") ' 3‑4
' hb.Append("00") ' 5‑6 Moneda cuenta cargo (00=MXN)
' hb.Append("0000") ' 7‑10 Uso futuro = ceros
' hb.Append(CuentaCargo) ' 11‑21 Cuenta cargo (11)
' hb.Append("0000000001") ' 22‑31 Referencia de cargo? (ejemplo)
' hb.Append("000") ' 32‑34 Codigo del registro
' hb.Append(" ".PadLeft(336, SPACE)) ' 35‑370 FILLER espacios
' sb.AppendLine(hb.ToString())
'End If
'----------- DETALLE ALTA (DA) ----------------------------------
Dim importe As Decimal = 0D
If Not Decimal.TryParse(Convert.ToString(dr("Importe")), importe) Then
'Alert($"Importe inválido en fila {idx + 1}", TipoMensaje.MsgAdvertencia)
SBErrores.Append($"Importe inválido en fila {idx + 1}")
ErrorLayout = True
End If
If importe <= 0D Then
Alert($"Importe debe ser mayor a 0 en fila {idx + 1}", TipoMensaje.MsgAdvertencia)
ErrorLayout = True
End If
Dim importeInt As String = CDec(Math.Round(importe * 100).ToEntero).ToString().PadLeft(15, CERO) ' 2 dec.
Dim fechaAplicacion As String = NowADS.ToString("yyyyMMdd")
Dim cveBenef As String = LimpiarTextoScotia(Convert.ToString(dr("CveProveedor"))).PadRight(20)
Dim rfc As String = LimpiarTextoScotia(Convert.ToString(dr("RFC"))).PadRight(13)
Dim nombreBen As String = LimpiarTextoScotia(Convert.ToString(dr("RazonSocial"))).PadRight(40)
Dim CveIE As Integer = dr("CveIE").ToString.ToEntero
Dim referenciaPago As String = CveIE.ToString.PadLeft(16, CERO) 'If(dr.Table.Columns.Contains("Referencia"), LimpiarTextoScotia(Convert.ToString(dr("Referencia"))).PadLeft(16, "0"c), New String("0"c, 16))
Dim CuentaDestino As String = ""
Dim cuentaDigitos As String = Convert.ToString(dr("CLABEDestino"))
Dim clabe As String = Convert.ToString(dr("CLABE"))
Dim CveBanco As String = dr("CveBanco").ToString.PadLeft(3, CERO)
If cuentaDigitos.Length = 11 AndAlso CveBanco = "044" Then
CuentaDestino = cuentaDigitos
ElseIf clabe.Length = 18 Then
CuentaDestino = clabe
Else
CuentaDestino = clabe
SBErrores.Append($"Cuenta {CuentaDestino} debe tener 11 o 18 dígitos.
")
ErrorLayout = True
End If
Dim TipoCuenta As String = If(CuentaDestino.Length = 18, "9", "1") ' 09=18 dígitos, 01=11 dígitos
CuentaDestino = CuentaDestino.PadLeft(20, CERO)
If CveBanco = "000" Then
Alert($"CveBanco inválida en fila {idx + 1}. Debe ser numérico de 3 dígitos.", TipoMensaje.MsgAdvertencia)
ErrorLayout = True
End If
Dim ConceptoPago As String = dr("Observaciones").ToString.Trim
If ConceptoPago.Length > 50 Then
ConceptoPago = ConceptoPago.Substring(0, 50) ' Limitar a 50 caracteres
End If
ConceptoPago = ConceptoPago.PadRight(50, SPACE)
Dim da As New StringBuilder()
da.Append("EE") ' 1‑2
da.Append("DA") ' 3‑4
da.Append("04") ' 5‑6 Tipo movimiento (04=SPEI)
da.Append("00") ' 7‑8 Moneda pago (00=MXN)
da.Append(importeInt) ' 9‑23 Importe (15)
da.Append(fechaAplicacion) ' 24‑31
da.Append("03") ' 32‑33 Servicio‑concepto (03)
da.Append(cveBenef) ' 34‑53
da.Append(rfc) ' 54‑66
da.Append(nombreBen) ' 67‑106
da.Append(referenciaPago) ' 107‑122
da.Append("00000") ' 123‑127 Plaza pago (ceros)
da.Append("00000") ' 128‑132 Sucursal pago (ceros)
da.Append(CuentaDestino) ' 133‑152 clabe destino (ceros)
da.Append("00000") ' 153‑157 PAIS (ceros)
da.Append("".PadLeft(40, SPACE)) ' 158‑197 Ciudad espacio (espacios en blanco)
da.Append(TipoCuenta) ' 198-198 Tipo cuenta
da.Append(SPACE) ' 199-199 digito intercambio
da.Append("00000") ' 200-204 plaza cuenta banco
da.Append("044") ' 205-207 num banco emisor (044=ScotiaBank)
da.Append(CveBanco) ' 208-210 num banco receptor (044=ScotiaBank)
da.Append("001") ' 211-213 dias vigencia
da.Append(ConceptoPago) ' 214-263 Concepto pago
da.Append("".PadLeft(60, SPACE)) '264-283 CAMPO-USO-EMPRESA-1
' 284-303 CAMPO-USO - Empresa - 2
' 304-323 CAMPO-USO - Empresa - 3
da.Append("".PadLeft(41, CERO)) ' 324-326 CODIGO-STATUS - REGISTRO NUM 3
' 327-327 CVE-CAMBIO - INST NUM 1
' 328-330 CODIGO-STATUS - CAMBIO - INST NUM 3
' 331-338 FECHA DE PAGO (Pago en ventanilla) NUM 8
' 339-343 PLAZA DE PAGO (Pago en ventanilla) NUM 5
' 344-348 SUCURSAL DE PAGO (Pago en ventanilla) NUM 5
' 349-364 FOLIO-UNICO NUM 16
sb.AppendLine(da.ToString())
'----------- DETALLE MAIL (DM) 104 -------------------------
Dim correo As String = dr("Correo").ToString.Trim
If correo.Trim.Length = 0 Then
SBErrores.Append($"Email no definido en fila {idx + 1}. Debe ser un correo electrónico válido.
")
ErrorLayout = True
End If
Dim dm As New StringBuilder()
dm.Append("EE") ' 1‑2 Tipo archivoz
dm.Append("DM") ' 3‑4 Tipo registro
dm.Append(correo.PadRight(100)) ' 5‑104 Email + filler
da.Append("".PadLeft(34, CERO)) ' 105-138 Uso Futuro
da.Append("".PadLeft(30, SPACE)) ' 139-168 Clave de Rastreo llenar con espacios en blanco
da.Append("".PadLeft(20, SPACE)) ' 169-188 Referencia de Abono Banxico
dm.Append(" ") ' 189-190 Tipo de Operación anexo G
da.Append("".PadLeft(232, SPACE)) ' 191-370 FILLER
sb.AppendLine(dm.ToString())
'----------- ACUMULADORES ---------------------------------------
totalPagos += 1
totalImporte += importe
pagosBloque += 1
importeBloque += importe
'----------- ¿CIERRA BLOQUE? (TB) -------------------------------
Dim bloqueCompleto As Boolean = (pagosBloque = TamanoBloque)
Dim ultimoRegistro As Boolean = (idx = DTPendientes.Rows.Count - 1)
idx += 1
Next
'If bloqueCompleto OrElse ultimoRegistro Then
Dim tb As New StringBuilder()
tb.Append("EE") ' 1‑2
tb.Append("TB") ' 3‑4
tb.Append(pagosBloque.ToString().PadLeft(7, CERO)) ' 5‑11 Cnt altas
tb.Append((importeBloque * 100).ToEntero.ToString().PadLeft(17, CERO)) ' 12‑28 Importe altas
tb.Append("".PadLeft(7, CERO)) ' 29‑35 Cnt bajas
tb.Append("".PadLeft(17, CERO)) ' 36‑52 Importe bajas
tb.Append("".PadLeft(195, CERO))
' 53-59 CANTIDAD DE MOVIMIENTOS ALTAS
' 60-76 IMPORTE DE MOVIMIENTOS ALTAS
' 77-83 CANTIDAD DE MOVIMIENTOS BAJAS
' 84-100 IMPORTE DE MOVIMIENTOS BAJAS
' 101-107 CANTIDAD DE MOVIMIENTOS ALTAS
' 108-124 IMPORTE DE MOVIMIENTOS ALTAS
' 125-131 CANTIDAD DE MOVIMIENTOS BAJAS
' 132-148 IMPORTE DE MOVIMIENTOS BAJAS
' 149-155 CANTIDAD DE MOVIMIENTOS PAGADOS
' 156-172 IMPORTE DE MOVIMIENTOS PAGADOS
' 173-179 CANTIDAD DE MOVIMIENTOS DEVUELTOS
' 180-196 IMPORTE DE MOVIMIENTOS DEVUELTOS
' 197-203 CANTIDAD DE MOVIMIENTOS RECH
' 204-220 IMPORTE DE MOVIMIENTOS RECH
' 221-227 CANTIDAD DE MOVIMIENTOS BAJA
' 228-244 IMPORTE DE MOVIMIENTOS BAJA
' 245-247 CODIGO-STATUS-REGISTRO
tb.Append("".PadLeft(123, SPACE)) ' 248-370 FILLER (espacios)
sb.AppendLine(tb.ToString())
'End If
'------------------- TRAILER ARCHIVO (TA) ---------------------------
Dim ta As New StringBuilder()
ta.Append("EE") ' 1‑2
ta.Append("TA") ' 3‑4
ta.Append(totalPagos.ToString().PadLeft(7, CERO)) ' 5‑11
ta.Append((totalImporte * 100).ToEntero.ToString().PadLeft(17, CERO)) ' 12‑28
ta.Append("".PadLeft(7, CERO)) ' 29‑35 Cnt bajas
ta.Append("".PadLeft(17, CERO)) ' 36‑52 Importe bajas
ta.Append("".PadLeft(198, CERO))
' 53-59 CANTIDAD DE MOVIMIENTOS ALTAS
' 60-76 IMPORTE DE MOVIMIENTOS ALTAS
' 77-83 CANTIDAD DE MOVIMIENTOS BAJAS
' 84-100 IMPORTE DE MOVIMIENTOS BAJAS
' 101-107 CANTIDAD DE MOVIMIENTOS ALTAS
' 108-124 IMPORTE DE MOVIMIENTOS ALTAS
' 125-131 IMPORTE DE MOVIMIENTOS BAJAS
' 132-148 MOVIMIENTOS PAGADOS
' 149-155 IMPORTE DE MOVIMIENTOS PAGADOS
' 156-172 MOVIMIENTOS DEVUELTOS
' 173-179 IMPORTE DE MOVIMIENTOS DEVUELTOS
' 180-196 MOVIMIENTOS RECHAZADOS
' 197-203 CANTIDAD DE MOVIMIENTOS RECH
' 204-220 IMPORTE DE MOVIMIENTOS RECH
' 221-227 CANTIDAD DE MOVIMIENTOS BAJA
' 228-244 IMPORTE DE MOVIMIENTOS BAJA
' 245-247 CODIGO-STATUS-REGISTRO
' 248-250 CODIGO-STATUS-ARCHIVO
ta.Append("".PadLeft(120, SPACE))
sb.Append(ta.ToString())
'------------------- ESCRIBIR ARCHIVO -------------------------------
'File.WriteAllText(RutaArchivo, sb.ToString(), Encoding.ASCII)
Dim NombreArchivo As String = $"pagos_{NowADS.ToString("ddMMyyyy")}_001.txt"
'"pagos_03062025_001.txt"
If InsertaEnDB Then
Dim ObjBancos As New ClsBancos
ObjBancos.IniciaTransacSQL()
Dim CveLayoutEnvio As Integer = ObjBancos.AddLayoutEnvios(NombreArchivo, NowADS(), CveCuenta, PorGrupos:=True)
If CveLayoutEnvio > 0 Then
For Each dr As DataRow In DTPendientes.Rows
If dr("CveProveedor").ToString <> "" Or dr("CvePersonal").ToString <> "" Then
If Not ObjBancos.AddLayoutEnviosDetalle(CveLayoutEnvio, dr("CveIE").ToString.ToEntero, dr("CveProveedor").ToString.ToEntero, dr("CvePersonal").ToString.ToEntero, 1, "Observaciones") Then
ErrorLayout = True
Exit For
End If
End If
Next
Else
ErrorLayout = True
End If
If ErrorLayout Then
ObjBancos.RollBack()
ObjBancos.Dispose()
Else
ObjBancos.Commit()
ObjBancos.Dispose()
End If
End If
Dim path As String = String.Format("{0}Layout\{1}", UsuarioActual.Empresa.Ruta, NombreArchivo)
Dim pathDirectorio As String = String.Format("{0}Layout\", UsuarioActual.Empresa.Ruta)
If File.Exists(path) Then
File.Delete(path)
End If
If Not Directory.Exists(pathDirectorio) Then
Directory.CreateDirectory(pathDirectorio)
End If
Dim Texto As String = sb.ToString
Dim fs As FileStream = File.Create(path)
Dim info As Byte() = New UTF8Encoding(True).GetBytes(Texto)
fs.Write(info, 0, info.Length)
fs.Close()
If ErrorLayout = False And totalPagos > 0 Then
Dim Mensaje As New StringBuilder
Mensaje.Append("Descarga Layout
")
'If NombreArchivo.Length > 0 Then
' NombreArchivoPago = NombreArchivoEnviado
'End If
'If NombreArchivoPago.Trim.Length > 0 Then
' Mensaje.Append($"Pagos Descarga {NombreArchivoPago}
")
'End If
If NombreArchivo.Length > 0 Then
DVDescargaPagos.Visible = True
DVDescargaCuentas1.Visible = False
'DVDescargaCuentas2.Visible = False
'DVDescargaCuentas3.Visible = False
DVDescargaReporte.Visible = True
DT_PagosReporte = DTPendientes.Copy
LnkDescarga.Text = NombreArchivo
RegistraScript("$('#ModalDescarga').modal({ backdrop: 'static', keyboard: false});")
UpModalDescarga.Update()
End If
CargaDatos()
Else
Alert($"Errores detectados
{SBErrores.ToString}", TipoMensaje.MsgAdvertencia)
End If
End Sub
'====================================================================
' Limpia texto: A‑Z, 0‑9, «@» y «.» (UpperCase) – el resto se descarta
'====================================================================
Private Function LimpiarTextoScotia(ByVal valor As String) As String
Dim sb As New StringBuilder()
For Each ch As Char In If(valor, String.Empty).ToUpperInvariant()
If Char.IsLetterOrDigit(ch) OrElse ch = "@"c OrElse ch = "."c Then sb.Append(ch)
Next
Return sb.ToString()
End Function
''====================================================================
'' GeneraPagoScotiaBank – Layout Pagos Scotiabank
''====================================================================
'' ▸ Genera un archivo de pagos masivos para Scotiabank (Archivo de intercambio EE).
'' ▸ Registros y longitudes exactas:
'' • HA, HB, DA, TB, TA → 370 caracteres
'' • DM (correo) → 104 caracteres
'' ▸ Se permite partición por bloques (TamanoBloque), pero todo dentro de un
'' mismo método para claridad. Sólo se complementa con LimpiarTextoScotia().
''====================================================================
'Public Sub GeneraPagoScotiaBank(
' ByVal DTPendientes As DataTable,
' ByVal RutaArchivo As String,
' Optional ByVal NumeroConvenio As String = "12345", _ ' 5 dígitos
' Optional ByVal CuentaCargo As String = "11987654321", _ ' 11 dígitos
' Optional ByVal TamanoBloque As Integer = 500 _ ' pagos por bloque
')
' '------------------- VALIDACIONES BÁSICAS ---------------------------
' If DTPendientes Is Nothing OrElse DTPendientes.Rows.Count = 0 Then
' Alert("No hay datos pendientes para generar el Layout de ScotiaBank.", TipoMensaje.MsgAdvertencia)
' End If
' '------------------- ConvenioPagoElectronico = "0000000" ' 7 dígitos
' NumeroConvenio = DTPendientes.Rows(0)("ConvenioPagoElectronico").ToString
' If NumeroConvenio.Trim.Length = 0 Then
' Alert("El campo NumeroConvenio (ConvenioPagoElectronico) no está definido en los datos de la cuenta.", TipoMensaje.MsgAdvertencia)
' Exit Sub
' End If
' If NumeroConvenio.Length <> 5 Then
' Alert("El campo NumeroConvenio debe ser numérico de 5 dígitos.", TipoMensaje.MsgAdvertencia)
' Exit Sub
' End If
' If CuentaCargo.Length <> 11 Then
' Alert("El campo CuentaCargo debe ser numérico de 11 dígitos.", TipoMensaje.MsgAdvertencia)
' Exit Sub
' End If
' '------------------- ACUMULADORES -----------------------------------
' Dim sb As New StringBuilder()
' Dim totalPagos As Integer = 0
' Dim totalImporte As Decimal = 0D
' Dim pagosBloque As Integer = 0
' Dim importeBloque As Decimal = 0D
' Dim numBloque As Integer = 0
' '------------------- HEADER ARCHIVO (HA) ----------------------------
' Dim ha As New StringBuilder(New String(" "c, 370))
' ha.Insert(0, "EE") ' 1‑2 Tipo Archivo
' ha.Insert(2, "HA") ' 3‑4 Tipo Registro
' ha.Insert(4, NumeroConvenio.PadLeft(5, "0"c)) ' 5‑9 Nº Convenio
' ha.Insert(9, "01") ' 10‑11 Secuencia fija "01"
' Dim fechaHoy As String = Date.Now.ToString("yyyyMMdd")
' ha.Insert(11, fechaHoy) ' 12‑19 Fecha generación
' ha.Insert(19, "00000000") ' 20‑27 Fecha inicial (opcional)
' ha.Insert(27, "00000000") ' 28‑35 Fecha final (opcional)
' ha.Insert(35, "000") ' 36‑38 Código status "000"
' ' 39‑370 FILLER (espacios) ya está
' sb.AppendLine(ha.ToString())
' '------------------- RECORRIDO DETALLES -----------------------------
' Dim idx As Integer = 0
' For Each dr As DataRow In DTPendientes.Rows
' '--- ¿Inicia BLOQUE? (HB) ---------------------------------------
' If idx Mod TamanoBloque = 0 Then
' numBloque += 1
' pagosBloque = 0
' importeBloque = 0D
' Dim hb As New StringBuilder(New String(" "c, 370))
' hb.Insert(0, "EE") ' 1‑2
' hb.Insert(2, "HB") ' 3‑4
' hb.Insert(4, "00") ' 5‑6 Moneda cuenta cargo (00=MXN)
' hb.Insert(6, "0000") ' 7‑10 Uso futuro = ceros
' hb.Insert(10, CuentaCargo) ' 11‑21 Cuenta cargo (11)
' hb.Insert(21, "0000000001") ' 22‑31 Referencia Empresa (ejemplo)
' hb.Insert(31, "000") ' 32‑34 Status registro
' ' 35‑370 FILLER espacios
' sb.AppendLine(hb.ToString())
' End If
' '----------- DETALLE ALTA (DA) ----------------------------------
' Dim importe As Decimal = 0D
' If Not Decimal.TryParse(Convert.ToString(dr("Importe")), importe) Then _
' Throw New ArgumentException($"Importe inválido en fila {idx + 1}")
' If importe <= 0D Then _
' Throw New ArgumentException($"Importe ≤ 0 en fila {idx + 1}")
' Dim importeInt As String = CDec(Math.Round(importe * 100)).ToString().PadLeft(15, "0"c) ' 2 dec.
' Dim fechaAplicacion As String = Date.Now.ToString("yyyyMMdd")
' Dim cveBenef As String = LimpiarTextoScotia(Convert.ToString(dr("CveProveedor")), 20).PadRight(20)
' Dim rfc As String = LimpiarTextoScotia(Convert.ToString(dr("RFC")), 13).PadRight(13)
' Dim nombreBen As String = LimpiarTextoScotia(Convert.ToString(dr("RazonSocial")), 40).PadRight(40)
' Dim referenciaPago As String = If(dr.Table.Columns.Contains("Referencia"),
' LimpiarTextoScotia(Convert.ToString(dr("Referencia")), 16).PadLeft(16, "0"c),
' New String("0"c, 16))
' Dim clabe As String = Convert.ToString(dr("CLABEDestino"))
' If String.IsNullOrWhiteSpace(clabe) Then clabe = Convert.ToString(dr("CLABE"))
' clabe = clabe.PadLeft(18, "0"c)
' Dim da As New StringBuilder(New String(" "c, 370))
' da.Insert(0, "EE") ' 1‑2
' da.Insert(2, "DA") ' 3‑4
' da.Insert(4, "04") ' 5‑6 Tipo movimiento (04=SPEI)
' da.Insert(6, "00") ' 7‑8 Moneda pago (00=MXN)
' da.Insert(8, importeInt) ' 9‑23 Importe (15)
' da.Insert(23, fechaAplicacion) ' 24‑31
' da.Insert(31, "03") ' 32‑33 Servicio‑concepto (03)
' da.Insert(33, cveBenef) ' 34‑53
' da.Insert(53, rfc) ' 54‑66
' da.Insert(66, nombreBen) ' 67‑106
' da.Insert(106, referenciaPago) ' 107‑122
' da.Insert(122, "00000") ' 123‑127 Plaza pago (ceros)
' da.Insert(127, "00000") ' 128‑132 Sucursal pago (ceros)
' da.Insert(132, New String("0"c, 34)) ' 133‑166 Uso futuro (ceros)
' da.Insert(166, New String(" "c, 30)) ' 167‑196 Clave rastreo (espacios)
' da.Insert(196, New String("0"c, 20)) ' 197‑216 Referencia Banxico (ceros)
' da.Insert(216, "01") ' 217‑218 Tipo operación (01 default)
' ' 219‑370 FILLER espacios
' sb.AppendLine(da.ToString())
' '----------- DETALLE MAIL (DM) 104 bytes -------------------------
' Dim correo As String = If(dr.Table.Columns.Contains("Email"),
' LimpiarTextoScotia(Convert.ToString(dr("Email")), 100), "")
' Dim dm As New StringBuilder(New String(" "c, 104))
' dm.Insert(0, "EE") ' 1‑2 Tipo archivo
' dm.Insert(2, "DM") ' 3‑4 Tipo registro
' dm.Insert(4, correo.PadRight(100)) ' 5‑104 Email + filler
' sb.AppendLine(dm.ToString())
' '----------- ACUMULADORES ---------------------------------------
' totalPagos += 1
' totalImporte += importe
' pagosBloque += 1
' importeBloque += importe
' '----------- ¿CIERRA BLOQUE? (TB) -------------------------------
' Dim bloqueCompleto As Boolean = (pagosBloque = TamanoBloque)
' Dim ultimoRegistro As Boolean = (idx = DTPendientes.Rows.Count - 1)
' If bloqueCompleto OrElse ultimoRegistro Then
' Dim tb As New StringBuilder(New String(" "c, 370))
' tb.Insert(0, "EE") ' 1‑2
' tb.Insert(2, "TB") ' 3‑4
' tb.Insert(4, pagosBloque.ToString().PadLeft(7, "0"c)) ' 5‑11 Cnt altas
' tb.Insert(11, (importeBloque * 100).ToString().PadLeft(17, "0"c)) ' 12‑28 Importe altas
' ' 29‑370 resto de contadores a cero / espacios
' tb.Insert(28, New String("0"c, 342))
' sb.AppendLine(tb.ToString())
' End If
' idx += 1
' Next
' '------------------- TRAILER ARCHIVO (TA) ---------------------------
' Dim ta As New StringBuilder(New String(" "c, 370))
' ta.Insert(0, "EE") ' 1‑2
' ta.Insert(2, "TA") ' 3‑4
' ta.Insert(4, totalPagos.ToString().PadLeft(7, "0"c)) ' 5‑11
' ta.Insert(11, (totalImporte * 100).ToString().PadLeft(17, "0"c)) ' 12‑28
' ta.Insert(28, New String("0"c, 342)) ' resto filler
' sb.AppendLine(ta.ToString())
' '------------------- ESCRIBIR ARCHIVO -------------------------------
' File.WriteAllText(RutaArchivo, sb.ToString(), Encoding.ASCII)
'End Sub
Protected Sub LnkDescarga_Click(sender As Object, e As EventArgs)
Dim FileName As String = NombreArchivo
Dim FilePath As String = $"{UsuarioActual.Empresa.Ruta}Layout\{NombreArchivo}"
'If NombreArchivo.Length = 0 Then
If OpBancos = 3 Then
FileName = LnkDescarga.Text
FilePath = $"{UsuarioActual.Empresa.Ruta}Layout\{ LnkDescarga.Text}"
End If
'End If
Response.Clear()
Response.ContentType = "application/octet-stream"
Response.AddHeader("Content-Disposition", "attachment; filename=" & FileName)
Response.TransmitFile(FilePath)
Response.End()
End Sub
Protected Sub LnkDescargaCuentas1_Click(sender As Object, e As EventArgs)
Dim FileName As String = NombreArchivo
Dim FilePath As String = $"{UsuarioActual.Empresa.Ruta}Layout\{NombreArchivo}"
If DdlCuenta.SelectedItem.Text.ToUpper.Contains("BAJIO") Or DdlCuenta.SelectedItem.Text.ToUpper.Contains("SCOTIA") Then
FileName = LnkDescargaCuentas1.Text
FilePath = $"{UsuarioActual.Empresa.Ruta}Layout\{LnkDescargaCuentas1.Text}"
End If
Response.Clear()
Response.ContentType = "application/octet-stream"
Response.AddHeader("Content-Disposition", "attachment; filename=" & FileName)
Response.TransmitFile(FilePath)
Response.End()
End Sub
Protected Sub LnkDescargaReporte_Click(sender As Object, e As EventArgs)
Dim Archivo As New System.IO.FileInfo(String.Format("{0}Formatos/LayoutAltaProveedor.rdlc", UsuarioActual.Empresa.Ruta))
Dim Imagen As New System.IO.FileInfo($"{UsuarioActual.Empresa.Ruta}/Logo.png")
DT_PagosReporte = DT_PagosReporte.FiltraParametros("EstatusPagoElectronicoGrupos = 'True' AND EstatusCtaDeposito > 0").Copy()
Dim params As New List(Of ReportParameter)
If Archivo.Exists Then
ImprimirPDF(String.Format("{0}Formatos\LayoutPagoProveedor.rdlc", UsuarioActual.Empresa.Ruta), DtPago, params, "LayoutPagoProveedor", RDSName:="DSPagoElectronicoV2")
Else
params.Add(New ReportParameter("LogoPath", If(Imagen.Exists, $"file://{Imagen.FullName}", "")))
params.Add(New ReportParameter("NombreEmpresa", UsuarioActual.Empresa.Empresa))
params.Add(New ReportParameter("Direccion", UsuarioActual.Empresa.Direccion))
params.Add(New ReportParameter("RFC", UsuarioActual.Empresa.RFC))
params.Add(New ReportParameter("FechaImpresion", NowADS().ToString("dd/MM/yyyy")))
params.Add(New ReportParameter("UsuarioImprimio", UsuarioActual.Nombre))
params.Add(New ReportParameter("Titulo", "Reporte Pago Proveedor Layout"))
ImprimirPDF("Empresas/Grales/Formatos/LayoutPagoProveedor.rdlc", DT_PagosReporte, params, "LayoutPagoProveedor", RDSName:="DSPagoElectronicoV2")
End If
End Sub
'Protected Sub LnkDescargaCuentas2_Click(sender As Object, e As EventArgs)
' Dim FileName As String = NombreArchivoInterbancario
' Dim FilePath As String = $"{UsuarioActual.Empresa.Ruta}Layout\{NombreArchivoInterbancario}"
' Response.Clear()
' Response.ContentType = "application/octet-stream"
' Response.AddHeader("Content-Disposition", "attachment; filename=" & FileName)
' Response.TransmitFile(FilePath)
' Response.End()
'End Sub
'Protected Sub LnkDescargaCuentas3_Click(sender As Object, e As EventArgs)
' Dim FileName As String = NombreArchivoCIE
' Dim FilePath As String = $"{UsuarioActual.Empresa.Ruta}Layout\{NombreArchivoCIE}"
' Response.Clear()
' Response.ContentType = "application/octet-stream"
' Response.AddHeader("Content-Disposition", "attachment; filename=" & FileName)
' Response.TransmitFile(FilePath)
' Response.End()
'End Sub
#End Region
#Region " TAB PRINCIPAL "
Protected Sub GvPendientes_RowDataBound(sender As Object, e As GridViewRowEventArgs)
If e.Row.RowType = DataControlRowType.DataRow Then
'Colorea GV
If e.Row.DBCampo("RazonSocial").ToString = "" Then
e.Row.BackColor = Drawing.Color.WhiteSmoke
Else
If e.Row.DBCampo("EstatusPagoElectronico").ToString <> "True" Then
e.Row.BackColor = Drawing.Color.LightSalmon
e.Row.ToolTip = "Cuenta Deposito aun sin dar de Alta."
End If
If e.Row.DBCampo("CveProveedor").ToString.ToEntero > 0 Then
e.Row.FCHyperLink("HLProveedor").NavigateUrl = String.Format("/Compras/Proveedores.aspx?CveProveedor={0}", e.Row.DBCampo("CveProveedor"))
Else
e.Row.FCHyperLink("HLProveedor").NavigateUrl = String.Format("/RH/Personal.aspx?CvePersonal={0}", e.Row.DBCampo("CvePersonal"))
End If
End If
If Not e.Row.DBCampo("CveCuentaDeposito").ToString.ToEntero > 0 Then
e.Row.Cells(0).BackColor = Drawing.Color.Red
e.Row.ToolTip = "Sin Cuenta Deposito asignada"
End If
If e.Row.DBCampo("EstatusCtaDeposito").ToString = "False" Then
e.Row.Cells(0).BackColor = Drawing.Color.Red
e.Row.ToolTip = "Cuenta Deposito INACTIVA"
End If
e.Row.FCHyperLink("HLImporte").NavigateUrl = String.Format("IE.aspx?CveIE={0}", e.Row.DBCampo("CveIE"))
End If
End Sub
Protected Sub GvEnviadas_RowDataBound(sender As Object, e As GridViewRowEventArgs)
If e.Row.RowType = DataControlRowType.DataRow Then
'Colorea GV
If e.Row.DBCampo("CveIE").ToString = "" Then
e.Row.BackColor = Drawing.Color.LightGray
'Si la fecha de generacion del archivo es diferente de hoy activamos el boton REGENERAR
'If e.Row.DBCampo("Fecha").ToDate.ToShortDateString <> NowADS().ToShortDateString Then
' e.Row.FCLinkButton("LBRegenerar").Visible = True
'End If
If DTEnviadas.MAX("FueConciliado", String.Format("CveLayoutEnvio = {0}", e.Row.DBCampo("CveLayoutEnvio"))).ToEntero > 0 Then
e.Row.ToolTip = "El movimiento no se puede regenerar ya que alguno de sus movimientos ya fue conciliado"
Else
e.Row.FCLinkButton("LBRegenerar").Visible = True
End If
Else
If e.Row.DBCampo("FueConciliado") = "1" Then
e.Row.ForeColor = Drawing.Color.Red
e.Row.ToolTip = "Este movimiento ya fue conciliado."
End If
If e.Row.DBCampo("CveProveedor").ToString.ToEntero > 0 Then
e.Row.FCHyperLink("HLProveedor").NavigateUrl = String.Format("/Compras/Proveedores.aspx?CveProveedor={0}", e.Row.DBCampo("CveProveedor"))
Else
e.Row.FCHyperLink("HLProveedor").NavigateUrl = String.Format("/RH/Personal.aspx?CvePersonal={0}", e.Row.DBCampo("CvePersonal"))
End If
e.Row.FCHyperLink("HLDetalle").NavigateUrl = String.Format("IE.aspx?CveIE={0}", e.Row.DBCampo("CveIE"))
End If
End If
End Sub
Protected Sub LBRegenerar_Click(sender As Object, e As EventArgs)
Dim CveBLE As Integer = CType(sender, LinkButton).CommandArgument.ToEntero
Dim DtRegenerar As New DataTable
Dim ObjBancos As New ClsBancos
If ObjBancos.GetLayoutPagos(CveCuenta, CveBLE, "-1") Then
DtRegenerar = ObjBancos.DtResultados
Else
DtRegenerar = Nothing
End If
ObjBancos.Dispose()
If OpBancos = 1 Then
If DtRegenerar IsNot Nothing Then
GeneraPago(DtRegenerar, CveBLE)
Else
Alert("Ocurrió un error al obtener los datos para generar el archivo. Por favor vuelva a intentar.", TipoMensaje.MsgError)
End If
End If
If OpBancos = 3 Then
If DtRegenerar IsNot Nothing Then
GeneraPagoScotiaBank(DtRegenerar, False)
Else
Alert("Ocurrió un error al obtener los datos para generar el archivo. Por favor vuelva a intentar.", TipoMensaje.MsgError)
End If
End If
End Sub
#End Region
'RECARGA DATOS
#Region " RECARGA DATOS "
Private Sub RecargaDatos()
CargaDatos()
TipoMasiva = 1
DdlTipoCargaMasiva.SelectedValueExist("1")
CargaProveedores()
End Sub
#End Region
'ARMA Y GENERA TXT'S
#Region "ALTA PROVEEDORES"
Protected Sub BtnAltas_Click(sender As Object, e As EventArgs)
If Not DdlCuenta.SelectedValue.ToEntero > 0 Then
Alert("Primero debe seleccionar una Cuenta", TipoMensaje.MsgAdvertencia)
Exit Sub
End If
If OpBancos = 1 Then
AltaProveedores(1)
ElseIf OpBancos = 2 Then
'AltaProveedoresBajio()
ElseIf OpBancos = 3 Then
Dim fechaHoy As String = DateTime.Today.ToString("MM/dd/yyyy")
AltaProveedoresScotia(DTPendientes.FiltraParametros($" EstatusPagoElectronicoScotia = False OR FechaEliminacion < #{fechaHoy}#"))
End If
End Sub
Private Sub AltaProveedores(TipoAlta As Integer)
Dim DtTemp As DataTable = Nothing
CreaDtAlta()
'TIPO ALTA
'1 = Alta comun
'2 = Alta masiva
If TipoAlta = 1 Then
If DTPendientes Is Nothing OrElse DTPendientes.FiltraParametros("EstatusCtaDeposito = 'True'").Rows.Count <= 0 Then
Alert("No hay registros para generar", TipoMensaje.MsgAdvertencia)
Exit Sub
Else
DtTemp = DTPendientes.FiltraParametros("EstatusCtaDeposito = 'True'").Copy
End If
ElseIf TipoAlta = 2 Then
If DTProveedores Is Nothing OrElse DTProveedores.Rows.Count <= 0 Then
Alert("No hay registros para generar", TipoMensaje.MsgAdvertencia)
Exit Sub
Else
DtTemp = DTProveedores.Copy
End If
ElseIf TipoAlta = 3 Then
If DTFyE Is Nothing OrElse DTFyE.Rows.Count <= 0 Then
Alert("No hay registros para generar", TipoMensaje.MsgAdvertencia)
Exit Sub
Else
DtTemp = DTProveedores.Copy
End If
End If
'REINICIA PROPIEDAS
HeaderTexto = ""
DetalleTexto = ""
TrailerTexto = ""
TotalAcumulado = 0
''VALIDA CUENTAS DEPOSITOS
Dim ErrorCuenta As Boolean = False
Dim ProveedoresError As StringBuilder = New StringBuilder
ProveedoresError.AppendFormat("
| Proveedor | Cuenta | Error |
| {0} | {1} | CLABE NO PERTENECE A BANCOMER |
| {0} | {1} | CLABE ES OBLIGATORIA |
| {0} | {1} | NUMERO DE CUENTA CON FORMATO INCORRECTO |
| {0} | {1} | CLABE CON FORMATO INCORRECTO |
| {0} | {1} | CIE CON FORMATO INCORRECTO |
| {0} | {1} | CUENTA BANCOMER SIN CUENTA O CIE |
| # | Proveedor | Banco | Tipo Cuenta | Cuenta | Estatus |
| {0} | {1}|||||
| {0} | {1} | {2} | {3} | {4} | {5} |
| Concepto | Pesos (MXP) | Dolares (USD) |
| Total registros rechazados: | {0} | {1} |
| Total Importe rechazado: $: | {0}.{1} | {2}.{3} |
| Total registros aceptados: | {0} | {1} |
| Total Importe aceptado $: | {0}.{1} | {2}.{3} |
| # | Proveedor | Importe($) | Moneda | Estatus | |
| {0} | {1}
| Personal | Cuenta | Error |
| {0} | {1} | CLABE ES OBLIGATORIA |
| {0} | {1} | NUMERO DE CUENTA CON FORMATO INCORRECTO |
| {0} | {1} | CLABE CON FORMATO INCORRECTO |
| {0} | {1} | CIE CON FORMATO INCORRECTO |
| {0} | {1} | CUENTA BANCOMER SIN CUENTA O CIE |
| ") ' strBody.AppendFormat(" ") ' strBody.AppendFormat(" | ") ' strBody.AppendFormat("
")
' 'strBody.Append(" De: Bancomer.com [mailto:alertatdu@serviciobancomer.com]
")
' strBody.Append("
", UrlSitio)
' strBody.Append(" ")
' strBody.Append("
")
' strBody.AppendFormat(" 
")
' strBody.Append("
")
' strBody.Append(" Confirmación de pago realizado bajo las siguientes condiciones:
| ") ' strBody.Append(" | ") ' strBody.Append("") ' strBody.Append(" | ") ' strBody.Append("
| ")
' strBody.Append(" ")
' strBody.Append(" NOMBRE DEL CLIENTE: | ")
' strBody.Append(" ")
' strBody.Append(" ")
' strBody.AppendFormat(" {0} | ")
' strBody.Append("
| ")
' strBody.Append(" ")
' strBody.Append(" NÚMERO DE CONVENIO: | ")
' strBody.Append(" ")
' strBody.Append(" ")
' strBody.AppendFormat(" {0} | ")
' strBody.Append("
| ")
' strBody.Append(" ")
' strBody.Append(" CLAVE DEL PROVEEDOR: | ")
' strBody.Append(" ")
' strBody.Append(" ")
' strBody.AppendFormat(" {0} | ")
' strBody.Append("
| ")
' strBody.Append(" ")
' strBody.Append(" NOMBRE DEL PROVEEDOR/TERCERO: | ")
' strBody.Append(" ")
' strBody.Append(" ")
' strBody.AppendFormat(" {0} | ")
' strBody.Append("
| ")
' strBody.Append(" ")
' strBody.Append(" REFERENCIA DEL PAGO: | ")
' strBody.Append(" ")
' strBody.Append(" ")
' strBody.AppendFormat(" {0} | ")
' strBody.Append("
| ")
' strBody.Append(" ")
' strBody.Append(" TIPO DE PAGO: | ")
' strBody.Append(" ")
' strBody.Append(" ")
' strBody.AppendFormat(" {0} | ")
' strBody.Append("
| ")
' strBody.Append(" ")
' strBody.Append(" CUENTA DE ABONO: | ")
' strBody.Append(" ")
' strBody.Append(" ")
' strBody.AppendFormat(" {0} | ")
' strBody.Append("
| ")
' strBody.Append(" ")
' strBody.Append(" IMPORTE DEL PAGO: | ")
' strBody.Append(" ")
' strBody.Append(" ")
' strBody.AppendFormat(" ${0} | ")
' strBody.Append("
| ")
' strBody.Append(" ")
' strBody.Append(" FECHA DE OPERACIÓN | ")
' strBody.Append(" ")
' strBody.Append(" ")
' strBody.AppendFormat(" {0} | ")
' strBody.Append("
| ")
' strBody.Append(" ")
' strBody.Append(" MENSAJE ADICIONAL: | ")
' strBody.Append(" ")
' strBody.Append(" ")
' strBody.AppendFormat(" {0} | ")
' strBody.Append("
", UrlSitio)
' strBody.Append(" ")
' strBody.Append("
")
' strBody.Append("
")
' strBody.Append("
")
' strBody.Append("
")
' strBody.Append("
| Factura ") ' strBody.Append(" | Fecha ") ' strBody.Append(" | Original ") ' strBody.Append(" | Abonado ") ' strBody.Append(" | Nota Crédito ") ' strBody.Append(" | Saldo ") ' strBody.Append(" |
|---|---|---|---|---|---|
| {Dr2("SerieFolio")} | ") ' strBody.Append($"{Dr2("FechaCompra").ToString.ToDate.ToShortDateString} | ") ' strBody.Append($"{Dr2("Total").ToString.ToDouble.FormatoNumero} | ") ' strBody.Append($"{Dr2("Importe").ToString.ToDouble.FormatoNumero} | ") ' strBody.Append($"{Dr2("ImporteNC").ToString.ToDouble.FormatoNumero} | ") ' strBody.Append($"{Dr2("Saldo").ToString.ToDouble.FormatoNumero} | ") ' strBody.Append("
| ") ' strBody.AppendFormat(" ") ' strBody.AppendFormat(" | ") ' strBody.AppendFormat("
| ") ' strBody.AppendFormat(" ") ' strBody.AppendFormat(" | ") ' strBody.AppendFormat("