/*
* 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.gws3564c.enclosure.gkn;
import ru.codeinside.gws.api.ExchangeContext;
import ru.codeinside.gws3564c.DeclarantType;
import ru.codeinside.gws3564c.context.TypedContext;
import ru.codeinside.gws3564c.enclosure.EnclosureRequestBuilder;
import ru.gkn.*;
import javax.xml.XMLConstants;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeConstants;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import java.io.StringWriter;
import java.math.BigInteger;
import java.net.URL;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.logging.Level;
import java.util.logging.Logger;
public abstract class RequestEnclosureBuilder implements EnclosureRequestBuilder {
private final Logger logger = Logger.getLogger(getClass().getName());
protected TypedContext ctx;
protected RequestEnclosureBuilder(ExchangeContext ctx) {
this.ctx = new TypedContext(ctx);
}
RequestGKN createGKNRequest(String id) {
final RequestGKN requestGKN = new RequestGKN();
requestGKN.setEDocument(eDocumentGKN(id));
final RequestGKN.Request request = new RequestGKN.Request();
//Declarant
request.setDeclarant(formDeclarant());
//RequiredData
final RequestGKN.Request.RequiredData requiredData = createRequiredData();
request.setRequiredData(requiredData);
//Delivery
TDelivery delivery = new TDelivery();
delivery.setWebService(true);
request.setDelivery(delivery);
//AppliedDocuments
createAppliedDocuments(request);
createPaymentDocuments(request);
request.setMunicipalService(new RequestGKN.Request.MunicipalService());
requestGKN.setRequest(request);
return requestGKN;
}
RequestGKN.EDocument eDocumentGKN(String id) {
final RequestGKN.EDocument eDocument = new RequestGKN.EDocument();
eDocument.setVersion("1.03");
eDocument.setGUID(id);
return eDocument;
}
String gknToString(RequestGKN requestGKN) {
try {
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
URL resource = getClass().getClassLoader().getResource("rr_xsd/RequestGKN_V01/STD_RequestGKN.xsd");
final Schema schema = sf.newSchema(resource);
JAXBContext jc = JAXBContext.newInstance(RequestGKN.class);
final Marshaller marshaller = jc.createMarshaller();
final StringWriter stringWriter = new StringWriter();
marshaller.setSchema(schema);
marshaller.marshal(requestGKN, stringWriter);
return stringWriter.toString();
} catch (Exception e) {
printContextVars();
throw new RuntimeException(e);
}
}
private void printContextVars() {
for (String varName : ctx.getVariableNames()) {
logger.log(Level.SEVERE, String.format("%s => %s", varName, ctx.getVariable(varName)));
}
}
TOwner formDeclarant() {
final TOwner declarant = new TOwner();
DeclarantType declarantType = DeclarantType.valueOf(ctx.getStrFromContext("declarantType"));
switch (declarantType) {
case GOVERNANCE: {
final TGovernance governance = new TGovernance();
governance.setEMail(ctx.getStrFromContext("declGovernanceEmail"));
governance.setName(ctx.getStrFromContext("declGovernanceName"));
governance.setGovernanceCode(ctx.getStrFromContext("declGovernanceCode"));
governance.setPhone(ctx.getStrFromContext("declGovernancePhone"));
governance.setContactInfo(ctx.getStrFromContext("declGovernanceContactInfo"));
governance.setLocation(setLocation("declLocation"));
governance.setAgent(formAgent());
declarant.setGovernance(governance);
break;
}
case PERSON: {
TPerson person = formPerson("declPerson");
declarant.setPerson(person);
person.setAgent(formAgent());
break;
}
case ORGANISATION:
final TOrganization value = formOrganisation("declLegalPerson");
value.setAgent(formAgent());
declarant.setOrganization(value);
break;
}
declarant.setDeclarantKind(ctx.getStrFromContext("declKind"));
return declarant;
}
TAgent formAgent() {
final TAgent agent = new TAgent();
agent.setFIO(fio("agent"));
agent.setDocument(formPDocument("agent"));
agent.setLocation(setLocation("agent"));
agent.setEMail(ctx.getStrFromContext("agentEmail"));
agent.setPhone(ctx.getStrFromContext("agentPhone"));
agent.setContactInfo(ctx.getStrFromContext("agentContactInfo"));
agent.setSNILS(ctx.getStrFromContext("agentSNILS"));
agent.setAgentKind(ctx.getStrFromContext("agentKind"));
return agent;
}
TPerson formPerson(String type) {
final TPerson person = new TPerson();
person.setFIO(fio(type)); //required
person.setCitizenship(ctx.getStrFromContext(type + "Citizenship"));
person.setContactInfo(ctx.getStrFromContext(type + "ContactInfo"));
person.setDocument(formPDocument(type));
person.setDateBirth(date(ctx.getDateFromContext(type + "BirthDate")));
person.setEMail(ctx.getStrFromContext(type + "Email"));
person.setSNILS(ctx.getStrFromContext(type + "SNILS"));
person.setPhone(ctx.getStrFromContext(type + "Phone"));
person.setPlaceBirth(ctx.getStrFromContext(type + "BirthLocation"));
if (ctx.isStringVariableHasValue(type + "Sex")){
person.setSex(SSex.fromValue(ctx.getStrFromContext(type + "Sex")));
}
if (ctx.isStringVariableHasValue(type + "MarriageStatus")){
person.setFamilyStatus(ctx.getStrFromContext(type + "MarriageStatus"));
}
return person;
}
PIdentityPersonDocumentV1 formPDocument(final String type) {
final PIdentityPersonDocumentV1 pIdentityPersonDocument = new PIdentityPersonDocumentV1();
pIdentityPersonDocument.setCodeDocument(ctx.getStrFromContext(type + "PDocumentCode"));
pIdentityPersonDocument.setSeries(ctx.getStrFromContext(type + "PDocumentSeries"));
pIdentityPersonDocument.setNumber(ctx.getStrFromContext(type + "PDocumentNumber"));
pIdentityPersonDocument.setDesc(ctx.getStrFromContext(type + "PDocumentDesc"));
XMLGregorianCalendar date = date(ctx.getDateFromContext(type + "PDocumentDate"));
pIdentityPersonDocument.setDate(date);
pIdentityPersonDocument.setIssueOrgan(ctx.getStrFromContext(type + "PDocumentIssueOrgan"));
return pIdentityPersonDocument;
}
TFIO fio(final String type) {
final TFIO tFIO = new TFIO();
tFIO.setSurname(ctx.getStrFromContext(type + "FIOSurname"));
tFIO.setFirst(ctx.getStrFromContext(type + "FIOFirst"));
tFIO.setPatronymic(ctx.getStrFromContext(type + "FIOPatronymic"));
return tFIO;
}
TOrganization formOrganisation(String type) {
TOrganization result = new TOrganization();
result.setName(ctx.getStrFromContext(type + "Name"));
result.setCodeOPF(ctx.getStrFromContext(type + "OPF"));
result.setCodeCPP(ctx.getStrFromContext(type + "KPP"));
result.setINN(ctx.getStrFromContext(type + "INN"));
result.setCodeOGRN(ctx.getStrFromContext(type + "OGRN"));
result.setEMail(ctx.getStrFromContext(type + "Email"));
result.setPhone(ctx.getStrFromContext(type + "Phone"));
result.setContactInfo(ctx.getStrFromContext(type + "ContactInfo"));
result.setRegDate(date(ctx.getDateFromContext(type + "RegDate")));
result.setRegistrationAgency(ctx.getStrFromContext(type + "RegAgency"));
result.setDocument(formOrganizationDocument("declLegalPersonDocument"));
return result;
}
PIdentityOrganizationDocumentV1 formOrganizationDocument(String prefix) {
if (!ctx.hasAtLeastOneVariableWithPrefix(prefix)) return null;
PIdentityOrganizationDocumentV1 result = new PIdentityOrganizationDocumentV1();
result.setCodeDocument(ctx.getStrFromContext(prefix + "Code"));
result.setName(ctx.getStrFromContext(prefix + "Name"));
result.setSeries(ctx.getStrFromContext(prefix + "Series"));
result.setNumber(ctx.getStrFromContext(prefix + "Number"));
result.setDate(date(ctx.getDateFromContext(prefix + "Date")));
result.setIssueOrgan(ctx.getStrFromContext(prefix + "IssueOrgan"));
result.setDesc(ctx.getStrFromContext(prefix + "Desc"));
return result;
}
XMLGregorianCalendar date(Date date) {
if (date == null) {
return null;
}
try {
final GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(date);
final XMLGregorianCalendar xml = DatatypeFactory.newInstance().newXMLGregorianCalendar(calendar);
xml.setMillisecond(DatatypeConstants.FIELD_UNDEFINED);
xml.setSecond(DatatypeConstants.FIELD_UNDEFINED);
xml.setMinute(DatatypeConstants.FIELD_UNDEFINED);
xml.setHour(DatatypeConstants.FIELD_UNDEFINED);
xml.setTimezone(DatatypeConstants.FIELD_UNDEFINED);
return xml;
} catch (final DatatypeConfigurationException e) {
throw new RuntimeException(e);
}
}
PAddressV1 setLocation(final String type) {
final PAddressV1 pAddressV1 = new PAddressV1();
if (ctx.isStringVariableHasValue(type + "PostalCode")) {
pAddressV1.setPostalCode(ctx.getStrFromContext(type + "PostalCode"));
}
pAddressV1.setRegion(ctx.getStrFromContext(type + "Region"));
if (ctx.isStringVariableHasValue(type + "OKATO")) {
pAddressV1.setCodeOKATO(ctx.getStrFromContext(type + "OKATO"));
}
if (ctx.isStringVariableHasValue(type + "CLADR")) {
pAddressV1.setCodeKLADR(ctx.getStrFromContext(type + "CLADR"));
}
if (ctx.isStringVariableHasValue(type + "DistrictName")) {
final TDistrict district = new TDistrict();
district.setName(ctx.getStrFromContext(type + "DistrictName"));
district.setType(DDistrict.fromValue(ctx.getStrFromContext(type + "DistrictType")));
pAddressV1.setDistrict(district);
}
if (ctx.isStringVariableHasValue(type + "CityName")) {
final TCity tCity = new TCity();
tCity.setName(ctx.getStrFromContext(type + "CityName"));
tCity.setType(DCity.fromValue(ctx.getStrFromContext(type + "DCity")));
pAddressV1.setCity(tCity);
}
if (ctx.isStringVariableHasValue(type + "UrbanDistictName")) {
final TUrbanDistrict tCity = new TUrbanDistrict();
tCity.setName(ctx.getStrFromContext(type + "UrbanDistictName"));
tCity.setType(DUrbanDistrict.fromValue(ctx.getStrFromContext(type + "UrbanDistictType")));
pAddressV1.setUrbanDistrict(tCity);
}
if (ctx.isStringVariableHasValue(type + "SovietVillageName")) {
final TSovietVillage sovietVillage = new TSovietVillage();
sovietVillage.setName(ctx.getStrFromContext(type + "SovietVillageName"));
sovietVillage.setType(DSovietVillage.fromValue(ctx.getStrFromContext(type + "SovietVillageType")));
pAddressV1.setSovietVillage(sovietVillage);
}
if (ctx.isStringVariableHasValue(type + "LocalityName")) {
TLocality value = new TLocality();
value.setName(ctx.getStrFromContext(type + "LocalityName"));
value.setType(DInhabitedLocalities.fromValue(ctx.getStrFromContext(type + "LocalityType")));
pAddressV1.setLocality(value);
}
if (ctx.isStringVariableHasValue(type + "StreetName")) {
final TStreet tStreet = new TStreet();
tStreet.setName(ctx.getStrFromContext(type + "StreetName"));
tStreet.setType(DStreets.fromValue(ctx.getStrFromContext(type + "DStreets")));
pAddressV1.setStreet(tStreet);
}
if (ctx.isStringVariableHasValue(type + "LocationLevel1Type")) {
final TLevel1 tLevel1 = new TLevel1();
tLevel1.setValue(ctx.getStrFromContext(type + "LocationLevel1Value"));
tLevel1.setType(DLocationLevel1Type.fromValue(ctx.getStrFromContext(type + "LocationLevel1Type")));
pAddressV1.setLevel1(tLevel1);
}
if (ctx.isStringVariableHasValue(type + "LocationLevel2Type")) {
final TLevel2 tLevel2 = new TLevel2();
tLevel2.setValue(ctx.getStrFromContext(type + "LocationLevel2Value"));
tLevel2.setType(DLocationLevel2Type.fromValue(ctx.getStrFromContext(type + "LocationLevel2Type")));
pAddressV1.setLevel2(tLevel2);
}
if (ctx.isStringVariableHasValue(type + "LocationLevel3Type")) {
final TLevel3 tLevel3 = new TLevel3();
tLevel3.setValue(ctx.getStrFromContext(type + "LocationLevel3Value"));
tLevel3.setType(DLocationLevel3Type.fromValue(ctx.getStrFromContext(type + "LocationLevel3Type")));
pAddressV1.setLevel3(tLevel3);
}
if (ctx.isStringVariableHasValue(type + "LocationApartmentType")) {
final TApartment tApartment = new TApartment();
tApartment.setValue(ctx.getStrFromContext(type + "LocationApartmentValue")); //required
tApartment.setType(DApartmentType.fromValue(ctx.getStrFromContext(type + "LocationApartmentType")));
pAddressV1.setApartment(tApartment);
}
if (ctx.isStringVariableHasValue(type + "LocationOther")) {
pAddressV1.setOther(ctx.getStrFromContext(type + "LocationOther"));
}
if (ctx.isStringVariableHasValue(type + "LocationNote")) {
pAddressV1.setNote(ctx.getStrFromContext(type + "LocationNote"));
}
return pAddressV1;
}
private void createPaymentDocuments(RequestGKN.Request request) {
long countPaymentDocuments = ctx.getLongFromContext("payment");
if (countPaymentDocuments > 0) {
final RequestGKN.Request.PaymentDocuments paymentsDocuments = new RequestGKN.Request.PaymentDocuments();
for (int idx = 1; idx <= countPaymentDocuments; idx++) {
TPayDocument appliedDocument = formPaymentDocument("payment", "_" + idx);
paymentsDocuments.getPaymentDocument().add(appliedDocument);
}
request.setPaymentDocuments(paymentsDocuments);
}
}
private TPayDocument formPaymentDocument(String prefix, String suffix) {
TPayDocument payDocument = new TPayDocument();
payDocument.setDocType(ctx.getStrFromContext(prefix + "Doc_Type" + suffix));
payDocument.setNumber(ctx.getStrFromContext(prefix + "Number" + suffix));
payDocument.setBIC(ctx.getStrFromContext(prefix + "BIC" + suffix));
payDocument.setBankName(ctx.getStrFromContext(prefix + "Bank_Name" + suffix));
payDocument.setOKATO(ctx.getStrFromContext(prefix + "OKATO" + suffix));
payDocument.setSettlementAccount(ctx.getStrFromContext(prefix + "Settlement_Account" + suffix));
payDocument.setSum(BigInteger.valueOf(ctx.getLongFromContext(prefix + "Sum" + suffix)));
payDocument.setDate(date(ctx.getDateFromContext(prefix + "Date" + suffix)));
payDocument.setFIOPayment(ctx.getStrFromContext(prefix + "FIOPayer" + suffix));
payDocument.setQuantity(formQuantity(prefix, suffix));
return payDocument;
}
private TQuantity formQuantity(String prefix, String suffix) {
final TQuantity tQuantity = new TQuantity(); //required
if (ctx.getLongFromContext(prefix + "ADocumentOriginalQuantity" + suffix) != null) {
final TQuantityAttribute tQuantityOriginal = new TQuantityAttribute();
tQuantityOriginal.setQuantity(ctx.getBigIntFromContext(prefix + "ADocumentOriginalQuantity" + suffix));
tQuantityOriginal.setQuantitySheet(ctx.getBigIntFromContext(prefix + "ADocumentOriginalQuantitySheet" + suffix));
tQuantity.setOriginal(tQuantityOriginal);
}
if (ctx.getVariable(prefix + "ADocumentCopyQuantity" + suffix) != null) {
final TQuantityAttribute tQuantityCopy = new TQuantityAttribute();
tQuantityCopy.setQuantity(ctx.getBigIntFromContext(prefix + "ADocumentCopyQuantity" + suffix));
tQuantityCopy.setQuantitySheet(ctx.getBigIntFromContext(prefix + "ADocumentCopyQuantitySheet" + suffix));
tQuantity.setCopy(tQuantityCopy);
}
return tQuantity;
}
private void createAppliedDocuments(RequestGKN.Request request) {
long countAppliedDocuments = ctx.getLongFromContext("applied");
if (countAppliedDocuments > 0) {
final RequestGKN.Request.AppliedDocuments appliedDocuments = new RequestGKN.Request.AppliedDocuments();
for (int idx = 1; idx <= countAppliedDocuments; idx++) {
TAppliedDocument appliedDocument = formAppliedDocument("applied", "_" + idx);
appliedDocuments.getAppliedDocument().add(appliedDocument);
}
request.setAppliedDocuments(appliedDocuments);
}
}
TAppliedDocument formAppliedDocument(final String prefix, final String suffix) {
final TAppliedDocument tAppliedDocument = new TAppliedDocument();
tAppliedDocument.setCodeDocument(ctx.getStrFromContext(prefix + "ADocumentCode" + suffix));
tAppliedDocument.setName(ctx.getStrFromContext(prefix + "ADocumentName" + suffix));
tAppliedDocument.setNumber(ctx.getStrFromContext(prefix + "ADocumentNumber" + suffix));
tAppliedDocument.setIssueOrgan(ctx.getStrFromContext(prefix + "AIssue" + suffix));
tAppliedDocument.setDesc(ctx.getStrFromContext(prefix + "ADesc" + suffix));
XMLGregorianCalendar appliedDocumentDate = date(ctx.getDateFromContext(prefix + "ADocumentDate" + suffix));
tAppliedDocument.setDate(appliedDocumentDate);
/* final TImages tImages = new TImages();
final TImage tImage = new TImage();
tImage.setName(getStringFromContext( ctx, type + "ADocumentImageName"));
tImage.setURL(getStringFromContext( ctx, type + "ADocumentImageURL"));
tImages.getImage().add(tImage);
tAppliedDocument.setImages(tImages);
*/
final TQuantity tQuantity = formQuantity(prefix, suffix);
tAppliedDocument.setQuantity(tQuantity);
return tAppliedDocument;
}
protected abstract RequestGKN.Request.RequiredData createRequiredData();
RequestGKN buildGKNObject(String id) {
return createGKNRequest(id);
}
public String createEnclosure(String id) {
RequestGKN requestGKN = buildGKNObject(id);
return gknToString(requestGKN);
}
}