From b8ab6464badf8b6e60d1e25d0d4b6a9fdea64629 Mon Sep 17 00:00:00 2001 From: Poddubniy Sergey Date: Thu, 31 Mar 2022 21:55:02 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=20?= =?UTF-8?q?=D0=BD=D0=B5=D0=BA=D0=BE=D1=80=D1=80=D0=B5=D0=BA=D1=82=D0=BD?= =?UTF-8?q?=D1=8B=D0=B9=20=D0=BF=D1=83=D1=82=D1=8C=20=D0=BA=20=D1=84=D0=B0?= =?UTF-8?q?=D0=B9=D0=BB=D1=83=20=D0=B2=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81?= =?UTF-8?q?=D0=B5=20ServiceReader=20=D0=A2=D0=B8=D0=BF=20Double=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=20=D0=BD=D0=B0=20BigDecima?= =?UTF-8?q?l=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=20=D1=84?= =?UTF-8?q?=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=BE=D0=BD=D0=B0=D0=BB=20=D1=81?= =?UTF-8?q?=D0=BE=D0=B3=D0=BB=D0=B0=D1=81=D0=BD=D0=BE=20=D0=B7=D0=B0=D0=B4?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8E:=20=D0=BF=D0=BE=D0=B4=D1=81=D1=87?= =?UTF-8?q?=D0=B5=D1=82=20=D0=BC=D0=B8=D0=BD=D0=B8=D0=BC=D0=B0=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D0=BE=D0=B9=20=D0=BF=D1=80=D0=B8=D0=B1=D1=8B=D0=BB=D0=B8?= =?UTF-8?q?=20=D0=BF=D0=BE=20=D1=82=D0=BE=D0=B2=D0=B0=D1=80=D1=83=20=D0=B8?= =?UTF-8?q?=20=D1=83=D1=81=D0=BB=D1=83=D0=B3=D0=B5,=20=D1=81=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D0=BA=D0=B0=20=D0=BF=D1=80=D0=B8=D0=B1=D1=8B=D0=BB=D0=B8?= =?UTF-8?q?=20=D0=BF=D0=BE=20=D1=82=D0=BE=D0=B2=D0=B0=D1=80=D0=B0=D0=BC=20?= =?UTF-8?q?=D0=B8=20=D1=83=D1=81=D0=BB=D1=83=D0=B3=D0=B0=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/comparators/ItemsComparator.java | 23 ++++++ .../java/comparators/ServicesComparator.java | 21 +++++ src/main/java/ru/leroymerlin/BillingMenu.java | 76 ++++++++++++++++++- src/main/java/ru/leroymerlin/Main.java | 7 +- src/main/java/ru/leroymerlin/data/Item.java | 12 +-- .../java/ru/leroymerlin/data/Revenue.java | 8 +- .../java/ru/leroymerlin/data/Service.java | 12 +-- .../ru/leroymerlin/reader/ItemReader.java | 6 +- .../ru/leroymerlin/reader/RevenueReader.java | 5 +- .../ru/leroymerlin/reader/ServiceReader.java | 9 ++- 10 files changed, 156 insertions(+), 23 deletions(-) create mode 100644 src/main/java/comparators/ItemsComparator.java create mode 100644 src/main/java/comparators/ServicesComparator.java diff --git a/src/main/java/comparators/ItemsComparator.java b/src/main/java/comparators/ItemsComparator.java new file mode 100644 index 0000000..0876de2 --- /dev/null +++ b/src/main/java/comparators/ItemsComparator.java @@ -0,0 +1,23 @@ +package comparators; + +import ru.leroymerlin.data.Item; + +import java.math.BigDecimal; +import java.util.Comparator; + +public class ItemsComparator implements Comparator { + @Override + public int compare(Item item1, Item item2) { + BigDecimal bigDecimal1 = + item1.getSum() + .multiply(BigDecimal.valueOf(item1.getQuantity())) + .multiply(item1.getCommission()) + .multiply(BigDecimal.valueOf(100)); + BigDecimal bigDecimal2 = + item2.getSum() + .multiply(BigDecimal.valueOf(item2.getQuantity())) + .multiply(item2.getCommission()) + .multiply(BigDecimal.valueOf(100)); + return bigDecimal1.intValue() - bigDecimal2.intValue(); + } +} diff --git a/src/main/java/comparators/ServicesComparator.java b/src/main/java/comparators/ServicesComparator.java new file mode 100644 index 0000000..d390fbf --- /dev/null +++ b/src/main/java/comparators/ServicesComparator.java @@ -0,0 +1,21 @@ +package comparators; + +import ru.leroymerlin.data.Service; + +import java.math.BigDecimal; +import java.util.Comparator; + +public class ServicesComparator implements Comparator { + @Override + public int compare(Service service1, Service service2) { + BigDecimal bigDecimal1 = + service1.getSum() + .multiply(service1.getCommission()) + .multiply(BigDecimal.valueOf(100)); + BigDecimal bigDecimal2 = + service2.getSum() + .multiply(service2.getCommission()) + .multiply(BigDecimal.valueOf(100)); + return bigDecimal1.intValue() - bigDecimal2.intValue(); + } +} diff --git a/src/main/java/ru/leroymerlin/BillingMenu.java b/src/main/java/ru/leroymerlin/BillingMenu.java index 15e33d7..557a088 100644 --- a/src/main/java/ru/leroymerlin/BillingMenu.java +++ b/src/main/java/ru/leroymerlin/BillingMenu.java @@ -1,10 +1,25 @@ package ru.leroymerlin; +import comparators.ItemsComparator; +import comparators.ServicesComparator; +import ru.leroymerlin.data.Item; +import ru.leroymerlin.data.Service; +import ru.leroymerlin.protocol.ReportType; +import ru.leroymerlin.reader.ItemReader; +import ru.leroymerlin.reader.RevenueReader; +import ru.leroymerlin.reader.ServiceReader; + +import java.io.IOException; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.net.URISyntaxException; +import java.util.Map; +import java.util.Optional; import java.util.Scanner; public class BillingMenu { - public static void greeting() { + public static void greeting() throws URISyntaxException, IOException { System.out.println("Приветствуем в билинговой системе! Что вам требуется?"); BillingMenu.print(); @@ -21,10 +36,67 @@ public static void greeting() { } case "1": { // todo: ваша реализация тут + Optional itemMin = ItemReader.getItems().stream().min(new ItemsComparator()); + if (itemMin.isPresent()) { + BigDecimal itemMinRevenue = + itemMin.get().getSum() + .multiply(BigDecimal.valueOf(itemMin.get().getQuantity())) + .multiply(itemMin.get().getCommission()) + .divide(BigDecimal.valueOf(100), RoundingMode.HALF_UP) + .setScale(2, RoundingMode.HALF_UP); + System.out.println( + "Минимальная выручка <" + itemMinRevenue + + "> по товару <" + itemMin.get().getItemName() + + ">, с комиссией <" + itemMin.get().getCommission() + ">"); + } + Optional serviceMin = ServiceReader.getServices().stream().min(new ServicesComparator()); + if (serviceMin.isPresent()) { + BigDecimal serviceMinRevenue = + serviceMin.get().getSum() + .multiply(serviceMin.get().getCommission()) + .divide(BigDecimal.valueOf(100), RoundingMode.HALF_UP) + .setScale(2, RoundingMode.HALF_UP); + System.out.println( + "Минимальная выручка <" + serviceMinRevenue + + "> по услуге <" + serviceMin.get().getItemName() + + ">, с комиссией <" + serviceMin.get().getCommission() + ">"); + } break; } case "2": { // todo: ваша реализация тут + Map revenue = RevenueReader.getRevenue(); + Optional itemsRevenueOptional = ItemReader.getItems().stream() + .map(item -> + item.getSum() + .multiply(item.getCommission()) + .multiply(BigDecimal.valueOf(item.getQuantity())) + .divide(BigDecimal.valueOf(100), RoundingMode.HALF_UP)) + .reduce(BigDecimal::add); + if (itemsRevenueOptional.isPresent()) { + BigDecimal itemsRevenue = itemsRevenueOptional.get(); + if (itemsRevenue.compareTo(revenue.get(ReportType.ITEM)) != 0) { + System.out.println( + "Выручка по товарам <" + itemsRevenue.setScale(2, RoundingMode.HALF_UP) + + "> не совпадает с выручкой из отчета <" + revenue.get(ReportType.ITEM) + ">" + ); + } + } + Optional serviceRevenueOptional = ServiceReader.getServices().stream() + .map(service -> + service.getSum() + .multiply(service.getCommission()) + .divide(BigDecimal.valueOf(100), RoundingMode.HALF_UP)) + .reduce(BigDecimal::add); + if (serviceRevenueOptional.isPresent()) { + BigDecimal servicesRevenue = serviceRevenueOptional.get(); + if (servicesRevenue.compareTo(revenue.get(ReportType.SERVICE)) != 0) { + System.out.println( + "Выручка по услугам <" + servicesRevenue + + "> не совпадает с выручкой из отчета <" + revenue.get(ReportType.SERVICE) + ">" + ); + } + } break; } default: { @@ -40,4 +112,4 @@ private static void print() { System.out.println("2 - Сверка прибыли по услугам и товарам"); System.out.println("Для завершения работы, нажмите 'q'"); } -} +} \ No newline at end of file diff --git a/src/main/java/ru/leroymerlin/Main.java b/src/main/java/ru/leroymerlin/Main.java index 8bb044b..27b4bc5 100644 --- a/src/main/java/ru/leroymerlin/Main.java +++ b/src/main/java/ru/leroymerlin/Main.java @@ -1,8 +1,11 @@ package ru.leroymerlin; +import java.io.IOException; +import java.net.URISyntaxException; + public class Main { - public static void main(String[] args) { + public static void main(String[] args) throws URISyntaxException, IOException { BillingMenu.greeting(); } -} +} \ No newline at end of file diff --git a/src/main/java/ru/leroymerlin/data/Item.java b/src/main/java/ru/leroymerlin/data/Item.java index 8f2c256..392c64a 100644 --- a/src/main/java/ru/leroymerlin/data/Item.java +++ b/src/main/java/ru/leroymerlin/data/Item.java @@ -1,12 +1,14 @@ package ru.leroymerlin.data; +import java.math.BigDecimal; + public class Item { private final String itemName; - private final Double sum; + private final BigDecimal sum; private final Integer quantity; - private final Double commission; + private final BigDecimal commission; - public Item(String itemName, Double sum, Integer quantity, Double commission) { + public Item(String itemName, BigDecimal sum, Integer quantity, BigDecimal commission) { this.quantity = quantity; this.itemName = itemName; this.sum = sum; @@ -32,11 +34,11 @@ public String getItemName() { return itemName; } - public Double getSum() { + public BigDecimal getSum() { return sum; } - public Double getCommission() { + public BigDecimal getCommission() { return commission; } //endregion diff --git a/src/main/java/ru/leroymerlin/data/Revenue.java b/src/main/java/ru/leroymerlin/data/Revenue.java index 6aacf49..f0c8abd 100644 --- a/src/main/java/ru/leroymerlin/data/Revenue.java +++ b/src/main/java/ru/leroymerlin/data/Revenue.java @@ -2,11 +2,13 @@ import ru.leroymerlin.protocol.ReportType; +import java.math.BigDecimal; + public class Revenue { private final ReportType reportType; - private final Double profit; + private final BigDecimal profit; - public Revenue(ReportType reportType, Double profit) { + public Revenue(ReportType reportType, BigDecimal profit) { this.reportType = reportType; this.profit = profit; } @@ -24,7 +26,7 @@ public ReportType getReportType() { return reportType; } - public Double getProfit() { + public BigDecimal getProfit() { return profit; } //endregion diff --git a/src/main/java/ru/leroymerlin/data/Service.java b/src/main/java/ru/leroymerlin/data/Service.java index db32ea4..52f5ec5 100644 --- a/src/main/java/ru/leroymerlin/data/Service.java +++ b/src/main/java/ru/leroymerlin/data/Service.java @@ -1,11 +1,13 @@ package ru.leroymerlin.data; +import java.math.BigDecimal; + public class Service { private final String itemName; - private final Double sum; - private final Double commission; + private final BigDecimal sum; + private final BigDecimal commission; - public Service(String itemName, Double sum, Double commission) { + public Service(String itemName, BigDecimal sum, BigDecimal commission) { this.itemName = itemName; this.sum = sum; this.commission = commission; @@ -25,11 +27,11 @@ public String getItemName() { return itemName; } - public Double getSum() { + public BigDecimal getSum() { return sum; } - public Double getCommission() { + public BigDecimal getCommission() { return commission; } //endregion diff --git a/src/main/java/ru/leroymerlin/reader/ItemReader.java b/src/main/java/ru/leroymerlin/reader/ItemReader.java index 2a5c767..0110763 100644 --- a/src/main/java/ru/leroymerlin/reader/ItemReader.java +++ b/src/main/java/ru/leroymerlin/reader/ItemReader.java @@ -4,6 +4,7 @@ import ru.leroymerlin.data.Item; import java.io.IOException; +import java.math.BigDecimal; import java.net.URISyntaxException; import java.util.List; import java.util.stream.Collectors; @@ -14,7 +15,10 @@ public static List getItems() throws URISyntaxException, IOException { return content.stream().skip(1).limit(content.size()) .map(it -> it.split(",")) - .map(it -> new Item(it[0], Double.valueOf(it[1]), Integer.valueOf(it[2]), Double.valueOf(it[3]))) + .map(it -> new Item(it[0] + , BigDecimal.valueOf(Double.parseDouble(it[1])) + , Integer.valueOf(it[2]) + , BigDecimal.valueOf(Double.parseDouble(it[3])))) .collect(Collectors.toList()); } } diff --git a/src/main/java/ru/leroymerlin/reader/RevenueReader.java b/src/main/java/ru/leroymerlin/reader/RevenueReader.java index 3c563c0..a957382 100644 --- a/src/main/java/ru/leroymerlin/reader/RevenueReader.java +++ b/src/main/java/ru/leroymerlin/reader/RevenueReader.java @@ -5,18 +5,19 @@ import ru.leroymerlin.protocol.ReportType; import java.io.IOException; +import java.math.BigDecimal; import java.net.URISyntaxException; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class RevenueReader { - public static Map getRevenue() throws URISyntaxException, IOException { + public static Map getRevenue() throws URISyntaxException, IOException { List content = FileResourceUtil.getContentFromFile("billing/revenue.csv"); return content.stream().skip(1) .map(it -> it.split(",")) - .map(it -> new Revenue(ReportType.valueOf(it[0]), Double.valueOf(it[1]))) + .map(it -> new Revenue(ReportType.valueOf(it[0]), BigDecimal.valueOf(Double.parseDouble(it[1])))) .collect(Collectors.toMap(Revenue::getReportType, Revenue::getProfit)); } } diff --git a/src/main/java/ru/leroymerlin/reader/ServiceReader.java b/src/main/java/ru/leroymerlin/reader/ServiceReader.java index cbc3122..6f5b37f 100644 --- a/src/main/java/ru/leroymerlin/reader/ServiceReader.java +++ b/src/main/java/ru/leroymerlin/reader/ServiceReader.java @@ -4,17 +4,20 @@ import ru.leroymerlin.data.Service; import java.io.IOException; +import java.math.BigDecimal; import java.net.URISyntaxException; import java.util.List; import java.util.stream.Collectors; public class ServiceReader { public static List getServices() throws URISyntaxException, IOException { - List content = FileResourceUtil.getContentFromFile("billing/reconciliation.csv"); + List content = FileResourceUtil.getContentFromFile("reports/services.csv"); return content.stream().skip(1) .map(it -> it.split(",")) - .map(it -> new Service(it[0], Double.valueOf(it[1]), Double.valueOf(it[2]))) + .map(it -> new Service(it[0] + , BigDecimal.valueOf(Double.parseDouble(it[1])) + , BigDecimal.valueOf(Double.parseDouble(it[2])))) .collect(Collectors.toList()); } -} +} \ No newline at end of file