diff --git a/src/main/java/com/crowdin/client/reports/ReportsApi.java b/src/main/java/com/crowdin/client/reports/ReportsApi.java index b77b3cc0e..64a3ce669 100644 --- a/src/main/java/com/crowdin/client/reports/ReportsApi.java +++ b/src/main/java/com/crowdin/client/reports/ReportsApi.java @@ -102,9 +102,10 @@ public ResponseObject downloadOrganizationReport(String reportId) } /** + * @param params query params * @return list of report settings template * @see */ public ResponseList listOrganizationReportSettingsTemplates(ListOrganizationReportSettingsParams params) throws HttpException, HttpBadRequestException { @@ -122,7 +123,7 @@ public ResponseList l * @param request request object * @return report settings template * @see */ public ResponseObject addOrganizationReportSettingsTemplate(ReportSettingsTemplate.OrganizationReportSettingsTemplate request) throws HttpException, HttpBadRequestException { @@ -134,7 +135,7 @@ public ResponseObject * @param reportSettingsTemplateId report settings template identifier * @return report settings template * @see */ public ResponseObject getOrganizationReportSettingsTemplate(Long reportSettingsTemplateId) throws HttpException, HttpBadRequestException { @@ -147,7 +148,7 @@ public ResponseObject * @param request request object * @return report settings template * @see */ public ResponseObject editOrganizationReportSettingsTemplate(Long reportSettingsTemplateId, List request) throws HttpException, HttpBadRequestException { @@ -158,7 +159,7 @@ public ResponseObject /** * @param reportSettingsTemplateId report settings template identifier * @see */ public void deleteOrganizationReportSettingsTemplate(Long reportSettingsTemplateId) throws HttpException, HttpBadRequestException { @@ -214,7 +215,6 @@ public ResponseObject downloadReport(Long projectId, String report * @return list of report settings template * @see */ public ResponseList listReportSettingsTemplate(Long projectId, Integer limit, Integer offset) throws HttpException, HttpBadRequestException { @@ -232,7 +232,6 @@ public ResponseList listReportSettingsTemplate(Long proj * @return report settings template * @see */ public ResponseObject addReportSettingsTemplate(Long projectId, ReportSettingsTemplate request) throws HttpException, HttpBadRequestException { @@ -246,7 +245,6 @@ public ResponseObject addReportSettingsTemplate(Long pro * @return report settings template * @see */ public ResponseObject getReportSettingsTemplate(Long projectId, Long reportSettingsTemplateId) throws HttpException, HttpBadRequestException { @@ -261,7 +259,6 @@ public ResponseObject getReportSettingsTemplate(Long pro * @return report settings template * @see */ public ResponseObject editReportSettingsTemplate(Long projectId, Long reportSettingsTemplateId, List request) throws HttpException, HttpBadRequestException { @@ -273,8 +270,7 @@ public ResponseObject editReportSettingsTemplate(Long pr * @param projectId project identifier * @param reportSettingsTemplateId report settings template identifier * @see */ public void deleteReportSettingsTemplate(Long projectId, Long reportSettingsTemplateId) throws HttpException, HttpBadRequestException { @@ -367,17 +363,17 @@ public void deleteUserReportSettingsTemplate(Long userId, Long reportSettingsTem /** * @param userId user identifier * @param scopeType Filter only project report archives (scopeType=project) - * @param scopeId Filter archives by spicific scope id (default 25) + * @param scopeId Filter archives by specific scope id * @param limit maximum number of items to retrieve (default 25) * @param offset starting offset in the collection (default 0) - * @return list of report settings template + * @return list of report archives * @see */ public ResponseList listReportArchives(Long userId, String scopeType, Long scopeId, Integer limit, Integer offset) throws HttpException, HttpBadRequestException { - String url = getReportArchivesPath(userId, "reports/archives/"); + String url = getReportArchivesPath(userId, "reports/archives"); Map> queryParams = HttpRequestConfig.buildUrlParams( "scopeType", Optional.ofNullable(scopeType), "scopeId", Optional.ofNullable(scopeId), @@ -388,6 +384,33 @@ public ResponseList listReportArchives(Long userId, String scopeT return ReportArchiveList.to(responseObject); } + /** + * @param userId user identifier (path parameter, Crowdin only; {@code null} for Crowdin Enterprise) + * @param params query params (scopeType, scopeId, userId, taskId, name, dateFrom, dateTo, limit, offset) + * @return list of report archives + * @see + */ + public ResponseList listReportArchives(Long userId, ListReportArchivesParams params) throws HttpException, HttpBadRequestException { + ListReportArchivesParams query = Optional.ofNullable(params).orElse(new ListReportArchivesParams()); + String url = getReportArchivesPath(userId, "reports/archives"); + Map> queryParams = HttpRequestConfig.buildUrlParams( + "scopeType", Optional.ofNullable(query.getScopeType()), + "scopeId", Optional.ofNullable(query.getScopeId()), + "userId", Optional.ofNullable(query.getUserId()), + "taskId", Optional.ofNullable(query.getTaskId()), + "name", Optional.ofNullable(query.getName()), + "dateFrom", Optional.ofNullable(query.getDateFrom()), + "dateTo", Optional.ofNullable(query.getDateTo()), + "limit", Optional.ofNullable(query.getLimit()), + "offset", Optional.ofNullable(query.getOffset()) + ); + ReportArchiveList responseObject = this.httpClient.get(url, new HttpRequestConfig(queryParams), ReportArchiveList.class); + return ReportArchiveList.to(responseObject); + } + /** * @param userId user identifier * @param archiveId archive identifier @@ -433,11 +456,12 @@ public ResponseObject exportReportArchive(Long userId, Long a } /** + * @param userId user identifier (Crowdin only, {@code null} for Crowdin Enterprise) * @param archiveId archive identifier * @param exportId export identifier * @return export report status * @see */ @@ -453,12 +477,12 @@ public ResponseObject checkReportArchiveExportStatus(Long use * @param exportId export identifier * @return report archive download link * @see */ public ResponseObject downloadReportArchive(Long userId, Long archiveId, String exportId) throws HttpException, HttpBadRequestException { - String url = getReportArchivesPath(userId, "reports/archives" + archiveId + "/exports/" + exportId + "/download"); + String url = getReportArchivesPath(userId, "reports/archives/" + archiveId + "/exports/" + exportId + "/download"); DownloadLinkResponseObject responseObject = this.httpClient.get(url, new HttpRequestConfig(), DownloadLinkResponseObject.class); return ResponseObject.of(responseObject.getData()); } diff --git a/src/main/java/com/crowdin/client/reports/model/BaseRatesForm.java b/src/main/java/com/crowdin/client/reports/model/BaseRatesForm.java index 97e553c41..ef7eead4f 100644 --- a/src/main/java/com/crowdin/client/reports/model/BaseRatesForm.java +++ b/src/main/java/com/crowdin/client/reports/model/BaseRatesForm.java @@ -6,4 +6,8 @@ public class BaseRatesForm { private Float fullTranslation; private Float proofread; + /** + * Hourly rate (used by hourly report settings templates and time-spent reports) + */ + private Float hourly; } diff --git a/src/main/java/com/crowdin/client/reports/model/CostEstimationPostEditingGenerateReportRequest.java b/src/main/java/com/crowdin/client/reports/model/CostEstimationPostEditingGenerateReportRequest.java index 8a8f7eb11..65b144868 100644 --- a/src/main/java/com/crowdin/client/reports/model/CostEstimationPostEditingGenerateReportRequest.java +++ b/src/main/java/com/crowdin/client/reports/model/CostEstimationPostEditingGenerateReportRequest.java @@ -22,6 +22,7 @@ public static class Schema { private NetRateSchemes netRateSchemes; private Boolean calculateInternalMatches; private Boolean includePreTranslatedStrings; + private Boolean skipArchiving; } @Data @@ -41,6 +42,11 @@ public static class GeneralSchema extends Schema { @Data @EqualsAndHashCode(callSuper = true) public static class ByTaskSchema extends Schema { + /** + * @deprecated deprecated in the API, use {@link #taskIds} instead + */ + @Deprecated private Long taskId; + private List taskIds; } } diff --git a/src/main/java/com/crowdin/client/reports/model/Currency.java b/src/main/java/com/crowdin/client/reports/model/Currency.java index 82af30167..ef291b9f6 100644 --- a/src/main/java/com/crowdin/client/reports/model/Currency.java +++ b/src/main/java/com/crowdin/client/reports/model/Currency.java @@ -4,7 +4,7 @@ public enum Currency implements EnumConverter { - USD, EUR, JPY, GBP, AUD, CAD, CHF, CNY, SEK, NZD, MXN, SGD, HKD, NOK, KRW, TRY, RUB, INR, BRL, ZAR, GEL, UAH; + USD, EUR, JPY, GBP, AUD, CAD, CHF, CNY, SEK, NZD, MXN, SGD, HKD, NOK, KRW, TRY, RUB, INR, BRL, ZAR, GEL, UAH, DDK, PLN; public static Currency from(String value) { return Currency.valueOf(value); diff --git a/src/main/java/com/crowdin/client/reports/model/GenerateGroupReportRequest.java b/src/main/java/com/crowdin/client/reports/model/GenerateGroupReportRequest.java index 10e5ca32e..7ce425a28 100644 --- a/src/main/java/com/crowdin/client/reports/model/GenerateGroupReportRequest.java +++ b/src/main/java/com/crowdin/client/reports/model/GenerateGroupReportRequest.java @@ -6,15 +6,30 @@ import java.util.Date; import java.util.List; +/** + * Group / organization report request (Crowdin Enterprise). + *

+ * Set {@link #name} to the report name and {@link #schema} to the matching schema class: + *

    + *
  • {@code group-translation-costs-pe}: {@link GroupTranslationCostsPostEditingSchema}, {@link GroupTranslationCostsPostEditingByTaskSchema}
  • + *
  • {@code group-top-members}: {@link GroupTopMembersSchema}
  • + *
  • {@code group-task-usage}: {@link GroupTaskUsageSchema} subclasses
  • + *
  • {@code group-qa-check-issues}: {@link GroupQaCheckIssuesSchema}
  • + *
  • {@code group-translation-activity}: {@link GroupTranslationActivitySchema}
  • + *
  • {@code group-source-content-updates}: {@link GroupSourceContentUpdatesSchema}
  • + *
  • {@code group-time-spent}: {@link GroupTimeSpentSchema}
  • + *
  • {@code group-pre-translate-accuracy}: {@link GroupPreTranslateAccuracySchema}, {@link GroupPreTranslateAccuracyByTaskSchema}
  • + *
  • {@code group-translator-accuracy}: {@link GroupTranslatorAccuracySchema}
  • + *
  • {@code group-saving-activity}: {@link GroupSavingActivitySchema}
  • + *
+ */ @Data public class GenerateGroupReportRequest { - private String name; private Schema schema; @Data public static abstract class Schema { - } @Data @@ -27,12 +42,48 @@ public static class GroupTranslationCostsPostEditingSchema extends Schema { private BaseRatesForm baseRates; private List individualRates; private NetRateSchemes netRateSchemes; + private Boolean useCategoryBasedProofreadRates; + private Boolean useTmEditDistance; + /** + * @deprecated deprecated in the API + */ + @Deprecated private Boolean excludeApprovalsForEditedTranslations; + /** + * @deprecated deprecated in the API + */ + @Deprecated private Boolean preTranslatedStringsCategorizationAdjustment; private GroupingParameter groupBy; private Date dateFrom; private Date dateTo; private List userIds; + private Boolean skipArchiving; + } + + @Data + @EqualsAndHashCode(callSuper = true) + public static class GroupTranslationCostsPostEditingByTaskSchema extends Schema { + private Unit unit; + private Currency currency; + private ReportsFormat format; + private BaseRatesForm baseRates; + private List individualRates; + private NetRateSchemes netRateSchemes; + private List taskIds; + private Boolean useCategoryBasedProofreadRates; + private Boolean useTmEditDistance; + /** + * @deprecated deprecated in the API + */ + @Deprecated + private Boolean excludeApprovalsForEditedTranslations; + /** + * @deprecated deprecated in the API + */ + @Deprecated + private Boolean preTranslatedStringsCategorizationAdjustment; + private Boolean skipArchiving; } @Data @@ -42,8 +93,224 @@ public static class GroupTopMembersSchema extends Schema { private Unit unit; private String languageId; private ReportsFormat format; + /** + * @deprecated not supported by the API for {@code group-top-members} + */ + @Deprecated private GroupingParameter groupBy; private Date dateFrom; private Date dateTo; + private List userIds; + } + + /** + * Common Group Task Usage report schema. Use one of the subclasses to get the {@code type} preset. + */ + @Data + @EqualsAndHashCode(callSuper = true) + public static class GroupTaskUsageSchema extends Schema { + private ReportsFormat format; + /** + * Report type: {@code workload}, {@code created-vs-resolved}, {@code performance}, {@code time} or {@code cost} + */ + private String type; + private List projectIds; + private Date dateFrom; + private Date dateTo; + /** + * Grouping parameter: {@code user} (workload only), {@code language}, {@code type} or {@code project} + */ + private String groupBy; + /** + * Task type: 0 - translate, 1 - proofread, 2 - translate by vendor, 3 - proofread by vendor + */ + private Integer typeTasks; + private String languageId; + private Long creatorId; + } + + @Data + @EqualsAndHashCode(callSuper = true) + public static class GroupTaskUsageWorkloadSchema extends GroupTaskUsageSchema { + private Long assigneeId; + + public GroupTaskUsageWorkloadSchema() { + setType("workload"); + } + } + + @Data + @EqualsAndHashCode(callSuper = true) + public static class GroupTaskUsageCreatedVsResolvedSchema extends GroupTaskUsageSchema { + + public GroupTaskUsageCreatedVsResolvedSchema() { + setType("created-vs-resolved"); + } + } + + @Data + @EqualsAndHashCode(callSuper = true) + public static class GroupTaskUsagePerformanceSchema extends GroupTaskUsageSchema { + private Long assigneeId; + + public GroupTaskUsagePerformanceSchema() { + setType("performance"); + } + } + + @Data + @EqualsAndHashCode(callSuper = true) + public static class GroupTaskUsageTimeSchema extends GroupTaskUsageSchema { + private Long assigneeId; + private Integer wordsCountFrom; + private Integer wordsCountTo; + + public GroupTaskUsageTimeSchema() { + setType("time"); + } + } + + @Data + @EqualsAndHashCode(callSuper = true) + public static class GroupTaskUsageCostSchema extends GroupTaskUsageSchema { + private Long assigneeId; + /** + * Task statuses: {@code todo}, {@code in_progress}, {@code done}, {@code closed}, {@code review} + */ + private List statuses; + + public GroupTaskUsageCostSchema() { + setType("cost"); + } + } + + @Data + @EqualsAndHashCode(callSuper = true) + public static class GroupQaCheckIssuesSchema extends Schema { + private List projectIds; + private ReportsFormat format; + private Date dateFrom; + private Date dateTo; + } + + @Data + @EqualsAndHashCode(callSuper = true) + public static class GroupTranslationActivitySchema extends Schema { + private Unit unit; + private List projectIds; + private ReportsFormat format; + private Date dateFrom; + private Date dateTo; + private List userIds; + } + + @Data + @EqualsAndHashCode(callSuper = true) + public static class GroupSourceContentUpdatesSchema extends Schema { + private Unit unit; + private ReportsFormat format; + private List projectIds; + private Date dateFrom; + private Date dateTo; + } + + @Data + @EqualsAndHashCode(callSuper = true) + public static class GroupTimeSpentSchema extends Schema { + private ReportsFormat format; + /** + * Grouping parameter: {@code user} (default), {@code language}, {@code task} or {@code project} + */ + private String groupBy; + /** + * Base rates, only {@code BaseRatesForm#getHourly()} is used + */ + private BaseRatesForm baseRates; + /** + * Individual rates, only languageIds, userIds and {@code IndividualRate#getHourly()} are used + */ + private List individualRates; + private String languageId; + private List userIds; + /** + * Task type: 0 - translate, 1 - proofread, 2 - translate by vendor, 3 - proofread by vendor + */ + private Integer typeTasks; + private Date dateFrom; + private Date dateTo; + private List projectIds; + private List taskIds; + private Boolean skipArchiving; + } + + @Data + @EqualsAndHashCode(callSuper = true) + public static class GroupPreTranslateAccuracySchema extends Schema { + private Unit unit; + private String languageId; + private ReportsFormat format; + private Date dateFrom; + private Date dateTo; + /** + * @deprecated deprecated in the API, use {@link #matchScoreCategories} instead + */ + @Deprecated + private List postEditingCategories; + /** + * Split into categories by match score. Ranges should be in descending order (e.g. 100-90, 89-80) + */ + private List matchScoreCategories; + private List projectIds; + private Boolean skipArchiving; + } + + @Data + @EqualsAndHashCode(callSuper = true) + public static class GroupPreTranslateAccuracyByTaskSchema extends Schema { + private Unit unit; + private ReportsFormat format; + /** + * Split into categories by match score. Ranges should be in descending order (e.g. 100-90, 89-80) + */ + private List matchScoreCategories; + private List taskIds; + private Boolean skipArchiving; + } + + @Data + @EqualsAndHashCode(callSuper = true) + public static class GroupTranslatorAccuracySchema extends Schema { + private Unit unit; + private ReportsFormat format; + private Date dateFrom; + private Date dateTo; + /** + * @deprecated deprecated in the API, use {@link #matchScoreCategories} instead + */ + @Deprecated + private List postEditingCategories; + /** + * Split into categories by match score. Ranges should be in descending order (e.g. 100-90, 89-80) + */ + private List matchScoreCategories; + private String languageId; + private List userIds; + private List projectIds; + private Boolean skipArchiving; + } + + @Data + @EqualsAndHashCode(callSuper = true) + public static class GroupSavingActivitySchema extends Schema { + private Unit unit; + private List projectIds; + private ReportsFormat format; + private Date dateFrom; + private Date dateTo; + private String languageId; + /** + * Report mode: {@code relative} (default) or {@code currency} + */ + private String mode; } } diff --git a/src/main/java/com/crowdin/client/reports/model/GroupQaCheckIssuesGenerateReportRequest.java b/src/main/java/com/crowdin/client/reports/model/GroupQaCheckIssuesGenerateReportRequest.java index d643714d9..0ce45c324 100644 --- a/src/main/java/com/crowdin/client/reports/model/GroupQaCheckIssuesGenerateReportRequest.java +++ b/src/main/java/com/crowdin/client/reports/model/GroupQaCheckIssuesGenerateReportRequest.java @@ -6,6 +6,13 @@ import java.util.Date; import java.util.List; +/** + * @deprecated this class extends the project report request and cannot be passed to + * {@link com.crowdin.client.reports.ReportsApi#generateGroupReport(Long, GenerateGroupReportRequest)} or + * {@link com.crowdin.client.reports.ReportsApi#generateOrganizationReport(GenerateGroupReportRequest)}; + * use {@link GenerateGroupReportRequest} with {@link GenerateGroupReportRequest.GroupQaCheckIssuesSchema} instead + */ +@Deprecated @Data @EqualsAndHashCode(callSuper = true) public class GroupQaCheckIssuesGenerateReportRequest extends GenerateReportRequest { diff --git a/src/main/java/com/crowdin/client/reports/model/GroupTaskUsageGenerateReportRequest.java b/src/main/java/com/crowdin/client/reports/model/GroupTaskUsageGenerateReportRequest.java index 427b99325..b6d9b2291 100644 --- a/src/main/java/com/crowdin/client/reports/model/GroupTaskUsageGenerateReportRequest.java +++ b/src/main/java/com/crowdin/client/reports/model/GroupTaskUsageGenerateReportRequest.java @@ -1,11 +1,19 @@ package com.crowdin.client.reports.model; +import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Data; import lombok.EqualsAndHashCode; import java.util.Date; import java.util.List; +/** + * @deprecated this class extends the project report request and cannot be passed to + * {@link com.crowdin.client.reports.ReportsApi#generateGroupReport(Long, GenerateGroupReportRequest)} or + * {@link com.crowdin.client.reports.ReportsApi#generateOrganizationReport(GenerateGroupReportRequest)}; + * use {@link GenerateGroupReportRequest} with a {@link GenerateGroupReportRequest.GroupTaskUsageSchema} subclass instead + */ +@Deprecated @Data @EqualsAndHashCode(callSuper = true) public class GroupTaskUsageGenerateReportRequest extends GenerateReportRequest { @@ -20,9 +28,34 @@ public static class Schema { private Date dateFrom; private Date dateTo; private String groupBy; + /** + * @deprecated wrong JSON key, use {@link #typeTasks} instead + */ + @Deprecated + @JsonIgnore private Integer taskType; + private Integer typeTasks; private String languageId; private Integer creatorId; private Integer assigneeId; + + /** + * @deprecated use {@code #getTypeTasks()} instead + * @return task type + */ + @Deprecated + public Integer getTaskType() { + return this.typeTasks; + } + + /** + * @deprecated use {@code #setTypeTasks(Integer)} instead + * @param taskType task type + */ + @Deprecated + public void setTaskType(Integer taskType) { + this.taskType = taskType; + this.typeTasks = taskType; + } } } diff --git a/src/main/java/com/crowdin/client/reports/model/GroupTranslationActivityGenerateReportRequest.java b/src/main/java/com/crowdin/client/reports/model/GroupTranslationActivityGenerateReportRequest.java index 0d7722026..a1619ecd5 100644 --- a/src/main/java/com/crowdin/client/reports/model/GroupTranslationActivityGenerateReportRequest.java +++ b/src/main/java/com/crowdin/client/reports/model/GroupTranslationActivityGenerateReportRequest.java @@ -6,6 +6,13 @@ import java.util.Date; import java.util.List; +/** + * @deprecated this class extends the project report request and cannot be passed to + * {@link com.crowdin.client.reports.ReportsApi#generateGroupReport(Long, GenerateGroupReportRequest)} or + * {@link com.crowdin.client.reports.ReportsApi#generateOrganizationReport(GenerateGroupReportRequest)}; + * use {@link GenerateGroupReportRequest} with {@link GenerateGroupReportRequest.GroupTranslationActivitySchema} instead + */ +@Deprecated @Data @EqualsAndHashCode(callSuper = true) public class GroupTranslationActivityGenerateReportRequest extends GenerateReportRequest { diff --git a/src/main/java/com/crowdin/client/reports/model/GroupingParameter.java b/src/main/java/com/crowdin/client/reports/model/GroupingParameter.java index 6592f1b09..db5b1794e 100644 --- a/src/main/java/com/crowdin/client/reports/model/GroupingParameter.java +++ b/src/main/java/com/crowdin/client/reports/model/GroupingParameter.java @@ -3,7 +3,7 @@ import com.crowdin.client.core.model.EnumConverter; public enum GroupingParameter implements EnumConverter { - USER, LANGUAGE; + USER, LANGUAGE, PROJECT; public static GroupingParameter from(String value) { return GroupingParameter.valueOf(value.toUpperCase()); diff --git a/src/main/java/com/crowdin/client/reports/model/IndividualRate.java b/src/main/java/com/crowdin/client/reports/model/IndividualRate.java index 76a138403..df02c9dc1 100644 --- a/src/main/java/com/crowdin/client/reports/model/IndividualRate.java +++ b/src/main/java/com/crowdin/client/reports/model/IndividualRate.java @@ -10,4 +10,8 @@ public class IndividualRate { private List userIds; private Float fullTranslation; private Float proofread; + /** + * Hourly rate (used by hourly report settings templates and time-spent reports) + */ + private Float hourly; } diff --git a/src/main/java/com/crowdin/client/reports/model/ListReportArchivesParams.java b/src/main/java/com/crowdin/client/reports/model/ListReportArchivesParams.java new file mode 100644 index 000000000..eeb19c6d5 --- /dev/null +++ b/src/main/java/com/crowdin/client/reports/model/ListReportArchivesParams.java @@ -0,0 +1,23 @@ +package com.crowdin.client.reports.model; + +import com.crowdin.client.core.model.Pagination; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class ListReportArchivesParams extends Pagination { + private String scopeType; + private Long scopeId; + private Long userId; + private Long taskId; + private String name; + /** + * Archive date from in UTC, ISO 8601 + */ + private String dateFrom; + /** + * Archive date to in UTC, ISO 8601 + */ + private String dateTo; +} diff --git a/src/main/java/com/crowdin/client/reports/model/PreTranslateAccuracyGenerateReportRequest.java b/src/main/java/com/crowdin/client/reports/model/PreTranslateAccuracyGenerateReportRequest.java index 5dd101a59..27371f6d2 100644 --- a/src/main/java/com/crowdin/client/reports/model/PreTranslateAccuracyGenerateReportRequest.java +++ b/src/main/java/com/crowdin/client/reports/model/PreTranslateAccuracyGenerateReportRequest.java @@ -17,7 +17,16 @@ public class PreTranslateAccuracyGenerateReportRequest extends GenerateReportReq public static class Schema { private Unit unit = Unit.WORDS; private ReportsFormat format = ReportsFormat.XLSX; + /** + * @deprecated deprecated in the API, use {@link #matchScoreCategories} instead + */ + @Deprecated private List postEditingCategories; + /** + * Split into categories by match score. Ranges should be in descending order (e.g. 100-90, 89-80) + */ + private List matchScoreCategories; + private Boolean skipArchiving; } @Data @@ -26,6 +35,17 @@ public static class GeneralSchema extends Schema { private String languageId; private Date dateFrom; private Date dateTo; + /** + * File-based projects only + */ + private List fileIds; + /** + * File-based projects only + */ + private List directoryIds; + private List branchIds; + private List labelIds; + private LabelIncludeType labelIncludeType; } @Data diff --git a/src/main/java/com/crowdin/client/reports/model/ReportArchive.java b/src/main/java/com/crowdin/client/reports/model/ReportArchive.java index 244b7a5b4..f45401466 100644 --- a/src/main/java/com/crowdin/client/reports/model/ReportArchive.java +++ b/src/main/java/com/crowdin/client/reports/model/ReportArchive.java @@ -13,5 +13,7 @@ public class ReportArchive { private String name; private String webUrl; private Object scheme; + private String status; + private Integer progress; private Date createdAt; } diff --git a/src/main/java/com/crowdin/client/reports/model/ReportSettingsTemplate.java b/src/main/java/com/crowdin/client/reports/model/ReportSettingsTemplate.java index 8a6b3986f..1f04dc1a4 100644 --- a/src/main/java/com/crowdin/client/reports/model/ReportSettingsTemplate.java +++ b/src/main/java/com/crowdin/client/reports/model/ReportSettingsTemplate.java @@ -13,12 +13,21 @@ public class ReportSettingsTemplate { private Long id; private String name; private Currency currency; + /** + * Report unit. {@link Unit#HOURS} is used by hourly templates, other units by post-editing templates. + */ private Unit unit; private String mode; private Config config; private Date createdAt; private Date updatedAt; + /** + * Applies to project report settings templates (and organization ones in Crowdin Enterprise); not supported by user templates + */ private Boolean isPublic; + /** + * Applies to project report settings templates only; not supported by user and organization templates + */ private Boolean isGlobal; @EqualsAndHashCode(callSuper = true) @@ -29,18 +38,53 @@ public static class OrganizationReportSettingsTemplate extends ReportSettingsTem private Long groupId; } + /** + * Report settings template configuration. + *

+ * Post-editing templates use {@code baseRates} (fullTranslation, proofread), {@code individualRates}, + * {@code netRateSchemes} and the boolean options. + * Hourly templates ({@code unit = hours}) use {@code baseRates} (hourly) and {@code individualRates} (hourly) only. + */ @Data public static class Config { + /** + * @deprecated obsolete configuration format, use {@link #baseRates} and {@link #netRateSchemes} instead + */ + @Deprecated private List regularRates; private List individualRates; + private BaseRatesForm baseRates; + private NetRateSchemes netRateSchemes; + private Boolean calculateInternalMatches; + private Boolean includePreTranslatedStrings; + private Boolean useCategoryBasedProofreadRates; + private Boolean useTmEditDistance; + /** + * @deprecated deprecated in the API + */ + @Deprecated + private Boolean excludeApprovalsForEditedTranslations; + /** + * @deprecated deprecated in the API + */ + @Deprecated + private Boolean preTranslatedStringsCategorizationAdjustment; } + /** + * @deprecated obsolete configuration format, use {@code Config#getBaseRates()} and {@code Config#getNetRateSchemes()} instead + */ + @Deprecated @Data public static class RegularRate { private Mode mode; private double value; } + /** + * @deprecated obsolete configuration format, use {@code Config#getNetRateSchemes()} instead + */ + @Deprecated public enum Mode implements EnumConverter { NO_MATCH, TM_MATCH; diff --git a/src/main/java/com/crowdin/client/reports/model/SavingActivityGenerateReportRequest.java b/src/main/java/com/crowdin/client/reports/model/SavingActivityGenerateReportRequest.java index b5c59a4ba..ea3901df6 100644 --- a/src/main/java/com/crowdin/client/reports/model/SavingActivityGenerateReportRequest.java +++ b/src/main/java/com/crowdin/client/reports/model/SavingActivityGenerateReportRequest.java @@ -19,5 +19,19 @@ public static class Schema { private ReportsFormat format; private Date dateFrom; private Date dateTo; + /** + * Report mode: {@code currency} or {@code relative} (default) + */ + private String mode; + /** + * File-based projects only + */ + private List fileIds; + /** + * File-based projects only + */ + private List directoryIds; + private List branchIds; + private List userIds; } } \ No newline at end of file diff --git a/src/main/java/com/crowdin/client/reports/model/TaskUsageGenerateReportRequest.java b/src/main/java/com/crowdin/client/reports/model/TaskUsageGenerateReportRequest.java new file mode 100644 index 000000000..a43e8e5b0 --- /dev/null +++ b/src/main/java/com/crowdin/client/reports/model/TaskUsageGenerateReportRequest.java @@ -0,0 +1,96 @@ +package com.crowdin.client.reports.model; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; +import java.util.List; + +/** + * Task Usage report (Crowdin Enterprise only) + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class TaskUsageGenerateReportRequest extends GenerateReportRequest { + private String name = "task-usage"; + private Schema schema; + + /** + * Common Task Usage report schema. Use one of the subclasses to get the {@code type} preset. + */ + @Data + public static class Schema { + private ReportsFormat format; + /** + * Report type: {@code workload}, {@code created-vs-resolved}, {@code performance}, {@code time} or {@code cost} + */ + private String type; + private Date dateFrom; + private Date dateTo; + /** + * Grouping parameter: {@code user} (workload only), {@code language} or {@code type} + */ + private String groupBy; + /** + * Task type: 0 - translate, 1 - proofread, 2 - translate by vendor, 3 - proofread by vendor + */ + private Integer typeTasks; + private String languageId; + private Long creatorId; + } + + @Data + @EqualsAndHashCode(callSuper = true) + public static class WorkloadSchema extends Schema { + private Long assigneeId; + + public WorkloadSchema() { + setType("workload"); + } + } + + @Data + @EqualsAndHashCode(callSuper = true) + public static class CreatedVsResolvedSchema extends Schema { + + public CreatedVsResolvedSchema() { + setType("created-vs-resolved"); + } + } + + @Data + @EqualsAndHashCode(callSuper = true) + public static class PerformanceSchema extends Schema { + private Long assigneeId; + + public PerformanceSchema() { + setType("performance"); + } + } + + @Data + @EqualsAndHashCode(callSuper = true) + public static class TimeSchema extends Schema { + private Long assigneeId; + private Integer wordsCountFrom; + private Integer wordsCountTo; + + public TimeSchema() { + setType("time"); + } + } + + @Data + @EqualsAndHashCode(callSuper = true) + public static class CostSchema extends Schema { + private Long assigneeId; + /** + * Task statuses: {@code todo}, {@code in_progress}, {@code done}, {@code closed}, {@code review} + */ + private List statuses; + + public CostSchema() { + setType("cost"); + } + } +} diff --git a/src/main/java/com/crowdin/client/reports/model/TimeSpentGenerateReportRequest.java b/src/main/java/com/crowdin/client/reports/model/TimeSpentGenerateReportRequest.java new file mode 100644 index 000000000..d8b0578f8 --- /dev/null +++ b/src/main/java/com/crowdin/client/reports/model/TimeSpentGenerateReportRequest.java @@ -0,0 +1,45 @@ +package com.crowdin.client.reports.model; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; +import java.util.List; + +@Data +@EqualsAndHashCode(callSuper = true) +public class TimeSpentGenerateReportRequest extends GenerateReportRequest { + private String name = "time-spent"; + private Schema schema; + + @Data + public static class Schema { + private ReportsFormat format; + /** + * Grouping parameter: {@code user} (default), {@code language} or {@code task} + */ + private String groupBy; + /** + * Base rates, only {@code BaseRatesForm#getHourly()} is used + */ + private BaseRatesForm baseRates; + /** + * Individual rates, only languageIds, userIds and {@code IndividualRate#getHourly()} are used + */ + private List individualRates; + private String languageId; + private List userIds; + /** + * Task type: 0 - translate, 1 - proofread, 2 - translate by vendor, 3 - proofread by vendor + */ + private Integer typeTasks; + private Date dateFrom; + private Date dateTo; + private List taskIds; + /** + * Crowdin Enterprise only + */ + private Long workflowStepId; + private Boolean skipArchiving; + } +} diff --git a/src/main/java/com/crowdin/client/reports/model/TopMembersGenerateReportRequest.java b/src/main/java/com/crowdin/client/reports/model/TopMembersGenerateReportRequest.java index bc42fd7f6..d4d3da4da 100644 --- a/src/main/java/com/crowdin/client/reports/model/TopMembersGenerateReportRequest.java +++ b/src/main/java/com/crowdin/client/reports/model/TopMembersGenerateReportRequest.java @@ -4,6 +4,7 @@ import lombok.EqualsAndHashCode; import java.util.Date; +import java.util.List; @Data @EqualsAndHashCode(callSuper = true) @@ -19,6 +20,7 @@ public static class Schema { private ReportsFormat format; private Date dateFrom; private Date dateTo; + private List userIds; } } diff --git a/src/main/java/com/crowdin/client/reports/model/TranslateAccuracyGenerateReportRequest.java b/src/main/java/com/crowdin/client/reports/model/TranslateAccuracyGenerateReportRequest.java index dfcf308b9..36d03ec0f 100644 --- a/src/main/java/com/crowdin/client/reports/model/TranslateAccuracyGenerateReportRequest.java +++ b/src/main/java/com/crowdin/client/reports/model/TranslateAccuracyGenerateReportRequest.java @@ -16,11 +16,31 @@ public class TranslateAccuracyGenerateReportRequest extends GenerateReportReques public static class Schema { private Unit unit; private ReportsFormat format; + /** + * @deprecated deprecated in the API, use {@link #matchScoreCategories} instead + */ + @Deprecated private List postEditingCategories; + /** + * Split into categories by match score. Ranges should be in descending order (e.g. 100-90, 89-80) + */ + private List matchScoreCategories; private String languageId; private List userIds; private Date dateFrom; private Date dateTo; + /** + * File-based projects only + */ + private List fileIds; + /** + * File-based projects only + */ + private List directoryIds; + private List branchIds; + private List labelIds; + private LabelIncludeType labelIncludeType; + private Boolean skipArchiving; } } diff --git a/src/main/java/com/crowdin/client/reports/model/TranslationActivityGenerateReportRequest.java b/src/main/java/com/crowdin/client/reports/model/TranslationActivityGenerateReportRequest.java index 156973141..0b8f5e44d 100644 --- a/src/main/java/com/crowdin/client/reports/model/TranslationActivityGenerateReportRequest.java +++ b/src/main/java/com/crowdin/client/reports/model/TranslationActivityGenerateReportRequest.java @@ -19,5 +19,6 @@ public static class Schema { private ReportsFormat format; private Date dateFrom; private Date dateTo; + private List userIds; } } diff --git a/src/main/java/com/crowdin/client/reports/model/TranslationCostsPostEndingGenerateReportRequest.java b/src/main/java/com/crowdin/client/reports/model/TranslationCostsPostEndingGenerateReportRequest.java index 42ae7ab64..5fdf51a76 100644 --- a/src/main/java/com/crowdin/client/reports/model/TranslationCostsPostEndingGenerateReportRequest.java +++ b/src/main/java/com/crowdin/client/reports/model/TranslationCostsPostEndingGenerateReportRequest.java @@ -20,8 +20,19 @@ public static class Schema { private BaseRatesForm baseRates; private List individualRates; private NetRateSchemes netRateSchemes; + private Boolean useCategoryBasedProofreadRates; + private Boolean useTmEditDistance; + /** + * @deprecated deprecated in the API + */ + @Deprecated private Boolean excludeApprovalsForEditedTranslations; + /** + * @deprecated deprecated in the API + */ + @Deprecated private Boolean preTranslatedStringsCategorizationAdjustment; + private Boolean skipArchiving; } @Data @@ -43,6 +54,11 @@ public static class GeneralSchema extends Schema { @Data @EqualsAndHashCode(callSuper = true) public static class ByTaskSchema extends Schema { + /** + * @deprecated deprecated in the API, use {@link #taskIds} instead + */ + @Deprecated private Long taskId; + private List taskIds; } } diff --git a/src/main/java/com/crowdin/client/reports/model/Unit.java b/src/main/java/com/crowdin/client/reports/model/Unit.java index 85f64f405..24a183044 100644 --- a/src/main/java/com/crowdin/client/reports/model/Unit.java +++ b/src/main/java/com/crowdin/client/reports/model/Unit.java @@ -4,7 +4,7 @@ public enum Unit implements EnumConverter { - WORDS, STRINGS, CHARS, CHARS_WITH_SPACES; + WORDS, STRINGS, CHARS, CHARS_WITH_SPACES, HOURS; public static Unit from(String value) { return Unit.valueOf(value.toUpperCase()); diff --git a/src/test/java/com/crowdin/client/reports/GroupReportsApiTest.java b/src/test/java/com/crowdin/client/reports/GroupReportsApiTest.java index 08065b3b7..3cbeeddff 100644 --- a/src/test/java/com/crowdin/client/reports/GroupReportsApiTest.java +++ b/src/test/java/com/crowdin/client/reports/GroupReportsApiTest.java @@ -26,9 +26,19 @@ public class GroupReportsApiTest extends TestClient { public List getMocks() { return Arrays.asList( RequestMock.build(this.url + "/groups/" + groupId + "/reports", HttpPost.METHOD_NAME, "api/reports/generateGroupReportRequest.json", "api/reports/groupReportStatusResponse.json"), + RequestMock.build(this.url + "/groups/" + groupId + "/reports", HttpPost.METHOD_NAME, "api/reports/generateGroupTimeSpentReport.json", "api/reports/groupReportStatusResponse.json"), + RequestMock.build(this.url + "/groups/" + groupId + "/reports", HttpPost.METHOD_NAME, "api/reports/generateGroupTaskUsageReport.json", "api/reports/groupReportStatusResponse.json"), + RequestMock.build(this.url + "/groups/" + groupId + "/reports", HttpPost.METHOD_NAME, "api/reports/generateGroupTranslationCostsByTaskReport.json", "api/reports/groupReportStatusResponse.json"), + RequestMock.build(this.url + "/groups/" + groupId + "/reports", HttpPost.METHOD_NAME, "api/reports/generateGroupPreTranslateAccuracyReport.json", "api/reports/groupReportStatusResponse.json"), + RequestMock.build(this.url + "/groups/" + groupId + "/reports", HttpPost.METHOD_NAME, "api/reports/generateGroupPreTranslateAccuracyByTaskReport.json", "api/reports/groupReportStatusResponse.json"), + RequestMock.build(this.url + "/groups/" + groupId + "/reports", HttpPost.METHOD_NAME, "api/reports/generateGroupTranslatorAccuracyReport.json", "api/reports/groupReportStatusResponse.json"), + RequestMock.build(this.url + "/groups/" + groupId + "/reports", HttpPost.METHOD_NAME, "api/reports/generateGroupSavingActivityReport.json", "api/reports/groupReportStatusResponse.json"), RequestMock.build(this.url + "/groups/" + groupId + "/reports/" + reportId, HttpGet.METHOD_NAME, "api/reports/groupReportStatusResponse.json"), RequestMock.build(this.url + "/groups/" + groupId + "/reports/" + reportId + "/download", HttpGet.METHOD_NAME, "api/reports/downloadLink.json"), RequestMock.build(this.url + "/reports", HttpPost.METHOD_NAME, "api/reports/generateOrganizationReportRequest.json", "api/reports/groupReportStatusResponse.json"), + RequestMock.build(this.url + "/reports", HttpPost.METHOD_NAME, "api/reports/generateGroupSourceContentUpdatesReport.json", "api/reports/groupReportStatusResponse.json"), + RequestMock.build(this.url + "/reports", HttpPost.METHOD_NAME, "api/reports/generateGroupQaCheckIssuesReport.json", "api/reports/groupReportStatusResponse.json"), + RequestMock.build(this.url + "/reports", HttpPost.METHOD_NAME, "api/reports/generateGroupTranslationActivityReport.json", "api/reports/groupReportStatusResponse.json"), RequestMock.build(this.url + "/reports/" + reportId, HttpGet.METHOD_NAME, "api/reports/groupReportStatusResponse.json"), RequestMock.build(this.url + "/reports/" + reportId + "/download", HttpGet.METHOD_NAME, "api/reports/downloadLink.json") ); @@ -68,8 +78,11 @@ public void generateGroupReport_TranslationCostsPostEditing() { setPrice(0.1f); }})); }}); - setGroupBy(GroupingParameter.LANGUAGE); + setUseCategoryBasedProofreadRates(true); + setUseTmEditDistance(false); + setGroupBy(GroupingParameter.PROJECT); setUserIds(Collections.singletonList(13L)); + setSkipArchiving(true); }} ); @@ -98,6 +111,7 @@ public void generateOrganizationReport() { setUnit(Unit.CHARS_WITH_SPACES); setLanguageId("uk"); setFormat(ReportsFormat.JSON); + setUserIds(Collections.singletonList(5L)); }}; request.setSchema(schema); @@ -117,6 +131,161 @@ public void downloadOrganizationReport() { assertDownloadLink(responseObject.getData()); } + @Test + public void generateGroupReport_TimeSpent() { + GenerateGroupReportRequest.GroupTimeSpentSchema schema = new GenerateGroupReportRequest.GroupTimeSpentSchema(); + schema.setFormat(ReportsFormat.XLSX); + schema.setGroupBy("project"); + BaseRatesForm baseRates = new BaseRatesForm(); + baseRates.setHourly(10.5f); + schema.setBaseRates(baseRates); + IndividualRate individualRate = new IndividualRate(); + individualRate.setLanguageIds(Collections.singletonList("uk")); + individualRate.setUserIds(Collections.singletonList(1L)); + individualRate.setHourly(12.5f); + schema.setIndividualRates(Collections.singletonList(individualRate)); + schema.setLanguageId("uk"); + schema.setUserIds(Collections.singletonList(1L)); + schema.setTypeTasks(2); + schema.setProjectIds(Arrays.asList(1L, 2L)); + schema.setTaskIds(Collections.singletonList(7L)); + schema.setSkipArchiving(true); + + assertGroupReportStatus(generateGroupReport("group-time-spent", schema)); + } + + @Test + public void generateGroupReport_TaskUsage() { + GenerateGroupReportRequest.GroupTaskUsageWorkloadSchema schema = new GenerateGroupReportRequest.GroupTaskUsageWorkloadSchema(); + schema.setFormat(ReportsFormat.CSV); + schema.setProjectIds(Collections.singletonList(1L)); + schema.setGroupBy("project"); + schema.setTypeTasks(0); + schema.setLanguageId("uk"); + schema.setCreatorId(2L); + schema.setAssigneeId(3L); + + assertEquals("workload", schema.getType()); + assertGroupReportStatus(generateGroupReport("group-task-usage", schema)); + } + + @Test + public void generateGroupReport_TranslationCostsPostEditingByTask() { + GenerateGroupReportRequest.GroupTranslationCostsPostEditingByTaskSchema schema = new GenerateGroupReportRequest.GroupTranslationCostsPostEditingByTaskSchema(); + schema.setUnit(Unit.WORDS); + schema.setCurrency(Currency.EUR); + schema.setFormat(ReportsFormat.XLSX); + BaseRatesForm baseRates = new BaseRatesForm(); + baseRates.setFullTranslation(0.1f); + schema.setBaseRates(baseRates); + NetRateSchemes netRateSchemes = new NetRateSchemes(); + Match match = new Match(); + match.setMatchType(MatchType.PERFECT); + match.setPrice(0.1f); + netRateSchemes.setTmMatch(Collections.singletonList(match)); + schema.setNetRateSchemes(netRateSchemes); + schema.setTaskIds(Arrays.asList(7L, 8L)); + schema.setUseCategoryBasedProofreadRates(false); + schema.setUseTmEditDistance(true); + schema.setSkipArchiving(true); + + assertGroupReportStatus(generateGroupReport("group-translation-costs-pe", schema)); + } + + @Test + public void generateGroupReport_PreTranslateAccuracy() { + GenerateGroupReportRequest.GroupPreTranslateAccuracySchema schema = new GenerateGroupReportRequest.GroupPreTranslateAccuracySchema(); + schema.setUnit(Unit.WORDS); + schema.setLanguageId("uk"); + schema.setFormat(ReportsFormat.XLSX); + schema.setMatchScoreCategories(Collections.singletonList("100-90")); + schema.setProjectIds(Arrays.asList(1L, 2L)); + schema.setSkipArchiving(false); + + assertGroupReportStatus(generateGroupReport("group-pre-translate-accuracy", schema)); + } + + @Test + public void generateGroupReport_PreTranslateAccuracyByTask() { + GenerateGroupReportRequest.GroupPreTranslateAccuracyByTaskSchema schema = new GenerateGroupReportRequest.GroupPreTranslateAccuracyByTaskSchema(); + schema.setUnit(Unit.STRINGS); + schema.setFormat(ReportsFormat.JSON); + schema.setMatchScoreCategories(Collections.singletonList("100-90")); + schema.setTaskIds(Collections.singletonList(7L)); + + assertGroupReportStatus(generateGroupReport("group-pre-translate-accuracy", schema)); + } + + @Test + public void generateGroupReport_TranslatorAccuracy() { + GenerateGroupReportRequest.GroupTranslatorAccuracySchema schema = new GenerateGroupReportRequest.GroupTranslatorAccuracySchema(); + schema.setUnit(Unit.WORDS); + schema.setFormat(ReportsFormat.XLSX); + schema.setMatchScoreCategories(Collections.singletonList("100-90")); + schema.setLanguageId("uk"); + schema.setUserIds(Collections.singletonList(1L)); + schema.setProjectIds(Collections.singletonList(1L)); + schema.setSkipArchiving(true); + + assertGroupReportStatus(generateGroupReport("group-translator-accuracy", schema)); + } + + @Test + public void generateGroupReport_SavingActivity() { + GenerateGroupReportRequest.GroupSavingActivitySchema schema = new GenerateGroupReportRequest.GroupSavingActivitySchema(); + schema.setUnit(Unit.CHARS); + schema.setProjectIds(Collections.singletonList(1L)); + schema.setFormat(ReportsFormat.XLSX); + schema.setLanguageId("uk"); + schema.setMode("currency"); + + assertGroupReportStatus(generateGroupReport("group-saving-activity", schema)); + } + + @Test + public void generateOrganizationReport_SourceContentUpdates() { + GenerateGroupReportRequest.GroupSourceContentUpdatesSchema schema = new GenerateGroupReportRequest.GroupSourceContentUpdatesSchema(); + schema.setUnit(Unit.WORDS); + schema.setFormat(ReportsFormat.CSV); + schema.setProjectIds(Arrays.asList(1L, 2L)); + + assertGroupReportStatus(generateOrganizationReport("group-source-content-updates", schema)); + } + + @Test + public void generateOrganizationReport_QaCheckIssues() { + GenerateGroupReportRequest.GroupQaCheckIssuesSchema schema = new GenerateGroupReportRequest.GroupQaCheckIssuesSchema(); + schema.setProjectIds(Collections.singletonList(1L)); + schema.setFormat(ReportsFormat.XLSX); + + assertGroupReportStatus(generateOrganizationReport("group-qa-check-issues", schema)); + } + + @Test + public void generateOrganizationReport_TranslationActivity() { + GenerateGroupReportRequest.GroupTranslationActivitySchema schema = new GenerateGroupReportRequest.GroupTranslationActivitySchema(); + schema.setUnit(Unit.WORDS); + schema.setProjectIds(Collections.singletonList(1L)); + schema.setFormat(ReportsFormat.JSON); + schema.setUserIds(Collections.singletonList(4L)); + + assertGroupReportStatus(generateOrganizationReport("group-translation-activity", schema)); + } + + private GroupReportStatus generateGroupReport(String name, GenerateGroupReportRequest.Schema schema) { + GenerateGroupReportRequest request = new GenerateGroupReportRequest(); + request.setName(name); + request.setSchema(schema); + return this.getReportsApi().generateGroupReport(groupId, request).getData(); + } + + private GroupReportStatus generateOrganizationReport(String name, GenerateGroupReportRequest.Schema schema) { + GenerateGroupReportRequest request = new GenerateGroupReportRequest(); + request.setName(name); + request.setSchema(schema); + return this.getReportsApi().generateOrganizationReport(request).getData(); + } + @SneakyThrows private void assertGroupReportStatus(GroupReportStatus reportStatus) { assertNotNull(reportStatus); diff --git a/src/test/java/com/crowdin/client/reports/ReportsApiTest.java b/src/test/java/com/crowdin/client/reports/ReportsApiTest.java index b44671e63..955acb3fc 100644 --- a/src/test/java/com/crowdin/client/reports/ReportsApiTest.java +++ b/src/test/java/com/crowdin/client/reports/ReportsApiTest.java @@ -1,6 +1,7 @@ package com.crowdin.client.reports; import com.crowdin.client.core.http.exceptions.HttpBadRequestException; +import com.crowdin.client.core.http.impl.json.JacksonJsonTransformer; import com.crowdin.client.core.model.*; import com.crowdin.client.framework.RequestMock; import com.crowdin.client.framework.TestClient; @@ -15,6 +16,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.GregorianCalendar; +import java.util.HashMap; import java.util.List; import java.util.TimeZone; import java.util.Date; @@ -22,6 +24,8 @@ import static java.util.Collections.singletonList; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.fail; public class ReportsApiTest extends TestClient { @@ -60,6 +64,18 @@ public List getMocks() { return Arrays.asList( RequestMock.build(this.url + "/projects/" + projectId + "/reports", HttpPost.METHOD_NAME, "api/reports/generateReport.json", "api/reports/reportGenerationStatus.json"), RequestMock.build(this.url + "/projects/" + projectId + "/reports", HttpPost.METHOD_NAME, "api/reports/generatePreTranslateAccuracyReport.json", "api/reports/preTranslateAccuracyReportStatus.json"), + RequestMock.build(this.url + "/projects/" + projectId + "/reports", HttpPost.METHOD_NAME, "api/reports/generateTimeSpentReport.json", "api/reports/reportGenerationStatus.json"), + RequestMock.build(this.url + "/projects/" + projectId + "/reports", HttpPost.METHOD_NAME, "api/reports/generateTaskUsageReport.json", "api/reports/reportGenerationStatus.json"), + RequestMock.build(this.url + "/projects/" + projectId + "/reports", HttpPost.METHOD_NAME, "api/reports/generateTaskUsageTimeReport.json", "api/reports/reportGenerationStatus.json"), + RequestMock.build(this.url + "/projects/" + projectId + "/reports", HttpPost.METHOD_NAME, "api/reports/generateTranslationCostsByTaskReport.json", "api/reports/reportGenerationStatus.json"), + RequestMock.build(this.url + "/projects/" + projectId + "/reports", HttpPost.METHOD_NAME, "api/reports/generateCostsEstimationByTaskReport.json", "api/reports/reportGenerationStatus.json"), + RequestMock.build(this.url + "/projects/" + projectId + "/reports", HttpPost.METHOD_NAME, "api/reports/generateTranslatorAccuracyReport.json", "api/reports/reportGenerationStatus.json"), + RequestMock.build(this.url + "/projects/" + projectId + "/reports", HttpPost.METHOD_NAME, "api/reports/generatePreTranslateAccuracyNewFieldsReport.json", "api/reports/reportGenerationStatus.json"), + RequestMock.build(this.url + "/projects/" + projectId + "/reports", HttpPost.METHOD_NAME, "api/reports/generateSavingActivityReport.json", "api/reports/reportGenerationStatus.json"), + RequestMock.build(this.url + "/projects/" + projectId + "/reports", HttpPost.METHOD_NAME, "api/reports/generateTopMembersReport.json", "api/reports/reportGenerationStatus.json"), + RequestMock.build(this.url + "/projects/" + projectId + "/reports", HttpPost.METHOD_NAME, "api/reports/generateTranslationActivityReport.json", "api/reports/reportGenerationStatus.json"), + RequestMock.build(this.url + "/projects/" + projectId + "/reports/settings-templates", HttpPost.METHOD_NAME, "api/reports/addHourlyReportSettingsTemplate.json", "api/reports/hourlyReportSettingsTemplate.json"), + RequestMock.build(this.url + "/projects/" + projectId + "/reports/settings-templates", HttpPost.METHOD_NAME, "api/reports/addPostEditingReportSettingsTemplate.json", "api/reports/postEditingReportSettingsTemplate.json"), RequestMock.build(this.url + "/projects/" + projectId + "/reports/" + id, HttpGet.METHOD_NAME, "api/reports/reportGenerationStatus.json"), RequestMock.build(this.url + "/projects/" + projectId + "/reports/" + id + "/download", HttpGet.METHOD_NAME, "api/reports/downloadLink.json"), RequestMock.build(this.url + "/reports/settings-templates", HttpGet.METHOD_NAME, "api/reports/listOrganizationReportSettingsTemplate.json"), @@ -72,12 +88,26 @@ public List getMocks() { RequestMock.build(this.url + "/projects/" + projectId + "/reports/settings-templates/" + reportSettingsTemplateId, HttpGet.METHOD_NAME, "api/reports/reportSettingsTemplate.json"), RequestMock.build(this.url + "/projects/" + projectId + "/reports/settings-templates/" + reportSettingsTemplateId, HttpPatch.METHOD_NAME, "api/reports/editReportSettingsTemplate.json", "api/reports/reportSettingsTemplate.json"), RequestMock.build(this.url + "/projects/" + projectId + "/reports/settings-templates/" + reportSettingsTemplateId, HttpDelete.METHOD_NAME), - RequestMock.build(this.url + "/users/" + userId + "/reports/archives/", HttpGet.METHOD_NAME, "api/reports/listReportArchives.json"), + RequestMock.build(this.url + "/users/" + userId + "/reports/archives", HttpGet.METHOD_NAME, "api/reports/listReportArchives.json"), + RequestMock.build(this.url + "/users/" + userId + "/reports/archives", HttpGet.METHOD_NAME, "api/reports/listReportArchives.json", new HashMap() {{ + put("scopeType", scopeType); + put("scopeId", scopeId); + put("userId", 5L); + put("taskId", 7L); + put("name", "my archive"); + put("dateFrom", "2024-01-01T00:00:00+00:00"); + put("dateTo", "2024-02-01T00:00:00+00:00"); + put("limit", 10); + put("offset", 0); + }}), + RequestMock.build(this.url + "/reports/archives", HttpGet.METHOD_NAME, "api/reports/listReportArchives.json", new HashMap() {{ + put("taskId", 7L); + }}), RequestMock.build(this.url + "/users/" + userId + "/reports/archives/" + archiveId, HttpGet.METHOD_NAME, "api/reports/reportArchive.json"), RequestMock.build(this.url + "/users/" + userId + "/reports/archives/" + archiveId, HttpDelete.METHOD_NAME), RequestMock.build(this.url + "/users/" + userId + "/reports/archives/" + archiveId + "/exports", HttpPost.METHOD_NAME, "api/reports/exportReportArchiveReques.json", "api/reports/reportGenerationStatus.json"), RequestMock.build(this.url + "/users/" + userId + "/reports/archives/" + archiveId + "/exports/" + exportId, HttpGet.METHOD_NAME, "api/reports/reportGenerationStatus.json"), - RequestMock.build(this.url + "/users/" + userId + "/reports/archives" + archiveId + "/exports/" + exportId + "/download", HttpGet.METHOD_NAME, "api/reports/downloadLink.json"), + RequestMock.build(this.url + "/users/" + userId + "/reports/archives/" + archiveId + "/exports/" + exportId + "/download", HttpGet.METHOD_NAME, "api/reports/downloadLink.json"), RequestMock.build(this.url + "/users/" + userId + "/reports/settings-templates", HttpGet.METHOD_NAME, "api/reports/listUserReportSettingsTemplate.json"), RequestMock.build(this.url + "/users/" + userId + "/reports/settings-templates", HttpPost.METHOD_NAME, "api/reports/addUserReportSettingsTemplate.json", "api/reports/userReportSettingsTemplate.json"), RequestMock.build(this.url + "/users/" + userId + "/reports/settings-templates/" + reportSettingsTemplateId, HttpGet.METHOD_NAME, "api/reports/userReportSettingsTemplate.json"), @@ -361,12 +391,42 @@ public void getListReportArchivesTest() { assertEquals(responseObject.getData().get(0).getData().getScopeId(), scopeId); assertEquals(responseObject.getData().get(0).getData().getName(), archiveName); assertEquals(responseObject.getData().get(0).getData().getWebUrl(), webUrl); + assertEquals("finished", responseObject.getData().get(0).getData().getStatus()); + assertEquals(100, responseObject.getData().get(0).getData().getProgress()); + } + + @Test + public void listReportArchivesWithParamsTest() { + ListReportArchivesParams params = new ListReportArchivesParams(); + params.setScopeType(scopeType); + params.setScopeId(scopeId); + params.setUserId(5L); + params.setTaskId(7L); + params.setName("my archive"); + params.setDateFrom("2024-01-01T00:00:00+00:00"); + params.setDateTo("2024-02-01T00:00:00+00:00"); + params.setLimit(10); + params.setOffset(0); + ResponseList responseList = this.getReportsApi().listReportArchives(userId, params); + assertEquals(1, responseList.getData().size()); + assertEquals(archiveId, responseList.getData().get(0).getData().getId()); + } + + @Test + public void listEnterpriseReportArchivesWithParamsTest() { + ListReportArchivesParams params = new ListReportArchivesParams(); + params.setTaskId(7L); + ResponseList responseList = this.getReportsApi().listReportArchives(null, params); + assertEquals(1, responseList.getData().size()); + assertEquals(scopeType, responseList.getData().get(0).getData().getScopeType()); } @Test public void getReportArchivesTest() { ResponseObject reportArchive = this.getReportsApi().getReportArchive(userId, archiveId); assertEquals(reportArchive.getData().getWebUrl(), webUrl); + assertEquals("finished", reportArchive.getData().getStatus()); + assertEquals(100, reportArchive.getData().getProgress()); } @Test @@ -399,4 +459,273 @@ public void downloadReportArchiveTest() { ResponseObject downloadLinkResponseObject = this.getReportsApi().downloadReportArchive(userId, archiveId, exportId); assertEquals(downloadLinkResponseObject.getData().getUrl(), link); } + + @Test + public void generateTimeSpentReportTest() { + TimeSpentGenerateReportRequest request = new TimeSpentGenerateReportRequest(); + TimeSpentGenerateReportRequest.Schema schema = new TimeSpentGenerateReportRequest.Schema(); + schema.setFormat(ReportsFormat.XLSX); + schema.setGroupBy("task"); + BaseRatesForm baseRates = new BaseRatesForm(); + baseRates.setHourly(10.5F); + schema.setBaseRates(baseRates); + IndividualRate individualRate = new IndividualRate(); + individualRate.setLanguageIds(singletonList(engLanguageId)); + individualRate.setUserIds(singletonList(userId)); + individualRate.setHourly(12.5F); + schema.setIndividualRates(singletonList(individualRate)); + schema.setLanguageId(languageId); + schema.setUserIds(singletonList(userId)); + schema.setTypeTasks(0); + schema.setTaskIds(singletonList(7L)); + schema.setWorkflowStepId(3L); + schema.setSkipArchiving(true); + request.setSchema(schema); + + ResponseObject response = this.getReportsApi().generateReport(projectId, request); + assertEquals(id, response.getData().getIdentifier()); + } + + @Test + public void generateTaskUsageCostReportTest() { + TaskUsageGenerateReportRequest request = new TaskUsageGenerateReportRequest(); + TaskUsageGenerateReportRequest.CostSchema schema = new TaskUsageGenerateReportRequest.CostSchema(); + schema.setFormat(ReportsFormat.JSON); + schema.setGroupBy("language"); + schema.setTypeTasks(1); + schema.setLanguageId(languageId); + schema.setCreatorId(2L); + schema.setAssigneeId(3L); + schema.setStatuses(Arrays.asList("todo", "done")); + request.setSchema(schema); + + assertEquals("cost", schema.getType()); + ResponseObject response = this.getReportsApi().generateReport(projectId, request); + assertEquals(id, response.getData().getIdentifier()); + } + + @Test + public void generateTaskUsageTimeReportTest() { + TaskUsageGenerateReportRequest request = new TaskUsageGenerateReportRequest(); + TaskUsageGenerateReportRequest.TimeSchema schema = new TaskUsageGenerateReportRequest.TimeSchema(); + schema.setFormat(ReportsFormat.XLSX); + schema.setWordsCountFrom(10); + schema.setWordsCountTo(100); + request.setSchema(schema); + + ResponseObject response = this.getReportsApi().generateReport(projectId, request); + assertEquals(id, response.getData().getIdentifier()); + } + + @Test + public void generateTranslationCostsByTaskReportTest() { + TranslationCostsPostEndingGenerateReportRequest request = new TranslationCostsPostEndingGenerateReportRequest(); + TranslationCostsPostEndingGenerateReportRequest.ByTaskSchema schema = new TranslationCostsPostEndingGenerateReportRequest.ByTaskSchema(); + schema.setUnit(Unit.WORDS); + schema.setCurrency(Currency.PLN); + schema.setFormat(ReportsFormat.XLSX); + BaseRatesForm baseRates = new BaseRatesForm(); + baseRates.setFullTranslation(fullTranslationRate); + baseRates.setProofread(proofreadRate); + schema.setBaseRates(baseRates); + NetRateSchemes netRateSchemes = new NetRateSchemes(); + Match match = new Match(); + match.setMatchType(MatchType.PERFECT); + match.setPrice(fullTranslationRate); + netRateSchemes.setTmMatch(singletonList(match)); + schema.setNetRateSchemes(netRateSchemes); + schema.setUseCategoryBasedProofreadRates(true); + schema.setUseTmEditDistance(true); + schema.setSkipArchiving(false); + schema.setTaskIds(Arrays.asList(7L, 8L)); + request.setSchema(schema); + + ResponseObject response = this.getReportsApi().generateReport(projectId, request); + assertEquals(id, response.getData().getIdentifier()); + } + + @Test + public void generateCostsEstimationByTaskReportTest() { + CostEstimationPostEditingGenerateReportRequest request = new CostEstimationPostEditingGenerateReportRequest(); + CostEstimationPostEditingGenerateReportRequest.ByTaskSchema schema = new CostEstimationPostEditingGenerateReportRequest.ByTaskSchema(); + schema.setCurrency(Currency.DDK); + schema.setSkipArchiving(true); + schema.setTaskIds(singletonList(7L)); + request.setSchema(schema); + + ResponseObject response = this.getReportsApi().generateReport(projectId, request); + assertEquals(id, response.getData().getIdentifier()); + } + + @Test + public void generateTranslatorAccuracyReportTest() { + TranslateAccuracyGenerateReportRequest request = new TranslateAccuracyGenerateReportRequest(); + TranslateAccuracyGenerateReportRequest.Schema schema = new TranslateAccuracyGenerateReportRequest.Schema(); + schema.setUnit(Unit.WORDS); + schema.setFormat(ReportsFormat.XLSX); + schema.setMatchScoreCategories(Arrays.asList("100-90", "89-80")); + schema.setLanguageId(languageId); + schema.setUserIds(singletonList(userId)); + schema.setFileIds(singletonList(fileId)); + schema.setDirectoryIds(singletonList(directoryId)); + schema.setBranchIds(singletonList(branchId)); + schema.setLabelIds(singletonList(labelId)); + schema.setLabelIncludeType(LabelIncludeType.STRINGS_WITHOUT_LABEL); + schema.setSkipArchiving(true); + request.setSchema(schema); + + ResponseObject response = this.getReportsApi().generateReport(projectId, request); + assertEquals(id, response.getData().getIdentifier()); + } + + @Test + public void generatePreTranslateAccuracyNewFieldsReportTest() { + PreTranslateAccuracyGenerateReportRequest request = new PreTranslateAccuracyGenerateReportRequest(); + request.setName("pre-translate-accuracy"); + PreTranslateAccuracyGenerateReportRequest.GeneralSchema schema = new PreTranslateAccuracyGenerateReportRequest.GeneralSchema(); + schema.setMatchScoreCategories(singletonList("100-90")); + schema.setSkipArchiving(true); + schema.setLanguageId(languageId); + schema.setFileIds(singletonList(fileId)); + schema.setDirectoryIds(singletonList(directoryId)); + schema.setBranchIds(singletonList(branchId)); + schema.setLabelIds(singletonList(labelId)); + schema.setLabelIncludeType(LabelIncludeType.STRINGS_WITH_LABEL); + request.setSchema(schema); + + ResponseObject response = this.getReportsApi().generateReport(projectId, request); + assertEquals(id, response.getData().getIdentifier()); + } + + @Test + public void generateSavingActivityReportTest() { + SavingActivityGenerateReportRequest request = new SavingActivityGenerateReportRequest(); + SavingActivityGenerateReportRequest.Schema schema = new SavingActivityGenerateReportRequest.Schema(); + schema.setUnit(Unit.WORDS); + schema.setFormat(ReportsFormat.CSV); + schema.setMode("currency"); + schema.setFileIds(singletonList(fileId)); + schema.setDirectoryIds(singletonList(directoryId)); + schema.setBranchIds(singletonList(branchId)); + schema.setUserIds(singletonList(userId)); + request.setSchema(schema); + + ResponseObject response = this.getReportsApi().generateReport(projectId, request); + assertEquals(id, response.getData().getIdentifier()); + } + + @Test + public void generateTopMembersReportTest() { + TopMembersGenerateReportRequest request = new TopMembersGenerateReportRequest(); + TopMembersGenerateReportRequest.Schema schema = new TopMembersGenerateReportRequest.Schema(); + schema.setUnit(Unit.WORDS); + schema.setFormat(ReportsFormat.XLSX); + schema.setUserIds(Arrays.asList(1L, 2L)); + request.setSchema(schema); + + ResponseObject response = this.getReportsApi().generateReport(projectId, request); + assertEquals(id, response.getData().getIdentifier()); + } + + @Test + public void generateTranslationActivityReportTest() { + TranslationActivityGenerateReportRequest request = new TranslationActivityGenerateReportRequest(); + TranslationActivityGenerateReportRequest.Schema schema = new TranslationActivityGenerateReportRequest.Schema(); + schema.setUnit(Unit.STRINGS); + schema.setUserIds(singletonList(3L)); + request.setSchema(schema); + + ResponseObject response = this.getReportsApi().generateReport(projectId, request); + assertEquals(id, response.getData().getIdentifier()); + } + + @Test + public void addHourlyReportSettingsTemplateTest() { + BaseRatesForm baseRates = new BaseRatesForm(); + baseRates.setHourly(20F); + IndividualRate individualRate = new IndividualRate(); + individualRate.setLanguageIds(singletonList(engLanguageId)); + individualRate.setUserIds(singletonList(20L)); + individualRate.setHourly(25F); + ReportSettingsTemplate.Config config = new ReportSettingsTemplate.Config(); + config.setBaseRates(baseRates); + config.setIndividualRates(singletonList(individualRate)); + + ReportSettingsTemplate request = new ReportSettingsTemplate(); + request.setName("hourly template"); + request.setCurrency(Currency.PLN); + request.setUnit(Unit.HOURS); + request.setConfig(config); + request.setIsPublic(true); + + ReportSettingsTemplate response = this.getReportsApi().addReportSettingsTemplate(projectId, request).getData(); + assertEquals(3L, response.getId()); + assertEquals(Unit.HOURS, response.getUnit()); + assertEquals(Currency.PLN, response.getCurrency()); + assertEquals(config, response.getConfig()); + assertEquals(20F, response.getConfig().getBaseRates().getHourly()); + assertEquals(25F, response.getConfig().getIndividualRates().get(0).getHourly()); + assertTrue(response.getIsPublic()); + assertFalse(response.getIsGlobal()); + } + + @Test + public void addPostEditingReportSettingsTemplateTest() { + BaseRatesForm baseRates = new BaseRatesForm(); + baseRates.setFullTranslation(fullTranslationRate); + baseRates.setProofread(proofreadRate); + IndividualRate individualRate = new IndividualRate(); + individualRate.setLanguageIds(singletonList(engLanguageId)); + individualRate.setUserIds(singletonList(20L)); + individualRate.setFullTranslation(fullTranslationRate); + individualRate.setProofread(proofreadRate); + Match perfect = new Match(); + perfect.setMatchType(MatchType.PERFECT); + perfect.setPrice(fullTranslationRate); + Match full = new Match(); + full.setMatchType(MatchType.OPTION_100); + full.setPrice(fullTranslationRate); + NetRateSchemes netRateSchemes = new NetRateSchemes(); + netRateSchemes.setTmMatch(singletonList(perfect)); + netRateSchemes.setMtMatch(singletonList(full)); + netRateSchemes.setAiMatch(singletonList(full)); + netRateSchemes.setSuggestionMatch(singletonList(full)); + ReportSettingsTemplate.Config config = new ReportSettingsTemplate.Config(); + config.setBaseRates(baseRates); + config.setIndividualRates(singletonList(individualRate)); + config.setNetRateSchemes(netRateSchemes); + config.setCalculateInternalMatches(true); + config.setIncludePreTranslatedStrings(false); + config.setUseCategoryBasedProofreadRates(true); + config.setUseTmEditDistance(false); + + ReportSettingsTemplate request = new ReportSettingsTemplate(); + request.setName("post-editing template"); + request.setCurrency(Currency.DDK); + request.setUnit(Unit.WORDS); + request.setConfig(config); + + ReportSettingsTemplate response = this.getReportsApi().addReportSettingsTemplate(projectId, request).getData(); + assertEquals(4L, response.getId()); + assertEquals(Currency.DDK, response.getCurrency()); + ReportSettingsTemplate.Config responseConfig = response.getConfig(); + assertEquals(baseRates, responseConfig.getBaseRates()); + assertEquals(netRateSchemes, responseConfig.getNetRateSchemes()); + assertEquals(singletonList(individualRate), responseConfig.getIndividualRates()); + assertTrue(responseConfig.getCalculateInternalMatches()); + assertFalse(responseConfig.getIncludePreTranslatedStrings()); + assertTrue(responseConfig.getUseCategoryBasedProofreadRates()); + assertFalse(responseConfig.getUseTmEditDistance()); + } + + @Test + public void legacyGroupTaskUsageTaskTypeIsSerializedAsTypeTasks() { + GroupTaskUsageGenerateReportRequest.Schema schema = new GroupTaskUsageGenerateReportRequest.Schema(); + schema.setTaskType(2); + assertEquals(2, schema.getTypeTasks()); + assertEquals(2, schema.getTaskType()); + + String json = new JacksonJsonTransformer().convert(schema); + assertEquals("{\"typeTasks\":2}", json); + } } diff --git a/src/test/resources/api/reports/addHourlyReportSettingsTemplate.json b/src/test/resources/api/reports/addHourlyReportSettingsTemplate.json new file mode 100644 index 000000000..cd3df59da --- /dev/null +++ b/src/test/resources/api/reports/addHourlyReportSettingsTemplate.json @@ -0,0 +1,22 @@ +{ + "name": "hourly template", + "currency": "PLN", + "unit": "hours", + "config": { + "baseRates": { + "hourly": 20.0 + }, + "individualRates": [ + { + "languageIds": [ + "uk" + ], + "userIds": [ + 20 + ], + "hourly": 25.0 + } + ] + }, + "isPublic": true +} diff --git a/src/test/resources/api/reports/addPostEditingReportSettingsTemplate.json b/src/test/resources/api/reports/addPostEditingReportSettingsTemplate.json new file mode 100644 index 000000000..8d11b3fb8 --- /dev/null +++ b/src/test/resources/api/reports/addPostEditingReportSettingsTemplate.json @@ -0,0 +1,53 @@ +{ + "name": "post-editing template", + "currency": "DDK", + "unit": "words", + "config": { + "baseRates": { + "fullTranslation": 0.1, + "proofread": 0.12 + }, + "individualRates": [ + { + "languageIds": [ + "uk" + ], + "userIds": [ + 20 + ], + "fullTranslation": 0.1, + "proofread": 0.12 + } + ], + "netRateSchemes": { + "tmMatch": [ + { + "matchType": "perfect", + "price": 0.1 + } + ], + "mtMatch": [ + { + "matchType": "100", + "price": 0.1 + } + ], + "aiMatch": [ + { + "matchType": "100", + "price": 0.1 + } + ], + "suggestionMatch": [ + { + "matchType": "100", + "price": 0.1 + } + ] + }, + "calculateInternalMatches": true, + "includePreTranslatedStrings": false, + "useCategoryBasedProofreadRates": true, + "useTmEditDistance": false + } +} diff --git a/src/test/resources/api/reports/generateCostsEstimationByTaskReport.json b/src/test/resources/api/reports/generateCostsEstimationByTaskReport.json new file mode 100644 index 000000000..4c7dee1c5 --- /dev/null +++ b/src/test/resources/api/reports/generateCostsEstimationByTaskReport.json @@ -0,0 +1,10 @@ +{ + "name": "costs-estimation-pe", + "schema": { + "currency": "DDK", + "skipArchiving": true, + "taskIds": [ + 7 + ] + } +} diff --git a/src/test/resources/api/reports/generateGroupPreTranslateAccuracyByTaskReport.json b/src/test/resources/api/reports/generateGroupPreTranslateAccuracyByTaskReport.json new file mode 100644 index 000000000..b85c27366 --- /dev/null +++ b/src/test/resources/api/reports/generateGroupPreTranslateAccuracyByTaskReport.json @@ -0,0 +1,13 @@ +{ + "name": "group-pre-translate-accuracy", + "schema": { + "unit": "strings", + "format": "json", + "matchScoreCategories": [ + "100-90" + ], + "taskIds": [ + 7 + ] + } +} diff --git a/src/test/resources/api/reports/generateGroupPreTranslateAccuracyReport.json b/src/test/resources/api/reports/generateGroupPreTranslateAccuracyReport.json new file mode 100644 index 000000000..35eda0cf2 --- /dev/null +++ b/src/test/resources/api/reports/generateGroupPreTranslateAccuracyReport.json @@ -0,0 +1,16 @@ +{ + "name": "group-pre-translate-accuracy", + "schema": { + "unit": "words", + "languageId": "uk", + "format": "xlsx", + "matchScoreCategories": [ + "100-90" + ], + "projectIds": [ + 1, + 2 + ], + "skipArchiving": false + } +} diff --git a/src/test/resources/api/reports/generateGroupQaCheckIssuesReport.json b/src/test/resources/api/reports/generateGroupQaCheckIssuesReport.json new file mode 100644 index 000000000..4e521bb5b --- /dev/null +++ b/src/test/resources/api/reports/generateGroupQaCheckIssuesReport.json @@ -0,0 +1,9 @@ +{ + "name": "group-qa-check-issues", + "schema": { + "projectIds": [ + 1 + ], + "format": "xlsx" + } +} diff --git a/src/test/resources/api/reports/generateGroupReportRequest.json b/src/test/resources/api/reports/generateGroupReportRequest.json index 34b56fe9e..7ba5c8320 100644 --- a/src/test/resources/api/reports/generateGroupReportRequest.json +++ b/src/test/resources/api/reports/generateGroupReportRequest.json @@ -43,9 +43,12 @@ } ] }, - "groupBy": "language", + "useCategoryBasedProofreadRates": true, + "useTmEditDistance": false, + "groupBy": "project", "userIds": [ 13 - ] + ], + "skipArchiving": true } } \ No newline at end of file diff --git a/src/test/resources/api/reports/generateGroupSavingActivityReport.json b/src/test/resources/api/reports/generateGroupSavingActivityReport.json new file mode 100644 index 000000000..d7d062dea --- /dev/null +++ b/src/test/resources/api/reports/generateGroupSavingActivityReport.json @@ -0,0 +1,12 @@ +{ + "name": "group-saving-activity", + "schema": { + "unit": "chars", + "projectIds": [ + 1 + ], + "format": "xlsx", + "languageId": "uk", + "mode": "currency" + } +} diff --git a/src/test/resources/api/reports/generateGroupSourceContentUpdatesReport.json b/src/test/resources/api/reports/generateGroupSourceContentUpdatesReport.json new file mode 100644 index 000000000..acee4fabf --- /dev/null +++ b/src/test/resources/api/reports/generateGroupSourceContentUpdatesReport.json @@ -0,0 +1,11 @@ +{ + "name": "group-source-content-updates", + "schema": { + "unit": "words", + "format": "csv", + "projectIds": [ + 1, + 2 + ] + } +} diff --git a/src/test/resources/api/reports/generateGroupTaskUsageReport.json b/src/test/resources/api/reports/generateGroupTaskUsageReport.json new file mode 100644 index 000000000..e63599e4d --- /dev/null +++ b/src/test/resources/api/reports/generateGroupTaskUsageReport.json @@ -0,0 +1,15 @@ +{ + "name": "group-task-usage", + "schema": { + "format": "csv", + "type": "workload", + "projectIds": [ + 1 + ], + "groupBy": "project", + "typeTasks": 0, + "languageId": "uk", + "creatorId": 2, + "assigneeId": 3 + } +} diff --git a/src/test/resources/api/reports/generateGroupTimeSpentReport.json b/src/test/resources/api/reports/generateGroupTimeSpentReport.json new file mode 100644 index 000000000..d192dd38a --- /dev/null +++ b/src/test/resources/api/reports/generateGroupTimeSpentReport.json @@ -0,0 +1,34 @@ +{ + "name": "group-time-spent", + "schema": { + "format": "xlsx", + "groupBy": "project", + "baseRates": { + "hourly": 10.5 + }, + "individualRates": [ + { + "languageIds": [ + "uk" + ], + "userIds": [ + 1 + ], + "hourly": 12.5 + } + ], + "languageId": "uk", + "userIds": [ + 1 + ], + "typeTasks": 2, + "projectIds": [ + 1, + 2 + ], + "taskIds": [ + 7 + ], + "skipArchiving": true + } +} diff --git a/src/test/resources/api/reports/generateGroupTranslationActivityReport.json b/src/test/resources/api/reports/generateGroupTranslationActivityReport.json new file mode 100644 index 000000000..8bf59840c --- /dev/null +++ b/src/test/resources/api/reports/generateGroupTranslationActivityReport.json @@ -0,0 +1,13 @@ +{ + "name": "group-translation-activity", + "schema": { + "unit": "words", + "projectIds": [ + 1 + ], + "format": "json", + "userIds": [ + 4 + ] + } +} diff --git a/src/test/resources/api/reports/generateGroupTranslationCostsByTaskReport.json b/src/test/resources/api/reports/generateGroupTranslationCostsByTaskReport.json new file mode 100644 index 000000000..2b42e75ab --- /dev/null +++ b/src/test/resources/api/reports/generateGroupTranslationCostsByTaskReport.json @@ -0,0 +1,26 @@ +{ + "name": "group-translation-costs-pe", + "schema": { + "unit": "words", + "currency": "EUR", + "format": "xlsx", + "baseRates": { + "fullTranslation": 0.1 + }, + "netRateSchemes": { + "tmMatch": [ + { + "matchType": "perfect", + "price": 0.1 + } + ] + }, + "taskIds": [ + 7, + 8 + ], + "useCategoryBasedProofreadRates": false, + "useTmEditDistance": true, + "skipArchiving": true + } +} diff --git a/src/test/resources/api/reports/generateGroupTranslatorAccuracyReport.json b/src/test/resources/api/reports/generateGroupTranslatorAccuracyReport.json new file mode 100644 index 000000000..c0e1fead9 --- /dev/null +++ b/src/test/resources/api/reports/generateGroupTranslatorAccuracyReport.json @@ -0,0 +1,18 @@ +{ + "name": "group-translator-accuracy", + "schema": { + "unit": "words", + "format": "xlsx", + "matchScoreCategories": [ + "100-90" + ], + "languageId": "uk", + "userIds": [ + 1 + ], + "projectIds": [ + 1 + ], + "skipArchiving": true + } +} diff --git a/src/test/resources/api/reports/generateOrganizationReportRequest.json b/src/test/resources/api/reports/generateOrganizationReportRequest.json index e55a074cb..07da52630 100644 --- a/src/test/resources/api/reports/generateOrganizationReportRequest.json +++ b/src/test/resources/api/reports/generateOrganizationReportRequest.json @@ -4,6 +4,7 @@ "projectIds": [1,2,3], "unit": "chars_with_spaces", "languageId": "uk", - "format": "json" + "format": "json", + "userIds": [5] } } \ No newline at end of file diff --git a/src/test/resources/api/reports/generatePreTranslateAccuracyNewFieldsReport.json b/src/test/resources/api/reports/generatePreTranslateAccuracyNewFieldsReport.json new file mode 100644 index 000000000..5b3956973 --- /dev/null +++ b/src/test/resources/api/reports/generatePreTranslateAccuracyNewFieldsReport.json @@ -0,0 +1,25 @@ +{ + "name": "pre-translate-accuracy", + "schema": { + "unit": "words", + "format": "xlsx", + "matchScoreCategories": [ + "100-90" + ], + "skipArchiving": true, + "languageId": "ach", + "fileIds": [ + 138 + ], + "directoryIds": [ + 11 + ], + "branchIds": [ + 18 + ], + "labelIds": [ + 13 + ], + "labelIncludeType": "strings_with_label" + } +} diff --git a/src/test/resources/api/reports/generateSavingActivityReport.json b/src/test/resources/api/reports/generateSavingActivityReport.json new file mode 100644 index 000000000..311e3511a --- /dev/null +++ b/src/test/resources/api/reports/generateSavingActivityReport.json @@ -0,0 +1,20 @@ +{ + "name": "saving-activity", + "schema": { + "unit": "words", + "format": "csv", + "mode": "currency", + "fileIds": [ + 138 + ], + "directoryIds": [ + 11 + ], + "branchIds": [ + 18 + ], + "userIds": [ + 1 + ] + } +} diff --git a/src/test/resources/api/reports/generateTaskUsageReport.json b/src/test/resources/api/reports/generateTaskUsageReport.json new file mode 100644 index 000000000..8bf88013a --- /dev/null +++ b/src/test/resources/api/reports/generateTaskUsageReport.json @@ -0,0 +1,16 @@ +{ + "name": "task-usage", + "schema": { + "format": "json", + "type": "cost", + "groupBy": "language", + "typeTasks": 1, + "languageId": "ach", + "creatorId": 2, + "assigneeId": 3, + "statuses": [ + "todo", + "done" + ] + } +} diff --git a/src/test/resources/api/reports/generateTaskUsageTimeReport.json b/src/test/resources/api/reports/generateTaskUsageTimeReport.json new file mode 100644 index 000000000..7c97225f1 --- /dev/null +++ b/src/test/resources/api/reports/generateTaskUsageTimeReport.json @@ -0,0 +1,9 @@ +{ + "name": "task-usage", + "schema": { + "format": "xlsx", + "type": "time", + "wordsCountFrom": 10, + "wordsCountTo": 100 + } +} diff --git a/src/test/resources/api/reports/generateTimeSpentReport.json b/src/test/resources/api/reports/generateTimeSpentReport.json new file mode 100644 index 000000000..004d77e75 --- /dev/null +++ b/src/test/resources/api/reports/generateTimeSpentReport.json @@ -0,0 +1,31 @@ +{ + "name": "time-spent", + "schema": { + "format": "xlsx", + "groupBy": "task", + "baseRates": { + "hourly": 10.5 + }, + "individualRates": [ + { + "languageIds": [ + "uk" + ], + "userIds": [ + 1 + ], + "hourly": 12.5 + } + ], + "languageId": "ach", + "userIds": [ + 1 + ], + "typeTasks": 0, + "taskIds": [ + 7 + ], + "workflowStepId": 3, + "skipArchiving": true + } +} diff --git a/src/test/resources/api/reports/generateTopMembersReport.json b/src/test/resources/api/reports/generateTopMembersReport.json new file mode 100644 index 000000000..13d3b26f7 --- /dev/null +++ b/src/test/resources/api/reports/generateTopMembersReport.json @@ -0,0 +1,11 @@ +{ + "name": "top-members", + "schema": { + "unit": "words", + "format": "xlsx", + "userIds": [ + 1, + 2 + ] + } +} diff --git a/src/test/resources/api/reports/generateTranslationActivityReport.json b/src/test/resources/api/reports/generateTranslationActivityReport.json new file mode 100644 index 000000000..c2f122384 --- /dev/null +++ b/src/test/resources/api/reports/generateTranslationActivityReport.json @@ -0,0 +1,9 @@ +{ + "name": "translation-activity", + "schema": { + "unit": "strings", + "userIds": [ + 3 + ] + } +} diff --git a/src/test/resources/api/reports/generateTranslationCostsByTaskReport.json b/src/test/resources/api/reports/generateTranslationCostsByTaskReport.json new file mode 100644 index 000000000..127d557a2 --- /dev/null +++ b/src/test/resources/api/reports/generateTranslationCostsByTaskReport.json @@ -0,0 +1,27 @@ +{ + "name": "translation-costs-pe", + "schema": { + "unit": "words", + "currency": "PLN", + "format": "xlsx", + "baseRates": { + "fullTranslation": 0.1, + "proofread": 0.12 + }, + "netRateSchemes": { + "tmMatch": [ + { + "matchType": "perfect", + "price": 0.1 + } + ] + }, + "useCategoryBasedProofreadRates": true, + "useTmEditDistance": true, + "skipArchiving": false, + "taskIds": [ + 7, + 8 + ] + } +} diff --git a/src/test/resources/api/reports/generateTranslatorAccuracyReport.json b/src/test/resources/api/reports/generateTranslatorAccuracyReport.json new file mode 100644 index 000000000..de54ad649 --- /dev/null +++ b/src/test/resources/api/reports/generateTranslatorAccuracyReport.json @@ -0,0 +1,29 @@ +{ + "name": "translator-accuracy", + "schema": { + "unit": "words", + "format": "xlsx", + "matchScoreCategories": [ + "100-90", + "89-80" + ], + "languageId": "ach", + "userIds": [ + 1 + ], + "fileIds": [ + 138 + ], + "directoryIds": [ + 11 + ], + "branchIds": [ + 18 + ], + "labelIds": [ + 13 + ], + "labelIncludeType": "strings_without_label", + "skipArchiving": true + } +} diff --git a/src/test/resources/api/reports/hourlyReportSettingsTemplate.json b/src/test/resources/api/reports/hourlyReportSettingsTemplate.json new file mode 100644 index 000000000..1aee036ea --- /dev/null +++ b/src/test/resources/api/reports/hourlyReportSettingsTemplate.json @@ -0,0 +1,28 @@ +{ + "data": { + "id": 3, + "name": "hourly template", + "currency": "PLN", + "unit": "hours", + "config": { + "baseRates": { + "hourly": 20.0 + }, + "individualRates": [ + { + "languageIds": [ + "uk" + ], + "userIds": [ + 20 + ], + "hourly": 25.0 + } + ] + }, + "createdAt": "2023-09-23T11:26:54+00:00", + "updatedAt": "2023-09-23T11:26:54+00:00", + "isPublic": true, + "isGlobal": false + } +} diff --git a/src/test/resources/api/reports/listReportArchives.json b/src/test/resources/api/reports/listReportArchives.json index c987acdab..aab63db1a 100644 --- a/src/test/resources/api/reports/listReportArchives.json +++ b/src/test/resources/api/reports/listReportArchives.json @@ -9,6 +9,8 @@ "name": "my archive report", "webUrl": "https://crowdin.com/project/project-identifier/reports/archive/1", "scheme": {}, + "status": "finished", + "progress": 100, "createdAt": "2019-09-23T11:26:54+00:00" } } diff --git a/src/test/resources/api/reports/postEditingReportSettingsTemplate.json b/src/test/resources/api/reports/postEditingReportSettingsTemplate.json new file mode 100644 index 000000000..41edd2eaa --- /dev/null +++ b/src/test/resources/api/reports/postEditingReportSettingsTemplate.json @@ -0,0 +1,61 @@ +{ + "data": { + "id": 4, + "name": "post-editing template", + "currency": "DDK", + "unit": "words", + "config": { + "baseRates": { + "fullTranslation": 0.1, + "proofread": 0.12 + }, + "individualRates": [ + { + "languageIds": [ + "uk" + ], + "userIds": [ + 20 + ], + "fullTranslation": 0.1, + "proofread": 0.12 + } + ], + "netRateSchemes": { + "tmMatch": [ + { + "matchType": "perfect", + "price": 0.1 + } + ], + "mtMatch": [ + { + "matchType": "100", + "price": 0.1 + } + ], + "aiMatch": [ + { + "matchType": "100", + "price": 0.1 + } + ], + "suggestionMatch": [ + { + "matchType": "100", + "price": 0.1 + } + ] + }, + "calculateInternalMatches": true, + "includePreTranslatedStrings": false, + "excludeApprovalsForEditedTranslations": false, + "preTranslatedStringsCategorizationAdjustment": false, + "useCategoryBasedProofreadRates": true, + "useTmEditDistance": false + }, + "createdAt": "2023-09-23T11:26:54+00:00", + "updatedAt": "2023-09-23T11:26:54+00:00", + "isPublic": false + } +} diff --git a/src/test/resources/api/reports/reportArchive.json b/src/test/resources/api/reports/reportArchive.json index 84fa094fb..0876b0d6b 100644 --- a/src/test/resources/api/reports/reportArchive.json +++ b/src/test/resources/api/reports/reportArchive.json @@ -7,6 +7,8 @@ "name": "my report archive", "webUrl": "https://crowdin.com/project/project-identifier/reports/archive/1", "scheme": {}, + "status": "finished", + "progress": 100, "createdAt": "2019-09-23T11:26:54+00:00" } } \ No newline at end of file