ed35362c7a
- Formula Library ratings: thumbs up/down per company per formula; toggle on/off; sorts by net score; own formulas not rateable; FormulaLibraryRating entity + migration AddFormulaLibraryRatings - Job Profitability report: actual labor cost (logged hours x StandardLaborRate) vs powder cost vs billed price per job; gross margin % color-coded; time-tracked-only filter; totals footer - Quote Revision History: track Total price changes on every save; log Sent/Resent events with recipient email; replace flat table with grouped timeline UI (icons per event type, total-change badge on header) - Setup Wizard: cap CompletedCount at TotalSteps so old 10-step data no longer shows 10/5 - Formula Library card: fix badge overflow on long titles; add Rate: label to make voting buttons discoverable - Help docs and AI knowledge base updated for all three features Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
79 lines
3.5 KiB
C#
79 lines
3.5 KiB
C#
namespace PowderCoating.Application.DTOs.Company;
|
|
|
|
// ── Browse / card display ──────────────────────────────────────────────────
|
|
|
|
/// <summary>Lean DTO for the community library browse grid card.</summary>
|
|
public class FormulaLibraryCardDto
|
|
{
|
|
public int Id { get; set; }
|
|
public string Name { get; set; } = string.Empty;
|
|
public string? Description { get; set; }
|
|
public string OutputMode { get; set; } = "FixedRate";
|
|
public string? Tags { get; set; }
|
|
public string? IndustryHint { get; set; }
|
|
public string SourceCompanyName { get; set; } = string.Empty;
|
|
public int ImportCount { get; set; }
|
|
public DateTime SharedAt { get; set; }
|
|
public string? DiagramImagePath { get; set; }
|
|
|
|
/// <summary>Non-null when this formula was derived from another library entry.</summary>
|
|
public int? InspiredByFormulaLibraryItemId { get; set; }
|
|
public string? InspiredByName { get; set; }
|
|
public string? InspiredByCompanyName { get; set; }
|
|
|
|
/// <summary>True when the current company has already imported this entry.</summary>
|
|
public bool AlreadyImported { get; set; }
|
|
|
|
/// <summary>True when this formula was shared by the current browsing company.</summary>
|
|
public bool IsOwnFormula { get; set; }
|
|
|
|
/// <summary>Total thumbs-up votes across all companies.</summary>
|
|
public int ThumbsUp { get; set; }
|
|
|
|
/// <summary>Total thumbs-down votes across all companies.</summary>
|
|
public int ThumbsDown { get; set; }
|
|
|
|
/// <summary>The current browsing company's vote: true = up, false = down, null = no vote.</summary>
|
|
public bool? MyVote { get; set; }
|
|
}
|
|
|
|
// ── Full detail (import preview modal) ────────────────────────────────────
|
|
|
|
/// <summary>Full DTO used in the import preview modal — shows fields and formula.</summary>
|
|
public class FormulaLibraryDetailDto : FormulaLibraryCardDto
|
|
{
|
|
public string FieldsJson { get; set; } = "[]";
|
|
public string Formula { get; set; } = string.Empty;
|
|
public decimal? DefaultRate { get; set; }
|
|
public string? RateLabel { get; set; }
|
|
public string? Notes { get; set; }
|
|
public int FieldCount { get; set; }
|
|
}
|
|
|
|
// ── Share from Company Settings ───────────────────────────────────────────
|
|
|
|
/// <summary>Submitted when a company admin shares one of their templates to the community library.</summary>
|
|
public class ShareFormulaRequest
|
|
{
|
|
public int CustomItemTemplateId { get; set; }
|
|
public string? Tags { get; set; }
|
|
public string? IndustryHint { get; set; }
|
|
}
|
|
|
|
// ── Company Settings list view ─────────────────────────────────────────────
|
|
|
|
/// <summary>Status of a template relative to the community library, shown in Company Settings.</summary>
|
|
public class FormulaLibraryStatusDto
|
|
{
|
|
/// <summary>The FormulaLibraryItem Id, if this template has ever been shared.</summary>
|
|
public int? LibraryItemId { get; set; }
|
|
public bool IsPublished { get; set; }
|
|
|
|
/// <summary>Whether this template is eligible to be shared (original or modified import).</summary>
|
|
public bool CanShare { get; set; }
|
|
|
|
/// <summary>Set when this template was imported; the name of the original library entry.</summary>
|
|
public string? ImportedFromName { get; set; }
|
|
public string? ImportedFromCompany { get; set; }
|
|
}
|