354 lines
13 KiB
C#
354 lines
13 KiB
C#
using Microsoft.AspNetCore.Authorization;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Mono.TextTemplating;
|
|
using Newtonsoft.Json;
|
|
using PSTW_CentralSystem.Areas.Inventory.Models;
|
|
using PSTW_CentralSystem.DBContext;
|
|
using PSTW_CentralSystem.Models;
|
|
using System.ComponentModel.Design;
|
|
using System.Diagnostics;
|
|
using System.Reflection;
|
|
|
|
namespace PSTW_CentralSystem.Controllers.API.Inventory
|
|
{
|
|
[ApiController]
|
|
[Route("[controller]")]
|
|
|
|
public class InvMainAPI : Controller
|
|
{
|
|
private readonly ILogger<InvMainAPI> _logger;
|
|
private readonly CentralSystemContext _centralDbContext;
|
|
|
|
public InvMainAPI(ILogger<InvMainAPI> logger, CentralSystemContext centralDbContext)
|
|
{
|
|
_logger = logger;
|
|
_centralDbContext = centralDbContext;
|
|
}
|
|
|
|
public class DepartmentCompany
|
|
{
|
|
public int DepartmentId { get; set; }
|
|
public string? DepartmentName { get; set; }
|
|
public int CompanyId { get; set; }
|
|
public string? CompanyName { get; set; }
|
|
public string? DepartmentCode { get; set; }
|
|
}
|
|
|
|
public async Task<List<DepartmentCompany>> GetDepartmentWithCompanyList()
|
|
{
|
|
var departmentList = await _centralDbContext.Departments.ToListAsync();
|
|
var companyList = await _centralDbContext.Companies.ToListAsync();
|
|
|
|
// Create a new list to store departments with their company name
|
|
var departmentWithCompanyList = departmentList.Select(department => new DepartmentCompany
|
|
{
|
|
DepartmentId = department.DepartmentId,
|
|
DepartmentName = department.DepartmentName,
|
|
CompanyId = department.CompanyId,
|
|
CompanyName = companyList.FirstOrDefault(company => company.CompanyId == department.CompanyId)?.CompanyName
|
|
}).ToList();
|
|
|
|
// Return the constructed list as JSON
|
|
return departmentWithCompanyList;
|
|
}
|
|
public async Task<DepartmentCompany> GetDepartmentWithCompany(int companyId, int departmentId)
|
|
{
|
|
var departmentList = await _centralDbContext.Departments.FirstOrDefaultAsync(d => d.DepartmentId == departmentId );
|
|
var companyList = await _centralDbContext.Companies.FirstOrDefaultAsync(c => c.CompanyId == companyId);
|
|
|
|
// Create a new list to store departments with their company name
|
|
var departmentWithCompany = new DepartmentCompany
|
|
{
|
|
DepartmentId = departmentList!.DepartmentId,
|
|
DepartmentName = departmentList.DepartmentName,
|
|
CompanyId = departmentList.CompanyId,
|
|
CompanyName = companyList?.CompanyName,
|
|
DepartmentCode = departmentList.DepartmentCode,
|
|
};
|
|
|
|
// Return the constructed list as JSON
|
|
return departmentWithCompany;
|
|
}
|
|
|
|
#region Manufacturer
|
|
|
|
[HttpPost("ManufacturerList")]
|
|
public async Task<IActionResult> ManufacturerList()
|
|
{
|
|
var manifacturerList = await _centralDbContext.Manufacturers.ToListAsync();
|
|
return Json(manifacturerList);
|
|
}
|
|
|
|
[HttpPost("AddManufacturer")]
|
|
public async Task<IActionResult> AddManufacturer([FromBody] ManufacturerModel manufacturer)
|
|
{
|
|
if (!ModelState.IsValid)
|
|
{
|
|
return BadRequest(ModelState);
|
|
}
|
|
|
|
try
|
|
{
|
|
_centralDbContext.Manufacturers.Add(new ManufacturerModel
|
|
{
|
|
ManufacturerName = manufacturer.ManufacturerName,
|
|
});
|
|
await _centralDbContext.SaveChangesAsync();
|
|
var updatedList = await _centralDbContext.Manufacturers.ToListAsync();
|
|
return Json(updatedList);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
return BadRequest(ex.Message);
|
|
}
|
|
}
|
|
|
|
[HttpDelete("DeleteManufacturer/{id}")]
|
|
public async Task<IActionResult> DeleteManufacturer(int id)
|
|
{
|
|
var manufacturer = await _centralDbContext.Manufacturers.FindAsync(id);
|
|
if (manufacturer == null)
|
|
{
|
|
return NotFound(new { success = false, message = "Manufacturer not found" });
|
|
}
|
|
|
|
_centralDbContext.Manufacturers.Remove(manufacturer);
|
|
await _centralDbContext.SaveChangesAsync();
|
|
|
|
return Ok(new { success = true, message = "Manufacturer deleted successfully" });
|
|
}
|
|
|
|
#endregion Manufacturer
|
|
|
|
#region Product
|
|
|
|
[HttpPost("ProductList")]
|
|
public async Task<IActionResult> ProductList()
|
|
{
|
|
var productList = await _centralDbContext.Products.Include("Manufacturer").ToListAsync();
|
|
return Json(productList);
|
|
}
|
|
|
|
[HttpPost("ProductListWithItem")]
|
|
public async Task<IActionResult> ProductListWithItem()
|
|
{
|
|
var productList = await _centralDbContext.Products
|
|
.Include(p => p.Items) // Include related items
|
|
.Include(p => p.Manufacturer) // Include related manufacturer
|
|
.ToListAsync();
|
|
|
|
return Json(productList);
|
|
}
|
|
|
|
|
|
[HttpPost("AddProduct")]
|
|
public async Task<IActionResult> AddProduct([FromBody] ProductModel product)
|
|
{
|
|
if (!ModelState.IsValid)
|
|
{
|
|
return BadRequest(ModelState);
|
|
}
|
|
if (product == null)
|
|
{
|
|
return NotFound("Product is null");
|
|
}
|
|
|
|
try
|
|
{
|
|
product.QuantityProduct = 0;
|
|
var productImage = product.ImageProduct; // Save image to wwwroot/media/inventory/images | Images name is product.ModelNo | product.ImageProduct is in base64 string
|
|
if (!string.IsNullOrEmpty(product.ImageProduct))
|
|
{
|
|
var bytes = Convert.FromBase64String(product.ImageProduct);
|
|
var filePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/media/inventory/images", product.ModelNo + ".jpg");
|
|
await System.IO.File.WriteAllBytesAsync(filePath, bytes);
|
|
product.ImageProduct = "/media/inventory/images/" + product.ModelNo + ".jpg";
|
|
}
|
|
_centralDbContext.Products.Add(product);
|
|
await _centralDbContext.SaveChangesAsync();
|
|
var updatedList = await _centralDbContext.Products.Include("Manufacturer").Where(x => x.ManufacturerId == x.ManufacturerId).ToListAsync();
|
|
return Json(updatedList);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
return BadRequest(ex.Message);
|
|
}
|
|
}
|
|
|
|
[HttpDelete("DeleteProduct/{id}")]
|
|
public async Task<IActionResult> DeleteProduct(int id)
|
|
{
|
|
var Product = await _centralDbContext.Products.FindAsync(id);
|
|
if (Product == null)
|
|
{
|
|
return NotFound(new { success = false, message = "Product not found" });
|
|
}
|
|
|
|
_centralDbContext.Products.Remove(Product);
|
|
await _centralDbContext.SaveChangesAsync();
|
|
|
|
return Ok(new { success = true, message = "Product deleted successfully" });
|
|
}
|
|
|
|
#endregion Product
|
|
|
|
#region Supplier
|
|
|
|
[HttpPost("SupplierList")]
|
|
public async Task<IActionResult> SupplierList()
|
|
{
|
|
var supplierList = await _centralDbContext.Suppliers.ToListAsync();
|
|
return Json(supplierList);
|
|
}
|
|
|
|
#endregion Supplier
|
|
|
|
#region Item
|
|
|
|
[HttpPost("ItemList")]
|
|
public async Task<IActionResult> ItemList()
|
|
{
|
|
// Get the item list
|
|
var itemList = await _centralDbContext.Items.Include("CreatedBy").Include("Department").Include("Product").ToListAsync();
|
|
|
|
// Get the departments list (DepartmentId references Departments)
|
|
var departments = await _centralDbContext.Departments.ToListAsync();
|
|
|
|
// Now join items with users and departments manually
|
|
var itemListWithDetails = itemList.Select(item => new
|
|
{
|
|
item.ItemID,
|
|
item.UniqueID,
|
|
item.CompanyId,
|
|
item.DepartmentId,
|
|
item.ProductId,
|
|
item.SerialNumber,
|
|
item.Quantity,
|
|
item.Supplier,
|
|
item.PurchaseDate,
|
|
item.PONo,
|
|
item.Currency,
|
|
item.DefaultPrice,
|
|
item.CurrencyRate,
|
|
item.ConvertPrice,
|
|
item.DODate,
|
|
item.Warranty,
|
|
item.EndWDate,
|
|
item.InvoiceDate,
|
|
item.Department?.DepartmentName,
|
|
item.CreatedBy!.UserName,
|
|
item.Product!.ProductName,
|
|
QRString = $"{HttpContext.Request.Scheme}://{HttpContext.Request.Host.Value}/Inventory/ItemInformation/{item.UniqueID}" // Generate QR String
|
|
}).ToList();
|
|
|
|
return Json(itemListWithDetails);
|
|
}
|
|
|
|
|
|
|
|
[HttpPost("GenerateItemQr/{id}")]
|
|
public IActionResult GenerateItemQr(string id)
|
|
{
|
|
// Retrieve the request's host and scheme
|
|
var request = HttpContext.Request;
|
|
string domain = $"{request.Scheme}://{request.Host.Value}";
|
|
|
|
// Append the QR path and item ID
|
|
string QRString = $"{domain}/Inventory/ItemInformation/{id}";
|
|
return Json(QRString);
|
|
}
|
|
|
|
[HttpPost("AddItem")]
|
|
public async Task<IActionResult> AddItem([FromBody] ItemModel item)
|
|
{
|
|
if (!ModelState.IsValid)
|
|
{
|
|
return BadRequest(ModelState);
|
|
}
|
|
|
|
try
|
|
{
|
|
var product = await _centralDbContext.Products.FirstOrDefaultAsync(p => p.ProductId == item.ProductId) ?? throw new Exception("Product not found");
|
|
|
|
var addToProduct = item.Quantity;
|
|
product.QuantityProduct += addToProduct;
|
|
|
|
if (product.Category == "Disposable")
|
|
{
|
|
item.SerialNumber = null;
|
|
}
|
|
|
|
_centralDbContext.Items.Add(item);
|
|
_centralDbContext.Products.Update(product);
|
|
|
|
await _centralDbContext.SaveChangesAsync(); // This generates the auto-incremented ItemID
|
|
|
|
// Fetch the generated ItemID
|
|
var savedItem = await _centralDbContext.Items.FirstOrDefaultAsync(i => i.ItemID == item.ItemID);
|
|
|
|
if (savedItem != null)
|
|
{
|
|
var companyDepartment = await GetDepartmentWithCompany(item.CompanyId, item.DepartmentId);
|
|
var itemProduct = _centralDbContext.Products.Where(p => p.ProductId == item.ProductId).FirstOrDefault();
|
|
|
|
string? companyInitial = companyDepartment!.CompanyName?.ToString().Substring(0, 1).ToUpper();
|
|
string? departmentInitial = companyDepartment!.DepartmentName?.ToString().Substring(0, 1).ToUpper();
|
|
string? deptCode = companyDepartment!.DepartmentCode?.ToString();
|
|
char? initialCategory = itemProduct!.Category.ToString().Substring(0, 1).ToUpper().FirstOrDefault();
|
|
string? productId = itemProduct!.ProductId.ToString("D3");
|
|
string? itemId = item.ItemID.ToString("D5");
|
|
var uniqueId = $"{deptCode}{initialCategory}{productId}{itemId}".ToUpper();
|
|
savedItem.UniqueID = uniqueId;
|
|
|
|
_centralDbContext.Items.Update(savedItem);
|
|
await _centralDbContext.SaveChangesAsync();
|
|
}
|
|
var updatedItem = new
|
|
{
|
|
savedItem!.ItemID,
|
|
savedItem.UniqueID,
|
|
savedItem.CompanyId,
|
|
savedItem.DepartmentId,
|
|
savedItem.ProductId,
|
|
savedItem.SerialNumber,
|
|
savedItem.Quantity,
|
|
savedItem.Supplier,
|
|
savedItem.PurchaseDate,
|
|
savedItem.PONo,
|
|
savedItem.Currency,
|
|
savedItem.DefaultPrice,
|
|
savedItem.CurrencyRate,
|
|
savedItem.ConvertPrice,
|
|
savedItem.DODate,
|
|
savedItem.Warranty,
|
|
savedItem.EndWDate,
|
|
savedItem.InvoiceDate,
|
|
};
|
|
return Json(updatedItem);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
return BadRequest(ex.Message);
|
|
}
|
|
}
|
|
|
|
[HttpDelete("DeleteItem/{id}")]
|
|
public async Task<IActionResult> DeleteItem(int id)
|
|
{
|
|
var item = await _centralDbContext.Items.FindAsync(id);
|
|
if (item == null)
|
|
{
|
|
return NotFound(new { success = false, message = "Item not found" });
|
|
}
|
|
|
|
_centralDbContext.Items.Remove(item);
|
|
await _centralDbContext.SaveChangesAsync();
|
|
|
|
return Ok(new { success = true, message = "Item deleted successfully" });
|
|
}
|
|
|
|
#endregion Item
|
|
}
|
|
}
|