diff --git a/libs/editor/osm_editor.cpp b/libs/editor/osm_editor.cpp index 443b78b89..a5f8d754a 100644 --- a/libs/editor/osm_editor.cpp +++ b/libs/editor/osm_editor.cpp @@ -10,6 +10,7 @@ #include "indexer/feature_meta.hpp" #include "indexer/feature_source.hpp" #include "indexer/mwm_set.hpp" +#include "indexer/ftypes_matcher.hpp" #include "platform/local_country_file_utils.hpp" #include "platform/platform.hpp" @@ -23,6 +24,8 @@ #include #include #include +#include +#include #include #include @@ -126,6 +129,15 @@ bool IsObsolete(editor::XMLFeature const & xml, FeatureID const & fid) } } // namespace +std::string GetCurrentDate() +{ + auto const t = std::time(nullptr); + auto const tm = *std::localtime(&t); + std::ostringstream oss; + oss << std::put_time(&tm, "%Y-%m-%d"); + return oss.str(); +} + Editor::Editor() : m_configLoader(m_config), m_notes(editor::Notes::MakeNotes()) { SetDefaultStorage(); @@ -411,6 +423,59 @@ Editor::SaveResult Editor::SaveEditedFeature(EditableMapObject const & emo) // Reset upload status so already uploaded features can be uploaded again after modification. fti.m_uploadStatus = {}; + + // Auto-fill check_date and check_date:opening_hours + if (ftypes::IsCheckDateChecker::Instance()(fti.m_object.GetTypes())) + { + std::string const currentDate = GetCurrentDate(); + + // Helper to update metadata AND manually log to journal (bypassing LogDiffInJournal crash) + auto updateMetadataWithJournal = [&](feature::Metadata::EType type, std::string const & newVal) { + std::string const key = feature::ToString(type); + std::string const oldVal(fti.m_object.GetMetadata(type)); + + if (oldVal == newVal) return; + + // Update object metadata + fti.m_object.SetMetadata(type, newVal); + + // Update journal manually + const_cast(fti.m_object.GetJournal()).AddTagChange(key, oldVal, newVal); + }; + + // Always update check_date + updateMetadataWithJournal(feature::Metadata::FMD_CHECK_DATE, currentDate); + + // Update check_date:opening_hours if needed + std::string const newOH(fti.m_object.GetMetadata(feature::Metadata::FMD_OPEN_HOURS)); + if (!newOH.empty()) + { + bool updateOHDate = false; + if (IsCreatedFeature(fid)) + { + updateOHDate = true; + } + else + { + auto const originalObjectPtr = GetOriginalMapObject(fid); + if (originalObjectPtr) + { + std::string const oldOH(originalObjectPtr->GetMetadata(feature::Metadata::FMD_OPEN_HOURS)); + if (newOH != oldOH) + updateOHDate = true; + } + else + { + updateOHDate = true; // Fallback + } + } + + if (updateOHDate) + { + updateMetadataWithJournal(feature::Metadata::FMD_CHECK_DATE_OPEN_HOURS, currentDate); + } + } + } auto editableFeatures = make_shared(*features); (*editableFeatures)[fid.m_mwmId][fid.m_index] = std::move(fti);