Skip to content

Ruby client for CDEK logistics service API

License

Notifications You must be signed in to change notification settings

sSmok/cdek_client

Β 
Β 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

12 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

CdekClient

Ruby ΠΊΠ»ΠΈΠ΅Π½Ρ‚ для API слуТбы доставки Π‘Π”Π­Πš (www.edostavka.com).

Установка

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² Gemfile:

gem 'cdek_client'

И Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ:

$ bundle

Или ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ:

$ gem install cdek_client

Начало Ρ€Π°Π±ΠΎΡ‚Ρ‹

Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ инстанс класса CdekClient::Client:

client = CdekClient::Client.new ВАШ_Π›ΠžΠ“Π˜Π, ВАШ_ΠŸΠΠ ΠžΠ›Π¬

Π’Ρ‹Π·ΠΎΠ²Ρ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса CdekClient::Result. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ хранится Π² Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π΅ data, ошибки (Ссли ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚) Π² errors. ΠŸΠΎΠ»Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ запроса (HTTParty) ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ· Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° response. НапримСр:

result = client.pickup_points cityid: 44
result.errors.any? # => false
result.data.length # => 20
result.data.each do |pickup_point|
  puts "#{pickup_point[:Code]} #{pickup_point[:Name]}"
end

result = client.pickup_points cityid: 9999
result.data.length # => 0
result.errors.inspect # => [#<CdekClient::PvzNotfoundError>]

Ошибки

ΠšΠ»Π°ΡΡΡ‹ ошибок Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ ΠΎΡ‚ CdekClient::Error:

  • StandardError
    • CdekClient::Error
      • CdekClient::ResponseError
      • CdekClient::APIError
        • CdekClient::AttributeEmptyError
        • CdekClient::AuthError
        • CdekClient::BarcodeDublError
        • etc ...
      • CdekClient::Calculator::Error
        • CdekClient::Calculator::APIError
          • CdekClient::Calculator::ApiVersionError
          • CdekClient::Calculator::AuthError
          • CdekClient::Calculator::DeliveryImpossibleError
          • etc ...

НапримСр:

# CdekClient::ResponseError
error.code # => 500
error.message # => internal server error

# Π”ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ классы CdekClient::APIError
error.class # => CdekClient::AttributeEmptyError
error.code # => ERR_ATTRIBUTE_EMPTY
error.message # => НС Π·Π°Π΄Π°Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°:NUMBER

# Π”ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ классы CdekClient::Calculator::APIError
error.class # => CdekClient::Calculator::DeliveryImpossibleError
error.code # => 3
error.message # => НСвозмоТно ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚ΡŒ доставку ΠΏΠΎ этому Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡŽ ΠΏΡ€ΠΈ Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… условиях

Для получСния ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ списка ошибок API ΠΎΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ с ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ ΠΊ API. Бписок классов ошибок ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² lib/cdek_client/errors.rb ΠΈ lib/cdek_client/calculator_errors.rb.

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹

Для получСния Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ с ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ ΠΊ API.

Π”Π°Ρ‚Ρ‹ ΠΈ врСмя ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ класса Date ΠΈ Time, Ρ‚Π°ΠΊ ΠΈ ΠΊΠ°ΠΊ строки Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°Ρ… %Y-%m-%d ΠΈ %Y-%m-%dT%H:%M:%S.

Бписок ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ² самовывоза

client.pickup_points
client.pickup_points filter_params

Π€ΠΎΡ€ΠΌΠ°Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²:

{
  cityid: 44,
  citypostcode: 656065
}

Бписок Π·Π°ΠΊΠ°Π·ΠΎΠ² Π½Π° доставку

client.new_orders params

Π€ΠΎΡ€ΠΌΠ°Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²:

{
  Number: 'НомСр Π°ΠΊΡ‚Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ°-ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ',
  Order: [
    {
      Number: 'НомСр отправлСния ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°',
      SendCityCode: 16196,
      RecCityCode: 270,
      RecipientName: 'John Doe',
      Phone: '123-456-789',
      TariffTypeCode: 1,
      # etc ...
      Address: {
        Street: 'НСкая ΡƒΠ»ΠΈΡ†Π°',
        House: '123',
        Flat: '456'
        PvzCode: 'ABC123'
      },
      Package: [
        {
          Number: 'НомСр ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ',
          Barcode: 'Π¨Ρ‚Ρ€ΠΈΡ…-ΠΊΠΎΠ΄ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ',
          Weight: 10,
          SizeA: 100,
          SizeB: 100,
          SizeC: 100,
          Item: [
            {
              WareKey: 'Артикул Ρ‚ΠΎΠ²Π°Ρ€Π°',
              Cost: 100,
              Payment: 0,
              Weight: 1,
              Amount: 1,
              Comment: 'НаимСнованиС Ρ‚ΠΎΠ²Π°Ρ€Π°'
            },
            {
              WareKey: 'Артикул Ρ‚ΠΎΠ²Π°Ρ€Π° 2'
              # etc ...
            }
          ]
        },
        {
          Number: 'НомСр ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ 2'
          # etc ...
        }
      ],
      AddService: {
        ServiceCode: 2
      }
    },
    {
      Number: 'НомСр отправлСния 2'
      # etc ...
    }
  ]
}

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Order, Package ΠΈ Item ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ…Π΅ΡˆΠ΅ΠΌ ΠΈΠ»ΠΈ массивом Ρ…Π΅ΡˆΠ΅ΠΉ, Ρ‚.Π΅.:

Order: { }
# ΠΈΠ»ΠΈ
Order: [{}, {}, ...]

ΠŸΡ€ΠΎΠ·Π²ΠΎΠ½ получатСля

client.new_schedule params

Π€ΠΎΡ€ΠΌΠ°Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²:

{
  Order: [
    {
      DispatchNumber: 'НомСр отправлСния Π‘Π”Π­Πš',
      Number: 'НомСр отправлСния ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°',
      Date: Date.today,
      Attempt: {
        Date: Date.today,
        RecipientName: 'John Doe',
        # etc ...
        Address: {
          Street: 'НСкая ΡƒΠ»ΠΈΡ†Π°',
          House: '123',
          Flat: '456',
          # etc ...
          Package: [
            {
              Number: 'НомСр ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ',
              Item: [
                {
                  WareKey: 'Артикул Ρ‚ΠΎΠ²Π°Ρ€Π°',
                  Payment: 100
                },
                {
                  WareKey: 'Артикул Ρ‚ΠΎΠ²Π°Ρ€Π° 2'
                  Payment: 200
                },
                # etc ...
              ]
            },
            {
              Number: 'НомСр ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ 2',
              # etc ...
            },
            # etc ...
          ]
        }
      }
    },
    {
      DispatchNumber: 'НомСр отправлСния Π‘Π”Π­Πš 2',
      # etc ...
    },
    # etc ...
  ]
}

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Order, Package ΠΈ Item ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ…Π΅ΡˆΠ΅ΠΌ ΠΈΠ»ΠΈ массивом Ρ…Π΅ΡˆΠ΅ΠΉ.

Π’Ρ‹Π·ΠΎΠ² ΠΊΡƒΡ€ΡŒΠ΅Ρ€Π°

client.call_courier params

Π€ΠΎΡ€ΠΌΠ°Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²:

{
  Call: [
    {
      Date: Date.today,
      SendCityCode: 65,
      TimeBeg: '12:00',
      TimeEnd: '16:00',
      SenderName: 'John Doe',
      SendPhone: '123-456-789',
      # etc ...
      Address: {
        Street: 'НСкая ΡƒΠ»ΠΈΡ†Π°',
        House: '123',
        Flat: '456'
      } 
    },
    {
      Date: Date.today.next_day,
      # etc ...
    },
    # etc ...
  ]

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Call ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ…Π΅ΡˆΠ΅ΠΌ ΠΈΠ»ΠΈ массивом Ρ…Π΅ΡˆΠ΅ΠΉ.

Бписок Π·Π°ΠΊΠ°Π·ΠΎΠ² Π½Π° ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅

client.delete_orders params

Π€ΠΎΡ€ΠΌΠ°Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²:

{
  Number: 'НомСр Π°ΠΊΡ‚Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ°-ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ',
  Order: [
    { Number: 'НомСр отправлСния ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° 1' },
    { Number: 'НомСр отправлСния ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° 2' },
    # etc ...
  ]

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Order ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ…Π΅ΡˆΠ΅ΠΌ ΠΈΠ»ΠΈ массивом Ρ…Π΅ΡˆΠ΅ΠΉ.

Бтатусы Π·Π°ΠΊΠ°Π·ΠΎΠ²

client.order_statuses
client.order_statuses filter_params

Π€ΠΎΡ€ΠΌΠ°Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²:

{
  ShowHistory: 1,
  ChangePeriod: {
    DateFirst: Date.today,
    DateLast: Date.today
  },
  Order: {
    DispatchNumber: 'НомСр отправлСния Π‘Π”Π­Πš',
    Number: 'НомСр отправлСния ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°',
    Date: Date.today
  }
}

Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ ΠΏΠΎ Π·Π°ΠΊΠ°Π·Π°ΠΌ

client.order_infos filter_params

Π€ΠΎΡ€ΠΌΠ°Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²:

{
  ChangePeriod: {
    DateBeg: Date.today,
    DateEnd: Date.today
  },
  Order: {
    DispatchNumber: 'НомСр отправлСния Π‘Π”Π­Πš',
    Number: 'НомСр отправлСния ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°',
    Date: Date.today
  }
}

ΠŸΠ΅Ρ‡Π°Ρ‚Π½Π°Ρ Ρ„ΠΎΡ€ΠΌΠ° ΠΊΠ²ΠΈΡ‚Π°Π½Ρ†ΠΈΠΈ ΠΊ Π·Π°ΠΊΠ°Π·Ρƒ

client.orders_print params

Π€ΠΎΡ€ΠΌΠ°Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²:

{
  CopyCount: 1,
  Order: {
    DispatchNumber: 'НомСр отправлСния Π‘Π”Π­Πš',
    Number: 'НомСр отправлСния ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°',
    Date: Date.today
  }
}

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Order ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ…Π΅ΡˆΠ΅ΠΌ ΠΈΠ»ΠΈ массивом Ρ…Π΅ΡˆΠ΅ΠΉ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования:

result = client.orders_print Order: { DispatchNumber: '123456' }
if result.errors.any?
  result.errors.each do |e|
    puts "#{e.code} - #{e.message}"
  end
else
  file_path = '/path/to/file.pdf'
  File.open(file_path, 'w') { |f| f.write result.data }
end

Расчёт стоимости доставки

client.calculate_price params

Π€ΠΎΡ€ΠΌΠ°Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²:

{
  dateExecute: Date.today,
  senderCityId: 270,
  receiverCityId: 44,
  tariffId: 137,
  tariffList: [
    # ...
  ],
  modeId: 1,
  goods: [
    {
      weight: 1,
      length: 1,
      width: 1,
      height: 1,
      # ΠΈΠ»ΠΈ
      volume: 1
    },
    # etc ...
  ]
}

ИспользованиС ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π° Π±Π΅Π· Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ:

calculator = CdekClient::CalculatorClient.new
result = calculator.calculate params

TODO

  • ВСсты
  • Π£Π»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ xml Π² Ρ…Π΅Ρˆ ΠΈ ΠΎΡ‚Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…

Бсылки

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ΅ ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚-ΠΌΠ°Π³Π°Π·ΠΈΠ½Π° Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠ½Ρ‹Ρ… ΠΈΠ³Ρ€ "Π’Π°Π½Π³ΠΎ ΠΈ Кэш"

About

Ruby client for CDEK logistics service API

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Ruby 100.0%