Replaces single large card with six labeled section cards (Rates & Costs,
Facility Overhead, Equipment, Pricing & Profit, Rush Charges, Complexity)
to reduce visual density and improve scannability.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Removes the ShopWorker and ShopWorkerRoleCost entities, all related DTOs,
mappings, controllers, views, and import/export paths. Worker identity is
now handled entirely through ApplicationUser with per-user LaborCostPerHour.
ShopWorkerRoleCosts table remains in production pending manual data migration.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 21:06:04 -04:00
3 changed files with 144 additions and 118 deletions
data-bs-content="These are the rates the quoting engine uses to price every job automatically. Set them to your real shop costs and the system will produce accurate quotes without manual calculation. <strong>New quotes use the current rates</strong> — changing a rate here does not retroactively reprice existing quotes.<br><br><a href='/Help/Settings#pricing-configuration' target='_blank'>Learn more →</a>">
<i class="bi bi-question-circle"></i>
</a>
</h5>
<p class="text-muted">Configure your operating costs for accurate job quoting calculations.</p>
<form id="operatingCostsForm">
<!-- Header -->
<!-- Rates & Costs -->
<div class="card mt-3">
<h6 class="border-bottom pb-2 mb-3">Rates & Costs
data-bs-content="<strong>Standard Labor Rate</strong> is the baseline $/hr for all coating work — sandblasting and masking are multiplied from this. <strong>Powder Coating Cost/sq ft</strong> is the fallback material rate used when you don't select a specific powder inventory item on a quote item. <strong>Additional Coat Labor</strong> is the percentage of the base labor cost charged for each coat after the first (e.g. 30% means a 2nd coat adds 30% more labor).">
data-bs-content="These are the rates the quoting engine uses to price every job automatically. Set them to your real shop costs and the system will produce accurate quotes without manual calculation. <strong>New quotes use the current rates</strong> — changing a rate here does not retroactively reprice existing quotes.<br><br><a href='/Help/Settings#pricing-configuration' target='_blank'>Learn more →</a>">
<i class="bi bi-question-circle"></i>
<i class="bi bi-question-circle"></i>
</a>
</a>
</h6>
</h5>
<p class="text-muted mb-0">Configure your operating costs for accurate job quoting calculations.</p>
data-bs-content="<strong>Standard Labor Rate</strong> is the baseline $/hr for all coating work — sandblasting and masking are multiplied from this. <strong>Powder Coating Cost/sq ft</strong> is the fallback material rate used when you don't select a specific powder inventory item on a quote item. <strong>Additional Coat Labor</strong> is the percentage of the base labor cost charged for each coat after the first (e.g. 30% means a 2nd coat adds 30% more labor).">
data-bs-content="Enter your monthly shop rent and combined utility costs. The system divides these by your estimated billable hours to derive a per-hour overhead rate, which is then added to every quote proportionally to the estimated job time. This ensures fixed facility costs are recovered across all jobs rather than absorbed into your markup.">
data-bs-content="Enter your monthly shop rent and combined utility costs. The system divides these by your estimated billable hours to derive a per-hour overhead rate, which is then added to every quote proportionally to the estimated job time. This ensures fixed facility costs are recovered across all jobs rather than absorbed into your markup.">
data-bs-content="The hourly cost of running each piece of equipment, including energy and depreciation. These are added to quote items based on the prep services selected. The <strong>Default Oven Rate</strong> is used on quotes where no named oven is chosen — add individual shop ovens below if you have multiple ovens with different capacities and costs.">
data-bs-content="The hourly cost of running each piece of equipment, including energy and depreciation. These are added to quote items based on the prep services selected. The <strong>Default Oven Rate</strong> is used on quotes where no named oven is chosen — add individual shop ovens below if you have multiple ovens with different capacities and costs.">
</h6>
<i class="bi bi-question-circle"></i>
</a>
</div>
<div class="card-body">
<div class="row">
<div class="row">
<div class="col-md-4">
<div class="col-md-4">
<div class="mb-3">
<div class="mb-3">
@@ -527,16 +544,21 @@
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Pricing & Overhead -->
<!-- Pricing & Profit -->
<h6 class="border-bottom pb-2 mb-3 mt-4">Pricing & Profit
<i class="bi bi-graph-up-arrow text-primary me-1"></i> Pricing & Profit
data-bs-title="Pricing & Profit"
<a tabindex="0" class="help-icon" role="button"
data-bs-content="<strong>Markup mode</strong> adds a % on top of material costs only (labor and equipment pass through at cost). <strong>Margin mode</strong> targets a gross margin % of the total selling price — e.g. 30% margin on a $100 cost base gives a $142.86 price. Note: margin % and markup % are not the same number. <strong>Shop Minimum</strong> sets a floor price for any job.">
data-bs-content="<strong>Markup mode</strong> adds a % on top of material costs only (labor and equipment pass through at cost). <strong>Margin mode</strong> targets a gross margin % of the total selling price — e.g. 30% margin on a $100 cost base gives a $142.86 price. Note: margin % and markup % are not the same number. <strong>Shop Minimum</strong> sets a floor price for any job.">
</h6>
<i class="bi bi-question-circle"></i>
</a>
</div>
<div class="card-body">
@{
@{
var currentPricingMode = (int)(Model.OperatingCosts?.PricingMode ?? PowderCoating.Core.Enums.PricingMode.MarkupOnMaterial);
var currentPricingMode = (int)(Model.OperatingCosts?.PricingMode ?? PowderCoating.Core.Enums.PricingMode.MarkupOnMaterial);
data-bs-content="When a quote is marked as a <strong>Rush Job</strong>, this charge is automatically added to the total. Choose <strong>Percentage</strong> to add a % of the subtotal (e.g. 25% rush surcharge) or <strong>Fixed Amount</strong> to add a flat fee (e.g. $75 rush fee). The rush charge appears as its own line on the quote.">
data-bs-content="When a quote is marked as a <strong>Rush Job</strong>, this charge is automatically added to the total. Choose <strong>Percentage</strong> to add a % of the subtotal (e.g. 25% rush surcharge) or <strong>Fixed Amount</strong> to add a flat fee (e.g. $75 rush fee). The rush charge appears as its own line on the quote.">
data-bs-content="A percentage added to the price of <strong>calculated items</strong> based on how intricate the part is. When adding an item in a quote, staff select a complexity level — the system then applies this multiplier to account for the extra time and care needed. <em>Simple</em> = 0% (flat panels, basic shapes). <em>Extreme</em> = highly detailed, tight recesses, masking-intensive parts.">
<i class="bi bi-question-circle"></i>
</a>
</div>
<div class="card-body">
<p class="text-muted small mb-3">Percentage added to the calculated item price based on part intricacy. Applied to calculated items only (not catalog, generic, or labor items).</p>
data-bs-content="A percentage added to the price of <strong>calculated items</strong> based on how intricate the part is. When adding an item in a quote, staff select a complexity level — the system then applies this multiplier to account for the extra time and care needed. <em>Simple</em> = 0% (flat panels, basic shapes). <em>Extreme</em> = highly detailed, tight recesses, masking-intensive parts.">
<i class="bi bi-question-circle"></i>
</a>
</div>
<div class="card-body">
<p class="text-muted small mb-3">Percentage added to the calculated item price based on part intricacy. Applied to calculated items only (not catalog, generic, or labor items).</p>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.