1Fetch Client API

<back to all web services

Order

The following routes are available for this service:
GET/orderGet order information.If you do not specify an OrderId, the results will be paged.
import datetime
import decimal
from marshmallow.fields import *
from servicestack import *
from typing import *
from dataclasses import dataclass, field
from dataclasses_json import dataclass_json, LetterCase, Undefined, config
from enum import Enum, IntEnum


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class ApiServiceRequest(IServiceRequest, IHasApiKey):
    # @ApiMember(DataType="string", Description="The API Key required for authentication", IsRequired=true)
    api_key: Optional[str] = None
    """
    The API Key required for authentication
    """


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class ApiServiceResponse(IServiceResponse):
    # @ApiMember(Description="Information about the response.", IsRequired=true)
    description: Optional[str] = None
    """
    Information about the response.
    """


    # @ApiMember(Description="Heading or summary of the response.", IsRequired=true)
    heading: Optional[str] = None
    """
    Heading or summary of the response.
    """


    # @ApiMember(DataType="boolean", Description="Did the intended operation for this response complete successfully?", IsRequired=true)
    was_successful: bool = False
    """
    Did the intended operation for this response complete successfully?
    """


class OrderStatus(IntEnum):
    AWAITING_PAYMENT = 0
    PROCESSING_PAYMENT = 1
    AWAITING_DISPATCH = 2
    DRIVER_DISPATCHED = 3
    PACKAGE_EN_ROUTE = 4
    COMPLETED = 5
    CANCELLED = 6
    DELIVERY_FAILED = 7


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class ScanDetail:
    # @ApiMember(Description="List of URLs for images captured at the waypoint")
    photo_urls: Optional[List[str]] = None
    """
    List of URLs for images captured at the waypoint
    """


    # @ApiMember(Description="List of URLs for images of signatures captured at the waypoint")
    signature_urls: Optional[List[str]] = None
    """
    List of URLs for images of signatures captured at the waypoint
    """


    # @ApiMember(Description="Name of person the driver interacted with at the waypoint")
    received_by: Optional[str] = None
    """
    Name of person the driver interacted with at the waypoint
    """


    # @ApiMember(Description="The date the driver interacted with the person")
    received_date: Optional[str] = None
    """
    The date the driver interacted with the person
    """


    # @ApiMember(Description="Number of packages collected by the driver")
    packages_collected: int = 0
    """
    Number of packages collected by the driver
    """


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class OrderItemWaypoint:
    # @ApiMember(Description="Has the driver completed this waypoint")
    completed: bool = False
    """
    Has the driver completed this waypoint
    """


    latitude: float = 0.0
    longitude: float = 0.0
    address: Optional[str] = None
    contact_name: Optional[str] = None
    contact_number: Optional[str] = None
    delivery_instructions: Optional[str] = None
    # @ApiMember(Description="Details captured at waypoint")
    scan_detail: Optional[ScanDetail] = None
    """
    Details captured at waypoint
    """


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class OrderTransitPoint:
    # @ApiMember(Description="Origin waypoint number")
    from_waypoint_number: int = 0
    """
    Origin waypoint number
    """


    # @ApiMember(Description="Destination waypoint number")
    to_waypoint_number: int = 0
    """
    Destination waypoint number
    """


    # @ApiMember(Description="Distance between waypoints")
    distance: float = 0.0
    """
    Distance between waypoints
    """


    # @ApiMember(Description="Distance between waypoints rounded and converted to a string")
    distance_value: Optional[str] = None
    """
    Distance between waypoints rounded and converted to a string
    """


    # @ApiMember(Description="Price calculated between waypoints")
    price: Decimal = decimal.Decimal(0)
    """
    Price calculated between waypoints
    """


    # @ApiMember(Description="Price calculated between waypoints formatted as ZA currency")
    price_value: Optional[str] = None
    """
    Price calculated between waypoints formatted as ZA currency
    """


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class EventDetail:
    description: Optional[str] = None
    time: Optional[str] = None
    event_date_time: datetime.datetime = datetime.datetime(1, 1, 1)


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class OrderDetail:
    # @ApiMember(Description="ID of quote attached to the order")
    quote_id: Optional[str] = None
    """
    ID of quote attached to the order
    """


    # @ApiMember(Description="ID of order")
    order_id: Optional[str] = None
    """
    ID of order
    """


    # @ApiMember(Description="User friendly order identifier")
    waybill: Optional[str] = None
    """
    User friendly order identifier
    """


    # @ApiMember(Description="Invoice number for the order")
    invoice_number: Optional[str] = None
    """
    Invoice number for the order
    """


    # @ApiMember(Description="The date and time the order is scheduled for in ISO 8601 string format, will be set if IsScheduled is true")
    scheduled_date: Optional[str] = None
    """
    The date and time the order is scheduled for in ISO 8601 string format, will be set if IsScheduled is true
    """


    # @ApiMember(Description="Order status number")
    order_status: Optional[OrderStatus] = None
    """
    Order status number
    """


    # @ApiMember(Description="String value of order status")
    order_status_value: Optional[str] = None
    """
    String value of order status
    """


    # @ApiMember(Description="List of waypoints for this order")
    waypoints: Optional[List[OrderItemWaypoint]] = None
    """
    List of waypoints for this order
    """


    # @ApiMember(Description="List of sections between waypoints")
    transit_points: Optional[List[OrderTransitPoint]] = None
    """
    List of sections between waypoints
    """


    # @ApiMember(Description="Order Final price including VAT")
    final_price: Decimal = decimal.Decimal(0)
    """
    Order Final price including VAT
    """


    # @ApiMember(Description="Final price formatted as ZA currency")
    final_price_value: Optional[str] = None
    """
    Final price formatted as ZA currency
    """


    # @ApiMember(Description="Total distance for the order in km")
    total_distance: float = 0.0
    """
    Total distance for the order in km
    """


    # @ApiMember(Description="Total distance for the order formatted as a string")
    total_distance_value: Optional[str] = None
    """
    Total distance for the order formatted as a string
    """


    # @ApiMember(Description="Date order was placed")
    date: Optional[str] = None
    """
    Date order was placed
    """


    # @ApiMember(Description="Google encoded maps polyline path for drawing route on a google map")
    encoded_poly_path: Optional[str] = None
    """
    Google encoded maps polyline path for drawing route on a google map
    """


    # @ApiMember(Description="List of events as they occurred while the order was in progress")
    events: Optional[List[EventDetail]] = None
    """
    List of events as they occurred while the order was in progress
    """


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class OrderResponse(ApiServiceResponse):
    # @ApiMember(Description="List with order details, will only contain one item if requested with order id")
    order_items: Optional[List[OrderDetail]] = None
    """
    List with order details, will only contain one item if requested with order id
    """


    # @ApiMember(Description="Total number of items in order collection")
    total_count: int = 0
    """
    Total number of items in order collection
    """


    # @ApiMember(Description="Used to indicate if there are more items available")
    last_page: bool = False
    """
    Used to indicate if there are more items available
    """


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class Order(ApiServiceRequest, ILogRequest):
    # @ApiMember(Description="The ID if getting specific order")
    order_id: Optional[str] = None
    """
    The ID if getting specific order
    """


    # @ApiMember(Description="The amount of elements to offset the index by")
    offset: int = 0
    """
    The amount of elements to offset the index by
    """


    # @ApiMember(Description="The number of elements to be returned, defaults to 10")
    count: int = 0
    """
    The number of elements to be returned, defaults to 10
    """

Python Order DTOs

To override the Content-type in your clients, use the HTTP Accept Header, append the .csv suffix or ?format=csv

HTTP + CSV

The following are sample HTTP requests and responses. The placeholders shown need to be replaced with actual values.

GET /order HTTP/1.1 
Host: api.1fetch.co.za 
Accept: text/csv
HTTP/1.1 200 OK
Content-Type: text/csv
Content-Length: length

{"OrderItems":[{"QuoteId":"00000000-0000-0000-0000-000000000000","OrderId":"00000000-0000-0000-0000-000000000000","Waybill":"String","InvoiceNumber":"String","ScheduledDate":"String","OrderStatus":0,"OrderStatusValue":"String","Waypoints":[{}],"TransitPoints":[{}],"FinalPrice":0,"FinalPriceValue":"String","TotalDistance":0,"TotalDistanceValue":"String","Date":"String","EncodedPolyPath":"String","Events":[{}]}],"TotalCount":0,"LastPage":false,"Description":"String","Heading":"String","WasSuccessful":false}