Fix Company Settings save, invoice PAID stamp, and purge script
- Company Settings: switch save button from type=submit to type=button to bypass HTML5 form validation blocking the submit event; replace AutoMapper Map() with explicit property assignment so EF change tracking reliably detects mutations; fix showButtonSuccess() never re-enabling the button after a successful save - Invoice PDF: move PAID stamp into the header row as a centered middle column so it sits between the company and invoice blocks without adding height to the document - Purge script: use business-date fields instead of CreatedAt so imported records (which all share today's CreatedAt) are correctly filtered by actual transaction dates Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -147,6 +147,14 @@ public class PdfService : IPdfService
|
||||
column.Item().Text(companyInfo.PrimaryContactEmail).FontSize(9).FontColor(Colors.Grey.Darken1);
|
||||
});
|
||||
|
||||
if (invoice.Status == InvoiceStatus.Paid)
|
||||
{
|
||||
row.RelativeItem().AlignCenter().AlignMiddle()
|
||||
.Border(2).BorderColor(Colors.Green.Darken1)
|
||||
.PaddingVertical(6).PaddingHorizontal(16)
|
||||
.Text("PAID").FontSize(20).Bold().FontColor(Colors.Green.Darken1).LetterSpacing(0.15f);
|
||||
}
|
||||
|
||||
row.RelativeItem().AlignRight().Column(column =>
|
||||
{
|
||||
column.Item().Text("INVOICE").FontSize(28).Bold().FontColor(accentColor);
|
||||
@@ -158,16 +166,6 @@ public class PdfService : IPdfService
|
||||
});
|
||||
});
|
||||
|
||||
if (invoice.Status == InvoiceStatus.Paid)
|
||||
{
|
||||
col.Item().PaddingVertical(6).AlignCenter().Column(badge =>
|
||||
{
|
||||
badge.Item().AlignCenter().Border(2).BorderColor(Colors.Green.Darken1)
|
||||
.PaddingVertical(4).PaddingHorizontal(24)
|
||||
.Text("PAID").FontSize(18).Bold().FontColor(Colors.Green.Darken1).LetterSpacing(0.15f);
|
||||
});
|
||||
}
|
||||
|
||||
col.Item().PaddingVertical(4).LineHorizontal(1).LineColor(accentColor);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -230,11 +230,19 @@ public class CompanySettingsController : Controller
|
||||
return Json(new { success = false, message = "Company not found." });
|
||||
}
|
||||
|
||||
// Update company properties
|
||||
_mapper.Map(dto, company);
|
||||
company.UpdatedAt = DateTime.UtcNow;
|
||||
// Explicit assignment avoids AutoMapper quirks with tracked EF entities
|
||||
company.CompanyName = dto.CompanyName.Trim();
|
||||
company.CompanyCode = string.IsNullOrWhiteSpace(dto.CompanyCode) ? null : dto.CompanyCode.Trim();
|
||||
company.PrimaryContactName = dto.PrimaryContactName.Trim();
|
||||
company.PrimaryContactEmail = dto.PrimaryContactEmail.Trim();
|
||||
company.Phone = string.IsNullOrWhiteSpace(dto.Phone) ? null : dto.Phone.Trim();
|
||||
company.Address = string.IsNullOrWhiteSpace(dto.Address) ? null : dto.Address.Trim();
|
||||
company.City = string.IsNullOrWhiteSpace(dto.City) ? null : dto.City.Trim();
|
||||
company.State = string.IsNullOrWhiteSpace(dto.State) ? null : dto.State.Trim();
|
||||
company.ZipCode = string.IsNullOrWhiteSpace(dto.ZipCode) ? null : dto.ZipCode.Trim();
|
||||
company.TimeZone = string.IsNullOrWhiteSpace(dto.TimeZone) ? null : dto.TimeZone.Trim();
|
||||
company.AccountingMethod = dto.AccountingMethod;
|
||||
|
||||
await _unitOfWork.Companies.UpdateAsync(company);
|
||||
await _unitOfWork.CompleteAsync();
|
||||
|
||||
_logger.LogInformation("Company {CompanyId} settings updated by user", companyId);
|
||||
|
||||
@@ -312,7 +312,7 @@
|
||||
</div>
|
||||
|
||||
<div class="d-flex justify-content-end">
|
||||
<button type="submit" class="btn btn-primary" id="btnSaveCompanyInfo">
|
||||
<button type="button" class="btn btn-primary" id="btnSaveCompanyInfo">
|
||||
<i class="bi bi-save"></i> Save Changes
|
||||
</button>
|
||||
</div>
|
||||
@@ -2749,10 +2749,8 @@
|
||||
}
|
||||
});
|
||||
|
||||
// Company Info Form Submit
|
||||
$('#companyInfoForm').on('submit', function (e) {
|
||||
e.preventDefault();
|
||||
|
||||
// Company Info Save
|
||||
$('#btnSaveCompanyInfo').on('click', function () {
|
||||
const formData = {
|
||||
CompanyName: $('#companyName').val(),
|
||||
CompanyCode: $('#companyCode').val(),
|
||||
@@ -3192,7 +3190,7 @@
|
||||
|
||||
// Button success animation helper
|
||||
function showButtonSuccess(btn, originalHtml, duration = 2000) {
|
||||
btn.removeClass('btn-primary').addClass('btn-success');
|
||||
btn.prop('disabled', false).removeClass('btn-primary').addClass('btn-success');
|
||||
btn.html('<i class="bi bi-check-circle-fill"></i> Saved!');
|
||||
setTimeout(function() {
|
||||
btn.removeClass('btn-success').addClass('btn-primary');
|
||||
|
||||
Reference in New Issue
Block a user