diff --git a/App_Code/ClsBancos.vb b/App_Code/ClsBancos.vb
index 8882bb2d9..bd46e3ba4 100644
--- a/App_Code/ClsBancos.vb
+++ b/App_Code/ClsBancos.vb
@@ -128,6 +128,7 @@ Public Class ClsBancos
Public Property Fecha As DateTime
Public Property LimiteCredito As Double
Public Property ConvenioPagoElectronico As String
+ Public Property ConvenioPagoElectronicoNomina As String
Public Property UsaLayout As Boolean
Public Property UsaLayoutGrupos As Boolean
@@ -138,6 +139,7 @@ Public Class ClsBancos
Public Property NumeroSucursal As String
#End Region
+ Public Property SecuenciaLayout As Integer = 0
#Region " P R O P I E D A D E S - C O M P L E M E N T O P A G O"
Public Property ComplementoSerieFolio As String
@@ -420,6 +422,7 @@ Public Class ClsBancos
Me.Usuario = Data.Rows(0)("Usuario").ToString
Me.LimiteCredito = Data.Rows(0)("LimiteCredito").ToString.ToDouble
Me.ConvenioPagoElectronico = Data.Rows(0)("ConvenioPagoElectronico").ToString
+ Me.ConvenioPagoElectronicoNomina = Data.Rows(0)("ConvenioPagoElectronicoNomina").ToString
Me.UsaLayout = If(Data.Rows(0)("UsaLayout").ToString = "True", True, False)
Me.UsaLayoutGrupos = If(Data.Rows(0)("UsaLayoutGrupos").ToString = "True", True, False)
Me.UsaTarjeta = If(Data.Rows(0)("UsaTarjeta").ToString = "True", True, False)
@@ -461,7 +464,7 @@ Public Class ClsBancos
Public Function AddBancosCuentas(CveBanco As Integer, CveTipoCuenta As Integer, NumCuenta As String, CLABE As String, CveMoneda As Integer, DiaCorte As Integer, FInicial As Integer, FActual As Integer, FFinal As Integer,
LimiteCredito As Double, FormatoCheque As String, CveUsuario As Integer, CveEmpresa As Integer, ConvenioPagoElectronico As String,
UsaLayout As Boolean, UsaTarjeta As Boolean, Optional SaldoInicial As Double = 0, Optional UsaLayoutGrupos As Boolean = False, Optional TieneTerminal As Boolean = False,
- Optional CveCuentaPadre As Integer = Nothing, Optional CveSubProyecto As Integer = -1, Optional NumeroSucursal As String = "-1") As Boolean
+ Optional CveCuentaPadre As Integer = Nothing, Optional CveSubProyecto As Integer = -1, Optional NumeroSucursal As String = "-1", Optional ConvenioPagoElectronicoNomina As String = "") As Boolean
Dim Retorno As Boolean = False
DataAdapter("PA_Banc_BancosCuentasAdd")
@@ -482,6 +485,7 @@ Public Class ClsBancos
.Add("@CveEmpresa", SqlDbType.Int).Value = CveEmpresa
.Add("@CveCuenta", SqlDbType.Int).Direction = ParameterDirection.Output
.Add("@ConvenioPagoElectronico", SqlDbType.VarChar).Value = ConvenioPagoElectronico
+ .Add("@ConvenioPagoElectronicoNomina", SqlDbType.VarChar).Value = ConvenioPagoElectronicoNomina
.Add("@UsaLayout", SqlDbType.Bit).Value = UsaLayout
.Add("@UsaTarjeta", SqlDbType.Bit).Value = UsaTarjeta
.Add("@SaldoInicial", SqlDbType.Money).Value = SaldoInicial
@@ -513,7 +517,7 @@ Public Class ClsBancos
Public Function UpdateBancosCuentas(CveBanco As Integer, CveTipoCuenta As Integer, NumCuenta As String, CLABE As String, CveMoneda As Integer, DiaCorte As Integer, FInicial As Integer, FActual As Integer, FFinal As Integer,
LimiteCredito As Double, FormatoCheque As String, Estatus As Boolean, CveCuenta As Integer, ConvenioPagoElectronico As String,
UsaLayout As Boolean, UsaTarjeta As Boolean, Optional UsaLayoutGrupos As Boolean = False, Optional TieneTerminal As Boolean = False,
- Optional CveCuentaPadre As Integer = Nothing, Optional CveSubProyecto As Integer = -1, Optional NumeroSucursal As String = "-1") As Boolean
+ Optional CveCuentaPadre As Integer = Nothing, Optional CveSubProyecto As Integer = -1, Optional NumeroSucursal As String = "-1", Optional ConvenioPagoElectronicoNomina As String = "-1") As Boolean
Dim Retorno As Boolean = False
DataAdapter("PA_Banc_BancosCuentasUpdate")
@@ -533,6 +537,7 @@ Public Class ClsBancos
.Add("@Estatus", SqlDbType.Bit).Value = Estatus
.Add("@CveCuenta", SqlDbType.Int).Value = CveCuenta
.Add("@ConvenioPagoElectronico", SqlDbType.VarChar).Value = ConvenioPagoElectronico
+ .Add("@ConvenioPagoElectronicoNomina", SqlDbType.VarChar).Value = ConvenioPagoElectronicoNomina
.Add("@UsaLayout", SqlDbType.Bit).Value = UsaLayout
.Add("@UsaTarjeta", SqlDbType.Bit).Value = UsaTarjeta
.Add("@UsaLayoutGrupos", SqlDbType.Bit).Value = UsaLayoutGrupos
@@ -3110,9 +3115,9 @@ Public Class ClsBancos
Return Retorno
End Function
- Public Function AddLayoutEnvios(Archivo As String, Fecha As Date, CveCuenta As Integer, Optional PorGrupos As Boolean = False) As Integer
+ Public Function AddLayoutEnvios(Archivo As String, Fecha As Date, CveCuenta As Integer, Optional PorGrupos As Boolean = False, Optional GenSecuencia As Boolean = False, Optional AltaCuenta As Boolean = False) As Integer
Dim Retorno As Integer = -1
-
+ SecuenciaLayout = 0
DataAdapter("PA_Banc_LayoutEnviosAdd")
With SqlAdapter.SelectCommand.Parameters
@@ -3121,11 +3126,17 @@ Public Class ClsBancos
.Add("@CveCuenta", SqlDbType.Int).Value = CveCuenta
.Add("@PorGrupos", SqlDbType.Bit).Value = PorGrupos
.Add("@CveLayoutEnvio", SqlDbType.Int).Direction = ParameterDirection.Output
+
+ .Add("@GenSecuencia", SqlDbType.Bit).Value = GenSecuencia
+ .Add("@AltaCuenta", SqlDbType.Bit).Value = AltaCuenta
+ .Add("@Secuencia", SqlDbType.Int).Direction = ParameterDirection.Output
+
End With
Try
SqlAdapter.Fill(Data)
Retorno = SqlAdapter.SelectCommand.Parameters("@CveLayoutEnvio").Value.ToString.ToEntero
+ SecuenciaLayout = SqlAdapter.SelectCommand.Parameters("@Secuencia").Value.ToString.ToEntero
Catch ex As Exception
OnError("Ocurrió un error al agregar el LayoutEnvio", ex, SqlAdapter.SelectCommand.Parameters.ParametrosInfo())
End Try
diff --git a/App_Code/ClsExportaciones.vb b/App_Code/ClsExportaciones.vb
index ea59fddc9..9f5563032 100644
--- a/App_Code/ClsExportaciones.vb
+++ b/App_Code/ClsExportaciones.vb
@@ -35,6 +35,7 @@ Public Class ClsExportaciones
Public Property CveExportacion As Integer
Public Property CveExportacionDetalle As Integer
+ Public Property CveExportacionDescarga As Integer
#End Region
@@ -351,13 +352,14 @@ Public Class ClsExportaciones
Return Retorno
End Function
- Public Function AddPartida(CvePS As Integer, CveUnidadMedida As Integer, Precio As Decimal, CveEmpresa As Integer, CveUsuario As Integer, CveExportacion As Integer, Cantidad As Decimal,
+ Public Function AddPartida(CvePS As Integer, CveUnidadMedida As Integer, CveTipoEmpaque As Integer, Precio As Decimal, CveEmpresa As Integer, CveUsuario As Integer, CveExportacion As Integer, Cantidad As Decimal,
PesoUnitario As Decimal, CvePais As Integer) As Boolean
Dim Retorno As Boolean = False
DataAdapter("PA_Exp_ExportacionesDetalleAdd")
With SqlAdapter.SelectCommand.Parameters
.Add("@CvePS", SqlDbType.Int).Value = CvePS
.Add("@CveUnidadMedida", SqlDbType.Int).Value = CveUnidadMedida
+ .Add("@CveTipoEmpaque", SqlDbType.Int).Value = CveTipoEmpaque
.Add("@Precio", SqlDbType.Decimal).Value = Precio
.Add("@CveEmpresa", SqlDbType.Int).Value = CveEmpresa
.Add("@CveUsuario", SqlDbType.Int).Value = CveUsuario
@@ -378,7 +380,7 @@ Public Class ClsExportaciones
Return Retorno
End Function
- Public Function UpdatePartida(CveExportacionDetalle As Integer, CvePS As Integer, CveUnidadMedida As Integer, Precio As Decimal, CveUsuario As Integer, Cantidad As Decimal,
+ Public Function UpdatePartida(CveExportacionDetalle As Integer, CvePS As Integer, CveUnidadMedida As Integer, CveTipoEmpaque As Integer, Precio As Decimal, CveUsuario As Integer, Cantidad As Decimal,
PesoUnitario As Decimal, CvePais As Integer) As Boolean
Dim Retorno As Boolean = False
DataAdapter("PA_Exp_ExportacionesDetalleUpdate")
@@ -386,6 +388,7 @@ Public Class ClsExportaciones
.Add("@CveExportacionDetalle", SqlDbType.Int).Value = CveExportacionDetalle
.Add("@CvePS", SqlDbType.Int).Value = CvePS
.Add("@CveUnidadMedida", SqlDbType.Int).Value = CveUnidadMedida
+ .Add("@CveTipoEmpaque", SqlDbType.Int).Value = CveTipoEmpaque
.Add("@Precio", SqlDbType.Decimal).Value = Precio
.Add("@CveUsuario", SqlDbType.Int).Value = CveUsuario
.Add("@Cantidad", SqlDbType.Decimal).Value = Cantidad
@@ -417,6 +420,81 @@ Public Class ClsExportaciones
End Function
#End Region
+#Region "DESCARGAS"
+ Public Function GetDescargas(CveEmpresa As Integer, Optional CveExportacion As Integer = -1, Optional CveExportacionDescarga As Integer = -1, Optional CveExportacionDetalle As Integer = -1, Optional CveImportacionDetalle As Integer = -1) As Boolean
+ Dim Retorno As Boolean = False
+ DataAdapter("PA_Exp_ExportacionesDescargaGet")
+ With SqlAdapter.SelectCommand.Parameters
+ .Add("@CveEmpresa", SqlDbType.Int).Value = CveEmpresa
+ .Add("@CveExportacion", SqlDbType.Int).Value = CveExportacion
+ .Add("@CveExportacionDescarga", SqlDbType.Int).Value = CveExportacionDescarga
+ .Add("@CveExportacionDetalle", SqlDbType.Int).Value = CveExportacionDetalle
+ .Add("@CveImportacionDetalle", SqlDbType.Int).Value = CveImportacionDetalle
+ End With
+ Try
+ SqlAdapter.Fill(Data)
+ Retorno = True
+ Catch ex As Exception
+ OnError("Ocurrió un error al obtener las Descargas.", ex, SqlAdapter.SelectCommand.Parameters.ParametrosInfo())
+ End Try
+ Return Retorno
+ End Function
+
+ Public Function AddDescarga(CveExportacionDetalle As Integer, CveImportacionDetalle As Integer, Cantidad As Decimal, CveEmpresa As Integer) As Boolean
+ Dim Retorno As Boolean = False
+ DataAdapter("PA_Exp_ExportacionesDescargaAdd")
+ With SqlAdapter.SelectCommand.Parameters
+ .Add("@CveExportacionDetalle", SqlDbType.Int).Value = CveExportacionDetalle
+ .Add("@CveImportacionDetalle", SqlDbType.Int).Value = CveImportacionDetalle
+ .Add("@Cantidad", SqlDbType.Decimal).Value = Cantidad
+ .Add("@CveEmpresa", SqlDbType.Int).Value = CveEmpresa
+
+ .Add("@CveExportacionDescarga", SqlDbType.Int).Direction = ParameterDirection.Output
+ End With
+ Try
+ SqlAdapter.Fill(Data)
+ CveExportacionDescarga = SqlAdapter.SelectCommand.Parameters("@CveExportacionDescarga").Value.ToString.ToEntero
+ Retorno = True
+ Catch ex As Exception
+ OnError("Ocurrió un error al guardar la Descarga.", ex, SqlAdapter.SelectCommand.Parameters.ParametrosInfo())
+ End Try
+ Return Retorno
+ End Function
+
+ Public Function UpdateDescarga(CveExportacionDescarga As Integer, CveExportacionDetalle As Integer, CveImportacionDetalle As Integer, Cantidad As Decimal) As Boolean
+ Dim Retorno As Boolean = False
+ DataAdapter("PA_Exp_ExportacionesDescargaUpdate")
+ With SqlAdapter.SelectCommand.Parameters
+ .Add("@CveExportacionDescarga", SqlDbType.Int).Value = CveExportacionDescarga
+ .Add("@CveExportacionDetalle", SqlDbType.Int).Value = CveExportacionDetalle
+ .Add("@CveImportacionDetalle", SqlDbType.Int).Value = CveImportacionDetalle
+ .Add("@Cantidad", SqlDbType.Decimal).Value = Cantidad
+ End With
+ Try
+ SqlAdapter.Fill(Data)
+ Retorno = True
+ Catch ex As Exception
+ OnError("Ocurrió un error al actualizar la Descarga.", ex, SqlAdapter.SelectCommand.Parameters.ParametrosInfo())
+ End Try
+ Return Retorno
+ End Function
+
+ Public Function RemoveDescarga(CveExportacionDescarga As Integer) As Boolean
+ Dim Retorno As Boolean = False
+ DataAdapter("PA_Exp_ExportacionesDescargaRemove")
+ With SqlAdapter.SelectCommand.Parameters
+ .Add("@CveExportacionDescarga", SqlDbType.Int).Value = CveExportacionDescarga
+ End With
+ Try
+ SqlAdapter.Fill(Data)
+ Retorno = True
+ Catch ex As Exception
+ OnError("Ocurrió un error al eliminar la Descarga.", ex, SqlAdapter.SelectCommand.Parameters.ParametrosInfo)
+ End Try
+ Return Retorno
+ End Function
+#End Region
+
#Region "AGENTES"
Public Function GetAgentes(Optional CveAgente As Integer = -1, Optional CveEmpresa As Integer = -1) As Boolean
Dim Retorno As Boolean = False
diff --git a/App_Code/ClsGenerales.vb b/App_Code/ClsGenerales.vb
index 9df264da9..ba614ae20 100644
--- a/App_Code/ClsGenerales.vb
+++ b/App_Code/ClsGenerales.vb
@@ -4018,7 +4018,7 @@ Public Class ClsGenerales
End Try
Return Retorno
End Function
- Public Function CancelarTimbreTimbrado(CveTimbre As Integer, FechaCancelacion As DateTime, CvePACCancelacion As Integer, SelloCancelacion As String, CveUsuario As Integer, CveEmpresa As Integer) As Boolean
+ Public Function CancelarTimbreTimbrado(CveTimbre As Integer, FechaCancelacion As DateTime, CvePACCancelacion As Integer, SelloCancelacion As String, CveUsuario As Integer, CveEmpresa As Integer, Optional RegenerarTimbre As Boolean = False) As Boolean
Dim Retorno As Boolean = False
DataAdapter("PA_Gral_TimbreTimbradoCancelar")
@@ -4030,6 +4030,27 @@ Public Class ClsGenerales
.Add("@SelloCancelacion", SqlDbType.VarChar).Value = SelloCancelacion
.Add("@CveUsuario", SqlDbType.Int).Value = CveUsuario
.Add("@CveEmpresa", SqlDbType.Int).Value = CveEmpresa
+ .Add("@RegenerarTimbre", SqlDbType.Bit).Value = RegenerarTimbre
+ End With
+
+ Try
+ SqlAdapter.Fill(Data)
+ Retorno = True
+ Catch ex As Exception
+ OnError("Ocurrió un error al actualizar el timbrado", ex, SqlAdapter.SelectCommand.Parameters.ParametrosInfo)
+ End Try
+ Return Retorno
+ End Function
+
+ Public Function ReactivarTimbreEntregaAlmacen(CveTimbre As Integer, CveEntregaAlmacen As Integer, CveUsuario As Integer, CveEmpresa As Integer) As Boolean
+ Dim Retorno As Boolean = False
+ DataAdapter("PA_Gral_TimbreReactivarUpdate")
+
+ With SqlAdapter.SelectCommand.Parameters
+ .Add("@CveTimbre", SqlDbType.Int).Value = CveTimbre
+ .Add("@CveEntregaAlmacen", SqlDbType.Int).Value = CveEntregaAlmacen
+ .Add("@CveUsuario", SqlDbType.Int).Value = CveUsuario
+ .Add("@CveEmpresa", SqlDbType.Int).Value = CveEmpresa
End With
Try
@@ -4040,6 +4061,7 @@ Public Class ClsGenerales
End Try
Return Retorno
End Function
+
Public Function RemoveGralTimbre(CveTimbre As Integer, CveEmpresa As Integer) As Boolean
Dim Retorno As Boolean = False
DataAdapter("PA_Gral_TimbreRemove")
diff --git a/App_Code/ClsNominas.vb b/App_Code/ClsNominas.vb
index 8613d0d3c..f7cd0e891 100644
--- a/App_Code/ClsNominas.vb
+++ b/App_Code/ClsNominas.vb
@@ -2858,7 +2858,7 @@ Public Class ClsNominas
End Try
Return retorno
End Function
- Public Function GetchecadorAsistencia(FechaInicio As DateTime, FechaFin As DateTime, CveEmpresa As Integer) As Boolean
+ Public Function GetchecadorAsistencia(FechaInicio As DateTime, FechaFin As DateTime, CveSubProyecto As Integer, CveEmpresa As Integer) As Boolean
Dim retorno As Boolean = False
Try
@@ -2867,6 +2867,7 @@ Public Class ClsNominas
With SqlAdapter.SelectCommand.Parameters
.Add("@FechaInicio", SqlDbType.DateTime).Value = FechaInicio
.Add("@FechaFin", SqlDbType.DateTime).Value = FechaFin
+ .Add("@CveSubProyecto", SqlDbType.Int).Value = CveSubProyecto
.Add("@CveEmpresa", SqlDbType.Int).Value = CveEmpresa
End With
SqlAdapter.Fill(DTSet)
diff --git a/App_Code/ClsPagoScotia.vb b/App_Code/ClsPagoScotia.vb
new file mode 100644
index 000000000..e67737b7f
--- /dev/null
+++ b/App_Code/ClsPagoScotia.vb
@@ -0,0 +1,886 @@
+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, Secuencia As Integer, Optional EsNomina As Boolean = False) 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 EsNomina Then
+ NumeroConvenio = DTPendientes.Rows(0)("ConvenioPagoElectronicoNomina").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
+
+ 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, CERO)) ' 5‑9 Nº Convenio
+ ha.Append(Secuencia.ToString.PadLeft(2, CERO)) ' 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.
")
+ 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.
")
+ 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:=False)
+
+ ' 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
+
+ 'Dim objBanco As New ClsBancos
+
+
+ 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
+
+ If DtPendientesTemp.Columns.Contains("Nombre") Then
+
+ DtPendientesTemp = DtPendientesTemp.FiltraParametros("", "",
+ {"CLABEDestino", "CLABE", "CveBanco", "CveCuentaDeposito", "EstatusCtaDeposito", "EstatusPagoElectronicoScotia", "BancoNombre", "FechaEliminacion", "ConvenioPagoElectronico", "Nombre"}
+ )
+ Else
+
+ DtPendientesTemp = DtPendientesTemp.FiltraParametros("", "",
+ {"CLABEDestino", "CLABE", "CveBanco", "CveCuentaDeposito", "EstatusCtaDeposito", "EstatusPagoElectronicoScotia", "BancoNombre", "FechaEliminacion", "ConvenioPagoElectronico"}
+ )
+ End If
+
+
+ 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(Secuencia.ToString().PadLeft(3, Cero)) '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
+
+ If DtPendientesTemp.Columns.Contains("Nombre") Then
+ SBErrores.Append($"Empleado {dr("Nombre").ToString} Cuenta *{CuentaDestino}* debe tener 11 o 18 dígitos.
")
+ Else
+ SBErrores.Append($"Linea {Contador} Cuenta *{CuentaDestino}* debe tener 11 o 18 dígitos.
")
+ End If
+
+ 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.
")
+ 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)
+
+
+ sb.AppendLine(registro.ToString)
+ If registro.Length = LARGO_REGISTRO AndAlso Not esError Then
+ 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},
")
+ 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.
")
+ 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:
" & 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)
+
+ 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
diff --git a/App_Code/ClsVentas.vb b/App_Code/ClsVentas.vb
index 8ed054aa6..10aa93a53 100644
--- a/App_Code/ClsVentas.vb
+++ b/App_Code/ClsVentas.vb
@@ -1570,6 +1570,25 @@ Public Class ClsVentas
Return Retorno
End Function
+
+ Public Function GetVentaDetallePreciosLista(CveVenta As Integer, CveEmpresa As Integer) As Boolean
+ Dim Retorno As Boolean = False
+ DataAdapter("PA_Vta_VentasDetallePreciosListaGet")
+
+ With SqlAdapter.SelectCommand.Parameters
+ .Add("@CveVenta", SqlDbType.Int).Value = CveVenta
+ .Add("@CveEmpresa", SqlDbType.Int).Value = CveEmpresa
+ End With
+
+ Try
+ SqlAdapter.Fill(Data)
+ Retorno = True
+ Catch ex As Exception
+ OnError("Ocurrió un error al obtener los precios de lista en los productos.", ex, SqlAdapter.SelectCommand.Parameters.ParametrosInfo)
+ End Try
+
+ Return Retorno
+ End Function
Public Function AddVentaDetalle(CveVenta As Integer, CvePS As Integer, Cantidad As Decimal, CveUnidadMedida As Integer, PU As Decimal, IVA As Decimal,
Total As Decimal, Observaciones As String, Descuento As Decimal, TipoDescuento As Integer, CveSubProyecto As Integer,
CvePresupuestoIngreso As Integer, Optional TiempoEntrega As String = "", Optional CveVentaDetallePadre As Integer = -1,
@@ -7393,7 +7412,7 @@ Public Class ClsVentas
End Function
- Public Function GetComisionesMedicasRep(FechaInicio As Date, FechaFin As Date, CveEmpresa As Integer, CveSubProyecto As Integer, CveProcedimiento As Integer, CveMedico As Integer, CveVendedor As Integer, CveUsuarioAtendio As Integer, CveUsuarioConsulta As Integer, CveTipoVenta As Integer, CveMarca As Integer, FechaInicioPago As Date, FechaFinPago As Date) As Boolean
+ Public Function GetComisionesMedicasRep(FechaInicio As Date, FechaFin As Date, CveEmpresa As Integer, CveSubProyecto As Integer, CveProcedimiento As Integer, CveMedico As Integer, CveVendedor As Integer, CveGerenteVendedor As Integer, CveUsuarioAtendio As Integer, CveUsuarioConsulta As Integer, CveTipoVenta As Integer, CveMarca As Integer, FechaInicioPago As Date, FechaFinPago As Date) As Boolean
Dim Retorno As Boolean = False
DataAdapter("PA_Vta_ComisionesMedicasRepGet")
@@ -7406,6 +7425,7 @@ Public Class ClsVentas
.Add("@CveMedico", SqlDbType.Int).Value = CveMedico
.Add("@CveProcedimiento", SqlDbType.Int).Value = CveProcedimiento
.Add("@CveVendedor", SqlDbType.Int).Value = CveVendedor
+ .Add("@CveGerenteVendedor", SqlDbType.Int).Value = CveGerenteVendedor
.Add("@CveMarca", SqlDbType.Int).Value = CveMarca
.Add("@CveUsuarioAtendio", SqlDbType.Int).Value = CveUsuarioAtendio
.Add("@CveTipoVenta", SqlDbType.Int).Value = CveTipoVenta
@@ -7733,7 +7753,7 @@ Public Class ClsVentas
End Function
- Public Function GetSMSIndicadores(Opcion As Integer, FechaInicio As Date, FechaFin As Date, CveUsuario As Integer, CveVendedor As Integer, CveUsuarioTecnico As Integer, CveEmpresa As Integer) As Boolean
+ Public Function GetSMSIndicadores(Opcion As Integer, FechaInicio As Date, FechaFin As Date, CveUsuario As Integer, CveVendedor As Integer, CveGerenteVendedor As Integer, CveUsuarioTecnico As Integer, CveEmpresa As Integer) As Boolean
Dim Retorno As Boolean = False
DataAdapter("PA_SMS_IndicadoresGet")
With SqlAdapter.SelectCommand.Parameters
@@ -7742,6 +7762,7 @@ Public Class ClsVentas
.Add("@FechaFin", SqlDbType.Date).Value = FechaFin
.Add("@CveUsuario", SqlDbType.Int).Value = CveUsuario
.Add("@CveVendedor", SqlDbType.Int).Value = CveVendedor
+ .Add("@CveGerenteVendedor", SqlDbType.Int).Value = CveGerenteVendedor
.Add("@CveUsuarioTecnico", SqlDbType.Int).Value = CveUsuarioTecnico
.Add("@CveEmpresa", SqlDbType.Int).Value = CveEmpresa
End With
diff --git a/App_Code/Timbrado.vb b/App_Code/Timbrado.vb
index e5770fa7b..944995939 100644
--- a/App_Code/Timbrado.vb
+++ b/App_Code/Timbrado.vb
@@ -2734,7 +2734,7 @@ concep.DescripcionesEspecificas.NumeroSerie)
#Region "C O M P L E M E N T O D E N O M I N A"
If ObjCFDITimbre.Comprobante.TipoComprobante = "N" Then
-
+ cfdi.TieneSubsidio = True ' bandera par activar que se vaya la opción de totalotrosingresos si es igual a cero
'cfdi.Esquema.AgregarEsquema("http://www.sat.gob.mx/nomina12 http://www.sat.gob.mx/sitio_internet/cfd/nomina/nomina12.xsd")
cfdi.Nomina12(ObjCFDITimbre.Nomina.TipoNomina, ObjCFDITimbre.Nomina.FechaPago.ToString("yyyy-MM-dd"), ObjCFDITimbre.Nomina.FechaInicio.ToDate().ToString("yyyy-MM-dd"), ObjCFDITimbre.Nomina.FechaFin.ToDate().ToString("yyyy-MM-dd"), ObjCFDITimbre.Nomina.NumDiasPagados, If(ObjCFDITimbre.Nomina.Percepciones IsNot Nothing AndAlso ObjCFDITimbre.Nomina.Percepciones.Count > 0, ObjCFDITimbre.Nomina.TotalPercepciones, 0), If(ObjCFDITimbre.Nomina.Deducciones IsNot Nothing AndAlso ObjCFDITimbre.Nomina.Deducciones.Count > 0, ObjCFDITimbre.Nomina.TotalDeducciones, 0), If(ObjCFDITimbre.Nomina.OtrosPagos IsNot Nothing AndAlso ObjCFDITimbre.Nomina.OtrosPagos.Count > 0, ObjCFDITimbre.Nomina.TotalOtrosPagos, 0))
@@ -2742,7 +2742,6 @@ concep.DescripcionesEspecificas.NumeroSerie)
If UsuarioActual.Empresa.UsaAC Then cfdi.Nomina12EntidadSNCF("IF", 90)
-
#Region "Receptor"
cfdi.Nomina12Receptor(ObjCFDITimbre.Nomina.Receptor.CURP,
diff --git a/Ashx/E140.ashx b/Ashx/E140.ashx
index 6926a6820..b19a3dbd7 100644
--- a/Ashx/E140.ashx
+++ b/Ashx/E140.ashx
@@ -60,7 +60,7 @@ Public Class E140 : Implements IHttpHandler, IRequiresSessionState
context.Response.ContentType = "application/json"
Dim Auth As AuthMessage = ValidarSolicitud(context)
- If Auth.IsSucces Then
+ If Auth.IsSuccess Then
retorno = ConsultaRemisiones(context, "")
Else
context.Response.StatusCode = Auth.StatusCode
@@ -71,13 +71,24 @@ Public Class E140 : Implements IHttpHandler, IRequiresSessionState
context.Response.ContentType = "application/json"
Dim Auth As AuthMessage = ValidarSolicitud(context)
- If Auth.IsSucces Then
+ If Auth.IsSuccess Then
retorno = RegistraPagoRemision(context, "")
Else
context.Response.StatusCode = Auth.StatusCode
retorno = JsonConvert.SerializeObject(Auth.ErrorMessage)
End If
context.Response.Write(retorno)
+ ElseIf Metodo = "ConsultaRemision" Then
+ context.Response.ContentType = "application/json"
+ Dim Auth As AuthMessage = ValidarSolicitud(context)
+
+ If Auth.IsSuccess AndAlso context.Request("CveVenta").ToEntero > 0 Then
+ retorno = ConsultaRemision(context, context.Request("CveVenta").ToEntero)
+ Else
+ context.Response.StatusCode = Auth.StatusCode
+ retorno = JsonConvert.SerializeObject(Auth.ErrorMessage)
+ End If
+ context.Response.Write(retorno)
End If
Catch ex As Exception
ex.GuardaLog(ex.Message)
@@ -100,7 +111,7 @@ Public Class E140 : Implements IHttpHandler, IRequiresSessionState
Else
respuesta.ErrorMessage = New AppsResponseError() With {.message = "el usuario y/o contraseña son requeridos"}
- respuesta.IsSucces = False
+ respuesta.IsSuccess = False
respuesta.StatusCode = 200
Return respuesta
@@ -108,13 +119,13 @@ Public Class E140 : Implements IHttpHandler, IRequiresSessionState
If unauthorized Then
respuesta.ErrorMessage = New AppsResponseError() With {.message = "el usuario y/o contraseña no son validos"}
- respuesta.IsSucces = False
+ respuesta.IsSuccess = False
respuesta.StatusCode = 200
Return respuesta
Else
respuesta.ErrorMessage = Nothing
- respuesta.IsSucces = True
+ respuesta.IsSuccess = True
respuesta.StatusCode = 200
Return respuesta
@@ -172,6 +183,56 @@ Public Class E140 : Implements IHttpHandler, IRequiresSessionState
End If
End Function
+ Private Function ConsultaRemision(ByVal context As HttpContext, CveVenta As Integer) As String
+ Dim Respuesta As New AppsResponse
+ Dim RespuestaError As New AppsResponseError
+ Dim TieneError As Boolean = False
+ Dim CveSubProyecto As String = "11790"
+
+ Dim Usuario As Usuario = ValidaUsuarioSistema(100, CveEmpresa)
+ Dim data As New JArray
+ Dim dtt As New DataTable
+ Dim ObjVentas As New ClsVentas
+
+ If ObjVentas.GetVenta(CveVenta, CveEmpresa) Then
+ dtt = ObjVentas.DtResultados
+ End If
+ ObjVentas.Dispose()
+
+ If dtt IsNot Nothing Then
+ Try
+ For Each Row As DataRow In dtt.Rows
+ Dim objVenta As New JObject(
+ New JProperty("cveventa", Row("CveVenta")),
+ New JProperty("folio", Row("Folio")),
+ New JProperty("cliente", Row("ClienteNombre")),
+ New JProperty("fecha", Row("Fecha")),
+ New JProperty("total", Row("Total")),
+ New JProperty("moneda", Row("Moneda")),
+ New JProperty("saldo", Row("Saldo"))
+ )
+ data.Add(objVenta)
+ Next
+ Catch ex As Exception
+ TieneError = True
+ RespuestaError.message = "Ocurrió un error al obtener las remisiones pendientes."
+ End Try
+ dtt.Dispose()
+ Else
+ TieneError = True
+ End If
+
+ Respuesta.data = data
+
+ If TieneError Then
+ context.Response.StatusCode = 200
+ Return JsonConvert.SerializeObject(RespuestaError)
+ Else
+ context.Response.StatusCode = 200
+ Return JsonConvert.SerializeObject(Respuesta)
+ End If
+ End Function
+
Private Function RegistraPagoRemision(ByVal context As HttpContext, CveVenta As String) As String
Dim Respuesta As New AppsResponse
Dim RespuestaError As New AppsResponseError
@@ -632,7 +693,7 @@ Public Class E140 : Implements IHttpHandler, IRequiresSessionState
End Class
Private Class AuthMessage
- Public Property IsSucces As Boolean
+ Public Property IsSuccess As Boolean
Public Property ErrorMessage As AppsResponseError
Public Property StatusCode As Integer
End Class
diff --git a/Ashx/E189.ashx b/Ashx/E189.ashx
index 201b808b0..013be2e57 100644
--- a/Ashx/E189.ashx
+++ b/Ashx/E189.ashx
@@ -99,14 +99,17 @@ Public Class E189 : Implements IHttpHandler, System.Web.SessionState.IRequiresSe
Private Function ConsultaDatos(ByVal context As HttpContext) As String
+
+ Dim Usuario As Usuario = ValidaUsuarioSistema(100, CveEmpresa)
+
Dim Respuesta As New ResponseMsg
Dim RespuestaError As New ResponseMsgError
Dim TieneError As Boolean = False
Dim productos As JArray = Nothing
- Using ObjInventario As New ClsProductosServicios
- If ObjInventario.GetPS_APIMarcasStock(189) AndAlso ObjInventario.DtResultados IsNot Nothing Then
+ Using ObjInventario As New ClsProductosServicios()
+ If ObjInventario.GetPS_APIMarcasStock(CveEmpresa) AndAlso ObjInventario.DtResultados IsNot Nothing Then
productos = JArray.Parse(ObjInventario.DtResultados.DataTableToJSONIPP())
Else
RespuestaError.message = "no se pudo obtener los datos"
diff --git a/Bancos/ConciliacionesBancarias.aspx.vb b/Bancos/ConciliacionesBancarias.aspx.vb
index d7655d6e1..184740034 100644
--- a/Bancos/ConciliacionesBancarias.aspx.vb
+++ b/Bancos/ConciliacionesBancarias.aspx.vb
@@ -6,6 +6,7 @@ Imports Extensiones
Imports System.Xml
Imports Microsoft.Reporting.WebForms
Imports System.Globalization
+Imports Telerik.Web.UI
Partial Class Bancos_ConciliacionesBancariasaspx
Inherits ClsPaginas
@@ -182,7 +183,7 @@ Partial Class Bancos_ConciliacionesBancariasaspx
If Not CBool(Dr("FueConciliado").ToString) And Dr("CveIE").ToString.ToEntero > 0 Then
For Each DrE As DataRow In DtDatosEdoCuenta.Rows
If ((Dr("FechaDocumento").ToString.ToDate = DrE("FechaDocumento").ToString.ToDate And Dr("Importe").ToString.ToDouble = DrE("Importe").ToString.ToDouble And Dr("Tipo").ToString = DrE("Tipo").ToString And DdlCriterio.SelectedValue.ToEntero = 1) Or (Dr("Importe").ToString.ToDouble = DrE("Importe").ToString.ToDouble And Dr("Tipo").ToString = DrE("Tipo").ToString And DdlCriterio.SelectedValue.ToEntero = 2)) And Not CBool(DrE("Seleccionado").ToString) And Not CBool(DrE("FueConciliado").ToString) And Not CBool(Dr("Seleccionado").ToString) Then
- Dim FechaConciliado As Date = TxtFechaAplicado.Text.ToDate 'If(Dr("FechaDocumento").ToString.ToDate < txtFechaI.Text.ToDate, TxtFechaAplicado.Text.ToDate, Dr("FechaDocumento").ToString.ToDate)
+ Dim FechaConciliado As Date = If(Dr("FechaDocumento").ToString.ToDate < txtFechaI.Text.ToDate, TxtFechaAplicado.Text.ToDate, Dr("FechaDocumento").ToString.ToDate)
If Not ObjBancos.UpdateConciliacionBancaria(Dr("CveIE").ToString.ToEntero, FechaConciliado, -1, 1, 1, UsuarioActual.CveUsuario) Or
Not ObjBancos.UpdateConciliacionBancaria(Dr("CveIE").ToString.ToEntero, FechaConciliado, DrE("CveIEEstadoCuenta").ToString.ToEntero, 1, 2, UsuarioActual.CveUsuario) Then
ErrorTrans = True
@@ -231,15 +232,20 @@ Partial Class Bancos_ConciliacionesBancariasaspx
RegistraScript("$('#DModalCriterio').modal()")
End Sub
Private Sub ConciliacionManual()
+
+ If GvDatos.Rows.Cast(Of GridViewRow).Where(Function(gvr) gvr.FCCheckBox("ChkConciliado").Checked).Count = 0 OrElse GvEdoConciliacion.Rows.Cast(Of GridViewRow).Where(Function(gvr) gvr.FCCheckBox("ChkConciliado").Checked).Count = 0 Then
+ Alert("Debe seleccionar un folio", TipoMensaje.MsgAdvertencia)
+ Exit Sub
+ End If
+
Dim SumaSIGAbono As Double = 0
Dim SumaSIGCargo As Double = 0
Dim SumaExcelAbono As Double = 0
Dim SumaExcelCargo As Double = 0
- Dim Seleccionados As Integer = 0
Dim Fecha As Date
+
For Each Gvr As GridViewRow In GvDatos.Rows
If Gvr.FCCheckBox("ChkConciliado").Checked And Gvr.FCCheckBox("ChkConciliado").Enabled Then
- Seleccionados += 1
Fecha = Gvr.DataKey("FechaDocumento").ToDate
If Gvr.DataKey("Tipo") = "Cargo" Then
If Gvr.DataKey("Importe").ToDouble < 0 Then ' cuando es negativo suma para el abono
@@ -258,13 +264,7 @@ Partial Class Bancos_ConciliacionesBancariasaspx
End If
End If
Next
- If Seleccionados > 1 Then
- Alert("Tiene que tener seleccionado solamente un movimiento.", TipoMensaje.MsgAdvertencia)
- Exit Sub
- ElseIf Not Seleccionados > 0 Then
- Alert("Tiene que tener seleccionado .", TipoMensaje.MsgAdvertencia)
- Exit Sub
- End If
+
For Each Gvr As GridViewRow In GvEdoConciliacion.Rows
If Gvr.FCCheckBox("ChkConciliado").Checked And Gvr.FCCheckBox("ChkConciliado").Enabled Then
If (Gvr.DataKey("FechaDocumento").ToDate = Fecha And DdlCriterio.SelectedValue.ToEntero = 1) Or DdlCriterio.SelectedValue.ToEntero = 2 Then
@@ -279,17 +279,27 @@ Partial Class Bancos_ConciliacionesBancariasaspx
End If
End If
Next
+
If SumaSIGCargo <> SumaExcelCargo OrElse SumaSIGAbono <> SumaExcelAbono Then
Alert($"La suma de los importes no cuadran ({SumaSIGCargo}-{SumaExcelCargo}**{SumaSIGAbono}-{SumaExcelAbono})", TipoMensaje.MsgAdvertencia)
Exit Sub
End If
+
+ Dim CumpleCriterioContable = GvDatos.Rows.Cast(Of GridViewRow).Where(Function(gvr) gvr.FCCheckBox("ChkConciliado").Checked).Count = 1 AndAlso GvEdoConciliacion.Rows.Cast(Of GridViewRow).Where(Function(gvr) gvr.FCCheckBox("ChkConciliado").Checked).Count >= 1
+ Dim CumpleCriterioBancario = GvEdoConciliacion.Rows.Cast(Of GridViewRow).Where(Function(gvr) gvr.FCCheckBox("ChkConciliado").Checked).Count = 1 AndAlso GvDatos.Rows.Cast(Of GridViewRow).Where(Function(gvr) gvr.FCCheckBox("ChkConciliado").Checked).Count >= 1
+
+ If Not (CumpleCriterioContable OrElse CumpleCriterioBancario) Then
+ Alert("Debe seleccionar solo 1 folio del lado contable o bancario", TipoMensaje.MsgAdvertencia)
+ Exit Sub
+ End If
+
Dim ObjBancos As New ClsBancos
Dim ObjOI As New ClsOIEventos(ObjBancos.IniciaTransacSQL())
Dim ErrorTrans As Boolean = False
Dim CveIE As Integer = 0
For Each Gvr As GridViewRow In GvDatos.Rows
If Gvr.FCCheckBox("ChkConciliado").Checked And Gvr.FCCheckBox("ChkConciliado").Enabled Then
- Dim FechaConciliado As Date = TxtFechaAplicado.Text.ToDate 'If(Gvr.DataKey("FechaDocumento").ToString.ToDate < txtFechaI.Text.ToDate, TxtFechaAplicado.Text.ToDate, Gvr.DataKey("FechaDocumento").ToString.ToDate)
+ Dim FechaConciliado As Date = If(Gvr.DataKey("FechaDocumento").ToString.ToDate < txtFechaI.Text.ToDate, TxtFechaAplicado.Text.ToDate, Gvr.DataKey("FechaDocumento").ToString.ToDate)
If Not ObjBancos.UpdateConciliacionBancaria(Gvr.DataKey("CveIE").ToEntero, FechaConciliado, -1, 1, 1, UsuarioActual.CveUsuario) Then
ErrorTrans = True
Else
@@ -303,7 +313,7 @@ Partial Class Bancos_ConciliacionesBancariasaspx
Next
For Each Gvr As GridViewRow In GvEdoConciliacion.Rows
If Gvr.FCCheckBox("ChkConciliado").Checked And Gvr.FCCheckBox("ChkConciliado").Enabled Then
- Dim FechaConciliado As Date = TxtFechaAplicado.Text.ToDate 'If(Gvr.DataKey("FechaDocumento").ToString.ToDate < txtFechaI.Text.ToDate, TxtFechaAplicado.Text.ToDate, Gvr.DataKey("FechaDocumento").ToString.ToDate)
+ Dim FechaConciliado As Date = If(Gvr.DataKey("FechaDocumento").ToString.ToDate < txtFechaI.Text.ToDate, TxtFechaAplicado.Text.ToDate, Gvr.DataKey("FechaDocumento").ToString.ToDate)
If Not ObjBancos.UpdateConciliacionBancaria(CveIE, FechaConciliado, Gvr.DataKey("CveIEEstadoCuenta").ToEntero, 1, 2, UsuarioActual.CveUsuario) Then
'If Not ObjBancos.UpdateIEEstadoCuenta(Gvr.DataKey("CveIEEstadoCuenta").ToEntero, Gvr.DataKey("Importe").ToDouble, True, CveIE, Gvr.DataKey("Referencia").ToString,
' Gvr.DataKey("Tipo").ToString, Gvr.DataKey("FechaDocumento").ToDate, Gvr.DataKey("CveCuenta").ToEntero) Then
diff --git a/Bancos/CuentasBancariasDetalle.aspx b/Bancos/CuentasBancariasDetalle.aspx
index 3dfb2c2d0..15cccd443 100644
--- a/Bancos/CuentasBancariasDetalle.aspx
+++ b/Bancos/CuentasBancariasDetalle.aspx
@@ -113,6 +113,11 @@
|
+
+ | Convenio: |
+
+ |
+
diff --git a/Bancos/CuentasBancariasDetalle.aspx.vb b/Bancos/CuentasBancariasDetalle.aspx.vb
index 83eec7caa..5a50b8c43 100644
--- a/Bancos/CuentasBancariasDetalle.aspx.vb
+++ b/Bancos/CuentasBancariasDetalle.aspx.vb
@@ -138,20 +138,21 @@ Partial Class Bancos_CuentasBancariasDetalle
Using ObjContabilidad As New ClsContabilidad
'UsuarioActual.Empresa.Funcionalidad(208).ToEntero
If ObjContabilidad.GetCuentas(-1, "-1", 1, UsuarioActual.CveEmpresa) Then
- DDlCuentaContable.DataSource = ObjContabilidad.DtResultados
+ dt = ObjContabilidad.DtResultados.Copy()
+
+ DDlCuentaContable.DataSource = dt
DDlCuentaContable.DataBind()
- DDlCuentaContable.Items.Insert(0, New ListItem("Selecione", "-1"))
- DDlCuentaContable.DataTextField = "CtaCodigo"
- DDlCuentaContable.DataValueField = "CveCuenta"
+ DDlCuentaContable.Items.Insert(0, New ListItem("-", "-1"))
+ 'DDlCuentaContable.DataTextField = "CtaCodigo"
+ 'DDlCuentaContable.DataValueField = "CveCuenta"
End If
End Using
- DDlCuentaContable.DataSource = dt
- DDlCuentaContable.DataBind()
- DDlCuentaContable.Items.Insert(0, New ListItem("-", "-1"))
+
DdlCuentaContableComplementaria.DataSource = dt
DdlCuentaContableComplementaria.DataBind()
DdlCuentaContableComplementaria.Items.Insert(0, New ListItem("-", "-1"))
+
If dt IsNot Nothing Then dt.Dispose()
trCuentaContable.Visible = True
trCuentaContableComplementaria.Visible = True
@@ -215,6 +216,7 @@ Partial Class Bancos_CuentasBancariasDetalle
LblFecha.Text = ObjCuentasBancariasDetalle.Fecha.ToShortDateString
LblUsuario.Text = ObjCuentasBancariasDetalle.Usuario
TxtConvenio.Text = ObjCuentasBancariasDetalle.ConvenioPagoElectronico.ToString
+ TxtConvenioNomina.Text = ObjCuentasBancariasDetalle.ConvenioPagoElectronicoNomina
ChkLayout.Checked = ObjCuentasBancariasDetalle.UsaLayout
ChkLayoutGrupos.Checked = ObjCuentasBancariasDetalle.UsaLayoutGrupos
ChkUsaTarjeta.Checked = ObjCuentasBancariasDetalle.UsaTarjeta
@@ -235,7 +237,7 @@ Partial Class Bancos_CuentasBancariasDetalle
TxtNumeroSucursal.Text = ObjCuentasBancariasDetalle.NumeroSucursal
- If UsuarioActual.Empresa.TipoContabilizacion = 1 Then
+ If UsuarioActual.Empresa.TipoContabilidad = 1 Then
DDlCuentaContable.SelectedValueExist(ObjCuentasBancariasDetalle.CveCuentaConta.ToString)
DdlCuentaContableComplementaria.SelectedValueExist(ObjCuentasBancariasDetalle.CveCuentaContaComplementaria.ToString)
Else
@@ -295,7 +297,8 @@ Partial Class Bancos_CuentasBancariasDetalle
TxtCLABE.Text.Trim, DdlMoneda.SelectedValue.ToEntero, 0, TxtFInicial.Text.Trim.ToEntero, 0, 0, TxtLimiteCredito.Text.Trim.ToDouble,
"", UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa, If(ChkLayout.Checked, TxtConvenio.Text, ""), ChkLayout.Checked, ChkUsaTarjeta.Checked, UsaLayoutGrupos:=ChkLayoutGrupos.Checked,
TieneTerminal:=ChkTieneTerminal.Checked,
- CveCuentaPadre:=DdlCuentaPadre.SelectedValue.ToEntero, CveSubProyecto:=DdlSubProyectos.SelectedValue.ToEntero, NumeroSucursal:=TxtNumeroSucursal.Text.Trim) Then
+ CveCuentaPadre:=DdlCuentaPadre.SelectedValue.ToEntero, CveSubProyecto:=DdlSubProyectos.SelectedValue.ToEntero, NumeroSucursal:=TxtNumeroSucursal.Text.Trim,
+ConvenioPagoElectronicoNomina:=TxtConvenioNomina.Text) Then
ViewState("CveCuenta") = ObjCuentasBancariasDetalle.TCveCuenta
Else
ErrorUsuarios = True
@@ -330,7 +333,8 @@ Partial Class Bancos_CuentasBancariasDetalle
If ObjCuentasBancariasDetalle.UpdateBancosCuentas(DdlBanco.SelectedValue.ToEntero, DdlTipoCuenta.SelectedValue.ToEntero, TxtNumCuenta.Text.Trim, TxtCLABE.Text.Trim, DdlMoneda.SelectedValue.ToEntero, 0, TxtFInicial.Text.Trim.ToEntero, 0, 0,
TxtLimiteCredito.Text.Trim.ToDouble, "", ChkEstatus.Checked, CveCuenta, TxtConvenio.Text,
ChkLayout.Checked, ChkUsaTarjeta.Checked, UsaLayoutGrupos:=ChkLayoutGrupos.Checked, TieneTerminal:=ChkTieneTerminal.Checked,
- CveCuentaPadre:=DdlCuentaPadre.SelectedValue.ToEntero, CveSubProyecto:=DdlSubProyectos.SelectedValue.ToEntero, NumeroSucursal:=TxtNumeroSucursal.Text.Trim) Then
+ CveCuentaPadre:=DdlCuentaPadre.SelectedValue.ToEntero, CveSubProyecto:=DdlSubProyectos.SelectedValue.ToEntero, NumeroSucursal:=TxtNumeroSucursal.Text.Trim,
+ ConvenioPagoElectronicoNomina:=TxtConvenioNomina.Text) Then
'CargaDatos()
GlobalDTBancosCuentas(-1, CveEmpresa:=UsuarioActual.CveEmpresa) = Nothing
GlobalDTBancosCuentasGral(UsuarioActual.CveEmpresa) = Nothing
@@ -687,8 +691,10 @@ Partial Class Bancos_CuentasBancariasDetalle
Private Sub InicializaConvenio()
If ChkLayout.Checked Then
TrConvenio.Visible = True
+ TrConvenioNomina.Visible = True
Else
TrConvenio.Visible = False
+ TrConvenioNomina.Visible = False
End If
End Sub
Protected Sub ChkLayout_CheckedChanged(sender As Object, e As EventArgs)
diff --git a/Bancos/FluctuacionCambiaria.aspx.vb b/Bancos/FluctuacionCambiaria.aspx.vb
index b5664eab5..f98cd4fd3 100644
--- a/Bancos/FluctuacionCambiaria.aspx.vb
+++ b/Bancos/FluctuacionCambiaria.aspx.vb
@@ -641,7 +641,7 @@ Partial Class Bancos_FluctuacionCambiaria
End Sub
Private Function AjusteFluctuacion(CvePrePoliza As Integer, TipoFluctuacion As Integer, CveConcepto As Integer, FechaUltimoDaMes As Date, ByRef ObjConta As ClsContabilidad, Optional CveVenta As Integer = -1, Optional CveCliente As Integer = -1, Optional CveCompra As Integer = -1, Optional CveProveedor As Integer = -1) As Boolean
- If Not UsuarioActual.CveEmpresa.Contiene(119, 172, 174) Then Return True
+ If Not UsuarioActual.CveEmpresa.Contiene(119, 172, 174, 189) Then Return True
Dim ErrorRegistrar As Boolean = False
Dim tdt As DataTable = VerificacionFluctuacion(TipoFluctuacion, FechaUltimoDiaMes)
diff --git a/Bancos/PagoElectronico.aspx.vb b/Bancos/PagoElectronico.aspx.vb
index b058e60bb..24e8d132d 100644
--- a/Bancos/PagoElectronico.aspx.vb
+++ b/Bancos/PagoElectronico.aspx.vb
@@ -5,7 +5,10 @@ Imports System
Imports System.Collections
Imports System.Collections.Generic
Imports System.Data
+Imports System.Data.Entity
+Imports System.Data.SqlClient
Imports System.IO
+Imports System.Runtime.ConstrainedExecution
Imports System.Runtime.Remoting
Imports AjaxControlToolkit.AsyncFileUpload.Constants
Imports Extensiones
@@ -513,818 +516,38 @@ Partial Class Bancos_PagoElectronico
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 ------------------
+ Protected Sub LnkDescargaReporte_Click(sender As Object, e As EventArgs)
- '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 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")
- Dim TipoRegistro As String = "DA" ' Por default es D (Alta), cambia a C si es cambio o baja
- '---- TIPO DE REGISTRO ------------------
+ DT_PagosReporte = DT_PagosReporte.FiltraParametros("EstatusPagoElectronicoGrupos = 'True' AND EstatusCtaDeposito > 0").Copy()
- '---- 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)
+ Dim params As New List(Of ReportParameter)
- 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)
+ If Archivo.Exists Then
+ ImprimirPDF(String.Format("{0}Formatos\LayoutPagoProveedor.rdlc", UsuarioActual.Empresa.Ruta), DtPago, params, "LayoutPagoProveedor", RDSName:="DSPagoElectronicoV2")
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
+
+ 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
- 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($" {nombreBen} 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
@@ -1364,62 +587,6 @@ Partial Class Bancos_PagoElectronico
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)
@@ -1490,9 +657,11 @@ Partial Class Bancos_PagoElectronico
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
@@ -1505,15 +674,47 @@ Partial Class Bancos_PagoElectronico
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)
+ Alert("Ocurrió un errorScotia 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)
+
+
+ Dim Secuencia As Integer = DtRegenerar.Rows(0)("Secuencia").ToString.ToEntero
+ Secuencia = If(Secuencia <= 0, 1, Secuencia)
+
+ Dim ErrorScotia As Boolean = False
+ Using objScotia As New ClsPagoScotia
+ If objScotia.GeneraPagoScotiaBank(DtRegenerar, False, CveCuenta, UsuarioActual, Secuencia) Then
+
+ If objScotia.ErrorLayout = False And objScotia.TotalPagos > 0 Then
+
+ DVDescargaPagos.Visible = True
+ DVDescargaCuentas1.Visible = False
+ DVDescargaReporte.Visible = True
+ DT_PagosReporte = DTPendientes.Copy
+ LnkDescarga.Text = objScotia.NombreArchivo
+ RegistraScript("$('#ModalDescarga').modal({ backdrop: 'static', keyboard: false});")
+ UpModalDescarga.Update()
+ Else
+ Alert($"Errores detectados {objScotia.LayouErrorStr.ToString}", TipoMensaje.MsgAdvertencia)
+ ErrorScotia = True
+ End If
+
+ Else
+ Alert("Error al generar el pago de ScotiaBank. Por favor vuelva a intentar.", TipoMensaje.MsgError)
+ ErrorScotia = True
+ End If
+ End Using
+ If Not ErrorScotia Then
+ CargaDatos()
+ End If
+ 'GeneraPagoScotiaBank(DtRegenerar, False)
Else
- Alert("Ocurrió un error al obtener los datos para generar el archivo. Por favor vuelva a intentar.", TipoMensaje.MsgError)
+ Alert("Ocurrió un Error al obtener los datos para generar el archivo. Por favor vuelva a intentar.", TipoMensaje.MsgError)
End If
End If
@@ -1552,8 +753,47 @@ Partial Class Bancos_PagoElectronico
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}#"))
+ Dim ErrorCuentas As Boolean = False
+
+ Dim objBancos As New ClsBancos
+ objBancos.IniciaTransacSQL()
+
+ Dim NombreArchivoAltas = $"altacuentasScotia_{NowADS():ddMMyyyy}_001.txt"
+ Dim CveLayoutEnvio As Integer = objBancos.AddLayoutEnvios(NombreArchivoAltas, ClsPaginas.NowADS(), DdlCuenta.SelectedValue.ToEntero, PorGrupos:=True, GenSecuencia:=True, AltaCuenta:=True)
+ Dim Secuencia As Integer = objBancos.SecuenciaLayout
+
+ If CveLayoutEnvio > 0 AndAlso Secuencia > 0 Then
+ Using objPagoScotia As New ClsPagoScotia
+ If objPagoScotia.AltaCuentasScotia(DTPendientes.FiltraParametros($" EstatusPagoElectronicoScotia = False Or FechaEliminacion < #{fechaHoy}#"), UsuarioActual, Secuencia:=Secuencia) Then
+
+ DVDescargaPagos.Visible = False
+ DVDescargaReporte.Visible = False
+ LblCuentas.Text = "Cuentas Bajio"
+ DVDescargaCuentas1.Visible = True
+ LnkDescargaCuentas1.Text = objPagoScotia.NombreArchivo
+ RegistraScript("$('#ModalDescarga').modal({ backdrop: 'static', keyboard: false});")
+ UpModalDescarga.Update()
+ Else
+ Alert($"Errores detectados {objPagoScotia.LayouErrorStr.ToString}", TipoMensaje.MsgAdvertencia)
+ ErrorCuentas = True
+ End If
+ End Using
+ End If
+
+
+ If Not ErrorCuentas Then
+ objBancos.Commit()
+ Else
+ objBancos.RollBack()
+ Alert("Se presento un error al gennerar el layout.")
+ End If
+
+ objBancos.Dispose()
+
+ 'AltaCuentasScotia(DTPendientes.FiltraParametros($" EstatusPagoElectronicoScotia = False Or FechaEliminacion < #{fechaHoy}#"))
+
End If
End Sub
@@ -1916,10 +1156,86 @@ Partial Class Bancos_PagoElectronico
ElseIf OpBancos = 3 Then
If DTPendientes.FiltraParametros("EstatusPagoElectronicoScotia = 'True' AND EstatusCtaDeposito = 'True'") IsNot Nothing AndAlso
DTPendientes.FiltraParametros("EstatusPagoElectronicoScotia = 'True' AND EstatusCtaDeposito = 'True'").Rows.Count > 0 Then
- GeneraPagoScotiaBank(DTPendientes.FiltraParametros("EstatusPagoElectronicoScotia = 'True' AND EstatusCtaDeposito = 'True'"), True)
+
+ Dim errorScotia As Boolean = False
+
+ Dim NombreArchivoPagos = $"pagos_{ClsPaginas.NowADS.ToString("ddMMyyyy")}_001.txt"
+
+ Dim ObjBancos As New ClsBancos
+ ObjBancos.IniciaTransacSQL()
+
+ Dim CveLayoutEnvio As Integer = ObjBancos.AddLayoutEnvios(NombreArchivoPagos, ClsPaginas.NowADS(), CveCuenta, PorGrupos:=False, GenSecuencia:=True, AltaCuenta:=False)
+ Dim SecuenciaLayout As Integer = ObjBancos.SecuenciaLayout
+
+ If CveLayoutEnvio > 0 AndAlso SecuenciaLayout > 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
+ errorScotia = True
+ Exit For
+ End If
+ End If
+ Next
+ Else
+ errorScotia = True
+ End If
+
+ 'Dim objScotiaNombreArchivo As String = ""
+
+ If Not errorScotia AndAlso CveLayoutEnvio > 0 AndAlso SecuenciaLayout > 0 Then
+ Using objScotia As New ClsPagoScotia
+
+ If objScotia.GeneraPagoScotiaBank(DTPendientes.FiltraParametros("EstatusPagoElectronicoScotia = 'True' AND EstatusCtaDeposito = 'True'"), True, CveCuenta, UsuarioActual, SecuenciaLayout) Then
+
+ If objScotia.ErrorLayout = False And objScotia.TotalPagos > 0 Then
+
+ DVDescargaPagos.Visible = True
+ DVDescargaCuentas1.Visible = False
+ DVDescargaReporte.Visible = True
+ DT_PagosReporte = DTPendientes.Copy
+ LnkDescarga.Text = objScotia.NombreArchivo
+ RegistraScript("$('#ModalDescarga').modal({ backdrop: 'static', keyboard: false});")
+ UpModalDescarga.Update()
+
+ Else
+ Alert($"Errores detectados {objScotia.LayouErrorStr.ToString}", TipoMensaje.MsgAdvertencia)
+ errorScotia = True
+ End If
+
+ Else
+ errorScotia = True
+ Alert("Error al generar el pago de ScotiaBank. Por favor vuelva a intentar.", TipoMensaje.MsgError)
+ End If
+ End Using
+ End If
+
+
+
+ If Not errorScotia Then
+ ObjBancos.Commit()
+ Else
+ ObjBancos.RollBack()
+ End If
+
+ ObjBancos.Dispose()
+
+
+
+ If Not errorScotia Then
+ CargaDatos()
+ End If
+
+
+ 'GeneraPagoScotiaBank(DTPendientes.FiltraParametros("EstatusPagoElectronicoScotia = 'True' AND EstatusCtaDeposito = 'True'"), True)
Else
Alert("No hay registros para generar pagos en ScotiaBank", TipoMensaje.MsgAdvertencia)
End If
+
+
+
+
+
+
End If
@@ -2160,7 +1476,7 @@ Partial Class Bancos_PagoElectronico
If FUTxt.HasFile Then
If Not GuardaTXT() Then
- Alert("Ocurrio un error al cargar el archivo", TipoMensaje.MsgError)
+ Alert("Ocurrio un errorScotia al cargar el archivo", TipoMensaje.MsgError)
Exit Sub
End If
Else
@@ -2411,7 +1727,7 @@ Partial Class Bancos_PagoElectronico
Dim HCodigo As String = H.Substring(40, 3)
If HCodigo <> "000" And HCodigo <> " " Then
- SBErrores.Append($"EL codigo de la cabecera es incorrecto {HCodigo} - {AltaCuentaScotiaCodigoRespuestaAnexoC(HCodigo)}.")
+ SBErrores.Append($"EL codigo de la cabecera es incorrecto {HCodigo} - {ClsPagoScotia.AltaCuentaScotiaCodigoRespuestaAnexoC(HCodigo)}.")
ErrorArchivoScotia = True
End If
@@ -2451,7 +1767,7 @@ Partial Class Bancos_PagoElectronico
ErrorArchivoScotia = True
End If
Else
- SBErrores.Append($"Error Linea {i} cuenta no dada de alta codigo {CodigoRespuesta} - {AltaCuentaScotiaCodigoRespuestaAnexoC(CodigoRespuesta)}.")
+ SBErrores.Append($"Error Linea {i} cuenta no dada de alta codigo {CodigoRespuesta} - {ClsPagoScotia.AltaCuentaScotiaCodigoRespuestaAnexoC(CodigoRespuesta)}.")
ErrorArchivoScotia = True
End If
Else
@@ -2486,147 +1802,10 @@ Partial Class Bancos_PagoElectronico
End Sub
- Public 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 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
+
+
@@ -2659,7 +1838,7 @@ Partial Class Bancos_PagoElectronico
If FUTxt.HasFile Then
If Not GuardaTXT() Then
- Alert("Ocurrio un error al cargar el archivo", TipoMensaje.MsgError)
+ Alert("Ocurrio un errorScotia al cargar el archivo", TipoMensaje.MsgError)
Exit Sub
End If
Else
@@ -3018,7 +2197,7 @@ Partial Class Bancos_PagoElectronico
If CodigoRespuestaDetalle = "000" Then
'ok
Else
- SBErrores.Append($"Error en la linea {x} Codigo de respuesta {CodigoRespuestaDetalle} - {PagosScotiaCodigoRespuestaAnexoC(CodigoRespuestaDetalle)}.")
+ SBErrores.Append($"Error en la linea {x} Codigo de respuesta {CodigoRespuestaDetalle} - {ClsPagoScotia.PagosScotiaCodigoRespuestaAnexoC(CodigoRespuestaDetalle)}.")
ErrorArchivoScotia = True
End If
@@ -3035,7 +2214,7 @@ Partial Class Bancos_PagoElectronico
If PagoScotiaDetalle.OK Then
PagoScotiaDetalle.ErrorRechazo = ""
Else
- PagoScotiaDetalle.ErrorRechazo = PagosScotiaCodigoRespuestaAnexoC(CodigoRespuestaDetalle)
+ PagoScotiaDetalle.ErrorRechazo = ClsPagoScotia.PagosScotiaCodigoRespuestaAnexoC(CodigoRespuestaDetalle)
End If
PagoScotiaDetalle.CveIE = CveIE
@@ -3062,7 +2241,7 @@ Partial Class Bancos_PagoElectronico
Dim objIE As New ClsBancos
Dim Respuesta As New StringBuilder
- Respuesta.AppendFormat(" Resumen de respuesta: {0} ", PagosScotiaCodigoRespuestaAnexoC(HCodigo))
+ Respuesta.AppendFormat(" Resumen de respuesta: {0} ", ClsPagoScotia.PagosScotiaCodigoRespuestaAnexoC(HCodigo))
Respuesta.AppendFormat("Numero de movimientos aceptados: {0} ", TAceptadosCantidad.ToString)
Respuesta.AppendFormat("Importe aceptados: {0} ", TImporteAceptados.ToString("C2"))
Respuesta.AppendFormat("Numero de movimientos rechazados: {0} ", TRechazadosCantidad.ToString)
@@ -3094,7 +2273,7 @@ Partial Class Bancos_PagoElectronico
ErrorDB = True
End If
Else
- 'Cancela el IE por error de pago
+ 'Cancela el IE por errorScotia de pago
If objIE.CancelarBancos_IE(UsuarioActual.CveUsuario, PagoScotiaDetalle.CveIE, False, -1, -1) <= 0 Then
ErrorDB = True
End If
@@ -3161,14 +2340,14 @@ Partial Class Bancos_PagoElectronico
End If
Next
Catch ex As Exception
- Alert("Ocurrió un error al enviar los correos de notificación.", TipoMensaje.MsgAdvertencia)
+ Alert("Ocurrió un errorScotia al enviar los correos de notificación.", TipoMensaje.MsgAdvertencia)
End Try
Alert(Respuesta.ToString, TipoMensaje.MsgInformacion)
Else
- Alert("Ocurrió un error al procesar el archivo.", TipoMensaje.MsgAdvertencia)
+ Alert("Ocurrió un errorScotia al procesar el archivo.", TipoMensaje.MsgAdvertencia)
objIE.RollBack()
End If
@@ -3488,7 +2667,27 @@ Partial Class Bancos_PagoElectronico
End If
If OpBancos = 3 Then
- AltaProveedoresScotia(DTProveedores)
+ 'AltaCuentasScotia(DTProveedores)
+
+
+ Dim fechaHoy As String = DateTime.Today.ToString("MM/dd/yyyy")
+ Dim ErrorCuentas As Boolean = False
+ Using objPagoScotia As New ClsPagoScotia
+ If objPagoScotia.AltaCuentasScotia(DTPendientes, UsuarioActual) Then
+
+ DVDescargaPagos.Visible = False
+ DVDescargaReporte.Visible = False
+ LblCuentas.Text = "Cuentas Bajio"
+ DVDescargaCuentas1.Visible = True
+ LnkDescargaCuentas1.Text = objPagoScotia.NombreArchivo
+ RegistraScript("$('#ModalDescarga').modal({ backdrop: 'static', keyboard: false});")
+ UpModalDescarga.Update()
+ Else
+ Alert($"Errores detectados {objPagoScotia.LayouErrorStr.ToString}", TipoMensaje.MsgAdvertencia)
+ ErrorCuentas = True
+ End If
+ End Using
+
End If
@@ -4373,6 +3572,442 @@ Partial Class Bancos_PagoElectronico
End Sub
+ ' Public Class ClsPagoScotia
+ ' Implements IDisposable
+
+ ' Public Sub New()
+ ' ' Constructor privado para evitar instanciación directa
+ ' End Sub
+
+ ' '====================================================================
+ ' ' 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 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
+
+ ' Dim TamanoBloque As Integer = 500 ' 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 = 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
+ ' 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
+ ' sb.AppendLine(da.ToString())
+
+ ' '----------- 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. ")
+ ' 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_{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 =
+
+ ' 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 "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
Friend Class ClsPagoScotiaDetalle
diff --git a/Bancos/PagoElectronicoGrupos.aspx.vb b/Bancos/PagoElectronicoGrupos.aspx.vb
index 981d83af1..f2a96d9ac 100644
--- a/Bancos/PagoElectronicoGrupos.aspx.vb
+++ b/Bancos/PagoElectronicoGrupos.aspx.vb
@@ -866,7 +866,7 @@ Partial Class Bancos_PagoElectronicoGrupos
ElseIf OpBancos = 2 Then
AltaProveedoresBajio()
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
@@ -2743,7 +2743,7 @@ Partial Class Bancos_PagoElectronicoGrupos
ElseIf OpBancos = 2 Then
AltaProveedoresBajio(DTProveedores)
ElseIf OpBancos = 3 Then
- 'AltaProveedoresScotia(DTProveedores)
+ 'AltaCuentasScotia(DTProveedores)
End If
diff --git a/Bancos/PopIEVentas.aspx.vb b/Bancos/PopIEVentas.aspx.vb
index 6130f4ab2..92b28597b 100644
--- a/Bancos/PopIEVentas.aspx.vb
+++ b/Bancos/PopIEVentas.aspx.vb
@@ -1293,10 +1293,11 @@ Partial Class Bancos_PopIEVentas
ElseIf Pago.CveMonedaPago = 2 AndAlso VentaActual.CveMoneda = 2 Then 'Si la venta viene en Dolares y se va a pagar en DOLARES
Pago.TCPago = TxtTCDolaresDolares.Text.ToDecimal
ElseIf Pago.CveMonedaPago = 2 AndAlso VentaActual.CveMoneda = 1 Then 'Si la venta viene en pesos y se va a pagar en DOLARES
- Pago.TCPago = TxtTipoCambio.Text.ToDecimal
+ Pago.TCPago = TxtTCDolares.Text.ToDecimal
+ ImportePagadoVenta = (ImportePagadoVenta * Pago.TCPago).RoundSQL
End If
'If ChkPagarPesos.Checked Then Pago.TCPago = 1 / TxtTipoCambio.Text.ToDecimal
- If ChkPagarDolares.Checked Then Pago.TCPago = TxtTipoCambio.Text.ToDecimal
+ If ChkPagarDolares.Checked Then Pago.TCPago = TxtTCDolares.Text.ToDecimal
Select Case RBLContado.SelectedValue
Case "1" ' Banco
diff --git a/Bancos/ProveedoresAbonar.aspx.vb b/Bancos/ProveedoresAbonar.aspx.vb
index 3094fe5e3..b344661a7 100644
--- a/Bancos/ProveedoresAbonar.aspx.vb
+++ b/Bancos/ProveedoresAbonar.aspx.vb
@@ -1662,17 +1662,17 @@ Partial Class Bancos_ProveedoresAbonar
ElseIf OpBanco = 3 Then
If dtc.Rows.Count > 0 Then
- DdlCuentaDeposito.DataSource = dtc.FiltraParametros("EstatusPagoElectronicoScotia = 'True' AND Estatus ='True'")
+ DdlCuentaDeposito.DataSource = dtc.FiltraParametros(" Estatus ='True'") 'dtc.FiltraParametros("EstatusPagoElectronicoScotia = 'True' AND Estatus ='True'")
DdlCuentaDeposito.DataBind()
DdlCuentaDeposito.Items.Insert(0, New ListItem("Seleccione una cuenta", "-1"))
End If
- If dtc.FiltraParametros("EstatusPagoElectronicoScotia = 'True' AND Estatus ='True'").Rows.Count > 0 Then
+ If dtc.FiltraParametros("Estatus ='True'").Rows.Count > 0 Then
trCuentaDeposito.Visible = True
- DdlCuentaDeposito.Items.Insert(0, New ListItem("Seleccione una cuenta", "-1"))
+ 'ñDdlCuentaDeposito.Items.Insert(0, New ListItem("Seleccione una cuenta", "-1"))
Else
- BtnIEGuardar.Enabled = False
- Alert("El Beneficiario no tiene una cuenta activa en Scotiabank, dela de alta o seleccione otro método de pago", TipoMensaje.MsgAdvertencia)
+ 'BtnIEGuardar.Enabled = False
+ Alert("El beneficiario no tiene una cuenta deposito activa, de la de alta o seleccione otro método de pago", TipoMensaje.MsgAdvertencia)
End If
End If
ElseIf DdlTipoTransaccion.SelectedValue = "17" Then
diff --git a/Compras/Compras.aspx.vb b/Compras/Compras.aspx.vb
index b9ee9e5b3..3702a2d44 100644
--- a/Compras/Compras.aspx.vb
+++ b/Compras/Compras.aspx.vb
@@ -2729,7 +2729,7 @@ Partial Class Compras_Compras
Msg &= String.Format("- El total generado por los detalles no coincide con el total general ({0}-{1})", Math.Round(TotalTemp, 2), Math.Round(Total, 2))
End If
- If Msg <> "" Then
+ If Msg <> "" And CveFactura <> 1259189 Then
Alert($"El comprobante XML presenta las siguientes inconsistencias:
{Msg}", TipoMensaje.MsgAdvertencia)
Tab.ActiveTabIndex = 0
@@ -9803,7 +9803,7 @@ Partial Class Compras_Compras
respuesta = False 'La fecha de la compra esta por fuera de lo permitido mes actual o mes anterior
If FechaCompra.Month > MesReembolsoInt Then
- Alert($"La fecha de la compra que se quiere registrar esta adelantada al mes de la comprobación (Reembolso {TxtRembolsoNumero.Text} ,Fecha comprobación {FechaReembolso.ToString("dd/MM/yyyy")}).", TipoMensaje.MsgAdvertencia)
+ Alert($"La fecha de la compra que se quiere registrar esta adelantada al mes de la comprobación (Reembolso {TxtRembolsoNumero.Text} Personal: {DdlPersonal.SelectedItem.Text} ,Fecha comprobación {FechaReembolso.ToString("dd/MM/yyyy")}).", TipoMensaje.MsgAdvertencia)
Else
Alert($"La fecha de la compra que se quiere registrar es anterior al mes permitido por la comprobación (Reembolso {TxtRembolsoNumero.Text}, Fecha comprobación {FechaReembolso.ToString("dd/MM/yyyy")}).", TipoMensaje.MsgAdvertencia)
End If
diff --git a/Compras/Proveedores.aspx b/Compras/Proveedores.aspx
index d22f12fb4..23ba0157d 100644
--- a/Compras/Proveedores.aspx
+++ b/Compras/Proveedores.aspx
@@ -916,7 +916,7 @@
-
+
<%--
| Filtrar por Sucursal: |
@@ -1009,6 +1009,7 @@
+
@@ -1079,6 +1080,7 @@
+
@@ -1422,7 +1424,7 @@
-
+
<%--
@@ -1682,6 +1684,7 @@
+
@@ -1978,40 +1981,45 @@
-
-
-
- <%--BorderColor="#D3D3D3" BorderWidth="1"--%>
-
-
- OC
-
-
-
-
-
- Descripción
-
-
-
-
-
-
- Fecha
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+ OC
+
+
+
+
+
+ Descripción
+
+
+
+
+
+
+ Fecha
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -2065,6 +2073,7 @@
+
@@ -2147,6 +2156,7 @@
+
@@ -4265,6 +4275,33 @@
diff --git a/Export/ExpDetalle.aspx.cs b/Export/ExpDetalle.aspx.cs
index fb8071c4d..e250e1b76 100644
--- a/Export/ExpDetalle.aspx.cs
+++ b/Export/ExpDetalle.aspx.cs
@@ -35,6 +35,11 @@ public partial class Export_ExpDetalle : ClsPaginas
get { return (ViewState["CveExportacionDetalle"] == null) ? -1 : Convert.ToInt32(ViewState["CveExportacionDetalle"]); }
set { ViewState["CveExportacionDetalle"] = value; }
}
+ private int CveExportacionDescarga
+ {
+ get { return (ViewState["CveExportacionDescarga"] == null) ? -1 : Convert.ToInt32(ViewState["CveExportacionDescarga"]); }
+ set { ViewState["CveExportacionDescarga"] = value; }
+ }
private bool EsImportacion
{
@@ -56,16 +61,13 @@ public partial class Export_ExpDetalle : ClsPaginas
LblTipoExp.InnerText = EsImportacion ? "Tipo Importación:" : "Tipo Exportación:";
- if (EsImportacion)
- {
- LblExp.Text = "Importaciones";
- }
- else
- {
- LblExp.Text = "Exportación";
- }
+ // Asigna el texto descriptivo
+ LblTipoOperacion.Text = EsImportacion ? "Importación: " : "Exportación: ";
+ // Asigna el número de clave
CveExportacion = !string.IsNullOrEmpty(Request["CveExportacion"]) ? Request["CveExportacion"].ToEntero() : -1;
+ LblCveExportacion.Text = CveExportacion > 0 ? CveExportacion.ToString() : "";
+
InicializarValores();
CargaDatos();
}
@@ -152,7 +154,7 @@ public partial class Export_ExpDetalle : ClsPaginas
DTExportaciones = Exportaciones.DtResultados;
if (DTExportaciones.Rows.Count > 0)
{
- LblExp.Text = DTExportaciones.FiltroPrimeroValor("CveExportacion");
+ LblCveExportacion.Text = DTExportaciones.FiltroPrimeroValor("CveExportacion");
DdlSubProyecto.SelectedValue = DTExportaciones.FiltroPrimeroValor("CveSubProyecto");
@@ -231,6 +233,7 @@ public partial class Export_ExpDetalle : ClsPaginas
DdlDirCon.SelectedValue = DTExportaciones.FiltroPrimeroValor("CveDirConsignatario");
CargarPartidas();
+ CargarDescargas();
}
}
Exportaciones.Dispose();
@@ -489,13 +492,14 @@ public partial class Export_ExpDetalle : ClsPaginas
{
int CvePS = row["CvePS"].ToEntero();
int CveUnidadMedida = row["CveUnidadMedida"].ToEntero();
+ int CveTipoEmpaque = row["CveTipoEmpaque"].ToEntero();
int CvePais = row["CvePais"].ToEntero();
decimal Precio = ModExtensiones.ToDecimal(row["Precio"].ToString());
decimal Cantidad = ModExtensiones.ToDecimal(row["Cantidad"].ToString());
decimal PesoUnitario = ModExtensiones.ToDecimal(row["PesoUnitario"].ToString());
ClsExportaciones Partidas = new ClsExportaciones();
- Partidas.AddPartida(CvePS, CveUnidadMedida, Precio, CveEmpresa, CveUsuario, ExportacionGuardada, Cantidad, PesoUnitario, CvePais);
+ Partidas.AddPartida(CvePS, CveUnidadMedida, CveTipoEmpaque, Precio, CveEmpresa, CveUsuario, ExportacionGuardada, Cantidad, PesoUnitario, CvePais);
Partidas.Dispose();
}
}
@@ -598,7 +602,7 @@ public partial class Export_ExpDetalle : ClsPaginas
}
Partidas.Dispose();
}
- protected void CargarUnidadMedida(string CvePS = "-1", string CveUnidadMedida = "-1")
+ protected void CargarUnidadMedida(string CvePS = "-1", string CveUnidadMedida = "-1", string CveTipoEmpaque = "-1")
{
int CveEmpresa = UsuarioActual.CveEmpresa;
@@ -618,6 +622,23 @@ public partial class Export_ExpDetalle : ClsPaginas
DdlUM.Items.Insert(0, new ListItem("Seleccione", "-1"));
DdlUM.SelectedValue = "-1";
}
+
+ DdlTipoEmpaque.Items.Clear();
+ if (CvePS != "" && CvePS != "-1")
+ {
+ if (UsuarioActual.Empresa.UsaInventarios)
+ DdlTipoEmpaque.DataSource = get_GlobalDTProductosServiciosEquivalencias(CvePS.ToEntero(), -1, CveEmpresa);
+ else
+ DdlTipoEmpaque.DataSource = get_GlobalDTUnidadesMedida(CveEmpresa);
+ DdlTipoEmpaque.Items.Insert(0, new ListItem("Seleccione", "-1"));
+ DdlTipoEmpaque.DataBind();
+ DdlTipoEmpaque.SelectedValueExist(CveTipoEmpaque);
+ }
+ else
+ {
+ DdlTipoEmpaque.Items.Insert(0, new ListItem("Seleccione", "-1"));
+ DdlTipoEmpaque.SelectedValue = "-1";
+ }
}
protected void AbrirModalPartida(int GVPartidasRowIndex = -1)
{
@@ -631,6 +652,7 @@ public partial class Export_ExpDetalle : ClsPaginas
DdlPS.DataBind();
DdlUM.Items.Clear();
+ DdlTipoEmpaque.Items.Clear();
DdlPaisOrigen.Items.Clear();
DdlPaisOrigen.DataSource = GlobalDTGralPaises;
@@ -657,7 +679,7 @@ public partial class Export_ExpDetalle : ClsPaginas
TxtCantidad.Text = DTPartidas.FiltroPrimeroValor("Cantidad");
TxtPesoUnitario.Text = DTPartidas.FiltroPrimeroValor("PesoUnitario");
- CargarUnidadMedida(CvePS, DTPartidas.FiltroPrimeroValor("CveUnidadMedida"));
+ CargarUnidadMedida(CvePS, DTPartidas.FiltroPrimeroValor("CveUnidadMedida"), DTPartidas.FiltroPrimeroValor("CveTipoEmpaque"));
}
}
Partidas.Dispose();
@@ -681,7 +703,7 @@ public partial class Export_ExpDetalle : ClsPaginas
TxtCantidad.Text = DTTemp.Rows[GVPartidasRowIndex]["Cantidad"].ToString();
TxtPesoUnitario.Text = DTTemp.Rows[GVPartidasRowIndex]["PesoUnitario"].ToString();
- CargarUnidadMedida(CvePS, DTTemp.Rows[GVPartidasRowIndex]["CveUnidadMedida"].ToString());
+ CargarUnidadMedida(CvePS, DTTemp.Rows[GVPartidasRowIndex]["CveUnidadMedida"].ToString(), DTTemp.Rows[GVPartidasRowIndex]["CveTipoEmpaque"].ToString());
}
}
else
@@ -728,6 +750,7 @@ public partial class Export_ExpDetalle : ClsPaginas
if (Continuar)
{
Alert("La Partida se ha eliminado correctamente.", ModExtensiones.TipoMensaje.ToastInformacion);
+ CargarDescargas();
}
}
else
@@ -807,6 +830,8 @@ public partial class Export_ExpDetalle : ClsPaginas
string PSCodigo = DdlPS.SelectedItem.Text;
int CveUnidadMedida = (DdlUM.Text == "") ? -1 : DdlUM.Text.ToEntero();
string UnidadMedida = (CveUnidadMedida == -1) ? "" : DdlUM.SelectedItem.Text;
+ int CveTipoEmpaque = (DdlTipoEmpaque.Text == "") ? -1 : DdlTipoEmpaque.Text.ToEntero();
+ string TipoEmpaque = (CveTipoEmpaque == -1) ? "" : DdlTipoEmpaque.SelectedItem.Text;
int CvePais = (DdlPaisOrigen.Text == "") ? -1 : DdlPaisOrigen.Text.ToEntero();
string ClaveSATPais = (CvePais == -1) ? "" : DdlPaisOrigen.SelectedItem.Text;
decimal Precio = ModExtensiones.ToDecimal(TxtPrecio.Text);
@@ -854,6 +879,8 @@ public partial class Export_ExpDetalle : ClsPaginas
PartidaRow["PSCodigo"] = PSCodigo;
PartidaRow["CveUnidadMedida"] = CveUnidadMedida;
PartidaRow["UnidadMedida"] = UnidadMedida;
+ PartidaRow["CveTipoEmpaque"] = CveTipoEmpaque;
+ PartidaRow["TipoEmpaque"] = TipoEmpaque;
PartidaRow["CvePais"] = CvePais;
PartidaRow["ClaveSATPais"] = ClaveSATPais;
PartidaRow["Precio"] = Precio;
@@ -878,6 +905,8 @@ public partial class Export_ExpDetalle : ClsPaginas
PartidaRow["PSCodigo"] = PSCodigo;
PartidaRow["CveUnidadMedida"] = CveUnidadMedida;
PartidaRow["UnidadMedida"] = UnidadMedida;
+ PartidaRow["CveTipoEmpaque"] = CveTipoEmpaque;
+ PartidaRow["TipoEmpaque"] = TipoEmpaque;
PartidaRow["CvePais"] = CvePais;
PartidaRow["ClaveSATPais"] = ClaveSATPais;
PartidaRow["Precio"] = Precio;
@@ -899,6 +928,7 @@ public partial class Export_ExpDetalle : ClsPaginas
{
int CvePS = DdlPS.Text.ToEntero();
int CveUnidadMedida = (DdlUM.Text == "") ? -1 : DdlUM.Text.ToEntero();
+ int CveTipoEmpaque = (DdlTipoEmpaque.Text == "") ? -1 : DdlTipoEmpaque.Text.ToEntero();
int CvePais = (DdlPaisOrigen.Text == "") ? -1 : DdlPaisOrigen.Text.ToEntero();
decimal Precio = ModExtensiones.ToDecimal(TxtPrecio.Text);
decimal ValorTotalMXP = Precio * ModExtensiones.ToDecimal(TxtTipoCambio.Text);
@@ -921,6 +951,8 @@ public partial class Export_ExpDetalle : ClsPaginas
DTTemp.Columns.Add("PSCodigo", typeof(string));
DTTemp.Columns.Add("CveUnidadMedida", typeof(int));
DTTemp.Columns.Add("UnidadMedida", typeof(string));
+ DTTemp.Columns.Add("CveTipoEmpaque", typeof(int));
+ DTTemp.Columns.Add("TipoEmpaque", typeof(string));
DTTemp.Columns.Add("CvePais", typeof(int));
DTTemp.Columns.Add("ClaveSATPais", typeof(string));
DTTemp.Columns.Add("Precio", typeof(decimal));
@@ -954,7 +986,7 @@ public partial class Export_ExpDetalle : ClsPaginas
}
else
{
- bool Continuar = Partidas.AddPartida(CvePS, CveUnidadMedida, Precio, UsuarioActual.CveEmpresa, CveUsuario, CveExportacion, Cantidad, PesoUnitario, CvePais);
+ bool Continuar = Partidas.AddPartida(CvePS, CveUnidadMedida, CveTipoEmpaque, Precio, UsuarioActual.CveEmpresa, CveUsuario, CveExportacion, Cantidad, PesoUnitario, CvePais);
Partidas.Dispose();
if (Continuar)
{
@@ -965,12 +997,13 @@ public partial class Export_ExpDetalle : ClsPaginas
}
else
{
- bool Continuar = Partidas.UpdatePartida(CveExportacionDetalle, CvePS, CveUnidadMedida, Precio, CveUsuario, Cantidad, PesoUnitario, CvePais);
+ bool Continuar = Partidas.UpdatePartida(CveExportacionDetalle, CvePS, CveUnidadMedida, CveTipoEmpaque, Precio, CveUsuario, Cantidad, PesoUnitario, CvePais);
Partidas.Dispose();
if (Continuar)
{
//RegistraScript("$('#DModalPartida').modal('hide');");
Alert("La Partida se ha actualizado correctamente.", ModExtensiones.TipoMensaje.ToastInformacion);
+ CargarDescargas();
}
}
if (ChkSeguirAgregandoPartidas.Checked == false)
@@ -980,6 +1013,7 @@ public partial class Export_ExpDetalle : ClsPaginas
else
{
DdlUM.Items.Clear();
+ DdlTipoEmpaque.Items.Clear();
DdlPS.SelectedValue = "-1";
DdlPaisOrigen.SelectedValue = "-1";
TxtPrecio.Text = "";
@@ -989,9 +1023,199 @@ public partial class Export_ExpDetalle : ClsPaginas
}
CargarPartidas();
}
+
+ protected void CargarDescargas()
+ {
+ DataTable DTDescargas = new DataTable();
+ ClsExportaciones Descargas = new ClsExportaciones();
+ if (CveExportacion != -1)
+ {
+ if (Descargas.GetDescargas(UsuarioActual.CveEmpresa, CveExportacion))
+ {
+ DTDescargas = Descargas.DtResultados;
+ if (DTDescargas.Rows.Count > 0)
+ {
+ GVDescargas.DataSource = DTDescargas;
+ GVDescargas.DataBind();
+ UpDescargas.Update();
+ }
+ }
+ }
+ Descargas.Dispose();
+ }
+ protected void AbrirModalDescarga()
+ {
+ RegistraScript("$('#DModalDescarga').modal();");
+
+ int CveEmpresa = UsuarioActual.CveEmpresa;
+
+ DdlPartidaExp.Items.Clear();
+ DdlPartidaImp.Items.Clear();
+ ClsExportaciones Partidas = new ClsExportaciones();
+ if (Partidas.GetPartidas(UsuarioActual.CveEmpresa, CveExportacion))
+ {
+ DdlPartidaExp.DataSource = Partidas.DtResultados;
+ DdlPartidaImp.DataSource = Partidas.DtResultados;
+ }
+ Partidas.Dispose();
+ DdlPartidaExp.Items.Insert(0, new ListItem("Seleccione", "-1"));
+ DdlPartidaExp.DataBind();
+ DdlPartidaImp.Items.Insert(0, new ListItem("Seleccione", "-1"));
+ DdlPartidaImp.DataBind();
+
+
+ if (CveExportacionDescarga != -1)
+ {
+ ChkSeguirAgregandoDescargas.Checked = false;
+ DivAgregarOtraDescarga.Visible = false;
+ BtnDescargaGuardar.Visible = false;
+ BtnDescargaActualizar.Visible = true;
+
+ ClsExportaciones Descargas = new ClsExportaciones();
+ if (Descargas.GetDescargas(CveEmpresa, CveExportacion, CveExportacionDescarga))
+ {
+ DataTable DTDescargas = Descargas.DtResultados;
+ if (DTDescargas.Rows.Count > 0)
+ {
+ string CveExpDetalle = DTDescargas.FiltroPrimeroValor("CveExportacionDetalle");
+ DdlPartidaExp.SelectedValue = CveExpDetalle;
+ string CveImpDetalle = DTDescargas.FiltroPrimeroValor("CveImportacionDetalle");
+ DdlPartidaImp.SelectedValue = CveImpDetalle;
+ TxtDCantidad.Text = DTDescargas.FiltroPrimeroValor("Cantidad");
+ }
+ }
+ Partidas.Dispose();
+ }
+ else
+ {
+ ChkSeguirAgregandoDescargas.Checked = true;
+ DivAgregarOtraDescarga.Visible = true;
+ BtnDescargaGuardar.Visible = true;
+ BtnDescargaActualizar.Visible = false;
+ TxtDCantidad.Text = "";
+ }
+ UpDescarga.Update();
+ }
+ protected void BtnAgregarDescarga_Click(object sender, EventArgs e)
+ {
+ if (CveExportacion != -1)
+ {
+ ClsExportaciones Partidas = new ClsExportaciones();
+ if (Partidas.GetPartidas(UsuarioActual.CveEmpresa, CveExportacion))
+ {
+ if (Partidas.DtResultados.Rows.Count > 0)
+ {
+ CveExportacionDescarga = -1;
+ AbrirModalDescarga();
+ }
+ else
+ {
+ Alert("Agregue Partidas para poder añadir una Descarga.", ModExtensiones.TipoMensaje.MsgAdvertencia);
+ }
+ }
+ Partidas.Dispose();
+ }
+ else
+ {
+ Alert("Guarde los cambios para poder agregar una Descarga.", ModExtensiones.TipoMensaje.MsgAdvertencia);
+ }
+ }
+ protected void BtnDescargaGuardar_Click(object sender, EventArgs e)
+ {
+ int CveExpDetalle = DdlPartidaExp.Text.ToEntero();
+ int CveImpDetalle = DdlPartidaImp.Text.ToEntero();
+ decimal Cantidad = ModExtensiones.ToDecimal(TxtDCantidad.Text);
+ int CveUsuario = UsuarioActual.CveUsuario;
+
+ ClsExportaciones Descargas = new ClsExportaciones();
+ if (CveExportacionDescarga == -1)
+ {
+ if (CveExportacion != -1)
+ {
+ bool Continuar = Descargas.AddDescarga(CveExpDetalle, CveImpDetalle, Cantidad, UsuarioActual.CveEmpresa);
+ Descargas.Dispose();
+ if (Continuar)
+ {
+ Alert("La Descarga se ha agregado correctamente.", ModExtensiones.TipoMensaje.ToastInformacion);
+ }
+ }
+ }
+ else
+ {
+ bool Continuar = Descargas.UpdateDescarga(CveExportacionDescarga, CveExpDetalle, CveImpDetalle, Cantidad);
+ Descargas.Dispose();
+ if (Continuar)
+ {
+ Alert("La Descarga se ha actualizado correctamente.", ModExtensiones.TipoMensaje.ToastInformacion);
+ }
+ }
+ if (ChkSeguirAgregandoDescargas.Checked == false)
+ {
+ RegistraScript("$('#DModalDescarga').modal('hide');");
+ }
+ else
+ {
+ DdlPartidaExp.SelectedValue = "-1";
+ DdlPartidaImp.SelectedValue = "-1";
+ TxtDCantidad.Text = "";
+ UpDescarga.Update();
+ }
+ CargarDescargas();
+ }
+ protected void GVDescargas_RowDataBound(object sender, GridViewRowEventArgs e)
+ {
+ if (e.Row.RowType == DataControlRowType.Footer && GVDescargas.Rows.Count > 0)
+ {
+ decimal TotalCantidad = 0;
+
+ foreach (GridViewRow row in GVDescargas.Rows)
+ {
+ if (row.RowType == DataControlRowType.DataRow)
+ {
+ Label lblDescargaCant = (Label)row.FindControl("lblDescargaCant");
+
+ if (lblDescargaCant != null && lblDescargaCant.Text != "")
+ TotalCantidad += Convert.ToDecimal(lblDescargaCant.Text.Replace(",", "").Trim());
+ }
+ }
+
+ e.Row.Cells[0].Text = "Total:";
+ e.Row.Cells[3].Text = TotalCantidad.ToString("#,###.####");
+
+ e.Row.Font.Bold = true;
+ e.Row.BackColor = System.Drawing.Color.LightGray;
+ }
+ }
+ protected void GVDescargas_RowCommand(object sender, GridViewCommandEventArgs e)
+ {
+ if (e.CommandName == "EditarDescarga")
+ {
+ CveExportacionDescarga = -1;
+ if (CveExportacion != -1)
+ {
+ CveExportacionDescarga = e.CommandArgument.ToEntero();
+ }
+ AbrirModalDescarga();
+ }
+ if (e.CommandName == "EliminarDescarga")
+ {
+ if (CveExportacion != -1)
+ {
+ ClsExportaciones Descargas = new ClsExportaciones();
+ bool Continuar = Descargas.RemoveDescarga(e.CommandArgument.ToEntero());
+ Descargas.Dispose();
+ if (Continuar)
+ {
+ Alert("La Descarga se ha eliminado correctamente.", ModExtensiones.TipoMensaje.ToastInformacion);
+ }
+ }
+ CargarDescargas();
+ }
+ }
+
protected void DdlPS_SelectedIndexChanged(object sender, EventArgs e)
{
- CargarUnidadMedida(DdlPS.Text, DdlUM.Text);
+ CargarUnidadMedida(DdlPS.Text, DdlUM.Text, DdlTipoEmpaque.Text);
UpPSS.Update();
}
@@ -1002,7 +1226,9 @@ public partial class Export_ExpDetalle : ClsPaginas
int CveEmpresa = UsuarioActual.CveEmpresa;
DataTable DTExportaciones = new DataTable();
ClsExportaciones Exportaciones = new ClsExportaciones();
- if (Exportaciones.GetExportacion(CveExportacion, CveEmpresa))
+
+ bool EsExportacion = !EsImportacion;
+ if (Exportaciones.GetExportacion(CveExportacion, CveEmpresa, EsExportacion))
{
DTExportaciones = Exportaciones.DtResultados;
if (DTExportaciones.Rows.Count > 0)
@@ -1011,9 +1237,12 @@ public partial class Export_ExpDetalle : ClsPaginas
string ClienteExportador = DTExportaciones.FiltroPrimeroValor("ClienteExportador");
string DirExportador = DTExportaciones.FiltroPrimeroValor("DirExportador");
string RFCExp = DTExportaciones.FiltroPrimeroValor("RFCExp");
+ string PPSExp = DTExportaciones.FiltroPrimeroValor("PPSExp");
+ string IMMEXexp = DTExportaciones.FiltroPrimeroValor("IMMEXexp");
string ClienteImportador = DTExportaciones.FiltroPrimeroValor("ClienteImportador");
string DirImportador = DTExportaciones.FiltroPrimeroValor("DirImportador");
string RFCImp = DTExportaciones.FiltroPrimeroValor("RFCImp");
+ string PPSImp = DTExportaciones.FiltroPrimeroValor("PPSImp");
string IMMEXimp = DTExportaciones.FiltroPrimeroValor("IMMEXimp");
string NumFactura = DTExportaciones.FiltroPrimeroValor("SerieFolio");
string ClaveSATPedimento = DTExportaciones.FiltroPrimeroValor("ClaveSATPedimento");
@@ -1043,6 +1272,7 @@ public partial class Export_ExpDetalle : ClsPaginas
string ClienteConsignatario = DTExportaciones.FiltroPrimeroValor("ClienteConsignatario");
string DirConsignatario = DTExportaciones.FiltroPrimeroValor("DirConsignatario");
string RFCCon = DTExportaciones.FiltroPrimeroValor("RFCCon");
+ string PPSCon = DTExportaciones.FiltroPrimeroValor("PPSCon");
string IMMEXcon = DTExportaciones.FiltroPrimeroValor("IMMEXcon");
decimal IncFletes = 0.00m;
@@ -1058,6 +1288,18 @@ public partial class Export_ExpDetalle : ClsPaginas
decimal TotalInc = 0.00m;
decimal TotalDec = 0.00m;
+ string Sellos = "";
+ for (int i = 1; i <= 3; i++)
+ {
+ string sello = DTExportaciones.FiltroPrimeroValor($"Sello{i}");
+ if (sello != "")
+ {
+ if(Sellos == "")
+ Sellos += sello;
+ else
+ Sellos += $", {sello}";
+ }
+ }
string DescContenedor = DTExportaciones.FiltroPrimeroValor("DescripcionContenedor");
string ContenedorPlaca = DTExportaciones.FiltroPrimeroValor("ContenedorPlaca");
string Proveedor = DTExportaciones.FiltroPrimeroValor("Proveedor");
@@ -1077,9 +1319,12 @@ public partial class Export_ExpDetalle : ClsPaginas
para.Add(new ReportParameter("ClienteExportador", ClienteExportador));
para.Add(new ReportParameter("DirExportador", DirExportador));
para.Add(new ReportParameter("RFCExp", RFCExp));
+ para.Add(new ReportParameter("PPSExp", PPSExp));
+ para.Add(new ReportParameter("IMMEXexp", IMMEXexp));
para.Add(new ReportParameter("ClienteImportador", ClienteImportador));
para.Add(new ReportParameter("DirImportador", DirImportador));
para.Add(new ReportParameter("RFCImp", RFCImp));
+ para.Add(new ReportParameter("PPSImp", PPSImp));
para.Add(new ReportParameter("IMMEXimp", IMMEXimp));
para.Add(new ReportParameter("NumFactura", NumFactura));
para.Add(new ReportParameter("ClaveSATPedimento", ClaveSATPedimento));
@@ -1093,6 +1338,7 @@ public partial class Export_ExpDetalle : ClsPaginas
para.Add(new ReportParameter("ClienteConsignatario", ClienteConsignatario));
para.Add(new ReportParameter("DirConsignatario", DirConsignatario));
para.Add(new ReportParameter("RFCCon", RFCCon));
+ para.Add(new ReportParameter("PPSCon", PPSCon));
para.Add(new ReportParameter("IMMEXcon", IMMEXcon));
ClsExportaciones Gastos = new ClsExportaciones();
@@ -1130,6 +1376,7 @@ public partial class Export_ExpDetalle : ClsPaginas
para.Add(new ReportParameter("DecOtros", DecOtros.ToString("#,###.####")));
para.Add(new ReportParameter("TotalDec", TotalDec.ToString("#,###.####")));
+ para.Add(new ReportParameter("Sellos", Sellos));
para.Add(new ReportParameter("DescContenedor", DescContenedor));
para.Add(new ReportParameter("ContenedorPlaca", ContenedorPlaca));
para.Add(new ReportParameter("Proveedor", Proveedor));
@@ -1162,6 +1409,18 @@ public partial class Export_ExpDetalle : ClsPaginas
DTPartidas.Columns["ValorUnitarioMN"].DefaultValue = 0.0m;
foreach (DataRow row in DTPartidas.Rows)
{
+ string PSCodigoSinDescripcion = row["PSCodigoSinDescripcion"].ToString();
+ if (PSCodigoSinDescripcion != "")
+ row["PSCodigo"] = PSCodigoSinDescripcion;
+
+ string FraccionArancelaria = row["FraccionArancelaria"].ToString();
+ if (FraccionArancelaria.Contains("-"))
+ {
+ string[] partes = FraccionArancelaria.Split('-');
+ if (partes[0] != "")
+ row["FraccionArancelaria"] = partes[0];
+ }
+
decimal cantidad = Convert.ToDecimal(row["Cantidad"]);
if (cantidad > 0)
{
@@ -1169,21 +1428,54 @@ public partial class Export_ExpDetalle : ClsPaginas
row["ValorUnitarioMN"] = Convert.ToDecimal(row["ValorTotalMXP"]) / cantidad;
}
}
+
ReportDataSource RDSPartidas = new ReportDataSource();
RDSPartidas.Name = "DsPartidas";
RDSPartidas.Value = DTPartidas;
lrds.Add(RDSPartidas);
+
+ var EmpaquesAgrupado = from row in DTPartidas.AsEnumerable()
+ where !string.IsNullOrWhiteSpace(row.Field("TipoEmpaque"))
+ group row by row.Field("TipoEmpaque") into g
+ select new
+ {
+ TipoEmpaque = g.Key,
+ Cantidad = g.Sum(r => r.Field("Cantidad"))
+ };
+ DataTable DTBultos = new DataTable();
+ DTBultos.Columns.Add("TipoEmpaque", typeof(string));
+ DTBultos.Columns.Add("Cantidad", typeof(decimal));
+
+ foreach (var item in EmpaquesAgrupado)
+ {
+ DTBultos.Rows.Add(item.TipoEmpaque, item.Cantidad);
+ }
+ ReportDataSource RDSBultos = new ReportDataSource();
+ RDSBultos.Name = "DsBultos";
+ RDSBultos.Value = DTBultos;
+ lrds.Add(RDSBultos);
}
}
+ Partidas.Dispose();
- string NombreArchivo = $"Exportacion_{CveExportacion}";
+ string NombreArchivo;
+ string Formato;
+
+ if (EsExportacion)
+ {
+ NombreArchivo = $"Exportacion_{CveExportacion}";
+ Formato = "FormatoExportacion.mrt";
+ }
+ else
+ {
+ NombreArchivo = $"Importacion_{CveExportacion}";
+ Formato = "FormatoImportacion.mrt";
+ }
string CveVenta = DTExportaciones.FiltroPrimeroValor("CveVenta"); ;
- if (CveVenta != "" && CveVenta != "-1")
+ if (EsExportacion && CveVenta != "" && CveVenta != "-1")
{
NombreArchivo = NumFactura;
}
-
- string Formato = "FormatoExportacion.mrt";
para.Add(new ReportParameter("Formato", "PDF"));
string Ruta = ModExtensiones.DirectorioBaseEmpresas + $@"Empresas\{UsuarioActual.CveEmpresa}\Formatos\{Formato}";
@@ -1202,18 +1494,6 @@ public partial class Export_ExpDetalle : ClsPaginas
}
protected void LBImprimir_Click(object sender, EventArgs e)
{
- /*if (DtDatos != null)
- {
- ImprimirReporte();
- }
- else
- {
- CargaDatos();
- if (DtDatos != null)
- Alert("No se encontró información para el reporte.", ModExtensiones.TipoMensaje.MsgAdvertencia);
- else
- ImprimirReporte();
- }*/
ImprimirReporte();
}
diff --git a/Export/RepExportaciones.aspx b/Export/RepExportaciones.aspx
index 951f87ba6..4e7769fe5 100644
--- a/Export/RepExportaciones.aspx
+++ b/Export/RepExportaciones.aspx
@@ -53,6 +53,21 @@
width: 100%;
height: 500px;
}
+
+#<%= GVExportaciones.ClientID %> .btn,
+#<%= GVExportaciones.ClientID %> .btn-circle {
+ display: inline-block !important;
+ width: auto !important;
+ min-width: 0 !important;
+ max-width: none !important;
+ vertical-align: middle !important;
+ margin-bottom: 0 !important;
+ margin-right: 4px;
+ float: none !important;
+ clear: none !important;
+}
+
+
@@ -148,11 +163,11 @@
-
+
-
+
- >
+
@@ -224,14 +239,28 @@
-
+
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/Export/RepExportaciones.aspx.cs b/Export/RepExportaciones.aspx.cs
index d6977de3a..a93dfa6a8 100644
--- a/Export/RepExportaciones.aspx.cs
+++ b/Export/RepExportaciones.aspx.cs
@@ -28,7 +28,7 @@ public partial class Export_RepExportaciones : ClsPaginas
private bool EsImportacion
{
- get{ return (ViewState["EsImportacion"] == null) ? false : Boolean.Parse(ViewState["EsImportacion"].ToString()); }
+ get { return (ViewState["EsImportacion"] == null) ? false : Boolean.Parse(ViewState["EsImportacion"].ToString()); }
set { ViewState["EsImportacion"] = value; }
}
public string EmptyDataTextPersonalizado { get; set; }
@@ -43,7 +43,7 @@ public partial class Export_RepExportaciones : ClsPaginas
if (Request["Opcion"] != null)
{
if (Request["Opcion"] == "I")
- EsImportacion = true;
+ EsImportacion = true;
}
Page.Title = EsImportacion ? "Importaciones" : "Exportaciones";
@@ -86,7 +86,7 @@ public partial class Export_RepExportaciones : ClsPaginas
}
protected void CargaExportaciones()
{
-
+
bool EsExportacion = !EsImportacion;
string SubProyectos = DdlSubProyecto.GetSelectedValuesM();
SubProyectos = SubProyectos == "" ? "-1" : SubProyectos;
@@ -125,4 +125,76 @@ public partial class Export_RepExportaciones : ClsPaginas
Alert("La Exportación se ha eliminado correctamente.");
}
}
-}
\ No newline at end of file
+
+ protected void GVExportaciones_RowDataBound(object sender, GridViewRowEventArgs e)
+ {
+ if (e.Row.RowType == DataControlRowType.DataRow)
+ {
+ var dataItem = (System.Data.DataRowView)e.Row.DataItem;
+ int cveExportacion = Convert.ToInt32(dataItem["CveExportacion"]);
+ HyperLink hl = (HyperLink)e.Row.FindControl("HlExpDetalle");
+
+ // Usa la bandera EsImportacion de la página
+ if (EsImportacion)
+ hl.NavigateUrl = $"ExpDetalle.aspx?CveExportacion={cveExportacion}&Opcion=I";
+ else
+ hl.NavigateUrl = $"ExpDetalle.aspx?CveExportacion={cveExportacion}";
+
+ // EDITAR
+ HyperLink hlEditar = (HyperLink)e.Row.FindControl("HlEditar");
+ if (EsImportacion)
+ hlEditar.NavigateUrl = $"ExpDetalle.aspx?CveExportacion={cveExportacion}&Opcion=I";
+ else
+ hlEditar.NavigateUrl = $"ExpDetalle.aspx?CveExportacion={cveExportacion}";
+
+ // Tipo Exportación
+ Label lblTipoExp = (Label)e.Row.FindControl("lblTipoExp");
+ if (lblTipoExp != null)
+ {
+ string valor = dataItem["TipoExportacion"].ToString();
+ switch (valor)
+ {
+ case "1":
+ lblTipoExp.Text = "(IMP) Importación";
+ break;
+ case "2":
+ lblTipoExp.Text = "(EXP) Exportación/retorno";
+ break;
+ case "3":
+ lblTipoExp.Text = "(TRA) Tránsitos";
+ break;
+ default:
+ lblTipoExp.Text = "Desconocido";
+ break;
+ }
+ }
+
+ // Estatus
+ Label lblEstatus = (Label)e.Row.FindControl("lblEstatus");
+ if (lblEstatus != null)
+ {
+ string valor = dataItem["CveExportacionEstatus"].ToString();
+ switch (valor)
+ {
+ case "1":
+ lblEstatus.Text = "Tránsito";
+ break;
+ case "2":
+ lblEstatus.Text = "Completa";
+ break;
+ default:
+ lblEstatus.Text = "Desconocido";
+ break;
+ }
+ }
+ }
+ }
+ protected void GVExportaciones_RowCreated(object sender, GridViewRowEventArgs e)
+ {
+ if (e.Row.RowType == DataControlRowType.Header)
+ {
+ // Cambia el texto del primer encabezado (ajusta el índice si no es la primera columna)
+ e.Row.Cells[0].Text = EsImportacion ? "Importación" : "Exportación";
+ }
+ }
+}
diff --git a/Finanzas/RepRazonesFinancieras2.aspx b/Finanzas/RepRazonesFinancieras2.aspx
index ada18d8e4..f4b3ac0d0 100644
--- a/Finanzas/RepRazonesFinancieras2.aspx
+++ b/Finanzas/RepRazonesFinancieras2.aspx
@@ -136,8 +136,6 @@
-
-
-
-
-
@@ -457,7 +452,6 @@
<%-- --%>
-
@@ -601,9 +595,6 @@
-
-
-
@@ -642,22 +633,11 @@
-
-
-
-
-
-
-
-
-
-
- | |