Compare commits

...

3 Commits

Author SHA1 Message Date
Jorge Luis caudillo esparza
5033fbbc06 documentos 2026-08-19 04:21:13 -07:00
Jorge Luis caudillo esparza
58af3ffece tramites 2026-08-19 03:23:04 -07:00
Jorge Luis caudillo esparza
4bea52c7ab -- 2026-08-18 18:52:00 -07:00
32 changed files with 4251 additions and 780 deletions

2
.gitignore vendored
View File

@@ -45,6 +45,8 @@ SIG.Web/App_Data/*.ldf
SIG.Web/App_Data/*.log
**/App_Data/log.txt
SIG.Web/App_Data/Temp/
SIG.Web/App_Data/Documentos/
SIG.Web/App_Data/Uploads/
# Herramientas y trabajo local de Codex

View File

@@ -45,9 +45,11 @@ namespace SIG.Web.AppCode.Configuration
public static IUserAdministrationService UserAdministrationService { get; private set; }
public static IGeneralCatalogRepository GeneralCatalogRepository { get; private set; }
public static IClienteDocumentoService ClienteDocumentoService { get; private set; }
public static ITramiteDocumentoService TramiteDocumentoService { get; private set; }
public static IFraccionamientoService FraccionamientoService { get; private set; }
public static IFraccionamientoGisService FraccionamientoGisService { get; private set; }
public static ITramiteCatalogService TramiteCatalogService { get; private set; }
public static ITramiteSolicitudService TramiteSolicitudService { get; private set; }
public static ICfdiTimbradoService CfdiTimbradoService { get; private set; }
public static IPublicRegistrationService PublicRegistrationService { get; private set; }
public static ILoginAttemptRepository LoginAttemptRepository { get; private set; }
@@ -90,8 +92,22 @@ namespace SIG.Web.AppCode.Configuration
GeneralCatalogRepository = new GeneralCatalogRepository(DbExecutor);
ClienteDocumentoService = new ClienteDocumentoService(
new ClienteDocumentoRepository(DbExecutor));
ITramiteDocumentoRepository tramiteDocumentoRepository =
new TramiteDocumentoRepository(DbExecutor);
ITramiteDocumentoFileStore tramiteDocumentoFileStore =
new TramiteDocumentoFileStore();
TramiteDocumentoService = new TramiteDocumentoService(
tramiteDocumentoRepository,
tramiteDocumentoFileStore,
BitacoraService);
ITramiteSolicitudRepository tramiteSolicitudRepository =
new TramiteSolicitudRepository(DbExecutor);
FraccionamientoService = new FraccionamientoService(
new FraccionamientoRepository(DbExecutor),
tramiteSolicitudRepository,
BitacoraService);
IFraccionamientoGisRepository gisRepository =
@@ -101,10 +117,14 @@ namespace SIG.Web.AppCode.Configuration
FraccionamientoGisService = new FraccionamientoGisService(
gisRepository,
gisFileStore,
BitacoraService);
BitacoraService,
TramiteDocumentoService);
TramiteCatalogService = new TramiteCatalogService(
new TramiteCatalogRepository(DbExecutor),
BitacoraService);
TramiteSolicitudService = new TramiteSolicitudService(
tramiteSolicitudRepository,
BitacoraService);
CfdiTimbradoService = new CfdiTimbradoService(
new CfdiRepository(DbExecutor),
new ProfactCfdi40XmlBuilder(),

View File

@@ -0,0 +1,18 @@
using System.IO;
using SIG.Web.AppCode.Models.Documentos;
namespace SIG.Web.AppCode.Contracts.Documentos
{
public interface ITramiteDocumentoFileStore
{
TramiteDocumentoPreparedFile Prepare(
TramiteDocumentoUploadContextModel context,
Stream source,
string previousRelativePath);
void Promote(TramiteDocumentoPreparedFile preparedFile);
void Rollback(TramiteDocumentoPreparedFile preparedFile);
void Complete(TramiteDocumentoPreparedFile preparedFile);
Stream OpenRead(string relativePath);
}
}

View File

@@ -0,0 +1,63 @@
using System.Collections.Generic;
using SIG.Web.AppCode.Models.Common;
using SIG.Web.AppCode.Models.Documentos;
namespace SIG.Web.AppCode.Contracts.Documentos
{
public interface ITramiteDocumentoRepository
{
DbResult<List<TramiteDocumentoSolicitudModel>> ListForDevelopment(
int developmentId,
int? stageId,
int? procedureTypeId,
int executingUser,
string domainName);
DbResult<TramiteDocumentoUploadContextModel> GetUploadContext(
int developmentId,
int requestId,
int documentTypeId,
int executingUser,
string domainName);
DbResult<TramiteDocumentoUploadContextModel> GetStageUploadContext(
int stageId,
int procedureTypeId,
int documentTypeId,
int executingUser,
string domainName);
DbResult<TramiteDocumentoSaveResultModel> SaveUpload(
int developmentId,
int requestId,
int documentTypeId,
string originalFileName,
string physicalFileName,
string relativePath,
string contentType,
long contentLength,
string clientComment,
int executingUser,
string domainName);
DbResult<TramiteDocumentoReviewResultModel> Review(
int developmentId,
int documentRequestId,
bool approved,
string note,
int executingUser,
string domainName);
DbResult<TramiteDocumentoDownloadContextModel> GetDownloadContext(
int developmentId,
int documentRequestId,
int executingUser,
string domainName);
DbResult<TramiteDocumentoDeleteResultModel> Delete(
int developmentId,
int documentRequestId,
int executingUser,
string domainName);
}
}

View File

@@ -0,0 +1,69 @@
using System.Collections.Generic;
using System.IO;
using SIG.Web.AppCode.Models.Common;
using SIG.Web.AppCode.Models.Documentos;
namespace SIG.Web.AppCode.Contracts.Documentos
{
public interface ITramiteDocumentoService
{
DbResult<List<TramiteDocumentoSolicitudModel>> ListForDevelopment(
int developmentId,
int? stageId,
int? procedureTypeId,
int executingUser,
string domainName);
DbResult<TramiteDocumentoUploadContextModel> GetUploadContext(
int developmentId,
int requestId,
int documentTypeId,
int executingUser,
string domainName);
DbResult<TramiteDocumentoSaveResultModel> Upload(
int developmentId,
int requestId,
int documentTypeId,
string originalFileName,
string contentType,
Stream content,
long contentLength,
string clientComment,
int executingUser,
string domainName);
DbResult<TramiteDocumentoReviewResultModel> Review(
int developmentId,
int documentRequestId,
bool approved,
string note,
int executingUser,
string domainName);
DbResult<TramiteDocumentoFileModel> Open(
int developmentId,
int documentRequestId,
int executingUser,
string domainName);
DbResult<TramiteDocumentoSaveResultModel> RegisterExternalStageFile(
int stageId,
int procedureTypeId,
int documentTypeId,
string originalFileName,
string physicalFileName,
string relativePath,
string contentType,
long contentLength,
int executingUser,
string domainName);
DbResult<bool> RemoveExternalStageFile(
int stageId,
int procedureTypeId,
int documentTypeId,
int executingUser,
string domainName);
}
}

View File

@@ -0,0 +1,38 @@
using System.Collections.Generic;
using SIG.Web.AppCode.Models.Common;
using SIG.Web.AppCode.Models.Tramites;
namespace SIG.Web.AppCode.Contracts.Tramites
{
public interface ITramiteSolicitudRepository
{
DbResult<int> EnsureStageRequest(
int stageId,
int procedureTypeId,
int executingUser,
string domainName);
DbResult<List<TramiteSolicitudModel>> ListForDevelopment(
int developmentId,
int? stageId,
int? procedureTypeId,
int? statusId,
int executingUser,
string domainName);
DbResult<TramiteSolicitudModel> Get(
int requestId,
int executingUser,
string domainName);
DbResult<List<TramiteSolicitudEstatusOptionModel>> ListStatusOptions(
int executingUser,
string domainName);
DbResult<TramiteSolicitudStatusChangeModel> ChangeStatus(
int requestId,
int statusId,
int executingUser,
string domainName);
}
}

View File

@@ -0,0 +1,32 @@
using System.Collections.Generic;
using SIG.Web.AppCode.Models.Common;
using SIG.Web.AppCode.Models.Tramites;
namespace SIG.Web.AppCode.Contracts.Tramites
{
public interface ITramiteSolicitudService
{
DbResult<List<TramiteSolicitudModel>> ListForDevelopment(
int developmentId,
int? stageId,
int? procedureTypeId,
int? statusId,
int executingUser,
string domainName);
DbResult<TramiteSolicitudModel> Get(
int requestId,
int executingUser,
string domainName);
DbResult<List<TramiteSolicitudEstatusOptionModel>> ListStatusOptions(
int executingUser,
string domainName);
DbResult<TramiteSolicitudStatusChangeModel> ChangeStatus(
int requestId,
int statusId,
int executingUser,
string domainName);
}
}

View File

@@ -0,0 +1,129 @@
using System;
using System.Globalization;
using System.IO;
using System.Web;
using System.Web.SessionState;
using SIG.Web.AppCode.Configuration;
using SIG.Web.AppCode.Models.Common;
using SIG.Web.AppCode.Models.Documentos;
using SIG.Web.AppCode.Session;
namespace SIG.Web.Pages.Fraccionamientos
{
public sealed class TramiteDocumentoHandler
: IHttpHandler, IRequiresSessionState
{
public bool IsReusable
{
get { return false; }
}
public void ProcessRequest(HttpContext context)
{
UserSessionModel currentUser = GetCurrentUser();
if (currentUser == null)
{
context.Response.StatusCode = 401;
context.Response.ContentType = "text/plain";
context.Response.Write(
"Su sesión no está disponible. Inicie sesión nuevamente.");
return;
}
int developmentId;
int documentRequestId;
if (!TryReadInt(
context.Request.QueryString["fraccionamiento"],
out developmentId) ||
!TryReadInt(
context.Request.QueryString["documento"],
out documentRequestId))
{
context.Response.StatusCode = 400;
context.Response.ContentType = "text/plain";
context.Response.Write("El documento solicitado no es válido.");
return;
}
DbResult<TramiteDocumentoFileModel> result =
AppServices.TramiteDocumentoService.Open(
developmentId,
documentRequestId,
currentUser.CveUsuario,
currentUser.NombreDominio);
if (!result.Success ||
result.Data == null ||
result.Data.Content == null)
{
context.Response.StatusCode = 404;
context.Response.ContentType = "text/plain";
context.Response.Write(
result == null ||
string.IsNullOrWhiteSpace(result.UserMessage)
? "No se encontró el documento."
: result.UserMessage);
return;
}
TramiteDocumentoFileModel file = result.Data;
context.Response.Clear();
context.Response.ClearHeaders();
context.Response.TrySkipIisCustomErrors = true;
context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
context.Response.Cache.SetNoStore();
context.Response.ContentType =
string.IsNullOrWhiteSpace(file.ContentType)
? "application/octet-stream"
: file.ContentType;
context.Response.AddHeader(
"Content-Disposition",
"attachment; filename=\"" +
SanitizeFileName(file.NombreArchivo) +
"\"");
using (file.Content)
{
file.Content.CopyTo(context.Response.OutputStream);
}
context.ApplicationInstance.CompleteRequest();
}
private static UserSessionModel GetCurrentUser()
{
return AppServices.UserContext != null &&
AppServices.UserContext.IsAuthenticated()
? AppServices.UserContext.GetCurrentUser()
: null;
}
private static bool TryReadInt(
string value,
out int result)
{
return int.TryParse(
value,
NumberStyles.Integer,
CultureInfo.InvariantCulture,
out result) &&
result > 0;
}
private static string SanitizeFileName(string fileName)
{
string value = Path.GetFileName(
string.IsNullOrWhiteSpace(fileName)
? "documento"
: fileName);
return value
.Replace("\"", string.Empty)
.Replace("\r", string.Empty)
.Replace("\n", string.Empty);
}
}
}

View File

@@ -0,0 +1,171 @@
using System;
using System.IO;
namespace SIG.Web.AppCode.Models.Documentos
{
public sealed class TramiteDocumentoSolicitudModel
{
public int CveDocumentoSolicitud { get; set; }
public int CveSolicitud { get; set; }
public string Folio { get; set; }
public int CveCliente { get; set; }
public int CveFraccionamiento { get; set; }
public int CveFraccionamientoEtapa { get; set; }
public string Etapa { get; set; }
public int CveTipoTramite { get; set; }
public string TipoTramite { get; set; }
public int CveTipoDocumento { get; set; }
public string TipoDocumento { get; set; }
public string NombreArchivo { get; set; }
public string Nota { get; set; }
public bool? EsAprobado { get; set; }
public DateTime? FechaRevision { get; set; }
public bool EsFinalSolicitud { get; set; }
public bool TieneArchivo { get; set; }
public bool PuedeActualizarArchivo { get; set; }
public bool PuedeRevisar { get; set; }
public bool EsGis { get; set; }
public bool PuedeAdministrarGis { get; set; }
public string EstadoDocumento { get; set; }
}
public sealed class TramiteDocumentoUploadContextModel
{
public int CveDocumentoSolicitud { get; set; }
public int CveSolicitud { get; set; }
public string Folio { get; set; }
public int CveCliente { get; set; }
public int CveFraccionamiento { get; set; }
public int CveFraccionamientoEtapa { get; set; }
public string Etapa { get; set; }
public int CveTipoTramite { get; set; }
public string TipoTramite { get; set; }
public int CveTipoDocumento { get; set; }
public string TipoDocumento { get; set; }
public string ExtensionesPermitidas { get; set; }
public int? TamanoMaximoMb { get; set; }
public bool EsFinalSolicitud { get; set; }
public string NombreArchivoAnterior { get; set; }
public string NombreArchivoFisicoAnterior { get; set; }
public string RutaArchivoAnterior { get; set; }
public string ContentTypeAnterior { get; set; }
public long? TamanoBytesAnterior { get; set; }
public string ComentarioClienteAnterior { get; set; }
public string ComentarioAdministrativoAnterior { get; set; }
public bool? EsAprobadoAnterior { get; set; }
public int? CveUsuarioRevisaAnterior { get; set; }
public DateTime? FechaRevisionAnterior { get; set; }
}
public sealed class TramiteDocumentoSaveResultModel
{
public int CveDocumentoSolicitud { get; set; }
public int CveSolicitud { get; set; }
public string Folio { get; set; }
public int CveCliente { get; set; }
public int CveFraccionamiento { get; set; }
public int CveFraccionamientoEtapa { get; set; }
public string Etapa { get; set; }
public int CveTipoTramite { get; set; }
public string TipoTramite { get; set; }
public int CveTipoDocumento { get; set; }
public string TipoDocumento { get; set; }
public string NombreArchivo { get; set; }
public string NombreArchivoFisico { get; set; }
public string RutaArchivo { get; set; }
public string ContentType { get; set; }
public long? TamanoBytes { get; set; }
public string ComentarioCliente { get; set; }
public string ComentarioAdministrativo { get; set; }
public bool? EsAprobado { get; set; }
public int? CveUsuarioRevisa { get; set; }
public DateTime? FechaRevision { get; set; }
public bool EsNuevo { get; set; }
public string NombreArchivoAnterior { get; set; }
public string NombreArchivoFisicoAnterior { get; set; }
public string RutaArchivoAnterior { get; set; }
public string ContentTypeAnterior { get; set; }
public long? TamanoBytesAnterior { get; set; }
public string ComentarioClienteAnterior { get; set; }
public string ComentarioAdministrativoAnterior { get; set; }
public bool? EsAprobadoAnterior { get; set; }
public int? CveUsuarioRevisaAnterior { get; set; }
public DateTime? FechaRevisionAnterior { get; set; }
}
public sealed class TramiteDocumentoReviewResultModel
{
public int CveDocumentoSolicitud { get; set; }
public int CveSolicitud { get; set; }
public string Folio { get; set; }
public int CveCliente { get; set; }
public int CveFraccionamiento { get; set; }
public int CveFraccionamientoEtapa { get; set; }
public string Etapa { get; set; }
public int CveTipoTramite { get; set; }
public string TipoTramite { get; set; }
public int CveTipoDocumento { get; set; }
public string TipoDocumento { get; set; }
public string NombreArchivo { get; set; }
public bool? EsAprobadoAnterior { get; set; }
public string ComentarioAdministrativoAnterior { get; set; }
public int? CveUsuarioRevisaAnterior { get; set; }
public DateTime? FechaRevisionAnterior { get; set; }
public bool? EsAprobado { get; set; }
public string ComentarioAdministrativo { get; set; }
public int? CveUsuarioRevisa { get; set; }
public DateTime? FechaRevision { get; set; }
public bool HuboCambio { get; set; }
}
public sealed class TramiteDocumentoDeleteResultModel
{
public int CveDocumentoSolicitud { get; set; }
public int CveSolicitud { get; set; }
public string Folio { get; set; }
public int CveCliente { get; set; }
public int CveFraccionamiento { get; set; }
public int CveFraccionamientoEtapa { get; set; }
public string Etapa { get; set; }
public int CveTipoTramite { get; set; }
public string TipoTramite { get; set; }
public int CveTipoDocumento { get; set; }
public string TipoDocumento { get; set; }
public string NombreArchivo { get; set; }
public string NombreArchivoFisico { get; set; }
public string RutaArchivo { get; set; }
public string ContentType { get; set; }
public long? TamanoBytes { get; set; }
}
public sealed class TramiteDocumentoDownloadContextModel
{
public int CveDocumentoSolicitud { get; set; }
public int CveSolicitud { get; set; }
public int CveCliente { get; set; }
public int CveFraccionamiento { get; set; }
public int CveFraccionamientoEtapa { get; set; }
public string NombreArchivo { get; set; }
public string NombreArchivoFisico { get; set; }
public string RutaArchivo { get; set; }
public string ContentType { get; set; }
}
public sealed class TramiteDocumentoFileModel
{
public string NombreArchivo { get; set; }
public string ContentType { get; set; }
public Stream Content { get; set; }
}
public sealed class TramiteDocumentoPreparedFile
{
public string NombreArchivoFisico { get; set; }
public string RutaArchivo { get; set; }
public string TemporaryPath { get; set; }
public string FinalPath { get; set; }
public string BackupPath { get; set; }
public string PreviousPath { get; set; }
public bool Promoted { get; set; }
}
}

View File

@@ -0,0 +1,53 @@
using System;
namespace SIG.Web.AppCode.Models.Tramites
{
public sealed class TramiteSolicitudModel
{
public int CveSolicitud { get; set; }
public string Folio { get; set; }
public int CveCliente { get; set; }
public int CveFraccionamiento { get; set; }
public int CveFraccionamientoEtapa { get; set; }
public string Etapa { get; set; }
public int CveTipoTramite { get; set; }
public string TipoTramite { get; set; }
public int CveEstatusSolicitud { get; set; }
public string EstatusSolicitud { get; set; }
public bool EsEstatusCliente { get; set; }
public DateTime? FechaInicio { get; set; }
public DateTime? FechaAutorizacion { get; set; }
public bool PuedeCambiarEstatus { get; set; }
public bool EsAutorizada { get; set; }
}
public sealed class TramiteSolicitudEstatusOptionModel
{
public int CveEstatusSolicitud { get; set; }
public string Codigo { get; set; }
public string EstatusSolicitud { get; set; }
public int Orden { get; set; }
public bool EsFinal { get; set; }
public bool EsCliente { get; set; }
}
public sealed class TramiteSolicitudStatusChangeModel
{
public int CveSolicitud { get; set; }
public string Folio { get; set; }
public int CveCliente { get; set; }
public int CveFraccionamiento { get; set; }
public int CveFraccionamientoEtapa { get; set; }
public string Etapa { get; set; }
public int CveTipoTramite { get; set; }
public string TipoTramite { get; set; }
public int CveEstatusSolicitudAnterior { get; set; }
public string EstatusSolicitudAnterior { get; set; }
public bool EsClienteAnterior { get; set; }
public int CveEstatusSolicitud { get; set; }
public string EstatusSolicitud { get; set; }
public bool EsCliente { get; set; }
public DateTime? FechaAutorizacion { get; set; }
public bool HuboCambio { get; set; }
}
}

View File

@@ -0,0 +1,198 @@
using System.Collections.Generic;
using System.Data;
using SIG.Web.AppCode.Contracts.Database;
using SIG.Web.AppCode.Contracts.Documentos;
using SIG.Web.AppCode.Models.Common;
using SIG.Web.AppCode.Models.Documentos;
using SIG.Web.AppCode.Repositories.Database;
namespace SIG.Web.AppCode.Repositories.Documentos
{
public sealed class TramiteDocumentoRepository
: RepositoryBase, ITramiteDocumentoRepository
{
public TramiteDocumentoRepository(IDbExecutor db)
: base(db)
{
}
public DbResult<List<TramiteDocumentoSolicitudModel>> ListForDevelopment(
int developmentId,
int? stageId,
int? procedureTypeId,
int executingUser,
string domainName)
{
return QueryList<TramiteDocumentoSolicitudModel>(
"dbo.PA_Tramites_DocumentoSolicitudFraccionamientoList",
executingUser,
domainName,
command =>
{
StoredProcedureCommand.AddInput(
command,
"@CveFraccionamiento",
developmentId,
DbType.Int32);
StoredProcedureCommand.AddInput(
command,
"@CveFraccionamientoEtapa",
stageId,
DbType.Int32);
StoredProcedureCommand.AddInput(
command,
"@CveTipoTramite",
procedureTypeId,
DbType.Int32);
});
}
public DbResult<TramiteDocumentoUploadContextModel> GetUploadContext(
int developmentId,
int requestId,
int documentTypeId,
int executingUser,
string domainName)
{
return QueryOne<TramiteDocumentoUploadContextModel>(
"dbo.PA_Tramites_DocumentoSolicitudUploadContextGet",
executingUser,
domainName,
command =>
{
StoredProcedureCommand.AddInput(
command,
"@CveFraccionamiento",
developmentId,
DbType.Int32);
StoredProcedureCommand.AddInput(
command,
"@CveSolicitud",
requestId,
DbType.Int32);
StoredProcedureCommand.AddInput(
command,
"@CveTipoDocumento",
documentTypeId,
DbType.Int32);
});
}
public DbResult<TramiteDocumentoUploadContextModel> GetStageUploadContext(
int stageId,
int procedureTypeId,
int documentTypeId,
int executingUser,
string domainName)
{
return QueryOne<TramiteDocumentoUploadContextModel>(
"dbo.PA_Tramites_DocumentoSolicitudStageContextGet",
executingUser,
domainName,
command =>
{
StoredProcedureCommand.AddInput(
command,
"@CveFraccionamientoEtapa",
stageId,
DbType.Int32);
StoredProcedureCommand.AddInput(
command,
"@CveTipoTramite",
procedureTypeId,
DbType.Int32);
StoredProcedureCommand.AddInput(
command,
"@CveTipoDocumento",
documentTypeId,
DbType.Int32);
});
}
public DbResult<TramiteDocumentoSaveResultModel> SaveUpload(
int developmentId,
int requestId,
int documentTypeId,
string originalFileName,
string physicalFileName,
string relativePath,
string contentType,
long contentLength,
string clientComment,
int executingUser,
string domainName)
{
return QueryOne<TramiteDocumentoSaveResultModel>(
"dbo.PA_Tramites_DocumentoSolicitudSave",
executingUser,
domainName,
command =>
{
StoredProcedureCommand.AddInput(command, "@CveFraccionamiento", developmentId, DbType.Int32);
StoredProcedureCommand.AddInput(command, "@CveSolicitud", requestId, DbType.Int32);
StoredProcedureCommand.AddInput(command, "@CveTipoDocumento", documentTypeId, DbType.Int32);
StoredProcedureCommand.AddInput(command, "@NombreArchivo", originalFileName, DbType.String);
StoredProcedureCommand.AddInput(command, "@NombreArchivoFisico", physicalFileName, DbType.String);
StoredProcedureCommand.AddInput(command, "@RutaArchivo", relativePath, DbType.String);
StoredProcedureCommand.AddInput(command, "@ContentType", contentType, DbType.String);
StoredProcedureCommand.AddInput(command, "@TamanoBytes", contentLength, DbType.Int64);
StoredProcedureCommand.AddInput(command, "@ComentarioCliente", clientComment, DbType.String);
});
}
public DbResult<TramiteDocumentoReviewResultModel> Review(
int developmentId,
int documentRequestId,
bool approved,
string note,
int executingUser,
string domainName)
{
return QueryOne<TramiteDocumentoReviewResultModel>(
"dbo.PA_Tramites_DocumentoSolicitudReview",
executingUser,
domainName,
command =>
{
StoredProcedureCommand.AddInput(command, "@CveFraccionamiento", developmentId, DbType.Int32);
StoredProcedureCommand.AddInput(command, "@CveDocumentoSolicitud", documentRequestId, DbType.Int32);
StoredProcedureCommand.AddInput(command, "@Aprobar", approved, DbType.Boolean);
StoredProcedureCommand.AddInput(command, "@Nota", note, DbType.String);
});
}
public DbResult<TramiteDocumentoDownloadContextModel> GetDownloadContext(
int developmentId,
int documentRequestId,
int executingUser,
string domainName)
{
return QueryOne<TramiteDocumentoDownloadContextModel>(
"dbo.PA_Tramites_DocumentoSolicitudDownloadGet",
executingUser,
domainName,
command =>
{
StoredProcedureCommand.AddInput(command, "@CveFraccionamiento", developmentId, DbType.Int32);
StoredProcedureCommand.AddInput(command, "@CveDocumentoSolicitud", documentRequestId, DbType.Int32);
});
}
public DbResult<TramiteDocumentoDeleteResultModel> Delete(
int developmentId,
int documentRequestId,
int executingUser,
string domainName)
{
return QueryOne<TramiteDocumentoDeleteResultModel>(
"dbo.PA_Tramites_DocumentoSolicitudDelete",
executingUser,
domainName,
command =>
{
StoredProcedureCommand.AddInput(command, "@CveFraccionamiento", developmentId, DbType.Int32);
StoredProcedureCommand.AddInput(command, "@CveDocumentoSolicitud", documentRequestId, DbType.Int32);
});
}
}
}

View File

@@ -0,0 +1,134 @@
using System.Collections.Generic;
using System.Data;
using SIG.Web.AppCode.Contracts.Database;
using SIG.Web.AppCode.Contracts.Tramites;
using SIG.Web.AppCode.Models.Common;
using SIG.Web.AppCode.Models.Tramites;
using SIG.Web.AppCode.Repositories.Database;
namespace SIG.Web.AppCode.Repositories.Tramites
{
public sealed class TramiteSolicitudRepository
: RepositoryBase, ITramiteSolicitudRepository
{
public TramiteSolicitudRepository(IDbExecutor db)
: base(db)
{
}
public DbResult<int> EnsureStageRequest(
int stageId,
int procedureTypeId,
int executingUser,
string domainName)
{
return QueryScalarId(
"dbo.PA_Tramites_SolicitudEtapaSave",
executingUser,
domainName,
command =>
{
StoredProcedureCommand.AddInput(
command,
"@CveFraccionamientoEtapa",
stageId,
DbType.Int32);
StoredProcedureCommand.AddInput(
command,
"@CveTipoTramite",
procedureTypeId,
DbType.Int32);
});
}
public DbResult<List<TramiteSolicitudModel>> ListForDevelopment(
int developmentId,
int? stageId,
int? procedureTypeId,
int? statusId,
int executingUser,
string domainName)
{
return QueryList<TramiteSolicitudModel>(
"dbo.PA_Tramites_SolicitudFraccionamientoList",
executingUser,
domainName,
command =>
{
StoredProcedureCommand.AddInput(
command,
"@CveFraccionamiento",
developmentId,
DbType.Int32);
StoredProcedureCommand.AddInput(
command,
"@CveFraccionamientoEtapa",
stageId,
DbType.Int32);
StoredProcedureCommand.AddInput(
command,
"@CveTipoTramite",
procedureTypeId,
DbType.Int32);
StoredProcedureCommand.AddInput(
command,
"@CveEstatusSolicitud",
statusId,
DbType.Int32);
});
}
public DbResult<TramiteSolicitudModel> Get(
int requestId,
int executingUser,
string domainName)
{
return QueryOne<TramiteSolicitudModel>(
"dbo.PA_Tramites_SolicitudGet",
executingUser,
domainName,
command => StoredProcedureCommand.AddInput(
command,
"@CveSolicitud",
requestId,
DbType.Int32));
}
public DbResult<List<TramiteSolicitudEstatusOptionModel>> ListStatusOptions(
int executingUser,
string domainName)
{
return QueryList<TramiteSolicitudEstatusOptionModel>(
"dbo.PA_Tramites_EstatusSolicitudOptionList",
executingUser,
domainName,
null);
}
public DbResult<TramiteSolicitudStatusChangeModel> ChangeStatus(
int requestId,
int statusId,
int executingUser,
string domainName)
{
return QueryOne<TramiteSolicitudStatusChangeModel>(
"dbo.PA_Tramites_SolicitudEstatusUpdate",
executingUser,
domainName,
command =>
{
StoredProcedureCommand.AddInput(
command,
"@CveSolicitud",
requestId,
DbType.Int32);
StoredProcedureCommand.AddInput(
command,
"@CveEstatusSolicitud",
statusId,
DbType.Int32);
});
}
}
}

View File

@@ -0,0 +1,210 @@
using System;
using System.Collections.Generic;
using SIG.Web.AppCode.Models.Bitacora;
using SIG.Web.AppCode.Models.Documentos;
namespace SIG.Web.AppCode.Services.Documentos
{
internal static class TramiteDocumentoBitacoraFactory
{
public static BitacoraEventoModel Upload(
TramiteDocumentoSaveResultModel change)
{
BitacoraTipoMovimiento movement = change.EsNuevo
? BitacoraTipoMovimiento.Agregado
: BitacoraTipoMovimiento.Editado;
var auditEvent = BaseEvent(
change.CveDocumentoSolicitud,
change.CveSolicitud,
change.CveCliente,
change.CveFraccionamiento,
change.CveFraccionamientoEtapa,
movement,
BuildUploadDescription(change));
auditEvent.DiscriminarCamposSinCambios = false;
auditEvent.Campos = new List<BitacoraCampoEventoModel>
{
Field("CveSolicitud", change.EsNuevo ? null : (object)change.CveSolicitud, change.CveSolicitud),
Field("CveTipoDocumento", change.EsNuevo ? null : (object)change.CveTipoDocumento, change.CveTipoDocumento),
Field("NombreArchivo", change.NombreArchivoAnterior, change.NombreArchivo),
Field("NombreArchivoFisico", change.NombreArchivoFisicoAnterior, change.NombreArchivoFisico),
Field("RutaArchivo", change.RutaArchivoAnterior, change.RutaArchivo),
Field("ContentType", change.ContentTypeAnterior, change.ContentType),
Field("TamanoBytes", change.TamanoBytesAnterior, change.TamanoBytes),
Field("ComentarioCliente", change.ComentarioClienteAnterior, change.ComentarioCliente),
Field("ComentarioAdministrativo", change.ComentarioAdministrativoAnterior, change.ComentarioAdministrativo),
Field("EsAprobado", change.EsAprobadoAnterior, change.EsAprobado),
Field("CveUsuarioRevisa", change.CveUsuarioRevisaAnterior, change.CveUsuarioRevisa),
Field("FechaRevision", change.FechaRevisionAnterior, change.FechaRevision)
};
return auditEvent;
}
public static BitacoraEventoModel Review(
TramiteDocumentoReviewResultModel change)
{
string action = change.EsAprobado == true
? "aprobó"
: "rechazó";
var auditEvent = BaseEvent(
change.CveDocumentoSolicitud,
change.CveSolicitud,
change.CveCliente,
change.CveFraccionamiento,
change.CveFraccionamientoEtapa,
BitacoraTipoMovimiento.Editado,
"Se " + action + " el documento " +
change.TipoDocumento + " del trámite " +
change.TipoTramite + " de la etapa " +
change.Etapa + ".");
auditEvent.Campos = new List<BitacoraCampoEventoModel>
{
Field("EsAprobado", change.EsAprobadoAnterior, change.EsAprobado),
Field("ComentarioAdministrativo", change.ComentarioAdministrativoAnterior, change.ComentarioAdministrativo),
Field("CveUsuarioRevisa", change.CveUsuarioRevisaAnterior, change.CveUsuarioRevisa),
Field("FechaRevision", change.FechaRevisionAnterior, change.FechaRevision)
};
if (change.EsAprobado == true && change.FechaRevision.HasValue)
{
auditEvent.CveUsuarioAutoriza = change.CveUsuarioRevisa;
auditEvent.FechaAutorizacion = change.FechaRevision;
}
return auditEvent;
}
public static BitacoraEventoModel Delete(
TramiteDocumentoDeleteResultModel change)
{
return BaseEvent(
change.CveDocumentoSolicitud,
change.CveSolicitud,
change.CveCliente,
change.CveFraccionamiento,
change.CveFraccionamientoEtapa,
BitacoraTipoMovimiento.Eliminado,
"Se eliminó el registro del documento " +
change.TipoDocumento + " del trámite " +
change.TipoTramite + " de la etapa " +
change.Etapa + ".");
}
private static string BuildUploadDescription(
TramiteDocumentoSaveResultModel change)
{
if (change.EsNuevo)
{
return "Se agregó el documento " + change.TipoDocumento +
" al trámite " + change.TipoTramite +
" de la etapa " + change.Etapa + ".";
}
bool teniaRevision =
change.EsAprobadoAnterior.HasValue ||
change.FechaRevisionAnterior.HasValue ||
!string.IsNullOrWhiteSpace(
change.ComentarioAdministrativoAnterior);
return "Se actualizó el documento " + change.TipoDocumento +
" del trámite " + change.TipoTramite +
" de la etapa " + change.Etapa +
(teniaRevision
? ". La revisión anterior se eliminó y el documento quedó pendiente nuevamente."
: ". El documento quedó pendiente de revisión.");
}
private static BitacoraEventoModel BaseEvent(
int documentRequestId,
int requestId,
int clientId,
int developmentId,
int stageId,
BitacoraTipoMovimiento movement,
string description)
{
var auditEvent = new BitacoraEventoModel
{
NombreTablaSQL = "Tra_DocumentosSolicitud",
TipoMovimiento = movement,
LlaveRegistro = Convert.ToString(documentRequestId),
DescripcionMovimiento = description,
DiscriminarCamposSinCambios = true
};
auditEvent.Relaciones.Add(
Relation(
BitacoraTipoRelacion.Directa,
"Tra_DocumentosSolicitud",
"CveDocumentoSolicitud",
documentRequestId,
"Documento de la solicitud."));
auditEvent.Relaciones.Add(
Relation(
BitacoraTipoRelacion.Relacionada,
"Tra_Solicitudes",
"CveSolicitud",
requestId,
"Solicitud del documento."));
auditEvent.Relaciones.Add(
Relation(
BitacoraTipoRelacion.Relacionada,
"Clientes",
"CveCliente",
clientId,
"Cliente propietario de la solicitud."));
auditEvent.Relaciones.Add(
Relation(
BitacoraTipoRelacion.Relacionada,
"Fraccionamientos",
"CveFraccionamiento",
developmentId,
"Fraccionamiento de la solicitud."));
auditEvent.Relaciones.Add(
Relation(
BitacoraTipoRelacion.Relacionada,
"FraccionamientosEtapas",
"CveFraccionamientoEtapa",
stageId,
"Etapa de la solicitud."));
return auditEvent;
}
private static BitacoraCampoEventoModel Field(
string name,
object previous,
object current)
{
return new BitacoraCampoEventoModel
{
NombreCampoSQL = name,
ValorAnterior = previous,
ValorNuevo = current
};
}
private static BitacoraRelacionEventoModel Relation(
BitacoraTipoRelacion relationType,
string tableName,
string fieldName,
object value,
string description)
{
return new BitacoraRelacionEventoModel
{
TipoRelacion = relationType,
NombreTablaSQL = tableName,
NombreCampoSQL = fieldName,
Valor = value,
VisibleDesarrollador = true,
DescripcionRelacion = description
};
}
}
}

View File

@@ -0,0 +1,277 @@
using System;
using System.Globalization;
using System.IO;
using System.Web.Hosting;
using SIG.Web.AppCode.Contracts.Documentos;
using SIG.Web.AppCode.Models.Documentos;
namespace SIG.Web.AppCode.Services.Documentos
{
public sealed class TramiteDocumentoFileStore
: ITramiteDocumentoFileStore
{
public TramiteDocumentoPreparedFile Prepare(
TramiteDocumentoUploadContextModel context,
Stream source,
string previousRelativePath)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
if (source == null)
{
throw new ArgumentNullException("source");
}
string root = GetDocumentsRoot();
string relativeDirectory = Path.Combine(
"Clientes",
context.CveCliente.ToString(CultureInfo.InvariantCulture),
"Solicitudes",
context.CveSolicitud.ToString(CultureInfo.InvariantCulture));
string directory = Path.Combine(root, relativeDirectory);
Directory.CreateDirectory(directory);
string physicalFileName = string.Format(
CultureInfo.InvariantCulture,
"doc-{0}-{1}.bin",
context.CveSolicitud,
context.CveTipoDocumento);
string relativePath = Path.Combine(
relativeDirectory,
physicalFileName);
string finalPath = SafeResolve(relativePath);
string temporaryPath = Path.Combine(
directory,
"." + physicalFileName + "." +
Guid.NewGuid().ToString("N") + ".tmp");
if (source.CanSeek)
{
source.Position = 0;
}
using (var target = new FileStream(
temporaryPath,
FileMode.CreateNew,
FileAccess.Write,
FileShare.None))
{
source.CopyTo(target);
target.Flush();
}
return new TramiteDocumentoPreparedFile
{
NombreArchivoFisico = physicalFileName,
RutaArchivo = relativePath.Replace('\\', '/'),
TemporaryPath = temporaryPath,
FinalPath = finalPath,
PreviousPath = ResolveExistingPath(previousRelativePath),
Promoted = false
};
}
public void Promote(TramiteDocumentoPreparedFile preparedFile)
{
ValidatePrepared(preparedFile);
if (!File.Exists(preparedFile.TemporaryPath))
{
throw new FileNotFoundException(
"No se encontró el archivo temporal preparado.",
preparedFile.TemporaryPath);
}
string finalDirectory = Path.GetDirectoryName(
preparedFile.FinalPath);
Directory.CreateDirectory(finalDirectory);
if (File.Exists(preparedFile.FinalPath))
{
preparedFile.BackupPath = preparedFile.FinalPath + "." +
Guid.NewGuid().ToString("N") + ".bak";
File.Move(
preparedFile.FinalPath,
preparedFile.BackupPath);
}
try
{
File.Move(
preparedFile.TemporaryPath,
preparedFile.FinalPath);
preparedFile.Promoted = true;
}
catch
{
if (!string.IsNullOrWhiteSpace(preparedFile.BackupPath) &&
File.Exists(preparedFile.BackupPath) &&
!File.Exists(preparedFile.FinalPath))
{
File.Move(
preparedFile.BackupPath,
preparedFile.FinalPath);
}
preparedFile.BackupPath = null;
throw;
}
}
public void Rollback(TramiteDocumentoPreparedFile preparedFile)
{
if (preparedFile == null)
{
return;
}
if (preparedFile.Promoted &&
!string.IsNullOrWhiteSpace(preparedFile.FinalPath) &&
File.Exists(preparedFile.FinalPath))
{
File.Delete(preparedFile.FinalPath);
}
if (!string.IsNullOrWhiteSpace(preparedFile.BackupPath) &&
File.Exists(preparedFile.BackupPath))
{
File.Move(
preparedFile.BackupPath,
preparedFile.FinalPath);
}
if (!string.IsNullOrWhiteSpace(preparedFile.TemporaryPath) &&
File.Exists(preparedFile.TemporaryPath))
{
File.Delete(preparedFile.TemporaryPath);
}
preparedFile.Promoted = false;
}
public void Complete(TramiteDocumentoPreparedFile preparedFile)
{
if (preparedFile == null)
{
return;
}
if (!string.IsNullOrWhiteSpace(preparedFile.BackupPath) &&
File.Exists(preparedFile.BackupPath))
{
File.Delete(preparedFile.BackupPath);
}
if (!string.IsNullOrWhiteSpace(preparedFile.TemporaryPath) &&
File.Exists(preparedFile.TemporaryPath))
{
File.Delete(preparedFile.TemporaryPath);
}
if (!string.IsNullOrWhiteSpace(preparedFile.PreviousPath) &&
!PathsEqual(preparedFile.PreviousPath, preparedFile.FinalPath) &&
File.Exists(preparedFile.PreviousPath))
{
File.Delete(preparedFile.PreviousPath);
}
}
public Stream OpenRead(string relativePath)
{
string path = SafeResolve(relativePath);
return new FileStream(
path,
FileMode.Open,
FileAccess.Read,
FileShare.Read);
}
private static string GetDocumentsRoot()
{
string root = HostingEnvironment.MapPath("~/Documentos/");
if (string.IsNullOrWhiteSpace(root))
{
throw new InvalidOperationException(
"No fue posible resolver el directorio Documentos.");
}
Directory.CreateDirectory(root);
return Path.GetFullPath(root);
}
private static string SafeResolve(string storedPath)
{
if (string.IsNullOrWhiteSpace(storedPath))
{
throw new InvalidOperationException(
"La ruta del documento está vacía.");
}
string root = GetDocumentsRoot();
string path = Path.IsPathRooted(storedPath)
? Path.GetFullPath(storedPath)
: Path.GetFullPath(
Path.Combine(
root,
storedPath.Replace('/', Path.DirectorySeparatorChar)));
string rootPrefix = root.TrimEnd(
Path.DirectorySeparatorChar,
Path.AltDirectorySeparatorChar) +
Path.DirectorySeparatorChar;
if (!path.StartsWith(
rootPrefix,
StringComparison.OrdinalIgnoreCase))
{
throw new InvalidOperationException(
"La ruta del documento está fuera del directorio permitido.");
}
return path;
}
private static string ResolveExistingPath(string storedPath)
{
if (string.IsNullOrWhiteSpace(storedPath))
{
return null;
}
try
{
return SafeResolve(storedPath);
}
catch
{
return null;
}
}
private static bool PathsEqual(string left, string right)
{
return string.Equals(
Path.GetFullPath(left ?? string.Empty),
Path.GetFullPath(right ?? string.Empty),
StringComparison.OrdinalIgnoreCase);
}
private static void ValidatePrepared(
TramiteDocumentoPreparedFile preparedFile)
{
if (preparedFile == null ||
string.IsNullOrWhiteSpace(preparedFile.TemporaryPath) ||
string.IsNullOrWhiteSpace(preparedFile.FinalPath))
{
throw new InvalidOperationException(
"El archivo preparado no contiene rutas válidas.");
}
}
}
}

View File

@@ -0,0 +1,577 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using SIG.Web.AppCode.Contracts.Bitacora;
using SIG.Web.AppCode.Contracts.Documentos;
using SIG.Web.AppCode.Infrastructure.Transactions;
using SIG.Web.AppCode.Models.Bitacora;
using SIG.Web.AppCode.Models.Common;
using SIG.Web.AppCode.Models.Documentos;
using SIG.Web.AppCode.Services.Logging;
namespace SIG.Web.AppCode.Services.Documentos
{
public sealed class TramiteDocumentoService
: ITramiteDocumentoService
{
private const int GisDocumentTypeId = 2;
private readonly ITramiteDocumentoRepository _repository;
private readonly ITramiteDocumentoFileStore _fileStore;
private readonly IBitacoraService _bitacoraService;
public TramiteDocumentoService(
ITramiteDocumentoRepository repository,
ITramiteDocumentoFileStore fileStore,
IBitacoraService bitacoraService)
{
if (repository == null)
{
throw new ArgumentNullException("repository");
}
if (fileStore == null)
{
throw new ArgumentNullException("fileStore");
}
if (bitacoraService == null)
{
throw new ArgumentNullException("bitacoraService");
}
_repository = repository;
_fileStore = fileStore;
_bitacoraService = bitacoraService;
}
public DbResult<List<TramiteDocumentoSolicitudModel>> ListForDevelopment(
int developmentId,
int? stageId,
int? procedureTypeId,
int executingUser,
string domainName)
{
if (developmentId <= 0)
{
return Fail<List<TramiteDocumentoSolicitudModel>>(
"Seleccione un fraccionamiento válido.");
}
return _repository.ListForDevelopment(
developmentId,
NormalizeId(stageId),
NormalizeId(procedureTypeId),
executingUser,
domainName);
}
public DbResult<TramiteDocumentoUploadContextModel> GetUploadContext(
int developmentId,
int requestId,
int documentTypeId,
int executingUser,
string domainName)
{
if (developmentId <= 0 || requestId <= 0 || documentTypeId <= 0)
{
return Fail<TramiteDocumentoUploadContextModel>(
"Seleccione un documento válido.");
}
if (documentTypeId == GisDocumentTypeId)
{
return Fail<TramiteDocumentoUploadContextModel>(
"El archivo GIS se administra desde la opción Administrar GIS de la etapa.");
}
return _repository.GetUploadContext(
developmentId,
requestId,
documentTypeId,
executingUser,
domainName);
}
public DbResult<TramiteDocumentoSaveResultModel> Upload(
int developmentId,
int requestId,
int documentTypeId,
string originalFileName,
string contentType,
Stream content,
long contentLength,
string clientComment,
int executingUser,
string domainName)
{
if (content == null || contentLength <= 0)
{
return Fail<TramiteDocumentoSaveResultModel>(
"Seleccione un archivo válido.");
}
DbResult<TramiteDocumentoUploadContextModel> contextResult =
GetUploadContext(
developmentId,
requestId,
documentTypeId,
executingUser,
domainName);
if (!contextResult.Success || contextResult.Data == null)
{
return CopyFailure<TramiteDocumentoUploadContextModel, TramiteDocumentoSaveResultModel>(
contextResult,
"No fue posible obtener el contexto del documento.");
}
TramiteDocumentoUploadContextModel uploadContext =
contextResult.Data;
string validation = ValidateFile(
uploadContext,
originalFileName,
contentLength);
if (!string.IsNullOrWhiteSpace(validation))
{
return Fail<TramiteDocumentoSaveResultModel>(validation);
}
TramiteDocumentoPreparedFile preparedFile = null;
try
{
preparedFile = _fileStore.Prepare(
uploadContext,
content,
uploadContext.RutaArchivoAnterior);
DbResult<TramiteDocumentoSaveResultModel> saveResult;
using (var transaction = new TransactionLogic())
{
saveResult = _repository.SaveUpload(
developmentId,
requestId,
documentTypeId,
Path.GetFileName(originalFileName),
preparedFile.NombreArchivoFisico,
preparedFile.RutaArchivo,
NormalizeContentType(contentType),
contentLength,
TrimOrNull(clientComment),
executingUser,
domainName);
if (!saveResult.Success || saveResult.Data == null)
{
_fileStore.Rollback(preparedFile);
return saveResult;
}
DbResult<long> auditResult =
_bitacoraService.Registrar(
TramiteDocumentoBitacoraFactory.Upload(
saveResult.Data));
if (!auditResult.Success)
{
_fileStore.Rollback(preparedFile);
return DbResult<TramiteDocumentoSaveResultModel>.Fail(
auditResult.UserMessage,
auditResult.TechnicalMessage,
auditResult.Exception);
}
_fileStore.Promote(preparedFile);
transaction.Commit();
}
_fileStore.Complete(preparedFile);
return saveResult;
}
catch (Exception ex)
{
try
{
_fileStore.Rollback(preparedFile);
}
catch (Exception rollbackException)
{
ExceptionLogger.Log(
rollbackException,
"TramiteDocumentoService.Upload.Rollback",
"No fue posible restaurar el archivo después de un error.");
}
const string message =
"No fue posible guardar el documento; favor de contactar a Sistemas.";
ExceptionLogger.Log(
ex,
"TramiteDocumentoService.Upload",
message);
return DbResult<TramiteDocumentoSaveResultModel>.Fail(
message,
ex.Message,
ex);
}
}
public DbResult<TramiteDocumentoReviewResultModel> Review(
int developmentId,
int documentRequestId,
bool approved,
string note,
int executingUser,
string domainName)
{
if (developmentId <= 0 || documentRequestId <= 0)
{
return Fail<TramiteDocumentoReviewResultModel>(
"Seleccione un documento válido.");
}
note = TrimOrNull(note);
if (!approved && string.IsNullOrWhiteSpace(note))
{
return Fail<TramiteDocumentoReviewResultModel>(
"Capture la nota o motivo del rechazo.");
}
using (var transaction = new TransactionLogic())
{
DbResult<TramiteDocumentoReviewResultModel> result =
_repository.Review(
developmentId,
documentRequestId,
approved,
note,
executingUser,
domainName);
if (!result.Success || result.Data == null)
{
return result;
}
if (result.Data.HuboCambio)
{
DbResult<long> auditResult =
_bitacoraService.Registrar(
TramiteDocumentoBitacoraFactory.Review(
result.Data));
if (!auditResult.Success)
{
return DbResult<TramiteDocumentoReviewResultModel>.Fail(
auditResult.UserMessage,
auditResult.TechnicalMessage,
auditResult.Exception);
}
}
transaction.Commit();
return result;
}
}
public DbResult<TramiteDocumentoFileModel> Open(
int developmentId,
int documentRequestId,
int executingUser,
string domainName)
{
DbResult<TramiteDocumentoDownloadContextModel> result =
_repository.GetDownloadContext(
developmentId,
documentRequestId,
executingUser,
domainName);
if (!result.Success || result.Data == null)
{
return CopyFailure<TramiteDocumentoDownloadContextModel, TramiteDocumentoFileModel>(
result,
"No fue posible obtener el documento.");
}
try
{
return DbResult<TramiteDocumentoFileModel>.Ok(
new TramiteDocumentoFileModel
{
NombreArchivo = result.Data.NombreArchivo,
ContentType = NormalizeContentType(
result.Data.ContentType),
Content = _fileStore.OpenRead(
result.Data.RutaArchivo)
});
}
catch (Exception ex)
{
const string message =
"No fue posible abrir el documento; favor de contactar a Sistemas.";
ExceptionLogger.Log(
ex,
"TramiteDocumentoService.Open",
message);
return DbResult<TramiteDocumentoFileModel>.Fail(
message,
ex.Message,
ex);
}
}
public DbResult<TramiteDocumentoSaveResultModel> RegisterExternalStageFile(
int stageId,
int procedureTypeId,
int documentTypeId,
string originalFileName,
string physicalFileName,
string relativePath,
string contentType,
long contentLength,
int executingUser,
string domainName)
{
DbResult<TramiteDocumentoUploadContextModel> contextResult =
_repository.GetStageUploadContext(
stageId,
procedureTypeId,
documentTypeId,
executingUser,
domainName);
if (!contextResult.Success || contextResult.Data == null)
{
return CopyFailure<TramiteDocumentoUploadContextModel, TramiteDocumentoSaveResultModel>(
contextResult,
"No fue posible obtener la solicitud asociada a la etapa.");
}
TramiteDocumentoUploadContextModel uploadContext =
contextResult.Data;
using (var transaction = new TransactionLogic())
{
DbResult<TramiteDocumentoSaveResultModel> result =
_repository.SaveUpload(
uploadContext.CveFraccionamiento,
uploadContext.CveSolicitud,
documentTypeId,
Path.GetFileName(originalFileName),
physicalFileName,
relativePath,
NormalizeContentType(contentType),
contentLength,
null,
executingUser,
domainName);
if (!result.Success || result.Data == null)
{
return result;
}
DbResult<long> auditResult =
_bitacoraService.Registrar(
TramiteDocumentoBitacoraFactory.Upload(
result.Data));
if (!auditResult.Success)
{
return DbResult<TramiteDocumentoSaveResultModel>.Fail(
auditResult.UserMessage,
auditResult.TechnicalMessage,
auditResult.Exception);
}
transaction.Commit();
return result;
}
}
public DbResult<bool> RemoveExternalStageFile(
int stageId,
int procedureTypeId,
int documentTypeId,
int executingUser,
string domainName)
{
DbResult<TramiteDocumentoUploadContextModel> contextResult =
_repository.GetStageUploadContext(
stageId,
procedureTypeId,
documentTypeId,
executingUser,
domainName);
if (!contextResult.Success || contextResult.Data == null)
{
return CopyFailure<TramiteDocumentoUploadContextModel, bool>(
contextResult,
"No fue posible obtener la solicitud asociada a la etapa.");
}
if (contextResult.Data.CveDocumentoSolicitud <= 0)
{
return DbResult<bool>.Ok(true);
}
using (var transaction = new TransactionLogic())
{
DbResult<TramiteDocumentoDeleteResultModel> deleteResult =
_repository.Delete(
contextResult.Data.CveFraccionamiento,
contextResult.Data.CveDocumentoSolicitud,
executingUser,
domainName);
if (!deleteResult.Success || deleteResult.Data == null)
{
return DbResult<bool>.Fail(
deleteResult.UserMessage,
deleteResult.TechnicalMessage,
deleteResult.Exception);
}
DbResult<long> auditResult =
_bitacoraService.Registrar(
TramiteDocumentoBitacoraFactory.Delete(
deleteResult.Data));
if (!auditResult.Success)
{
return DbResult<bool>.Fail(
auditResult.UserMessage,
auditResult.TechnicalMessage,
auditResult.Exception);
}
transaction.Commit();
return DbResult<bool>.Ok(true);
}
}
private static string ValidateFile(
TramiteDocumentoUploadContextModel context,
string originalFileName,
long contentLength)
{
string extension = Path.GetExtension(
originalFileName ?? string.Empty);
if (string.IsNullOrWhiteSpace(extension))
{
return "El archivo seleccionado no tiene una extensión válida.";
}
if (!IsExtensionAllowed(
extension,
context.ExtensionesPermitidas))
{
return string.IsNullOrWhiteSpace(
context.ExtensionesPermitidas)
? "La extensión del archivo no está permitida."
: "La extensión del archivo no está permitida. Use: " +
context.ExtensionesPermitidas + ".";
}
if (context.TamanoMaximoMb.HasValue &&
context.TamanoMaximoMb.Value > 0)
{
long maxBytes =
(long)context.TamanoMaximoMb.Value *
1024L * 1024L;
if (contentLength > maxBytes)
{
return "El archivo no puede exceder " +
context.TamanoMaximoMb.Value + " MB.";
}
}
return null;
}
private static bool IsExtensionAllowed(
string extension,
string allowed)
{
if (string.IsNullOrWhiteSpace(allowed))
{
return true;
}
string normalized = extension.Trim();
if (!normalized.StartsWith(".", StringComparison.Ordinal))
{
normalized = "." + normalized;
}
return allowed
.Split(new[] { ',', ';', '|', ' ' },
StringSplitOptions.RemoveEmptyEntries)
.Select(item => item.Trim())
.Select(item => item.StartsWith(".", StringComparison.Ordinal)
? item
: "." + item)
.Any(item => string.Equals(
item,
normalized,
StringComparison.OrdinalIgnoreCase));
}
private static int? NormalizeId(int? value)
{
return value.HasValue && value.Value > 0
? value
: null;
}
private static string NormalizeContentType(string contentType)
{
return string.IsNullOrWhiteSpace(contentType)
? "application/octet-stream"
: contentType.Trim();
}
private static string TrimOrNull(string value)
{
return string.IsNullOrWhiteSpace(value)
? null
: value.Trim();
}
private static DbResult<T> Fail<T>(string message)
{
return DbResult<T>.Fail(
message,
string.Empty,
null);
}
private static DbResult<TOut> CopyFailure<TIn, TOut>(
DbResult<TIn> source,
string fallback)
{
if (source == null)
{
return Fail<TOut>(fallback);
}
return DbResult<TOut>.Fail(
string.IsNullOrWhiteSpace(source.UserMessage)
? fallback
: source.UserMessage,
source.TechnicalMessage,
source.Exception);
}
}
}

View File

@@ -54,7 +54,9 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
movementType,
stageId,
movementType == BitacoraTipoMovimiento.Agregado
? "Se agregó la etapa " + values.Etapa + "."
? "Se agregó la etapa " + values.Etapa +
". Se generó automáticamente la solicitud inicial " +
"del trámite Prefactibilidad de servicio."
: movementType == BitacoraTipoMovimiento.Editado
? "Se modificó la etapa " + values.Etapa + "."
: "Se eliminó la etapa " + values.Etapa + ".",

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using SIG.Web.AppCode.Contracts.Bitacora;
using SIG.Web.AppCode.Contracts.Documentos;
using SIG.Web.AppCode.Contracts.Fraccionamientos;
using SIG.Web.AppCode.Infrastructure.Transactions;
using SIG.Web.AppCode.Models.Bitacora;
@@ -21,11 +22,13 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
private readonly IFraccionamientoGisRepository _repository;
private readonly IFraccionamientoGisFileStore _fileStore;
private readonly IBitacoraService _bitacoraService;
private readonly ITramiteDocumentoService _tramiteDocumentoService;
public FraccionamientoGisService(
IFraccionamientoGisRepository repository,
IFraccionamientoGisFileStore fileStore,
IBitacoraService bitacoraService)
IBitacoraService bitacoraService,
ITramiteDocumentoService tramiteDocumentoService)
{
if (repository == null)
{
@@ -42,9 +45,15 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
throw new ArgumentNullException("bitacoraService");
}
if (tramiteDocumentoService == null)
{
throw new ArgumentNullException("tramiteDocumentoService");
}
_repository = repository;
_fileStore = fileStore;
_bitacoraService = bitacoraService;
_tramiteDocumentoService = tramiteDocumentoService;
}
public DbResult<FraccionamientoGisViewModel> Get(
@@ -260,6 +269,41 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
{
_fileStore.Save(gisContext, content);
fileWasWritten = true;
string physicalFileName = Path.GetFileName(
_fileStore.GetPhysicalPath(gisContext));
string relativePath = string.Format(
System.Globalization.CultureInfo.InvariantCulture,
"Clientes/{0}/{1}",
gisContext.CveCliente,
physicalFileName);
DbResult<SIG.Web.AppCode.Models.Documentos.TramiteDocumentoSaveResultModel> documentResult =
_tramiteDocumentoService.RegisterExternalStageFile(
stageId,
1,
2,
originalFileName,
physicalFileName,
relativePath,
GisContentType,
contentLength,
executingUser,
domainName);
if (!documentResult.Success)
{
RestorePreviousFile(
gisContext,
hadFile,
previousFile);
fileWasWritten = false;
return DbResult<FraccionamientoGisSaveResultModel>.Fail(
documentResult.UserMessage,
documentResult.TechnicalMessage,
documentResult.Exception);
}
}
bool linksChanged = !LinksEqual(previousLinks, links);
@@ -428,6 +472,31 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
fileWasDeleted = true;
}
DbResult<bool> documentDeleteResult =
_tramiteDocumentoService.RemoveExternalStageFile(
stageId,
1,
2,
executingUser,
domainName);
if (!documentDeleteResult.Success)
{
if (fileWasDeleted && previousFile != null)
{
using (var backup = new MemoryStream(previousFile, false))
{
_fileStore.Save(gisContext, backup);
}
fileWasDeleted = false;
}
return DbResult<FraccionamientoGisSaveResultModel>.Fail(
documentDeleteResult.UserMessage,
documentDeleteResult.TechnicalMessage,
documentDeleteResult.Exception);
}
DbResult<long> auditResult =
_bitacoraService.Registrar(
FraccionamientoBitacoraFactory.CreateStageGisFileDelete(

View File

@@ -2,6 +2,7 @@ using System;
using System.Collections.Generic;
using SIG.Web.AppCode.Contracts.Bitacora;
using SIG.Web.AppCode.Contracts.Fraccionamientos;
using SIG.Web.AppCode.Contracts.Tramites;
using SIG.Web.AppCode.Infrastructure.Transactions;
using SIG.Web.AppCode.Models.Bitacora;
using SIG.Web.AppCode.Models.Common;
@@ -12,13 +13,16 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
public sealed class FraccionamientoService : IFraccionamientoService
{
private readonly IFraccionamientoRepository _repository;
private readonly ITramiteSolicitudRepository _tramiteSolicitudRepository;
private readonly IBitacoraService _bitacoraService;
public FraccionamientoService(
IFraccionamientoRepository repository,
ITramiteSolicitudRepository tramiteSolicitudRepository,
IBitacoraService bitacoraService)
{
_repository = repository;
_tramiteSolicitudRepository = tramiteSolicitudRepository;
_bitacoraService = bitacoraService;
}
@@ -337,6 +341,36 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
return saveResult;
}
/*
* Toda etapa nueva debe iniciar con la solicitud del
* CveTipoTramite = 1.
*
* PA_Tramites_SolicitudEtapaSave es idempotente:
* si la solicitud ya existe para esta etapa/tipo,
* devuelve la existente y no crea un duplicado.
*
* Este llamado queda dentro del TransactionLogic que
* ya usa SaveStage; si falla, el alta de la etapa no
* se confirma.
*/
if (isNewStage)
{
DbResult<int> requestResult =
_tramiteSolicitudRepository.EnsureStageRequest(
saveResult.Data,
1,
executingUser,
domainName);
if (!requestResult.Success)
{
return DbResult<int>.Fail(
requestResult.UserMessage,
requestResult.TechnicalMessage,
requestResult.Exception);
}
}
DbResult<FraccionamientoEtapaModel> currentResult =
_repository.GetStage(
saveResult.Data,

View File

@@ -0,0 +1,97 @@
using System;
using System.Collections.Generic;
using SIG.Web.AppCode.Models.Bitacora;
using SIG.Web.AppCode.Models.Tramites;
namespace SIG.Web.AppCode.Services.Tramites
{
internal static class TramiteSolicitudBitacoraFactory
{
public static BitacoraEventoModel StatusChange(
TramiteSolicitudStatusChangeModel change)
{
bool visibleDeveloper =
change.EsClienteAnterior &&
change.EsCliente;
var auditEvent = new BitacoraEventoModel
{
NombreTablaSQL = "Tra_Solicitudes",
TipoMovimiento = BitacoraTipoMovimiento.Editado,
LlaveRegistro = Convert.ToString(change.CveSolicitud),
DescripcionMovimiento =
"Se cambió el estatus de la solicitud " +
change.Folio + " de " +
change.EstatusSolicitudAnterior + " a " +
change.EstatusSolicitud + ".",
DiscriminarCamposSinCambios = true,
Campos = new List<BitacoraCampoEventoModel>
{
new BitacoraCampoEventoModel
{
NombreCampoSQL = "CveEstatusSolicitud",
ValorAnterior = change.CveEstatusSolicitudAnterior,
ValorNuevo = change.CveEstatusSolicitud
}
}
};
auditEvent.Relaciones.Add(
Relation(
BitacoraTipoRelacion.Directa,
"Tra_Solicitudes",
"CveSolicitud",
change.CveSolicitud,
visibleDeveloper,
"Solicitud cuyo estatus fue modificado."));
auditEvent.Relaciones.Add(
Relation(
BitacoraTipoRelacion.Relacionada,
"Clientes",
"CveCliente",
change.CveCliente,
visibleDeveloper,
"Cliente propietario de la solicitud."));
auditEvent.Relaciones.Add(
Relation(
BitacoraTipoRelacion.Relacionada,
"Fraccionamientos",
"CveFraccionamiento",
change.CveFraccionamiento,
visibleDeveloper,
"Fraccionamiento de la solicitud."));
auditEvent.Relaciones.Add(
Relation(
BitacoraTipoRelacion.Relacionada,
"FraccionamientosEtapas",
"CveFraccionamientoEtapa",
change.CveFraccionamientoEtapa,
visibleDeveloper,
"Etapa de la solicitud."));
return auditEvent;
}
private static BitacoraRelacionEventoModel Relation(
BitacoraTipoRelacion relationType,
string tableName,
string fieldName,
object value,
bool visibleDeveloper,
string description)
{
return new BitacoraRelacionEventoModel
{
TipoRelacion = relationType,
NombreTablaSQL = tableName,
NombreCampoSQL = fieldName,
Valor = value,
VisibleDesarrollador = visibleDeveloper,
DescripcionRelacion = description
};
}
}
}

View File

@@ -0,0 +1,157 @@
using System.Collections.Generic;
using SIG.Web.AppCode.Contracts.Bitacora;
using SIG.Web.AppCode.Contracts.Tramites;
using SIG.Web.AppCode.Infrastructure.Transactions;
using SIG.Web.AppCode.Models.Bitacora;
using SIG.Web.AppCode.Models.Common;
using SIG.Web.AppCode.Models.Tramites;
namespace SIG.Web.AppCode.Services.Tramites
{
public sealed class TramiteSolicitudService
: ITramiteSolicitudService
{
private readonly ITramiteSolicitudRepository _repository;
private readonly IBitacoraService _bitacoraService;
public TramiteSolicitudService(
ITramiteSolicitudRepository repository,
IBitacoraService bitacoraService)
{
_repository = repository;
_bitacoraService = bitacoraService;
}
public DbResult<List<TramiteSolicitudModel>> ListForDevelopment(
int developmentId,
int? stageId,
int? procedureTypeId,
int? statusId,
int executingUser,
string domainName)
{
if (developmentId <= 0)
{
return Fail<List<TramiteSolicitudModel>>(
"Seleccione un fraccionamiento válido.");
}
return _repository.ListForDevelopment(
developmentId,
NormalizeId(stageId),
NormalizeId(procedureTypeId),
NormalizeId(statusId),
executingUser,
domainName);
}
public DbResult<TramiteSolicitudModel> Get(
int requestId,
int executingUser,
string domainName)
{
if (requestId <= 0)
{
return Fail<TramiteSolicitudModel>(
"Seleccione una solicitud válida.");
}
return _repository.Get(
requestId,
executingUser,
domainName);
}
public DbResult<List<TramiteSolicitudEstatusOptionModel>> ListStatusOptions(
int executingUser,
string domainName)
{
return _repository.ListStatusOptions(
executingUser,
domainName);
}
public DbResult<TramiteSolicitudStatusChangeModel> ChangeStatus(
int requestId,
int statusId,
int executingUser,
string domainName)
{
if (requestId <= 0)
{
return Fail<TramiteSolicitudStatusChangeModel>(
"Seleccione una solicitud válida.");
}
if (statusId <= 0)
{
return Fail<TramiteSolicitudStatusChangeModel>(
"Seleccione un estatus válido.");
}
using (var transaction = new TransactionLogic())
{
DbResult<TramiteSolicitudStatusChangeModel> result =
_repository.ChangeStatus(
requestId,
statusId,
executingUser,
domainName);
if (!result.Success || result.Data == null)
{
return result;
}
if (result.Data.HuboCambio)
{
if (_bitacoraService == null)
{
return Fail<TramiteSolicitudStatusChangeModel>(
"El servicio de bitácora no está configurado.");
}
BitacoraEventoModel auditEvent =
TramiteSolicitudBitacoraFactory.StatusChange(
result.Data);
if (result.Data.FechaAutorizacion.HasValue)
{
auditEvent.CveUsuarioAutoriza = executingUser;
auditEvent.FechaAutorizacion =
result.Data.FechaAutorizacion;
}
DbResult<long> auditResult =
_bitacoraService.Registrar(auditEvent);
if (!auditResult.Success)
{
return DbResult<TramiteSolicitudStatusChangeModel>.Fail(
auditResult.UserMessage,
auditResult.TechnicalMessage,
auditResult.Exception);
}
}
transaction.Commit();
return result;
}
}
private static int? NormalizeId(int? value)
{
return value.HasValue && value.Value > 0
? value
: null;
}
private static DbResult<T> Fail<T>(string message)
{
return DbResult<T>.Fail(
message,
string.Empty,
null);
}
}
}

View File

@@ -8,6 +8,7 @@ namespace SIG.Web.AppCode.SigControls
public string Nombre { get; set; }
public string Titulo { get; set; }
public string Descripcion { get; set; }
public string Valor { get; set; }
public int Orden { get; set; }
public bool Visible { get; set; } = true;
}

View File

@@ -1,412 +0,0 @@
{
"type": "FeatureCollection",
"name": "Etapa1_10_lotes",
"crs": {
"type": "name",
"properties": {
"name": "EPSG:4326"
}
},
"features": [
{
"type": "Feature",
"properties": {
"Etapa": "Etapa 1",
"Nombre": "Umbrella-1",
"Tipo": "Lote",
"Calle": "Calle Demo 1",
"Catastro": "CAT-001",
"MetrosCuadrados": 200.0,
"Duplicador": 1,
"Estatus": "Activa"
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
-110.9555,
29.09
],
[
-110.95532,
29.09
],
[
-110.95532,
29.090139999999998
],
[
-110.9555,
29.090139999999998
],
[
-110.9555,
29.09
]
]
]
}
},
{
"type": "Feature",
"properties": {
"Etapa": "Etapa 1",
"Nombre": "Umbrella-2",
"Tipo": "Lote",
"Calle": "Calle Demo 1",
"Catastro": "CAT-002",
"MetrosCuadrados": 200.0,
"Duplicador": 1,
"Estatus": "Activa"
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
-110.9553,
29.09
],
[
-110.95512,
29.09
],
[
-110.95512,
29.090139999999998
],
[
-110.9553,
29.090139999999998
],
[
-110.9553,
29.09
]
]
]
}
},
{
"type": "Feature",
"properties": {
"Etapa": "Etapa 1",
"Nombre": "Umbrella-3",
"Tipo": "Lote",
"Calle": "Calle Demo 1",
"Catastro": "CAT-003",
"MetrosCuadrados": 200.0,
"Duplicador": 1,
"Estatus": "Activa"
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
-110.9551,
29.09
],
[
-110.95492,
29.09
],
[
-110.95492,
29.090139999999998
],
[
-110.9551,
29.090139999999998
],
[
-110.9551,
29.09
]
]
]
}
},
{
"type": "Feature",
"properties": {
"Etapa": "Etapa 1",
"Nombre": "Umbrella-4",
"Tipo": "Lote",
"Calle": "Calle Demo 1",
"Catastro": "CAT-004",
"MetrosCuadrados": 200.0,
"Duplicador": 1,
"Estatus": "Activa"
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
-110.9549,
29.09
],
[
-110.95472,
29.09
],
[
-110.95472,
29.090139999999998
],
[
-110.9549,
29.090139999999998
],
[
-110.9549,
29.09
]
]
]
}
},
{
"type": "Feature",
"properties": {
"Etapa": "Etapa 1",
"Nombre": "Umbrella-5",
"Tipo": "Lote",
"Calle": "Calle Demo 1",
"Catastro": "CAT-005",
"MetrosCuadrados": 200.0,
"Duplicador": 1,
"Estatus": "Activa"
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
-110.9547,
29.09
],
[
-110.95452,
29.09
],
[
-110.95452,
29.090139999999998
],
[
-110.9547,
29.090139999999998
],
[
-110.9547,
29.09
]
]
]
}
},
{
"type": "Feature",
"properties": {
"Etapa": "Etapa 1",
"Nombre": "Umbrella-6",
"Tipo": "Lote",
"Calle": "Calle Demo 2",
"Catastro": "CAT-006",
"MetrosCuadrados": 200.0,
"Duplicador": 1,
"Estatus": "Activa"
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
-110.9555,
29.09016
],
[
-110.95532,
29.09016
],
[
-110.95532,
29.0903
],
[
-110.9555,
29.0903
],
[
-110.9555,
29.09016
]
]
]
}
},
{
"type": "Feature",
"properties": {
"Etapa": "Etapa 1",
"Nombre": "Umbrella-7",
"Tipo": "Lote",
"Calle": "Calle Demo 2",
"Catastro": "CAT-007",
"MetrosCuadrados": 200.0,
"Duplicador": 1,
"Estatus": "Activa"
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
-110.9553,
29.09016
],
[
-110.95512,
29.09016
],
[
-110.95512,
29.0903
],
[
-110.9553,
29.0903
],
[
-110.9553,
29.09016
]
]
]
}
},
{
"type": "Feature",
"properties": {
"Etapa": "Etapa 1",
"Nombre": "Umbrella-8",
"Tipo": "Lote",
"Calle": "Calle Demo 2",
"Catastro": "CAT-008",
"MetrosCuadrados": 200.0,
"Duplicador": 1,
"Estatus": "Activa"
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
-110.9551,
29.09016
],
[
-110.95492,
29.09016
],
[
-110.95492,
29.0903
],
[
-110.9551,
29.0903
],
[
-110.9551,
29.09016
]
]
]
}
},
{
"type": "Feature",
"properties": {
"Etapa": "Etapa 1",
"Nombre": "Umbrella-9",
"Tipo": "Lote",
"Calle": "Calle Demo 2",
"Catastro": "CAT-009",
"MetrosCuadrados": 200.0,
"Duplicador": 1,
"Estatus": "Activa"
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
-110.9549,
29.09016
],
[
-110.95472,
29.09016
],
[
-110.95472,
29.0903
],
[
-110.9549,
29.0903
],
[
-110.9549,
29.09016
]
]
]
}
},
{
"type": "Feature",
"properties": {
"Etapa": "Etapa 1",
"Nombre": "Umbrella-10",
"Tipo": "Lote",
"Calle": "Calle Demo 2",
"Catastro": "CAT-010",
"MetrosCuadrados": 200.0,
"Duplicador": 1,
"Estatus": "Activa"
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
-110.9547,
29.09016
],
[
-110.95452,
29.09016
],
[
-110.95452,
29.0903
],
[
-110.9547,
29.0903
],
[
-110.9547,
29.09016
]
]
]
}
}
]
}

View File

@@ -324,46 +324,7 @@
</div>
</section>
<section class="fraction-content-card">
<div class="fraction-card-heading">
<h3>Últimos trámites</h3>
<asp:LinkButton ID="BtnNewProcedure"
runat="server"
CssClass="btn btn-outline blue"
CausesValidation="false"
OnClick="BtnNewProcedure_Click">
<i class="fa fa-plus"></i>
Agregar trámite
</asp:LinkButton>
</div>
<div class="fraction-table-scroll">
<asp:GridView ID="GvProcedures"
runat="server"
AutoGenerateColumns="false"
GridLines="None"
CssClass="table table-hover Widthall">
<Columns>
<asp:BoundField DataField="TipoTramite" HeaderText="Trámite" />
<asp:BoundField DataField="Folio" HeaderText="Folio" />
<asp:BoundField DataField="Etapa" HeaderText="Etapa" />
<asp:BoundField DataField="EstatusSolicitud" HeaderText="Estatus" />
<asp:BoundField DataField="FechaUltimoEstatus"
HeaderText="Última actualización"
DataFormatString="{0:dd/MM/yyyy HH:mm}" />
</Columns>
<EmptyDataTemplate>
<div class="fraction-empty-state">
<span class="fraction-empty-icon">
<i class="fa fa-clipboard"></i>
</span>
<span>No hay trámites registrados para las etapas.</span>
</div>
</EmptyDataTemplate>
</asp:GridView>
</div>
</section>
</ContentTemplate>
</ajax:TabPanel>
@@ -590,10 +551,85 @@
</span>
</HeaderTemplate>
<ContentTemplate>
<div class="fraction-empty-panel">
<i class="fa fa-clipboard"></i>
<p>Los trámites recientes se muestran en la pestaña Etapas.</p>
</div>
<section class="fraction-content-card">
<div class="fraction-card-heading">
<h3>Trámites del fraccionamiento</h3>
</div>
<sig:Filtros ID="UcProcedureFilters"
runat="server"
EmptyText="No hay filtros aplicados"
OnMostrarFiltrosClick="UcProcedureFilters_MostrarFiltrosClick"
OnFiltrosChanged="UcProcedureFilters_FiltrosChanged"
OnConsultar="UcProcedureFilters_Consultar" />
<div class="fraction-table-scroll">
<asp:GridView ID="GvProcedures"
runat="server"
AutoGenerateColumns="false"
GridLines="None"
DataKeyNames="CveSolicitud"
CssClass="table table-hover Widthall"
OnRowCommand="GvProcedures_RowCommand">
<Columns>
<asp:BoundField
DataField="Folio"
HeaderText="Folio" />
<asp:BoundField
DataField="TipoTramite"
HeaderText="Tipo de trámite" />
<asp:BoundField
DataField="Etapa"
HeaderText="Etapa" />
<asp:TemplateField HeaderText="Estatus">
<ItemTemplate>
<%#: GetProcedureStatusText(Eval("EstatusSolicitud")) %>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField
DataField="FechaInicio"
HeaderText="Fecha inicio"
DataFormatString="{0:dd/MM/yyyy HH:mm}"
HtmlEncode="false" />
<asp:BoundField
DataField="FechaAutorizacion"
HeaderText="Fecha autorización"
DataFormatString="{0:dd/MM/yyyy HH:mm}"
HtmlEncode="false" />
<asp:TemplateField
HeaderText="Acciones"
ItemStyle-Width="150">
<ItemTemplate>
<asp:LinkButton ID="BtnChangeProcedureStatus"
runat="server"
CssClass="btn btn-sm blue"
CausesValidation="false"
Visible='<%# ConvertToBoolean(Eval("PuedeCambiarEstatus")) %>'
CommandName="ChangeStatus"
CommandArgument='<%# Eval("CveSolicitud") %>'>
<i class="fa fa-exchange"></i>
Cambiar estatus
</asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
</Columns>
<EmptyDataTemplate>
<div class="fraction-empty-state">
<span class="fraction-empty-icon">
<i class="fa fa-clipboard"></i>
</span>
<span>No hay trámites que coincidan con los filtros seleccionados.</span>
</div>
</EmptyDataTemplate>
</asp:GridView>
</div>
</section>
</ContentTemplate>
</ajax:TabPanel>
@@ -618,12 +654,137 @@
<HeaderTemplate>
<i class="fa fa-file-text-o"></i>
Documentos
<span class="badge">
<asp:Literal ID="LitDocumentCount" runat="server" />
</span>
</HeaderTemplate>
<ContentTemplate>
<div class="fraction-empty-panel">
<i class="fa fa-file-text-o"></i>
<p>No hay documentos registrados.</p>
</div>
<section class="fraction-content-card">
<div class="fraction-card-heading">
<h3>Documentos del fraccionamiento</h3>
</div>
<sig:Filtros ID="UcDocumentFilters"
runat="server"
EmptyText="No hay filtros aplicados"
OnMostrarFiltrosClick="UcDocumentFilters_MostrarFiltrosClick"
OnFiltrosChanged="UcDocumentFilters_FiltrosChanged"
OnConsultar="UcDocumentFilters_Consultar" />
<div class="fraction-table-scroll">
<asp:GridView ID="GvDocuments"
runat="server"
AutoGenerateColumns="false"
GridLines="None"
CssClass="table table-hover Widthall"
OnRowCommand="GvDocuments_RowCommand">
<Columns>
<asp:TemplateField HeaderText="Archivo">
<ItemTemplate>
<asp:HyperLink ID="LnkDocumentDownload"
runat="server"
Visible='<%# ConvertToBoolean(Eval("TieneArchivo")) %>'
NavigateUrl='<%# GetDocumentDownloadUrl(Eval("CveDocumentoSolicitud")) %>'
Text='<%# EncodeDisplayValue(Convert.ToString(Eval("NombreArchivo"))) %>' />
<asp:Literal ID="LitDocumentMissing"
runat="server"
Visible='<%# !ConvertToBoolean(Eval("TieneArchivo")) %>'
Text="Sin cargar" />
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField
DataField="TipoDocumento"
HeaderText="Tipo de documento" />
<asp:BoundField
DataField="TipoTramite"
HeaderText="Trámite" />
<asp:BoundField
DataField="Etapa"
HeaderText="Etapa" />
<asp:TemplateField HeaderText="Es aprobado">
<ItemTemplate>
<span class='<%# GetDocumentStatusCss(Eval("EstadoDocumento")) %>'>
<%#: Convert.ToString(Eval("EstadoDocumento")) %>
</span>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Nota">
<ItemTemplate>
<%#: GetDocumentNoteText(Eval("Nota")) %>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField
DataField="FechaRevision"
HeaderText="Fecha revisión"
DataFormatString="{0:dd/MM/yyyy HH:mm}"
HtmlEncode="false" />
<asp:TemplateField HeaderText="Acciones" ItemStyle-Width="330">
<ItemTemplate>
<asp:LinkButton ID="BtnDocumentUpload"
runat="server"
CssClass="btn btn-sm blue"
CausesValidation="false"
Visible='<%# ConvertToBoolean(Eval("PuedeActualizarArchivo")) %>'
CommandName="Upload"
CommandArgument='<%# string.Format("{0}|{1}", Eval("CveSolicitud"), Eval("CveTipoDocumento")) %>'>
<i class="fa fa-upload"></i>
<%#: GetDocumentUploadButtonText(Eval("TieneArchivo")) %>
</asp:LinkButton>
<asp:LinkButton ID="BtnDocumentGis"
runat="server"
CssClass="btn btn-sm blue"
CausesValidation="false"
Visible='<%# ConvertToBoolean(Eval("PuedeAdministrarGis")) %>'
CommandName="ManageGis"
CommandArgument='<%# Eval("CveFraccionamientoEtapa") %>'>
<i class="fa fa-map-o"></i>
Administrar GIS
</asp:LinkButton>
<asp:LinkButton ID="BtnDocumentApprove"
runat="server"
CssClass="btn btn-sm green"
CausesValidation="false"
Visible='<%# ConvertToBoolean(Eval("PuedeRevisar")) %>'
CommandName="Approve"
CommandArgument='<%# Eval("CveDocumentoSolicitud") %>'
OnClientClick="return confirm('¿Aprobar este documento?');">
<i class="fa fa-check"></i>
Aprobar
</asp:LinkButton>
<asp:LinkButton ID="BtnDocumentReject"
runat="server"
CssClass="btn btn-sm red"
CausesValidation="false"
Visible='<%# ConvertToBoolean(Eval("PuedeRevisar")) %>'
CommandName="Reject"
CommandArgument='<%# Eval("CveDocumentoSolicitud") %>'>
<i class="fa fa-times"></i>
Rechazar
</asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
</Columns>
<EmptyDataTemplate>
<div class="fraction-empty-state">
<span class="fraction-empty-icon">
<i class="fa fa-file-text-o"></i>
</span>
<span>No hay documentos que coincidan con los filtros seleccionados.</span>
</div>
</EmptyDataTemplate>
</asp:GridView>
</div>
</section>
</ContentTemplate>
</ajax:TabPanel>
@@ -647,10 +808,253 @@
</div>
</div>
<div id="ModalProcedureFilters"
class="modal fade fraction-modal"
tabindex="-1"
role="dialog"
aria-hidden="true">
<div class="modal-dialog">
<asp:UpdatePanel ID="UpProcedureFiltersModal"
runat="server"
UpdateMode="Conditional"
ChildrenAsTriggers="false">
<ContentTemplate>
<div class="modal-content">
<div class="modal-header">
<button type="button"
class="close"
data-dismiss="modal"
aria-label="Cerrar">
&times;
</button>
<h4 class="modal-title">
<i class="fa fa-filter"></i>
Filtros de trámites
</h4>
</div>
<div class="modal-body">
<div class="form-group">
<label>Estatus</label>
<asp:DropDownList ID="DdlProcedureStatus"
runat="server"
CssClass="form-control select2me Widthall"
Style="width:100%;" />
</div>
<div class="form-group">
<label>Tipo de trámite</label>
<asp:DropDownList ID="DdlProcedureType"
runat="server"
CssClass="form-control select2me Widthall"
Style="width:100%;" />
</div>
<div class="form-group">
<label>Etapa</label>
<asp:DropDownList ID="DdlProcedureStage"
runat="server"
CssClass="form-control select2me Widthall"
Style="width:100%;" />
</div>
</div>
<div class="modal-footer">
<button type="button"
class="btn default"
data-dismiss="modal">
Cancelar
</button>
<asp:LinkButton ID="BtnApplyProcedureFilters"
runat="server"
CssClass="btn blue"
CausesValidation="false"
OnClick="BtnApplyProcedureFilters_Click">
<i class="fa fa-filter"></i>
Filtrar
</asp:LinkButton>
</div>
</div>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger
ControlID="BtnApplyProcedureFilters"
EventName="Click" />
</Triggers>
</asp:UpdatePanel>
</div>
</div>
<div id="ModalDocumentFilters"
class="modal fade fraction-modal"
tabindex="-1"
role="dialog"
aria-hidden="true">
<div class="modal-dialog">
<asp:UpdatePanel ID="UpDocumentFiltersModal"
runat="server"
UpdateMode="Conditional"
ChildrenAsTriggers="false">
<ContentTemplate>
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Cerrar">&times;</button>
<h4 class="modal-title"><i class="fa fa-filter"></i> Filtros de documentos</h4>
</div>
<div class="modal-body">
<div class="form-group">
<label>Tipo de trámite</label>
<asp:DropDownList ID="DdlDocumentProcedureType"
runat="server"
CssClass="form-control select2me Widthall"
Style="width:100%;" />
</div>
<div class="form-group">
<label>Etapa</label>
<asp:DropDownList ID="DdlDocumentStage"
runat="server"
CssClass="form-control select2me Widthall"
Style="width:100%;" />
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn default" data-dismiss="modal">Cancelar</button>
<asp:LinkButton ID="BtnApplyDocumentFilters"
runat="server"
CssClass="btn blue"
CausesValidation="false"
OnClick="BtnApplyDocumentFilters_Click">
<i class="fa fa-filter"></i> Filtrar
</asp:LinkButton>
</div>
</div>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="BtnApplyDocumentFilters" EventName="Click" />
</Triggers>
</asp:UpdatePanel>
</div>
</div>
<div id="ModalDocumentUpload"
class="modal fade fraction-modal"
tabindex="-1"
role="dialog"
aria-hidden="true">
<div class="modal-dialog">
<asp:UpdatePanel ID="UpDocumentUploadModal"
runat="server"
UpdateMode="Conditional">
<ContentTemplate>
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Cerrar">&times;</button>
<h4 class="modal-title">
<i class="fa fa-upload"></i>
<asp:Literal ID="LitDocumentUploadTitle" runat="server" />
</h4>
</div>
<div class="modal-body">
<asp:Label ID="LblDocumentUploadMessage"
runat="server"
CssClass="alert alert-danger"
Visible="false" />
<div class="well well-sm">
<strong><asp:Literal ID="LitDocumentUploadType" runat="server" /></strong><br />
<span><asp:Literal ID="LitDocumentUploadContext" runat="server" /></span>
</div>
<div class="form-group">
<label>Archivo</label>
<asp:FileUpload ID="FuDocument"
runat="server"
CssClass="form-control" />
<span class="help-block">
<asp:Literal ID="LitDocumentUploadRules" runat="server" />
</span>
</div>
<div class="form-group">
<label>Comentario</label>
<asp:TextBox ID="TxtDocumentClientComment"
runat="server"
CssClass="form-control"
TextMode="MultiLine"
Rows="3"
MaxLength="1000" />
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn default" data-dismiss="modal">Cancelar</button>
<asp:Button ID="BtnSaveDocumentUpload"
runat="server"
CssClass="btn blue"
Text="Guardar archivo"
OnClick="BtnSaveDocumentUpload_Click" />
</div>
</div>
</ContentTemplate>
<Triggers>
<asp:PostBackTrigger ControlID="BtnSaveDocumentUpload" />
</Triggers>
</asp:UpdatePanel>
</div>
</div>
<div id="ModalDocumentReject"
class="modal fade fraction-modal"
tabindex="-1"
role="dialog"
aria-hidden="true">
<div class="modal-dialog">
<asp:UpdatePanel ID="UpDocumentRejectModal"
runat="server"
UpdateMode="Conditional">
<ContentTemplate>
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Cerrar">&times;</button>
<h4 class="modal-title"><i class="fa fa-times"></i> Rechazar documento</h4>
</div>
<div class="modal-body">
<asp:Label ID="LblDocumentRejectMessage"
runat="server"
CssClass="alert alert-danger"
Visible="false" />
<p>Capture la nota o motivo del rechazo. Esta nota se mostrará en la lista de documentos.</p>
<div class="form-group">
<label>Nota</label>
<asp:TextBox ID="TxtDocumentRejectNote"
runat="server"
CssClass="form-control"
TextMode="MultiLine"
Rows="4"
MaxLength="1000" />
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn default" data-dismiss="modal">Cancelar</button>
<asp:LinkButton ID="BtnConfirmDocumentReject"
runat="server"
CssClass="btn red"
CausesValidation="false"
OnClick="BtnConfirmDocumentReject_Click">
<i class="fa fa-times"></i> Rechazar
</asp:LinkButton>
</div>
</div>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</div>
<sig:BitacoraGrid ID="UcBitacoraDetalle"
runat="server"
Titulo="Bitácora"
Descripcion="Historial del fraccionamiento, sus etapas y lotes"
Descripcion="Historial del fraccionamiento, sus etapas, lotes, trámites y documentos"
TextoVacio="No hay movimientos registrados para este fraccionamiento."
RegistrosPorPagina="20"
ScrollsParaCambiarPagina="3" />
@@ -925,6 +1329,76 @@
</div>
</div>
<div id="ModalProcedureStatus"
class="modal fade fraction-modal"
tabindex="-1"
role="dialog"
aria-hidden="true">
<div class="modal-dialog">
<asp:UpdatePanel ID="UpProcedureStatusModal"
runat="server"
UpdateMode="Conditional"
ChildrenAsTriggers="false">
<ContentTemplate>
<div class="modal-content">
<div class="modal-header">
<button type="button"
class="close"
data-dismiss="modal"
aria-label="Cerrar">
&times;
</button>
<h4 class="modal-title">Cambiar estatus del trámite</h4>
</div>
<div class="modal-body">
<asp:Label ID="LblProcedureStatusMessage"
runat="server"
CssClass="alert alert-danger sig-modal-message"
role="alert"
Visible="false" />
<div class="fraction-selected-stage">
<span>Solicitud</span>
<strong>
<asp:Literal ID="LitProcedureStatusFolio"
runat="server" />
</strong>
</div>
<div class="form-group">
<label>Estatus *</label>
<asp:DropDownList ID="DdlProcedureNewStatus"
runat="server"
CssClass="form-control" />
</div>
</div>
<div class="modal-footer">
<button type="button"
class="btn default"
data-dismiss="modal">
Cancelar
</button>
<asp:Button ID="BtnSaveProcedureStatus"
runat="server"
CssClass="btn blue"
Text="Guardar estatus"
CausesValidation="false"
OnClick="BtnSaveProcedureStatus_Click" />
</div>
</div>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger
ControlID="BtnSaveProcedureStatus"
EventName="Click" />
</Triggers>
</asp:UpdatePanel>
</div>
</div>
<div id="ModalStageGis"
class="modal fade fraction-modal"
tabindex="-1"
@@ -1383,6 +1857,14 @@
window.SIGDetail.hideModal('#ModalStageProgress');
};
window.SIGDetail.showProcedureStatus = function () {
window.SIGDetail.initializeModal('#ModalProcedureStatus');
};
window.SIGDetail.hideProcedureStatus = function () {
window.SIGDetail.hideModal('#ModalProcedureStatus');
};
window.SIGDetail.showStageGis = function () {
window.SIGDetail.initializeModal('#ModalStageGis');
};

File diff suppressed because it is too large Load Diff

View File

@@ -191,15 +191,6 @@ namespace SIG.Web.Pages.Fraccionamientos
/// </remarks>
protected global::System.Web.UI.WebControls.LinkButton BtnStageOrderMove;
/// <summary>
/// BtnNewProcedure control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.LinkButton BtnNewProcedure;
/// <summary>
/// GvProcedures control.
/// </summary>
@@ -337,6 +328,36 @@ namespace SIG.Web.Pages.Fraccionamientos
/// </remarks>
protected global::System.Web.UI.WebControls.Literal LitProcedureCount;
/// <summary>
/// UcProcedureFilters control.
/// </summary>
protected global::SIG.Web.AppCode.SigControls.Filtros UcProcedureFilters;
/// <summary>
/// UpProcedureFiltersModal control.
/// </summary>
protected global::System.Web.UI.UpdatePanel UpProcedureFiltersModal;
/// <summary>
/// DdlProcedureStatus control.
/// </summary>
protected global::System.Web.UI.WebControls.DropDownList DdlProcedureStatus;
/// <summary>
/// DdlProcedureType control.
/// </summary>
protected global::System.Web.UI.WebControls.DropDownList DdlProcedureType;
/// <summary>
/// DdlProcedureStage control.
/// </summary>
protected global::System.Web.UI.WebControls.DropDownList DdlProcedureStage;
/// <summary>
/// BtnApplyProcedureFilters control.
/// </summary>
protected global::System.Web.UI.WebControls.LinkButton BtnApplyProcedureFilters;
/// <summary>
/// TabPayments control.
/// </summary>
@@ -355,6 +376,106 @@ namespace SIG.Web.Pages.Fraccionamientos
/// </remarks>
protected global::AjaxControlToolkit.TabPanel TabDocuments;
/// <summary>
/// LitDocumentCount control.
/// </summary>
protected global::System.Web.UI.WebControls.Literal LitDocumentCount;
/// <summary>
/// UcDocumentFilters control.
/// </summary>
protected global::SIG.Web.AppCode.SigControls.Filtros UcDocumentFilters;
/// <summary>
/// GvDocuments control.
/// </summary>
protected global::System.Web.UI.WebControls.GridView GvDocuments;
/// <summary>
/// UpDocumentFiltersModal control.
/// </summary>
protected global::System.Web.UI.UpdatePanel UpDocumentFiltersModal;
/// <summary>
/// DdlDocumentProcedureType control.
/// </summary>
protected global::System.Web.UI.WebControls.DropDownList DdlDocumentProcedureType;
/// <summary>
/// DdlDocumentStage control.
/// </summary>
protected global::System.Web.UI.WebControls.DropDownList DdlDocumentStage;
/// <summary>
/// BtnApplyDocumentFilters control.
/// </summary>
protected global::System.Web.UI.WebControls.LinkButton BtnApplyDocumentFilters;
/// <summary>
/// UpDocumentUploadModal control.
/// </summary>
protected global::System.Web.UI.UpdatePanel UpDocumentUploadModal;
/// <summary>
/// LitDocumentUploadTitle control.
/// </summary>
protected global::System.Web.UI.WebControls.Literal LitDocumentUploadTitle;
/// <summary>
/// LblDocumentUploadMessage control.
/// </summary>
protected global::System.Web.UI.WebControls.Label LblDocumentUploadMessage;
/// <summary>
/// LitDocumentUploadType control.
/// </summary>
protected global::System.Web.UI.WebControls.Literal LitDocumentUploadType;
/// <summary>
/// LitDocumentUploadContext control.
/// </summary>
protected global::System.Web.UI.WebControls.Literal LitDocumentUploadContext;
/// <summary>
/// FuDocument control.
/// </summary>
protected global::System.Web.UI.WebControls.FileUpload FuDocument;
/// <summary>
/// LitDocumentUploadRules control.
/// </summary>
protected global::System.Web.UI.WebControls.Literal LitDocumentUploadRules;
/// <summary>
/// TxtDocumentClientComment control.
/// </summary>
protected global::System.Web.UI.WebControls.TextBox TxtDocumentClientComment;
/// <summary>
/// BtnSaveDocumentUpload control.
/// </summary>
protected global::System.Web.UI.WebControls.Button BtnSaveDocumentUpload;
/// <summary>
/// UpDocumentRejectModal control.
/// </summary>
protected global::System.Web.UI.UpdatePanel UpDocumentRejectModal;
/// <summary>
/// LblDocumentRejectMessage control.
/// </summary>
protected global::System.Web.UI.WebControls.Label LblDocumentRejectMessage;
/// <summary>
/// TxtDocumentRejectNote control.
/// </summary>
protected global::System.Web.UI.WebControls.TextBox TxtDocumentRejectNote;
/// <summary>
/// BtnConfirmDocumentReject control.
/// </summary>
protected global::System.Web.UI.WebControls.LinkButton BtnConfirmDocumentReject;
/// <summary>
/// TabNotes control.
/// </summary>
@@ -538,6 +659,31 @@ namespace SIG.Web.Pages.Fraccionamientos
/// </summary>
protected global::System.Web.UI.WebControls.Button BtnSaveStageProgress;
/// <summary>
/// UpProcedureStatusModal control.
/// </summary>
protected global::System.Web.UI.UpdatePanel UpProcedureStatusModal;
/// <summary>
/// LblProcedureStatusMessage control.
/// </summary>
protected global::System.Web.UI.WebControls.Label LblProcedureStatusMessage;
/// <summary>
/// LitProcedureStatusFolio control.
/// </summary>
protected global::System.Web.UI.WebControls.Literal LitProcedureStatusFolio;
/// <summary>
/// DdlProcedureNewStatus control.
/// </summary>
protected global::System.Web.UI.WebControls.DropDownList DdlProcedureNewStatus;
/// <summary>
/// BtnSaveProcedureStatus control.
/// </summary>
protected global::System.Web.UI.WebControls.Button BtnSaveProcedureStatus;
/// <summary>
/// UpStageGisModal control.
/// </summary>

View File

@@ -1,248 +0,0 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace SIG.Web.Pages.Fraccionamientos
{
public partial class Fraccionamientos
{
/// <summary>
/// UpActions control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.UpdatePanel UpActions;
/// <summary>
/// BtnNew control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.LinkButton BtnNew;
/// <summary>
/// UpCatalog control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.UpdatePanel UpCatalog;
/// <summary>
/// UcFiltros control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::SIG.Web.AppCode.SigControls.Filtros UcFiltros;
/// <summary>
/// LitTotal control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Literal LitTotal;
/// <summary>
/// LitActive control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Literal LitActive;
/// <summary>
/// LitStages control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Literal LitStages;
/// <summary>
/// GvDevelopments control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.GridView GvDevelopments;
/// <summary>
/// ProgressCatalog control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.UpdateProgress ProgressCatalog;
/// <summary>
/// UpFilterModal control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.UpdatePanel UpFilterModal;
/// <summary>
/// ClientFilterField control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.HtmlControls.HtmlGenericControl ClientFilterField;
/// <summary>
/// DdlClientFilter control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.DropDownList DdlClientFilter;
/// <summary>
/// TxtSearch control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.TextBox TxtSearch;
/// <summary>
/// ChkIncludeInactive control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.CheckBox ChkIncludeInactive;
/// <summary>
/// BtnApplyFilters control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Button BtnApplyFilters;
/// <summary>
/// UpNewDevelopment control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.UpdatePanel UpNewDevelopment;
/// <summary>
/// LblModalMessage control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Label LblModalMessage;
/// <summary>
/// ClientEditField control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.HtmlControls.HtmlGenericControl ClientEditField;
/// <summary>
/// DdlEditClient control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.DropDownList DdlEditClient;
/// <summary>
/// TxtDevelopment control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.TextBox TxtDevelopment;
/// <summary>
/// TxtHectares control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.TextBox TxtHectares;
/// <summary>
/// DdlEditStatus control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.DropDownList DdlEditStatus;
/// <summary>
/// TxtLocation control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.TextBox TxtLocation;
/// <summary>
/// ChkActive control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.CheckBox ChkActive;
/// <summary>
/// BtnSave control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Button BtnSave;
/// <summary>
/// UcBitacoraCatalogo control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::SIG.Web.AppCode.SigControls.BitacoraGrid UcBitacoraCatalogo;
}
}

View File

@@ -0,0 +1 @@
<%@ WebHandler Language="C#" Class="SIG.Web.Pages.Fraccionamientos.TramiteDocumentoHandler" %>

View File

@@ -1,43 +0,0 @@
namespace SIG.Web.Pages.Security
{
public partial class RegistroCliente
{
protected global::System.Web.UI.HtmlControls.HtmlForm form1;
protected global::System.Web.UI.ScriptManager SM;
protected global::System.Web.UI.UpdatePanel UpRegistro;
protected global::System.Web.UI.HtmlControls.HtmlGenericControl StepUser;
protected global::System.Web.UI.HtmlControls.HtmlGenericControl StepCompany;
protected global::System.Web.UI.WebControls.Label LblMessage;
protected global::System.Web.UI.WebControls.MultiView MvRegistration;
protected global::System.Web.UI.WebControls.View ViewUser;
protected global::System.Web.UI.WebControls.TextBox TxtUsername;
protected global::System.Web.UI.WebControls.TextBox TxtEmail;
protected global::System.Web.UI.WebControls.TextBox TxtPassword;
protected global::System.Web.UI.WebControls.TextBox TxtConfirmPassword;
protected global::System.Web.UI.WebControls.Button BtnNext;
protected global::System.Web.UI.WebControls.View ViewCompany;
protected global::System.Web.UI.WebControls.TextBox TxtBusinessName;
protected global::System.Web.UI.WebControls.TextBox TxtTradeName;
protected global::System.Web.UI.WebControls.TextBox TxtRfc;
protected global::System.Web.UI.WebControls.TextBox TxtAddress;
protected global::System.Web.UI.WebControls.TextBox TxtExterior;
protected global::System.Web.UI.WebControls.TextBox TxtInterior;
protected global::System.Web.UI.WebControls.DropDownList DdlNeighborhood;
protected global::System.Web.UI.WebControls.TextBox TxtCity;
protected global::System.Web.UI.WebControls.DropDownList DdlState;
protected global::System.Web.UI.WebControls.TextBox TxtCountry;
protected global::System.Web.UI.WebControls.TextBox TxtPostalCode;
protected global::System.Web.UI.WebControls.LinkButton BtnSearchPostalCode;
protected global::System.Web.UI.WebControls.Label LblPostalStatus;
protected global::System.Web.UI.WebControls.HiddenField HfCvePais;
protected global::System.Web.UI.WebControls.HiddenField HfCveMunicipio;
protected global::System.Web.UI.WebControls.HiddenField HfCveLocalidad;
protected global::System.Web.UI.WebControls.HiddenField HfResolvedPostalCode;
protected global::System.Web.UI.WebControls.TextBox TxtPhone;
protected global::System.Web.UI.WebControls.Panel PnlCaptchaSection;
protected global::System.Web.UI.WebControls.Panel PnlCaptcha;
protected global::System.Web.UI.WebControls.Label LblCaptchaConfiguration;
protected global::System.Web.UI.WebControls.Button BtnBack;
protected global::System.Web.UI.WebControls.Button BtnRegister;
}
}

View File

@@ -1 +0,0 @@
namespace SIG.Web.Pages.Security { public partial class RegistroPendiente { protected global::System.Web.UI.HtmlControls.HtmlForm form1; } }

View File

@@ -1 +0,0 @@
namespace SIG.Web.Pages.Security { public partial class VerificarCorreo { protected global::System.Web.UI.HtmlControls.HtmlForm form1; protected global::System.Web.UI.WebControls.Literal LitTitle; protected global::System.Web.UI.WebControls.Literal LitMessage; } }

View File

@@ -1829,17 +1829,34 @@ function ADDropzoneLocal(txtid) {
this.value = '';
});
/*
* El input file vive dentro de mydiv. Si usamos input.trigger('click'),
* el click burbujea nuevamente a mydiv y vuelve a disparar el input,
* provocando recursión infinita (Maximum call stack size exceeded).
*/
input.on('click', function (event) {
event.stopPropagation();
});
mydiv.on('click', function (event) {
if ($(event.target).is('button')) {
if ($(event.target).closest('button, input[type="file"]').length) {
return;
}
input.trigger('click');
var fileInput = input.get(0);
if (fileInput) {
fileInput.click();
}
});
mydiv.on('keydown', function (event) {
if (event.which === 13 || event.which === 32) {
event.preventDefault();
input.trigger('click');
var fileInput = input.get(0);
if (fileInput) {
fileInput.click();
}
}
});