Coverage for website/moneybirdsynchronization/moneybird.py: 56.25%

46 statements  

« prev     ^ index     » next       coverage.py v7.6.7, created at 2025-08-14 10:31 +0000

1from decimal import Decimal 

2 

3from django.conf import settings 

4from django.core.files import File 

5 

6from moneybirdsynchronization.administration import HttpsAdministration 

7 

8 

9class MoneybirdAPIService: 

10 def __init__(self, administration_id, api_key): 

11 self._administration = HttpsAdministration(api_key, administration_id) 

12 

13 def create_contact(self, contact_data): 

14 return self._administration.post("contacts", contact_data) 

15 

16 def update_contact(self, contact_id, contact_data): 

17 return self._administration.patch(f"contacts/{contact_id}", contact_data) 

18 

19 def delete_contact(self, contact_id): 

20 self._administration.delete(f"contacts/{contact_id}") 

21 

22 def create_project(self, project_data): 

23 return self._administration.post("projects", project_data) 

24 

25 def create_external_sales_invoice(self, invoice_data): 

26 return self._administration.post("external_sales_invoices", invoice_data) 

27 

28 def update_external_sales_invoice(self, invoice_id, invoice_data): 

29 return self._administration.patch( 

30 f"external_sales_invoices/{invoice_id}", invoice_data 

31 ) 

32 

33 def delete_external_sales_invoice(self, invoice_id): 

34 self._administration.delete(f"external_sales_invoices/{invoice_id}") 

35 

36 def register_external_invoice_payment(self, invoice_id, payment_data): 

37 return self._administration.post( 

38 f"external_sales_invoices/{invoice_id}/payments", payment_data 

39 ) 

40 

41 def delete_external_invoice_payment(self, invoice_id, payment_id): 

42 self._administration.delete( 

43 f"external_sales_invoices/{invoice_id}/payments/{payment_id}" 

44 ) 

45 

46 def create_financial_statement(self, statement_data): 

47 return self._administration.post("financial_statements", statement_data) 

48 

49 def update_financial_statement(self, statement_id, statement_data): 

50 return self._administration.patch( 

51 f"financial_statements/{statement_id}", statement_data 

52 ) 

53 

54 def delete_financial_statement(self, statement_id): 

55 return self._administration.delete(f"financial_statements/{statement_id}") 

56 

57 def create_receipt(self, receipt_data): 

58 return self._administration.post("documents/receipts", receipt_data) 

59 

60 def add_receipt_attachment(self, receipt_id, receipt_attachment: File): 

61 with receipt_attachment.open("rb") as file: 

62 return self._administration.post_files( 

63 f"documents/receipts/{receipt_id}/attachments", 

64 {"file": file.read()}, 

65 ) 

66 

67 def link_mutation_to_booking( 

68 self, 

69 mutation_id: int, 

70 booking_id: int, 

71 price_base: Decimal | str, 

72 booking_type: str = "ExternalSalesInvoice", 

73 ): 

74 return self._administration.patch( 

75 f"financial_mutations/{mutation_id}/link_booking", 

76 { 

77 "booking_type": booking_type, 

78 "booking_id": booking_id, 

79 "price_base": price_base, 

80 }, 

81 ) 

82 

83 def get_financial_mutation_info(self, mutation_id): 

84 return self._administration.get(f"financial_mutations/{mutation_id}") 

85 

86 def unlink_mutation_from_booking( 

87 self, mutation_id: int, booking_id: int, booking_type: str = "Payment" 

88 ): 

89 return self._administration.delete( 

90 f"financial_mutations/{mutation_id}/unlink_booking", 

91 {"booking_type": booking_type, "booking_id": booking_id}, 

92 ) 

93 

94 

95def get_moneybird_api_service(): 

96 if ( 96 ↛ 100line 96 didn't jump to line 100

97 settings.MONEYBIRD_ADMINISTRATION_ID is None 

98 or settings.MONEYBIRD_API_KEY is None 

99 ): 

100 raise RuntimeError("Moneybird API key or administration ID not set") 

101 return MoneybirdAPIService( 

102 administration_id=settings.MONEYBIRD_ADMINISTRATION_ID, 

103 api_key=settings.MONEYBIRD_API_KEY, 

104 )