Fix demo reset: wipe bills/expenses, fix apostrophe display bug
- Add Bills and Expenses flags to RemoveSeedDataOptions - RemoveSeedDataAsync: delete BillPayments + BillLineItems + Bills, then Expenses for the company when those flags are set - ResetDemoCompany action: enable Bills=true and Expenses=true so all seeded AP data is cleared before re-seeding (was skipping on second reset) - Fix apostrophe in success message (was ' in C# string, double-encoded by Razor to literal ' on screen) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -45,6 +45,8 @@ public class RemoveSeedDataOptions
|
|||||||
public bool Catalog { get; set; }
|
public bool Catalog { get; set; }
|
||||||
public bool PricingTiers { get; set; }
|
public bool PricingTiers { get; set; }
|
||||||
public bool OperatingCosts { get; set; }
|
public bool OperatingCosts { get; set; }
|
||||||
|
public bool Bills { get; set; }
|
||||||
|
public bool Expenses { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class SeedDataResult
|
public class SeedDataResult
|
||||||
|
|||||||
@@ -333,6 +333,65 @@ public partial class SeedDataService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// --- Vendor Bills (all bills for the company) ---
|
||||||
|
if (options.Bills)
|
||||||
|
{
|
||||||
|
var billIds = await _context.Set<Core.Entities.Bill>()
|
||||||
|
.IgnoreQueryFilters()
|
||||||
|
.Where(b => b.CompanyId == companyId)
|
||||||
|
.Select(b => b.Id)
|
||||||
|
.ToListAsync();
|
||||||
|
|
||||||
|
if (billIds.Any())
|
||||||
|
{
|
||||||
|
var payments = await _context.Set<Core.Entities.BillPayment>()
|
||||||
|
.IgnoreQueryFilters()
|
||||||
|
.Where(p => billIds.Contains(p.BillId))
|
||||||
|
.ToListAsync();
|
||||||
|
if (payments.Any()) _context.Set<Core.Entities.BillPayment>().RemoveRange(payments);
|
||||||
|
|
||||||
|
var lineItems = await _context.Set<Core.Entities.BillLineItem>()
|
||||||
|
.IgnoreQueryFilters()
|
||||||
|
.Where(li => billIds.Contains(li.BillId))
|
||||||
|
.ToListAsync();
|
||||||
|
if (lineItems.Any()) _context.Set<Core.Entities.BillLineItem>().RemoveRange(lineItems);
|
||||||
|
|
||||||
|
var bills = await _context.Set<Core.Entities.Bill>()
|
||||||
|
.IgnoreQueryFilters()
|
||||||
|
.Where(b => billIds.Contains(b.Id))
|
||||||
|
.ToListAsync();
|
||||||
|
_context.Set<Core.Entities.Bill>().RemoveRange(bills);
|
||||||
|
totalRemoved += bills.Count;
|
||||||
|
details.Add($"✓ Removed {bills.Count} vendor bill(s)");
|
||||||
|
await _context.SaveChangesAsync();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
details.Add("• No vendor bills found");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- Expenses ---
|
||||||
|
if (options.Expenses)
|
||||||
|
{
|
||||||
|
var expenses = await _context.Set<Core.Entities.Expense>()
|
||||||
|
.IgnoreQueryFilters()
|
||||||
|
.Where(e => e.CompanyId == companyId)
|
||||||
|
.ToListAsync();
|
||||||
|
|
||||||
|
if (expenses.Any())
|
||||||
|
{
|
||||||
|
_context.Set<Core.Entities.Expense>().RemoveRange(expenses);
|
||||||
|
totalRemoved += expenses.Count;
|
||||||
|
details.Add($"✓ Removed {expenses.Count} expense(s)");
|
||||||
|
await _context.SaveChangesAsync();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
details.Add("• No expenses found");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
result.ItemsSeeded = totalRemoved;
|
result.ItemsSeeded = totalRemoved;
|
||||||
result.Details = details;
|
result.Details = details;
|
||||||
result.Message = totalRemoved > 0
|
result.Message = totalRemoved > 0
|
||||||
|
|||||||
@@ -134,6 +134,8 @@ public class SeedDataController : Controller
|
|||||||
Catalog = true,
|
Catalog = true,
|
||||||
PricingTiers = true,
|
PricingTiers = true,
|
||||||
OperatingCosts = true,
|
OperatingCosts = true,
|
||||||
|
Bills = true,
|
||||||
|
Expenses = true,
|
||||||
};
|
};
|
||||||
|
|
||||||
var removeResult = await _seedDataService.RemoveSeedDataAsync(demo.Id, removeOptions);
|
var removeResult = await _seedDataService.RemoveSeedDataAsync(demo.Id, removeOptions);
|
||||||
@@ -148,7 +150,7 @@ public class SeedDataController : Controller
|
|||||||
|
|
||||||
if (seedResult.Success)
|
if (seedResult.Success)
|
||||||
{
|
{
|
||||||
TempData["SuccessMessage"] = $"Demo company reset complete. {seedResult.ItemsSeeded} records re-seeded with today's dates.";
|
TempData["SuccessMessage"] = $"Demo company reset complete. {seedResult.ItemsSeeded} records re-seeded with today's dates.";
|
||||||
TempData["SeedDetails"] = string.Join("|", seedResult.Details);
|
TempData["SeedDetails"] = string.Join("|", seedResult.Details);
|
||||||
TempData["ItemsSeeded"] = seedResult.ItemsSeeded;
|
TempData["ItemsSeeded"] = seedResult.ItemsSeeded;
|
||||||
|
|
||||||
@@ -157,7 +159,7 @@ public class SeedDataController : Controller
|
|||||||
TempData["WarningMessage"] = $"{seedResult.ItemsSkipped} item(s) were skipped";
|
TempData["WarningMessage"] = $"{seedResult.ItemsSkipped} item(s) were skipped";
|
||||||
var displayWarnings = seedResult.Warnings.Take(30).ToList();
|
var displayWarnings = seedResult.Warnings.Take(30).ToList();
|
||||||
if (seedResult.Warnings.Count > 30)
|
if (seedResult.Warnings.Count > 30)
|
||||||
displayWarnings.Add($"… and {seedResult.Warnings.Count - 30} more (see logs)");
|
displayWarnings.Add($"... and {seedResult.Warnings.Count - 30} more (see logs)");
|
||||||
TempData["SeedWarnings"] = string.Join("|", displayWarnings);
|
TempData["SeedWarnings"] = string.Join("|", displayWarnings);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -117,7 +117,7 @@
|
|||||||
so jobs, quotes, invoices, and AR aging always look current.
|
so jobs, quotes, invoices, and AR aging always look current.
|
||||||
</p>
|
</p>
|
||||||
<ul class="mb-3 small">
|
<ul class="mb-3 small">
|
||||||
<li>Removes: customers, jobs, quotes, invoices, inventory, equipment, catalog, pricing tiers, operating costs</li>
|
<li>Removes: customers, jobs, quotes, invoices, inventory, equipment, catalog, pricing tiers, operating costs, vendor bills, expenses</li>
|
||||||
<li>Re-seeds: 100 customers, 50 jobs across all statuses, quotes, invoices, inventory transactions, vendor bills, appointments — all dated from today</li>
|
<li>Re-seeds: 100 customers, 50 jobs across all statuses, quotes, invoices, inventory transactions, vendor bills, appointments — all dated from today</li>
|
||||||
<li>Preserves: user accounts, company settings, lookup tables (job statuses, priorities, etc.)</li>
|
<li>Preserves: user accounts, company settings, lookup tables (job statuses, priorities, etc.)</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|||||||
Reference in New Issue
Block a user