payment and list

This commit is contained in:
Daniel Arantes Loverde
2026-02-24 10:19:47 -03:00
parent 3a3dc7217b
commit ca83a275ac
51 changed files with 1645 additions and 256 deletions

View File

@@ -2,9 +2,14 @@ import Foundation
struct AppOrderSummary: Decodable, Identifiable {
let id: String
let orderId: String?
let realId: String?
let shortId: String?
let total: Double?
let status: String?
let statusDetailed: String?
let statusLabel: String?
let nextAction: String?
let paymentStatus: String?
let paymentMethod: String?
let deliveryType: String?
@@ -14,39 +19,57 @@ struct AppOrderSummary: Decodable, Identifiable {
enum CodingKeys: String, CodingKey {
case id
case orderId
case realId
case shortId
case total
case status
case statusDetailed
case statusLabel
case nextAction
case paymentStatus
case paymentMethod
case deliveryType
case storeName
case date
case createdAt
case updatedAt
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
id = (try? container.decode(String.self, forKey: .id)) ?? UUID().uuidString
shortId = try? container.decode(String.self, forKey: .shortId)
orderId = ApiService.decodeFlexibleString(from: container, keys: [.orderId])
id = ApiService.decodeFlexibleString(from: container, keys: [.orderId, .realId, .id]) ?? UUID().uuidString
realId = ApiService.decodeFlexibleString(from: container, keys: [.realId])
shortId = ApiService.decodeFlexibleString(from: container, keys: [.shortId])
total = ApiService.decodeFlexibleDouble(from: container, keys: [.total])
status = try? container.decode(String.self, forKey: .status)
paymentStatus = try? container.decode(String.self, forKey: .paymentStatus)
paymentMethod = try? container.decode(String.self, forKey: .paymentMethod)
deliveryType = try? container.decode(String.self, forKey: .deliveryType)
storeName = try? container.decode(String.self, forKey: .storeName)
createdAt = try? container.decode(String.self, forKey: .createdAt)
updatedAt = try? container.decode(String.self, forKey: .updatedAt)
status = ApiService.decodeFlexibleString(from: container, keys: [.status])
statusDetailed = ApiService.decodeFlexibleString(from: container, keys: [.statusDetailed])
statusLabel = ApiService.decodeFlexibleString(from: container, keys: [.statusLabel])
nextAction = ApiService.decodeFlexibleString(from: container, keys: [.nextAction])
paymentStatus = ApiService.decodeFlexibleString(from: container, keys: [.paymentStatus])
paymentMethod = ApiService.decodeFlexibleString(from: container, keys: [.paymentMethod])
deliveryType = ApiService.decodeFlexibleString(from: container, keys: [.deliveryType])
storeName = ApiService.decodeFlexibleString(from: container, keys: [.storeName])
let fallbackDate = ApiService.decodeFlexibleString(from: container, keys: [.date])
createdAt = ApiService.decodeFlexibleString(from: container, keys: [.createdAt]) ?? fallbackDate
updatedAt = ApiService.decodeFlexibleString(from: container, keys: [.updatedAt]) ?? fallbackDate
}
}
struct PublicOrderResult: Codable, Identifiable {
let id: String
let shortId: String?
let realId: String?
let status: String?
let paymentStatus: String?
let paymentConfirmed: Bool?
let paymentMethod: String?
let paymentMethodCode: String?
let paymentPayload: CreateOrderPaymentPayload?
let payment: CreateOrderPaymentInfo?
let deliveryType: String?
let deliveryTypeLabel: String?
let total: Double?
let storeName: String?
let createdAt: String?
@@ -54,16 +77,23 @@ struct PublicOrderResult: Codable, Identifiable {
let otp: String?
let customerOtp: String?
let confirmOtp: String?
let cancellationReason: String?
let items: [PublicOrderItem]
let timeline: [PublicOrderTimelineEvent]
enum CodingKeys: String, CodingKey {
case id
case shortId
case realId
case status
case paymentStatus
case paymentConfirmed
case paymentMethod
case paymentMethodCode
case paymentPayload
case payment
case deliveryType
case deliveryTypeLabel
case total
case storeName
case createdAt
@@ -71,6 +101,7 @@ struct PublicOrderResult: Codable, Identifiable {
case otp
case customerOtp
case confirmOtp
case cancellationReason
case items
case timeline
}
@@ -78,10 +109,16 @@ struct PublicOrderResult: Codable, Identifiable {
init(
id: String,
shortId: String? = nil,
realId: String? = nil,
status: String? = nil,
paymentStatus: String? = nil,
paymentConfirmed: Bool? = nil,
paymentMethod: String? = nil,
paymentMethodCode: String? = nil,
paymentPayload: CreateOrderPaymentPayload? = nil,
payment: CreateOrderPaymentInfo? = nil,
deliveryType: String? = nil,
deliveryTypeLabel: String? = nil,
total: Double? = nil,
storeName: String? = nil,
createdAt: String? = nil,
@@ -89,15 +126,22 @@ struct PublicOrderResult: Codable, Identifiable {
otp: String? = nil,
customerOtp: String? = nil,
confirmOtp: String? = nil,
cancellationReason: String? = nil,
items: [PublicOrderItem] = [],
timeline: [PublicOrderTimelineEvent] = []
) {
self.id = id
self.shortId = shortId
self.realId = realId
self.status = status
self.paymentStatus = paymentStatus
self.paymentConfirmed = paymentConfirmed
self.paymentMethod = paymentMethod
self.paymentMethodCode = paymentMethodCode
self.paymentPayload = paymentPayload
self.payment = payment
self.deliveryType = deliveryType
self.deliveryTypeLabel = deliveryTypeLabel
self.total = total
self.storeName = storeName
self.createdAt = createdAt
@@ -105,25 +149,43 @@ struct PublicOrderResult: Codable, Identifiable {
self.otp = otp
self.customerOtp = customerOtp
self.confirmOtp = confirmOtp
self.cancellationReason = cancellationReason
self.items = items
self.timeline = timeline
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
id = (try? container.decode(String.self, forKey: .id)) ?? UUID().uuidString
shortId = try? container.decode(String.self, forKey: .shortId)
status = try? container.decode(String.self, forKey: .status)
paymentStatus = try? container.decode(String.self, forKey: .paymentStatus)
paymentMethod = try? container.decode(String.self, forKey: .paymentMethod)
deliveryType = try? container.decode(String.self, forKey: .deliveryType)
id = ApiService.decodeFlexibleString(from: container, keys: [.id]) ?? UUID().uuidString
shortId = ApiService.decodeFlexibleString(from: container, keys: [.shortId])
realId = ApiService.decodeFlexibleString(from: container, keys: [.realId])
status = ApiService.decodeFlexibleString(from: container, keys: [.status])
paymentStatus = ApiService.decodeFlexibleString(from: container, keys: [.paymentStatus])
paymentConfirmed = try? container.decode(Bool.self, forKey: .paymentConfirmed)
paymentMethod = ApiService.decodeFlexibleString(from: container, keys: [.paymentMethod])
paymentMethodCode = ApiService.decodeFlexibleString(from: container, keys: [.paymentMethodCode])
payment = try? container.decode(CreateOrderPaymentInfo.self, forKey: .payment)
if let objectPayload = try? container.decode(CreateOrderPaymentPayload.self, forKey: .paymentPayload) {
paymentPayload = objectPayload
} else if let stringPayload = try? container.decode(String.self, forKey: .paymentPayload) {
paymentPayload = CreateOrderPaymentPayload(
copyPaste: stringPayload,
qrCodeImage: nil,
expirationDate: nil
)
} else {
paymentPayload = nil
}
deliveryType = ApiService.decodeFlexibleString(from: container, keys: [.deliveryType])
deliveryTypeLabel = ApiService.decodeFlexibleString(from: container, keys: [.deliveryTypeLabel])
total = ApiService.decodeFlexibleDouble(from: container, keys: [.total])
storeName = try? container.decode(String.self, forKey: .storeName)
createdAt = try? container.decode(String.self, forKey: .createdAt)
updatedAt = try? container.decode(String.self, forKey: .updatedAt)
otp = try? container.decode(String.self, forKey: .otp)
customerOtp = try? container.decode(String.self, forKey: .customerOtp)
confirmOtp = try? container.decode(String.self, forKey: .confirmOtp)
storeName = ApiService.decodeFlexibleString(from: container, keys: [.storeName])
createdAt = ApiService.decodeFlexibleString(from: container, keys: [.createdAt])
updatedAt = ApiService.decodeFlexibleString(from: container, keys: [.updatedAt])
otp = ApiService.decodeFlexibleString(from: container, keys: [.otp])
customerOtp = ApiService.decodeFlexibleString(from: container, keys: [.customerOtp])
confirmOtp = ApiService.decodeFlexibleString(from: container, keys: [.confirmOtp])
cancellationReason = ApiService.decodeFlexibleString(from: container, keys: [.cancellationReason])
items = (try? container.decode([PublicOrderItem].self, forKey: .items)) ?? []
timeline = (try? container.decode([PublicOrderTimelineEvent].self, forKey: .timeline)) ?? []
}
@@ -152,6 +214,10 @@ struct PublicOrderResult: Codable, Identifiable {
}
var isPaymentConfirmed: Bool {
if let paymentConfirmed {
return paymentConfirmed
}
let payment = (paymentStatus ?? "").uppercased()
let currentStatus = (status ?? "").uppercased()
if Self.looksConfirmed(payment) || Self.looksConfirmed(currentStatus) {
@@ -226,21 +292,38 @@ struct PublicOrderItem: Codable, Identifiable {
struct PublicOrderTimelineEvent: Codable, Identifiable {
let id: String
let status: String?
let label: String?
let active: Bool?
let completed: Bool?
let message: String?
let time: String?
enum CodingKeys: String, CodingKey {
case id
case status
case label
case active
case completed
case message
case time
case createdAt
case updatedAt
}
init(id: String = UUID().uuidString, status: String?, message: String?, time: String?) {
init(
id: String = UUID().uuidString,
status: String?,
label: String? = nil,
active: Bool? = nil,
completed: Bool? = nil,
message: String?,
time: String?
) {
self.id = id
self.status = status
self.label = label
self.active = active
self.completed = completed
self.message = message
self.time = time
}
@@ -249,6 +332,9 @@ struct PublicOrderTimelineEvent: Codable, Identifiable {
let container = try decoder.container(keyedBy: CodingKeys.self)
id = (try? container.decode(String.self, forKey: .id)) ?? UUID().uuidString
status = try? container.decode(String.self, forKey: .status)
label = try? container.decode(String.self, forKey: .label)
active = try? container.decode(Bool.self, forKey: .active)
completed = try? container.decode(Bool.self, forKey: .completed)
message = try? container.decode(String.self, forKey: .message)
time = (try? container.decode(String.self, forKey: .time))
?? (try? container.decode(String.self, forKey: .createdAt))
@@ -259,6 +345,9 @@ struct PublicOrderTimelineEvent: Codable, Identifiable {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(id, forKey: .id)
try container.encodeIfPresent(status, forKey: .status)
try container.encodeIfPresent(label, forKey: .label)
try container.encodeIfPresent(active, forKey: .active)
try container.encodeIfPresent(completed, forKey: .completed)
try container.encodeIfPresent(message, forKey: .message)
try container.encodeIfPresent(time, forKey: .time)
}
@@ -272,6 +361,27 @@ struct OrderRealtimeUpdate: Decodable {
let status: String?
let paymentStatus: String?
let updatedAt: String?
enum CodingKeys: String, CodingKey {
case id
case shortId
case storeId
case userId
case status
case paymentStatus
case updatedAt
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
id = ApiService.decodeFlexibleString(from: container, keys: [.id])
shortId = ApiService.decodeFlexibleString(from: container, keys: [.shortId])
storeId = ApiService.decodeFlexibleString(from: container, keys: [.storeId])
userId = ApiService.decodeFlexibleString(from: container, keys: [.userId])
status = ApiService.decodeFlexibleString(from: container, keys: [.status])
paymentStatus = ApiService.decodeFlexibleString(from: container, keys: [.paymentStatus])
updatedAt = ApiService.decodeFlexibleString(from: container, keys: [.updatedAt])
}
}
extension CreateOrderResult {
@@ -281,7 +391,10 @@ extension CreateOrderResult {
shortId: shortId,
status: status,
paymentStatus: paymentStatus,
paymentMethod: paymentMethod
paymentConfirmed: paymentConfirmed,
paymentMethod: paymentMethod,
paymentPayload: paymentPayload,
payment: payment
)
}
}