Files
PowderCoatingLogix/src/PowderCoating.Application/Mappings/CompanyProfile.cs
T
spouliot d5ad9fa073 Add KioskIntakeOutput company setting and fix kiosk submission bugs
- 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>
2026-05-13 22:35:37 -04:00

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>();
}
}