oca-epak 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9c5f04a073183bc57a5503b8a5c677a01e45aa21
4
- data.tar.gz: a24c7b70efa907c1b263caf863e2b7cd3e285a9e
3
+ metadata.gz: eeede2d0da740bfb15092074d0d39c538874d439
4
+ data.tar.gz: 8e3a86749633428e59c54752f7cc7063758f0171
5
5
  SHA512:
6
- metadata.gz: 19683eaa6a9815526daffbd659240d5e99cd0e55b15a8d657d46f97f7e25b8ba33741468173bc5c058aaad78a397847bd9050f0ee4c645fb57f035865b6c3a43
7
- data.tar.gz: c9257ce2e186a08c5ffe1e67004f73504113c56007a27ffedc6d81be57cf005b38105dfa83d82baf8e958b587c2bcb53bee576eb7607a3adfd9b6591cf5e31fb
6
+ metadata.gz: 425848307e4ac16a2fdfaf92578ad2b7f687c038262bb9756a4c3db5655e79fc69df0d98b24bef88c87ba755689e45aec03e7d900c2e1d04ae610c3fba85f73d
7
+ data.tar.gz: c042b2dd09704baf5853924121ececcc4d01cda14375cb009a57eb677d838337a94cbf487880ba21caa4fea3c624a4326dfe27a2c52b7c9828a4f52a61ca886e
data/lib/oca-epak.rb CHANGED
@@ -1,160 +1,7 @@
1
1
  require 'savon'
2
2
  require 'erb'
3
3
  require 'ostruct'
4
+ require 'oca-epak/client'
4
5
  require 'oca-epak/pickup_data'
5
- require 'oca-epak/errors/error'
6
+ require 'oca-epak/errors/generic_error'
6
7
  require 'oca-epak/errors/bad_request'
7
-
8
- module Oca
9
- class Epak
10
- attr_reader :client
11
- attr_accessor :username, :password
12
-
13
- WSDL = 'http://webservice.oca.com.ar/epak_tracking/Oep_TrackEPak.asmx?wsdl'.freeze
14
-
15
- def initialize(username, password)
16
- @client = Savon.client(wsdl: WSDL)
17
- @username = username
18
- @password = password
19
- end
20
-
21
- # Checks if the user has input valid credentials
22
- #
23
- # @return [Boolean] Whether the credentials entered are valid or not
24
- def check_credentials
25
- method = :get_epack_user
26
- opts = { "usr" => username, "psw" => password }
27
- response = client.call(method, message: opts)
28
- parse_results_table(response, method)[:existe] == "1"
29
- end
30
-
31
- # Checks whether the operation is valid
32
- #
33
- # @param [String] Client's CUIT
34
- # @param [String] Operation Type
35
- # @return [Boolean]
36
- def check_operation(cuit, op)
37
- begin
38
- opts = { wt: "50", vol: "0.027", origin: "1414", destination: "5403",
39
- qty: "1", total: "123", cuit: cuit, op: op }
40
- get_shipping_rates(opts)
41
- true
42
- rescue Oca::Epak::Error => e
43
- false
44
- end
45
- end
46
-
47
- # Creates a Pickup Order, which lets OCA know you want to make a delivery.
48
- #
49
- # @see [http://www.ombushop.com/oca/documentation.pdf] #TODO put it there
50
- #
51
- # @param [Hash] opts
52
- # @option [Oca::Epak::PickupData] :pickup_data Pickup Data object
53
- # @option [Boolean] :confirm_pickup Confirm Pickup? Defaults to false
54
- # @option [Integer] :days_to_pickup Days OCA should wait before pickup, default: 1 (?) #TODO Confirm
55
- # @option [Integer] :pickup_range Range to be used when picking it up, default: 1
56
- # @return [Hash, nil]
57
- def create_pickup_order(opts = {})
58
- confirm_pickup = opts.fetch(:confirm_pickup, false)
59
- days_to_pickup = opts.fetch(:days_to_pickup, "1")
60
- pickup_range = opts.fetch(:pickup_range, "1")
61
- rendered_xml = opts[:pickup_data].to_xml
62
-
63
- message = { "usr" => username, "psw" => password,
64
- "xml_Datos" => rendered_xml,
65
- "ConfirmarRetiro" => confirm_pickup.to_s,
66
- "DiasHastaRetiro" => days_to_pickup,
67
- "idFranjaHoraria" => pickup_range }
68
- response = client.call(:ingreso_or, message: message)
69
- parse_results_table(response, :ingreso_or)
70
- end
71
-
72
- # Get rates and delivery estimate for a shipment
73
- #
74
- # @param [Hash] opts
75
- # @option [String] :wt Total Weight e.g: 20
76
- # @option [String] :vol Total Volume e.g: 0.0015 (0.1mts * 0.15mts * 0.1mts)
77
- # @option [Integer] :origin Origin ZIP Code
78
- # @option [Integer] :destination Destination ZIP Code
79
- # @option [Integer] :qty Quantity of Packages
80
- # @option [Integer] :total Declared Value
81
- # @option [String] :cuit Client's CUIT e.g: 30-99999999-7
82
- # @option [String] :op Operation Type
83
- # @return [Hash, nil] Contains Total Price, Delivery Estimate
84
- def get_shipping_rates(opts = {})
85
- method = :tarifar_envio_corporativo
86
- message = { "PesoTotal" => opts[:wt], "VolumenTotal" => opts[:vol],
87
- "CodigoPostalOrigen" => opts[:origin],
88
- "CodigoPostalDestino" => opts[:destination],
89
- "ValorDeclarado" => opts[:total],
90
- "CantidadPaquetes" => opts[:qty], "Cuit" => opts[:cuit],
91
- "Operativa" => opts[:op] }
92
- response = client.call(method, message: message)
93
- parse_results_table(response, method)
94
- end
95
-
96
- # Returns all existing Taxation Centers
97
- #
98
- # @return [Array, nil] Information for all the Oca Taxation Centers
99
- def taxation_centers
100
- method = :get_centros_imposicion
101
- response = client.call(method)
102
- parse_results_table(response, method)
103
- end
104
-
105
- # Returns all operation codes
106
- #
107
- # @return [Array, nil] Returns all operation codes available for the user
108
- def get_operation_codes
109
- method = :get_operativas_by_usuario
110
- opts = { "usr" => username, "psw" => password }
111
- response = client.call(method, message: opts)
112
- parse_results_table(response, method)
113
- end
114
-
115
- # Given a client's CUIT with a range of dates, returns a list with
116
- # all shipments made within the given period.
117
- #
118
- # @param [String] Client's CUIT
119
- # @param [String] "From date" in DD-MM-YYYY format
120
- # @param [String] "To date" in DD-MM-YYYY format
121
- # @return [Array, nil] Contains an array of hashes with NroProducto and NumeroEnvio
122
- def list_shipments(cuit, from_date, to_date)
123
- method = :list_envios
124
- opts = { "CUIT" => cuit, "FechaDesde" => from_date,
125
- "FechaHasta" => to_date }
126
- response = client.call(method, message: opts)
127
- parse_results_table(response, method)
128
- end
129
-
130
- # Returns all provinces in Argentina
131
- #
132
- # @return [Array, nil] Provinces in Argentina with their ID and name as a Hash
133
- def provinces
134
- response = client.call(:get_provincias)
135
- if body = response.body[:get_provincias_response]
136
- body[:get_provincias_result][:provincias][:provincia]
137
- end
138
- end
139
-
140
- private
141
-
142
- def parse_result(response, method)
143
- method_response = "#{method}_response".to_sym
144
- method_result = "#{method}_result".to_sym
145
- if body = response.body[method_response]
146
- body[method_result]
147
- end
148
- end
149
-
150
- def parse_results_table(response, method)
151
- if result = parse_result(response, method)
152
- if result[:diffgram][:new_data_set]
153
- result[:diffgram][:new_data_set][:table]
154
- else
155
- raise Oca::Epak::BadRequest.new("Oca WS responded with:\n#{response.body}")
156
- end
157
- end
158
- end
159
- end
160
- end
@@ -0,0 +1,155 @@
1
+ module Oca
2
+ module Epak
3
+ class Client
4
+ attr_reader :client
5
+ attr_accessor :username, :password
6
+
7
+ WSDL = 'http://webservice.oca.com.ar/epak_tracking/Oep_TrackEPak.asmx?wsdl'.freeze
8
+
9
+ def initialize(username, password)
10
+ @client = Savon.client(wsdl: WSDL)
11
+ @username = username
12
+ @password = password
13
+ end
14
+
15
+ # Checks if the user has input valid credentials
16
+ #
17
+ # @return [Boolean] Whether the credentials entered are valid or not
18
+ def check_credentials
19
+ method = :get_epack_user
20
+ opts = { "usr" => username, "psw" => password }
21
+ response = client.call(method, message: opts)
22
+ parse_results_table(response, method)[:existe] == "1"
23
+ end
24
+
25
+ # Checks whether the operation is valid
26
+ #
27
+ # @param [String] Client's CUIT
28
+ # @param [String] Operation Type
29
+ # @return [Boolean]
30
+ def check_operation(cuit, op)
31
+ begin
32
+ opts = { wt: "50", vol: "0.027", origin: "1414", destination: "5403",
33
+ qty: "1", total: "123", cuit: cuit, op: op }
34
+ get_shipping_rates(opts)
35
+ true
36
+ rescue Oca::Epak::GenericError => e
37
+ false
38
+ end
39
+ end
40
+
41
+ # Creates a Pickup Order, which lets OCA know you want to make a delivery.
42
+ #
43
+ # @see [http://www.ombushop.com/oca/documentation.pdf] #TODO put it there
44
+ #
45
+ # @param [Hash] opts
46
+ # @option [Oca::Epak::PickupData] :pickup_data Pickup Data object
47
+ # @option [Boolean] :confirm_pickup Confirm Pickup? Defaults to false
48
+ # @option [Integer] :days_to_pickup Days OCA should wait before pickup, default: 1 (?) #TODO Confirm
49
+ # @option [Integer] :pickup_range Range to be used when picking it up, default: 1
50
+ # @return [Hash, nil]
51
+ def create_pickup_order(opts = {})
52
+ confirm_pickup = opts.fetch(:confirm_pickup, false)
53
+ days_to_pickup = opts.fetch(:days_to_pickup, "1")
54
+ pickup_range = opts.fetch(:pickup_range, "1")
55
+ rendered_xml = opts[:pickup_data].to_xml
56
+
57
+ message = { "usr" => username, "psw" => password,
58
+ "xml_Datos" => rendered_xml,
59
+ "ConfirmarRetiro" => confirm_pickup.to_s,
60
+ "DiasHastaRetiro" => days_to_pickup,
61
+ "idFranjaHoraria" => pickup_range }
62
+ response = client.call(:ingreso_or, message: message)
63
+ parse_results_table(response, :ingreso_or)
64
+ end
65
+
66
+ # Get rates and delivery estimate for a shipment
67
+ #
68
+ # @param [Hash] opts
69
+ # @option [String] :wt Total Weight e.g: 20
70
+ # @option [String] :vol Total Volume e.g: 0.0015 (0.1mts * 0.15mts * 0.1mts)
71
+ # @option [Integer] :origin Origin ZIP Code
72
+ # @option [Integer] :destination Destination ZIP Code
73
+ # @option [Integer] :qty Quantity of Packages
74
+ # @option [Integer] :total Declared Value
75
+ # @option [String] :cuit Client's CUIT e.g: 30-99999999-7
76
+ # @option [String] :op Operation Type
77
+ # @return [Hash, nil] Contains Total Price, Delivery Estimate
78
+ def get_shipping_rates(opts = {})
79
+ method = :tarifar_envio_corporativo
80
+ message = { "PesoTotal" => opts[:wt], "VolumenTotal" => opts[:vol],
81
+ "CodigoPostalOrigen" => opts[:origin],
82
+ "CodigoPostalDestino" => opts[:destination],
83
+ "ValorDeclarado" => opts[:total],
84
+ "CantidadPaquetes" => opts[:qty], "Cuit" => opts[:cuit],
85
+ "Operativa" => opts[:op] }
86
+ response = client.call(method, message: message)
87
+ parse_results_table(response, method)
88
+ end
89
+
90
+ # Returns all existing Taxation Centers
91
+ #
92
+ # @return [Array, nil] Information for all the Oca Taxation Centers
93
+ def taxation_centers
94
+ method = :get_centros_imposicion
95
+ response = client.call(method)
96
+ parse_results_table(response, method)
97
+ end
98
+
99
+ # Returns all operation codes
100
+ #
101
+ # @return [Array, nil] Returns all operation codes available for the user
102
+ def get_operation_codes
103
+ method = :get_operativas_by_usuario
104
+ opts = { "usr" => username, "psw" => password }
105
+ response = client.call(method, message: opts)
106
+ parse_results_table(response, method)
107
+ end
108
+
109
+ # Given a client's CUIT with a range of dates, returns a list with
110
+ # all shipments made within the given period.
111
+ #
112
+ # @param [String] Client's CUIT
113
+ # @param [String] "From date" in DD-MM-YYYY format
114
+ # @param [String] "To date" in DD-MM-YYYY format
115
+ # @return [Array, nil] Contains an array of hashes with NroProducto and NumeroEnvio
116
+ def list_shipments(cuit, from_date, to_date)
117
+ method = :list_envios
118
+ opts = { "CUIT" => cuit, "FechaDesde" => from_date,
119
+ "FechaHasta" => to_date }
120
+ response = client.call(method, message: opts)
121
+ parse_results_table(response, method)
122
+ end
123
+
124
+ # Returns all provinces in Argentina
125
+ #
126
+ # @return [Array, nil] Provinces in Argentina with their ID and name as a Hash
127
+ def provinces
128
+ response = client.call(:get_provincias)
129
+ if body = response.body[:get_provincias_response]
130
+ body[:get_provincias_result][:provincias][:provincia]
131
+ end
132
+ end
133
+
134
+ private
135
+
136
+ def parse_result(response, method)
137
+ method_response = "#{method}_response".to_sym
138
+ method_result = "#{method}_result".to_sym
139
+ if body = response.body[method_response]
140
+ body[method_result]
141
+ end
142
+ end
143
+
144
+ def parse_results_table(response, method)
145
+ if result = parse_result(response, method)
146
+ if result[:diffgram][:new_data_set]
147
+ result[:diffgram][:new_data_set][:table]
148
+ else
149
+ raise Oca::Epak::BadRequest.new("Oca WS responded with:\n#{response.body}")
150
+ end
151
+ end
152
+ end
153
+ end
154
+ end
155
+ end
@@ -1,4 +1,6 @@
1
1
  module Oca
2
- class Epak::BadRequest < Epak::Error
2
+ module Epak
3
+ class BadRequest < GenericError
4
+ end
3
5
  end
4
6
  end
@@ -0,0 +1,6 @@
1
+ module Oca
2
+ module Epak
3
+ class GenericError < StandardError
4
+ end
5
+ end
6
+ end
@@ -1,29 +1,30 @@
1
1
  module Oca
2
- class Epak::PickupData
2
+ module Epak
3
+ class PickupData
4
+ attr_accessor :account_number, :pickup, :shipments
3
5
 
4
- attr_accessor :account_number, :pickup, :shipments
5
-
6
- # Creates a Pickup Data object for creating a pickup order in OCA.
7
- #
8
- # @param [Hash] opts
9
- # @option [String] :account_number Account Number (SAP)
10
- # @option [Hash] :pickup Pickup Hash
11
- # @option [Array<Hash>] :shipments Shipments Hash
12
- def initialize(opts = {})
13
- self.account_number = opts[:account_number]
14
- self.pickup = opts[:pickup]
15
- self.shipments = opts[:shipments]
16
- end
6
+ # Creates a Pickup Data object for creating a pickup order in OCA.
7
+ #
8
+ # @param [Hash] opts
9
+ # @option [String] :account_number Account Number (SAP)
10
+ # @option [Hash] :pickup Pickup Hash
11
+ # @option [Array<Hash>] :shipments Shipments Hash
12
+ def initialize(opts = {})
13
+ self.account_number = opts[:account_number]
14
+ self.pickup = opts[:pickup]
15
+ self.shipments = opts[:shipments]
16
+ end
17
17
 
18
- def to_xml
19
- or_template.result(binding)
20
- end
18
+ def to_xml
19
+ or_template.result(binding)
20
+ end
21
21
 
22
- private
22
+ private
23
23
 
24
- def or_template
25
- path_to_xml = File.expand_path("../retiro.xml.erb", __FILE__)
26
- ERB.new(File.read(path_to_xml), nil, "-")
27
- end
24
+ def or_template
25
+ path_to_xml = File.expand_path("../retiro.xml.erb", __FILE__)
26
+ ERB.new(File.read(path_to_xml), nil, "-")
27
+ end
28
+ end
28
29
  end
29
30
  end
@@ -1,5 +1,5 @@
1
1
  module Oca
2
- class Epak
3
- VERSION = '1.0.0'
2
+ module Epak
3
+ VERSION = '1.0.1'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oca-epak
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mauro Otonelli
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-11-09 00:00:00.000000000 Z
12
+ date: 2015-11-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: savon
@@ -104,8 +104,9 @@ extensions: []
104
104
  extra_rdoc_files: []
105
105
  files:
106
106
  - lib/oca-epak.rb
107
+ - lib/oca-epak/client.rb
107
108
  - lib/oca-epak/errors/bad_request.rb
108
- - lib/oca-epak/errors/error.rb
109
+ - lib/oca-epak/errors/generic_error.rb
109
110
  - lib/oca-epak/pickup_data.rb
110
111
  - lib/oca-epak/version.rb
111
112
  homepage: https://github.com/ombulabs/oca-epak
@@ -1,4 +0,0 @@
1
- module Oca
2
- class Epak::Error < StandardError
3
- end
4
- end