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