/// <summary> /// Рассчитывает стоимость обеда сотрудника за указанный период с учетом перерыва и изменения стоимости обеда /// </summary> /// <param name="request">Настройки обеда</param> /// <returns>Возвращает стоимость обеда</returns> public decimal GetPaid(LunchRequest request) { decimal paid; double totalDays; //если отсутствует дата смены стоимости обеда, то считаем весь период одинаково if (request.CostChangeStart == default) { totalDays = GetTotalDaysOfPeriod(request.Start, request.End, request.ExcludeStart, request.ExcludeEnd); paid = Convert.ToInt32(Math.Ceiling(totalDays)) * request.Cost; } //в случае, если установлена дата смены стоимости, то else { //считаем стоимость за первый период (до даты смены стоимости обеда) totalDays = GetTotalDaysOfPeriod(request.Start, request.CostChangeStart, request.ExcludeStart, request.ExcludeEnd); paid = Convert.ToInt32(Math.Ceiling(totalDays)) * request.Cost; //считаем стоимость за второй период (после даты смены стоимости обеда) totalDays = GetTotalDaysOfPeriod(request.CostChangeStart, request.End, request.ExcludeStart, request.ExcludeEnd); paid += Convert.ToInt32(Math.Ceiling(totalDays)) * request.CostAfterChange; } return(paid); }
public IActionResult GetPaid([FromQuery] LunchRequest request) { if (request.Start >= request.End || request.ExcludeStart >= request.ExcludeEnd) { return(BadRequest("Дата начала не может быть больше или равна дате окончания")); } if (request.CostChangeStart < request.Start || request.CostChangeStart > request.End) { return(BadRequest("Дата смены стоимости обеда должна входить в расчетный период")); } if (request.CostChangeStart != default && request.CostAfterChange == default) { return(BadRequest("Необходимо указать последующую стоимость обеда после указанной даты")); } try { return(Ok(_lunchService.GetPaid(request))); } catch (Exception ex) { return(BadRequest(ex.Message)); } }