papierkram_api_client 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: f793e9caedd92f52e53a04afaedba5de7ad092d6db5a6de569dc5e7bfb734430
4
+ data.tar.gz: f5b657daef559182cbc3307990ebac36f5ddc0feb60f98375000bd561c927c2c
5
+ SHA512:
6
+ metadata.gz: 355c08e0085b6855606d3242177df54eab3b2862facbc5629ddfc3536983a605bab008475d2526bdd4181a7a7a2ec8b4766216052e75a4540efa19ac45e734d5
7
+ data.tar.gz: 78b2ed8e798dabf1281e1b646e6e8a82cf1b73f5c7618189a4b014e66f19553bb35ab5b65e87ff7ce26cf98bf48a0c0045b8fb302b770bff3bd0f61f433dff05
data/.editorconfig ADDED
@@ -0,0 +1,16 @@
1
+
2
+
3
+ # EditorConfig is awesome: https://EditorConfig.org
4
+
5
+ # top-most EditorConfig file
6
+ root = true
7
+
8
+ # Unix-style newlines with a newline ending every file
9
+ [*]
10
+ end_of_line = lf
11
+ insert_final_newline = true
12
+
13
+ [**.{rb,md}]
14
+ charset = utf-8
15
+ indent_style = space
16
+ indent_size = 2
data/.gitignore ADDED
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+ .env
10
+ .envrc
11
+ .vscode
data/.rubocop ADDED
@@ -0,0 +1 @@
1
+ --server
data/.rubocop.yml ADDED
@@ -0,0 +1,25 @@
1
+ require:
2
+ - rubocop-minitest
3
+
4
+ AllCops:
5
+ NewCops: enable
6
+ TargetRubyVersion: 2.7
7
+ Exclude:
8
+ - "papierkram_api_client.gemspec"
9
+
10
+ Metrics/BlockLength:
11
+ Enabled: true
12
+ Exclude:
13
+ - "test/**/*"
14
+
15
+ Layout/LineLength:
16
+ Exclude:
17
+ - "test/cassettes/**/*"
18
+
19
+ Metrics/MethodLength:
20
+ Max: 16
21
+
22
+ Metrics/ParameterLists:
23
+ Max: 8
24
+ Exclude:
25
+ - "lib/api/v1/**/*"
data/CHANGELOG.md ADDED
@@ -0,0 +1,5 @@
1
+ ## [Unreleased]
2
+
3
+ ## [0.1.0] - 2023-04-12
4
+
5
+ - Initial release
data/Gemfile ADDED
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ # Specify your gem's dependencies in papierkram_api_client.gemspec
6
+ gemspec
7
+
8
+ gem 'minitest', '~> 5.0'
9
+ gem 'minitest-vcr', '~> 1.4'
10
+ gem 'pry', '~> 0.14.2'
11
+ gem 'rake', '~> 13.0'
12
+ gem 'rubocop', '~> 1.48'
13
+ gem 'rubocop-minitest', '~> 0.30.0'
14
+ gem 'vcr', '~> 6.1'
data/Gemfile.lock ADDED
@@ -0,0 +1,74 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ papierkram_api_client (0.1.0)
5
+ faraday (~> 2.7)
6
+ httpx (~> 0.22.5)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ ast (2.4.2)
12
+ coderay (1.1.3)
13
+ faraday (2.7.4)
14
+ faraday-net_http (>= 2.0, < 3.1)
15
+ ruby2_keywords (>= 0.0.4)
16
+ faraday-net_http (3.0.2)
17
+ http-2-next (0.5.1)
18
+ httpx (0.22.5)
19
+ http-2-next (>= 0.4.1)
20
+ json (2.6.3)
21
+ method_source (1.0.0)
22
+ minispec-metadata (2.0.0)
23
+ minitest
24
+ minitest (5.18.0)
25
+ minitest-vcr (1.4.0)
26
+ minispec-metadata (~> 2.0)
27
+ minitest (>= 4.7.5)
28
+ vcr (>= 2.9)
29
+ parallel (1.22.1)
30
+ parser (3.2.2.0)
31
+ ast (~> 2.4.1)
32
+ pry (0.14.2)
33
+ coderay (~> 1.1)
34
+ method_source (~> 1.0)
35
+ rainbow (3.1.1)
36
+ rake (13.0.6)
37
+ regexp_parser (2.7.0)
38
+ rexml (3.2.5)
39
+ rubocop (1.48.1)
40
+ json (~> 2.3)
41
+ parallel (~> 1.10)
42
+ parser (>= 3.2.0.0)
43
+ rainbow (>= 2.2.2, < 4.0)
44
+ regexp_parser (>= 1.8, < 3.0)
45
+ rexml (>= 3.2.5, < 4.0)
46
+ rubocop-ast (>= 1.26.0, < 2.0)
47
+ ruby-progressbar (~> 1.7)
48
+ unicode-display_width (>= 2.4.0, < 3.0)
49
+ rubocop-ast (1.28.0)
50
+ parser (>= 3.2.1.0)
51
+ rubocop-minitest (0.30.0)
52
+ rubocop (>= 1.39, < 2.0)
53
+ ruby-progressbar (1.13.0)
54
+ ruby2_keywords (0.0.5)
55
+ unicode-display_width (2.4.2)
56
+ vcr (6.1.0)
57
+
58
+ PLATFORMS
59
+ arm64-darwin-22
60
+ ruby
61
+ x86_64-linux
62
+
63
+ DEPENDENCIES
64
+ minitest (~> 5.0)
65
+ minitest-vcr (~> 1.4)
66
+ papierkram_api_client!
67
+ pry (~> 0.14.2)
68
+ rake (~> 13.0)
69
+ rubocop (~> 1.48)
70
+ rubocop-minitest (~> 0.30.0)
71
+ vcr (~> 6.1)
72
+
73
+ BUNDLED WITH
74
+ 2.4.8
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2023 Simon Neutert
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,478 @@
1
+ # Papierkram Api Client<!-- omit in toc -->
2
+
3
+ Der erste illegale API Client in [Ruby](https://www.ruby-lang.org/de/) für [Papierkram.de](https://www.papierkram.de)!
4
+
5
+ **WICHTIG** Dieses Projekt befindet sich im Entwicklungsstatus bis V1.0.0! Ich werde versuchen, die Änderungen so gut wie möglich zu dokumentieren. Wenn du einen Fehler findest, kannst du gerne einen Issue erstellen oder einen Pull Request mit einer Verbesserung erstellen. Ich freue mich über jede Hilfe!
6
+
7
+ > 🚨 **Bitte beachte**, dass DU UNBEDINGT die Requests/Responses (VCR Cassettes) von privaten Daten befreien musst, bevor du einen Pull Request erstellst oder einen Commit ins Web lädst! Ich werde die Cassettes auch nochmal durchgehen, bevor ich die Version 1.0.0 veröffentliche. ABER BITTE, BITTE, BITTE, mach das selbst auch! Ich habe keine Lust, dass irgendwelche Daten von dir oder deinen Kunden auf Github landen. Danke! 🙏
8
+
9
+ Check das [CHANGELOG.md](CHANGELOG.md), Baby!
10
+
11
+ Hier geht es zu den offiziellen API Docs
12
+ https://DEINE-SUBDOMAIN.papierkram.de/api/v1/api-docs/index.html
13
+ (wenn du bereits ein Papierkram-Konto hast).
14
+ Schau bitte dort um alle Rückgabefelder/-werte zu checken, bis ich die Dokumentation hier komplett habe.
15
+
16
+ ---
17
+
18
+ Ruby client für die Papierkram API (V1).
19
+
20
+ Aktuell unterstützte Endpunkte / Objekte:
21
+
22
+ - [x] Banking::BankConnection
23
+ - [ ] Banking::BankTransaction
24
+ - [x] Contact::Company (Unternehmen)
25
+ - [x] Contact::Company (Kontaktpersonen)
26
+ - [x] Expense::Voucher (Ausgabe Belege)
27
+ - [x] Income::Estimate (Angebote)
28
+ - [x] Income::Invoice (Rechnungen)
29
+ - [x] Income::Proposition (Waren / Dienstleistungen)
30
+ - [x] Info
31
+ - [x] Project (Projekte)
32
+ - [x] Tracker::Task (Aufgaben)
33
+ - [x] Tracker::TimeEntry (Zeiterfassung)
34
+
35
+ ## Was, wie, warum?<!-- omit in toc -->
36
+
37
+ Papierkram.de hat nun endlich eine API Schnittstelle für die Programmierung von eigenen Anwendungen. Die Dokumentation findest du hier: [https://DEINE-SUBDOMAIN.papierkram.de/api/v1/api-docs/index.html](https://DEINE-SUBDOMAIN.papierkram.de/api/v1/api-docs/index.html). Dieses Projekt soll eine einfache Schnittstelle für die Papierkram API bereitstellen.
38
+
39
+ Ziele:
40
+
41
+ - Eine einfache als Gem verfügbare Schnittstelle für die Papierkram API.
42
+ - Rückgabe von Hashes, Arrays, etc. statt von komplexeren Objekten (der gefürchtete DIY-Ansatz).
43
+ - Einfach zu testen und zu erweitern.
44
+
45
+ ---
46
+
47
+ - [Installation](#installation)
48
+ - [API Client](#api-client)
49
+ - [Initialisierung](#initialisierung)
50
+ - [Banking::BankConnection (Bankverbindung)](#bankingbankconnection-bankverbindung)
51
+ - [alle Bankverbindungen](#alle-bankverbindungen)
52
+ - [eine Bankverbindung](#eine-bankverbindung)
53
+ - [Banking::Transaction (Kontoumsatz)](#bankingtransaction-kontoumsatz)
54
+ - [Contact::Company (Unternehmen)](#contactcompany-unternehmen)
55
+ - [alle Unternehmen](#alle-unternehmen)
56
+ - [ein Unternehmen](#ein-unternehmen)
57
+ - [Contact::Company (Kontaktperson eines Unternehmens)](#contactcompany-kontaktperson-eines-unternehmens)
58
+ - [alle Kontaktpersonen (eines Unternehmens)](#alle-kontaktpersonen-eines-unternehmens)
59
+ - [eine Kontaktperson (eines Unternehmens)](#eine-kontaktperson-eines-unternehmens)
60
+ - [Expense::Voucher (Ausgabe Beleg)](#expensevoucher-ausgabe-beleg)
61
+ - [alle Ausgabe Belege](#alle-ausgabe-belege)
62
+ - [einen Ausgabe Beleg](#einen-ausgabe-beleg)
63
+ - [einen Ausgabe Beleg als PDF](#einen-ausgabe-beleg-als-pdf)
64
+ - [Income::Estimate (Angebot)](#incomeestimate-angebot)
65
+ - [alle Angebote](#alle-angebote)
66
+ - [ein Angebot](#ein-angebot)
67
+ - [ein Angebot als PDF](#ein-angebot-als-pdf)
68
+ - [Income::Invoice (Rechnung)](#incomeinvoice-rechnung)
69
+ - [alle Rechnungen](#alle-rechnungen)
70
+ - [eine Rechnung](#eine-rechnung)
71
+ - [eine Rechnung als PDF](#eine-rechnung-als-pdf)
72
+ - [Income::Proposition (Waren / Dienstleistungen)](#incomeproposition-waren--dienstleistungen)
73
+ - [alle Waren / Dienstleistungen](#alle-waren--dienstleistungen)
74
+ - [eine Ware / Dienstleistung](#eine-ware--dienstleistung)
75
+ - [Info](#info)
76
+ - [Project::Project (Projekt)](#projectproject-projekt)
77
+ - [alle Projekte](#alle-projekte)
78
+ - [ein Projekt](#ein-projekt)
79
+ - [Tracker::Task (Aufgabe)](#trackertask-aufgabe)
80
+ - [alle Aufgaben](#alle-aufgaben)
81
+ - [Tracker::TimeEntry (Zeiteintrag)](#trackertimeentry-zeiteintrag)
82
+ - [alle Zeiteinträge](#alle-zeiteinträge)
83
+ - [einen Zeiteintrag](#einen-zeiteintrag)
84
+ - [Verbleibendes Quota](#verbleibendes-quota)
85
+ - [Helpers](#helpers)
86
+ - [Generiere ein PDF aus Response](#generiere-ein-pdf-aus-response)
87
+ - [Development](#development)
88
+ - [Contributing](#contributing)
89
+ - [License](#license)
90
+
91
+ ## Installation
92
+
93
+ TODO: Replace `UPDATE_WITH_YOUR_GEM_NAME_PRIOR_TO_RELEASE_TO_RUBYGEMS_ORG` with your gem name right after releasing it to RubyGems.org. Please do not do it earlier due to security reasons. Alternatively, replace this section with instructions to install your gem from git if you don't plan to release to RubyGems.org.
94
+
95
+ Install the gem and add to the application's Gemfile by executing:
96
+
97
+ $ bundle add papierkram_api_client
98
+
99
+ If bundler is not being used to manage dependencies, install the gem by executing:
100
+
101
+ $ gem install papierkram_api_client
102
+
103
+ ## API Client
104
+
105
+ Der API Client ist die Hauptklasse für die Kommunikation mit der Papierkram API. Er wird mit den Zugangsdaten initialisiert.
106
+
107
+ [Client](/lib/papierkram_api_client.rb)
108
+
109
+ Wenn du etwas hinter die Kulissen sehen willst, schau dir diese [Faraday](https://github.com/lostisland/faraday) Klasse an [Faraday::Response](https://github.com/lostisland/faraday/blob/main/lib/faraday/response.rb).
110
+
111
+
112
+ ### Initialisierung
113
+
114
+ Entweder werden die Zugangsdaten als Argumente übergeben:
115
+
116
+ ```ruby
117
+ # usage with subdomain and api key
118
+ client = PapierkramApiClient::Client.new('subdomain', "SUPER-LONG-API-KEY")
119
+ ```
120
+
121
+ Oder es werden die Umgebungsvariablen `PAPIERKRAM_SUBDOMAIN` und `PAPIERKRAM_API_KEY` gesetzt und der Client ohne Argumente initialisiert.
122
+
123
+ ```ruby
124
+ # usage with environment variables
125
+ client = PapierkramApiClient::Client.new
126
+ ```
127
+
128
+ ### Banking::BankConnection (Bankverbindung)
129
+
130
+ Der Endpunkt `/api/v1/banking/bank_connections` liefert Informationen über die Bankverbindungen. Die Informationen werden als `Faraday::Response` zurückgegeben.
131
+
132
+ [BankConnections](/lib/api/v1/banking/bank_connections.rb)
133
+
134
+ #### alle Bankverbindungen
135
+
136
+ ```ruby
137
+ bank_connections = client.banking.bank_connections.all
138
+ puts bank_connections.headers
139
+ puts bank_connections.body
140
+ ```
141
+
142
+ ```ruby
143
+ # body
144
+ {
145
+ "type"=>"list",
146
+ "page"=>1,
147
+ "page_size"=>100,
148
+ "total_pages"=>1,
149
+ "total_entries"=>1,
150
+ "has_more"=>false,
151
+ "entries"=>[
152
+ { "type"=>"bank_connection",
153
+ "id"=>4,
154
+ "name"=>"Standard" }
155
+ ]
156
+ }
157
+ ```
158
+
159
+ #### eine Bankverbindung
160
+
161
+ ```ruby
162
+ bank_connection = client.banking.bank_connections.by(id: 1)
163
+ puts bank_connection.headers
164
+ puts bank_connection.body
165
+ ```
166
+
167
+ ```ruby
168
+ # body
169
+ {
170
+ "type"=>"bank_connection",
171
+ "id"=>4,
172
+ "name"=>"Standard",
173
+ "account_no"=>nil,
174
+ "account_type"=>"default",
175
+ "bic"=>nil,
176
+ "blz"=>nil,
177
+ "connection_type"=>"default",
178
+ "created_at"=>"2019-12-31T13:29:19.000+01:00",
179
+ "customer_id"=>nil,
180
+ "hbci"=>nil,
181
+ "hbci_host_url"=>nil,
182
+ "hbci_version"=>nil,
183
+ "primary"=>nil,
184
+ "title"=>"Standard",
185
+ "updated_at"=>"2020-11-03T10:31:56.000+01:00",
186
+ "user_id"=>nil,
187
+ "iban"=>""
188
+ }
189
+ ```
190
+
191
+ ### Banking::Transaction (Kontoumsatz)
192
+
193
+ WORK IN PROGRESS
194
+
195
+ [Transactions](/lib/api/v1/banking/transactions.rb)
196
+
197
+ ### Contact::Company (Unternehmen)
198
+
199
+ Der Endpunkt `/api/v1/contact/companies` liefert Informationen über die Unternehmen. Die Informationen werden als `Faraday::Response` zurückgegeben.
200
+
201
+ [Companies](/lib/api/v1/contact/companies.rb)
202
+
203
+ #### alle Unternehmen
204
+
205
+ ```ruby
206
+ companies = client.contact.companies.all
207
+ puts companies.headers
208
+ puts companies.body
209
+ ```
210
+
211
+ #### ein Unternehmen
212
+
213
+ ```ruby
214
+ company = client.contact.companies.by(id: 1)
215
+ puts company.headers
216
+ puts company.body
217
+ ```
218
+
219
+ ### Contact::Company (Kontaktperson eines Unternehmens)
220
+
221
+ Der Endpunkt `/api/v1/contact/companies/{company_id}` liefert Informationen über die Kontaktpersonen. Die Informationen werden als `Faraday::Response` zurückgegeben.
222
+
223
+ #### alle Kontaktpersonen (eines Unternehmens)
224
+
225
+ ```ruby
226
+ companies = client.contact.companies_persons.all(company_id: 1)
227
+ puts companies.headers
228
+ puts companies.body
229
+ ```
230
+
231
+ #### eine Kontaktperson (eines Unternehmens)
232
+
233
+ ```ruby
234
+ company = client.contact.companies_persons.by(company_id: 1, id: 1)
235
+ puts company.headers
236
+ puts company.body
237
+ ```
238
+
239
+ ### Expense::Voucher (Ausgabe Beleg)
240
+
241
+ Der Endpunkt `/api/v1/expense/vouchers` liefert Informationen über die Ausgabe Belege. Die Informationen werden als `Faraday::Response` zurückgegeben.
242
+
243
+ [Vouchers](/lib/api/v1/expense/vouchers.rb)
244
+
245
+ #### alle Ausgabe Belege
246
+
247
+ ```ruby
248
+ vouchers = client.expense.vouchers.all
249
+ puts vouchers.headers
250
+ puts vouchers.body
251
+ ```
252
+
253
+ #### einen Ausgabe Beleg
254
+
255
+ ```ruby
256
+ voucher = client.expense.vouchers.by(id: 1)
257
+ puts voucher.headers
258
+ puts voucher.body
259
+ ```
260
+
261
+ #### einen Ausgabe Beleg als PDF
262
+
263
+ ```ruby
264
+ voucher = client.expense.vouchers.pdf(id: 1, pdf: true)
265
+ puts Api::V1::Helpers::PdfFromResponse.new(voucher).to_pdf # => {response: Faraday::Response, path_to_pdf_file: 'path/to/tempfile_pdf.pdf'}
266
+ ```
267
+
268
+ ### Income::Estimate (Angebot)
269
+
270
+ Der Endpunkt `/api/v1/income/estimates` liefert Informationen über die Angebote. Die Informationen werden als `Faraday::Response` zurückgegeben.
271
+
272
+ [Estimates](/lib/api/v1/income/estimates.rb)
273
+
274
+ #### alle Angebote
275
+
276
+ ```ruby
277
+ estimates = client.income.estimates.all
278
+ puts estimates.headers
279
+ puts estimates.body
280
+ ```
281
+
282
+ #### ein Angebot
283
+
284
+ ```ruby
285
+ estimate = client.income.estimates.by(id: 1)
286
+ puts estimate.headers
287
+ puts estimate.body
288
+ ```
289
+
290
+ #### ein Angebot als PDF
291
+
292
+ ```ruby
293
+ estimate = client.income.estimates.pdf(id: 1, pdf: true)
294
+ puts Api::V1::Helpers::PdfFromResponse.new(estimate).to_pdf # => {response: Faraday::Response, path_to_pdf_file: 'path/to/tempfile_pdf.pdf'}
295
+ ```
296
+
297
+ ### Income::Invoice (Rechnung)
298
+
299
+ Der Endpunkt `/api/v1/income/invoices` liefert Informationen über die Rechnungen. Die Informationen werden als `Faraday::Response` zurückgegeben.
300
+
301
+ [Invoices](/lib/api/v1/income/invoices.rb)
302
+
303
+ #### alle Rechnungen
304
+
305
+ ```ruby
306
+ invoices = client.income.invoices.all
307
+ puts invoices.headers
308
+ puts invoices.body
309
+ ```
310
+
311
+ #### eine Rechnung
312
+
313
+ ```ruby
314
+ invoice = client.income.invoices.by(id: 1)
315
+ puts invoice.headers
316
+ puts invoice.body
317
+ ```
318
+
319
+ #### eine Rechnung als PDF
320
+
321
+ ```ruby
322
+ invoice = client.income.invoices.pdf(id: 1, pdf: true)
323
+ puts Api::V1::Helpers::PdfFromResponse.new(invoice).to_pdf # => {response: Faraday::Response, path_to_pdf_file: 'path/to/tempfile_pdf.pdf'}
324
+ ```
325
+
326
+ ### Income::Proposition (Waren / Dienstleistungen)
327
+
328
+ Der Endpunkt `/api/v1/income/propositions` liefert Informationen über die Waren / Dienstleistungen. Die Informationen werden als `Faraday::Response` zurückgegeben.
329
+
330
+ [Propositions](/lib/api/v1/income/propositions.rb)
331
+
332
+ #### alle Waren / Dienstleistungen
333
+
334
+ ```ruby
335
+ propositions = client.income.propositions.all
336
+ puts propositions.headers
337
+ puts propositions.body
338
+ ```
339
+
340
+ #### eine Ware / Dienstleistung
341
+
342
+ ```ruby
343
+ proposition = client.income.propositions.by(id: 1)
344
+ puts proposition.headers
345
+ puts proposition.body
346
+ ```
347
+
348
+ ### Info
349
+
350
+ Der Endpunkt `/api/v1/info` liefert Informationen über die API. Die Informationen werden als `Faraday::Response` zurückgegeben.
351
+
352
+ [Info](/lib/api/v1/info.rb)
353
+
354
+ ```ruby
355
+ info = client.info.details
356
+ puts info.headers
357
+ puts info.body
358
+ ```
359
+
360
+ ### Project::Project (Projekt)
361
+
362
+ Der Endpunkt `/api/v1/projects` liefert Informationen über die Projekte. Die Informationen werden als `Faraday::Response` zurückgegeben.
363
+
364
+ [Projects](/lib/api/v1/projects.rb)
365
+
366
+ #### alle Projekte
367
+
368
+ ```ruby
369
+ projects = client.projects.all
370
+ puts projects.headers
371
+ puts projects.body
372
+ ```
373
+
374
+ #### ein Projekt
375
+
376
+ ```ruby
377
+ project = client.projects.by(id: 1)
378
+ puts project.headers
379
+ puts project.body
380
+ ```
381
+
382
+ ### Tracker::Task (Aufgabe)
383
+
384
+ Der Endpunkt `/api/v1/tracker/tasks` liefert Informationen über die Aufgaben. Die Informationen werden als `Faraday::Response` zurückgegeben.
385
+
386
+ #### alle Aufgaben
387
+
388
+ ```ruby
389
+ tasks = client.tracker.tasks.all
390
+ puts tasks.headers
391
+ puts tasks.body
392
+ ```
393
+
394
+ ### Tracker::TimeEntry (Zeiteintrag)
395
+
396
+ Der Endpunkt `/api/v1/tracker/time_entries` liefert Informationen über die Zeiteinträge. Die Informationen werden als `Faraday::Response` zurückgegeben.
397
+
398
+ [TimeEntries](/lib/api/v1/tracker/time_entries.rb)
399
+
400
+ #### alle Zeiteinträge
401
+
402
+ ```ruby
403
+ time_entries = client.tracker.time_entries.all
404
+ puts time_entries.headers
405
+ puts time_entries.body
406
+ ```
407
+
408
+ #### einen Zeiteintrag
409
+
410
+ ```ruby
411
+ time_entry = client.tracker.time_entries.by(id: 1)
412
+ puts time_entry.headers
413
+ puts time_entry.body
414
+ ```
415
+
416
+ ### Verbleibendes Quota
417
+
418
+ Jede API Anfrage "kostet" 1 Quota. Das Quota wird bei jedem Request aktualisiert. Um das verbleibende Quota zu erhalten, kann die Methode `remaining_quota` aufgerufen werden.
419
+
420
+ [Base](/lib/api/v1/base.rb)
421
+
422
+ Du kannst dein Quota über die Papierkram Webseite einsehen. Die Anzahl der verbleibenden Anfragen wird dir dort angezeigt.
423
+
424
+ Oder nach jeder Anfrage per Client:
425
+
426
+ ```ruby
427
+ # `client.info` ist nur eine Möglichkeit, es kann jeder andere Endpoint verwendet werden ✌️
428
+ response = client.info.details
429
+ quota = client.info.remaining_quota(response)
430
+ ```
431
+
432
+ ## Helpers
433
+
434
+ Es gibt einige Helper, die dir das Leben leichter machen.
435
+
436
+ ### Generiere ein PDF aus Response
437
+
438
+ Mit dem Helper `Api::V1::Helpers::PdfFromResponse` kannst du für unterstützte Endpunkte aus einer `Faraday::Response` ein PDF schreiben.
439
+
440
+ Unterstützte Endpunkte sind beispielsweise: `Income::Estimate`, `Income::Invoice`, `Expense::Voucher`.
441
+
442
+ [Api::V1::Helpers::PdfFromResponse](/lib/api/v1/helpers/pdf_from_response.rb)
443
+
444
+ ```ruby
445
+ response = client.income.invoices.by(id: 1, pdf: true)
446
+ pdf = Api::V1::Helpers::PdfFromResponse.new(response).to_pdf("Rechnung Nummer XXX")
447
+ puts pdf
448
+ ```
449
+
450
+ ```ruby
451
+ # value of `pdf`
452
+ {
453
+ response: Faraday::Response,
454
+ path_to_pdf_file: 'path/to/temp/Rechnung Nummer XXX.pdf'
455
+ }
456
+ ```
457
+
458
+ ## Development
459
+
460
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
461
+
462
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
463
+
464
+ ## Contributing
465
+
466
+ Bug reports and pull requests are welcome on GitHub at https://github.com/simonneutert/papierkram_api_client.
467
+
468
+ Bitte achte darauf, dass du die Tests ausführst und die Tests dann auch grün sind 🤓
469
+
470
+ 🚨 **SEHR WICHTIG!** Dein API Key wird in den Tests verwendet werden. **Bitte achte darauf**, dass du den API Key nicht in deinen Commits hast! Wenn du per Environment Variable arbeitest, dann wird dein API Key **nicht von VCR aufgezeichnet**. Das bedeutet, dass du deine Tests nicht mit deinem API Key ausführen solltest. ⚠️
471
+
472
+ 🚨 **NOCH WICHTIGER!** deine Kundendaten, also Klarnamen, E-Mails und Telefonnummern haben hier nichts verloren! Bitte sorge dafür, dass du deine Tests mit einem Testaccount ausführst. 🙏 ODER editiere deine Kundendaten in den *VCR Cassettes* nach dem Test. 🙏
473
+
474
+ Wenn du unsicher bist, sprich mich an oder erstelle ein Issue. Ich helfe dir gerne weiter. 🤗
475
+
476
+ ## License
477
+
478
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'rake/testtask'
5
+
6
+ Rake::TestTask.new(:test) do |t|
7
+ t.libs << 'test'
8
+ t.libs << 'lib'
9
+ t.test_files = FileList['test/**/test_*.rb']
10
+ end
11
+
12
+ task default: %i[test]