updatess
This commit is contained in:
parent
d9e67e6139
commit
1e1b65dce6
@ -15,6 +15,10 @@ namespace PSTW_CentralSystem.Areas.Inventory.Controllers
|
|||||||
{
|
{
|
||||||
return View();
|
return View();
|
||||||
}
|
}
|
||||||
|
public ActionResult Qr()
|
||||||
|
{
|
||||||
|
return View();
|
||||||
|
}
|
||||||
|
|
||||||
[Authorize]
|
[Authorize]
|
||||||
[HttpPost("/i/{id}")]
|
[HttpPost("/i/{id}")]
|
||||||
|
|||||||
@ -7,14 +7,21 @@ namespace PSTW_CentralSystem.Areas.Inventory.Models
|
|||||||
{
|
{
|
||||||
[Key]
|
[Key]
|
||||||
public int requestId { get; set; }
|
public int requestId { get; set; }
|
||||||
//public int DepartmentId { get; set; }
|
public int ProductId { get; set; }
|
||||||
//[ForeignKey("DepartmentId")]
|
[ForeignKey("ProductId")]
|
||||||
//public virtual ItemModel? Department { get; set; }
|
public virtual ProductModel? Product { get; set; }
|
||||||
//[ForeignKey("ItemID")]
|
public int StationId { get; set; }
|
||||||
|
[ForeignKey("StationId")]
|
||||||
|
public virtual StationModel? Station { get; set; }
|
||||||
|
public int UserId { get; set; }
|
||||||
|
[ForeignKey("UserId")]
|
||||||
|
public virtual UserModel? User { get; set; }
|
||||||
public string? remark { get; set; }
|
public string? remark { get; set; }
|
||||||
public string? status { get; set; }
|
public string? status { get; set; }
|
||||||
public DateTime requestDate { get; set; }
|
public DateTime requestDate { get; set; }
|
||||||
public DateTime approvalDate { get; set; }
|
public DateTime approvalDate { get; set; }
|
||||||
|
public int RequestQuantity { get; set; }
|
||||||
|
public byte[]? Document { get; set; }
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,26 +1,13 @@
|
|||||||
|
|
||||||
@{
|
@{
|
||||||
ViewData["Title"] = "Item Request";
|
ViewData["Title"] = "Product Request";
|
||||||
Layout = "~/Views/Shared/_Layout.cshtml";
|
Layout = "~/Views/Shared/_Layout.cshtml";
|
||||||
}
|
}
|
||||||
<style>
|
|
||||||
@@font-face {
|
|
||||||
font-family: 'OCR-A';
|
|
||||||
src: url('../assets/fonts/ocraext.ttf');
|
|
||||||
}
|
|
||||||
|
|
||||||
.QrPrintFont {
|
|
||||||
font-family: 'OCR-A', monospace;
|
|
||||||
}
|
|
||||||
.table td img {
|
|
||||||
display: block !important;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@await Html.PartialAsync("~/Areas/Inventory/Views/_InventoryPartial.cshtml");
|
@await Html.PartialAsync("~/Areas/Inventory/Views/_InventoryPartial.cshtml");
|
||||||
<div id="registerItem" class="row">
|
<div id="requestProduct" class="row">
|
||||||
<div class="row card">
|
<div class="row card">
|
||||||
<div class="card-header">
|
<div class="card-header">
|
||||||
<button id="addItemBtn" class="btn btn-success col-md-3 col-lg-3 m-1 col-12"><i class="fa fa-plus"></i> Add Item</button>
|
<button id="addRequestBtn" class="btn btn-success col-md-3 col-lg-3 m-1 col-12"><i class="fa fa-plus"></i> Add Request</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
@* <div v-if="loading">
|
@* <div v-if="loading">
|
||||||
@ -28,78 +15,32 @@
|
|||||||
<span class="visually-hidden">Loading...</span>
|
<span class="visually-hidden">Loading...</span>
|
||||||
</div>
|
</div>
|
||||||
</div> *@
|
</div> *@
|
||||||
<table class="table table-bordered table-hover table-striped no-wrap" id="itemDatatable" style=" width:100%;border-style: solid; border-width: 1px"></table>
|
<table class="table table-bordered table-hover table-striped no-wrap" id="requestDatatable" style=" width:100%;border-style: solid; border-width: 1px"></table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal fade" id="QrItemModal" tabindex="-1" role="dialog" aria-labelledby="QrItemModalLabel" aria-hidden="true" data-bs-target="#staticBackdrop">
|
<div class="modal fade" id="requestModal" tabindex="-1" role="dialog" aria-labelledby="addRequestModalLabel" aria-hidden="true">
|
||||||
<div class="modal-dialog modal-dialog-centered modal-md" role="document">
|
|
||||||
<div class="modal-content">
|
|
||||||
<div class="modal-header">
|
|
||||||
<h5 class="modal-title" id="QrItemModalLabel"></h5>
|
|
||||||
<button type="button" class="closeModal btn-close" data-bs-dismiss="modal" aria-label="Close" v-on:click="showItemModal=false"></button>
|
|
||||||
</div>
|
|
||||||
<div class="modal-body d-flex justify-content-center align-items-center">
|
|
||||||
<div class="container" style="font-family: 'OCR A', monospace;">
|
|
||||||
<div class="row" ref="qrInfo" id="qrInfo">
|
|
||||||
<div class="col-5 text-center d-flex align-items-center justify-content-center">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-12 text-center">
|
|
||||||
<div id="QrContainer"></div>
|
|
||||||
<div class="col-12 text-center">
|
|
||||||
{{thisQRInfo.uniqueID}}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-7 d-flex align-items-center justify-content-center">
|
|
||||||
<div class="text-center fs-4 text">
|
|
||||||
<div class="col-12 my-3">
|
|
||||||
{{thisQRInfo.departmentName}}
|
|
||||||
</div>
|
|
||||||
<div class="col-12 my-3">
|
|
||||||
{{thisQRInfo.productShortName}}
|
|
||||||
</div>
|
|
||||||
<div class="col-12 my-3">
|
|
||||||
{{thisQRInfo.serialNumber}}
|
|
||||||
</div>
|
|
||||||
<div class="col-12 my-3">
|
|
||||||
{{thisQRInfo.partNumber}}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<button v-on:click="printQRInfo">Print QR Info</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="modal fade" id="itemMovementModal" tabindex="-1" role="dialog" aria-labelledby="addItemModalLabel" aria-hidden="true">
|
|
||||||
<div class="modal-dialog modal-dialog-centered modal-xl" role="document">
|
<div class="modal-dialog modal-dialog-centered modal-xl" role="document">
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
<h5 class="modal-title" id="addItemModalLabel">Add Item</h5>
|
<h5 class="modal-title" id="addRequestModalLabel">Add Request</h5>
|
||||||
<button type="button" class="closeModal" data-dismiss="modal" aria-label="Close" v-on:click="showItemModal=false">
|
<button type="button" class="closeModal" data-dismiss="modal" aria-label="Close" v-on:click="showRequestModal=false">
|
||||||
<span aria-hidden="true">×</span>
|
<span aria-hidden="true">×</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
<form v-on:submit.prevent="addItem" data-aos="fade-right">
|
<form v-on:submit.prevent="addRequest" data-aos="fade-right">
|
||||||
<div class=" register" data-aos="fade-right">
|
<div class=" register" data-aos="fade-right">
|
||||||
<div class="row" data-aos="fade-right">
|
<div class="row" data-aos="fade-right">
|
||||||
|
|
||||||
@*Right Side*@
|
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<div class="tab-content" id="myTabContent">
|
<div class="tab-content" id="myTabContent">
|
||||||
<div class="tab-pane fade show active" id="home" role="tabpanel" aria-labelledby="home-tab">
|
<div class="tab-pane fade show active" id="home" role="tabpanel" aria-labelledby="home-tab">
|
||||||
<h3 class="register-heading">ITEM MOVEMENT</h3>
|
<h3 class="register-heading">PRODUCT REQUEST</h3>
|
||||||
<div class="row register-form">
|
<div class="row register-form">
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
|
|
||||||
<!-- Company Dropdown -->
|
<!-- Product Dropdown -->
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-sm-4 col-form-label">To Station</label>
|
<label class="col-sm-4 col-form-label">To Station</label>
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
@ -112,7 +53,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Quantity Dropdown -->
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-sm-4 col-form-label">To Store:</label>
|
<label class="col-sm-4 col-form-label">To Store:</label>
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
@ -123,6 +64,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Station Dropdown -->
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-sm-4 col-form-label">To User:</label>
|
<label class="col-sm-4 col-form-label">To User:</label>
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
@ -133,6 +75,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Remark Dropdown -->
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-sm-4 col-form-label">Last User:</label>
|
<label class="col-sm-4 col-form-label">Last User:</label>
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
@ -143,6 +86,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Document/Picture Dropdown -->
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-sm-4 col-form-label">Last Store:</label>
|
<label class="col-sm-4 col-form-label">Last Store:</label>
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
@ -153,272 +97,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group row">
|
|
||||||
<label class="col-sm-4 col-form-label">Last Station:</label>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<select class="btn btn-primary dropdown-toggle col-md-10" v-model="selectedlastStation" :disabled="currentUserCompanyDept != null" required>
|
|
||||||
<option class="btn-light" value="" disabled selected>Select Station</option>
|
|
||||||
<option class="btn-light" v-for="(station, index) in stations" :key="index" :value="station.stationId">{{ station.stationName}}</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group row">
|
|
||||||
<label class="col-sm-4 col-form-label">To Other:</label>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<input type="text" id="toOther" name="toOther" v-model="toOther" class="form-control" required />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group row">
|
|
||||||
<label class="col-sm-4 col-form-label">Action:</label>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<input type="text" id="action" name="action" v-model="action" class="form-control" required />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group row">
|
|
||||||
<label class="col-sm-4 col-form-label">Quantity:</label>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<input type="number" id="quantity" name="quantity" v-model="quantity" class="form-control" required />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group row">
|
|
||||||
<label class="col-sm-4 col-form-label">To Other:</label>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<input type="text" id="toOther" name="toOther" v-model="toOther" class="form-control" required />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group row">
|
|
||||||
<label class="col-sm-4 col-form-label">To Other:</label>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<input type="text" id="toOther" name="toOther" v-model="toOther" class="form-control" required />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group row">
|
|
||||||
<label class="col-sm-4 col-form-label">To Store:</label>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<select class="btn btn-primary dropdown-toggle col-md-10" v-model="selectedDepartment" :disabled="currentUserCompanyDept != null" required>
|
|
||||||
<option class="btn-light" value="" disabled selected>Select Store</option>
|
|
||||||
<option class="btn-light" v-for="(store, index) in stores" :key="index" :value="store.companyId">{{ store.storeName }}</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- TeamType Dropdown -->
|
|
||||||
<div class="form-group row">
|
|
||||||
<label class="col-sm-4 col-form-label">Team:</label>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<select class="btn btn-primary dropdown-toggle col-md-10" v-model="selectedTeamType" required>
|
|
||||||
<option class="btn-light" value="" disabled selected>Select Team</option>
|
|
||||||
<option class="btn-light" v-for="(team, index) in teamTypes" :key="index" :value="team">{{ team }}</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
@* Product Name Coding *@
|
|
||||||
<div class="form-group row">
|
|
||||||
<label class="col-sm-4 col-form-label">Product Name:</label>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<div class="dropdown">
|
|
||||||
<select class="btn btn-primary dropdown-toggle col-md-10" v-model="selectedProduct" required>
|
|
||||||
<option class="btn-light" value="" disabled selected>Select Product</option>
|
|
||||||
<option class="btn-light" v-for="(item, index) in products" :key="index" :value="item.productId">{{ item.productName + ' (' + item.modelNo + ')' }}</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@* Product Image Display *@
|
|
||||||
<div class="form-group row align-items-center">
|
|
||||||
<label for="imageProduct" class="col-sm-4 col-form-label">Product Image: </label>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<img v-if="showProduct.imageProduct" :src="showProduct.imageProduct" alt="Product Image" class="img-fluid" data-toggle="modal" data-target="#imageModal" />
|
|
||||||
<input type="hidden" id="imageProduct" name="imageProduct" v-model="showProduct">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Modal -->
|
|
||||||
<div class="modal fade" id="imageModal" tabindex="-1" role="dialog" aria-labelledby="imageModalLabel" aria-hidden="true">
|
|
||||||
<div class="modal-dialog modal-lg" role="document">
|
|
||||||
<div class="modal-content">
|
|
||||||
<div class="modal-header">
|
|
||||||
<h5 class="modal-title" id="imageModalLabel">Product Image</h5>
|
|
||||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
|
||||||
<span aria-hidden="true">×</span>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
<div class="modal-body">
|
|
||||||
<img :src="showProduct.imageProduct" alt="Product Image" class="img-fluid">
|
|
||||||
</div>
|
|
||||||
<div class="modal-footer">
|
|
||||||
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@* Product Category Coding *@
|
|
||||||
<div class="form-group row">
|
|
||||||
<label class="col-sm-4 col-form-label">Product Category:</label>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<input type="text" id="category" name="category" v-model="showProduct.category" class="form-control" readonly />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@* Part Number Coding *@
|
|
||||||
<div class="form-group row">
|
|
||||||
<label class="col-sm-4 col-form-label">Part Number:</label>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<input type="text" id="partNumber" name="partNumber" v-model="partNumber" class="form-control" required />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@* Serial Number and Quantity Coding *@
|
|
||||||
<div v-if="showSerialNumber">
|
|
||||||
<div class="form-group row align-items-center">
|
|
||||||
<div class="col-sm-4">
|
|
||||||
<label for="serialNumber">Serial Number: </label>
|
|
||||||
</div>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<input type="text" id="serialNumber" name="serialNumber" v-if="showSerialNumber" v-model="serialNumber" class="form-control" v-bind:required="showSerialNumber">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div v-if="!showSerialNumber">
|
|
||||||
<div class="form-group row align-items-center">
|
|
||||||
<div class="col-sm-4">
|
|
||||||
<label for="quantity">Quantity: </label>
|
|
||||||
</div>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<input type="number" id="quantity" name="quantity" min="1" v-if="!showSerialNumber" v-model="quantity" class="form-control" v-bind:required="!showSerialNumber">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@* Supplier coding *@
|
|
||||||
<div class="form-group row align-items-center">
|
|
||||||
<label class="col-sm-4 col-form-label">Supplier: </label>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<div class="dropdown">
|
|
||||||
<select class="btn btn-primary dropdown-toggle col-md-10" data-toggle="dropdown" aria-expanded="false" v-model="selectedSupplier" required>
|
|
||||||
<option class="btn-light" value="" disabled selected>Select Supplier</option>
|
|
||||||
<option class="btn-light" v-for="(item, index) in suppliers">{{ item.supplierName }}</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@* Purchase Date coding *@
|
|
||||||
<div class="form-group row align-items-center">
|
|
||||||
<label for="purchaseDate" class="col-sm-4 col-form-label">Purchase Date: </label>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<input type="date" id="purchaseDate" name="purchaseDate" required v-model="purchaseDate" class="form-control">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@* PO coding *@
|
|
||||||
<div class="form-group row align-items-center">
|
|
||||||
<label for="PO" class="col-sm-4 col-form-label">Enter PO: </label>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<input type="text" id="PO" name="PO" required v-model="PO" placeholder="PO123456" class="form-control">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-md-6">
|
|
||||||
@* Item Price in RM *@
|
|
||||||
<div class="form-group row">
|
|
||||||
<label for="DefaultPrice" class="col-sm-4">Default Item Price:</label>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<input type="number" id="DefaultPrice" name="DefaultPrice" class="form-control" placeholder="RM 00.00" step="0.01" min="0.01" v-on:input="convertCurrency()" required v-model="DefaultPrice">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@* Currency Selection *@
|
|
||||||
<div class="form-group row">
|
|
||||||
<label for="currency" class="col-sm-4">Select Currency:</label>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<select id="currency" name="currency" class="btn btn-primary form-control col-md-10" v-model="currency" v-on:change="convertCurrency()">
|
|
||||||
<option class="btn-light" value="" disabled selected>Select a currency</option>
|
|
||||||
<option class="btn-light" v-for="(name, code) in currencies" :key="code" :value="code">
|
|
||||||
{{ code }} - {{ name }}
|
|
||||||
</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@* Currency Rate *@
|
|
||||||
<div class="form-group row">
|
|
||||||
<label for="currencyRate" class="col-sm-4">Currency Rate(%):</label>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<input type="number" id="currencyRate" name="currencyRate" class="form-control" placeholder="0.01" step="0.01" min="1" v-on:input="convertCurrency()" required v-model="currencyRate">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@* Item Convert Price *@
|
|
||||||
<div class="form-group row">
|
|
||||||
<label for="convertPrice" class="col-sm-4">{{ currency ? 'Item Price (' + currency + ') : ' : 'Item Price : ' }}</label>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<input type="number" id="convertPrice" name="convertPrice" class="form-control" readonly v-model="convertPrice">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@* Delivery Order Number *@
|
|
||||||
<div class="form-group row">
|
|
||||||
<label for="DONo" class="col-sm-4">Enter DO Number:</label>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<input type="text" id="DONo" name="DONo" class="form-control" v-model="DONo" placeholder="DO123456">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@* Delivery Order Date *@
|
|
||||||
<div class="form-group row">
|
|
||||||
<label for="DODate" class="col-sm-4">Enter DO Date:</label>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<input type="date" id="DODate" name="DODate" class="form-control" v-on:input="calculateWarrantyEndDate()" v-model="DODate">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@* Warranty *@
|
|
||||||
<div class="form-group row">
|
|
||||||
<label for="warranty" class="col-sm-4">Enter Warranty (Months):</label>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<input type="number" id="warranty" name="warranty" class="form-control" placeholder="0 , 1 , 2 , 3, ..." step="1" min="0" v-on:input="calculateWarrantyEndDate()" required v-model="warranty">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@* Warranty End Date *@
|
|
||||||
<div class="form-group row">
|
|
||||||
<label for="EndWDate" class="col-sm-4">Warranty End:</label>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<input type="date" id="EndWDate" name="EndWDate" class="form-control" readonly v-model="EndWDate">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@* Invoice Number *@
|
|
||||||
<div class="form-group row">
|
|
||||||
<label for="invoiceNo" class="col-sm-4">Invoice Number:</label>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<input type="text" id="invoiceNo" name="invoiceNo" class="form-control" v-model="invoiceNo" placeholder="Invoice123456">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@* Invoice Date *@
|
|
||||||
<div class="form-group row">
|
|
||||||
<label for="invoiceDate" class="col-sm-4">Invoice Date:</label>
|
|
||||||
<div class="col-sm-8">
|
|
||||||
<input type="date" id="invoiceDate" name="invoiceDate" class="form-control" v-model="invoiceDate">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@* Submit and Reset Buttons *@
|
@* Submit and Reset Buttons *@
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<div class="col-sm-8 offset-sm-3">
|
<div class="col-sm-8 offset-sm-3">
|
||||||
@ -446,12 +124,12 @@
|
|||||||
}
|
}
|
||||||
<script>
|
<script>
|
||||||
$(function () {
|
$(function () {
|
||||||
app.mount('#registerItem');
|
app.mount('#requestProduct');
|
||||||
|
|
||||||
// Attach a click event listener to elements with the class 'btn-success'.
|
// Attach a click event listener to elements with the class 'btn-success'.
|
||||||
$('#addItemBtn').on('click', function () {
|
$('#addRequestBtn').on('click', function () {
|
||||||
// Show the modal with the ID 'addManufacturerModal'.
|
// Show the modal with the ID 'addManufacturerModal'.
|
||||||
$('#itemMovementModal').modal('show');
|
$('#requestModal').modal('show');
|
||||||
});
|
});
|
||||||
$('.closeModal').on('click', function () {
|
$('.closeModal').on('click', function () {
|
||||||
// Show the modal with the ID 'addManufacturerModal'.
|
// Show the modal with the ID 'addManufacturerModal'.
|
||||||
@ -461,99 +139,44 @@
|
|||||||
const app = Vue.createApp({
|
const app = Vue.createApp({
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
companies: [
|
requestId : null,
|
||||||
{
|
userId : null,
|
||||||
companyId: 1,
|
stationId : null,
|
||||||
companyName: "PSTW",
|
productId : null,
|
||||||
departments: [{ departmentId: 1, departmentName: "Air" }, { departmentId: 2, departmentName: "Marine" }, { departmentId: 3, departmentName: "River" }]
|
remark: "",
|
||||||
},
|
document: null,
|
||||||
{
|
quantity: 0,
|
||||||
companyId: 2,
|
status: "",
|
||||||
companyName: "TES",
|
requestDate : null,
|
||||||
departments: [{ departmentId: 1, departmentName: "Air" }],
|
approvalDate : null,
|
||||||
},
|
selectedCategory: "",
|
||||||
],
|
|
||||||
company: "",
|
|
||||||
Dept: null,
|
|
||||||
teamTypes: ["Continuous", "Manual"],
|
|
||||||
teamType: "",
|
|
||||||
productName: null,
|
productName: null,
|
||||||
imageProduct: null,
|
|
||||||
productCategory: null,
|
productCategory: null,
|
||||||
serialNumber: "",
|
|
||||||
quantity: 1,
|
|
||||||
supplierName: null,
|
|
||||||
purchaseDate: null,
|
|
||||||
PO: null,
|
|
||||||
currency: "MYR",
|
|
||||||
DefaultPrice: 0.01,
|
|
||||||
currencyRate: 1,
|
|
||||||
convertPrice: 0.01,
|
|
||||||
DONo:null,
|
|
||||||
DODate: null,
|
|
||||||
warranty: 0,
|
|
||||||
EndWDate: null,
|
|
||||||
invoiceNo: null,
|
|
||||||
invoiceDate: null,
|
|
||||||
partNumber: null,
|
|
||||||
products: [],
|
|
||||||
depts: [],
|
|
||||||
stations: [],
|
stations: [],
|
||||||
stores: [],
|
|
||||||
users:[],
|
|
||||||
suppliers: [
|
|
||||||
{
|
|
||||||
supplierId: 1,
|
|
||||||
supplierName: "Pang",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
supplierId: 2,
|
|
||||||
supplierName: "Ms Kim",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
isModalOpen: false,
|
|
||||||
selectedProduct: "",
|
selectedProduct: "",
|
||||||
selectedSupplier: "",
|
selectedStation: "",
|
||||||
selectedCompany: "",
|
showRequestModal: false,
|
||||||
selectedDepartment: "",
|
|
||||||
selectedTeamType: "",
|
|
||||||
selectedtoStation: "",
|
|
||||||
currencies: {},
|
|
||||||
showItemModal: false,
|
|
||||||
loading: false,
|
loading: false,
|
||||||
thisQRInfo: {
|
request: [],
|
||||||
uniqueID: null,
|
|
||||||
departmentName: null,
|
|
||||||
serialNumber: null,
|
|
||||||
endWDate: null,
|
|
||||||
},
|
|
||||||
items: [],
|
|
||||||
currentUser: null,
|
currentUser: null,
|
||||||
currentUserCompanyDept: null,
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
|
this.fetchRequest();
|
||||||
this.fetchUser();
|
this.fetchUser();
|
||||||
this.fetchItem();
|
|
||||||
this.fetchCurrencyData();
|
|
||||||
this.fetchCompanies();
|
|
||||||
this.fetchProducts();
|
this.fetchProducts();
|
||||||
this.fetchSuppliers();
|
|
||||||
this.fetchStation();
|
this.fetchStation();
|
||||||
this.fetchStore();
|
|
||||||
this.fetchUsers();
|
|
||||||
|
|
||||||
|
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
filteredDepartments() {
|
// filteredDepartments() {
|
||||||
if (!this.selectedCompany) {
|
// if (!this.selectedCompany) {
|
||||||
return []; // No company selected, return empty list
|
// return []; No company selected, return empty list
|
||||||
}
|
// }
|
||||||
const company = this.companies.find(c => c.companyId === this.selectedCompany);
|
// const company = this.companies.find(c => c.companyId === this.selectedCompany);
|
||||||
// this.selectedDepartment = '';
|
// this.selectedDepartment = '';
|
||||||
return company ? company.departments : [];
|
// return company ? company.departments : [];
|
||||||
},
|
// },
|
||||||
showProduct() {
|
showProduct() {
|
||||||
if (!this.selectedProduct) {
|
if (!this.selectedProduct) {
|
||||||
return []; // No company selected, return empty list
|
return []; // No company selected, return empty list
|
||||||
@ -561,57 +184,34 @@
|
|||||||
const product = this.products.find(c => c.productId === this.selectedProduct);
|
const product = this.products.find(c => c.productId === this.selectedProduct);
|
||||||
return product ? product : {};
|
return product ? product : {};
|
||||||
},
|
},
|
||||||
showSerialNumber() {
|
|
||||||
return this.showProduct.category === 'Asset' || this.showProduct.category === 'Part';
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
async addItem() {
|
async addRequest() {
|
||||||
if (this.showProduct.category == "Disposable") {
|
|
||||||
this.serialNumber = "";
|
|
||||||
}
|
|
||||||
const formData = {
|
|
||||||
CompanyId: this.selectedCompany,
|
|
||||||
DepartmentId: this.selectedDepartment,
|
|
||||||
ProductId: this.selectedProduct,
|
|
||||||
SerialNumber: this.serialNumber,
|
|
||||||
Quantity: this.quantity,
|
|
||||||
Supplier: this.selectedSupplier,
|
|
||||||
PurchaseDate: this.purchaseDate,
|
|
||||||
PONo: this.PO,
|
|
||||||
Currency: this.currency,
|
|
||||||
DefaultPrice: this.DefaultPrice,
|
|
||||||
CurrencyRate: this.currencyRate,
|
|
||||||
ConvertPrice: this.convertPrice,
|
|
||||||
DODate: this.DODate,
|
|
||||||
Warranty: this.warranty,
|
|
||||||
EndWDate: this.EndWDate,
|
|
||||||
InvoiceDate: this.invoiceDate,
|
|
||||||
CreatedByUserId: this.currentUser.id,
|
|
||||||
TeamType: this.selectedTeamType,
|
|
||||||
PartNumber: this.partNumber,
|
|
||||||
};
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
const requiredFields = ['stationId', 'productId', 'quantity', 'productCategory'];
|
||||||
|
|
||||||
// Additional specific checks
|
// Loop through required fields and check if any are null or empty
|
||||||
if (this.showSerialNumber) {
|
for (let field of requiredFields) {
|
||||||
this.quantity = 0;
|
if (this[field] === null || this[field] === '') {
|
||||||
if (this.serialNumber === null || this.serialNumber === '') {
|
alert('Request Error', `Please fill in required fields: ${field}.`, 'warning');
|
||||||
alert('Serial Number Error', 'Serial Number must be filled when selecting Item or Part.', 'warning');
|
return; // Exit early if validation fails
|
||||||
return;
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else {
|
const requestData = {
|
||||||
this.serialNumber = null;
|
ProductId: this.productId,
|
||||||
if (this.quantity === 0 || this.quantity === null || this.quantity === '') {
|
StationId: this.stationId,
|
||||||
alert('quantity Error', 'Quantity is required when selecting Disposable.', 'warning');
|
UserId: this.userId,
|
||||||
return;
|
RequestQuantitiy: this.quantity,
|
||||||
}
|
Document: this.document,
|
||||||
}
|
remark: this.remark,
|
||||||
|
status: this.status,
|
||||||
|
requestDate: this.requestDate,
|
||||||
|
approvalDate: this.approvalDate,
|
||||||
|
};
|
||||||
|
|
||||||
// Proceed to send the data to the API
|
// Proceed to send the data to the API
|
||||||
const response = await fetch('/InvMainAPI/AddItem', {
|
const response = await fetch('/InvMainAPI/AddRequest', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: {
|
headers: {
|
||||||
'Content-Type': 'application/json',
|
'Content-Type': 'application/json',
|
||||||
@ -621,11 +221,11 @@
|
|||||||
});
|
});
|
||||||
if (response.ok) {
|
if (response.ok) {
|
||||||
// If the form submission was successful, display a success message
|
// If the form submission was successful, display a success message
|
||||||
alert('Success!', 'Item form has been successfully submitted.', 'success');
|
alert('Success!', 'Request form has been successfully submitted.', 'success');
|
||||||
const updatedItem = await response.json();
|
const requestItem = await response.json();
|
||||||
this.items.push(updatedItem);
|
this.items.push(requestItem);
|
||||||
|
|
||||||
this.fetchItem();
|
this.fetchRequest();
|
||||||
|
|
||||||
// Reset the form
|
// Reset the form
|
||||||
this.resetForm();
|
this.resetForm();
|
||||||
@ -644,7 +244,7 @@
|
|||||||
|
|
||||||
initiateTable() {
|
initiateTable() {
|
||||||
self = this;
|
self = this;
|
||||||
this.itemDatatable = $('#itemDatatable').DataTable({
|
this.requestDatatable = $('#requestDatatable').DataTable({
|
||||||
"data": this.items,
|
"data": this.items,
|
||||||
"columns": [
|
"columns": [
|
||||||
{
|
{
|
||||||
@ -680,58 +280,6 @@
|
|||||||
"title": "Approval Date",
|
"title": "Approval Date",
|
||||||
"data": "approvalDate",
|
"data": "approvalDate",
|
||||||
},
|
},
|
||||||
// {
|
|
||||||
// "title": "Quantity",
|
|
||||||
// "data": "quantity",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// "title": "To Station",
|
|
||||||
// "data": "toStation",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// "title": "To Store",
|
|
||||||
// "data": "toStore",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// "title": "To Other",
|
|
||||||
// "data": "toOther",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// "title": "Remark",
|
|
||||||
// "data": "remark",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// "title": "Note",
|
|
||||||
// "data": "consignmentNote",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// "title": "Send Date",
|
|
||||||
// "data": "date",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// "title": "Last User",
|
|
||||||
// "data": "lastUser",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// "title": "Last Store",
|
|
||||||
// "data": "lastStore",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// "title": "Last Station",
|
|
||||||
// "data": "lastStation",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// "title": "Latest Status",
|
|
||||||
// "data": "latestStatus",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// "title": "Receive Date",
|
|
||||||
// "data": "date",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// "title": "Completion",
|
|
||||||
// "data": "movementComplete",
|
|
||||||
// },
|
|
||||||
{
|
{
|
||||||
"title": "Reject",
|
"title": "Reject",
|
||||||
"data": "requestId",
|
"data": "requestId",
|
||||||
@ -781,17 +329,17 @@
|
|||||||
})
|
})
|
||||||
|
|
||||||
// Attach click event listener to the delete buttons
|
// Attach click event listener to the delete buttons
|
||||||
$('#itemDatatable tbody').on('click', '.reject-btn', function () {
|
$('#requestDatatable tbody').on('click', '.reject-btn', function () {
|
||||||
const itemId = $(this).data('id');
|
const itemId = $(this).data('id');
|
||||||
self.rejectRequest(itemId);
|
self.rejectRequest(itemId);
|
||||||
});
|
});
|
||||||
|
|
||||||
$('#itemDatatable tbody').on('click', '.approve-btn', function () {
|
$('#requestDatatable tbody').on('click', '.approve-btn', function () {
|
||||||
const itemId = $(this).data('id');
|
const itemId = $(this).data('id');
|
||||||
self.approveRequest(itemId);
|
self.approveRequest(itemId);
|
||||||
});
|
});
|
||||||
|
|
||||||
$('#itemDatatable tbody').on('click', '.print-btn', function () {
|
$('#requestDatatable tbody').on('click', '.print-btn', function () {
|
||||||
const $button = $(this); // The clicked button
|
const $button = $(this); // The clicked button
|
||||||
const $row = $button.closest('tr'); // The parent row of the button
|
const $row = $button.closest('tr'); // The parent row of the button
|
||||||
const itemId = $button.data('id'); // Get the item ID from the button's data attribute
|
const itemId = $button.data('id'); // Get the item ID from the button's data attribute
|
||||||
@ -817,7 +365,7 @@
|
|||||||
this.loading = false;
|
this.loading = false;
|
||||||
},
|
},
|
||||||
|
|
||||||
async fetchItem() {
|
async fetchRequest() {
|
||||||
try {
|
try {
|
||||||
// const token = localStorage.getItem('token'); // Get the token from localStorage
|
// const token = localStorage.getItem('token'); // Get the token from localStorage
|
||||||
const response = await fetch('/InvMainAPI/ItemRequestList', {
|
const response = await fetch('/InvMainAPI/ItemRequestList', {
|
||||||
@ -833,8 +381,8 @@
|
|||||||
}
|
}
|
||||||
this.items = await response.json();
|
this.items = await response.json();
|
||||||
|
|
||||||
if (this.itemDatatable) {
|
if (this.requestDatatable) {
|
||||||
this.itemDatatable.clear().destroy();
|
this.requestDatatable.clear().destroy();
|
||||||
}
|
}
|
||||||
this.initiateTable();
|
this.initiateTable();
|
||||||
}
|
}
|
||||||
@ -1039,8 +587,8 @@
|
|||||||
|
|
||||||
//static update
|
//static update
|
||||||
const row = $(`.approve-btn[data-id="${itemId}"]`).closest('tr');
|
const row = $(`.approve-btn[data-id="${itemId}"]`).closest('tr');
|
||||||
this.itemDatatable.row(row)
|
this.requestDatatable.row(row)
|
||||||
.data({ ...this.itemDatatable.row(row)
|
.data({ ...this.requestDatatable.row(row)
|
||||||
.data(), status: "Approved" })
|
.data(), status: "Approved" })
|
||||||
.draw();
|
.draw();
|
||||||
|
|
||||||
@ -1074,8 +622,8 @@
|
|||||||
|
|
||||||
//static update
|
//static update
|
||||||
const row = $(`.approve-btn[data-id="${itemId}"]`).closest('tr');
|
const row = $(`.approve-btn[data-id="${itemId}"]`).closest('tr');
|
||||||
this.itemDatatable.row(row)
|
this.requestDatatable.row(row)
|
||||||
.data({ ...this.itemDatatable.row(row)
|
.data({ ...this.requestDatatable.row(row)
|
||||||
.data(), status: "Rejected" })
|
.data(), status: "Rejected" })
|
||||||
.draw();
|
.draw();
|
||||||
|
|
||||||
|
|||||||
@ -48,13 +48,25 @@
|
|||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="col-6 col-md-6 col-lg-3">
|
||||||
|
<div class="card card-hover">
|
||||||
|
<a asp-area="Inventory" asp-controller="InventoryMaster" asp-action="StationRegistration">
|
||||||
|
<div class="box bg-warning text-center">
|
||||||
|
<h1 class="font-light text-white">
|
||||||
|
<i class="mdi mdi-truck"></i>
|
||||||
|
</h1>
|
||||||
|
<h6 class="text-white">Station</h6>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="col-6 col-md-6 col-lg-3">
|
<div class="col-6 col-md-6 col-lg-3">
|
||||||
<div class="card card-hover">
|
<div class="card card-hover">
|
||||||
<a asp-area="Inventory" asp-controller="InventoryMaster" asp-action="ItemMovement">
|
<a asp-area="Inventory" asp-controller="InventoryMaster" asp-action="ItemMovement">
|
||||||
<div class="box bg-success text-center">
|
<div class="box bg-cyan text-center">
|
||||||
<h1 class="font-light text-white">
|
<h1 class="font-light text-white">
|
||||||
<i class="mdi mdi-checkbox-multiple-blank-circle"></i>
|
<i class="mdi mdi-factory"></i>
|
||||||
</h1>
|
</h1>
|
||||||
<h6 class="text-white">Item Movement</h6>
|
<h6 class="text-white">Item Movement</h6>
|
||||||
</div>
|
</div>
|
||||||
@ -65,11 +77,11 @@
|
|||||||
<div class="col-6 col-md-6 col-lg-3">
|
<div class="col-6 col-md-6 col-lg-3">
|
||||||
<div class="card card-hover">
|
<div class="card card-hover">
|
||||||
<a asp-area="Inventory" asp-controller="InventoryMaster" asp-action="ItemRequest">
|
<a asp-area="Inventory" asp-controller="InventoryMaster" asp-action="ItemRequest">
|
||||||
<div class="box bg-success text-center">
|
<div class="box bg-info text-center">
|
||||||
<h1 class="font-light text-white">
|
<h1 class="font-light text-white">
|
||||||
<i class="mdi mdi-checkbox-multiple-blank-circle"></i>
|
<i class="mdi mdi-checkbox-multiple-blank"></i>
|
||||||
</h1>
|
</h1>
|
||||||
<h6 class="text-white">Item Request</h6>
|
<h6 class="text-white">Product Request</h6>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -11,6 +11,7 @@ using System.ComponentModel.Design;
|
|||||||
using System.Data;
|
using System.Data;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
using static System.Collections.Specialized.BitVector32;
|
||||||
|
|
||||||
namespace PSTW_CentralSystem.Controllers.API.Inventory
|
namespace PSTW_CentralSystem.Controllers.API.Inventory
|
||||||
{
|
{
|
||||||
@ -627,13 +628,67 @@ namespace PSTW_CentralSystem.Controllers.API.Inventory
|
|||||||
|
|
||||||
#endregion ItemMovement
|
#endregion ItemMovement
|
||||||
|
|
||||||
#region ItemRequest
|
#region ItemRequestUser
|
||||||
|
|
||||||
|
[HttpPost("AddRequest")]
|
||||||
|
public async Task<IActionResult> AddRequest([FromBody] RequestModel request, [FromQuery] int UserId)
|
||||||
|
|
||||||
|
{
|
||||||
|
if (!ModelState.IsValid)
|
||||||
|
{
|
||||||
|
return BadRequest(ModelState);
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_centralDbContext.Requests.Add(request);
|
||||||
|
await _centralDbContext.SaveChangesAsync();
|
||||||
|
|
||||||
|
//ini akan paparkan user punya table sahaja.
|
||||||
|
|
||||||
|
var updatedList = await _centralDbContext.Requests.Where(r => r.UserId == UserId).ToListAsync();
|
||||||
|
|
||||||
|
return Json(updatedList);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
return BadRequest(ex.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpGet("ItemRequestListEachUser/{id}")]
|
||||||
|
public async Task<IActionResult> ItemRequestListEachUser(int UserId)
|
||||||
|
{
|
||||||
|
|
||||||
|
var itemRequestList = await _centralDbContext.Requests.Where(r => r.UserId == UserId).ToListAsync();
|
||||||
|
|
||||||
|
return Json(itemRequestList);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpDelete("DeleteRequest/{id}")]
|
||||||
|
public async Task<IActionResult> DeleteRequest(int id)
|
||||||
|
{
|
||||||
|
var request = await _centralDbContext.Requests.FindAsync(id);
|
||||||
|
if (request == null)
|
||||||
|
{
|
||||||
|
return NotFound(new { success = false, message = "Request not found" });
|
||||||
|
}
|
||||||
|
|
||||||
|
_centralDbContext.Requests.Remove(request);
|
||||||
|
await _centralDbContext.SaveChangesAsync();
|
||||||
|
|
||||||
|
return Ok(new { success = true, message = "Request deleted successfully" });
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region ItemRequestAdmin
|
||||||
[HttpGet("ItemRequestList")]
|
[HttpGet("ItemRequestList")]
|
||||||
public async Task<IActionResult> ItemRequestList()
|
public async Task<IActionResult> ItemRequestList()
|
||||||
{
|
{
|
||||||
|
|
||||||
var itemRequestList = await _centralDbContext.Request.ToListAsync();
|
var itemRequestList = await _centralDbContext.Requests.ToListAsync();
|
||||||
return Json(itemRequestList);
|
return Json(itemRequestList);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -641,7 +696,7 @@ namespace PSTW_CentralSystem.Controllers.API.Inventory
|
|||||||
[HttpPost("ApproveRequest/{id}")]
|
[HttpPost("ApproveRequest/{id}")]
|
||||||
public async Task<IActionResult> ApproveRequest(int id)
|
public async Task<IActionResult> ApproveRequest(int id)
|
||||||
{
|
{
|
||||||
var Request = await _centralDbContext.Request.FindAsync(id);
|
var Request = await _centralDbContext.Requests.FindAsync(id);
|
||||||
if (Request == null)
|
if (Request == null)
|
||||||
{
|
{
|
||||||
return NotFound(new { success = false, message = "Request not found" });
|
return NotFound(new { success = false, message = "Request not found" });
|
||||||
@ -657,7 +712,7 @@ namespace PSTW_CentralSystem.Controllers.API.Inventory
|
|||||||
[HttpPost("RejectRequest/{id}")]
|
[HttpPost("RejectRequest/{id}")]
|
||||||
public async Task<IActionResult> RejectRequest(int id)
|
public async Task<IActionResult> RejectRequest(int id)
|
||||||
{
|
{
|
||||||
var Request = await _centralDbContext.Request.FindAsync(id);
|
var Request = await _centralDbContext.Requests.FindAsync(id);
|
||||||
if (Request == null)
|
if (Request == null)
|
||||||
{
|
{
|
||||||
return NotFound(new { success = false, message = "Request not found" });
|
return NotFound(new { success = false, message = "Request not found" });
|
||||||
@ -670,7 +725,7 @@ namespace PSTW_CentralSystem.Controllers.API.Inventory
|
|||||||
return Ok(new { success = true, message="Request Rejected Successfully", data=Request });
|
return Ok(new { success = true, message="Request Rejected Successfully", data=Request });
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion ItemRequest
|
#endregion ItemRequestAdmin
|
||||||
|
|
||||||
#region ItemReport
|
#region ItemReport
|
||||||
|
|
||||||
@ -822,7 +877,7 @@ namespace PSTW_CentralSystem.Controllers.API.Inventory
|
|||||||
|
|
||||||
#endregion Store
|
#endregion Store
|
||||||
|
|
||||||
#region User
|
#region AllUser
|
||||||
|
|
||||||
[HttpPost("UserList")]
|
[HttpPost("UserList")]
|
||||||
public async Task<IActionResult> UserList()
|
public async Task<IActionResult> UserList()
|
||||||
@ -832,6 +887,6 @@ namespace PSTW_CentralSystem.Controllers.API.Inventory
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endregion User
|
#endregion AllUser
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -91,7 +91,7 @@ namespace PSTW_CentralSystem.DBContext
|
|||||||
public DbSet<DepartmentModel> Departments { get; set; }
|
public DbSet<DepartmentModel> Departments { get; set; }
|
||||||
public DbSet<ManufacturerModel> Manufacturers { get; set; }
|
public DbSet<ManufacturerModel> Manufacturers { get; set; }
|
||||||
public DbSet<ItemModel> Items { get; set; }
|
public DbSet<ItemModel> Items { get; set; }
|
||||||
public DbSet<RequestModel> Request { get; set; }
|
public DbSet<RequestModel> Requests { get; set; }
|
||||||
public DbSet<ProductModel> Products { get; set; }
|
public DbSet<ProductModel> Products { get; set; }
|
||||||
public DbSet<SupplierModel> Suppliers { get; set; }
|
public DbSet<SupplierModel> Suppliers { get; set; }
|
||||||
public DbSet<InventoryMasterModel> InventoryMasters { get; set; }
|
public DbSet<InventoryMasterModel> InventoryMasters { get; set; }
|
||||||
|
|||||||
987
Migrations/20250220015910_UpdateDatabaseChanges.Designer.cs
generated
Normal file
987
Migrations/20250220015910_UpdateDatabaseChanges.Designer.cs
generated
Normal file
@ -0,0 +1,987 @@
|
|||||||
|
// <auto-generated />
|
||||||
|
using System;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||||
|
using Microsoft.EntityFrameworkCore.Metadata;
|
||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
||||||
|
using PSTW_CentralSystem.DBContext;
|
||||||
|
|
||||||
|
#nullable disable
|
||||||
|
|
||||||
|
namespace PSTW_CentralSystem.Migrations
|
||||||
|
{
|
||||||
|
[DbContext(typeof(CentralSystemContext))]
|
||||||
|
[Migration("20250220015910_UpdateDatabaseChanges")]
|
||||||
|
partial class UpdateDatabaseChanges
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void BuildTargetModel(ModelBuilder modelBuilder)
|
||||||
|
{
|
||||||
|
#pragma warning disable 612, 618
|
||||||
|
modelBuilder
|
||||||
|
.HasAnnotation("ProductVersion", "8.0.11")
|
||||||
|
.HasAnnotation("Relational:MaxIdentifierLength", 64);
|
||||||
|
|
||||||
|
MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder);
|
||||||
|
|
||||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<int>", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
|
b.Property<string>("ClaimType")
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<string>("ClaimValue")
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<int>("RoleId")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("RoleId");
|
||||||
|
|
||||||
|
b.ToTable("AspNetRoleClaims", (string)null);
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<int>", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
|
b.Property<string>("ClaimType")
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<string>("ClaimValue")
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<int>("UserId")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("UserId");
|
||||||
|
|
||||||
|
b.ToTable("AspNetUserClaims", (string)null);
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<int>", b =>
|
||||||
|
{
|
||||||
|
b.Property<string>("LoginProvider")
|
||||||
|
.HasColumnType("varchar(255)");
|
||||||
|
|
||||||
|
b.Property<string>("ProviderKey")
|
||||||
|
.HasColumnType("varchar(255)");
|
||||||
|
|
||||||
|
b.Property<string>("ProviderDisplayName")
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<int>("UserId")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.HasKey("LoginProvider", "ProviderKey");
|
||||||
|
|
||||||
|
b.HasIndex("UserId");
|
||||||
|
|
||||||
|
b.ToTable("AspNetUserLogins", (string)null);
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<int>", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("UserId")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.Property<int>("RoleId")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.HasKey("UserId", "RoleId");
|
||||||
|
|
||||||
|
b.HasIndex("RoleId");
|
||||||
|
|
||||||
|
b.ToTable("AspNetUserRoles", (string)null);
|
||||||
|
|
||||||
|
b.HasData(
|
||||||
|
new
|
||||||
|
{
|
||||||
|
UserId = 1,
|
||||||
|
RoleId = 1
|
||||||
|
},
|
||||||
|
new
|
||||||
|
{
|
||||||
|
UserId = 2,
|
||||||
|
RoleId = 2
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<int>", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("UserId")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.Property<string>("LoginProvider")
|
||||||
|
.HasColumnType("varchar(255)");
|
||||||
|
|
||||||
|
b.Property<string>("Name")
|
||||||
|
.HasColumnType("varchar(255)");
|
||||||
|
|
||||||
|
b.Property<string>("Value")
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.HasKey("UserId", "LoginProvider", "Name");
|
||||||
|
|
||||||
|
b.ToTable("AspNetUserTokens", (string)null);
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("PSTW_CentralSystem.Areas.Inventory.Models.InventoryMasterModel", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("StoreId")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.Property<int>("UserId")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.HasKey("StoreId");
|
||||||
|
|
||||||
|
b.HasIndex("UserId");
|
||||||
|
|
||||||
|
b.ToTable("InventoryMasters");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("PSTW_CentralSystem.Areas.Inventory.Models.ItemModel", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("ItemID")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<int>("ItemID"));
|
||||||
|
|
||||||
|
b.Property<int>("CompanyId")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.Property<float>("ConvertPrice")
|
||||||
|
.HasColumnType("float");
|
||||||
|
|
||||||
|
b.Property<int>("CreatedByUserId")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.Property<string>("Currency")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<float>("CurrencyRate")
|
||||||
|
.HasColumnType("float");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("DODate")
|
||||||
|
.HasColumnType("datetime(6)");
|
||||||
|
|
||||||
|
b.Property<string>("DONo")
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<float>("DefaultPrice")
|
||||||
|
.HasColumnType("float");
|
||||||
|
|
||||||
|
b.Property<int>("DepartmentId")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.Property<DateTime>("EndWDate")
|
||||||
|
.HasColumnType("datetime(6)");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("InvoiceDate")
|
||||||
|
.HasColumnType("datetime(6)");
|
||||||
|
|
||||||
|
b.Property<string>("InvoiceNo")
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<int>("ItemStatus")
|
||||||
|
.HasColumnType("int")
|
||||||
|
.HasComment("1 = In stock; 2 = Item Moving; 3 = Item Out; 4 = Item Broken; 5 = Item Lost; 6 = Item Stolen; 7 = Item Damaged; 8 = Item Discarded; 9 = Item Destroyed; 10 = Item Finished;");
|
||||||
|
|
||||||
|
b.Property<int?>("MovementId")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.Property<string>("PONo")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<string>("PartNumber")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<int>("ProductId")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.Property<DateTime>("PurchaseDate")
|
||||||
|
.HasColumnType("datetime(6)");
|
||||||
|
|
||||||
|
b.Property<int>("Quantity")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.Property<string>("SerialNumber")
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<string>("Supplier")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<string>("TeamType")
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<string>("UniqueID")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<int>("Warranty")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.HasKey("ItemID");
|
||||||
|
|
||||||
|
b.HasIndex("CompanyId");
|
||||||
|
|
||||||
|
b.HasIndex("CreatedByUserId");
|
||||||
|
|
||||||
|
b.HasIndex("DepartmentId");
|
||||||
|
|
||||||
|
b.HasIndex("MovementId")
|
||||||
|
.IsUnique();
|
||||||
|
|
||||||
|
b.HasIndex("ProductId");
|
||||||
|
|
||||||
|
b.ToTable("Items");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("PSTW_CentralSystem.Areas.Inventory.Models.ItemMovementModel", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
|
b.Property<string>("Action")
|
||||||
|
.HasColumnType("longtext")
|
||||||
|
.HasComment("Register, StockIn, Stock Out");
|
||||||
|
|
||||||
|
b.Property<string>("ConsignmentNote")
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<DateTime>("Date")
|
||||||
|
.HasColumnType("datetime(6)");
|
||||||
|
|
||||||
|
b.Property<int>("ItemId")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.Property<int?>("LastStation")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.Property<int?>("LastStore")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.Property<int?>("LastUser")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.Property<string>("LatestStatus")
|
||||||
|
.HasColumnType("longtext")
|
||||||
|
.HasComment("Repair, Calibration, Faulty, Ready To Deploy, On Delivery");
|
||||||
|
|
||||||
|
b.Property<bool>("MovementComplete")
|
||||||
|
.HasColumnType("tinyint(1)");
|
||||||
|
|
||||||
|
b.Property<int?>("Quantity")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.Property<string>("Remark")
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<string>("ToOther")
|
||||||
|
.HasColumnType("longtext")
|
||||||
|
.HasComment("Repair, Calibration, Faulty, Ready To Deploy, On Delivery");
|
||||||
|
|
||||||
|
b.Property<int?>("ToStation")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.Property<int?>("ToStore")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.Property<int?>("ToUser")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("LastStation");
|
||||||
|
|
||||||
|
b.HasIndex("LastStore");
|
||||||
|
|
||||||
|
b.HasIndex("LastUser");
|
||||||
|
|
||||||
|
b.HasIndex("ToStation");
|
||||||
|
|
||||||
|
b.HasIndex("ToStore");
|
||||||
|
|
||||||
|
b.HasIndex("ToUser");
|
||||||
|
|
||||||
|
b.ToTable("ItemMovements");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("PSTW_CentralSystem.Areas.Inventory.Models.ManufacturerModel", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("ManufacturerId")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<int>("ManufacturerId"));
|
||||||
|
|
||||||
|
b.Property<string>("ManufacturerName")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.HasKey("ManufacturerId");
|
||||||
|
|
||||||
|
b.ToTable("Manufacturers");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("PSTW_CentralSystem.Areas.Inventory.Models.ProductModel", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("ProductId")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<int>("ProductId"));
|
||||||
|
|
||||||
|
b.Property<string>("Category")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<string>("ImageProduct")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<int>("ManufacturerId")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.Property<string>("ModelNo")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<string>("ProductName")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<string>("ProductShortName")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<int?>("QuantityProduct")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.HasKey("ProductId");
|
||||||
|
|
||||||
|
b.HasIndex("ManufacturerId");
|
||||||
|
|
||||||
|
b.ToTable("Products");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("PSTW_CentralSystem.Areas.Inventory.Models.RequestModel", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("requestId")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<int>("requestId"));
|
||||||
|
|
||||||
|
b.Property<DateTime>("approvalDate")
|
||||||
|
.HasColumnType("datetime(6)");
|
||||||
|
|
||||||
|
b.Property<string>("remark")
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<DateTime>("requestDate")
|
||||||
|
.HasColumnType("datetime(6)");
|
||||||
|
|
||||||
|
b.Property<string>("status")
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.HasKey("requestId");
|
||||||
|
|
||||||
|
b.ToTable("Request");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("PSTW_CentralSystem.Areas.Inventory.Models.StationModel", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("StationId")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<int>("StationId"));
|
||||||
|
|
||||||
|
b.Property<int>("DepartmentId")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.Property<string>("StationName")
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<int>("StationPicID")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.HasKey("StationId");
|
||||||
|
|
||||||
|
b.HasIndex("DepartmentId");
|
||||||
|
|
||||||
|
b.HasIndex("StationPicID");
|
||||||
|
|
||||||
|
b.ToTable("Stations");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("PSTW_CentralSystem.Areas.Inventory.Models.StoreModel", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
|
b.Property<int>("CompanyId")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.Property<string>("StoreName")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("CompanyId");
|
||||||
|
|
||||||
|
b.ToTable("Stores");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("PSTW_CentralSystem.Areas.Inventory.Models.SupplierModel", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("SupplierId")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<int>("SupplierId"));
|
||||||
|
|
||||||
|
b.Property<string>("SupplierAddress")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<string>("SupplierCompName")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<string>("SupplierEmail")
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<string>("SupplierPIC")
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<string>("SupplierPhoneNo")
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.HasKey("SupplierId");
|
||||||
|
|
||||||
|
b.ToTable("Suppliers");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("PSTW_CentralSystem.Models.CompanyModel", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("CompanyId")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<int>("CompanyId"));
|
||||||
|
|
||||||
|
b.Property<string>("CompanyName")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.HasKey("CompanyId");
|
||||||
|
|
||||||
|
b.ToTable("Companies");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("PSTW_CentralSystem.Models.DepartmentModel", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("DepartmentId")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<int>("DepartmentId"));
|
||||||
|
|
||||||
|
b.Property<int>("CompanyId")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.Property<string>("DepartmentCode")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<string>("DepartmentName")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.HasKey("DepartmentId");
|
||||||
|
|
||||||
|
b.HasIndex("CompanyId");
|
||||||
|
|
||||||
|
b.ToTable("Departments");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("PSTW_CentralSystem.Models.ModuleSettingModel", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("SettingId")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<int>("SettingId"));
|
||||||
|
|
||||||
|
b.Property<string>("AllowedUserType")
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<string>("Description")
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<string>("MethodAllowedUserType")
|
||||||
|
.HasColumnType("json");
|
||||||
|
|
||||||
|
b.Property<string>("ModuleName")
|
||||||
|
.IsRequired()
|
||||||
|
.HasMaxLength(50)
|
||||||
|
.HasColumnType("varchar(50)");
|
||||||
|
|
||||||
|
b.Property<int>("ModuleStatus")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.HasKey("SettingId");
|
||||||
|
|
||||||
|
b.ToTable("ModuleSettings");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("PSTW_CentralSystem.Models.RoleModel", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
|
b.Property<string>("ConcurrencyStamp")
|
||||||
|
.IsConcurrencyToken()
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<string>("Description")
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<string>("Name")
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("varchar(256)");
|
||||||
|
|
||||||
|
b.Property<string>("NormalizedName")
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("varchar(256)");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("NormalizedName")
|
||||||
|
.IsUnique()
|
||||||
|
.HasDatabaseName("RoleNameIndex");
|
||||||
|
|
||||||
|
b.ToTable("AspNetRoles", (string)null);
|
||||||
|
|
||||||
|
b.HasData(
|
||||||
|
new
|
||||||
|
{
|
||||||
|
Id = 1,
|
||||||
|
Description = "Can access all pages",
|
||||||
|
Name = "SuperAdmin",
|
||||||
|
NormalizedName = "SUPERADMIN"
|
||||||
|
},
|
||||||
|
new
|
||||||
|
{
|
||||||
|
Id = 2,
|
||||||
|
Description = "Can access some admin pages",
|
||||||
|
Name = "SystemAdmin",
|
||||||
|
NormalizedName = "SYSTEMADMIN"
|
||||||
|
},
|
||||||
|
new
|
||||||
|
{
|
||||||
|
Id = 3,
|
||||||
|
Description = "Can access operation pages",
|
||||||
|
Name = "Engineer",
|
||||||
|
NormalizedName = "ENGINEER"
|
||||||
|
},
|
||||||
|
new
|
||||||
|
{
|
||||||
|
Id = 4,
|
||||||
|
Description = "Can access data viewer pages",
|
||||||
|
Name = "Observer",
|
||||||
|
NormalizedName = "OBSERVER"
|
||||||
|
},
|
||||||
|
new
|
||||||
|
{
|
||||||
|
Id = 5,
|
||||||
|
Description = "Handle inventory module",
|
||||||
|
Name = "Inventory Master",
|
||||||
|
NormalizedName = "INVENTORY MASTER"
|
||||||
|
},
|
||||||
|
new
|
||||||
|
{
|
||||||
|
Id = 6,
|
||||||
|
Description = "Involve in inventory transaction",
|
||||||
|
Name = "Finance",
|
||||||
|
NormalizedName = "FINANCE"
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("PSTW_CentralSystem.Models.UserModel", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
|
b.Property<int>("AccessFailedCount")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.Property<string>("ConcurrencyStamp")
|
||||||
|
.IsConcurrencyToken()
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<string>("Email")
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("varchar(256)");
|
||||||
|
|
||||||
|
b.Property<bool>("EmailConfirmed")
|
||||||
|
.HasColumnType("tinyint(1)");
|
||||||
|
|
||||||
|
b.Property<string>("FullName")
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<bool>("LockoutEnabled")
|
||||||
|
.HasColumnType("tinyint(1)");
|
||||||
|
|
||||||
|
b.Property<DateTimeOffset?>("LockoutEnd")
|
||||||
|
.HasColumnType("datetime(6)");
|
||||||
|
|
||||||
|
b.Property<string>("NormalizedEmail")
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("varchar(256)");
|
||||||
|
|
||||||
|
b.Property<string>("NormalizedUserName")
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("varchar(256)");
|
||||||
|
|
||||||
|
b.Property<string>("PasswordHash")
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<string>("PhoneNumber")
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<bool>("PhoneNumberConfirmed")
|
||||||
|
.HasColumnType("tinyint(1)");
|
||||||
|
|
||||||
|
b.Property<string>("SecurityStamp")
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<bool>("TwoFactorEnabled")
|
||||||
|
.HasColumnType("tinyint(1)");
|
||||||
|
|
||||||
|
b.Property<int?>("UserInfoStatus")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.Property<string>("UserName")
|
||||||
|
.HasMaxLength(256)
|
||||||
|
.HasColumnType("varchar(256)");
|
||||||
|
|
||||||
|
b.Property<int?>("departmentId")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("NormalizedEmail")
|
||||||
|
.HasDatabaseName("EmailIndex");
|
||||||
|
|
||||||
|
b.HasIndex("NormalizedUserName")
|
||||||
|
.IsUnique()
|
||||||
|
.HasDatabaseName("UserNameIndex");
|
||||||
|
|
||||||
|
b.HasIndex("departmentId");
|
||||||
|
|
||||||
|
b.ToTable("AspNetUsers", (string)null);
|
||||||
|
|
||||||
|
b.HasData(
|
||||||
|
new
|
||||||
|
{
|
||||||
|
Id = 1,
|
||||||
|
AccessFailedCount = 0,
|
||||||
|
ConcurrencyStamp = "6b8e8dbd-4380-4e8c-aa0b-1c1fffc3059c",
|
||||||
|
Email = "admin@pstw.com.my",
|
||||||
|
EmailConfirmed = true,
|
||||||
|
FullName = "MAAdmin",
|
||||||
|
LockoutEnabled = false,
|
||||||
|
NormalizedEmail = "ADMIN@PSTW.COM.MY",
|
||||||
|
NormalizedUserName = "ADMIN@PSTW.COM.MY",
|
||||||
|
PasswordHash = "AQAAAAIAAYagAAAAEFKtr2LZjKgfLzY44m8cVW4qpdwci45lnh/t3ioymIh6Ib6c85ne3QGfnUAyERwMWg==",
|
||||||
|
PhoneNumberConfirmed = false,
|
||||||
|
SecurityStamp = "79e606c8-032b-426b-8fb2-7727b93823eb",
|
||||||
|
TwoFactorEnabled = false,
|
||||||
|
UserInfoStatus = 1,
|
||||||
|
UserName = "admin@pstw.com.my"
|
||||||
|
},
|
||||||
|
new
|
||||||
|
{
|
||||||
|
Id = 2,
|
||||||
|
AccessFailedCount = 0,
|
||||||
|
ConcurrencyStamp = "8bf46c63-d7df-4ac5-bab2-fc15fe881302",
|
||||||
|
Email = "sysadmin@pstw.com.my",
|
||||||
|
EmailConfirmed = true,
|
||||||
|
FullName = "SysAdmin",
|
||||||
|
LockoutEnabled = false,
|
||||||
|
NormalizedEmail = "SYSADMIN@PSTW.COM.MY",
|
||||||
|
NormalizedUserName = "SYSADMIN@PSTW.COM.MY",
|
||||||
|
PasswordHash = "AQAAAAIAAYagAAAAEB/4JzIPKQK76gM4+Ddc948BoBumC8oa2Ya4odgM4r6P+LNaWRaLOaFG4bp0Iya9Sg==",
|
||||||
|
PhoneNumberConfirmed = false,
|
||||||
|
SecurityStamp = "5ac5ec31-c25f-4a7a-8057-664ecdf76108",
|
||||||
|
TwoFactorEnabled = false,
|
||||||
|
UserInfoStatus = 1,
|
||||||
|
UserName = "sysadmin@pstw.com.my"
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<int>", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("PSTW_CentralSystem.Models.RoleModel", null)
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("RoleId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<int>", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("PSTW_CentralSystem.Models.UserModel", null)
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("UserId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<int>", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("PSTW_CentralSystem.Models.UserModel", null)
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("UserId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<int>", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("PSTW_CentralSystem.Models.RoleModel", null)
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("RoleId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.HasOne("PSTW_CentralSystem.Models.UserModel", null)
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("UserId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<int>", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("PSTW_CentralSystem.Models.UserModel", null)
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("UserId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("PSTW_CentralSystem.Areas.Inventory.Models.InventoryMasterModel", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("PSTW_CentralSystem.Areas.Inventory.Models.StoreModel", "Store")
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("StoreId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.HasOne("PSTW_CentralSystem.Models.UserModel", "User")
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("UserId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.Navigation("Store");
|
||||||
|
|
||||||
|
b.Navigation("User");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("PSTW_CentralSystem.Areas.Inventory.Models.ItemModel", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("PSTW_CentralSystem.Models.CompanyModel", "Company")
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("CompanyId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.HasOne("PSTW_CentralSystem.Models.UserModel", "CreatedBy")
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("CreatedByUserId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.HasOne("PSTW_CentralSystem.Models.DepartmentModel", "Department")
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("DepartmentId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.HasOne("PSTW_CentralSystem.Areas.Inventory.Models.ItemMovementModel", "Movement")
|
||||||
|
.WithOne("Item")
|
||||||
|
.HasForeignKey("PSTW_CentralSystem.Areas.Inventory.Models.ItemModel", "MovementId");
|
||||||
|
|
||||||
|
b.HasOne("PSTW_CentralSystem.Areas.Inventory.Models.ProductModel", "Product")
|
||||||
|
.WithMany("Items")
|
||||||
|
.HasForeignKey("ProductId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.Navigation("Company");
|
||||||
|
|
||||||
|
b.Navigation("CreatedBy");
|
||||||
|
|
||||||
|
b.Navigation("Department");
|
||||||
|
|
||||||
|
b.Navigation("Movement");
|
||||||
|
|
||||||
|
b.Navigation("Product");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("PSTW_CentralSystem.Areas.Inventory.Models.ItemMovementModel", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("PSTW_CentralSystem.Areas.Inventory.Models.StationModel", "FromStation")
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("LastStation");
|
||||||
|
|
||||||
|
b.HasOne("PSTW_CentralSystem.Areas.Inventory.Models.StoreModel", "FromStore")
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("LastStore");
|
||||||
|
|
||||||
|
b.HasOne("PSTW_CentralSystem.Models.UserModel", "FromUser")
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("LastUser");
|
||||||
|
|
||||||
|
b.HasOne("PSTW_CentralSystem.Areas.Inventory.Models.StationModel", "NextStation")
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("ToStation");
|
||||||
|
|
||||||
|
b.HasOne("PSTW_CentralSystem.Areas.Inventory.Models.StoreModel", "NextStore")
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("ToStore");
|
||||||
|
|
||||||
|
b.HasOne("PSTW_CentralSystem.Models.UserModel", "NextUser")
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("ToUser");
|
||||||
|
|
||||||
|
b.Navigation("FromStation");
|
||||||
|
|
||||||
|
b.Navigation("FromStore");
|
||||||
|
|
||||||
|
b.Navigation("FromUser");
|
||||||
|
|
||||||
|
b.Navigation("NextStation");
|
||||||
|
|
||||||
|
b.Navigation("NextStore");
|
||||||
|
|
||||||
|
b.Navigation("NextUser");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("PSTW_CentralSystem.Areas.Inventory.Models.ProductModel", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("PSTW_CentralSystem.Areas.Inventory.Models.ManufacturerModel", "Manufacturer")
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("ManufacturerId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.Navigation("Manufacturer");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("PSTW_CentralSystem.Areas.Inventory.Models.StationModel", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("PSTW_CentralSystem.Models.DepartmentModel", "Department")
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("DepartmentId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.HasOne("PSTW_CentralSystem.Models.UserModel", "StationPic")
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("StationPicID")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.Navigation("Department");
|
||||||
|
|
||||||
|
b.Navigation("StationPic");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("PSTW_CentralSystem.Areas.Inventory.Models.StoreModel", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("PSTW_CentralSystem.Models.CompanyModel", "Company")
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("CompanyId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.Navigation("Company");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("PSTW_CentralSystem.Models.DepartmentModel", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("PSTW_CentralSystem.Models.CompanyModel", "Company")
|
||||||
|
.WithMany("Departments")
|
||||||
|
.HasForeignKey("CompanyId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.Navigation("Company");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("PSTW_CentralSystem.Models.UserModel", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("PSTW_CentralSystem.Models.DepartmentModel", "Department")
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("departmentId");
|
||||||
|
|
||||||
|
b.Navigation("Department");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("PSTW_CentralSystem.Areas.Inventory.Models.ItemMovementModel", b =>
|
||||||
|
{
|
||||||
|
b.Navigation("Item");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("PSTW_CentralSystem.Areas.Inventory.Models.ProductModel", b =>
|
||||||
|
{
|
||||||
|
b.Navigation("Items");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("PSTW_CentralSystem.Models.CompanyModel", b =>
|
||||||
|
{
|
||||||
|
b.Navigation("Departments");
|
||||||
|
});
|
||||||
|
#pragma warning restore 612, 618
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
179
Migrations/20250220015910_UpdateDatabaseChanges.cs
Normal file
179
Migrations/20250220015910_UpdateDatabaseChanges.cs
Normal file
@ -0,0 +1,179 @@
|
|||||||
|
using System;
|
||||||
|
using Microsoft.EntityFrameworkCore.Metadata;
|
||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
|
||||||
|
#nullable disable
|
||||||
|
|
||||||
|
namespace PSTW_CentralSystem.Migrations
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
public partial class UpdateDatabaseChanges : Migration
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Up(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.RenameColumn(
|
||||||
|
name: "SupplierName",
|
||||||
|
table: "Suppliers",
|
||||||
|
newName: "SupplierCompName");
|
||||||
|
|
||||||
|
migrationBuilder.RenameColumn(
|
||||||
|
name: "SupplierGender",
|
||||||
|
table: "Suppliers",
|
||||||
|
newName: "SupplierAddress");
|
||||||
|
|
||||||
|
migrationBuilder.AlterColumn<string>(
|
||||||
|
name: "SupplierPhoneNo",
|
||||||
|
table: "Suppliers",
|
||||||
|
type: "longtext",
|
||||||
|
nullable: true,
|
||||||
|
oldClrType: typeof(string),
|
||||||
|
oldType: "longtext")
|
||||||
|
.Annotation("MySql:CharSet", "utf8mb4")
|
||||||
|
.OldAnnotation("MySql:CharSet", "utf8mb4");
|
||||||
|
|
||||||
|
migrationBuilder.AlterColumn<string>(
|
||||||
|
name: "SupplierEmail",
|
||||||
|
table: "Suppliers",
|
||||||
|
type: "longtext",
|
||||||
|
nullable: true,
|
||||||
|
oldClrType: typeof(string),
|
||||||
|
oldType: "longtext")
|
||||||
|
.Annotation("MySql:CharSet", "utf8mb4")
|
||||||
|
.OldAnnotation("MySql:CharSet", "utf8mb4");
|
||||||
|
|
||||||
|
migrationBuilder.AddColumn<string>(
|
||||||
|
name: "SupplierPIC",
|
||||||
|
table: "Suppliers",
|
||||||
|
type: "longtext",
|
||||||
|
nullable: true)
|
||||||
|
.Annotation("MySql:CharSet", "utf8mb4");
|
||||||
|
|
||||||
|
migrationBuilder.AddColumn<string>(
|
||||||
|
name: "ProductShortName",
|
||||||
|
table: "Products",
|
||||||
|
type: "longtext",
|
||||||
|
nullable: false)
|
||||||
|
.Annotation("MySql:CharSet", "utf8mb4");
|
||||||
|
|
||||||
|
migrationBuilder.AddColumn<string>(
|
||||||
|
name: "PartNumber",
|
||||||
|
table: "Items",
|
||||||
|
type: "longtext",
|
||||||
|
nullable: false)
|
||||||
|
.Annotation("MySql:CharSet", "utf8mb4");
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "Request",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
requestId = table.Column<int>(type: "int", nullable: false)
|
||||||
|
.Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
|
||||||
|
remark = table.Column<string>(type: "longtext", nullable: true)
|
||||||
|
.Annotation("MySql:CharSet", "utf8mb4"),
|
||||||
|
status = table.Column<string>(type: "longtext", nullable: true)
|
||||||
|
.Annotation("MySql:CharSet", "utf8mb4"),
|
||||||
|
requestDate = table.Column<DateTime>(type: "datetime(6)", nullable: false),
|
||||||
|
approvalDate = table.Column<DateTime>(type: "datetime(6)", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_Request", x => x.requestId);
|
||||||
|
})
|
||||||
|
.Annotation("MySql:CharSet", "utf8mb4");
|
||||||
|
|
||||||
|
migrationBuilder.UpdateData(
|
||||||
|
table: "AspNetUsers",
|
||||||
|
keyColumn: "Id",
|
||||||
|
keyValue: 1,
|
||||||
|
columns: new[] { "ConcurrencyStamp", "PasswordHash", "SecurityStamp" },
|
||||||
|
values: new object[] { "6b8e8dbd-4380-4e8c-aa0b-1c1fffc3059c", "AQAAAAIAAYagAAAAEFKtr2LZjKgfLzY44m8cVW4qpdwci45lnh/t3ioymIh6Ib6c85ne3QGfnUAyERwMWg==", "79e606c8-032b-426b-8fb2-7727b93823eb" });
|
||||||
|
|
||||||
|
migrationBuilder.UpdateData(
|
||||||
|
table: "AspNetUsers",
|
||||||
|
keyColumn: "Id",
|
||||||
|
keyValue: 2,
|
||||||
|
columns: new[] { "ConcurrencyStamp", "PasswordHash", "SecurityStamp" },
|
||||||
|
values: new object[] { "8bf46c63-d7df-4ac5-bab2-fc15fe881302", "AQAAAAIAAYagAAAAEB/4JzIPKQK76gM4+Ddc948BoBumC8oa2Ya4odgM4r6P+LNaWRaLOaFG4bp0Iya9Sg==", "5ac5ec31-c25f-4a7a-8057-664ecdf76108" });
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Down(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "Request");
|
||||||
|
|
||||||
|
migrationBuilder.DropColumn(
|
||||||
|
name: "SupplierPIC",
|
||||||
|
table: "Suppliers");
|
||||||
|
|
||||||
|
migrationBuilder.DropColumn(
|
||||||
|
name: "ProductShortName",
|
||||||
|
table: "Products");
|
||||||
|
|
||||||
|
migrationBuilder.DropColumn(
|
||||||
|
name: "PartNumber",
|
||||||
|
table: "Items");
|
||||||
|
|
||||||
|
migrationBuilder.RenameColumn(
|
||||||
|
name: "SupplierCompName",
|
||||||
|
table: "Suppliers",
|
||||||
|
newName: "SupplierName");
|
||||||
|
|
||||||
|
migrationBuilder.RenameColumn(
|
||||||
|
name: "SupplierAddress",
|
||||||
|
table: "Suppliers",
|
||||||
|
newName: "SupplierGender");
|
||||||
|
|
||||||
|
migrationBuilder.UpdateData(
|
||||||
|
table: "Suppliers",
|
||||||
|
keyColumn: "SupplierPhoneNo",
|
||||||
|
keyValue: null,
|
||||||
|
column: "SupplierPhoneNo",
|
||||||
|
value: "");
|
||||||
|
|
||||||
|
migrationBuilder.AlterColumn<string>(
|
||||||
|
name: "SupplierPhoneNo",
|
||||||
|
table: "Suppliers",
|
||||||
|
type: "longtext",
|
||||||
|
nullable: false,
|
||||||
|
oldClrType: typeof(string),
|
||||||
|
oldType: "longtext",
|
||||||
|
oldNullable: true)
|
||||||
|
.Annotation("MySql:CharSet", "utf8mb4")
|
||||||
|
.OldAnnotation("MySql:CharSet", "utf8mb4");
|
||||||
|
|
||||||
|
migrationBuilder.UpdateData(
|
||||||
|
table: "Suppliers",
|
||||||
|
keyColumn: "SupplierEmail",
|
||||||
|
keyValue: null,
|
||||||
|
column: "SupplierEmail",
|
||||||
|
value: "");
|
||||||
|
|
||||||
|
migrationBuilder.AlterColumn<string>(
|
||||||
|
name: "SupplierEmail",
|
||||||
|
table: "Suppliers",
|
||||||
|
type: "longtext",
|
||||||
|
nullable: false,
|
||||||
|
oldClrType: typeof(string),
|
||||||
|
oldType: "longtext",
|
||||||
|
oldNullable: true)
|
||||||
|
.Annotation("MySql:CharSet", "utf8mb4")
|
||||||
|
.OldAnnotation("MySql:CharSet", "utf8mb4");
|
||||||
|
|
||||||
|
migrationBuilder.UpdateData(
|
||||||
|
table: "AspNetUsers",
|
||||||
|
keyColumn: "Id",
|
||||||
|
keyValue: 1,
|
||||||
|
columns: new[] { "ConcurrencyStamp", "PasswordHash", "SecurityStamp" },
|
||||||
|
values: new object[] { "4c8e81ae-2e43-4f98-82a0-4d7c4aa6d011", "AQAAAAIAAYagAAAAEKr0d9Fe168hXvdX6+oJvbfo2QHFsp8i/EQjhLbkWRn/yvKImJa6XzZ5KJ6qohTE1w==", "2219ec34-d4a0-496b-a7d7-e6c5d7b2a222" });
|
||||||
|
|
||||||
|
migrationBuilder.UpdateData(
|
||||||
|
table: "AspNetUsers",
|
||||||
|
keyColumn: "Id",
|
||||||
|
keyValue: 2,
|
||||||
|
columns: new[] { "ConcurrencyStamp", "PasswordHash", "SecurityStamp" },
|
||||||
|
values: new object[] { "bcc1500e-9ae2-4704-9997-dbe646d2fa7a", "AQAAAAIAAYagAAAAEE3CUAWzIeL592V5xPyAD5ciHe8OGtvbNHhU6UNafDMT/+0R77o6UCDj/K8wc0j0Xw==", "7c582e0d-8237-4605-8fec-449bbe78f6c9" });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -208,6 +208,10 @@ namespace PSTW_CentralSystem.Migrations
|
|||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasColumnType("longtext");
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<string>("PartNumber")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
b.Property<int>("ProductId")
|
b.Property<int>("ProductId")
|
||||||
.HasColumnType("int");
|
.HasColumnType("int");
|
||||||
|
|
||||||
@ -367,6 +371,10 @@ namespace PSTW_CentralSystem.Migrations
|
|||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasColumnType("longtext");
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<string>("ProductShortName")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
b.Property<int?>("QuantityProduct")
|
b.Property<int?>("QuantityProduct")
|
||||||
.HasColumnType("int");
|
.HasColumnType("int");
|
||||||
|
|
||||||
@ -377,6 +385,31 @@ namespace PSTW_CentralSystem.Migrations
|
|||||||
b.ToTable("Products");
|
b.ToTable("Products");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("PSTW_CentralSystem.Areas.Inventory.Models.RequestModel", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("requestId")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<int>("requestId"));
|
||||||
|
|
||||||
|
b.Property<DateTime>("approvalDate")
|
||||||
|
.HasColumnType("datetime(6)");
|
||||||
|
|
||||||
|
b.Property<string>("remark")
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<DateTime>("requestDate")
|
||||||
|
.HasColumnType("datetime(6)");
|
||||||
|
|
||||||
|
b.Property<string>("status")
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.HasKey("requestId");
|
||||||
|
|
||||||
|
b.ToTable("Request");
|
||||||
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("PSTW_CentralSystem.Areas.Inventory.Models.StationModel", b =>
|
modelBuilder.Entity("PSTW_CentralSystem.Areas.Inventory.Models.StationModel", b =>
|
||||||
{
|
{
|
||||||
b.Property<int>("StationId")
|
b.Property<int>("StationId")
|
||||||
@ -433,20 +466,21 @@ namespace PSTW_CentralSystem.Migrations
|
|||||||
|
|
||||||
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<int>("SupplierId"));
|
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<int>("SupplierId"));
|
||||||
|
|
||||||
|
b.Property<string>("SupplierAddress")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<string>("SupplierCompName")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
b.Property<string>("SupplierEmail")
|
b.Property<string>("SupplierEmail")
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("longtext");
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
b.Property<string>("SupplierGender")
|
b.Property<string>("SupplierPIC")
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("longtext");
|
|
||||||
|
|
||||||
b.Property<string>("SupplierName")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("longtext");
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
b.Property<string>("SupplierPhoneNo")
|
b.Property<string>("SupplierPhoneNo")
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("longtext");
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
b.HasKey("SupplierId");
|
b.HasKey("SupplierId");
|
||||||
@ -685,16 +719,16 @@ namespace PSTW_CentralSystem.Migrations
|
|||||||
{
|
{
|
||||||
Id = 1,
|
Id = 1,
|
||||||
AccessFailedCount = 0,
|
AccessFailedCount = 0,
|
||||||
ConcurrencyStamp = "4c8e81ae-2e43-4f98-82a0-4d7c4aa6d011",
|
ConcurrencyStamp = "6b8e8dbd-4380-4e8c-aa0b-1c1fffc3059c",
|
||||||
Email = "admin@pstw.com.my",
|
Email = "admin@pstw.com.my",
|
||||||
EmailConfirmed = true,
|
EmailConfirmed = true,
|
||||||
FullName = "MAAdmin",
|
FullName = "MAAdmin",
|
||||||
LockoutEnabled = false,
|
LockoutEnabled = false,
|
||||||
NormalizedEmail = "ADMIN@PSTW.COM.MY",
|
NormalizedEmail = "ADMIN@PSTW.COM.MY",
|
||||||
NormalizedUserName = "ADMIN@PSTW.COM.MY",
|
NormalizedUserName = "ADMIN@PSTW.COM.MY",
|
||||||
PasswordHash = "AQAAAAIAAYagAAAAEKr0d9Fe168hXvdX6+oJvbfo2QHFsp8i/EQjhLbkWRn/yvKImJa6XzZ5KJ6qohTE1w==",
|
PasswordHash = "AQAAAAIAAYagAAAAEFKtr2LZjKgfLzY44m8cVW4qpdwci45lnh/t3ioymIh6Ib6c85ne3QGfnUAyERwMWg==",
|
||||||
PhoneNumberConfirmed = false,
|
PhoneNumberConfirmed = false,
|
||||||
SecurityStamp = "2219ec34-d4a0-496b-a7d7-e6c5d7b2a222",
|
SecurityStamp = "79e606c8-032b-426b-8fb2-7727b93823eb",
|
||||||
TwoFactorEnabled = false,
|
TwoFactorEnabled = false,
|
||||||
UserInfoStatus = 1,
|
UserInfoStatus = 1,
|
||||||
UserName = "admin@pstw.com.my"
|
UserName = "admin@pstw.com.my"
|
||||||
@ -703,16 +737,16 @@ namespace PSTW_CentralSystem.Migrations
|
|||||||
{
|
{
|
||||||
Id = 2,
|
Id = 2,
|
||||||
AccessFailedCount = 0,
|
AccessFailedCount = 0,
|
||||||
ConcurrencyStamp = "bcc1500e-9ae2-4704-9997-dbe646d2fa7a",
|
ConcurrencyStamp = "8bf46c63-d7df-4ac5-bab2-fc15fe881302",
|
||||||
Email = "sysadmin@pstw.com.my",
|
Email = "sysadmin@pstw.com.my",
|
||||||
EmailConfirmed = true,
|
EmailConfirmed = true,
|
||||||
FullName = "SysAdmin",
|
FullName = "SysAdmin",
|
||||||
LockoutEnabled = false,
|
LockoutEnabled = false,
|
||||||
NormalizedEmail = "SYSADMIN@PSTW.COM.MY",
|
NormalizedEmail = "SYSADMIN@PSTW.COM.MY",
|
||||||
NormalizedUserName = "SYSADMIN@PSTW.COM.MY",
|
NormalizedUserName = "SYSADMIN@PSTW.COM.MY",
|
||||||
PasswordHash = "AQAAAAIAAYagAAAAEE3CUAWzIeL592V5xPyAD5ciHe8OGtvbNHhU6UNafDMT/+0R77o6UCDj/K8wc0j0Xw==",
|
PasswordHash = "AQAAAAIAAYagAAAAEB/4JzIPKQK76gM4+Ddc948BoBumC8oa2Ya4odgM4r6P+LNaWRaLOaFG4bp0Iya9Sg==",
|
||||||
PhoneNumberConfirmed = false,
|
PhoneNumberConfirmed = false,
|
||||||
SecurityStamp = "7c582e0d-8237-4605-8fec-449bbe78f6c9",
|
SecurityStamp = "5ac5ec31-c25f-4a7a-8057-664ecdf76108",
|
||||||
TwoFactorEnabled = false,
|
TwoFactorEnabled = false,
|
||||||
UserInfoStatus = 1,
|
UserInfoStatus = 1,
|
||||||
UserName = "sysadmin@pstw.com.my"
|
UserName = "sysadmin@pstw.com.my"
|
||||||
|
|||||||
@ -454,13 +454,6 @@
|
|||||||
<i class="mdi mdi-view-dashboard"></i><span class="hide-menu">Item Registration</span>
|
<i class="mdi mdi-view-dashboard"></i><span class="hide-menu">Item Registration</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="sidebar-item">
|
|
||||||
<a class="sidebar-link waves-effect waves-dark sidebar-link"
|
|
||||||
asp-area="Inventory" asp-controller="InventoryMaster" asp-action="StationRegistration"
|
|
||||||
aria-expanded="false">
|
|
||||||
<i class="mdi mdi-view-dashboard"></i><span class="hide-menu">Station Registration</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li class="sidebar-item">
|
<li class="sidebar-item">
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
//"DefaultConnection": "Server=localhost;uid=root;Password='';Database=web_interface;"
|
//"DefaultConnection": "Server=localhost;uid=root;Password='';Database=web_interface;"
|
||||||
//"DefaultConnection": "server=175.136.244.102;user id=root;password=tw_mysql_root;port=3306;database=web_interface"
|
//"DefaultConnection": "server=175.136.244.102;user id=root;password=tw_mysql_root;port=3306;database=web_interface"
|
||||||
//"CentralConnnection": "Server=192.168.12.12;Port=3306;uid=installer;password='pstw_mysql_installer';database=pstw_cs;", //DB_dev Local connection
|
//"CentralConnnection": "Server=192.168.12.12;Port=3306;uid=installer;password='pstw_mysql_installer';database=pstw_cs;", //DB_dev Local connection
|
||||||
"CentralConnnection": "Server=219.92.7.60;Port=3307;uid=installer;password='pstw_mysql_installer';database=pstw_cs;", //DB_dev Public connection
|
"CentralConnnection": "Server=219.92.7.60;Port=3307;uid=installer;password='pstw_mysql_installer';database=pstw_cs;" //DB_dev Public connection
|
||||||
//"InventoryConnection": "Server=219.92.7.60;Port=3307;uid=installer;password='pstw_mysql_installer';database=pstw_cs_inventory;" //DB_dev connection
|
//"InventoryConnection": "Server=219.92.7.60;Port=3307;uid=installer;password='pstw_mysql_installer';database=pstw_cs_inventory;" //DB_dev connection
|
||||||
//"DefaultConnection": "Server=219.92.7.60;Port=3307;uid=intern;password='intern_mysql_acct';database=web_interface;"//DB_dev connection
|
//"DefaultConnection": "Server=219.92.7.60;Port=3307;uid=intern;password='intern_mysql_acct';database=web_interface;"//DB_dev connection
|
||||||
},
|
},
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user