forked from organicmaps/organicmaps
Rename WorkingDays to OpeningDays. Implement TimeTableSet to OpeningHours convesion.
This commit is contained in:
parent
a58b20374c
commit
718ba4908f
6 changed files with 350 additions and 53 deletions
|
@ -23,7 +23,7 @@ UNIT_TEST(TestTimeTable)
|
|||
TEST(tt.RemoveWorkingDay(osmoh::Weekday::Friday), ());
|
||||
TEST(!tt.RemoveWorkingDay(osmoh::Weekday::Saturday), ());
|
||||
|
||||
TEST_EQUAL(tt.GetWorkingDays(), (set<osmoh::Weekday>{osmoh::Weekday::Saturday}), ());
|
||||
TEST_EQUAL(tt.GetOpeningDays(), (set<osmoh::Weekday>{osmoh::Weekday::Saturday}), ());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -167,7 +167,7 @@ UNIT_TEST(TestAppendTimeTable)
|
|||
TEST(tt.Commit(), ());
|
||||
|
||||
TEST(tts.Append(tts.GetComplementTimeTable()), ());
|
||||
TEST_EQUAL(tts.Back().GetWorkingDays(), (set<osmoh::Weekday>{osmoh::Weekday::Sunday,
|
||||
TEST_EQUAL(tts.Back().GetOpeningDays(), (set<osmoh::Weekday>{osmoh::Weekday::Sunday,
|
||||
osmoh::Weekday::Saturday}), ());
|
||||
}
|
||||
|
||||
|
@ -179,7 +179,7 @@ UNIT_TEST(TestAppendTimeTable)
|
|||
}
|
||||
|
||||
TEST(tts.Append(tts.GetComplementTimeTable()), ());
|
||||
TEST_EQUAL(tts.Back().GetWorkingDays(), (set<osmoh::Weekday>{osmoh::Weekday::Monday,
|
||||
TEST_EQUAL(tts.Back().GetOpeningDays(), (set<osmoh::Weekday>{osmoh::Weekday::Monday,
|
||||
osmoh::Weekday::Tuesday}), ());
|
||||
|
||||
TEST(!tts.GetComplementTimeTable().IsValid(), ());
|
||||
|
@ -202,8 +202,8 @@ UNIT_TEST(TestAppendTimeTable)
|
|||
TEST(tts.Append(tt), ());
|
||||
|
||||
TEST_EQUAL(tts.Size(), 2, ());
|
||||
TEST_EQUAL(tts.Front().GetWorkingDays().size(), 4, ());
|
||||
TEST_EQUAL(tts.Back().GetWorkingDays().size(), 3, ());
|
||||
TEST_EQUAL(tts.Front().GetOpeningDays().size(), 4, ());
|
||||
TEST_EQUAL(tts.Back().GetOpeningDays().size(), 3, ());
|
||||
|
||||
TEST(!tts.GetComplementTimeTable().IsValid(), ());
|
||||
}
|
||||
|
@ -215,16 +215,16 @@ UNIT_TEST(TestAppendTimeTable)
|
|||
TEST(tts.Append(tt), ());
|
||||
|
||||
TEST_EQUAL(tts.Size(), 2, ());
|
||||
TEST_EQUAL(tts.Front().GetWorkingDays().size(), 6, ());
|
||||
TEST_EQUAL(tts.Back().GetWorkingDays().size(), 1, ());
|
||||
TEST_EQUAL(tts.Front().GetOpeningDays().size(), 6, ());
|
||||
TEST_EQUAL(tts.Back().GetOpeningDays().size(), 1, ());
|
||||
|
||||
TEST(!tts.GetComplementTimeTable().IsValid(), ());
|
||||
|
||||
tt = tts.Front();
|
||||
tt.AddWorkingDay(osmoh::Weekday::Friday);
|
||||
TEST(!tts.Append(tt), ());
|
||||
TEST_EQUAL(tts.Front().GetWorkingDays().size(), 6, ());
|
||||
TEST_EQUAL(tts.Back().GetWorkingDays().size(), 1, ());
|
||||
TEST_EQUAL(tts.Front().GetOpeningDays().size(), 6, ());
|
||||
TEST_EQUAL(tts.Back().GetOpeningDays().size(), 1, ());
|
||||
}
|
||||
{
|
||||
TimeTableSet tts;
|
||||
|
@ -236,8 +236,8 @@ UNIT_TEST(TestAppendTimeTable)
|
|||
}
|
||||
|
||||
TEST_EQUAL(tts.Size(), 2, ());
|
||||
TEST_EQUAL(tts.Front().GetWorkingDays().size(), 6, ());
|
||||
TEST_EQUAL(tts.Back().GetWorkingDays().size(), 1, ());
|
||||
TEST_EQUAL(tts.Front().GetOpeningDays().size(), 6, ());
|
||||
TEST_EQUAL(tts.Back().GetOpeningDays().size(), 1, ());
|
||||
|
||||
auto tt = tts.Front();
|
||||
tt.AddWorkingDay(osmoh::Weekday::Friday);
|
||||
|
|
|
@ -6,7 +6,17 @@ using namespace osmoh;
|
|||
using namespace editor;
|
||||
using namespace editor::ui;
|
||||
|
||||
UNIT_TEST(ConvertOpeningHours)
|
||||
namespace
|
||||
{
|
||||
string ToString(OpeningHours const & oh)
|
||||
{
|
||||
stringstream sstr;
|
||||
sstr << oh.GetRule();
|
||||
return sstr.str();
|
||||
}
|
||||
} // namespace
|
||||
|
||||
UNIT_TEST(OpeningHours2TimeTableSt)
|
||||
{
|
||||
{
|
||||
OpeningHours oh("Mo-Fr 08:00-22:00");
|
||||
|
@ -19,7 +29,7 @@ UNIT_TEST(ConvertOpeningHours)
|
|||
|
||||
auto const tt = tts.Front();
|
||||
TEST(!tt.IsTwentyFourHours(), ());
|
||||
TEST_EQUAL(tt.GetWorkingDays().size(), 5, ());
|
||||
TEST_EQUAL(tt.GetOpeningDays().size(), 5, ());
|
||||
TEST_EQUAL(tt.GetOpeningTime().GetStart().GetHourMinutes().GetHoursCount(), 8, ());
|
||||
TEST_EQUAL(tt.GetOpeningTime().GetEnd().GetHourMinutes().GetHoursCount(), 22, ());
|
||||
}
|
||||
|
@ -34,7 +44,7 @@ UNIT_TEST(ConvertOpeningHours)
|
|||
|
||||
auto const tt = tts.Front();
|
||||
TEST(!tt.IsTwentyFourHours(), ());
|
||||
TEST_EQUAL(tt.GetWorkingDays().size(), 5, ());
|
||||
TEST_EQUAL(tt.GetOpeningDays().size(), 5, ());
|
||||
TEST_EQUAL(tt.GetOpeningTime().GetStart().GetHourMinutes().GetHoursCount(), 8, ());
|
||||
TEST_EQUAL(tt.GetOpeningTime().GetEnd().GetHourMinutes().GetHoursCount(), 22, ());
|
||||
|
||||
|
@ -53,7 +63,7 @@ UNIT_TEST(ConvertOpeningHours)
|
|||
|
||||
auto const tt = tts.Front();
|
||||
TEST(!tt.IsTwentyFourHours(), ());
|
||||
TEST_EQUAL(tt.GetWorkingDays().size(), 5, ());
|
||||
TEST_EQUAL(tt.GetOpeningDays().size(), 5, ());
|
||||
TEST_EQUAL(tt.GetOpeningTime().GetStart().GetHourMinutes().GetHoursCount(), 8, ());
|
||||
TEST_EQUAL(tt.GetOpeningTime().GetEnd().GetHourMinutes().GetHoursCount(), 22, ());
|
||||
|
||||
|
@ -77,13 +87,13 @@ UNIT_TEST(ConvertOpeningHours)
|
|||
{
|
||||
auto const tt = tts.Get(0);
|
||||
TEST(!tt.IsTwentyFourHours(), ());
|
||||
TEST_EQUAL(tt.GetWorkingDays().size(), 5, ());
|
||||
TEST_EQUAL(tt.GetOpeningDays().size(), 5, ());
|
||||
}
|
||||
|
||||
{
|
||||
auto const tt = tts.Get(1);
|
||||
TEST(!tt.IsTwentyFourHours(), ());
|
||||
TEST_EQUAL(tt.GetWorkingDays().size(), 2, ());
|
||||
TEST_EQUAL(tt.GetOpeningDays().size(), 2, ());
|
||||
}
|
||||
}
|
||||
{
|
||||
|
@ -121,26 +131,213 @@ UNIT_TEST(ConvertOpeningHours)
|
|||
|
||||
auto const tt = tts.Front();
|
||||
TEST(!tt.IsTwentyFourHours(), ());
|
||||
TEST_EQUAL(tt.GetWorkingDays().size(), 7, ());
|
||||
TEST_EQUAL(tt.GetOpeningDays().size(), 7, ());
|
||||
TEST_EQUAL(tt.GetOpeningTime().GetStart().GetHourMinutes().GetHoursCount(), 11, ());
|
||||
TEST_EQUAL(tt.GetOpeningTime().GetEnd().GetHourMinutes().GetHoursCount(), 24, ());
|
||||
}
|
||||
{
|
||||
OpeningHours oh("Mo-Fr 08:00-10:00; Su, Sa 13:00-22:00");
|
||||
TEST(oh.IsValid(), ());
|
||||
|
||||
TimeTableSet tts;
|
||||
|
||||
TEST(ConvertOpeningHours("Mo-Fr 08:00-10:00\n Su, Sa 13:00-22:00", tts), ());
|
||||
TEST(ConvertOpeningHours(oh, tts), ());
|
||||
TEST_EQUAL(tts.Size(), 2, ());
|
||||
|
||||
{
|
||||
auto const tt = tts.Get(0);
|
||||
TEST(!tt.IsTwentyFourHours(), ());
|
||||
TEST_EQUAL(tt.GetWorkingDays().size(), 5, ());
|
||||
TEST_EQUAL(tt.GetOpeningDays().size(), 5, ());
|
||||
}
|
||||
|
||||
{
|
||||
auto const tt = tts.Get(1);
|
||||
TEST(!tt.IsTwentyFourHours(), ());
|
||||
TEST_EQUAL(tt.GetWorkingDays().size(), 2, ());
|
||||
TEST_EQUAL(tt.GetOpeningDays().size(), 2, ());
|
||||
}
|
||||
}
|
||||
{
|
||||
OpeningHours oh("Mo-Fr 08:00-13:00,14:00-20:00; Sa 09:00-13:00,14:00-18:00; Su off");
|
||||
TEST(oh.IsValid(), ());
|
||||
|
||||
TimeTableSet tts;
|
||||
|
||||
TEST(ConvertOpeningHours(oh, tts), ());
|
||||
TEST_EQUAL(tts.Size(), 2, ());
|
||||
|
||||
{
|
||||
auto const tt = tts.Get(0);
|
||||
TEST(!tt.IsTwentyFourHours(), ());
|
||||
TEST_EQUAL(tt.GetOpeningDays().size(), 5, ());
|
||||
}
|
||||
|
||||
{
|
||||
auto const tt = tts.Get(1);
|
||||
TEST(!tt.IsTwentyFourHours(), ());
|
||||
TEST_EQUAL(tt.GetOpeningDays().size(), 1, ());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
UNIT_TEST(TimeTableSt2OpeningHours)
|
||||
{
|
||||
{
|
||||
TimeTableSet tts;
|
||||
auto tt = tts.Front();
|
||||
TEST(tt.SetOpeningDays({
|
||||
osmoh::Weekday::Monday,
|
||||
osmoh::Weekday::Tuesday,
|
||||
osmoh::Weekday::Wednesday,
|
||||
osmoh::Weekday::Thursday,
|
||||
osmoh::Weekday::Friday}), ());
|
||||
|
||||
tt.SetTwentyFourHours(false);
|
||||
TEST(tt.SetOpeningTime({8_h, 22_h}), ());
|
||||
TEST(tt.Commit(), ());
|
||||
|
||||
TEST_EQUAL(ToString(ConvertOpeningHours(tts)), "Mo-Fr 08:00-22:00", ());
|
||||
}
|
||||
{
|
||||
TimeTableSet tts;
|
||||
|
||||
auto tt = tts.Front();
|
||||
TEST(tt.SetOpeningDays({
|
||||
osmoh::Weekday::Monday,
|
||||
osmoh::Weekday::Tuesday,
|
||||
osmoh::Weekday::Wednesday,
|
||||
osmoh::Weekday::Thursday,
|
||||
osmoh::Weekday::Friday}), ());
|
||||
|
||||
tt.SetTwentyFourHours(false);
|
||||
TEST(tt.SetOpeningTime({8_h, 22_h}), ());
|
||||
TEST(tt.AddExcludeTime({12_h, 13_h}), ());
|
||||
TEST(tt.Commit(), ());
|
||||
|
||||
TEST_EQUAL(ToString(ConvertOpeningHours(tts)), "Mo-Fr 08:00-12:00, 13:00-22:00", ());
|
||||
}
|
||||
{
|
||||
TimeTableSet tts;
|
||||
|
||||
auto tt = tts.Front();
|
||||
TEST(tt.SetOpeningDays({
|
||||
osmoh::Weekday::Monday,
|
||||
osmoh::Weekday::Tuesday,
|
||||
osmoh::Weekday::Wednesday,
|
||||
osmoh::Weekday::Thursday,
|
||||
osmoh::Weekday::Friday}), ());
|
||||
|
||||
tt.SetTwentyFourHours(false);
|
||||
TEST(tt.SetOpeningTime({8_h, 22_h}), ());
|
||||
TEST(tt.AddExcludeTime({10_h, 11_h}), ());
|
||||
TEST(tt.AddExcludeTime({12_h + 30_min, 13_h}), ());
|
||||
TEST(tt.Commit(), ());
|
||||
|
||||
TEST_EQUAL(ToString(ConvertOpeningHours(tts)), "Mo-Fr 08:00-10:00, 11:00-12:30, 13:00-22:00", ());
|
||||
}
|
||||
{
|
||||
TimeTableSet tts;
|
||||
|
||||
{
|
||||
auto tt = tts.Front();
|
||||
TEST(tt.SetOpeningDays({
|
||||
osmoh::Weekday::Monday,
|
||||
osmoh::Weekday::Tuesday,
|
||||
osmoh::Weekday::Wednesday,
|
||||
osmoh::Weekday::Thursday}), ());
|
||||
|
||||
|
||||
tt.SetTwentyFourHours(false);
|
||||
TEST(tt.SetOpeningTime({8_h, 10_h}), ());
|
||||
TEST(tt.Commit(), ());
|
||||
}
|
||||
{
|
||||
TimeTable tt;
|
||||
TEST(tt.SetOpeningDays({
|
||||
osmoh::Weekday::Friday,
|
||||
osmoh::Weekday::Saturday,
|
||||
osmoh::Weekday::Sunday}), ());
|
||||
|
||||
tt.SetTwentyFourHours(false);
|
||||
TEST(tt.SetOpeningTime({13_h, 22_h}), ());
|
||||
TEST(tts.Append(tt), ());
|
||||
}
|
||||
|
||||
TEST_EQUAL(ToString(ConvertOpeningHours(tts)), "Mo-Th 08:00-10:00; Fr-Su 13:00-22:00", ());
|
||||
}
|
||||
{
|
||||
TimeTableSet tts;
|
||||
|
||||
{
|
||||
auto tt = tts.Front();
|
||||
TEST(tt.SetOpeningDays({
|
||||
osmoh::Weekday::Monday,
|
||||
osmoh::Weekday::Wednesday,
|
||||
osmoh::Weekday::Friday}), ());
|
||||
|
||||
tt.SetTwentyFourHours(false);
|
||||
TEST(tt.SetOpeningTime({8_h, 10_h}), ());
|
||||
TEST(tt.Commit(), ());
|
||||
}
|
||||
{
|
||||
TimeTable tt;
|
||||
TEST(tt.SetOpeningDays({
|
||||
osmoh::Weekday::Saturday,
|
||||
osmoh::Weekday::Sunday}), ());
|
||||
|
||||
tt.SetTwentyFourHours(false);
|
||||
TEST(tt.SetOpeningTime({13_h, 22_h}), ());
|
||||
TEST(tts.Append(tt), ());
|
||||
}
|
||||
|
||||
TEST_EQUAL(ToString(ConvertOpeningHours(tts)), "Mo, We, Fr 08:00-10:00; Sa-Su 13:00-22:00", ());
|
||||
}
|
||||
{
|
||||
TimeTableSet tts;
|
||||
|
||||
auto tt = tts.Front();
|
||||
TEST(tt.SetOpeningDays({
|
||||
osmoh::Weekday::Sunday,
|
||||
osmoh::Weekday::Monday,
|
||||
osmoh::Weekday::Tuesday,
|
||||
osmoh::Weekday::Wednesday,
|
||||
osmoh::Weekday::Thursday,
|
||||
osmoh::Weekday::Friday,
|
||||
osmoh::Weekday::Saturday}), ());
|
||||
|
||||
tt.SetTwentyFourHours(false);
|
||||
TEST(tt.SetOpeningTime({11_h, 24_h}), ());
|
||||
TEST(tt.Commit(), ());
|
||||
|
||||
TEST_EQUAL(ToString(ConvertOpeningHours(tts)), "Mo-Su 11:00-24:00", ());
|
||||
}
|
||||
{
|
||||
TimeTableSet tts;
|
||||
|
||||
{
|
||||
auto tt = tts.Front();
|
||||
TEST(tt.SetOpeningDays({
|
||||
osmoh::Weekday::Monday,
|
||||
osmoh::Weekday::Wednesday,
|
||||
osmoh::Weekday::Thursday}), ());
|
||||
|
||||
|
||||
tt.SetTwentyFourHours(false);
|
||||
TEST(tt.SetOpeningTime({8_h, 20_h}), ());
|
||||
TEST(tt.AddExcludeTime({13_h, 14_h}), ());
|
||||
TEST(tt.Commit(), ());
|
||||
}
|
||||
{
|
||||
TimeTable tt;
|
||||
TEST(tt.SetOpeningDays({osmoh::Weekday::Saturday}), ());
|
||||
|
||||
tt.SetTwentyFourHours(false);
|
||||
TEST(tt.SetOpeningTime({9_h, 18_h}), ());
|
||||
TEST(tt.AddExcludeTime({13_h, 14_h}), ());
|
||||
TEST(tts.Append(tt), ());
|
||||
}
|
||||
|
||||
TEST_EQUAL(ToString(ConvertOpeningHours(tts)),
|
||||
"Mo, We-Th 08:00-13:00, 14:00-20:00; "
|
||||
"Sa 09:00-13:00, 14:00-18:00", ());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -146,7 +146,7 @@ TimeTable TimeTable::GetPredefinedTimeTable()
|
|||
return tt;
|
||||
}
|
||||
|
||||
bool TimeTable::SetWorkingDays(TOpeningDays const & days)
|
||||
bool TimeTable::SetOpeningDays(TOpeningDays const & days)
|
||||
{
|
||||
if (days.empty())
|
||||
return false;
|
||||
|
@ -296,7 +296,7 @@ TOpeningDays TimeTableSet::GetUnhandledDays() const
|
|||
};
|
||||
|
||||
for (auto const tt : *this)
|
||||
for (auto const day : tt.GetWorkingDays())
|
||||
for (auto const day : tt.GetOpeningDays())
|
||||
days.erase(day);
|
||||
|
||||
return days;
|
||||
|
@ -309,7 +309,7 @@ TimeTable TimeTableSet::GetComplementTimeTable() const
|
|||
// it has no effect.
|
||||
tt.SetOpeningTime(tt.GetPredefinedOpeningTime());
|
||||
tt.SetTwentyFourHours(true);
|
||||
tt.SetWorkingDays(GetUnhandledDays());
|
||||
tt.SetOpeningDays(GetUnhandledDays());
|
||||
return tt;
|
||||
}
|
||||
|
||||
|
@ -364,11 +364,11 @@ bool TimeTableSet::UpdateByIndex(TimeTableSet & ttSet, size_t const index)
|
|||
|
||||
// Remove all days of updated timetable from all other timetables.
|
||||
TOpeningDays days;
|
||||
set_difference(std::begin(ttSet[i].GetWorkingDays()), std::end(ttSet[i].GetWorkingDays()),
|
||||
std::begin(updated.GetWorkingDays()), std::end(updated.GetWorkingDays()),
|
||||
set_difference(std::begin(ttSet[i].GetOpeningDays()), std::end(ttSet[i].GetOpeningDays()),
|
||||
std::begin(updated.GetOpeningDays()), std::end(updated.GetOpeningDays()),
|
||||
inserter(days, std::end(days)));
|
||||
|
||||
if (!ttSet[i].SetWorkingDays(days))
|
||||
if (!ttSet[i].SetOpeningDays(days))
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -20,8 +20,8 @@ public:
|
|||
bool IsTwentyFourHours() const { return m_isTwentyFourHours; }
|
||||
void SetTwentyFourHours(bool const on) { m_isTwentyFourHours = on; }
|
||||
|
||||
TOpeningDays const & GetWorkingDays() const { return m_weekdays; }
|
||||
bool SetWorkingDays(TOpeningDays const & days);
|
||||
TOpeningDays const & GetOpeningDays() const { return m_weekdays; }
|
||||
bool SetOpeningDays(TOpeningDays const & days);
|
||||
|
||||
void AddWorkingDay(osmoh::Weekday const wd);
|
||||
bool RemoveWorkingDay(osmoh::Weekday const wd);
|
||||
|
@ -71,7 +71,8 @@ using TTimeTableProxy = TimeTableProxyBase<TimeTableSet>;
|
|||
class TimeTableSet : vector<TimeTable>
|
||||
{
|
||||
public:
|
||||
using vector<TimeTable>::vector;
|
||||
using TBase = vector<TimeTable>;
|
||||
using TBase::TBase;
|
||||
|
||||
TimeTableSet();
|
||||
|
||||
|
@ -91,9 +92,11 @@ public:
|
|||
|
||||
bool Replace(TimeTable const & tt, size_t const index);
|
||||
|
||||
TBase::const_iterator begin() const { return TBase::begin(); }
|
||||
TBase::const_iterator end() const { return TBase::end(); }
|
||||
|
||||
private:
|
||||
static bool UpdateByIndex(TimeTableSet & ttSet, size_t const index);
|
||||
|
||||
};
|
||||
} // namespace ui
|
||||
} // namespace editor
|
||||
|
|
131
editor/ui2oh.cpp
131
editor/ui2oh.cpp
|
@ -10,25 +10,25 @@ namespace
|
|||
{
|
||||
void SetUpWeekdays(osmoh::Weekdays const & wds, editor::ui::TimeTable & tt)
|
||||
{
|
||||
set<osmoh::Weekday> workingDays;
|
||||
set<osmoh::Weekday> openingDays;
|
||||
for (auto const & wd : wds.GetWeekdayRanges())
|
||||
{
|
||||
if (wd.HasSunday())
|
||||
workingDays.insert(osmoh::Weekday::Sunday);
|
||||
openingDays.insert(osmoh::Weekday::Sunday);
|
||||
if (wd.HasMonday())
|
||||
workingDays.insert(osmoh::Weekday::Monday);
|
||||
openingDays.insert(osmoh::Weekday::Monday);
|
||||
if (wd.HasTuesday())
|
||||
workingDays.insert(osmoh::Weekday::Tuesday);
|
||||
openingDays.insert(osmoh::Weekday::Tuesday);
|
||||
if (wd.HasWednesday())
|
||||
workingDays.insert(osmoh::Weekday::Wednesday);
|
||||
openingDays.insert(osmoh::Weekday::Wednesday);
|
||||
if (wd.HasThursday())
|
||||
workingDays.insert(osmoh::Weekday::Thursday);
|
||||
openingDays.insert(osmoh::Weekday::Thursday);
|
||||
if (wd.HasFriday())
|
||||
workingDays.insert(osmoh::Weekday::Friday);
|
||||
openingDays.insert(osmoh::Weekday::Friday);
|
||||
if (wd.HasSaturday())
|
||||
workingDays.insert(osmoh::Weekday::Saturday);
|
||||
openingDays.insert(osmoh::Weekday::Saturday);
|
||||
}
|
||||
tt.SetWorkingDays(workingDays);
|
||||
tt.SetOpeningDays(openingDays);
|
||||
}
|
||||
|
||||
void SetUpTimeTable(osmoh::TTimespans spans, editor::ui::TimeTable & tt)
|
||||
|
@ -51,13 +51,108 @@ void SetUpTimeTable(osmoh::TTimespans spans, editor::ui::TimeTable & tt)
|
|||
for (auto i = 0; i + 1 < spans.size(); ++i)
|
||||
tt.AddExcludeTime({spans[i].GetEnd(), spans[i + 1].GetStart()});
|
||||
}
|
||||
|
||||
int32_t WeekdayNumber(osmoh::Weekday const wd) { return static_cast<int32_t>(wd); }
|
||||
|
||||
constexpr uint32_t kDaysInWeek = 7;
|
||||
int32_t NextWeekdayNumber(osmoh::Weekday const wd)
|
||||
{
|
||||
auto dayNumber = WeekdayNumber(wd);
|
||||
return (dayNumber + kDaysInWeek) % kDaysInWeek + 1;
|
||||
}
|
||||
|
||||
vector<osmoh::Weekday> RemoveInversion(editor::ui::TOpeningDays const & days)
|
||||
{
|
||||
vector<osmoh::Weekday> result(begin(days), end(days));
|
||||
if (NextWeekdayNumber(result.back()) != WeekdayNumber(result.front()))
|
||||
return result;
|
||||
|
||||
auto inversion = adjacent_find(begin(result), end(result),
|
||||
[](osmoh::Weekday const a, osmoh::Weekday const b)
|
||||
{
|
||||
return NextWeekdayNumber(a) != WeekdayNumber(b) ||
|
||||
a == osmoh::Weekday::Sunday;
|
||||
});
|
||||
|
||||
if (inversion != end(result) && ++inversion != end(result))
|
||||
rotate(begin(result), inversion, end(result));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
using TWeekdays = vector<osmoh::Weekday>;
|
||||
|
||||
vector<TWeekdays> SplitIntoIntervals(editor::ui::TOpeningDays const & days)
|
||||
{
|
||||
vector<TWeekdays> result;
|
||||
auto const & noInversionDays = RemoveInversion(days);
|
||||
|
||||
auto previous = *begin(noInversionDays);
|
||||
result.push_back({previous});
|
||||
|
||||
for (auto it = next(begin(noInversionDays)); it != end(noInversionDays); ++it)
|
||||
{
|
||||
if (NextWeekdayNumber(previous) != WeekdayNumber(*it))
|
||||
result.push_back({});
|
||||
result.back().push_back(*it);
|
||||
previous = *it;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
osmoh::Weekdays MakeWeekdays(editor::ui::TimeTable const & tt)
|
||||
{
|
||||
osmoh::Weekdays wds;
|
||||
|
||||
for (auto const & daysInterval : SplitIntoIntervals(tt.GetOpeningDays()))
|
||||
{
|
||||
osmoh::WeekdayRange wdr;
|
||||
wdr.SetStart(*begin(daysInterval));
|
||||
if (daysInterval.size() > 1)
|
||||
wdr.SetEnd(*(prev(end(daysInterval))));
|
||||
|
||||
wds.AddWeekdayRange(wdr);
|
||||
}
|
||||
|
||||
return wds;
|
||||
}
|
||||
|
||||
osmoh::TTimespans MakeTimespans(editor::ui::TimeTable const & tt)
|
||||
{
|
||||
|
||||
if (tt.IsTwentyFourHours())
|
||||
return {};
|
||||
|
||||
auto const & excludeTime = tt.GetExcludeTime();
|
||||
if (excludeTime.empty())
|
||||
return {tt.GetOpeningTime()};
|
||||
|
||||
osmoh::TTimespans spans{{tt.GetOpeningTime().GetStart(), excludeTime[0].GetStart()}};
|
||||
|
||||
for (auto i = 0; i + 1 < excludeTime.size(); ++i)
|
||||
spans.emplace_back(excludeTime[i].GetEnd(), excludeTime[i + 1].GetStart());
|
||||
|
||||
spans.emplace_back(excludeTime.back().GetEnd(), tt.GetOpeningTime().GetEnd());
|
||||
|
||||
return spans;
|
||||
}
|
||||
} // namespace
|
||||
|
||||
namespace editor
|
||||
{
|
||||
osmoh::OpeningHours ConvertOpeningHours(ui::TimeTableSet const & tt)
|
||||
osmoh::OpeningHours ConvertOpeningHours(ui::TimeTableSet const & tts)
|
||||
{
|
||||
return string(); // TODO(mgsergio): Implement me.
|
||||
osmoh::TRuleSequences rule;
|
||||
for (auto const & tt : tts)
|
||||
{
|
||||
osmoh::RuleSequence rulePart;
|
||||
rulePart.SetWeekdays(MakeWeekdays(tt));
|
||||
rulePart.SetTimes(MakeTimespans(tt));
|
||||
rule.push_back(rulePart);
|
||||
}
|
||||
|
||||
return rule;
|
||||
}
|
||||
|
||||
bool ConvertOpeningHours(osmoh::OpeningHours const & oh, ui::TimeTableSet & tts)
|
||||
|
@ -77,6 +172,14 @@ bool ConvertOpeningHours(osmoh::OpeningHours const & oh, ui::TimeTableSet & tts)
|
|||
{
|
||||
ui::TimeTable tt;
|
||||
|
||||
// TODO(mgsergio): We don't handle cases with speciffic time off.
|
||||
// I.e. Mo-Fr 08-20; Fr 18:00-17:00 off.
|
||||
// Can be implemented later.
|
||||
if (rulePart.GetModifier() == osmoh::RuleSequence::Modifier::Closed ||
|
||||
rulePart.GetModifier() == osmoh::RuleSequence::Modifier::Unknown ||
|
||||
rulePart.GetModifier() == osmoh::RuleSequence::Modifier::Comment)
|
||||
continue;
|
||||
|
||||
if (rulePart.HasWeekdays())
|
||||
SetUpWeekdays(rulePart.GetWeekdays(), tt);
|
||||
|
||||
|
@ -98,10 +201,4 @@ bool ConvertOpeningHours(osmoh::OpeningHours const & oh, ui::TimeTableSet & tts)
|
|||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ConvertOpeningHours(string oh, ui::TimeTableSet & tts)
|
||||
{
|
||||
replace(begin(oh), end(oh), '\n', ';');
|
||||
return ConvertOpeningHours(osmoh::OpeningHours(oh), tts);
|
||||
}
|
||||
} // namespace editor
|
||||
|
|
|
@ -230,9 +230,9 @@ using namespace osmoh;
|
|||
- (void)addSelectedDay:(Weekday)day
|
||||
{
|
||||
TTimeTableProxy timeTable = [self getTimeTableProxy];
|
||||
TOpeningDays openingDays(timeTable.GetWorkingDays());
|
||||
TOpeningDays openingDays(timeTable.GetOpeningDays());
|
||||
openingDays.insert(day);
|
||||
timeTable.SetWorkingDays(openingDays);
|
||||
timeTable.SetOpeningDays(openingDays);
|
||||
timeTable.Commit();
|
||||
[self refresh:YES];
|
||||
}
|
||||
|
@ -240,9 +240,9 @@ using namespace osmoh;
|
|||
- (void)removeSelectedDay:(Weekday)day
|
||||
{
|
||||
TTimeTableProxy timeTable = [self getTimeTableProxy];
|
||||
TOpeningDays openingDays(timeTable.GetWorkingDays());
|
||||
TOpeningDays openingDays(timeTable.GetOpeningDays());
|
||||
openingDays.erase(day);
|
||||
timeTable.SetWorkingDays(openingDays);
|
||||
timeTable.SetOpeningDays(openingDays);
|
||||
timeTable.Commit();
|
||||
[self refresh:YES];
|
||||
}
|
||||
|
@ -250,7 +250,7 @@ using namespace osmoh;
|
|||
- (BOOL)containsSelectedDay:(Weekday)day
|
||||
{
|
||||
TTimeTableProxy timeTable = [self getTimeTableProxy];
|
||||
TOpeningDays const & openingDays = timeTable.GetWorkingDays();
|
||||
TOpeningDays const & openingDays = timeTable.GetOpeningDays();
|
||||
return openingDays.find(day) != openingDays.end();
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue