From aabee3f8b5b739036dfc907e619434c762a26cda Mon Sep 17 00:00:00 2001 From: rakcsle Date: Tue, 5 Jul 2022 19:30:52 -0700 Subject: [PATCH] Recepcion almacen cierre de Fletes e Importaciones, Correcion creditos, mensaje efacturas folio repetido, consignaciones prepoliza --- App_Code/ClsInventarios.vb | 41 ++++++++++ Bancos/Creditos.aspx.vb | 6 +- Compras/RepPagadoPeriodo.aspx.cs | 2 +- Compras/eFacturas.aspx.vb | 41 +++++++++- Inventarios/Consignaciones.aspx.vb | 41 +++++++++- Inventarios/PaquetesArmadoDesarmado.aspx.vb | 91 +++++++++++++++++---- Inventarios/RecepcionAlmacen.aspx.vb | 66 +++++++++++++++ Ventas/RepProductosServiciosPeriodo.aspx.cs | 4 +- 8 files changed, 267 insertions(+), 25 deletions(-) diff --git a/App_Code/ClsInventarios.vb b/App_Code/ClsInventarios.vb index 426551bb0..85fdea037 100644 --- a/App_Code/ClsInventarios.vb +++ b/App_Code/ClsInventarios.vb @@ -5052,6 +5052,47 @@ Public Class ClsInventarios Return Retorno End Function + + + + Public Function UpdateFleteCierre(CveFlete As Integer, CveEmpresa As Integer, CveUsuario As Integer) As Boolean + Dim Retorno As Boolean = False + DataAdapter("PA_Inv_FletesCierreUpdate") + With SqlAdapter.SelectCommand.Parameters + .Add("@CveFlete", SqlDbType.Int).Value = CveFlete + .Add("@CveEmpresa", SqlDbType.Int).Value = CveEmpresa + .Add("@CveUsuario", SqlDbType.Int).Value = CveUsuario + End With + Try + SqlAdapter.Fill(Data) + Retorno = True + Catch ex As Exception + OnError("Ocurrió un error al actualizar el flete.", ex, SqlAdapter.SelectCommand.Parameters.ParametrosInfo()) + End Try + Return Retorno + End Function + + + + Public Function UpdateImportacionCierre(CveImportacion As Integer, CveEmpresa As Integer, CveUsuario As Integer) As Boolean + Dim Retorno As Boolean = False + DataAdapter("PA_Inv_ImportacionCierreUpdate") + With SqlAdapter.SelectCommand.Parameters + .Add("@CveImportacion", SqlDbType.Int).Value = CveImportacion + .Add("@CveEmpresa", SqlDbType.Int).Value = CveEmpresa + .Add("@CveUsuario", SqlDbType.Int).Value = CveUsuario + End With + Try + SqlAdapter.Fill(Data) + Retorno = True + Catch ex As Exception + OnError("Ocurrió un error al actualizar la importación.", ex, SqlAdapter.SelectCommand.Parameters.ParametrosInfo()) + End Try + Return Retorno + End Function + + + #End Region #Region " FLETES COMPRAS " diff --git a/Bancos/Creditos.aspx.vb b/Bancos/Creditos.aspx.vb index 6cf2c2d90..9ac8b328b 100644 --- a/Bancos/Creditos.aspx.vb +++ b/Bancos/Creditos.aspx.vb @@ -686,7 +686,7 @@ Partial Class Bancos_Creditos If TipoCreditoTemp = 2 AndAlso DdlCuentaDeposito.SelectedValue.ToEntero > 0 Then Folio = ObjCredito.GetNextFolio(DdlCuentaDeposito.SelectedValue.ToString.ToEntero, 8).ToString If Folio <> "" Then - CvePrePoliza = ObjMov.AddPrePolizas("Creditos", 2, 0, 0, 1, TxtFechaDeposito.Text.ToDate, "", UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa) + CvePrePoliza = ObjMov.AddPrePolizas("Creditos", 2, 0, 0, 1, TxtFechaDeposito.Text.ToDate, TxtCSReferencia.Text, UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa) CveIE = ObjCredito.AddBancos_IE(DdlCuentaDeposito.SelectedValue.ToString.ToEntero, 8, TxtFechaDeposito.Text.ToDate, Folio, LtBancoDeposito.Text, TxtCSTotalCredito.Text.ToString.ToDouble, 1, 1, "Credito Revolvente", "", True, False, 0, CvePrePoliza, "", UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa) If CveIE < 0 Then @@ -695,7 +695,7 @@ Partial Class Bancos_Creditos 'If Not ObjMov.AddPrePolizasDetalle(CvePrePoliza, False, TxtCSTotalCredito.Text.ToString.ToDouble, "Crédito", 50, "", Now, 0, -1, CveIE, ImporteMX:=TxtCSTotalCredito.Text.ToString.ToDouble) Then ' ErrorCredito = True 'End If - If Not ObjMov.AddPrePolizasDetalle(CvePrePoliza, True, TxtCSTotalCredito.Text.ToDecimal, "Crédito", 30, "", Now, 0, -1, CveIE, ImporteMX:=TxtCSTotalCredito.Text.ToDecimal) Then + If Not ObjMov.AddPrePolizasDetalle(CvePrePoliza, False, TxtCSTotalCredito.Text.ToDecimal, "Crédito", 30, "", Now, 0, -1, CveIE, ImporteMX:=TxtCSTotalCredito.Text.ToDecimal) Then ErrorCredito = True End If Else @@ -715,7 +715,7 @@ Partial Class Bancos_Creditos If CveIE < 0 Then ErrorCredito = True End If - If Not ObjMov.AddPrePolizasDetalle(CvePrePoliza, False, TxtCSTotalCredito.Text.ToDecimal, "Crédito", 30, "", Now, 0, -1, CveIE, ImporteMX:=TxtCSTotalCredito.Text.ToDecimal) Then + If Not ObjMov.AddPrePolizasDetalle(CvePrePoliza, True, TxtCSTotalCredito.Text.ToDecimal, "Crédito", 30, "", Now, 0, -1, CveIE, ImporteMX:=TxtCSTotalCredito.Text.ToDecimal) Then ErrorCredito = True End If diff --git a/Compras/RepPagadoPeriodo.aspx.cs b/Compras/RepPagadoPeriodo.aspx.cs index 89e3b951d..8ea0e41bc 100644 --- a/Compras/RepPagadoPeriodo.aspx.cs +++ b/Compras/RepPagadoPeriodo.aspx.cs @@ -75,7 +75,7 @@ public partial class Compras_RepPagadoPeriodo : ClsPaginas txtFechaI.Text = $"01/{DateTime.Now.Month}/{DateTime.Now.Year}"; txtFechaF.Text = DateTime.Now.ToShortDateString(); - TxtFechaICompra.Text = $"01/01/{DateTime.Now.Year}"; + TxtFechaICompra.Text = MinFecha.ToShortDateString(); //'$"01/01/{DateTime.Now.Year}"; TxtFechaFCompra.Text = DateTime.Now.ToShortDateString(); //Carga Proyectos diff --git a/Compras/eFacturas.aspx.vb b/Compras/eFacturas.aspx.vb index 19245c232..c9e7cd8d4 100644 --- a/Compras/eFacturas.aspx.vb +++ b/Compras/eFacturas.aspx.vb @@ -2918,6 +2918,9 @@ Partial Class Compras_eFacturas Dim FechaPago As Date Dim PagosCantidad As Integer = 0 + Dim UUIDDuplicados As String = "" + Dim ListaUUIDDuplicados As New List(Of String) + DTGVPagosVinculacion = New DataTable MontoPago = 0D ComprasEnComplemento = 0 @@ -3067,6 +3070,25 @@ Partial Class Compras_eFacturas Next Next + + + Dim UUIDDuplicadosEnu = From row In DTDocumentosRelacionados.AsEnumerable() + Let IdDocumento = row.Field(Of String)("IdDocumento") + Group row By IdDocumento Into IdDocumentos = Group + Where IdDocumentos.Count() > 1 + Select IdDocumentos + + For Each UUIDDuplicadosRows In UUIDDuplicadosEnu + For Each row In UUIDDuplicadosRows + If Not ListaUUIDDuplicados.Contains(row.Field(Of String)("IdDocumento")) Then + UUIDDuplicados = $"{UUIDDuplicados} {If(ListaUUIDDuplicados.Count > 0, "
", "") } {row.Field(Of String)("IdDocumento")}" + ListaUUIDDuplicados.Add(row.Field(Of String)("IdDocumento")) + End If + Next + Next + + + MontoPago = Monto Dim ObjCompraFolios As New ClsCompras @@ -3253,7 +3275,7 @@ Partial Class Compras_eFacturas If Math.Abs(DiferenciaImportes) > 5 Then TextoDiferenciaImporte = $"  -   IE ${ImporteIES.FormatoNumero}
Diferencia { DiferenciaImportes.FormatoNumero() }
" BtnVincularPago.Visible = False - MSGComplemento = MSGComplemento & $" Existe una diferencia mayor a $5.00 ({Math.Abs(DiferenciaImportes)})" + MSGComplemento = MSGComplemento & $" Existe una diferencia mayor a $5.00 ({Math.Abs(DiferenciaImportes).ToString("###,###,###.00")})" If TieneRegistros AndAlso UsuarioActual.TienePermisoProceso(286) Then DivVincularPagoManualmente.Visible = True @@ -3285,9 +3307,20 @@ Partial Class Compras_eFacturas LblDiferencia.Text = If(DiferenciaImportes <> 0 And ImporteIES > 0, DiferenciaImportes.FormatoNumero, "") - If MSGComplemento.Trim.Length > 0 And CveComplementoPagoCompra <= 0 Then - LblMensajeComlementoError.Text = MSGComplemento - DVMensajecomplementoError.Visible = True + If MSGComplemento.Trim.Length > 0 And CveComplementoPagoCompra <= 0 Or ListaUUIDDuplicados.Count > 0 And CveComplementoPagoCompra <= 0 Then + + If ListaUUIDDuplicados.Count > 0 Then + + LblMensajeComlementoError.Text = $"Las siguientes UUID se encuentran duplicadas:
{UUIDDuplicados}
{MSGComplemento}" + '
+ DVMensajecomplementoError.Visible = True + + Else + LblMensajeComlementoError.Text = MSGComplemento + DVMensajecomplementoError.Visible = True + End If + + Else LblMensajeComlementoError.Text = "" diff --git a/Inventarios/Consignaciones.aspx.vb b/Inventarios/Consignaciones.aspx.vb index 47b74bd96..503e5dd85 100644 --- a/Inventarios/Consignaciones.aspx.vb +++ b/Inventarios/Consignaciones.aspx.vb @@ -879,9 +879,48 @@ Partial Class Inventarios_Consignaciones TextoError = "Ocurrió un Error al guardar los movimientos" Exit For Else - MovimientosRealizados += 1 + + + Dim ImportePrePoliza As Decimal = Gvr.DataKey("PU").ToString.ToDecimal * Gvr.FCTextBox("TxtCantidadDevolucion").Text.ToString.ToDecimal + + Dim MovAlmacen As Boolean = True + + Dim OrigenMov As Integer = GlobalDTInvConceptos.FiltroPrimeroValor("Origen", "CveConcepto = " & ConceptoDevolucion).ToEntero + + If OrigenMov = 1 Then + MovAlmacen = True + Else + MovAlmacen = False + End If + + Dim ObjConta As New ClsContabilidad(ObjInventario.IniciaTransacSQL) + + Dim Concepto As String = "Consig" + Dim CvePrePoliza = ObjConta.AddPrePolizas("Consig", 74, ImportePrePoliza, ImportePrePoliza, 1, Fecha, Concepto, UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa) + + If Not ObjConta.AddPrePolizasDetalle(CvePrePoliza, Not MovAlmacen, ImportePrePoliza, "Consig", 68, "Consig", Fecha, -1, -1, CveVenta:=-1, CveMovimientoAlmacen:=CveMovimiento, ImporteMX:=ImportePrePoliza, CveSubProyecto:=-1, Contabilizable:=False) Then + ErrorMovInv = True + End If + + If Not ObjConta.AddPrePolizasDetalle(CvePrePoliza, MovAlmacen, ImportePrePoliza, "Consig", 337, "Consig", Fecha, -1, -1, CveVenta:=-1, CveMovimientoAlmacen:=CveMovimiento, ImporteMX:=ImportePrePoliza, Contabilizable:=False) Then + ErrorMovInv = True + End If + + If ObjConta.ValidacionPrePolizaCuadre(CvePrePoliza, 6) Then + If ObjConta.ValorPolizaDescuadre > 0 Then + GuardaLogAD($"Consig | Error:{ObjConta.MensajePolizaDescuadre} Diferencia:{ObjConta.ValorDiferencia} | CvePrePoliza:{CvePrePoliza}", "LogPrePolizas") + ErrorMovInv = True + End If + End If + + If Not ErrorMovInv Then + MovimientosRealizados += 1 + End If + End If + + End If Next diff --git a/Inventarios/PaquetesArmadoDesarmado.aspx.vb b/Inventarios/PaquetesArmadoDesarmado.aspx.vb index 798390a5a..50ed63ce9 100644 --- a/Inventarios/PaquetesArmadoDesarmado.aspx.vb +++ b/Inventarios/PaquetesArmadoDesarmado.aspx.vb @@ -587,25 +587,45 @@ Partial Class Inventarios_PaquetesArmadoDesarmado End If End If - 'Dim Concepto As String = ConceptoPoliza - 'Dim CvePrePoliza = ObjConta.AddPrePolizas("RA-01", 74, DtCostos.SUM("Total"), DtCostos.SUM("Total"), 1, TxtFecha.Text.ToDate, ConceptoPoliza, UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa) + + Dim ImportePrePoliza As Decimal = 0D + + If ObjInventario.GetMovimientosDetalle(CveMovimientoEntrada, UsuarioActual.CveEmpresa) Then + ImportePrePoliza = ObjInventario.DtResultados.SUMD("Total") + End If + + + Dim MovAlmacen As Boolean = True + + Dim OrigenMov As Integer = GlobalDTInvConceptos.FiltroPrimeroValor("Origen", "CveConcepto = " & 19).ToEntero + + If OrigenMov = 1 Then + MovAlmacen = True + Else + MovAlmacen = False + End If + + Dim ObjConta As New ClsContabilidad(ObjInventario.IniciaTransacSQL) + + Dim Concepto As String = "ARMPAQ2" + Dim CvePrePoliza = ObjConta.AddPrePolizas("ARMPAQ1/ARMPAQ2", 74, ImportePrePoliza, ImportePrePoliza, 1, Fecha, Concepto, UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa) 'Dim tCveSubProyecto = GlobalDTAlmacen(UsuarioActual.CveEmpresa).FiltroPrimeroValor("CveSubProyecto", $"CveAlmacen={CveAlmacen}").ToEntero - 'If Not ObjConta.AddPrePolizasDetalle(CvePrePoliza, Not MovAlmacen, ValorInventario, Concepto, 68, Concepto, TxtFecha.Text.ToDate, IdCtaContable, -1, CveVenta:=CveVenta, CveMovimientoAlmacen:=CveMovimientoEntrada, ImporteMX:=ValorInventario, CveSubProyecto:=tCveSubProyecto, Contabilizable:=EsContabilizable) Then - ' Retorno = False - 'End If + If Not ObjConta.AddPrePolizasDetalle(CvePrePoliza, Not MovAlmacen, ImportePrePoliza, "ARMPAQ2", 68, "ARMPAQ2", Fecha, -1, -1, CveVenta:=-1, CveMovimientoAlmacen:=CveMovimientoEntrada, ImporteMX:=ImportePrePoliza, CveSubProyecto:=-1, Contabilizable:=True) Then + TieneError = True + End If - 'If Not ObjConta.AddPrePolizasDetalle(CvePrePoliza, MovAlmacen, ValorInventario, Concepto, 68, Concepto, TxtFecha.Text.ToDate, IdCtaContable, -1, CveVenta:=CveVenta, CveMovimientoAlmacen:=CveMovimientoSalida, ImporteMX:=ValorInventario, Contabilizable:=If(CveTipoCompra = 10, False, EsContabilizable)) Then - ' Retorno = False - 'End If + If Not ObjConta.AddPrePolizasDetalle(CvePrePoliza, MovAlmacen, ImportePrePoliza, "ARMPAQ1", 68, "ARMPAQ1", Fecha, -1, -1, CveVenta:=-1, CveMovimientoAlmacen:=CveMovimientoSalida, ImporteMX:=ImportePrePoliza, Contabilizable:=True) Then + TieneError = True + End If - 'If ObjConta.ValidacionPrePolizaCuadre(CvePrePoliza, 6) Then - ' If ObjConta.ValorPolizaDescuadre > 0 Then - ' GuardaLogAD($"Inventarios/RecepcionAlmacen-PPCompOC | Error:{ObjConta.MensajePolizaDescuadre} Diferencia:{ObjConta.ValorDiferencia} | CvePrePoliza:{CvePrePoliza}", "LogPrePolizas") - ' Retorno = False - ' End If - 'End If + If ObjConta.ValidacionPrePolizaCuadre(CvePrePoliza, 6) Then + If ObjConta.ValorPolizaDescuadre > 0 Then + GuardaLogAD($"Inventarios/RecepcionAlmacen-PPCompOC | Error:{ObjConta.MensajePolizaDescuadre} Diferencia:{ObjConta.ValorDiferencia} | CvePrePoliza:{CvePrePoliza}", "LogPrePolizas") + TieneError = True + End If + End If Case 2 'DESARMADO @@ -688,6 +708,49 @@ Partial Class Inventarios_PaquetesArmadoDesarmado End If End If + + + + + Dim ImportePrePoliza As Decimal = 0D + + If ObjInventario.GetMovimientosDetalle(CveMovimientoEntrada, UsuarioActual.CveEmpresa) Then + ImportePrePoliza = ObjInventario.DtResultados.SUMD("Total") + End If + + + Dim MovAlmacen As Boolean = True + + Dim OrigenMov As Integer = GlobalDTInvConceptos.FiltroPrimeroValor("Origen", "CveConcepto = " & 4).ToEntero + + If OrigenMov = 1 Then + MovAlmacen = True + Else + MovAlmacen = False + End If + + Dim ObjConta As New ClsContabilidad(ObjInventario.IniciaTransacSQL) + + Dim Concepto As String = "ARMPAQ2" + Dim CvePrePoliza = ObjConta.AddPrePolizas("ARMPAQ1/ARMPAQ2", 74, ImportePrePoliza, ImportePrePoliza, 1, Fecha, Concepto, UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa) + 'Dim tCveSubProyecto = GlobalDTAlmacen(UsuarioActual.CveEmpresa).FiltroPrimeroValor("CveSubProyecto", $"CveAlmacen={CveAlmacen}").ToEntero + + If Not ObjConta.AddPrePolizasDetalle(CvePrePoliza, Not MovAlmacen, ImportePrePoliza, "ARMPAQ4", 68, "ARMPAQ4", Fecha, -1, -1, CveVenta:=-1, CveMovimientoAlmacen:=CveMovimientoEntrada, ImporteMX:=ImportePrePoliza, CveSubProyecto:=-1, Contabilizable:=True) Then + TieneError = True + End If + + If Not ObjConta.AddPrePolizasDetalle(CvePrePoliza, MovAlmacen, ImportePrePoliza, "ARMPAQ3", 68, "ARMPAQ3", Fecha, -1, -1, CveVenta:=-1, CveMovimientoAlmacen:=CveMovimientoSalida, ImporteMX:=ImportePrePoliza, Contabilizable:=True) Then + TieneError = True + End If + + + If ObjConta.ValidacionPrePolizaCuadre(CvePrePoliza, 6) Then + If ObjConta.ValorPolizaDescuadre > 0 Then + GuardaLogAD($"Inventarios/RecepcionAlmacen-PPCompOC | Error:{ObjConta.MensajePolizaDescuadre} Diferencia:{ObjConta.ValorDiferencia} | CvePrePoliza:{CvePrePoliza}", "LogPrePolizas") + TieneError = True + End If + End If + End Select diff --git a/Inventarios/RecepcionAlmacen.aspx.vb b/Inventarios/RecepcionAlmacen.aspx.vb index 246846c89..194b19186 100644 --- a/Inventarios/RecepcionAlmacen.aspx.vb +++ b/Inventarios/RecepcionAlmacen.aspx.vb @@ -434,6 +434,42 @@ Partial Class Inventarios_RecepcionAlmacen End Set End Property + + + Private Property CveImportacionSeleccionada As Integer + Get + + If ViewState("CveImportacionSeleccionada") Is Nothing Then + ViewState("CveImportacionSeleccionada") = -1 + End If + + Return ViewState("CveImportacionSeleccionada").ToString.ToEntero + + End Get + Set(value As Integer) + ViewState("CveImportacionSeleccionada") = value + End Set + End Property + + + + Private Property CveFleteSeleccionado As Integer + Get + + If ViewState("CveFleteSeleccionado") Is Nothing Then + ViewState("CveFleteSeleccionado") = -1 + End If + + Return ViewState("CveFleteSeleccionado").ToString.ToEntero + + End Get + Set(value As Integer) + ViewState("CveFleteSeleccionado") = value + End Set + End Property + + + #End Region Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load @@ -921,6 +957,9 @@ Partial Class Inventarios_RecepcionAlmacen UpDatosCompra.Update() + CveImportacionSeleccionada = -1 + CveFleteSeleccionado = -1 + If TxtOC.Text <> "" Then LtDocumento.Text = "ORDEN DE COMPRA" CargaOC() @@ -1242,6 +1281,11 @@ Partial Class Inventarios_RecepcionAlmacen CreaDtLoteDetalle() CreaDTInv(ObjInventario.DtResultados) BtnGuardar.Visible = True + + If ObjInventario.DtResultados IsNot Nothing AndAlso ObjInventario.DtResultados.Rows.Count > 0 Then + CveImportacionSeleccionada = DdlFolioImportacion.SelectedValue.ToEntero + End If + End If If DtInv Is Nothing OrElse DtInv.Rows.Count = 0 Then @@ -1298,6 +1342,10 @@ Partial Class Inventarios_RecepcionAlmacen CreaDtLoteDetalle() CreaDTInv(ObjInventario.DtResultados) BtnGuardar.Visible = True + If ObjInventario.DtResultados IsNot Nothing AndAlso ObjInventario.DtResultados.Rows.Count > 0 Then + CveFleteSeleccionado = DdlFletes.SelectedValue.ToEntero + End If + End If If DtInv Is Nothing OrElse DtInv.Rows.Count = 0 Then @@ -3753,6 +3801,8 @@ Partial Class Inventarios_RecepcionAlmacen ErrorMovInv = True End Try + + 'FINAL If Not ErrorMovInv Then ObjInventario.Commit() ' aplica los movimientos insertados @@ -4099,6 +4149,22 @@ Partial Class Inventarios_RecepcionAlmacen End If + If Not ErrorMovInv AndAlso CveImportacionSeleccionada > 0 Then + + If Not ObjInventario.UpdateImportacionCierre(CveImportacionSeleccionada, UsuarioActual.CveEmpresa, UsuarioActual.CveUsuario) Then + ErrorMovInv = True + End If + + End If + + + If Not ErrorMovInv AndAlso CveFleteSeleccionado > 0 Then + If Not ObjInventario.UpdateFleteCierre(CveFleteSeleccionado, UsuarioActual.CveEmpresa, UsuarioActual.CveUsuario) Then + ErrorMovInv = True + End If + End If + + 'FINAL If Not ErrorMovInv Then ObjInventario.Commit() ' aplica los movimientos insertados diff --git a/Ventas/RepProductosServiciosPeriodo.aspx.cs b/Ventas/RepProductosServiciosPeriodo.aspx.cs index 289d37253..4cc6b18e7 100644 --- a/Ventas/RepProductosServiciosPeriodo.aspx.cs +++ b/Ventas/RepProductosServiciosPeriodo.aspx.cs @@ -398,9 +398,9 @@ public partial class Ventas_RepProductosServiciosPeriodo : ClsPaginas { string moneda = DbRow["Moneda"].ToString(); string total = DbRow["GPO"].ToString(); - if (total != "Total Pesos") + if (total != "Total Peso Mexicano") { - if (moneda == "Pesos") + if (moneda == "Peso Mexicano") { Info = String.Format("{2}['{1}',{0}],", DbRow[ColValue], DbRow[ColTitle], Info); }