From 3ee258fbff6d4a9948ec2450130c9c947f256ead Mon Sep 17 00:00:00 2001 From: victoriaraznodumova <90800890+victoriaraznodumova@users.noreply.github.com> Date: Sun, 28 Apr 2024 15:12:47 +0300 Subject: [PATCH 1/4] README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ee9d69b..5114622 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,7 @@ 4. Найденный в соответствии с условием задачи месяц должен выводиться на английском языке в нижнем регистре. Если месяцев несколько, то на вывод они все подаются на английском языке в нижнем регистре в порядке их следования в течение года. ## Автор решения +Разнодумова Виктория Алексеевна ## Описание реализации From 295d525f82a907bf99724b135cfae0d4643a8c74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B8=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D1=8F=20=D0=A0?= =?UTF-8?q?=D0=B0=D0=B7=D0=BD=D0=BE=D0=B4=D1=83=D0=BC=D0=BE=D0=B2=D0=B0?= Date: Sun, 28 Apr 2024 22:50:50 +0300 Subject: [PATCH 2/4] add solution --- .idea/.gitignore | 8 +++ .idea/compiler.xml | 13 +++++ .idea/encodings.xml | 7 +++ .idea/jarRepositories.xml | 20 +++++++ .idea/misc.xml | 14 +++++ .idea/vcs.xml | 6 +++ README.md | 37 ------------- pom.xml | 27 ++++++++++ src/main/java/org/example/Main.java | 24 +++++++++ src/main/java/org/example/Months.java | 16 ++++++ src/main/java/org/example/Order.java | 50 ++++++++++++++++++ src/main/java/org/example/OrderStatuses.java | 8 +++ src/main/java/org/example/Report.java | 43 +++++++++++++++ target/classes/org/example/Main.class | Bin 0 -> 1610 bytes target/classes/org/example/Months.class | Bin 0 -> 1528 bytes target/classes/org/example/Order.class | Bin 0 -> 2376 bytes .../classes/org/example/OrderStatuses.class | Bin 0 -> 1146 bytes target/classes/org/example/Report.class | Bin 0 -> 2816 bytes 18 files changed, 236 insertions(+), 37 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/compiler.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/vcs.xml delete mode 100644 README.md create mode 100644 pom.xml create mode 100644 src/main/java/org/example/Main.java create mode 100644 src/main/java/org/example/Months.java create mode 100644 src/main/java/org/example/Order.java create mode 100644 src/main/java/org/example/OrderStatuses.java create mode 100644 src/main/java/org/example/Report.java create mode 100644 target/classes/org/example/Main.class create mode 100644 target/classes/org/example/Months.class create mode 100644 target/classes/org/example/Order.class create mode 100644 target/classes/org/example/OrderStatuses.class create mode 100644 target/classes/org/example/Report.class diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..ae5474d --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..712ab9d --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..e5d6295 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index 5114622..0000000 --- a/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# Тестовое задание для отбора на Летнюю ИТ-школу КРОК по разработке - -## Условие задания -Один развивающийся и перспективный маркетплейс активно растет в настоящее время. Текущая команда разработки вовсю занята тем, что развивает ядро системы. Помимо этого, перед CTO маркетплейса стоит задача — разработать подсистему аналитики, которая на основе накопленных данных формировала бы разнообразные отчеты и статистику. - -Вы — компания подрядчик, с которой маркетплейс заключил рамочный договор на выполнение работ по разработке этой подсистемы. В рамках первого этапа вы условились провести работы по прототипированию и определению целевого технологического стека и общих подходов к разработке. - -На одном из совещаний с Заказчиком вы определили задачу, на которой будете выполнять работы по прототипированию. В качестве такой задачи была выбрана разработка отчета о периодах наибольших трат со стороны пользователей. - -Аналитики со стороны маркетплейса предоставили небольшой срез массива данных (файл format.json) о покупках пользователей, на примере которого вы смогли бы ознакомиться с форматом входных данных. Каждая запись данного среза содержит следующую информацию: -- Идентификатор пользователя; -- Дата и время оформления заказа; -- Статус заказа; -- Сумма заказа. - -В пояснительной записке к массиву данных была уточняющая информация относительно статусов заказов: -- COMPLETED (Завершенный заказ); -- CANCELED (Отмененный заказ); -- CREATED (Созданный заказ, еще не оплаченный); -- DELIVERY (Созданный и оплаченный заказ, который доставляется). - -Необходимо разработать отчет, вычисляющий по полученному массиву данных месяц, когда пользователи тратили больше всего. Если максимальная сумма пользовательских трат была в более, чем одном месяце, отчет должен показывать все такие месяцы. В отчете должны учитываться только завершенные заказы. - -Требования к реализации: -1. Реализация должна содержать, как минимум, одну процедуру (функцию/метод), отвечающую за формирование отчета, и должна быть описана в readme.md в соответствии с чек-листом; -2. В качестве входных данных программа использует json-файл (input.json), соответствующий структуре, описанной в условиях задания; -3. Процедура (функция/метод) формирования отчета должна возвращать строку в формате json следующего формата: - - {«months»: [«march»]} - - {«months»: [«march», «december»]} -4. Найденный в соответствии с условием задачи месяц должен выводиться на английском языке в нижнем регистре. Если месяцев несколько, то на вывод они все подаются на английском языке в нижнем регистре в порядке их следования в течение года. - -## Автор решения -Разнодумова Виктория Алексеевна - -## Описание реализации - -## Инструкция по сборке и запуску решения diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..44b4d09 --- /dev/null +++ b/pom.xml @@ -0,0 +1,27 @@ + + + 4.0.0 + + org.example + test-task1 + 1.0-SNAPSHOT + + + 19 + 19 + UTF-8 + + + + + + + org.json + json + 20240303 + + + + \ No newline at end of file diff --git a/src/main/java/org/example/Main.java b/src/main/java/org/example/Main.java new file mode 100644 index 0000000..c401435 --- /dev/null +++ b/src/main/java/org/example/Main.java @@ -0,0 +1,24 @@ +package org.example; + +import org.json.*; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.List; + +public class Main { + public static void main(String[] args) { + try { + String jsonString = new String(Files.readAllBytes(Paths.get("format.json"))); + JSONArray jsonArray = new JSONArray(jsonString); + List orders = Order.parseOrders(jsonArray); + Report maxMonthReport = new Report(orders); + System.out.println(maxMonthReport.generateMaxTotalMonthReport()); + } catch (IOException e) { + System.out.println(e.getMessage()); + } catch (JSONException e) { + throw new RuntimeException(); + } + } +} \ No newline at end of file diff --git a/src/main/java/org/example/Months.java b/src/main/java/org/example/Months.java new file mode 100644 index 0000000..24c340d --- /dev/null +++ b/src/main/java/org/example/Months.java @@ -0,0 +1,16 @@ +package org.example; + +public enum Months { + JANUARY, + FEBRUARY, + MARCH, + APRIL, + MAY, + JUNE, + JULY, + AUGUST, + SEPTEMBER, + OCTOBER, + NOVEMBER, + DECEMBER; +} \ No newline at end of file diff --git a/src/main/java/org/example/Order.java b/src/main/java/org/example/Order.java new file mode 100644 index 0000000..30bf79a --- /dev/null +++ b/src/main/java/org/example/Order.java @@ -0,0 +1,50 @@ +package org.example; + +import org.json.*; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + +public class Order { + private String userId; + private LocalDate orderedAt; + private OrderStatuses status; + private double total; + + public Order(String userId, LocalDate orderedAt, OrderStatuses status, double total) { + this.userId = userId; + this.orderedAt = orderedAt; + this.status = status; + this.total = total; + } + public String getUserId() { + return userId; + } + public OrderStatuses getStatus(){ + return status; + } + public LocalDate getOrderedAt() { + return orderedAt; + } + public double getTotal() { + return total; + } + + public static List parseOrders(JSONArray jsonArray) { + List orders = new ArrayList<>(); + for (int i = 0; i < jsonArray.length(); i++) { + try { + JSONObject jsonObject = jsonArray.getJSONObject(i); + String userId = jsonObject.getString("user_id"); + LocalDate orderedAt = LocalDate.parse(jsonObject.getString("ordered_at").substring(0, 10)); + OrderStatuses status = OrderStatuses.valueOf(jsonObject.getString("status")); + double total = jsonObject.getDouble("total"); + orders.add(new Order(userId, orderedAt, status, total)); + } catch (JSONException e) { + e.printStackTrace(); + } + } + return orders; + } +} \ No newline at end of file diff --git a/src/main/java/org/example/OrderStatuses.java b/src/main/java/org/example/OrderStatuses.java new file mode 100644 index 0000000..0a49f0c --- /dev/null +++ b/src/main/java/org/example/OrderStatuses.java @@ -0,0 +1,8 @@ +package org.example; + +public enum OrderStatuses { + COMPLETED, + CANCELED, + CREATED, + DELIVERY; +} \ No newline at end of file diff --git a/src/main/java/org/example/Report.java b/src/main/java/org/example/Report.java new file mode 100644 index 0000000..5b1ed17 --- /dev/null +++ b/src/main/java/org/example/Report.java @@ -0,0 +1,43 @@ +package org.example; + +import org.json.JSONObject; + +import java.time.Month; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Report { + List orders; + public Report( List orders){ + this.orders = orders; + } + + public String generateMaxTotalMonthReport() { + Map totalForMonths = new HashMap<>(); + for (Order order : orders) { + if (order.getStatus() == OrderStatuses.COMPLETED) { + Month month = order.getOrderedAt().getMonth(); + double totalForMonth = totalForMonths.getOrDefault(month.name().toLowerCase(), 0.0); + totalForMonths.put(month.name().toLowerCase(), totalForMonth + order.getTotal()); + } + } + double maxTotal = Double.MIN_VALUE; + for (double total : totalForMonths.values()) { + maxTotal = Math.max(maxTotal, total); + } + + List maxTotalForMonths = new ArrayList<>(); + for (Months month: Months.values()){ + String monthString = month.toString().toLowerCase(); + if (totalForMonths.containsKey(monthString) && totalForMonths.get(monthString) == maxTotal){ + maxTotalForMonths.add(monthString); + } + } + + JSONObject reportJson = new JSONObject(); + reportJson.put("months", maxTotalForMonths); + return reportJson.toString(); + } +} \ No newline at end of file diff --git a/target/classes/org/example/Main.class b/target/classes/org/example/Main.class new file mode 100644 index 0000000000000000000000000000000000000000..26750e0cddcc118d3a88a30cf6c33087802e52c6 GIT binary patch literal 1610 zcmZux?^hc|6um|ci)@&@AcpR0C!oak);if=;dT&D~drKhUdbO<1Df_%!+*)E{B z@^c36bQQftE2*aI`6lL()`~K8p{uC3D^nT50u~M2v#^A0w16iqUo}_^x6NWqhAy*E z+pMe4awyrL&GY!g!hL)yaI2;qSC*%I1%`$TBQl&Lej!2CFFqOWptt-q%cUS0@M(FA7`X?}?BZAhW#n&|oPpPZh ziW0^`fL`?lMjP@tTBeB1uy_}E_u(j=_u`mhdMv$)kr*XO?oU%)UA`|TgT@A zr*k!;DL5CoHKLD{eOdjjAe&vM&9d9}s!AVj8lx><(vIOa9`h>GzdrB)V}Q>m9A)_y zeD~k&K)ei=pYo}f0TbWwX@voJhE0x!@EqTAhMUC{;)DW9=P-5?L$Oyd&M-F(y$(KFiT{PWH{+-H_!OW0iJ3fy3#Z5hBa53J?RK#7@5?~! zGFI5uz%sel$fcFtrygJgNsMBa_vakOu!wQSq!^t*4inUt;*KQsPU1UE1z9}f{gvc> zlShH-XL(0$p-7fF#%wbxMwDTcP$o}~neX6x#%*GdUzNat5`MssR? literal 0 HcmV?d00001 diff --git a/target/classes/org/example/Months.class b/target/classes/org/example/Months.class new file mode 100644 index 0000000000000000000000000000000000000000..5015a646a4b6aa467e0d8892ded379dc03f713fd GIT binary patch literal 1528 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 literal 0 HcmV?d00001 From 6a493dc6f934b23675a6ee59fc2976a3b4e3405c Mon Sep 17 00:00:00 2001 From: victoriaraznodumova <90800890+victoriaraznodumova@users.noreply.github.com> Date: Sun, 28 Apr 2024 22:53:10 +0300 Subject: [PATCH 3/4] add solution --- target/classes/org/example/Main.class | Bin 1610 -> 0 bytes target/classes/org/example/Months.class | Bin 1528 -> 0 bytes target/classes/org/example/Order.class | Bin 2376 -> 0 bytes target/classes/org/example/OrderStatuses.class | Bin 1146 -> 0 bytes target/classes/org/example/Report.class | Bin 2816 -> 0 bytes 5 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 target/classes/org/example/Main.class delete mode 100644 target/classes/org/example/Months.class delete mode 100644 target/classes/org/example/Order.class delete mode 100644 target/classes/org/example/OrderStatuses.class delete mode 100644 target/classes/org/example/Report.class diff --git a/target/classes/org/example/Main.class b/target/classes/org/example/Main.class deleted file mode 100644 index 26750e0cddcc118d3a88a30cf6c33087802e52c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1610 zcmZux?^hc|6um|ci)@&@AcpR0C!oak);if=;dT&D~drKhUdbO<1Df_%!+*)E{B z@^c36bQQftE2*aI`6lL()`~K8p{uC3D^nT50u~M2v#^A0w16iqUo}_^x6NWqhAy*E z+pMe4awyrL&GY!g!hL)yaI2;qSC*%I1%`$TBQl&Lej!2CFFqOWptt-q%cUS0@M(FA7`X?}?BZAhW#n&|oPpPZh ziW0^`fL`?lMjP@tTBeB1uy_}E_u(j=_u`mhdMv$)kr*XO?oU%)UA`|TgT@A zr*k!;DL5CoHKLD{eOdjjAe&vM&9d9}s!AVj8lx><(vIOa9`h>GzdrB)V}Q>m9A)_y zeD~k&K)ei=pYo}f0TbWwX@voJhE0x!@EqTAhMUC{;)DW9=P-5?L$Oyd&M-F(y$(KFiT{PWH{+-H_!OW0iJ3fy3#Z5hBa53J?RK#7@5?~! zGFI5uz%sel$fcFtrygJgNsMBa_vakOu!wQSq!^t*4inUt;*KQsPU1UE1z9}f{gvc> zlShH-XL(0$p-7fF#%wbxMwDTcP$o}~neX6x#%*GdUzNat5`MssR? diff --git a/target/classes/org/example/Months.class b/target/classes/org/example/Months.class deleted file mode 100644 index 5015a646a4b6aa467e0d8892ded379dc03f713fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1528 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 From e3e0949d4bafeb9545be9d9b0522d7bbccdbe49c Mon Sep 17 00:00:00 2001 From: victoriaraznodumova <90800890+victoriaraznodumova@users.noreply.github.com> Date: Sun, 28 Apr 2024 23:44:31 +0300 Subject: [PATCH 4/4] Update README.md --- README.md | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..7b2cd64 --- /dev/null +++ b/README.md @@ -0,0 +1,48 @@ +# Тестовое задание для отбора на Летнюю ИТ-школу КРОК по разработке + +## Условие задания +Один развивающийся и перспективный маркетплейс активно растет в настоящее время. Текущая команда разработки вовсю занята тем, что развивает ядро системы. Помимо этого, перед CTO маркетплейса стоит задача — разработать подсистему аналитики, которая на основе накопленных данных формировала бы разнообразные отчеты и статистику. + +Вы — компания подрядчик, с которой маркетплейс заключил рамочный договор на выполнение работ по разработке этой подсистемы. В рамках первого этапа вы условились провести работы по прототипированию и определению целевого технологического стека и общих подходов к разработке. + +На одном из совещаний с Заказчиком вы определили задачу, на которой будете выполнять работы по прототипированию. В качестве такой задачи была выбрана разработка отчета о периодах наибольших трат со стороны пользователей. + +Аналитики со стороны маркетплейса предоставили небольшой срез массива данных (файл format.json) о покупках пользователей, на примере которого вы смогли бы ознакомиться с форматом входных данных. Каждая запись данного среза содержит следующую информацию: +- Идентификатор пользователя; +- Дата и время оформления заказа; +- Статус заказа; +- Сумма заказа. + +В пояснительной записке к массиву данных была уточняющая информация относительно статусов заказов: +- COMPLETED (Завершенный заказ); +- CANCELED (Отмененный заказ); +- CREATED (Созданный заказ, еще не оплаченный); +- DELIVERY (Созданный и оплаченный заказ, который доставляется). + +Необходимо разработать отчет, вычисляющий по полученному массиву данных месяц, когда пользователи тратили больше всего. Если максимальная сумма пользовательских трат была в более, чем одном месяце, отчет должен показывать все такие месяцы. В отчете должны учитываться только завершенные заказы. + +Требования к реализации: +1. Реализация должна содержать, как минимум, одну процедуру (функцию/метод), отвечающую за формирование отчета, и должна быть описана в readme.md в соответствии с чек-листом; +2. В качестве входных данных программа использует json-файл (input.json), соответствующий структуре, описанной в условиях задания; +3. Процедура (функция/метод) формирования отчета должна возвращать строку в формате json следующего формата: + - {«months»: [«march»]} + - {«months»: [«march», «december»]} +4. Найденный в соответствии с условием задачи месяц должен выводиться на английском языке в нижнем регистре. Если месяцев несколько, то на вывод они все подаются на английском языке в нижнем регистре в порядке их следования в течение года. + +## Автор решения +Разнодумова Виктория Алексеевна + +## Описание реализации +1. Проект содержит 3 класса (Main - для запуска приложения, Report - для генерации отчетов и работы с ними, Order - для хранения и парсинга заказов) и 2 перечисления (OrderStatuses - для хранения состояний заказов, Months - для обработки месяцев). +2. В начале работы программа считывает содержимое файла format.json и преобразует его в массив JSON, который передается в статический метод parseOrders() класса Order, который хранит данные каждого заказа после парсинга. Метод parseOrders() принимает массив JSON, и для каждого его объекта преобразует поля в удобный для работы формат. Поле status хранится в виде перечислений OrderStatuses. Метод возвращает список типа Order. +3. Создаём новый отчёт - объект класса Report для поиска месяца с наибольшими тратами. Для формирования отчёта используется функция generateMaxTotalMonthReport(), возвращающая строку в формате JSON. +4. Внутри функции создаётся словарь totalForMonths, который будет хранить месяц и сумму заказов. Затем начинаем итерироваться по всем заказам из нашего списка заказов и выполняем проверку на статус. Если он соответствует COMPLETED, то для него получаем месяц. Далее проверяем, был ли месяц уже добавлен в наш словарь. Если да, то для суммарного значения переменной double totalForMonth берём уже записанное в словарь значение, в противном случае присваиваем переменной 0.0. В результате обновляем наш словарь: добавляем в него пару ключу - текущий месяц, значение - старое значение totalForMonth из словаря плюс поле total текущего объекта Order, которое получаем с помощью гетэра. +5. Далее выполняется поиск максимального значения суммы total. Проходимся по всем значениям из словаря totalForMonths и сравниваем их с максимальным maxTotal, который проинициализирован значением Double.MIN_VALUE. Таким образом получаем максимальное значение. +6. Создаём список всех месяцев maxTotalForMonths, для которых сумма оказалась равна найденному maxTotal. Если найдено несколько месяцев, то необходимо обеспечить вывод в порядке их следования в течение года. Для этого проходим по значениям перечисления Months и проверяем, была ли в указанный месяц максимальная сумма. Если да, то преобразуем значение из Months в строку и добавляем в список. +7. В конце создаём объект JSON и добавляем в него найденные значения. Таким образом, функция generateMaxTotalMonthReport() возвращает строку в формате JSON, которая в классе Main выводится на экран. +## Инструкция по сборке и запуску решения +Для запуска необходим maven-сборщик с официального сайта. +1. В командной строке необходимо прописать команду для копирования репозитория: git clone https://github.com/victoriaraznodumova/school2024-test-task1.git +2. В корневой директории проекта нужно прописать команду для сборки проекта: mvn clean package +3. Команда для запуска приложения: mvn exec:java +