public override int Compare(IReadOnlyParcel a, IReadOnlyParcel b) { var discountAppliesA = (CgtUtils.CgtMethodForParcel(a.AquisitionDate, _DisposalDate) == CgtMethod.Discount); var discountAppliesB = (CgtUtils.CgtMethodForParcel(b.AquisitionDate, _DisposalDate) == CgtMethod.Discount); if (discountAppliesA && !discountAppliesB) { return(-1); } else if (discountAppliesB && !discountAppliesA) { return(1); } else { decimal unitCostBaseA = a.Properties[_DisposalDate].CostBase / a.Properties[_DisposalDate].Units; decimal unitCostBaseB = b.Properties[_DisposalDate].CostBase / b.Properties[_DisposalDate].Units; if (unitCostBaseA > unitCostBaseB) { return(-1); } else if (unitCostBaseA < unitCostBaseB) { return(1); } else { return(a.AquisitionDate.CompareTo(b.AquisitionDate)); } } }
public ParcelSold CalculateParcelCgt(IReadOnlyParcel parcel, Date disposalDate, int unitsSold, decimal amountReceived) { decimal costBase; var properties = parcel.Properties[disposalDate]; if (unitsSold == properties.Units) { costBase = properties.CostBase; } else { costBase = (properties.CostBase * ((decimal)unitsSold / properties.Units)).ToCurrency(RoundingRule.Round); } var capitalGain = amountReceived - costBase; var cgtMethod = CgtUtils.CgtMethodForParcel(parcel.AquisitionDate, disposalDate); var discountedGain = CgtUtils.DiscountedCgt(capitalGain, cgtMethod); return(new ParcelSold(parcel, unitsSold, costBase, amountReceived, capitalGain, cgtMethod, discountedGain)); }