5
5
6
6
import requests
7
7
8
- from fakturoid .models import Account , Subject , Invoice , Generator , Message
8
+ from fakturoid .models import Account , Subject , Invoice , Generator , Message , Expense
9
9
from fakturoid .paging import ModelList
10
10
11
11
__all__ = ['Fakturoid' ]
@@ -31,6 +31,7 @@ def __init__(self, slug, email, api_key, user_agent=None):
31
31
Account : AccountApi (self ),
32
32
Subject : SubjectsApi (self ),
33
33
Invoice : InvoicesApi (self ),
34
+ Expense : ExpensesApi (self ),
34
35
Generator : GeneratorsApi (self ),
35
36
Message : MessagesApi (self ),
36
37
}
@@ -89,6 +90,18 @@ def invoices(self, mapi, *args, **kwargs):
89
90
def fire_invoice_event (self , mapi , id , event , ** kwargs ):
90
91
return mapi .fire (id , event , ** kwargs )
91
92
93
+ @model_api (Expense )
94
+ def expense (self , mapi , id ):
95
+ return mapi .load (id )
96
+
97
+ @model_api (Expense )
98
+ def expenses (self , mapi , * args , ** kwargs ):
99
+ return mapi .find (* args , ** kwargs )
100
+
101
+ @model_api (Expense )
102
+ def fire_expense_event (self , mapi , id , event , ** kwargs ):
103
+ return mapi .fire (id , event , ** kwargs )
104
+
92
105
@model_api (Generator )
93
106
def generator (self , mapi , id ):
94
107
return mapi .load (id )
@@ -308,6 +321,68 @@ def find(self, proforma=None, subject_id=None, since=None, updated_since=None, n
308
321
return ModelList (self , endpoint , params )
309
322
310
323
324
+ class ExpensesApi (CrudModelApi ):
325
+ """If number argument is givent returms single Expense object (or None),
326
+ otherwise iterable list of expenses are returned.
327
+ """
328
+ model_type = Expense
329
+ endpoint = 'expenses'
330
+
331
+ STATUSES = ['open' , 'overdue' , 'paid' ]
332
+ EVENTS = ['remove_payment' , 'deliver' , 'pay' , 'lock' , 'unlock' ]
333
+ EVENT_ARGS = {
334
+ 'pay' : {'paid_on' , 'paid_amount' , 'variable_symbol' , 'bank_account_id' }
335
+ }
336
+
337
+ def fire (self , expense_id , event , ** kwargs ):
338
+ if not isinstance (expense_id , int ):
339
+ raise TypeError ('expense_id must be int' )
340
+ if event not in self .EVENTS :
341
+ raise ValueError ('invalid event, expected one of {0}' .format (', ' .join (self .EVENTS )))
342
+
343
+ allowed_args = self .EVENT_ARGS .get (event , set ())
344
+ if not set (kwargs .keys ()).issubset (allowed_args ):
345
+ msg = "invalid event arguments, only {0} can be used with {1}" .format (', ' .join (allowed_args ), event )
346
+ raise ValueError (msg )
347
+
348
+ params = {'event' : event }
349
+ params .update (kwargs )
350
+
351
+ if 'paid_on' in params :
352
+ if not isinstance (params ['paid_on' ], date ):
353
+ raise TypeError ("'paid_on' argument must be date" )
354
+ params ['paid_on' ] = params ['paid_on' ].isoformat ()
355
+
356
+ self .session ._post ('expenses/{0}/fire' .format (expense_id ), {}, params = params )
357
+
358
+ def find (self , subject_id = None , since = None , updated_since = None , number = None , status = None , custom_id = None , variable_symbol = None ):
359
+ params = {}
360
+ if subject_id :
361
+ if not isinstance (subject_id , int ):
362
+ raise TypeError ("'subject_id' parameter must be int" )
363
+ params ['subject_id' ] = subject_id
364
+ if since :
365
+ if not isinstance (since , (datetime , date )):
366
+ raise TypeError ("'since' parameter must be date or datetime" )
367
+ params ['since' ] = since .isoformat ()
368
+ if updated_since :
369
+ if not isinstance (updated_since , (datetime , date )):
370
+ raise TypeError ("'updated_since' parameter must be date or datetime" )
371
+ params ['updated_since' ] = updated_since .isoformat ()
372
+ if number :
373
+ params ['number' ] = number
374
+ if custom_id :
375
+ params ['custom_id' ] = custom_id
376
+ if status :
377
+ if status not in self .STATUSES :
378
+ raise ValueError ('invalid invoice status, expected one of {0}' .format (', ' .join (self .STATUSES )))
379
+ params ['status' ] = status
380
+ if variable_symbol :
381
+ params ['variable_symbol' ] = variable_symbol
382
+
383
+ return ModelList (self , self .endpoint , params )
384
+
385
+
311
386
class GeneratorsApi (CrudModelApi ):
312
387
model_type = Generator
313
388
endpoint = 'generators'
0 commit comments