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
« prev ^ index » next coverage.py v7.6.7, created at 2025-08-14 10:31 +0000
1from decimal import Decimal
3from django.conf import settings
4from django.core.files import File
6from moneybirdsynchronization.administration import HttpsAdministration
9class MoneybirdAPIService:
10 def __init__(self, administration_id, api_key):
11 self._administration = HttpsAdministration(api_key, administration_id)
13 def create_contact(self, contact_data):
14 return self._administration.post("contacts", contact_data)
16 def update_contact(self, contact_id, contact_data):
17 return self._administration.patch(f"contacts/{contact_id}", contact_data)
19 def delete_contact(self, contact_id):
20 self._administration.delete(f"contacts/{contact_id}")
22 def create_project(self, project_data):
23 return self._administration.post("projects", project_data)
25 def create_external_sales_invoice(self, invoice_data):
26 return self._administration.post("external_sales_invoices", invoice_data)
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 )
33 def delete_external_sales_invoice(self, invoice_id):
34 self._administration.delete(f"external_sales_invoices/{invoice_id}")
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 )
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 )
46 def create_financial_statement(self, statement_data):
47 return self._administration.post("financial_statements", statement_data)
49 def update_financial_statement(self, statement_id, statement_data):
50 return self._administration.patch(
51 f"financial_statements/{statement_id}", statement_data
52 )
54 def delete_financial_statement(self, statement_id):
55 return self._administration.delete(f"financial_statements/{statement_id}")
57 def create_receipt(self, receipt_data):
58 return self._administration.post("documents/receipts", receipt_data)
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 )
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 )
83 def get_financial_mutation_info(self, mutation_id):
84 return self._administration.get(f"financial_mutations/{mutation_id}")
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 )
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 )