d5ad9fa073
- New CompanyPreferences.KioskIntakeOutput setting ("Quote" default / "Job"): controls
what the kiosk creates on submission; shown as a card-style radio toggle in
Company Settings → Kiosk tab
- KioskSession.LinkedQuoteId added so quote-first sessions link back to the draft quote
- Migration AddKioskIntakeOutputSetting applies both schema changes
- ProcessSubmissionAsync branches on setting: creates Draft quote (quote-first) or
Pending job (job-first); save order fixed (CompleteAsync before using DB-assigned Id as FK)
- Terms.cshtml pricing paragraph is now dynamic: "subject to formal quote" for Quote mode,
"team member will reach out about pricing" for Job mode
- Customer Intakes list: "View Quote" button appears when LinkedQuoteId is set
- Notification label fixed: Remote sessions now say "Remote Intake", not "Walk-in Intake"
- Inactivity reset shortened to 45 s on intake steps
- Signature pad: hosted locally (no CDN), canvas resize deferred via requestAnimationFrame
- AI photo upload: client-side compression to ≤1200px + AbortController 120 s timeout
- Help article and AI knowledge base updated with kiosk feature
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
60 lines
2.8 KiB
C#
60 lines
2.8 KiB
C#
using AutoMapper;
|
|
using PowderCoating.Application.DTOs.Company;
|
|
using PowderCoating.Application.DTOs.User;
|
|
using PowderCoating.Application.Services;
|
|
using PowderCoating.Core.Entities;
|
|
|
|
namespace PowderCoating.Application.Mappings;
|
|
|
|
public class CompanyProfile : Profile
|
|
{
|
|
public CompanyProfile()
|
|
{
|
|
CreateMap<Company, CompanyDto>()
|
|
.ForMember(dest => dest.UserCount, opt => opt.MapFrom(src => src.Users.Count))
|
|
.ForMember(dest => dest.CustomerCount, opt => opt.MapFrom(src => src.Customers.Count))
|
|
.ForMember(dest => dest.JobCount, opt => opt.MapFrom(src => src.Jobs.Count))
|
|
.ForMember(dest => dest.Users, opt => opt.MapFrom(src => src.Users));
|
|
|
|
CreateMap<ApplicationUser, CompanyUserDto>();
|
|
|
|
CreateMap<Company, CompanyListDto>()
|
|
.ForMember(dest => dest.UserCount, opt => opt.MapFrom(src => src.Users.Count));
|
|
|
|
CreateMap<CreateCompanyDto, Company>();
|
|
|
|
CreateMap<UpdateCompanyDto, Company>();
|
|
CreateMap<Company, UpdateCompanyDto>();
|
|
|
|
// Company Settings mappings
|
|
CreateMap<Company, CompanySettingsDto>()
|
|
.ForMember(dest => dest.HasLogo, opt => opt.MapFrom(src =>
|
|
!string.IsNullOrEmpty(src.LogoFilePath) || (src.LogoData != null && src.LogoData.Length > 0)));
|
|
CreateMap<UpdateCompanySettingsDto, Company>();
|
|
|
|
// Company Operating Costs mappings
|
|
CreateMap<CompanyOperatingCosts, CompanyOperatingCostsDto>()
|
|
.ForMember(dest => dest.DerivedBlastRateSqFtPerHour,
|
|
opt => opt.MapFrom(src => ShopCapabilityCalculator.GetBlastRateSqFtPerHour(src)))
|
|
.ForMember(dest => dest.DerivedCoatingRateSqFtPerHour,
|
|
opt => opt.MapFrom(src => ShopCapabilityCalculator.GetCoatingRateSqFtPerHour(src)))
|
|
.ForMember(dest => dest.FacilityOverheadRatePerHour,
|
|
opt => opt.MapFrom(src => src.MonthlyBillableHours > 0
|
|
? (src.MonthlyRent + src.MonthlyUtilities) / src.MonthlyBillableHours
|
|
: 0m));
|
|
CreateMap<UpdateOperatingCostsDto, CompanyOperatingCosts>();
|
|
CreateMap<UpdateBlastProfileDto, CompanyOperatingCosts>();
|
|
|
|
// Company Preferences mappings
|
|
CreateMap<CompanyPreferences, CompanyPreferencesDto>().ReverseMap();
|
|
CreateMap<UpdateAppDefaultsDto, CompanyPreferences>();
|
|
CreateMap<UpdateJobDefaultsDto, CompanyPreferences>();
|
|
CreateMap<UpdateNotificationsDto, CompanyPreferences>();
|
|
CreateMap<UpdateDataRetentionDto, CompanyPreferences>();
|
|
CreateMap<UpdateQuoteTemplateDto, CompanyPreferences>();
|
|
CreateMap<UpdateInvoiceTemplateDto, CompanyPreferences>();
|
|
CreateMap<UpdateWorkOrderTemplateDto, CompanyPreferences>();
|
|
CreateMap<UpdateKioskSettingsDto, CompanyPreferences>();
|
|
}
|
|
}
|