public class ContainerMapViewModel
{
...public string CompoundId { get; set; }
public Location Location { get; set; }
public string FullAddress { get; set; }
public string PhoneNumber { get; set; }
public string LayDownDate { get; set; }
public string LayedDownBy { get; set; }
public string TakeUpDate { get; set; }
public string Others { get; set; }
public Status Status { get; set; }
}
public class ContainerToMapViewModelMappingService : IContainerMappingService<ContainerMapViewModel>
{
private readonly ContainerDataTransformer _dataTransformer = new ContainerDataTransformer();
private readonly IDateTime _dateTime;
private ContainerStatusGetter _statusGetter;
public ContainerToMapViewModelMappingService(IDateTime dateTime)
{
_dateTime = dateTime;
}
public ContainerMapViewModel Map(Container container)
{
_statusGetter = new ContainerStatusGetter(_dateTime, container.Order);
var viewModel = new ContainerMapViewModel()
{
CompoundId = _dataTransformer.CreateCompoundId(container),
Location = container.Location,
FullAddress = _dataTransformer.CreateFullAddress(container),
PhoneNumber = _dataTransformer.GetPhoneNumber(container.Order),
LayDownDate = _dataTransformer.GetLayDownDate(container.Order),
LayedDownBy = container.LayedDownBy.FirstName,
TakeUpDate = _dataTransformer.GetTakeUpDate(container.Order),
Others = _dataTransformer.GetOthers(container.Order),
Status = _statusGetter.Get()
};
return viewModel;
}
}
public interface IDateTime
{
DateTime Now { get; }
}
public class ContainerStatusGetter
{
private const int NumberOfAllowedDaysToStay = 3;
private readonly IDateTime _dateTime;
private readonly Order _order;
public ContainerStatusGetter(IDateTime dateTime, Order order)
{
_dateTime = dateTime;
_order = order;
}
public Status Get()
{
//Somereturn business_order logic!= usingnull
the current date and some properties of Order object of Container ? GetStatus()
: Status.Idle;
}
private Status GetStatus()
{
return TakeUpDateIsNotDecidedAndContainerStaysMoreThanAllowedDays()
? Status.Old
: IsTakeAble();
}
private bool TakeUpDateIsNotDecidedAndContainerStaysMoreThanAllowedDays()
{
return _order.TakeUpDate.Equals(null) && (_dateTime.Now - _order.LayDownDate).TotalDays >= NumberOfAllowedDaysToStay;
}
private Status IsTakeAble()
{
return _dateTime.Now.Equals(_order.TakeUpDate)
? Status.Takeable
: Status.BeingFilled;
}
}