From 501c2d37c1cca58890b865c42262b75c4b1a422e Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 28 May 2016 22:50:48 +0300 Subject: [PATCH] =?UTF-8?q?=D0=91=D0=B0=D0=B7=D0=BE=D0=B2=D1=8B=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/dmitriymx/astralcheckreport/Main.java | 85 +++++++++++++++++-- 1 file changed, 80 insertions(+), 5 deletions(-) diff --git a/src/main/java/ru/dmitriymx/astralcheckreport/Main.java b/src/main/java/ru/dmitriymx/astralcheckreport/Main.java index 0d79d51..76c1c97 100644 --- a/src/main/java/ru/dmitriymx/astralcheckreport/Main.java +++ b/src/main/java/ru/dmitriymx/astralcheckreport/Main.java @@ -82,11 +82,6 @@ public class Main implements Runnable { ExcelDataRow data; while( !Thread.currentThread().isInterrupted() && ((data = nextData()) != null) ) { - if (!data.tarif.equalsIgnoreCase("Акция 3 месяца") && - !data.tarif.equalsIgnoreCase("Группа компаний") && - !data.tarif.equalsIgnoreCase("Оптимальный, 4 направ.")) - continue; //FIXME - logger.info("Проверяю {} / {} ...", data.inn, data.kpp); logger.debug("data = {}", data); Organization organization = astral.getOrganization(data.inn, data.kpp); @@ -106,6 +101,12 @@ public class Main implements Runnable { else if (data.tarif.equalsIgnoreCase("Оптимальный, 4 направ.")) { tarif_Optimalniy(astral, organization, data); } + else if (data.tarif.equalsIgnoreCase("Базовый, 2 направ.")) { + tarif_Basic(astral, organization, data); + } + else { + logger.info("Не задана логика для тарифа: \"{}\"", data.tarif); + } safeSleep(sleepThread); } @@ -232,6 +233,37 @@ public class Main implements Runnable { } } + // Тариф: Базовый, 2 направ. + private void tarif_Basic(AstralSession astral, Organization organization, ExcelDataRow data) { + // Step 0: Количество доступных продуктов + if (organization.products.size() == 0) { + logger.warn("({}/{}): Нет доступных продуктов!", organization.inn, organization.kpp); + return; + } + + // Step I: Проверяем разницу дат. + // Сертификат должен быть выдан в тот же день или позже, чем тариф + Product product = organization.products.get(0); + Tarif tarif = product.contractTariffs.get(0); + if (product.certs.size() > 1) { + logger.warn("({}/{}): Обнаружено более 1 сертификата!", organization.inn, organization.kpp); + } + Cert cert = product.certs.get(0); + + long tarifDateLong = tarif.date_initialDate.getTime(); + long certDateLong = cert.startCertDate.getTime(); + + if (certDateLong < tarifDateLong) { + logger.error("({}/{}): Ошибка: сертификат выдан раньше тарифа!", organization.inn, organization.kpp); + return; + } + + // Step II: Проверяем кол-во Направлений + if (!calcRecipients2(product, data)) { //TODO надо проверять по категориям + logger.warn("({}/{}): Внимание! Не соответствие количества направлений!", organization.inn, organization.kpp); + } + } + private boolean calcRecipients(Product product, ExcelDataRow data) { int countFNS = 0, countFSS = 0, @@ -274,4 +306,47 @@ public class Main implements Runnable { return boolFNS && boolFSS && boolRosstat && boolPFR && boolRosalco && boolRPN; } + + private boolean calcRecipients2(Product product, ExcelDataRow data) { + int countFNS = 0, + countFSS = 0, + countRosstat = 0, + countPFR = 0, + countRosalco = 0, + countRPN = 0; + + for (Recipient recipient : product.recipients) { + switch (recipient.protocolId) { + case 12: + case 10: break; + case 6: + case 13: + countFNS += recipient.kpp.size(); + break; + case 5: countFSS++; break; + case 4: countRosstat++; break; + case 2: countPFR++; break; + case 9: countRosalco++; break; + case 15: countRPN++; break; + default: logger.warn("Не известный тип Направления: {}/{}/{}", recipient.protocolId, recipient.code, recipient.name); + } + } + + boolean boolFNS = (countFNS == 0 || countFNS == 1 + data.addonKpp); + if (countFNS == 0 && data.addonKpp > 0) { + logger.warn("({}/{}): Внимание! Странное значение ФНС/Доп.КПП", data.inn, data.kpp); + } + boolean boolFSS = (countFSS == 0 || countFSS == 1); + boolean boolRosstat = (countRosstat == 0 || countRosstat == 1); + boolean boolPFR = (countPFR == 0 || countPFR == 1); + + if (countFNS + countFSS + countRosstat + countPFR + data.addonKpp > 2 + data.addonKpp + data.addonNaprov) { + return false; + } + + boolean boolRosalco = (countRosalco == 0 || countRosalco == 1); + boolean boolRPN = (countRPN == 0 || countRPN == 1); + + return boolFNS && boolFSS && boolRosstat && boolPFR && boolRosalco && boolRPN; + } }