/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * Copyright (c) 2013, MPL CodeInside http://codeinside.ru */ package ru.codeinside.gws3457c; import org.xml.sax.SAXException; import ru.codeinside.gws.api.*; import ru.socit.pfr.service.data.Properties; import ru.socit.pfr.service.data.Property; import ru.socit.pfr.service.data.Type; import ru.tower.mvd.clients.pf.request.BaseHeaderType; import ru.tower.mvd.clients.pf.request.Message; import ru.tower.mvd.clients.pf.requestid.HeaderType; import ru.tower.mvd.response.addpayment.ResponseAdditionalPaymentRequest; import javax.xml.bind.JAXBException; import javax.xml.datatype.DatatypeConfigurationException; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; import java.io.UnsupportedEncodingException; import java.math.BigInteger; import java.net.URL; import java.text.DateFormat; import java.text.DecimalFormat; import java.text.NumberFormat; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; import java.util.GregorianCalendar; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; public class MvdClient3457 implements Client { public static final String SMEV_REQUEST_ID = "smevQRYNMB"; public static final String INITIAL_REG_NUMBER = "INITIAL_REG_NUMBER"; private static final String INITIAL_REG_DATE = "INITIAL_REG_DATE"; private Logger logger = Logger.getLogger(getClass().getName()); @Override public Revision getRevision() { return ru.codeinside.gws.api.Revision.rev111111; // todo chek it!!! } @Override public URL getWsdlUrl() { return getClass().getClassLoader().getResource("gws3457/PFService.wsdl"); } @Override public ClientRequest createClientRequest(ExchangeContext ctx) { final String originRequestId = (String) ctx.getVariable("smevOriginRequestId"); final String requestId = (String) ctx.getVariable("smevRequestId"); final Boolean smevPool = (Boolean) ctx.getVariable("smevPool"); final Packet packet = new Packet(); packet.recipient = new InfoSystem("MVDR01001", "МВД России"); packet.typeCode = Packet.Type.SERVICE; packet.date = new Date(); packet.exchangeType = "2"; packet.originRequestIdRef = originRequestId; packet.testMsg = (String) ctx.getVariable("smevTest"); packet.serviceCode = "12345678901"; final ClientRequest request = new ClientRequest(); request.packet = packet; if (Boolean.TRUE == smevPool) { packet.status = Packet.Status.PING; packet.requestIdRef = requestId; request.action = new QName("http://tower.ru/mvd/clients/pf", "getPFResponse"); request.appData = createAppDataForPing(ctx); BigInteger caseNumber = (BigInteger) ctx.getVariable(INITIAL_REG_NUMBER); packet.caseNumber = caseNumber.toString(); } else { BigInteger caseNumber = generateCaseNumber(); ctx.setVariable(INITIAL_REG_NUMBER, caseNumber); ctx.setVariable(INITIAL_REG_DATE, new Date()); packet.status = Packet.Status.REQUEST; request.appData = createAppDataForFirstRequest(ctx); request.action = new QName("http://tower.ru/mvd/clients/pf", "sendPFRequest"); packet.caseNumber = caseNumber.toString(); } return request; } private String createAppDataForPing(ExchangeContext ctx) { ru.tower.mvd.clients.pf.requestid.Message message = new ru.tower.mvd.clients.pf.requestid.Message(); message.setType(Type.REQUEST); HeaderType header = new HeaderType(); header.setMsgType("REQUEST_ID"); String msgVid = (String) ctx.getVariable("MsgVid"); header.setMsgVid(msgVid); header.setFromFoivId("PNZR01581"); header.setFromFoivName("Комплексная система предоставления государственных и муниципальных услуг Пензенской области"); header.setFromSystemId("PNZR01581"); header.setFromSystem("Комплексная система предоставления государственных и муниципальных услуг Пензенской области"); header.setToFoivId("MVDR01001"); header.setToFoivName("МВД России"); header.setToSystem("АИС МВД"); // нет ничего в документации header.setToSystemId("8"); // нет ничего в документации header.setReason("12345678908"); ru.tower.mvd.clients.pf.requestid.BaseHeaderType.Service service = new ru.tower.mvd.clients.pf.requestid.BaseHeaderType.Service(); service.setCode(8); // В документации предписано указывать только это значение service.setName("Pension"); // В документации предписано указывать только это значение service.setValue("Сведения о пенсиях и выплатах"); header.setService(service); ru.tower.mvd.clients.pf.requestid.BaseHeaderType.InitialRegNumber initialRegNumber = new ru.tower.mvd.clients.pf.requestid.BaseHeaderType.InitialRegNumber(); initialRegNumber.setValue((BigInteger) ctx.getVariable(INITIAL_REG_NUMBER)); initialRegNumber.setRegtime(getXMLDate((Date) ctx.getVariable(INITIAL_REG_DATE))); header.setInitialRegNumber(initialRegNumber); ru.tower.mvd.clients.pf.requestid.BaseHeaderType.Originator originator = new ru.tower.mvd.clients.pf.requestid.BaseHeaderType.Originator(); originator.setCode("PNZR01581"/*(String) ctx.getVariable("OriginatorCode")*/); originator.setFio((String) ctx.getVariable("OriginatorFio")); originator.setName("Комплексная система предоставления государственных и муниципальных услуг Пензенской области"/*(String) ctx.getVariable("OriginatorName")*/); originator.setRegion((String) ctx.getVariable("OriginatorRegion")); // Принимает значение первых 3 цифр из справочника КЛАДР header.setOriginator(originator); HeaderType.RegNumber regNumber = new HeaderType.RegNumber(); String smevRequestId = (String) ctx.getVariable(SMEV_REQUEST_ID); regNumber.setValue(new BigInteger(smevRequestId)); regNumber.setRegtime(getXMLDate((Date) ctx.getVariable(INITIAL_REG_DATE))); header.setRegNumber(regNumber); message.setHeader(header); Properties properties = new Properties(); properties.getProperty().add(createProperty("QRYNMB", smevRequestId)); message.setProperties(properties); message.setType(Type.REQUEST); return new XmlTypes(ru.tower.mvd.clients.pf.requestid.Message.class).toXml(message); } private String createAppDataForFirstRequest(ExchangeContext ctx) { BaseHeaderType header = new BaseHeaderType(); header.setMsgType("REQUEST"); String msgVid = (String) ctx.getVariable("MsgVid"); header.setMsgVid(msgVid); header.setFromFoivId("PNZR01581"); header.setFromFoivName("Комплексная система предоставления государственных и муниципальных услуг Пензенской области"); header.setFromSystemId("PNZR01581"); header.setFromSystem("Комплексная система предоставления государственных и муниципальных услуг Пензенской области"); header.setToFoivId("MVDR01001"); header.setToFoivName("МВД России"); header.setToSystem("АИС МВД"); // нет ничего в документации header.setToSystemId("8"); // нет ничего в документации header.setReason("12345678908"); BaseHeaderType.InitialRegNumber initialRegNumber = new BaseHeaderType.InitialRegNumber(); initialRegNumber.setValue((BigInteger) ctx.getVariable(INITIAL_REG_NUMBER)); initialRegNumber.setRegtime(getXMLDate((Date) ctx.getVariable(INITIAL_REG_DATE))); header.setInitialRegNumber(initialRegNumber); BaseHeaderType.Service service = new BaseHeaderType.Service(); service.setCode(8); // В документации предписано указывать только это значение service.setName("Pension"); // В документации предписано указывать только это значение service.setValue("Сведения о пенсиях и выплатах"); header.setService(service); BaseHeaderType.Originator originator = new BaseHeaderType.Originator(); originator.setCode("PNZR01581"/*(String) ctx.getVariable("OriginatorCode")*/); originator.setFio((String) ctx.getVariable("OriginatorFio")); originator.setName("Комплексная система предоставления государственных и муниципальных услуг Пензенской области"/*(String) ctx.getVariable("OriginatorName")*/); originator.setRegion((String) ctx.getVariable("OriginatorRegion")); // Принимает значение первых 3 цифр из справочника КЛАДР header.setOriginator(originator); Message message = new ru.tower.mvd.clients.pf.request.Message(); message.setHeader(header); Properties properties = new Properties(); properties.getProperty().add(createProperty("TYPE_QUERY", (String) ctx.getVariable("typeQuery"))); properties.getProperty().add(createProperty("SECOND_NAME", (String) ctx.getVariable("secondName"))); // фамилия properties.getProperty().add(createProperty("FIRST_NAME", (String) ctx.getVariable("firstName"))); // имя properties.getProperty().add(createProperty("PATRONYMIC", (String) ctx.getVariable("patronymic"))); // отчество properties.getProperty().add(createProperty("SNILS", (String) ctx.getVariable("snils"))); // СНИЛС NNN-NNN-NNN NN properties.getProperty().add(createProperty("DPTCOD", (String) ctx.getVariable("dptcod"))); // код региона куда отправляется запрос из справочника документа properties.getProperty().add(createProperty("DATE_OF_BIRTH", formatDate((Date) ctx.getVariable("DateOfBirth"), "dd.MM.yyyy"))); properties.getProperty().add(createProperty("DOCUMENT_NAME", "ПЕНСИОННОЕ УДОСТОВЕРЕНИЕ")); // так указано в документации properties.getProperty().add(createProperty("DOCUMENT_NUMBER", (String) ctx.getVariable("documentNumber"))); // номер документа if (Arrays.asList("pension1", "pension3").contains(msgVid)) { properties.getProperty().add(createProperty("PENSION_DATE", formatDate((Date) ctx.getVariable("requestMomentDate"), "dd.MM.yyyy"))); // Дата, на которую запрашиваются сведения. } message.setProperties(properties); message.setType(Type.REQUEST); return new XmlTypes(Message.class).toXml(message); } private XMLGregorianCalendar getXMLDate(Date date) { GregorianCalendar gregorianCalendar = new GregorianCalendar(); gregorianCalendar.setTime(date); try { return DatatypeFactory.newInstance().newXMLGregorianCalendar(gregorianCalendar); } catch (DatatypeConfigurationException err) { logger.log(Level.SEVERE, err.getMessage(), err); } return null; } private String formatDate(Date dateValue, String pattern) { DateFormat dateFormat = new SimpleDateFormat(pattern); return dateFormat.format(dateValue); } private Property createProperty(String key, String value) { Property property = new Property(); property.setPropertyName(key); property.setPropertyValue(value); return property; } @Override public void processClientResponse(ClientResponse response, ExchangeContext context) { Boolean pooled = (Boolean) context.getVariable("smevPool"); if (response.verifyResult.error != null) { context.setVariable("smevPool", false); context.setVariable("smevError", response.verifyResult.error); } else { QName responseID = new QName("http://smev.gosuslugi.ru/rev111111", "ResponseID"); QName responsePF = new QName("http://smev.gosuslugi.ru/rev111111", "ResponsePF"); if ((responseID.equals(response.action))) { if (response.packet.status == Packet.Status.ACCEPT) { context.setVariable("smevPool", true); if (Boolean.TRUE != pooled) { context.setVariable("smevRequestId", response.packet.requestIdRef); context.setVariable("smevOriginRequestId", response.packet.originRequestIdRef); ru.tower.mvd.clients.pf.responseid.AppDataType appData = XmlTypes.elementToBean(response.appData, ru.tower.mvd.clients.pf.responseid.AppDataType.class); ru.tower.mvd.clients.pf.responseid.message.Message message = appData.getMessage(); String orderNumber = findPropertyByName(message.getProperties(), "QRYNMB"); context.setVariable(SMEV_REQUEST_ID, orderNumber); } else { context.setVariable("smevPool", false); ru.tower.mvd.clients.pf.responseid.AppDataType appData = XmlTypes.elementToBean(response.appData, ru.tower.mvd.clients.pf.responseid.AppDataType.class); ru.tower.mvd.clients.pf.responseid.message.Message message = appData.getMessage(); context.setVariable("smevError", "Ошибка " + findPropertyByName(message.getProperties(), "STATUSDESCR")); } } } if ((responsePF.equals(response.action))) { if (response.packet.status == Packet.Status.RESULT) { context.setVariable("smevPool", false); ru.tower.mvd.clients.pf.response.AppDataType appData = XmlTypes.elementToBean(response.appData, ru.tower.mvd.clients.pf.response.AppDataType.class); ru.tower.mvd.clients.pf.response.message.Message message = appData.getMessage(); if (message.getType() == Type.RESPONSE) { String xmlData = new String(message.getFilePFR()); context.setVariable("info", xmlData); context.setVariable("status", Boolean.TRUE); processXMLData(xmlData, context); } else { context.setVariable("status", Boolean.FALSE); context.setVariable("info", findPropertyByName(message.getProperties(), "TYPE_RESPONSE")); } } } } } private void processXMLData(String xmlData, ExchangeContext context) { try { final ResponseAdditionalPaymentRequest responseAdditionalPaymentRequest = UnmarshallHelper.parseAdditionaPaymentResult(xmlData); context.setVariable("dataExist", responseAdditionalPaymentRequest.getНаличиеДанных()); context.setVariable("stoppingPaymentDate", responseAdditionalPaymentRequest.getПрекращениеВыплат().getДата()); context.setVariable("stoppingPaymentOrg", responseAdditionalPaymentRequest.getПрекращениеВыплат().getОрганизация()); context.setVariable("stoppingPaymentReason", responseAdditionalPaymentRequest.getПрекращениеВыплат().getОснование()); context.setVariable("responseDataOrgName", responseAdditionalPaymentRequest.getПодразделение().getНаименование()); context.setVariable("responseDataOrgRegionCode", responseAdditionalPaymentRequest.getПодразделение().getРегион()); context.setVariable("paymentTrudPension", findPayment(responseAdditionalPaymentRequest.getВсеВыплаты().getВыплата(), "ТРУДОВАЯ_ПЕНСИЯ")); context.setVariable("paymentGosPension", findPayment(responseAdditionalPaymentRequest.getВсеВыплаты().getВыплата(), "ГОСУДАРСТВЕННАЯ_ПЕНСИЯ")); context.setVariable("paymentEDV", findPayment(responseAdditionalPaymentRequest.getВсеВыплаты().getВыплата(), "ЕДВ")); context.setVariable("paymentDemo", findPayment(responseAdditionalPaymentRequest.getВсеВыплаты().getВыплата(), "ДЕМО")); context.setVariable("paymentEDVHiroes", findPayment(responseAdditionalPaymentRequest.getВсеВыплаты().getВыплата(), "ЕДВ_ГЕРОЯМ")); context.setVariable("paymentDPM", findPayment(responseAdditionalPaymentRequest.getВсеВыплаты().getВыплата(), "ДПМ")); } catch (JAXBException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } catch (SAXException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } catch (UnsupportedEncodingException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } } private String findPayment(List<ResponseAdditionalPaymentRequest.ВсеВыплаты.Выплата> paymentList, String paymentType) { for (ResponseAdditionalPaymentRequest.ВсеВыплаты.Выплата payment : paymentList) { if (paymentType.equals(payment.getВидВыплаты())){ NumberFormat format = DecimalFormat.getInstance(); format.setMaximumFractionDigits(2); return format.format(payment.getСуммаВыплаты()); } } return "0.00"; } private String findPropertyByName(Properties properties, String propertyKey) { for (Property property : properties.getProperty()) { if (property.getPropertyName().equals(propertyKey)) { return property.getPropertyValue(); } } return null; } private BigInteger generateCaseNumber() { BigInteger value = BigInteger.valueOf(new Date().getTime()); value = value.multiply(BigInteger.valueOf(100000)); long randomValue = Math.round(Math.random() * 100000.0); return value.add(BigInteger.valueOf(randomValue)); } }