Finalizacion de Orden Produccion

This commit is contained in:
Luis Quijada
2025-04-02 16:15:55 -07:00
parent a40c5b9cb9
commit 1eb75a4ec5
5 changed files with 1441 additions and 231 deletions

View File

@@ -408,6 +408,33 @@ Public Class ClsOP
#Region "O R D E N E S D E P R O D U C C I O N"
Public Function OPAdd(Descripcion As String, CveCliente As Integer, CveEmpresa As Integer, CveUsuario As Integer, Fecha As Date, CveSubProyecto As Integer, xmlproductos As String, ByRef CveOP As Integer, ByRef Folio As Integer) As Boolean
Dim Retorno As Boolean = False
DataAdapter("PA_OP_OrdendeProduccionAdd")
With SqlAdapter.SelectCommand.Parameters
.Add("@Descripcion", SqlDbType.VarChar).Value = Descripcion
.Add("@CveCliente", SqlDbType.Int).Value = CveCliente
.Add("@CveEmpresa", SqlDbType.Int).Value = CveEmpresa
.Add("@CveUsuario", SqlDbType.Int).Value = CveUsuario
.Add("@Fecha", SqlDbType.Date).Value = Fecha
.Add("@CveSubProyecto", SqlDbType.Int).Value = CveSubProyecto
.Add("@xmlproductos", SqlDbType.Xml).Value = xmlproductos
.Add("@CveOP", SqlDbType.Int).Direction = ParameterDirection.Output
.Add("@Folio", SqlDbType.Int).Value = ParameterDirection.Output
End With
Try
SqlAdapter.Fill(Data)
CveOP = CInt(SqlAdapter.SelectCommand.Parameters("@CveOP").Value)
Folio = CInt(SqlAdapter.SelectCommand.Parameters("@Folio").Value)
Retorno = True
Catch ex As Exception
OnError("Ocurrió un error al agregar la Orden de Produccion.", ex, SqlAdapter.SelectCommand.Parameters.ParametrosInfo())
Retorno = False
End Try
Return Retorno
End Function
Public Function GetReportesOP(CveOP As Integer, CveCliente As Integer, CveSubProyecto As Integer, CvePS As Integer, CveEstatus As Integer, Asignado As Integer, FechaI As Date, FechaF As Date, CveEmpresa As Integer) As Boolean
Dim Retorno As Boolean = False
DataAdapter("PA_OP_OrdendeProduccionGet")
@@ -474,6 +501,27 @@ Public Class ClsOP
Return Retorno
End Function
Public Function UpdateEstatusOP(CveOP As Integer, CveEstatusOP As Integer, CveEmpresa As Integer) As Boolean
Dim Retorno As Boolean = False
DataAdapter("PA_OP_OrdendeProduccionEstatusUp")
With SqlAdapter.SelectCommand.Parameters
.Add("@CveOP", SqlDbType.Int).Value = CveOP
.Add("@CveEstatusOP", SqlDbType.Int).Value = CveEstatusOP
.Add("@CveEmpresa", SqlDbType.Int).Value = CveEmpresa
End With
Try
SqlAdapter.Fill(Data)
Retorno = True ' Éxito si no hay excepciones
Catch ex As Exception
OnError("Error al actualizar estatus de la OP", ex, SqlAdapter.SelectCommand.Parameters.ParametrosInfo)
Retorno = False
End Try
Return Retorno
End Function
Public Function UpdateOP(CveOP As Integer, Descripcion As String, CveCliente As Integer, CvePS As Integer, CveSubProyecto As Integer, Cantidad As Integer, Fecha As Date, CveEmpresa As Integer, CveUsuario As Integer) As Boolean
Dim Retorno As Boolean = False
DataAdapter("PA_OP_OrdendeProduccionUp")

View File

@@ -335,7 +335,7 @@ Partial Class Inventarios_TrasladoSolicitud
Dim CodigoPS As String = ""
For Each row As GridViewRow In GvDatos.Rows
Existencia = ObjInventarios.GetExistenciasPS(row.DataKey("CvePS").ToEntero, row.DataKey("CveUM").ToEntero, UsuarioActual.CveEmpresa, DdlAlmacenOrigen.SelectedValue.ToEntero, FechaMovto:=NowADS.ToString("yyyy/MM/dd 23:59"), Lote:=row.DataKey("Lote").ToString, FechaCaducidad:=row.DataKey("FechaCaducidad").ToString.ToDate)
Existencia = ObjInventarios.GetExistenciasPS(row.DataKey("CvePS").ToEntero, row.DataKey("CveUM").ToEntero, UsuarioActual.CveEmpresa, DdlAlmacenOrigen.SelectedValue.ToEntero, FechaMovto:=NowADS.ToString("yyyy/MM/dd 23:59"), FechaCaducidad:=row.DataKey("FechaCaducidad").ToString.ToDate)
If Existencia - TempDT.SUM("Cantidad", $"CvePS = {row.DataKey("CvePS").ToEntero} AND CveUM = {row.DataKey("CveUM").ToEntero}") < 0 Then
CodigoPS = GlobalDTPSSimplificado(UsuarioActual.CveEmpresa, CvePS:=row.DataKey("CvePS").ToEntero).FiltroPrimeroValor("PSCodigo", "")
MensajeExistencia.AppendFormat("<br/> - <b>{0}.</b> Existencia: {1}", CodigoPS, Existencia)

View File

@@ -1,9 +1,227 @@
<%@ Page Title="" Language="VB" MasterPageFile="~/Site.master" AutoEventWireup="false" CodeFile="OP.aspx.vb" Inherits="OP_OP" %>
<%@ Import Namespace="Extensiones" %>
<%@ Page Title="" Language="VB" MasterPageFile="~/Site.master" AutoEventWireup="false" CodeFile="OP.aspx.vb" Inherits="OP_OP" %>
<asp:Content ID="Content1" ContentPlaceHolderID="CP" runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="Css" runat="Server">
<style>
.v-center {
display: flex;
align-items: center;
}
.ajax__calendar_container {
position: fixed !important;
}
.one {
margin: 10px;
padding: 10px;
}
.btn-verde {
color: #32c5d2;
background-color: #fff;
border-color: #32c5d2;
}
.btn-verde .fa-plus {
color: #32c5d2 !important;
}
.btn-verde:hover {
color: #fff;
background-color: #32c5d2;
border-color: #32c5d2;
}
.btn-verde:hover .fa-plus {
color: white !important;
}
.table-scrollable {
margin-top: 0px !important;
margin-bottom: 0px !important;
}
.Widthall {
width: 100% !important;
}
.dataTables_scrollHeadInner {
width: 100% !important;
background-color: #dddddd;
padding-left: 0px !important;
}
.dataTables_scrollFoot {
display: none;
position: static;
}
.table-scrollable {
margin: 0px !important;
}
.dataTables_scroll {
margin-bottom: 0px;
}
.table.dataTable {
margin-top: 0px !important;
}
.dataTables_scrollBody table th {
padding: 0px !important;
padding-right: 4px !important;
padding-left: 4px !important;
}
.sinlink td a {
pointer-events: none;
cursor: default;
color: black;
font-size: small;
}
.white a {
color: white !important;
}
.Derecha {
text-align: right;
}
.Izquierda {
text-align: left;
}
.SinColor th {
background-color: white;
}
.Excede {
overflow: hidden;
text-overflow: ellipsis;
}
.truncate {
width: 300px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.select2 .select2-selection__rendered {
line-height: 1;
color: #111;
}
.select2 .select2-selection--multiple {
box-sizing: border-box;
cursor: pointer;
display: block;
min-height: 20px;
user-select: none;
-webkit-user-select: none;
}
.select2-container--default .select2-selection--multiple .select2-selection__choice {
margin-top: 10px;
}
.select2-selection__rendered {
margin-top: 0px;
height: 25px;
}
.select2-selection {
margin-top: 0px;
height: 31px;
}
.select2-container--default.select2-container--focus .select2-selection--multiple {
border: none;
outline: 0;
}
#chartdiv {
width: 100%;
height: 250px;
}
#chartdiv2 {
width: 100%;
height: 250px;
}
#chartdiv3 {
width: 100%;
height: 250px;
}
#chartdiv4 {
width: 100%;
height: 250px;
}
.orange {
color: orange;
background-color: orange;
}
.tooltip-inner {
max-width: 750px !important;
font-size: 14px;
}
.arrow {
left: 20%;
}
.popover {
width: 500px !important;
max-width: 500px !important;
}
.modalBackground {
background-color: Black;
filter: alpha(opacity=90);
opacity: 0.8;
}
.select2anothertable {
position: absolute;
left: 100%;
background-color: white;
/*top: 50px;*/ top: 21px;
/*max-height: 200px;*/ max-height: 229px;
/*background-color: #dcdcdc;*/
overflow: hidden;
}
.select2anothertable > table > tbody > tr > td:nth-of-type(odd) {
background-color: rgba(220, 220, 220, 0.45);
}
.select2anothertable > table > tbody > tr > td {
line-height: 21px;
white-space: nowrap;
}
.select2anothertable > table > tbody > tr.active {
background-color: #5897fb;
}
#C_TrDescuentoProntoPago > td:nth-child(3) > span:nth-child(1) > label:nth-child(2) {
white-space: nowrap;
}
.op-container {
max-width: 1400px;
margin: 20px auto;
@@ -61,12 +279,6 @@
padding: 5px;
margin-top: 10px;
}
.box {
background-color: #EEE;
margin-bottom: 10px;
padding: 10px;
}
</style>
</asp:Content>
@@ -81,109 +293,177 @@
</asp:Content>
<asp:Content ID="Content7" ContentPlaceHolderID="C" runat="Server">
<!-- Aquí se muestra la información de la OP -->
<asp:UpdatePanel ID="UpOP" runat="server" UpdateMode="Conditional">
<div class="row">
<asp:UpdatePanel ID="UpOP" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<div class="col-md-6">
<div class="portlet light xspadding bordered">
<div class="portlet-title">
<div class="caption font-green">
<span class="caption-subject bold uppercase">Orden de producción #<asp:Label ID="LblFolio" runat="server"></asp:Label></span>
</div>
</div>
<div class="portlet-body form">
<div class="labeltruncate labeltext labelbold">
<div class="row">
<div class="col-md-6">
<div class="form-group form-md-line-input input-iconright">
<label for="<%= DdlClientes.ClientID.ToString()%>">Cliente</label>
<ADS:Dropdownlost ID="DdlClientes" runat="server"
CssClassDdl="form-control" DataTextField="NombreComercial"
data-metodo="getcliente"
DataValueField="CveCliente" Enabled="false" />
</div>
</div>
</div>
<!-- Centro de Costo -->
<div class="portlet-body form">
<div class="labeltruncate labeltext labelbold">
<div class="row">
<div class="col-md-16">
<div class="form-group form-md-line-input input-iconright">
<asp:Label ID="LblProyecto" runat="server">
<label>Proyecto:</label>
</asp:Label>
<div runat="server" id="DivProyecto">
<asp:DropDownList ID="DdlProyecto" runat="server" AutoPostBack="true" AppendDataBoundItems="true" DataTextField="Proyecto" DataValueField="CveProyecto" Class="form-control select2me" Style="width: 100%;"></asp:DropDownList>
</div>
<asp:Label ID="LblSubProyecto" runat="server" class="col-md-2">
<label>Subproyecto:</label>
</asp:Label>
<div runat="server" id="DivSubProyecto" class="col-md-4">
<asp:DropDownList ID="DdlSubProyecto" runat="server" AppendDataBoundItems="true" DataTextField="SubProyecto" DataValueField="CveSubProyecto" Class="form-control select2me" Style="width: 100%;"></asp:DropDownList>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Descripción -->
<div class="row">
<div class="col-md-10">
<div class="form-group form-md-line-input input-iconright">
<asp:TextBox ID="TxtDescripcion" runat="server"
CssClass="form-control"
Style="width: 95%; height: 40px;"
ValidationGroup="GrpGuardar"
TextMode="MultiLine"
Rows="2"
MaxLength="1000" />
<asp:RequiredFieldValidator ID="RFVDescripcion" runat="server"
ControlToValidate="TxtDescripcion"
ErrorMessage="Descripción requerida"
Display="None"
CssClass="text-danger"
ValidationGroup="GrpGuardar" />
<label for="<%= TxtDescripcion.ClientID.ToString()%>">Descripcion</label>
</div>
</div>
</div>
<!-- Fecha -->
<div class="form-section">
<div class="row">
<div class="form-group">
<div class="col-md-1">
<label class="mb-0">Fecha</label>
</div>
<div class="col-md-2">
<div class="input-group input-sm input-small date date-picker " data-date-format="dd/mm/yyyy" style="width: 100px !important; padding: 0px;">
<asp:TextBox Width="80px" ID="Txtfecha" runat="server" CssClass="form-control" CausesValidation="true" MaxLength="10"></asp:TextBox>
<span class="input-group-btn ">
<asp:LinkButton ID="imgCalendarioF" class="btn default " Text="<i class='fa fa-calendar'></i>" runat="server"></asp:LinkButton>
</span>
</div>
<ajax:MaskedEditExtender ID="MEEFechaF" runat="server" TargetControlID="Txtfecha" Mask="99/99/9999" MaskType="Date" DisplayMoney="Left" AcceptNegative="Left"></ajax:MaskedEditExtender>
<ajax:CalendarExtender runat="server" ID="Calendario2" TargetControlID="Txtfecha" PopupButtonID="imgCalendarioF" PopupPosition="BottomRight" Enabled="True"></ajax:CalendarExtender>
<asp:RequiredFieldValidator ID="rfvFechaF" runat="server" ControlToValidate="Txtfecha" Display="None" ErrorMessage="El campo <b>''Fecha Final''</b> es requerido por la aplicación, por favor ingrese una fecha." ValidationGroup="Valida"></asp:RequiredFieldValidator>
<asp:CompareValidator ID="cvFechaF" runat="server" ControlToValidate="Txtfecha" Display="None" ErrorMessage="El campo <b>''Fecha Final''</b> no tienes el formato correcto, por favor intente de nuevo con el siguiente formato: (dd/mm/yyyy)." Operator="DataTypeCheck" Type="Date" ValidationGroup="Valida"></asp:CompareValidator>
<ajax:ValidatorCalloutExtender ID="vcoRfvFF" runat="server" HighlightCssClass="vco" TargetControlID="rfvFechaF" Width="350px"></ajax:ValidatorCalloutExtender>
<ajax:ValidatorCalloutExtender ID="vcoCvFF" runat="server" HighlightCssClass="vco" TargetControlID="cvFechaF" Width="350px"></ajax:ValidatorCalloutExtender>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-3">
<div class="portlet light xspadding bordered">
<div class="portlet-title">
<div class="caption font-green">
<span class="caption-subject bold uppercase">Estatus</span>
</div>
</div>
<div class="portlet-body form">
<asp:TextBox ID="TxtEstatus" runat="server" CssClass="form-control" Width="150px"></asp:TextBox>
<asp:RequiredFieldValidator ID="RFVEstatus" runat="server"
ControlToValidate="TxtEstatus"
Display="Dynamic"
ErrorMessage="Estatus requerido"
CssClass="text-danger"
ValidationGroup="GrpGuardar" />
</div>
</div>
</div>
</ContentTemplate>
</asp:UpdatePanel>
</div>
<!-- GridViews -->
<asp:UpdatePanel ID="UpGvDatosOP" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<div class="op-container">
<!-- Encabezado -->
<div class="op-header">
<h3 class="op-title">Orden de producción #<asp:Label ID="LblCveOP" runat="server"></asp:Label></h3>
<div class="op-status">
<label>Estatus:</label>
<asp:TextBox ID="TxtEstatus" runat="server" CssClass="form-control" Width="150px"></asp:TextBox>
<asp:RequiredFieldValidator ID="RFVEstatus" runat="server"
ControlToValidate="TxtEstatus"
Display="Dynamic"
ErrorMessage="Estatus requerido"
CssClass="text-danger"
ValidationGroup="GrpGuardar" />
</div>
</div>
<div class="form-section">
<div class="form-group">
<label>Cliente</label>
<ADS:Dropdownlost ID="DdlClientes" runat="server"
CssClassDdl="form-control" DataTextField="NombreComercial"
data-metodo="getcliente"
DataValueField="CveCliente" Enabled="false" />
</div>
</div>
<!-- Centro de Costo -->
<div class="form-section">
<div class="form-group">
<asp:Label ID="LblProyecto" runat="server" class="col-md-1">
<span class="filtro-texto">Proyecto:</span>
</asp:Label>
<div runat="server" id="DivProyecto" class="col-md-2">
<asp:DropDownList ID="DdlProyecto" runat="server" AutoPostBack="true" AppendDataBoundItems="true" DataTextField="Proyecto" DataValueField="CveProyecto" Class="table-group-action-input form-control input-inline input-small input-sm select2me" Style="width: 100%;"></asp:DropDownList>
<div class="row">
<div class="col-md-12">
<div class="portlet light xspadding bordered">
<div class="portlet-title">
<div class="caption font-green">
<span class="caption-subject bold uppercase">Productos</span>
</div>
</div>
<asp:Label ID="LblSubProyecto" runat="server" class="col-md-1">
<span class="filtro-texto">Subproyecto:</span>
</asp:Label>
<div runat="server" id="DivSubProyecto" class="col-md-2">
<asp:DropDownList ID="DdlSubProyecto" runat="server" AppendDataBoundItems="true" DataTextField="SubProyecto" DataValueField="CveSubProyecto" Class="table-group-action-input form-control input-inline input-small input-sm select2me" Style="width: 100%;"></asp:DropDownList>
<div class="portlet-body">
<div class="row">
<label class="col-md-1" style="max-width: 70px;">Producto</label>
<div class="col-md-3">
<ADS:Dropdownlost ID="DdlPS" runat="server" Width="100%" CssStyle="width: 100%;"
CssClass="select2me"
CssClassDdl="form-control" DataTextField="PSCodigo"
DataValueField="CvePS" Enabled="false" />
</div>
<div class="col-md-4 d-flex align-items-center" style="gap: 10px;">
<asp:LinkButton ID="BtnAgregarProducto" runat="server"
CssClass="btn btn-primary"
Style="padding: 4px 10px; border-radius: 50%;"
ValidationGroup="GrpAgregarProducto">
<i class="fa fa-plus"></i>
</asp:LinkButton>
<!-- Botón de Simulación -->
<asp:LinkButton ID="BtnSimularMP" runat="server" Text="Simular MP"
CssClass="btn btn-primary" OnClick="BtnSimularMP_Click" Visible="false"
Style="padding: 4px 10px; border-radius: 50%;">
<i class="fa fa-cogs"></i>
</asp:LinkButton>
</div>
</div>
</div>
</div>
</div>
<!-- Descripción -->
<div class="form-group">
<label>Descripción</label>
<asp:TextBox ID="TxtDescripcion" runat="server"
CssClass="form-control"
TextMode="MultiLine"
Rows="2" />
<asp:RequiredFieldValidator ID="RFVDescripcion" runat="server"
ControlToValidate="TxtDescripcion"
ErrorMessage="Descripción requerida"
Display="Dynamic"
CssClass="text-danger"
ValidationGroup="GrpGuardar" />
</div>
<!-- Fecha -->
<div class="row">
<div class="col-md-1">
<label class="mb-0">Fecha</label>
</div>
<div class="col-md-2">
<div class="input-group input-sm input-small date date-picker " data-date-format="dd/mm/yyyy" style="width: 100px !important; padding: 0px;">
<asp:TextBox Width="80px" ID="Txtfecha" runat="server" CssClass="form-control" CausesValidation="true" MaxLength="10"></asp:TextBox>
<span class="input-group-btn ">
<asp:LinkButton ID="imgCalendarioF" class="btn default " Text="<i class='fa fa-calendar'></i>" runat="server"></asp:LinkButton>
</span>
</div>
<ajax:MaskedEditExtender ID="MEEFechaF" runat="server" TargetControlID="Txtfecha" Mask="99/99/9999" MaskType="Date" DisplayMoney="Left" AcceptNegative="Left"></ajax:MaskedEditExtender>
<ajax:CalendarExtender runat="server" ID="Calendario2" TargetControlID="Txtfecha" PopupButtonID="imgCalendarioF" PopupPosition="BottomRight" Enabled="True"></ajax:CalendarExtender>
<asp:RequiredFieldValidator ID="rfvFechaF" runat="server" ControlToValidate="Txtfecha" Display="None" ErrorMessage="El campo <b>''Fecha Final''</b> es requerido por la aplicación, por favor ingrese una fecha." ValidationGroup="Valida"></asp:RequiredFieldValidator>
<asp:CompareValidator ID="cvFechaF" runat="server" ControlToValidate="Txtfecha" Display="None" ErrorMessage="El campo <b>''Fecha Final''</b> no tienes el formato correcto, por favor intente de nuevo con el siguiente formato: (dd/mm/yyyy)." Operator="DataTypeCheck" Type="Date" ValidationGroup="Valida"></asp:CompareValidator>
<ajax:ValidatorCalloutExtender ID="vcoRfvFF" runat="server" HighlightCssClass="vco" TargetControlID="rfvFechaF" Width="350px"></ajax:ValidatorCalloutExtender>
<ajax:ValidatorCalloutExtender ID="vcoCvFF" runat="server" HighlightCssClass="vco" TargetControlID="cvFechaF" Width="350px"></ajax:ValidatorCalloutExtender>
</div>
</div>
<!-- Producto -->
<div class="form-group">
<label class="col-md-2">Producto:</label>
<div class="col-md-4">
<ADS:Dropdownlost ID="DdlPS" runat="server"
CssClassDdl="form-control" DataTextField="PSCodigo"
DataValueField="CvePS" Enabled="false" />
</div>
<asp:Button ID="BtnAgregarProducto" runat="server" Text="Agregar Producto"
CssClass="btn btn-primary" ValidationGroup="GrpAgregarProducto" />
<asp:Button ID="BtnEliminarProducto" runat="server" Text="Eliminar Producto"
CssClass="btn-eliminar" OnClick="BtnEliminarProducto_Click" />
</div>
<!-- GridViews -->
<asp:UpdatePanel ID="UpGvDatosOP" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<div class="row">
<div class="col-md-12 box">
<div class="col-md-12">
<div class="section-title">Productos</div>
<asp:GridView ID="GvProductos" runat="server" AutoGenerateColumns="False"
CssClass="table table-striped table-hover" GridLines="None" Width="100%">
@@ -191,60 +471,347 @@
<asp:BoundField DataField="PSCodigo" HeaderText="Producto" />
<asp:BoundField DataField="UnidadMedida" HeaderText="UM" />
<asp:BoundField DataField="Cantidad" HeaderText="Cantidad" />
<asp:TemplateField>
<ItemTemplate>
<asp:LinkButton ID="BtnEliminar" runat="server"
CommandArgument='<%# Eval("Clave") %>'
OnClick="BtnEliminarProducto_Click"
CssClass="btn btn-circle btn-xs red"
Text="<i class='icon-trash'></i>" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</div>
</div>
<div class="row">
<div class="col-md-6 box">
<div class="section-title">Materia prima</div>
<asp:GridView ID="GvMateriaPrima" runat="server" AutoGenerateColumns="False"
CssClass="table table-striped table-hover" GridLines="None" Width="100%">
<Columns>
<asp:BoundField DataField="producto" HeaderText="Producto" />
<asp:BoundField DataField="UnidadMedida" HeaderText="UM" />
<asp:BoundField DataField="Cantidad" HeaderText="Cantidad" DataFormatString="{0:#,##0.####}" ItemStyle-HorizontalAlign="Right" />
<asp:BoundField DataField="Surtido" HeaderText="Surtido" ItemStyle-HorizontalAlign="Right"/>
</Columns>
</asp:GridView>
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="portlet light xspadding bordered">
<div class="portlet-title">
<div class="caption font-green">
<span class="caption-subject bold uppercase">Materia Prima</span>
</div>
<div class="col-md-4 d-flex align-items-center" style="gap: 10px;">
<asp:LinkButton ID="LnkSolicitarMP" runat="server"
CssClass="btn btn-success"
OnClick="LnkSolicitarMP_Click"
Style="padding: 4px 10px; border-radius: 50%;"
Visible="false">
Solicitar MP
</asp:LinkButton>
</div>
</div>
<div class="col-md-6 box">
<div class="portlet-body">
<div class="section-title">Materia prima</div>
<asp:GridView ID="GvMateriaPrima" runat="server" AutoGenerateColumns="False"
CssClass="table table-striped table-hover" GridLines="None" Width="100%">
<Columns>
<asp:BoundField DataField="PSCodigo" HeaderText="Producto" />
<asp:BoundField DataField="UnidadMedida" HeaderText="UM" />
<asp:BoundField DataField="Cantidad" HeaderText="Cantidad" DataFormatString="{0:#,##0.####}" ItemStyle-HorizontalAlign="Right" />
<asp:BoundField DataField="Surtido" HeaderText="Surtido" DataFormatString="{0:#,##0.####}" ItemStyle-HorizontalAlign="Right" />
</Columns>
</asp:GridView>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="portlet light xspadding bordered">
<div class="portlet-title">
<div class="caption font-green">
<span class="caption-subject bold uppercase">Mano de Obra</span>
</div>
</div>
<div class="portlet-body">
<div class="section-title">Mano de obra</div>
<asp:GridView ID="GvManoObra" runat="server" AutoGenerateColumns="False"
CssClass="table table-striped table-hover" GridLines="None" Width="100%">
<Columns>
<asp:BoundField DataField="Puesto" HeaderText="Puesto" />
<asp:BoundField DataField="Cantidad" HeaderText="Cantidad" />
<asp:BoundField DataField="Cantidad" HeaderText="Cantidad" DataFormatString="{0:#,##0.####}" ItemStyle-HorizontalAlign="Right" />
</Columns>
</asp:GridView>
</div>
<div class="row">
<div class="col-md-6 box">
<div class="section-title">Costo indirecto</div>
<asp:GridView ID="GvCostosIndirectos" runat="server" AutoGenerateColumns="False"
CssClass="table table-striped table-hover" GridLines="None" Width="100%">
<Columns>
<asp:BoundField DataField="producto" HeaderText="Producto" />
<asp:BoundField DataField="Cantidad" HeaderText="Costo" />
</Columns>
</asp:GridView>
</div>
</div>
<div class="col-md-6">
<div class="portlet light xspadding bordered">
<div class="portlet-title">
<div class="caption font-green">
<span class="caption-subject bold uppercase">Costo Indirecto</span>
</div>
</div>
</ContentTemplate>
</asp:UpdatePanel>
<!-- Botón para Guardar la OP -->
<div class="form-group" style="margin-top: 20px;">
<asp:Button ID="BtnGuardarOP" runat="server" Text="Guardar Orden de Producción"
CssClass="btn btn-success" OnClick="BtnGuardarOP_Click"
ValidationGroup="GrpGuardar" />
<div class="portlet-body">
<div class="section-title">Costo indirecto</div>
<asp:GridView ID="GvCostosIndirectos" runat="server" AutoGenerateColumns="False"
CssClass="table table-striped table-hover" GridLines="None" Width="100%">
<Columns>
<asp:BoundField DataField="productoMateriaPrima" HeaderText="Producto" />
<asp:BoundField DataField="Cantidad" HeaderText="Costo" DataFormatString="{0:#,##0.####}" ItemStyle-HorizontalAlign="Right" />
</Columns>
</asp:GridView>
</div>
</div>
</div>
</div>
</ContentTemplate>
</asp:UpdatePanel>
<div id="DVModalSolicitarMP" class="modal ADS fade" role="dialog" data-backdrop="static">
<div class="modal-dialog" style="width: 750px;">
<asp:UpdatePanel runat="server" class="modal-content" ID="UpModalMP" UpdateMode="Conditional">
<ContentTemplate>
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">×</button>
<h4 class="modal-title">Solicitar Materia Prima - OP #<%= LblFolio.Text %></h4>
</div>
<div class="modal-body">
<!-- Almacenes -->
<div class="row">
<div class="col-md-6 form-group">
<label>Almacén Origen:</label>
<asp:DropDownList ID="DdlAlmacenOrigenMP" runat="server"
DataTextField="Almacen" DataValueField="CveAlmacen"
CssClass="form-control select2me" AutoPostBack="true"
OnSelectedIndexChanged="DdlAlmacenOrigenMP_SelectedIndexChanged" />
</div>
<div class="col-md-6 form-group">
<label>Almacén Destino:</label>
<asp:DropDownList ID="DdlAlmacenDestinoMP" runat="server"
DataTextField="Almacen" DataValueField="CveAlmacen"
CssClass="form-control select2me" />
</div>
</div>
<div class="row marginRowLeft">
<div class="col-md-12 form-group">
<label>Observaciones:</label>
<asp:TextBox ID="TxtObservacionesMP" runat="server"
CssClass="form-control" TextMode="MultiLine" Rows="3"
MaxLength="500" placeholder="Ingrese observaciones..." />
</div>
</div>
<!-- Grid de productos agregados -->
<asp:GridView ID="GvMPAgregados" runat="server" AutoGenerateColumns="False"
CssClass="table table-striped table-hover" GridLines="None" Width="100%"
DataKeyNames="CvePSMateriaPrima,CveUMMateriaPrima, Cantidad" EmptyDataText="No se encontraron Productos registrados" ToolTip="Listado de Productos">
<Columns>
<asp:BoundField DataField="PSCodigo" HeaderText="Producto" />
<asp:BoundField DataField="UnidadMedida" HeaderText="UM" />
<asp:BoundField DataField="Cantidad" HeaderText="Cantidad" DataFormatString="{0:N2}" ItemStyle-HorizontalAlign="Right" />
</Columns>
</asp:GridView>
</div>
<div class="modal-footer">
<asp:Button ID="BtnGuardarSolicitudMP" runat="server"
Text="Guardar Solicitud" CssClass="btn btn-primary"
OnClick="BtnGuardarSolicitudMP_Click" />
</div>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</div>
<div id="DVModalSimularMP" class="modal fade" role="dialog" data-backdrop="static">
<div class="modal-dialog" style="width: 750px;">
<asp:UpdatePanel ID="UpModalSimular" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">Simulación de Materia Prima -
<span id="SpanNombreProducto" runat="server"></span>
</h4>
</div>
<div class="modal-body">
<div class="row">
<div class="col-md-12">
<div class="portlet light xspadding bordered">
<div class="portlet-title">
<div class="caption font-green">
<span class="caption-subject bold uppercase">Simulación</span>
</div>
<div class="row">
<div class="col-md-12">
<asp:RadioButtonList ID="RblModoSimulacion" runat="server" AutoPostBack="true"
OnSelectedIndexChanged="RblModoSimulacion_SelectedIndexChanged" RepeatDirection="Horizontal">
<asp:ListItem Text="Por Cantidad" Value="1" Selected="True"></asp:ListItem>
<asp:ListItem Text="Por Existencias" Value="2"></asp:ListItem>
</asp:RadioButtonList>
</div>
</div>
<div class="row">
<div class="col-md-6">
<label>Almacén:</label>
<asp:DropDownList ID="DdlAlmacenSimular" runat="server"
DataTextField="Almacen" DataValueField="CveAlmacen"
CssClass="form-control" AutoPostBack="true"
OnSelectedIndexChanged="DdlAlmacenSimular_SelectedIndexChanged"
AppendDataBoundItems="True">
<asp:ListItem Text="Selecciona el almacén" Value="-1" Selected="True"></asp:ListItem>
</asp:DropDownList>
</div>
</div>
<div class="row">
<asp:Panel ID="PnlCantidad" runat="server" class="col-md-2">
<label>Cantidad:</label>
<asp:TextBox ID="TxtCantidadSimular" runat="server"
CssClass="form-control" TextMode="Number" Min="1" Value="1" AutoPostBack="true" OnTextChanged="TxtCantidadSimular_TextChanged" />
</asp:Panel>
</div>
<div class="row">
<asp:Label ID="LblCantidadPosibleGlobal" runat="server" Class="col-md-2"
Visible="false">
<strong>Cantidad:</strong> <span id="SpanCantidad">0</span>
</asp:Label>
</div>
<div class="section-title">Materia prima</div>
<asp:GridView ID="GvSimulacionMP" runat="server" AutoGenerateColumns="False"
CssClass="table table-striped table-hover"
GridLines="None" Width="100%" DataKeyNames="CvePS,CveUM">
<Columns>
<asp:BoundField DataField="productoMateriaPrima" HeaderText="Producto" />
<asp:BoundField DataField="CantidadUnitaria" HeaderText="Cantidad Unitaria"
DataFormatString="{0:#,##0.####}" ItemStyle-HorizontalAlign="Right" />
<asp:BoundField DataField="Disponible" HeaderText="Disponible"
DataFormatString="{0:#,##0.####}" ItemStyle-HorizontalAlign="Right" />
<asp:BoundField DataField="TotalRequerido" HeaderText="Total Requerido"
DataFormatString="{0:#,##0.####}" ItemStyle-HorizontalAlign="Right"
Visible="false" />
<asp:BoundField DataField="Faltante" HeaderText="Faltante"
DataFormatString="{0:#,##0.####}" ItemStyle-HorizontalAlign="Right"
Visible="false" />
<asp:BoundField DataField="CantidadPosible" HeaderText="Cantidad Producible"
DataFormatString="{0:#,##0.####}" ItemStyle-HorizontalAlign="Right"
Visible="false" />
</Columns>
</asp:GridView>
</div>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Cerrar</button>
</div>
</div>
</div>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</div>
<!-- Botón para Guardar la OP -->
<div class="form-group" style="margin-top: 20px;">
<asp:Button ID="BtnGuardarOP" runat="server" Text="Guardar Orden de Producción"
CssClass="btn btn-success" OnClick="BtnGuardarOP_Click"
ValidationGroup="GrpGuardar" />
</div>
<div class="row mt-4">
<div class="col-md-12 d-flex justify-content-end">
<asp:Button ID="BtnFinalizarOP" runat="server" Text="Terminar"
CssClass="btn btn-success mr-2" OnClick="BtnFinalizarOP_Click"
Visible="false" />
</div>
</div>
<div id="DVModalFinalizarOP" class="modal ADS fade" role="dialog" data-backdrop="static">
<div class="modal-dialog" style="width: 750px;">
<asp:UpdatePanel runat="server" class="modal-content" ID="UpModalFinalizar" UpdateMode="Conditional">
<ContentTemplate>
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">×</button>
<h4 class="modal-title">Finalizar Orden de Producción #<%= LblFolio.Text %></h4>
</div>
<div class="modal-body">
<!-- Almacén de Materia Prima (Fijo) -->
<div class="row">
<div class="col-md-6 form-group">
<label>Almacén de Salida (Materia Prima):</label>
<asp:DropDownList ID="DdlAlmacenOrigenSalidaMP" runat="server"
DataTextField="Almacen" DataValueField="CveAlmacen"
CssClass="form-control select2me" />
</div>
<!-- Almacén de Producto Terminado (Dropdown) -->
<div class="col-md-6 form-group">
<label>Almacén de Entrada (Producto Terminado):</label>
<asp:DropDownList ID="DdlAlmacenTerminado" runat="server"
DataTextField="Almacen" DataValueField="CveAlmacen"
CssClass="form-control select2me" />
</div>
</div>
<!-- GridViews -->
<div class="row">
<div class="col-md-12">
<div class="section-title">Producto Terminado</div>
<asp:GridView ID="GvProductoTerminado" runat="server" AutoGenerateColumns="False"
CssClass="table table-striped table-hover" GridLines="None" Width="100%">
<Columns>
<asp:BoundField DataField="PSCodigo" HeaderText="Producto" />
<asp:BoundField DataField="UnidadMedida" HeaderText="UM" />
<asp:BoundField DataField="Cantidad" HeaderText="Cantidad" DataFormatString="{0:N2}" />
</Columns>
</asp:GridView>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="section-title">Materia Prima</div>
<asp:GridView ID="GvMPUtilizada" runat="server" AutoGenerateColumns="False"
CssClass="table table-striped table-hover" GridLines="None" Width="100%">
<Columns>
<asp:BoundField DataField="PSCodigo" HeaderText="Producto" />
<asp:BoundField DataField="Cantidad" HeaderText="Cantidad" DataFormatString="{0:N2}" />
</Columns>
</asp:GridView>
</div>
</div>
</div>
<div class="modal-footer">
<%-- Botón Guardar --%>
<asp:Button ID="BtnGuardarFinalizarOP" runat="server" Text="Guardar"
CssClass="btn btn-primary" OnClick="BtnGuardarFinalizarOP_Click" />
<%-- Botón Cerrar --%>
<button type="button" class="btn btn-default" data-dismiss="modal">Cerrar</button>
</div>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</div>
</asp:Content>

View File

@@ -5,6 +5,9 @@ Imports System.IO
Imports Extensiones
Imports Microsoft.Reporting.WebForms
Imports Org.BouncyCastle.Asn1.Utilities
Imports Profact.TimbraCFDI.Complementos.Ecc.Ecc11
Imports System.Xml
Imports System.Data.SqlClient
Partial Class OP_OP
Inherits ClsPaginas
@@ -54,6 +57,23 @@ Partial Class OP_OP
End Set
End Property
Private Property DtMPAgregados As DataTable
Get
If ViewState("DtMPAgregados") Is Nothing Then
DtMPAgregados = New DataTable()
DtMPAgregados.Columns.Add("Clave", GetType(Integer))
DtMPAgregados.Columns.Add("PSCodigo", GetType(String))
DtMPAgregados.Columns.Add("CveUM", GetType(Integer))
DtMPAgregados.Columns.Add("UnidadMedida", GetType(String))
DtMPAgregados.Columns.Add("Cantidad", GetType(Decimal))
End If
Return CType(ViewState("DtMPAgregados"), DataTable)
End Get
Set(value As DataTable)
ViewState("DtMPAgregados") = value
End Set
End Property
#End Region
@@ -72,27 +92,37 @@ Partial Class OP_OP
DtPS.Columns.Add("PSCodigo", GetType(String))
DtPS.Columns.Add("UnidadMedida", GetType(String))
DtPS.Columns.Add("Cantidad", GetType(Decimal))
DtPS.Columns.Add("CveUM", GetType(Integer))
DtPS.Columns.Add("Surtido", GetType(Decimal))
DtPS.Columns.Add("Costo", GetType(Decimal))
DtMP = New DataTable()
DtMP.Columns.Add("Tipo", GetType(String)) ' Producto, MP, MO, CI
DtMP.Columns.Add("Clave", GetType(Integer))
DtMP.Columns.Add("Producto", GetType(String))
DtMP.Columns.Add("CvePSMateriaPrima", GetType(Integer))
DtMP.Columns.Add("CveUM", GetType(Integer))
DtMP.Columns.Add("CveUMMateriaPrima", GetType(Integer))
DtMP.Columns.Add("PSCodigo", GetType(String))
DtMP.Columns.Add("UnidadMedida", GetType(String))
DtMP.Columns.Add("Cantidad", GetType(Decimal))
DtMP.Columns.Add("Surtido", GetType(Decimal))
'DtMP.Columns.Add("CveAlmacenDestino", GetType(Integer))
DtMO = New DataTable()
DtMO.Columns.Add("Tipo", GetType(String)) ' Producto, MP, MO, CI
DtMO.Columns.Add("Clave", GetType(Integer))
DtMO.Columns.Add("CveUM", GetType(Integer))
DtMO.Columns.Add("CvePuesto", GetType(Integer))
DtMO.Columns.Add("Puesto", GetType(String))
DtMO.Columns.Add("Cantidad", GetType(Decimal))
DtCI = New DataTable()
DtCI.Columns.Add("Tipo", GetType(String)) ' Producto, MP, MO, CI
DtCI.Columns.Add("Clave", GetType(Integer))
DtCI.Columns.Add("Producto", GetType(String))
'DtCI.Columns.Add("CveUM", GetType(Integer))
'DtCI.Columns.Add("CvePSMateriaPrima", GetType(Integer))
'DtCI.Columns.Add("CveUMMateriaPrima", GetType(Integer))
DtCI.Columns.Add("productoMateriaPrima", GetType(String))
DtCI.Columns.Add("Cantidad", GetType(Decimal))
@@ -105,17 +135,20 @@ Partial Class OP_OP
CargarProductos()
If CveOP = -1 Then
' Modo registro: mostrar dropdowns y ocultar los TextBox
DdlClientes.Enabled = True
DdlProyecto.Enabled = True
DdlSubProyecto.Enabled = True
DdlPS.Enabled = True
LnkSolicitarMP.Visible = False
BtnSimularMP.Visible = True
BtnFinalizarOP.Visible = False
Else
DdlClientes.Enabled = False
DdlProyecto.Enabled = False
DdlSubProyecto.Enabled = False
DdlPS.Enabled = False
LnkSolicitarMP.Visible = False
BtnSimularMP.Visible = False
BtnFinalizarOP.Visible = True
CargaDatos()
End If
End Sub
@@ -127,18 +160,76 @@ Partial Class OP_OP
Dim DTOP As DataTable = ObjOP.DtResultados
If DTOP.Rows.Count > 0 Then
Dim dr As DataRow = DTOP.Rows(0)
LblCveOP.Text = CveOP.ToString
LblFolio.Text = dr("Folio").ToString
DdlClientes.txtText.Value = dr("Cliente").ToString
DdlClientes.txtValue.Value = dr("CveCliente").ToString
TxtEstatus.Text = dr("Estatus").ToString
DdlSubProyecto.SelectedValue = dr("CveSubProyecto").ToString
DdlSubProyecto.SelectedValueExist(dr("CveSubProyecto").ToString)
DdlPS.txtText.Value = dr("Producto").ToString
DdlPS.txtValue.Value = dr("CvePS").ToString
Txtfecha.Text = dr("Fecha").ToString
TxtDescripcion.Text = dr("Descripcion").ToString
If ObjOP.GetProductosOP(CveOP, UsuarioActual.CveEmpresa) Then
DtPS.Rows.Clear()
For Each rowProducto As DataRow In ObjOP.DtResultados.Rows
Dim newRow As DataRow = DtPS.NewRow()
newRow("Tipo") = "Producto"
newRow("Clave") = rowProducto("CvePS").ToString.ToEntero
newRow("PSCodigo") = rowProducto("Producto").ToString
newRow("UnidadMedida") = rowProducto("UnidadMedida").ToString
newRow("Cantidad") = rowProducto("Cantidad").ToString.ToDecimal
newRow("CveUM") = rowProducto("CveUM").ToString.ToEntero
DtPS.Rows.Add(newRow)
Next
End If
If ObjOP.GetProductosMP(CveOP, UsuarioActual.CveEmpresa) Then
DtMP.Rows.Clear()
For Each rowMP As DataRow In ObjOP.DtResultados.Rows
Dim newRow As DataRow = DtMP.NewRow()
newRow("Tipo") = "MP"
newRow("Clave") = rowMP("CvePS").ToString.ToEntero
newRow("PSCodigo") = rowMP("Producto").ToString
newRow("CvePSMateriaPrima") = rowMP("CvePS").ToString.ToEntero
newRow("CveUMMateriaPrima") = rowMP("CveUM").ToString.ToEntero
newRow("UnidadMedida") = rowMP("UnidadMedida").ToString
newRow("Cantidad") = rowMP("Cantidad").ToString.ToDecimal
newRow("Surtido") = rowMP("Surtido").ToString.ToDecimal()
DtMP.Rows.Add(newRow)
Next
End If
'----- Cargar Mano de Obra -----
If ObjOP.GetProductosMO(CveOP, UsuarioActual.CveEmpresa) Then
DtMO.Rows.Clear()
For Each rowMO As DataRow In ObjOP.DtResultados.Rows
Dim newRow As DataRow = DtMO.NewRow()
newRow("Tipo") = "MO"
newRow("Puesto") = rowMO("Puesto").ToString
newRow("Cantidad") = rowMO("Cantidad").ToString.ToDecimal
DtMO.Rows.Add(newRow)
Next
End If
'----- Cargar Costos Indirectos -----
If ObjOP.GetProductosCI(CveOP, UsuarioActual.CveEmpresa) Then
DtCI.Rows.Clear()
For Each rowCI As DataRow In ObjOP.DtResultados.Rows
Dim newRow As DataRow = DtCI.NewRow()
newRow("Tipo") = "CI"
newRow("productoMateriaPrima") = rowCI("producto").ToString
newRow("Cantidad") = rowCI("Cantidad").ToString.ToDecimal
DtCI.Rows.Add(newRow)
Next
End If
End If
End If
ObjOP.Dispose()
ActualizarGrids()
End If
End Sub
@@ -180,10 +271,11 @@ Partial Class OP_OP
newRow("PSCodigo") = DrPS("PSCodigo")
newRow("UnidadMedida") = DrPS("UnidadMedida")
newRow("Cantidad") = 1
newRow("CveUM") = DrPS("CveUnidadMedida").ToString.ToEntero
newRow("Surtido") = 0
newRow("Costo") = 0
DtPS.Rows.Add(newRow)
'consultas GetMPReceta, GetMOReceta, GetCIReceta
Dim CveUM As Integer = DrPS("CveUnidadMedida").ToString.ToEntero
@@ -194,7 +286,10 @@ Partial Class OP_OP
Dim rowMP As DataRow = DtMP.NewRow()
rowMP("Tipo") = "MP"
rowMP("Clave") = CvePS
rowMP("Producto") = drMP("productoMateriaPrima").ToString()
rowMP("CvePSMateriaPrima") = CvePS
rowMP("CveUM") = CveUM
rowMP("CveUMMateriaPrima") = CveUM 'drMP("CveUMMateriaPrima").ToString().ToEntero()
rowMP("PSCodigo") = drMP("productoMateriaPrima").ToString()
rowMP("UnidadMedida") = drMP("UnidadMedidaMateriaPrima").ToString()
rowMP("Cantidad") = drMP("Cantidad").ToString().ToDecimal()
rowMP("Surtido") = 0
@@ -218,11 +313,13 @@ Partial Class OP_OP
Dim ObjCI As New ClsOP()
If ObjCI.GetCIReceta(CvePS, CveUM, UsuarioActual.CveEmpresa) Then
For Each drCI As DataRow In ObjCI.DtResultados.Rows
Dim rowCI As DataRow = DtCI.NewRow()
rowCI("Tipo") = "CI"
rowCI("Clave") = CvePS
rowCI("Producto") = drCI("productoMateriaPrima").ToString()
'rowCI("CvePSMateriaPrima") = drCI("CvePSMateriaPrima").ToString().ToEntero()
rowCI("productoMateriaPrima") = drCI("productoMateriaPrima").ToString()
rowCI("Cantidad") = drCI("Cantidad").ToString().ToDecimal()
DtCI.Rows.Add(rowCI)
Next
@@ -232,42 +329,332 @@ Partial Class OP_OP
End Sub
Protected Sub BtnEliminarProducto_Click(sender As Object, e As EventArgs)
If DdlPS.SelectedValue = "-1" Then
Alert("Seleccione un producto del listado.", TipoMensaje.MsgAdvertencia)
Return
End If
Dim CveProducto As Integer = DdlPS.SelectedValue.ToEntero()
Dim btnEliminar As LinkButton = DirectCast(sender, LinkButton)
Dim CveProducto As Integer = btnEliminar.CommandArgument.ToEntero()
Dim filasProducto As DataRow() = DtPS.Select($"Clave = {CveProducto}")
If filasProducto.Length > 0 Then
DtPS.Rows.Remove(filasProducto(0))
EliminarDatosRelacionados(CveProducto)
ActualizarGrids()
End If
EliminarDatosRelacionados(CveProducto)
ActualizarGrids()
End Sub
Private Sub EliminarDatosRelacionados(CveProducto As Integer)
' Materia Prima
Dim filasMP As DataRow() = DtMP.Select($"Clave = {CveProducto}")
For Each fila As DataRow In filasMP
DtMP.Rows.Remove(fila)
Next
' Mano de Obra
Dim filasMO As DataRow() = DtMO.Select($"Clave = {CveProducto}")
For Each fila As DataRow In filasMO
DtMO.Rows.Remove(fila)
Next
' Costos Indirectos
Dim filasCI As DataRow() = DtCI.Select($"Clave = {CveProducto}")
For Each fila As DataRow In filasCI
DtCI.Rows.Remove(fila)
Next
End Sub
Protected Sub LnkSolicitarMP_Click(sender As Object, e As EventArgs)
' Cargar almacenes
DdlAlmacenOrigenMP.DataSource = GlobalDTAlmacen(UsuarioActual.CveEmpresa).FiltraParametros("CveTipoAlmacen = 1")
DdlAlmacenOrigenMP.DataBind()
DdlAlmacenDestinoMP.DataSource = GlobalDTAlmacen(UsuarioActual.CveEmpresa).FiltraParametros("CveTipoAlmacen = 28")
DdlAlmacenDestinoMP.DataBind()
GvMPAgregados.DataKeyNames = New String() {"CvePSMateriaPrima", "CveUMMateriaPrima"}
' Filtrar MP no surtida
Dim DtMPFaltante As DataTable = DtMP.FiltraParametros("Surtido = 0").Copy()
GvMPAgregados.DataSource = DtMPFaltante
GvMPAgregados.DataBind()
' Mostrar modal
RegistraScript("$('#DVModalSolicitarMP').modal('show');")
UpModalMP.Update()
End Sub
Protected Sub BtnSimularMP_Click(sender As Object, e As EventArgs)
If CveOP <> -1 Then Exit Sub
If DdlPS.SelectedValue = "-1" Then Exit Sub
Dim nombreProducto As String = DdlPS.txtText.Value ' Ajusta según tu control
Dim spanNombre As HtmlGenericControl = DirectCast(UpModalSimular.FindControl("SpanNombreProducto"), HtmlGenericControl)
spanNombre.InnerText = nombreProducto
GvSimulacionMP.DataSource = Nothing
GvSimulacionMP.DataBind()
LblCantidadPosibleGlobal.Visible = False
' Cargar almacenes (sin borrar el ítem inicial)
DdlAlmacenSimular.DataSource = GlobalDTAlmacen(UsuarioActual.CveEmpresa).FiltraParametros("CveTipoAlmacen = 1")
DdlAlmacenSimular.DataTextField = "Almacen" ' Nombre de la columna para mostrar
DdlAlmacenSimular.DataValueField = "CveAlmacen" ' Columna para el valor
DdlAlmacenSimular.DataBind()
CalcularSimulacion()
RegistraScript("$('#DVModalSimularMP').modal('show');")
UpModalSimular.Update()
End Sub
Protected Sub RblModoSimulacion_SelectedIndexChanged(sender As Object, e As EventArgs)
' Controlar visibilidad del TextBox
PnlCantidad.Visible = (RblModoSimulacion.SelectedValue = "1")
' Resetear valor si cambian de modo
If RblModoSimulacion.SelectedValue = "2" Then
TxtCantidadSimular.Text = "1"
End If
UpModalSimular.Update()
CalcularSimulacion()
End Sub
Protected Sub DdlAlmacenSimular_SelectedIndexChanged(sender As Object, e As EventArgs)
If DdlAlmacenSimular.SelectedValue = "-1" Then
Alert("Por favor selecciona un almacén.", TipoMensaje.MsgAdvertencia)
Exit Sub
End If
CalcularSimulacion()
End Sub
Protected Sub TxtCantidadSimular_TextChanged(sender As Object, e As EventArgs)
CalcularSimulacion()
UpModalSimular.Update()
End Sub
Private Sub CalcularSimulacion()
If DdlAlmacenSimular.SelectedValue = "-1" Then Exit Sub
If DdlPS.SelectedValue = "-1" Then Exit Sub
Dim CvePS As Integer = DdlPS.SelectedValue.ToEntero()
Dim DtMP As DataTable = ObtenerMPRequerida(CvePS)
AgregarColumnasSimulacion(DtMP)
Dim listaCantidadesPosibles As New List(Of Decimal)
Dim MinCantidadPosible As Decimal = 0D
For Each rowMP As DataRow In DtMP.Rows
Dim CveMP As Integer = rowMP("CvePSMateriaPrima").ToString.ToEntero()
Dim CveUMMP As Integer = rowMP("CveUMMateriaPrima").ToString.ToEntero()
Dim CveAlmacen As Integer = DdlAlmacenSimular.SelectedValue.ToEntero()
Dim Existencia As Decimal = 0
Using ObjInventario As New ClsInventarios()
Existencia = ObjInventario.
GetExistenciasPS(
CvePS:=CveMP,
CveUnidadMedida:=CveUMMP,
CveEmpresa:=UsuarioActual.CveEmpresa,
CveAlmacen:=CveAlmacen
)
End Using
rowMP("Disponible") = Existencia
Dim CantidadUnitaria As Decimal = rowMP("Cantidad").ToString.ToDecimal()
rowMP("CantidadUnitaria") = CantidadUnitaria ' Fija (no se modifica)
If RblModoSimulacion.SelectedValue = "1" Then
Dim CantidadProducto As Decimal = TxtCantidadSimular.Text.ToDecimal()
If RblModoSimulacion.SelectedValue = "1" AndAlso TxtCantidadSimular.Text.Trim() = "" Then
Alert("Ingresa la cantidad a simular", TipoMensaje.MsgAdvertencia)
Return
End If
Dim TotalRequerido As Decimal = CantidadUnitaria * CantidadProducto
rowMP("TotalRequerido") = TotalRequerido
rowMP("Faltante") = Math.Max(TotalRequerido - Existencia, 0D)
Else
If CantidadUnitaria > 0 Then
Dim CantidadProducible As Decimal = Math.Floor(Existencia / CantidadUnitaria)
rowMP("CantidadPosible") = CantidadProducible ' ✔️ Valor individual por material
listaCantidadesPosibles.Add(CantidadProducible)
Else
rowMP("CantidadPosible") = 0D
End If
End If
Next
If RblModoSimulacion.SelectedValue = "2" AndAlso listaCantidadesPosibles.Count > 0 Then
MinCantidadPosible = listaCantidadesPosibles.Min()
Else
MinCantidadPosible = 0D
End If
GvSimulacionMP.Columns(3).Visible = (RblModoSimulacion.SelectedValue = "1") ' Total Requerido (Índice 3)
GvSimulacionMP.Columns(4).Visible = (RblModoSimulacion.SelectedValue = "1") ' Faltante (Índice 4)
GvSimulacionMP.Columns(5).Visible = (RblModoSimulacion.SelectedValue = "2") ' CantidadPosible (Índice 5)
' Asegurar visibilidad de columnas fijas
GvSimulacionMP.Columns(0).Visible = True
GvSimulacionMP.Columns(1).Visible = True
GvSimulacionMP.Columns(2).Visible = True
GvSimulacionMP.DataSource = DtMP
GvSimulacionMP.DataBind()
LblCantidadPosibleGlobal.Text = $"Cantidad: {MinCantidadPosible:N0}"
LblCantidadPosibleGlobal.Visible = (RblModoSimulacion.SelectedValue = "2")
End Sub
Private Sub AgregarColumnasSimulacion(ByRef dt As DataTable)
If Not dt.Columns.Contains("CantidadUnitaria") Then
dt.Columns.Add("CantidadUnitaria", GetType(Decimal)).DefaultValue = 0D
End If
If Not dt.Columns.Contains("TotalRequerido") Then
dt.Columns.Add("TotalRequerido", GetType(Decimal)).DefaultValue = 0D
End If
If Not dt.Columns.Contains("Disponible") Then
dt.Columns.Add("Disponible", GetType(Decimal)).DefaultValue = 0D
End If
If Not dt.Columns.Contains("Faltante") Then
dt.Columns.Add("Faltante", GetType(Decimal)).DefaultValue = 0D
End If
If Not dt.Columns.Contains("CantidadPosible") Then
dt.Columns.Add("CantidadPosible", GetType(Decimal)).DefaultValue = 0D
End If
End Sub
Private Function ObtenerMPRequerida(CvePS As Integer) As DataTable
Dim ObjOP As New ClsOP()
ObjOP.GetMPReceta(CvePS, -1, UsuarioActual.CveEmpresa)
' Verificar y convertir CvePSMateriaPrima a Integer
For Each row As DataRow In ObjOP.DtResultados.Rows
If Not IsDBNull(row("CvePSMateriaPrima")) Then
row("CvePSMateriaPrima") = Convert.ToInt32(row("CvePSMateriaPrima"))
Else
row("CvePSMateriaPrima") = 0 ' Valor por defecto si es nulo
End If
Next
Return ObjOP.DtResultados.Copy()
End Function
Protected Sub BtnGuardarSolicitudMP_Click(sender As Object, e As EventArgs)
Dim CveTraspasoSolicitud As Integer = -1
If DdlAlmacenOrigenMP.SelectedValue = DdlAlmacenDestinoMP.SelectedValue Then
Alert("Los almacenes de origen y destino no pueden ser el mismo. Por favor rectifique y vuelva a intentar.", TipoMensaje.MsgAdvertencia)
Exit Sub
End If
If Not GvMPAgregados.Rows.Count > 0 Then
Alert("No se ha seleccionado ningún producto para trasladar.", TipoMensaje.MsgAdvertencia)
Exit Sub
End If
Dim EstatusAlmacen As Integer = 2
Dim Estatus As Integer = If(UsuarioActual.Empresa.Funcionalidad(105) <> "", 1, 3)
Dim ObjInventario As New ClsInventarios()
Dim TieneErrorExistencia As Boolean = False
Dim MensajeExistencia As New StringBuilder
MensajeExistencia.Append("No hay la existencia suficiente de los siguientes productos:<br/>")
'✅ 1. Validar existencias de MP
For Each row As GridViewRow In GvMPAgregados.Rows
'✅ Obtener claves CORRECTAS de la materia prima
Dim CveMP As Integer = GvMPAgregados.DataKeys(row.RowIndex)("CvePSMateriaPrima").ToString().ToEntero()
Dim CveUMMP As Integer = GvMPAgregados.DataKeys(row.RowIndex)("CveUMMateriaPrima").ToString().ToEntero()
Dim CantidadSolicitada As Decimal = DtMP.Rows(row.RowIndex)("Cantidad").ToString().ToDecimal()
'DtMP.Rows(row.RowIndex)("CveAlmacenDestino") = DdlAlmacenDestinoMP.SelectedValue.ToEntero()
'✅ Verificar existencias
Dim Existencia As Decimal = ObjInventario.GetExistenciasPS(
CvePS:=CveMP,
CveUnidadMedida:=CveUMMP,
CveEmpresa:=UsuarioActual.CveEmpresa,
CveAlmacen:=DdlAlmacenOrigenMP.SelectedValue.ToEntero()
)
If Existencia < CantidadSolicitada Then
Dim NombreProducto As String = GlobalDTPSSimplificado(UsuarioActual.CveEmpresa, CveMP).FiltroPrimeroValor("Producto", "")
Dim Faltante As Decimal = CantidadSolicitada - Existencia
MensajeExistencia.AppendFormat(
"<br/> - <b>{0} ({1})</b> Existencia: {2}, Faltante: {3}",
NombreProducto,
row.Cells(0).Text, ' Código del producto
Existencia.ToString("N2"),
Faltante.ToString("N2")
)
TieneErrorExistencia = True
End If
Next
If TieneErrorExistencia Then
Alert(MensajeExistencia.ToString, TipoMensaje.MsgAdvertencia)
Exit Sub
End If
'✅ 2. Crear traspaso si todo está correcto
ObjInventario.IniciaTransacSQL()
Dim TieneError As Boolean = False
Dim FolioSolicitud As Integer = ObjInventario.AddTrasladoSolicitud(
TxtObservacionesMP.Text.Trim(),
DdlAlmacenOrigenMP.SelectedValue.ToEntero(),
DdlAlmacenDestinoMP.SelectedValue.ToEntero(),
Estatus,
-1,
NowADS,
CveUsuario:=UsuarioActual.CveUsuario,
CveEmpresa:=UsuarioActual.CveEmpresa,
EstatusAlmacen:=EstatusAlmacen
)
If FolioSolicitud > 0 Then
CveTraspasoSolicitud = ObjInventario.CveTraspasoSolicitud
Else
TieneError = True
End If
'✅ 3. Agregar detalles del traspaso
If Not TieneError Then
For Each row As GridViewRow In GvMPAgregados.Rows
'✅ Usar claves de MATERIA PRIMA (CvePSMateriaPrima y CveUMMateriaPrima)
Dim CveMP As Integer = GvMPAgregados.DataKeys(row.RowIndex)("CvePSMateriaPrima").ToString().ToEntero()
Dim CveUMMP As Integer = GvMPAgregados.DataKeys(row.RowIndex)("CveUMMateriaPrima").ToString().ToEntero()
Dim Cantidad As Decimal = DtMP.Rows(row.RowIndex)("Cantidad").ToString().ToDecimal()
If Not ObjInventario.AddTrasladoSolicitudDetalle(
CveTraspasoSolicitud,
Cantidad,
CveUMMP, '✅ Unidad de medida de la MP
CveMP, '✅ Clave de la MP
0, "", -1, "-1", "-1", MinFecha
) Then
TieneError = True
Exit For
End If
Next
End If
'✅ 4. Confirmar o cancelar transacción
If Not TieneError Then
ObjInventario.Commit()
Alert($"Solicitud de Traspaso guardada. Folio: <b>{FolioSolicitud}</b>", TipoMensaje.MsgInformacion)
RegistraScript("$('#DVModalSolicitarMP').modal('hide');")
CargaDatos()
Else
ObjInventario.RollBack()
Alert("Error al guardar el traspaso.", TipoMensaje.MsgError)
End If
ObjInventario.Dispose()
End Sub
Protected Sub BtnGuardarOP_Click(sender As Object, e As EventArgs)
' Validar campos obligatorios
' Validaciones básicas
If DdlClientes.SelectedValue = "-1" Then
Alert("Seleccione un cliente.", TipoMensaje.MsgAdvertencia)
Return
@@ -278,94 +665,86 @@ Partial Class OP_OP
Return
End If
' Iniciar transacción
Dim clsOP As New ClsOP()
clsOP.IniciaTransacSQL()
Dim transactionActive As Boolean = False
Try
' Insertar/Actualizar cabecera de la OP usando UpdateOP
Dim CveOP As Integer = Me.CveOP ' Si es nuevo, CveOP = -1
Dim Success As Boolean = clsOP.UpdateOP(
CveOP:=CveOP,
Descripcion:=TxtDescripcion.Text,
CveCliente:=DdlClientes.SelectedValue.ToEntero(),
CvePS:=DdlPS.SelectedValue.ToEntero(),
CveSubProyecto:=DdlSubProyecto.SelectedValue.ToEntero(),
Cantidad:=1, ' Ajustar según lógica de negocio
Fecha:=Convert.ToDateTime(Txtfecha.Text),
CveEmpresa:=UsuarioActual.CveEmpresa,
CveUsuario:=UsuarioActual.CveUsuario
)
If Not Success Then
Throw New Exception("Error al guardar la cabecera de la OP.")
End If
' Obtener el CveOP generado (asumiendo que se actualiza en la propiedad)
If Me.CveOP = -1 Then
' Si es nuevo, recuperar el CveOP de la base de datos
' (Requiere que el SP PA_OP_OrdendeProduccionUp devuelva el ID)
' Esto depende de la implementación del SP.
' Ejemplo hipotético:
clsOP.GetOP(-1, DdlClientes.SelectedValue.ToEntero(), DdlSubProyecto.SelectedValue.ToEntero(), -1, -1, -1, MinFecha, MaxFecha, UsuarioActual.CveEmpresa)
If clsOP.DtResultados.Rows.Count > 0 Then
Me.CveOP = clsOP.DtResultados.Rows(0)("CveOP").ToString.ToEntero()
If Me.CveOP = -1 Then ' Modo CREACIÓN
Dim xmlProductos As String = DataTableToXML(DtPS)
Dim CveOPGenerado As Integer = -1
Dim FolioGenerado As Integer = -1
If clsOP.OPAdd(
Descripcion:=TxtDescripcion.Text,
CveCliente:=DdlClientes.SelectedValue.ToEntero(),
CveEmpresa:=UsuarioActual.CveEmpresa,
CveUsuario:=UsuarioActual.CveUsuario,
Fecha:=Convert.ToDateTime(Txtfecha.Text),
CveSubProyecto:=DdlSubProyecto.SelectedValue.ToEntero(),
xmlproductos:=xmlProductos,
CveOP:=CveOPGenerado,
Folio:=FolioGenerado
) Then
Me.CveOP = CveOPGenerado
LblFolio.Text = FolioGenerado.ToString
Alert("Orden creada con Folio: " & FolioGenerado, TipoMensaje.MsgInformacion)
End If
Else ' Modo EDICIÓN
Dim CvePS As Integer = DtPS.Rows(0)("Clave").ToString.ToEntero()
Dim Cantidad As Integer = DtPS.Rows(0)("Cantidad").ToString.ToEntero()
BtnFinalizarOP.Visible = True
If Not clsOP.UpdateOP(
CveOP:=Me.CveOP,
Descripcion:=TxtDescripcion.Text,
CveCliente:=DdlClientes.SelectedValue.ToEntero(),
CvePS:=CvePS,
CveSubProyecto:=DdlSubProyecto.SelectedValue.ToEntero(),
Cantidad:=Cantidad,
Fecha:=Convert.ToDateTime(Txtfecha.Text),
CveEmpresa:=UsuarioActual.CveEmpresa,
CveUsuario:=UsuarioActual.CveUsuario
) Then
Throw New Exception("Error al actualizar la OP")
End If
End If
' Insertar detalles de Productos, MP, MO, CI
For Each drProducto As DataRow In DtPS.Rows
Dim CvePS As Integer = drProducto("Clave").ToString().ToEntero()
' Insertar Materia Prima relacionada
For Each drMP As DataRow In DtMP.Select($"Clave = {CvePS}")
clsOP.AddMP(
Cantidad:=drMP("Cantidad").ToString().ToDecimal(),
CvePS:=CvePS,
CvePSMateriaPrima:=drMP("CvePSMateriaPrima").ToString().ToEntero(),
CveUM:=drMP("CveUM").ToString().ToEntero(),
CveUMMateriaPrima:=drMP("CveUMMateriaPrima").ToString().ToEntero()
)
Next
' Insertar Mano de Obra relacionada
For Each drMO As DataRow In DtMO.Select($"Clave = {CvePS}")
clsOP.AddMO(
Cantidad:=drMO("Cantidad").ToString().ToDecimal(),
CvePS:=CvePS,
CvePuesto:=drMO("CvePuesto").ToString().ToEntero(),
CveUM:=drMO("CveUM").ToString().ToEntero()
)
Next
' Insertar Costos Indirectos relacionados
For Each drCI As DataRow In DtCI.Select($"Clave = {CvePS}")
clsOP.AddCI(
Cantidad:=drCI("Cantidad").ToString().ToDecimal(),
CvePS:=CvePS,
CvePSMateriaPrima:=drCI("CvePSMateriaPrima").ToString().ToEntero(),
CveUM:=drCI("CveUM").ToString().ToEntero(),
CveUMMateriaPrima:=drCI("CveUMMateriaPrima").ToString().ToEntero()
)
Next
Next
' Commit si todo es exitoso
clsOP.Commit()
Alert("Orden de Producción guardada correctamente.", TipoMensaje.MsgInformacion)
Response.Redirect($"OP.aspx?CveOP={Me.CveOP}") ' Redirigir a la OP guardada
transactionActive = False
Response.Redirect($"OP.aspx?CveOP={Me.CveOP}", False)
Context.ApplicationInstance.CompleteRequest()
Catch ex As Exception
' Rollback en caso de error
clsOP.RollBack()
Alert($"Error al guardar: {ex.Message}", TipoMensaje.MsgError)
If transactionActive Then
clsOP.RollBack()
End If
Alert($"Error: {ex.Message}", TipoMensaje.MsgError)
Finally
clsOP.Dispose()
End Try
End Sub
Private Function DataTableToXML(dt As DataTable) As String
Dim xmlDoc As New XmlDocument()
xmlDoc.LoadXml("<Productos></Productos>")
For Each row As DataRow In dt.Rows
Dim producto As XmlElement = xmlDoc.CreateElement("Producto")
producto.InnerXml = $"<CvePS>{row("Clave")}</CvePS><Cantidad>{row("Cantidad")}</Cantidad><CveUM>{row("CveUM")}</CveUM>"
xmlDoc.DocumentElement.AppendChild(producto)
Next
Return xmlDoc.OuterXml
End Function
Private Sub ActualizarGrids()
Dim dtProductosFiltrados As DataTable = DtPS.Clone() ' Clona la estructura
Dim dtProductosFiltrados As DataTable = DtPS.Clone()
Dim rowsProductos As DataRow() = DtPS.Select("Tipo = 'Producto'")
If rowsProductos.Length > 0 Then
dtProductosFiltrados = rowsProductos.CopyToDataTable()
@@ -397,11 +776,227 @@ Partial Class OP_OP
GvCostosIndirectos.DataSource = dtCIFiltrados
GvCostosIndirectos.DataBind()
' Calcular suma de "Surtido"
Dim sumSurtido As Decimal = DtMP.AsEnumerable().Sum(Function(row) row.Field(Of Decimal)("Surtido"))
LnkSolicitarMP.Visible = (CveOP > -1 AndAlso sumSurtido = 0)
UpGvDatosOP.Update()
End Sub
Protected Sub DdlAlmacenOrigenMP_SelectedIndexChanged(sender As Object, e As EventArgs)
' ✅ Mantener siempre el almacén de producción (tipo 28) en destino
DdlAlmacenDestinoMP.DataSource = GlobalDTAlmacen(UsuarioActual.CveEmpresa).FiltraParametros("CveTipoAlmacen = 28")
DdlAlmacenDestinoMP.DataBind()
' ✅ Opcional: Seleccionar el primer almacén de producción por defecto
If DdlAlmacenDestinoMP.Items.Count > 0 Then
DdlAlmacenDestinoMP.SelectedIndex = 0
End If
End Sub
#Region "Eventos de Botones"
Protected Sub BtnFinalizarOP_Click(sender As Object, e As EventArgs)
If CveOP = -1 Then Exit Sub
' 1. Cargar almacén de salida (Tipo 28)
DdlAlmacenOrigenSalidaMP.DataSource = GlobalDTAlmacen(UsuarioActual.CveEmpresa).FiltraParametros("CveTipoAlmacen = 28")
DdlAlmacenOrigenSalidaMP.DataBind()
' 2. Cargar almacén de producto terminado
DdlAlmacenTerminado.DataSource = GlobalDTAlmacen(UsuarioActual.CveEmpresa).FiltraParametros("CveTipoAlmacen = 1")
DdlAlmacenTerminado.DataBind()
DdlAlmacenTerminado.Items.Insert(0, New ListItem("Seleccionar almacén", "-1"))
' 3. Cargar GridViews
GvProductoTerminado.DataSource = DtPS.FiltraParametros("Tipo = 'Producto'")
GvProductoTerminado.DataBind()
GvMPUtilizada.DataSource = DtMP.FiltraParametros("Tipo = 'MP'").Copy()
GvMPUtilizada.DataBind()
RegistraScript("$('#DVModalFinalizarOP').modal('show');")
UpModalFinalizar.Update()
End Sub
Protected Sub BtnGuardarFinalizarOP_Click(sender As Object, e As EventArgs) Handles BtnGuardarFinalizarOP.Click
If DdlAlmacenOrigenSalidaMP.SelectedValue = "-1" OrElse DdlAlmacenTerminado.SelectedValue = "-1" Then
Alert("Selecciona ambos almacenes.", TipoMensaje.MsgAdvertencia)
Exit Sub
End If
' Dim TotalCantidad As Decimal = DtMovimientos.SUMD("Cantidad")
'Inicia la transacción
Dim CveMovimientoSalida As Integer = 0
Dim CveMovimientoEntrada As Integer = 0
Dim IDPoliza As Integer = 0
Dim FolioSalida As Integer = 0
'Dim CveMovimientoVirtualEntrada As Integer = 0
'Dim CveMovimientoVirtualSalida As Integer = 0
'Dim FolioVirtualEntrada As Integer = 0
'Dim FolioVirtualSalida As Integer = 0
Dim FolioEntrada As Integer = 0
Dim Fecha As DateTime = Txtfecha.Text.ToDate
Dim ErrorMovInv As Boolean = False
Dim ErrorAC As Boolean = False
Dim TextoError As String = ""
Dim TipoMovimientoSalida As Integer = 8
Dim CveConceptoEntrada As Integer = 9
Dim TotalCostoMP As Decimal = 0
Dim ObjInventario As New ClsInventarios()
ObjInventario.IniciaTransacSQL()
Dim ObjConta As New ClsContabilidad(ObjInventario.IniciaTransacSQL())
Try
CveMovimientoSalida = ObjInventario.AddMovimiento(
CveAlmacen:=DdlAlmacenOrigenSalidaMP.SelectedValue.ToEntero(),
CveConcepto:=TipoMovimientoSalida,
CveMoneda:=1,
FechaMovto:=Fecha,
tFolio:=-1,
CveUsuario:=UsuarioActual.CveUsuario,
CveEmpresa:=UsuarioActual.CveEmpresa,
CveCompra:=-1,
CveVenta:=-1,
CveSubProyecto:=-1,
CveActivoFijo:=-1,
Observaciones:="Finalización OP #" & LblFolio.Text,
CveAlmacenDestino:=DdlAlmacenTerminado.SelectedValue.ToEntero(),
Modulo:="OP/FinalizarOPSalida"
)
For Each rowMP As DataRow In DtMP.Select("Tipo = 'MP'")
If Not ObjInventario.AddMovimientoDetalle(
CveMovimientoSalida,
rowMP("Cantidad").ToString.ToDecimal(),
rowMP("CveUMMateriaPrima").ToString.ToEntero(),
rowMP("CvePSMateriaPrima").ToString.ToEntero(),
1
) Then
Throw New Exception("Error al agregar detalle de MP")
End If
TotalCostoMP += rowMP("Cantidad").ToString.ToDecimal()
Next
CveMovimientoEntrada = ObjInventario.AddMovimiento(
CveAlmacen:=DdlAlmacenTerminado.SelectedValue.ToEntero(),
CveConcepto:=CveConceptoEntrada,
CveMoneda:=1,
FechaMovto:=Fecha,
tFolio:=-1,
CveUsuario:=UsuarioActual.CveUsuario,
CveEmpresa:=UsuarioActual.CveEmpresa,
CveCompra:=-1, CveVenta:=-1, CveSubProyecto:=-1, CveActivoFijo:=-1,
Observaciones:="Finalización OP #" & LblFolio.Text,
Modulo:="OP/FinalizarOPEntrada",
CveMovimientoRelacionado:=CveMovimientoSalida
)
Dim CantidadPT As Decimal = DtPS.AsEnumerable().Sum(Function(row) Convert.ToDecimal(row("Cantidad")))
Dim PU_PT As Decimal = If(CantidadPT > 0, TotalCostoMP / CantidadPT, 1)
For Each rowPT As DataRow In DtPS.Select("Tipo = 'Producto'")
If Not ObjInventario.AddMovimientoDetalle(
CveMovimientoEntrada,
rowPT("Cantidad").ToString.ToDecimal(),
rowPT("CveUM").ToString.ToEntero(),
rowPT("Clave").ToString.ToEntero(),
PU_PT
) Then
Throw New Exception("Error al agregar detalle de PT")
End If
Next
Dim CvePrePoliza As Integer = ObjConta.AddPrePolizas(
Modulo:="Inventario/OPFinalizada",
CvePlantillaPoliza:=53,
Cargos:=0,
Abonos:=0,
CveMoneda:=1,
Fecha:=Fecha,
Concepto:="Producción OP #" & LblFolio.Text,
CveUsuario:=UsuarioActual.CveUsuario,
CveEmpresa:=UsuarioActual.CveEmpresa
)
If Not ObjConta.AddPrePolizasDetalle(
CvePrePoliza,
False,
TotalCostoMP,
TotalCostoMP,
68,
"Consumo MP OP #" & LblFolio.Text,
"Consumo MP OP #" & LblFolio.Text,
CveMovimientoAlmacen:=CveMovimientoSalida
) Then ErrorMovInv = True
If Not ObjConta.AddPrePolizasDetalle(
CvePrePoliza,
True,
TotalCostoMP,
TotalCostoMP,
68,
"Producción PT OP #" & LblFolio.Text,
"Producción PT OP #" & LblFolio.Text,
CveMovimientoAlmacen:=CveMovimientoEntrada
) Then ErrorMovInv = True
If Not ErrorMovInv Then
Dim ObjOP As New ClsOP()
If Not ObjOP.UpdateEstatusOP(CveOP, 3, UsuarioActual.CveEmpresa) Then
ErrorMovInv = True
TextoError = "Error al actualizar estatus de la OP"
End If
End If
If Not ErrorMovInv Then
If Not ObjConta.ValidacionesPrePoliza(CvePrePoliza, UsuarioActual) Then
ErrorMovInv = True
TextoError = "Error en validación de póliza"
ElseIf ObjConta.ValorPolizaDescuadre > 0 Then
ErrorMovInv = True
TextoError = "Descuadre en póliza contable"
End If
End If
If Not ErrorMovInv Then
ObjInventario.Commit()
Alert($"OP finalizada. Folio Contable: {ObjConta.ContaFolio}", TipoMensaje.MsgInformacion)
Else
ObjInventario.RollBack()
Alert($"Error contable: {TextoError}", TipoMensaje.MsgError)
End If
RegistraScript("$('#DVModalFinalizarOP').modal('hide');")
CargaDatos()
Catch ex As Exception
ObjInventario.RollBack()
Alert($"Error crítico: {ex.Message}", TipoMensaje.MsgError)
Finally
ObjInventario.Dispose()
ObjConta.Dispose()
End Try
End Sub
#End Region
End Class

View File

@@ -174,7 +174,7 @@
</asp:UpdatePanel>
<asp:UpdatePanel ID="UPDatos" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:GridView ID="GvDatos" runat="server" DataKeysNames="CveOP" AutoGenerateColumns="False" EmptyDataText="No se encontraron Ventas con los filtros especificados" ToolTip="Listado de Ventas"
<asp:GridView ID="GvDatos" runat="server" DataKeysNames="CveOP" AutoGenerateColumns="False" EmptyDataText="No se encontraron Ordenes de Producción con los filtros especificados" ToolTip="Listado de Ventas"
CssClass="table table-striped table-advance table-hover Widthall ScrollAD" data-sort="true" Style="text-align: center;" GridLines="None" Width="99%">
<Columns>
<asp:HyperLinkField DataNavigateUrlFormatString="/OP/OP.aspx?CveOP={0}" DataNavigateUrlFields="CveOP" ControlStyle-CssClass="Texto" DataTextField="Folio" HeaderText="Folio"