commit
This commit is contained in:
parent
19868f4954
commit
85bcc58499
BIN
.vs/OSS/v16/.suo
BIN
.vs/OSS/v16/.suo
Binary file not shown.
|
|
@ -1900,6 +1900,41 @@ namespace OSS.Controllers
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void EnsurePaymentSessionDefaults(string currencyIfUnset = "")
|
||||||
|
{
|
||||||
|
if (Session["Currency"] == null) Session["Currency"] = currencyIfUnset;
|
||||||
|
if (Session["Amount"] == null) Session["Amount"] = "";
|
||||||
|
if (Session["AmountinWords"] == null) Session["AmountinWords"] = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool TrySaveInvoice(OSSDBContext ctx, ApplicationManager inv, CompanyProfileExternal company, out string error)
|
||||||
|
{
|
||||||
|
error = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ctx.ApplicationManagers.Add(inv);
|
||||||
|
if (company != null)
|
||||||
|
{
|
||||||
|
company.CleaningStatus = "Submitted";
|
||||||
|
}
|
||||||
|
ctx.SaveChanges();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (System.Data.Entity.Validation.DbEntityValidationException ex)
|
||||||
|
{
|
||||||
|
var msgs = ex.EntityValidationErrors
|
||||||
|
.SelectMany(e => e.ValidationErrors)
|
||||||
|
.Select(e => e.PropertyName + ": " + e.ErrorMessage);
|
||||||
|
error = "Validation failed: " + string.Join("; ", msgs);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
error = ex.Message;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public ActionResult Payment(ApplicationManager model)
|
public ActionResult Payment(ApplicationManager model)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
|
@ -1912,12 +1947,56 @@ namespace OSS.Controllers
|
||||||
if (string.IsNullOrWhiteSpace(model?.Currency))
|
if (string.IsNullOrWhiteSpace(model?.Currency))
|
||||||
{
|
{
|
||||||
ViewBag.Error = "Currency is required.";
|
ViewBag.Error = "Currency is required.";
|
||||||
|
EnsurePaymentSessionDefaults();
|
||||||
return View("Payment");
|
return View("Payment");
|
||||||
}
|
}
|
||||||
|
|
||||||
var Username = Session["CompanyEmail"].ToString();
|
var Username = Session["CompanyEmail"].ToString();
|
||||||
var ProjectCode = Session["ProjectCode"].ToString();
|
var ProjectCode = Session["ProjectCode"].ToString();
|
||||||
var serviceName = (Session["ServiceName"] as string) ?? string.Empty;
|
var serviceName = ((Session["ServiceName"] as string) ?? string.Empty).Trim();
|
||||||
|
|
||||||
|
// Normalize service name to match tblService keys (e.g., "Application for New Certificate" -> "New")
|
||||||
|
var rawService = serviceName;
|
||||||
|
if (rawService.IndexOf("new", StringComparison.OrdinalIgnoreCase) >= 0)
|
||||||
|
{
|
||||||
|
serviceName = "New";
|
||||||
|
}
|
||||||
|
else if (rawService.IndexOf("expansion", StringComparison.OrdinalIgnoreCase) >= 0)
|
||||||
|
{
|
||||||
|
serviceName = "Expansion";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enforce TZS only as requested
|
||||||
|
model.Currency = "TZS";
|
||||||
|
|
||||||
|
// Pre-compute amount from tblService (before early returns), single-row fetch (no iteration)
|
||||||
|
var getPDetailsEarly = myContext.ProjectProfilesExternal.SingleOrDefault(t => t.ProjectCode == ProjectCode);
|
||||||
|
if (getPDetailsEarly != null)
|
||||||
|
{
|
||||||
|
var ownershipRawEarly = (getPDetailsEarly.TypeofOwnership ?? "").Trim();
|
||||||
|
var isLocalEarly = ownershipRawEarly.Equals("Local", StringComparison.OrdinalIgnoreCase);
|
||||||
|
var isForeignOrMixedEarly =
|
||||||
|
ownershipRawEarly.Equals("Foreign", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
ownershipRawEarly.Equals("JV", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
ownershipRawEarly.Equals("Mixed", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
ownershipRawEarly.Equals("Mixed (Foreigners & Tanzanians)", StringComparison.OrdinalIgnoreCase);
|
||||||
|
|
||||||
|
var serviceKeyEarly = serviceName;
|
||||||
|
if (!isLocalEarly && isForeignOrMixedEarly) serviceKeyEarly = serviceName + "_Foreign";
|
||||||
|
|
||||||
|
var feeRow = myContext.ServiceFees.FirstOrDefault(s =>
|
||||||
|
|
||||||
|
s.ServiceName == serviceKeyEarly);
|
||||||
|
|
||||||
|
if (feeRow != null && feeRow.Fee.HasValue && feeRow.Fee.Value > 0)
|
||||||
|
{
|
||||||
|
TempData["PreAmountTZS"] = feeRow.Fee.Value.ToString("0");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TempData["PreAmountTZS"] = null; // force UI error downstream if not configured
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var checkIfExist = myContext.ApplicationManagers.SingleOrDefault(t => t.ProjectCode == ProjectCode);
|
var checkIfExist = myContext.ApplicationManagers.SingleOrDefault(t => t.ProjectCode == ProjectCode);
|
||||||
var checkIfCompany = myContext.CompanyProfileExternal.SingleOrDefault(t => t.AddedBy == Username);
|
var checkIfCompany = myContext.CompanyProfileExternal.SingleOrDefault(t => t.AddedBy == Username);
|
||||||
|
|
@ -1928,6 +2007,16 @@ namespace OSS.Controllers
|
||||||
if (getPDetails == null)
|
if (getPDetails == null)
|
||||||
{
|
{
|
||||||
ViewBag.Error = "Project details not found.";
|
ViewBag.Error = "Project details not found.";
|
||||||
|
EnsurePaymentSessionDefaults();
|
||||||
|
return View("Payment");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only New/Expansion supported in this TZS ownership block
|
||||||
|
if (!(serviceName.Equals("New", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
serviceName.Equals("Expansion", StringComparison.OrdinalIgnoreCase)))
|
||||||
|
{
|
||||||
|
ViewBag.Error = $"Unsupported ServiceName '{serviceName}'. Expected New/Expansion.";
|
||||||
|
EnsurePaymentSessionDefaults();
|
||||||
return View("Payment");
|
return View("Payment");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1951,116 +2040,46 @@ namespace OSS.Controllers
|
||||||
inv.Station = model.Station;
|
inv.Station = model.Station;
|
||||||
inv.CompanyTIN = Session["CompanyTIN"] != null ? Session["CompanyTIN"].ToString() : null;
|
inv.CompanyTIN = Session["CompanyTIN"] != null ? Session["CompanyTIN"].ToString() : null;
|
||||||
|
|
||||||
// Determine service name and try dynamic fee from tblService (case-insensitive)
|
// Use precomputed amount from tblService or fallback (saved in TempData earlier)
|
||||||
var svcFee = myContext.ServiceFees
|
decimal amountToUse;
|
||||||
.AsEnumerable()
|
if (TempData["PreAmountTZS"] != null && decimal.TryParse(TempData["PreAmountTZS"].ToString(), out amountToUse))
|
||||||
.FirstOrDefault(s =>
|
|
||||||
s.Status == 1 &&
|
|
||||||
string.Equals(s.ServiceName, serviceName, StringComparison.OrdinalIgnoreCase) &&
|
|
||||||
string.Equals(s.Currency, model.Currency, StringComparison.OrdinalIgnoreCase));
|
|
||||||
|
|
||||||
// Ownership-based TZS pricing for New and Expansion only (drive from tblService)
|
|
||||||
if (string.Equals(model.Currency, "TZS", StringComparison.OrdinalIgnoreCase)
|
|
||||||
&& (serviceName.Equals("New", StringComparison.OrdinalIgnoreCase) || serviceName.Equals("Expansion", StringComparison.OrdinalIgnoreCase)))
|
|
||||||
{
|
{
|
||||||
var ownership = (getPDetails.TypeofOwnership ?? "").Trim();
|
inv.Amount = amountToUse;
|
||||||
|
Session["Amount"] = amountToUse.ToString("0");
|
||||||
// Pick service key based on ownership
|
Session["AmountinWords"] = CurrencyUtils.ToWords(amountToUse) + " Tanzanian Shillings";
|
||||||
var serviceKey = serviceName;
|
|
||||||
if (!ownership.Equals("Local", StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
serviceKey = serviceName + "_Foreign";
|
|
||||||
}
|
|
||||||
|
|
||||||
// Try to fetch fee from tblService, case-insensitive
|
|
||||||
var ownershipFee = myContext.ServiceFees
|
|
||||||
.AsEnumerable()
|
|
||||||
.FirstOrDefault(s =>
|
|
||||||
s.Status == 1 &&
|
|
||||||
string.Equals(s.ServiceName, serviceKey, StringComparison.OrdinalIgnoreCase) &&
|
|
||||||
s.Currency.Equals("TZS", StringComparison.OrdinalIgnoreCase));
|
|
||||||
|
|
||||||
if (ownershipFee?.Fee == null)
|
|
||||||
{
|
|
||||||
ViewBag.Error = $"Configured fee not found for '{serviceKey}' in TZS.";
|
|
||||||
return View("Payment");
|
|
||||||
}
|
|
||||||
|
|
||||||
var amountTzs = ownershipFee.Fee.Value;
|
|
||||||
inv.Amount = amountTzs;
|
|
||||||
Session["Amount"] = amountTzs.ToString("0");
|
|
||||||
Session["AmountinWords"] = CurrencyUtils.ToWords(amountTzs) + " Tanzanian Shillings";
|
|
||||||
Session["Currency"] = model.Currency;
|
Session["Currency"] = model.Currency;
|
||||||
|
|
||||||
myContext.ApplicationManagers.Add(inv);
|
|
||||||
if (checkIfCompany != null)
|
|
||||||
{
|
|
||||||
checkIfCompany.CleaningStatus = "Submitted";
|
|
||||||
}
|
|
||||||
myContext.SaveChanges();
|
|
||||||
|
|
||||||
if (serviceName.Equals("Expansion", StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
return View("PaymentExpansion");
|
|
||||||
}
|
|
||||||
return View("Payment");
|
|
||||||
}
|
|
||||||
|
|
||||||
// If not TZS New/Expansion, use tblService if available
|
|
||||||
if (svcFee?.Fee != null)
|
|
||||||
{
|
|
||||||
var fee = svcFee.Fee.Value;
|
|
||||||
inv.Amount = fee;
|
|
||||||
Session["Amount"] = fee.ToString("0.##");
|
|
||||||
Session["AmountinWords"] = CurrencyUtils.ToWords(fee) + " " + model.Currency;
|
|
||||||
Session["Currency"] = model.Currency;
|
|
||||||
|
|
||||||
myContext.ApplicationManagers.Add(inv);
|
|
||||||
if (checkIfCompany != null)
|
|
||||||
{
|
|
||||||
checkIfCompany.CleaningStatus = "Submitted";
|
|
||||||
}
|
|
||||||
myContext.SaveChanges();
|
|
||||||
|
|
||||||
if (serviceName.Equals("Expansion", StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
return View("PaymentExpansion");
|
|
||||||
}
|
|
||||||
return View("Payment");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fallback: existing COIPrice + ExchangeRate for New
|
|
||||||
ExchangeRate exchangeRate = myContext.ExchangeRates.SingleOrDefault(t => t.Currency == model.Currency);
|
|
||||||
COIPrice coiPrice = myContext.COIPrices.SingleOrDefault(t => t.ApplicationType == "New");
|
|
||||||
if (exchangeRate != null && coiPrice != null)
|
|
||||||
{
|
|
||||||
decimal Price = coiPrice.Price * exchangeRate.Rate;
|
|
||||||
string priceStr = Price.ToString();
|
|
||||||
priceStr = priceStr.Contains(".") ? priceStr.TrimEnd('0').TrimEnd('.') : priceStr;
|
|
||||||
|
|
||||||
inv.Amount = Price;
|
|
||||||
Session["Amount"] = priceStr;
|
|
||||||
Session["AmountinWords"] = CurrencyUtils.ToWords(Price) + " " + exchangeRate.CurrencyDesc;
|
|
||||||
Session["Currency"] = model.Currency;
|
|
||||||
|
|
||||||
myContext.ApplicationManagers.Add(inv);
|
|
||||||
if (checkIfCompany != null)
|
|
||||||
{
|
|
||||||
checkIfCompany.CleaningStatus = "Submitted";
|
|
||||||
}
|
|
||||||
myContext.SaveChanges();
|
|
||||||
|
|
||||||
if (serviceName.Equals("Expansion", StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
return View("PaymentExpansion");
|
|
||||||
}
|
|
||||||
return View("Payment");
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ViewBag.Error = "Unable to determine fee for the selected currency.";
|
var ownershipForKey = getPDetails.TypeofOwnership != null && getPDetails.TypeofOwnership.Equals("Local", StringComparison.OrdinalIgnoreCase)
|
||||||
|
? serviceName
|
||||||
|
: serviceName + "_Foreign";
|
||||||
|
|
||||||
|
var errMsg = $"Fee not configured in tblService for ServiceName='{ownershipForKey}', Currency='TZS'.";
|
||||||
|
TempData["PaymentError"] = errMsg;
|
||||||
|
ViewBag.Error = errMsg;
|
||||||
|
EnsurePaymentSessionDefaults("TZS");
|
||||||
|
// Show the appropriate payment page based on service
|
||||||
|
if (serviceName.Equals("Expansion", StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
return View("PaymentExpansion");
|
||||||
|
}
|
||||||
return View("Payment");
|
return View("Payment");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string saveErrX;
|
||||||
|
if (!TrySaveInvoice(myContext, inv, checkIfCompany, out saveErrX))
|
||||||
|
{
|
||||||
|
ViewBag.Error = "Could not save invoice. " + saveErrX;
|
||||||
|
EnsurePaymentSessionDefaults(model.Currency);
|
||||||
|
return View("Payment");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (serviceName.Equals("Expansion", StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
return View("PaymentExpansion");
|
||||||
|
}
|
||||||
|
return View("Payment");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -2074,6 +2093,7 @@ namespace OSS.Controllers
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
ViewBag.Error = "Error processing payment. " + ex.Message;
|
ViewBag.Error = "Error processing payment. " + ex.Message;
|
||||||
|
EnsurePaymentSessionDefaults();
|
||||||
return View("Payment");
|
return View("Payment");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,9 +10,9 @@ namespace OSS.Models
|
||||||
public class ServiceFee
|
public class ServiceFee
|
||||||
{
|
{
|
||||||
[Key]
|
[Key]
|
||||||
public int ServiID { get; set; }
|
public long ServiID { get; set; }
|
||||||
public string ServiceName { get; set; }
|
public string ServiceName { get; set; }
|
||||||
public int Status { get; set; }
|
public string Status { get; set; }
|
||||||
public decimal? Fee { get; set; }
|
public decimal? Fee { get; set; }
|
||||||
public string GFSCode { get; set; }
|
public string GFSCode { get; set; }
|
||||||
public string Currency { get; set; }
|
public string Currency { get; set; }
|
||||||
|
|
|
||||||
BIN
bin/OSS.dll
BIN
bin/OSS.dll
Binary file not shown.
BIN
bin/OSS.pdb
BIN
bin/OSS.pdb
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue