papierkram_api_client 0.1.3 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +5 -0
- data/CHANGELOG.md +13 -0
- data/Gemfile.lock +3 -3
- data/README.md +155 -55
- data/lib/papierkram_api/client.rb +92 -0
- data/lib/papierkram_api/v1/business_intelligence/base.rb +23 -0
- data/lib/papierkram_api/v1/business_intelligence/expenses_by_category.rb +98 -0
- data/lib/papierkram_api/v1/business_intelligence/smart_queries/expense_vouchers_for_month_in_year.rb +58 -0
- data/lib/papierkram_api/v1/endpoints/banking/bank_connections.rb +30 -0
- data/lib/papierkram_api/v1/endpoints/banking/transactions.rb +20 -0
- data/lib/papierkram_api/v1/endpoints/base.rb +77 -0
- data/lib/papierkram_api/v1/endpoints/contact/companies.rb +30 -0
- data/lib/papierkram_api/v1/endpoints/contact/companies_persons.rb +28 -0
- data/lib/papierkram_api/v1/endpoints/expense/vouchers.rb +45 -0
- data/lib/papierkram_api/v1/endpoints/income/estimates.rb +46 -0
- data/lib/papierkram_api/v1/endpoints/income/invoices.rb +46 -0
- data/lib/papierkram_api/v1/endpoints/income/propositions.rb +20 -0
- data/lib/papierkram_api/v1/endpoints/info.rb +14 -0
- data/lib/papierkram_api/v1/endpoints/projects.rb +26 -0
- data/lib/papierkram_api/v1/endpoints/tracker/tasks.rb +33 -0
- data/lib/papierkram_api/v1/endpoints/tracker/time_entries.rb +62 -0
- data/lib/papierkram_api/v1/helper/date_helper.rb +14 -0
- data/lib/{api → papierkram_api}/v1/helper/pdf_from_response.rb +1 -1
- data/lib/papierkram_api/v1/validators/expense_voucher.rb +105 -0
- data/lib/papierkram_api_client/version.rb +1 -1
- data/lib/papierkram_api_client.rb +21 -102
- metadata +22 -16
- data/lib/api/v1/banking/bank_connections.rb +0 -28
- data/lib/api/v1/banking/transactions.rb +0 -18
- data/lib/api/v1/base.rb +0 -75
- data/lib/api/v1/contact/companies.rb +0 -28
- data/lib/api/v1/contact/companies_persons.rb +0 -26
- data/lib/api/v1/expense/vouchers.rb +0 -43
- data/lib/api/v1/income/estimates.rb +0 -44
- data/lib/api/v1/income/invoices.rb +0 -44
- data/lib/api/v1/income/propositions.rb +0 -18
- data/lib/api/v1/info.rb +0 -12
- data/lib/api/v1/projects.rb +0 -24
- data/lib/api/v1/tracker/tasks.rb +0 -31
- data/lib/api/v1/tracker/time_entries.rb +0 -59
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c428355fa2303fe4086587e47b981b46eac42c498ea84cb2ada942b8b926e1d1
|
4
|
+
data.tar.gz: 63f9f3524d98be430356ebc7e19bc344a0e388f9b99c71dcd4303a7427fd0635
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c4a0d1e8ae94400e56919997bd82daa69cec0ee3b3e6c26d0525e952c6f075238effe6a589c7217c4d89658ec7e2c41c61159b06362898cf4aed7c7f50399103
|
7
|
+
data.tar.gz: b9abc76a4a14af64eaaa07f98e925a164b1474c40e4a618830966c269c3bccb4f28d8334a07b1ea4672b295e6f3d1ef6808bbbae6147bef4b211b0776bda200c
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,16 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
## [0.2.0] - 2023-04-18
|
4
|
+
|
5
|
+
Das Namespacing hat sich geändert. Die Klasse `PapierkramApiClient` ist jetzt `PapierkramApi::Client`.
|
6
|
+
|
7
|
+
Bitte schaue für Details in die upgedatete Dokumentation in [README.md](README.md) und passe gegebenenfalls deinen Code an.
|
8
|
+
|
9
|
+
### Changed
|
10
|
+
|
11
|
+
- [#19](https://github.com/simonneutert/papierkram_api_client/pull/19) Bump rubocop from 1.50.1 to 1.50.2. [@simonneutert](https://github.com/simonneutert)
|
12
|
+
- [#18](https://github.com/simonneutert/papierkram_api_client/pull/18) Stub basic business intelligence module. [@simonneutert](https://github.com/simonneutert)
|
13
|
+
|
1
14
|
## [0.1.3] - 2023-04-15
|
2
15
|
|
3
16
|
Solltest du diesen Client mithilfe von Umgebungsvariablen einrichten, musst du deinen Code aktualisieren, um die neuen Variablen zu verwenden. Siehe `.env.sample` für die aktualisierten Variablen.
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
papierkram_api_client (0.
|
4
|
+
papierkram_api_client (0.2.0)
|
5
5
|
faraday (~> 2.7)
|
6
6
|
httpx (~> 0.22.5)
|
7
7
|
|
@@ -34,9 +34,9 @@ GEM
|
|
34
34
|
method_source (~> 1.0)
|
35
35
|
rainbow (3.1.1)
|
36
36
|
rake (13.0.6)
|
37
|
-
regexp_parser (2.
|
37
|
+
regexp_parser (2.8.0)
|
38
38
|
rexml (3.2.5)
|
39
|
-
rubocop (1.50.
|
39
|
+
rubocop (1.50.2)
|
40
40
|
json (~> 2.3)
|
41
41
|
parallel (~> 1.10)
|
42
42
|
parser (>= 3.2.0.0)
|
data/README.md
CHANGED
@@ -4,8 +4,14 @@
|
|
4
4
|
|
5
5
|
Der erste ~~illegale~~ inoffizielle API Client in [Ruby](https://www.ruby-lang.org/de/) für [Papierkram.de](https://www.papierkram.de)!
|
6
6
|
|
7
|
+
### Hol mehr aus deinen Daten raus! Dieser Client bietet dir bald einige Features im Bereich [Business Intelligence](#business-intelligence)!<!-- omit in toc -->
|
8
|
+
|
9
|
+
---
|
10
|
+
|
7
11
|
<img src="pac.svg" alt="PAC Logo, Zunge leckt an Karl Klammer und zieht Daten aus dem Papierkram-Account wie Frosch die Fliege vom Teich" width="300">
|
8
12
|
|
13
|
+
Hol dir den [Papierkram API Client](https://rubygems.org/gems/papierkram_api_client) als [Ruby Gem](https://rubygems.org/gems/papierkram_api_client)!
|
14
|
+
|
9
15
|
---
|
10
16
|
|
11
17
|
**WERBUNG** (es ist ein Aufruf zur Mitarbeit 🫠)
|
@@ -20,8 +26,8 @@ Das Gleiche, nur in grün, also für [NodeJS](https://github.com/simonneutert/pa
|
|
20
26
|
|
21
27
|
Check das [CHANGELOG.md](CHANGELOG.md), Baby!
|
22
28
|
|
23
|
-
|
24
|
-
https://DEINE-SUBDOMAIN.papierkram.de/
|
29
|
+
Hier geht es zu den offiziellen API Docs
|
30
|
+
https://DEINE-SUBDOMAIN.papierkram.de/papierkram_api/v1/api-docs/index.html
|
25
31
|
(wenn du bereits ein Papierkram-Konto hast).
|
26
32
|
Schau bitte dort um alle Rückgabefelder/-werte zu checken, bis ich die Dokumentation hier komplett habe.
|
27
33
|
|
@@ -46,7 +52,7 @@ Aktuell unterstützte Endpunkte / Objekte:
|
|
46
52
|
|
47
53
|
## Was, wie, warum?<!-- omit in toc -->
|
48
54
|
|
49
|
-
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/
|
55
|
+
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/papierkram_api/v1/api-docs/index.html](https://DEINE-SUBDOMAIN.papierkram.de/papierkram_api/v1/api-docs/index.html). Dieses Projekt soll eine einfache Schnittstelle für die Papierkram API bereitstellen.
|
50
56
|
|
51
57
|
Ziele:
|
52
58
|
|
@@ -96,6 +102,10 @@ Ziele:
|
|
96
102
|
- [alle Zeiteinträge](#alle-zeiteinträge)
|
97
103
|
- [einen Zeiteintrag](#einen-zeiteintrag)
|
98
104
|
- [Verbleibendes Quota](#verbleibendes-quota)
|
105
|
+
- [Business Intelligence](#business-intelligence)
|
106
|
+
- [Business::Intelligence (BI) ExpenseByCategory (Ausgaben nach Kategorie)](#businessintelligence-bi-expensebycategory-ausgaben-nach-kategorie)
|
107
|
+
- [alle Ausgaben eines Monats nach Kategorie](#alle-ausgaben-eines-monats-nach-kategorie)
|
108
|
+
- [alle Ausgaben eines Monats nach Kategorie gefiltert nach Steuersatz](#alle-ausgaben-eines-monats-nach-kategorie-gefiltert-nach-steuersatz)
|
99
109
|
- [Helpers](#helpers)
|
100
110
|
- [Generiere ein PDF aus Response](#generiere-ein-pdf-aus-response)
|
101
111
|
- [Development](#development)
|
@@ -122,10 +132,10 @@ If bundler is not being used to manage dependencies, install the gem by executin
|
|
122
132
|
# client instanziieren
|
123
133
|
|
124
134
|
# wenn ENV gesetzt sind (siehe Readme)
|
125
|
-
client =
|
135
|
+
client = PapierkramApi::Client.new
|
126
136
|
|
127
137
|
# ODER per Variablen
|
128
|
-
client =
|
138
|
+
client = PapierkramApi::Client.new('subdomain', "YOUR-API-KEY");
|
129
139
|
|
130
140
|
# info Endpunkt abfragen
|
131
141
|
info_details = client.info.details
|
@@ -142,41 +152,44 @@ puts invoices.body
|
|
142
152
|
|
143
153
|
Der API Client ist die Hauptklasse für die Kommunikation mit der Papierkram API. Er wird mit den Zugangsdaten initialisiert.
|
144
154
|
|
145
|
-
[Client](
|
155
|
+
[Client](lib/papierkram_api/client.rb)
|
146
156
|
|
147
157
|
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).
|
148
158
|
|
149
|
-
|
150
159
|
### Initialisierung
|
151
160
|
|
152
161
|
Entweder werden die Zugangsdaten als Argumente übergeben:
|
153
162
|
|
154
163
|
```ruby
|
155
164
|
# usage with subdomain and api key
|
156
|
-
client =
|
165
|
+
client = PapierkramApi::Client.new('subdomain', "SUPER-LONG-API-KEY")
|
157
166
|
```
|
158
167
|
|
159
168
|
Oder es werden die Umgebungsvariablen `PAPIERKRAM_API_SUBDOMAIN` und `PAPIERKRAM_API_KEY` gesetzt und der Client ohne Argumente initialisiert.
|
160
169
|
|
161
170
|
```ruby
|
162
171
|
# usage with environment variables
|
163
|
-
client =
|
172
|
+
client = PapierkramApi::Client.new
|
164
173
|
```
|
165
174
|
|
166
175
|
### Banking::BankConnection (Bankverbindung)
|
167
176
|
|
168
|
-
Der Endpunkt `/
|
177
|
+
Der Endpunkt `/papierkram_api/v1/endpoints/banking/bank_connections` liefert Informationen über die Bankverbindungen. Die Informationen werden als `Faraday::Response` zurückgegeben.
|
169
178
|
|
170
|
-
Siehe [BankConnections](
|
179
|
+
Siehe [BankConnections](lib/papierkram_api/v1/endpoints/banking/bank_connections.rb) für mögliche Parameter.
|
171
180
|
|
172
181
|
#### alle Bankverbindungen
|
173
182
|
|
174
183
|
```ruby
|
175
|
-
bank_connections = client.
|
184
|
+
bank_connections = client.banking_bank_connections.all
|
176
185
|
puts bank_connections.headers
|
177
186
|
puts bank_connections.body
|
178
187
|
```
|
179
188
|
|
189
|
+
<details>
|
190
|
+
|
191
|
+
<summary>Response</summary>
|
192
|
+
|
180
193
|
```ruby
|
181
194
|
# body
|
182
195
|
{
|
@@ -194,14 +207,20 @@ puts bank_connections.body
|
|
194
207
|
}
|
195
208
|
```
|
196
209
|
|
210
|
+
</details>
|
211
|
+
|
197
212
|
#### eine Bankverbindung
|
198
213
|
|
199
214
|
```ruby
|
200
|
-
bank_connection = client.
|
215
|
+
bank_connection = client.banking_bank_connections.by(id: 1)
|
201
216
|
puts bank_connection.headers
|
202
217
|
puts bank_connection.body
|
203
218
|
```
|
204
219
|
|
220
|
+
<details>
|
221
|
+
|
222
|
+
<summary>Response</summary>
|
223
|
+
|
205
224
|
```ruby
|
206
225
|
# body
|
207
226
|
{
|
@@ -226,17 +245,19 @@ puts bank_connection.body
|
|
226
245
|
}
|
227
246
|
```
|
228
247
|
|
248
|
+
</details>
|
249
|
+
|
229
250
|
### Banking::Transaction (Kontoumsatz)
|
230
251
|
|
231
252
|
WORK IN PROGRESS
|
232
253
|
|
233
|
-
[Transactions](
|
254
|
+
[Transactions](lib/papierkram_api/v1/endpoints/banking/transactions.rb)
|
234
255
|
|
235
256
|
### Contact::Company (Unternehmen)
|
236
257
|
|
237
|
-
Der Endpunkt `/
|
258
|
+
Der Endpunkt `/papierkram_api/v1/endpoints/contact/companies` liefert Informationen über die Unternehmen. Die Informationen werden als `Faraday::Response` zurückgegeben.
|
238
259
|
|
239
|
-
Siehe [Companies](
|
260
|
+
Siehe [Companies](lib/papierkram_api/v1/endpoints/contact/companies.rb) für mögliche Parameter.
|
240
261
|
|
241
262
|
#### alle Unternehmen
|
242
263
|
|
@@ -256,14 +277,14 @@ puts company.body
|
|
256
277
|
|
257
278
|
### Contact::Company (Kontaktperson eines Unternehmens)
|
258
279
|
|
259
|
-
Der Endpunkt `/
|
280
|
+
Der Endpunkt `/papierkram_api/v1/endpoints/contact/companies/{company_id}` liefert Informationen über die Kontaktpersonen. Die Informationen werden als `Faraday::Response` zurückgegeben.
|
260
281
|
|
261
|
-
Siehe [CompaniesPersons](
|
282
|
+
Siehe [CompaniesPersons](lib/papierkram_api/v1/endpoints/contact/companies_persons.rb) für mögliche Parameter.
|
262
283
|
|
263
284
|
#### alle Kontaktpersonen (eines Unternehmens)
|
264
285
|
|
265
286
|
```ruby
|
266
|
-
companies = client.
|
287
|
+
companies = client.contact_companies_persons.all(company_id: 1)
|
267
288
|
puts companies.headers
|
268
289
|
puts companies.body
|
269
290
|
```
|
@@ -271,21 +292,21 @@ puts companies.body
|
|
271
292
|
#### eine Kontaktperson (eines Unternehmens)
|
272
293
|
|
273
294
|
```ruby
|
274
|
-
company = client.
|
295
|
+
company = client.contact_companies_persons.by(company_id: 1, id: 1)
|
275
296
|
puts company.headers
|
276
297
|
puts company.body
|
277
298
|
```
|
278
299
|
|
279
300
|
### Expense::Voucher (Ausgabe Beleg)
|
280
301
|
|
281
|
-
Der Endpunkt `/
|
302
|
+
Der Endpunkt `/papierkram_api/v1/endpoints/expense/vouchers` liefert Informationen über die Ausgabe Belege. Die Informationen werden als `Faraday::Response` zurückgegeben.
|
282
303
|
|
283
|
-
Siehe [Vouchers](
|
304
|
+
Siehe [Vouchers](lib/papierkram_api/v1/endpoints/expense/vouchers.rb) für mögliche Parameter.
|
284
305
|
|
285
306
|
#### alle Ausgabe Belege
|
286
307
|
|
287
308
|
```ruby
|
288
|
-
vouchers = client.
|
309
|
+
vouchers = client.expense_vouchers.all
|
289
310
|
puts vouchers.headers
|
290
311
|
puts vouchers.body
|
291
312
|
```
|
@@ -293,7 +314,7 @@ puts vouchers.body
|
|
293
314
|
#### einen Ausgabe Beleg
|
294
315
|
|
295
316
|
```ruby
|
296
|
-
voucher = client.
|
317
|
+
voucher = client.expense_vouchers.by(id: 1)
|
297
318
|
puts voucher.headers
|
298
319
|
puts voucher.body
|
299
320
|
```
|
@@ -301,21 +322,21 @@ puts voucher.body
|
|
301
322
|
#### einen Ausgabe Beleg als PDF
|
302
323
|
|
303
324
|
```ruby
|
304
|
-
voucher = client.
|
305
|
-
puts
|
325
|
+
voucher = client.expense_vouchers.by(id: 1, pdf: true)
|
326
|
+
puts PapierkramApi::V1::Helpers::PdfFromResponse.new(voucher).to_pdf
|
306
327
|
# => {response: Faraday::Response, path_to_pdf_file: 'path/to/tempfile_pdf.pdf'}
|
307
328
|
```
|
308
329
|
|
309
330
|
### Income::Estimate (Angebot)
|
310
331
|
|
311
|
-
Der Endpunkt `/
|
332
|
+
Der Endpunkt `/papierkram_api/v1/endpoints/income/estimates` liefert Informationen über die Angebote. Die Informationen werden als `Faraday::Response` zurückgegeben.
|
312
333
|
|
313
|
-
Siehe [Estimates](
|
334
|
+
Siehe [Estimates](lib/papierkram_api/v1/endpoints/income/estimates.rb) für mögliche Parameter.
|
314
335
|
|
315
336
|
#### alle Angebote
|
316
337
|
|
317
338
|
```ruby
|
318
|
-
estimates = client.
|
339
|
+
estimates = client.income_estimates.all
|
319
340
|
puts estimates.headers
|
320
341
|
puts estimates.body
|
321
342
|
```
|
@@ -323,7 +344,7 @@ puts estimates.body
|
|
323
344
|
#### ein Angebot
|
324
345
|
|
325
346
|
```ruby
|
326
|
-
estimate = client.
|
347
|
+
estimate = client.income_estimates.by(id: 1)
|
327
348
|
puts estimate.headers
|
328
349
|
puts estimate.body
|
329
350
|
```
|
@@ -331,21 +352,21 @@ puts estimate.body
|
|
331
352
|
#### ein Angebot als PDF
|
332
353
|
|
333
354
|
```ruby
|
334
|
-
estimate = client.
|
335
|
-
puts
|
355
|
+
estimate = client.income_estimates.by(id: 1, pdf: true)
|
356
|
+
puts PapierkramApi::V1::Helpers::PdfFromResponse.new(estimate).to_pdf
|
336
357
|
# => {response: Faraday::Response, path_to_pdf_file: 'path/to/tempfile_pdf.pdf'}
|
337
358
|
```
|
338
359
|
|
339
360
|
### Income::Invoice (Rechnung)
|
340
361
|
|
341
|
-
Der Endpunkt `/
|
362
|
+
Der Endpunkt `/papierkram_api/v1/endpoints/income/invoices` liefert Informationen über die Rechnungen. Die Informationen werden als `Faraday::Response` zurückgegeben.
|
342
363
|
|
343
|
-
Siehe [Invoices](
|
364
|
+
Siehe [Invoices](lib/papierkram_api/v1/endpoints/income/invoices.rb) für mögliche Parameter.
|
344
365
|
|
345
366
|
#### alle Rechnungen
|
346
367
|
|
347
368
|
```ruby
|
348
|
-
invoices = client.
|
369
|
+
invoices = client.income_invoices.all
|
349
370
|
puts invoices.headers
|
350
371
|
puts invoices.body
|
351
372
|
```
|
@@ -353,7 +374,7 @@ puts invoices.body
|
|
353
374
|
#### eine Rechnung
|
354
375
|
|
355
376
|
```ruby
|
356
|
-
invoice = client.
|
377
|
+
invoice = client.income_invoices.by(id: 1)
|
357
378
|
puts invoice.headers
|
358
379
|
puts invoice.body
|
359
380
|
```
|
@@ -361,21 +382,21 @@ puts invoice.body
|
|
361
382
|
#### eine Rechnung als PDF
|
362
383
|
|
363
384
|
```ruby
|
364
|
-
invoice = client.
|
365
|
-
puts
|
385
|
+
invoice = client.income_invoices.by(id: 1, pdf: true)
|
386
|
+
puts PapierkramApi::V1::Helpers::PdfFromResponse.new(invoice).to_pdf
|
366
387
|
# => {response: Faraday::Response, path_to_pdf_file: 'path/to/tempfile_pdf.pdf'}
|
367
388
|
```
|
368
389
|
|
369
390
|
### Income::Proposition (Waren / Dienstleistungen)
|
370
391
|
|
371
|
-
Der Endpunkt `/
|
392
|
+
Der Endpunkt `/papierkram_api/v1/endpoints/income/propositions` liefert Informationen über die Waren / Dienstleistungen. Die Informationen werden als `Faraday::Response` zurückgegeben.
|
372
393
|
|
373
|
-
Siehe [Propositions](
|
394
|
+
Siehe [Propositions](lib/papierkram_api/v1/endpoints/income/propositions.rb) für mögliche Parameter.
|
374
395
|
|
375
396
|
#### alle Waren / Dienstleistungen
|
376
397
|
|
377
398
|
```ruby
|
378
|
-
propositions = client.
|
399
|
+
propositions = client.income_propositions.all
|
379
400
|
puts propositions.headers
|
380
401
|
puts propositions.body
|
381
402
|
```
|
@@ -383,16 +404,16 @@ puts propositions.body
|
|
383
404
|
#### eine Ware / Dienstleistung
|
384
405
|
|
385
406
|
```ruby
|
386
|
-
proposition = client.
|
407
|
+
proposition = client.income_propositions.by(id: 1)
|
387
408
|
puts proposition.headers
|
388
409
|
puts proposition.body
|
389
410
|
```
|
390
411
|
|
391
412
|
### Info
|
392
413
|
|
393
|
-
Der Endpunkt
|
414
|
+
Der Endpunkt `lib/papierkram_api/v1/endpoints/info.rb` liefert Informationen über die API. Die Informationen werden als `Faraday::Response` zurückgegeben.
|
394
415
|
|
395
|
-
Siehe [Info](
|
416
|
+
Siehe [Info](lib/papierkram_api/v1/endpoints/info.rb).
|
396
417
|
|
397
418
|
```ruby
|
398
419
|
info = client.info.details
|
@@ -402,9 +423,9 @@ puts info.body
|
|
402
423
|
|
403
424
|
### Project::Project (Projekt)
|
404
425
|
|
405
|
-
Der Endpunkt `/
|
426
|
+
Der Endpunkt `/papierkram_api/v1/endpoints/projects` liefert Informationen über die Projekte. Die Informationen werden als `Faraday::Response` zurückgegeben.
|
406
427
|
|
407
|
-
Siehe [Projects](
|
428
|
+
Siehe [Projects](lib/papierkram_api/v1/endpoints/projects.rb) für mögliche Parameter.
|
408
429
|
|
409
430
|
#### alle Projekte
|
410
431
|
|
@@ -424,9 +445,9 @@ puts project.body
|
|
424
445
|
|
425
446
|
### Tracker::Task (Aufgabe)
|
426
447
|
|
427
|
-
Der Endpunkt `/
|
448
|
+
Der Endpunkt `/papierkram_api/v1/tracker/tasks` liefert Informationen über die Aufgaben. Die Informationen werden als `Faraday::Response` zurückgegeben.
|
428
449
|
|
429
|
-
Siehe [Tasks](
|
450
|
+
Siehe [Tasks](lib/papierkram_api/v1/endpoints/tracker/tasks.rb) für mögliche Parameter.
|
430
451
|
|
431
452
|
#### alle Aufgaben
|
432
453
|
|
@@ -446,9 +467,9 @@ puts task.body
|
|
446
467
|
|
447
468
|
### Tracker::TimeEntry (Zeiteintrag)
|
448
469
|
|
449
|
-
Der Endpunkt `/
|
470
|
+
Der Endpunkt `/papierkram_api/v1/tracker/time_entries` liefert Informationen über die Zeiteinträge. Die Informationen werden als `Faraday::Response` zurückgegeben.
|
450
471
|
|
451
|
-
[TimeEntries](
|
472
|
+
[TimeEntries](lib/papierkram_api/v1/endpoints/tracker/time_entries.rb)
|
452
473
|
|
453
474
|
#### alle Zeiteinträge
|
454
475
|
|
@@ -470,7 +491,7 @@ puts time_entry.body
|
|
470
491
|
|
471
492
|
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.
|
472
493
|
|
473
|
-
[Base](
|
494
|
+
[Base](lib/papierkram_api/v1/endpoints/base.rb)
|
474
495
|
|
475
496
|
Du kannst dein Quota über die Papierkram Webseite einsehen. Die Anzahl der verbleibenden Anfragen wird dir dort angezeigt.
|
476
497
|
|
@@ -482,21 +503,100 @@ response = client.info.details
|
|
482
503
|
quota = client.info.remaining_quota(response)
|
483
504
|
```
|
484
505
|
|
506
|
+
## Business Intelligence
|
507
|
+
|
508
|
+
TODO ergänzen wie man `SmartQueries` erstellt und verwendet.
|
509
|
+
TODO ergänzen wie man `SmartQueries` funktioneren.
|
510
|
+
TODO ergänzen wie die Rückgabewerte von `SmartQueries` gestaltet werden sollten.
|
511
|
+
|
512
|
+
### Business::Intelligence (BI) ExpenseByCategory (Ausgaben nach Kategorie)
|
513
|
+
|
514
|
+
Der Endpunkt `/papierkram_api/v1/business_intelligence/expense_by_categories` liefert Informationen über die Ausgaben nach Kategorie. Die Informationen werden als `Hash` zurückgegeben.
|
515
|
+
|
516
|
+
#### alle Ausgaben eines Monats nach Kategorie
|
517
|
+
|
518
|
+
```ruby
|
519
|
+
client = PapierkramApi::Client.new
|
520
|
+
expense_voucher_data_service = client.expense_vouchers.data_service(:for_month_in_year_service)
|
521
|
+
expense_vouchers_in_date_range = expense_voucher_data_service.for_month_in_year(year: 2020, month: 8)
|
522
|
+
|
523
|
+
service = client.business_intelligence.expenses_by_category
|
524
|
+
result = service.call(expense_vouchers: expense_vouchers_in_date_range)
|
525
|
+
puts result
|
526
|
+
```
|
527
|
+
|
528
|
+
```ruby
|
529
|
+
{"Betriebsbedarf"=>
|
530
|
+
{"amount"=>476.0,
|
531
|
+
"amount_by_creditor"=>{nil=>476.0},
|
532
|
+
"line_items"=>
|
533
|
+
[{"name"=>"2020-01-03",
|
534
|
+
"amount"=>119.0,
|
535
|
+
"category"=>"Betriebsbedarf",
|
536
|
+
"vat_rate"=>"19%",
|
537
|
+
"billing"=>nil,
|
538
|
+
"depreciation"=>nil,
|
539
|
+
"voucher_name"=>"B-00214 - 2020-08-01",
|
540
|
+
"voucher_id"=>641,
|
541
|
+
"creditor"=>nil},
|
542
|
+
{"name"=>"2020-01-03",
|
543
|
+
"amount"=>119.0,
|
544
|
+
"category"=>"Betriebsbedarf",
|
545
|
+
"vat_rate"=>"19%",
|
546
|
+
"billing"=>nil,
|
547
|
+
"depreciation"=>nil,
|
548
|
+
"voucher_name"=>"B-00215 - 2020-08-02",
|
549
|
+
"voucher_id"=>644,
|
550
|
+
"creditor"=>nil},
|
551
|
+
{"name"=>"2020-01-03",
|
552
|
+
"amount"=>119.0,
|
553
|
+
"category"=>"Betriebsbedarf",
|
554
|
+
"vat_rate"=>"19%",
|
555
|
+
"billing"=>nil,
|
556
|
+
"depreciation"=>nil,
|
557
|
+
"voucher_name"=>"B-00216 - 2020-08-03",
|
558
|
+
"voucher_id"=>647,
|
559
|
+
"creditor"=>nil},
|
560
|
+
{"name"=>"2020-01-03",
|
561
|
+
"amount"=>119.0,
|
562
|
+
"category"=>"Betriebsbedarf",
|
563
|
+
"vat_rate"=>"19%",
|
564
|
+
"billing"=>nil,
|
565
|
+
"depreciation"=>nil,
|
566
|
+
"voucher_name"=>"B-00217 - 2020-08-04",
|
567
|
+
"voucher_id"=>650,
|
568
|
+
"creditor"=>nil}]}}
|
569
|
+
```
|
570
|
+
|
571
|
+
#### alle Ausgaben eines Monats nach Kategorie gefiltert nach Steuersatz
|
572
|
+
|
573
|
+
```ruby
|
574
|
+
client = PapierkramApi::Client.new
|
575
|
+
expense_voucher_data_service = client.expense_vouchers.data_service(:for_month_in_year_service)
|
576
|
+
expense_vouchers_in_date_range = expense_voucher_data_service.for_month_in_year(year: 2020, month: 8)
|
577
|
+
|
578
|
+
service = client.business_intelligence.expenses_by_category
|
579
|
+
result = service.call(expense_vouchers: expense_vouchers_in_date_range) do |line_items|
|
580
|
+
line_items.select { |v| v['vat_rate'] == '19%' }
|
581
|
+
end
|
582
|
+
puts result
|
583
|
+
```
|
584
|
+
|
485
585
|
## Helpers
|
486
586
|
|
487
587
|
Es gibt einige Helper, die dir das Leben leichter machen.
|
488
588
|
|
489
589
|
### Generiere ein PDF aus Response
|
490
590
|
|
491
|
-
Mit dem Helper `
|
591
|
+
Mit dem Helper `PapierkramApi::V1::Helpers::PdfFromResponse` kannst du für unterstützte Endpunkte aus einer `Faraday::Response` ein PDF schreiben.
|
492
592
|
|
493
593
|
Unterstützte Endpunkte sind beispielsweise: `Income::Estimate`, `Income::Invoice`, `Expense::Voucher`.
|
494
594
|
|
495
|
-
[Api::V1::Helpers::PdfFromResponse](
|
595
|
+
[Api::V1::Helpers::PdfFromResponse](lib/papierkram_api/v1/helper/pdf_from_response.rb)
|
496
596
|
|
497
597
|
```ruby
|
498
598
|
response = client.income_invoices.by(id: 1, pdf: true)
|
499
|
-
pdf =
|
599
|
+
pdf = PapierkramApi::V1::Helpers::PdfFromResponse.new(response).to_pdf("Rechnung Nummer XXX")
|
500
600
|
puts pdf
|
501
601
|
```
|
502
602
|
|
@@ -522,7 +622,7 @@ Bitte achte darauf, dass du die Tests ausführst und die Tests dann auch grün s
|
|
522
622
|
|
523
623
|
🚨 **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. ⚠️
|
524
624
|
|
525
|
-
🚨 **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
|
625
|
+
🚨 **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. 🙏
|
526
626
|
|
527
627
|
Wenn du unsicher bist, sprich mich an oder erstelle ein Issue. Ich helfe dir gerne weiter. 🤗
|
528
628
|
|
@@ -0,0 +1,92 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PapierkramApi
|
4
|
+
# The Client class is the main entry point for the Papierkram API Client.
|
5
|
+
class Client
|
6
|
+
attr_accessor :client,
|
7
|
+
:subdomain,
|
8
|
+
:api_key,
|
9
|
+
:base_url,
|
10
|
+
:remaining_quota
|
11
|
+
|
12
|
+
extend Forwardable
|
13
|
+
def_delegators :@client, :get, :post, :put, :patch, :delete
|
14
|
+
|
15
|
+
def initialize(subdomain = nil, api_key = nil)
|
16
|
+
@subdomain = subdomain || ENV.fetch('PAPIERKRAM_API_SUBDOMAIN', nil)
|
17
|
+
@api_key = api_key || ENV.fetch('PAPIERKRAM_API_KEY', nil)
|
18
|
+
@base_url = base_url_env
|
19
|
+
@remaining_quota = nil
|
20
|
+
build_client!
|
21
|
+
end
|
22
|
+
|
23
|
+
def build_client!
|
24
|
+
@client = Faraday.new(url: @base_url) do |config|
|
25
|
+
config.request :authorization, 'Bearer', @api_key
|
26
|
+
config.request :json
|
27
|
+
config.response :json
|
28
|
+
config.adapter :httpx
|
29
|
+
yield(config) if block_given?
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def business_intelligence
|
34
|
+
@business_intelligence ||= PapierkramApi::V1::BusinessIntelligence::Base.new
|
35
|
+
end
|
36
|
+
|
37
|
+
def banking_bank_connections
|
38
|
+
@banking_bank_connections ||= PapierkramApi::V1::Endpoints::Banking::BankConnections.new(@client)
|
39
|
+
end
|
40
|
+
|
41
|
+
def banking_transactions
|
42
|
+
raise ArgumentError, 'not implemented'
|
43
|
+
# @banking_transactions ||= PapierkramApi::V1::Banking::Transactions.new(@client)
|
44
|
+
end
|
45
|
+
|
46
|
+
def contact_companies
|
47
|
+
@contact_companies ||= PapierkramApi::V1::Endpoints::Contact::Companies.new(@client)
|
48
|
+
end
|
49
|
+
|
50
|
+
def contact_companies_persons
|
51
|
+
@contact_companies_persons ||= PapierkramApi::V1::Endpoints::Contact::CompaniesPersons.new(@client)
|
52
|
+
end
|
53
|
+
|
54
|
+
def expense_vouchers
|
55
|
+
@expense_vouchers ||= PapierkramApi::V1::Endpoints::Expense::Vouchers.new(@client)
|
56
|
+
end
|
57
|
+
|
58
|
+
def income_estimates
|
59
|
+
@income_estimates ||= PapierkramApi::V1::Endpoints::Income::Estimates.new(@client)
|
60
|
+
end
|
61
|
+
|
62
|
+
def income_invoices
|
63
|
+
@income_invoices ||= PapierkramApi::V1::Endpoints::Income::Invoices.new(@client)
|
64
|
+
end
|
65
|
+
|
66
|
+
def income_propositions
|
67
|
+
@income_propositions ||= PapierkramApi::V1::Endpoints::Income::Propositions.new(@client)
|
68
|
+
end
|
69
|
+
|
70
|
+
def info
|
71
|
+
@info ||= PapierkramApi::V1::Endpoints::Info.new(@client)
|
72
|
+
end
|
73
|
+
|
74
|
+
def projects
|
75
|
+
@projects ||= PapierkramApi::V1::Endpoints::Projects.new(@client)
|
76
|
+
end
|
77
|
+
|
78
|
+
def tracker_tasks
|
79
|
+
@tracker_tasks ||= PapierkramApi::V1::Endpoints::Tracker::Tasks.new(@client)
|
80
|
+
end
|
81
|
+
|
82
|
+
def tracker_time_entries
|
83
|
+
@tracker_time_entries ||= PapierkramApi::V1::Endpoints::Tracker::TimeEntries.new(@client)
|
84
|
+
end
|
85
|
+
|
86
|
+
private
|
87
|
+
|
88
|
+
def base_url_env
|
89
|
+
"https://#{@subdomain}.papierkram.de"
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PapierkramApi
|
4
|
+
module V1
|
5
|
+
module BusinessIntelligence
|
6
|
+
# Business Intelligence Base Class
|
7
|
+
#
|
8
|
+
# Business Intelligence is a set of services that can be used to gain
|
9
|
+
# insights into the data stored in the system.
|
10
|
+
#
|
11
|
+
# Therefor you should pass data to the service and get back a result.
|
12
|
+
#
|
13
|
+
# IMPORTANT no calls to the API should be made in this class.
|
14
|
+
# This is an intentional design decision! To seperate logic from the data source.
|
15
|
+
#
|
16
|
+
class Base
|
17
|
+
def expenses_by_category
|
18
|
+
@expenses_by_category ||= PapierkramApi::V1::BusinessIntelligence::ExpensesByCategory.new
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|