papierkram_api_client 0.1.3 → 0.2.1

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