Initial commit

This commit is contained in:
2026-04-23 21:38:24 -04:00
commit 63e12a9636
1762 changed files with 1672620 additions and 0 deletions
@@ -0,0 +1,131 @@
using System.ComponentModel.DataAnnotations;
using PowderCoating.Core.Enums;
namespace PowderCoating.Core.Entities
{
public class CompanyOperatingCosts : BaseEntity
{
// Navigation
public new int CompanyId { get; set; }
public virtual Company Company { get; set; } = null!;
// Labor Rates (per hour, in currency)
[Range(0, 10000)]
public decimal StandardLaborRate { get; set; }
// Additional Coat Labor Percentage (percentage of base labor for each additional coat beyond the first)
[Range(0, 100)]
public decimal AdditionalCoatLaborPercent { get; set; } = 30m;
// Equipment Operating Costs (per hour)
[Range(0, 10000)]
public decimal OvenOperatingCostPerHour { get; set; }
[Range(0, 10000)]
public decimal SandblasterCostPerHour { get; set; }
[Range(0, 10000)]
public decimal CoatingBoothCostPerHour { get; set; }
// Material Costs
[Range(0, 1000)]
public decimal PowderCoatingCostPerSqFt { get; set; } // per square foot
// Markup / Margin
/// <summary>Whether markup is applied to material only, or margin is applied to total item cost.</summary>
public PricingMode PricingMode { get; set; } = PricingMode.MarkupOnMaterial;
/// <summary>Markup % added on top of material costs (used when PricingMode = MarkupOnMaterial).</summary>
[Range(0, 100)]
public decimal GeneralMarkupPercentage { get; set; }
/// <summary>Target gross margin % applied to total item cost (used when PricingMode = MarginOnTotalCost).</summary>
[Range(0, 99)]
public decimal TargetMarginPercent { get; set; }
// Tax Percentage
[Range(0, 100)]
public decimal TaxPercent { get; set; }
// Shop Supplies Rate (percentage applied to materials/labor)
[Range(0, 100)]
public decimal ShopSuppliesRate { get; set; }
// Oven batch defaults
[Range(1, 1440)]
public int DefaultOvenCycleMinutes { get; set; } = 45;
// Rush Charge
public string RushChargeType { get; set; } = "Percentage"; // "Percentage" or "FixedAmount"
[Range(0, 100)]
public decimal RushChargePercentage { get; set; }
[Range(0, 100000)]
public decimal RushChargeFixedAmount { get; set; }
// Shop Minimum
[Range(0, 100000)]
public decimal ShopMinimumCharge { get; set; }
// Part Complexity Multipliers (% added to calculated item price)
[Range(0, 500)]
public decimal ComplexitySimplePercent { get; set; } = 0m;
[Range(0, 500)]
public decimal ComplexityModeratePercent { get; set; } = 5m;
[Range(0, 500)]
public decimal ComplexityComplexPercent { get; set; } = 15m;
[Range(0, 500)]
public decimal ComplexityExtremePercent { get; set; } = 25m;
/// <summary>
/// Free-text description of this shop's specialties, typical item types, and pricing style.
/// Injected into the AI system prompt so the model can calibrate estimates for this company.
/// Example: "We specialize in automotive restoration parts — wheels, frames, brackets.
/// We charge premium rates and rarely work on items over 20 sqft."
/// </summary>
[StringLength(2000)]
public string? AiContextProfile { get; set; }
// ── Shop Capability / Quoting Calibration ─────────────────────────────────────
// These fields drive the derived BlastRateSqFtPerHour used in AI photo quoting
// and calculated item time suggestions. The Override field lets a shop bypass the
// formula and enter their real-world number directly.
/// <summary>Broad capability tier chosen in Setup Wizard; sets sensible defaults for all fields below.</summary>
public ShopCapabilityTier ShopCapabilityTier { get; set; } = ShopCapabilityTier.Small;
/// <summary>Type of blasting setup — biggest single factor in blast throughput.</summary>
public BlastSetupType BlastSetupType { get; set; } = BlastSetupType.SiphonCabinet;
/// <summary>Compressor CFM available for the blast setup.</summary>
[Range(0, 2000)]
public decimal CompressorCfm { get; set; } = 0m;
/// <summary>Blast nozzle size (#3 #8). Larger nozzle = more media flow.</summary>
[Range(3, 8)]
public int BlastNozzleSize { get; set; } = 4;
/// <summary>Primary substrate being removed; affects passes required per sqft.</summary>
public BlastSubstrateType PrimaryBlastSubstrate { get; set; } = BlastSubstrateType.Mixed;
/// <summary>
/// Manual blast rate override (sqft/hr). When set, the formula is bypassed entirely.
/// Useful for dialed-in shops who know their exact throughput.
/// </summary>
[Range(0, 5000)]
public decimal? BlastRateSqFtPerHourOverride { get; set; }
/// <summary>Coating gun technology — affects application speed on complex parts.</summary>
public CoatingGunType CoatingGunType { get; set; } = CoatingGunType.Corona;
/// <summary>
/// Manual coating application rate override (sqft/hr). When set, bypasses the formula.
/// </summary>
[Range(0, 5000)]
public decimal? CoatingRateSqFtPerHourOverride { get; set; }
}
}