afipws 1.0.3 → 1.0.4

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: 3bb1054b4ad45099d4b950edb154f0961e2a8100
4
- data.tar.gz: 3768c0065771f1b021e136a30ce4d56fbdcf0204
3
+ metadata.gz: 9efcd1dff92381947ee6cb51d967b29be89807e7
4
+ data.tar.gz: a2d8e8b7887810180b2a1519acf28ccf9b03fc43
5
5
  SHA512:
6
- metadata.gz: beea7ebef5946e80acfd6ae40277000e9433964b38f669a0a0d6a4cb789b52e6e0856f35b5d804de7754b150501d8e68fa5d557ac1f2b4d0eb7cb7d30bdc75c8
7
- data.tar.gz: bdcc106d8fdbeb4fee5000795ecba43d5483ede917a578874d52b2c66df60c930254c3da54ae9bcc54d5d8eca47956ed3aa5b507f8443f65e12e8f4e572f0d40
6
+ metadata.gz: a27824e48e8e96b4f9924d6a106500da58e1d334a464e9dbd09c324c99c590b42f9d60a4fc596537cf6d75b2642ea9777a17f328a212d2f8e5aecb9162ae5301
7
+ data.tar.gz: b338ff05f6648220a3afbe577aad62b4fae07207d1ab941785774b730e3e3a58d59fab4e17f11f005877e6b452ae1a8545d5ac19e5a36af0597fdd10b995a94e
data/.rubocop.yml ADDED
@@ -0,0 +1,102 @@
1
+ Style/Documentation:
2
+ Enabled: false
3
+
4
+ Style/MethodDefParentheses:
5
+ Enabled: false
6
+
7
+ Style/ParallelAssignment:
8
+ Enabled: false
9
+
10
+ Style/FrozenStringLiteralComment:
11
+ Enabled: false
12
+
13
+ Style/FormatStringToken:
14
+ Enabled: false
15
+
16
+ Style/EmptyMethod:
17
+ Enabled: false
18
+
19
+ Style/GuardClause:
20
+ Enabled: false
21
+
22
+ Style/CommentAnnotation:
23
+ Enabled: false
24
+
25
+ Style/AsciiComments:
26
+ Enabled: false
27
+
28
+ Style/StabbyLambdaParentheses:
29
+ EnforcedStyle: require_no_parentheses
30
+
31
+ Style/MultilineIfModifier:
32
+ Enabled: false
33
+
34
+ Style/SafeNavigation:
35
+ Enabled: false
36
+
37
+ Style/FormatString:
38
+ Enabled: false
39
+
40
+ Style/AndOr:
41
+ Enabled: false
42
+
43
+ Style/Next:
44
+ Enabled: false
45
+
46
+ Style/NumericPredicate:
47
+ Enabled: false
48
+
49
+ Style/SymbolArray:
50
+ Enabled: false
51
+
52
+ Style/MutableConstant:
53
+ Enabled: false
54
+
55
+ Style/RescueModifier:
56
+ Enabled: false
57
+
58
+ Layout/SpaceInsideHashLiteralBraces:
59
+ Enabled: false
60
+
61
+ Layout/MultilineMethodCallIndentation:
62
+ Enabled: false
63
+
64
+ Layout/TrailingBlankLines:
65
+ Enabled: false
66
+
67
+ Layout/IndentArray:
68
+ EnforcedStyle: consistent
69
+
70
+ Layout/AlignParameters:
71
+ EnforcedStyle: with_fixed_indentation
72
+
73
+ Layout/SpaceInLambdaLiteral:
74
+ Enabled: false
75
+
76
+ Metrics:
77
+ Enabled: false
78
+
79
+ Bundler:
80
+ Enabled: false
81
+
82
+ Lint/Void:
83
+ Exclude:
84
+ - spec/**/*.rb
85
+
86
+ Lint/AssignmentInCondition:
87
+ Enabled: false
88
+
89
+ Lint/ShadowingOuterLocalVariable:
90
+ Enabled: false
91
+
92
+ Lint/AmbiguousRegexpLiteral:
93
+ Enabled: false
94
+
95
+ Lint/AmbiguousOperator:
96
+ Enabled: false
97
+
98
+ Lint/AmbiguousBlockAssociation:
99
+ Enabled: false
100
+
101
+ Naming/UncommunicativeMethodParamName:
102
+ Enabled: false
data/.travis.yml CHANGED
@@ -1 +1,2 @@
1
1
  language: ruby
2
+ cache: bundler
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- afipws (1.0.3)
4
+ afipws (1.0.4)
5
5
  activesupport
6
6
  builder
7
7
  nokogiri
@@ -18,6 +18,7 @@ GEM
18
18
  akami (1.3.1)
19
19
  gyoku (>= 0.4.0)
20
20
  nokogiri
21
+ ast (2.4.0)
21
22
  builder (3.2.3)
22
23
  coderay (1.1.2)
23
24
  concurrent-ruby (1.0.5)
@@ -45,6 +46,7 @@ GEM
45
46
  socksify
46
47
  i18n (1.0.1)
47
48
  concurrent-ruby (~> 1.0)
49
+ jaro_winkler (1.5.1)
48
50
  listen (3.1.5)
49
51
  rb-fsevent (~> 0.9, >= 0.9.4)
50
52
  rb-inotify (~> 0.9, >= 0.9.7)
@@ -62,11 +64,16 @@ GEM
62
64
  notiffany (0.1.1)
63
65
  nenv (~> 0.1)
64
66
  shellany (~> 0.0)
67
+ parallel (1.12.1)
68
+ parser (2.5.3.0)
69
+ ast (~> 2.4.0)
70
+ powerpack (0.1.2)
65
71
  pry (0.11.3)
66
72
  coderay (~> 1.1.0)
67
73
  method_source (~> 0.9.0)
68
- rack (2.0.5)
69
- rake (10.4.2)
74
+ rack (2.0.6)
75
+ rainbow (3.0.0)
76
+ rake (12.3.2)
70
77
  rb-fsevent (0.10.3)
71
78
  rb-inotify (0.9.10)
72
79
  ffi (>= 0.5.0, < 2)
@@ -83,6 +90,15 @@ GEM
83
90
  diff-lcs (>= 1.2.0, < 2.0)
84
91
  rspec-support (~> 3.7.0)
85
92
  rspec-support (3.7.1)
93
+ rubocop (0.61.1)
94
+ jaro_winkler (~> 1.5.1)
95
+ parallel (~> 1.10)
96
+ parser (>= 2.5, != 2.5.1.1)
97
+ powerpack (~> 0.1)
98
+ rainbow (>= 2.2.2, < 4.0)
99
+ ruby-progressbar (~> 1.7)
100
+ unicode-display_width (~> 1.4.0)
101
+ ruby-progressbar (1.10.0)
86
102
  ruby_dep (1.5.0)
87
103
  savon (2.11.2)
88
104
  akami (~> 1.2)
@@ -98,6 +114,7 @@ GEM
98
114
  thread_safe (0.3.6)
99
115
  tzinfo (1.2.5)
100
116
  thread_safe (~> 0.1)
117
+ unicode-display_width (1.4.0)
101
118
  wasabi (3.5.0)
102
119
  httpi (~> 2.0)
103
120
  nokogiri (>= 1.4.2)
@@ -111,6 +128,7 @@ DEPENDENCIES
111
128
  mocha
112
129
  rake
113
130
  rspec
131
+ rubocop
114
132
 
115
133
  BUNDLED WITH
116
- 1.16.1
134
+ 1.16.2
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2011 Emmanuel Nicolau
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md CHANGED
@@ -4,13 +4,19 @@ Ruby client para los web services de la AFIP.
4
4
 
5
5
  [![Build Status](https://travis-ci.org/eeng/afipws.svg?branch=master)](https://travis-ci.org/eeng/afipws)
6
6
 
7
+ ## Servicios Disponibles
8
+
9
+ * WSAA
10
+ * WSFE
11
+ * WSConstanciaInscripcion (ws_sr_constancia_inscripcion)
12
+
7
13
  ## Uso
8
14
 
9
15
  Primero hay que crear la clave privada y obtener el certificado correspondiente según los pasos indicados [aquí](http://www.afip.gov.ar/ws/WSAA/cert-req-howto.txt).
10
16
 
11
17
  Luego hay que instalar la librería:
12
18
 
13
- ```ruby
19
+ ```
14
20
  gem install afipws
15
21
  ```
16
22
 
@@ -22,13 +28,13 @@ ws = Afipws::WSFE.new env: :development, cuit: '...', key: File.read('test.key')
22
28
  puts ws.cotizacion 'DOL'
23
29
  ```
24
30
 
25
- De momento sólo están soportados los servicios WSAA y WSFEv1.
26
31
  Ver specs para más ejemplos.
27
32
 
28
33
  ## Contributing
29
34
 
30
35
  1. Fork it
31
36
  2. Create your feature branch (`git checkout -b my-new-feature`)
32
- 3. Commit your changes (`git commit -am 'Add some feature'`)
33
- 4. Push to the branch (`git push origin my-new-feature`)
34
- 5. Create new Pull Request
37
+ 3. Test, test, test (`guard`)
38
+ 4. Commit your changes (`git commit -am 'Add some feature'`)
39
+ 5. Push to the branch (`git push origin my-new-feature`)
40
+ 6. Create new Pull Request
data/afipws.gemspec CHANGED
@@ -22,6 +22,7 @@ Gem::Specification.new do |s|
22
22
  s.add_development_dependency 'rake'
23
23
  s.add_development_dependency 'mocha'
24
24
  s.add_development_dependency 'guard-rspec'
25
+ s.add_development_dependency 'rubocop'
25
26
  s.add_dependency "builder"
26
27
  s.add_dependency "savon", '~> 2.11.0'
27
28
  s.add_dependency "nokogiri"
data/lib/afipws.rb CHANGED
@@ -13,5 +13,7 @@ require 'afipws/core_ext/hash'
13
13
  require 'afipws/excepciones'
14
14
  require 'afipws/type_conversions'
15
15
  require 'afipws/client'
16
+ require 'afipws/ws_base'
16
17
  require 'afipws/wsaa'
17
18
  require 'afipws/wsfe'
19
+ require 'afipws/ws_constancia_inscripcion'
data/lib/afipws/client.rb CHANGED
@@ -1,28 +1,15 @@
1
1
  module Afipws
2
2
  class Client
3
3
  def initialize savon_options
4
- @client = Savon.client savon_options.reverse_merge(soap_version: 2)
4
+ @client = Savon.client savon_options.reverse_merge(soap_version: 2, ssl_version: :TLSv1)
5
5
  end
6
-
6
+
7
7
  def request action, body = nil
8
- response = raw_request(action, body).to_hash[:"#{action}_response"][:"#{action}_result"]
9
- if response[:errors]
10
- raise WSError, Array.wrap(response[:errors][:err])
11
- else
12
- response
13
- end
14
- end
15
-
16
- def raw_request action, body = nil
17
8
  @client.call action, message: body
18
9
  end
19
-
10
+
20
11
  def operations
21
12
  @client.operations
22
13
  end
23
-
24
- def method_missing method_sym, *args
25
- request method_sym, *args
26
- end
27
14
  end
28
- end
15
+ end
@@ -4,7 +4,7 @@ module Afipws
4
4
  def select_keys *keys
5
5
  select { |k, _| keys.include? k }
6
6
  end
7
-
7
+
8
8
  def has_entries? entries
9
9
  entries.each_pair.all? { |k, v| self[k] == v }
10
10
  end
@@ -14,4 +14,4 @@ end
14
14
 
15
15
  class Hash
16
16
  include Afipws::CoreExt::Hash
17
- end
17
+ end
@@ -9,5 +9,5 @@ module Afipws
9
9
  super
10
10
  end
11
11
  end
12
- end
12
+ end
13
13
  end
@@ -7,33 +7,36 @@ module Afipws
7
7
  def x2r x, types
8
8
  convert x, types, parsing_fn
9
9
  end
10
-
10
+
11
11
  private
12
+
12
13
  # Hace una conversión recursiva de tipo de todos los values según los tipos de las keys indicados en types
13
14
  def convert object, types, convert_fn
14
15
  case object
15
- when Array then
16
+ when Array then
16
17
  object.map { |e| convert e, types, convert_fn }
17
- when Hash then
18
- Hash[object.map { |k, v| [k, v.is_a?(Hash) || v.is_a?(Array) ? convert(v, types, convert_fn) : convert_fn[types[k]].call(v)] }]
19
- else
18
+ when Hash then
19
+ Hash[object.map do |k, v|
20
+ [k, v.is_a?(Hash) || v.is_a?(Array) ? convert(v, types, convert_fn) : convert_fn[types[k]].call(v)]
21
+ end]
22
+ else
20
23
  object
21
24
  end
22
25
  end
23
-
26
+
24
27
  def parsing_fn
25
- @parsing ||= Hash.new(Proc.new { |v| v }).tap { |p|
26
- p[:date] = Proc.new { |v| ::Date.parse(v) rescue nil }
27
- p[:integer] = Proc.new { |v| v.to_i }
28
- p[:float] = Proc.new { |v| v.to_f }
29
- p[:boolean] = Proc.new { |v| v == "S" }
28
+ @parsing_fn ||= Hash.new(proc { |v| v }).tap { |p|
29
+ p[:date] = proc { |v| ::Date.parse(v) rescue nil }
30
+ p[:integer] = proc { |v| v.to_i }
31
+ p[:float] = proc { |v| v.to_f }
32
+ p[:boolean] = proc { |v| v == 'S' }
30
33
  }
31
34
  end
32
35
 
33
36
  def marshall_fn
34
- @marshall ||= Hash.new(Proc.new { |other| other }).tap { |p|
35
- p[:date] = Proc.new { |date| date.strftime('%Y%m%d') }
36
- }
37
- end
37
+ @marshall_fn ||= Hash.new(proc { |other| other }).tap do |p|
38
+ p[:date] = proc { |date| date.strftime('%Y%m%d') }
39
+ end
40
+ end
38
41
  end
39
- end
42
+ end
@@ -1,3 +1,3 @@
1
1
  module Afipws
2
- VERSION = "1.0.3"
2
+ VERSION = '1.0.4'
3
3
  end
@@ -0,0 +1,12 @@
1
+ module Afipws
2
+ class WSBase
3
+ extend Forwardable
4
+
5
+ attr_reader :wsaa, :client, :env
6
+ def_delegators :wsaa, :cuit
7
+
8
+ def initialize options = {}
9
+ @env = (options[:env] || :test).to_sym
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,33 @@
1
+ module Afipws
2
+ class WSConstanciaInscripcion < WSBase
3
+ WSDL = {
4
+ development: 'https://awshomo.afip.gov.ar/sr-padron/webservices/personaServiceA5?WSDL',
5
+ production: 'https://aws.afip.gov.ar/sr-padron/webservices/personaServiceA5?WSDL',
6
+ test: Root + '/spec/fixtures/ws_constancia_inscripcion.wsdl'
7
+ }.freeze
8
+
9
+ def initialize options = {}
10
+ super
11
+ @wsaa = WSAA.new options.merge(service: 'ws_sr_constancia_inscripcion')
12
+ @client = Client.new Hash(options[:savon]).reverse_merge(wsdl: WSDL[env], soap_version: 1)
13
+ end
14
+
15
+ def dummy
16
+ request(:dummy)[:return]
17
+ end
18
+
19
+ def get_persona id
20
+ request(:get_persona, auth.merge(id_persona: id))[:persona_return]
21
+ end
22
+
23
+ def auth
24
+ wsaa.auth.merge(cuit_representada: cuit)
25
+ end
26
+
27
+ private
28
+
29
+ def request action, body = nil
30
+ @client.request(action, body).to_hash[:"#{action}_response"]
31
+ end
32
+ end
33
+ end
data/lib/afipws/wsaa.rb CHANGED
@@ -3,9 +3,9 @@ module Afipws
3
3
  attr_reader :key, :cert, :service, :ta, :cuit, :client
4
4
 
5
5
  WSDL = {
6
- development: "https://wsaahomo.afip.gov.ar/ws/services/LoginCms?wsdl",
7
- production: "https://wsaa.afip.gov.ar/ws/services/LoginCms?wsdl",
8
- test: Root + "/spec/fixtures/wsaa.wsdl"
6
+ development: 'https://wsaahomo.afip.gov.ar/ws/services/LoginCms?wsdl',
7
+ production: 'https://wsaa.afip.gov.ar/ws/services/LoginCms?wsdl',
8
+ test: Root + '/spec/fixtures/wsaa.wsdl'
9
9
  }
10
10
 
11
11
  def initialize options = {}
@@ -35,7 +35,7 @@ module Afipws
35
35
  def firmar_tra tra, key, crt
36
36
  key = OpenSSL::PKey::RSA.new key
37
37
  crt = OpenSSL::X509::Certificate.new crt
38
- OpenSSL::PKCS7::sign crt, key, tra
38
+ OpenSSL::PKCS7.sign crt, key, tra
39
39
  end
40
40
 
41
41
  def codificar_tra pkcs7
@@ -47,7 +47,7 @@ module Afipws
47
47
  end
48
48
 
49
49
  def login
50
- response = @client.raw_request :login_cms, in0: tra(@key, @cert, @service, @ttl)
50
+ response = @client.request :login_cms, in0: tra(@key, @cert, @service, @ttl)
51
51
  ta = Nokogiri::XML(Nokogiri::XML(response.to_xml).text)
52
52
  {
53
53
  token: ta.css('token').text,
@@ -59,10 +59,9 @@ module Afipws
59
59
  raise WSError, f.message
60
60
  end
61
61
 
62
- # Obtiene un TA, lo cachea hasta que expire, y devuelve el hash Auth listo para pasarle al Client en los otros WS
63
62
  def auth
64
63
  ta = obtener_y_cachear_ta
65
- {auth: {token: ta[:token], sign: ta[:sign], cuit: @cuit}}
64
+ {token: ta[:token], sign: ta[:sign]}
66
65
  end
67
66
 
68
67
  private
@@ -90,15 +89,12 @@ module Afipws
90
89
  end
91
90
 
92
91
  def restore_ta
93
- Marshal.load(File.read(@ta_path)) if File.exists?(@ta_path)
92
+ Marshal.load(File.read(@ta_path)) if File.exist?(@ta_path)
94
93
  end
95
94
 
96
95
  def persist_ta ta
97
- dirname = File.dirname(@ta_path)
98
- unless File.directory?(dirname)
99
- FileUtils.mkdir_p(dirname)
100
- end
101
- File.open(@ta_path, "wb") { |f| f.write(Marshal.dump(ta)) }
96
+ FileUtils.mkdir_p(File.dirname(@ta_path))
97
+ File.open(@ta_path, 'wb') { |f| f.write(Marshal.dump(ta)) }
102
98
  end
103
99
  end
104
100
  end