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.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +5 -0
  3. data/CHANGELOG.md +13 -0
  4. data/Gemfile.lock +3 -3
  5. data/README.md +155 -55
  6. data/lib/papierkram_api/client.rb +92 -0
  7. data/lib/papierkram_api/v1/business_intelligence/base.rb +23 -0
  8. data/lib/papierkram_api/v1/business_intelligence/expenses_by_category.rb +98 -0
  9. data/lib/papierkram_api/v1/business_intelligence/smart_queries/expense_vouchers_for_month_in_year.rb +58 -0
  10. data/lib/papierkram_api/v1/endpoints/banking/bank_connections.rb +30 -0
  11. data/lib/papierkram_api/v1/endpoints/banking/transactions.rb +20 -0
  12. data/lib/papierkram_api/v1/endpoints/base.rb +77 -0
  13. data/lib/papierkram_api/v1/endpoints/contact/companies.rb +30 -0
  14. data/lib/papierkram_api/v1/endpoints/contact/companies_persons.rb +28 -0
  15. data/lib/papierkram_api/v1/endpoints/expense/vouchers.rb +45 -0
  16. data/lib/papierkram_api/v1/endpoints/income/estimates.rb +46 -0
  17. data/lib/papierkram_api/v1/endpoints/income/invoices.rb +46 -0
  18. data/lib/papierkram_api/v1/endpoints/income/propositions.rb +20 -0
  19. data/lib/papierkram_api/v1/endpoints/info.rb +14 -0
  20. data/lib/papierkram_api/v1/endpoints/projects.rb +26 -0
  21. data/lib/papierkram_api/v1/endpoints/tracker/tasks.rb +33 -0
  22. data/lib/papierkram_api/v1/endpoints/tracker/time_entries.rb +62 -0
  23. data/lib/papierkram_api/v1/helper/date_helper.rb +14 -0
  24. data/lib/{api → papierkram_api}/v1/helper/pdf_from_response.rb +1 -1
  25. data/lib/papierkram_api/v1/validators/expense_voucher.rb +105 -0
  26. data/lib/papierkram_api_client/version.rb +1 -1
  27. data/lib/papierkram_api_client.rb +21 -102
  28. metadata +22 -16
  29. data/lib/api/v1/banking/bank_connections.rb +0 -28
  30. data/lib/api/v1/banking/transactions.rb +0 -18
  31. data/lib/api/v1/base.rb +0 -75
  32. data/lib/api/v1/contact/companies.rb +0 -28
  33. data/lib/api/v1/contact/companies_persons.rb +0 -26
  34. data/lib/api/v1/expense/vouchers.rb +0 -43
  35. data/lib/api/v1/income/estimates.rb +0 -44
  36. data/lib/api/v1/income/invoices.rb +0 -44
  37. data/lib/api/v1/income/propositions.rb +0 -18
  38. data/lib/api/v1/info.rb +0 -12
  39. data/lib/api/v1/projects.rb +0 -24
  40. data/lib/api/v1/tracker/tasks.rb +0 -31
  41. 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: 5ad6eb6ad8c0a3e4bd834cfd8162eec1de325fca9d7eac9eaba3803e38d2bdce
4
- data.tar.gz: 6a382f2ae7f48217a42edf5a8c65d4f4b6ac302e7025dfbd030e43cf8d62fc8c
3
+ metadata.gz: c428355fa2303fe4086587e47b981b46eac42c498ea84cb2ada942b8b926e1d1
4
+ data.tar.gz: 63f9f3524d98be430356ebc7e19bc344a0e388f9b99c71dcd4303a7427fd0635
5
5
  SHA512:
6
- metadata.gz: a54dc382abc5083ac943853d6331a19aef63e3ba1560d6e36c40e2fade3577b8e3d5a131b80c51962385fea8df0084c46197a30035f7f953931a5161a6a32644
7
- data.tar.gz: af47f4d1001746a9e28d6706b49bad8eab5b3f5855ffd57919c39068792451a73c02e4a1b6fc3ad4f8de955828251fcf337bc38462892792fa0e158a80f0c5fe
6
+ metadata.gz: c4a0d1e8ae94400e56919997bd82daa69cec0ee3b3e6c26d0525e952c6f075238effe6a589c7217c4d89658ec7e2c41c61159b06362898cf4aed7c7f50399103
7
+ data.tar.gz: b9abc76a4a14af64eaaa07f98e925a164b1474c40e4a618830966c269c3bccb4f28d8334a07b1ea4672b295e6f3d1ef6808bbbae6147bef4b211b0776bda200c
data/.rubocop.yml CHANGED
@@ -19,6 +19,11 @@ Layout/LineLength:
19
19
 
20
20
  Metrics/MethodLength:
21
21
  Max: 16
22
+ CountAsOne:
23
+ - "array"
24
+ - "hash"
25
+ - "heredoc"
26
+ - "method_call"
22
27
 
23
28
  Metrics/ParameterLists:
24
29
  Max: 8
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.1.3)
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.7.0)
37
+ regexp_parser (2.8.0)
38
38
  rexml (3.2.5)
39
- rubocop (1.50.1)
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
- Hier geht es zu den offiziellen API Docs
24
- https://DEINE-SUBDOMAIN.papierkram.de/api/v1/api-docs/index.html
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/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.
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 = PapierkramApiClient::Client.new
135
+ client = PapierkramApi::Client.new
126
136
 
127
137
  # ODER per Variablen
128
- client = PapierkramApiClient::Client.new('subdomain', "YOUR-API-KEY");
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](/lib/papierkram_api_client.rb)
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 = PapierkramApiClient::Client.new('subdomain', "SUPER-LONG-API-KEY")
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 = PapierkramApiClient::Client.new
172
+ client = PapierkramApi::Client.new
164
173
  ```
165
174
 
166
175
  ### Banking::BankConnection (Bankverbindung)
167
176
 
168
- Der Endpunkt `/api/v1/banking/bank_connections` liefert Informationen über die Bankverbindungen. Die Informationen werden als `Faraday::Response` zurückgegeben.
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](/lib/api/v1/banking/bank_connections.rb) für mögliche Parameter.
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.banking.bank_connections.all
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.banking.bank_connections.by(id: 1)
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](/lib/api/v1/banking/transactions.rb)
254
+ [Transactions](lib/papierkram_api/v1/endpoints/banking/transactions.rb)
234
255
 
235
256
  ### Contact::Company (Unternehmen)
236
257
 
237
- Der Endpunkt `/api/v1/contact/companies` liefert Informationen über die Unternehmen. Die Informationen werden als `Faraday::Response` zurückgegeben.
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](/lib/api/v1/contact/companies.rb) für mögliche Parameter.
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 `/api/v1/contact/companies/{company_id}` liefert Informationen über die Kontaktpersonen. Die Informationen werden als `Faraday::Response` zurückgegeben.
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](/lib/api/v1/contact/companies_persons.rb) für mögliche Parameter.
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.contact.companies_persons.all(company_id: 1)
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.contact.companies_persons.by(company_id: 1, id: 1)
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 `/api/v1/expense/vouchers` liefert Informationen über die Ausgabe Belege. Die Informationen werden als `Faraday::Response` zurückgegeben.
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](/lib/api/v1/expense/vouchers.rb) für mögliche Parameter.
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.expense.vouchers.all
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.expense.vouchers.by(id: 1)
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.expense.vouchers.by(id: 1, pdf: true)
305
- puts Api::V1::Helpers::PdfFromResponse.new(voucher).to_pdf
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 `/api/v1/income/estimates` liefert Informationen über die Angebote. Die Informationen werden als `Faraday::Response` zurückgegeben.
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](/lib/api/v1/income/estimates.rb) für mögliche Parameter.
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.income.estimates.all
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.income.estimates.by(id: 1)
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.income.estimates.by(id: 1, pdf: true)
335
- puts Api::V1::Helpers::PdfFromResponse.new(estimate).to_pdf
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 `/api/v1/income/invoices` liefert Informationen über die Rechnungen. Die Informationen werden als `Faraday::Response` zurückgegeben.
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](/lib/api/v1/income/invoices.rb) für mögliche Parameter.
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.income.invoices.all
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.income.invoices.by(id: 1)
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.income.invoices.by(id: 1, pdf: true)
365
- puts Api::V1::Helpers::PdfFromResponse.new(invoice).to_pdf
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 `/api/v1/income/propositions` liefert Informationen über die Waren / Dienstleistungen. Die Informationen werden als `Faraday::Response` zurückgegeben.
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](/lib/api/v1/income/propositions.rb) für mögliche Parameter.
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.income.propositions.all
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.income.propositions.by(id: 1)
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 `/api/v1/info` liefert Informationen über die API. Die Informationen werden als `Faraday::Response` zurückgegeben.
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](/lib/api/v1/info.rb).
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 `/api/v1/projects` liefert Informationen über die Projekte. Die Informationen werden als `Faraday::Response` zurückgegeben.
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](/lib/api/v1/projects.rb) für mögliche Parameter.
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 `/api/v1/tracker/tasks` liefert Informationen über die Aufgaben. Die Informationen werden als `Faraday::Response` zurückgegeben.
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](/lib/api/v1/tracker/tasks.rb) für mögliche Parameter.
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 `/api/v1/tracker/time_entries` liefert Informationen über die Zeiteinträge. Die Informationen werden als `Faraday::Response` zurückgegeben.
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](/lib/api/v1/tracker/time_entries.rb)
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](/lib/api/v1/base.rb)
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 `Api::V1::Helpers::PdfFromResponse` kannst du für unterstützte Endpunkte aus einer `Faraday::Response` ein PDF schreiben.
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](/lib/api/v1/helpers/pdf_from_response.rb)
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 = Api::V1::Helpers::PdfFromResponse.new(response).to_pdf("Rechnung Nummer XXX")
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 *VCR Cassettes* nach dem Test. 🙏
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