diff --git a/src/Moneybird.Net/Abstractions/IMoneybirdClient.cs b/src/Moneybird.Net/Abstractions/IMoneybirdClient.cs
index fa37f18..6366312 100644
--- a/src/Moneybird.Net/Abstractions/IMoneybirdClient.cs
+++ b/src/Moneybird.Net/Abstractions/IMoneybirdClient.cs
@@ -70,6 +70,11 @@ public interface IMoneybirdClient : IDisposable
///
ITaxRateEndpoint TaxRate { get; }
+ ///
+ /// The TimeEntry Endpoint.
+ ///
+ ITimeEntryEndpoint TimeEntry { get; }
+
///
/// The User Endpoint.
///
diff --git a/src/Moneybird.Net/Endpoints/Abstractions/IContactEndpoint.cs b/src/Moneybird.Net/Endpoints/Abstractions/IContactEndpoint.cs
index 38c02c7..87d4230 100644
--- a/src/Moneybird.Net/Endpoints/Abstractions/IContactEndpoint.cs
+++ b/src/Moneybird.Net/Endpoints/Abstractions/IContactEndpoint.cs
@@ -1,8 +1,10 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using Moneybird.Net.Endpoints.Abstractions.Common;
-using Moneybird.Net.Endpoints.Contacts.Models;
using Moneybird.Net.Entities.Contacts;
+using Moneybird.Net.Entities.Notes;
+using Moneybird.Net.Models.Contacts;
+using Moneybird.Net.Models.Notes;
namespace Moneybird.Net.Endpoints.Abstractions
{
@@ -18,7 +20,7 @@ public interface IContactEndpoint :
Task> GetSynchronizationContactsAsync(string administrationId, string accessToken, ContactFilterOptions options);
Task> GetContactsByIdsAsync(string administrationId, string accessToken, ContactListOptions options);
Task GetContactByCustomerIdAsync(string administrationId, string customerId, string accessToken);
- Task CreateContactNoteAsync(string administrationId, string contactId, ContactNoteCreateOptions options, string accessToken);
+ Task CreateContactNoteAsync(string administrationId, string contactId, NoteCreateOptions options, string accessToken);
Task DeleteContactNoteByIdAsync(string administrationId, string contactId, string noteId, string accessToken);
Task GetContactPersonByIdAsync(string administrationId, string contactId, string contactPersonId, string accessToken);
Task CreateContactPersonAsync(string administrationId, string contactId, ContactPersonCreateOptions options, string accessToken);
diff --git a/src/Moneybird.Net/Endpoints/Abstractions/IExternalSalesInvoiceEndpoint.cs b/src/Moneybird.Net/Endpoints/Abstractions/IExternalSalesInvoiceEndpoint.cs
index 0724e26..aa71c08 100644
--- a/src/Moneybird.Net/Endpoints/Abstractions/IExternalSalesInvoiceEndpoint.cs
+++ b/src/Moneybird.Net/Endpoints/Abstractions/IExternalSalesInvoiceEndpoint.cs
@@ -1,8 +1,8 @@
using System.IO;
using System.Threading.Tasks;
using Moneybird.Net.Endpoints.Abstractions.Common;
-using Moneybird.Net.Endpoints.ExternalSalesInvoices.Models;
using Moneybird.Net.Entities.ExternalSalesInvoices;
+using Moneybird.Net.Models.ExternalSalesInvoices;
namespace Moneybird.Net.Endpoints.Abstractions
{
diff --git a/src/Moneybird.Net/Endpoints/Abstractions/IFinancialStatementEndpoint.cs b/src/Moneybird.Net/Endpoints/Abstractions/IFinancialStatementEndpoint.cs
index dac16ce..a1d9fb1 100644
--- a/src/Moneybird.Net/Endpoints/Abstractions/IFinancialStatementEndpoint.cs
+++ b/src/Moneybird.Net/Endpoints/Abstractions/IFinancialStatementEndpoint.cs
@@ -1,6 +1,6 @@
using Moneybird.Net.Endpoints.Abstractions.Common;
-using Moneybird.Net.Endpoints.FinancialStatements.Models;
using Moneybird.Net.Entities.FinancialStatements;
+using Moneybird.Net.Models.FinancialStatements;
namespace Moneybird.Net.Endpoints.Abstractions
{
diff --git a/src/Moneybird.Net/Endpoints/Abstractions/ILedgerAccountEndpoint.cs b/src/Moneybird.Net/Endpoints/Abstractions/ILedgerAccountEndpoint.cs
index 28eac6b..0a6725d 100644
--- a/src/Moneybird.Net/Endpoints/Abstractions/ILedgerAccountEndpoint.cs
+++ b/src/Moneybird.Net/Endpoints/Abstractions/ILedgerAccountEndpoint.cs
@@ -1,7 +1,7 @@
using System.Threading.Tasks;
-using Moneybird.Net.Endpoints.LegderAccounts.Models;
using Moneybird.Net.Endpoints.Abstractions.Common;
using Moneybird.Net.Entities.LedgerAccounts;
+using Moneybird.Net.Models.LedgerAccounts;
namespace Moneybird.Net.Endpoints.Abstractions
{
diff --git a/src/Moneybird.Net/Endpoints/Abstractions/IProductEndpoint.cs b/src/Moneybird.Net/Endpoints/Abstractions/IProductEndpoint.cs
index c97080f..7c2a1aa 100644
--- a/src/Moneybird.Net/Endpoints/Abstractions/IProductEndpoint.cs
+++ b/src/Moneybird.Net/Endpoints/Abstractions/IProductEndpoint.cs
@@ -1,8 +1,8 @@
using System.Threading;
using System.Threading.Tasks;
using Moneybird.Net.Endpoints.Abstractions.Common;
-using Moneybird.Net.Endpoints.Products.Models;
using Moneybird.Net.Entities.Products;
+using Moneybird.Net.Models.Products;
namespace Moneybird.Net.Endpoints.Abstractions
{
diff --git a/src/Moneybird.Net/Endpoints/Abstractions/IProjectEndpoint.cs b/src/Moneybird.Net/Endpoints/Abstractions/IProjectEndpoint.cs
index a55d74b..60af301 100644
--- a/src/Moneybird.Net/Endpoints/Abstractions/IProjectEndpoint.cs
+++ b/src/Moneybird.Net/Endpoints/Abstractions/IProjectEndpoint.cs
@@ -1,6 +1,6 @@
using Moneybird.Net.Endpoints.Abstractions.Common;
-using Moneybird.Net.Endpoints.Projects.Models;
using Moneybird.Net.Entities.Projects;
+using Moneybird.Net.Models.Projects;
namespace Moneybird.Net.Endpoints.Abstractions
{
diff --git a/src/Moneybird.Net/Endpoints/Abstractions/ISalesInvoiceEndpoint.cs b/src/Moneybird.Net/Endpoints/Abstractions/ISalesInvoiceEndpoint.cs
index fe10635..e48877d 100644
--- a/src/Moneybird.Net/Endpoints/Abstractions/ISalesInvoiceEndpoint.cs
+++ b/src/Moneybird.Net/Endpoints/Abstractions/ISalesInvoiceEndpoint.cs
@@ -1,8 +1,8 @@
using System.IO;
using System.Threading.Tasks;
using Moneybird.Net.Endpoints.Abstractions.Common;
-using Moneybird.Net.Endpoints.SalesInvoices.Models;
using Moneybird.Net.Entities.SalesInvoices;
+using Moneybird.Net.Models.SalesInvoices;
namespace Moneybird.Net.Endpoints.Abstractions
{
diff --git a/src/Moneybird.Net/Endpoints/Abstractions/ITaxRateEndpoint.cs b/src/Moneybird.Net/Endpoints/Abstractions/ITaxRateEndpoint.cs
index 955eb0c..1a51607 100644
--- a/src/Moneybird.Net/Endpoints/Abstractions/ITaxRateEndpoint.cs
+++ b/src/Moneybird.Net/Endpoints/Abstractions/ITaxRateEndpoint.cs
@@ -1,6 +1,6 @@
-using Moneybird.Net.Endpoints.TaxRates.Models;
using Moneybird.Net.Endpoints.Abstractions.Common;
using Moneybird.Net.Entities.TaxRates;
+using Moneybird.Net.Models.TaxRates;
namespace Moneybird.Net.Endpoints.Abstractions
{
diff --git a/src/Moneybird.Net/Endpoints/Abstractions/ITimeEntryEndpoint.cs b/src/Moneybird.Net/Endpoints/Abstractions/ITimeEntryEndpoint.cs
new file mode 100644
index 0000000..f305f75
--- /dev/null
+++ b/src/Moneybird.Net/Endpoints/Abstractions/ITimeEntryEndpoint.cs
@@ -0,0 +1,21 @@
+using System.Threading.Tasks;
+using Moneybird.Net.Endpoints.Abstractions.Common;
+using Moneybird.Net.Entities.Notes;
+using Moneybird.Net.Entities.TimeEntries;
+using Moneybird.Net.Models.Notes;
+using Moneybird.Net.Models.TimeEntries;
+
+namespace Moneybird.Net.Endpoints.Abstractions
+{
+ public interface ITimeEntryEndpoint :
+ IReadEndpoint,
+ IReadFilterEndpoint,
+ IGetEndpoint,
+ ICreateEndpoint,
+ IUpdateEndpoint,
+ IDeleteEndpoint
+ {
+ Task CreateTimeEntryNoteAsync(string administrationId, string timeEntryId, NoteCreateOptions options, string accessToken);
+ Task DeleteTimeEntryNoteByIdAsync(string administrationId, string timeEntryId, string noteId, string accessToken);
+ }
+}
\ No newline at end of file
diff --git a/src/Moneybird.Net/Endpoints/Abstractions/IWebhookEndpoint.cs b/src/Moneybird.Net/Endpoints/Abstractions/IWebhookEndpoint.cs
index 9fd6582..4a2a189 100644
--- a/src/Moneybird.Net/Endpoints/Abstractions/IWebhookEndpoint.cs
+++ b/src/Moneybird.Net/Endpoints/Abstractions/IWebhookEndpoint.cs
@@ -1,6 +1,6 @@
using Moneybird.Net.Endpoints.Abstractions.Common;
-using Moneybird.Net.Endpoints.Webhooks.Models;
using Moneybird.Net.Entities.Webhooks;
+using Moneybird.Net.Models.Webhooks;
namespace Moneybird.Net.Endpoints.Abstractions
{
diff --git a/src/Moneybird.Net/Endpoints/Administrations/AdministrationEndpoint.cs b/src/Moneybird.Net/Endpoints/AdministrationEndpoint.cs
similarity index 95%
rename from src/Moneybird.Net/Endpoints/Administrations/AdministrationEndpoint.cs
rename to src/Moneybird.Net/Endpoints/AdministrationEndpoint.cs
index 2ae982b..8132e52 100644
--- a/src/Moneybird.Net/Endpoints/Administrations/AdministrationEndpoint.cs
+++ b/src/Moneybird.Net/Endpoints/AdministrationEndpoint.cs
@@ -5,7 +5,7 @@
using Moneybird.Net.Entities.Administrations;
using Moneybird.Net.Http;
-namespace Moneybird.Net.Endpoints.Administrations
+namespace Moneybird.Net.Endpoints
{
public class AdministrationEndpoint : IAdministrationEndpoint
{
diff --git a/src/Moneybird.Net/Endpoints/Contacts/ContactEndpoint.cs b/src/Moneybird.Net/Endpoints/ContactEndpoint.cs
similarity index 96%
rename from src/Moneybird.Net/Endpoints/Contacts/ContactEndpoint.cs
rename to src/Moneybird.Net/Endpoints/ContactEndpoint.cs
index 3f027e3..b1d0cfc 100644
--- a/src/Moneybird.Net/Endpoints/Contacts/ContactEndpoint.cs
+++ b/src/Moneybird.Net/Endpoints/ContactEndpoint.cs
@@ -2,12 +2,14 @@
using System.Text.Json;
using System.Threading.Tasks;
using Moneybird.Net.Endpoints.Abstractions;
-using Moneybird.Net.Endpoints.Contacts.Models;
using Moneybird.Net.Entities.Contacts;
+using Moneybird.Net.Entities.Notes;
using Moneybird.Net.Extensions;
using Moneybird.Net.Http;
+using Moneybird.Net.Models.Contacts;
+using Moneybird.Net.Models.Notes;
-namespace Moneybird.Net.Endpoints.Contacts
+namespace Moneybird.Net.Endpoints
{
public class ContactEndpoint : IContactEndpoint
{
@@ -149,7 +151,7 @@ public async Task DeleteByIdAsync(string administrationId, string id, stri
return response;
}
- public async Task CreateContactNoteAsync(string administrationId, string contactId, ContactNoteCreateOptions options, string accessToken)
+ public async Task CreateContactNoteAsync(string administrationId, string contactId, NoteCreateOptions options, string accessToken)
{
var relativeUrl = string.Format(ContactsIdNotesUri, administrationId, contactId);
var body = JsonSerializer.Serialize(options, _config.SerializerOptions);
@@ -157,7 +159,7 @@ public async Task CreateContactNoteAsync(string administrationId, s
.CreatePostRequestAsync(_config.ApiUri, relativeUrl, accessToken, body)
.ConfigureAwait(false);
- return JsonSerializer.Deserialize(responseJson, _config.SerializerOptions);
+ return JsonSerializer.Deserialize(responseJson, _config.SerializerOptions);
}
public async Task DeleteContactNoteByIdAsync(string administrationId, string contactId, string noteId, string accessToken)
diff --git a/src/Moneybird.Net/Endpoints/Contacts/Models/ContactNoteCreateOptions.cs b/src/Moneybird.Net/Endpoints/Contacts/Models/ContactNoteCreateOptions.cs
deleted file mode 100644
index 62a304c..0000000
--- a/src/Moneybird.Net/Endpoints/Contacts/Models/ContactNoteCreateOptions.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-using System.Text.Json.Serialization;
-
-namespace Moneybird.Net.Endpoints.Contacts.Models
-{
- public class ContactNoteCreateOptions
- {
- [JsonPropertyName("note")]
- public ContactNoteCreateItem Note { get; set; }
- }
-}
\ No newline at end of file
diff --git a/src/Moneybird.Net/Endpoints/CustomFields/CustomFieldEndpoint.cs b/src/Moneybird.Net/Endpoints/CustomFieldEndpoint.cs
similarity index 95%
rename from src/Moneybird.Net/Endpoints/CustomFields/CustomFieldEndpoint.cs
rename to src/Moneybird.Net/Endpoints/CustomFieldEndpoint.cs
index 54408ae..fe3414c 100644
--- a/src/Moneybird.Net/Endpoints/CustomFields/CustomFieldEndpoint.cs
+++ b/src/Moneybird.Net/Endpoints/CustomFieldEndpoint.cs
@@ -5,7 +5,7 @@
using Moneybird.Net.Entities.CustomFields;
using Moneybird.Net.Http;
-namespace Moneybird.Net.Endpoints.CustomFields
+namespace Moneybird.Net.Endpoints
{
public class CustomFieldEndpoint : ICustomFieldEndpoint
{
diff --git a/src/Moneybird.Net/Endpoints/DocumentStyles/DocumentStyleEndpoint.cs b/src/Moneybird.Net/Endpoints/DocumentStyleEndpoint.cs
similarity index 95%
rename from src/Moneybird.Net/Endpoints/DocumentStyles/DocumentStyleEndpoint.cs
rename to src/Moneybird.Net/Endpoints/DocumentStyleEndpoint.cs
index 9982074..f834d5c 100644
--- a/src/Moneybird.Net/Endpoints/DocumentStyles/DocumentStyleEndpoint.cs
+++ b/src/Moneybird.Net/Endpoints/DocumentStyleEndpoint.cs
@@ -5,7 +5,7 @@
using Moneybird.Net.Entities.DocumentStyles;
using Moneybird.Net.Http;
-namespace Moneybird.Net.Endpoints.DocumentStyles
+namespace Moneybird.Net.Endpoints
{
public class DocumentStyleEndpoint : IDocumentStyleEndpoint
{
diff --git a/src/Moneybird.Net/Endpoints/ExternalSalesInvoices/ExternalSalesInvoiceEndpoint.cs b/src/Moneybird.Net/Endpoints/ExternalSalesInvoiceEndpoint.cs
similarity index 97%
rename from src/Moneybird.Net/Endpoints/ExternalSalesInvoices/ExternalSalesInvoiceEndpoint.cs
rename to src/Moneybird.Net/Endpoints/ExternalSalesInvoiceEndpoint.cs
index ac9dc7b..3072ef9 100644
--- a/src/Moneybird.Net/Endpoints/ExternalSalesInvoices/ExternalSalesInvoiceEndpoint.cs
+++ b/src/Moneybird.Net/Endpoints/ExternalSalesInvoiceEndpoint.cs
@@ -3,12 +3,12 @@
using System.Text.Json;
using System.Threading.Tasks;
using Moneybird.Net.Endpoints.Abstractions;
-using Moneybird.Net.Endpoints.ExternalSalesInvoices.Models;
using Moneybird.Net.Entities.ExternalSalesInvoices;
using Moneybird.Net.Extensions;
using Moneybird.Net.Http;
+using Moneybird.Net.Models.ExternalSalesInvoices;
-namespace Moneybird.Net.Endpoints.ExternalSalesInvoices
+namespace Moneybird.Net.Endpoints
{
public class ExternalSalesInvoiceEndpoint : IExternalSalesInvoiceEndpoint
{
diff --git a/src/Moneybird.Net/Endpoints/FinancialAccounts/FinancialAccountEndpoint.cs b/src/Moneybird.Net/Endpoints/FinancialAccountEndpoint.cs
similarity index 95%
rename from src/Moneybird.Net/Endpoints/FinancialAccounts/FinancialAccountEndpoint.cs
rename to src/Moneybird.Net/Endpoints/FinancialAccountEndpoint.cs
index 2f3c759..6f64b90 100644
--- a/src/Moneybird.Net/Endpoints/FinancialAccounts/FinancialAccountEndpoint.cs
+++ b/src/Moneybird.Net/Endpoints/FinancialAccountEndpoint.cs
@@ -5,7 +5,7 @@
using Moneybird.Net.Entities.FinancialAccounts;
using Moneybird.Net.Http;
-namespace Moneybird.Net.Endpoints.FinancialAccounts
+namespace Moneybird.Net.Endpoints
{
public class FinancialAccountEndpoint : IFinancialAccountEndpoint
{
diff --git a/src/Moneybird.Net/Endpoints/FinancialStatements/FinancialStatementEndpoint.cs b/src/Moneybird.Net/Endpoints/FinancialStatementEndpoint.cs
similarity index 95%
rename from src/Moneybird.Net/Endpoints/FinancialStatements/FinancialStatementEndpoint.cs
rename to src/Moneybird.Net/Endpoints/FinancialStatementEndpoint.cs
index 1efa3bb..0508a54 100644
--- a/src/Moneybird.Net/Endpoints/FinancialStatements/FinancialStatementEndpoint.cs
+++ b/src/Moneybird.Net/Endpoints/FinancialStatementEndpoint.cs
@@ -1,11 +1,11 @@
using System.Text.Json;
using System.Threading.Tasks;
using Moneybird.Net.Endpoints.Abstractions;
-using Moneybird.Net.Endpoints.FinancialStatements.Models;
using Moneybird.Net.Entities.FinancialStatements;
using Moneybird.Net.Http;
+using Moneybird.Net.Models.FinancialStatements;
-namespace Moneybird.Net.Endpoints.FinancialStatements
+namespace Moneybird.Net.Endpoints
{
public class FinancialStatementEndpoint : IFinancialStatementEndpoint
{
diff --git a/src/Moneybird.Net/Endpoints/LegderAccounts/LedgerAccountEndpoint.cs b/src/Moneybird.Net/Endpoints/LedgerAccountEndpoint.cs
similarity index 97%
rename from src/Moneybird.Net/Endpoints/LegderAccounts/LedgerAccountEndpoint.cs
rename to src/Moneybird.Net/Endpoints/LedgerAccountEndpoint.cs
index eef55de..ef2a6c1 100644
--- a/src/Moneybird.Net/Endpoints/LegderAccounts/LedgerAccountEndpoint.cs
+++ b/src/Moneybird.Net/Endpoints/LedgerAccountEndpoint.cs
@@ -2,11 +2,11 @@
using System.Text.Json;
using System.Threading.Tasks;
using Moneybird.Net.Endpoints.Abstractions;
-using Moneybird.Net.Endpoints.LegderAccounts.Models;
using Moneybird.Net.Entities.LedgerAccounts;
using Moneybird.Net.Http;
+using Moneybird.Net.Models.LedgerAccounts;
-namespace Moneybird.Net.Endpoints.LegderAccounts
+namespace Moneybird.Net.Endpoints
{
public class LedgerAccountEndpoint : ILedgerAccountEndpoint
{
diff --git a/src/Moneybird.Net/Endpoints/Payments/PaymentEndpoint.cs b/src/Moneybird.Net/Endpoints/PaymentEndpoint.cs
similarity index 96%
rename from src/Moneybird.Net/Endpoints/Payments/PaymentEndpoint.cs
rename to src/Moneybird.Net/Endpoints/PaymentEndpoint.cs
index ca101b4..02cbec4 100644
--- a/src/Moneybird.Net/Endpoints/Payments/PaymentEndpoint.cs
+++ b/src/Moneybird.Net/Endpoints/PaymentEndpoint.cs
@@ -4,7 +4,7 @@
using Moneybird.Net.Entities.Payments;
using Moneybird.Net.Http;
-namespace Moneybird.Net.Endpoints.Payments
+namespace Moneybird.Net.Endpoints
{
public class PaymentEndpoint : IPaymentEndpoint
{
diff --git a/src/Moneybird.Net/Endpoints/Products/ProductEndpoint.cs b/src/Moneybird.Net/Endpoints/ProductEndpoint.cs
similarity index 97%
rename from src/Moneybird.Net/Endpoints/Products/ProductEndpoint.cs
rename to src/Moneybird.Net/Endpoints/ProductEndpoint.cs
index 8e428c6..734543f 100644
--- a/src/Moneybird.Net/Endpoints/Products/ProductEndpoint.cs
+++ b/src/Moneybird.Net/Endpoints/ProductEndpoint.cs
@@ -2,11 +2,11 @@
using System.Text.Json;
using System.Threading.Tasks;
using Moneybird.Net.Endpoints.Abstractions;
-using Moneybird.Net.Endpoints.Products.Models;
using Moneybird.Net.Entities.Products;
using Moneybird.Net.Http;
+using Moneybird.Net.Models.Products;
-namespace Moneybird.Net.Endpoints.Products
+namespace Moneybird.Net.Endpoints
{
public class ProductEndpoint : IProductEndpoint
{
diff --git a/src/Moneybird.Net/Endpoints/Projects/ProjectEndpoint.cs b/src/Moneybird.Net/Endpoints/ProjectEndpoint.cs
similarity index 97%
rename from src/Moneybird.Net/Endpoints/Projects/ProjectEndpoint.cs
rename to src/Moneybird.Net/Endpoints/ProjectEndpoint.cs
index 521fa72..e234fe6 100644
--- a/src/Moneybird.Net/Endpoints/Projects/ProjectEndpoint.cs
+++ b/src/Moneybird.Net/Endpoints/ProjectEndpoint.cs
@@ -2,12 +2,12 @@
using System.Text.Json;
using System.Threading.Tasks;
using Moneybird.Net.Endpoints.Abstractions;
-using Moneybird.Net.Endpoints.Projects.Models;
using Moneybird.Net.Entities.Projects;
using Moneybird.Net.Extensions;
using Moneybird.Net.Http;
+using Moneybird.Net.Models.Projects;
-namespace Moneybird.Net.Endpoints.Projects
+namespace Moneybird.Net.Endpoints
{
public class ProjectEndpoint : IProjectEndpoint
{
diff --git a/src/Moneybird.Net/Endpoints/SalesInvoices/SalesInvoiceEndpoint.cs b/src/Moneybird.Net/Endpoints/SalesInvoiceEndpoint.cs
similarity index 97%
rename from src/Moneybird.Net/Endpoints/SalesInvoices/SalesInvoiceEndpoint.cs
rename to src/Moneybird.Net/Endpoints/SalesInvoiceEndpoint.cs
index 0e6e553..79f2078 100644
--- a/src/Moneybird.Net/Endpoints/SalesInvoices/SalesInvoiceEndpoint.cs
+++ b/src/Moneybird.Net/Endpoints/SalesInvoiceEndpoint.cs
@@ -3,12 +3,12 @@
using System.Text.Json;
using System.Threading.Tasks;
using Moneybird.Net.Endpoints.Abstractions;
-using Moneybird.Net.Endpoints.SalesInvoices.Models;
using Moneybird.Net.Entities.SalesInvoices;
using Moneybird.Net.Extensions;
using Moneybird.Net.Http;
+using Moneybird.Net.Models.SalesInvoices;
-namespace Moneybird.Net.Endpoints.SalesInvoices
+namespace Moneybird.Net.Endpoints
{
public class SalesInvoiceEndpoint : ISalesInvoiceEndpoint
{
diff --git a/src/Moneybird.Net/Endpoints/TaxRates/TaxRateEndpoint.cs b/src/Moneybird.Net/Endpoints/TaxRateEndpoint.cs
similarity index 95%
rename from src/Moneybird.Net/Endpoints/TaxRates/TaxRateEndpoint.cs
rename to src/Moneybird.Net/Endpoints/TaxRateEndpoint.cs
index c9b3ae3..f8f1901 100644
--- a/src/Moneybird.Net/Endpoints/TaxRates/TaxRateEndpoint.cs
+++ b/src/Moneybird.Net/Endpoints/TaxRateEndpoint.cs
@@ -2,12 +2,12 @@
using System.Text.Json;
using System.Threading.Tasks;
using Moneybird.Net.Endpoints.Abstractions;
-using Moneybird.Net.Endpoints.TaxRates.Models;
using Moneybird.Net.Entities.TaxRates;
using Moneybird.Net.Extensions;
using Moneybird.Net.Http;
+using Moneybird.Net.Models.TaxRates;
-namespace Moneybird.Net.Endpoints.TaxRates
+namespace Moneybird.Net.Endpoints
{
public class TaxRateEndpoint : ITaxRateEndpoint
{
diff --git a/src/Moneybird.Net/Endpoints/TimeEntryEndpoint.cs b/src/Moneybird.Net/Endpoints/TimeEntryEndpoint.cs
new file mode 100644
index 0000000..7ac8dbd
--- /dev/null
+++ b/src/Moneybird.Net/Endpoints/TimeEntryEndpoint.cs
@@ -0,0 +1,121 @@
+using System.Collections.Generic;
+using System.Text.Json;
+using System.Threading.Tasks;
+using Moneybird.Net.Endpoints.Abstractions;
+using Moneybird.Net.Entities.Notes;
+using Moneybird.Net.Entities.TimeEntries;
+using Moneybird.Net.Extensions;
+using Moneybird.Net.Http;
+using Moneybird.Net.Models.Notes;
+using Moneybird.Net.Models.TimeEntries;
+
+namespace Moneybird.Net.Endpoints
+{
+ public class TimeEntryEndpoint : ITimeEntryEndpoint
+ {
+ private const string TimeEntriesUri = "/{0}/time_entries.json";
+ private const string TimeEntriesIdUri = "/{0}/time_entries/{1}.json";
+ private const string TimeEntriesIdNotesUri = "/{0}/time_entries/{1}/notes.json";
+ private const string TimeEntriesIdNotesIdUri = "/{0}/time_entries/{1}/notes/{2}.json";
+
+ private readonly MoneybirdConfig _config;
+ private readonly IRequester _requester;
+
+ public TimeEntryEndpoint(MoneybirdConfig config, IRequester requester)
+ {
+ _requester = requester;
+ _config = config;
+ }
+
+ public async Task> GetAsync(string administrationId, string accessToken)
+ {
+ var relativeUrl = string.Format(TimeEntriesUri, administrationId);
+ var responseJson = await _requester
+ .CreateGetRequestAsync(_config.ApiUri, relativeUrl, accessToken)
+ .ConfigureAwait(false);
+
+ return JsonSerializer.Deserialize>(responseJson, _config.SerializerOptions);
+ }
+
+ public async Task> GetAsync(string administrationId, string accessToken, TimeEntryFilterOptions options)
+ {
+ List paramValues = null;
+
+ var filterString = options.GetFilterString();
+ if (!string.IsNullOrEmpty(filterString))
+ {
+ paramValues = new List { $"filter={filterString}" };
+ }
+
+ var relativeUrl = string.Format(TimeEntriesUri, administrationId);
+ var responseJson = await _requester
+ .CreateGetRequestAsync(_config.ApiUri, relativeUrl, accessToken, paramValues)
+ .ConfigureAwait(false);
+
+ return JsonSerializer.Deserialize>(responseJson, _config.SerializerOptions);
+ }
+
+ public async Task GetByIdAsync(string administrationId, string id, string accessToken)
+ {
+ var relativeUrl = string.Format(TimeEntriesIdUri, administrationId, id);
+ var responseJson = await _requester
+ .CreateGetRequestAsync(_config.ApiUri, relativeUrl, accessToken)
+ .ConfigureAwait(false);
+
+ return JsonSerializer.Deserialize(responseJson, _config.SerializerOptions);
+ }
+
+ public async Task CreateAsync(string administrationId, TimeEntryCreateOptions options, string accessToken)
+ {
+ var relativeUrl = string.Format(TimeEntriesUri, administrationId);
+ var body = JsonSerializer.Serialize(options, _config.SerializerOptions);
+ var responseJson = await _requester
+ .CreatePostRequestAsync(_config.ApiUri, relativeUrl, accessToken, body)
+ .ConfigureAwait(false);
+
+ return JsonSerializer.Deserialize(responseJson, _config.SerializerOptions);
+ }
+
+ public async Task UpdateByIdAsync(string administrationId, string id, TimeEntryUpdateOptions options, string accessToken)
+ {
+ var relativeUrl = string.Format(TimeEntriesUri, administrationId, id);
+ var body = JsonSerializer.Serialize(options, _config.SerializerOptions);
+ var responseJson = await _requester
+ .CreatePatchRequestAsync(_config.ApiUri, relativeUrl, accessToken, body)
+ .ConfigureAwait(false);
+
+ return JsonSerializer.Deserialize(responseJson, _config.SerializerOptions);
+ }
+
+ public async Task DeleteByIdAsync(string administrationId, string id, string accessToken)
+ {
+ var relativeUrl = string.Format(TimeEntriesUri, administrationId, id);
+ var response = await _requester
+ .CreateDeleteRequestAsync(_config.ApiUri, relativeUrl, accessToken)
+ .ConfigureAwait(false);
+
+ return response;
+ }
+
+ public async Task CreateTimeEntryNoteAsync(string administrationId, string timeEntryId, NoteCreateOptions options, string accessToken)
+ {
+ var relativeUrl = string.Format(TimeEntriesIdNotesUri, administrationId, timeEntryId);
+ var body = JsonSerializer.Serialize(options, _config.SerializerOptions);
+ var responseJson = await _requester
+ .CreatePostRequestAsync(_config.ApiUri, relativeUrl, accessToken, body)
+ .ConfigureAwait(false);
+
+ return JsonSerializer.Deserialize(responseJson, _config.SerializerOptions);
+ }
+
+ public async Task DeleteTimeEntryNoteByIdAsync(string administrationId, string timeEntryId, string noteId, string accessToken)
+ {
+ var relativeUrl = string.Format(TimeEntriesIdNotesIdUri, administrationId, timeEntryId, noteId);
+ var response = await _requester
+ .CreateDeleteRequestAsync(_config.ApiUri, relativeUrl, accessToken)
+ .ConfigureAwait(false);
+
+ return response;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Moneybird.Net/Endpoints/Users/UserEndpoint.cs b/src/Moneybird.Net/Endpoints/UserEndpoint.cs
similarity index 96%
rename from src/Moneybird.Net/Endpoints/Users/UserEndpoint.cs
rename to src/Moneybird.Net/Endpoints/UserEndpoint.cs
index e2d1966..c534512 100644
--- a/src/Moneybird.Net/Endpoints/Users/UserEndpoint.cs
+++ b/src/Moneybird.Net/Endpoints/UserEndpoint.cs
@@ -5,7 +5,7 @@
using Moneybird.Net.Entities.Users;
using Moneybird.Net.Http;
-namespace Moneybird.Net.Endpoints.Users
+namespace Moneybird.Net.Endpoints
{
public class UserEndpoint : IUserEndpoint
{
diff --git a/src/Moneybird.Net/Endpoints/Verifications/VerificationEndpoint.cs b/src/Moneybird.Net/Endpoints/VerificationEndpoint.cs
similarity index 95%
rename from src/Moneybird.Net/Endpoints/Verifications/VerificationEndpoint.cs
rename to src/Moneybird.Net/Endpoints/VerificationEndpoint.cs
index 09c9798..ae1e996 100644
--- a/src/Moneybird.Net/Endpoints/Verifications/VerificationEndpoint.cs
+++ b/src/Moneybird.Net/Endpoints/VerificationEndpoint.cs
@@ -4,7 +4,7 @@
using Moneybird.Net.Entities.Verifications;
using Moneybird.Net.Http;
-namespace Moneybird.Net.Endpoints.Verifications
+namespace Moneybird.Net.Endpoints
{
public class VerificationEndpoint : IVerificationEndpoint
{
diff --git a/src/Moneybird.Net/Endpoints/Webhooks/WebhookEndpoint.cs b/src/Moneybird.Net/Endpoints/WebhookEndpoint.cs
similarity index 95%
rename from src/Moneybird.Net/Endpoints/Webhooks/WebhookEndpoint.cs
rename to src/Moneybird.Net/Endpoints/WebhookEndpoint.cs
index 9ca7a7b..b073cb1 100644
--- a/src/Moneybird.Net/Endpoints/Webhooks/WebhookEndpoint.cs
+++ b/src/Moneybird.Net/Endpoints/WebhookEndpoint.cs
@@ -2,11 +2,11 @@
using System.Text.Json;
using System.Threading.Tasks;
using Moneybird.Net.Endpoints.Abstractions;
-using Moneybird.Net.Endpoints.Webhooks.Models;
using Moneybird.Net.Entities.Webhooks;
using Moneybird.Net.Http;
+using Moneybird.Net.Models.Webhooks;
-namespace Moneybird.Net.Endpoints.Webhooks
+namespace Moneybird.Net.Endpoints
{
public class WebhookEndpoint : IWebhookEndpoint
{
diff --git a/src/Moneybird.Net/Endpoints/Workflows/WorkflowEndpoint.cs b/src/Moneybird.Net/Endpoints/WorkflowEndpoint.cs
similarity index 96%
rename from src/Moneybird.Net/Endpoints/Workflows/WorkflowEndpoint.cs
rename to src/Moneybird.Net/Endpoints/WorkflowEndpoint.cs
index 79d4496..1e44359 100644
--- a/src/Moneybird.Net/Endpoints/Workflows/WorkflowEndpoint.cs
+++ b/src/Moneybird.Net/Endpoints/WorkflowEndpoint.cs
@@ -5,7 +5,7 @@
using Moneybird.Net.Entities.Workflows;
using Moneybird.Net.Http;
-namespace Moneybird.Net.Endpoints.Workflows
+namespace Moneybird.Net.Endpoints
{
public class WorkflowEndpoint : IWorkflowEndpoint
{
diff --git a/src/Moneybird.Net/Entities/Contacts/Contact.cs b/src/Moneybird.Net/Entities/Contacts/Contact.cs
index ad4b527..c5abf83 100644
--- a/src/Moneybird.Net/Entities/Contacts/Contact.cs
+++ b/src/Moneybird.Net/Entities/Contacts/Contact.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Text.Json.Serialization;
+using Moneybird.Net.Entities.Notes;
using Moneybird.Net.Misc;
namespace Moneybird.Net.Entities.Contacts
@@ -137,7 +138,7 @@ public class Contact : IMoneybirdEntity
public string SalesInvoicesUrl { get; set; }
[JsonPropertyName("notes")]
- public List Notes { get; set; }
+ public List Notes { get; set; }
[JsonPropertyName("custom_fields")]
public List CustomFields { get; set; }
diff --git a/src/Moneybird.Net/Entities/Contacts/ContactNote.cs b/src/Moneybird.Net/Entities/Notes/Note.cs
similarity index 76%
rename from src/Moneybird.Net/Entities/Contacts/ContactNote.cs
rename to src/Moneybird.Net/Entities/Notes/Note.cs
index 3684bd2..12b35cb 100644
--- a/src/Moneybird.Net/Entities/Contacts/ContactNote.cs
+++ b/src/Moneybird.Net/Entities/Notes/Note.cs
@@ -1,51 +1,50 @@
using System;
using System.Text.Json.Serialization;
-namespace Moneybird.Net.Entities.Contacts
+namespace Moneybird.Net.Entities.Notes
{
- public class ContactNote
+ public class Note
{
[JsonPropertyName("id")]
public string Id { get; set; }
-
+
[JsonPropertyName("administration_id")]
public string AdministrationId { get; set; }
-
+
[JsonPropertyName("entity_id")]
public string EntityId { get; set; }
-
+
[JsonPropertyName("entity_type")]
public string EntityType { get; set; }
-
+
[JsonPropertyName("user_id")]
public string UserId { get; set; }
-
+
[JsonPropertyName("assignee_id")]
public string AssigneeId { get; set; }
-
+
[JsonPropertyName("todo")]
public bool Todo { get; set; }
-
+
[JsonPropertyName("note")]
- public string Note { get; set; }
-
+ public string Value { get; set; }
+
[JsonPropertyName("completed_at")]
public DateTime? CompletedAt { get; set; }
-
+
[JsonPropertyName("completed_by_id")]
public string CompletedById { get; set; }
-
+
[JsonPropertyName("todo_type")]
- public string TodoType { get; set; }
-
- // TODO: Check documentation to understand what this data field is meant for.
+ public object TodoType { get; set; }
+
[JsonIgnore]
[JsonPropertyName("data")]
public object Data { get; set; }
-
+
[JsonPropertyName("created_at")]
public DateTime CreatedAt { get; set; }
-
+
[JsonPropertyName("updated_at")]
public DateTime UpdatedAt { get; set; }
}
diff --git a/src/Moneybird.Net/Entities/SalesInvoices/SalesInvoiceDetail.cs b/src/Moneybird.Net/Entities/SalesInvoices/SalesInvoiceDetail.cs
index e25af40..748452d 100644
--- a/src/Moneybird.Net/Entities/SalesInvoices/SalesInvoiceDetail.cs
+++ b/src/Moneybird.Net/Entities/SalesInvoices/SalesInvoiceDetail.cs
@@ -35,7 +35,8 @@ public class SalesInvoiceDetail
public string Description { get; set; }
[JsonPropertyName("price")]
- public string Price { get; set; }
+ [JsonNumberHandling(JsonNumberHandling.AllowReadingFromString)]
+ public double Price { get; set; }
[JsonPropertyName("period")]
public string Period { get; set; }
@@ -44,10 +45,12 @@ public class SalesInvoiceDetail
public int RowOrder { get; set; }
[JsonPropertyName("total_price_excl_tax_with_discount")]
- public string TotalPriceExclTaxWithDiscount { get; set; }
+ [JsonNumberHandling(JsonNumberHandling.AllowReadingFromString)]
+ public double TotalPriceExclTaxWithDiscount { get; set; }
[JsonPropertyName("total_price_excl_tax_with_discount_base")]
- public string TotalPriceExclTaxWithDiscountBase { get; set; }
+ [JsonNumberHandling(JsonNumberHandling.AllowReadingFromString)]
+ public double TotalPriceExclTaxWithDiscountBase { get; set; }
[JsonPropertyName("tax_report_reference")]
public List TaxReportReference { get; set; }
diff --git a/src/Moneybird.Net/Entities/TimeEntries/TimeEntry.cs b/src/Moneybird.Net/Entities/TimeEntries/TimeEntry.cs
new file mode 100644
index 0000000..c9e3ad2
--- /dev/null
+++ b/src/Moneybird.Net/Entities/TimeEntries/TimeEntry.cs
@@ -0,0 +1,68 @@
+using System;
+using System.Collections.Generic;
+using System.Text.Json.Serialization;
+using Moneybird.Net.Entities.Contacts;
+using Moneybird.Net.Entities.Notes;
+using Moneybird.Net.Entities.Projects;
+using Moneybird.Net.Entities.SalesInvoices;
+using Moneybird.Net.Entities.Users;
+
+namespace Moneybird.Net.Entities.TimeEntries
+{
+ public class TimeEntry : IMoneybirdEntity
+ {
+ [JsonPropertyName("id")]
+ public string Id { get; set; }
+
+ [JsonPropertyName("administration_id")]
+ public string AdministrationId { get; set; }
+
+ [JsonPropertyName("contact_id")]
+ public string ContactId { get; set; }
+
+ [JsonPropertyName("project_id")]
+ public string ProjectId { get; set; }
+
+ [JsonPropertyName("user_id")]
+ public string UserId { get; set; }
+
+ [JsonPropertyName("started_at")]
+ public DateTime StartedAt { get; set; }
+
+ [JsonPropertyName("ended_at")]
+ public DateTime EndedAt { get; set; }
+
+ [JsonPropertyName("description")]
+ public string Description { get; set; }
+
+ [JsonPropertyName("paused_duration")]
+ public int PausedDuration { get; set; }
+
+ [JsonPropertyName("billable")]
+ public bool Billable { get; set; }
+
+ [JsonPropertyName("created_at")]
+ public DateTime CreatedAt { get; set; }
+
+ [JsonPropertyName("updated_at")]
+ public DateTime UpdatedAt { get; set; }
+
+ [JsonPropertyName("contact")]
+ public Contact Contact { get; set; }
+
+ [JsonPropertyName("detail")]
+ public SalesInvoiceDetail Detail { get; set; }
+
+ [JsonPropertyName("user")]
+ public User User { get; set; }
+
+ [JsonPropertyName("project")]
+ public Project Project { get; set; }
+
+ [JsonPropertyName("events")]
+ public List Events { get; set; }
+
+ [JsonPropertyName("notes")]
+ public List Notes { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/Moneybird.Net/Entities/TimeEntries/TimeEntryDetail.cs b/src/Moneybird.Net/Entities/TimeEntries/TimeEntryDetail.cs
new file mode 100644
index 0000000..19cb804
--- /dev/null
+++ b/src/Moneybird.Net/Entities/TimeEntries/TimeEntryDetail.cs
@@ -0,0 +1,7 @@
+namespace Moneybird.Net.Entities.TimeEntries
+{
+ public class TimeEntryDetail
+ {
+
+ }
+}
\ No newline at end of file
diff --git a/src/Moneybird.Net/Entities/TimeEntries/TimeEntryState.cs b/src/Moneybird.Net/Entities/TimeEntries/TimeEntryState.cs
new file mode 100644
index 0000000..dd0a730
--- /dev/null
+++ b/src/Moneybird.Net/Entities/TimeEntries/TimeEntryState.cs
@@ -0,0 +1,17 @@
+using System.Text.Json.Serialization;
+
+namespace Moneybird.Net.Entities.TimeEntries
+{
+ [JsonConverter(typeof(JsonStringEnumMemberConverter))]
+ public enum TimeEntryState
+ {
+ [JsonPropertyName("all")]
+ All,
+
+ [JsonPropertyName("open")]
+ Open,
+
+ [JsonPropertyName("non_billable")]
+ NonBillable,
+ }
+}
\ No newline at end of file
diff --git a/src/Moneybird.Net/Extensions/ContactsExtensions.cs b/src/Moneybird.Net/Extensions/ContactsExtensions.cs
index 665f59c..4c72903 100644
--- a/src/Moneybird.Net/Extensions/ContactsExtensions.cs
+++ b/src/Moneybird.Net/Extensions/ContactsExtensions.cs
@@ -1,6 +1,6 @@
using System.Collections.Generic;
using System.Linq;
-using Moneybird.Net.Endpoints.Contacts.Models;
+using Moneybird.Net.Models.Contacts;
namespace Moneybird.Net.Extensions
{
diff --git a/src/Moneybird.Net/Extensions/ExternalSalesInvoicesExtensions.cs b/src/Moneybird.Net/Extensions/ExternalSalesInvoicesExtensions.cs
index 4752fb9..0bfb012 100644
--- a/src/Moneybird.Net/Extensions/ExternalSalesInvoicesExtensions.cs
+++ b/src/Moneybird.Net/Extensions/ExternalSalesInvoicesExtensions.cs
@@ -1,6 +1,6 @@
using System.Collections.Generic;
using System.Linq;
-using Moneybird.Net.Endpoints.ExternalSalesInvoices.Models;
+using Moneybird.Net.Models.ExternalSalesInvoices;
namespace Moneybird.Net.Extensions
{
@@ -12,7 +12,7 @@ public static string GetFilterString(this ExternalSalesInvoiceFilterOptions opti
if (options.State.HasValue)
{
- filterValues.Add($"state:{options.State.Value}");
+ filterValues.Add($"state:{options.State.Value.ToString().ToSnakeCase()}");
}
if (!string.IsNullOrEmpty(options.Period))
@@ -20,9 +20,9 @@ public static string GetFilterString(this ExternalSalesInvoiceFilterOptions opti
filterValues.Add($"period:{options.Period}");
}
- if (options.ContactId.HasValue)
+ if (!string.IsNullOrEmpty(options.ContactId))
{
- filterValues.Add($"contact_id:{options.ContactId.Value}");
+ filterValues.Add($"contact_id:{options.ContactId}");
}
return filterValues.Any()
diff --git a/src/Moneybird.Net/Extensions/ProjectsExtensions.cs b/src/Moneybird.Net/Extensions/ProjectsExtensions.cs
index 0188c50..df3bc51 100644
--- a/src/Moneybird.Net/Extensions/ProjectsExtensions.cs
+++ b/src/Moneybird.Net/Extensions/ProjectsExtensions.cs
@@ -1,6 +1,6 @@
using System.Collections.Generic;
using System.Linq;
-using Moneybird.Net.Endpoints.Projects.Models;
+using Moneybird.Net.Models.Projects;
namespace Moneybird.Net.Extensions
{
@@ -12,7 +12,7 @@ public static string GetFilterString(this ProjectFilterOptions options)
if (options.State.HasValue)
{
- filterValues.Add($"state:{options.State.Value}");
+ filterValues.Add($"state:{options.State.Value.ToString().ToSnakeCase()}");
}
return filterValues.Any()
diff --git a/src/Moneybird.Net/Extensions/SalesInvoicesExtensions.cs b/src/Moneybird.Net/Extensions/SalesInvoicesExtensions.cs
index 1cde374..d01abe6 100644
--- a/src/Moneybird.Net/Extensions/SalesInvoicesExtensions.cs
+++ b/src/Moneybird.Net/Extensions/SalesInvoicesExtensions.cs
@@ -1,6 +1,6 @@
using System.Collections.Generic;
using System.Linq;
-using Moneybird.Net.Endpoints.SalesInvoices.Models;
+using Moneybird.Net.Models.SalesInvoices;
namespace Moneybird.Net.Extensions
{
@@ -12,7 +12,7 @@ public static string GetFilterString(this SalesInvoiceFilterOptions options)
if (options.State.HasValue)
{
- filterValues.Add($"state:{options.State.Value}");
+ filterValues.Add($"state:{options.State.Value.ToString().ToSnakeCase()}");
}
if (!string.IsNullOrEmpty(options.Period))
@@ -24,20 +24,20 @@ public static string GetFilterString(this SalesInvoiceFilterOptions options)
{
filterValues.Add($"reference:{options.Reference}");
}
-
- if (options.ContactId.HasValue)
+
+ if (!string.IsNullOrEmpty(options.ContactId))
{
- filterValues.Add($"contact_id:{options.ContactId.Value}");
+ filterValues.Add($"contact_id:{options.ContactId}");
}
- if (options.RecurringSalesInvoiceId.HasValue)
+ if (!string.IsNullOrEmpty(options.RecurringSalesInvoiceId))
{
- filterValues.Add($"recurring_sales_invoice_id:{options.RecurringSalesInvoiceId.Value}");
+ filterValues.Add($"recurring_sales_invoice_id:{options.RecurringSalesInvoiceId}");
}
- if (options.WorkflowId.HasValue)
+ if (!string.IsNullOrEmpty(options.WorkflowId))
{
- filterValues.Add($"workflow_id:{options.WorkflowId.Value}");
+ filterValues.Add($"workflow_id:{options.WorkflowId}");
}
if (options.CreatedAfter.HasValue)
diff --git a/src/Moneybird.Net/Extensions/TaxRatesExtensions.cs b/src/Moneybird.Net/Extensions/TaxRatesExtensions.cs
index 0bdf620..759c98c 100644
--- a/src/Moneybird.Net/Extensions/TaxRatesExtensions.cs
+++ b/src/Moneybird.Net/Extensions/TaxRatesExtensions.cs
@@ -1,6 +1,6 @@
using System.Collections.Generic;
using System.Linq;
-using Moneybird.Net.Endpoints.TaxRates.Models;
+using Moneybird.Net.Models.TaxRates;
namespace Moneybird.Net.Extensions
{
@@ -27,12 +27,12 @@ public static string GetFilterString(this TaxRateFilterOptions options)
if (options.TaxRateType.HasValue)
{
- filterValues.Add($"tax_rate_type:{options.TaxRateType.Value}");
+ filterValues.Add($"tax_rate_type:{options.TaxRateType.Value.ToString().ToSnakeCase()}");
}
if (options.State != null && options.State.Any())
{
- filterValues.Add($"state:{string.Join("|", options.State)}");
+ filterValues.Add($"state:{string.Join("|", options.State.Select(s => s.ToString().ToSnakeCase()))}");
}
if (!string.IsNullOrEmpty(options.Country))
@@ -42,12 +42,12 @@ public static string GetFilterString(this TaxRateFilterOptions options)
if (options.ShowTax.HasValue)
{
- filterValues.Add($"show_tax:{options.ShowTax.Value}");
+ filterValues.Add($"show_tax:{options.ShowTax.Value.ToString().ToLowerInvariant()}");
}
if (options.Active.HasValue)
{
- filterValues.Add($"active:{options.Active.Value}");
+ filterValues.Add($"active:{options.Active.Value.ToString().ToLowerInvariant()}");
}
if (options.CreatedAfter.HasValue)
diff --git a/src/Moneybird.Net/Extensions/TimeEntriesExtensions.cs b/src/Moneybird.Net/Extensions/TimeEntriesExtensions.cs
new file mode 100644
index 0000000..b179c02
--- /dev/null
+++ b/src/Moneybird.Net/Extensions/TimeEntriesExtensions.cs
@@ -0,0 +1,58 @@
+using System.Collections.Generic;
+using System.Linq;
+using Moneybird.Net.Models.TimeEntries;
+
+namespace Moneybird.Net.Extensions
+{
+ internal static class TimeEntriesExtensions
+ {
+ public static string GetFilterString(this TimeEntryFilterOptions options)
+ {
+ var filterValues = new List();
+
+ if (options.State != null && options.State.Any())
+ {
+ filterValues.Add($"state:{string.Join("|", options.State.Select(s => s.ToString().ToSnakeCase()))}");
+ }
+
+ if (!string.IsNullOrEmpty(options.Period))
+ {
+ filterValues.Add($"period:{options.Period}");
+ }
+
+ if (!string.IsNullOrEmpty(options.ContactId))
+ {
+ filterValues.Add($"contact_id:{options.ContactId}");
+ }
+
+ if (options.IncludeNilContacts.HasValue)
+ {
+ filterValues.Add($"include_nil_contacts:{options.IncludeNilContacts.Value.ToString().ToLowerInvariant()}");
+ }
+
+ if (options.IncludeActive.HasValue)
+ {
+ filterValues.Add($"include_active:{options.IncludeActive.Value.ToString().ToLowerInvariant()}");
+ }
+
+ if (!string.IsNullOrEmpty(options.ProjectId))
+ {
+ filterValues.Add($"project_id:{options.ProjectId}");
+ }
+
+ if (!string.IsNullOrEmpty(options.UserId))
+ {
+ filterValues.Add($"user_id:{options.UserId}");
+ }
+
+ if (options.Day != default)
+ {
+ filterValues.Add($"day:{options.Day:yyyy-MM-dd}");
+ }
+
+ return filterValues.Any()
+ ? $"filter={string.Join(",", filterValues)}"
+ : string.Empty;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Moneybird.Net/Endpoints/Contacts/Models/ContactCreateItem.cs b/src/Moneybird.Net/Models/Contacts/ContactCreateItem.cs
similarity index 98%
rename from src/Moneybird.Net/Endpoints/Contacts/Models/ContactCreateItem.cs
rename to src/Moneybird.Net/Models/Contacts/ContactCreateItem.cs
index 9f97499..bb4688b 100644
--- a/src/Moneybird.Net/Endpoints/Contacts/Models/ContactCreateItem.cs
+++ b/src/Moneybird.Net/Models/Contacts/ContactCreateItem.cs
@@ -3,7 +3,7 @@
using Moneybird.Net.Entities.Contacts;
using Moneybird.Net.Misc;
-namespace Moneybird.Net.Endpoints.Contacts.Models
+namespace Moneybird.Net.Models.Contacts
{
public class ContactCreateItem
{
diff --git a/src/Moneybird.Net/Endpoints/Contacts/Models/ContactCreateOptions.cs b/src/Moneybird.Net/Models/Contacts/ContactCreateOptions.cs
similarity index 84%
rename from src/Moneybird.Net/Endpoints/Contacts/Models/ContactCreateOptions.cs
rename to src/Moneybird.Net/Models/Contacts/ContactCreateOptions.cs
index 159f6aa..3436d11 100644
--- a/src/Moneybird.Net/Endpoints/Contacts/Models/ContactCreateOptions.cs
+++ b/src/Moneybird.Net/Models/Contacts/ContactCreateOptions.cs
@@ -1,7 +1,7 @@
using System.Text.Json.Serialization;
using Moneybird.Net.Endpoints.Abstractions.Options;
-namespace Moneybird.Net.Endpoints.Contacts.Models
+namespace Moneybird.Net.Models.Contacts
{
public class ContactCreateOptions : IMoneybirdCreateOptions
{
diff --git a/src/Moneybird.Net/Endpoints/Contacts/Models/ContactFilterOptions.cs b/src/Moneybird.Net/Models/Contacts/ContactFilterOptions.cs
similarity index 87%
rename from src/Moneybird.Net/Endpoints/Contacts/Models/ContactFilterOptions.cs
rename to src/Moneybird.Net/Models/Contacts/ContactFilterOptions.cs
index b8286ca..f908c2a 100644
--- a/src/Moneybird.Net/Endpoints/Contacts/Models/ContactFilterOptions.cs
+++ b/src/Moneybird.Net/Models/Contacts/ContactFilterOptions.cs
@@ -1,7 +1,7 @@
using System;
using Moneybird.Net.Endpoints.Abstractions.Options;
-namespace Moneybird.Net.Endpoints.Contacts.Models
+namespace Moneybird.Net.Models.Contacts
{
public class ContactFilterOptions : IMoneybirdFilterOptions
{
diff --git a/src/Moneybird.Net/Endpoints/Contacts/Models/ContactListOptions.cs b/src/Moneybird.Net/Models/Contacts/ContactListOptions.cs
similarity index 80%
rename from src/Moneybird.Net/Endpoints/Contacts/Models/ContactListOptions.cs
rename to src/Moneybird.Net/Models/Contacts/ContactListOptions.cs
index 9ad042f..67041fb 100644
--- a/src/Moneybird.Net/Endpoints/Contacts/Models/ContactListOptions.cs
+++ b/src/Moneybird.Net/Models/Contacts/ContactListOptions.cs
@@ -1,7 +1,7 @@
using System.Collections.Generic;
using System.Text.Json.Serialization;
-namespace Moneybird.Net.Endpoints.Contacts.Models
+namespace Moneybird.Net.Models.Contacts
{
public class ContactListOptions
{
diff --git a/src/Moneybird.Net/Endpoints/Contacts/Models/ContactPersonCreateItem.cs b/src/Moneybird.Net/Models/Contacts/ContactPersonCreateItem.cs
similarity index 92%
rename from src/Moneybird.Net/Endpoints/Contacts/Models/ContactPersonCreateItem.cs
rename to src/Moneybird.Net/Models/Contacts/ContactPersonCreateItem.cs
index 9ce6c6a..c49987f 100644
--- a/src/Moneybird.Net/Endpoints/Contacts/Models/ContactPersonCreateItem.cs
+++ b/src/Moneybird.Net/Models/Contacts/ContactPersonCreateItem.cs
@@ -1,6 +1,6 @@
using System.Text.Json.Serialization;
-namespace Moneybird.Net.Endpoints.Contacts.Models
+namespace Moneybird.Net.Models.Contacts
{
public class ContactPersonCreateItem
{
diff --git a/src/Moneybird.Net/Endpoints/Contacts/Models/ContactPersonCreateOptions.cs b/src/Moneybird.Net/Models/Contacts/ContactPersonCreateOptions.cs
similarity index 80%
rename from src/Moneybird.Net/Endpoints/Contacts/Models/ContactPersonCreateOptions.cs
rename to src/Moneybird.Net/Models/Contacts/ContactPersonCreateOptions.cs
index 07e4131..897aff5 100644
--- a/src/Moneybird.Net/Endpoints/Contacts/Models/ContactPersonCreateOptions.cs
+++ b/src/Moneybird.Net/Models/Contacts/ContactPersonCreateOptions.cs
@@ -1,6 +1,6 @@
using System.Text.Json.Serialization;
-namespace Moneybird.Net.Endpoints.Contacts.Models
+namespace Moneybird.Net.Models.Contacts
{
public class ContactPersonCreateOptions
{
diff --git a/src/Moneybird.Net/Endpoints/Contacts/Models/ContactPersonUpdateItem.cs b/src/Moneybird.Net/Models/Contacts/ContactPersonUpdateItem.cs
similarity index 92%
rename from src/Moneybird.Net/Endpoints/Contacts/Models/ContactPersonUpdateItem.cs
rename to src/Moneybird.Net/Models/Contacts/ContactPersonUpdateItem.cs
index 7ff6448..27ec945 100644
--- a/src/Moneybird.Net/Endpoints/Contacts/Models/ContactPersonUpdateItem.cs
+++ b/src/Moneybird.Net/Models/Contacts/ContactPersonUpdateItem.cs
@@ -1,6 +1,6 @@
using System.Text.Json.Serialization;
-namespace Moneybird.Net.Endpoints.Contacts.Models
+namespace Moneybird.Net.Models.Contacts
{
public class ContactPersonUpdateItem
{
diff --git a/src/Moneybird.Net/Endpoints/Contacts/Models/ContactPersonUpdateOptions.cs b/src/Moneybird.Net/Models/Contacts/ContactPersonUpdateOptions.cs
similarity index 80%
rename from src/Moneybird.Net/Endpoints/Contacts/Models/ContactPersonUpdateOptions.cs
rename to src/Moneybird.Net/Models/Contacts/ContactPersonUpdateOptions.cs
index 48d3e28..124a6c7 100644
--- a/src/Moneybird.Net/Endpoints/Contacts/Models/ContactPersonUpdateOptions.cs
+++ b/src/Moneybird.Net/Models/Contacts/ContactPersonUpdateOptions.cs
@@ -1,6 +1,6 @@
using System.Text.Json.Serialization;
-namespace Moneybird.Net.Endpoints.Contacts.Models
+namespace Moneybird.Net.Models.Contacts
{
public class ContactPersonUpdateOptions
{
diff --git a/src/Moneybird.Net/Endpoints/Contacts/Models/ContactUpdateItem.cs b/src/Moneybird.Net/Models/Contacts/ContactUpdateItem.cs
similarity index 98%
rename from src/Moneybird.Net/Endpoints/Contacts/Models/ContactUpdateItem.cs
rename to src/Moneybird.Net/Models/Contacts/ContactUpdateItem.cs
index 5fe4329..fa59462 100644
--- a/src/Moneybird.Net/Endpoints/Contacts/Models/ContactUpdateItem.cs
+++ b/src/Moneybird.Net/Models/Contacts/ContactUpdateItem.cs
@@ -3,7 +3,7 @@
using Moneybird.Net.Entities.Contacts;
using Moneybird.Net.Misc;
-namespace Moneybird.Net.Endpoints.Contacts.Models
+namespace Moneybird.Net.Models.Contacts
{
public class ContactUpdateItem
{
diff --git a/src/Moneybird.Net/Endpoints/Contacts/Models/ContactUpdateOptions.cs b/src/Moneybird.Net/Models/Contacts/ContactUpdateOptions.cs
similarity index 84%
rename from src/Moneybird.Net/Endpoints/Contacts/Models/ContactUpdateOptions.cs
rename to src/Moneybird.Net/Models/Contacts/ContactUpdateOptions.cs
index 6caf233..f1c6f6a 100644
--- a/src/Moneybird.Net/Endpoints/Contacts/Models/ContactUpdateOptions.cs
+++ b/src/Moneybird.Net/Models/Contacts/ContactUpdateOptions.cs
@@ -1,7 +1,7 @@
using System.Text.Json.Serialization;
using Moneybird.Net.Endpoints.Abstractions.Options;
-namespace Moneybird.Net.Endpoints.Contacts.Models
+namespace Moneybird.Net.Models.Contacts
{
public class ContactUpdateOptions : IMoneybirdUpdateOptions
{
diff --git a/src/Moneybird.Net/Endpoints/ExternalSalesInvoices/Models/ExternalSalesInvoiceCreate.cs b/src/Moneybird.Net/Models/ExternalSalesInvoices/ExternalSalesInvoiceCreate.cs
similarity index 94%
rename from src/Moneybird.Net/Endpoints/ExternalSalesInvoices/Models/ExternalSalesInvoiceCreate.cs
rename to src/Moneybird.Net/Models/ExternalSalesInvoices/ExternalSalesInvoiceCreate.cs
index fa98eda..4181a71 100644
--- a/src/Moneybird.Net/Endpoints/ExternalSalesInvoices/Models/ExternalSalesInvoiceCreate.cs
+++ b/src/Moneybird.Net/Models/ExternalSalesInvoices/ExternalSalesInvoiceCreate.cs
@@ -2,7 +2,7 @@
using System.Collections.Generic;
using System.Text.Json.Serialization;
-namespace Moneybird.Net.Endpoints.ExternalSalesInvoices.Models
+namespace Moneybird.Net.Models.ExternalSalesInvoices
{
public class ExternalSalesInvoiceCreate
{
diff --git a/src/Moneybird.Net/Endpoints/ExternalSalesInvoices/Models/ExternalSalesInvoiceCreateDetail.cs b/src/Moneybird.Net/Models/ExternalSalesInvoices/ExternalSalesInvoiceCreateDetail.cs
similarity index 96%
rename from src/Moneybird.Net/Endpoints/ExternalSalesInvoices/Models/ExternalSalesInvoiceCreateDetail.cs
rename to src/Moneybird.Net/Models/ExternalSalesInvoices/ExternalSalesInvoiceCreateDetail.cs
index afc98d3..73243f8 100644
--- a/src/Moneybird.Net/Endpoints/ExternalSalesInvoices/Models/ExternalSalesInvoiceCreateDetail.cs
+++ b/src/Moneybird.Net/Models/ExternalSalesInvoices/ExternalSalesInvoiceCreateDetail.cs
@@ -1,6 +1,6 @@
using System.Text.Json.Serialization;
-namespace Moneybird.Net.Endpoints.ExternalSalesInvoices.Models
+namespace Moneybird.Net.Models.ExternalSalesInvoices
{
public class ExternalSalesInvoiceCreateDetail
{
diff --git a/src/Moneybird.Net/Endpoints/ExternalSalesInvoices/Models/ExternalSalesInvoiceCreateOptions.cs b/src/Moneybird.Net/Models/ExternalSalesInvoices/ExternalSalesInvoiceCreateOptions.cs
similarity index 86%
rename from src/Moneybird.Net/Endpoints/ExternalSalesInvoices/Models/ExternalSalesInvoiceCreateOptions.cs
rename to src/Moneybird.Net/Models/ExternalSalesInvoices/ExternalSalesInvoiceCreateOptions.cs
index 200dc7f..bde0de2 100644
--- a/src/Moneybird.Net/Endpoints/ExternalSalesInvoices/Models/ExternalSalesInvoiceCreateOptions.cs
+++ b/src/Moneybird.Net/Models/ExternalSalesInvoices/ExternalSalesInvoiceCreateOptions.cs
@@ -1,7 +1,7 @@
using System.Text.Json.Serialization;
using Moneybird.Net.Endpoints.Abstractions.Options;
-namespace Moneybird.Net.Endpoints.ExternalSalesInvoices.Models
+namespace Moneybird.Net.Models.ExternalSalesInvoices
{
public class ExternalSalesInvoiceCreateOptions : IMoneybirdCreateOptions
{
diff --git a/src/Moneybird.Net/Endpoints/ExternalSalesInvoices/Models/ExternalSalesInvoiceFilterOptions.cs b/src/Moneybird.Net/Models/ExternalSalesInvoices/ExternalSalesInvoiceFilterOptions.cs
similarity index 68%
rename from src/Moneybird.Net/Endpoints/ExternalSalesInvoices/Models/ExternalSalesInvoiceFilterOptions.cs
rename to src/Moneybird.Net/Models/ExternalSalesInvoices/ExternalSalesInvoiceFilterOptions.cs
index d3debfe..11ee194 100644
--- a/src/Moneybird.Net/Endpoints/ExternalSalesInvoices/Models/ExternalSalesInvoiceFilterOptions.cs
+++ b/src/Moneybird.Net/Models/ExternalSalesInvoices/ExternalSalesInvoiceFilterOptions.cs
@@ -1,8 +1,7 @@
using Moneybird.Net.Endpoints.Abstractions.Options;
using Moneybird.Net.Entities.ExternalSalesInvoices;
-using Moneybird.Net.Entities.SalesInvoices;
-namespace Moneybird.Net.Endpoints.ExternalSalesInvoices.Models
+namespace Moneybird.Net.Models.ExternalSalesInvoices
{
public class ExternalSalesInvoiceFilterOptions : IMoneybirdFilterOptions
{
@@ -10,6 +9,6 @@ public class ExternalSalesInvoiceFilterOptions : IMoneybirdFilterOptions
public string Period { get; set; }
- public int? ContactId { get; set; }
+ public string ContactId { get; set; }
}
}
diff --git a/src/Moneybird.Net/Endpoints/ExternalSalesInvoices/Models/ExternalSalesInvoiceUpdate.cs b/src/Moneybird.Net/Models/ExternalSalesInvoices/ExternalSalesInvoiceUpdate.cs
similarity index 94%
rename from src/Moneybird.Net/Endpoints/ExternalSalesInvoices/Models/ExternalSalesInvoiceUpdate.cs
rename to src/Moneybird.Net/Models/ExternalSalesInvoices/ExternalSalesInvoiceUpdate.cs
index 44d3d3f..5d66dce 100644
--- a/src/Moneybird.Net/Endpoints/ExternalSalesInvoices/Models/ExternalSalesInvoiceUpdate.cs
+++ b/src/Moneybird.Net/Models/ExternalSalesInvoices/ExternalSalesInvoiceUpdate.cs
@@ -2,7 +2,7 @@
using System.Collections.Generic;
using System.Text.Json.Serialization;
-namespace Moneybird.Net.Endpoints.ExternalSalesInvoices.Models
+namespace Moneybird.Net.Models.ExternalSalesInvoices
{
public class ExternalSalesInvoiceUpdate
{
diff --git a/src/Moneybird.Net/Endpoints/ExternalSalesInvoices/Models/ExternalSalesInvoiceUpdateDetail.cs b/src/Moneybird.Net/Models/ExternalSalesInvoices/ExternalSalesInvoiceUpdateDetail.cs
similarity index 96%
rename from src/Moneybird.Net/Endpoints/ExternalSalesInvoices/Models/ExternalSalesInvoiceUpdateDetail.cs
rename to src/Moneybird.Net/Models/ExternalSalesInvoices/ExternalSalesInvoiceUpdateDetail.cs
index f087cee..c649989 100644
--- a/src/Moneybird.Net/Endpoints/ExternalSalesInvoices/Models/ExternalSalesInvoiceUpdateDetail.cs
+++ b/src/Moneybird.Net/Models/ExternalSalesInvoices/ExternalSalesInvoiceUpdateDetail.cs
@@ -1,6 +1,6 @@
using System.Text.Json.Serialization;
-namespace Moneybird.Net.Endpoints.ExternalSalesInvoices.Models
+namespace Moneybird.Net.Models.ExternalSalesInvoices
{
public class ExternalSalesInvoiceUpdateDetail
{
diff --git a/src/Moneybird.Net/Endpoints/ExternalSalesInvoices/Models/ExternalSalesInvoiceUpdateOptions.cs b/src/Moneybird.Net/Models/ExternalSalesInvoices/ExternalSalesInvoiceUpdateOptions.cs
similarity index 86%
rename from src/Moneybird.Net/Endpoints/ExternalSalesInvoices/Models/ExternalSalesInvoiceUpdateOptions.cs
rename to src/Moneybird.Net/Models/ExternalSalesInvoices/ExternalSalesInvoiceUpdateOptions.cs
index c919ef0..40b17fc 100644
--- a/src/Moneybird.Net/Endpoints/ExternalSalesInvoices/Models/ExternalSalesInvoiceUpdateOptions.cs
+++ b/src/Moneybird.Net/Models/ExternalSalesInvoices/ExternalSalesInvoiceUpdateOptions.cs
@@ -1,7 +1,7 @@
using System.Text.Json.Serialization;
using Moneybird.Net.Endpoints.Abstractions.Options;
-namespace Moneybird.Net.Endpoints.ExternalSalesInvoices.Models
+namespace Moneybird.Net.Models.ExternalSalesInvoices
{
public class ExternalSalesInvoiceUpdateOptions : IMoneybirdUpdateOptions
{
diff --git a/src/Moneybird.Net/Endpoints/FinancialStatements/Models/FinancialStatementCreate.cs b/src/Moneybird.Net/Models/FinancialStatements/FinancialStatementCreate.cs
similarity index 94%
rename from src/Moneybird.Net/Endpoints/FinancialStatements/Models/FinancialStatementCreate.cs
rename to src/Moneybird.Net/Models/FinancialStatements/FinancialStatementCreate.cs
index e633b7b..90f510f 100644
--- a/src/Moneybird.Net/Endpoints/FinancialStatements/Models/FinancialStatementCreate.cs
+++ b/src/Moneybird.Net/Models/FinancialStatements/FinancialStatementCreate.cs
@@ -3,7 +3,7 @@
using System.Text.Json.Serialization;
using Moneybird.Net.Entities.FinancialMutations;
-namespace Moneybird.Net.Endpoints.FinancialStatements.Models
+namespace Moneybird.Net.Models.FinancialStatements
{
public class FinancialStatementCreate
{
diff --git a/src/Moneybird.Net/Endpoints/FinancialStatements/Models/FinancialStatementCreateOptions.cs b/src/Moneybird.Net/Models/FinancialStatements/FinancialStatementCreateOptions.cs
similarity index 83%
rename from src/Moneybird.Net/Endpoints/FinancialStatements/Models/FinancialStatementCreateOptions.cs
rename to src/Moneybird.Net/Models/FinancialStatements/FinancialStatementCreateOptions.cs
index 281a87d..c640e05 100644
--- a/src/Moneybird.Net/Endpoints/FinancialStatements/Models/FinancialStatementCreateOptions.cs
+++ b/src/Moneybird.Net/Models/FinancialStatements/FinancialStatementCreateOptions.cs
@@ -1,7 +1,7 @@
using System.Text.Json.Serialization;
using Moneybird.Net.Endpoints.Abstractions.Options;
-namespace Moneybird.Net.Endpoints.FinancialStatements.Models
+namespace Moneybird.Net.Models.FinancialStatements
{
public class FinancialStatementCreateOptions : IMoneybirdCreateOptions
{
diff --git a/src/Moneybird.Net/Endpoints/FinancialStatements/Models/FinancialStatementUpdate.cs b/src/Moneybird.Net/Models/FinancialStatements/FinancialStatementUpdate.cs
similarity index 94%
rename from src/Moneybird.Net/Endpoints/FinancialStatements/Models/FinancialStatementUpdate.cs
rename to src/Moneybird.Net/Models/FinancialStatements/FinancialStatementUpdate.cs
index 13d9795..01444c9 100644
--- a/src/Moneybird.Net/Endpoints/FinancialStatements/Models/FinancialStatementUpdate.cs
+++ b/src/Moneybird.Net/Models/FinancialStatements/FinancialStatementUpdate.cs
@@ -3,7 +3,7 @@
using System.Text.Json.Serialization;
using Moneybird.Net.Entities.FinancialMutations;
-namespace Moneybird.Net.Endpoints.FinancialStatements.Models
+namespace Moneybird.Net.Models.FinancialStatements
{
public class FinancialStatementUpdate
{
diff --git a/src/Moneybird.Net/Endpoints/FinancialStatements/Models/FinancialStatementUpdateOptions.cs b/src/Moneybird.Net/Models/FinancialStatements/FinancialStatementUpdateOptions.cs
similarity index 83%
rename from src/Moneybird.Net/Endpoints/FinancialStatements/Models/FinancialStatementUpdateOptions.cs
rename to src/Moneybird.Net/Models/FinancialStatements/FinancialStatementUpdateOptions.cs
index 94b9e83..511f984 100644
--- a/src/Moneybird.Net/Endpoints/FinancialStatements/Models/FinancialStatementUpdateOptions.cs
+++ b/src/Moneybird.Net/Models/FinancialStatements/FinancialStatementUpdateOptions.cs
@@ -1,7 +1,7 @@
using System.Text.Json.Serialization;
using Moneybird.Net.Endpoints.Abstractions.Options;
-namespace Moneybird.Net.Endpoints.FinancialStatements.Models
+namespace Moneybird.Net.Models.FinancialStatements
{
public class FinancialStatementUpdateOptions : IMoneybirdUpdateOptions
{
diff --git a/src/Moneybird.Net/Endpoints/LegderAccounts/Models/LedgerAccountCreate.cs b/src/Moneybird.Net/Models/LedgerAccounts/LedgerAccountCreate.cs
similarity index 93%
rename from src/Moneybird.Net/Endpoints/LegderAccounts/Models/LedgerAccountCreate.cs
rename to src/Moneybird.Net/Models/LedgerAccounts/LedgerAccountCreate.cs
index 9c58dec..e94c4bc 100644
--- a/src/Moneybird.Net/Endpoints/LegderAccounts/Models/LedgerAccountCreate.cs
+++ b/src/Moneybird.Net/Models/LedgerAccounts/LedgerAccountCreate.cs
@@ -3,7 +3,7 @@
using Moneybird.Net.Entities.LedgerAccounts;
using Moneybird.Net.Misc;
-namespace Moneybird.Net.Endpoints.LegderAccounts.Models
+namespace Moneybird.Net.Models.LedgerAccounts
{
public class LedgerAccountCreate
{
diff --git a/src/Moneybird.Net/Endpoints/LegderAccounts/Models/LedgerAccountCreateOptions.cs b/src/Moneybird.Net/Models/LedgerAccounts/LedgerAccountCreateOptions.cs
similarity index 83%
rename from src/Moneybird.Net/Endpoints/LegderAccounts/Models/LedgerAccountCreateOptions.cs
rename to src/Moneybird.Net/Models/LedgerAccounts/LedgerAccountCreateOptions.cs
index e1c425e..7eb7385 100644
--- a/src/Moneybird.Net/Endpoints/LegderAccounts/Models/LedgerAccountCreateOptions.cs
+++ b/src/Moneybird.Net/Models/LedgerAccounts/LedgerAccountCreateOptions.cs
@@ -1,7 +1,7 @@
using System.Text.Json.Serialization;
using Moneybird.Net.Endpoints.Abstractions.Options;
-namespace Moneybird.Net.Endpoints.LegderAccounts.Models
+namespace Moneybird.Net.Models.LedgerAccounts
{
public class LedgerAccountCreateOptions : IMoneybirdCreateOptions
{
diff --git a/src/Moneybird.Net/Endpoints/LegderAccounts/Models/LedgerAccountUpdate.cs b/src/Moneybird.Net/Models/LedgerAccounts/LedgerAccountUpdate.cs
similarity index 93%
rename from src/Moneybird.Net/Endpoints/LegderAccounts/Models/LedgerAccountUpdate.cs
rename to src/Moneybird.Net/Models/LedgerAccounts/LedgerAccountUpdate.cs
index 41a9262..a83cb41 100644
--- a/src/Moneybird.Net/Endpoints/LegderAccounts/Models/LedgerAccountUpdate.cs
+++ b/src/Moneybird.Net/Models/LedgerAccounts/LedgerAccountUpdate.cs
@@ -3,7 +3,7 @@
using Moneybird.Net.Entities.LedgerAccounts;
using Moneybird.Net.Misc;
-namespace Moneybird.Net.Endpoints.LegderAccounts.Models
+namespace Moneybird.Net.Models.LedgerAccounts
{
public class LedgerAccountUpdate
{
diff --git a/src/Moneybird.Net/Endpoints/LegderAccounts/Models/LedgerAccountUpdateOptions.cs b/src/Moneybird.Net/Models/LedgerAccounts/LedgerAccountUpdateOptions.cs
similarity index 83%
rename from src/Moneybird.Net/Endpoints/LegderAccounts/Models/LedgerAccountUpdateOptions.cs
rename to src/Moneybird.Net/Models/LedgerAccounts/LedgerAccountUpdateOptions.cs
index cefda8e..bedbe19 100644
--- a/src/Moneybird.Net/Endpoints/LegderAccounts/Models/LedgerAccountUpdateOptions.cs
+++ b/src/Moneybird.Net/Models/LedgerAccounts/LedgerAccountUpdateOptions.cs
@@ -1,7 +1,7 @@
using System.Text.Json.Serialization;
using Moneybird.Net.Endpoints.Abstractions.Options;
-namespace Moneybird.Net.Endpoints.LegderAccounts.Models
+namespace Moneybird.Net.Models.LedgerAccounts
{
public class LedgerAccountUpdateOptions : IMoneybirdUpdateOptions
{
diff --git a/src/Moneybird.Net/Endpoints/Contacts/Models/ContactNoteCreateItem.cs b/src/Moneybird.Net/Models/Notes/NoteCreateItem.cs
similarity index 77%
rename from src/Moneybird.Net/Endpoints/Contacts/Models/ContactNoteCreateItem.cs
rename to src/Moneybird.Net/Models/Notes/NoteCreateItem.cs
index 0e45fdc..2c96d70 100644
--- a/src/Moneybird.Net/Endpoints/Contacts/Models/ContactNoteCreateItem.cs
+++ b/src/Moneybird.Net/Models/Notes/NoteCreateItem.cs
@@ -1,8 +1,8 @@
using System.Text.Json.Serialization;
-namespace Moneybird.Net.Endpoints.Contacts.Models
+namespace Moneybird.Net.Models.Notes
{
- public class ContactNoteCreateItem
+ public class NoteCreateItem
{
[JsonPropertyName("note")]
public string Note { get; set; }
diff --git a/src/Moneybird.Net/Models/Notes/NoteCreateOptions.cs b/src/Moneybird.Net/Models/Notes/NoteCreateOptions.cs
new file mode 100644
index 0000000..8a2a454
--- /dev/null
+++ b/src/Moneybird.Net/Models/Notes/NoteCreateOptions.cs
@@ -0,0 +1,10 @@
+using System.Text.Json.Serialization;
+
+namespace Moneybird.Net.Models.Notes
+{
+ public class NoteCreateOptions
+ {
+ [JsonPropertyName("note")]
+ public NoteCreateItem Note { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/Moneybird.Net/Endpoints/Products/Models/ProductCreate.cs b/src/Moneybird.Net/Models/Products/ProductCreate.cs
similarity index 97%
rename from src/Moneybird.Net/Endpoints/Products/Models/ProductCreate.cs
rename to src/Moneybird.Net/Models/Products/ProductCreate.cs
index 2e48a73..76a1dc7 100644
--- a/src/Moneybird.Net/Endpoints/Products/Models/ProductCreate.cs
+++ b/src/Moneybird.Net/Models/Products/ProductCreate.cs
@@ -2,7 +2,7 @@
using Moneybird.Net.Entities.Products;
using Moneybird.Net.Misc;
-namespace Moneybird.Net.Endpoints.Products.Models
+namespace Moneybird.Net.Models.Products
{
public class ProductCreate
{
diff --git a/src/Moneybird.Net/Endpoints/Products/Models/ProductCreateOptions.cs b/src/Moneybird.Net/Models/Products/ProductCreateOptions.cs
similarity index 83%
rename from src/Moneybird.Net/Endpoints/Products/Models/ProductCreateOptions.cs
rename to src/Moneybird.Net/Models/Products/ProductCreateOptions.cs
index 745d9e8..09abc17 100644
--- a/src/Moneybird.Net/Endpoints/Products/Models/ProductCreateOptions.cs
+++ b/src/Moneybird.Net/Models/Products/ProductCreateOptions.cs
@@ -1,7 +1,7 @@
using System.Text.Json.Serialization;
using Moneybird.Net.Endpoints.Abstractions.Options;
-namespace Moneybird.Net.Endpoints.Products.Models
+namespace Moneybird.Net.Models.Products
{
public class ProductCreateOptions : IMoneybirdCreateOptions
{
diff --git a/src/Moneybird.Net/Endpoints/Products/Models/ProductUpdate.cs b/src/Moneybird.Net/Models/Products/ProductUpdate.cs
similarity index 97%
rename from src/Moneybird.Net/Endpoints/Products/Models/ProductUpdate.cs
rename to src/Moneybird.Net/Models/Products/ProductUpdate.cs
index 423f566..8fb0c24 100644
--- a/src/Moneybird.Net/Endpoints/Products/Models/ProductUpdate.cs
+++ b/src/Moneybird.Net/Models/Products/ProductUpdate.cs
@@ -2,7 +2,7 @@
using Moneybird.Net.Entities.Products;
using Moneybird.Net.Misc;
-namespace Moneybird.Net.Endpoints.Products.Models
+namespace Moneybird.Net.Models.Products
{
public class ProductUpdate
{
diff --git a/src/Moneybird.Net/Endpoints/Products/Models/ProductUpdateOptions.cs b/src/Moneybird.Net/Models/Products/ProductUpdateOptions.cs
similarity index 83%
rename from src/Moneybird.Net/Endpoints/Products/Models/ProductUpdateOptions.cs
rename to src/Moneybird.Net/Models/Products/ProductUpdateOptions.cs
index ac99ba4..5c7c069 100644
--- a/src/Moneybird.Net/Endpoints/Products/Models/ProductUpdateOptions.cs
+++ b/src/Moneybird.Net/Models/Products/ProductUpdateOptions.cs
@@ -1,7 +1,7 @@
using System.Text.Json.Serialization;
using Moneybird.Net.Endpoints.Abstractions.Options;
-namespace Moneybird.Net.Endpoints.Products.Models
+namespace Moneybird.Net.Models.Products
{
public class ProductUpdateOptions : IMoneybirdUpdateOptions
{
diff --git a/src/Moneybird.Net/Endpoints/Projects/Models/ProjectCreate.cs b/src/Moneybird.Net/Models/Projects/ProjectCreate.cs
similarity index 83%
rename from src/Moneybird.Net/Endpoints/Projects/Models/ProjectCreate.cs
rename to src/Moneybird.Net/Models/Projects/ProjectCreate.cs
index 9a0abf8..459dbe6 100644
--- a/src/Moneybird.Net/Endpoints/Projects/Models/ProjectCreate.cs
+++ b/src/Moneybird.Net/Models/Projects/ProjectCreate.cs
@@ -1,6 +1,6 @@
using System.Text.Json.Serialization;
-namespace Moneybird.Net.Endpoints.Projects.Models
+namespace Moneybird.Net.Models.Projects
{
public class ProjectCreate
{
diff --git a/src/Moneybird.Net/Endpoints/Projects/Models/ProjectCreateOptions.cs b/src/Moneybird.Net/Models/Projects/ProjectCreateOptions.cs
similarity index 83%
rename from src/Moneybird.Net/Endpoints/Projects/Models/ProjectCreateOptions.cs
rename to src/Moneybird.Net/Models/Projects/ProjectCreateOptions.cs
index 3c8486f..fac86b0 100644
--- a/src/Moneybird.Net/Endpoints/Projects/Models/ProjectCreateOptions.cs
+++ b/src/Moneybird.Net/Models/Projects/ProjectCreateOptions.cs
@@ -1,7 +1,7 @@
using System.Text.Json.Serialization;
using Moneybird.Net.Endpoints.Abstractions.Options;
-namespace Moneybird.Net.Endpoints.Projects.Models
+namespace Moneybird.Net.Models.Projects
{
public class ProjectCreateOptions : IMoneybirdCreateOptions
{
diff --git a/src/Moneybird.Net/Endpoints/Projects/Models/ProjectFilterOptions.cs b/src/Moneybird.Net/Models/Projects/ProjectFilterOptions.cs
similarity index 81%
rename from src/Moneybird.Net/Endpoints/Projects/Models/ProjectFilterOptions.cs
rename to src/Moneybird.Net/Models/Projects/ProjectFilterOptions.cs
index 5ed39e4..4503915 100644
--- a/src/Moneybird.Net/Endpoints/Projects/Models/ProjectFilterOptions.cs
+++ b/src/Moneybird.Net/Models/Projects/ProjectFilterOptions.cs
@@ -1,7 +1,7 @@
using Moneybird.Net.Endpoints.Abstractions.Options;
using Moneybird.Net.Entities.Projects;
-namespace Moneybird.Net.Endpoints.Projects.Models
+namespace Moneybird.Net.Models.Projects
{
public class ProjectFilterOptions : IMoneybirdFilterOptions
{
diff --git a/src/Moneybird.Net/Endpoints/Projects/Models/ProjectUpdate.cs b/src/Moneybird.Net/Models/Projects/ProjectUpdate.cs
similarity index 83%
rename from src/Moneybird.Net/Endpoints/Projects/Models/ProjectUpdate.cs
rename to src/Moneybird.Net/Models/Projects/ProjectUpdate.cs
index 2975fd1..b5f256b 100644
--- a/src/Moneybird.Net/Endpoints/Projects/Models/ProjectUpdate.cs
+++ b/src/Moneybird.Net/Models/Projects/ProjectUpdate.cs
@@ -1,6 +1,6 @@
using System.Text.Json.Serialization;
-namespace Moneybird.Net.Endpoints.Projects.Models
+namespace Moneybird.Net.Models.Projects
{
public class ProjectUpdate
{
diff --git a/src/Moneybird.Net/Endpoints/Projects/Models/ProjectUpdateOptions.cs b/src/Moneybird.Net/Models/Projects/ProjectUpdateOptions.cs
similarity index 83%
rename from src/Moneybird.Net/Endpoints/Projects/Models/ProjectUpdateOptions.cs
rename to src/Moneybird.Net/Models/Projects/ProjectUpdateOptions.cs
index fe099ff..57d9c4e 100644
--- a/src/Moneybird.Net/Endpoints/Projects/Models/ProjectUpdateOptions.cs
+++ b/src/Moneybird.Net/Models/Projects/ProjectUpdateOptions.cs
@@ -1,7 +1,7 @@
using System.Text.Json.Serialization;
using Moneybird.Net.Endpoints.Abstractions.Options;
-namespace Moneybird.Net.Endpoints.Projects.Models
+namespace Moneybird.Net.Models.Projects
{
public class ProjectUpdateOptions : IMoneybirdUpdateOptions
{
diff --git a/src/Moneybird.Net/Endpoints/SalesInvoices/Models/SalesInvoiceCreate.cs b/src/Moneybird.Net/Models/SalesInvoices/SalesInvoiceCreate.cs
similarity index 97%
rename from src/Moneybird.Net/Endpoints/SalesInvoices/Models/SalesInvoiceCreate.cs
rename to src/Moneybird.Net/Models/SalesInvoices/SalesInvoiceCreate.cs
index 0eee7b1..3cac54e 100644
--- a/src/Moneybird.Net/Endpoints/SalesInvoices/Models/SalesInvoiceCreate.cs
+++ b/src/Moneybird.Net/Models/SalesInvoices/SalesInvoiceCreate.cs
@@ -3,7 +3,7 @@
using System.Text.Json.Serialization;
using Moneybird.Net.Entities.SalesInvoices;
-namespace Moneybird.Net.Endpoints.SalesInvoices.Models
+namespace Moneybird.Net.Models.SalesInvoices
{
public class SalesInvoiceCreate
{
diff --git a/src/Moneybird.Net/Endpoints/SalesInvoices/Models/SalesInvoiceCreateDetail.cs b/src/Moneybird.Net/Models/SalesInvoices/SalesInvoiceCreateDetail.cs
similarity index 97%
rename from src/Moneybird.Net/Endpoints/SalesInvoices/Models/SalesInvoiceCreateDetail.cs
rename to src/Moneybird.Net/Models/SalesInvoices/SalesInvoiceCreateDetail.cs
index 2d3a35b..a7de2bb 100644
--- a/src/Moneybird.Net/Endpoints/SalesInvoices/Models/SalesInvoiceCreateDetail.cs
+++ b/src/Moneybird.Net/Models/SalesInvoices/SalesInvoiceCreateDetail.cs
@@ -1,7 +1,7 @@
using System.Collections.Generic;
using System.Text.Json.Serialization;
-namespace Moneybird.Net.Endpoints.SalesInvoices.Models
+namespace Moneybird.Net.Models.SalesInvoices
{
public class SalesInvoiceCreateDetail
{
diff --git a/src/Moneybird.Net/Endpoints/SalesInvoices/Models/SalesInvoiceCreateOptions.cs b/src/Moneybird.Net/Models/SalesInvoices/SalesInvoiceCreateOptions.cs
similarity index 89%
rename from src/Moneybird.Net/Endpoints/SalesInvoices/Models/SalesInvoiceCreateOptions.cs
rename to src/Moneybird.Net/Models/SalesInvoices/SalesInvoiceCreateOptions.cs
index 317e5ab..5d2a1f6 100644
--- a/src/Moneybird.Net/Endpoints/SalesInvoices/Models/SalesInvoiceCreateOptions.cs
+++ b/src/Moneybird.Net/Models/SalesInvoices/SalesInvoiceCreateOptions.cs
@@ -1,7 +1,7 @@
using System.Text.Json.Serialization;
using Moneybird.Net.Endpoints.Abstractions.Options;
-namespace Moneybird.Net.Endpoints.SalesInvoices.Models
+namespace Moneybird.Net.Models.SalesInvoices
{
///
/// https://developer.moneybird.com/api/sales_invoices/#post_sales_invoices
diff --git a/src/Moneybird.Net/Endpoints/SalesInvoices/Models/SalesInvoiceFilterOptions.cs b/src/Moneybird.Net/Models/SalesInvoices/SalesInvoiceFilterOptions.cs
similarity index 71%
rename from src/Moneybird.Net/Endpoints/SalesInvoices/Models/SalesInvoiceFilterOptions.cs
rename to src/Moneybird.Net/Models/SalesInvoices/SalesInvoiceFilterOptions.cs
index 58fb7c4..a34078f 100644
--- a/src/Moneybird.Net/Endpoints/SalesInvoices/Models/SalesInvoiceFilterOptions.cs
+++ b/src/Moneybird.Net/Models/SalesInvoices/SalesInvoiceFilterOptions.cs
@@ -2,7 +2,7 @@
using Moneybird.Net.Endpoints.Abstractions.Options;
using Moneybird.Net.Entities.SalesInvoices;
-namespace Moneybird.Net.Endpoints.SalesInvoices.Models
+namespace Moneybird.Net.Models.SalesInvoices
{
public class SalesInvoiceFilterOptions : IMoneybirdFilterOptions
{
@@ -12,11 +12,11 @@ public class SalesInvoiceFilterOptions : IMoneybirdFilterOptions
public string Reference { get; set; }
- public int? ContactId { get; set; }
+ public string ContactId { get; set; }
- public int? RecurringSalesInvoiceId { get; set; }
+ public string RecurringSalesInvoiceId { get; set; }
- public int? WorkflowId { get; set; }
+ public string WorkflowId { get; set; }
public DateTime? CreatedAfter { get; set; }
diff --git a/src/Moneybird.Net/Endpoints/SalesInvoices/Models/SalesInvoiceUpdate.cs b/src/Moneybird.Net/Models/SalesInvoices/SalesInvoiceUpdate.cs
similarity index 98%
rename from src/Moneybird.Net/Endpoints/SalesInvoices/Models/SalesInvoiceUpdate.cs
rename to src/Moneybird.Net/Models/SalesInvoices/SalesInvoiceUpdate.cs
index 69f7fed..2929f1b 100644
--- a/src/Moneybird.Net/Endpoints/SalesInvoices/Models/SalesInvoiceUpdate.cs
+++ b/src/Moneybird.Net/Models/SalesInvoices/SalesInvoiceUpdate.cs
@@ -3,7 +3,7 @@
using System.Text.Json.Serialization;
using Moneybird.Net.Entities.SalesInvoices;
-namespace Moneybird.Net.Endpoints.SalesInvoices.Models
+namespace Moneybird.Net.Models.SalesInvoices
{
public class SalesInvoiceUpdate
{
diff --git a/src/Moneybird.Net/Endpoints/SalesInvoices/Models/SalesInvoiceUpdateDetail.cs b/src/Moneybird.Net/Models/SalesInvoices/SalesInvoiceUpdateDetail.cs
similarity index 97%
rename from src/Moneybird.Net/Endpoints/SalesInvoices/Models/SalesInvoiceUpdateDetail.cs
rename to src/Moneybird.Net/Models/SalesInvoices/SalesInvoiceUpdateDetail.cs
index 1bd3509..652c6bb 100644
--- a/src/Moneybird.Net/Endpoints/SalesInvoices/Models/SalesInvoiceUpdateDetail.cs
+++ b/src/Moneybird.Net/Models/SalesInvoices/SalesInvoiceUpdateDetail.cs
@@ -1,7 +1,7 @@
using System.Collections.Generic;
using System.Text.Json.Serialization;
-namespace Moneybird.Net.Endpoints.SalesInvoices.Models
+namespace Moneybird.Net.Models.SalesInvoices
{
public class SalesInvoiceUpdateDetail
{
diff --git a/src/Moneybird.Net/Endpoints/SalesInvoices/Models/SalesInvoiceUpdateOptions.cs b/src/Moneybird.Net/Models/SalesInvoices/SalesInvoiceUpdateOptions.cs
similarity index 83%
rename from src/Moneybird.Net/Endpoints/SalesInvoices/Models/SalesInvoiceUpdateOptions.cs
rename to src/Moneybird.Net/Models/SalesInvoices/SalesInvoiceUpdateOptions.cs
index 917d878..363602a 100644
--- a/src/Moneybird.Net/Endpoints/SalesInvoices/Models/SalesInvoiceUpdateOptions.cs
+++ b/src/Moneybird.Net/Models/SalesInvoices/SalesInvoiceUpdateOptions.cs
@@ -1,7 +1,7 @@
using System.Text.Json.Serialization;
using Moneybird.Net.Endpoints.Abstractions.Options;
-namespace Moneybird.Net.Endpoints.SalesInvoices.Models
+namespace Moneybird.Net.Models.SalesInvoices
{
public class SalesInvoiceUpdateOptions : IMoneybirdUpdateOptions
{
diff --git a/src/Moneybird.Net/Endpoints/TaxRates/Models/TaxRateFilterOptions.cs b/src/Moneybird.Net/Models/TaxRates/TaxRateFilterOptions.cs
similarity index 93%
rename from src/Moneybird.Net/Endpoints/TaxRates/Models/TaxRateFilterOptions.cs
rename to src/Moneybird.Net/Models/TaxRates/TaxRateFilterOptions.cs
index 4d68ae1..7449dfb 100644
--- a/src/Moneybird.Net/Endpoints/TaxRates/Models/TaxRateFilterOptions.cs
+++ b/src/Moneybird.Net/Models/TaxRates/TaxRateFilterOptions.cs
@@ -3,7 +3,7 @@
using Moneybird.Net.Endpoints.Abstractions.Options;
using Moneybird.Net.Entities.TaxRates;
-namespace Moneybird.Net.Endpoints.TaxRates.Models
+namespace Moneybird.Net.Models.TaxRates
{
public class TaxRateFilterOptions : IMoneybirdFilterOptions
{
diff --git a/src/Moneybird.Net/Models/TimeEntries/TimeEntryCreate.cs b/src/Moneybird.Net/Models/TimeEntries/TimeEntryCreate.cs
new file mode 100644
index 0000000..0deba57
--- /dev/null
+++ b/src/Moneybird.Net/Models/TimeEntries/TimeEntryCreate.cs
@@ -0,0 +1,35 @@
+using System;
+using System.Text.Json.Serialization;
+
+namespace Moneybird.Net.Models.TimeEntries
+{
+ public class TimeEntryCreate
+ {
+ [JsonPropertyName("user_id")]
+ public string UserId { get; set; }
+
+ [JsonPropertyName("started_at")]
+ public DateTime StartedAt { get; set; }
+
+ [JsonPropertyName("ended_at")]
+ public DateTime EndedAt { get; set; }
+
+ [JsonPropertyName("description")]
+ public string Description { get; set; }
+
+ [JsonPropertyName("contact_id")]
+ public string ContactId { get; set; }
+
+ [JsonPropertyName("project_id")]
+ public string ProjectId { get; set; }
+
+ [JsonPropertyName("detail_id")]
+ public string DetailId { get; set; }
+
+ [JsonPropertyName("billable")]
+ public bool Billable { get; set; }
+
+ [JsonPropertyName("paused_duration")]
+ public int PausedDuration { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/Moneybird.Net/Models/TimeEntries/TimeEntryCreateOptions.cs b/src/Moneybird.Net/Models/TimeEntries/TimeEntryCreateOptions.cs
new file mode 100644
index 0000000..d69b4da
--- /dev/null
+++ b/src/Moneybird.Net/Models/TimeEntries/TimeEntryCreateOptions.cs
@@ -0,0 +1,11 @@
+using System.Text.Json.Serialization;
+using Moneybird.Net.Endpoints.Abstractions.Options;
+
+namespace Moneybird.Net.Models.TimeEntries
+{
+ public class TimeEntryCreateOptions : IMoneybirdCreateOptions
+ {
+ [JsonPropertyName("time_entry")]
+ public TimeEntryCreate TimeEntry { get; set; }
+ }
+}
diff --git a/src/Moneybird.Net/Models/TimeEntries/TimeEntryFilterOptions.cs b/src/Moneybird.Net/Models/TimeEntries/TimeEntryFilterOptions.cs
new file mode 100644
index 0000000..566c148
--- /dev/null
+++ b/src/Moneybird.Net/Models/TimeEntries/TimeEntryFilterOptions.cs
@@ -0,0 +1,26 @@
+using System;
+using System.Collections.Generic;
+using Moneybird.Net.Endpoints.Abstractions.Options;
+using Moneybird.Net.Entities.TimeEntries;
+
+namespace Moneybird.Net.Models.TimeEntries
+{
+ public class TimeEntryFilterOptions : IMoneybirdFilterOptions
+ {
+ public IReadOnlyCollection State { get; set; }
+
+ public string Period { get; set; }
+
+ public string ContactId { get; set; }
+
+ public bool? IncludeNilContacts { get; set; }
+
+ public bool? IncludeActive { get; set; }
+
+ public string ProjectId { get; set; }
+
+ public string UserId { get; set; }
+
+ public DateTime Day { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/Moneybird.Net/Models/TimeEntries/TimeEntryUpdate.cs b/src/Moneybird.Net/Models/TimeEntries/TimeEntryUpdate.cs
new file mode 100644
index 0000000..f80ace6
--- /dev/null
+++ b/src/Moneybird.Net/Models/TimeEntries/TimeEntryUpdate.cs
@@ -0,0 +1,29 @@
+using System;
+using System.Text.Json.Serialization;
+
+namespace Moneybird.Net.Models.TimeEntries
+{
+ public class TimeEntryUpdate
+ {
+ [JsonPropertyName("started_at")]
+ public DateTime StartedAt { get; set; }
+
+ [JsonPropertyName("ended_at")]
+ public DateTime EndedAt { get; set; }
+
+ [JsonPropertyName("paused_duration")]
+ public int PausedDuration { get; set; }
+
+ [JsonPropertyName("contact_id")]
+ public string ContactId { get; set; }
+
+ [JsonPropertyName("project_id")]
+ public string ProjectId { get; set; }
+
+ [JsonPropertyName("description")]
+ public string Description { get; set; }
+
+ [JsonPropertyName("billable")]
+ public bool Billable { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/Moneybird.Net/Models/TimeEntries/TimeEntryUpdateOptions.cs b/src/Moneybird.Net/Models/TimeEntries/TimeEntryUpdateOptions.cs
new file mode 100644
index 0000000..10bc591
--- /dev/null
+++ b/src/Moneybird.Net/Models/TimeEntries/TimeEntryUpdateOptions.cs
@@ -0,0 +1,11 @@
+using System.Text.Json.Serialization;
+using Moneybird.Net.Endpoints.Abstractions.Options;
+
+namespace Moneybird.Net.Models.TimeEntries
+{
+ public class TimeEntryUpdateOptions : IMoneybirdUpdateOptions
+ {
+ [JsonPropertyName("time_entry")]
+ public TimeEntryUpdate TimeEntry { get; set; }
+ }
+}
diff --git a/src/Moneybird.Net/Endpoints/Webhooks/Models/WebhookCreateOptions.cs b/src/Moneybird.Net/Models/Webhooks/WebhookCreateOptions.cs
similarity index 89%
rename from src/Moneybird.Net/Endpoints/Webhooks/Models/WebhookCreateOptions.cs
rename to src/Moneybird.Net/Models/Webhooks/WebhookCreateOptions.cs
index d2e83c6..ab52379 100644
--- a/src/Moneybird.Net/Endpoints/Webhooks/Models/WebhookCreateOptions.cs
+++ b/src/Moneybird.Net/Models/Webhooks/WebhookCreateOptions.cs
@@ -3,7 +3,7 @@
using Moneybird.Net.Endpoints.Abstractions.Options;
using Moneybird.Net.Entities.Webhooks;
-namespace Moneybird.Net.Endpoints.Webhooks.Models
+namespace Moneybird.Net.Models.Webhooks
{
public class WebhookCreateOptions : IMoneybirdCreateOptions
{
diff --git a/src/Moneybird.Net/MoneybirdClient.cs b/src/Moneybird.Net/MoneybirdClient.cs
index 5e5ff24..280bd2f 100644
--- a/src/Moneybird.Net/MoneybirdClient.cs
+++ b/src/Moneybird.Net/MoneybirdClient.cs
@@ -1,24 +1,8 @@
using System;
using System.Net.Http;
using Moneybird.Net.Abstractions;
+using Moneybird.Net.Endpoints;
using Moneybird.Net.Endpoints.Abstractions;
-using Moneybird.Net.Endpoints.Administrations;
-using Moneybird.Net.Endpoints.Contacts;
-using Moneybird.Net.Endpoints.CustomFields;
-using Moneybird.Net.Endpoints.DocumentStyles;
-using Moneybird.Net.Endpoints.ExternalSalesInvoices;
-using Moneybird.Net.Endpoints.FinancialAccounts;
-using Moneybird.Net.Endpoints.FinancialStatements;
-using Moneybird.Net.Endpoints.LegderAccounts;
-using Moneybird.Net.Endpoints.Payments;
-using Moneybird.Net.Endpoints.Products;
-using Moneybird.Net.Endpoints.Projects;
-using Moneybird.Net.Endpoints.SalesInvoices;
-using Moneybird.Net.Endpoints.TaxRates;
-using Moneybird.Net.Endpoints.Users;
-using Moneybird.Net.Endpoints.Verifications;
-using Moneybird.Net.Endpoints.Webhooks;
-using Moneybird.Net.Endpoints.Workflows;
using Moneybird.Net.Http;
namespace Moneybird.Net
@@ -44,6 +28,7 @@ public class MoneybirdClient : IMoneybirdClient
public IProjectEndpoint Project { get; }
public ISalesInvoiceEndpoint SalesInvoice { get; }
public ITaxRateEndpoint TaxRate { get; }
+ public ITimeEntryEndpoint TimeEntry { get; }
public IUserEndpoint User { get; }
public IVerificationEndpoint Verification { get; }
public IWebhookEndpoint Webhook { get; }
@@ -88,6 +73,7 @@ public MoneybirdClient(MoneybirdConfig config, HttpClient client = null)
Project = new ProjectEndpoint(Config, _requester);
SalesInvoice = new SalesInvoiceEndpoint(Config, _requester);
TaxRate = new TaxRateEndpoint(Config, _requester);
+ TimeEntry = new TimeEntryEndpoint(Config, _requester);
User = new UserEndpoint(Config, _requester);
Verification = new VerificationEndpoint(Config, _requester);
Webhook = new WebhookEndpoint(Config, _requester);
diff --git a/tests/Moneybird.Net.Tests/Endpoints/Administrations/AdministrationEndpointTests.cs b/tests/Moneybird.Net.Tests/Endpoints/AdministrationEndpointTests.cs
similarity index 95%
rename from tests/Moneybird.Net.Tests/Endpoints/Administrations/AdministrationEndpointTests.cs
rename to tests/Moneybird.Net.Tests/Endpoints/AdministrationEndpointTests.cs
index b924957..8836d67 100644
--- a/tests/Moneybird.Net.Tests/Endpoints/Administrations/AdministrationEndpointTests.cs
+++ b/tests/Moneybird.Net.Tests/Endpoints/AdministrationEndpointTests.cs
@@ -3,14 +3,14 @@
using System.Linq;
using System.Text.Json;
using FluentAssertions;
+using Moneybird.Net.Endpoints;
using Moneybird.Net.Endpoints.Abstractions;
-using Moneybird.Net.Endpoints.Administrations;
using Moneybird.Net.Entities.Administrations;
using Moneybird.Net.Http;
using Moq;
using Xunit;
-namespace Moneybird.Net.Tests.Endpoints.Administrations
+namespace Moneybird.Net.Tests.Endpoints
{
public class AdministrationEndpointTests : CommonTestBase
{
diff --git a/tests/Moneybird.Net.Tests/Endpoints/Contacts/ContactEndpointTests.cs b/tests/Moneybird.Net.Tests/Endpoints/ContactEndpointTests.cs
similarity index 98%
rename from tests/Moneybird.Net.Tests/Endpoints/Contacts/ContactEndpointTests.cs
rename to tests/Moneybird.Net.Tests/Endpoints/ContactEndpointTests.cs
index 2c91c9e..b47215f 100644
--- a/tests/Moneybird.Net.Tests/Endpoints/Contacts/ContactEndpointTests.cs
+++ b/tests/Moneybird.Net.Tests/Endpoints/ContactEndpointTests.cs
@@ -3,16 +3,18 @@
using System.Linq;
using System.Text.Json;
using FluentAssertions;
+using Moneybird.Net.Endpoints;
using Moneybird.Net.Endpoints.Abstractions;
-using Moneybird.Net.Endpoints.Contacts;
-using Moneybird.Net.Endpoints.Contacts.Models;
using Moneybird.Net.Entities.Contacts;
+using Moneybird.Net.Entities.Notes;
using Moneybird.Net.Http;
using Moneybird.Net.Misc;
+using Moneybird.Net.Models.Contacts;
+using Moneybird.Net.Models.Notes;
using Moq;
using Xunit;
-namespace Moneybird.Net.Tests.Endpoints.Contacts
+namespace Moneybird.Net.Tests.Endpoints
{
public class ContactEndpointTests : ContactTestBase
{
@@ -355,9 +357,9 @@ public async void DeleteContactByIdAsync_ByAccessToken_Returns_True()
public async void CreateContactNoteAsync_ByAccessToken_Returns_NewContactNote()
{
var contactNoteJson = await File.ReadAllTextAsync(NewContactNoteResponsePath);
- var contactNoteCreateOptions = new ContactNoteCreateOptions
+ var contactNoteCreateOptions = new NoteCreateOptions
{
- Note = new ContactNoteCreateItem
+ Note = new NoteCreateItem
{
Note = "Text of the note",
Todo = true,
@@ -371,7 +373,7 @@ public async void CreateContactNoteAsync_ByAccessToken_Returns_NewContactNote()
It.IsAny(), It.Is(s => s.Equals(serializedContactNoteCreateOptions)), It.IsAny>()))
.ReturnsAsync(contactNoteJson);
- var contactNote = JsonSerializer.Deserialize(contactNoteJson, _config.SerializerOptions);
+ var contactNote = JsonSerializer.Deserialize(contactNoteJson, _config.SerializerOptions);
Assert.NotNull(contactNote);
var actualContactNote = await _contactEndpoint.CreateContactNoteAsync(AdministrationId, ContactId, contactNoteCreateOptions, AccessToken);
diff --git a/tests/Moneybird.Net.Tests/Endpoints/Contacts/ContactTestBase.cs b/tests/Moneybird.Net.Tests/Endpoints/ContactTestBase.cs
similarity index 86%
rename from tests/Moneybird.Net.Tests/Endpoints/Contacts/ContactTestBase.cs
rename to tests/Moneybird.Net.Tests/Endpoints/ContactTestBase.cs
index f4b5292..dab479f 100644
--- a/tests/Moneybird.Net.Tests/Endpoints/Contacts/ContactTestBase.cs
+++ b/tests/Moneybird.Net.Tests/Endpoints/ContactTestBase.cs
@@ -1,4 +1,4 @@
-namespace Moneybird.Net.Tests.Endpoints.Contacts
+namespace Moneybird.Net.Tests.Endpoints
{
public class ContactTestBase : CommonTestBase
{
diff --git a/tests/Moneybird.Net.Tests/Endpoints/CustomFields/CustomFieldEndpointTests.cs b/tests/Moneybird.Net.Tests/Endpoints/CustomFieldEndpointTests.cs
similarity index 95%
rename from tests/Moneybird.Net.Tests/Endpoints/CustomFields/CustomFieldEndpointTests.cs
rename to tests/Moneybird.Net.Tests/Endpoints/CustomFieldEndpointTests.cs
index 87230ff..0e0176c 100644
--- a/tests/Moneybird.Net.Tests/Endpoints/CustomFields/CustomFieldEndpointTests.cs
+++ b/tests/Moneybird.Net.Tests/Endpoints/CustomFieldEndpointTests.cs
@@ -3,14 +3,14 @@
using System.Linq;
using System.Text.Json;
using FluentAssertions;
+using Moneybird.Net.Endpoints;
using Moneybird.Net.Endpoints.Abstractions;
-using Moneybird.Net.Endpoints.CustomFields;
using Moneybird.Net.Entities.CustomFields;
using Moneybird.Net.Http;
using Moq;
using Xunit;
-namespace Moneybird.Net.Tests.Endpoints.CustomFields
+namespace Moneybird.Net.Tests.Endpoints
{
public class CustomFieldEndpointTests : CommonTestBase
{
diff --git a/tests/Moneybird.Net.Tests/Endpoints/DocumentStyles/DocumentStyleEndpointTests.cs b/tests/Moneybird.Net.Tests/Endpoints/DocumentStyleEndpointTests.cs
similarity index 95%
rename from tests/Moneybird.Net.Tests/Endpoints/DocumentStyles/DocumentStyleEndpointTests.cs
rename to tests/Moneybird.Net.Tests/Endpoints/DocumentStyleEndpointTests.cs
index 5eb40c2..63f0689 100644
--- a/tests/Moneybird.Net.Tests/Endpoints/DocumentStyles/DocumentStyleEndpointTests.cs
+++ b/tests/Moneybird.Net.Tests/Endpoints/DocumentStyleEndpointTests.cs
@@ -3,14 +3,14 @@
using System.Linq;
using System.Text.Json;
using FluentAssertions;
+using Moneybird.Net.Endpoints;
using Moneybird.Net.Endpoints.Abstractions;
-using Moneybird.Net.Endpoints.DocumentStyles;
using Moneybird.Net.Entities.DocumentStyles;
using Moneybird.Net.Http;
using Moq;
using Xunit;
-namespace Moneybird.Net.Tests.Endpoints.DocumentStyles
+namespace Moneybird.Net.Tests.Endpoints
{
public class DocumentStyleEndpointTests : CommonTestBase
{
diff --git a/tests/Moneybird.Net.Tests/Endpoints/ExternalSalesInvoices/ExternalSalesInvoiceEndpointTests.cs b/tests/Moneybird.Net.Tests/Endpoints/ExternalSalesInvoiceEndpointTests.cs
similarity index 96%
rename from tests/Moneybird.Net.Tests/Endpoints/ExternalSalesInvoices/ExternalSalesInvoiceEndpointTests.cs
rename to tests/Moneybird.Net.Tests/Endpoints/ExternalSalesInvoiceEndpointTests.cs
index d81450a..780ddbd 100644
--- a/tests/Moneybird.Net.Tests/Endpoints/ExternalSalesInvoices/ExternalSalesInvoiceEndpointTests.cs
+++ b/tests/Moneybird.Net.Tests/Endpoints/ExternalSalesInvoiceEndpointTests.cs
@@ -4,15 +4,14 @@
using System.Linq;
using System.Text.Json;
using FluentAssertions;
-using Moneybird.Net.Endpoints.ExternalSalesInvoices;
-using Moneybird.Net.Endpoints.ExternalSalesInvoices.Models;
+using Moneybird.Net.Endpoints;
using Moneybird.Net.Entities.ExternalSalesInvoices;
-using Moneybird.Net.Entities.SalesInvoices;
using Moneybird.Net.Http;
+using Moneybird.Net.Models.ExternalSalesInvoices;
using Moq;
using Xunit;
-namespace Moneybird.Net.Tests.Endpoints.ExternalSalesInvoices;
+namespace Moneybird.Net.Tests.Endpoints;
public class ExternalSalesInvoiceEndpointTests : ExternalSalesInvoicesTestBase
{
@@ -70,7 +69,7 @@ public async void GetExternalSalesInvoicesAsync_UsingFilterOptions_ByAccessToken
var filterOptions = new ExternalSalesInvoiceFilterOptions
{
- ContactId = 10,
+ ContactId = "369764545284015762",
State = ExternalSalesInvoiceState.Open,
Period = "ThisYear"
};
@@ -137,9 +136,9 @@ public async void CreateExternalSalesInvoiceAsync_ByAccessToken_Returns_NewExter
Date = DateTime.UtcNow,
Source = "webshop",
DueDate = DateTime.UtcNow.AddDays(14),
- SourceUrl = "https://www.example.com/checkout/1234",
+ SourceUrl = "https://www.example.com/checkout/1234"
},
- UserAgent = "Moneybird .NET Client",
+ UserAgent = "Moneybird .NET Client"
};
var createResponse = await File.ReadAllTextAsync(PostExternalSalesInvoiceResponsePath);
@@ -190,7 +189,7 @@ public async void UpdateExternalSalesInvoiceAsync_ByAccessToken_Returns_UpdatedE
}
}
},
- UserAgent = "Moneybird .NET Client",
+ UserAgent = "Moneybird .NET Client"
};
var serializedExternalSalesInvoiceUpdateOptions = JsonSerializer.Serialize(externalSalesInvoiceUpdateOptions, _config.SerializerOptions);
diff --git a/tests/Moneybird.Net.Tests/Endpoints/ExternalSalesInvoices/ExternalSalesInvoicesTestBase.cs b/tests/Moneybird.Net.Tests/Endpoints/ExternalSalesInvoicesTestBase.cs
similarity index 68%
rename from tests/Moneybird.Net.Tests/Endpoints/ExternalSalesInvoices/ExternalSalesInvoicesTestBase.cs
rename to tests/Moneybird.Net.Tests/Endpoints/ExternalSalesInvoicesTestBase.cs
index ae6b541..c10107c 100644
--- a/tests/Moneybird.Net.Tests/Endpoints/ExternalSalesInvoices/ExternalSalesInvoicesTestBase.cs
+++ b/tests/Moneybird.Net.Tests/Endpoints/ExternalSalesInvoicesTestBase.cs
@@ -1,4 +1,4 @@
-namespace Moneybird.Net.Tests.Endpoints.ExternalSalesInvoices;
+namespace Moneybird.Net.Tests.Endpoints;
public class ExternalSalesInvoicesTestBase : CommonTestBase
{
diff --git a/tests/Moneybird.Net.Tests/Endpoints/FinancialAccounts/FinancialAccountEndpointTests.cs b/tests/Moneybird.Net.Tests/Endpoints/FinancialAccountEndpointTests.cs
similarity index 95%
rename from tests/Moneybird.Net.Tests/Endpoints/FinancialAccounts/FinancialAccountEndpointTests.cs
rename to tests/Moneybird.Net.Tests/Endpoints/FinancialAccountEndpointTests.cs
index 6ee1b85..73262c4 100644
--- a/tests/Moneybird.Net.Tests/Endpoints/FinancialAccounts/FinancialAccountEndpointTests.cs
+++ b/tests/Moneybird.Net.Tests/Endpoints/FinancialAccountEndpointTests.cs
@@ -3,13 +3,13 @@
using System.Linq;
using System.Text.Json;
using FluentAssertions;
-using Moneybird.Net.Endpoints.FinancialAccounts;
+using Moneybird.Net.Endpoints;
using Moneybird.Net.Entities.FinancialAccounts;
using Moneybird.Net.Http;
using Moq;
using Xunit;
-namespace Moneybird.Net.Tests.Endpoints.FinancialAccounts;
+namespace Moneybird.Net.Tests.Endpoints;
public class FinancialAccountEndpointTests : CommonTestBase
{
diff --git a/tests/Moneybird.Net.Tests/Endpoints/FinancialStatements/FinancialStatementEndpointTests.cs b/tests/Moneybird.Net.Tests/Endpoints/FinancialStatementEndpointTests.cs
similarity index 97%
rename from tests/Moneybird.Net.Tests/Endpoints/FinancialStatements/FinancialStatementEndpointTests.cs
rename to tests/Moneybird.Net.Tests/Endpoints/FinancialStatementEndpointTests.cs
index 7a1dad2..feb2756 100644
--- a/tests/Moneybird.Net.Tests/Endpoints/FinancialStatements/FinancialStatementEndpointTests.cs
+++ b/tests/Moneybird.Net.Tests/Endpoints/FinancialStatementEndpointTests.cs
@@ -3,15 +3,15 @@
using System.IO;
using System.Text.Json;
using FluentAssertions;
-using Moneybird.Net.Endpoints.FinancialStatements;
-using Moneybird.Net.Endpoints.FinancialStatements.Models;
+using Moneybird.Net.Endpoints;
using Moneybird.Net.Entities.FinancialMutations;
using Moneybird.Net.Entities.FinancialStatements;
using Moneybird.Net.Http;
+using Moneybird.Net.Models.FinancialStatements;
using Moq;
using Xunit;
-namespace Moneybird.Net.Tests.Endpoints.FinancialStatements;
+namespace Moneybird.Net.Tests.Endpoints;
public class FinancialStatementEndpointTests : FinancialStatementTestBase
{
diff --git a/tests/Moneybird.Net.Tests/Endpoints/FinancialStatements/FinancialStatementTestBase.cs b/tests/Moneybird.Net.Tests/Endpoints/FinancialStatementTestBase.cs
similarity index 68%
rename from tests/Moneybird.Net.Tests/Endpoints/FinancialStatements/FinancialStatementTestBase.cs
rename to tests/Moneybird.Net.Tests/Endpoints/FinancialStatementTestBase.cs
index a97b848..2e69d1a 100644
--- a/tests/Moneybird.Net.Tests/Endpoints/FinancialStatements/FinancialStatementTestBase.cs
+++ b/tests/Moneybird.Net.Tests/Endpoints/FinancialStatementTestBase.cs
@@ -1,4 +1,4 @@
-namespace Moneybird.Net.Tests.Endpoints.FinancialStatements;
+namespace Moneybird.Net.Tests.Endpoints;
public class FinancialStatementTestBase : CommonTestBase
{
diff --git a/tests/Moneybird.Net.Tests/Endpoints/LedgerAccounts/LedgerAccountEndpointTests.cs b/tests/Moneybird.Net.Tests/Endpoints/LedgerAccountEndpointTests.cs
similarity index 97%
rename from tests/Moneybird.Net.Tests/Endpoints/LedgerAccounts/LedgerAccountEndpointTests.cs
rename to tests/Moneybird.Net.Tests/Endpoints/LedgerAccountEndpointTests.cs
index 2a0e968..13a8b2d 100644
--- a/tests/Moneybird.Net.Tests/Endpoints/LedgerAccounts/LedgerAccountEndpointTests.cs
+++ b/tests/Moneybird.Net.Tests/Endpoints/LedgerAccountEndpointTests.cs
@@ -3,15 +3,15 @@
using System.Linq;
using System.Text.Json;
using FluentAssertions;
-using Moneybird.Net.Endpoints.LegderAccounts;
-using Moneybird.Net.Endpoints.LegderAccounts.Models;
+using Moneybird.Net.Endpoints;
using Moneybird.Net.Entities.LedgerAccounts;
using Moneybird.Net.Http;
using Moneybird.Net.Misc;
+using Moneybird.Net.Models.LedgerAccounts;
using Moq;
using Xunit;
-namespace Moneybird.Net.Tests.Endpoints.LedgerAccounts;
+namespace Moneybird.Net.Tests.Endpoints;
public class LedgerAccountEndpointTests : LedgerAccountTestBase
{
diff --git a/tests/Moneybird.Net.Tests/Endpoints/LedgerAccounts/LedgerAccountTestBase.cs b/tests/Moneybird.Net.Tests/Endpoints/LedgerAccountTestBase.cs
similarity index 69%
rename from tests/Moneybird.Net.Tests/Endpoints/LedgerAccounts/LedgerAccountTestBase.cs
rename to tests/Moneybird.Net.Tests/Endpoints/LedgerAccountTestBase.cs
index a7dc639..273d7de 100644
--- a/tests/Moneybird.Net.Tests/Endpoints/LedgerAccounts/LedgerAccountTestBase.cs
+++ b/tests/Moneybird.Net.Tests/Endpoints/LedgerAccountTestBase.cs
@@ -1,4 +1,4 @@
-namespace Moneybird.Net.Tests.Endpoints.LedgerAccounts;
+namespace Moneybird.Net.Tests.Endpoints;
public class LedgerAccountTestBase : CommonTestBase
{
diff --git a/tests/Moneybird.Net.Tests/Endpoints/Payments/PaymentEndpointTests.cs b/tests/Moneybird.Net.Tests/Endpoints/PaymentEndpointTests.cs
similarity index 94%
rename from tests/Moneybird.Net.Tests/Endpoints/Payments/PaymentEndpointTests.cs
rename to tests/Moneybird.Net.Tests/Endpoints/PaymentEndpointTests.cs
index d4fb409..6a7550d 100644
--- a/tests/Moneybird.Net.Tests/Endpoints/Payments/PaymentEndpointTests.cs
+++ b/tests/Moneybird.Net.Tests/Endpoints/PaymentEndpointTests.cs
@@ -3,13 +3,13 @@
using System.Text.Json;
using System.Threading.Tasks;
using FluentAssertions;
-using Moneybird.Net.Endpoints.Payments;
+using Moneybird.Net.Endpoints;
using Moneybird.Net.Entities.Payments;
using Moneybird.Net.Http;
using Moq;
using Xunit;
-namespace Moneybird.Net.Tests.Endpoints.Payments;
+namespace Moneybird.Net.Tests.Endpoints;
public class PaymentEndpointTests : PaymentTestBase
{
diff --git a/tests/Moneybird.Net.Tests/Endpoints/Payments/PaymentTestBase.cs b/tests/Moneybird.Net.Tests/Endpoints/PaymentTestBase.cs
similarity index 69%
rename from tests/Moneybird.Net.Tests/Endpoints/Payments/PaymentTestBase.cs
rename to tests/Moneybird.Net.Tests/Endpoints/PaymentTestBase.cs
index 70ad22c..ed512d4 100644
--- a/tests/Moneybird.Net.Tests/Endpoints/Payments/PaymentTestBase.cs
+++ b/tests/Moneybird.Net.Tests/Endpoints/PaymentTestBase.cs
@@ -1,4 +1,4 @@
-namespace Moneybird.Net.Tests.Endpoints.Payments;
+namespace Moneybird.Net.Tests.Endpoints;
public class PaymentTestBase : CommonTestBase
{
diff --git a/tests/Moneybird.Net.Tests/Endpoints/Products/ProductEndpointTests.cs b/tests/Moneybird.Net.Tests/Endpoints/ProductEndpointTests.cs
similarity index 98%
rename from tests/Moneybird.Net.Tests/Endpoints/Products/ProductEndpointTests.cs
rename to tests/Moneybird.Net.Tests/Endpoints/ProductEndpointTests.cs
index 772bd40..c772c2b 100644
--- a/tests/Moneybird.Net.Tests/Endpoints/Products/ProductEndpointTests.cs
+++ b/tests/Moneybird.Net.Tests/Endpoints/ProductEndpointTests.cs
@@ -3,15 +3,15 @@
using System.Linq;
using System.Text.Json;
using FluentAssertions;
-using Moneybird.Net.Endpoints.Products;
-using Moneybird.Net.Endpoints.Products.Models;
+using Moneybird.Net.Endpoints;
using Moneybird.Net.Entities.Products;
using Moneybird.Net.Http;
using Moneybird.Net.Misc;
+using Moneybird.Net.Models.Products;
using Moq;
using Xunit;
-namespace Moneybird.Net.Tests.Endpoints.Products;
+namespace Moneybird.Net.Tests.Endpoints;
public class ProductEndpointTests : ProductTestBase
{
diff --git a/tests/Moneybird.Net.Tests/Endpoints/Products/ProductTestBase.cs b/tests/Moneybird.Net.Tests/Endpoints/ProductTestBase.cs
similarity index 77%
rename from tests/Moneybird.Net.Tests/Endpoints/Products/ProductTestBase.cs
rename to tests/Moneybird.Net.Tests/Endpoints/ProductTestBase.cs
index bce1203..acd7855 100644
--- a/tests/Moneybird.Net.Tests/Endpoints/Products/ProductTestBase.cs
+++ b/tests/Moneybird.Net.Tests/Endpoints/ProductTestBase.cs
@@ -1,4 +1,4 @@
-namespace Moneybird.Net.Tests.Endpoints.Products;
+namespace Moneybird.Net.Tests.Endpoints;
public class ProductTestBase : CommonTestBase
{
diff --git a/tests/Moneybird.Net.Tests/Endpoints/Projects/ProjectEndpointTests.cs b/tests/Moneybird.Net.Tests/Endpoints/ProjectEndpointTests.cs
similarity index 76%
rename from tests/Moneybird.Net.Tests/Endpoints/Projects/ProjectEndpointTests.cs
rename to tests/Moneybird.Net.Tests/Endpoints/ProjectEndpointTests.cs
index 6ebff68..1c9ec51 100644
--- a/tests/Moneybird.Net.Tests/Endpoints/Projects/ProjectEndpointTests.cs
+++ b/tests/Moneybird.Net.Tests/Endpoints/ProjectEndpointTests.cs
@@ -3,14 +3,14 @@
using System.Linq;
using System.Text.Json;
using FluentAssertions;
-using Moneybird.Net.Endpoints.Projects;
-using Moneybird.Net.Endpoints.Projects.Models;
+using Moneybird.Net.Endpoints;
using Moneybird.Net.Entities.Projects;
using Moneybird.Net.Http;
+using Moneybird.Net.Models.Projects;
using Moq;
using Xunit;
-namespace Moneybird.Net.Tests.Endpoints.Projects;
+namespace Moneybird.Net.Tests.Endpoints;
public class ProjectEndpointTests : ProjectTestBase
{
@@ -38,23 +38,54 @@ public async void GetProjectsAsync_ByAccessToken_Returns_Projects()
_requester.Setup(moq => moq.CreateGetRequestAsync(It.IsAny(), It.IsAny(),
It.IsAny(), It.IsAny>())).ReturnsAsync(projectListJson);
- var expectedProjectList = JsonSerializer.Deserialize>(projectListJson, _config.SerializerOptions);
- Assert.NotNull(expectedProjectList);
+ var projects = JsonSerializer.Deserialize>(projectListJson, _config.SerializerOptions);
+ Assert.NotNull(projects);
var actualProjects = await _projectEndpoint.GetAsync(AdministrationId, AccessToken);
Assert.NotNull(actualProjects);
var actualProjectList = actualProjects.ToList();
- Assert.Equal(expectedProjectList.Count, actualProjectList.Count);
+ Assert.Equal(projects.Count, actualProjectList.Count);
foreach (var actualProject in actualProjectList)
{
- var expectedProject = expectedProjectList.FirstOrDefault(w => w.Id == actualProject.Id);
+ var expectedProject = projects.FirstOrDefault(w => w.Id == actualProject.Id);
Assert.NotNull(expectedProject);
actualProject.Should().BeEquivalentTo(expectedProject);
}
}
+ [Fact]
+ public async void GetProjectsAsync_UsingFilterOptions_ByAccessToken_Returns_Projects()
+ {
+ var projectListJson = await File.ReadAllTextAsync(GetProjectsResponsePath);
+
+ _requester.Setup(moq => moq.CreateGetRequestAsync(It.IsAny(), It.IsAny(),
+ It.IsAny(), It.IsAny>())).ReturnsAsync(projectListJson);
+
+ var projects = JsonSerializer.Deserialize>(projectListJson, _config.SerializerOptions);
+ Assert.NotNull(projects);
+
+ var filterOptions = new ProjectFilterOptions
+ {
+ State = ProjectState.All
+ };
+
+ var actualProjects = await _projectEndpoint.GetAsync(AdministrationId, AccessToken, filterOptions);
+ Assert.NotNull(actualProjects);
+
+ var actualProjectList = actualProjects.ToList();
+ Assert.Equal(projects.Count, actualProjectList.Count);
+
+ foreach (var actualProject in actualProjectList)
+ {
+ var project = projects.FirstOrDefault(w => w.Id == actualProject.Id);
+ Assert.NotNull(project);
+
+ project.Should().BeEquivalentTo(actualProject);
+ }
+ }
+
[Fact]
public async void GetProjectAsync_ByAccessToken_Returns_Single_Project()
{
diff --git a/tests/Moneybird.Net.Tests/Endpoints/Projects/ProjectTestBase.cs b/tests/Moneybird.Net.Tests/Endpoints/ProjectTestBase.cs
similarity index 69%
rename from tests/Moneybird.Net.Tests/Endpoints/Projects/ProjectTestBase.cs
rename to tests/Moneybird.Net.Tests/Endpoints/ProjectTestBase.cs
index 09a5b98..5c4c470 100644
--- a/tests/Moneybird.Net.Tests/Endpoints/Projects/ProjectTestBase.cs
+++ b/tests/Moneybird.Net.Tests/Endpoints/ProjectTestBase.cs
@@ -1,4 +1,4 @@
-namespace Moneybird.Net.Tests.Endpoints.Projects;
+namespace Moneybird.Net.Tests.Endpoints;
public class ProjectTestBase : CommonTestBase
{
diff --git a/tests/Moneybird.Net.Tests/Endpoints/SalesInvoices/SalesInvoiceEndpointTests.cs b/tests/Moneybird.Net.Tests/Endpoints/SalesInvoiceEndpointTests.cs
similarity index 97%
rename from tests/Moneybird.Net.Tests/Endpoints/SalesInvoices/SalesInvoiceEndpointTests.cs
rename to tests/Moneybird.Net.Tests/Endpoints/SalesInvoiceEndpointTests.cs
index c6615d9..6ecf0b1 100644
--- a/tests/Moneybird.Net.Tests/Endpoints/SalesInvoices/SalesInvoiceEndpointTests.cs
+++ b/tests/Moneybird.Net.Tests/Endpoints/SalesInvoiceEndpointTests.cs
@@ -4,14 +4,14 @@
using System.Linq;
using System.Text.Json;
using FluentAssertions;
-using Moneybird.Net.Endpoints.SalesInvoices;
-using Moneybird.Net.Endpoints.SalesInvoices.Models;
+using Moneybird.Net.Endpoints;
using Moneybird.Net.Entities.SalesInvoices;
using Moneybird.Net.Http;
+using Moneybird.Net.Models.SalesInvoices;
using Moq;
using Xunit;
-namespace Moneybird.Net.Tests.Endpoints.SalesInvoices;
+namespace Moneybird.Net.Tests.Endpoints;
public class SalesInvoiceEndpointTests : SalesInvoiceTestBase
{
@@ -69,12 +69,12 @@ public async void GetSalesInvoicesAsync_UsingFilterOptions_ByAccessToken_Returns
var filterOptions = new SalesInvoiceFilterOptions
{
- ContactId = 10,
+ ContactId = "369764595159532558",
State = SalesInvoiceState.Open,
Period = "ThisYear",
Reference = "30052",
- RecurringSalesInvoiceId = 1,
- WorkflowId = 9,
+ RecurringSalesInvoiceId = null,
+ WorkflowId = "369764439669343349",
CreatedAfter = DateTime.UtcNow,
UpdatedAfter = DateTime.UtcNow
};
diff --git a/tests/Moneybird.Net.Tests/Endpoints/SalesInvoices/SalesInvoiceTestBase.cs b/tests/Moneybird.Net.Tests/Endpoints/SalesInvoiceTestBase.cs
similarity index 68%
rename from tests/Moneybird.Net.Tests/Endpoints/SalesInvoices/SalesInvoiceTestBase.cs
rename to tests/Moneybird.Net.Tests/Endpoints/SalesInvoiceTestBase.cs
index c7967ec..10c3a9a 100644
--- a/tests/Moneybird.Net.Tests/Endpoints/SalesInvoices/SalesInvoiceTestBase.cs
+++ b/tests/Moneybird.Net.Tests/Endpoints/SalesInvoiceTestBase.cs
@@ -1,4 +1,4 @@
-namespace Moneybird.Net.Tests.Endpoints.SalesInvoices;
+namespace Moneybird.Net.Tests.Endpoints;
public class SalesInvoiceTestBase : CommonTestBase
{
diff --git a/tests/Moneybird.Net.Tests/Endpoints/TaxRates/TaxRateEndpointTests.cs b/tests/Moneybird.Net.Tests/Endpoints/TaxRateEndpointTests.cs
similarity index 95%
rename from tests/Moneybird.Net.Tests/Endpoints/TaxRates/TaxRateEndpointTests.cs
rename to tests/Moneybird.Net.Tests/Endpoints/TaxRateEndpointTests.cs
index f511b59..d3c2bac 100644
--- a/tests/Moneybird.Net.Tests/Endpoints/TaxRates/TaxRateEndpointTests.cs
+++ b/tests/Moneybird.Net.Tests/Endpoints/TaxRateEndpointTests.cs
@@ -3,14 +3,14 @@
using System.Linq;
using System.Text.Json;
using FluentAssertions;
-using Moneybird.Net.Endpoints.TaxRates;
-using Moneybird.Net.Endpoints.TaxRates.Models;
+using Moneybird.Net.Endpoints;
using Moneybird.Net.Entities.TaxRates;
using Moneybird.Net.Http;
+using Moneybird.Net.Models.TaxRates;
using Moq;
using Xunit;
-namespace Moneybird.Net.Tests.Endpoints.TaxRates;
+namespace Moneybird.Net.Tests.Endpoints;
public class TaxRateEndpointTests : CommonTestBase
{
diff --git a/tests/Moneybird.Net.Tests/Endpoints/TimeEntryEndpointTests.cs b/tests/Moneybird.Net.Tests/Endpoints/TimeEntryEndpointTests.cs
new file mode 100644
index 0000000..80a5448
--- /dev/null
+++ b/tests/Moneybird.Net.Tests/Endpoints/TimeEntryEndpointTests.cs
@@ -0,0 +1,234 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text.Json;
+using FluentAssertions;
+using Moneybird.Net.Endpoints;
+using Moneybird.Net.Entities.Notes;
+using Moneybird.Net.Entities.TimeEntries;
+using Moneybird.Net.Http;
+using Moneybird.Net.Models.Notes;
+using Moneybird.Net.Models.TimeEntries;
+using Moq;
+using Xunit;
+
+namespace Moneybird.Net.Tests.Endpoints;
+
+public class TimeEntryEndpointTests : TimeEntryTestBase
+{
+ private static Mock _requester;
+ private readonly MoneybirdConfig _config;
+ private readonly TimeEntryEndpoint _timeEntryEndpoint;
+
+ private const string GetTimeEntriesResponsePath = "./Responses/Endpoints/TimeEntries/getTimeEntries.json";
+ private const string GetTimeEntryResponsePath = "./Responses/Endpoints/TimeEntries/getTimeEntry.json";
+ private const string PostTimeEntryResponsePath = "./Responses/Endpoints/TimeEntries/postTimeEntry.json";
+ private const string PatchTimeEntryResponsePath = "./Responses/Endpoints/TimeEntries/patchTimeEntry.json";
+ private const string NewTimeEntryNoteResponsePath = "./Responses/Endpoints/TimeEntries/newTimeEntryNote.json";
+
+ public TimeEntryEndpointTests()
+ {
+ _requester = new Mock();
+ _config = new MoneybirdConfig();
+ _timeEntryEndpoint = new TimeEntryEndpoint(_config, _requester.Object);
+ }
+
+ [Fact]
+ public async void GetTimeEntriesAsync_ByAccessToken_Returns_TimeEntries()
+ {
+ var timeEntriesList = await File.ReadAllTextAsync(GetTimeEntriesResponsePath);
+
+ _requester.Setup(moq => moq.CreateGetRequestAsync(It.IsAny(), It.IsAny(),
+ It.IsAny(), It.IsAny>())).ReturnsAsync(timeEntriesList);
+
+ var timeEntries = JsonSerializer.Deserialize>(timeEntriesList, _config.SerializerOptions);
+ Assert.NotNull(timeEntries);
+
+ var actualTimeEntries = await _timeEntryEndpoint.GetAsync(AdministrationId, AccessToken);
+ Assert.NotNull(actualTimeEntries);
+
+ var actualTimeEntryList = actualTimeEntries.ToList();
+ Assert.Equal(timeEntries.Count, actualTimeEntryList.Count);
+
+ foreach (var actualTimeEntry in actualTimeEntryList)
+ {
+ var user = timeEntries.FirstOrDefault(w => w.Id == actualTimeEntry.Id);
+ Assert.NotNull(user);
+
+ user.Should().BeEquivalentTo(actualTimeEntry);
+ }
+ }
+
+ [Fact]
+ public async void GetTimeEntriesAsync_UsingFilterOptions_ByAccessToken_Returns_TimeEntries()
+ {
+ var timeEntryListJson = await File.ReadAllTextAsync(GetTimeEntriesResponsePath);
+
+ _requester.Setup(moq => moq.CreateGetRequestAsync(It.IsAny(), It.IsAny(),
+ It.IsAny(), It.IsAny>())).ReturnsAsync(timeEntryListJson);
+
+ var timeEntries = JsonSerializer.Deserialize>(timeEntryListJson, _config.SerializerOptions);
+ Assert.NotNull(timeEntries);
+
+ var filterOptions = new TimeEntryFilterOptions
+ {
+ State = new [] { TimeEntryState.All },
+ Period = "this_month",
+ ContactId = "381666401394414610",
+ IncludeNilContacts = true,
+ IncludeActive = false,
+ ProjectId = "386844401331200766",
+ UserId = "252969831744742910",
+ Day = DateTime.Parse("2023-11-10")
+ };
+
+ var actualTimeEntries = await _timeEntryEndpoint.GetAsync(AdministrationId, AccessToken, filterOptions);
+ Assert.NotNull(actualTimeEntries);
+
+ var actualTimeEntryList = actualTimeEntries.ToList();
+ Assert.Equal(timeEntries.Count, actualTimeEntryList.Count);
+
+ foreach (var actualTimeEntry in actualTimeEntryList)
+ {
+ var timeEntry = timeEntries.FirstOrDefault(w => w.Id == actualTimeEntry.Id);
+ Assert.NotNull(timeEntry);
+
+ timeEntry.Should().BeEquivalentTo(actualTimeEntry);
+ }
+ }
+
+ [Fact]
+ public async void GetTimeEntryAsync_ByAccessToken_Returns_Single_TimeEntry()
+ {
+ var timeEntryJson = await File.ReadAllTextAsync(GetTimeEntryResponsePath);
+
+ _requester.Setup(moq => moq.CreateGetRequestAsync(It.IsAny(), It.IsAny(),
+ It.IsAny(), It.IsAny>())).ReturnsAsync(timeEntryJson);
+
+ var expectedTimeEntry = JsonSerializer.Deserialize(timeEntryJson, _config.SerializerOptions);
+ Assert.NotNull(expectedTimeEntry);
+
+ var actualTimeEntry = await _timeEntryEndpoint.GetByIdAsync(AdministrationId, TimeEntryId, AccessToken);
+ Assert.NotNull(actualTimeEntry);
+
+ actualTimeEntry.Should().BeEquivalentTo(expectedTimeEntry);
+ }
+
+ [Fact]
+ public async void CreateTimeEntryAsync_ByAccessToken_Returns_NewTimeEntry()
+ {
+ var timeEntryJson = await File.ReadAllTextAsync(PostTimeEntryResponsePath);
+ var timeEntryCreateOptions = new TimeEntryCreateOptions
+ {
+ TimeEntry = new TimeEntryCreate
+ {
+ StartedAt = DateTime.Parse("2023-08-10 09:25:00"),
+ EndedAt = DateTime.Parse("2023-08-10 10:25:00"),
+ Description = "Test time entry",
+ ContactId = "395774014807606787",
+ ProjectId = "395774014821238277",
+ UserId = "1691659319295",
+ Billable = false,
+ DetailId = null,
+ PausedDuration = 0
+ }
+ };
+
+ var serializedTimeEntryCreateOptions = JsonSerializer.Serialize(timeEntryCreateOptions, _config.SerializerOptions);
+
+ _requester.Setup(moq => moq.CreatePostRequestAsync(It.IsAny(), It.IsAny(),
+ It.IsAny(), It.Is(s => s.Equals(serializedTimeEntryCreateOptions)), It.IsAny>()))
+ .ReturnsAsync(timeEntryJson);
+
+ var expectedTimeEntry = JsonSerializer.Deserialize(timeEntryJson, _config.SerializerOptions);
+ Assert.NotNull(expectedTimeEntry);
+
+ var actualTimeEntry = await _timeEntryEndpoint.CreateAsync(AdministrationId, timeEntryCreateOptions, AccessToken);
+ Assert.NotNull(actualTimeEntry);
+
+ actualTimeEntry.Should().BeEquivalentTo(expectedTimeEntry);
+ }
+
+ [Fact]
+ public async void UpdateTimeEntryAsync_ByAccessToken_Returns_UpdatedTimeEntry()
+ {
+ var timeEntryJson = await File.ReadAllTextAsync(PatchTimeEntryResponsePath);
+ var timeEntryUpdateOptions = new TimeEntryUpdateOptions
+ {
+ TimeEntry = new TimeEntryUpdate
+ {
+ StartedAt = DateTime.Parse("2023-08-10 09:25:00"),
+ EndedAt = DateTime.Parse("2023-08-10 10:25:00"),
+ Description = "Updated description",
+ ContactId = "395774015039342091",
+ ProjectId = "395774015051925005",
+ Billable = false,
+ PausedDuration = 0
+ }
+ };
+
+ var serializedTimeEntryOptions = JsonSerializer.Serialize(timeEntryUpdateOptions, _config.SerializerOptions);
+
+ _requester.Setup(moq => moq.CreatePatchRequestAsync(It.IsAny(), It.IsAny(),
+ It.IsAny(), It.Is(s => s.Equals(serializedTimeEntryOptions)), It.IsAny>()))
+ .ReturnsAsync(timeEntryJson);
+
+ var expectedTimeEntry = JsonSerializer.Deserialize(timeEntryJson, _config.SerializerOptions);
+ Assert.NotNull(expectedTimeEntry);
+
+ var actualTimeEntry = await _timeEntryEndpoint.UpdateByIdAsync(AdministrationId, TimeEntryId, timeEntryUpdateOptions, AccessToken);
+ Assert.NotNull(actualTimeEntry);
+
+ actualTimeEntry.Should().BeEquivalentTo(expectedTimeEntry);
+ }
+
+ [Fact]
+ public async void DeleteTimeEntryAsync_ByAccessToken_Returns_True()
+ {
+ _requester.Setup(moq => moq.CreateDeleteRequestAsync(It.IsAny(), It.IsAny(),
+ It.IsAny(), It.IsAny>())).ReturnsAsync(true);
+
+ var actualTimeEntry = await _timeEntryEndpoint.DeleteByIdAsync(AdministrationId, TimeEntryId, AccessToken);
+ Assert.True(actualTimeEntry);
+ }
+
+ [Fact]
+ public async void CreateTimeEntryNoteAsync_ByAccessToken_Returns_NewNote()
+ {
+ var timeEntryNoteJson = await File.ReadAllTextAsync(NewTimeEntryNoteResponsePath);
+ var noteCreateOptions = new NoteCreateOptions
+ {
+ Note = new NoteCreateItem
+ {
+ Note = "Text of the note",
+ Todo = true,
+ AssigneeId = "340087760888006110"
+ }
+ };
+
+ var serializedNoteCreateOptions = JsonSerializer.Serialize(noteCreateOptions, _config.SerializerOptions);
+
+ _requester.Setup(moq => moq.CreatePostRequestAsync(It.IsAny(), It.IsAny(),
+ It.IsAny(), It.Is(s => s.Equals(serializedNoteCreateOptions)), It.IsAny>()))
+ .ReturnsAsync(timeEntryNoteJson);
+
+ var timeEntryNote = JsonSerializer.Deserialize(timeEntryNoteJson, _config.SerializerOptions);
+ Assert.NotNull(timeEntryNote);
+
+ var actualTimeEntryNote = await _timeEntryEndpoint.CreateTimeEntryNoteAsync(AdministrationId, TimeEntryId, noteCreateOptions, AccessToken);
+ Assert.NotNull(actualTimeEntryNote);
+
+ timeEntryNote.Should().BeEquivalentTo(actualTimeEntryNote);
+ }
+
+ [Fact]
+ public async void DeleteTimeEntryNoteByIdAsync_ByAccessToken_Returns_True()
+ {
+ _requester.Setup(moq => moq.CreateDeleteRequestAsync(It.IsAny(), It.IsAny(),
+ It.IsAny(), It.IsAny>())).ReturnsAsync(true);
+
+ var actualTimeEntryNote = await _timeEntryEndpoint.DeleteTimeEntryNoteByIdAsync(AdministrationId, TimeEntryId, NoteId, AccessToken);
+ Assert.True(actualTimeEntryNote);
+ }
+}
\ No newline at end of file
diff --git a/tests/Moneybird.Net.Tests/Endpoints/TimeEntryTestBase.cs b/tests/Moneybird.Net.Tests/Endpoints/TimeEntryTestBase.cs
new file mode 100644
index 0000000..0f4ed7e
--- /dev/null
+++ b/tests/Moneybird.Net.Tests/Endpoints/TimeEntryTestBase.cs
@@ -0,0 +1,7 @@
+namespace Moneybird.Net.Tests.Endpoints;
+
+public class TimeEntryTestBase : CommonTestBase
+{
+ protected static string TimeEntryId = "447521404512760211";
+ protected static string NoteId = "405411500095702179";
+}
\ No newline at end of file
diff --git a/tests/Moneybird.Net.Tests/Endpoints/Users/UserEndpointTests.cs b/tests/Moneybird.Net.Tests/Endpoints/UserEndpointTests.cs
similarity index 95%
rename from tests/Moneybird.Net.Tests/Endpoints/Users/UserEndpointTests.cs
rename to tests/Moneybird.Net.Tests/Endpoints/UserEndpointTests.cs
index 39d4542..7c45268 100644
--- a/tests/Moneybird.Net.Tests/Endpoints/Users/UserEndpointTests.cs
+++ b/tests/Moneybird.Net.Tests/Endpoints/UserEndpointTests.cs
@@ -3,13 +3,13 @@
using System.Linq;
using System.Text.Json;
using FluentAssertions;
-using Moneybird.Net.Endpoints.Users;
+using Moneybird.Net.Endpoints;
using Moneybird.Net.Entities.Users;
using Moneybird.Net.Http;
using Moq;
using Xunit;
-namespace Moneybird.Net.Tests.Endpoints.Users;
+namespace Moneybird.Net.Tests.Endpoints;
public class UserEndpointTests : CommonTestBase
{
diff --git a/tests/Moneybird.Net.Tests/Endpoints/Verifications/VerificationEndpointTests.cs b/tests/Moneybird.Net.Tests/Endpoints/VerificationEndpointTests.cs
similarity index 98%
rename from tests/Moneybird.Net.Tests/Endpoints/Verifications/VerificationEndpointTests.cs
rename to tests/Moneybird.Net.Tests/Endpoints/VerificationEndpointTests.cs
index 66e7238..83550bc 100644
--- a/tests/Moneybird.Net.Tests/Endpoints/Verifications/VerificationEndpointTests.cs
+++ b/tests/Moneybird.Net.Tests/Endpoints/VerificationEndpointTests.cs
@@ -3,13 +3,13 @@
using System.Text.Json;
using System.Threading.Tasks;
using FluentAssertions;
-using Moneybird.Net.Endpoints.Verifications;
+using Moneybird.Net.Endpoints;
using Moneybird.Net.Entities.Verifications;
using Moneybird.Net.Http;
using Moq;
using Xunit;
-namespace Moneybird.Net.Tests.Endpoints.Verifications;
+namespace Moneybird.Net.Tests.Endpoints;
public class VerificationEndpointTests : CommonTestBase
{
diff --git a/tests/Moneybird.Net.Tests/Endpoints/Webhooks/WebhookEndpointTestBase.cs b/tests/Moneybird.Net.Tests/Endpoints/WebhookEndpointTestBase.cs
similarity index 70%
rename from tests/Moneybird.Net.Tests/Endpoints/Webhooks/WebhookEndpointTestBase.cs
rename to tests/Moneybird.Net.Tests/Endpoints/WebhookEndpointTestBase.cs
index bd0ee05..d650fd5 100644
--- a/tests/Moneybird.Net.Tests/Endpoints/Webhooks/WebhookEndpointTestBase.cs
+++ b/tests/Moneybird.Net.Tests/Endpoints/WebhookEndpointTestBase.cs
@@ -1,4 +1,4 @@
-namespace Moneybird.Net.Tests.Endpoints.Webhooks;
+namespace Moneybird.Net.Tests.Endpoints;
public class WebhookEndpointTestBase : CommonTestBase
{
diff --git a/tests/Moneybird.Net.Tests/Endpoints/Webhooks/WebhookEndpointTests.cs b/tests/Moneybird.Net.Tests/Endpoints/WebhookEndpointTests.cs
similarity index 95%
rename from tests/Moneybird.Net.Tests/Endpoints/Webhooks/WebhookEndpointTests.cs
rename to tests/Moneybird.Net.Tests/Endpoints/WebhookEndpointTests.cs
index aec77fd..d4d7ed6 100644
--- a/tests/Moneybird.Net.Tests/Endpoints/Webhooks/WebhookEndpointTests.cs
+++ b/tests/Moneybird.Net.Tests/Endpoints/WebhookEndpointTests.cs
@@ -1,18 +1,16 @@
-using System;
using System.Collections.Generic;
-using System.Globalization;
using System.IO;
using System.Linq;
using System.Text.Json;
using FluentAssertions;
-using Moneybird.Net.Endpoints.Webhooks;
-using Moneybird.Net.Endpoints.Webhooks.Models;
+using Moneybird.Net.Endpoints;
using Moneybird.Net.Entities.Webhooks;
using Moneybird.Net.Http;
+using Moneybird.Net.Models.Webhooks;
using Moq;
using Xunit;
-namespace Moneybird.Net.Tests.Endpoints.Webhooks;
+namespace Moneybird.Net.Tests.Endpoints;
public class WebhookEndpointTests : WebhookEndpointTestBase
{
diff --git a/tests/Moneybird.Net.Tests/Endpoints/Workflows/WorkflowEndpointTests.cs b/tests/Moneybird.Net.Tests/Endpoints/WorkflowEndpointTests.cs
similarity index 95%
rename from tests/Moneybird.Net.Tests/Endpoints/Workflows/WorkflowEndpointTests.cs
rename to tests/Moneybird.Net.Tests/Endpoints/WorkflowEndpointTests.cs
index 0c832db..9e8c879 100644
--- a/tests/Moneybird.Net.Tests/Endpoints/Workflows/WorkflowEndpointTests.cs
+++ b/tests/Moneybird.Net.Tests/Endpoints/WorkflowEndpointTests.cs
@@ -3,13 +3,13 @@
using System.Linq;
using System.Text.Json;
using FluentAssertions;
-using Moneybird.Net.Endpoints.Workflows;
+using Moneybird.Net.Endpoints;
using Moneybird.Net.Entities.Workflows;
using Moneybird.Net.Http;
using Moq;
using Xunit;
-namespace Moneybird.Net.Tests.Endpoints.Workflows
+namespace Moneybird.Net.Tests.Endpoints
{
public class WorkflowEndpointTests : CommonTestBase
{
diff --git a/tests/Moneybird.Net.Tests/Extensions/ContactsExtensionsTests.cs b/tests/Moneybird.Net.Tests/Extensions/ContactsExtensionsTests.cs
index 8e01573..798c55a 100644
--- a/tests/Moneybird.Net.Tests/Extensions/ContactsExtensionsTests.cs
+++ b/tests/Moneybird.Net.Tests/Extensions/ContactsExtensionsTests.cs
@@ -1,6 +1,6 @@
using System;
-using Moneybird.Net.Endpoints.Contacts.Models;
using Moneybird.Net.Extensions;
+using Moneybird.Net.Models.Contacts;
using Xunit;
namespace Moneybird.Net.Tests.Extensions
@@ -49,7 +49,7 @@ public void GetFilterString_FromContactFilterOptions_FirstnameOnly_Returns_Corre
FirstName = firstName
};
- var expectedString = $"filter=first_name:{firstName}";
+ var expectedString = $"filter=first_name:Money";
var actualString = options.GetFilterString();
Assert.Equal(expectedString, actualString);
@@ -65,7 +65,7 @@ public void GetFilterString_FromContactFilterOptions_LastnameOnly_Returns_Correc
LastName = lastName
};
- var expectedString = $"filter=last_name:{lastName}";
+ var expectedString = $"filter=last_name:Bird";
var actualString = options.GetFilterString();
Assert.Equal(expectedString, actualString);
@@ -89,8 +89,8 @@ public void GetFilterString_FromContactFilterOptions_All_Returns_CorrectString()
var expectedString = $"filter=created_after:{createdDate:O}," +
$"updated_after:{updatedDate:O}," +
- $"first_name:{firstName}," +
- $"last_name:{lastName}";
+ $"first_name:Money," +
+ $"last_name:Bird";
var actualString = options.GetFilterString();
diff --git a/tests/Moneybird.Net.Tests/Extensions/ExternalSalesInvoicesExtensionsTests.cs b/tests/Moneybird.Net.Tests/Extensions/ExternalSalesInvoicesExtensionsTests.cs
index 2968222..5cb00ac 100644
--- a/tests/Moneybird.Net.Tests/Extensions/ExternalSalesInvoicesExtensionsTests.cs
+++ b/tests/Moneybird.Net.Tests/Extensions/ExternalSalesInvoicesExtensionsTests.cs
@@ -1,7 +1,7 @@
-using Moneybird.Net.Endpoints.ExternalSalesInvoices.Models;
using Moneybird.Net.Entities.ExternalSalesInvoices;
using Moneybird.Net.Entities.SalesInvoices;
using Moneybird.Net.Extensions;
+using Moneybird.Net.Models.ExternalSalesInvoices;
using Xunit;
namespace Moneybird.Net.Tests.Extensions;
@@ -18,7 +18,7 @@ public void GetFilterString_FromExternalSalesInvoiceFilterOptions_StateOnly_Retu
State = state
};
- var expectedString = $"filter=state:{state}";
+ const string expectedString = "filter=state:all";
var actualString = options.GetFilterString();
Assert.Equal(expectedString, actualString);
@@ -27,14 +27,14 @@ public void GetFilterString_FromExternalSalesInvoiceFilterOptions_StateOnly_Retu
[Fact]
public void GetFilterString_FromExternalSalesInvoiceFilterOptions_PeriodOnly_Returns_CorrectString()
{
- const string period = "ThisYear";
+ const string period = "this_year";
var options = new ExternalSalesInvoiceFilterOptions
{
Period = period
};
- var expectedString = $"filter=period:{period}";
+ const string expectedString = "filter=period:this_year";
var actualString = options.GetFilterString();
Assert.Equal(expectedString, actualString);
@@ -43,14 +43,14 @@ public void GetFilterString_FromExternalSalesInvoiceFilterOptions_PeriodOnly_Ret
[Fact]
public void GetFilterString_FromExternalSalesInvoiceFilterOptions_ContactIdOnly_Returns_CorrectString()
{
- const int contactId = 10;
+ const string contactId = "381666401394414610";
var options = new ExternalSalesInvoiceFilterOptions
{
ContactId = contactId
};
- var expectedString = $"filter=contact_id:{contactId}";
+ const string expectedString = "filter=contact_id:381666401394414610";
var actualString = options.GetFilterString();
Assert.Equal(expectedString, actualString);
@@ -59,9 +59,9 @@ public void GetFilterString_FromExternalSalesInvoiceFilterOptions_ContactIdOnly_
[Fact]
public void GetFilterString_FromExternalSalesInvoiceFilterOptions_All_Returns_CorrectString()
{
- const ExternalSalesInvoiceState state = ExternalSalesInvoiceState.All;
- const string period = "ThisYear";
- const int contactId = 10;
+ const ExternalSalesInvoiceState state = ExternalSalesInvoiceState.Late;
+ const string period = "this_month";
+ const string contactId = "381666401394414610";
var options = new ExternalSalesInvoiceFilterOptions
{
@@ -70,9 +70,9 @@ public void GetFilterString_FromExternalSalesInvoiceFilterOptions_All_Returns_Co
ContactId = contactId
};
- var expectedString = $"filter=state:{state}," +
- $"period:{period}," +
- $"contact_id:{contactId}";
+ const string expectedString = $"filter=state:late," +
+ $"period:this_month," +
+ $"contact_id:381666401394414610";
var actualString = options.GetFilterString();
diff --git a/tests/Moneybird.Net.Tests/Extensions/ProjectsExtensionsTests.cs b/tests/Moneybird.Net.Tests/Extensions/ProjectsExtensionsTests.cs
index 0a34c48..6d2c7ca 100644
--- a/tests/Moneybird.Net.Tests/Extensions/ProjectsExtensionsTests.cs
+++ b/tests/Moneybird.Net.Tests/Extensions/ProjectsExtensionsTests.cs
@@ -1,6 +1,6 @@
-using Moneybird.Net.Endpoints.Projects.Models;
using Moneybird.Net.Entities.Projects;
using Moneybird.Net.Extensions;
+using Moneybird.Net.Models.Projects;
using Xunit;
namespace Moneybird.Net.Tests.Extensions;
@@ -10,14 +10,14 @@ public class ProjectsExtensionsTests
[Fact]
public void GetFilterString_FromProjectFilterOptions_StateOnly_Returns_CorrectString()
{
- const ProjectState state = ProjectState.All;
+ const ProjectState state = ProjectState.Active;
var options = new ProjectFilterOptions
{
State = state
};
- var expectedString = $"filter=state:{state}";
+ const string expectedString = "filter=state:active";
var actualString = options.GetFilterString();
Assert.Equal(expectedString, actualString);
diff --git a/tests/Moneybird.Net.Tests/Extensions/SalesInvoicesExtensionsTests.cs b/tests/Moneybird.Net.Tests/Extensions/SalesInvoicesExtensionsTests.cs
index 5ad5bcf..bd9dbde 100644
--- a/tests/Moneybird.Net.Tests/Extensions/SalesInvoicesExtensionsTests.cs
+++ b/tests/Moneybird.Net.Tests/Extensions/SalesInvoicesExtensionsTests.cs
@@ -1,7 +1,7 @@
using System;
-using Moneybird.Net.Endpoints.SalesInvoices.Models;
using Moneybird.Net.Entities.SalesInvoices;
using Moneybird.Net.Extensions;
+using Moneybird.Net.Models.SalesInvoices;
using Xunit;
namespace Moneybird.Net.Tests.Extensions;
@@ -11,14 +11,14 @@ public class SalesInvoicesExtensionsTests
[Fact]
public void GetFilterString_FromSalesInvoiceFilterOptions_StateOnly_Returns_CorrectString()
{
- const SalesInvoiceState state = SalesInvoiceState.All;
+ const SalesInvoiceState state = SalesInvoiceState.Reminded;
var options = new SalesInvoiceFilterOptions
{
State = state
};
- var expectedString = $"filter=state:{state}";
+ const string expectedString = "filter=state:reminded";
var actualString = options.GetFilterString();
Assert.Equal(expectedString, actualString);
@@ -27,14 +27,14 @@ public void GetFilterString_FromSalesInvoiceFilterOptions_StateOnly_Returns_Corr
[Fact]
public void GetFilterString_FromSalesInvoiceFilterOptions_PeriodOnly_Returns_CorrectString()
{
- const string period = "ThisYear";
+ const string period = "this_month";
var options = new SalesInvoiceFilterOptions
{
Period = period
};
- var expectedString = $"filter=period:{period}";
+ const string expectedString = "filter=period:this_month";
var actualString = options.GetFilterString();
Assert.Equal(expectedString, actualString);
@@ -50,7 +50,7 @@ public void GetFilterString_FromSalesInvoiceFilterOptions_ReferenceOnly_Returns_
Reference = reference
};
- var expectedString = $"filter=reference:{reference}";
+ const string expectedString = "filter=reference:test";
var actualString = options.GetFilterString();
Assert.Equal(expectedString, actualString);
@@ -59,14 +59,14 @@ public void GetFilterString_FromSalesInvoiceFilterOptions_ReferenceOnly_Returns_
[Fact]
public void GetFilterString_FromSalesInvoiceFilterOptions_ContactIdOnly_Returns_CorrectString()
{
- const int contactId = 10;
+ const string contactId = "381666401394414610";
var options = new SalesInvoiceFilterOptions
{
ContactId = contactId
};
- var expectedString = $"filter=contact_id:{contactId}";
+ const string expectedString = "filter=contact_id:381666401394414610";
var actualString = options.GetFilterString();
Assert.Equal(expectedString, actualString);
@@ -75,14 +75,14 @@ public void GetFilterString_FromSalesInvoiceFilterOptions_ContactIdOnly_Returns_
[Fact]
public void GetFilterString_FromSalesInvoiceFilterOptions_RecurringSalesInvoiceIdOnly_Returns_CorrectString()
{
- const int recurringSalesInvoiceId = 100;
+ const string recurringSalesInvoiceId = "395773954254439850";
var options = new SalesInvoiceFilterOptions
{
RecurringSalesInvoiceId = recurringSalesInvoiceId
};
- var expectedString = $"filter=recurring_sales_invoice_id:{recurringSalesInvoiceId}";
+ const string expectedString = "filter=recurring_sales_invoice_id:395773954254439850";
var actualString = options.GetFilterString();
Assert.Equal(expectedString, actualString);
@@ -91,14 +91,14 @@ public void GetFilterString_FromSalesInvoiceFilterOptions_RecurringSalesInvoiceI
[Fact]
public void GetFilterString_FromSalesInvoiceFilterOptions_WorkflowIdOnly_Returns_CorrectString()
{
- const int workflowId = 1;
+ const string workflowId = "395773789247375285";
var options = new SalesInvoiceFilterOptions
{
WorkflowId = workflowId
};
- var expectedString = $"filter=workflow_id:{workflowId}";
+ const string expectedString = $"filter=workflow_id:395773789247375285";
var actualString = options.GetFilterString();
Assert.Equal(expectedString, actualString);
@@ -139,12 +139,12 @@ public void GetFilterString_FromSalesInvoiceFilterOptions_UpdatedOnly_Returns_Co
[Fact]
public void GetFilterString_FromSalesInvoiceFilterOptions_All_Returns_CorrectString()
{
- const SalesInvoiceState state = SalesInvoiceState.All;
- const string period = "ThisYear";
+ const SalesInvoiceState state = SalesInvoiceState.PendingPayment;
+ const string period = "this_year";
const string reference = "test";
- const int contactId = 10;
- const int recurringSalesInvoiceId = 100;
- const int workflowId = 1;
+ const string contactId = "381666401394414610";
+ const string recurringSalesInvoiceId = "395773954254439850";
+ const string workflowId = "395773789247375285";
var createdAfter = DateTime.UtcNow;
var updatedAfter = DateTime.UtcNow;
@@ -160,12 +160,12 @@ public void GetFilterString_FromSalesInvoiceFilterOptions_All_Returns_CorrectStr
UpdatedAfter = updatedAfter
};
- var expectedString = $"filter=state:{state}," +
- $"period:{period}," +
- $"reference:{reference}," +
- $"contact_id:{contactId}," +
- $"recurring_sales_invoice_id:{recurringSalesInvoiceId}," +
- $"workflow_id:{workflowId}," +
+ var expectedString = $"filter=state:pending_payment," +
+ $"period:this_year," +
+ $"reference:test," +
+ $"contact_id:381666401394414610," +
+ $"recurring_sales_invoice_id:395773954254439850," +
+ $"workflow_id:395773789247375285," +
$"created_after:{createdAfter:O}," +
$"updated_after:{updatedAfter:O}";
diff --git a/tests/Moneybird.Net.Tests/Extensions/TaxRatesExtensionsTests.cs b/tests/Moneybird.Net.Tests/Extensions/TaxRatesExtensionsTests.cs
index d617c51..0cd73fe 100644
--- a/tests/Moneybird.Net.Tests/Extensions/TaxRatesExtensionsTests.cs
+++ b/tests/Moneybird.Net.Tests/Extensions/TaxRatesExtensionsTests.cs
@@ -1,8 +1,8 @@
using System;
using System.Collections.Generic;
-using Moneybird.Net.Endpoints.TaxRates.Models;
using Moneybird.Net.Entities.TaxRates;
using Moneybird.Net.Extensions;
+using Moneybird.Net.Models.TaxRates;
using Xunit;
namespace Moneybird.Net.Tests.Extensions;
@@ -60,14 +60,14 @@ public void GetFilterString_FromTaxRateFilterOptions_PercentageOnly_Returns_Corr
[Fact]
public void GetFilterString_FromTaxRateFilterOptions_TaxRateTypeOnly_Returns_CorrectString()
{
- const TaxRateType taxRateType = TaxRateType.All;
+ const TaxRateType taxRateType = TaxRateType.GeneralJournalDocument;
var options = new TaxRateFilterOptions
{
TaxRateType = taxRateType
};
- var expectedString = $"filter=tax_rate_type:{taxRateType}";
+ const string expectedString = "filter=tax_rate_type:general_journal_document";
var actualString = options.GetFilterString();
Assert.Equal(expectedString, actualString);
@@ -83,7 +83,7 @@ public void GetFilterString_FromTaxRateFilterOptions_StateOnly_Returns_CorrectSt
State = taxRateType
};
- var expectedString = $"filter=state:{string.Join("|", taxRateType)}";
+ const string expectedString = "filter=state:purchase_invoice|sales_invoice";
var actualString = options.GetFilterString();
Assert.Equal(expectedString, actualString);
@@ -99,7 +99,7 @@ public void GetFilterString_FromTaxRateFilterOptions_CountryOnly_Returns_Correct
Country = country
};
- const string expectedString = $"filter=country:{country}";
+ const string expectedString = "filter=country:NL";
var actualString = options.GetFilterString();
Assert.Equal(expectedString, actualString);
@@ -115,7 +115,7 @@ public void GetFilterString_FromTaxRateFilterOptions_ShowTaxOnly_Returns_Correct
ShowTax = showTax
};
- var expectedString = $"filter=show_tax:{showTax}";
+ const string expectedString = "filter=show_tax:true";
var actualString = options.GetFilterString();
Assert.Equal(expectedString, actualString);
@@ -131,7 +131,7 @@ public void GetFilterString_FromTaxRateFilterOptions_ActiveOnly_Returns_CorrectS
Active = active
};
- var expectedString = $"filter=active:{active}";
+ const string expectedString = "filter=active:true";
var actualString = options.GetFilterString();
Assert.Equal(expectedString, actualString);
@@ -197,14 +197,14 @@ public void GetFilterString_FromTaxRateFilterOptions_All_Returns_CorrectString()
UpdatedAfter = updatedAfter
};
- var expectedString = $"filter=name:{name}," +
- $"partial_name:{partialName}," +
- $"percentage:{percentage}," +
- $"tax_rate_type:{taxRateType}," +
- $"state:{string.Join("|", state)}," +
- $"country:{country}," +
- $"show_tax:{showTax}," +
- $"active:{active}," +
+ var expectedString = $"filter=name:Money Bird," +
+ $"partial_name:Bird," +
+ $"percentage:21," +
+ $"tax_rate_type:all," +
+ $"state:purchase_invoice|sales_invoice," +
+ $"country:NL," +
+ $"show_tax:true," +
+ $"active:true," +
$"created_after:{createdAfter:O}," +
$"updated_after:{updatedAfter:O}";
diff --git a/tests/Moneybird.Net.Tests/Extensions/TimeEntriesExtensionsTests.cs b/tests/Moneybird.Net.Tests/Extensions/TimeEntriesExtensionsTests.cs
new file mode 100644
index 0000000..250150f
--- /dev/null
+++ b/tests/Moneybird.Net.Tests/Extensions/TimeEntriesExtensionsTests.cs
@@ -0,0 +1,191 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using Microsoft.VisualBasic;
+using Moneybird.Net.Entities.TaxRates;
+using Moneybird.Net.Entities.TimeEntries;
+using Moneybird.Net.Extensions;
+using Moneybird.Net.Models.TimeEntries;
+using Xunit;
+
+namespace Moneybird.Net.Tests.Extensions;
+
+public class TimeEntriesExtensionsTests
+{
+ [Fact]
+ public void GetFilterString_FromTimeEntryFilterOptions_NoFilters_Returns_EmptyString()
+ {
+ var options = new TimeEntryFilterOptions();
+
+ const string expectedString = "";
+ var actualString = options.GetFilterString();
+
+ Assert.Equal(expectedString, actualString);
+ }
+
+ [Fact]
+ public void GetFilterString_FromTimeEntryFilterOptions_StateOnly_Returns_CorrectString()
+ {
+ var state = new List { TimeEntryState.Open };
+
+ var options = new TimeEntryFilterOptions
+ {
+ State = state
+ };
+
+ const string expectedString = "filter=state:open";
+ var actualString = options.GetFilterString();
+
+ Assert.Equal(expectedString, actualString);
+ }
+
+ [Fact]
+ public void GetFilterString_FromTimeEntryFilterOptions_PeriodOnly_Returns_CorrectString()
+ {
+ const string period = "this_year";
+
+ var options = new TimeEntryFilterOptions
+ {
+ Period = period
+ };
+
+ const string expectedString = "filter=period:this_year";
+ var actualString = options.GetFilterString();
+
+ Assert.Equal(expectedString, actualString);
+ }
+
+ [Fact]
+ public void GetFilterString_FromTimeEntryFilterOptions_ContactIdOnly_Returns_CorrectString()
+ {
+ const string contactId = "381666401394414610";
+
+ var options = new TimeEntryFilterOptions
+ {
+ ContactId = contactId
+ };
+
+ const string expectedString = "filter=contact_id:381666401394414610";
+ var actualString = options.GetFilterString();
+
+ Assert.Equal(expectedString, actualString);
+ }
+
+ [Fact]
+ public void GetFilterString_FromTimeEntryFilterOptions_IncludeNilContactsOnly_Returns_CorrectString()
+ {
+ const bool includeNilContacts = false;
+
+ var options = new TimeEntryFilterOptions
+ {
+ IncludeNilContacts = includeNilContacts
+ };
+
+ const string expectedString = "filter=include_nil_contacts:false";
+ var actualString = options.GetFilterString();
+
+ Assert.Equal(expectedString, actualString);
+ }
+
+ [Fact]
+ public void GetFilterString_FromTimeEntryFilterOptions_IncludeActiveOnly_Returns_CorrectString()
+ {
+ const bool includeActive = true;
+
+ var options = new TimeEntryFilterOptions
+ {
+ IncludeActive = includeActive
+ };
+
+ const string expectedString = "filter=include_active:true";
+ var actualString = options.GetFilterString();
+
+ Assert.Equal(expectedString, actualString);
+ }
+
+ [Fact]
+ public void GetFilterString_FromTimeEntryFilterOptions_ProjectIdOnly_Returns_CorrectString()
+ {
+ const string projectId = "386844401331200766";
+
+ var options = new TimeEntryFilterOptions
+ {
+ ProjectId = projectId
+ };
+
+ const string expectedString = "filter=project_id:386844401331200766";
+ var actualString = options.GetFilterString();
+
+ Assert.Equal(expectedString, actualString);
+ }
+
+ [Fact]
+ public void GetFilterString_FromTimeEntryFilterOptions_UserIdOnly_Returns_CorrectString()
+ {
+ const string userId = "252969831744742910";
+
+ var options = new TimeEntryFilterOptions
+ {
+ UserId = userId
+ };
+
+ const string expectedString = "filter=user_id:252969831744742910";
+ var actualString = options.GetFilterString();
+
+ Assert.Equal(expectedString, actualString);
+ }
+
+ [Fact]
+ public void GetFilterString_FromTimeEntryFilterOptions_DayOnly_Returns_CorrectString()
+ {
+ var day = DateTime.Parse("2023-11-05");
+
+ var options = new TimeEntryFilterOptions
+ {
+ Day = day
+ };
+
+ const string expectedString = "filter=day:2023-11-05";
+ var actualString = options.GetFilterString();
+
+ Assert.Equal(expectedString, actualString);
+ }
+
+ [Fact]
+ public void GetFilterString_FromTaxRateFilterOptions_All_Returns_CorrectString()
+ {
+ var state = new List { TimeEntryState.All };
+ const string period = "this_month";
+ const string contactId = "381666401394414610";
+ const bool includeNilContacts = true;
+ const bool includeActive = false;
+ const string projectId = "386844401331200766";
+ const string userId = "252969831744742910";
+ var day = DateTime.Parse("2023-11-10");
+
+ var options = new TimeEntryFilterOptions
+ {
+ State = state,
+ Period = period,
+ ContactId = contactId,
+ IncludeNilContacts = includeNilContacts,
+ IncludeActive = includeActive,
+ ProjectId = projectId,
+ UserId = userId,
+ Day = day
+ };
+
+ const string expectedString = $"filter=state:all," +
+ $"period:this_month," +
+ $"contact_id:381666401394414610," +
+ $"include_nil_contacts:true," +
+ $"include_active:false," +
+ $"project_id:386844401331200766," +
+ $"user_id:252969831744742910," +
+ $"day:2023-11-10";
+
+ var actualString = options.GetFilterString();
+
+ Assert.Equal(expectedString, actualString);
+ }
+}
diff --git a/tests/Moneybird.Net.Tests/MoneybirdClientTests.cs b/tests/Moneybird.Net.Tests/MoneybirdClientTests.cs
index 3931475..fee9ac0 100644
--- a/tests/Moneybird.Net.Tests/MoneybirdClientTests.cs
+++ b/tests/Moneybird.Net.Tests/MoneybirdClientTests.cs
@@ -27,6 +27,7 @@ public void GetInstance_ByConfig_Returns_Correct_Instance()
Assert.NotNull(moneybirdClient.Project);
Assert.NotNull(moneybirdClient.SalesInvoice);
Assert.NotNull(moneybirdClient.TaxRate);
+ Assert.NotNull(moneybirdClient.TimeEntry);
Assert.NotNull(moneybirdClient.User);
Assert.NotNull(moneybirdClient.Verification);
Assert.NotNull(moneybirdClient.Webhook);
diff --git a/tests/Moneybird.Net.Tests/Responses/Endpoints/TimeEntries/getTimeEntries.json b/tests/Moneybird.Net.Tests/Responses/Endpoints/TimeEntries/getTimeEntries.json
new file mode 100644
index 0000000..c7cbf4b
--- /dev/null
+++ b/tests/Moneybird.Net.Tests/Responses/Endpoints/TimeEntries/getTimeEntries.json
@@ -0,0 +1,126 @@
+[
+ {
+ "id": "447521404512760211",
+ "administration_id": "357760731887252340",
+ "contact_id": "306602835138381837",
+ "project_id": "376181771183119693",
+ "user_id": "224938791219844626",
+ "started_at": "2023-11-24T18:00:00.000Z",
+ "ended_at": "2023-11-24T18:15:00.000Z",
+ "description": "Test description",
+ "paused_duration": 0,
+ "billable": true,
+ "created_at": "2023-11-24T18:28:36.544Z",
+ "updated_at": "2023-11-24T18:33:07.974Z",
+ "contact": {
+ "id": "306602835138381837",
+ "firstname": "",
+ "lastname": "",
+ "company_name": "Moneybird"
+ },
+ "detail": null,
+ "user": {
+ "id": "224938791219844626",
+ "name": "John Doe",
+ "created_at": "2019-08-05T12:19:56.000Z",
+ "updated_at": "2023-11-05T21:34:42.867Z"
+ },
+ "project": {
+ "id": "376181771183119693",
+ "name": "Apex",
+ "state": "active"
+ },
+ "events": [
+ {
+ "administration_id": "357760731887252340",
+ "user_id": "224938791219844626",
+ "action": "todo_created",
+ "link_entity_id": null,
+ "link_entity_type": null,
+ "data": {},
+ "created_at": "2023-11-24T18:29:10.795Z",
+ "updated_at": "2023-11-24T18:29:10.795Z"
+ },
+ {
+ "administration_id": "357760731887252340",
+ "user_id": "224938791219844626",
+ "action": "note_created",
+ "link_entity_id": null,
+ "link_entity_type": null,
+ "data": {},
+ "created_at": "2023-11-24T18:29:04.137Z",
+ "updated_at": "2023-11-24T18:29:04.137Z"
+ },
+ {
+ "administration_id": "357760731887252340",
+ "user_id": "224938791219844626",
+ "action": "time_entry_created",
+ "link_entity_id": null,
+ "link_entity_type": null,
+ "data": {},
+ "created_at": "2023-11-24T18:28:36.552Z",
+ "updated_at": "2023-11-24T18:28:36.552Z"
+ },
+ {
+ "administration_id": "357760731887252340",
+ "user_id": "224938791219844626",
+ "action": "todo_created",
+ "link_entity_id": null,
+ "link_entity_type": null,
+ "data": {},
+ "created_at": "2023-11-24T18:29:16.951Z",
+ "updated_at": "2023-11-24T18:29:16.951Z"
+ }
+ ],
+ "notes": [
+ {
+ "id": "405411500095702179",
+ "administration_id": "357760731887252340",
+ "entity_id": "405411457741621022",
+ "entity_type": "TimeEntry",
+ "user_id": "224938791219844626",
+ "assignee_id": "224938791219844626",
+ "todo": true,
+ "note": "Test task John Doe",
+ "completed_at": "2023-11-24T18:33:07.969Z",
+ "completed_by_id": "224938791219844626",
+ "todo_type": null,
+ "data": {},
+ "created_at": "2023-11-24T18:29:16.935Z",
+ "updated_at": "2023-11-24T18:33:07.970Z"
+ },
+ {
+ "id": "405411493648008274",
+ "administration_id": "357760731887252340",
+ "entity_id": "405411457741621022",
+ "entity_type": "TimeEntry",
+ "user_id": "224938791219844626",
+ "assignee_id": null,
+ "todo": true,
+ "note": "Test task",
+ "completed_at": null,
+ "completed_by_id": null,
+ "todo_type": null,
+ "data": {},
+ "created_at": "2023-11-24T18:29:10.786Z",
+ "updated_at": "2023-11-24T18:29:10.786Z"
+ },
+ {
+ "id": "405411486665541616",
+ "administration_id": "357760731887252340",
+ "entity_id": "405411457741621022",
+ "entity_type": "TimeEntry",
+ "user_id": "224938791219844626",
+ "assignee_id": null,
+ "todo": false,
+ "note": "Test note",
+ "completed_at": null,
+ "completed_by_id": null,
+ "todo_type": null,
+ "data": {},
+ "created_at": "2023-11-24T18:29:04.127Z",
+ "updated_at": "2023-11-24T18:29:04.127Z"
+ }
+ ]
+ }
+]
\ No newline at end of file
diff --git a/tests/Moneybird.Net.Tests/Responses/Endpoints/TimeEntries/getTimeEntry.json b/tests/Moneybird.Net.Tests/Responses/Endpoints/TimeEntries/getTimeEntry.json
new file mode 100644
index 0000000..de02974
--- /dev/null
+++ b/tests/Moneybird.Net.Tests/Responses/Endpoints/TimeEntries/getTimeEntry.json
@@ -0,0 +1,124 @@
+{
+ "id": "447521404512760211",
+ "administration_id": "357760731887252340",
+ "contact_id": "306602835138381837",
+ "project_id": "376181771183119693",
+ "user_id": "224938791219844626",
+ "started_at": "2023-11-24T18:00:00.000Z",
+ "ended_at": "2023-11-24T18:15:00.000Z",
+ "description": "Test description",
+ "paused_duration": 0,
+ "billable": true,
+ "created_at": "2023-11-24T18:28:36.544Z",
+ "updated_at": "2023-11-24T18:33:07.974Z",
+ "contact": {
+ "id": "306602835138381837",
+ "firstname": "",
+ "lastname": "",
+ "company_name": "Moneybird"
+ },
+ "detail": null,
+ "user": {
+ "id": "224938791219844626",
+ "name": "John Doe",
+ "created_at": "2019-08-05T12:19:56.000Z",
+ "updated_at": "2023-11-05T21:34:42.867Z"
+ },
+ "project": {
+ "id": "376181771183119693",
+ "name": "Apex",
+ "state": "active"
+ },
+ "events": [
+ {
+ "administration_id": "357760731887252340",
+ "user_id": "224938791219844626",
+ "action": "todo_created",
+ "link_entity_id": null,
+ "link_entity_type": null,
+ "data": {},
+ "created_at": "2023-11-24T18:29:10.795Z",
+ "updated_at": "2023-11-24T18:29:10.795Z"
+ },
+ {
+ "administration_id": "357760731887252340",
+ "user_id": "224938791219844626",
+ "action": "note_created",
+ "link_entity_id": null,
+ "link_entity_type": null,
+ "data": {},
+ "created_at": "2023-11-24T18:29:04.137Z",
+ "updated_at": "2023-11-24T18:29:04.137Z"
+ },
+ {
+ "administration_id": "357760731887252340",
+ "user_id": "224938791219844626",
+ "action": "time_entry_created",
+ "link_entity_id": null,
+ "link_entity_type": null,
+ "data": {},
+ "created_at": "2023-11-24T18:28:36.552Z",
+ "updated_at": "2023-11-24T18:28:36.552Z"
+ },
+ {
+ "administration_id": "357760731887252340",
+ "user_id": "224938791219844626",
+ "action": "todo_created",
+ "link_entity_id": null,
+ "link_entity_type": null,
+ "data": {},
+ "created_at": "2023-11-24T18:29:16.951Z",
+ "updated_at": "2023-11-24T18:29:16.951Z"
+ }
+ ],
+ "notes": [
+ {
+ "id": "405411500095702179",
+ "administration_id": "357760731887252340",
+ "entity_id": "405411457741621022",
+ "entity_type": "TimeEntry",
+ "user_id": "224938791219844626",
+ "assignee_id": "224938791219844626",
+ "todo": true,
+ "note": "Test task John Doe",
+ "completed_at": "2023-11-24T18:33:07.969Z",
+ "completed_by_id": "224938791219844626",
+ "todo_type": null,
+ "data": {},
+ "created_at": "2023-11-24T18:29:16.935Z",
+ "updated_at": "2023-11-24T18:33:07.970Z"
+ },
+ {
+ "id": "405411493648008274",
+ "administration_id": "357760731887252340",
+ "entity_id": "405411457741621022",
+ "entity_type": "TimeEntry",
+ "user_id": "224938791219844626",
+ "assignee_id": null,
+ "todo": true,
+ "note": "Test task",
+ "completed_at": null,
+ "completed_by_id": null,
+ "todo_type": null,
+ "data": {},
+ "created_at": "2023-11-24T18:29:10.786Z",
+ "updated_at": "2023-11-24T18:29:10.786Z"
+ },
+ {
+ "id": "405411486665541616",
+ "administration_id": "357760731887252340",
+ "entity_id": "405411457741621022",
+ "entity_type": "TimeEntry",
+ "user_id": "224938791219844626",
+ "assignee_id": null,
+ "todo": false,
+ "note": "Test note",
+ "completed_at": null,
+ "completed_by_id": null,
+ "todo_type": null,
+ "data": {},
+ "created_at": "2023-11-24T18:29:04.127Z",
+ "updated_at": "2023-11-24T18:29:04.127Z"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/tests/Moneybird.Net.Tests/Responses/Endpoints/TimeEntries/newTimeEntryNote.json b/tests/Moneybird.Net.Tests/Responses/Endpoints/TimeEntries/newTimeEntryNote.json
new file mode 100644
index 0000000..02dbe2a
--- /dev/null
+++ b/tests/Moneybird.Net.Tests/Responses/Endpoints/TimeEntries/newTimeEntryNote.json
@@ -0,0 +1,17 @@
+{
+ "id": "340087760940434912",
+ "administration_id": "281289699686381606",
+ "entity_id": "447521404512760211",
+ "entity_type": "TimeEntry",
+ "user_id": "16385529506268",
+ "assignee_id": "340087760888006110",
+ "todo": true,
+ "note": "Text of the note",
+ "completed_at": null,
+ "completed_by_id": null,
+ "todo_type": null,
+ "data": {
+ },
+ "created_at": "2021-12-03T17:36:24.651Z",
+ "updated_at": "2021-12-03T17:36:24.651Z"
+}
\ No newline at end of file
diff --git a/tests/Moneybird.Net.Tests/Responses/Endpoints/TimeEntries/patchTimeEntry.json b/tests/Moneybird.Net.Tests/Responses/Endpoints/TimeEntries/patchTimeEntry.json
new file mode 100644
index 0000000..05bc79c
--- /dev/null
+++ b/tests/Moneybird.Net.Tests/Responses/Endpoints/TimeEntries/patchTimeEntry.json
@@ -0,0 +1,58 @@
+{
+ "id": "395774015067653647",
+ "administration_id": "281289699686381606",
+ "contact_id": "395774015039342091",
+ "project_id": "395774015051925005",
+ "user_id": "1691659319295",
+ "started_at": "2023-08-10T09:25:00.000Z",
+ "ended_at": "2023-08-10T10:25:00.000Z",
+ "description": "Updated description",
+ "paused_duration": 0,
+ "billable": true,
+ "created_at": "2023-08-10T09:25:34.991Z",
+ "updated_at": "2023-08-10T09:25:35.037Z",
+ "contact": {
+ "id": "395774015039342091",
+ "firstname": "",
+ "lastname": "",
+ "company_name": "Foobar Holding B.V."
+ },
+ "detail": null,
+ "user": {
+ "id": "1691659319295",
+ "name": "Moneybird",
+ "created_at": "2023-08-10T09:21:59.146Z",
+ "updated_at": "2023-08-10T09:21:59.350Z"
+ },
+ "project": {
+ "id": "395774015051925005",
+ "name": "My project name",
+ "state": "active"
+ },
+ "events": [
+ {
+ "administration_id": "281289699686381606",
+ "user_id": "1691659319295",
+ "action": "time_entry_created",
+ "link_entity_id": null,
+ "link_entity_type": null,
+ "data": {
+ },
+ "created_at": "2023-08-10T09:25:34.993Z",
+ "updated_at": "2023-08-10T09:25:34.993Z"
+ },
+ {
+ "administration_id": "281289699686381606",
+ "user_id": "1691659319295",
+ "action": "time_entry_updated",
+ "link_entity_id": null,
+ "link_entity_type": null,
+ "data": {
+ },
+ "created_at": "2023-08-10T09:25:35.041Z",
+ "updated_at": "2023-08-10T09:25:35.041Z"
+ }
+ ],
+ "notes": [
+ ]
+}
\ No newline at end of file
diff --git a/tests/Moneybird.Net.Tests/Responses/Endpoints/TimeEntries/postTimeEntry.json b/tests/Moneybird.Net.Tests/Responses/Endpoints/TimeEntries/postTimeEntry.json
new file mode 100644
index 0000000..6d1b60b
--- /dev/null
+++ b/tests/Moneybird.Net.Tests/Responses/Endpoints/TimeEntries/postTimeEntry.json
@@ -0,0 +1,47 @@
+{
+ "id": "395774014869472775",
+ "administration_id": "281289699686381606",
+ "contact_id": "395774014807606787",
+ "project_id": "395774014821238277",
+ "user_id": "1691659319295",
+ "started_at": "2023-08-10T09:25:00.000Z",
+ "ended_at": "2023-08-10T10:25:00.000Z",
+ "description": "Test",
+ "paused_duration": 0,
+ "billable": false,
+ "created_at": "2023-08-10T09:25:34.802Z",
+ "updated_at": "2023-08-10T09:25:34.802Z",
+ "contact": {
+ "id": "395774014807606787",
+ "firstname": "",
+ "lastname": "",
+ "company_name": "Foobar Holding B.V."
+ },
+ "detail": null,
+ "user": {
+ "id": "1691659319295",
+ "name": "Moneybird",
+ "created_at": "2023-08-10T09:21:59.146Z",
+ "updated_at": "2023-08-10T09:21:59.350Z"
+ },
+ "project": {
+ "id": "395774014821238277",
+ "name": "My project name",
+ "state": "active"
+ },
+ "events": [
+ {
+ "administration_id": "281289699686381606",
+ "user_id": "1691659319295",
+ "action": "time_entry_created",
+ "link_entity_id": null,
+ "link_entity_type": null,
+ "data": {
+ },
+ "created_at": "2023-08-10T09:25:34.805Z",
+ "updated_at": "2023-08-10T09:25:34.805Z"
+ }
+ ],
+ "notes": [
+ ]
+}
\ No newline at end of file