using Books.Api.Domain.Companies.Events; using EventFlow.Aggregates; namespace Books.Api.Domain.Companies; public class CompanyAggregate(CompanyId id) : AggregateRoot(id), IEmit, IEmit, IEmit { private bool _isCreated; public void Apply(CompanyCreatedEvent e) => _isCreated = true; public void Apply(CompanyUpdatedEvent e) { } public void Apply(CompanyBankDetailsUpdatedEvent e) { } public void Create( string name, string? cvr, string? address, string? postalCode, string? city, string country, int fiscalYearStartMonth, string currency, bool vatRegistered, string? vatPeriodFrequency) { if (_isCreated) throw new DomainException("Company already exists"); if (string.IsNullOrWhiteSpace(name)) throw new DomainException("Company name is required"); if (fiscalYearStartMonth < 1 || fiscalYearStartMonth > 12) throw new DomainException("Fiscal year start month must be between 1 and 12"); // Validate CVR number if provided if (!string.IsNullOrWhiteSpace(cvr) && !CvrValidator.IsValid(cvr.Trim())) throw new DomainException( "INVALID_CVR", $"CVR number '{cvr}' is not valid. Must be 8 digits with valid checksum.", $"CVR-nummer '{cvr}' er ugyldigt. Skal være 8 cifre med gyldig kontrolsum."); Emit(new CompanyCreatedEvent( name.Trim(), cvr?.Trim(), address?.Trim(), postalCode?.Trim(), city?.Trim(), country, fiscalYearStartMonth, currency, vatRegistered, vatPeriodFrequency)); } public void Update( string name, string? cvr, string? address, string? postalCode, string? city, string country, int fiscalYearStartMonth, string currency, bool vatRegistered, string? vatPeriodFrequency) { if (!_isCreated) throw new DomainException("Company does not exist"); if (string.IsNullOrWhiteSpace(name)) throw new DomainException("Company name is required"); if (fiscalYearStartMonth < 1 || fiscalYearStartMonth > 12) throw new DomainException("Fiscal year start month must be between 1 and 12"); // Validate CVR number if provided if (!string.IsNullOrWhiteSpace(cvr) && !CvrValidator.IsValid(cvr.Trim())) throw new DomainException( "INVALID_CVR", $"CVR number '{cvr}' is not valid. Must be 8 digits with valid checksum.", $"CVR-nummer '{cvr}' er ugyldigt. Skal være 8 cifre med gyldig kontrolsum."); Emit(new CompanyUpdatedEvent( name.Trim(), cvr?.Trim(), address?.Trim(), postalCode?.Trim(), city?.Trim(), country, fiscalYearStartMonth, currency, vatRegistered, vatPeriodFrequency)); } }