module Deliveries::Couriers::MondialRelay

Constants

Config
STATUS_CODES
WSDL_ENDPOINT

Public Instance Methods

api_client() click to toggle source
# File lib/deliveries/couriers/mondial_relay.rb, line 27
def api_client
  Savon.client wsdl: WSDL_ENDPOINT,
               logger: Deliveries.logger,
               log: Deliveries.debug
end
calculate_security_param(params) click to toggle source
# File lib/deliveries/couriers/mondial_relay.rb, line 182
def calculate_security_param(params)
  Digest::MD5.hexdigest(params.map do |_, v|
                          v
                        end.join + Deliveries::Couriers::MondialRelay.config(:mondial_relay_key)).upcase
end
create_pickup(sender:, receiver:, parcels:, reference_code:, pickup_date: nil, remarks: nil, language: 'FR') click to toggle source
# File lib/deliveries/couriers/mondial_relay.rb, line 120
def create_pickup(sender:, receiver:, parcels:, reference_code:,
                  pickup_date: nil, remarks: nil, language: 'FR')
  params = Pickups::Create::FormatParams.new(
    sender: sender.courierize(:mondial_relay),
    receiver: receiver.courierize(:mondial_relay),
    parcels: parcels,
    reference_code: reference_code,
    pickup_date: pickup_date,
    remarks: remarks,
    language: language
  ).execute

  tracking_code, label_url = Shipments::Create.new(
    params: params
  ).execute.values_at(:tracking_code, :label_url)

  Deliveries::Pickup.new(
    courier_id: 'mondial_relay',
    sender: sender,
    receiver: receiver,
    parcels: parcels,
    reference_code: reference_code,
    tracking_code: tracking_code,
    pickup_date: pickup_date,
    label: Label.new(url: label_url)
  )
end
create_shipment(sender:, receiver:, parcels:, reference_code:, collection_point: nil, shipment_date: nil, remarks: nil, language: 'FR') click to toggle source
# File lib/deliveries/couriers/mondial_relay.rb, line 93
def create_shipment(sender:, receiver:, parcels:, reference_code:, collection_point: nil, shipment_date: nil, remarks: nil, language: 'FR')
  params = Shipments::Create::FormatParams.new(
    sender: sender.courierize(:mondial_relay),
    receiver: receiver.courierize(:mondial_relay),
    parcels: parcels,
    collection_point: collection_point,
    reference_code: reference_code,
    remarks: remarks,
    language: language
  ).execute

  tracking_code, label_url = Shipments::Create.new(
    params: params
  ).execute.values_at(:tracking_code, :label_url)

  Deliveries::Shipment.new(
    courier_id: 'mondial_relay',
    sender: sender,
    receiver: receiver,
    parcels: parcels,
    reference_code: reference_code,
    tracking_code: tracking_code,
    shipment_date: shipment_date,
    label: Label.new(url: label_url)
  )
end
get_collection_point(global_point_id:) click to toggle source
# File lib/deliveries/couriers/mondial_relay.rb, line 63
def get_collection_point(global_point_id:)
  global_point = Deliveries::CollectionPoint.parse_global_point_id(global_point_id: global_point_id)

  params = { 'Enseigne' => Deliveries::Couriers::MondialRelay.config(:mondial_relay_merchant),
             'Pays' => global_point.country, 'NumPointRelais' => global_point.point_id, 'Ville' => '',
             'CP' => '', 'Latitude' => '', 'Longitude' => '',
             'Taille' => '', 'Poids' => '', 'Action' => '',
             'DelaiEnvoi' => '0', 'RayonRecherche' => '', 'TypeActivite' => '', 'NACE' => '' }

  # Calculate security parameters.
  params['Security'] = calculate_security_param params

  response = api_client.call :wsi3_point_relais_recherche, message: params

  response_result = response.body.dig(:wsi3_point_relais_recherche_response,
                                      :wsi3_point_relais_recherche_result)

  point_relais_details = response_result.dig(:points_relais, :point_relais_details)

  if response_result[:stat] == '0' && point_relais_details.present?
    collection_point_params = CollectionPoints::Search::FormatResponse.new(response: point_relais_details).execute
    Deliveries::CollectionPoint.new(**collection_point_params)
  else
    raise Deliveries::APIError.new(
      StatusCodes.message_for(response_result[:stat].to_i),
      response_result[:stat]
    )
  end
end
get_collection_points(country:, postcode:) click to toggle source
# File lib/deliveries/couriers/mondial_relay.rb, line 33
def get_collection_points(country:, postcode:)
  # Build params needed by web service.
  params = { 'Enseigne' => Deliveries::Couriers::MondialRelay.config(:mondial_relay_merchant),
             'Pays' => country, 'NumPointRelais' => '', 'Ville' => '',
             'CP' => postcode, 'Latitude' => '', 'Longitude' => '',
             'Taille' => '', 'Poids' => '', 'Action' => '',
             'DelaiEnvoi' => '0', 'RayonRecherche' => '', 'TypeActivite' => '', 'NACE' => '' }
  # Calculate security parameters.
  params['Security'] = calculate_security_param params

  response = api_client.call :wsi3_point_relais_recherche, message: params
  # If response returns OK stat code.
  if (response_result = response.body[:wsi3_point_relais_recherche_response][:wsi3_point_relais_recherche_result]) &&
     response_result[:stat] == '0'

    collection_points = []
    [response_result.dig(:points_relais, :point_relais_details)].flatten.compact.each do |point_params|
      collection_point_params = CollectionPoints::Search::FormatResponse.new(response: point_params).execute
      collection_points << Deliveries::CollectionPoint.new(**collection_point_params)
    end

    collection_points
  else
    raise Deliveries::APIError.new(
      StatusCodes.message_for(response_result[:stat].to_i),
      response_result[:stat]
    )
  end
end
get_label(tracking_code:, language: 'FR') click to toggle source
# File lib/deliveries/couriers/mondial_relay.rb, line 164
def get_label(tracking_code:, language: 'FR')
  label_url = Labels::Generate.new(
    tracking_codes: tracking_code,
    language: language
  ).execute

  Deliveries::Label.new(url: label_url)
end
get_labels(tracking_codes:, language: 'FR') click to toggle source
# File lib/deliveries/couriers/mondial_relay.rb, line 173
def get_labels(tracking_codes:, language: 'FR')
  labels_url = Labels::Generate.new(
    tracking_codes: tracking_codes,
    language: language
  ).execute

  Deliveries::Labels.new(url: labels_url)
end
pickup_info(tracking_code:, language: 'FR') click to toggle source
# File lib/deliveries/couriers/mondial_relay.rb, line 160
def pickup_info(tracking_code:, language: 'FR')
  shipment_info(tracking_code: tracking_code, language: language)
end
shipment_info(tracking_code:, language: 'FR') click to toggle source
# File lib/deliveries/couriers/mondial_relay.rb, line 148
def shipment_info(tracking_code:, language: 'FR')
  response = Shipments::Trace.new(
    tracking_code: tracking_code,
    language: language
  ).execute

  tracking_info_params = Shipments::Trace::FormatResponse.new(response: response).execute

  tracking_info_params = tracking_info_params.merge(tracking_code: tracking_code)
  Deliveries::TrackingInfo.new(**tracking_info_params)
end