<?php

declare (strict_types=1);
namespace WPForms\Vendor\Square\Models;

use stdClass;
/**
 * Describes delivery details of an order fulfillment.
 */
class OrderFulfillmentDeliveryDetails implements \JsonSerializable
{
    /**
     * @var OrderFulfillmentRecipient|null
     */
    private $recipient;
    /**
     * @var string|null
     */
    private $scheduleType;
    /**
     * @var string|null
     */
    private $placedAt;
    /**
     * @var array
     */
    private $deliverAt = [];
    /**
     * @var array
     */
    private $prepTimeDuration = [];
    /**
     * @var array
     */
    private $deliveryWindowDuration = [];
    /**
     * @var array
     */
    private $note = [];
    /**
     * @var array
     */
    private $completedAt = [];
    /**
     * @var string|null
     */
    private $inProgressAt;
    /**
     * @var string|null
     */
    private $rejectedAt;
    /**
     * @var string|null
     */
    private $readyAt;
    /**
     * @var string|null
     */
    private $deliveredAt;
    /**
     * @var string|null
     */
    private $canceledAt;
    /**
     * @var array
     */
    private $cancelReason = [];
    /**
     * @var array
     */
    private $courierPickupAt = [];
    /**
     * @var array
     */
    private $courierPickupWindowDuration = [];
    /**
     * @var array
     */
    private $isNoContactDelivery = [];
    /**
     * @var array
     */
    private $dropoffNotes = [];
    /**
     * @var array
     */
    private $courierProviderName = [];
    /**
     * @var array
     */
    private $courierSupportPhoneNumber = [];
    /**
     * @var array
     */
    private $squareDeliveryId = [];
    /**
     * @var array
     */
    private $externalDeliveryId = [];
    /**
     * @var array
     */
    private $managedDelivery = [];
    /**
     * Returns Recipient.
     * Information about the fulfillment recipient.
     */
    public function getRecipient() : ?OrderFulfillmentRecipient
    {
        return $this->recipient;
    }
    /**
     * Sets Recipient.
     * Information about the fulfillment recipient.
     *
     * @maps recipient
     */
    public function setRecipient(?OrderFulfillmentRecipient $recipient) : void
    {
        $this->recipient = $recipient;
    }
    /**
     * Returns Schedule Type.
     * The schedule type of the delivery fulfillment.
     */
    public function getScheduleType() : ?string
    {
        return $this->scheduleType;
    }
    /**
     * Sets Schedule Type.
     * The schedule type of the delivery fulfillment.
     *
     * @maps schedule_type
     */
    public function setScheduleType(?string $scheduleType) : void
    {
        $this->scheduleType = $scheduleType;
    }
    /**
     * Returns Placed At.
     * The [timestamp](https://developer.squareup.com/docs/build-basics/working-with-dates)
     * indicating when the fulfillment was placed.
     * The timestamp must be in RFC 3339 format (for example, "2016-09-04T23:59:33.123Z").
     * Must be in RFC 3339 timestamp format, e.g., "2016-09-04T23:59:33.123Z".
     */
    public function getPlacedAt() : ?string
    {
        return $this->placedAt;
    }
    /**
     * Sets Placed At.
     * The [timestamp](https://developer.squareup.com/docs/build-basics/working-with-dates)
     * indicating when the fulfillment was placed.
     * The timestamp must be in RFC 3339 format (for example, "2016-09-04T23:59:33.123Z").
     * Must be in RFC 3339 timestamp format, e.g., "2016-09-04T23:59:33.123Z".
     *
     * @maps placed_at
     */
    public function setPlacedAt(?string $placedAt) : void
    {
        $this->placedAt = $placedAt;
    }
    /**
     * Returns Deliver At.
     * The [timestamp](https://developer.squareup.com/docs/build-basics/working-with-dates)
     * that represents the start of the delivery period.
     * When the fulfillment `schedule_type` is `ASAP`, the field is automatically
     * set to the current time plus the `prep_time_duration`.
     * Otherwise, the application can set this field while the fulfillment `state` is
     * `PROPOSED`, `RESERVED`, or `PREPARED` (any time before the
     * terminal state such as `COMPLETED`, `CANCELED`, and `FAILED`).
     *
     * The timestamp must be in RFC 3339 format
     * (for example, "2016-09-04T23:59:33.123Z").
     */
    public function getDeliverAt() : ?string
    {
        if (\count($this->deliverAt) == 0) {
            return null;
        }
        return $this->deliverAt['value'];
    }
    /**
     * Sets Deliver At.
     * The [timestamp](https://developer.squareup.com/docs/build-basics/working-with-dates)
     * that represents the start of the delivery period.
     * When the fulfillment `schedule_type` is `ASAP`, the field is automatically
     * set to the current time plus the `prep_time_duration`.
     * Otherwise, the application can set this field while the fulfillment `state` is
     * `PROPOSED`, `RESERVED`, or `PREPARED` (any time before the
     * terminal state such as `COMPLETED`, `CANCELED`, and `FAILED`).
     *
     * The timestamp must be in RFC 3339 format
     * (for example, "2016-09-04T23:59:33.123Z").
     *
     * @maps deliver_at
     */
    public function setDeliverAt(?string $deliverAt) : void
    {
        $this->deliverAt['value'] = $deliverAt;
    }
    /**
     * Unsets Deliver At.
     * The [timestamp](https://developer.squareup.com/docs/build-basics/working-with-dates)
     * that represents the start of the delivery period.
     * When the fulfillment `schedule_type` is `ASAP`, the field is automatically
     * set to the current time plus the `prep_time_duration`.
     * Otherwise, the application can set this field while the fulfillment `state` is
     * `PROPOSED`, `RESERVED`, or `PREPARED` (any time before the
     * terminal state such as `COMPLETED`, `CANCELED`, and `FAILED`).
     *
     * The timestamp must be in RFC 3339 format
     * (for example, "2016-09-04T23:59:33.123Z").
     */
    public function unsetDeliverAt() : void
    {
        $this->deliverAt = [];
    }
    /**
     * Returns Prep Time Duration.
     * The duration of time it takes to prepare and deliver this fulfillment.
     * The duration must be in RFC 3339 format (for example, "P1W3D").
     */
    public function getPrepTimeDuration() : ?string
    {
        if (\count($this->prepTimeDuration) == 0) {
            return null;
        }
        return $this->prepTimeDuration['value'];
    }
    /**
     * Sets Prep Time Duration.
     * The duration of time it takes to prepare and deliver this fulfillment.
     * The duration must be in RFC 3339 format (for example, "P1W3D").
     *
     * @maps prep_time_duration
     */
    public function setPrepTimeDuration(?string $prepTimeDuration) : void
    {
        $this->prepTimeDuration['value'] = $prepTimeDuration;
    }
    /**
     * Unsets Prep Time Duration.
     * The duration of time it takes to prepare and deliver this fulfillment.
     * The duration must be in RFC 3339 format (for example, "P1W3D").
     */
    public function unsetPrepTimeDuration() : void
    {
        $this->prepTimeDuration = [];
    }
    /**
     * Returns Delivery Window Duration.
     * The time period after `deliver_at` in which to deliver the order.
     * Applications can set this field when the fulfillment `state` is
     * `PROPOSED`, `RESERVED`, or `PREPARED` (any time before the terminal state
     * such as `COMPLETED`, `CANCELED`, and `FAILED`).
     * The duration must be in RFC 3339 format (for example, "P1W3D").
     */
    public function getDeliveryWindowDuration() : ?string
    {
        if (\count($this->deliveryWindowDuration) == 0) {
            return null;
        }
        return $this->deliveryWindowDuration['value'];
    }
    /**
     * Sets Delivery Window Duration.
     * The time period after `deliver_at` in which to deliver the order.
     * Applications can set this field when the fulfillment `state` is
     * `PROPOSED`, `RESERVED`, or `PREPARED` (any time before the terminal state
     * such as `COMPLETED`, `CANCELED`, and `FAILED`).
     * The duration must be in RFC 3339 format (for example, "P1W3D").
     *
     * @maps delivery_window_duration
     */
    public function setDeliveryWindowDuration(?string $deliveryWindowDuration) : void
    {
        $this->deliveryWindowDuration['value'] = $deliveryWindowDuration;
    }
    /**
     * Unsets Delivery Window Duration.
     * The time period after `deliver_at` in which to deliver the order.
     * Applications can set this field when the fulfillment `state` is
     * `PROPOSED`, `RESERVED`, or `PREPARED` (any time before the terminal state
     * such as `COMPLETED`, `CANCELED`, and `FAILED`).
     * The duration must be in RFC 3339 format (for example, "P1W3D").
     */
    public function unsetDeliveryWindowDuration() : void
    {
        $this->deliveryWindowDuration = [];
    }
    /**
     * Returns Note.
     * Provides additional instructions about the delivery fulfillment.
     * It is displayed in the Square Point of Sale application and set by the API.
     */
    public function getNote() : ?string
    {
        if (\count($this->note) == 0) {
            return null;
        }
        return $this->note['value'];
    }
    /**
     * Sets Note.
     * Provides additional instructions about the delivery fulfillment.
     * It is displayed in the Square Point of Sale application and set by the API.
     *
     * @maps note
     */
    public function setNote(?string $note) : void
    {
        $this->note['value'] = $note;
    }
    /**
     * Unsets Note.
     * Provides additional instructions about the delivery fulfillment.
     * It is displayed in the Square Point of Sale application and set by the API.
     */
    public function unsetNote() : void
    {
        $this->note = [];
    }
    /**
     * Returns Completed At.
     * The [timestamp](https://developer.squareup.com/docs/build-basics/working-with-dates)
     * indicates when the seller completed the fulfillment.
     * This field is automatically set when  fulfillment `state` changes to `COMPLETED`.
     * The timestamp must be in RFC 3339 format (for example, "2016-09-04T23:59:33.123Z").
     */
    public function getCompletedAt() : ?string
    {
        if (\count($this->completedAt) == 0) {
            return null;
        }
        return $this->completedAt['value'];
    }
    /**
     * Sets Completed At.
     * The [timestamp](https://developer.squareup.com/docs/build-basics/working-with-dates)
     * indicates when the seller completed the fulfillment.
     * This field is automatically set when  fulfillment `state` changes to `COMPLETED`.
     * The timestamp must be in RFC 3339 format (for example, "2016-09-04T23:59:33.123Z").
     *
     * @maps completed_at
     */
    public function setCompletedAt(?string $completedAt) : void
    {
        $this->completedAt['value'] = $completedAt;
    }
    /**
     * Unsets Completed At.
     * The [timestamp](https://developer.squareup.com/docs/build-basics/working-with-dates)
     * indicates when the seller completed the fulfillment.
     * This field is automatically set when  fulfillment `state` changes to `COMPLETED`.
     * The timestamp must be in RFC 3339 format (for example, "2016-09-04T23:59:33.123Z").
     */
    public function unsetCompletedAt() : void
    {
        $this->completedAt = [];
    }
    /**
     * Returns In Progress At.
     * The [timestamp](https://developer.squareup.com/docs/build-basics/working-with-dates)
     * indicates when the seller started processing the fulfillment.
     * This field is automatically set when the fulfillment `state` changes to `RESERVED`.
     * The timestamp must be in RFC 3339 format (for example, "2016-09-04T23:59:33.123Z").
     */
    public function getInProgressAt() : ?string
    {
        return $this->inProgressAt;
    }
    /**
     * Sets In Progress At.
     * The [timestamp](https://developer.squareup.com/docs/build-basics/working-with-dates)
     * indicates when the seller started processing the fulfillment.
     * This field is automatically set when the fulfillment `state` changes to `RESERVED`.
     * The timestamp must be in RFC 3339 format (for example, "2016-09-04T23:59:33.123Z").
     *
     * @maps in_progress_at
     */
    public function setInProgressAt(?string $inProgressAt) : void
    {
        $this->inProgressAt = $inProgressAt;
    }
    /**
     * Returns Rejected At.
     * The [timestamp](https://developer.squareup.com/docs/build-basics/working-with-dates)
     * indicating when the fulfillment was rejected. This field is
     * automatically set when the fulfillment `state` changes to `FAILED`.
     * The timestamp must be in RFC 3339 format (for example, "2016-09-04T23:59:33.123Z").
     */
    public function getRejectedAt() : ?string
    {
        return $this->rejectedAt;
    }
    /**
     * Sets Rejected At.
     * The [timestamp](https://developer.squareup.com/docs/build-basics/working-with-dates)
     * indicating when the fulfillment was rejected. This field is
     * automatically set when the fulfillment `state` changes to `FAILED`.
     * The timestamp must be in RFC 3339 format (for example, "2016-09-04T23:59:33.123Z").
     *
     * @maps rejected_at
     */
    public function setRejectedAt(?string $rejectedAt) : void
    {
        $this->rejectedAt = $rejectedAt;
    }
    /**
     * Returns Ready At.
     * The [timestamp](https://developer.squareup.com/docs/build-basics/working-with-dates)
     * indicating when the seller marked the fulfillment as ready for
     * courier pickup. This field is automatically set when the fulfillment `state` changes
     * to PREPARED.
     * The timestamp must be in RFC 3339 format (for example, "2016-09-04T23:59:33.123Z").
     */
    public function getReadyAt() : ?string
    {
        return $this->readyAt;
    }
    /**
     * Sets Ready At.
     * The [timestamp](https://developer.squareup.com/docs/build-basics/working-with-dates)
     * indicating when the seller marked the fulfillment as ready for
     * courier pickup. This field is automatically set when the fulfillment `state` changes
     * to PREPARED.
     * The timestamp must be in RFC 3339 format (for example, "2016-09-04T23:59:33.123Z").
     *
     * @maps ready_at
     */
    public function setReadyAt(?string $readyAt) : void
    {
        $this->readyAt = $readyAt;
    }
    /**
     * Returns Delivered At.
     * The [timestamp](https://developer.squareup.com/docs/build-basics/working-with-dates)
     * indicating when the fulfillment was delivered to the recipient.
     * The timestamp must be in RFC 3339 format (for example, "2016-09-04T23:59:33.123Z").
     */
    public function getDeliveredAt() : ?string
    {
        return $this->deliveredAt;
    }
    /**
     * Sets Delivered At.
     * The [timestamp](https://developer.squareup.com/docs/build-basics/working-with-dates)
     * indicating when the fulfillment was delivered to the recipient.
     * The timestamp must be in RFC 3339 format (for example, "2016-09-04T23:59:33.123Z").
     *
     * @maps delivered_at
     */
    public function setDeliveredAt(?string $deliveredAt) : void
    {
        $this->deliveredAt = $deliveredAt;
    }
    /**
     * Returns Canceled At.
     * The [timestamp](https://developer.squareup.com/docs/build-basics/working-with-dates)
     * indicating when the fulfillment was canceled. This field is automatically
     * set when the fulfillment `state` changes to `CANCELED`.
     *
     * The timestamp must be in RFC 3339 format (for example, "2016-09-04T23:59:33.123Z").
     */
    public function getCanceledAt() : ?string
    {
        return $this->canceledAt;
    }
    /**
     * Sets Canceled At.
     * The [timestamp](https://developer.squareup.com/docs/build-basics/working-with-dates)
     * indicating when the fulfillment was canceled. This field is automatically
     * set when the fulfillment `state` changes to `CANCELED`.
     *
     * The timestamp must be in RFC 3339 format (for example, "2016-09-04T23:59:33.123Z").
     *
     * @maps canceled_at
     */
    public function setCanceledAt(?string $canceledAt) : void
    {
        $this->canceledAt = $canceledAt;
    }
    /**
     * Returns Cancel Reason.
     * The delivery cancellation reason. Max length: 100 characters.
     */
    public function getCancelReason() : ?string
    {
        if (\count($this->cancelReason) == 0) {
            return null;
        }
        return $this->cancelReason['value'];
    }
    /**
     * Sets Cancel Reason.
     * The delivery cancellation reason. Max length: 100 characters.
     *
     * @maps cancel_reason
     */
    public function setCancelReason(?string $cancelReason) : void
    {
        $this->cancelReason['value'] = $cancelReason;
    }
    /**
     * Unsets Cancel Reason.
     * The delivery cancellation reason. Max length: 100 characters.
     */
    public function unsetCancelReason() : void
    {
        $this->cancelReason = [];
    }
    /**
     * Returns Courier Pickup At.
     * The [timestamp](https://developer.squareup.com/docs/build-basics/working-with-dates)
     * indicating when an order can be picked up by the courier for delivery.
     * The timestamp must be in RFC 3339 format (for example, "2016-09-04T23:59:33.123Z").
     */
    public function getCourierPickupAt() : ?string
    {
        if (\count($this->courierPickupAt) == 0) {
            return null;
        }
        return $this->courierPickupAt['value'];
    }
    /**
     * Sets Courier Pickup At.
     * The [timestamp](https://developer.squareup.com/docs/build-basics/working-with-dates)
     * indicating when an order can be picked up by the courier for delivery.
     * The timestamp must be in RFC 3339 format (for example, "2016-09-04T23:59:33.123Z").
     *
     * @maps courier_pickup_at
     */
    public function setCourierPickupAt(?string $courierPickupAt) : void
    {
        $this->courierPickupAt['value'] = $courierPickupAt;
    }
    /**
     * Unsets Courier Pickup At.
     * The [timestamp](https://developer.squareup.com/docs/build-basics/working-with-dates)
     * indicating when an order can be picked up by the courier for delivery.
     * The timestamp must be in RFC 3339 format (for example, "2016-09-04T23:59:33.123Z").
     */
    public function unsetCourierPickupAt() : void
    {
        $this->courierPickupAt = [];
    }
    /**
     * Returns Courier Pickup Window Duration.
     * The time period after `courier_pickup_at` in which the courier should pick up the order.
     * The duration must be in RFC 3339 format (for example, "P1W3D").
     */
    public function getCourierPickupWindowDuration() : ?string
    {
        if (\count($this->courierPickupWindowDuration) == 0) {
            return null;
        }
        return $this->courierPickupWindowDuration['value'];
    }
    /**
     * Sets Courier Pickup Window Duration.
     * The time period after `courier_pickup_at` in which the courier should pick up the order.
     * The duration must be in RFC 3339 format (for example, "P1W3D").
     *
     * @maps courier_pickup_window_duration
     */
    public function setCourierPickupWindowDuration(?string $courierPickupWindowDuration) : void
    {
        $this->courierPickupWindowDuration['value'] = $courierPickupWindowDuration;
    }
    /**
     * Unsets Courier Pickup Window Duration.
     * The time period after `courier_pickup_at` in which the courier should pick up the order.
     * The duration must be in RFC 3339 format (for example, "P1W3D").
     */
    public function unsetCourierPickupWindowDuration() : void
    {
        $this->courierPickupWindowDuration = [];
    }
    /**
     * Returns Is No Contact Delivery.
     * Whether the delivery is preferred to be no contact.
     */
    public function getIsNoContactDelivery() : ?bool
    {
        if (\count($this->isNoContactDelivery) == 0) {
            return null;
        }
        return $this->isNoContactDelivery['value'];
    }
    /**
     * Sets Is No Contact Delivery.
     * Whether the delivery is preferred to be no contact.
     *
     * @maps is_no_contact_delivery
     */
    public function setIsNoContactDelivery(?bool $isNoContactDelivery) : void
    {
        $this->isNoContactDelivery['value'] = $isNoContactDelivery;
    }
    /**
     * Unsets Is No Contact Delivery.
     * Whether the delivery is preferred to be no contact.
     */
    public function unsetIsNoContactDelivery() : void
    {
        $this->isNoContactDelivery = [];
    }
    /**
     * Returns Dropoff Notes.
     * A note to provide additional instructions about how to deliver the order.
     */
    public function getDropoffNotes() : ?string
    {
        if (\count($this->dropoffNotes) == 0) {
            return null;
        }
        return $this->dropoffNotes['value'];
    }
    /**
     * Sets Dropoff Notes.
     * A note to provide additional instructions about how to deliver the order.
     *
     * @maps dropoff_notes
     */
    public function setDropoffNotes(?string $dropoffNotes) : void
    {
        $this->dropoffNotes['value'] = $dropoffNotes;
    }
    /**
     * Unsets Dropoff Notes.
     * A note to provide additional instructions about how to deliver the order.
     */
    public function unsetDropoffNotes() : void
    {
        $this->dropoffNotes = [];
    }
    /**
     * Returns Courier Provider Name.
     * The name of the courier provider.
     */
    public function getCourierProviderName() : ?string
    {
        if (\count($this->courierProviderName) == 0) {
            return null;
        }
        return $this->courierProviderName['value'];
    }
    /**
     * Sets Courier Provider Name.
     * The name of the courier provider.
     *
     * @maps courier_provider_name
     */
    public function setCourierProviderName(?string $courierProviderName) : void
    {
        $this->courierProviderName['value'] = $courierProviderName;
    }
    /**
     * Unsets Courier Provider Name.
     * The name of the courier provider.
     */
    public function unsetCourierProviderName() : void
    {
        $this->courierProviderName = [];
    }
    /**
     * Returns Courier Support Phone Number.
     * The support phone number of the courier.
     */
    public function getCourierSupportPhoneNumber() : ?string
    {
        if (\count($this->courierSupportPhoneNumber) == 0) {
            return null;
        }
        return $this->courierSupportPhoneNumber['value'];
    }
    /**
     * Sets Courier Support Phone Number.
     * The support phone number of the courier.
     *
     * @maps courier_support_phone_number
     */
    public function setCourierSupportPhoneNumber(?string $courierSupportPhoneNumber) : void
    {
        $this->courierSupportPhoneNumber['value'] = $courierSupportPhoneNumber;
    }
    /**
     * Unsets Courier Support Phone Number.
     * The support phone number of the courier.
     */
    public function unsetCourierSupportPhoneNumber() : void
    {
        $this->courierSupportPhoneNumber = [];
    }
    /**
     * Returns Square Delivery Id.
     * The identifier for the delivery created by Square.
     */
    public function getSquareDeliveryId() : ?string
    {
        if (\count($this->squareDeliveryId) == 0) {
            return null;
        }
        return $this->squareDeliveryId['value'];
    }
    /**
     * Sets Square Delivery Id.
     * The identifier for the delivery created by Square.
     *
     * @maps square_delivery_id
     */
    public function setSquareDeliveryId(?string $squareDeliveryId) : void
    {
        $this->squareDeliveryId['value'] = $squareDeliveryId;
    }
    /**
     * Unsets Square Delivery Id.
     * The identifier for the delivery created by Square.
     */
    public function unsetSquareDeliveryId() : void
    {
        $this->squareDeliveryId = [];
    }
    /**
     * Returns External Delivery Id.
     * The identifier for the delivery created by the third-party courier service.
     */
    public function getExternalDeliveryId() : ?string
    {
        if (\count($this->externalDeliveryId) == 0) {
            return null;
        }
        return $this->externalDeliveryId['value'];
    }
    /**
     * Sets External Delivery Id.
     * The identifier for the delivery created by the third-party courier service.
     *
     * @maps external_delivery_id
     */
    public function setExternalDeliveryId(?string $externalDeliveryId) : void
    {
        $this->externalDeliveryId['value'] = $externalDeliveryId;
    }
    /**
     * Unsets External Delivery Id.
     * The identifier for the delivery created by the third-party courier service.
     */
    public function unsetExternalDeliveryId() : void
    {
        $this->externalDeliveryId = [];
    }
    /**
     * Returns Managed Delivery.
     * The flag to indicate the delivery is managed by a third party (ie DoorDash), which means
     * we may not receive all recipient information for PII purposes.
     */
    public function getManagedDelivery() : ?bool
    {
        if (\count($this->managedDelivery) == 0) {
            return null;
        }
        return $this->managedDelivery['value'];
    }
    /**
     * Sets Managed Delivery.
     * The flag to indicate the delivery is managed by a third party (ie DoorDash), which means
     * we may not receive all recipient information for PII purposes.
     *
     * @maps managed_delivery
     */
    public function setManagedDelivery(?bool $managedDelivery) : void
    {
        $this->managedDelivery['value'] = $managedDelivery;
    }
    /**
     * Unsets Managed Delivery.
     * The flag to indicate the delivery is managed by a third party (ie DoorDash), which means
     * we may not receive all recipient information for PII purposes.
     */
    public function unsetManagedDelivery() : void
    {
        $this->managedDelivery = [];
    }
    /**
     * Encode this object to JSON
     *
     * @param bool $asArrayWhenEmpty Whether to serialize this model as an array whenever no fields
     *        are set. (default: false)
     *
     * @return array|stdClass
     */
    #[\ReturnTypeWillChange]
    public function jsonSerialize(bool $asArrayWhenEmpty = \false)
    {
        $json = [];
        if (isset($this->recipient)) {
            $json['recipient'] = $this->recipient;
        }
        if (isset($this->scheduleType)) {
            $json['schedule_type'] = $this->scheduleType;
        }
        if (isset($this->placedAt)) {
            $json['placed_at'] = $this->placedAt;
        }
        if (!empty($this->deliverAt)) {
            $json['deliver_at'] = $this->deliverAt['value'];
        }
        if (!empty($this->prepTimeDuration)) {
            $json['prep_time_duration'] = $this->prepTimeDuration['value'];
        }
        if (!empty($this->deliveryWindowDuration)) {
            $json['delivery_window_duration'] = $this->deliveryWindowDuration['value'];
        }
        if (!empty($this->note)) {
            $json['note'] = $this->note['value'];
        }
        if (!empty($this->completedAt)) {
            $json['completed_at'] = $this->completedAt['value'];
        }
        if (isset($this->inProgressAt)) {
            $json['in_progress_at'] = $this->inProgressAt;
        }
        if (isset($this->rejectedAt)) {
            $json['rejected_at'] = $this->rejectedAt;
        }
        if (isset($this->readyAt)) {
            $json['ready_at'] = $this->readyAt;
        }
        if (isset($this->deliveredAt)) {
            $json['delivered_at'] = $this->deliveredAt;
        }
        if (isset($this->canceledAt)) {
            $json['canceled_at'] = $this->canceledAt;
        }
        if (!empty($this->cancelReason)) {
            $json['cancel_reason'] = $this->cancelReason['value'];
        }
        if (!empty($this->courierPickupAt)) {
            $json['courier_pickup_at'] = $this->courierPickupAt['value'];
        }
        if (!empty($this->courierPickupWindowDuration)) {
            $json['courier_pickup_window_duration'] = $this->courierPickupWindowDuration['value'];
        }
        if (!empty($this->isNoContactDelivery)) {
            $json['is_no_contact_delivery'] = $this->isNoContactDelivery['value'];
        }
        if (!empty($this->dropoffNotes)) {
            $json['dropoff_notes'] = $this->dropoffNotes['value'];
        }
        if (!empty($this->courierProviderName)) {
            $json['courier_provider_name'] = $this->courierProviderName['value'];
        }
        if (!empty($this->courierSupportPhoneNumber)) {
            $json['courier_support_phone_number'] = $this->courierSupportPhoneNumber['value'];
        }
        if (!empty($this->squareDeliveryId)) {
            $json['square_delivery_id'] = $this->squareDeliveryId['value'];
        }
        if (!empty($this->externalDeliveryId)) {
            $json['external_delivery_id'] = $this->externalDeliveryId['value'];
        }
        if (!empty($this->managedDelivery)) {
            $json['managed_delivery'] = $this->managedDelivery['value'];
        }
        $json = \array_filter($json, function ($val) {
            return $val !== null;
        });
        return !$asArrayWhenEmpty && empty($json) ? new stdClass() : $json;
    }
}
