sunat_invoice 0.0.1 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -0
  3. data/README.mkd +1 -25
  4. data/lib/sunat_invoice/client.rb +3 -6
  5. data/lib/sunat_invoice/clients/consult_client.rb +17 -0
  6. data/lib/sunat_invoice/clients/invoice_client.rb +11 -3
  7. data/lib/sunat_invoice/configuration.rb +1 -1
  8. data/lib/sunat_invoice/credit_note.rb +59 -0
  9. data/lib/sunat_invoice/credit_note_line.rb +15 -0
  10. data/lib/sunat_invoice/customer.rb +1 -0
  11. data/lib/sunat_invoice/daily_summary.rb +46 -0
  12. data/lib/sunat_invoice/debit_note.rb +33 -0
  13. data/lib/sunat_invoice/debit_note_line.rb +15 -0
  14. data/lib/sunat_invoice/invoice.rb +23 -144
  15. data/lib/sunat_invoice/item.rb +40 -26
  16. data/lib/sunat_invoice/line.rb +18 -0
  17. data/lib/sunat_invoice/provider.rb +20 -14
  18. data/lib/sunat_invoice/response_parser.rb +64 -0
  19. data/lib/sunat_invoice/signature.rb +29 -15
  20. data/lib/sunat_invoice/summary_line.rb +75 -0
  21. data/lib/sunat_invoice/tax.rb +6 -1
  22. data/lib/sunat_invoice/trade_calculations.rb +68 -0
  23. data/lib/sunat_invoice/trade_document.rb +85 -0
  24. data/lib/sunat_invoice/utils.rb +48 -9
  25. data/lib/sunat_invoice/voided.rb +22 -0
  26. data/lib/sunat_invoice/voided_line.rb +20 -0
  27. data/lib/sunat_invoice/xml_document.rb +52 -0
  28. data/lib/sunat_invoice.rb +14 -0
  29. data/sunat_invoice.gemspec +5 -5
  30. data/test/credit_note_test.rb +15 -0
  31. data/test/daily_summary_test.rb +35 -0
  32. data/test/debit_note_test.rb +15 -0
  33. data/test/factories.rb +70 -0
  34. data/test/fixtures/responses/invoice_success.xml +2 -0
  35. data/test/fixtures/responses/summary_success.xml +2 -0
  36. data/test/fixtures/responses/ticket_invalid.xml +2 -0
  37. data/test/helper.rb +1 -0
  38. data/test/invoice_client_test.rb +68 -16
  39. data/test/invoice_test.rb +19 -10
  40. data/test/item_test.rb +3 -2
  41. data/test/response_parser_test.rb +28 -0
  42. data/test/support/response_helper.rb +18 -0
  43. data/test/support/signature_helper.rb +15 -8
  44. metadata +34 -13
data/test/factories.rb CHANGED
@@ -21,6 +21,55 @@ FactoryBot.define do
21
21
  initialize_with { new(attributes) }
22
22
  end
23
23
 
24
+ factory :credit_note_line, class: 'SunatInvoice::CreditNoteLine' do
25
+ quantity 10
26
+ unit_code 'NIU'
27
+ price 20
28
+ price_code '01'
29
+ description 'Grabadora Externo'
30
+ taxes { [build(:tax, amount: 3.6)] }
31
+ end
32
+
33
+ factory :credit_note, class: 'SunatInvoice::CreditNote' do
34
+ provider { build(:provider) }
35
+ customer { build(:customer) }
36
+ document_number 'F001-211'
37
+ currency 'PEN'
38
+ ref_document_number 'F001-342'
39
+ ref_document_type '01'
40
+ response_code '01'
41
+ document_type '07'
42
+ description 'Some awesome product'
43
+ lines { [build(:credit_note_line)] }
44
+ end
45
+
46
+ factory :debit_note_line, class: 'SunatInvoice::DebitNoteLine' do
47
+ quantity 10
48
+ unit_code 'NIU'
49
+ price 20
50
+ price_code '01'
51
+ description 'Ajuste de precio'
52
+ taxes { [build(:tax, amount: 3.6)] }
53
+ end
54
+
55
+ factory :debit_note, class: 'SunatInvoice::DebitNote' do
56
+ provider { build(:provider) }
57
+ customer { build(:customer) }
58
+ document_number 'F001-211'
59
+ currency 'PEN'
60
+ ref_document_number 'F001-342'
61
+ ref_document_type '01'
62
+ response_code '01'
63
+ document_type '08'
64
+ description 'Unidades defectuosas'
65
+ lines { [build(:debit_note_line)] }
66
+ end
67
+
68
+ factory :daily_summary, class: 'SunatInvoice::DailySummary' do
69
+ provider { build(:provider) }
70
+ signature { build(:signature, provider: provider) }
71
+ end
72
+
24
73
  factory :provider, class: 'SunatInvoice::Provider' do
25
74
  pk_file File.join(File.dirname(__FILE__), 'certs/pk_file')
26
75
  cert_file File.join(File.dirname(__FILE__), 'certs/cert_file')
@@ -45,4 +94,25 @@ FactoryBot.define do
45
94
 
46
95
  initialize_with { new(attributes) }
47
96
  end
97
+
98
+ factory :signature, class: 'SunatInvoice::Signature' do
99
+ provider { build(:provider) }
100
+ end
101
+
102
+ factory :summary_line, class: 'SunatInvoice::SummaryLine' do
103
+ document_type '03'
104
+ document_serial 'BD56'
105
+ start_document_number 231
106
+ end_document_number 239
107
+ taxable 2000
108
+ taxes { [build(:tax, amount: 360), build(:tax, amount: 0, tax_type: :isc)] }
109
+ total_amount 2360
110
+ end
111
+
112
+ factory :voided_line, class: 'SunatInvoice::VoidedLine' do
113
+ document_type '03'
114
+ document_serial 'BD56'
115
+ document_number 231
116
+ description 'Anulación documento'
117
+ end
48
118
  end
@@ -0,0 +1,2 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><soap-env:Header/><soap-env:Body><br:sendBillResponse xmlns:br="http://service.sunat.gob.pe"><applicationResponse>UEsDBBQAAgAIACV9hEsAAAAAAgAAAAAAAAAGAAAAZHVtbXkvAwBQSwMEFAACAAgAJX2ES7yR4JPEAwAAmgsAAB0AAABSLTIwMTAwNDU0NTIzLTAxLUZZMDItMjM0LnhtbLVWW3PaOhB+76/wmIfOtMeRbCAEj6EDoXRoe3LhkiZ9U2zFqMWSK4lLzq8/km/YxJlCZzrmQV59++3q210Z78MuWhkbzAVhtGfaZ9A0MPVZQGjYMxfzsXVhfui/8RB3B3G8Ij6SCjjFImZUYEM5U+Ei3jPXnLoMCSJciiIsXBFjnzxleHf9uHKFv8QRcnciqKOyHDNjwzt5It0liyJGP+4kpvoY6lVRYirFntR/9P+IdKjgfi0h+jPCQRhyHCKJ60gD0TOXUsYuANvt9mzbPGM8BA6EEMAuUJhAkLCRowVDcYFPA4kztaXtiaNeAEw3eMViDMy+p6R1F8OvhVLipSm1lLSkaiX73oyEFMk1z2p+VJ6qb7QbDib0ifXfGIZ3iSijSp8V+S/R6F8slywwBquQcSKX0Su0NrChprXwzrd8u0Ub3xRaC6r1M0HCXWR4NCls5blaEeO4wQWyxBK1bSejnOInzNU4YGMxnfRMUxuVec4RFU+MRyI1lE2/DVuRKC9OYIk8+zT0iaTHCKQIwWHm3oiEWMgTFVOKNMo6FTx3aLXG/e83P+SmO4w/Or9itI7vyeK2E/8U191x88s5IL+Gnz53tvbFtjm4nTUfYORfT2d3n9q3lyyEfP7j23b3sBt/v4un+Pw64u17/vl90Nn2eh4oR9H1AUWBVKuBaq+VOyL1eHfDyUZNnvETPxtvh1iiGzWiarwxl28NyqSxjt+lNCUv7wt+Tji9+zbsjpBE6Up7pbOumK/U+AeGvzdl/GlAxVDiP3RO2CZCrDGfYU7QqmzRxKfTl3wTrpT3ah09Yn46W8W7HCBPF+yVAYVaex3Vuv5OAS8vH1BzRam7252M+rbqt5bqwo5+PJBZ012dzkiL6UC7Y9mOBVtzCN3kl0ELyN5jTpRANbDEnsDyr9MBd4qtbFbgCYHddlu2a8MqOONGvlvSJzuLtswWV4N56XQFkPHnG8Tlc2pLlpNAyVh8bwoalWdTPU633d4Tgde98o20X7RDsiplku6AAyR4LTk1pkSiVXHAgZTIX0ZJzfW+Li6naLWf3iSqumP7jQMNtC0NVOMEfhcMHOqsXzENMP87UoLaAFPsY7I5JSaErXar7TSPjlkTYsT8tVYhb7w8l+ItacpMSxVi/AAdy2kWvb3fqbT2JQvUzFR7OrElqBEWPidxktlXZIyRr4RHBlWZcGbkIf4xlsgQJGAG8nEsUYBSvrJ3fq5y8vsjVfrmRfKFYHUOqVokJsp+ZEXOLQc63SZ0LlrQPqUmlSigviqg/q91/39QSwECAAAUAAIACAAlfYRLAAAAAAIAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAZHVtbXkvUEsBAgAAFAACAAgAJX2ES7yR4JPEAwAAmgsAAB0AAAAAAAAAAQAAAAAAJgAAAFItMjAxMDA0NTQ1MjMtMDEtRlkwMi0yMzQueG1sUEsFBgAAAAACAAIAfwAAACUEAAAAAA==</applicationResponse></br:sendBillResponse></soap-env:Body></soap-env:Envelope>
@@ -0,0 +1,2 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><soap-env:Header/><soap-env:Body><br:sendSummaryResponse xmlns:br="http://service.sunat.gob.pe"><ticket>1512600172234</ticket></br:sendSummaryResponse></soap-env:Body></soap-env:Envelope>
@@ -0,0 +1,2 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <S:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:getStatusResponse xmlns:ns2="http://service.sunat.gob.pe"><status><content>El ticket no existe</content><statusCode>0127</statusCode></status></ns2:getStatusResponse></S:Body></S:Envelope>
data/test/helper.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'cutest'
3
4
  require 'pry'
4
5
  require 'ffaker'
@@ -4,38 +4,90 @@ require_relative 'helper'
4
4
 
5
5
  scope 'SunatInvoice::InvoiceClient' do
6
6
  setup do
7
- provider = FactoryBot.build(:provider,
8
- signature_id: 'signatureST',
9
- signature_location_id: 'signQWI3',
10
- ruc: '20100454523',
11
- name: 'SOPORTE TECNOLOGICO EIRL')
12
-
13
- customer = FactoryBot.build(:customer,
14
- ruc: '20293028401',
15
- name: 'SOME BUSINESS')
7
+ @provider = FactoryBot.build(:provider,
8
+ signature_id: 'signatureST',
9
+ signature_location_id: 'signQWI3',
10
+ ruc: '20100454523',
11
+ name: 'SOPORTE TECNOLOGICO EIRL')
12
+
13
+ @customer = FactoryBot.build(:customer,
14
+ ruc: '20293028401',
15
+ name: 'SOME BUSINESS')
16
16
  SunatInvoice.configure do |c|
17
- c.account_ruc = provider.ruc
17
+ c.account_ruc = @provider.ruc
18
18
  c.account_user = 'MODDATOS'
19
19
  c.account_password = 'moddatos'
20
- c.provider = provider
21
20
  end
22
21
  @client = SunatInvoice::InvoiceClient.new
23
22
 
24
23
  tax = SunatInvoice::Tax.new(amount: 3.6, tax_type: :igv)
25
24
  item = FactoryBot.build(:item, taxes: [tax])
26
- @invoice = SunatInvoice::Invoice.new(provider: provider,
27
- customer: customer,
25
+ @invoice = SunatInvoice::Invoice.new(provider: @provider,
26
+ customer: @customer,
28
27
  document_number: 'FY02-234')
29
- @invoice.items << item
28
+ @invoice.lines << item
30
29
  end
31
30
 
32
31
  test 'should use dev service when not define environment' do
33
32
  assert_equal @client.wsdl, @client.dev_server
34
33
  end
35
34
 
35
+ test 'send invoice success' do
36
+ response = @client.dispatch(@invoice)
37
+ assert_equal response.http.code, 200
38
+ end
39
+
40
+ test 'send credit note' do
41
+ tax = SunatInvoice::Tax.new(amount: 3.6, tax_type: :igv)
42
+ line = FactoryBot.build(:credit_note_line, taxes: [tax])
43
+ signature = FactoryBot.build(:signature, provider: @provider)
44
+ credit_note = FactoryBot.build(:credit_note, provider: @provider,
45
+ customer: @customer,
46
+ lines: [line],
47
+ signature: signature)
48
+ response = @client.dispatch(credit_note)
49
+ assert_equal response.http.code, 200
50
+ end
51
+
52
+ test 'send debit note' do
53
+ tax = SunatInvoice::Tax.new(amount: 3.6, tax_type: :igv)
54
+ line = FactoryBot.build(:debit_note_line, taxes: [tax])
55
+ signature = FactoryBot.build(:signature, provider: @provider)
56
+ debit_note = FactoryBot.build(:debit_note, provider: @provider,
57
+ customer: @customer,
58
+ lines: [line],
59
+ signature: signature)
60
+ response = @client.dispatch(debit_note)
61
+ assert_equal response.http.code, 200
62
+ end
63
+
64
+ test 'send summary success' do
65
+ line = FactoryBot.build(:summary_line)
66
+ signature = FactoryBot.build(:signature, provider: @provider)
67
+ summary = SunatInvoice::DailySummary.new(provider: @provider,
68
+ signature: signature,
69
+ reference_date: Date.today,
70
+ currency: 'PEN',
71
+ lines: [line])
72
+ response = @client.dispatch(summary)
73
+ assert_equal response.http.code, 200
74
+ end
75
+
76
+ test 'void document' do
77
+ line = FactoryBot.build(:voided_line)
78
+ signature = FactoryBot.build(:signature, provider: @provider)
79
+ voided = SunatInvoice::Voided.new(provider: @provider,
80
+ signature: signature,
81
+ reference_date: Date.today,
82
+ currency: 'PEN',
83
+ lines: [line])
84
+ response = @client.dispatch(voided)
85
+ assert_equal response.http.code, 200
86
+ end
36
87
 
37
- test '#send_invoice success' do
38
- response = @client.send_invoice(@invoice.xml, @invoice.document_name)
88
+ test 'get status' do
89
+ ticket = rand(10**15).to_s
90
+ response = @client.get_status(ticket)
39
91
  assert_equal response.http.code, 200
40
92
  end
41
93
  end
data/test/invoice_test.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: false
2
+
2
3
  require_relative 'helper'
3
4
  include SunatInvoice
4
5
 
@@ -7,7 +8,7 @@ setup do
7
8
  @invoice = FactoryBot.build(:invoice, provider: @provider)
8
9
  tax = SunatInvoice::Tax.new(amount: 3.6, tax_type: :igv)
9
10
  item_attr = { quantity: 10, price: 20, price_code: '01', taxes: [tax] }
10
- @invoice.items << SunatInvoice::Item.new(item_attr)
11
+ @invoice.lines << SunatInvoice::Item.new(item_attr)
11
12
  @parsed_xml = Nokogiri::XML(@invoice.xml, &:noblanks)
12
13
  end
13
14
 
@@ -27,7 +28,7 @@ end
27
28
 
28
29
  test 'has a date' do
29
30
  date = @parsed_xml.xpath('//cbc:IssueDate')
30
- assert_equal date.first.content, DateTime.now.strftime('%Y-%m-%d')
31
+ assert_equal date.first.content, Date.today.strftime('%Y-%m-%d')
31
32
  end
32
33
 
33
34
  test 'has a signature' do
@@ -110,7 +111,7 @@ test 'has at least one item' do
110
111
  end
111
112
 
112
113
  test 'has total by kind of sale' do
113
- tag = '//ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent/sac:AdditionalInformation'
114
+ tag = '//ext:UBLExtension/ext:ExtensionContent/sac:AdditionalInformation'
114
115
  additional_info = @parsed_xml.xpath(tag)
115
116
  assert additional_info.count.positive?
116
117
  assert_equal additional_info.first.children.count, 1
@@ -123,16 +124,16 @@ test 'has total tag' do
123
124
  assert total.count.positive?
124
125
  end
125
126
 
126
- test '#calculate_tax_totals' do
127
+ test '#calculate_taxes_totals' do
127
128
  tax = FactoryBot.build(:tax, amount: 15)
128
129
  invoice = FactoryBot.build(:invoice)
129
130
  2.times do
130
- invoice.items << FactoryBot.build(:item, taxes: [tax])
131
+ invoice.lines << FactoryBot.build(:item, taxes: [tax])
131
132
  end
132
- invoice.calculate_tax_totals
133
- tax_totals = invoice.instance_variable_get('@tax_totals')
134
- assert_equal tax_totals.count, 1
135
- assert_equal tax_totals[:igv], 300
133
+ invoice.calculate_taxes_totals
134
+ taxes_totals = invoice.instance_variable_get('@taxes_totals')
135
+ assert_equal taxes_totals.count, 1
136
+ assert_equal taxes_totals[:igv], 300
136
137
  end
137
138
 
138
139
  test '#get_total_igv_code' do
@@ -140,6 +141,14 @@ test '#get_total_igv_code' do
140
141
  assert_equal invoice.get_total_igv_code('11'), '1004'
141
142
  assert_equal invoice.get_total_igv_code('15'), '1004'
142
143
  assert_equal invoice.get_total_igv_code('20'), '1003'
143
- assert_equal invoice.get_total_igv_code('32'), '1002'
144
+ assert_equal invoice.get_total_igv_code('30'), '1002'
145
+ assert_equal invoice.get_total_igv_code('32'), '1004'
144
146
  assert invoice.get_total_igv_code('42').nil?
145
147
  end
148
+
149
+ test 'could have discounts' do
150
+ @invoice.discount = 25
151
+ parsed_xml = Nokogiri::XML(@invoice.xml, &:noblanks)
152
+ discount_node = parsed_xml.xpath('//sac:AdditionalMonetaryTotal').last
153
+ assert_equal discount_node.at_xpath('descendant::cbc:ID').content, '2005'
154
+ end
data/test/item_test.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative 'helper'
3
4
  include SunatInvoice
4
5
 
@@ -13,7 +14,7 @@ end
13
14
  def invoice_setup
14
15
  # add item to invoice in order to setup namespaces
15
16
  invoice = FactoryBot.build(:invoice)
16
- invoice.items << @item
17
+ invoice.lines << @item
17
18
  invoice_xml = Nokogiri::XML(invoice.xml, &:noblanks)
18
19
  @item_xml = invoice_xml.xpath('//cac:InvoiceLine')
19
20
  end
@@ -104,7 +105,7 @@ scope '#sale_taxes' do
104
105
  test 'has sum by tax_type' do
105
106
  @item.taxes << SunatInvoice::Tax.new(amount: 5, tax_type: :isc)
106
107
  assert_equal @item.sale_taxes.count, 2
107
- assert_equal @item.sale_taxes.keys, [:igv, :isc]
108
+ assert_equal @item.sale_taxes.keys, %i[igv isc]
108
109
  assert_equal @item.sale_taxes.values, [21.6, 10]
109
110
  end
110
111
  end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'helper'
4
+
5
+ scope 'SunatInvoice::ResponseParser' do
6
+ test 'invoice success response' do
7
+ response_xml = ResponseHelper.load('invoice_success.xml')
8
+ body = ResponseHelper.parse(response_xml)
9
+ response = SunatInvoice::ResponseParser.new(body, 'invoice')
10
+
11
+ assert_equal response.status_code, '0'
12
+ assert response.message.include?('aceptada')
13
+ end
14
+
15
+ test 'summary success response' do
16
+ response_xml = ResponseHelper.load('summary_success.xml')
17
+ body = ResponseHelper.parse(response_xml)
18
+ response = SunatInvoice::ResponseParser.new(body, 'summary')
19
+ assert response.ticket.length.positive?
20
+ end
21
+
22
+ test 'get_status response' do
23
+ response_xml = ResponseHelper.load('ticket_invalid.xml')
24
+ body = ResponseHelper.parse(response_xml)
25
+ response = SunatInvoice::ResponseParser.new(body, 'status')
26
+ assert_equal response.message, 'El ticket no existe'
27
+ end
28
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'nori'
4
+
5
+ module ResponseHelper
6
+ def self.load(file_name)
7
+ File.read("#{Dir.pwd}/test/fixtures/responses/#{file_name}")
8
+ end
9
+
10
+ def self.parse(response_xml)
11
+ parser = Nori.new(delete_namespace_attributes: true,
12
+ convert_tags_to: ->(tag) { tag.snakecase.to_sym },
13
+ strip_namespaces: true)
14
+ hash = parser.parse(response_xml)
15
+ envelope = parser.find(hash, 'Envelope')
16
+ parser.find(envelope, 'Body')
17
+ end
18
+ end
@@ -1,6 +1,19 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SignatureHelper
2
4
  def self.generate_keys
5
+ return if exists?('pk_file')
6
+
3
7
  pk = OpenSSL::PKey::RSA.new 2048
8
+ cert = generate_certificate(pk)
9
+
10
+ cert_dir = "#{File.dirname(__FILE__)}/../certs"
11
+ Dir.mkdir(cert_dir) unless Dir.exist?(cert_dir)
12
+ File.open(file('pk_file'), 'w') { |f| f.puts pk.to_pem }
13
+ File.open(file('cert_file'), 'w') { |f| f.puts cert.to_pem }
14
+ end
15
+
16
+ def self.generate_certificate(pk)
4
17
  name = OpenSSL::X509::Name.parse('CN=example.com/C=EE')
5
18
  cert = OpenSSL::X509::Certificate.new
6
19
  cert.version = 2
@@ -11,13 +24,7 @@ module SignatureHelper
11
24
  cert.subject = name
12
25
  cert.issuer = name
13
26
  cert.sign pk, OpenSSL::Digest::SHA1.new
14
-
15
- unless exists?('pk_file')
16
- cert_dir = "#{File.dirname(__FILE__)}/../certs"
17
- Dir.mkdir(cert_dir) unless Dir.exist?(cert_dir)
18
- File.open(file('pk_file'), 'w') { |f| f.puts pk.to_pem }
19
- File.open(file('cert_file'), 'w') { |f| f.puts cert.to_pem }
20
- end
27
+ cert
21
28
  end
22
29
 
23
30
  def self.file(name)
@@ -25,6 +32,6 @@ module SignatureHelper
25
32
  end
26
33
 
27
34
  def self.exists?(name)
28
- File.exists?(file(name))
35
+ File.exist?(file(name))
29
36
  end
30
37
  end
metadata CHANGED
@@ -1,57 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sunat_invoice
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - César Carruitero
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-04 00:00:00.000000000 Z
11
+ date: 2017-12-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: savon
14
+ name: nokogiri
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 2.11.2
19
+ version: '1.8'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 2.11.2
26
+ version: '1.8'
27
27
  - !ruby/object:Gem::Dependency
28
- name: nokogiri
28
+ name: rubyzip
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '1.8'
33
+ version: '1.2'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '1.8'
40
+ version: '1.2'
41
41
  - !ruby/object:Gem::Dependency
42
- name: rubyzip
42
+ name: savon
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 1.2.1
47
+ version: '2.11'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 1.2.1
54
+ version: '2.11'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: xmldsig
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -136,7 +136,7 @@ dependencies:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0.51'
139
- description: SOAP client to use SUNAT Electronic Invoice API
139
+ description: Generate and send Electronic Invoices to SUNAT
140
140
  email:
141
141
  - cesar@mozilla.pe
142
142
  executables: []
@@ -156,21 +156,42 @@ files:
156
156
  - lib/sunat_invoice/clients/invoice_client.rb
157
157
  - lib/sunat_invoice/clients/validate_client.rb
158
158
  - lib/sunat_invoice/configuration.rb
159
+ - lib/sunat_invoice/credit_note.rb
160
+ - lib/sunat_invoice/credit_note_line.rb
159
161
  - lib/sunat_invoice/customer.rb
162
+ - lib/sunat_invoice/daily_summary.rb
163
+ - lib/sunat_invoice/debit_note.rb
164
+ - lib/sunat_invoice/debit_note_line.rb
160
165
  - lib/sunat_invoice/invoice.rb
161
166
  - lib/sunat_invoice/item.rb
167
+ - lib/sunat_invoice/line.rb
162
168
  - lib/sunat_invoice/model.rb
163
169
  - lib/sunat_invoice/provider.rb
170
+ - lib/sunat_invoice/response_parser.rb
164
171
  - lib/sunat_invoice/signature.rb
172
+ - lib/sunat_invoice/summary_line.rb
165
173
  - lib/sunat_invoice/tax.rb
174
+ - lib/sunat_invoice/trade_calculations.rb
175
+ - lib/sunat_invoice/trade_document.rb
166
176
  - lib/sunat_invoice/tributer.rb
167
177
  - lib/sunat_invoice/utils.rb
178
+ - lib/sunat_invoice/voided.rb
179
+ - lib/sunat_invoice/voided_line.rb
180
+ - lib/sunat_invoice/xml_document.rb
168
181
  - sunat_invoice.gemspec
182
+ - test/credit_note_test.rb
183
+ - test/daily_summary_test.rb
184
+ - test/debit_note_test.rb
169
185
  - test/factories.rb
186
+ - test/fixtures/responses/invoice_success.xml
187
+ - test/fixtures/responses/summary_success.xml
188
+ - test/fixtures/responses/ticket_invalid.xml
170
189
  - test/helper.rb
171
190
  - test/invoice_client_test.rb
172
191
  - test/invoice_test.rb
173
192
  - test/item_test.rb
193
+ - test/response_parser_test.rb
194
+ - test/support/response_helper.rb
174
195
  - test/support/signature_helper.rb
175
196
  homepage: https://github.com/ccarruitero/sunat_invoice
176
197
  licenses:
@@ -195,5 +216,5 @@ rubyforge_project:
195
216
  rubygems_version: 2.6.13
196
217
  signing_key:
197
218
  specification_version: 4
198
- summary: SOAP client to use SUNAT Electronic Invoice API
219
+ summary: Ruby gem to use SUNAT Electronic Billing from your app
199
220
  test_files: []