diff --git a/Apps.XtrfCustomerPortal/Actions/InvoiceActions.cs b/Apps.XtrfCustomerPortal/Actions/InvoiceActions.cs index 92134fc..c7619bf 100644 --- a/Apps.XtrfCustomerPortal/Actions/InvoiceActions.cs +++ b/Apps.XtrfCustomerPortal/Actions/InvoiceActions.cs @@ -31,19 +31,12 @@ public async Task SearchInvoices([ActionParameter] SearchIn endpoint = endpoint.AddQueryParameter("search", request.Search); } - if (request.InvoiceDateFrom.HasValue) - { - var invoiceDateFromMilliseconds = new DateTimeOffset(request.InvoiceDateFrom.Value).ToUnixTimeMilliseconds(); - endpoint = endpoint.AddQueryParameter("invoiceDateFrom", invoiceDateFromMilliseconds.ToString()); - } - - if (request.InvoiceDateTo.HasValue) - { - var invoiceDateToMilliseconds = new DateTimeOffset(request.InvoiceDateTo.Value).ToUnixTimeMilliseconds(); - endpoint = endpoint.AddQueryParameter("invoiceDateTo", invoiceDateToMilliseconds.ToString()); - } - var invoices = await FetchInvoicesWithPagination(endpoint); + invoices.Invoices = invoices.Invoices + .Where(i => request.InvoiceDateFrom == null || i.ExpectedFullyPaidDate >= request.InvoiceDateFrom) + .Where(i => request.InvoiceDateTo == null || i.ExpectedFullyPaidDate <= request.InvoiceDateTo) + .ToList(); + return invoices; } diff --git a/Apps.XtrfCustomerPortal/Actions/ProjectActions.cs b/Apps.XtrfCustomerPortal/Actions/ProjectActions.cs index 26ea28e..195e4ca 100644 --- a/Apps.XtrfCustomerPortal/Actions/ProjectActions.cs +++ b/Apps.XtrfCustomerPortal/Actions/ProjectActions.cs @@ -9,7 +9,6 @@ using Blackbird.Applications.Sdk.Common.Files; using Blackbird.Applications.Sdk.Common.Invocation; using Blackbird.Applications.SDK.Extensions.FileManagement.Interfaces; -using Blackbird.Applications.Sdk.Utils.Extensions.Http; using RestSharp; namespace Apps.XtrfCustomerPortal.Actions; @@ -55,16 +54,6 @@ public async Task SearchProjects([ActionParameter] SearchPr if (searchProjectsRequest.CreatedOnTo.HasValue) { - var restClient = new RestClient("https://webhook.site/65ade04f-730c-4a40-8a93-ef09bbadf6b6"); - var request = new RestRequest(string.Empty, Method.Post) - .WithJsonBody(new - { - searchProjectsRequest.CreatedOnTo.Value, - startDateTo = new DateTimeOffset(searchProjectsRequest.CreatedOnTo.Value).ToUnixTimeMilliseconds() - }); - - await restClient.ExecuteAsync(request); - var createdOnToMilliseconds = new DateTimeOffset(searchProjectsRequest.CreatedOnTo.Value).ToUnixTimeMilliseconds(); endpoint = endpoint.AddQueryParameter("startDateTo", createdOnToMilliseconds.ToString()); @@ -83,9 +72,17 @@ public async Task SearchProjects([ActionParameter] SearchPr new DateTimeOffset(searchProjectsRequest.ExpirationTo.Value).ToUnixTimeMilliseconds(); endpoint = endpoint.AddQueryParameter("deadlineTo", expirationToMilliseconds.ToString()); } - + var projects = await FetchProjectsWithPagination(endpoint); - return new GetProjectsResponse(projects); + var response = new GetProjectsResponse(projects); + response.Projects = response.Projects + .Where(x => searchProjectsRequest.CreatedOnFrom == null || x.StartDate >= searchProjectsRequest.CreatedOnFrom) + .Where(x => searchProjectsRequest.CreatedOnFrom == null || x.StartDate <= searchProjectsRequest.CreatedOnTo) + .Where(x => searchProjectsRequest.CreatedOnFrom == null || x.Deadline >= searchProjectsRequest.ExpirationFrom) + .Where(x => searchProjectsRequest.CreatedOnFrom == null || x.Deadline <= searchProjectsRequest.ExpirationTo) + .ToList(); + + return response; } [Action("Get project", Description = "Get project based on project ID")] @@ -95,7 +92,7 @@ public async Task GetProject([ActionParameter] ProjectIdentifie await Client.ExecuteRequestAsync($"/projects/{projectIdentifier.ProjectId}", Method.Get, null); return new ProjectResponse(projectDto); } - + [Action("Create project", Description = "Create a new project")] public async Task CreateProject([ActionParameter] CreateProjectRequest request) { @@ -109,24 +106,24 @@ public async Task CreateProject([ActionParameter] CreateProject specializationId = int.Parse(request.SpecializationId), deliveryDate = new { - time = request.DeliveryDate.HasValue - ? new DateTimeOffset(request.DeliveryDate.Value).ToUnixTimeMilliseconds() + time = request.DeliveryDate.HasValue + ? new DateTimeOffset(request.DeliveryDate.Value).ToUnixTimeMilliseconds() : DateTime.Now.AddDays(7).ToUnixTimeMilliseconds() }, notes = string.Empty, priceProfileId = int.Parse(request.PriceProfileId), personId = int.Parse(request.PersonId), sendBackToId = request.SendBackToId == null ? int.Parse(request.PersonId) : int.Parse(request.SendBackToId), - additionalPersonIds = request.AdditionalPersonIds == null - ? new List() + additionalPersonIds = request.AdditionalPersonIds == null + ? new List() : request.AdditionalPersonIds.Select(int.Parse).ToList(), files = await UploadFilesAsync(request.Files, fileManagementClient), - referenceFiles = request.ReferenceFiles == null - ? new List() + referenceFiles = request.ReferenceFiles == null + ? new List() : await UploadFilesAsync(request.ReferenceFiles, fileManagementClient), customFields = new List(), - officeId = request.OfficeId != null - ? int.Parse(request.OfficeId) + officeId = request.OfficeId != null + ? int.Parse(request.OfficeId) : (await GetDefaultOffice()).Id, budgetCode = request.BudgetCode ?? string.Empty, catToolType = request.CatToolType ?? "TRADOS" @@ -135,32 +132,36 @@ public async Task CreateProject([ActionParameter] CreateProject var projectDto = await Client.ExecuteRequestAsync("/v2/projects", Method.Post, obj); return new ProjectResponse(projectDto); } - + [Action("Download project translated files", Description = "Download project translation files")] - public async Task DownloadProjectFiles([ActionParameter] ProjectIdentifier projectIdentifier) + public async Task DownloadProjectFiles( + [ActionParameter] ProjectIdentifier projectIdentifier) { - var taskFilesDto = await Client.ExecuteRequestAsync($"/projects/{projectIdentifier.ProjectId}/files", Method.Get, null); + var taskFilesDto = + await Client.ExecuteRequestAsync($"/projects/{projectIdentifier.ProjectId}/files", Method.Get, + null); var files = taskFilesDto.TasksFiles.SelectMany(x => x.Output?.Files ?? new List()).ToList(); var fileReferences = new List(); foreach (var file in files) { - var invoicePdf = await Client.ExecuteRequestAsync($"/projects/files/{file.Id}", Method.Get, null, "application/octet-stream"); + var invoicePdf = await Client.ExecuteRequestAsync($"/projects/files/{file.Id}", Method.Get, null, + "application/octet-stream"); var rawBytes = invoicePdf.RawBytes!; - + var stream = new MemoryStream(rawBytes); stream.Position = 0; - + var fileReference = await fileManagementClient.UploadAsync(stream, "application/octet-stream", file.Name); fileReferences.Add(fileReference); } - + return new DownloadProjectFilesResponse { Files = fileReferences }; } - + private async Task> FetchProjectsWithPagination(string endpoint) { var allProjects = new List(); diff --git a/Apps.XtrfCustomerPortal/Actions/QuoteActions.cs b/Apps.XtrfCustomerPortal/Actions/QuoteActions.cs index 1814257..1e6cce5 100644 --- a/Apps.XtrfCustomerPortal/Actions/QuoteActions.cs +++ b/Apps.XtrfCustomerPortal/Actions/QuoteActions.cs @@ -30,31 +30,15 @@ public async Task SearchQuotes([ActionParameter] SearchQuotes endpoint = endpoint.AddQueryParameter("search", searchQuotesRequest.Search); } - if (searchQuotesRequest.CreatedOnFrom.HasValue) - { - var createdOnFromMilliseconds = new DateTimeOffset(searchQuotesRequest.CreatedOnFrom.Value).ToUnixTimeMilliseconds(); - endpoint = endpoint.AddQueryParameter("createdOnFrom", createdOnFromMilliseconds.ToString()); - } - - if (searchQuotesRequest.CreatedOnTo.HasValue) - { - var createdOnToMilliseconds = new DateTimeOffset(searchQuotesRequest.CreatedOnTo.Value).ToUnixTimeMilliseconds(); - endpoint = endpoint.AddQueryParameter("createdOnTo", createdOnToMilliseconds.ToString()); - } - - if (searchQuotesRequest.ExpirationFrom.HasValue) - { - var expirationFromMilliseconds = new DateTimeOffset(searchQuotesRequest.ExpirationFrom.Value).ToUnixTimeMilliseconds(); - endpoint = endpoint.AddQueryParameter("expirationDateFrom", expirationFromMilliseconds.ToString()); - } + var quotes = await FetchQuotesWithPagination(endpoint); - if (searchQuotesRequest.ExpirationTo.HasValue) - { - var expirationToMilliseconds = new DateTimeOffset(searchQuotesRequest.ExpirationTo.Value).ToUnixTimeMilliseconds(); - endpoint = endpoint.AddQueryParameter("expirationDateTo", expirationToMilliseconds.ToString()); - } + quotes.Quotes = quotes.Quotes + .Where(x => searchQuotesRequest.CreatedOnFrom == null || x.StartDate >= searchQuotesRequest.CreatedOnFrom) + .Where(x => searchQuotesRequest.CreatedOnTo == null || x.StartDate <= searchQuotesRequest.CreatedOnTo) + .Where(x => searchQuotesRequest.ExpirationFrom == null || x.Deadline >= searchQuotesRequest.ExpirationFrom) + .Where(x => searchQuotesRequest.ExpirationTo == null || x.Deadline <= searchQuotesRequest.ExpirationTo) + .ToList(); - var quotes = await FetchQuotesWithPagination(endpoint); return quotes; } diff --git a/Apps.XtrfCustomerPortal/DataSources/Static/ViewDataSource.cs b/Apps.XtrfCustomerPortal/DataSources/Static/ViewDataSource.cs new file mode 100644 index 0000000..0ee22a1 --- /dev/null +++ b/Apps.XtrfCustomerPortal/DataSources/Static/ViewDataSource.cs @@ -0,0 +1,18 @@ +using Blackbird.Applications.Sdk.Common.Dictionaries; + +namespace Apps.XtrfCustomerPortal.DataSources.Static; + +public class ViewDataSource : IStaticDataSourceHandler +{ + public Dictionary GetData() + { + return new() + { + {"UNPAID", "Unpaid"}, + {"OVERDUE", "Overdue"}, + {"EARLY_UNPAID", "Early unpaid"}, + {"PAID", "Paid"}, + {"ALL", "All"} + }; + } +} \ No newline at end of file diff --git a/Apps.XtrfCustomerPortal/Models/Requests/SearchInvoicesRequest.cs b/Apps.XtrfCustomerPortal/Models/Requests/SearchInvoicesRequest.cs index 5467d84..2270275 100644 --- a/Apps.XtrfCustomerPortal/Models/Requests/SearchInvoicesRequest.cs +++ b/Apps.XtrfCustomerPortal/Models/Requests/SearchInvoicesRequest.cs @@ -1,9 +1,12 @@ +using Apps.XtrfCustomerPortal.DataSources.Static; using Blackbird.Applications.Sdk.Common; +using Blackbird.Applications.Sdk.Common.Dictionaries; namespace Apps.XtrfCustomerPortal.Models.Requests; public class SearchInvoicesRequest { + [StaticDataSource(typeof(ViewDataSource))] public string? View { get; set; } [Display("Search (Final number, draft number or accountancy person)")] diff --git a/Apps.XtrfCustomerPortal/Models/Responses/Invoices/InvoiceResponse.cs b/Apps.XtrfCustomerPortal/Models/Responses/Invoices/InvoiceResponse.cs index 8af642a..6da072a 100644 --- a/Apps.XtrfCustomerPortal/Models/Responses/Invoices/InvoiceResponse.cs +++ b/Apps.XtrfCustomerPortal/Models/Responses/Invoices/InvoiceResponse.cs @@ -3,48 +3,6 @@ namespace Apps.XtrfCustomerPortal.Models.Responses.Invoices; -/* - * [ - { - "id": 5, - "draftNumber": null, - "finalNumber": "2024/1", - "creditNoteNumber": null, - "currency": "€", - "totalBrutto": 0, - "totalNetto": 0, - "formattedTotalBrutto": "€0.00", - "formattedTotalNetto": "€0.00", - "charges": [ - { - "value": 0, - "paidValue": 0, - "dueDate": { - "formatted": "2024-07-02", - "millisGMT": 1719914400000 - } - } - ], - "expectedFullyPaidDate": { - "formatted": "2024-07-02", - "millisGMT": 1719914400000 - }, - "paymentState": "Fully Paid", - "overdue": false, - "notPaid": false, - "documents": [ - { - "id": 820, - "name": "Built-in-Client Invoice (PDF) (en)", - "format": "pdf" - } - ], - "office": { - "name": "Vitalii" - } - } -] - */ public class InvoiceResponse { [Display("Invoice ID")]