/// <summary>
        ///     Create a new Project Aggregate instance
        /// </summary>
        /// <param name="donor">The Donor which funded the Project</param>
        /// <param name="analyst">The Analyst associated to the Project</param>
        /// <param name="acronym">The Acronym of the Project</param>
        /// <param name="projectType">The Type of Project</param>
        /// <param name="tenderProcessType">The Tender Process applied to the Project</param>
        /// <param name="startDate">The estimated start date of the Project</param>
        public ProjectAggregate(DonorAggregate donor, Analyst analyst, string acronym, TypeOfProject projectType,
                                TypeOfTenderProcess tenderProcessType, DateTime?startDate = null)
        {
            // pre-conditions
            donor.Requires("Donor").IsNotNull();
            acronym.Requires("Acronym").IsNotNullOrEmpty();
            analyst.Requires("Analyst").IsNotNull();

            // initialization
            Id                = Guid.NewGuid();
            Status            = Status.InPreparation;
            Donor             = donor;
            Acronym           = acronym;
            ProjectType       = projectType;
            TenderProcessType = tenderProcessType;
            Analyst           = analyst;
            ExpectedStartDate = startDate ?? DateTime.UtcNow;

            // TODO
            TierLevel = TierLevel.Tier1;

            // associations
            Donor.AssignProjectToDonor(this);

            // events
            DomainEvents.Raise(new ProjectCreated {
                Project = this
            });
        }