Add BillingEmail field for commercial customers; support comma-separated multi-email

- Customer entity + DTO: new BillingEmail field (accounting/invoicing address)
- Email fields now accept comma-separated lists; DTO validates each address individually
- NotificationService: SendToEmailListAsync helper fans out to all addresses in a list;
  NotifyQuoteSentAsync accepts optional overrideEmail so staff can send to an ad-hoc address
- Migration: AddCustomerBillingEmail
- Customer Create/Edit/Details views updated to show Billing Email field
- customer-billing-email.js: client-side helpers for billing email input

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-08 20:46:53 -04:00
parent 12f784f34c
commit fb979bc88d
10 changed files with 9812 additions and 56 deletions
@@ -97,11 +97,37 @@
<div class="col-md-6">
<label class="text-muted small mb-1">Email</label>
<p class="mb-0">
<a href="mailto:@Model.Email" class="text-decoration-none">
<i class="bi bi-envelope me-1"></i>@Model.Email
</a>
@if (!string.IsNullOrEmpty(Model.Email))
{
<a href="mailto:@Model.Email" class="text-decoration-none">
<i class="bi bi-envelope me-1"></i>@Model.Email
</a>
}
else
{
<span class="text-muted">Not provided</span>
}
</p>
</div>
@if (Model.IsCommercial)
{
<div class="col-md-6">
<label class="text-muted small mb-1">Billing / Accounting Email</label>
<p class="mb-0">
@if (!string.IsNullOrEmpty(Model.BillingEmail))
{
<a href="mailto:@Model.BillingEmail" class="text-decoration-none">
<i class="bi bi-envelope-at me-1"></i>@Model.BillingEmail
</a>
<span class="badge bg-info bg-opacity-10 text-info ms-2 small">Invoices</span>
}
else
{
<span class="text-muted">Not set — invoices go to contact email</span>
}
</p>
</div>
}
<div class="col-md-6">
<label class="text-muted small mb-1">Phone</label>
<p class="mb-0">