This commit is contained in:
JPerez
2025-07-14 14:30:21 -07:00
6 changed files with 1910 additions and 1033 deletions

884
App_Code/ClsPagoScotia.vb Normal file
View File

@@ -0,0 +1,884 @@
Option Explicit On
Option Strict On
Imports System.Data
Imports System.Data.SqlClient
Imports System.IO
Imports DocumentFormat.OpenXml.Math
Imports Extensiones
Public Class ClsPagoScotia
Implements IDisposable
Public Sub New()
' Constructor privado para evitar instanciación directa
End Sub
'====================================================================
' 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 Property ErrorLayout As Boolean = False
Public Property LayoutStr As String = String.Empty
Public Property LayouErrorStr As String = String.Empty
Public Property TotalPagos As Integer = 0
Public Property NombreArchivo As String = ""
Public Function GeneraPagoScotiaBank(ByVal DTPendientes As DataTable, InsertaEnDB As Boolean, CveCuenta As Integer, UsuarioActual As Usuario) As Boolean
'ConvenioPagoElectronico = get_GlobalDTBancosCuentas(UsuarioActual.CveUsuario, CveEmpresa: UsuarioActual.CveEmpresa).FiltroPrimeroValor("ConvenioPagoElectronico", $" CveCuenta = {DdlCuenta.SelectedValue}").ToString();
Dim TamanoBloque As Integer = 5000 ' pagos por bloque
ErrorLayout = False
LayoutStr = ""
LayouErrorStr = ""
TotalPagos = 0
NombreArchivo = ""
'Dim ErrorLayout As Boolean = False
'------------------- VALIDACIONES BÁSICAS ---------------------------
If DTPendientes Is Nothing OrElse DTPendientes.Rows.Count = 0 Then
LayouErrorStr = "No hay datos pendientes para generar el Layout de ScotiaBank."
ErrorLayout = True
End If
Dim CuentaCargo As String = DTPendientes.Rows(0)("CLABEOrigen").ToString
If CuentaCargo.Length <> 11 Then
LayouErrorStr = "El campo CuentaCargo debe ser numérico de 11 dígitos."
ErrorLayout = True
End If
Dim NumeroConvenio As String = DTPendientes.Rows(0)("ConvenioPagoElectronico").ToString
If NumeroConvenio.Trim.Length = 0 Then
LayouErrorStr = "El campo NumeroConvenio (ConvenioPagoElectronico) no está definido en los datos de la cuenta."
ErrorLayout = True
End If
If NumeroConvenio.Length <> 5 Then
LayouErrorStr = "El campo NumeroConvenio debe ser numérico de 5 dígitos."
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 = ClsPaginas.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.<br>")
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
SBErrores.Append($"CveBanco inválida en fila {idx + 1}. Debe ser numérico de 3 dígitos.")
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
da.Append("".PadLeft(6, SPACE))
sb.AppendLine(da.ToString()) '345-370 FILLER ALF 6
'----------- DETALLE MAIL (DM) 104 -------------------------
Dim correo As String = dr("Correo").ToString.Trim
If correo.Trim.Length = 0 Then
SBErrores.Append($" {nombreBen} Email no definido en fila {idx + 1}. Debe ser un correo electrónico válido.<br>")
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)
NombreArchivo = $"pagos_{ClsPaginas.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, ClsPaginas.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 =
Dim fs As FileStream = File.Create(path)
Dim info As Byte() = New UTF8Encoding(True).GetBytes(sb.ToString)
fs.Write(info, 0, info.Length)
fs.Close()
If ErrorLayout Then
LayouErrorStr = LayouErrorStr & $"{SBErrores.ToString}"
Return False
Else
LayoutStr = sb.ToString()
Return True
End If
End Function
'====================================================================
' 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
#Region "LAYOUT SCOTIABANK"
'====================================================================
' GenerarLayoutPagosScotia
'====================================================================
Public Function AltaCuentasScotia(
DtPendientesTemp As DataTable,
UsuarioActual As Usuario,
Optional NumeroConvenio As String = "", ' 5 dígitos
Optional SistemaCentral As String = "001", ' 3 dígitos
Optional TipoArchivo As String = "EE", ' 2 digitos (define tu propio código)
Optional Secuencia As Integer = 1, ' 3 dígitos, consecutivo del día
Optional MovimientoDefault As Char = "P"c ' P =pago, cambia si usas A/C/B
) As Boolean
ErrorLayout = False
LayoutStr = ""
LayouErrorStr = ""
TotalPagos = 0
NombreArchivo = ""
'------------------- 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 = ClsPaginas.NowADS().Date
'If DtPendientesTemp Is Nothing Then DtPendientesTemp = DTPendientes.Copy
DtPendientesTemp.CaseSensitive = False
DtPendientesTemp = DtPendientesTemp.FiltraParametros("", "",
{"CLABEDestino", "CLABE", "CveBanco", "CveCuentaDeposito", "EstatusCtaDeposito", "EstatusPagoElectronicoScotia", "BancoNombre", "FechaEliminacion", "ConvenioPagoElectronico"}
)
If DtPendientesTemp.Rows.Count = 0 Then
LayouErrorStr = "No hay datos pendientes para generar el Layout de ScotiaBank."
ErrorLayout = True
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
If Not NumeroConvenio.Trim.Length > 0 Then
NumeroConvenio = DtPendientesTemp.Rows(0)("ConvenioPagoElectronico").ToString
End If
If NumeroConvenio.Trim.Length = 0 Then
LayouErrorStr = "El campo NumeroConvenio (ConvenioPagoElectronico) no está definido en los datos de la cuenta."
ErrorLayout = True
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(ClsPaginas.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 Contador As Integer = 2
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($"Linea {Contador} Cuenta *{CuentaDestino}* debe tener 11 o 18 dígitos.<br>")
esError = True
End If
If banco.Length <> 3 OrElse Not IsNumeric(banco) OrElse banco = "000" Then
SBErrores.Append($"Linea {Contador} Cuenta *{CuentaDestino}* código {banco} no es un banco válido. Debe ser numérico de 3 dígitos.<br>")
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(ClsPaginas.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
ErrorLayout = True
End Select
Else
If registro.Length <> LARGO_REGISTRO Then
SBErrores.Append($"Error linea {Contador} tamaño esperado: {LARGO_REGISTRO} tamaño: {registro.Length}, <br>")
End If
ErrorLayout = True
End If
Contador += 1
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 ------------------
If sb.Length = 0 Then
SBErrores.Append("No se generó ningún registro válido para Bajío.<br>")
ErrorLayout = True
End If
NombreArchivo = $"altacuentasScotia_{FechaArchivo:ddMMyyyy}_{NumeroArchivo:D3}.txt"
If SBErrores.Length > 0 Then
LayouErrorStr = "Errores encontrados al generar el layout de ScotiaBank:<br>" & SBErrores.ToString
ErrorLayout = True
Else
If Not CreaArchivo(sb.ToString, NombreArchivo, UsuarioActual:=UsuarioActual) Then
ErrorLayout = True
End If
End If
LayoutStr = sb.ToString()
Return If(ErrorLayout, False, True)
'If SBErrores.Length > 0 Then
' LayouErrorStr = "Errores encontrados al generar el layout de ScotiaBank:<br>" & SBErrores.ToString
' ErrorLayout = True
'Else
' If CreaArchivo(sb.ToString, NombreArchivo, UsuarioActual:=UsuarioActual) 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 Function
Private Function CreaArchivo(TextoCompleto As String, NombreArchivoEnviado As String, UsuarioActual As Usuario) As Boolean
DirectoryExistsCreate(String.Format("{0}Layout", UsuarioActual.Empresa.Ruta))
Dim path As String = String.Format("{0}Layout\{1}", UsuarioActual.Empresa.Ruta, NombreArchivo)
Try
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()
Catch ex As Exception
ErrorLayout = True
End Try
Return True
End Function
'---------------------------------------------------------------
' 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
Public Shared Function AltaCuentaScotiaCodigoRespuestaAnexoC(ByVal codigo As String) As String
Select Case codigo
Case "002" : Return "NO EXISTE NOMBRE DE APLICACION EN EL NOMBRE DE ARCHIVO"
Case "003" : Return "EL NUM DE CONTRATO EN EL NOMBRE DE ARCHIVO NO ES NUMERICO"
Case "004" : Return "EL NUMERO DE CONTRATO EN EL NOMBRE DE ARCHIVO ES CERO"
Case "005" : Return "EL NUM DE SECUENCIA EN NOMBRE DE ARCHIVO NO ES NUMERICO"
Case "006" : Return "EL NUMERO DE SECUENCIA EN EL NOMBRE DE ARCHIVO ES CERO"
Case "007" : Return "LA CLAVE DE ARCHIVO ES INVALIDA"
Case "008" : Return "LA CLAVE DE REGISTRO ES INVALIDA"
Case "009" : Return "NO EXISTE NOMBRE DE APLICACION EN EL REGISTRO HA"
Case "010" : Return "EL NOMBRE DE APLICACION NO CORRESPONDE AL ARCHIVO"
Case "011" : Return "EL NUMERO DE CONTRATO EN EL REGISTRO HA NO ES NUMERICO"
Case "012" : Return "EL NUMERO DE CONTRATO EN EL REGISTRO HA ES CERO"
Case "013" : Return "EL NUMERO DE CONTRATO NO CORRESPONDE AL ARCHIVO"
Case "014" : Return "EL CONTRATO NO EXISTE"
Case "015" : Return "EL NUMERO DE SECUENCIA EN EL REGISTRO HA NO ES NUMERICO"
Case "016" : Return "EL NUMERO DE SECUENCIA EN EL REGISTRO HA ES CERO"
Case "017" : Return "EL NUMERO DE SECUENCIA NO CORRESPONDE AL ARCHIVO"
Case "018" : Return "EL MOVIMIENTO CUENTA ES UN DATO OBLIGATORIO"
Case "019" : Return "EL MOVIMIENTO CUENTA DEBE SER A"
Case "020" : Return "EL NUMERO DE BANCO NO ES NUMERICO"
Case "021" : Return "EL NUMERO DE BANCO NO EXISTE EN EL CATALOGO"
Case "022" : Return "EL TIPO DE CUENTA ES INVALIDO PARA ESE BANCO"
Case "023" : Return "EL TIPO DE CUENTA NO ES NUMERICO"
Case "024" : Return "LA MONEDA DE LA CUENTA NO ES NUMERICO"
Case "025" : Return "LA MONEDA DE LA CUENTA NO TIENE UN VALOR PERMITIDO"
Case "026" : Return "LA FECHA DE DE VIGENCIA NO ES NUMERICA"
Case "027" : Return "LA FECHA DE VIGENCIA ESTA FUERA DE RANGO"
Case "028" : Return "EL IMPORTE LIMITE ES NO NUMERICO"
Case "029" : Return "EL NUMERO DE ALTAS SOLICITADAS NO ES NUMERICO"
Case "030" : Return "EL NUMERO DE CAMBIOS SOLICITADOS NO ES NUMERICO"
Case "031" : Return "EL NUMERO DE BAJAS SOLICITADAS NO ES NUMERICO"
Case "032" : Return "EL NUMERO DE CONSULTAS SOLICITADAS NO ES NUMERICO"
Case "033" : Return "EL NUMERO DE ALTAS SOLICITADAS NO COINCIDE"
Case "034" : Return "EL NUMERO DE CAMBIOS SOLICITADOS NO COINCIDE"
Case "035" : Return "EL NUMERO DE BAJAS SOLICITADAS NO COINCIDE"
Case "036" : Return "EL NUMERO DE CONSULTAS SOLICITADAS NO COINCIDE"
Case "037" : Return "ARCHIVO RECHAZADO POR MOVIMIENTOS RECHAZADOS"
Case "038" : Return "ARCHIVO RECHAZADO POR NO EXISTIR MOVIMIENTOS CORRECTOS"
Case "039" : Return "EL NUMERO DE CUENTA NO ES NUMERICO"
Case "040" : Return "EL NUMERO DE CUENTA NO CERO"
Case "041" : Return "EL NUMERO DE CUENTA NO EXISTE"
Case "042" : Return "EL NUMERO DE CUENTA NO PERTENECE A ESE BANCO"
Case "043" : Return "LA PLAZA ABM NO EXISTE"
Case "044" : Return "EL DIGITO VERIFICADOR DE LA CLABE NO CORRESPONDE"
Case "045" : Return "LA CUENTA NO ESTA ACTIVA"
Case "046" : Return "LA CUENTA YA EXISTE"
Case "047" : Return "LA CUENTA NO EXISTE"
Case "048" : Return "EL TIPO DE CUENTA NO ES NUMERICO"
Case "049" : Return "EL TIPO DE CUENTA NO TIENE UN VALOR PERMITIDO"
Case "050" : Return "EL IMPORTE LIMITE ES CERO"
Case "051" : Return "NO EXISTE LA CLAVE DE MANTEMIMIENTO/CONSULTA"
Case "052" : Return "LA CLAVE DE MANT/CONS NO TIENE UN VALOR PERMITIDO"
Case "053" : Return "TIPO DE REGISTRO NO VALIDO PARA ARCHIVO DE CONSULTA"
Case Else : Return "CÓDIGO DESCONOCIDO"
End Select
End Function
Public Shared Function PagosScotiaCodigoRespuestaAnexoC(ByVal codigo As String) As String
codigo = codigo.PadLeft(3, "0"c)
Select Case codigo
Case "000" : Return "NO ERROR (OK)"
Case "001" : Return "FIN DE ARCHIVO"
Case "002" : Return "ARCHIVO NO ENCONTRADO"
Case "003" : Return "LECTURA: REGISTRO NO UNICO"
Case "006" : Return "ERROR FUERA DE CATEGORIAS DE CICS"
Case "007" : Return "COMANDOS EN ORDEN ILOGICO"
Case "008" : Return "NO SE TIENE AUTORIZACION"
Case "009" : Return "MISMO BANCO PROGRAMADO - VALIDACION DE ESTRUCTURA Y ESTATUS (INACTIVO, CANCELADO)"
Case "010" : Return "ARCHIVO NO ABIERTO"
Case "011" : Return "TEF - VALIDACION DE ESTRUCTURA (ERRONEA)"
Case "012" : Return "SPEI - VALIDACION DE ESTRUCTURA (ERRONEA)"
Case "013" : Return "ERROR DE I/O NO CUBIERTO POR CICS"
Case "014" : Return "LONGITUD DE REGISTRO ERRONEA"
Case "015" : Return "ARCHIVO NO DISPONIBLE"
Case "016" : Return "ESCRITURA: REGISTRO DUPLICADO"
Case "017" : Return "NO HAY ESPACIO EN EL DISPOSITIVO PARA ADICIONAR REGISTRO"
Case "019" : Return "OTRO ERROR DE I/O"
Case "020" : Return "DATO NO NUMERICO"
Case "021" : Return "DATO REQUERIDO (SI LA OPERACIÓN ES SPID CONTACTE A SU EJECUTIVO DE RELACIÓN PARA REVISAR LA DIRECCION REGISTRADA)"
Case "022" : Return "VALOR FUERA DE RANGO"
Case "023" : Return "DATO NO COINCIDE CON NOMBRE DE ARCHIVO"
Case "024" : Return "ERROR EN SECUENCIA DE REGISTROS"
Case "025" : Return "NO EXISTE CONTRATO"
Case "026" : Return "NO EXISTE PLAZA"
Case "027" : Return "NO EXISTE SUCURSAL"
Case "028" : Return "NO EXISTE CUENTA"
Case "029" : Return "CUENTA NO ACTIVA"
Case "030" : Return "CUENTA NO RELACIONADA AL CONTRATO"
Case "031" : Return "NO EXISTE BANCO"
Case "032" : Return "MONEDA INVALIDA PARA ESE PRODUCTO"
Case "033" : Return "ERROR EN CIFRA DE CONTROL"
Case "034" : Return "ARCHIVO RECHAZADO POR REGISTROS RECHAZADOS"
Case "035" : Return "PAGO DUPLICADO"
Case "036" : Return "NO EXISTE PAGO"
Case "037" : Return "ARCHIVO NO PENDIENTE DE VALIDACION"
Case "038" : Return "CONTRATO NO ACTIVO"
Case "039" : Return "ARCHIVO RECHAZADO POR QUE NO TIENE REGISTROS CORRECTOS"
Case "040" : Return "MONEDA DE REGISTRO DETALLE DIFERENTE A MONEDA DE CUENTA DE CARGO"
Case "041" : Return "FECHA INHABIL"
Case "042" : Return "FECHA DE APLICACION INVALIDA PARA ESE TIPO DE PAGO"
Case "043" : Return "NUMERO DE BANCO INVALIDO PARA ESE TIPO DE PAGO"
Case "044" : Return "HORARIO SUCURSAL NO DISPONIBLE"
Case "045" : Return "IMPORTE SUPERIOR AL PERMITIDO SPEI"
Case "046" : Return "LA CUENTA DE ABONO NO ESTA REGISTRADA EN LA BASE DE DATOS DEL BANCO PARA ESE CONTRATO"
Case "047" : Return "IMPORTE SUPERIOR AL AUTORIZADO POR EL CLIENTE PARA ESA CUENTA DE ABONO"
Case "048" : Return "FECHA DE CONSTITUCION ERRONEA"
Case "049" : Return "TIPO DE CUENTA INVALIDA SPID"
Case "050" : Return "SPID ES SOLO PARA PERSONAS MORALES"
Case "051" : Return "ERROR AL HACER REGISTRO EN TOTALES"
Case "052" : Return "ERROR AL HACER CARGO A CHEQUES"
Case "053" : Return "EL MOVIMIENTO NO ESTA PENDIENTE DE PAGO"
Case "054" : Return "ERROR AL REVERSAR CARGO A CHEQUES"
Case "055" : Return "SU TRANSACCIÓN NO PUEDE SER PROCESADA EN ESTE MOMENTO CONTACTE A SU EJECUTIVO DE RELACIÓN (CLAVE 99)."
Case "056" : Return "EL CERTIFICADO DE SU FIEL NO ES VIGENTE. FAVOR DE SOLICITAR A SU EJECUTIVO LA ACTUALIZACIÓN PARA PODER OPERAR SPID."
Case "057" : Return "SU TRANSACCIÓN NO PUEDE SER PROCESADA EN ESTE MOMENTO CONTACTE A SU EJECUTIVO DE RELACIÓN (CLAVE 88)."
Case "058" : Return "EL MONTO DE LA OPERACIÓN SOBREPASA EL DISPONIBLE PARA ESTE BENEFICIARIO."
Case "059" : Return "TRANSACCION SPID DEVUELTA"
Case "060" : Return "PAGO NO DISPONIBLE EN HORARIO EXTENDIDO"
Case "061" : Return "INSUFICIENCIA DE FONDOS"
Case "062" : Return "CAMBIO A ABONO EN CUENTA DE DEVOLUCIONES"
Case "063" : Return "CAMBIO A PAGO EN VENTANILLA EFECTIVO"
Case "064" : Return "CAMBIO A CHEQUE DE CAJA AL BENEFICIARIO EN VENTANILLA"
Case "065" : Return "CAMBIO A CHEQUE DE CAJA CENTRAL AL BENEFICIARIO"
Case "066" : Return "CAMBIO A CHEQUE DE CAJA CENTRAL A LA EMPRESA POR TOTAL"
Case "067" : Return "CAMBIO A CHEQUE DE CAJA CENTRAL A LA EMPRESA POR DETALLE"
Case "068" : Return "CAMBIO ORIGINADO POR UN PAGO EN VENTANILLA"
Case "069" : Return "CAMBIO ORIGINADO POR UN ABONO A CHEQUES"
Case "070" : Return "CAMBIO ORIGINADO POR UN ABONO A AHORROS"
Case "071" : Return "CAMBIO ORIGINADO POR UN DEPOSITO INTERBANCARIO"
Case "072" : Return "CAMBIO ORIGINADO POR UN MOVIMIENTO DE TRANSFERENCIA DE FONDOS"
Case "073" : Return "BAJA RECHAZADA POR PAGO EN LINEA"
Case "074" : Return "DEVOLUCION GLOBAL POR RECHAZOS"
Case "075" : Return "DEVOLUCION GLOBAL POR VENCIMIENTO DE VIGENCIAS"
Case "076" : Return "DEVOLUCION GLOBAL POR BAJAS SOLICITADAS"
Case "077" : Return "HORARIO DE OPERACIÓN NO DISPONIBLE SPID"
Case "078" : Return "EL ABONO EXCEDE EL MÁXIMO PERMITIDO A LA CUENTA"
Case Else : Return "CÓDIGO DESCONOCIDO"
End Select
End Function
#End Region
#Region "IDisposable Support"
Private disposedValue As Boolean = False
' IDisposable
Protected Overridable Sub Dispose(disposing As Boolean)
If Not Me.disposedValue Then
If disposing Then
' TODO: dispose managed state (managed objects).
'If Not Data Is Nothing Then Data.Dispose() : Data = Nothing
'If Not SqlAdapter Is Nothing Then SqlAdapter.Dispose() : SqlAdapter = Nothing
'If Not SqlCommand Is Nothing Then SqlCommand.Dispose() : SqlCommand = Nothing
'If Not SqlTransacc Is Nothing Then SqlTransacc.Dispose() : SqlTransacc = Nothing
'If SqlConexion.State <> ConnectionState.Closed Then SqlConexion.Close()
'If Not SqlConexion Is Nothing Then SqlConexion.Dispose() : SqlConexion = Nothing
End If
' TODO: free unmanaged resources (unmanaged objects) and override Finalize() below.
' TODO: set large fields to null.
End If
Me.disposedValue = True
End Sub
' TODO: override Finalize() only if Dispose(disposing As Boolean) above has code to free unmanaged resources.
'Protected Overrides Sub Finalize()
' ' Do not change this code. Put cleanup code in Dispose(disposing As Boolean) above.
' Dispose(False)
' MyBase.Finalize()
'End Sub
' This code added by Visual Basic to correctly implement the disposable pattern.
Public Sub Dispose() Implements IDisposable.Dispose
' Do not change this code. Put cleanup code in Dispose(disposing As Boolean) above.
'ConexionClose()
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
#End Region
End Class

File diff suppressed because it is too large Load Diff

View File

@@ -866,7 +866,7 @@ Partial Class Bancos_PagoElectronicoGrupos
ElseIf OpBancos = 2 Then ElseIf OpBancos = 2 Then
AltaProveedoresBajio() AltaProveedoresBajio()
ElseIf OpBancos = 3 Then ElseIf OpBancos = 3 Then
'AltaProveedoresScotia() SE DEJA COMENTADO PORQUE NO SE ESTA USANDO, SE CAMBIO A PAGO ELECTRONICO 'AltaCuentasScotia() SE DEJA COMENTADO PORQUE NO SE ESTA USANDO, SE CAMBIO A PAGO ELECTRONICO
End If End If
@@ -2743,7 +2743,7 @@ Partial Class Bancos_PagoElectronicoGrupos
ElseIf OpBancos = 2 Then ElseIf OpBancos = 2 Then
AltaProveedoresBajio(DTProveedores) AltaProveedoresBajio(DTProveedores)
ElseIf OpBancos = 3 Then ElseIf OpBancos = 3 Then
'AltaProveedoresScotia(DTProveedores) 'AltaCuentasScotia(DTProveedores)
End If End If

View File

@@ -4977,20 +4977,53 @@
<ajax:ValidatorCalloutExtender ID="VCERfvTxtModalLayoutBancosFecha" runat="server" HighlightCssClass="vco" TargetControlID="RfvTxtModalLayoutBancosFecha" Width="350px"></ajax:ValidatorCalloutExtender> <ajax:ValidatorCalloutExtender ID="VCERfvTxtModalLayoutBancosFecha" runat="server" HighlightCssClass="vco" TargetControlID="RfvTxtModalLayoutBancosFecha" Width="350px"></ajax:ValidatorCalloutExtender>
</div> </div>
<asp:UpdatePanel runat="server" ID="UpControlesScotia" UpdateMode="Conditional">
<ContentTemplate>
<div class="row" runat="server" id="DVCuentasScotia" visible="false">
<br />
<div class="col-md-3">
<asp:Label runat="server" ID="LblCuentasScotia" ></asp:Label>
</div>
<div class="col-md-3">
<asp:Button runat="server" ID="BtnGenerarAlta" Text="Generar Alta" OnClick="BtnGenerarAlta_Click" class="btn btn-primary" Enabled="false" />
</div>
<div class="col-md-3">
<div class="btn-file btn green" onclick="$('#FUTxt').click();">
<i class="fa fa-plus"></i>
<span>Seleccionar</span>
</div>
<span id="FUTxtt"></span>
</div>
<div class="col-md-3">
<asp:Button runat="server" ID="BtnCargarAlta" Text="Cargar Alta" OnClick="BtnCargarAlta_Click" class="btn btn-primary" />
</div>
</div>
</ContentTemplate>
<Triggers>
<asp:PostBackTrigger ControlID="BtnCargarAlta" />
<asp:PostBackTrigger ControlID ="BtnGenerarAlta" />
</Triggers>
</asp:UpdatePanel>
<%-- <div class="form-group form-md-line-input input-iconright" runat="server" visible="false" >
<asp:TextBox ID="TxtModalLayoutBancosFecha" runat="server" CausesValidation="True" CssClass="form-control"></asp:TextBox>
<asp:RequiredFieldValidator ID="RfTxtModalLayoutBancosFecha" runat="server" ControlToValidate="TxtModalLayoutBancosFecha" CssClass="help-block errorimput" Display="none"
ErrorMessage="<b><span style='text-decoration: underline'>ERROR:</span></b><br />El campo <b>''Fecha''</b> es necesario "
ValidationGroup="GrpModalBancoLayout"></asp:RequiredFieldValidator>
<ajax:ValidatorCalloutExtender ID="VCERfTxtModalLayoutBancosFecha" runat="server" HighlightCssClass="vco" TargetControlID="RfTxtModalLayoutBancosFecha" Width="350px"></ajax:ValidatorCalloutExtender>
<asp:Label runat="server" Text="Fecha: " AssociatedControlID="TxtModalLayoutBancosFecha"></asp:Label>
<ajax:MaskedEditExtender ID="MaskedEditExtender6" runat="server" TargetControlID="TxtModalLayoutBancosFecha" Mask="99/99/9999" MaskType="Date" DisplayMoney="Left" AcceptNegative="Left" BehaviorID="_content_MKEFechaBaja" Century="2000" CultureAMPMPlaceholder="" CultureCurrencySymbolPlaceholder="" CultureDateFormat="" CultureDatePlaceholder="" CultureDecimalPlaceholder="" CultureThousandsPlaceholder="" CultureTimePlaceholder=""></ajax:MaskedEditExtender> <%--
<ajax:CalendarExtender ID="CalendarExtender5" runat="server" TargetControlID="TxtModalLayoutBancosFecha" PopupButtonID="ImgFechaBaja" PopupPosition="BottomRight" BehaviorID="_content_CEFechaBaja"></ajax:CalendarExtender> <div class="form-group form-md-line-input input-iconright" runat="server" visible="false" >
<asp:CompareValidator ID="CompareValidator1" runat="server" ControlToValidate="TxtModalLayoutBancosFecha" Display="None" ErrorMessage="<b><span style='text-decoration: underline'>ERROR:</span></b><br />El campo <b>''Fecha de Baja''</b> no tiene el formato correcto, por favor intente de nuevo con el siguiente formato: (dd/mm/yyyy)." Operator="DataTypeCheck" Type="Date" ValidationGroup="GrpModalBancoLayout" Visible="False"></asp:CompareValidator> <asp:TextBox ID="TxtModalLayoutBancosFecha" runat="server" CausesValidation="True" CssClass="form-control"></asp:TextBox>
</div>--%> <asp:RequiredFieldValidator ID="RfTxtModalLayoutBancosFecha" runat="server" ControlToValidate="TxtModalLayoutBancosFecha" CssClass="help-block errorimput" Display="none"
ErrorMessage="<b><span style='text-decoration: underline'>ERROR:</span></b><br />El campo <b>''Fecha''</b> es necesario "
ValidationGroup="GrpModalBancoLayout"></asp:RequiredFieldValidator>
<ajax:ValidatorCalloutExtender ID="VCERfTxtModalLayoutBancosFecha" runat="server" HighlightCssClass="vco" TargetControlID="RfTxtModalLayoutBancosFecha" Width="350px"></ajax:ValidatorCalloutExtender>
<asp:Label runat="server" Text="Fecha: " AssociatedControlID="TxtModalLayoutBancosFecha"></asp:Label>
<ajax:MaskedEditExtender ID="MaskedEditExtender6" runat="server" TargetControlID="TxtModalLayoutBancosFecha" Mask="99/99/9999" MaskType="Date" DisplayMoney="Left" AcceptNegative="Left" BehaviorID="_content_MKEFechaBaja" Century="2000" CultureAMPMPlaceholder="" CultureCurrencySymbolPlaceholder="" CultureDateFormat="" CultureDatePlaceholder="" CultureDecimalPlaceholder="" CultureThousandsPlaceholder="" CultureTimePlaceholder=""></ajax:MaskedEditExtender>
<ajax:CalendarExtender ID="CalendarExtender5" runat="server" TargetControlID="TxtModalLayoutBancosFecha" PopupButtonID="ImgFechaBaja" PopupPosition="BottomRight" BehaviorID="_content_CEFechaBaja"></ajax:CalendarExtender>
<asp:CompareValidator ID="CompareValidator1" runat="server" ControlToValidate="TxtModalLayoutBancosFecha" Display="None" ErrorMessage="<b><span style='text-decoration: underline'>ERROR:</span></b><br />El campo <b>''Fecha de Baja''</b> no tiene el formato correcto, por favor intente de nuevo con el siguiente formato: (dd/mm/yyyy)." Operator="DataTypeCheck" Type="Date" ValidationGroup="GrpModalBancoLayout" Visible="False"></asp:CompareValidator>
</div>
--%>
<br /> <br />
@@ -5012,6 +5045,11 @@
<asp:PostBackTrigger ControlID="BtnEfectivaleXLS" /> <asp:PostBackTrigger ControlID="BtnEfectivaleXLS" />
</Triggers> </Triggers>
</asp:UpdatePanel> </asp:UpdatePanel>
<div style="display:none!important">
<asp:FileUpload ID="FUTxt" runat="server" onchange="$('#FUTxtt').text(this.value);" ClientIDMode="Static" />
</div>
</div> </div>

View File

@@ -1,22 +1,24 @@
using Extensiones; using DocumentFormat.OpenXml.Drawing;
using Extensiones;
using Ionic.Zip;
using iTextSharp.text.pdf; using iTextSharp.text.pdf;
using iTextSharp.text.pdf.parser;
using Modelos;
using Profact.TimbraCFDI40;
using StackExchange.Redis;
using System; using System;
using System.Activities.Expressions;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data; using System.Data;
using System.Drawing; using System.Drawing;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.UI; using System.Web.UI;
using System.Web.UI.WebControls; using System.Web.UI.WebControls;
using static Extensiones.ModExtensiones; using static Extensiones.ModExtensiones;
using Modelos;
using System.Text.RegularExpressions;
using iTextSharp.text.pdf.parser;
using Profact.TimbraCFDI40;
using Ionic.Zip;
using DocumentFormat.OpenXml.Drawing;
using System.Web;
public partial class Nomina_Nomina2 : ClsPaginas public partial class Nomina_Nomina2 : ClsPaginas
{ {
@@ -10742,7 +10744,8 @@ public partial class Nomina_Nomina2 : ClsPaginas
SinSelccion, SinSelccion,
Bancomer, Bancomer,
Banorte, Banorte,
Banamex Banamex,
ScotiaBank
} }
@@ -10786,6 +10789,7 @@ public partial class Nomina_Nomina2 : ClsPaginas
CargaCuentas(); CargaCuentas();
DivModalLayoutBancosFecha.Visible = false; DivModalLayoutBancosFecha.Visible = false;
DVCuentasScotia.Visible = false;
TxtModalLayoutBancosFecha.Text = ""; TxtModalLayoutBancosFecha.Text = "";
RegistraScript("$('#ModalLayoutBancos').modal('show');"); RegistraScript("$('#ModalLayoutBancos').modal('show');");
@@ -10798,7 +10802,7 @@ public partial class Nomina_Nomina2 : ClsPaginas
DdlCuenta.Items.Clear(); DdlCuenta.Items.Clear();
DataTable DTCuentas = get_GlobalDTBancosCuentas(UsuarioActual.CveUsuario, CveEmpresa: UsuarioActual.CveEmpresa).FiltraParametros(" CveTipoCuenta <> 1 AND UsaLayout = 'True' AND LEN(ConvenioPagoElectronico) > 0 "); DataTable DTCuentas = get_GlobalDTBancosCuentas(UsuarioActual.CveUsuario, CveEmpresa: UsuarioActual.CveEmpresa).FiltraParametros(" CveTipoCuenta <> 1 AND UsaLayout = 'True' AND LEN(ConvenioPagoElectronico) > 0 ");
DTCuentas.CaseSensitive = false; DTCuentas.CaseSensitive = false;
DdlCuenta.DataSource = DTCuentas.FiltraParametros(" Banco IN('BANCOMER','BANORTE','BBVA Bancomer','BBVA','BANAMEX')"); DdlCuenta.DataSource = DTCuentas.FiltraParametros(" Banco IN('BANCOMER','BANORTE','BBVA Bancomer','BBVA','BANAMEX') OR Banco LIKE '%SCOTIA%' ");
DdlCuenta.DataBind(); DdlCuenta.DataBind();
DdlCuenta.Items.Insert(0, new ListItem("Seleccione", "-1")); DdlCuenta.Items.Insert(0, new ListItem("Seleccione", "-1"));
DdlCuenta.SelectedValueExist("-1"); DdlCuenta.SelectedValueExist("-1");
@@ -10808,6 +10812,8 @@ public partial class Nomina_Nomina2 : ClsPaginas
{ {
ConvenioPagoElectronico = string.Empty; ConvenioPagoElectronico = string.Empty;
DivModalLayoutBancosFecha.Visible = false; DivModalLayoutBancosFecha.Visible = false;
DVCuentasScotia.Visible = false;
BtnGenerarAlta.Enabled = false;
if (DdlCuenta.SelectedValue.ToEntero() > 0) if (DdlCuenta.SelectedValue.ToEntero() > 0)
{ {
@@ -10827,6 +10833,12 @@ public partial class Nomina_Nomina2 : ClsPaginas
Banco = Bancos.Banamex; Banco = Bancos.Banamex;
DivModalLayoutBancosFecha.Visible = true; DivModalLayoutBancosFecha.Visible = true;
} }
else if (DdlCuenta.SelectedItem.Text.ToUpper().Contains("SCOTIA"))
{
DivModalLayoutBancosFecha.Visible = false;
Banco = Bancos.ScotiaBank;
PreparaLayoutBancosScotiaBank();
}
else else
{ {
ConvenioPagoElectronico = string.Empty; ConvenioPagoElectronico = string.Empty;
@@ -10838,6 +10850,274 @@ public partial class Nomina_Nomina2 : ClsPaginas
} }
} }
#region Layout ScotiaBank
private void PreparaLayoutBancosScotiaBank()
{
BtnGenerarAlta.Enabled = false;
int cuentasPendientes = 0;
using (ClsNominas objnom = new ClsNominas())
{
if (objnom.GetDispersionNomina(CvePeriodoSeleccionado, UsuarioActual.CveEmpresa, 18))
{
string fechaHoy = DateTime.Today.ToString("MM/dd/yyyy");
cuentasPendientes = objnom.DtResultados.FiltraParametros($" EstatusPagoElectronicoScotia = False OR FechaEliminacion < #{fechaHoy}# ").Rows.Count;
}
}
LblCuentasScotia.Text = string.Format("Pendientes: {0}", cuentasPendientes);
if (cuentasPendientes > 0)
{
BtnGenerarAlta.Enabled = true;
BtnModalBancosProcesar.Enabled = false;
DVCuentasScotia.Visible = true;
}
else
{
BtnModalBancosProcesar.Enabled = true;
}
UpControlesScotia.Update();
UpModalBancosLayout.Update();
}
protected void BtnGenerarAlta_Click(object sender, EventArgs e)
{
DataTable DTCuentasPendientes = new DataTable();
using (ClsNominas objnom = new ClsNominas())
{
if (objnom.GetDispersionNomina(CvePeriodoSeleccionado, UsuarioActual.CveEmpresa, 18))
{
string fechaHoy = DateTime.Today.ToString("MM/dd/yyyy");
DTCuentasPendientes = objnom.DtResultados.FiltraParametros($" EstatusPagoElectronicoScotia = False OR FechaEliminacion < #{fechaHoy}# ");
}
}
string NumeroConvenio = "";
using (ClsBancos objBancos = new ClsBancos())
{
if (objBancos.GetBancosCuentas(DdlCuenta.SelectedValue.ToEntero()))
{
if (objBancos.DtResultados.Rows.Count > 0)
{
NumeroConvenio = objBancos.DtResultados.Rows[0]["ConvenioPagoElectronico"].ToString();
}
}
}
if (NumeroConvenio.Length > 0)
{
using (ClsPagoScotia objPagoScotia = new ClsPagoScotia())
{
if (objPagoScotia.AltaCuentasScotia(DTCuentasPendientes, UsuarioActual, NumeroConvenio))
{
Response.Clear();
Response.Buffer = true;
Response.ContentType = "text/plain";
Response.AddHeader("Content-Disposition", "attachment;filename=" + objPagoScotia.NombreArchivo);
Response.Write(objPagoScotia.LayoutStr);
Response.Flush();
Response.End();
}
else{
Alert(objPagoScotia.LayouErrorStr, TipoMensaje.MsgAdvertencia);
RegistraScript("$('#ModalLayoutBancos').modal('show');");
UpModalBancosLayout.Update();
//Response.Clear();
//Response.Buffer = true;
//Response.ContentType = "text/plain";
//Response.AddHeader("Content-Disposition", "attachment;filename=" + objPagoScotia.RutaArchivo);
//Response.Write(objPagoScotia.LayoutStr);
//Response.Flush();
//Response.End();
}
}
}
else {
Alert("La cuenta seleccionada no tiene un Convenio de Pago Electronico");
}
}
private string GuardaTXT()
{
string NombreArchivo = "";
try
{
string FileName = System.IO.Path.GetFileName(FUTxt.PostedFile.FileName);
NombreArchivo = FileName;
string Extension = System.IO.Path.GetExtension(FUTxt.PostedFile.FileName);
string FolderPath = string.Format("{0}Empresas\\", Request.ApplicationPath);
string FilePath = Server.MapPath(FolderPath + FileName);
FUTxt.SaveAs(FilePath);
NombreArchivo = FilePath;
}
catch (Exception ex)
{
//Retorno = false;
this.GuardaLog( $" Error al guardar el archivo TXT --> {ex.StackTrace}");
NombreArchivo = "";
}
return NombreArchivo;
}
protected void BtnCargarAlta_Click(object sender, EventArgs e)
{
bool ErrorArchivo = false;
string RutaArchivo = "";
if (FUTxt.HasFile)
{
RutaArchivo = GuardaTXT();
if (RutaArchivo.Length == 0)
{
Alert("Ocurrió un error Scotia al cargar el archivo", TipoMensaje.MsgError);
return;
}
}
else
{
Alert("No tiene ningún archivo", TipoMensaje.MsgAdvertencia);
return;
}
// LEE TXT
string Texto;
Texto = System.IO.File.ReadAllText(RutaArchivo);
string[] TextoArreglo = Texto.Split(new[] { "\r\n" }, StringSplitOptions.None);
//if (OpBancos == 3)
//{
TextoArreglo = System.IO.File.ReadAllLines(RutaArchivo);
StringBuilder SBCuentasAltas = new StringBuilder();
StringBuilder SBErrores = new StringBuilder();
bool ErrorArchivoScotia = false;
string H = TextoArreglo[0];
if (!(TextoArreglo.Length >= 3))
{
Alert("El archivo no tiene el formato correcto, debe tener al menos 3 líneas (Header, Detalle y Trailer)", TipoMensaje.MsgAdvertencia);
return;
}
if (H.Length != 140)
{
Alert("La longitud de la cabecera es incorrecta", TipoMensaje.MsgAdvertencia);
return;
}
string TipoArchivo = H.Substring(0, 2).ToUpper();
if (TipoArchivo != "SP")
{
Alert($"El archivo no es un archivo de respuesta, inicia con código {TipoArchivo}", TipoMensaje.MsgAdvertencia);
}
string HCodigo = H.Substring(40, 3);
if (HCodigo != "000" && HCodigo != " ")
{
SBErrores.Append($"El código de la cabecera es incorrecto {HCodigo} - {ClsPagoScotia.AltaCuentaScotiaCodigoRespuestaAnexoC(HCodigo)}.</br>");
ErrorArchivoScotia = true;
}
ClsBancos ObjBancos = new ClsBancos();
ObjBancos.IniciaTransacSQL();
for (int i = 1; i <= TextoArreglo.Length - 2; i++)
{
string Linea = TextoArreglo[i];
if (Linea.Length == 140)
{
string CodigoRespuesta = Linea.Substring(109, 3);
string DTipoArchivo = Linea.Substring(0, 2);
string Cuenta = Linea.Substring(12, 20);
DateTime FechaEliminacion = DateTime.ParseExact(Linea.Substring(32, 8), "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture);
if (DTipoArchivo != "SP")
{
SBErrores.Append($"Error Línea {i} el tipo de archivo no es un archivo de respuesta (SP), inicia con código {DTipoArchivo}.</br>");
ErrorArchivoScotia = true;
}
if (CodigoRespuesta == "000" || CodigoRespuesta == " ")
{
int CveCuentaDeposito = Linea.Substring(40, 50).Trim().ToEntero();
if (CveCuentaDeposito > 0)
{
if (ObjBancos.UpdateCuentaDepositoPagoElectronico(CveCuentaDeposito, Opcion: 3, FechaEliminacion: FechaEliminacion))
{
SBCuentasAltas.Append($"Cuenta: {Cuenta} registrada correctamente.</br>");
}
else
{
ErrorArchivoScotia = true;
}
}
else
{
SBErrores.Append($"Error Línea {i} Cve: {CveCuentaDeposito} cuenta: {Cuenta} no encontrada.</br>");
ErrorArchivoScotia = true;
}
}
else
{
SBErrores.Append($"Error Línea {i} cuenta no dada de alta código {CodigoRespuesta} - {ClsPagoScotia.AltaCuentaScotiaCodigoRespuestaAnexoC(CodigoRespuesta)}.</br>");
ErrorArchivoScotia = true;
}
}
else
{
SBErrores.Append($"Error en longitud de la línea {i} es incorrecta.</br>");
ErrorArchivoScotia = true;
}
}
if (ErrorArchivoScotia)
{
ObjBancos.RollBack();
Alert($"El archivo presentó errores en su procesamiento ({SBErrores.Length}). Correctos {SBCuentasAltas.Length} cuentas.</br>Altas:</br>{SBCuentasAltas.ToString()}<br><br>Errores:<br>{SBErrores.ToString()}", TipoMensaje.MsgAdvertencia);
}
else
{
ObjBancos.Commit();
Alert($"El archivo se analizó correctamente y se efectuaron todos los cambios en el sistema. Cuentas procesadas:</br>{SBCuentasAltas.ToString()}", TipoMensaje.MsgInformacion);
}
ObjBancos.Dispose();
if (ErrorArchivo)
{
Alert("Ocurrió un error al cargar el archivo", TipoMensaje.MsgError);
return;
}
else {
Alert("El archivo se cargó correctamente", TipoMensaje.MsgInformacion);
System.IO.File.Delete(RutaArchivo);
PreparaLayoutBancosScotiaBank();
RegistraScript("$('#ModalLayoutBancos').modal('show');");
}
}
#endregion
protected void BtnLayoutXLS_Click(object sender, EventArgs e) protected void BtnLayoutXLS_Click(object sender, EventArgs e)
{ {
@@ -10970,6 +11250,7 @@ public partial class Nomina_Nomina2 : ClsPaginas
} }
protected void BtnModalBancosProcesar_Click(object sender, EventArgs e) protected void BtnModalBancosProcesar_Click(object sender, EventArgs e)
{ {
BtnModalBancosProcesar.Enabled = true;
if (Banco == Bancos.Bancomer) if (Banco == Bancos.Bancomer)
{ {
@@ -11001,6 +11282,104 @@ public partial class Nomina_Nomina2 : ClsPaginas
} }
} }
} }
else if (Banco == Bancos.ScotiaBank)
{
DataTable DTResultados = new DataTable();
using (ClsNominas objnom = new ClsNominas())
{
if (objnom.GetDispersionNomina(CvePeriodoSeleccionado, UsuarioActual.CveEmpresa, 18))
{
DTResultados = objnom.DtResultados;
}
}
if (DTResultados.Rows.Count > 0)
{
using (ClsPagoScotia objPagoScotia = new ClsPagoScotia())
{
string ConvenioPagoElectronicoScotia = get_GlobalDTBancosCuentas(UsuarioActual.CveUsuario, CveEmpresa: UsuarioActual.CveEmpresa).FiltroPrimeroValor("ConvenioPagoElectronico", $" CveCuenta = {DdlCuenta.SelectedValue}").ToString();
string NumCuentaOrigen = get_GlobalDTBancosCuentas(UsuarioActual.CveUsuario, CveEmpresa: UsuarioActual.CveEmpresa).FiltroPrimeroValor("NumCuenta", $" CveCuenta = {DdlCuenta.SelectedValue}").ToString();
string CLABEOrigen = get_GlobalDTBancosCuentas(UsuarioActual.CveUsuario, CveEmpresa: UsuarioActual.CveEmpresa).FiltroPrimeroValor("CLABE", $" CveCuenta = {DdlCuenta.SelectedValue}").ToString();
//CASE WHEN LEN(BC.NumCuenta) > 0 THEN BC.NumCuenta ELSE BC.CLABE END AS CLABEOrigen,
if (!DTResultados.Columns.Contains("ConvenioPagoElectronico"))
{
DTResultados.Columns.Add("ConvenioPagoElectronico", typeof(string));
}
if (!DTResultados.Columns.Contains("CLABEOrigen"))
{
DTResultados.Columns.Add("CLABEOrigen", typeof(string));
}
if (!DTResultados.Columns.Contains("Observaciones"))
{
DTResultados.Columns.Add("Observaciones", typeof(string));
}
foreach (DataRow dRow in DTResultados.Rows)
{
dRow["ConvenioPagoElectronico"] = ConvenioPagoElectronicoScotia;
dRow["CLABEOrigen"] = NumCuentaOrigen.Length > 0 ? NumCuentaOrigen : CLABEOrigen; // Si no tiene numero de cuenta, se usa la CLABE
dRow["Observaciones"] = dRow["CveNominaDetalle"].ToString();
}
//DTResultados.Columns["CLABEOrigen"].ColumnName = "CLABEOrigen"; // CLABE Origen
//DTResultados.Columns["ConvenioPagoElectronico"].ColumnName = "ConvenioPagoElectronico"; // Convenio Pago Electronico
//DTResultados.Columns["Importe"].ColumnName = "Importe"; // Importe
DTResultados.Columns["CvePersonal"].ColumnName = "CveProveedor"; // Cve Proveedor
//DTResultados.Columns["RFC"].ColumnName = "RFC"; // RFC
DTResultados.Columns["Nombre"].ColumnName = "RazonSocial"; // Razon Social
DTResultados.Columns["CveNominaDetalle"].ColumnName = "CveIE"; // Cve IE
//DTResultados.Columns["CLABEDestino"].ColumnName = "CLABEDestino"; // CLABE Destino
//DTResultados.Columns["CLABE"].ColumnName = "CLABE"; // CLABE
//DTResultados.Columns["CveBanco"].ColumnName = "CveBanco"; // Cve Banco
DTResultados.Columns["Observaciones"].ColumnName = "Observaciones"; // Observaciones
DTResultados.Columns["Correo"].ColumnName = "Correo"; // Correo
//DTResultados.Columns["CvePersonal"].ColumnName = "CvePersonal"; // Cve Personal
/*
CLABEOrigen
ConvenioPagoElectronico
Importe
CveProveedor
RFC
RazonSocial
CveIE
CLABEDestino
CLABE
CveBanco
Observaciones
Correo
CvePersonal
*/
if (objPagoScotia.GeneraPagoScotiaBank(DTResultados, false, DdlCuenta.SelectedValue.ToEntero(), UsuarioActual))
{
Response.Clear();
Response.Buffer = true;
Response.ContentType = "text/plain";
Response.AddHeader("Content-Disposition", "attachment;filename=" + objPagoScotia.NombreArchivo);
Response.Write(objPagoScotia.LayoutStr);
Response.Flush();
Response.End();
}
else
{
Alert(objPagoScotia.LayouErrorStr, TipoMensaje.MsgAdvertencia);
RegistraScript("$('#ModalLayoutBancos').modal('show');");
}
}
}
else{
Alert("No se encontraron registros para generar el layout de ScotiaBank", TipoMensaje.MsgAdvertencia);
}
}
} }
private void CrearLayoutNominaBancomer(DataTable DTNomina) private void CrearLayoutNominaBancomer(DataTable DTNomina)
{ {
@@ -12489,4 +12868,5 @@ public partial class Nomina_Nomina2 : ClsPaginas
{ {
CargaMovtoPermanente(); CargaMovtoPermanente();
} }
} }

View File

@@ -3976,6 +3976,8 @@ Partial Class OC_OC
Protected Sub BtnCancelar_Click(sender As Object, e As EventArgs) Handles BtnCancelar.Click Protected Sub BtnCancelar_Click(sender As Object, e As EventArgs) Handles BtnCancelar.Click
Dim ObjEventos As New ClsOIEventos Dim ObjEventos As New ClsOIEventos
If CveEstatusFinalError > 0 Then If CveEstatusFinalError > 0 Then
Dim objOrdenCompra As New ClsOC Dim objOrdenCompra As New ClsOC
objOrdenCompra.IniciaTransacSQL() objOrdenCompra.IniciaTransacSQL()
@@ -9499,6 +9501,10 @@ Partial Class OC_OC
Dim Respuesta As Boolean = True Dim Respuesta As Boolean = True
If TipoOC <> "OC" Then
Return True 'solo genera poliza de presupuesto si es OC
End If
If UsuarioActual.Empresa.Funcionalidad(532).Contiene("2") Then If UsuarioActual.Empresa.Funcionalidad(532).Contiene("2") Then
Dim CveMonedaPresupuesto As Integer = DdlMoneda.SelectedValue.ToEntero Dim CveMonedaPresupuesto As Integer = DdlMoneda.SelectedValue.ToEntero