The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

WebService::DPD::API

WARNING

This module is depreciated. It will be replaced by WebService::GeoPost::DPD, this is allow expanding the namespace to accomodate other API services provided by GeoPost.

SYNOPSIS

    $dpd = WebService::DPD::API->new(
                                        username => $username,
                                        password => $password,
                                        geoClient => "account/$customer_id",
                                        );

DESCRIPTION

This module provides a simple wrapper around DPD delivery service API. This is a work in progress and contains incomplete test code, methods are likely to be refactored, you have been warned.

METHODS

login

Authenticates and establishes api session used by following methods

        $dpd->login;

get_country( $code )

Retrieves the country details for a provided country code and can be used to determine if a country requires a postcode or if liability is allowed etc.

        $country = $dpd->get_country( 'GB' );
        

get_services( \%shipping_information )

Retrieves list of services available for provided shipping information.

    my $address = {
                    countryCode     => 'GB',
                    county          => 'West Midlands',
                    locality        => 'Birmingham',
                    organisation    => 'GeoPost',
                    postcode        => 'B661BY',
                    property        => 'GeoPost UK',
                    street          => 'Roebuck Ln',
                    town            => 'Smethwick',
                    };

    my $shipping = {
                        collectionDetails   => {
                                                    address => $address,
                                                    },
                        deliveryDetails     => {
                                                    address => $address,
                                                    },
                        deliveryDirection   => 1, # 1 for outbound 2 for inbound
                        numberOfParcels     => 1,
                        totalWeight         => 5,
                        shipmentType        => 0, # 1 or 2 if a collection on delivery or swap it service is required 
                        };

    my $services = $dpd->get_services( $shipping );

get_service( geoServiceCode )

Retrieves the supported countries for a geoServiceCode

        $service = $dpd->get_service(812);

create_shipment( \%data )

Creates a shipment object

        my $shipment_data = {
                                                        jobId => 'null',
                                                        collectionOnDelivery =>  "false",
                                                        invoice =>  "null",
                                                        collectionDate =>  $date,
                                                        consolidate =>  "false",
                                                        consignment => [
                                                                                                {
                                                                                                        collectionDetails => {
                                                                                                                                                        contactDetails => {
                                                                                                                                                                                                contactName => "Mr David Smith",
                                                                                                                                                                                                telephone => "0121 500 2500"
                                                                                                                                                                                                },
                                                                                                                                                        address => $address,
                                                                                                                                                        },
                                                                                                        deliveryDetails => {
                                                                                                                                                        contactDetails => {
                                                                                                                                                                                                contactName => "Mr David Smith",
                                                                                                                                                                                                telephone => "0121 500 2500"
                                                                                                                                                                                                                                },
                                                                                                                                                        notificationDetails => {
                                                                                                                                                                                                        mobile => "07921 123456",
                                                                                                                                                                                                        email => 'david.smith@acme.com',
                                                                                                                                                                                                        },
                                                                                                                                                        address => {
                                                                                                                                                                                organisation => "ACME Ltd",
                                                                                                                                                                                property => "Miles Industrial Estate",
                                                                                                                                                                                street => "42 Bridge Road",
                                                                                                                                                                                locality => "",
                                                                                                                                                                                town => "Birmingham",
                                                                                                                                                                                county => "West Midlands",
                                                                                                                                                                                postcode => "B1 1AA",
                                                                                                                                                                                countryCode => "GB",
                                                                                                                                                                                }
                                                                                                                                                },
                                                                                                        networkCode => "1^12",
                                                                                                        numberOfParcels => '1',
                                                                                                        totalWeight => '5',
                                                                                                        shippingRef1 => "Catalogue Batch 1",
                                                                                                        shippingRef2 => "Invoice 231",
                                                                                                        shippingRef3 => "",
                                                                                                        customsValue => '0',
                                                                                                        deliveryInstructions => "Please deliver to industrial gate A",
                                                                                                        parcelDescription => "",
                                                                                                        liabilityValue => '0',
                                                                                                        liability => "false",
                                                                                                        parcels => [],
                                                                                                        consignmentNumber => "null",
                                                                                                        consignmentRef =>  "null",
                                                                                                }
                                                                                        ]
                                                };


        $shipment = $dpd->create_shipment( $shipment_data_example );

list_countries

Provides a full list of available shipping countries

        $countries = $dpd->list_countries;

get_labels( $shipment_id, $format )

Get label for given shipment id, available in multiple formats

        $label = $dpd->get_labels( $shipment_id, 'application/pdf' );

FUTURE METHODS

These methods are implemented as documented in the DPD API specification. Although at the time of writing their functionality has not been publicly implemented within the API.

request_job_id

Get a job id to group shipments

        $job_id = $dpd->request_jobid;

get_labels_for_job( $id, $format )

Retrieves all labels for a given job id

        $labels = $dpd->get_labels_for_job( $id, $format );

get_shipments( \%search_params )

Retrieves a full list of shipments meeting the search criteria and/or collection date. If no URL parameters are set the default settings brings back the first 100 shipments found.

    $shipments = $self->get_shipments( {
                                            collectionDate => $date,
                                            searchCriterea => 'foo',
                                            searchPage     => 1,
                                            searchPageSize => 20,
                                            useTemplate    => false,
                                        });

get_shipment( $id )

Retrieves all shipment information associated with a shipment id

        $shipment = $dpd->get_shipment( $id );

get_international_invoice( $shipment_id )

Creates and returns an international invoice associated with the given shipment id.

        $invoice = $dpd->get_international_invoice( $shipment_id );

get_unprinted_labels( $date, $format )

Retrieves all labels that have not already been printed for a particular collection date.

        $labels = $dpd->get_unprinted_labels( $date, $format );

delete_shipment( $id )

        Delete a shipment

        $dpd->delete_shipment( $id );

change_collection_date( $id, $date )

Update collection date for a shipment

        $dpd->change_collection_date( $id, $date );

void_shipment

Update status of shipment to void.

        $dpd->void_shipment( $id );

create_manifest

Tag all non manifested shipments for a collection date with a new generated manifest id.

        $manifest = $dpd->create_manifest( $date );

get_manifest_by_date( $date )

Retrieves all the manifests and the core manifest information for a particular collection date.

        $manifests = $dpd->get_manifest_by_date( $date );

get_manifest_by_id( $id )

Get printable manifest by its associated manifest id

        $manifest = get_manifest_by_id( $id );

INTERNAL METHODS

_to_query_params

Recursively converts hash of hashes into query string for http request

send_request( \%args )

Constructs and sends authenticated HTTP API request

    $result = $dpd->send_request( {
                                    type    => 'POST',                    # HTTP request type defaults to GET
                                    path    => "/path/to/service",        # Path to service
                                    data    => {                          # hashref of data for POST/PUT requests, converted to JSON for sending 
                                                    key1 => 'value1',
                                                    key2 => 'value2',
                                                },
                                    content_type => 'appilcation/json',   # defaults to application/json
                                    header  => {                          # hashref of additional headers
                                                    Accept => $format,
                                                }

                                    } );

SOURCE CODE

The source code for this module is held in a public git repository on Github : https://github.com/pryanet/WebService-DPD-API

LICENSE AND COPYRIGHT

Copyright (c) 2014 Richard Newsham, Pryanet Ltd

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

BUGS AND LIMITATIONS

See rt.cpan.org for current bugs, if any.

INCOMPATIBILITIES

None known.

DEPENDENCIES

        Carp
        Moo
        LWP::UserAgent
        LWP::Protocol::https
        HTTP::Request::Common
        URI::Escape
        Data::Dumper
        JSON
        MIME::Base64
        namespace::clean