Manos Chorianopoulos

CampaignItemModel parse fixes

...@@ -128,27 +128,9 @@ public class CampaignItemModel { ...@@ -128,27 +128,9 @@ public class CampaignItemModel {
128 self.description = dictionary["description"] as? String? ?? "" 128 self.description = dictionary["description"] as? String? ?? ""
129 self.workflow_settings = dictionary["workflow_settings"] as? [String: Any] 129 self.workflow_settings = dictionary["workflow_settings"] as? [String: Any]
130 130
131 - let startDateString = dictionary["start_date"] as? String? ?? "" 131 + // Store raw date strings as received from server for better flexibility
132 - let dateFormatter = DateFormatter() 132 + self.start_date = dictionary["start_date"] as? String? ?? ""
133 - dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" 133 + self.end_date = dictionary["end_date"] as? String? ?? ""
134 - if let date = dateFormatter.date(from: startDateString ?? "") {
135 - dateFormatter.dateFormat = "dd/MM/yyyy"
136 - let resultString = dateFormatter.string(from: date)
137 - self.start_date = resultString
138 - } else {
139 - self.start_date = ""
140 - }
141 -
142 - let endDateString = dictionary["end_date"] as? String? ?? ""
143 - let dateFormatter2 = DateFormatter()
144 - dateFormatter2.dateFormat = "yyyy-MM-dd HH:mm:ss"
145 - if let date = dateFormatter2.date(from: endDateString ?? "") {
146 - dateFormatter2.dateFormat = "dd/MM/yyyy"
147 - let resultString = dateFormatter2.string(from: date)
148 - self.end_date = resultString
149 - } else {
150 - self.end_date = ""
151 - }
152 134
153 if let extra_fields = dictionary["extra_fields"] as? [String: Any] { 135 if let extra_fields = dictionary["extra_fields"] as? [String: Any] {
154 self.subcategory = extra_fields["subcategory"] as? String? ?? "" 136 self.subcategory = extra_fields["subcategory"] as? String? ?? ""
...@@ -159,7 +141,7 @@ public class CampaignItemModel { ...@@ -159,7 +141,7 @@ public class CampaignItemModel {
159 self.type = extra_fields["type"] as? String? ?? "" 141 self.type = extra_fields["type"] as? String? ?? ""
160 self.carousel = extra_fields["carousel"] as? String? ?? "false" 142 self.carousel = extra_fields["carousel"] as? String? ?? "false"
161 self.category_title = extra_fields["category_title"] as? String ?? "" 143 self.category_title = extra_fields["category_title"] as? String ?? ""
162 - self.banner_img = CampaignItemModel.cleanEscapedUrl(extra_fields["Banner_img"] as? String ?? "") 144 + self.banner_img = CampaignItemModel.cleanEscapedUrl(extra_fields["banner_img"] as? String ?? "")
163 self.banner_title = extra_fields["Banner_title"] as? String ?? "" 145 self.banner_title = extra_fields["Banner_title"] as? String ?? ""
164 self.category_id = extra_fields["category_id"] as? String ?? "" 146 self.category_id = extra_fields["category_id"] as? String ?? ""
165 self.filter = extra_fields["filter"] as? String ?? "" 147 self.filter = extra_fields["filter"] as? String ?? ""
...@@ -354,6 +336,75 @@ public class CampaignItemModel { ...@@ -354,6 +336,75 @@ public class CampaignItemModel {
354 set(newValue) { self.banner_img_mobile = newValue } 336 set(newValue) { self.banner_img_mobile = newValue }
355 } 337 }
356 338
339 + // MARK: - Date Formatting Functions
340 +
341 + /// Format start date for UI display
342 + /// - Parameter format: Desired output format (default: "dd/MM/yyyy")
343 + /// - Returns: Formatted date string or empty string if parsing fails
344 + public func formattedStartDate(format: String = "dd/MM/yyyy") -> String {
345 + return CampaignItemModel.formatDate(self.start_date, outputFormat: format)
346 + }
347 +
348 + /// Format end date for UI display
349 + /// - Parameter format: Desired output format (default: "dd/MM/yyyy")
350 + /// - Returns: Formatted date string or empty string if parsing fails
351 + public func formattedEndDate(format: String = "dd/MM/yyyy") -> String {
352 + return CampaignItemModel.formatDate(self.end_date, outputFormat: format)
353 + }
354 +
355 + /// Generic date formatter with multiple input format support
356 + /// - Parameters:
357 + /// - dateString: Raw date string from server
358 + /// - outputFormat: Desired output format
359 + /// - Returns: Formatted date string or empty string if parsing fails
360 + private static func formatDate(_ dateString: String?, outputFormat: String) -> String {
361 + guard let dateString = dateString, !dateString.isEmpty else { return "" }
362 +
363 + let inputFormats = [
364 + "yyyy-MM-dd HH:mm:ssZZZZZ", // With timezone: "2025-07-12 11:55:00+03:00"
365 + "yyyy-MM-dd HH:mm:ss" // Without timezone: "2025-07-12 11:55:00"
366 + ]
367 +
368 + let inputFormatter = DateFormatter()
369 + let outputFormatter = DateFormatter()
370 + outputFormatter.dateFormat = outputFormat
371 +
372 + for format in inputFormats {
373 + inputFormatter.dateFormat = format
374 + if let date = inputFormatter.date(from: dateString) {
375 + return outputFormatter.string(from: date)
376 + }
377 + }
378 +
379 + // If all formats fail, return the original string
380 + print("⚠️ [CampaignItemModel] Failed to parse date: \(dateString)")
381 + return dateString
382 + }
383 +
384 + // MARK: - Backward Compatibility
385 +
386 + /// Formatted start date for backward compatibility
387 + /// Returns start date in "dd/MM/yyyy" format
388 + public var _start_date_formatted: String {
389 + return formattedStartDate()
390 + }
391 +
392 + /// Formatted end date for backward compatibility
393 + /// Returns end date in "dd/MM/yyyy" format
394 + public var _end_date_formatted: String {
395 + return formattedEndDate()
396 + }
397 +
398 + /// Raw start date as received from server
399 + public var _start_date_raw: String? {
400 + return self.start_date
401 + }
402 +
403 + /// Raw end date as received from server
404 + public var _end_date_raw: String? {
405 + return self.end_date
406 + }
407 +
357 // MARK: - Computed properties for UI compatibility 408 // MARK: - Computed properties for UI compatibility
358 409
359 public var _valid_until: String? { 410 public var _valid_until: String? {
......