orden etapas

This commit is contained in:
Jorge Luis caudillo esparza
2026-08-18 03:22:46 -07:00
parent 330129d24d
commit da4af4cb2a
7 changed files with 331 additions and 62 deletions

View File

@@ -29,6 +29,12 @@ namespace SIG.Web.AppCode.Contracts.Fraccionamientos
string domainName);
DbResult<List<FraccionamientoEtapaTramiteModel>> ListStageProcedures(int developmentId, int executingUser, string domainName);
DbResult<int> SaveStage(FraccionamientoEtapaModel stage, int executingUser, string domainName);
DbResult<bool> MoveStageOrder(
int stageId,
int referenceStageId,
bool placeAfter,
int executingUser,
string domainName);
DbResult<bool> DeleteStage(int stageId, int executingUser, string domainName);
DbResult<List<FraccionamientoLoteModel>> ListLots(
int developmentId,

View File

@@ -32,6 +32,12 @@ namespace SIG.Web.AppCode.Contracts.Fraccionamientos
string domainName);
DbResult<List<FraccionamientoEtapaTramiteModel>> ListStageProcedures(int developmentId, int executingUser, string domainName);
DbResult<int> SaveStage(FraccionamientoEtapaModel stage, int executingUser, string domainName);
DbResult<bool> MoveStageOrder(
int stageId,
int referenceStageId,
bool placeAfter,
int executingUser,
string domainName);
DbResult<bool> DeleteStage(int stageId, int executingUser, string domainName);
DbResult<List<FraccionamientoLoteModel>> ListLots(
int developmentId,

View File

@@ -205,11 +205,41 @@ namespace SIG.Web.AppCode.Repositories.Fraccionamientos
StoredProcedureCommand.AddInput(command, "@CveFraccionamiento", stage.CveFraccionamiento, DbType.Int32);
StoredProcedureCommand.AddInput(command, "@Etapa", stage.Etapa, DbType.String);
StoredProcedureCommand.AddInput(command, "@Hectareas", stage.Hectareas, DbType.Decimal);
StoredProcedureCommand.AddInput(command, "@Orden", stage.Orden, DbType.Int32);
StoredProcedureCommand.AddInput(command, "@EsActivo", stage.EsActivo, DbType.Boolean);
});
}
public DbResult<bool> MoveStageOrder(
int stageId,
int referenceStageId,
bool placeAfter,
int executingUser,
string domainName)
{
return Execute(
"dbo.PA_Fraccionamientos_EtapaOrdenMove",
executingUser,
domainName,
command =>
{
StoredProcedureCommand.AddInput(
command,
"@CveFraccionamientoEtapa",
stageId,
DbType.Int32);
StoredProcedureCommand.AddInput(
command,
"@CveFraccionamientoEtapaReferencia",
referenceStageId,
DbType.Int32);
StoredProcedureCommand.AddInput(
command,
"@ColocarDespues",
placeAfter,
DbType.Boolean);
});
}
public DbResult<bool> DeleteStage(int stageId, int executingUser, string domainName)
{
return Execute(

View File

@@ -305,41 +305,176 @@ namespace SIG.Web.AppCode.Services.Fraccionamientos
bool isNewStage = stage.CveFraccionamientoEtapa <= 0;
stage.Etapa = stage.Etapa.Trim();
Func<DbResult<int>> saveAction = () => _repository.SaveStage(
stage,
executingUser,
domainName);
if (isNewStage)
using (var transaction = new TransactionLogic())
{
return ExecuteInTransaction(
() => _repository.Get(
stage.CveFraccionamiento,
FraccionamientoEtapaModel previous = null;
int clientId;
if (isNewStage)
{
DbResult<FraccionamientoModel> developmentResult =
_repository.Get(
stage.CveFraccionamiento,
executingUser,
domainName);
if (!developmentResult.Success ||
developmentResult.Data == null)
{
return DbResult<int>.Fail(
developmentResult.UserMessage,
developmentResult.TechnicalMessage,
developmentResult.Exception);
}
clientId = developmentResult.Data.CveCliente;
}
else
{
DbResult<FraccionamientoEtapaModel> previousResult =
_repository.GetStage(
stage.CveFraccionamientoEtapa,
executingUser,
domainName);
if (!previousResult.Success ||
previousResult.Data == null)
{
return DbResult<int>.Fail(
previousResult.UserMessage,
previousResult.TechnicalMessage,
previousResult.Exception);
}
previous = previousResult.Data;
clientId = previous.CveCliente;
}
DbResult<int> saveResult = _repository.SaveStage(
stage,
executingUser,
domainName);
if (!saveResult.Success)
{
return saveResult;
}
DbResult<FraccionamientoEtapaModel> currentResult =
_repository.GetStage(
saveResult.Data,
executingUser,
domainName),
saveAction,
(development, stageId) => SingleEvent(
domainName);
if (!currentResult.Success || currentResult.Data == null)
{
return DbResult<int>.Fail(
currentResult.UserMessage,
currentResult.TechnicalMessage,
currentResult.Exception);
}
DbResult<bool> auditResult = RegisterEvents(
SingleEvent(
FraccionamientoBitacoraFactory.CreateStage(
null,
stage,
stageId,
development.CveCliente,
BitacoraTipoMovimiento.Agregado)));
previous,
currentResult.Data,
saveResult.Data,
clientId,
isNewStage
? BitacoraTipoMovimiento.Agregado
: BitacoraTipoMovimiento.Editado)));
if (!auditResult.Success)
{
return DbResult<int>.Fail(
auditResult.UserMessage,
auditResult.TechnicalMessage,
auditResult.Exception);
}
transaction.Commit();
return saveResult;
}
}
public DbResult<bool> MoveStageOrder(
int stageId,
int referenceStageId,
bool placeAfter,
int executingUser,
string domainName)
{
if (stageId <= 0 ||
referenceStageId <= 0 ||
stageId == referenceStageId)
{
return Fail<bool>(
"Seleccione una posición válida para mover la etapa.");
}
return ExecuteInTransaction(
() => _repository.GetStage(
stage.CveFraccionamientoEtapa,
executingUser,
domainName),
saveAction,
(previous, stageId) => SingleEvent(
FraccionamientoBitacoraFactory.CreateStage(
previous,
stage,
using (var transaction = new TransactionLogic())
{
DbResult<FraccionamientoEtapaModel> previousResult =
_repository.GetStage(
stageId,
previous.CveCliente,
BitacoraTipoMovimiento.Editado)));
executingUser,
domainName);
if (!previousResult.Success || previousResult.Data == null)
{
return DbResult<bool>.Fail(
previousResult.UserMessage,
previousResult.TechnicalMessage,
previousResult.Exception);
}
DbResult<bool> moveResult = _repository.MoveStageOrder(
stageId,
referenceStageId,
placeAfter,
executingUser,
domainName);
if (!moveResult.Success)
{
return moveResult;
}
DbResult<FraccionamientoEtapaModel> currentResult =
_repository.GetStage(
stageId,
executingUser,
domainName);
if (!currentResult.Success || currentResult.Data == null)
{
return DbResult<bool>.Fail(
currentResult.UserMessage,
currentResult.TechnicalMessage,
currentResult.Exception);
}
DbResult<bool> auditResult = RegisterEvents(
SingleEvent(
FraccionamientoBitacoraFactory.CreateStage(
previousResult.Data,
currentResult.Data,
stageId,
previousResult.Data.CveCliente,
BitacoraTipoMovimiento.Editado)));
if (!auditResult.Success)
{
return DbResult<bool>.Fail(
auditResult.UserMessage,
auditResult.TechnicalMessage,
auditResult.Exception);
}
transaction.Commit();
return moveResult;
}
}
public DbResult<bool> DeleteStage(

View File

@@ -9,6 +9,9 @@
<link href='<%= ResolveUrl("~/Styles/FraccionamientoDetalle.css?v=20260814-5") %>'
rel="stylesheet"
type="text/css" />
<link href='<%= ResolveUrl("~/Styles/CatalogosTramites.css") %>'
rel="stylesheet"
type="text/css" />
</asp:Content>
<asp:Content ID="ContentActions" ContentPlaceHolderID="A" runat="server">
@@ -216,6 +219,15 @@
CssClass="table table-hover Widthall"
OnRowCommand="GvStages_RowCommand">
<Columns>
<asp:TemplateField HeaderText="" ItemStyle-CssClass="tra-order-cell">
<ItemTemplate>
<span class="tra-order-handle"
data-sig-order-id='<%# Eval("CveFraccionamientoEtapa") %>'
title="Arrastrar para cambiar el orden">
<i class="fa fa-bars"></i>
</span>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="Etapa" HeaderText="Etapa" />
<asp:BoundField DataField="Hectareas"
HeaderText="Hectáreas"
@@ -246,7 +258,6 @@
</span>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="Orden" HeaderText="Orden" />
<asp:TemplateField HeaderText="Acciones" ItemStyle-Width="120">
<ItemTemplate>
<asp:LinkButton ID="BtnAddLots"
@@ -301,6 +312,12 @@
</div>
</EmptyDataTemplate>
</asp:GridView>
<asp:HiddenField ID="HfStageOrderMove" runat="server" />
<asp:LinkButton ID="BtnStageOrderMove"
runat="server"
CausesValidation="false"
Style="display: none;"
OnClick="BtnStageOrderMove_Click" />
</div>
</section>
@@ -808,14 +825,6 @@
MaxLength="30" />
</div>
<div class="form-group">
<label>Orden</label>
<asp:TextBox ID="TxtStageOrder"
runat="server"
CssClass="form-control"
MaxLength="6" />
</div>
<asp:CheckBox ID="ChkStageActive"
runat="server"
Text=" Etapa activa" />
@@ -1300,6 +1309,8 @@
</asp:Content>
<asp:Content ID="ContentScripts" ContentPlaceHolderID="J" runat="server">
<script src='<%= ResolveUrl("~/Scripts/CatalogosTramites.js") %>'
type="text/javascript"></script>
<script>
window.SIGDetail = window.SIGDetail || {};

View File

@@ -149,6 +149,8 @@ namespace SIG.Web.Pages.Fraccionamientos
#endregion
protected void Page_Load(object sender, EventArgs e)
{
ConfigureStageOrderGrid();
ScriptManager scriptManager = ScriptManager.GetCurrent(Page);
if (scriptManager != null)
@@ -400,16 +402,6 @@ namespace SIG.Web.Pages.Fraccionamientos
return;
}
int order;
if (!int.TryParse(
TxtStageOrder.Text,
out order))
{
ShowStageError("Capture un orden válido.");
return;
}
var stage = new FraccionamientoEtapaModel
{
CveFraccionamientoEtapa =
@@ -417,7 +409,6 @@ namespace SIG.Web.Pages.Fraccionamientos
CveFraccionamiento = CveFraccionamientoActual,
Etapa = TxtStage.Text,
Hectareas = hectares,
Orden = order,
EsActivo = ChkStageActive.Checked
};
@@ -731,6 +722,54 @@ namespace SIG.Web.Pages.Fraccionamientos
}
}
protected void BtnStageOrderMove_Click(
object sender,
EventArgs e)
{
int stageId;
int referenceStageId;
bool placeAfter;
if (!TryParseStageOrderMove(
HfStageOrderMove.Value,
out stageId,
out referenceStageId,
out placeAfter))
{
Alert(
"No fue posible determinar la nueva posición de la etapa.",
TipoMensaje.MsgAdvertencia);
BindStages();
UpDetailTabs.Update();
return;
}
DbResult<bool> result =
AppServices.FraccionamientoService.MoveStageOrder(
stageId,
referenceStageId,
placeAfter,
CurrentUser.CveUsuario,
CurrentUser.NombreDominio);
HfStageOrderMove.Value = string.Empty;
BindStages();
UpDetailTabs.Update();
if (result.Success)
{
RefreshBitacoraDetalle();
}
Alert(
result.Success
? "Orden de etapas actualizado correctamente."
: result.UserMessage,
result.Success
? TipoMensaje.ToastExito
: TipoMensaje.MsgAdvertencia);
}
protected void GvLots_RowCommand(
object sender,
GridViewCommandEventArgs e)
@@ -864,8 +903,6 @@ namespace SIG.Web.Pages.Fraccionamientos
TxtStage.Text = stage.Etapa;
TxtStageHectares.Text =
FormatDecimal(stage.Hectareas);
TxtStageOrder.Text = stage.Orden
.ToString(CultureInfo.InvariantCulture);
ChkStageActive.Checked = stage.EsActivo;
LitStageTitle.Text = "Editar etapa";
@@ -1832,10 +1869,45 @@ namespace SIG.Web.Pages.Fraccionamientos
CveFraccionamientoEtapaActual = 0;
TxtStage.Text = string.Empty;
TxtStageHectares.Text = string.Empty;
TxtStageOrder.Text = "0";
ChkStageActive.Checked = true;
}
private void ConfigureStageOrderGrid()
{
GvStages.Attributes["data-sig-order-grid"] = "1";
GvStages.Attributes["data-sig-order-payload"] =
HfStageOrderMove.ClientID;
GvStages.Attributes["data-sig-order-postback"] =
BtnStageOrderMove.ClientID;
}
private static bool TryParseStageOrderMove(
string payload,
out int stageId,
out int referenceStageId,
out bool placeAfter)
{
stageId = 0;
referenceStageId = 0;
placeAfter = false;
string[] parts = (payload ?? string.Empty).Split('|');
if (parts.Length != 3 ||
!int.TryParse(parts[0], out stageId) ||
!int.TryParse(parts[1], out referenceStageId) ||
(parts[2] != "0" && parts[2] != "1"))
{
return false;
}
placeAfter = parts[2] == "1";
return stageId > 0 &&
referenceStageId > 0 &&
stageId != referenceStageId;
}
private void ShowEditError(string message)
{
LblEditMessage.Text = Server.HtmlEncode(

View File

@@ -173,6 +173,24 @@ namespace SIG.Web.Pages.Fraccionamientos
/// </remarks>
protected global::System.Web.UI.WebControls.GridView GvStages;
/// <summary>
/// HfStageOrderMove 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.HiddenField HfStageOrderMove;
/// <summary>
/// BtnStageOrderMove 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 BtnStageOrderMove;
/// <summary>
/// BtnNewProcedure control.
/// </summary>
@@ -482,15 +500,6 @@ namespace SIG.Web.Pages.Fraccionamientos
/// </remarks>
protected global::System.Web.UI.WebControls.TextBox TxtStageHectares;
/// <summary>
/// TxtStageOrder 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 TxtStageOrder;
/// <summary>
/// ChkStageActive control.
/// </summary>