papierkram_api_client 0.1.3 → 0.2.0

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 (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