class Deliveries::Couriers::Envialia::Pickups::Create

Attributes

parcels[RW]
pickup_date[RW]
receiver[RW]
reference_code[RW]
remarks[RW]
sender[RW]
tracking_code[RW]

Public Class Methods

new(sender:, receiver:, parcels:, reference_code:, pickup_date:, remarks:, tracking_code:) click to toggle source
# File lib/deliveries/couriers/envialia/pickups/create.rb, line 14
def initialize(sender:, receiver:, parcels:,
               reference_code:, pickup_date:, remarks:, tracking_code:)

  self.sender = sender
  self.receiver = receiver
  self.parcels = parcels
  self.reference_code = reference_code
  self.pickup_date = pickup_date
  self.remarks = remarks
  self.tracking_code = tracking_code
end

Public Instance Methods

execute() click to toggle source
# File lib/deliveries/couriers/envialia/pickups/create.rb, line 26
def execute
  response = self.class.post(
    api_endpoint,
    body: body,
    headers: headers,
    debug_output: Deliveries.debug ? Deliveries.logger : nil
  )

  raise Deliveries::ClientError unless response.success?

  pickup_number = response.dig('Envelope', 'Body', 'WebServService___GrabaRecogida3Response', 'strCodOut')

  if pickup_number
    Deliveries::Pickup.new(
      courier_id: 'envialia',
      sender: sender,
      receiver: receiver,
      parcels: parcels,
      reference_code: reference_code,
      tracking_code: pickup_number,
      pickup_date: pickup_date
    )
  else
    exception = response.dig('Envelope', 'Body', 'Fault')

    if exception['faultcode'].eql?('Exception')
      exception_code, exception_str = exception['faultstring'].split(':')
    else
      exception_code = 400
      exception_str = exception['faultstring']
    end

    raise Deliveries::APIError.new(
      exception_str.strip,
      exception_code.to_i
    )
  end
end

Private Instance Methods

api_endpoint() click to toggle source
# File lib/deliveries/couriers/envialia/pickups/create.rb, line 128
def api_endpoint
  if Envialia.live?
    Envialia::ENVIALIA_ENDPOINT_LIVE
  else
    Envialia::ENVIALIA_ENDPOINT_TEST
  end
end
body() click to toggle source
# File lib/deliveries/couriers/envialia/pickups/create.rb, line 67
          def body
            <<~XML
              <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
                <soap:Header>
                <ROClientIDHeader xmlns="http://tempuri.org/">
                  <ID>#{session_id}</ID>
                </ROClientIDHeader>
                </soap:Header>
                <soap:Body>
                <WebServService___GrabaRecogida3 xmlns="http://tempuri.org/">
                  <strCod></strCod>
                  <strAlbaran>#{tracking_code}</strAlbaran>
                  <strCodAgeCargo>#{Deliveries.courier(:envialia).config(:agency_code)}</strCodAgeCargo>
                  <strCodAgeOri></strCodAgeOri>
                  <dtFecRec>#{pickup_date.strftime('%Y/%m/%d')}</dtFecRec>
                  <strNomOri>#{sender.name}</strNomOri>
                  <strPobOri>#{sender.city}</strPobOri>
                  <strDirOri>#{sender.street}</strDirOri>
                  <strCPOri>#{format_postcode(sender.postcode, sender.country)}</strCPOri>
                  <strTlfOri>#{sender.phone}</strTlfOri>
                  <strNomDes>#{receiver.name}</strNomDes>
                  <strPobDes>#{receiver.city}</strPobDes>
                  <strDirDes>#{receiver.street}</strDirDes>
                  <strCPDes>#{format_postcode(receiver.postcode, receiver.country)}</strCPDes>
                  <strTlfDes>#{receiver.phone}</strTlfDes>
                  <strCodPais>#{receiver.country}</strCodPais>
                  <intBul>#{parcels}</intBul>
                  <strCodTipoServ>72</strCodTipoServ>
                  <dPesoOri>0</dPesoOri>
                  <dAltoOri>0</dAltoOri>
                  <dAnchoOri>0</dAnchoOri>
                  <dLargoOri>0</dLargoOri>
                  <dReembolso>0</dReembolso>
                  <dValor>0</dValor>
                  <dAnticipo>0</dAnticipo>
                  <dCobCli>0</dCobCli>
                  <strObs>#{remarks}</strObs>
                  <boSabado>false</boSabado>
                  <boRetorno>false</boRetorno>
                  <boGestOri>false</boGestOri>
                  <boGestDes>false</boGestDes>
                  <boAnulado>false</boAnulado>
                  <boAcuse>false</boAcuse>
                  <strRef>#{reference_code}</strRef>
                  <dBaseImp>0</dBaseImp>
                  <dImpuesto>0</dImpuesto>
                  <boPorteDebCli>false</boPorteDebCli>
                  <strDesDirEmails>#{receiver.email}</strDesDirEmails>
                  <boCampo5>false</boCampo5>
                  <boPagoDUAImp>false</boPagoDUAImp>
                  <boPagoImpDes>false</boPagoImpDes>
                </WebServService___GrabaRecogida3>
              </soap:Body>
              </soap:Envelope>
            XML
          end
format_postcode(postcode, country) click to toggle source
# File lib/deliveries/couriers/envialia/pickups/create.rb, line 136
def format_postcode(postcode, country)
  if country.to_sym.downcase == :pt
    postcode&.split('-')&.first
  else
    postcode
  end
end
headers() click to toggle source
# File lib/deliveries/couriers/envialia/pickups/create.rb, line 124
def headers
  { 'Content-Type' => 'application/json;charset=UTF-8', 'Accept' => 'application/json' }
end