diff --git a/AF/OrdenServicio.aspx b/AF/OrdenServicio.aspx
new file mode 100644
index 000000000..36780ba5a
--- /dev/null
+++ b/AF/OrdenServicio.aspx
@@ -0,0 +1,384 @@
+<%@ Page Title="" Language="VB" MasterPageFile="~/Site.master" AutoEventWireup="false" CodeFile="OrdenServicio.aspx.vb" Inherits="AF_OrdenServicio" EnableEventValidation = "false" %>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Registro Revisión
+
+
+
+
+
+
+
+
+
+
+
+
+
+<%--
+
+
+
+
+
+
+
+
+
+
+
+
Fecha:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
--%>
+
+
+
+
+
+
+
+
+
+
+
+ <%--
+
+
+
+
+ --%>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Metricas guardadas correctamente.
+
+ Descarga Reporte Excel
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/AF/OrdenServicio.aspx.vb b/AF/OrdenServicio.aspx.vb
new file mode 100644
index 000000000..f95760d7e
--- /dev/null
+++ b/AF/OrdenServicio.aspx.vb
@@ -0,0 +1,437 @@
+Option Explicit On
+Option Strict On
+
+Imports System.Data
+Imports System.IO
+Imports Extensiones
+Imports GemBox.Spreadsheet
+Imports Microsoft.Reporting.WebForms
+
+Partial Class AF_OrdenServicio
+ Inherits ClsPaginas
+
+#Region " PROPIEDADES"
+
+ Property DT_Cabeceras As DataTable
+ Get
+
+ If ViewState("DT_Cabeceras") Is Nothing Then
+
+ Return New DataTable
+ Else
+ Return DirectCast(ViewState("DT_Cabeceras"), DataTable)
+ End If
+
+ End Get
+ Set(value As DataTable)
+ ViewState("DT_Cabeceras") = value
+ End Set
+ End Property
+
+
+ Property DT_Datos As DataTable
+ Get
+
+ If ViewState("DT_Datos") Is Nothing Then
+ Return New DataTable
+ Else
+ Return DirectCast(ViewState("DT_Datos"), DataTable)
+ End If
+
+ End Get
+ Set(value As DataTable)
+ ViewState("DT_Datos") = value
+ End Set
+ End Property
+
+
+ Property ReporteBytes As Byte()
+ Get
+ If ViewState("ReporteBytes") Is Nothing Then
+ Return Nothing
+ Else
+ Return DirectCast(ViewState("ReporteBytes"), Byte())
+ End If
+ End Get
+ Set(value As Byte())
+ ViewState("ReporteBytes") = value
+ End Set
+ End Property
+
+#End Region
+
+ Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
+ If Not Page.IsPostBack Then
+
+ CargaCombos()
+ 'CargaDatos()
+
+
+ TxtFecha.Text = $"{Now.Day.ToString("00")}/{Now.Month.ToString("00")}/{Now.Year}"
+
+ End If
+ End Sub
+
+
+#Region " CARGA PARAMETROS "
+
+#End Region
+
+#Region " CARGA COMBOS "
+ Protected Sub CargaCombos()
+ CargarCentrosDeCosto(Nothing, DdlSubProyecto, Nothing, LblSubProyecto)
+ LblSubProyecto2.Text = LblSubProyecto.Text
+
+
+
+
+
+ End Sub
+
+
+#End Region
+
+#Region " CARGA DATOS "
+ 'Protected Sub BtnFiltrar_Click(sender As Object, e As EventArgs)
+ ' CargaDatos()
+
+ 'End Sub
+
+
+#End Region
+
+#Region " GV DATOS "
+
+ Private Sub CargaDatos()
+
+ Dim ObjAF As New ClsAF
+
+ If ObjAF.GetMetricasRegistro(DdlSubProyecto.SelectedValue.ToEntero, UsuarioActual.CveEmpresa, TxtFecha.Text.ToDate) Then
+ DT_Cabeceras = ObjAF.DSResultados.Tables(0)
+ DT_Datos = ObjAF.DSResultados.Tables(1)
+
+
+ If DT_Cabeceras.Rows.Count > 0 AndAlso DT_Datos.Rows.Count > 0 Then
+ BtnGuardar.Visible = True
+ Else
+ BtnGuardar.Visible = False
+ GvDatos.DataSource = Nothing
+ GvDatos.DataBind()
+ End If
+
+ Else
+ GvDatos.DataSource = Nothing
+ GvDatos.DataBind()
+ BtnGuardar.Visible = False
+ End If
+
+ ObjAF.Dispose()
+
+ If DT_Datos.Rows.Count > 0 Then
+ CargaTablas()
+ End If
+
+ UpGuardar.Update()
+ UpDatos.Update()
+
+ End Sub
+
+ Private Sub CargaTablas()
+
+ Dim IDX_LIMPIAR As Integer = 1
+
+ For IDX_LIMPIAR = 1 To 15
+ GvDatos.Columns(IDX_LIMPIAR).HeaderText = ""
+ GvDatos.Columns(IDX_LIMPIAR).Visible = False
+ Next
+
+ Dim x As Integer = 0
+ Dim limite As Integer = DT_Cabeceras.Rows.Count - 1
+
+
+ For x = 0 To limite
+ GvDatos.Columns(x + 1).HeaderText = DT_Cabeceras.Rows(x)("Metrica").ToString
+ GvDatos.Columns(x + 1).Visible = True
+ Next x
+
+
+ GvDatos.DataSource = DT_Datos
+ GvDatos.DataBind()
+
+
+
+
+ End Sub
+
+
+ Protected Sub GvDatos_RowDataBound(sender As Object, e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GvDatos.RowDataBound
+
+ If e.Row.RowType = DataControlRowType.DataRow Then
+
+ e.Row.FCDropDownList("DdlPersonal").DataSource = GlobalDTRHPersonal(UsuarioActual.CveEmpresa).FiltraParametros("CveEstatusPersonal = 1")
+ e.Row.FCDropDownList("DdlPersonal").DataBind()
+ e.Row.FCDropDownList("DdlPersonal").Items.Insert(0, New ListItem("Selecione uno", "-1"))
+
+ e.Row.FCDropDownList("DdlPersonal").SelectedValueExist(e.Row.DataKey("CvePersonaResponsable"))
+
+ End If
+
+ End Sub
+
+#End Region
+
+ Protected Sub LnkEliminarMetricaValor_Click(sender As Object, e As EventArgs)
+
+ End Sub
+
+ Protected Sub DdlSubProyecto_SelectedIndexChanged(sender As Object, e As EventArgs)
+
+ If DdlSubProyecto.SelectedValue.ToEntero > 0 Then
+ CargaDatos()
+
+ Else
+ GvDatos.DataSource = Nothing
+ GvDatos.DataBind()
+
+ UpDatos.Update()
+
+ End If
+
+ End Sub
+ Protected Sub BtnGuardar_Click(sender As Object, e As EventArgs)
+
+
+ Dim ObjAF As New ClsAF
+ Dim limite As Integer = DT_Cabeceras.Rows.Count - 1
+
+ ObjAF.IniciaTransacSQL()
+
+ Dim ErrorProceso As Boolean = False
+
+ For Each GvRow As GridViewRow In GvDatos.Rows
+ If GvRow.RowType = DataControlRowType.DataRow Then
+
+ Dim DdlPersonal As DropDownList = GvRow.FCDropDownList("DdlPersonal")
+
+ If DdlPersonal.SelectedValue.ToEntero <= 0 Then
+ Alert($"unidad: {GvRow.DataKey("Unidad")} require personal", TipoMensaje.MsgAdvertencia)
+
+ ErrorProceso = True
+ Exit For
+ End If
+
+ If ObjAF.AddMetricasValores(GvRow.DataKey("CveActivoFijo").ToEntero, DdlPersonal.SelectedValue.ToEntero, UsuarioActual.CveUsuario, DdlSubProyecto.SelectedValue.ToEntero, TxtFecha.Text.ToDate, UsuarioActual.CveEmpresa) Then
+
+ Dim CveMetricaValor As Integer = ObjAF.CveMetricaValor
+ Dim x As Integer = 0
+
+ For x = 0 To limite
+ Dim valor As Decimal = GvRow.FCTextBox($"TxtMetrica{x + 1}").Text.ToDecimal
+
+ ' valor = If(valor.Trim.Length = 0, "0", valor)
+ If ObjAF.AddMetricasValoresDetalle(CveMetricaValor, DT_Cabeceras(x)("CveMetrica").ToString.ToEntero, valor) Then
+ ErrorProceso = False
+ Else
+ ErrorProceso = True
+ Exit For
+ End If
+ Next x
+
+ If ErrorProceso Then
+ Exit For
+ End If
+
+ Else
+ ErrorProceso = True
+ Exit For
+ End If
+ End If
+
+ Next
+
+
+ If Not ErrorProceso Then
+
+ ObjAF.Commit()
+ ExportToExcelG(GvDatos, $"RegistroRevision{Now.ToString("yyyyMMddmmss")}", UsuarioActual, "ReporteRevision", 100, 100, filtros:=$"Filtros {LblSubProyecto.Text}: {DdlSubProyecto.SelectedItem.Text} Fecha: {TxtFecha.Text}")
+ RegistraScript("$('#ModalDescargaReporte').modal({ backdrop: 'static', keyboard: false });")
+ GvDatos.DataSource = Nothing
+ GvDatos.DataBind()
+
+ BtnGuardar.Visible = False
+
+ UpDatos.Update()
+ UpGuardar.Update()
+
+ Else
+ ObjAF.RollBack()
+ End If
+
+ ObjAF.Dispose()
+
+ End Sub
+
+
+
+
+#Region "DESCARGA EXCEL"
+
+ Public Sub ExportToExcelG(Gv1 As GridView, NombreArchivoXLSx As String, Usuario As Usuario, Titulo As String, Optional AlturaImagen As Double = 100, Optional AnchoImagen As Double = 100, Optional filtros As String = "")
+
+
+
+ For Each GvRow As GridViewRow In Gv1.Rows
+
+ Dim IDX_LIMPIAR As Integer = 1
+
+ For IDX_LIMPIAR = 1 To 15
+ GvRow.Cells(IDX_LIMPIAR).Text = GvRow.FCTextBox($"TxtMetrica{IDX_LIMPIAR}").Text
+ Next
+
+ If GvRow.FCDropDownList("DDLPersonal").SelectedValue.ToEntero > 0 Then
+ GvRow.Cells(16).Text = GvRow.FCDropDownList("DDLPersonal").SelectedItem.Text
+ Else
+ GvRow.Cells(16).Text = ""
+ End If
+
+ Next
+
+
+
+ Dim sw1 As New StringWriter()
+ Dim htw1 As New HtmlTextWriter(sw1)
+ Gv1.RenderControl(htw1)
+
+ Dim options = GemBox.Spreadsheet.LoadOptions.HtmlDefault
+ Dim htmlStream1 = New MemoryStream(options.Encoding.GetBytes(sw1.ToString()))
+
+ htmlStream1.Position = 0
+ Dim sr1 As New StreamReader(htmlStream1)
+ Dim myStr1 = sr1.ReadToEnd()
+
+ sr1.Dispose()
+ htmlStream1.Dispose()
+ sw1.Dispose()
+
+ Dim HtmlCompleto As String = myStr1
+
+
+ HtmlCompleto = Regex.Replace(HtmlCompleto, "\<[\/]*a[^\>]*\>", "")
+
+ Dim asd As String = ""
+
+
+ Dim htmlStream5 = New MemoryStream(options.Encoding.GetBytes(HtmlCompleto))
+
+ GemBox.Spreadsheet.SpreadsheetInfo.SetLicense(SerialGemBoxSpreadsheet())
+
+ Dim excel As GemBox.Spreadsheet.ExcelFile
+
+ excel = GemBox.Spreadsheet.ExcelFile.Load(htmlStream5, options)
+
+ If Usuario IsNot Nothing Then
+ Dim TotalRowHeader As Integer = 8
+ Dim TotalRowFooter As Integer = 2
+
+ Dim worksheet = excel.Worksheets(0)
+ worksheet.Rows.InsertEmpty(0, TotalRowHeader)
+ Dim celdasConTexto = worksheet.GetUsedCellRange(True)
+ celdasConTexto.Style.Font.Name = "Calibri Light"
+
+ Dim RangoNombreEmpresa = worksheet.Cells.GetSubrangeAbsolute(1, celdasConTexto.FirstColumnIndex, 1, celdasConTexto.LastColumnIndex)
+ RangoNombreEmpresa.Merged = True
+ RangoNombreEmpresa.Value = Usuario.Empresa.Empresa
+ RangoNombreEmpresa.Style.Font.Size = 18 * 20
+ RangoNombreEmpresa.Style.Font.Name = "Calibri Light"
+ RangoNombreEmpresa.Style.HorizontalAlignment = GemBox.Spreadsheet.HorizontalAlignmentStyle.Center
+ RangoNombreEmpresa.Style.VerticalAlignment = GemBox.Spreadsheet.VerticalAlignmentStyle.Center
+
+
+ Dim RangoFiltros = worksheet.Cells.GetSubrangeAbsolute(6, celdasConTexto.FirstColumnIndex, 6, celdasConTexto.LastColumnIndex)
+ RangoFiltros.Merged = True
+ RangoFiltros.Value = filtros
+ RangoFiltros.Style.Font.Size = 15 * 20
+ RangoFiltros.Style.Font.Name = "Calibri Light"
+ RangoFiltros.Style.HorizontalAlignment = GemBox.Spreadsheet.HorizontalAlignmentStyle.Left
+ RangoFiltros.Style.VerticalAlignment = GemBox.Spreadsheet.VerticalAlignmentStyle.Center
+
+
+ Dim RangoTitulo = worksheet.Cells.GetSubrangeAbsolute(3, celdasConTexto.FirstColumnIndex, 3, celdasConTexto.LastColumnIndex)
+ RangoTitulo.Merged = True
+ RangoTitulo.Value = Titulo
+ RangoTitulo.Style.Font.Size = 20 * 20
+ RangoTitulo.Style.Font.Name = "Calibri Light"
+ RangoTitulo.Style.HorizontalAlignment = GemBox.Spreadsheet.HorizontalAlignmentStyle.Center
+ RangoTitulo.Style.VerticalAlignment = GemBox.Spreadsheet.VerticalAlignmentStyle.Center
+
+ For i = celdasConTexto.FirstColumnIndex To celdasConTexto.LastColumnIndex
+ worksheet.Rows(8).Cells(i).Style.Font.Size = 12 * 20
+ worksheet.Rows(8).Cells(i).Style.HorizontalAlignment = GemBox.Spreadsheet.HorizontalAlignmentStyle.Center
+ worksheet.Rows(8).Cells(i).Style.VerticalAlignment = GemBox.Spreadsheet.VerticalAlignmentStyle.Center
+
+ worksheet.Rows(8).Cells(i).Style.FillPattern.SetPattern(GemBox.Spreadsheet.FillPatternStyle.Solid, GemBox.Spreadsheet.SpreadsheetColor.FromArgb(75, 119, 190), GemBox.Spreadsheet.SpreadsheetColor.FromArgb(255, 255, 255))
+ worksheet.Rows(8).Cells(i).Style.Font.Color = GemBox.Spreadsheet.SpreadsheetColor.FromArgb(255, 255, 255)
+
+
+
+
+ If i > 0 Then
+ Try
+ worksheet.Columns(i).AutoFit(1)
+ Catch ex As Exception
+ End Try
+ End If
+
+ Next
+
+ Dim IndexEndTable As Integer = Gv1.Rows.Count + 4 + TotalRowHeader + TotalRowFooter
+
+ worksheet.Rows(IndexEndTable).Cells(0).Value = "Usuario Imprimió"
+ worksheet.Rows(IndexEndTable + 1).Cells(0).Value = Usuario.Nombre
+
+ worksheet.Rows(IndexEndTable).Cells(2).Value = "Fecha Impresión"
+ worksheet.Rows(IndexEndTable + 1).Cells(2).Value = DateTime.Now.ToString("dd/MM/yyyy")
+
+ Dim Imagen As New System.IO.FileInfo(String.Format("{0}/Logo.png", Usuario.Empresa.Ruta))
+
+ If Imagen.Exists Then
+ Dim Ruta As String = String.Format("{0}/Logo.png", Usuario.Empresa.Ruta)
+ Using sr As New StreamReader(Ruta)
+ Dim ms As New MemoryStream()
+ sr.BaseStream.CopyTo(ms)
+ worksheet.Pictures.Add(ms, ExcelPictureFormat.Png, "A1", AnchoImagen, AlturaImagen, LengthUnit.Pixel)
+ End Using
+ End If
+
+ End If
+
+
+
+
+ Dim memoryStream As New MemoryStream()
+ excel.Save(memoryStream, SaveOptions.XlsxDefault)
+ ReporteBytes = memoryStream.ToArray()
+ memoryStream.Dispose()
+
+ End Sub
+
+
+ Protected Sub LnkDescargaReporte_Click(sender As Object, e As EventArgs)
+
+
+ Response.ContentType = "application/force-download"
+ Response.AppendHeader("Content-Disposition", $"attachment;filename=RegistroRevision{Now.ToString("yyyyMMddmmss")}.xlsx")
+ Response.BinaryWrite(ReporteBytes)
+ Response.End()
+
+ End Sub
+
+
+ Public Overrides Sub VerifyRenderingInServerForm(ByVal control As Control)
+ End Sub
+
+#End Region
+
+
+
+End Class
diff --git a/AF/RegistroRevision.aspx b/AF/RegistroRevision.aspx
index 33ca39586..4df1a11fe 100644
--- a/AF/RegistroRevision.aspx
+++ b/AF/RegistroRevision.aspx
@@ -192,6 +192,7 @@
+
@@ -199,6 +200,7 @@
+
@@ -206,6 +208,7 @@
+
@@ -213,6 +216,7 @@
+
@@ -220,6 +224,7 @@
+
@@ -227,6 +232,7 @@
+
@@ -234,6 +240,7 @@
+
@@ -241,6 +248,7 @@
+
@@ -248,6 +256,7 @@
+
@@ -255,6 +264,7 @@
+
@@ -262,6 +272,7 @@
+
@@ -269,24 +280,28 @@
+
+
+
+
diff --git a/AF/RegistroRevision.aspx.vb b/AF/RegistroRevision.aspx.vb
index 239360a85..a7d770ea2 100644
--- a/AF/RegistroRevision.aspx.vb
+++ b/AF/RegistroRevision.aspx.vb
@@ -226,9 +226,9 @@ Partial Class AF_RegistroRevision
Dim x As Integer = 0
For x = 0 To limite
- Dim valor As String = GvRow.FCTextBox($"TxtMetrica{x + 1}").Text
+ Dim valor As Decimal = GvRow.FCTextBox($"TxtMetrica{x + 1}").Text.ToDecimal
- valor = If(valor.Trim.Length = 0, "0", valor)
+ ' valor = If(valor.Trim.Length = 0, "0", valor)
If ObjAF.AddMetricasValoresDetalle(CveMetricaValor, DT_Cabeceras(x)("CveMetrica").ToString.ToEntero, valor) Then
ErrorProceso = False
Else
diff --git a/Edoc/Contratos.aspx b/Edoc/Contratos.aspx
index b49544a0c..bc9e9b3c4 100644
--- a/Edoc/Contratos.aspx
+++ b/Edoc/Contratos.aspx
@@ -121,7 +121,7 @@