import Foundation struct CreateOrderPayload: Encodable { let customer: CreateOrderCustomerPayload let items: [CreateOrderItemPayload] let total: Double let paymentMethod: String let deliveryType: String let address: CreateOrderAddressPayload? } struct CreateOrderCustomerPayload: Encodable { let name: String let phone: String let email: String let asaasId: String? } struct CreateOrderItemPayload: Encodable { let productId: String let name: String let qty: Int let price: Double let addons: [CreateOrderAddonPayload] } struct CreateOrderAddonPayload: Encodable { let addonId: String let name: String let qty: Int let price: Double } struct CreateOrderAddressPayload: Encodable { let street: String let number: String let neighborhood: String let city: String? let state: String? let zip: String? let complement: String? } struct CreateOrderResult: Decodable { let id: String? let shortId: String? let status: String? let paymentStatus: String? let paymentMethod: String? let paymentPayload: CreateOrderPaymentPayload? let payment: CreateOrderPaymentInfo? enum CodingKeys: String, CodingKey { case id case shortId case status case paymentStatus case paymentMethod case paymentPayload case payment } init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) id = try? container.decode(String.self, forKey: .id) 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) 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 } } } struct CreateOrderPaymentInfo: Decodable { let method: String? let status: String? let pix: CreateOrderPaymentPayload? } struct CreateOrderPaymentPayload: Decodable { let copyPaste: String? let qrCodeImage: String? let expirationDate: String? enum CodingKeys: String, CodingKey { case copyPaste case payload case qrCodeImage case encodedImage case expirationDate } init(copyPaste: String?, qrCodeImage: String?, expirationDate: String?) { self.copyPaste = copyPaste self.qrCodeImage = qrCodeImage self.expirationDate = expirationDate } init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) copyPaste = (try? container.decode(String.self, forKey: .copyPaste)) ?? (try? container.decode(String.self, forKey: .payload)) qrCodeImage = (try? container.decode(String.self, forKey: .qrCodeImage)) ?? (try? container.decode(String.self, forKey: .encodedImage)) expirationDate = try? container.decode(String.self, forKey: .expirationDate) } } struct ValidateDeliveryAddressPayload: Encodable { let address: ValidateDeliveryAddressDataPayload } struct ValidateDeliveryAddressDataPayload: Encodable { let street: String? let number: String? let neighborhood: String? let city: String? let state: String? let zip: String? let lat: Double? let lng: Double? } struct ValidateDeliveryAddressResult: Decodable { let deliveryAllowed: Bool? let reasonCode: String? let reasonMessage: String? let deliveryMode: String? let distance: Double? let deliveryFee: Double? let deliveryTime: String? let sameCity: Bool? }